@natlibfi/marc-record-validators-melinda 10.15.0 → 10.15.1-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/punctuation2.js +60 -23
- package/dist/punctuation2.js.map +1 -1
- package/dist/sortFields.js +11 -2
- package/dist/sortFields.js.map +1 -1
- package/package.json +2 -2
- package/src/punctuation2.js +51 -22
- package/src/sortFields.js +10 -2
- package/test-fixtures/punctuation2/97/expectedResult.json +6 -0
- package/test-fixtures/punctuation2/97/metadata.json +1 -1
- package/test-fixtures/punctuation2/97/record.json +6 -0
- package/test-fixtures/sort-fields/11/input.json +32 -0
- package/test-fixtures/sort-fields/11/metadata.json +5 -0
- package/test-fixtures/sort-fields/11/result.json +35 -0
- package/test-fixtures/strip-punctuation/97/expectedResult.json +11 -0
- package/test-fixtures/strip-punctuation/97/record.json +11 -0
package/dist/punctuation2.js
CHANGED
|
@@ -24,9 +24,9 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
24
24
|
* (They are jumped over when looking for next (non-controlfield subfield)
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
//
|
|
27
|
+
//import createDebugLogger from 'debug';
|
|
28
28
|
|
|
29
|
-
//
|
|
29
|
+
//const debug = createDebugLogger('debug/punctuation2');
|
|
30
30
|
|
|
31
31
|
function _default() {
|
|
32
32
|
return {
|
|
@@ -93,7 +93,7 @@ const defaultNeedsPuncAfter = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö)$/u;
|
|
|
93
93
|
const defaultNeedsPuncAfter2 = /(?:[\]a-zA-Z0-9)]|ä|å|ö|Å|Ä|Ö)$/u;
|
|
94
94
|
const blocksPuncRHS = /^(?:\()/u;
|
|
95
95
|
const allowsPuncRHS = /^(?:[A-Za-z0-9]|å|ä|ö|Å|Ä|Ö)/u;
|
|
96
|
-
const dotIsProbablyPunc = /(?:[a-z0-9)]
|
|
96
|
+
const dotIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö|(?:[A-Za-z0-9]|Å|Ä|Ö)(?:[A-Z]|Å|Ä|Ö))\.$/u;
|
|
97
97
|
const puncIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö) ?[.,:;]$/u;
|
|
98
98
|
// NB! 65X: Finnish terms don't use punctuation, but international ones do. Neither one is currently (2021-11-08) coded here.
|
|
99
99
|
|
|
@@ -244,6 +244,11 @@ const crappy24X = [{
|
|
|
244
244
|
'code': 'abnp',
|
|
245
245
|
'followedBy': '!c',
|
|
246
246
|
'remove': / \/$/u
|
|
247
|
+
}, {
|
|
248
|
+
'code': 'abn',
|
|
249
|
+
'followedBy': 'c',
|
|
250
|
+
'remove': /\.$/u,
|
|
251
|
+
'context': dotIsProbablyPunc
|
|
247
252
|
}, {
|
|
248
253
|
'code': 'abc',
|
|
249
254
|
'followedBy': '#',
|
|
@@ -514,7 +519,7 @@ const add245 = [
|
|
|
514
519
|
'code': 'ab',
|
|
515
520
|
'followedBy': 'n',
|
|
516
521
|
'add': '.',
|
|
517
|
-
'
|
|
522
|
+
'context': defaultNeedsPuncAfter
|
|
518
523
|
}, {
|
|
519
524
|
'code': 'abk',
|
|
520
525
|
'followedBy': 'f',
|
|
@@ -535,7 +540,7 @@ const add245 = [
|
|
|
535
540
|
'followedBy': '#',
|
|
536
541
|
'add': '.',
|
|
537
542
|
'context': defaultNeedsPuncAfter
|
|
538
|
-
} // Stepping on punctuation
|
|
543
|
+
} // Stepping on "punctuation validaror's" toes
|
|
539
544
|
];
|
|
540
545
|
|
|
541
546
|
const add246 = [{
|
|
@@ -668,6 +673,25 @@ const addPairedPunctuationRules = {
|
|
|
668
673
|
'context': defaultNeedsPuncAfter
|
|
669
674
|
}]
|
|
670
675
|
};
|
|
676
|
+
|
|
677
|
+
/*
|
|
678
|
+
function debugRule(rule) {
|
|
679
|
+
//nvdebug('');
|
|
680
|
+
nvdebug(`NAME ${rule.name ? rule.name : '<unnamed>'}`);
|
|
681
|
+
nvdebug(`SUBFIELD CODE '${rule.code}' FOLLOWED BY SUBFIELD CODE '${rule.followedBy}'`);
|
|
682
|
+
if ('add' in rule) { // eslint-disable-line functional/no-conditional-statements
|
|
683
|
+
nvdebug(`ADD '${rule.add}'`);
|
|
684
|
+
}
|
|
685
|
+
if ('remove' in rule) { // eslint-disable-line functional/no-conditional-statements
|
|
686
|
+
nvdebug(`REMOVE '${rule.remove}'`);
|
|
687
|
+
}
|
|
688
|
+
if ('context' in rule) { // eslint-disable-line functional/no-conditional-statements
|
|
689
|
+
nvdebug(`CONTEXT '${rule.context.toString()}'`);
|
|
690
|
+
}
|
|
691
|
+
//nvdebug('');
|
|
692
|
+
}
|
|
693
|
+
*/
|
|
694
|
+
|
|
671
695
|
function ruleAppliesToSubfieldCode(targetSubfieldCodes, currSubfieldCode) {
|
|
672
696
|
const negation = targetSubfieldCodes.includes('!');
|
|
673
697
|
if (negation) {
|
|
@@ -688,13 +712,20 @@ function ruleAppliesToField(rule, field) {
|
|
|
688
712
|
return true;
|
|
689
713
|
}
|
|
690
714
|
function ruleAppliesToCurrentSubfield(rule, subfield) {
|
|
715
|
+
//nvdebug(` Apply rule on LHS?`);
|
|
691
716
|
if (!ruleAppliesToSubfieldCode(rule.code, subfield.code)) {
|
|
717
|
+
//nvdebug(` Reject rule!`);
|
|
692
718
|
return false;
|
|
693
719
|
}
|
|
694
|
-
if ('context' in rule
|
|
695
|
-
//
|
|
696
|
-
|
|
720
|
+
if ('context' in rule) {
|
|
721
|
+
//nvdebug(` Check '${subfield.value}' versus '${rule.context.toString()}'`);
|
|
722
|
+
if (!subfield.value.match(rule.context)) {
|
|
723
|
+
// njsscan-ignore: regex_injection_dos
|
|
724
|
+
//nvdebug(` Reject rule!`);
|
|
725
|
+
return false;
|
|
726
|
+
}
|
|
697
727
|
}
|
|
728
|
+
//nvdebug(` Apply rule!`);
|
|
698
729
|
return true;
|
|
699
730
|
}
|
|
700
731
|
function ruleAppliesToNextSubfield(rule, nextSubfield) {
|
|
@@ -721,7 +752,7 @@ function ruleAppliesToNextSubfield(rule, nextSubfield) {
|
|
|
721
752
|
}
|
|
722
753
|
function checkRule(rule, field, subfield1, subfield2) {
|
|
723
754
|
if (!ruleAppliesToField(rule, field)) {
|
|
724
|
-
|
|
755
|
+
//nvdebug(`FAIL ON WHOLE FIELD: '${fieldToString(field)}`);
|
|
725
756
|
return false;
|
|
726
757
|
}
|
|
727
758
|
//const name = rule.name || 'UNNAMED';
|
|
@@ -737,16 +768,10 @@ function checkRule(rule, field, subfield1, subfield2) {
|
|
|
737
768
|
return false;
|
|
738
769
|
}
|
|
739
770
|
|
|
740
|
-
//nvdebug(`${name}: ACCEPT ${rule.code}
|
|
771
|
+
//nvdebug(`${rule.name ? rule.name : '<unnamed>'}: ACCEPT ${rule.code} (${subfield1.code}), SF2=${rule.followedBy} (${subfield2 ? subfield2.code : '#'})`, debug);
|
|
741
772
|
return true;
|
|
742
773
|
}
|
|
743
774
|
function applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, operation = NONE) {
|
|
744
|
-
/*
|
|
745
|
-
if (ruleArray === null || operation === NONE) {
|
|
746
|
-
debug(`applyPunctuation(): No rules to apply!`);
|
|
747
|
-
return;
|
|
748
|
-
}
|
|
749
|
-
*/
|
|
750
775
|
if (!(`${field.tag}` in ruleArray) || ruleArray === null || operation === NONE) {
|
|
751
776
|
/*
|
|
752
777
|
if (!['020', '650'].includes(tag) || !isControlSubfieldCode(subfield1.code)) { // eslint-disable-line functional/no-conditional-statements
|
|
@@ -755,11 +780,18 @@ function applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, op
|
|
|
755
780
|
*/
|
|
756
781
|
return;
|
|
757
782
|
}
|
|
783
|
+
(0, _utils.nvdebug)(`PUNCTUATE ${field.tag} '${(0, _utils.subfieldToString)(subfield1)}' XXX '${subfield2 ? (0, _utils.subfieldToString)(subfield2) : '#'} }`);
|
|
758
784
|
|
|
759
785
|
//nvdebug(`OP=${operation} ${tag}: '${subfield1.code}: ${subfield1.value}' ??? '${subfield2 ? subfield2.code : '#'}'`, debug);
|
|
760
|
-
const
|
|
761
|
-
|
|
762
|
-
|
|
786
|
+
const candRules = ruleArray[field.tag];
|
|
787
|
+
candRules.forEach(rule => {
|
|
788
|
+
//debugRule(rule);
|
|
789
|
+
|
|
790
|
+
if (!checkRule(rule, field, subfield1, subfield2)) {
|
|
791
|
+
return;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
//const originalValue = subfield1.value;
|
|
763
795
|
if (rule.remove && [REMOVE, REMOVE_AND_ADD].includes(operation) && subfield1.value.match(rule.remove)) {
|
|
764
796
|
// eslint-disable-line functional/no-conditional-statements
|
|
765
797
|
//nvdebug(` PUNC REMOVAL TO BE PERFORMED FOR $${subfield1.code} '${subfield1.value}'`, debug);
|
|
@@ -770,14 +802,17 @@ function applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, op
|
|
|
770
802
|
if (rule.add && [ADD, REMOVE_AND_ADD].includes(operation)) {
|
|
771
803
|
// eslint-disable-line functional/no-conditional-statements
|
|
772
804
|
subfield1.value += rule.add; // eslint-disable-line functional/immutable-data
|
|
773
|
-
//nvdebug(` ADDED '${rule.add}' TO '${subfield1.value}'`, debug);
|
|
805
|
+
//nvdebug(` ADDED '${rule.add}' TO FORM '${subfield1.value}'`, debug);
|
|
774
806
|
}
|
|
775
807
|
|
|
776
|
-
|
|
777
|
-
|
|
808
|
+
/*
|
|
809
|
+
if (subfield1.value !== originalValue) { // eslint-disable-line functional/no-conditional-statements
|
|
810
|
+
nvdebug(` PROCESS PUNC: '‡${subfield1.code} ${originalValue}' => '‡${subfield1.code} ${subfield1.value}'`, debug); // eslint-disable-line functional/immutable-data
|
|
778
811
|
}
|
|
812
|
+
*/
|
|
779
813
|
});
|
|
780
814
|
}
|
|
815
|
+
|
|
781
816
|
function subfieldFixPunctuation(field, subfield1, subfield2) {
|
|
782
817
|
applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);
|
|
783
818
|
applyPunctuationRules(field, subfield1, subfield2, addPairedPunctuationRules, ADD);
|
|
@@ -805,10 +840,12 @@ function fieldFixPunctuation(field) {
|
|
|
805
840
|
if (!field.subfields) {
|
|
806
841
|
return field;
|
|
807
842
|
}
|
|
808
|
-
|
|
843
|
+
//nvdebug(`################### fieldFixPunctuation() TEST ${fieldToString(field)}`);
|
|
844
|
+
|
|
809
845
|
field.subfields.forEach((sf, i) => {
|
|
810
846
|
// NB! instead of next subfield, we should actually get next *non-control-subfield*!!!
|
|
811
847
|
// (In plain English: We should skip $0 - $9 at least, maybe $w as well...)
|
|
848
|
+
// We'll need some magic for field 257 here, do we? (Also Finnish lexicons vs global lexicons in 65X fields)
|
|
812
849
|
subfieldFixPunctuation(field, sf, getNextRelevantSubfield(field, i));
|
|
813
850
|
});
|
|
814
851
|
|
package/dist/punctuation2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"punctuation2.js","names":["_endingPunctuation","require","_utils","_clone","_interopRequireDefault","obj","__esModule","default","_default","description","validate","fix","record","nvdebug","res","message","valid","fields","forEach","f","fieldFixPunctuation","fieldsNeedingModification","filter","fieldNeedsModification","values","map","fieldToString","newValues","fieldGetFixedString","messages","val","i","length","isControlSubfield","subfield","includes","code","getNextRelevantSubfield","field","currSubfieldIndex","subfields","find","index","add","cloneField","clone","operation","subfieldFixPunctuation","subfieldStripPunctuation","sf","originalFieldAsString","modifiedFieldAsString","commaNeedsPuncAfter","defaultNeedsPuncAfter","defaultNeedsPuncAfter2","blocksPuncRHS","allowsPuncRHS","dotIsProbablyPunc","puncIsProbablyPunc","removeColons","removeX00Comma","cleanRHS","cleanX00dCommaOrDot","cleanX00aDot","cleanCorruption","cleanX00eDot","X00RemoveDotAfterBracket","cleanPuncBeforeLanguage","addX00aComma","addX00aComma2","addX00aDot","addX10bDot","addX10eComma","addX10Dot","addLanguageComma","addColonToRelationshipInformation","addSemicolonBeforeVolumeDesignation","NONE","ADD","REMOVE","REMOVE_AND_ADD","removeX00Whatever","removeX10Whatever","remove490And830Whatever","linkingEntryWhatever","crappy24X","cleanCrappyPunctuationRules","cleanLegalX00Comma","cleanLegalX00bDot","context","cleanLegalX00iColon","cleanLegalX00Dot","cleanLanguageComma","legalX00punc","cleanLegalX10Comma","cleanLegalX10Dot","legalX10punc","cleanLegalSeriesTitle","clean24X","cleanValidPunctuationRules","addX00","addX10","add245","add246","addSeriesTitle","addPairedPunctuationRules","ruleAppliesToSubfieldCode","targetSubfieldCodes","currSubfieldCode","negation","ruleAppliesToField","rule","ind1","ind2","ruleAppliesToCurrentSubfield","value","match","ruleAppliesToNextSubfield","nextSubfield","followedBy","contextRHS","checkRule","subfield1","subfield2","applyPunctuationRules","ruleArray","tag","activeRules","originalValue","remove","replace","fieldStripPunctuation","useExternalEndPunctuation","validateSingleField"],"sources":["../src/punctuation2.js"],"sourcesContent":["/*\n* punctuation.js -- try and fix a marc field punctuation\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n* NOTE #1: https://www.kiwi.fi/display/kumea/Loppupisteohje is implemented via another validator/fixer (ending-punctuation).\n* This file has some support but it's now yet thorough. (And mmight never be.)\n* NOTE #2: Validator/fixer punctuation does similar stuff, but focuses on X00 fields.\n* NOTE #3: As of 2023-06-05 control subfields ($0...$9) are obsolete. Don't use them in rules.\n* (They are jumped over when looking for next (non-controlfield subfield)\n*/\nimport {validateSingleField} from './ending-punctuation';\n// import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\nimport clone from 'clone';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');\n\nexport default function () {\n return {\n description: 'Add punctuation to data fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Add punctuation to data fields: fixer');\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fieldFixPunctuation(f));\n return res;\n }\n\n function validate(record) {\n nvdebug('Add punctuation to data fields: validate');\n\n const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, true));\n\n\n const values = fieldsNeedingModification.map(f => fieldToString(f));\n const newValues = fieldsNeedingModification.map(f => fieldGetFixedString(f, true));\n\n const messages = values.map((val, i) => `'${val}' => '${newValues[i]}'`);\n\n const res = {message: messages};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nfunction isControlSubfield(subfield) {\n return ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].includes(subfield.code);\n}\n\nfunction getNextRelevantSubfield(field, currSubfieldIndex) {\n return field.subfields.find((subfield, index) => index > currSubfieldIndex && !isControlSubfield(subfield));\n}\n\nexport function fieldGetFixedString(field, add = true) {\n const cloneField = clone(field);\n const operation = add ? subfieldFixPunctuation : subfieldStripPunctuation;\n cloneField.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n operation(cloneField, sf, getNextRelevantSubfield(cloneField, i));\n });\n return fieldToString(cloneField);\n}\n\nexport function fieldNeedsModification(field, add = true) {\n if (!field.subfields) {\n return false;\n }\n\n const originalFieldAsString = fieldToString(field);\n const modifiedFieldAsString = fieldGetFixedString(field, add);\n\n return modifiedFieldAsString !== originalFieldAsString;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////\n// <= Above code is written for the validator logic <= //\n// => Everything below was originally transferred from reducers' punctuation.js => //\n/////////////////////////////////////////////////////////////////////////////////////\n\n\n//const stripCrap = / *[-;:,+]+$/u;\nconst commaNeedsPuncAfter = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö|\\))$/u;\nconst defaultNeedsPuncAfter = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö)$/u;\nconst defaultNeedsPuncAfter2 = /(?:[\\]a-zA-Z0-9)]|ä|å|ö|Å|Ä|Ö)$/u;\nconst blocksPuncRHS = /^(?:\\()/u;\nconst allowsPuncRHS = /^(?:[A-Za-z0-9]|å|ä|ö|Å|Ä|Ö)/u;\n\nconst dotIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö)\\.$/u;\nconst puncIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö) ?[.,:;]$/u;\n// NB! 65X: Finnish terms don't use punctuation, but international ones do. Neither one is currently (2021-11-08) coded here.\n\n// Will unfortunately trigger \"Sukunimi, Th.\" type:\nconst removeColons = {'code': 'abcdefghijklmnopqrstuvwxyz', 'remove': / *[;:]$/u};\nconst removeX00Comma = {'code': 'abcqde', 'followedBy': 'abcqde#', 'context': /.,$/u, 'remove': /,$/u};\nconst cleanRHS = {'code': 'abcd', 'followedBy': 'bcde', 'context': /(?:(?:[a-z0-9]|å|ä|ö)\\.|,)$/u, 'contextRHS': blocksPuncRHS, 'remove': /[.,]$/u};\nconst cleanX00dCommaOrDot = {'code': 'd', 'followedBy': 'et#', 'context': /[0-9]-[,.]$/u, 'remove': /[,.]$/u};\nconst cleanX00aDot = {'code': 'abcde', 'followedBy': 'cdegj', 'context': dotIsProbablyPunc, 'remove': /\\.$/u};\nconst cleanCorruption = {'code': 'abcdefghijklmnopqrstuvwxyz', 'remove': / \\.$/u};\n// These $e dot removals are tricky: before removing the comma, we should know that it ain't an abbreviation such as \"esitt.\"...\nconst cleanX00eDot = {'code': 'e', 'followedBy': 'egj#', 'context': /(?:[ai]ja|jä)[.,]$/u, 'remove': /\\.$/u};\n\nconst X00RemoveDotAfterBracket = {'code': 'cq', 'context': /\\)\\.$/u, 'remove': /\\.$/u};\n// 390, 800, 810, 830...\nconst cleanPuncBeforeLanguage = {'code': 'atvxyz', 'followedBy': 'l', 'context': puncIsProbablyPunc, 'remove': / *[.,:;]$/u};\n\n\nconst addX00aComma = {'add': ',', 'code': 'abcqdej', 'followedBy': 'cdeg', 'context': commaNeedsPuncAfter, 'contextRHS': allowsPuncRHS};\nconst addX00aComma2 = {'add': ',', 'code': 'abcdej', 'followedBy': 'cdeg', 'context': /(?:[A-Z]|Å|Ä|Ö)\\.$/u, 'contextRHS': allowsPuncRHS};\nconst addX00aDot = {'add': '.', 'code': 'abcde', 'followedBy': '#tu', 'context': defaultNeedsPuncAfter};\n\nconst addX10bDot = {'name': 'Add X10 pre-$b dot', 'add': '.', 'code': 'ab', 'followedBy': 'b', 'context': defaultNeedsPuncAfter};\nconst addX10eComma = {'add': ',', 'code': 'abe', 'followedBy': 'e', 'context': defaultNeedsPuncAfter};\nconst addX10Dot = {'name': 'Add X10 final dot', 'add': '.', 'code': 'abe', 'followedBy': '#', 'context': defaultNeedsPuncAfter};\nconst addLanguageComma = {'name': 'Add comma before 810$l', 'add': ',', 'code': 'tv', 'followedBy': 'l', 'context': defaultNeedsPuncAfter2};\nconst addColonToRelationshipInformation = {'name': 'Add \\':\\' to 7X0 $i relationship info', 'add': ':', 'code': 'i', 'context': defaultNeedsPuncAfter2};\n\n// 490:\nconst addSemicolonBeforeVolumeDesignation = {'name': 'Add \" ;\" before $v', 'add': ' ;', 'code': 'atxyz', 'followedBy': 'v', 'context': /[^;]$/u};\n\nconst NONE = 0;\nconst ADD = 2;\nconst REMOVE = 1;\nconst REMOVE_AND_ADD = 3;\n\n// Crappy punctuation consists of various crap that is somewhat common.\n// We strip crap for merge decisions. We are not trying to actively remove crap here.\n\nconst removeX00Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, cleanX00dCommaOrDot, cleanRHS, X00RemoveDotAfterBracket, removeColons, cleanPuncBeforeLanguage];\nconst removeX10Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, removeColons, cleanPuncBeforeLanguage];\n\nconst remove490And830Whatever = [{'code': 'axyzv', 'followedBy': 'axyzv', 'remove': /(?: *;| *=|,)$/u}];\n\nconst linkingEntryWhatever = [{'code': 'abdghiklmnopqrstuwxyz', 'followedBy': 'abdghiklmnopqrstuwxyz', 'remove': /\\. -$/u}];\n\n\n// '!' means negation, thus '!b' means any other subfield but 'b'.\n// 'followedBy': '#' means that current subfield is the last subfield.\n// NB! Note that control subfields are ignored in punctuation rules.\n// NB #2! Control field ignorance causes issues with field 257: https://wiki.helsinki.fi/display/rdasovellusohje/Loppupisteohje\n// Might need to work on that at some point. NOT a top priority though.\n// NB #3! Final punctuation creation is/should be handled by endind-punctuation.js validator!\n\nconst crappy24X = [\n {'code': 'abnp', 'followedBy': '!c', 'remove': / \\/$/u},\n {'code': 'abc', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'abfghinp', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'n', 'followedBy': 'p', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}, // MELINDA-8817\n {'code': 'p', 'followedBy': 'pc', 'remove': /\\.$/u, 'context': dotIsProbablyPunc} // MELINDA-8817\n];\n\nconst cleanCrappyPunctuationRules = {\n '100': removeX00Whatever,\n '110': removeX10Whatever,\n '240': crappy24X,\n '245': crappy24X,\n '246': crappy24X,\n '300': [\n {'code': 'a', 'followedBy': '!b', 'remove': / *:$/u},\n {'code': 'a', 'followedBy': 'b', 'remove': /:$/u, 'context': /[^ ]:$/u},\n {'code': 'ab', 'followedBy': '!c', 'remove': / *;$/u},\n {'code': 'ab', 'followedBy': 'c', 'remove': /;$/u, 'context': /[^ ];$/u},\n {'code': 'abc', 'followedBy': '!e', 'remove': / *\\+$/u} // Removes both valid (with one space) and invalid (spaceless et al) puncs\n\n ],\n\n '490': remove490And830Whatever,\n '600': removeX00Whatever,\n '610': removeX10Whatever,\n '700': removeX00Whatever,\n '710': removeX10Whatever,\n '773': linkingEntryWhatever,\n '774': linkingEntryWhatever,\n '776': linkingEntryWhatever,\n '800': removeX00Whatever,\n '810': removeX10Whatever,\n '830': remove490And830Whatever,\n '946': crappy24X\n};\n\nconst cleanLegalX00Comma = {'code': 'abcde', 'followedBy': 'cdegj', 'context': /.,$/u, 'remove': /,$/u};\n// Accept upper case letters in X00$b, since they are probably Roman numerals.\nconst cleanLegalX00bDot = {'code': 'b', 'followedBy': 't#', context: /^[IVXLCDM]+\\.$/u, 'remove': /\\.$/u};\nconst cleanLegalX00iColon = {'code': 'i', 'followedBy': 'a', 'remove': / *:$/u}; // NB! context is not needed\nconst cleanLegalX00Dot = {'code': 'abcdetvl', 'followedBy': 'tu#', 'context': /(?:[a-z0-9)]|å|ä|ö)\\.$/u, 'remove': /\\.$/u};\nconst cleanLanguageComma = {'name': 'language comma', 'code': 'tv', 'followedBy': 'l', 'context': /.,$/u, 'remove': /,$/u};\n\n\nconst legalX00punc = [cleanLegalX00Comma, cleanLegalX00iColon, cleanLegalX00bDot, cleanLegalX00Dot, cleanLanguageComma];\n\nconst cleanLegalX10Comma = {'name': 'X10comma', 'code': 'abe', 'followedBy': 'e', 'context': /.,$/u, 'remove': /,$/u};\nconst cleanLegalX10Dot = {'name': 'X10dot', 'code': 'ab', 'followedBy': 'b#', 'context': /.\\.$/u, 'remove': /\\.$/u};\n\nconst legalX10punc = [cleanLegalX10Comma, cleanLegalX10Dot, cleanX00eDot, cleanLanguageComma];\n\nconst cleanLegalSeriesTitle = [ // 490 and 830\n {'code': 'a', 'followedBy': 'a', 'remove': / =$/u},\n {'code': 'axyz', 'followedBy': 'xyz', 'remove': /,$/u, 'context': /.,$/u},\n {'code': 'axyz', 'followedBy': 'v', 'remove': / *;$/u}\n];\n\nconst clean24X = [\n {'name': 'I:A', 'code': 'i', 'followedBy': 'a', 'remove': / *:$/u},\n {'name': 'A:B', 'code': 'a', 'followedBy': 'b', 'remove': / [:;=]$/u},\n {'name': 'AB:K', 'code': 'ab', 'followedBy': 'k', 'remove': / :$/u},\n {'name': 'ABK:F', 'code': 'abk', 'followedBy': 'f', 'remove': /,$/u},\n {'name': 'ABFNP:C', 'code': 'abfnp', 'followedBy': 'c', 'remove': / \\/$/u},\n {'name': 'ABN:N', 'code': 'abn', 'followedBy': 'n', 'remove': /\\.$/u},\n {'name': 'ABNP:#', 'code': 'abnp', 'followedBy': '#', 'remove': /\\.$/u},\n {'name': 'N:P', 'code': 'n', 'followedBy': 'p', 'remove': /,$/u}\n];\n\nconst cleanValidPunctuationRules = {\n '100': legalX00punc,\n '110': legalX10punc,\n '600': legalX00punc,\n '610': legalX10punc,\n '700': legalX00punc,\n '710': legalX10punc,\n '800': legalX00punc,\n '810': legalX10punc,\n '245': clean24X,\n '246': clean24X,\n '260': [\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'b', 'followedBy': 'c', 'remove': /,$/u},\n {'code': 'c', 'followedBy': '#', 'remove': /\\.$/u},\n {'code': 'd', 'followedBy': 'e', 'remove': / :$/u},\n {'code': 'e', 'followedBy': 'f', 'remove': /,$/u},\n {'code': 'f', 'followedBy': '#', 'remove': /\\.$/u} // Probably ')' but should it be removed?\n ],\n '264': [\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'b', 'followedBy': 'c', 'remove': /,$/u},\n {'code': 'c', 'followedBy': '#', 'remove': /\\.$/u}\n ],\n '300': [\n // NB! Remove crap as well, thus the '*' in / *:$/\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'ab', 'followedBy': 'c', 'remove': / ;$/u},\n {'code': 'abc', 'followedBy': 'e', 'remove': / \\+$/u}\n ],\n '490': cleanLegalSeriesTitle,\n '534': [{'code': 'p', 'followedBy': 'c', 'remove': /:$/u}],\n // Experimental, MET366-ish (end punc in internationally valid, but we don't use it here in Finland):\n '648': [{'code': 'a', 'content': /^[0-9]+\\.$/u, 'ind2': ['4'], 'remove': /\\.$/u}],\n '830': cleanLegalSeriesTitle,\n '946': clean24X\n\n};\n\n// addColonToRelationshipInformation only applies to 700/710 but as others don't have $i, it's fine\nconst addX00 = [addX00aComma, addX00aComma2, addX00aDot, addLanguageComma, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];\nconst addX10 = [addX10bDot, addX10eComma, addX10Dot, addLanguageComma, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];\n\nconst add245 = [\n // Blah! Also \"$a = $b\" and \"$a ; $b\" can be valid... But ' :' is better than nothing, I guess...\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter},\n {'code': 'ab', 'followedBy': 'n', 'add': '.', 'content': defaultNeedsPuncAfter},\n {'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': defaultNeedsPuncAfter},\n {'code': 'n', 'followedBy': 'p', 'add': ',', 'context': defaultNeedsPuncAfter},\n {'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': defaultNeedsPuncAfter},\n {'code': 'abc', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter} // Stepping on punctuation/ toes\n];\n\nconst add246 = [\n {'code': 'i', 'followedBy': 'a', 'add': ':', 'context': defaultNeedsPuncAfter},\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter},\n {'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': defaultNeedsPuncAfter},\n {'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': defaultNeedsPuncAfter}\n];\n\n\nconst addSeriesTitle = [ // 490 and 830\n {'code': 'a', 'followedBy': 'a', 'add': ' =', 'context': defaultNeedsPuncAfter2},\n {'code': 'axyz', 'followedBy': 'xy', 'add': ',', 'context': defaultNeedsPuncAfter},\n addSemicolonBeforeVolumeDesignation // eg. 490$axyz-$v\n];\n\nconst addPairedPunctuationRules = {\n '100': addX00,\n '110': addX10,\n '240': add246,\n '245': add245,\n '246': add246,\n '260': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'b', 'followedBy': 'c', 'add': ',', 'context': defaultNeedsPuncAfter2},\n {'code': 'abc', 'followedBy': 'a', 'add': ' ;', 'context': defaultNeedsPuncAfter2},\n {'code': 'e', 'followedBy': 'f', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'f', 'followedBy': 'g', 'add': ',', 'context': defaultNeedsPuncAfter2}\n ],\n '264': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'b', 'followedBy': 'c', 'add': ',', 'context': defaultNeedsPuncAfter2},\n // NB! The $c rule messes dotless exception \"264 #4 $c p1983\" up\n // We'll need to add a hacky postprocessor for this? Add 'hasInd1': '0123' etc?\n {'code': 'c', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter2}\n ],\n '300': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'ab', 'followedBy': 'c', 'add': ' ;', 'context': defaultNeedsPuncAfter2},\n {'code': 'abc', 'followedBy': 'e', 'add': ' +', 'context': defaultNeedsPuncAfter2}\n ],\n '490': addSeriesTitle,\n '506': [{'code': 'a', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter2}],\n '534': [{'code': 'p', 'followedBy': 'c', 'add': ':', 'context': defaultNeedsPuncAfter2}],\n '600': addX00,\n '610': addX10,\n '700': addX00,\n '710': addX10,\n '800': addX00,\n '810': addX10,\n '830': addSeriesTitle,\n '946': [{'code': 'i', 'followedBy': 'a', 'add': ':', 'context': defaultNeedsPuncAfter}]\n};\n\n\nfunction ruleAppliesToSubfieldCode(targetSubfieldCodes, currSubfieldCode) {\n const negation = targetSubfieldCodes.includes('!');\n if (negation) {\n return !targetSubfieldCodes.includes(currSubfieldCode);\n }\n return targetSubfieldCodes.includes(currSubfieldCode);\n}\n\n\nfunction ruleAppliesToField(rule, field) {\n if ('ind1' in rule && field.ind1.includes(rule.ind1)) {\n return false;\n }\n\n if ('ind2' in rule && field.ind2.includes(rule.ind2)) {\n return false;\n }\n\n // If we want to check, say, $2, it should be implemented here!\n\n return true;\n}\n\n\nfunction ruleAppliesToCurrentSubfield(rule, subfield) {\n if (!ruleAppliesToSubfieldCode(rule.code, subfield.code)) {\n return false;\n }\n if ('context' in rule && !subfield.value.match(rule.context)) { // njsscan-ignore: regex_injection_dos\n return false;\n }\n return true;\n}\n\nfunction ruleAppliesToNextSubfield(rule, nextSubfield) {\n if (!('followedBy' in rule)) { // Return true, if we are not interested in the next subfield\n return true;\n }\n // The '#' existence check applies only to the RHS field. LHS always exists.\n if (!nextSubfield) {\n const negation = rule.followedBy.includes('!');\n if (negation) {\n return !rule.followedBy.includes('#');\n }\n return rule.followedBy.includes('#');\n }\n\n if (!ruleAppliesToSubfieldCode(rule.followedBy, nextSubfield.code)) {\n return false;\n }\n if ('contextRHS' in rule && !nextSubfield.value.match(rule.contextRHS)) { // njsscan-ignore: regex_injection_dos\n return false;\n }\n return true;\n}\n\nfunction checkRule(rule, field, subfield1, subfield2) {\n if (!ruleAppliesToField(rule, field)) {\n nvdebug(`FAIL ON WHOLE FIELD: '${fieldToString(field)}`);\n return false;\n }\n //const name = rule.name || 'UNNAMED';\n if (!ruleAppliesToCurrentSubfield(rule, subfield1)) {\n //nvdebug(`${name}: FAIL ON LHS SUBFIELD: '$${subfield1.code} ${subfield1.value}', SF=${rule.code}`, debug);\n return false;\n }\n\n // NB! This is not a perfect solution. We might have $e$0$e where $e$0 punctuation should actually be based on $e$e rules\n if (!ruleAppliesToNextSubfield(rule, subfield2)) {\n //const msg = subfield2 ? `${name}: FAIL ON RHS SUBFIELD '${subfield2.code}' not in [${rule.followedBy}]` : `${name}: FAIL ON RHS FIELD`;\n //nvdebug(msg, debug);\n return false;\n }\n\n //nvdebug(`${name}: ACCEPT ${rule.code}/${subfield1.code}, SF2=${rule.followedBy}/${subfield2 ? subfield2.code : '#'}`, debug);\n return true;\n}\n\nfunction applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, operation = NONE) {\n\n /*\n if (ruleArray === null || operation === NONE) {\n debug(`applyPunctuation(): No rules to apply!`);\n return;\n }\n*/\n if (!(`${field.tag}` in ruleArray) || ruleArray === null || operation === NONE) {\n\n /*\n if (!['020', '650'].includes(tag) || !isControlSubfieldCode(subfield1.code)) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`No punctuation rules found for ${tag} (looking for: ‡${subfield1.code})`, debug);\n\n }\n */\n return;\n }\n\n //nvdebug(`OP=${operation} ${tag}: '${subfield1.code}: ${subfield1.value}' ??? '${subfield2 ? subfield2.code : '#'}'`, debug);\n const activeRules = ruleArray[field.tag].filter(rule => checkRule(rule, field, subfield1, subfield2));\n\n activeRules.forEach(rule => {\n const originalValue = subfield1.value;\n if (rule.remove && [REMOVE, REMOVE_AND_ADD].includes(operation) && subfield1.value.match(rule.remove)) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(` PUNC REMOVAL TO BE PERFORMED FOR $${subfield1.code} '${subfield1.value}'`, debug);\n subfield1.value = subfield1.value.replace(rule.remove, ''); // eslint-disable-line functional/immutable-data\n //nvdebug(` PUNC REMOVAL PERFORMED FOR '${subfield1.value}'`, debug);\n }\n if (rule.add && [ADD, REMOVE_AND_ADD].includes(operation)) { // eslint-disable-line functional/no-conditional-statements\n subfield1.value += rule.add; // eslint-disable-line functional/immutable-data\n //nvdebug(` ADDED '${rule.add}' TO '${subfield1.value}'`, debug);\n }\n if (subfield1.value !== originalValue) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(` PROCESS PUNC: '‡${subfield1.code} ${originalValue}' => '‡${subfield1.code} ${subfield1.value}'`, debug); // eslint-disable-line functional/immutable-data\n }\n });\n}\n\nfunction subfieldFixPunctuation(field, subfield1, subfield2) {\n applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);\n applyPunctuationRules(field, subfield1, subfield2, addPairedPunctuationRules, ADD);\n}\n\nfunction subfieldStripPunctuation(field, subfield1, subfield2) {\n //nvdebug(`FSP1: '${subfield1.value}'`);\n applyPunctuationRules(field, subfield1, subfield2, cleanValidPunctuationRules, REMOVE);\n //nvdebug(`FSP2: '${subfield1.value}'`);\n applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);\n //nvdebug(`FSP3: '${subfield1.value}'`);\n\n}\n\nexport function fieldStripPunctuation(field) {\n if (!field.subfields) {\n return field;\n }\n\n field.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n subfieldStripPunctuation(field, sf, getNextRelevantSubfield(field, i));\n\n });\n return field;\n}\n\nexport function fieldFixPunctuation(field) {\n if (!field.subfields) {\n return field;\n }\n nvdebug(`################### fieldFixPunctuation() TEST ${fieldToString(field)}`);\n\n field.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n subfieldFixPunctuation(field, sf, getNextRelevantSubfield(field, i));\n });\n\n // Use shared code for final punctuation (sadly this does not fix intermediate punc):\n if (field.useExternalEndPunctuation) { // eslint-disable-line functional/no-conditional-statements\n // addFinalPunctuation(field); // local version. use shared code instead.\n validateSingleField(field, false, true); // NB! Don't use field.tag as second argument! It's a string, not an int. 3rd arg must be true (=fix)\n }\n return field;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"punctuation2.js","names":["_endingPunctuation","require","_utils","_clone","_interopRequireDefault","obj","__esModule","default","_default","description","validate","fix","record","nvdebug","res","message","valid","fields","forEach","f","fieldFixPunctuation","fieldsNeedingModification","filter","fieldNeedsModification","values","map","fieldToString","newValues","fieldGetFixedString","messages","val","i","length","isControlSubfield","subfield","includes","code","getNextRelevantSubfield","field","currSubfieldIndex","subfields","find","index","add","cloneField","clone","operation","subfieldFixPunctuation","subfieldStripPunctuation","sf","originalFieldAsString","modifiedFieldAsString","commaNeedsPuncAfter","defaultNeedsPuncAfter","defaultNeedsPuncAfter2","blocksPuncRHS","allowsPuncRHS","dotIsProbablyPunc","puncIsProbablyPunc","removeColons","removeX00Comma","cleanRHS","cleanX00dCommaOrDot","cleanX00aDot","cleanCorruption","cleanX00eDot","X00RemoveDotAfterBracket","cleanPuncBeforeLanguage","addX00aComma","addX00aComma2","addX00aDot","addX10bDot","addX10eComma","addX10Dot","addLanguageComma","addColonToRelationshipInformation","addSemicolonBeforeVolumeDesignation","NONE","ADD","REMOVE","REMOVE_AND_ADD","removeX00Whatever","removeX10Whatever","remove490And830Whatever","linkingEntryWhatever","crappy24X","cleanCrappyPunctuationRules","cleanLegalX00Comma","cleanLegalX00bDot","context","cleanLegalX00iColon","cleanLegalX00Dot","cleanLanguageComma","legalX00punc","cleanLegalX10Comma","cleanLegalX10Dot","legalX10punc","cleanLegalSeriesTitle","clean24X","cleanValidPunctuationRules","addX00","addX10","add245","add246","addSeriesTitle","addPairedPunctuationRules","ruleAppliesToSubfieldCode","targetSubfieldCodes","currSubfieldCode","negation","ruleAppliesToField","rule","ind1","ind2","ruleAppliesToCurrentSubfield","value","match","ruleAppliesToNextSubfield","nextSubfield","followedBy","contextRHS","checkRule","subfield1","subfield2","applyPunctuationRules","ruleArray","tag","subfieldToString","candRules","remove","replace","fieldStripPunctuation","useExternalEndPunctuation","validateSingleField"],"sources":["../src/punctuation2.js"],"sourcesContent":["/*\n* punctuation.js -- try and fix a marc field punctuation\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n* NOTE #1: https://www.kiwi.fi/display/kumea/Loppupisteohje is implemented via another validator/fixer (ending-punctuation).\n* This file has some support but it's now yet thorough. (And mmight never be.)\n* NOTE #2: Validator/fixer punctuation does similar stuff, but focuses on X00 fields.\n* NOTE #3: As of 2023-06-05 control subfields ($0...$9) are obsolete. Don't use them in rules.\n* (They are jumped over when looking for next (non-controlfield subfield)\n*/\nimport {validateSingleField} from './ending-punctuation';\n//import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug, subfieldToString} from './utils';\nimport clone from 'clone';\n\n//const debug = createDebugLogger('debug/punctuation2');\n\nexport default function () {\n return {\n description: 'Add punctuation to data fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Add punctuation to data fields: fixer');\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fieldFixPunctuation(f));\n return res;\n }\n\n function validate(record) {\n nvdebug('Add punctuation to data fields: validate');\n\n const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, true));\n\n\n const values = fieldsNeedingModification.map(f => fieldToString(f));\n const newValues = fieldsNeedingModification.map(f => fieldGetFixedString(f, true));\n\n const messages = values.map((val, i) => `'${val}' => '${newValues[i]}'`);\n\n const res = {message: messages};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nfunction isControlSubfield(subfield) {\n return ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].includes(subfield.code);\n}\n\nfunction getNextRelevantSubfield(field, currSubfieldIndex) {\n return field.subfields.find((subfield, index) => index > currSubfieldIndex && !isControlSubfield(subfield));\n}\n\nexport function fieldGetFixedString(field, add = true) {\n const cloneField = clone(field);\n const operation = add ? subfieldFixPunctuation : subfieldStripPunctuation;\n cloneField.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n operation(cloneField, sf, getNextRelevantSubfield(cloneField, i));\n });\n return fieldToString(cloneField);\n}\n\nexport function fieldNeedsModification(field, add = true) {\n if (!field.subfields) {\n return false;\n }\n\n const originalFieldAsString = fieldToString(field);\n const modifiedFieldAsString = fieldGetFixedString(field, add);\n\n return modifiedFieldAsString !== originalFieldAsString;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////\n// <= Above code is written for the validator logic <= //\n// => Everything below was originally transferred from reducers' punctuation.js => //\n/////////////////////////////////////////////////////////////////////////////////////\n\n\n//const stripCrap = / *[-;:,+]+$/u;\nconst commaNeedsPuncAfter = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö|\\))$/u;\nconst defaultNeedsPuncAfter = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö)$/u;\nconst defaultNeedsPuncAfter2 = /(?:[\\]a-zA-Z0-9)]|ä|å|ö|Å|Ä|Ö)$/u;\nconst blocksPuncRHS = /^(?:\\()/u;\nconst allowsPuncRHS = /^(?:[A-Za-z0-9]|å|ä|ö|Å|Ä|Ö)/u;\n\nconst dotIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö|(?:[A-Za-z0-9]|Å|Ä|Ö)(?:[A-Z]|Å|Ä|Ö))\\.$/u;\nconst puncIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö) ?[.,:;]$/u;\n// NB! 65X: Finnish terms don't use punctuation, but international ones do. Neither one is currently (2021-11-08) coded here.\n\n// Will unfortunately trigger \"Sukunimi, Th.\" type:\nconst removeColons = {'code': 'abcdefghijklmnopqrstuvwxyz', 'remove': / *[;:]$/u};\nconst removeX00Comma = {'code': 'abcqde', 'followedBy': 'abcqde#', 'context': /.,$/u, 'remove': /,$/u};\nconst cleanRHS = {'code': 'abcd', 'followedBy': 'bcde', 'context': /(?:(?:[a-z0-9]|å|ä|ö)\\.|,)$/u, 'contextRHS': blocksPuncRHS, 'remove': /[.,]$/u};\nconst cleanX00dCommaOrDot = {'code': 'd', 'followedBy': 'et#', 'context': /[0-9]-[,.]$/u, 'remove': /[,.]$/u};\nconst cleanX00aDot = {'code': 'abcde', 'followedBy': 'cdegj', 'context': dotIsProbablyPunc, 'remove': /\\.$/u};\nconst cleanCorruption = {'code': 'abcdefghijklmnopqrstuvwxyz', 'remove': / \\.$/u};\n// These $e dot removals are tricky: before removing the comma, we should know that it ain't an abbreviation such as \"esitt.\"...\nconst cleanX00eDot = {'code': 'e', 'followedBy': 'egj#', 'context': /(?:[ai]ja|jä)[.,]$/u, 'remove': /\\.$/u};\n\nconst X00RemoveDotAfterBracket = {'code': 'cq', 'context': /\\)\\.$/u, 'remove': /\\.$/u};\n// 390, 800, 810, 830...\nconst cleanPuncBeforeLanguage = {'code': 'atvxyz', 'followedBy': 'l', 'context': puncIsProbablyPunc, 'remove': / *[.,:;]$/u};\n\n\nconst addX00aComma = {'add': ',', 'code': 'abcqdej', 'followedBy': 'cdeg', 'context': commaNeedsPuncAfter, 'contextRHS': allowsPuncRHS};\nconst addX00aComma2 = {'add': ',', 'code': 'abcdej', 'followedBy': 'cdeg', 'context': /(?:[A-Z]|Å|Ä|Ö)\\.$/u, 'contextRHS': allowsPuncRHS};\nconst addX00aDot = {'add': '.', 'code': 'abcde', 'followedBy': '#tu', 'context': defaultNeedsPuncAfter};\n\nconst addX10bDot = {'name': 'Add X10 pre-$b dot', 'add': '.', 'code': 'ab', 'followedBy': 'b', 'context': defaultNeedsPuncAfter};\nconst addX10eComma = {'add': ',', 'code': 'abe', 'followedBy': 'e', 'context': defaultNeedsPuncAfter};\nconst addX10Dot = {'name': 'Add X10 final dot', 'add': '.', 'code': 'abe', 'followedBy': '#', 'context': defaultNeedsPuncAfter};\nconst addLanguageComma = {'name': 'Add comma before 810$l', 'add': ',', 'code': 'tv', 'followedBy': 'l', 'context': defaultNeedsPuncAfter2};\nconst addColonToRelationshipInformation = {'name': 'Add \\':\\' to 7X0 $i relationship info', 'add': ':', 'code': 'i', 'context': defaultNeedsPuncAfter2};\n\n// 490:\nconst addSemicolonBeforeVolumeDesignation = {'name': 'Add \" ;\" before $v', 'add': ' ;', 'code': 'atxyz', 'followedBy': 'v', 'context': /[^;]$/u};\n\nconst NONE = 0;\nconst ADD = 2;\nconst REMOVE = 1;\nconst REMOVE_AND_ADD = 3;\n\n// Crappy punctuation consists of various crap that is somewhat common.\n// We strip crap for merge decisions. We are not trying to actively remove crap here.\n\nconst removeX00Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, cleanX00dCommaOrDot, cleanRHS, X00RemoveDotAfterBracket, removeColons, cleanPuncBeforeLanguage];\nconst removeX10Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, removeColons, cleanPuncBeforeLanguage];\n\nconst remove490And830Whatever = [{'code': 'axyzv', 'followedBy': 'axyzv', 'remove': /(?: *;| *=|,)$/u}];\n\nconst linkingEntryWhatever = [{'code': 'abdghiklmnopqrstuwxyz', 'followedBy': 'abdghiklmnopqrstuwxyz', 'remove': /\\. -$/u}];\n\n\n// '!' means negation, thus '!b' means any other subfield but 'b'.\n// 'followedBy': '#' means that current subfield is the last subfield.\n// NB! Note that control subfields are ignored in punctuation rules.\n// NB #2! Control field ignorance causes issues with field 257: https://wiki.helsinki.fi/display/rdasovellusohje/Loppupisteohje\n// Might need to work on that at some point. NOT a top priority though.\n// NB #3! Final punctuation creation is/should be handled by endind-punctuation.js validator!\n\nconst crappy24X = [\n {'code': 'abnp', 'followedBy': '!c', 'remove': / \\/$/u},\n {'code': 'abn', 'followedBy': 'c', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'abc', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'abfghinp', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'n', 'followedBy': 'p', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}, // MELINDA-8817\n {'code': 'p', 'followedBy': 'pc', 'remove': /\\.$/u, 'context': dotIsProbablyPunc} // MELINDA-8817\n];\n\nconst cleanCrappyPunctuationRules = {\n '100': removeX00Whatever,\n '110': removeX10Whatever,\n '240': crappy24X,\n '245': crappy24X,\n '246': crappy24X,\n '300': [\n {'code': 'a', 'followedBy': '!b', 'remove': / *:$/u},\n {'code': 'a', 'followedBy': 'b', 'remove': /:$/u, 'context': /[^ ]:$/u},\n {'code': 'ab', 'followedBy': '!c', 'remove': / *;$/u},\n {'code': 'ab', 'followedBy': 'c', 'remove': /;$/u, 'context': /[^ ];$/u},\n {'code': 'abc', 'followedBy': '!e', 'remove': / *\\+$/u} // Removes both valid (with one space) and invalid (spaceless et al) puncs\n\n ],\n\n '490': remove490And830Whatever,\n '600': removeX00Whatever,\n '610': removeX10Whatever,\n '700': removeX00Whatever,\n '710': removeX10Whatever,\n '773': linkingEntryWhatever,\n '774': linkingEntryWhatever,\n '776': linkingEntryWhatever,\n '800': removeX00Whatever,\n '810': removeX10Whatever,\n '830': remove490And830Whatever,\n '946': crappy24X\n};\n\nconst cleanLegalX00Comma = {'code': 'abcde', 'followedBy': 'cdegj', 'context': /.,$/u, 'remove': /,$/u};\n// Accept upper case letters in X00$b, since they are probably Roman numerals.\nconst cleanLegalX00bDot = {'code': 'b', 'followedBy': 't#', context: /^[IVXLCDM]+\\.$/u, 'remove': /\\.$/u};\nconst cleanLegalX00iColon = {'code': 'i', 'followedBy': 'a', 'remove': / *:$/u}; // NB! context is not needed\nconst cleanLegalX00Dot = {'code': 'abcdetvl', 'followedBy': 'tu#', 'context': /(?:[a-z0-9)]|å|ä|ö)\\.$/u, 'remove': /\\.$/u};\nconst cleanLanguageComma = {'name': 'language comma', 'code': 'tv', 'followedBy': 'l', 'context': /.,$/u, 'remove': /,$/u};\n\n\nconst legalX00punc = [cleanLegalX00Comma, cleanLegalX00iColon, cleanLegalX00bDot, cleanLegalX00Dot, cleanLanguageComma];\n\nconst cleanLegalX10Comma = {'name': 'X10comma', 'code': 'abe', 'followedBy': 'e', 'context': /.,$/u, 'remove': /,$/u};\nconst cleanLegalX10Dot = {'name': 'X10dot', 'code': 'ab', 'followedBy': 'b#', 'context': /.\\.$/u, 'remove': /\\.$/u};\n\nconst legalX10punc = [cleanLegalX10Comma, cleanLegalX10Dot, cleanX00eDot, cleanLanguageComma];\n\nconst cleanLegalSeriesTitle = [ // 490 and 830\n {'code': 'a', 'followedBy': 'a', 'remove': / =$/u},\n {'code': 'axyz', 'followedBy': 'xyz', 'remove': /,$/u, 'context': /.,$/u},\n {'code': 'axyz', 'followedBy': 'v', 'remove': / *;$/u}\n];\n\nconst clean24X = [\n {'name': 'I:A', 'code': 'i', 'followedBy': 'a', 'remove': / *:$/u},\n {'name': 'A:B', 'code': 'a', 'followedBy': 'b', 'remove': / [:;=]$/u},\n {'name': 'AB:K', 'code': 'ab', 'followedBy': 'k', 'remove': / :$/u},\n {'name': 'ABK:F', 'code': 'abk', 'followedBy': 'f', 'remove': /,$/u},\n {'name': 'ABFNP:C', 'code': 'abfnp', 'followedBy': 'c', 'remove': / \\/$/u},\n {'name': 'ABN:N', 'code': 'abn', 'followedBy': 'n', 'remove': /\\.$/u},\n {'name': 'ABNP:#', 'code': 'abnp', 'followedBy': '#', 'remove': /\\.$/u},\n {'name': 'N:P', 'code': 'n', 'followedBy': 'p', 'remove': /,$/u}\n];\n\nconst cleanValidPunctuationRules = {\n '100': legalX00punc,\n '110': legalX10punc,\n '600': legalX00punc,\n '610': legalX10punc,\n '700': legalX00punc,\n '710': legalX10punc,\n '800': legalX00punc,\n '810': legalX10punc,\n '245': clean24X,\n '246': clean24X,\n '260': [\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'b', 'followedBy': 'c', 'remove': /,$/u},\n {'code': 'c', 'followedBy': '#', 'remove': /\\.$/u},\n {'code': 'd', 'followedBy': 'e', 'remove': / :$/u},\n {'code': 'e', 'followedBy': 'f', 'remove': /,$/u},\n {'code': 'f', 'followedBy': '#', 'remove': /\\.$/u} // Probably ')' but should it be removed?\n ],\n '264': [\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'b', 'followedBy': 'c', 'remove': /,$/u},\n {'code': 'c', 'followedBy': '#', 'remove': /\\.$/u}\n ],\n '300': [\n // NB! Remove crap as well, thus the '*' in / *:$/\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'ab', 'followedBy': 'c', 'remove': / ;$/u},\n {'code': 'abc', 'followedBy': 'e', 'remove': / \\+$/u}\n ],\n '490': cleanLegalSeriesTitle,\n '534': [{'code': 'p', 'followedBy': 'c', 'remove': /:$/u}],\n // Experimental, MET366-ish (end punc in internationally valid, but we don't use it here in Finland):\n '648': [{'code': 'a', 'content': /^[0-9]+\\.$/u, 'ind2': ['4'], 'remove': /\\.$/u}],\n '830': cleanLegalSeriesTitle,\n '946': clean24X\n\n};\n\n// addColonToRelationshipInformation only applies to 700/710 but as others don't have $i, it's fine\nconst addX00 = [addX00aComma, addX00aComma2, addX00aDot, addLanguageComma, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];\nconst addX10 = [addX10bDot, addX10eComma, addX10Dot, addLanguageComma, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];\n\nconst add245 = [\n // Blah! Also \"$a = $b\" and \"$a ; $b\" can be valid... But ' :' is better than nothing, I guess...\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter},\n {'code': 'ab', 'followedBy': 'n', 'add': '.', 'context': defaultNeedsPuncAfter},\n {'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': defaultNeedsPuncAfter},\n {'code': 'n', 'followedBy': 'p', 'add': ',', 'context': defaultNeedsPuncAfter},\n {'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': defaultNeedsPuncAfter},\n {'code': 'abc', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter} // Stepping on \"punctuation validaror's\" toes\n];\n\nconst add246 = [\n {'code': 'i', 'followedBy': 'a', 'add': ':', 'context': defaultNeedsPuncAfter},\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter},\n {'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': defaultNeedsPuncAfter},\n {'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': defaultNeedsPuncAfter}\n];\n\n\nconst addSeriesTitle = [ // 490 and 830\n {'code': 'a', 'followedBy': 'a', 'add': ' =', 'context': defaultNeedsPuncAfter2},\n {'code': 'axyz', 'followedBy': 'xy', 'add': ',', 'context': defaultNeedsPuncAfter},\n addSemicolonBeforeVolumeDesignation // eg. 490$axyz-$v\n];\n\nconst addPairedPunctuationRules = {\n '100': addX00,\n '110': addX10,\n '240': add246,\n '245': add245,\n '246': add246,\n '260': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'b', 'followedBy': 'c', 'add': ',', 'context': defaultNeedsPuncAfter2},\n {'code': 'abc', 'followedBy': 'a', 'add': ' ;', 'context': defaultNeedsPuncAfter2},\n {'code': 'e', 'followedBy': 'f', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'f', 'followedBy': 'g', 'add': ',', 'context': defaultNeedsPuncAfter2}\n ],\n '264': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'b', 'followedBy': 'c', 'add': ',', 'context': defaultNeedsPuncAfter2},\n // NB! The $c rule messes dotless exception \"264 #4 $c p1983\" up\n // We'll need to add a hacky postprocessor for this? Add 'hasInd1': '0123' etc?\n {'code': 'c', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter2}\n ],\n '300': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'ab', 'followedBy': 'c', 'add': ' ;', 'context': defaultNeedsPuncAfter2},\n {'code': 'abc', 'followedBy': 'e', 'add': ' +', 'context': defaultNeedsPuncAfter2}\n ],\n '490': addSeriesTitle,\n '506': [{'code': 'a', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter2}],\n '534': [{'code': 'p', 'followedBy': 'c', 'add': ':', 'context': defaultNeedsPuncAfter2}],\n '600': addX00,\n '610': addX10,\n '700': addX00,\n '710': addX10,\n '800': addX00,\n '810': addX10,\n '830': addSeriesTitle,\n '946': [{'code': 'i', 'followedBy': 'a', 'add': ':', 'context': defaultNeedsPuncAfter}]\n};\n\n/*\nfunction debugRule(rule) {\n //nvdebug('');\n nvdebug(`NAME ${rule.name ? rule.name : '<unnamed>'}`);\n nvdebug(`SUBFIELD CODE '${rule.code}' FOLLOWED BY SUBFIELD CODE '${rule.followedBy}'`);\n if ('add' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`ADD '${rule.add}'`);\n }\n if ('remove' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`REMOVE '${rule.remove}'`);\n }\n if ('context' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`CONTEXT '${rule.context.toString()}'`);\n }\n //nvdebug('');\n}\n*/\n\nfunction ruleAppliesToSubfieldCode(targetSubfieldCodes, currSubfieldCode) {\n const negation = targetSubfieldCodes.includes('!');\n if (negation) {\n return !targetSubfieldCodes.includes(currSubfieldCode);\n }\n return targetSubfieldCodes.includes(currSubfieldCode);\n}\n\n\nfunction ruleAppliesToField(rule, field) {\n if ('ind1' in rule && field.ind1.includes(rule.ind1)) {\n return false;\n }\n\n if ('ind2' in rule && field.ind2.includes(rule.ind2)) {\n return false;\n }\n\n // If we want to check, say, $2, it should be implemented here!\n\n return true;\n}\n\n\nfunction ruleAppliesToCurrentSubfield(rule, subfield) {\n //nvdebug(` Apply rule on LHS?`);\n if (!ruleAppliesToSubfieldCode(rule.code, subfield.code)) {\n //nvdebug(` Reject rule!`);\n return false;\n }\n if ('context' in rule) {\n //nvdebug(` Check '${subfield.value}' versus '${rule.context.toString()}'`);\n if (!subfield.value.match(rule.context)) { // njsscan-ignore: regex_injection_dos\n //nvdebug(` Reject rule!`);\n return false;\n }\n }\n //nvdebug(` Apply rule!`);\n return true;\n}\n\nfunction ruleAppliesToNextSubfield(rule, nextSubfield) {\n if (!('followedBy' in rule)) { // Return true, if we are not interested in the next subfield\n return true;\n }\n // The '#' existence check applies only to the RHS field. LHS always exists.\n if (!nextSubfield) {\n const negation = rule.followedBy.includes('!');\n if (negation) {\n return !rule.followedBy.includes('#');\n }\n return rule.followedBy.includes('#');\n }\n\n if (!ruleAppliesToSubfieldCode(rule.followedBy, nextSubfield.code)) {\n return false;\n }\n if ('contextRHS' in rule && !nextSubfield.value.match(rule.contextRHS)) { // njsscan-ignore: regex_injection_dos\n return false;\n }\n return true;\n}\n\nfunction checkRule(rule, field, subfield1, subfield2) {\n if (!ruleAppliesToField(rule, field)) {\n //nvdebug(`FAIL ON WHOLE FIELD: '${fieldToString(field)}`);\n return false;\n }\n //const name = rule.name || 'UNNAMED';\n if (!ruleAppliesToCurrentSubfield(rule, subfield1)) {\n //nvdebug(`${name}: FAIL ON LHS SUBFIELD: '$${subfield1.code} ${subfield1.value}', SF=${rule.code}`, debug);\n return false;\n }\n\n // NB! This is not a perfect solution. We might have $e$0$e where $e$0 punctuation should actually be based on $e$e rules\n if (!ruleAppliesToNextSubfield(rule, subfield2)) {\n //const msg = subfield2 ? `${name}: FAIL ON RHS SUBFIELD '${subfield2.code}' not in [${rule.followedBy}]` : `${name}: FAIL ON RHS FIELD`;\n //nvdebug(msg, debug);\n return false;\n }\n\n //nvdebug(`${rule.name ? rule.name : '<unnamed>'}: ACCEPT ${rule.code} (${subfield1.code}), SF2=${rule.followedBy} (${subfield2 ? subfield2.code : '#'})`, debug);\n return true;\n}\n\nfunction applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, operation = NONE) {\n\n if (!(`${field.tag}` in ruleArray) || ruleArray === null || operation === NONE) {\n\n /*\n if (!['020', '650'].includes(tag) || !isControlSubfieldCode(subfield1.code)) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`No punctuation rules found for ${tag} (looking for: ‡${subfield1.code})`, debug);\n\n }\n */\n return;\n }\n nvdebug(`PUNCTUATE ${field.tag} '${subfieldToString(subfield1)}' XXX '${subfield2 ? subfieldToString(subfield2) : '#'} }`);\n\n //nvdebug(`OP=${operation} ${tag}: '${subfield1.code}: ${subfield1.value}' ??? '${subfield2 ? subfield2.code : '#'}'`, debug);\n const candRules = ruleArray[field.tag];\n candRules.forEach(rule => {\n //debugRule(rule);\n\n if (!checkRule(rule, field, subfield1, subfield2)) {\n return;\n }\n\n //const originalValue = subfield1.value;\n if (rule.remove && [REMOVE, REMOVE_AND_ADD].includes(operation) && subfield1.value.match(rule.remove)) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(` PUNC REMOVAL TO BE PERFORMED FOR $${subfield1.code} '${subfield1.value}'`, debug);\n subfield1.value = subfield1.value.replace(rule.remove, ''); // eslint-disable-line functional/immutable-data\n //nvdebug(` PUNC REMOVAL PERFORMED FOR '${subfield1.value}'`, debug);\n }\n if (rule.add && [ADD, REMOVE_AND_ADD].includes(operation)) { // eslint-disable-line functional/no-conditional-statements\n subfield1.value += rule.add; // eslint-disable-line functional/immutable-data\n //nvdebug(` ADDED '${rule.add}' TO FORM '${subfield1.value}'`, debug);\n }\n\n /*\n if (subfield1.value !== originalValue) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(` PROCESS PUNC: '‡${subfield1.code} ${originalValue}' => '‡${subfield1.code} ${subfield1.value}'`, debug); // eslint-disable-line functional/immutable-data\n }\n */\n });\n}\n\nfunction subfieldFixPunctuation(field, subfield1, subfield2) {\n applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);\n applyPunctuationRules(field, subfield1, subfield2, addPairedPunctuationRules, ADD);\n}\n\nfunction subfieldStripPunctuation(field, subfield1, subfield2) {\n //nvdebug(`FSP1: '${subfield1.value}'`);\n applyPunctuationRules(field, subfield1, subfield2, cleanValidPunctuationRules, REMOVE);\n //nvdebug(`FSP2: '${subfield1.value}'`);\n applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);\n //nvdebug(`FSP3: '${subfield1.value}'`);\n\n}\n\nexport function fieldStripPunctuation(field) {\n if (!field.subfields) {\n return field;\n }\n\n field.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n subfieldStripPunctuation(field, sf, getNextRelevantSubfield(field, i));\n\n });\n return field;\n}\n\nexport function fieldFixPunctuation(field) {\n if (!field.subfields) {\n return field;\n }\n //nvdebug(`################### fieldFixPunctuation() TEST ${fieldToString(field)}`);\n\n field.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n // We'll need some magic for field 257 here, do we? (Also Finnish lexicons vs global lexicons in 65X fields)\n subfieldFixPunctuation(field, sf, getNextRelevantSubfield(field, i));\n });\n\n // Use shared code for final punctuation (sadly this does not fix intermediate punc):\n if (field.useExternalEndPunctuation) { // eslint-disable-line functional/no-conditional-statements\n // addFinalPunctuation(field); // local version. use shared code instead.\n validateSingleField(field, false, true); // NB! Don't use field.tag as second argument! It's a string, not an int. 3rd arg must be true (=fix)\n }\n return field;\n}\n"],"mappings":"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"}
|
package/dist/sortFields.js
CHANGED
|
@@ -202,15 +202,24 @@ function preferFenniKeep(fieldA, fieldB) {
|
|
|
202
202
|
return preferKeep(fieldA, fieldB, 'FIKKA');
|
|
203
203
|
}
|
|
204
204
|
function sortByRelatorTerm(fieldA, fieldB) {
|
|
205
|
-
//
|
|
205
|
+
//if (!['600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'].includes(fieldA.tag)) {
|
|
206
206
|
if (!['700', '710', '711', '730'].includes(fieldA.tag)) {
|
|
207
207
|
return 0;
|
|
208
208
|
}
|
|
209
209
|
function fieldGetMaxRelatorTermScore(field) {
|
|
210
210
|
if (!field.subfields) {
|
|
211
|
+
return -1;
|
|
212
|
+
}
|
|
213
|
+
// If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...
|
|
214
|
+
if ((0, _utils.fieldHasSubfield)(field, 't')) {
|
|
215
|
+
return -1;
|
|
216
|
+
}
|
|
217
|
+
const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';
|
|
218
|
+
const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);
|
|
219
|
+
if (e.length === 0) {
|
|
220
|
+
// No $e is still better than having a $t
|
|
211
221
|
return 0;
|
|
212
222
|
}
|
|
213
|
-
const e = field.subfields.filter(sf => sf.code === 'e');
|
|
214
223
|
const scores = e.map(sf => scoreRelatorTerm(sf.value));
|
|
215
224
|
//debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);
|
|
216
225
|
return Math.max(...scores);
|
package/dist/sortFields.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sortFields.js","names":["_clone","_interopRequireDefault","require","_utils","_marcFieldSort","_subfield8Utils","_subfield6Utils","obj","__esModule","default","BIG_BAD_NUMBER","_default","description","validate","fix","record","res","message","valid","fields","sort","fieldOrderComparator","map","f","clone","relocatedFields","filter","i","fieldToString","length","push","relatorTermScore","exports","scoreRelatorTerm","value","normValue","replace","fieldA","fieldB","sorterFunctions","sortByTag","sortByIndexTerms","sortAlphabetically","sortByRelatorTerm","sortByOccurrenceNumber","preferFenniKeep","sortByFieldLinkAndSequenceNumber","globalFieldOrderComparator","indexTermFields","scoreInd2","val","ind2Score","tag","includes","ind2","scoreDictionary","dictionary","dictionarySortIndex","dictionaryA","selectFirstValue","dictionaryB","dictScoreA","dictScoreB","preferKeep","keepOwner","hasKeepA","fieldHasSubfield","hasKeepB","fenniPreference","violaPreference","fieldGetMaxRelatorTermScore","field","subfields","e","sf","code","scores","Math","max","scoreA","scoreB","fieldGetMinLinkAndSequenceNumber","relevantSubfields","isValidSubfield8","parseFloat","min","fieldGetOccurrenceNumber","subfield6","find","isValidSubfield6","undefined","parseInt","subfield6GetOccurrenceNumber","subcode","subfield","slice"],"sources":["../src/sortFields.js"],"sourcesContent":["// Taken from project marc-record-js, file marcSortFields.js as this contains more and more Melinda-specific rules.\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString} from './utils';\nimport {sortByTag, sortAlphabetically, fieldOrderComparator as globalFieldOrderComparator} from '@natlibfi/marc-record/dist/marcFieldSort';\nimport {isValidSubfield8} from './subfield8Utils';\nimport {isValidSubfield6, subfield6GetOccurrenceNumber} from './subfield6Utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortFields');\n//const debugData = debug.extend('data');\n//const debugDev = debug.extend('dev');\n\nconst BIG_BAD_NUMBER = 999999999;\nexport default function () {\n\n return {\n description: 'Sort fields using both generic and Melinda specific rules',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const fields = record.fields.map(f => clone(f));\n fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n\n const relocatedFields = fields.filter((f, i) => fieldToString(f) !== fieldToString(record.fields[i]));\n\n if (relocatedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${relocatedFields.length} field(s) in new places`); // eslint-disable-line functional/immutable-data\n }\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nexport const relatorTermScore = { // Here bigger is better\n // NB! This is exportable as field internal $e sorting in marc-record-validators-js uses this.\n // NB! The more abstract, the earlier it appears.\n // Note that terms with same abstraction level might also have order preferences\n // We should 1) check the order of these, and 2) add translations (support Swedish at the very least)\n // work/teos > expression/ekspressio > manifestation/manifestaatio\n 'säveltäjä': 100, 'composer': 100,\n 'kirjoittaja': 99, 'author': 100,\n 'sarjakuvantekijä': 99,\n 'taiteilija': 98,\n 'sanoittaja': 90,\n 'käsikirjoittaja': 90,\n // expression:\n 'toimittaja': 80, 'editor': 80,\n 'sovittaja': 80, 'arranger': 80,\n 'kuvittaja': 75,\n 'editointi': 71, // for music, editor/toimittaja is another thing\n 'kääntäjä': 70,\n 'lukija': 61,\n // Manifestation level\n 'esittäjä': 60,\n 'johtaja': 50, // orkesterinjohtaja\n 'kustantaja': 41,\n 'julkaisija': 40\n\n};\n\nexport function scoreRelatorTerm(value) { // sortRelatorTerms.js validator should call this on future version\n const normValue = value.replace(/[.,]+$/u, '');\n if (normValue in relatorTermScore) {\n return relatorTermScore[normValue];\n }\n return 0;\n}\n\nexport function fieldOrderComparator(fieldA, fieldB) {\n\n //const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n //const sorterFunctions = [sortByIndexTerms, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n return globalFieldOrderComparator(fieldA, fieldB, sorterFunctions);\n}\n\nfunction sortByIndexTerms(fieldA, fieldB) { // eslint-disable-line complexity, max-statements\n\n const indexTermFields = ['600', '610', '611', '630', '648', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', '662'];\n\n function scoreInd2(val) {\n const ind2Score = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 8, '5': 5, '6': 6, '7': 7};\n\n if (val in ind2Score) {\n return ind2Score[val];\n }\n return 9;\n }\n\n // ATM this is not needed.\n // You may need this, if you change compare function order in sorterFunctions\n // istanbul ignore next\n if (fieldA.tag !== fieldB.tag) {\n return 0;\n }\n\n if (!indexTermFields.includes(fieldA.tag)) {\n return 0;\n }\n\n // Puts ind2=4 last\n if (scoreInd2(fieldA.ind2) > scoreInd2(fieldB.ind2)) {\n return 1;\n }\n if (scoreInd2(fieldA.ind2) < scoreInd2(fieldB.ind2)) {\n return -1;\n }\n\n function scoreDictionary(dictionary) {\n const dictionarySortIndex = {\n 'yso/fin': 0,\n 'yso/swe': 1,\n 'yso/eng': 2,\n 'slm/fin': 0.1,\n 'slm/swe': 1.1,\n 'kauno/fin': 2.1,\n 'kauno/swe': 2.2,\n 'kaunokki': 4,\n 'bella': 5\n };\n\n if (dictionary in dictionarySortIndex) {\n return dictionarySortIndex[dictionary];\n }\n return BIG_BAD_NUMBER;\n }\n\n const dictionaryA = selectFirstValue(fieldA, '2');\n const dictionaryB = selectFirstValue(fieldB, '2');\n\n const dictScoreA = scoreDictionary(dictionaryA);\n const dictScoreB = scoreDictionary(dictionaryB);\n // Use priority order for listed dictionaries:\n if (dictScoreA > dictScoreB) {\n return 1;\n }\n if (dictScoreA < dictScoreB) {\n return -1;\n }\n // Unlisted dictionaries: sort $2 value alphabetically:\n //if (dictScoreA === BIG_BAD_NUMBER) {\n if (dictionaryA > dictionaryB) {\n return 1;\n }\n if (dictionaryA < dictionaryB) {\n return -1;\n }\n //}\n return 0;\n}\n\n\nfunction preferKeep(fieldA, fieldB, keepOwner = 'FENNI') {\n const hasKeepA = fieldHasSubfield(fieldA, '9', `${keepOwner}<KEEP>`);\n const hasKeepB = fieldHasSubfield(fieldB, '9', `${keepOwner}<KEEP>`);\n\n if (hasKeepA && !hasKeepB) {\n return -1;\n }\n if (!hasKeepA && hasKeepB) {\n return 1;\n }\n\n return 0;\n}\n\n\nfunction preferFenniKeep(fieldA, fieldB) {\n const fenniPreference = preferKeep(fieldA, fieldB, 'FENNI');\n if (fenniPreference !== 0) {\n return fenniPreference;\n }\n const violaPreference = preferKeep(fieldA, fieldB, 'VIOLA');\n if (violaPreference !== 0) {\n return violaPreference;\n }\n return preferKeep(fieldA, fieldB, 'FIKKA');\n}\n\nfunction sortByRelatorTerm(fieldA, fieldB) {\n // Should this be done to 6XX and 8XX fields as well? Does $t affect sorting?\n if (!['700', '710', '711', '730'].includes(fieldA.tag)) {\n return 0;\n }\n\n function fieldGetMaxRelatorTermScore(field) {\n if (!field.subfields) {\n return 0;\n }\n const e = field.subfields.filter(sf => sf.code === 'e');\n const scores = e.map(sf => scoreRelatorTerm(sf.value));\n //debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);\n return Math.max(...scores);\n }\n\n const scoreA = fieldGetMaxRelatorTermScore(fieldA);\n const scoreB = fieldGetMaxRelatorTermScore(fieldB);\n\n if (scoreA < scoreB) {\n return 1;\n }\n if (scoreA > scoreB) {\n return -1;\n }\n return 0;\n}\n\n\nfunction fieldGetMinLinkAndSequenceNumber(field) {\n if (!field.subfields) {\n return BIG_BAD_NUMBER;\n }\n const relevantSubfields = field.subfields.filter(sf => isValidSubfield8(sf));\n // If val is something like \"1.2\\x\" parseFloat() would give a syntax erro because of hex-like escape sequnce (at least on Chrome). Thus remove tail:\n const scores = relevantSubfields.map(sf => parseFloat(sf.value.replace(/\\\\.*$/u, '')));\n if (scores.length === 0) {\n return BIG_BAD_NUMBER;\n }\n return Math.min(...scores);\n}\n\nfunction sortByFieldLinkAndSequenceNumber(fieldA, fieldB) { // Sort by subfield $8 that is...\n const scoreA = fieldGetMinLinkAndSequenceNumber(fieldA);\n const scoreB = fieldGetMinLinkAndSequenceNumber(fieldB);\n //debugDev(` sf-8-A-score for '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(` sf-8-B-score for '${fieldToString(fieldB)}: ${scoreB}`);\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return 1;\n }\n if (scoreA === 0) {\n return -1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction sortByOccurrenceNumber(fieldA, fieldB) { // Sort by subfield $6\n\n function fieldGetOccurrenceNumber(field) { // should this function be exported? (based on validator sortRelatorFields.js)\n if (!field.subfields) {\n return 0;\n }\n const subfield6 = field.subfields.find(sf => isValidSubfield6(sf));\n if (subfield6 === undefined) {\n return 0;\n }\n return parseInt(subfield6GetOccurrenceNumber(subfield6), 10);\n }\n\n if (fieldA.tag !== '880') {\n return 0;\n }\n const scoreA = fieldGetOccurrenceNumber(fieldA);\n const scoreB = fieldGetOccurrenceNumber(fieldB);\n\n //debugDev(`A: '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(`B: '${fieldToString(fieldB)}: ${scoreB}`);\n\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return -1;\n }\n if (scoreA === 0) {\n return 1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction selectFirstValue(field, subcode) {\n return field.subfields\n .filter(subfield => subcode === subfield.code)\n .map(subfield => subfield.value)\n .slice(0, 1);\n}\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sortFields.js","names":["_clone","_interopRequireDefault","require","_utils","_marcFieldSort","_subfield8Utils","_subfield6Utils","obj","__esModule","default","BIG_BAD_NUMBER","_default","description","validate","fix","record","res","message","valid","fields","sort","fieldOrderComparator","map","f","clone","relocatedFields","filter","i","fieldToString","length","push","relatorTermScore","exports","scoreRelatorTerm","value","normValue","replace","fieldA","fieldB","sorterFunctions","sortByTag","sortByIndexTerms","sortAlphabetically","sortByRelatorTerm","sortByOccurrenceNumber","preferFenniKeep","sortByFieldLinkAndSequenceNumber","globalFieldOrderComparator","indexTermFields","scoreInd2","val","ind2Score","tag","includes","ind2","scoreDictionary","dictionary","dictionarySortIndex","dictionaryA","selectFirstValue","dictionaryB","dictScoreA","dictScoreB","preferKeep","keepOwner","hasKeepA","fieldHasSubfield","hasKeepB","fenniPreference","violaPreference","fieldGetMaxRelatorTermScore","field","subfields","relatorSubfieldCode","e","sf","code","scores","Math","max","scoreA","scoreB","fieldGetMinLinkAndSequenceNumber","relevantSubfields","isValidSubfield8","parseFloat","min","fieldGetOccurrenceNumber","subfield6","find","isValidSubfield6","undefined","parseInt","subfield6GetOccurrenceNumber","subcode","subfield","slice"],"sources":["../src/sortFields.js"],"sourcesContent":["// Taken from project marc-record-js, file marcSortFields.js as this contains more and more Melinda-specific rules.\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString} from './utils';\nimport {sortByTag, sortAlphabetically, fieldOrderComparator as globalFieldOrderComparator} from '@natlibfi/marc-record/dist/marcFieldSort';\nimport {isValidSubfield8} from './subfield8Utils';\nimport {isValidSubfield6, subfield6GetOccurrenceNumber} from './subfield6Utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortFields');\n//const debugData = debug.extend('data');\n//const debugDev = debug.extend('dev');\n\nconst BIG_BAD_NUMBER = 999999999;\nexport default function () {\n\n return {\n description: 'Sort fields using both generic and Melinda specific rules',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const fields = record.fields.map(f => clone(f));\n fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n\n const relocatedFields = fields.filter((f, i) => fieldToString(f) !== fieldToString(record.fields[i]));\n\n if (relocatedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${relocatedFields.length} field(s) in new places`); // eslint-disable-line functional/immutable-data\n }\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nexport const relatorTermScore = { // Here bigger is better\n // NB! This is exportable as field internal $e sorting in marc-record-validators-js uses this.\n // NB! The more abstract, the earlier it appears.\n // Note that terms with same abstraction level might also have order preferences\n // We should 1) check the order of these, and 2) add translations (support Swedish at the very least)\n // work/teos > expression/ekspressio > manifestation/manifestaatio\n 'säveltäjä': 100, 'composer': 100,\n 'kirjoittaja': 99, 'author': 100,\n 'sarjakuvantekijä': 99,\n 'taiteilija': 98,\n 'sanoittaja': 90,\n 'käsikirjoittaja': 90,\n // expression:\n 'toimittaja': 80, 'editor': 80,\n 'sovittaja': 80, 'arranger': 80,\n 'kuvittaja': 75,\n 'editointi': 71, // for music, editor/toimittaja is another thing\n 'kääntäjä': 70,\n 'lukija': 61,\n // Manifestation level\n 'esittäjä': 60,\n 'johtaja': 50, // orkesterinjohtaja\n 'kustantaja': 41,\n 'julkaisija': 40\n\n};\n\nexport function scoreRelatorTerm(value) { // sortRelatorTerms.js validator should call this on future version\n const normValue = value.replace(/[.,]+$/u, '');\n if (normValue in relatorTermScore) {\n return relatorTermScore[normValue];\n }\n return 0;\n}\n\nexport function fieldOrderComparator(fieldA, fieldB) {\n\n //const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n //const sorterFunctions = [sortByIndexTerms, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n return globalFieldOrderComparator(fieldA, fieldB, sorterFunctions);\n}\n\nfunction sortByIndexTerms(fieldA, fieldB) { // eslint-disable-line complexity, max-statements\n\n const indexTermFields = ['600', '610', '611', '630', '648', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', '662'];\n\n function scoreInd2(val) {\n const ind2Score = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 8, '5': 5, '6': 6, '7': 7};\n\n if (val in ind2Score) {\n return ind2Score[val];\n }\n return 9;\n }\n\n // ATM this is not needed.\n // You may need this, if you change compare function order in sorterFunctions\n // istanbul ignore next\n if (fieldA.tag !== fieldB.tag) {\n return 0;\n }\n\n if (!indexTermFields.includes(fieldA.tag)) {\n return 0;\n }\n\n // Puts ind2=4 last\n if (scoreInd2(fieldA.ind2) > scoreInd2(fieldB.ind2)) {\n return 1;\n }\n if (scoreInd2(fieldA.ind2) < scoreInd2(fieldB.ind2)) {\n return -1;\n }\n\n function scoreDictionary(dictionary) {\n const dictionarySortIndex = {\n 'yso/fin': 0,\n 'yso/swe': 1,\n 'yso/eng': 2,\n 'slm/fin': 0.1,\n 'slm/swe': 1.1,\n 'kauno/fin': 2.1,\n 'kauno/swe': 2.2,\n 'kaunokki': 4,\n 'bella': 5\n };\n\n if (dictionary in dictionarySortIndex) {\n return dictionarySortIndex[dictionary];\n }\n return BIG_BAD_NUMBER;\n }\n\n const dictionaryA = selectFirstValue(fieldA, '2');\n const dictionaryB = selectFirstValue(fieldB, '2');\n\n const dictScoreA = scoreDictionary(dictionaryA);\n const dictScoreB = scoreDictionary(dictionaryB);\n // Use priority order for listed dictionaries:\n if (dictScoreA > dictScoreB) {\n return 1;\n }\n if (dictScoreA < dictScoreB) {\n return -1;\n }\n // Unlisted dictionaries: sort $2 value alphabetically:\n //if (dictScoreA === BIG_BAD_NUMBER) {\n if (dictionaryA > dictionaryB) {\n return 1;\n }\n if (dictionaryA < dictionaryB) {\n return -1;\n }\n //}\n return 0;\n}\n\n\nfunction preferKeep(fieldA, fieldB, keepOwner = 'FENNI') {\n const hasKeepA = fieldHasSubfield(fieldA, '9', `${keepOwner}<KEEP>`);\n const hasKeepB = fieldHasSubfield(fieldB, '9', `${keepOwner}<KEEP>`);\n\n if (hasKeepA && !hasKeepB) {\n return -1;\n }\n if (!hasKeepA && hasKeepB) {\n return 1;\n }\n\n return 0;\n}\n\n\nfunction preferFenniKeep(fieldA, fieldB) {\n const fenniPreference = preferKeep(fieldA, fieldB, 'FENNI');\n if (fenniPreference !== 0) {\n return fenniPreference;\n }\n const violaPreference = preferKeep(fieldA, fieldB, 'VIOLA');\n if (violaPreference !== 0) {\n return violaPreference;\n }\n return preferKeep(fieldA, fieldB, 'FIKKA');\n}\n\nfunction sortByRelatorTerm(fieldA, fieldB) {\n //if (!['600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'].includes(fieldA.tag)) {\n if (!['700', '710', '711', '730'].includes(fieldA.tag)) {\n return 0;\n }\n\n function fieldGetMaxRelatorTermScore(field) {\n if (!field.subfields) {\n return -1;\n }\n // If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...\n if (fieldHasSubfield(field, 't')) {\n return -1;\n }\n const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';\n const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);\n if (e.length === 0) { // No $e is still better than having a $t\n return 0;\n }\n const scores = e.map(sf => scoreRelatorTerm(sf.value));\n //debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);\n return Math.max(...scores);\n }\n\n const scoreA = fieldGetMaxRelatorTermScore(fieldA);\n const scoreB = fieldGetMaxRelatorTermScore(fieldB);\n\n if (scoreA < scoreB) {\n return 1;\n }\n if (scoreA > scoreB) {\n return -1;\n }\n return 0;\n}\n\n\nfunction fieldGetMinLinkAndSequenceNumber(field) {\n if (!field.subfields) {\n return BIG_BAD_NUMBER;\n }\n const relevantSubfields = field.subfields.filter(sf => isValidSubfield8(sf));\n // If val is something like \"1.2\\x\" parseFloat() would give a syntax erro because of hex-like escape sequnce (at least on Chrome). Thus remove tail:\n const scores = relevantSubfields.map(sf => parseFloat(sf.value.replace(/\\\\.*$/u, '')));\n if (scores.length === 0) {\n return BIG_BAD_NUMBER;\n }\n return Math.min(...scores);\n}\n\nfunction sortByFieldLinkAndSequenceNumber(fieldA, fieldB) { // Sort by subfield $8 that is...\n const scoreA = fieldGetMinLinkAndSequenceNumber(fieldA);\n const scoreB = fieldGetMinLinkAndSequenceNumber(fieldB);\n //debugDev(` sf-8-A-score for '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(` sf-8-B-score for '${fieldToString(fieldB)}: ${scoreB}`);\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return 1;\n }\n if (scoreA === 0) {\n return -1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction sortByOccurrenceNumber(fieldA, fieldB) { // Sort by subfield $6\n\n function fieldGetOccurrenceNumber(field) { // should this function be exported? (based on validator sortRelatorFields.js)\n if (!field.subfields) {\n return 0;\n }\n const subfield6 = field.subfields.find(sf => isValidSubfield6(sf));\n if (subfield6 === undefined) {\n return 0;\n }\n return parseInt(subfield6GetOccurrenceNumber(subfield6), 10);\n }\n\n if (fieldA.tag !== '880') {\n return 0;\n }\n const scoreA = fieldGetOccurrenceNumber(fieldA);\n const scoreB = fieldGetOccurrenceNumber(fieldB);\n\n //debugDev(`A: '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(`B: '${fieldToString(fieldB)}: ${scoreB}`);\n\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return -1;\n }\n if (scoreA === 0) {\n return 1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction selectFirstValue(field, subcode) {\n return field.subfields\n .filter(subfield => subcode === subfield.code)\n .map(subfield => subfield.value)\n .slice(0, 1);\n}\n\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"url": "git@github.com:natlibfi/marc-record-validators-melinda.git"
|
|
15
15
|
},
|
|
16
16
|
"license": "MIT",
|
|
17
|
-
"version": "10.15.
|
|
17
|
+
"version": "10.15.1-alpha.1",
|
|
18
18
|
"main": "./dist/index.js",
|
|
19
19
|
"publishConfig": {
|
|
20
20
|
"access": "public"
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"cld3-asm": "^3.1.1",
|
|
43
43
|
"clone": "^2.1.2",
|
|
44
44
|
"debug": "^4.3.4",
|
|
45
|
-
"isbn3": "^1.1.
|
|
45
|
+
"isbn3": "^1.1.43",
|
|
46
46
|
"langs": "^2.0.0",
|
|
47
47
|
"node-fetch": "^2.7.0",
|
|
48
48
|
"xml2js": "^0.6.2"
|
package/src/punctuation2.js
CHANGED
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
* (They are jumped over when looking for next (non-controlfield subfield)
|
|
11
11
|
*/
|
|
12
12
|
import {validateSingleField} from './ending-punctuation';
|
|
13
|
-
//
|
|
14
|
-
import {fieldToString, nvdebug} from './utils';
|
|
13
|
+
//import createDebugLogger from 'debug';
|
|
14
|
+
import {fieldToString, nvdebug, subfieldToString} from './utils';
|
|
15
15
|
import clone from 'clone';
|
|
16
16
|
|
|
17
|
-
//
|
|
17
|
+
//const debug = createDebugLogger('debug/punctuation2');
|
|
18
18
|
|
|
19
19
|
export default function () {
|
|
20
20
|
return {
|
|
@@ -90,7 +90,7 @@ const defaultNeedsPuncAfter2 = /(?:[\]a-zA-Z0-9)]|ä|å|ö|Å|Ä|Ö)$/u;
|
|
|
90
90
|
const blocksPuncRHS = /^(?:\()/u;
|
|
91
91
|
const allowsPuncRHS = /^(?:[A-Za-z0-9]|å|ä|ö|Å|Ä|Ö)/u;
|
|
92
92
|
|
|
93
|
-
const dotIsProbablyPunc = /(?:[a-z0-9)]
|
|
93
|
+
const dotIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö|(?:[A-Za-z0-9]|Å|Ä|Ö)(?:[A-Z]|Å|Ä|Ö))\.$/u;
|
|
94
94
|
const puncIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö) ?[.,:;]$/u;
|
|
95
95
|
// NB! 65X: Finnish terms don't use punctuation, but international ones do. Neither one is currently (2021-11-08) coded here.
|
|
96
96
|
|
|
@@ -147,6 +147,7 @@ const linkingEntryWhatever = [{'code': 'abdghiklmnopqrstuwxyz', 'followedBy': 'a
|
|
|
147
147
|
|
|
148
148
|
const crappy24X = [
|
|
149
149
|
{'code': 'abnp', 'followedBy': '!c', 'remove': / \/$/u},
|
|
150
|
+
{'code': 'abn', 'followedBy': 'c', 'remove': /\.$/u, 'context': dotIsProbablyPunc},
|
|
150
151
|
{'code': 'abc', 'followedBy': '#', 'remove': /\.$/u, 'context': dotIsProbablyPunc},
|
|
151
152
|
{'code': 'abfghinp', 'followedBy': '#', 'remove': /\.$/u, 'context': dotIsProbablyPunc},
|
|
152
153
|
{'code': 'n', 'followedBy': 'p', 'remove': /\.$/u, 'context': dotIsProbablyPunc}, // MELINDA-8817
|
|
@@ -260,11 +261,11 @@ const addX10 = [addX10bDot, addX10eComma, addX10Dot, addLanguageComma, addSemico
|
|
|
260
261
|
const add245 = [
|
|
261
262
|
// Blah! Also "$a = $b" and "$a ; $b" can be valid... But ' :' is better than nothing, I guess...
|
|
262
263
|
{'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter},
|
|
263
|
-
{'code': 'ab', 'followedBy': 'n', 'add': '.', '
|
|
264
|
+
{'code': 'ab', 'followedBy': 'n', 'add': '.', 'context': defaultNeedsPuncAfter},
|
|
264
265
|
{'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': defaultNeedsPuncAfter},
|
|
265
266
|
{'code': 'n', 'followedBy': 'p', 'add': ',', 'context': defaultNeedsPuncAfter},
|
|
266
267
|
{'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': defaultNeedsPuncAfter},
|
|
267
|
-
{'code': 'abc', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter} // Stepping on punctuation
|
|
268
|
+
{'code': 'abc', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter} // Stepping on "punctuation validaror's" toes
|
|
268
269
|
];
|
|
269
270
|
|
|
270
271
|
const add246 = [
|
|
@@ -319,6 +320,23 @@ const addPairedPunctuationRules = {
|
|
|
319
320
|
'946': [{'code': 'i', 'followedBy': 'a', 'add': ':', 'context': defaultNeedsPuncAfter}]
|
|
320
321
|
};
|
|
321
322
|
|
|
323
|
+
/*
|
|
324
|
+
function debugRule(rule) {
|
|
325
|
+
//nvdebug('');
|
|
326
|
+
nvdebug(`NAME ${rule.name ? rule.name : '<unnamed>'}`);
|
|
327
|
+
nvdebug(`SUBFIELD CODE '${rule.code}' FOLLOWED BY SUBFIELD CODE '${rule.followedBy}'`);
|
|
328
|
+
if ('add' in rule) { // eslint-disable-line functional/no-conditional-statements
|
|
329
|
+
nvdebug(`ADD '${rule.add}'`);
|
|
330
|
+
}
|
|
331
|
+
if ('remove' in rule) { // eslint-disable-line functional/no-conditional-statements
|
|
332
|
+
nvdebug(`REMOVE '${rule.remove}'`);
|
|
333
|
+
}
|
|
334
|
+
if ('context' in rule) { // eslint-disable-line functional/no-conditional-statements
|
|
335
|
+
nvdebug(`CONTEXT '${rule.context.toString()}'`);
|
|
336
|
+
}
|
|
337
|
+
//nvdebug('');
|
|
338
|
+
}
|
|
339
|
+
*/
|
|
322
340
|
|
|
323
341
|
function ruleAppliesToSubfieldCode(targetSubfieldCodes, currSubfieldCode) {
|
|
324
342
|
const negation = targetSubfieldCodes.includes('!');
|
|
@@ -345,12 +363,19 @@ function ruleAppliesToField(rule, field) {
|
|
|
345
363
|
|
|
346
364
|
|
|
347
365
|
function ruleAppliesToCurrentSubfield(rule, subfield) {
|
|
366
|
+
//nvdebug(` Apply rule on LHS?`);
|
|
348
367
|
if (!ruleAppliesToSubfieldCode(rule.code, subfield.code)) {
|
|
368
|
+
//nvdebug(` Reject rule!`);
|
|
349
369
|
return false;
|
|
350
370
|
}
|
|
351
|
-
if ('context' in rule
|
|
352
|
-
|
|
371
|
+
if ('context' in rule) {
|
|
372
|
+
//nvdebug(` Check '${subfield.value}' versus '${rule.context.toString()}'`);
|
|
373
|
+
if (!subfield.value.match(rule.context)) { // njsscan-ignore: regex_injection_dos
|
|
374
|
+
//nvdebug(` Reject rule!`);
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
353
377
|
}
|
|
378
|
+
//nvdebug(` Apply rule!`);
|
|
354
379
|
return true;
|
|
355
380
|
}
|
|
356
381
|
|
|
@@ -378,7 +403,7 @@ function ruleAppliesToNextSubfield(rule, nextSubfield) {
|
|
|
378
403
|
|
|
379
404
|
function checkRule(rule, field, subfield1, subfield2) {
|
|
380
405
|
if (!ruleAppliesToField(rule, field)) {
|
|
381
|
-
nvdebug(`FAIL ON WHOLE FIELD: '${fieldToString(field)}`);
|
|
406
|
+
//nvdebug(`FAIL ON WHOLE FIELD: '${fieldToString(field)}`);
|
|
382
407
|
return false;
|
|
383
408
|
}
|
|
384
409
|
//const name = rule.name || 'UNNAMED';
|
|
@@ -394,18 +419,12 @@ function checkRule(rule, field, subfield1, subfield2) {
|
|
|
394
419
|
return false;
|
|
395
420
|
}
|
|
396
421
|
|
|
397
|
-
//nvdebug(`${name}: ACCEPT ${rule.code}
|
|
422
|
+
//nvdebug(`${rule.name ? rule.name : '<unnamed>'}: ACCEPT ${rule.code} (${subfield1.code}), SF2=${rule.followedBy} (${subfield2 ? subfield2.code : '#'})`, debug);
|
|
398
423
|
return true;
|
|
399
424
|
}
|
|
400
425
|
|
|
401
426
|
function applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, operation = NONE) {
|
|
402
427
|
|
|
403
|
-
/*
|
|
404
|
-
if (ruleArray === null || operation === NONE) {
|
|
405
|
-
debug(`applyPunctuation(): No rules to apply!`);
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
*/
|
|
409
428
|
if (!(`${field.tag}` in ruleArray) || ruleArray === null || operation === NONE) {
|
|
410
429
|
|
|
411
430
|
/*
|
|
@@ -416,12 +435,18 @@ function applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, op
|
|
|
416
435
|
*/
|
|
417
436
|
return;
|
|
418
437
|
}
|
|
438
|
+
nvdebug(`PUNCTUATE ${field.tag} '${subfieldToString(subfield1)}' XXX '${subfield2 ? subfieldToString(subfield2) : '#'} }`);
|
|
419
439
|
|
|
420
440
|
//nvdebug(`OP=${operation} ${tag}: '${subfield1.code}: ${subfield1.value}' ??? '${subfield2 ? subfield2.code : '#'}'`, debug);
|
|
421
|
-
const
|
|
441
|
+
const candRules = ruleArray[field.tag];
|
|
442
|
+
candRules.forEach(rule => {
|
|
443
|
+
//debugRule(rule);
|
|
444
|
+
|
|
445
|
+
if (!checkRule(rule, field, subfield1, subfield2)) {
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
422
448
|
|
|
423
|
-
|
|
424
|
-
const originalValue = subfield1.value;
|
|
449
|
+
//const originalValue = subfield1.value;
|
|
425
450
|
if (rule.remove && [REMOVE, REMOVE_AND_ADD].includes(operation) && subfield1.value.match(rule.remove)) { // eslint-disable-line functional/no-conditional-statements
|
|
426
451
|
//nvdebug(` PUNC REMOVAL TO BE PERFORMED FOR $${subfield1.code} '${subfield1.value}'`, debug);
|
|
427
452
|
subfield1.value = subfield1.value.replace(rule.remove, ''); // eslint-disable-line functional/immutable-data
|
|
@@ -429,11 +454,14 @@ function applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, op
|
|
|
429
454
|
}
|
|
430
455
|
if (rule.add && [ADD, REMOVE_AND_ADD].includes(operation)) { // eslint-disable-line functional/no-conditional-statements
|
|
431
456
|
subfield1.value += rule.add; // eslint-disable-line functional/immutable-data
|
|
432
|
-
//nvdebug(` ADDED '${rule.add}' TO '${subfield1.value}'`, debug);
|
|
457
|
+
//nvdebug(` ADDED '${rule.add}' TO FORM '${subfield1.value}'`, debug);
|
|
433
458
|
}
|
|
459
|
+
|
|
460
|
+
/*
|
|
434
461
|
if (subfield1.value !== originalValue) { // eslint-disable-line functional/no-conditional-statements
|
|
435
|
-
|
|
462
|
+
nvdebug(` PROCESS PUNC: '‡${subfield1.code} ${originalValue}' => '‡${subfield1.code} ${subfield1.value}'`, debug); // eslint-disable-line functional/immutable-data
|
|
436
463
|
}
|
|
464
|
+
*/
|
|
437
465
|
});
|
|
438
466
|
}
|
|
439
467
|
|
|
@@ -469,11 +497,12 @@ export function fieldFixPunctuation(field) {
|
|
|
469
497
|
if (!field.subfields) {
|
|
470
498
|
return field;
|
|
471
499
|
}
|
|
472
|
-
nvdebug(`################### fieldFixPunctuation() TEST ${fieldToString(field)}`);
|
|
500
|
+
//nvdebug(`################### fieldFixPunctuation() TEST ${fieldToString(field)}`);
|
|
473
501
|
|
|
474
502
|
field.subfields.forEach((sf, i) => {
|
|
475
503
|
// NB! instead of next subfield, we should actually get next *non-control-subfield*!!!
|
|
476
504
|
// (In plain English: We should skip $0 - $9 at least, maybe $w as well...)
|
|
505
|
+
// We'll need some magic for field 257 here, do we? (Also Finnish lexicons vs global lexicons in 65X fields)
|
|
477
506
|
subfieldFixPunctuation(field, sf, getNextRelevantSubfield(field, i));
|
|
478
507
|
});
|
|
479
508
|
|
package/src/sortFields.js
CHANGED
|
@@ -195,16 +195,24 @@ function preferFenniKeep(fieldA, fieldB) {
|
|
|
195
195
|
}
|
|
196
196
|
|
|
197
197
|
function sortByRelatorTerm(fieldA, fieldB) {
|
|
198
|
-
//
|
|
198
|
+
//if (!['600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'].includes(fieldA.tag)) {
|
|
199
199
|
if (!['700', '710', '711', '730'].includes(fieldA.tag)) {
|
|
200
200
|
return 0;
|
|
201
201
|
}
|
|
202
202
|
|
|
203
203
|
function fieldGetMaxRelatorTermScore(field) {
|
|
204
204
|
if (!field.subfields) {
|
|
205
|
+
return -1;
|
|
206
|
+
}
|
|
207
|
+
// If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...
|
|
208
|
+
if (fieldHasSubfield(field, 't')) {
|
|
209
|
+
return -1;
|
|
210
|
+
}
|
|
211
|
+
const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';
|
|
212
|
+
const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);
|
|
213
|
+
if (e.length === 0) { // No $e is still better than having a $t
|
|
205
214
|
return 0;
|
|
206
215
|
}
|
|
207
|
-
const e = field.subfields.filter(sf => sf.code === 'e');
|
|
208
216
|
const scores = e.map(sf => scoreRelatorTerm(sf.value));
|
|
209
217
|
//debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);
|
|
210
218
|
return Math.max(...scores);
|
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
{ "tag": "001", "value": "000000001" },
|
|
6
6
|
{ "tag": "041", "ind1": " ", "ind2": " ", "subfields": [ { "code": "a", "value": "fin" } ] },
|
|
7
7
|
|
|
8
|
+
{ "tag": "245", "ind1": "1", "ind2": "1", "subfields": [
|
|
9
|
+
{ "code": "a", "value": "Suomen laki." },
|
|
10
|
+
{ "code": "n", "value": "II /" },
|
|
11
|
+
{ "code": "c", "value": "Etunimi Sukunimi, toimittaja." }
|
|
12
|
+
] },
|
|
13
|
+
|
|
8
14
|
{ "tag": "490", "ind1": " ", "ind2": " ", "subfields": [
|
|
9
15
|
{ "code": "a", "value": "Suomeksi =" },
|
|
10
16
|
{ "code": "a", "value": "Ruotsiksi," },
|
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
{ "tag": "001", "value": "000000001" },
|
|
5
5
|
{ "tag": "041", "ind1": " ", "ind2": " ", "subfields": [ { "code": "a", "value": "fin" } ] },
|
|
6
6
|
|
|
7
|
+
{ "tag": "245", "ind1": "1", "ind2": "1", "subfields": [
|
|
8
|
+
{ "code": "a", "value": "Suomen laki." },
|
|
9
|
+
{ "code": "n", "value": "II." },
|
|
10
|
+
{ "code": "c", "value": "Etunimi Sukunimi, toimittaja." }
|
|
11
|
+
] },
|
|
12
|
+
|
|
7
13
|
{ "tag": "490", "ind1": " ", "ind2": " ", "subfields": [
|
|
8
14
|
{ "code": "a", "value": "Suomeksi" },
|
|
9
15
|
{ "code": "a", "value": "Ruotsiksi" },
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"leader": "12345cam a22002417i 4500",
|
|
3
|
+
"fields":
|
|
4
|
+
[
|
|
5
|
+
{"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
|
|
6
|
+
{"code": "a", "value": "Sukunimi, Etunimi1." }
|
|
7
|
+
]},
|
|
8
|
+
{"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
|
|
9
|
+
{"code": "a", "value": "Sukunimi, Etunimi2," },
|
|
10
|
+
{"code": "e", "value": "sovittaja." }
|
|
11
|
+
]},
|
|
12
|
+
{"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
|
|
13
|
+
{"code": "a", "value": "Sukunimi, Etunimi3," },
|
|
14
|
+
{"code": "e", "value": "säveltäjä." },
|
|
15
|
+
{"code": "t", "value": "Ooppera."}
|
|
16
|
+
]},
|
|
17
|
+
{"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
|
|
18
|
+
{"code": "a", "value": "Sukunimi, Etunimi4," },
|
|
19
|
+
{"code": "e", "value": "esittäjä." }
|
|
20
|
+
]},
|
|
21
|
+
{"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
|
|
22
|
+
{"code": "a", "value": "Sukunimi, Etunimi5," },
|
|
23
|
+
{"code": "e", "value": "sanoittaja." }
|
|
24
|
+
]},
|
|
25
|
+
{"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
|
|
26
|
+
{"code": "a", "value": "Sukunimi, Etunimi6," },
|
|
27
|
+
{"code": "e", "value": "säveltäjä." }
|
|
28
|
+
]}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
]
|
|
32
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"leader": "12345cam a22002417i 4500",
|
|
3
|
+
"fields":
|
|
4
|
+
[
|
|
5
|
+
{"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
|
|
6
|
+
{"code": "a", "value": "Sukunimi, Etunimi6," },
|
|
7
|
+
{"code": "e", "value": "säveltäjä." }
|
|
8
|
+
]},
|
|
9
|
+
{"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
|
|
10
|
+
{"code": "a", "value": "Sukunimi, Etunimi5," },
|
|
11
|
+
{"code": "e", "value": "sanoittaja." }
|
|
12
|
+
]},
|
|
13
|
+
{"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
|
|
14
|
+
{"code": "a", "value": "Sukunimi, Etunimi2," },
|
|
15
|
+
{"code": "e", "value": "sovittaja." }
|
|
16
|
+
]},
|
|
17
|
+
{"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
|
|
18
|
+
{"code": "a", "value": "Sukunimi, Etunimi4," },
|
|
19
|
+
{"code": "e", "value": "esittäjä." }
|
|
20
|
+
]},
|
|
21
|
+
{"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
|
|
22
|
+
{"code": "a", "value": "Sukunimi, Etunimi1." }
|
|
23
|
+
]},
|
|
24
|
+
{"tag": "700", "ind1": "1", "ind2": " ", "subfields": [
|
|
25
|
+
{"code": "a", "value": "Sukunimi, Etunimi3," },
|
|
26
|
+
{"code": "e", "value": "säveltäjä." },
|
|
27
|
+
{"code": "t", "value": "Ooppera."}
|
|
28
|
+
]}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
],
|
|
34
|
+
"_validationOptions": {}
|
|
35
|
+
}
|
|
@@ -5,6 +5,17 @@
|
|
|
5
5
|
{ "tag": "001", "value": "000000001" },
|
|
6
6
|
{ "tag": "041", "ind1": " ", "ind2": " ", "subfields": [ { "code": "a", "value": "fin" } ] },
|
|
7
7
|
|
|
8
|
+
{ "tag": "245", "ind1": "1", "ind2": "1", "subfields": [
|
|
9
|
+
{ "code": "a", "value": "Suomen laki" },
|
|
10
|
+
{ "code": "n", "value": "II" }
|
|
11
|
+
] },
|
|
12
|
+
|
|
13
|
+
{ "tag": "245", "ind1": "1", "ind2": "1", "subfields": [
|
|
14
|
+
{ "code": "a", "value": "Suomen laki" },
|
|
15
|
+
{ "code": "n", "value": "II" },
|
|
16
|
+
{ "code": "c", "value": "Tekijä" }
|
|
17
|
+
] },
|
|
18
|
+
|
|
8
19
|
{ "tag": "490", "ind1": " ", "ind2": " ", "subfields": [
|
|
9
20
|
{ "code": "a", "value": "Suomeksi" },
|
|
10
21
|
{ "code": "a", "value": "Ruotsiksi" },
|
|
@@ -4,6 +4,17 @@
|
|
|
4
4
|
{ "tag": "001", "value": "000000001" },
|
|
5
5
|
{ "tag": "041", "ind1": " ", "ind2": " ", "subfields": [ { "code": "a", "value": "fin" } ] },
|
|
6
6
|
|
|
7
|
+
{ "tag": "245", "ind1": "1", "ind2": "1", "subfields": [
|
|
8
|
+
{ "code": "a", "value": "Suomen laki." },
|
|
9
|
+
{ "code": "n", "value": "II." }
|
|
10
|
+
] },
|
|
11
|
+
|
|
12
|
+
{ "tag": "245", "ind1": "1", "ind2": "1", "subfields": [
|
|
13
|
+
{ "code": "a", "value": "Suomen laki." },
|
|
14
|
+
{ "code": "n", "value": "II." },
|
|
15
|
+
{ "code": "c", "value": "Tekijä" }
|
|
16
|
+
] },
|
|
17
|
+
|
|
7
18
|
{ "tag": "490", "ind1": " ", "ind2": " ", "subfields": [
|
|
8
19
|
{ "code": "a", "value": "Suomeksi =" },
|
|
9
20
|
{ "code": "a", "value": "Ruotsiksi," },
|