@natlibfi/marc-record-validators-melinda 11.6.5 → 11.6.7-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/.github/workflows/melinda-node-tests.yml +1 -1
- package/dist/access-rights.js +1 -5
- package/dist/access-rights.js.map +1 -1
- package/dist/addMissingField336.js +1 -1
- package/dist/addMissingField336.js.map +1 -1
- package/dist/cyrillux-usemarcon-replacement.js +41 -45
- package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
- package/dist/cyrillux.js +13 -17
- package/dist/cyrillux.js.map +1 -1
- package/dist/disambiguateSeriesStatements.js +3 -4
- package/dist/disambiguateSeriesStatements.js.map +1 -1
- package/dist/double-commas.js +2 -1
- package/dist/double-commas.js.map +1 -1
- package/dist/duplicates-ind1.js +1 -1
- package/dist/duplicates-ind1.js.map +1 -1
- package/dist/empty-fields.js +0 -4
- package/dist/empty-fields.js.map +1 -1
- package/dist/ending-punctuation.js +21 -49
- package/dist/ending-punctuation.js.map +1 -1
- package/dist/ending-whitespace.js +0 -4
- package/dist/ending-whitespace.js.map +1 -1
- package/dist/field-008-18-34-character-groups.js +4 -5
- package/dist/field-008-18-34-character-groups.js.map +1 -1
- package/dist/field-505-separators.js +8 -6
- package/dist/field-505-separators.js.map +1 -1
- package/dist/field-521-fix.js +5 -6
- package/dist/field-521-fix.js.map +1 -1
- package/dist/field-exclusion.js +5 -12
- package/dist/field-exclusion.js.map +1 -1
- package/dist/field-exclusion.spec.js +3 -5
- package/dist/field-exclusion.spec.js.map +1 -1
- package/dist/field-structure.js +2 -5
- package/dist/field-structure.js.map +1 -1
- package/dist/fields-present.js +1 -1
- package/dist/fields-present.js.map +1 -1
- package/dist/fields-present.spec.js +1 -1
- package/dist/fields-present.spec.js.map +1 -1
- package/dist/fix-33X.js +5 -6
- package/dist/fix-33X.js.map +1 -1
- package/dist/fix-country-codes.js +3 -4
- package/dist/fix-country-codes.js.map +1 -1
- package/dist/fix-language-codes.js +12 -9
- package/dist/fix-language-codes.js.map +1 -1
- package/dist/fixRelatorTerms.js +8 -8
- package/dist/fixRelatorTerms.js.map +1 -1
- package/dist/fixed-fields.js +1 -4
- package/dist/fixed-fields.js.map +1 -1
- package/dist/identical-fields.js +2 -3
- package/dist/identical-fields.js.map +1 -1
- package/dist/indicator-fixes.js +14 -15
- package/dist/indicator-fixes.js.map +1 -1
- package/dist/isbn-issn.js +8 -11
- package/dist/isbn-issn.js.map +1 -1
- package/dist/item-language.js +5 -12
- package/dist/item-language.js.map +1 -1
- package/dist/merge-fields/counterpartField.js +6 -8
- package/dist/merge-fields/counterpartField.js.map +1 -1
- package/dist/merge-fields/index.js +3 -3
- package/dist/merge-fields/index.js.map +1 -1
- package/dist/merge-fields/mergeConstraints.js +0 -1
- package/dist/merge-fields/mergeConstraints.js.map +1 -1
- package/dist/merge-fields/mergeField.js +12 -18
- package/dist/merge-fields/mergeField.js.map +1 -1
- package/dist/merge-fields/mergeIndicator.js +5 -5
- package/dist/merge-fields/mergeIndicator.js.map +1 -1
- package/dist/merge-fields/mergeOrAddPostprocess.js +6 -9
- package/dist/merge-fields/mergeOrAddPostprocess.js.map +1 -1
- package/dist/merge-fields/mergeOrAddSubfield.js +6 -8
- package/dist/merge-fields/mergeOrAddSubfield.js.map +1 -1
- package/dist/merge-fields/mergeSubfield.js +8 -8
- package/dist/merge-fields/mergeSubfield.js.map +1 -1
- package/dist/merge-fields/removeDuplicateSubfields.js +1 -2
- package/dist/merge-fields/removeDuplicateSubfields.js.map +1 -1
- package/dist/merge-fields/worldKnowledge.js +1 -1
- package/dist/merge-fields/worldKnowledge.js.map +1 -1
- package/dist/mergeField500Lisapainokset.js +0 -3
- package/dist/mergeField500Lisapainokset.js.map +1 -1
- package/dist/mergeRelatorTermFields.js +3 -3
- package/dist/mergeRelatorTermFields.js.map +1 -1
- package/dist/modernize-502.js +6 -6
- package/dist/modernize-502.js.map +1 -1
- package/dist/multiple-subfield-0.js +4 -4
- package/dist/multiple-subfield-0.js.map +1 -1
- package/dist/non-breaking-space.js +0 -4
- package/dist/non-breaking-space.js.map +1 -1
- package/dist/normalize-dashes.js +5 -4
- package/dist/normalize-dashes.js.map +1 -1
- package/dist/normalize-identifiers.js +6 -6
- package/dist/normalize-identifiers.js.map +1 -1
- package/dist/normalize-qualifying-information.js +4 -4
- package/dist/normalize-qualifying-information.js.map +1 -1
- package/dist/normalize-utf8-diacritics.js +7 -7
- package/dist/normalize-utf8-diacritics.js.map +1 -1
- package/dist/normalizeFieldForComparison.js +21 -20
- package/dist/normalizeFieldForComparison.js.map +1 -1
- package/dist/normalizeSubfieldValueForComparison.js +1 -2
- package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
- package/dist/prepublicationUtils.js +3 -3
- package/dist/prepublicationUtils.js.map +1 -1
- package/dist/punctuation/index.js +14 -31
- package/dist/punctuation/index.js.map +1 -1
- package/dist/punctuation2.js +9 -10
- package/dist/punctuation2.js.map +1 -1
- package/dist/reindexSubfield6OccurenceNumbers.js +8 -9
- package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
- package/dist/removeDuplicateDataFields.js +18 -20
- package/dist/removeDuplicateDataFields.js.map +1 -1
- package/dist/removeInferiorDataFields.js +16 -19
- package/dist/removeInferiorDataFields.js.map +1 -1
- package/dist/resolvable-ext-references-melinda.js +4 -8
- package/dist/resolvable-ext-references-melinda.js.map +1 -1
- package/dist/resolveOrphanedSubfield6s.js +9 -9
- package/dist/resolveOrphanedSubfield6s.js.map +1 -1
- package/dist/sanitize-vocabulary-source-codes.js +9 -9
- package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
- package/dist/sort-tags.js +2 -2
- package/dist/sort-tags.js.map +1 -1
- package/dist/sortFields.js +4 -9
- package/dist/sortFields.js.map +1 -1
- package/dist/sortRelatorTerms.js +4 -5
- package/dist/sortRelatorTerms.js.map +1 -1
- package/dist/sortSubfields.js +6 -7
- package/dist/sortSubfields.js.map +1 -1
- package/dist/stripPunctuation.js +2 -2
- package/dist/stripPunctuation.js.map +1 -1
- package/dist/subfield-exclusion.js +4 -11
- package/dist/subfield-exclusion.js.map +1 -1
- package/dist/subfield6Utils.js +12 -11
- package/dist/subfield6Utils.js.map +1 -1
- package/dist/subfield8Utils.js +8 -9
- package/dist/subfield8Utils.js.map +1 -1
- package/dist/subfieldValueNormalizations.js +5 -8
- package/dist/subfieldValueNormalizations.js.map +1 -1
- package/dist/sync-007-and-300.js +8 -8
- package/dist/sync-007-and-300.js.map +1 -1
- package/dist/translate-terms.js +5 -6
- package/dist/translate-terms.js.map +1 -1
- package/dist/typeOfDate-008.js +3 -4
- package/dist/typeOfDate-008.js.map +1 -1
- package/dist/unicode-decomposition.js +1 -1
- package/dist/unicode-decomposition.js.map +1 -1
- package/dist/update-field-540.js +5 -6
- package/dist/update-field-540.js.map +1 -1
- package/dist/urn.js +4 -9
- package/dist/urn.js.map +1 -1
- package/dist/utils.js +5 -9
- package/dist/utils.js.map +1 -1
- package/eslint.config.mjs +53 -0
- package/package.json +12 -13
- package/src/access-rights.js +4 -4
- package/src/addMissingField336.js +1 -1
- package/src/cyrillux-usemarcon-replacement.js +38 -38
- package/src/cyrillux.js +14 -14
- package/src/disambiguateSeriesStatements.js +3 -3
- package/src/double-commas.js +2 -2
- package/src/duplicates-ind1.js +1 -1
- package/src/empty-fields.js +4 -4
- package/src/ending-punctuation.js +46 -49
- package/src/ending-whitespace.js +0 -2
- package/src/field-008-18-34-character-groups.js +5 -5
- package/src/field-505-separators.js +6 -6
- package/src/field-521-fix.js +6 -6
- package/src/field-exclusion.js +12 -12
- package/src/field-exclusion.spec.js +4 -4
- package/src/field-structure.js +5 -5
- package/src/fields-present.js +1 -1
- package/src/fields-present.spec.js +1 -1
- package/src/fix-33X.js +5 -5
- package/src/fix-country-codes.js +3 -3
- package/src/fix-language-codes.js +10 -9
- package/src/fixRelatorTerms.js +8 -8
- package/src/fixed-fields.js +3 -3
- package/src/identical-fields.js +3 -3
- package/src/indicator-fixes.js +15 -15
- package/src/isbn-issn.js +11 -11
- package/src/item-language.js +10 -10
- package/src/merge-fields/counterpartField.js +7 -7
- package/src/merge-fields/index.js +3 -3
- package/src/merge-fields/mergeConstraints.js +1 -1
- package/src/merge-fields/mergeField.js +16 -17
- package/src/merge-fields/mergeIndicator.js +5 -5
- package/src/merge-fields/mergeOrAddPostprocess.js +9 -9
- package/src/merge-fields/mergeOrAddSubfield.js +6 -6
- package/src/merge-fields/mergeSubfield.js +8 -8
- package/src/merge-fields/removeDuplicateSubfields.js +1 -2
- package/src/merge-fields/worldKnowledge.js +1 -1
- package/src/mergeField500Lisapainokset.js +0 -2
- package/src/mergeRelatorTermFields.js +3 -3
- package/src/modernize-502.js +6 -6
- package/src/multiple-subfield-0.js +4 -4
- package/src/non-breaking-space.js +0 -2
- package/src/normalize-dashes.js +4 -4
- package/src/normalize-identifiers.js +6 -6
- package/src/normalize-qualifying-information.js +4 -4
- package/src/normalize-utf8-diacritics.js +7 -7
- package/src/normalizeFieldForComparison.js +20 -20
- package/src/normalizeSubfieldValueForComparison.js +1 -1
- package/src/prepublicationUtils.js +3 -3
- package/src/punctuation/index.js +29 -29
- package/src/punctuation2.js +10 -10
- package/src/reindexSubfield6OccurenceNumbers.js +9 -9
- package/src/removeDuplicateDataFields.js +21 -23
- package/src/removeInferiorDataFields.js +19 -19
- package/src/resolvable-ext-references-melinda.js +8 -8
- package/src/resolveOrphanedSubfield6s.js +9 -9
- package/src/sanitize-vocabulary-source-codes.js +8 -8
- package/src/sort-tags.js +2 -2
- package/src/sortFields.js +6 -6
- package/src/sortRelatorTerms.js +5 -5
- package/src/sortSubfields.js +7 -7
- package/src/stripPunctuation.js +2 -2
- package/src/subfield-exclusion.js +11 -11
- package/src/subfield6Utils.js +11 -11
- package/src/subfield8Utils.js +6 -9
- package/src/subfieldValueNormalizations.js +5 -7
- package/src/sync-007-and-300.js +8 -8
- package/src/translate-terms.js +3 -5
- package/src/typeOfDate-008.js +3 -3
- package/src/unicode-decomposition.js +1 -1
- package/src/update-field-540.js +6 -6
- package/src/urn.js +8 -6
- package/src/utils.js +8 -8
- package/.eslintignore +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeOrAddPostprocess.js","names":["_punctuation","require","_removeDuplicateSubfields","_sortSubfields","_sortRelatorTerms","postprocessBaseRecord","base","fields","forEach","field","merged","fieldRemoveDuplicateSubfields","fieldFixPunctuation","sortAdjacentSubfields","sortAdjacentRelatorTerms","useExternalEndPunctuation","added","removeDeletedFields","record","filter","f","deleted","postprocessRecords","source"],"sources":["../../src/merge-fields/mergeOrAddPostprocess.js"],"sourcesContent":["// This field should be renamed, as it is called also from outside megre.\n\n//import {MarcRecord} from '@natlibfi/marc-record';\nimport {fieldFixPunctuation} from '../punctuation2';\nimport {fieldRemoveDuplicateSubfields} from './removeDuplicateSubfields';\nimport {sortAdjacentSubfields} from '../sortSubfields';\nimport {sortAdjacentRelatorTerms} from '../sortRelatorTerms';\n\nfunction postprocessBaseRecord(base) {\n\n base.fields.forEach(field => {\n // NB! Relator terms are now expanded and translated already at preprocess stage!\n\n // remove merge-specific information:\n if (field.merged) {
|
|
1
|
+
{"version":3,"file":"mergeOrAddPostprocess.js","names":["_punctuation","require","_removeDuplicateSubfields","_sortSubfields","_sortRelatorTerms","postprocessBaseRecord","base","fields","forEach","field","merged","fieldRemoveDuplicateSubfields","fieldFixPunctuation","sortAdjacentSubfields","sortAdjacentRelatorTerms","useExternalEndPunctuation","added","removeDeletedFields","record","filter","f","deleted","postprocessRecords","source"],"sources":["../../src/merge-fields/mergeOrAddPostprocess.js"],"sourcesContent":["// This field should be renamed, as it is called also from outside megre.\n\n//import {MarcRecord} from '@natlibfi/marc-record';\nimport {fieldFixPunctuation} from '../punctuation2';\nimport {fieldRemoveDuplicateSubfields} from './removeDuplicateSubfields';\nimport {sortAdjacentSubfields} from '../sortSubfields';\nimport {sortAdjacentRelatorTerms} from '../sortRelatorTerms';\n\nfunction postprocessBaseRecord(base) {\n\n base.fields.forEach(field => {\n // NB! Relator terms are now expanded and translated already at preprocess stage!\n\n // remove merge-specific information:\n if (field.merged) {\n // Field level ideas about things that could be done here:\n // - Fix indicators?\n // Record level fixes should be implemented as validators/fixers\n // in marc-record-validators-melinda and ust called from here.\n fieldRemoveDuplicateSubfields(field);\n fieldFixPunctuation(field); // NB! This will fix only fields with merged content\n sortAdjacentSubfields(field); // Put the added $e subfield to proper places.\n sortAdjacentRelatorTerms(field); // Sort $e subfields with each other\n fieldFixPunctuation(field);\n\n delete field.merged;\n }\n\n if (field.useExternalEndPunctuation) {\n delete field.useExternalEndPunctuation;\n }\n\n if (field.added) {\n delete field.added;\n }\n\n /*\n if (field.deleted) {\n delete field.deleted;\n }\n*/\n\n });\n}\n\n\nfunction removeDeletedFields(record) {\n // remove fields that are marked as deleted:\n record.fields = record.fields.filter(f => !f.deleted);\n}\n\n\nexport function postprocessRecords(base, source) {\n postprocessBaseRecord(base);\n removeDeletedFields(source); // So that we may know what was used, and what not.\n}\n"],"mappings":";;;;;;AAGA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,yBAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AANA;;AAEA;;AAMA,SAASI,qBAAqBA,CAACC,IAAI,EAAE;EAEnCA,IAAI,CAACC,MAAM,CAACC,OAAO,CAACC,KAAK,IAAI;IAC3B;;IAEA;IACA,IAAIA,KAAK,CAACC,MAAM,EAAE;MAChB;MACA;MACA;MACA;MACA,IAAAC,uDAA6B,EAACF,KAAK,CAAC;MACpC,IAAAG,gCAAmB,EAACH,KAAK,CAAC,CAAC,CAAC;MAC5B,IAAAI,oCAAqB,EAACJ,KAAK,CAAC,CAAC,CAAC;MAC9B,IAAAK,0CAAwB,EAACL,KAAK,CAAC,CAAC,CAAC;MACjC,IAAAG,gCAAmB,EAACH,KAAK,CAAC;MAE1B,OAAOA,KAAK,CAACC,MAAM;IACrB;IAEA,IAAID,KAAK,CAACM,yBAAyB,EAAE;MACnC,OAAON,KAAK,CAACM,yBAAyB;IACxC;IAEA,IAAIN,KAAK,CAACO,KAAK,EAAE;MACf,OAAOP,KAAK,CAACO,KAAK;IACpB;;IAEA;AACJ;AACA;AACA;AACA;EAEE,CAAC,CAAC;AACJ;AAGA,SAASC,mBAAmBA,CAACC,MAAM,EAAE;EACnC;EACAA,MAAM,CAACX,MAAM,GAAGW,MAAM,CAACX,MAAM,CAACY,MAAM,CAACC,CAAC,IAAI,CAACA,CAAC,CAACC,OAAO,CAAC;AACvD;AAGO,SAASC,kBAAkBA,CAAChB,IAAI,EAAEiB,MAAM,EAAE;EAC/ClB,qBAAqB,CAACC,IAAI,CAAC;EAC3BW,mBAAmB,CAACM,MAAM,CAAC,CAAC,CAAC;AAC/B","ignoreList":[]}
|
|
@@ -111,10 +111,8 @@ function mergeOrAddSubfieldNotRequired(targetField, candSubfieldData) {
|
|
|
111
111
|
function addSubfield(targetField, candSubfield) {
|
|
112
112
|
(0, _utils.nvdebug)(` Added subfield '${(0, _utils.subfieldToString)(candSubfield)}' to field`, debugDev);
|
|
113
113
|
// Add subfield to the end of all subfields. NB! Implement a separate function that does this + subfield reordering somehow...
|
|
114
|
-
targetField.subfields.push(candSubfield);
|
|
115
|
-
|
|
116
|
-
targetField.merged = 1; // eslint-disable-line functional/immutable-data
|
|
117
|
-
|
|
114
|
+
targetField.subfields.push(candSubfield);
|
|
115
|
+
targetField.merged = 1;
|
|
118
116
|
setPunctuationFlag(targetField, candSubfield);
|
|
119
117
|
(0, _sortSubfields.sortAdjacentSubfields)(targetField);
|
|
120
118
|
}
|
|
@@ -123,7 +121,7 @@ function setPunctuationFlag(field, addedSubfield) {
|
|
|
123
121
|
// These are never punctuation related
|
|
124
122
|
return;
|
|
125
123
|
}
|
|
126
|
-
field.useExternalEndPunctuation = 1;
|
|
124
|
+
field.useExternalEndPunctuation = 1;
|
|
127
125
|
}
|
|
128
126
|
function resetPaired880(candFieldPair880, targetField, punctlessCandSubfield) {
|
|
129
127
|
// No relevant:
|
|
@@ -174,7 +172,7 @@ function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = [
|
|
|
174
172
|
return;
|
|
175
173
|
}
|
|
176
174
|
(0, _utils.nvdebug)(` A: Yes. Add repeatable subfield '${(0, _utils.subfieldToString)(candSubfield)}'`, debugDev);
|
|
177
|
-
targetField.merged = 1;
|
|
175
|
+
targetField.merged = 1;
|
|
178
176
|
setPunctuationFlag(targetField, candSubfield);
|
|
179
177
|
addSubfield(targetField, candSubfield);
|
|
180
178
|
return;
|
|
@@ -184,7 +182,7 @@ function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = [
|
|
|
184
182
|
function mergeSubfieldPostprocessor() {
|
|
185
183
|
if (original !== (0, _utils.fieldToString)(targetField)) {
|
|
186
184
|
(0, _utils.nvdebug)(` A: Merge. Subfield '${candSubfieldAsString}' replaces the original subfield.`, debugDev);
|
|
187
|
-
targetField.merged = 1;
|
|
185
|
+
targetField.merged = 1;
|
|
188
186
|
setPunctuationFlag(targetField, candSubfield);
|
|
189
187
|
return;
|
|
190
188
|
}
|
|
@@ -194,7 +192,7 @@ function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = [
|
|
|
194
192
|
function addSubfieldWithPreviouslyUnseenSubfieldCode() {
|
|
195
193
|
if (!(0, _utils.fieldHasSubfield)(targetField, candSubfield.code)) {
|
|
196
194
|
(0, _utils.nvdebug)(` A: Yes. Add previously unseen subfield '${(0, _utils.subfieldToString)(candSubfield)}'`, debugDev);
|
|
197
|
-
targetField.merged = 1;
|
|
195
|
+
targetField.merged = 1;
|
|
198
196
|
setPunctuationFlag(targetField, candSubfield);
|
|
199
197
|
candFieldPairs880.forEach(pair => resetPaired880(pair, targetField, candSubfield));
|
|
200
198
|
addSubfield(targetField, candSubfield);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeOrAddSubfield.js","names":["_debug","_interopRequireDefault","require","_normalizeFieldForComparison","_normalizeIdentifiers","_utils","_mergeSubfield","_sortSubfields","_worldKnowledge","_subfield6Utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField","targetField","candSubfieldData","tag","code","nvdebug","fieldToString","originalValue","subfields","some","sf","value","ennakkotietoInSubfieldG","isEnnakkotietoSubfieldG","mergeOrAddSubfieldNotRequiredSpecialCases","charAt","match","valueCarriesMeaning","normalizedValue","alephIdentifierType","normalizeAs","undefined","normalizedSubfieldValue","normalizeControlSubfieldValue","skipNormalizedComparison","subfieldCode","subfieldValue","includes","substring","mergeOrAddSubfieldNotRequired","relevantTargetSubfields","filter","length","punctuationlessValue","normalizedTargetField","cloneAndNormalizeFieldForComparison","addSubfield","candSubfield","subfieldToString","push","merged","setPunctuationFlag","sortAdjacentSubfields","field","addedSubfield","isControlSubfieldCode","useExternalEndPunctuation","resetPaired880","candFieldPair880","punctlessCandSubfield","resetSubfield6Tag","mergeOrAddSubfield","candFieldPairs880","candSubfieldAsString","original","mergeSubfield","mergeSubfieldPostprocessor","addSubfieldWithPreviouslyUnseenSubfieldCode","subfieldIsRepeatable","fieldHasSubfield","forEach","pair"],"sources":["../../src/merge-fields/mergeOrAddSubfield.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {cloneAndNormalizeFieldForComparison, isEnnakkotietoSubfieldG} from '../normalizeFieldForComparison.js';\nimport {normalizeAs, normalizeControlSubfieldValue} from '../normalize-identifiers';\nimport {fieldHasSubfield, fieldToString, isControlSubfieldCode, nvdebug, subfieldIsRepeatable, subfieldToString} from '../utils.js';\nimport {mergeSubfield} from './mergeSubfield.js';\nimport {sortAdjacentSubfields} from '../sortSubfields'; //'./sortSubfields.js';\n\nimport {valueCarriesMeaning} from './worldKnowledge.js';\nimport {resetSubfield6Tag} from '../subfield6Utils.js';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeOrAddSubfield');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nfunction catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) {\n if (targetField.tag !== '040' || candSubfieldData.code !== 'd') {\n return false;\n }\n nvdebug(`${fieldToString(targetField)} vs $d ${candSubfieldData.originalValue}}`, debugDev);\n // Add hard-coded exceptions here\n if (targetField.subfields.some(sf => sf.code === 'a' && sf.value === candSubfieldData.originalValue)) {\n nvdebug('040‡d matched 040‡a', debugDev);\n return true;\n }\n return false;\n}\n\nfunction ennakkotietoInSubfieldG(candSubfieldData) {\n if (isEnnakkotietoSubfieldG({'code': candSubfieldData.code, 'value': candSubfieldData.originalValue})) {\n // Skip just ‡g subfield or the whole field?\n // We decided to skip just this subfield. We want at least $0 and maybe even more from ennakkotieto.\n debugDev(`Skip '‡g ${candSubfieldData.originalValue}'`);\n return true;\n }\n return false;\n}\n\n\nfunction mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData) {\n\n // Don't bring WHATEVER<KEEP> from source 7XX to base 1XX.\n // Exceptionally we can merge <KEEP>ed 7XX with un-<KEEP>ed 1XX as 1XX should not use <KEEP>s.\n if (targetField.tag.charAt(0) === '1' && candSubfieldData.tag.charAt(0) === '7' && candSubfieldData.code === '9' && candSubfieldData.originalValue.match(/<KEEP>/u)) {\n return true;\n }\n\n // Don't add 264$b 'Kustannuspaikka tuntematon' etc\n if (!valueCarriesMeaning(targetField.tag, candSubfieldData.code, candSubfieldData.normalizedValue)) {\n return true;\n }\n\n\n // Don't add $0 subfields that mean the same even if they look different:\n const alephIdentifierType = normalizeAs(targetField.tag, candSubfieldData.code);\n if (alephIdentifierType !== undefined) {\n const normalizedSubfieldValue = normalizeControlSubfieldValue(candSubfieldData.originalValue, alephIdentifierType);\n if (targetField.subfields.some(sf => normalizeControlSubfieldValue(sf.value) === normalizedSubfieldValue && sf.code === candSubfieldData.code)) {\n return true;\n }\n }\n return false;\n}\n\n\nfunction skipNormalizedComparison(tag, subfieldCode, subfieldValue) {\n if (tag === '020' && subfieldCode === 'a') {\n return true;\n }\n // Hackish: we want 'ntamo' to win 'Ntamo'...\n // If there are other similar excepting put them into an array.\n if (['110', '610', '710', '810'].includes(tag) && subfieldCode === 'a' && subfieldValue.substring(0, 5) === 'ntamo') {\n return true;\n }\n return false;\n}\n\nfunction mergeOrAddSubfieldNotRequired(targetField, candSubfieldData) {\n if (catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) || ennakkotietoInSubfieldG(candSubfieldData)) {\n return true;\n }\n\n if (mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData)) {\n return true;\n }\n\n const relevantTargetSubfields = targetField.subfields.filter(sf => sf.code === candSubfieldData.code);\n // Target field does not have this subfield yet:\n if (relevantTargetSubfields.length === 0) {\n return false;\n }\n nvdebug(` Look for identical subfields in '${fieldToString(targetField)}' using`, debugDev);\n nvdebug(` ORIG. ‡${candSubfieldData.code} ${candSubfieldData.originalValue}`, debugDev);\n nvdebug(` NO-PUNC ‡${candSubfieldData.code} ${candSubfieldData.punctuationlessValue}`, debugDev);\n if (relevantTargetSubfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.originalValue)) {\n return true;\n }\n if (relevantTargetSubfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.punctuationlessValue)) {\n return true;\n }\n\n if (!skipNormalizedComparison(targetField.tag, candSubfieldData.code, candSubfieldData.originalValue)) {\n const normalizedTargetField = cloneAndNormalizeFieldForComparison(targetField);\n nvdebug(` Look for identical normalized subfields in '${fieldToString(normalizedTargetField)}'`, debugDev);\n nvdebug(` NO-PUNC ‡${candSubfieldData.code} ${candSubfieldData.normalizedValue})`, debugDev);\n\n if (normalizedTargetField.subfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.normalizedValue)) {\n // Subfield with identical normalized value exists. Do nothing.\n // Not ideal 382‡n subfields, I guess... Nor 505‡trg repetitions... These need to be fixed...\n return true;\n }\n }\n\n return false; // (note that this is a double negation: not required is false)\n}\n\nfunction addSubfield(targetField, candSubfield) {\n nvdebug(` Added subfield '${subfieldToString(candSubfield)}' to field`, debugDev);\n // Add subfield to the end of all subfields. NB! Implement a separate function that does this + subfield reordering somehow...\n targetField.subfields.push(candSubfield); // eslint-disable-line functional/immutable-data\n\n targetField.merged = 1; // eslint-disable-line functional/immutable-data\n\n setPunctuationFlag(targetField, candSubfield);\n sortAdjacentSubfields(targetField);\n\n}\n\nfunction setPunctuationFlag(field, addedSubfield) {\n if (isControlSubfieldCode(addedSubfield.code)) { // These are never punctuation related\n return;\n }\n field.useExternalEndPunctuation = 1; // eslint-disable-line functional/immutable-data\n}\n\n\nfunction resetPaired880(candFieldPair880, targetField, punctlessCandSubfield) {\n // No relevant:\n if (punctlessCandSubfield.code !== '6') {\n return;\n }\n if (targetField.tag === '880') {\n return;\n }\n // NB! $6 comes first:\n if (candFieldPair880 === undefined || !candFieldPair880.subfields || candFieldPair880.subfields[0].code !== '6') {\n return;\n\n }\n nvdebug(`880 contents: ${fieldToString(candFieldPair880)}`, debugDev);\n resetSubfield6Tag(candFieldPair880.subfields[0], targetField.tag);\n}\n\nexport function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = []) {\n\n const candSubfieldAsString = `${candSubfieldData.code} ${candSubfieldData.originalValue}`;\n\n nvdebug(` Q: mergeOrAddSubfield '${candSubfieldAsString}'\\n with field '${fieldToString(targetField)}'?`, debugDev);\n if (mergeOrAddSubfieldNotRequired(targetField, candSubfieldData)) {\n nvdebug(` A: No. No need to merge nor to add the subfield '${candSubfieldAsString}'`, debugDev);\n return;\n }\n\n const candSubfield = {'code': candSubfieldData.code, 'value': candSubfieldData.punctuationlessValue};\n\n // Currently only for X00$d 1984- => 1984-2000 type of changes, where source version is better that what base has.\n // It all other cases the original subfield is kept.\n const original = fieldToString(targetField);\n\n if (mergeSubfield(targetField, candSubfield)) { // We might need the normalizedCandSubfield later on\n mergeSubfieldPostprocessor();\n return;\n }\n\n // Subfield codes missing from the original record can be added by default:\n if (addSubfieldWithPreviouslyUnseenSubfieldCode()) {\n return;\n }\n\n // melindaCustomMergeFields.json tells us whether the subfield is repeatable or not:\n if (subfieldIsRepeatable(targetField.tag, candSubfield.code)) {\n // We don't want to add multiple, say, 260$c\n if (['260', '264'].includes(targetField.tag)) {\n nvdebug(` A: Exceptionally skip repeatable existing subfield '${subfieldToString(candSubfield)}'`, debugDev);\n return;\n }\n nvdebug(` A: Yes. Add repeatable subfield '${subfieldToString(candSubfield)}'`, debugDev);\n targetField.merged = 1; // eslint-disable-line functional/immutable-data\n setPunctuationFlag(targetField, candSubfield);\n addSubfield(targetField, candSubfield);\n return;\n }\n\n nvdebug(` A: No. Non-repeatable subfield '${subfieldToString(candSubfield)}'`, debugDev);\n return;\n\n function mergeSubfieldPostprocessor() {\n if (original !== fieldToString(targetField)) {\n nvdebug(` A: Merge. Subfield '${candSubfieldAsString}' replaces the original subfield.`, debugDev);\n targetField.merged = 1; // eslint-disable-line functional/immutable-data\n setPunctuationFlag(targetField, candSubfield);\n return;\n }\n nvdebug(` A: No. Field ${original} already had the same or a synonymous or a better merge candidate than our subfield '${candSubfieldAsString}'.`, debugDev);\n return;\n }\n\n function addSubfieldWithPreviouslyUnseenSubfieldCode() {\n if (!fieldHasSubfield(targetField, candSubfield.code)) {\n nvdebug(` A: Yes. Add previously unseen subfield '${subfieldToString(candSubfield)}'`, debugDev);\n targetField.merged = 1; // eslint-disable-line functional/immutable-data\n setPunctuationFlag(targetField, candSubfield);\n candFieldPairs880.forEach(pair => resetPaired880(pair, targetField, candSubfield));\n addSubfield(targetField, candSubfield);\n return true;\n }\n return false;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"mergeOrAddSubfield.js","names":["_debug","_interopRequireDefault","require","_normalizeFieldForComparison","_normalizeIdentifiers","_utils","_mergeSubfield","_sortSubfields","_worldKnowledge","_subfield6Utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField","targetField","candSubfieldData","tag","code","nvdebug","fieldToString","originalValue","subfields","some","sf","value","ennakkotietoInSubfieldG","isEnnakkotietoSubfieldG","mergeOrAddSubfieldNotRequiredSpecialCases","charAt","match","valueCarriesMeaning","normalizedValue","alephIdentifierType","normalizeAs","undefined","normalizedSubfieldValue","normalizeControlSubfieldValue","skipNormalizedComparison","subfieldCode","subfieldValue","includes","substring","mergeOrAddSubfieldNotRequired","relevantTargetSubfields","filter","length","punctuationlessValue","normalizedTargetField","cloneAndNormalizeFieldForComparison","addSubfield","candSubfield","subfieldToString","push","merged","setPunctuationFlag","sortAdjacentSubfields","field","addedSubfield","isControlSubfieldCode","useExternalEndPunctuation","resetPaired880","candFieldPair880","punctlessCandSubfield","resetSubfield6Tag","mergeOrAddSubfield","candFieldPairs880","candSubfieldAsString","original","mergeSubfield","mergeSubfieldPostprocessor","addSubfieldWithPreviouslyUnseenSubfieldCode","subfieldIsRepeatable","fieldHasSubfield","forEach","pair"],"sources":["../../src/merge-fields/mergeOrAddSubfield.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {cloneAndNormalizeFieldForComparison, isEnnakkotietoSubfieldG} from '../normalizeFieldForComparison.js';\nimport {normalizeAs, normalizeControlSubfieldValue} from '../normalize-identifiers';\nimport {fieldHasSubfield, fieldToString, isControlSubfieldCode, nvdebug, subfieldIsRepeatable, subfieldToString} from '../utils.js';\nimport {mergeSubfield} from './mergeSubfield.js';\nimport {sortAdjacentSubfields} from '../sortSubfields'; //'./sortSubfields.js';\n\nimport {valueCarriesMeaning} from './worldKnowledge.js';\nimport {resetSubfield6Tag} from '../subfield6Utils.js';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeOrAddSubfield');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nfunction catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) {\n if (targetField.tag !== '040' || candSubfieldData.code !== 'd') {\n return false;\n }\n nvdebug(`${fieldToString(targetField)} vs $d ${candSubfieldData.originalValue}}`, debugDev);\n // Add hard-coded exceptions here\n if (targetField.subfields.some(sf => sf.code === 'a' && sf.value === candSubfieldData.originalValue)) {\n nvdebug('040‡d matched 040‡a', debugDev);\n return true;\n }\n return false;\n}\n\nfunction ennakkotietoInSubfieldG(candSubfieldData) {\n if (isEnnakkotietoSubfieldG({'code': candSubfieldData.code, 'value': candSubfieldData.originalValue})) {\n // Skip just ‡g subfield or the whole field?\n // We decided to skip just this subfield. We want at least $0 and maybe even more from ennakkotieto.\n debugDev(`Skip '‡g ${candSubfieldData.originalValue}'`);\n return true;\n }\n return false;\n}\n\n\nfunction mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData) {\n\n // Don't bring WHATEVER<KEEP> from source 7XX to base 1XX.\n // Exceptionally we can merge <KEEP>ed 7XX with un-<KEEP>ed 1XX as 1XX should not use <KEEP>s.\n if (targetField.tag.charAt(0) === '1' && candSubfieldData.tag.charAt(0) === '7' && candSubfieldData.code === '9' && candSubfieldData.originalValue.match(/<KEEP>/u)) {\n return true;\n }\n\n // Don't add 264$b 'Kustannuspaikka tuntematon' etc\n if (!valueCarriesMeaning(targetField.tag, candSubfieldData.code, candSubfieldData.normalizedValue)) {\n return true;\n }\n\n\n // Don't add $0 subfields that mean the same even if they look different:\n const alephIdentifierType = normalizeAs(targetField.tag, candSubfieldData.code);\n if (alephIdentifierType !== undefined) {\n const normalizedSubfieldValue = normalizeControlSubfieldValue(candSubfieldData.originalValue, alephIdentifierType);\n if (targetField.subfields.some(sf => normalizeControlSubfieldValue(sf.value) === normalizedSubfieldValue && sf.code === candSubfieldData.code)) {\n return true;\n }\n }\n return false;\n}\n\n\nfunction skipNormalizedComparison(tag, subfieldCode, subfieldValue) {\n if (tag === '020' && subfieldCode === 'a') {\n return true;\n }\n // Hackish: we want 'ntamo' to win 'Ntamo'...\n // If there are other similar excepting put them into an array.\n if (['110', '610', '710', '810'].includes(tag) && subfieldCode === 'a' && subfieldValue.substring(0, 5) === 'ntamo') {\n return true;\n }\n return false;\n}\n\nfunction mergeOrAddSubfieldNotRequired(targetField, candSubfieldData) {\n if (catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) || ennakkotietoInSubfieldG(candSubfieldData)) {\n return true;\n }\n\n if (mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData)) {\n return true;\n }\n\n const relevantTargetSubfields = targetField.subfields.filter(sf => sf.code === candSubfieldData.code);\n // Target field does not have this subfield yet:\n if (relevantTargetSubfields.length === 0) {\n return false;\n }\n nvdebug(` Look for identical subfields in '${fieldToString(targetField)}' using`, debugDev);\n nvdebug(` ORIG. ‡${candSubfieldData.code} ${candSubfieldData.originalValue}`, debugDev);\n nvdebug(` NO-PUNC ‡${candSubfieldData.code} ${candSubfieldData.punctuationlessValue}`, debugDev);\n if (relevantTargetSubfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.originalValue)) {\n return true;\n }\n if (relevantTargetSubfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.punctuationlessValue)) {\n return true;\n }\n\n if (!skipNormalizedComparison(targetField.tag, candSubfieldData.code, candSubfieldData.originalValue)) {\n const normalizedTargetField = cloneAndNormalizeFieldForComparison(targetField);\n nvdebug(` Look for identical normalized subfields in '${fieldToString(normalizedTargetField)}'`, debugDev);\n nvdebug(` NO-PUNC ‡${candSubfieldData.code} ${candSubfieldData.normalizedValue})`, debugDev);\n\n if (normalizedTargetField.subfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.normalizedValue)) {\n // Subfield with identical normalized value exists. Do nothing.\n // Not ideal 382‡n subfields, I guess... Nor 505‡trg repetitions... These need to be fixed...\n return true;\n }\n }\n\n return false; // (note that this is a double negation: not required is false)\n}\n\nfunction addSubfield(targetField, candSubfield) {\n nvdebug(` Added subfield '${subfieldToString(candSubfield)}' to field`, debugDev);\n // Add subfield to the end of all subfields. NB! Implement a separate function that does this + subfield reordering somehow...\n targetField.subfields.push(candSubfield);\n\n targetField.merged = 1;\n\n setPunctuationFlag(targetField, candSubfield);\n sortAdjacentSubfields(targetField);\n\n}\n\nfunction setPunctuationFlag(field, addedSubfield) {\n if (isControlSubfieldCode(addedSubfield.code)) { // These are never punctuation related\n return;\n }\n field.useExternalEndPunctuation = 1;\n}\n\n\nfunction resetPaired880(candFieldPair880, targetField, punctlessCandSubfield) {\n // No relevant:\n if (punctlessCandSubfield.code !== '6') {\n return;\n }\n if (targetField.tag === '880') {\n return;\n }\n // NB! $6 comes first:\n if (candFieldPair880 === undefined || !candFieldPair880.subfields || candFieldPair880.subfields[0].code !== '6') {\n return;\n\n }\n nvdebug(`880 contents: ${fieldToString(candFieldPair880)}`, debugDev);\n resetSubfield6Tag(candFieldPair880.subfields[0], targetField.tag);\n}\n\nexport function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = []) {\n\n const candSubfieldAsString = `${candSubfieldData.code} ${candSubfieldData.originalValue}`;\n\n nvdebug(` Q: mergeOrAddSubfield '${candSubfieldAsString}'\\n with field '${fieldToString(targetField)}'?`, debugDev);\n if (mergeOrAddSubfieldNotRequired(targetField, candSubfieldData)) {\n nvdebug(` A: No. No need to merge nor to add the subfield '${candSubfieldAsString}'`, debugDev);\n return;\n }\n\n const candSubfield = {'code': candSubfieldData.code, 'value': candSubfieldData.punctuationlessValue};\n\n // Currently only for X00$d 1984- => 1984-2000 type of changes, where source version is better that what base has.\n // It all other cases the original subfield is kept.\n const original = fieldToString(targetField);\n\n if (mergeSubfield(targetField, candSubfield)) { // We might need the normalizedCandSubfield later on\n mergeSubfieldPostprocessor();\n return;\n }\n\n // Subfield codes missing from the original record can be added by default:\n if (addSubfieldWithPreviouslyUnseenSubfieldCode()) {\n return;\n }\n\n // melindaCustomMergeFields.json tells us whether the subfield is repeatable or not:\n if (subfieldIsRepeatable(targetField.tag, candSubfield.code)) {\n // We don't want to add multiple, say, 260$c\n if (['260', '264'].includes(targetField.tag)) {\n nvdebug(` A: Exceptionally skip repeatable existing subfield '${subfieldToString(candSubfield)}'`, debugDev);\n return;\n }\n nvdebug(` A: Yes. Add repeatable subfield '${subfieldToString(candSubfield)}'`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n addSubfield(targetField, candSubfield);\n return;\n }\n\n nvdebug(` A: No. Non-repeatable subfield '${subfieldToString(candSubfield)}'`, debugDev);\n return;\n\n function mergeSubfieldPostprocessor() {\n if (original !== fieldToString(targetField)) {\n nvdebug(` A: Merge. Subfield '${candSubfieldAsString}' replaces the original subfield.`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n return;\n }\n nvdebug(` A: No. Field ${original} already had the same or a synonymous or a better merge candidate than our subfield '${candSubfieldAsString}'.`, debugDev);\n return;\n }\n\n function addSubfieldWithPreviouslyUnseenSubfieldCode() {\n if (!fieldHasSubfield(targetField, candSubfield.code)) {\n nvdebug(` A: Yes. Add previously unseen subfield '${subfieldToString(candSubfield)}'`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n candFieldPairs880.forEach(pair => resetPaired880(pair, targetField, candSubfield));\n addSubfield(targetField, candSubfield);\n return true;\n }\n return false;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -49,11 +49,11 @@ function anyYear(str) {
|
|
|
49
49
|
function replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields) {
|
|
50
50
|
if (birthYearAndDeathYear.test(candSubfield.value)) {
|
|
51
51
|
if (onlyBirthYear.test(relevantSubfields[0].value) && parseInt(relevantSubfields[0].value, 10) === parseInt(candSubfield.value, 10)) {
|
|
52
|
-
relevantSubfields[0].value = candSubfield.value;
|
|
52
|
+
relevantSubfields[0].value = candSubfield.value;
|
|
53
53
|
return true;
|
|
54
54
|
}
|
|
55
55
|
if (onlyDeathYear.test(relevantSubfields[0].value) && getDeathYear(relevantSubfields[0].value) === getDeathYear(candSubfield.value)) {
|
|
56
|
-
relevantSubfields[0].value = candSubfield.value;
|
|
56
|
+
relevantSubfields[0].value = candSubfield.value;
|
|
57
57
|
return true;
|
|
58
58
|
}
|
|
59
59
|
}
|
|
@@ -67,7 +67,7 @@ function replaceDatesAssociatedWithName(targetField, candSubfield, relevantSubfi
|
|
|
67
67
|
return false;
|
|
68
68
|
}
|
|
69
69
|
if (!anyYear(relevantSubfields[0].value) && anyYear(candSubfield.value)) {
|
|
70
|
-
relevantSubfields[0].value = candSubfield.value;
|
|
70
|
+
relevantSubfields[0].value = candSubfield.value;
|
|
71
71
|
return true;
|
|
72
72
|
}
|
|
73
73
|
if (replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields)) {
|
|
@@ -162,7 +162,7 @@ function preferHyphenatedISBN(field, candSubfield, relevantSubfields) {
|
|
|
162
162
|
if (!pair) {
|
|
163
163
|
return false;
|
|
164
164
|
}
|
|
165
|
-
pair.value = candSubfield.value;
|
|
165
|
+
pair.value = candSubfield.value;
|
|
166
166
|
return true;
|
|
167
167
|
}
|
|
168
168
|
function preferHttpsOverHttp(candSubfield, relevantSubfields) {
|
|
@@ -174,7 +174,7 @@ function preferHttpsOverHttp(candSubfield, relevantSubfields) {
|
|
|
174
174
|
if (!pair) {
|
|
175
175
|
return false;
|
|
176
176
|
}
|
|
177
|
-
pair.value = candSubfield.value;
|
|
177
|
+
pair.value = candSubfield.value;
|
|
178
178
|
return true;
|
|
179
179
|
}
|
|
180
180
|
function preferQualifierVersion(field, candSubfield, relevantSubfields) {
|
|
@@ -191,7 +191,7 @@ function preferQualifierVersion(field, candSubfield, relevantSubfields) {
|
|
|
191
191
|
if (field.tag === '300' && candSubfield.code === 'a' && candSubfield.value.match(/(?:online|verkko)/iu)) {
|
|
192
192
|
return true; // True, but don't prefer the source value
|
|
193
193
|
}
|
|
194
|
-
pair.value = candSubfield.value;
|
|
194
|
+
pair.value = candSubfield.value;
|
|
195
195
|
return true;
|
|
196
196
|
function subfieldQualifierCheck(subfield, name, qualifier) {
|
|
197
197
|
const [name2, qualifier2] = (0, _counterpartField.splitToNameAndQualifier)(candSubfield.value);
|
|
@@ -211,7 +211,7 @@ function preferSourceCorporateName(field, candSubfield, pair) {
|
|
|
211
211
|
(0, _utils.nvdebug)(`CORP base '${pair.value}' vs '${candSubfield.value}'`, debugDev);
|
|
212
212
|
const prefer = actualPrefenceCheck();
|
|
213
213
|
if (prefer) {
|
|
214
|
-
pair.value = candSubfield.value;
|
|
214
|
+
pair.value = candSubfield.value;
|
|
215
215
|
return true;
|
|
216
216
|
}
|
|
217
217
|
return false;
|
|
@@ -260,7 +260,7 @@ function mergeSubfield(targetField, candSubfield) {
|
|
|
260
260
|
// 260 $a value "[S.l]" is the main type for this.
|
|
261
261
|
const meaninglessSubfields = relevantSubfields.filter(sf => !(0, _worldKnowledge.valueCarriesMeaning)(targetField.tag, sf.code, sf.value));
|
|
262
262
|
if (meaninglessSubfields.length > 0) {
|
|
263
|
-
meaninglessSubfields[0].value = candSubfield.value;
|
|
263
|
+
meaninglessSubfields[0].value = candSubfield.value;
|
|
264
264
|
return true;
|
|
265
265
|
}
|
|
266
266
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeSubfield.js","names":["_debug","_interopRequireDefault","require","_normalizeSubfieldValueForComparison","_worldKnowledge","_utils","_normalizeFieldForComparison","_counterpartField","e","__esModule","default","debug","createDebugLogger","debugDev","extend","onlyBirthYear","onlyDeathYear","birthYearAndDeathYear","getDeathYear","str","parseInt","substring","indexOf","isValidBirthYearAndDeathYear","test","b","d","anyYear","replaceEntrysBirthAndDeathYear","targetField","candSubfield","relevantSubfields","value","replaceDatesAssociatedWithName","code","tag","isKierreselka","includes","isKovakantinen","isPehmeakantinen","isItsenainenJatkoOsa","match","isSisaltaaTeos","relationInformationMatches","some","sf","coverTypesMatch","httpToHttps","val","replace","pairHttpAndHttps","a","bs","map","isSynonym","field","preferHyphenatedISBN","tagAndSubfieldCodeReferToIsbn","hyphenlessSubfields","filter","pair","find","preferHttpsOverHttp","httpVersion","preferQualifierVersion","canContainOptionalQualifier","name1","qualifier1","splitToNameAndQualifier","subfieldQualifierCheck","subfield","name","qualifier","name2","qualifier2","preferSourceCorporateName","nvdebug","prefer","actualPrefenceCheck","sourceName","sourceQualifier","baseName","baseQualifier","undefined","mergeSubfield","subfields","length","meaninglessSubfields","valueCarriesMeaning","subfieldContainsPartData","partsAgree"],"sources":["../../src/merge-fields/mergeSubfield.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {partsAgree, subfieldContainsPartData} from '../normalizeSubfieldValueForComparison';\nimport {valueCarriesMeaning} from './worldKnowledge';\nimport {nvdebug} from '../utils';\nimport {tagAndSubfieldCodeReferToIsbn} from '../normalizeFieldForComparison.js';\nimport {canContainOptionalQualifier, splitToNameAndQualifier} from './counterpartField';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeSubfield');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! These are X00 specific. Should we somehow parametrize them?\nconst onlyBirthYear = /^[1-9][0-9]*-[,.]?$/u;\nconst onlyDeathYear = /^-[1-9][0-9]*[,.]?$/u;\nconst birthYearAndDeathYear = /^[1-9][0-9]*-[1-9][0-9]*[,.]?$/u;\n\nfunction getDeathYear(str) {\n return parseInt(str.substring(str.indexOf('-') + 1), 10);\n}\n\nfunction isValidBirthYearAndDeathYear(str) {\n if (!birthYearAndDeathYear.test(str)) {\n return false;\n }\n // We have two years\n const b = parseInt(str, 10);\n const d = getDeathYear(str);\n if (b > d) { // died before birth! Rather unlikely.\n return false;\n }\n if (d - b > 125) { // Over 125 years old. Rather unlikely.\n return false;\n }\n // Possible sanity check: Died after current year?\n return true;\n}\n\nfunction anyYear(str) {\n if (onlyBirthYear.test(str) || onlyDeathYear.test(str) || isValidBirthYearAndDeathYear(str)) {\n return true;\n }\n return false;\n}\n\nfunction replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields) {\n if (birthYearAndDeathYear.test(candSubfield.value)) {\n if (onlyBirthYear.test(relevantSubfields[0].value) && parseInt(relevantSubfields[0].value, 10) === parseInt(candSubfield.value, 10)) {\n relevantSubfields[0].value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n }\n\n if (onlyDeathYear.test(relevantSubfields[0].value) && getDeathYear(relevantSubfields[0].value) === getDeathYear(candSubfield.value)) {\n relevantSubfields[0].value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n }\n }\n return false;\n}\n\nfunction replaceDatesAssociatedWithName(targetField, candSubfield, relevantSubfields) {\n // Add also the death year, if the original value only contains birth year.\n // This function treats only with X00$d subfields:\n if (candSubfield.code !== 'd' || !(/^[1678]00$/u).test(targetField.tag)) { // njsscan-ignore: regex_dos\n return false;\n }\n\n if (!anyYear(relevantSubfields[0].value) && anyYear(candSubfield.value)) {\n relevantSubfields[0].value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n }\n\n if (replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields)) {\n return true;\n }\n return false;\n}\n\n// use array.includes(value) for easy extendability (Swedish, other languages, abbrs, etc.()\nfunction isKierreselka(value) {\n return ['kierreselkä', 'spiral bound', 'spiral-bound', 'spiralrygg'].includes(value);\n}\n\nfunction isKovakantinen(value) {\n return ['hardback', 'hardcover', 'hårda pärmar', 'kovakantinen'].includes(value);\n}\n\nfunction isPehmeakantinen(value) {\n return ['mjuka pärmar', 'paperback', 'pehmeäkantinen', 'softcover'].includes(value);\n}\n\nfunction isItsenainenJatkoOsa(value) {\n if (value.match(/^Fristående fortsättning på verket[^a-z]*$/ui)) {\n return true;\n }\n if (value.match(/^Itsenäinen jatko-osa teokselle[^a-z]*$/ui)) {\n return true;\n }\n return false;\n}\n\nfunction isSisaltaaTeos(value) {\n if (value.match(/^Innehåller \\(verk\\)[^a-z]*$/ui)) {\n return true;\n }\n if (value.match(/^Sisältää \\(teos\\)[^a-z]*$/ui)) {\n return true;\n }\n return false;\n}\nfunction relationInformationMatches(candSubfield, relevantSubfields) {\n if (isSisaltaaTeos(candSubfield.value) && relevantSubfields.some(sf => isSisaltaaTeos(sf.value))) {\n return true;\n }\n if (isItsenainenJatkoOsa(candSubfield.value) && relevantSubfields.some(sf => isItsenainenJatkoOsa(sf.value))) {\n return true;\n }\n\n return false;\n}\n\nfunction coverTypesMatch(candSubfield, relevantSubfields) {\n if (isPehmeakantinen(candSubfield.value) && relevantSubfields.some(sf => isPehmeakantinen(sf.value))) {\n return true;\n }\n if (isKovakantinen(candSubfield.value) && relevantSubfields.some(sf => isKovakantinen(sf.value))) {\n return true;\n }\n if (isKierreselka(candSubfield.value) && relevantSubfields.some(sf => isKierreselka(sf.value))) {\n return true;\n }\n return false;\n}\n\nfunction httpToHttps(val) {\n return val.replace(/http:\\/\\//ug, 'https://');\n}\n\nfunction pairHttpAndHttps(candSubfield, relevantSubfields) {\n const a = httpToHttps(candSubfield.value);\n const bs = relevantSubfields.map(sf => httpToHttps(sf.value));\n return bs.includes(a);\n}\n\nfunction isSynonym(field, candSubfield, relevantSubfields) {\n if (candSubfield.code === 'q' && ['015', '020', '024', '028'].includes(field.tag)) {\n return coverTypesMatch(candSubfield, relevantSubfields);\n }\n\n //nvdebug(`Looking for synonyms for '${subfieldToString(candSubfield)}'...`, debugDev);\n\n if (relationInformationMatches(candSubfield, relevantSubfields)) {\n return true;\n }\n\n if (pairHttpAndHttps(candSubfield, relevantSubfields)) {\n return true;\n }\n\n return false;\n}\n\nfunction preferHyphenatedISBN(field, candSubfield, relevantSubfields) {\n if (!tagAndSubfieldCodeReferToIsbn(field.tag, candSubfield.code) || candSubfield.value.includes('-') === -1) {\n return false;\n }\n\n // Must not already exist:\n if (relevantSubfields.some(sf => sf.value === candSubfield.value)) {\n return false;\n }\n\n const hyphenlessSubfields = relevantSubfields.filter(sf => sf.value.includes('-') > -1);\n const pair = hyphenlessSubfields.find(sf => sf.value === candSubfield.value.replace(/-/gu, ''));\n if (!pair) {\n return false;\n }\n pair.value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n}\n\nfunction preferHttpsOverHttp(candSubfield, relevantSubfields) {\n if (candSubfield.value.substring(0, 8) !== 'https://') {\n return false;\n }\n\n const httpVersion = `http://${candSubfield.value.substring(8)}`;\n const pair = relevantSubfields.find(sf => sf.value === httpVersion);\n\n if (!pair) {\n return false;\n }\n pair.value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n}\n\n\nfunction preferQualifierVersion(field, candSubfield, relevantSubfields) {\n if (!canContainOptionalQualifier(field.tag, candSubfield.code)) { // currently only 300$a and 776$i can prefer source...\n return false;\n }\n\n const [name1, qualifier1] = splitToNameAndQualifier(candSubfield.value);\n const pair = relevantSubfields.find(sf => subfieldQualifierCheck(sf, name1, qualifier1));\n if (!pair) {\n return false;\n }\n // SN: \"Kuvailuohjeiden näkökulmasta epubille ei pitäisi koskaan merkitä sivumäärää\"\n if (field.tag === '300' && candSubfield.code === 'a' && candSubfield.value.match(/(?:online|verkko)/iu)) {\n return true; // True, but don't prefer the source value\n }\n\n pair.value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n\n function subfieldQualifierCheck(subfield, name, qualifier) {\n const [name2, qualifier2] = splitToNameAndQualifier(candSubfield.value);\n if (name !== name2) {\n return false;\n }\n if (!qualifier || !qualifier2 || qualifier === qualifier2) {\n return true;\n }\n return false;\n }\n\n}\n\nfunction preferSourceCorporateName(field, candSubfield, pair) {\n if (candSubfield.code !== 'a' || !['110', '610', '710', '810'].includes(field.tag)) {\n return false;\n }\n nvdebug(`CORP base '${pair.value}' vs '${candSubfield.value}'`, debugDev);\n const prefer = actualPrefenceCheck();\n if (prefer) {\n pair.value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n }\n return false;\n\n function actualPrefenceCheck() {\n if (candSubfield.value.match(/^Werner Söderström/u) && pair.value.match(/^WSOY/ui)) {\n return true;\n }\n if (candSubfield.value.match(/^ntamo/u) && pair.value.match(/^N(?:tamo|TAMO)/u)) {\n return true;\n }\n // Prefer (qualifier):\n const [sourceName, sourceQualifier] = splitToNameAndQualifier(candSubfield.value);\n const [baseName, baseQualifier] = splitToNameAndQualifier(pair.value);\n if (sourceName === baseName && baseQualifier === undefined && sourceQualifier !== undefined) {\n return true;\n }\n // Not taking prefix and suffix into account here...\n return false;\n }\n\n}\n\nexport function mergeSubfield(targetField, candSubfield) {\n // Replace existing subfield with the incoming field. These replacements are by name rather hacky...\n // Currenty we only select the better X00$d.\n // In future we might do more things here. Examples:\n // - \"FOO\" gets replaced by \"Foo\" in certain fields.\n // - \"Etunimi Sukunimi\" might lose to \"Sukunimi, Etunimi\" in X00 fields.\n // - [put your ideas here]\n // Return true, if replace is done.\n // However, replacing/succeeding requires a sanity check, that the new value is a better one...\n // Thus, typically this function fails...\n\n const relevantSubfields = targetField.subfields.filter(subfield => subfield.code === candSubfield.code);\n\n // There's nothing to replace the incoming subfield with. Thus abort:\n if (relevantSubfields.length === 0) {\n return false;\n }\n\n nvdebug(`Got ${relevantSubfields.length} sf-cand(s) for field ${targetField.tag}‡${candSubfield.code}`, debugDev);\n\n\n if (replaceDatesAssociatedWithName(targetField, candSubfield, relevantSubfields) ||\n preferHyphenatedISBN(targetField, candSubfield, relevantSubfields) ||\n preferHttpsOverHttp(candSubfield, relevantSubfields) ||\n preferSourceCorporateName(targetField, candSubfield, relevantSubfields[0]) || // SF is non-repeat\n preferQualifierVersion(targetField, candSubfield, relevantSubfields) ||\n isSynonym(targetField, candSubfield, relevantSubfields)) {\n return true;\n }\n\n // We found a crappy empty subfield: replace that with a meaningful one.\n // 260 $a value \"[S.l]\" is the main type for this.\n const meaninglessSubfields = relevantSubfields.filter(sf => !valueCarriesMeaning(targetField.tag, sf.code, sf.value));\n if (meaninglessSubfields.length > 0) {\n meaninglessSubfields[0].value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n }\n\n // Mark 490$v \"osa 1\" vs \"1\" as merged (2nd part of MET-53).\n // NB! Keeps the original value and drops the incoming value. (Just preventing it from going to add-part...)\n // NB! We could improve this and choose the longer value later on.\n if (subfieldContainsPartData(targetField.tag, candSubfield.code)) {\n if (relevantSubfields.some(sf => partsAgree(sf.value, candSubfield.value, targetField.tag, candSubfield.code))) {\n return true;\n }\n }\n return false; // default to failure\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"mergeSubfield.js","names":["_debug","_interopRequireDefault","require","_normalizeSubfieldValueForComparison","_worldKnowledge","_utils","_normalizeFieldForComparison","_counterpartField","e","__esModule","default","debug","createDebugLogger","debugDev","extend","onlyBirthYear","onlyDeathYear","birthYearAndDeathYear","getDeathYear","str","parseInt","substring","indexOf","isValidBirthYearAndDeathYear","test","b","d","anyYear","replaceEntrysBirthAndDeathYear","targetField","candSubfield","relevantSubfields","value","replaceDatesAssociatedWithName","code","tag","isKierreselka","includes","isKovakantinen","isPehmeakantinen","isItsenainenJatkoOsa","match","isSisaltaaTeos","relationInformationMatches","some","sf","coverTypesMatch","httpToHttps","val","replace","pairHttpAndHttps","a","bs","map","isSynonym","field","preferHyphenatedISBN","tagAndSubfieldCodeReferToIsbn","hyphenlessSubfields","filter","pair","find","preferHttpsOverHttp","httpVersion","preferQualifierVersion","canContainOptionalQualifier","name1","qualifier1","splitToNameAndQualifier","subfieldQualifierCheck","subfield","name","qualifier","name2","qualifier2","preferSourceCorporateName","nvdebug","prefer","actualPrefenceCheck","sourceName","sourceQualifier","baseName","baseQualifier","undefined","mergeSubfield","subfields","length","meaninglessSubfields","valueCarriesMeaning","subfieldContainsPartData","partsAgree"],"sources":["../../src/merge-fields/mergeSubfield.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {partsAgree, subfieldContainsPartData} from '../normalizeSubfieldValueForComparison';\nimport {valueCarriesMeaning} from './worldKnowledge';\nimport {nvdebug} from '../utils';\nimport {tagAndSubfieldCodeReferToIsbn} from '../normalizeFieldForComparison.js';\nimport {canContainOptionalQualifier, splitToNameAndQualifier} from './counterpartField';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeSubfield');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! These are X00 specific. Should we somehow parametrize them?\nconst onlyBirthYear = /^[1-9][0-9]*-[,.]?$/u;\nconst onlyDeathYear = /^-[1-9][0-9]*[,.]?$/u;\nconst birthYearAndDeathYear = /^[1-9][0-9]*-[1-9][0-9]*[,.]?$/u;\n\nfunction getDeathYear(str) {\n return parseInt(str.substring(str.indexOf('-') + 1), 10);\n}\n\nfunction isValidBirthYearAndDeathYear(str) {\n if (!birthYearAndDeathYear.test(str)) {\n return false;\n }\n // We have two years\n const b = parseInt(str, 10);\n const d = getDeathYear(str);\n if (b > d) { // died before birth! Rather unlikely.\n return false;\n }\n if (d - b > 125) { // Over 125 years old. Rather unlikely.\n return false;\n }\n // Possible sanity check: Died after current year?\n return true;\n}\n\nfunction anyYear(str) {\n if (onlyBirthYear.test(str) || onlyDeathYear.test(str) || isValidBirthYearAndDeathYear(str)) {\n return true;\n }\n return false;\n}\n\nfunction replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields) {\n if (birthYearAndDeathYear.test(candSubfield.value)) {\n if (onlyBirthYear.test(relevantSubfields[0].value) && parseInt(relevantSubfields[0].value, 10) === parseInt(candSubfield.value, 10)) {\n relevantSubfields[0].value = candSubfield.value;\n return true;\n }\n\n if (onlyDeathYear.test(relevantSubfields[0].value) && getDeathYear(relevantSubfields[0].value) === getDeathYear(candSubfield.value)) {\n relevantSubfields[0].value = candSubfield.value;\n return true;\n }\n }\n return false;\n}\n\nfunction replaceDatesAssociatedWithName(targetField, candSubfield, relevantSubfields) {\n // Add also the death year, if the original value only contains birth year.\n // This function treats only with X00$d subfields:\n if (candSubfield.code !== 'd' || !(/^[1678]00$/u).test(targetField.tag)) { // njsscan-ignore: regex_dos\n return false;\n }\n\n if (!anyYear(relevantSubfields[0].value) && anyYear(candSubfield.value)) {\n relevantSubfields[0].value = candSubfield.value;\n return true;\n }\n\n if (replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields)) {\n return true;\n }\n return false;\n}\n\n// use array.includes(value) for easy extendability (Swedish, other languages, abbrs, etc.()\nfunction isKierreselka(value) {\n return ['kierreselkä', 'spiral bound', 'spiral-bound', 'spiralrygg'].includes(value);\n}\n\nfunction isKovakantinen(value) {\n return ['hardback', 'hardcover', 'hårda pärmar', 'kovakantinen'].includes(value);\n}\n\nfunction isPehmeakantinen(value) {\n return ['mjuka pärmar', 'paperback', 'pehmeäkantinen', 'softcover'].includes(value);\n}\n\nfunction isItsenainenJatkoOsa(value) {\n if (value.match(/^Fristående fortsättning på verket[^a-z]*$/ui)) {\n return true;\n }\n if (value.match(/^Itsenäinen jatko-osa teokselle[^a-z]*$/ui)) {\n return true;\n }\n return false;\n}\n\nfunction isSisaltaaTeos(value) {\n if (value.match(/^Innehåller \\(verk\\)[^a-z]*$/ui)) {\n return true;\n }\n if (value.match(/^Sisältää \\(teos\\)[^a-z]*$/ui)) {\n return true;\n }\n return false;\n}\nfunction relationInformationMatches(candSubfield, relevantSubfields) {\n if (isSisaltaaTeos(candSubfield.value) && relevantSubfields.some(sf => isSisaltaaTeos(sf.value))) {\n return true;\n }\n if (isItsenainenJatkoOsa(candSubfield.value) && relevantSubfields.some(sf => isItsenainenJatkoOsa(sf.value))) {\n return true;\n }\n\n return false;\n}\n\nfunction coverTypesMatch(candSubfield, relevantSubfields) {\n if (isPehmeakantinen(candSubfield.value) && relevantSubfields.some(sf => isPehmeakantinen(sf.value))) {\n return true;\n }\n if (isKovakantinen(candSubfield.value) && relevantSubfields.some(sf => isKovakantinen(sf.value))) {\n return true;\n }\n if (isKierreselka(candSubfield.value) && relevantSubfields.some(sf => isKierreselka(sf.value))) {\n return true;\n }\n return false;\n}\n\nfunction httpToHttps(val) {\n return val.replace(/http:\\/\\//ug, 'https://');\n}\n\nfunction pairHttpAndHttps(candSubfield, relevantSubfields) {\n const a = httpToHttps(candSubfield.value);\n const bs = relevantSubfields.map(sf => httpToHttps(sf.value));\n return bs.includes(a);\n}\n\nfunction isSynonym(field, candSubfield, relevantSubfields) {\n if (candSubfield.code === 'q' && ['015', '020', '024', '028'].includes(field.tag)) {\n return coverTypesMatch(candSubfield, relevantSubfields);\n }\n\n //nvdebug(`Looking for synonyms for '${subfieldToString(candSubfield)}'...`, debugDev);\n\n if (relationInformationMatches(candSubfield, relevantSubfields)) {\n return true;\n }\n\n if (pairHttpAndHttps(candSubfield, relevantSubfields)) {\n return true;\n }\n\n return false;\n}\n\nfunction preferHyphenatedISBN(field, candSubfield, relevantSubfields) {\n if (!tagAndSubfieldCodeReferToIsbn(field.tag, candSubfield.code) || candSubfield.value.includes('-') === -1) {\n return false;\n }\n\n // Must not already exist:\n if (relevantSubfields.some(sf => sf.value === candSubfield.value)) {\n return false;\n }\n\n const hyphenlessSubfields = relevantSubfields.filter(sf => sf.value.includes('-') > -1);\n const pair = hyphenlessSubfields.find(sf => sf.value === candSubfield.value.replace(/-/gu, ''));\n if (!pair) {\n return false;\n }\n pair.value = candSubfield.value;\n return true;\n}\n\nfunction preferHttpsOverHttp(candSubfield, relevantSubfields) {\n if (candSubfield.value.substring(0, 8) !== 'https://') {\n return false;\n }\n\n const httpVersion = `http://${candSubfield.value.substring(8)}`;\n const pair = relevantSubfields.find(sf => sf.value === httpVersion);\n\n if (!pair) {\n return false;\n }\n pair.value = candSubfield.value;\n return true;\n}\n\n\nfunction preferQualifierVersion(field, candSubfield, relevantSubfields) {\n if (!canContainOptionalQualifier(field.tag, candSubfield.code)) { // currently only 300$a and 776$i can prefer source...\n return false;\n }\n\n const [name1, qualifier1] = splitToNameAndQualifier(candSubfield.value);\n const pair = relevantSubfields.find(sf => subfieldQualifierCheck(sf, name1, qualifier1));\n if (!pair) {\n return false;\n }\n // SN: \"Kuvailuohjeiden näkökulmasta epubille ei pitäisi koskaan merkitä sivumäärää\"\n if (field.tag === '300' && candSubfield.code === 'a' && candSubfield.value.match(/(?:online|verkko)/iu)) {\n return true; // True, but don't prefer the source value\n }\n\n pair.value = candSubfield.value;\n return true;\n\n function subfieldQualifierCheck(subfield, name, qualifier) {\n const [name2, qualifier2] = splitToNameAndQualifier(candSubfield.value);\n if (name !== name2) {\n return false;\n }\n if (!qualifier || !qualifier2 || qualifier === qualifier2) {\n return true;\n }\n return false;\n }\n\n}\n\nfunction preferSourceCorporateName(field, candSubfield, pair) {\n if (candSubfield.code !== 'a' || !['110', '610', '710', '810'].includes(field.tag)) {\n return false;\n }\n nvdebug(`CORP base '${pair.value}' vs '${candSubfield.value}'`, debugDev);\n const prefer = actualPrefenceCheck();\n if (prefer) {\n pair.value = candSubfield.value;\n return true;\n }\n return false;\n\n function actualPrefenceCheck() {\n if (candSubfield.value.match(/^Werner Söderström/u) && pair.value.match(/^WSOY/ui)) {\n return true;\n }\n if (candSubfield.value.match(/^ntamo/u) && pair.value.match(/^N(?:tamo|TAMO)/u)) {\n return true;\n }\n // Prefer (qualifier):\n const [sourceName, sourceQualifier] = splitToNameAndQualifier(candSubfield.value);\n const [baseName, baseQualifier] = splitToNameAndQualifier(pair.value);\n if (sourceName === baseName && baseQualifier === undefined && sourceQualifier !== undefined) {\n return true;\n }\n // Not taking prefix and suffix into account here...\n return false;\n }\n\n}\n\nexport function mergeSubfield(targetField, candSubfield) {\n // Replace existing subfield with the incoming field. These replacements are by name rather hacky...\n // Currenty we only select the better X00$d.\n // In future we might do more things here. Examples:\n // - \"FOO\" gets replaced by \"Foo\" in certain fields.\n // - \"Etunimi Sukunimi\" might lose to \"Sukunimi, Etunimi\" in X00 fields.\n // - [put your ideas here]\n // Return true, if replace is done.\n // However, replacing/succeeding requires a sanity check, that the new value is a better one...\n // Thus, typically this function fails...\n\n const relevantSubfields = targetField.subfields.filter(subfield => subfield.code === candSubfield.code);\n\n // There's nothing to replace the incoming subfield with. Thus abort:\n if (relevantSubfields.length === 0) {\n return false;\n }\n\n nvdebug(`Got ${relevantSubfields.length} sf-cand(s) for field ${targetField.tag}‡${candSubfield.code}`, debugDev);\n\n\n if (replaceDatesAssociatedWithName(targetField, candSubfield, relevantSubfields) ||\n preferHyphenatedISBN(targetField, candSubfield, relevantSubfields) ||\n preferHttpsOverHttp(candSubfield, relevantSubfields) ||\n preferSourceCorporateName(targetField, candSubfield, relevantSubfields[0]) || // SF is non-repeat\n preferQualifierVersion(targetField, candSubfield, relevantSubfields) ||\n isSynonym(targetField, candSubfield, relevantSubfields)) {\n return true;\n }\n\n // We found a crappy empty subfield: replace that with a meaningful one.\n // 260 $a value \"[S.l]\" is the main type for this.\n const meaninglessSubfields = relevantSubfields.filter(sf => !valueCarriesMeaning(targetField.tag, sf.code, sf.value));\n if (meaninglessSubfields.length > 0) {\n meaninglessSubfields[0].value = candSubfield.value;\n return true;\n }\n\n // Mark 490$v \"osa 1\" vs \"1\" as merged (2nd part of MET-53).\n // NB! Keeps the original value and drops the incoming value. (Just preventing it from going to add-part...)\n // NB! We could improve this and choose the longer value later on.\n if (subfieldContainsPartData(targetField.tag, candSubfield.code)) {\n if (relevantSubfields.some(sf => partsAgree(sf.value, candSubfield.value, targetField.tag, candSubfield.code))) {\n return true;\n }\n }\n return false; // default to failure\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -24,7 +24,7 @@ function fieldRemoveDuplicateSubfields(field) {
|
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
26
|
const strippedField = (0, _normalizeFieldForComparison.cloneAndRemovePunctuation)(field); // make punctuation-less version
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
let seen = {};
|
|
29
29
|
field.subfields = field.subfields.filter((sf, i) => notSeenBefore(sf, i));
|
|
30
30
|
if (field.collapsed) {
|
|
@@ -43,6 +43,5 @@ function fieldRemoveDuplicateSubfields(field) {
|
|
|
43
43
|
seen[subfieldAsString] = subfieldAsString;
|
|
44
44
|
return true;
|
|
45
45
|
}
|
|
46
|
-
/* eslint-enable */
|
|
47
46
|
}
|
|
48
47
|
//# sourceMappingURL=removeDuplicateSubfields.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"removeDuplicateSubfields.js","names":["_utils","require","_debug","_interopRequireDefault","_normalizeFieldForComparison","_sortSubfields","_punctuation","e","__esModule","default","debug","createDebugLogger","debugDev","extend","recordRemoveDuplicateSubfieldsFromFields","record","fields","forEach","field","fieldRemoveDuplicateSubfields","subfields","includes","tag","strippedField","cloneAndRemovePunctuation","seen","filter","sf","i","notSeenBefore","collapsed","sortAdjacentSubfields","fieldFixPunctuation","index","subfieldAsString","subfieldToString","nvdebug"],"sources":["../../src/merge-fields/removeDuplicateSubfields.js"],"sourcesContent":["\nimport {nvdebug, subfieldToString} from '../utils.js';\nimport createDebugLogger from 'debug';\nimport {cloneAndRemovePunctuation} from '../normalizeFieldForComparison.js';\nimport {sortAdjacentSubfields} from '../sortSubfields';\nimport {fieldFixPunctuation} from '../punctuation2';\n\n\n// NB This should be moved and converted to a validator/fixer as well...\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:merge-fields:removeDuplicateSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport function recordRemoveDuplicateSubfieldsFromFields(record) {\n record.fields.forEach(field => fieldRemoveDuplicateSubfields(field));\n}\n\nexport function fieldRemoveDuplicateSubfields(field) {\n // Skip bad (382, 505) and risky (264 ...) stuff: 382$n, 505$r, others...\n if (!field.subfields || ['264', '300', '382', '505'].includes(field.tag)) {\n return;\n }\n\n const strippedField = cloneAndRemovePunctuation(field); // make punctuation-less version\n
|
|
1
|
+
{"version":3,"file":"removeDuplicateSubfields.js","names":["_utils","require","_debug","_interopRequireDefault","_normalizeFieldForComparison","_sortSubfields","_punctuation","e","__esModule","default","debug","createDebugLogger","debugDev","extend","recordRemoveDuplicateSubfieldsFromFields","record","fields","forEach","field","fieldRemoveDuplicateSubfields","subfields","includes","tag","strippedField","cloneAndRemovePunctuation","seen","filter","sf","i","notSeenBefore","collapsed","sortAdjacentSubfields","fieldFixPunctuation","index","subfieldAsString","subfieldToString","nvdebug"],"sources":["../../src/merge-fields/removeDuplicateSubfields.js"],"sourcesContent":["\nimport {nvdebug, subfieldToString} from '../utils.js';\nimport createDebugLogger from 'debug';\nimport {cloneAndRemovePunctuation} from '../normalizeFieldForComparison.js';\nimport {sortAdjacentSubfields} from '../sortSubfields';\nimport {fieldFixPunctuation} from '../punctuation2';\n\n\n// NB This should be moved and converted to a validator/fixer as well...\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:merge-fields:removeDuplicateSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport function recordRemoveDuplicateSubfieldsFromFields(record) {\n record.fields.forEach(field => fieldRemoveDuplicateSubfields(field));\n}\n\nexport function fieldRemoveDuplicateSubfields(field) {\n // Skip bad (382, 505) and risky (264 ...) stuff: 382$n, 505$r, others...\n if (!field.subfields || ['264', '300', '382', '505'].includes(field.tag)) {\n return;\n }\n\n const strippedField = cloneAndRemovePunctuation(field); // make punctuation-less version\n\n let seen = {};\n\n field.subfields = field.subfields.filter((sf, i) => notSeenBefore(sf, i));\n\n if (field.collapsed) {\n sortAdjacentSubfields(field);\n fieldFixPunctuation(field);\n delete field.collapsed;\n }\n\n\n function notSeenBefore(sf, index) {\n const subfieldAsString = subfieldToString(strippedField.subfields[index]); // use normalized form\n if (seen[subfieldAsString]) {\n nvdebug(`Remove field-internal duplicate subfield ${subfieldToString(sf)}`, debugDev);\n field.collapsed = 1; // trigger punctuation reset\n return false;\n }\n //nvdebug(`identical subfield removal: Add ${subfieldAsString} to seen[]`, debugDev);\n seen[subfieldAsString] = subfieldAsString;\n return true;\n }\n\n}\n"],"mappings":";;;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,4BAAA,GAAAH,OAAA;AACA,IAAAI,cAAA,GAAAJ,OAAA;AACA,IAAAK,YAAA,GAAAL,OAAA;AAAoD,SAAAE,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGpD;AACA,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,gFAAgF,CAAC;AACjH;AACA,MAAMC,QAAQ,GAAGF,KAAK,CAACG,MAAM,CAAC,KAAK,CAAC;AAE7B,SAASC,wCAAwCA,CAACC,MAAM,EAAE;EAC/DA,MAAM,CAACC,MAAM,CAACC,OAAO,CAACC,KAAK,IAAIC,6BAA6B,CAACD,KAAK,CAAC,CAAC;AACtE;AAEO,SAASC,6BAA6BA,CAACD,KAAK,EAAE;EACnD;EACA,IAAI,CAACA,KAAK,CAACE,SAAS,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACC,QAAQ,CAACH,KAAK,CAACI,GAAG,CAAC,EAAE;IACxE;EACF;EAEA,MAAMC,aAAa,GAAG,IAAAC,sDAAyB,EAACN,KAAK,CAAC,CAAC,CAAC;;EAExD,IAAIO,IAAI,GAAG,CAAC,CAAC;EAEbP,KAAK,CAACE,SAAS,GAAGF,KAAK,CAACE,SAAS,CAACM,MAAM,CAAC,CAACC,EAAE,EAAEC,CAAC,KAAKC,aAAa,CAACF,EAAE,EAAEC,CAAC,CAAC,CAAC;EAEzE,IAAIV,KAAK,CAACY,SAAS,EAAE;IACnB,IAAAC,oCAAqB,EAACb,KAAK,CAAC;IAC5B,IAAAc,gCAAmB,EAACd,KAAK,CAAC;IAC1B,OAAOA,KAAK,CAACY,SAAS;EACxB;EAGA,SAASD,aAAaA,CAACF,EAAE,EAAEM,KAAK,EAAE;IAChC,MAAMC,gBAAgB,GAAG,IAAAC,uBAAgB,EAACZ,aAAa,CAACH,SAAS,CAACa,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAIR,IAAI,CAACS,gBAAgB,CAAC,EAAE;MAC1B,IAAAE,cAAO,EAAC,4CAA4C,IAAAD,uBAAgB,EAACR,EAAE,CAAC,EAAE,EAAEf,QAAQ,CAAC;MACrFM,KAAK,CAACY,SAAS,GAAG,CAAC,CAAC,CAAC;MACrB,OAAO,KAAK;IACd;IACA;IACAL,IAAI,CAACS,gBAAgB,CAAC,GAAGA,gBAAgB;IACzC,OAAO,IAAI;EACb;AAEF","ignoreList":[]}
|
|
@@ -50,7 +50,7 @@ function normalizeForSamenessCheck(tag, subfieldCode, originalValue) {
|
|
|
50
50
|
}
|
|
51
51
|
function normalizePersonalName(originalValue) {
|
|
52
52
|
// Use more readable "Forename Surname" format in comparisons:
|
|
53
|
-
return originalValue.replace(/^([^,]+), ([^,]+)$/u, '$2 $1');
|
|
53
|
+
return originalValue.replace(/^([^,]+), ([^,]+)$/u, '$2 $1');
|
|
54
54
|
}
|
|
55
55
|
const sallittu506a = ['sallittu kaikenikäisille', 'sallittu', 's']; // downcased, without punctuation
|
|
56
56
|
function normalize506a(originalValue) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worldKnowledge.js","names":["valueCarriesMeaning","tag","subfieldCode","value","match","normalizeForSamenessCheck","originalValue","includes","normalizePersonalName","normalizeEditionStatement","normalize506a","normalizeOriginalVersionNoteIntroductoryPhrase","replace","sallittu506a","introductoryPhrasesMeaning1","nth"],"sources":["../../src/merge-fields/worldKnowledge.js"],"sourcesContent":["//import {nvdebug} from '../utils';\n\nexport function valueCarriesMeaning(tag, subfieldCode, value) {\n // Some data is pretty meaningless and as meaningless is pretty close to nothing, this meaningless data should no prevent merge.\n // The list below is incomples (swedish translations etc)\n if (tag === '260' || tag === '264') {\n // We drop these, instead of normalizing, as KV does not put this information in place...\n if (subfieldCode === 'a') {\n if (value.match(/^[^a-z]*(?:Kustannuspaikka tuntematon|S\\.l)[^a-z]*$/ui)) {\n return false;\n }\n }\n if (subfieldCode === 'b') {\n if (value.match(/^[^a-z]*(?:Kustantaja tuntematon|S\\.n)[^a-z]*$/ui)) {\n return false;\n }\n }\n return true;\n }\n return true;\n}\n\nexport function normalizeForSamenessCheck(tag, subfieldCode, originalValue) {\n // NB! These work only for non-repeatable subfields!\n // Repeatable subfields are currently handled in mergeSubfields.js. Only non-repeatable subfields block field merge,\n // (This split is suboptiomal... Minimum fix: make this disctinction cleaner...)\n if (subfieldCode === 'a' && ['100', '600', '700', '800'].includes(tag)) {\n return normalizePersonalName(originalValue);\n }\n\n // NB! originalValue should already be lowercased, stripped on initial '[' chars and postpunctuation.\n if (tag === '250' && subfieldCode === 'a') {\n return normalizeEditionStatement(originalValue);\n }\n\n // 506 - Restrictions on Access Note (R), $a - Terms governing access (NR)\n if (tag === '506' && subfieldCode === 'a') {\n return normalize506a(originalValue);\n }\n\n if (tag === '534' && subfieldCode === 'p') {\n return normalizeOriginalVersionNoteIntroductoryPhrase(originalValue);\n }\n\n return originalValue;\n}\n\n\nfunction normalizePersonalName(originalValue) {\n // Use more readable \"Forename Surname\" format in comparisons:\n return originalValue.replace(/^([^,]+), ([^,]+)$/u, '$2 $1')
|
|
1
|
+
{"version":3,"file":"worldKnowledge.js","names":["valueCarriesMeaning","tag","subfieldCode","value","match","normalizeForSamenessCheck","originalValue","includes","normalizePersonalName","normalizeEditionStatement","normalize506a","normalizeOriginalVersionNoteIntroductoryPhrase","replace","sallittu506a","introductoryPhrasesMeaning1","nth"],"sources":["../../src/merge-fields/worldKnowledge.js"],"sourcesContent":["//import {nvdebug} from '../utils';\n\nexport function valueCarriesMeaning(tag, subfieldCode, value) {\n // Some data is pretty meaningless and as meaningless is pretty close to nothing, this meaningless data should no prevent merge.\n // The list below is incomples (swedish translations etc)\n if (tag === '260' || tag === '264') {\n // We drop these, instead of normalizing, as KV does not put this information in place...\n if (subfieldCode === 'a') {\n if (value.match(/^[^a-z]*(?:Kustannuspaikka tuntematon|S\\.l)[^a-z]*$/ui)) {\n return false;\n }\n }\n if (subfieldCode === 'b') {\n if (value.match(/^[^a-z]*(?:Kustantaja tuntematon|S\\.n)[^a-z]*$/ui)) {\n return false;\n }\n }\n return true;\n }\n return true;\n}\n\nexport function normalizeForSamenessCheck(tag, subfieldCode, originalValue) {\n // NB! These work only for non-repeatable subfields!\n // Repeatable subfields are currently handled in mergeSubfields.js. Only non-repeatable subfields block field merge,\n // (This split is suboptiomal... Minimum fix: make this disctinction cleaner...)\n if (subfieldCode === 'a' && ['100', '600', '700', '800'].includes(tag)) {\n return normalizePersonalName(originalValue);\n }\n\n // NB! originalValue should already be lowercased, stripped on initial '[' chars and postpunctuation.\n if (tag === '250' && subfieldCode === 'a') {\n return normalizeEditionStatement(originalValue);\n }\n\n // 506 - Restrictions on Access Note (R), $a - Terms governing access (NR)\n if (tag === '506' && subfieldCode === 'a') {\n return normalize506a(originalValue);\n }\n\n if (tag === '534' && subfieldCode === 'p') {\n return normalizeOriginalVersionNoteIntroductoryPhrase(originalValue);\n }\n\n return originalValue;\n}\n\n\nfunction normalizePersonalName(originalValue) {\n // Use more readable \"Forename Surname\" format in comparisons:\n return originalValue.replace(/^([^,]+), ([^,]+)$/u, '$2 $1');\n}\n\nconst sallittu506a = ['sallittu kaikenikäisille', 'sallittu', 's']; // downcased, without punctuation\nfunction normalize506a(originalValue) {\n if (sallittu506a.includes(originalValue)) {\n return sallittu506a[0];\n }\n return originalValue;\n}\n\nconst introductoryPhrasesMeaning1 = ['alkuperäinen', 'alkuperäisen julkaisutiedot', 'alun perin julkaistu', 'alunperin julkaistu'];\nfunction normalizeOriginalVersionNoteIntroductoryPhrase(originalValue) {\n // MELKEHITYS-1935-ish:\n if (introductoryPhrasesMeaning1.includes(originalValue)) {\n return introductoryPhrasesMeaning1[0];\n }\n\n return originalValue;\n}\n\nfunction normalizeEditionStatement(originalValue) {\n const value = originalValue;\n\n // As normalization tries to translate things info Finnish, use this for similarity check only!\n if (value.match(/^[1-9][0-9]*(?:\\.|:a|nd|rd|st|th) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n const nth = value.replace(/[^0-9].*$/u, '');\n return `${nth}. painos`;\n }\n\n // Quick and dirty fix for\n if (value.match(/^[1-9][0-9]*(?:\\.|:a|nd|rd|st|th)(?: förnyade|,? rev\\.| uud\\.| uudistettu) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n const nth = value.replace(/[^0-9].*$/u, '');\n return `${nth}. uudistettu painos`;\n }\n\n if (value.match(/^(?:First|Första|Ensimmäinen) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `1. painos`;\n }\n\n if (value.match(/^(?:Andra|Second|Toinen) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `2. painos`;\n }\n\n if (value.match(/^(?:Kolmas|Third|Tredje) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `3. painos`;\n }\n\n if (value.match(/^(?:Fourth|Fjärde|Neljäs) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `4. painos`;\n }\n\n return originalValue;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -132,8 +132,6 @@ function mergeLisapainokset(record) {
|
|
|
132
132
|
if (relevantFields.length < 2) {
|
|
133
133
|
return;
|
|
134
134
|
}
|
|
135
|
-
|
|
136
|
-
/* eslint-disable */
|
|
137
135
|
const collapsedArray = extractAllPrintData(relevantFields);
|
|
138
136
|
if (collapsedArray.length === 0) {
|
|
139
137
|
return;
|
|
@@ -147,6 +145,5 @@ function mergeLisapainokset(record) {
|
|
|
147
145
|
return;
|
|
148
146
|
}
|
|
149
147
|
});
|
|
150
|
-
/* eslint-enable */
|
|
151
148
|
}
|
|
152
149
|
//# sourceMappingURL=mergeField500Lisapainokset.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeField500Lisapainokset.js","names":["_default","description","validate","fix","record","res","message","valid","mergeLisapainokset","relevantFields","getRelevantFields","length","printData","extractAllPrintData","fields","filter","field","validLisapainosField","tag","subfields","code","value","match","fieldToPrintsString","replace","printPreference","getPrintPreference","findIndex","pp","mergePrintData","value1","value2","index1","print1","year1","split","index2","print2","year2","betterIndex","betterPrint","getBetterPrint","betterYear","getBetterYear","y1","y2","i1","i2","allPrintData","i","j","fieldsPrintData","currPrintData","printIndex","undefined","mergedPrintData","p","collapsedArray","content","join","forEach","index","removeField"],"sources":["../src/mergeField500Lisapainokset.js"],"sourcesContent":["export default function () {\n\n return {\n description: 'Merge 500 $a Lisäpainokset fields',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n mergeLisapainokset(record);\n return res;\n }\n\n function validate(record) {\n const relevantFields = getRelevantFields(record);\n if (relevantFields.length < 2) {\n return {message: [], 'valid': true}; // No action required\n }\n\n const printData = extractAllPrintData(relevantFields);\n if (printData.length === 0) {\n return {message: ['There are issues, but the fixer can not fix them!'], 'valid': false}; // No action required\n }\n\n return {message: [`Fixer can merge ${relevantFields.length} 500 $a Lisäpainokset fields into one`], 'valid': false};\n }\n}\n\n\nfunction getRelevantFields(record) {\n return record.fields.filter(field => validLisapainosField(field));\n}\n\nfunction validLisapainosField(field) {\n // We are only interested in field 500 with a lone $a subfield.\n // Especially $9 FENNI<KEEP> should not be merged!\n if (field.tag !== '500' || field.subfields.length !== 1 || field.subfields[0].code !== 'a') {\n return false;\n }\n return field.subfields[0].value.match(/^(?:Lisäpainokset|Lisäpainos): (?:[1-9][0-9]*\\. (?:p\\.|painos|uppl\\.) [0-9]+\\.)(?: - [1-9][0-9]*\\. (?:p\\.|painos|uppl\\.) \\[?[0-9]+\\]?\\.)*$/u);\n}\n\nfunction fieldToPrintsString(field) {\n // Could this just be something on the lines of s/^\\S+ // ?\n return field.subfields[0].value.replace(/^(?:Lisäpainokset|Lisäpainos): /u, '').replace(/\\.$/u, '');\n}\n\nconst printPreference = ['painos', 'p.', 'upplaga', 'uppl.'];\nfunction getPrintPreference(value) {\n return printPreference.findIndex(pp => pp === value);\n}\n\nfunction mergePrintData(value1, value2) {\n const [index1, print1, year1] = value1.split(' ');\n const [index2, print2, year2] = value2.split(' ');\n\n const betterIndex = index1 ? index1 : index2; // just to cheat eslint...\n\n // merge print1 and print2\n const betterPrint = getBetterPrint(print1, print2);\n if (!betterPrint) {\n return null;\n }\n\n const betterYear = getBetterYear(year1, year2);\n if (!betterYear) {\n return null;\n }\n\n return `${betterIndex} ${betterPrint} ${betterYear}`;\n\n function getBetterYear(y1, y2) {\n if (y1 === y2 || y2 === `[${y1}]`) {\n return y1;\n }\n if (y1 === `[${y2}]`) {\n return y2;\n }\n return null;\n }\n\n function getBetterPrint(print1, print2) {\n if (print1 === print2) {\n return print1;\n }\n\n const i1 = getPrintPreference(print1);\n const i2 = getPrintPreference(print2);\n if (i1 === -1 || i2 === -1) {\n return null;\n }\n if (i1 <= i2) {\n return printPreference[i1];\n }\n return printPreference[i2];\n }\n\n}\n\n\nfunction extractAllPrintData(relevantFields) {\n /* eslint-disable */\n // Gather data about 500 $a Lisäpainokset.*\n let allPrintData = [];\n let i;\n let j;\n for (i=0; i < relevantFields.length; i++) {\n const value = fieldToPrintsString(relevantFields[i]);\n const fieldsPrintData = value.split('. - ');\n for (j=0; j < fieldsPrintData.length; j++) {\n let currPrintData = fieldsPrintData[j];\n // Example value: \"2. p. 2020\"\n const [ printIndex ] = currPrintData.split('.');\n if (allPrintData[printIndex] !== undefined) {\n if (allPrintData[printIndex] !== currPrintData ) {\n const mergedPrintData = mergePrintData(allPrintData[printIndex], currPrintData);\n if (!mergedPrintData) {\n return []; // reason for for-loops: exit function from within nested loops\n }\n currPrintData = mergedPrintData;\n }\n }\n allPrintData[printIndex] = currPrintData;\n }\n };\n return allPrintData.filter(p => p !== undefined);\n}\n\n\nexport function mergeLisapainokset(record) {\n const relevantFields = getRelevantFields(record);\n if (relevantFields.length < 2) {\n return;\n }\n\n
|
|
1
|
+
{"version":3,"file":"mergeField500Lisapainokset.js","names":["_default","description","validate","fix","record","res","message","valid","mergeLisapainokset","relevantFields","getRelevantFields","length","printData","extractAllPrintData","fields","filter","field","validLisapainosField","tag","subfields","code","value","match","fieldToPrintsString","replace","printPreference","getPrintPreference","findIndex","pp","mergePrintData","value1","value2","index1","print1","year1","split","index2","print2","year2","betterIndex","betterPrint","getBetterPrint","betterYear","getBetterYear","y1","y2","i1","i2","allPrintData","i","j","fieldsPrintData","currPrintData","printIndex","undefined","mergedPrintData","p","collapsedArray","content","join","forEach","index","removeField"],"sources":["../src/mergeField500Lisapainokset.js"],"sourcesContent":["export default function () {\n\n return {\n description: 'Merge 500 $a Lisäpainokset fields',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n mergeLisapainokset(record);\n return res;\n }\n\n function validate(record) {\n const relevantFields = getRelevantFields(record);\n if (relevantFields.length < 2) {\n return {message: [], 'valid': true}; // No action required\n }\n\n const printData = extractAllPrintData(relevantFields);\n if (printData.length === 0) {\n return {message: ['There are issues, but the fixer can not fix them!'], 'valid': false}; // No action required\n }\n\n return {message: [`Fixer can merge ${relevantFields.length} 500 $a Lisäpainokset fields into one`], 'valid': false};\n }\n}\n\n\nfunction getRelevantFields(record) {\n return record.fields.filter(field => validLisapainosField(field));\n}\n\nfunction validLisapainosField(field) {\n // We are only interested in field 500 with a lone $a subfield.\n // Especially $9 FENNI<KEEP> should not be merged!\n if (field.tag !== '500' || field.subfields.length !== 1 || field.subfields[0].code !== 'a') {\n return false;\n }\n return field.subfields[0].value.match(/^(?:Lisäpainokset|Lisäpainos): (?:[1-9][0-9]*\\. (?:p\\.|painos|uppl\\.) [0-9]+\\.)(?: - [1-9][0-9]*\\. (?:p\\.|painos|uppl\\.) \\[?[0-9]+\\]?\\.)*$/u);\n}\n\nfunction fieldToPrintsString(field) {\n // Could this just be something on the lines of s/^\\S+ // ?\n return field.subfields[0].value.replace(/^(?:Lisäpainokset|Lisäpainos): /u, '').replace(/\\.$/u, '');\n}\n\nconst printPreference = ['painos', 'p.', 'upplaga', 'uppl.'];\nfunction getPrintPreference(value) {\n return printPreference.findIndex(pp => pp === value);\n}\n\nfunction mergePrintData(value1, value2) {\n const [index1, print1, year1] = value1.split(' ');\n const [index2, print2, year2] = value2.split(' ');\n\n const betterIndex = index1 ? index1 : index2; // just to cheat eslint...\n\n // merge print1 and print2\n const betterPrint = getBetterPrint(print1, print2);\n if (!betterPrint) {\n return null;\n }\n\n const betterYear = getBetterYear(year1, year2);\n if (!betterYear) {\n return null;\n }\n\n return `${betterIndex} ${betterPrint} ${betterYear}`;\n\n function getBetterYear(y1, y2) {\n if (y1 === y2 || y2 === `[${y1}]`) {\n return y1;\n }\n if (y1 === `[${y2}]`) {\n return y2;\n }\n return null;\n }\n\n function getBetterPrint(print1, print2) {\n if (print1 === print2) {\n return print1;\n }\n\n const i1 = getPrintPreference(print1);\n const i2 = getPrintPreference(print2);\n if (i1 === -1 || i2 === -1) {\n return null;\n }\n if (i1 <= i2) {\n return printPreference[i1];\n }\n return printPreference[i2];\n }\n\n}\n\n\nfunction extractAllPrintData(relevantFields) {\n /* eslint-disable */\n // Gather data about 500 $a Lisäpainokset.*\n let allPrintData = [];\n let i;\n let j;\n for (i=0; i < relevantFields.length; i++) {\n const value = fieldToPrintsString(relevantFields[i]);\n const fieldsPrintData = value.split('. - ');\n for (j=0; j < fieldsPrintData.length; j++) {\n let currPrintData = fieldsPrintData[j];\n // Example value: \"2. p. 2020\"\n const [ printIndex ] = currPrintData.split('.');\n if (allPrintData[printIndex] !== undefined) {\n if (allPrintData[printIndex] !== currPrintData ) {\n const mergedPrintData = mergePrintData(allPrintData[printIndex], currPrintData);\n if (!mergedPrintData) {\n return []; // reason for for-loops: exit function from within nested loops\n }\n currPrintData = mergedPrintData;\n }\n }\n allPrintData[printIndex] = currPrintData;\n }\n };\n return allPrintData.filter(p => p !== undefined);\n}\n\n\nexport function mergeLisapainokset(record) {\n const relevantFields = getRelevantFields(record);\n if (relevantFields.length < 2) {\n return;\n }\n\n const collapsedArray = extractAllPrintData(relevantFields);\n if (collapsedArray.length === 0) {\n return;\n }\n\n const content = \"Lisäpainokset: \" + collapsedArray.join('. - ') + \".\";\n\n relevantFields[0].subfields[0].value = content; // Keep the place\n\n relevantFields.forEach((field, index) => {\n if (index > 0) {\n record.removeField(field);\n return;\n }\n });\n}\n"],"mappings":";;;;;;;AAAe,SAAAA,SAAA,EAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,mCAAmC;IAChDC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEH,GAAG,EAAE,EAAE;MAAEI,KAAK,EAAE;IAAI,CAAC;IAC/CC,kBAAkB,CAACJ,MAAM,CAAC;IAC1B,OAAOC,GAAG;EACZ;EAEA,SAASH,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMK,cAAc,GAAGC,iBAAiB,CAACN,MAAM,CAAC;IAChD,IAAIK,cAAc,CAACE,MAAM,GAAG,CAAC,EAAE;MAC7B,OAAO;QAACL,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE;MAAI,CAAC,CAAC,CAAC;IACvC;IAEA,MAAMM,SAAS,GAAGC,mBAAmB,CAACJ,cAAc,CAAC;IACrD,IAAIG,SAAS,CAACD,MAAM,KAAK,CAAC,EAAE;MAC1B,OAAO;QAACL,OAAO,EAAE,CAAC,mDAAmD,CAAC;QAAE,OAAO,EAAE;MAAK,CAAC,CAAC,CAAC;IAC3F;IAEA,OAAO;MAACA,OAAO,EAAE,CAAC,mBAAmBG,cAAc,CAACE,MAAM,uCAAuC,CAAC;MAAE,OAAO,EAAE;IAAK,CAAC;EACrH;AACF;AAGA,SAASD,iBAAiBA,CAACN,MAAM,EAAE;EACjC,OAAOA,MAAM,CAACU,MAAM,CAACC,MAAM,CAACC,KAAK,IAAIC,oBAAoB,CAACD,KAAK,CAAC,CAAC;AACnE;AAEA,SAASC,oBAAoBA,CAACD,KAAK,EAAE;EACnC;EACA;EACA,IAAIA,KAAK,CAACE,GAAG,KAAK,KAAK,IAAIF,KAAK,CAACG,SAAS,CAACR,MAAM,KAAK,CAAC,IAAIK,KAAK,CAACG,SAAS,CAAC,CAAC,CAAC,CAACC,IAAI,KAAK,GAAG,EAAE;IAC1F,OAAO,KAAK;EACd;EACA,OAAOJ,KAAK,CAACG,SAAS,CAAC,CAAC,CAAC,CAACE,KAAK,CAACC,KAAK,CAAC,6IAA6I,CAAC;AACtL;AAEA,SAASC,mBAAmBA,CAACP,KAAK,EAAE;EAClC;EACA,OAAOA,KAAK,CAACG,SAAS,CAAC,CAAC,CAAC,CAACE,KAAK,CAACG,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACrG;AAEA,MAAMC,eAAe,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC;AAC5D,SAASC,kBAAkBA,CAACL,KAAK,EAAE;EACjC,OAAOI,eAAe,CAACE,SAAS,CAACC,EAAE,IAAIA,EAAE,KAAKP,KAAK,CAAC;AACtD;AAEA,SAASQ,cAAcA,CAACC,MAAM,EAAEC,MAAM,EAAE;EACtC,MAAM,CAACC,MAAM,EAAEC,MAAM,EAAEC,KAAK,CAAC,GAAGJ,MAAM,CAACK,KAAK,CAAC,GAAG,CAAC;EACjD,MAAM,CAACC,MAAM,EAAEC,MAAM,EAAEC,KAAK,CAAC,GAAGP,MAAM,CAACI,KAAK,CAAC,GAAG,CAAC;EAEjD,MAAMI,WAAW,GAAGP,MAAM,GAAGA,MAAM,GAAGI,MAAM,CAAC,CAAC;;EAE9C;EACA,MAAMI,WAAW,GAAGC,cAAc,CAACR,MAAM,EAAEI,MAAM,CAAC;EAClD,IAAI,CAACG,WAAW,EAAE;IAChB,OAAO,IAAI;EACb;EAEA,MAAME,UAAU,GAAGC,aAAa,CAACT,KAAK,EAAEI,KAAK,CAAC;EAC9C,IAAI,CAACI,UAAU,EAAE;IACf,OAAO,IAAI;EACb;EAEA,OAAO,GAAGH,WAAW,IAAIC,WAAW,IAAIE,UAAU,EAAE;EAEpD,SAASC,aAAaA,CAACC,EAAE,EAAEC,EAAE,EAAE;IAC7B,IAAID,EAAE,KAAKC,EAAE,IAAIA,EAAE,KAAK,IAAID,EAAE,GAAG,EAAE;MACjC,OAAOA,EAAE;IACX;IACA,IAAIA,EAAE,KAAK,IAAIC,EAAE,GAAG,EAAE;MACpB,OAAOA,EAAE;IACX;IACA,OAAO,IAAI;EACb;EAEA,SAASJ,cAAcA,CAACR,MAAM,EAAEI,MAAM,EAAE;IACtC,IAAIJ,MAAM,KAAKI,MAAM,EAAE;MACrB,OAAOJ,MAAM;IACf;IAEA,MAAMa,EAAE,GAAGpB,kBAAkB,CAACO,MAAM,CAAC;IACrC,MAAMc,EAAE,GAAGrB,kBAAkB,CAACW,MAAM,CAAC;IACrC,IAAIS,EAAE,KAAK,CAAC,CAAC,IAAIC,EAAE,KAAK,CAAC,CAAC,EAAE;MAC1B,OAAO,IAAI;IACb;IACA,IAAID,EAAE,IAAIC,EAAE,EAAE;MACZ,OAAOtB,eAAe,CAACqB,EAAE,CAAC;IAC5B;IACA,OAAOrB,eAAe,CAACsB,EAAE,CAAC;EAC5B;AAEF;AAGA,SAASlC,mBAAmBA,CAACJ,cAAc,EAAE;EAC3C;EACA;EACA,IAAIuC,YAAY,GAAG,EAAE;EACrB,IAAIC,CAAC;EACL,IAAIC,CAAC;EACL,KAAKD,CAAC,GAAC,CAAC,EAAEA,CAAC,GAAGxC,cAAc,CAACE,MAAM,EAAEsC,CAAC,EAAE,EAAE;IACxC,MAAM5B,KAAK,GAAGE,mBAAmB,CAACd,cAAc,CAACwC,CAAC,CAAC,CAAC;IACpD,MAAME,eAAe,GAAG9B,KAAK,CAACc,KAAK,CAAC,MAAM,CAAC;IAC3C,KAAKe,CAAC,GAAC,CAAC,EAAEA,CAAC,GAAGC,eAAe,CAACxC,MAAM,EAAEuC,CAAC,EAAE,EAAE;MACzC,IAAIE,aAAa,GAAGD,eAAe,CAACD,CAAC,CAAC;MACtC;MACA,MAAM,CAAEG,UAAU,CAAE,GAAGD,aAAa,CAACjB,KAAK,CAAC,GAAG,CAAC;MAC/C,IAAIa,YAAY,CAACK,UAAU,CAAC,KAAKC,SAAS,EAAE;QAC1C,IAAIN,YAAY,CAACK,UAAU,CAAC,KAAKD,aAAa,EAAG;UAC/C,MAAMG,eAAe,GAAG1B,cAAc,CAACmB,YAAY,CAACK,UAAU,CAAC,EAAED,aAAa,CAAC;UAC/E,IAAI,CAACG,eAAe,EAAE;YACpB,OAAO,EAAE,CAAC,CAAC;UACb;UACAH,aAAa,GAAGG,eAAe;QACjC;MACF;MACAP,YAAY,CAACK,UAAU,CAAC,GAAGD,aAAa;IAC1C;EACF;EAAC;EACD,OAAOJ,YAAY,CAACjC,MAAM,CAACyC,CAAC,IAAIA,CAAC,KAAKF,SAAS,CAAC;AAClD;AAGO,SAAS9C,kBAAkBA,CAACJ,MAAM,EAAE;EACzC,MAAMK,cAAc,GAAGC,iBAAiB,CAACN,MAAM,CAAC;EAChD,IAAIK,cAAc,CAACE,MAAM,GAAG,CAAC,EAAE;IAC7B;EACF;EAEA,MAAM8C,cAAc,GAAG5C,mBAAmB,CAACJ,cAAc,CAAC;EAC1D,IAAIgD,cAAc,CAAC9C,MAAM,KAAK,CAAC,EAAE;IAC/B;EACF;EAEA,MAAM+C,OAAO,GAAG,iBAAiB,GAAGD,cAAc,CAACE,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG;EAErElD,cAAc,CAAC,CAAC,CAAC,CAACU,SAAS,CAAC,CAAC,CAAC,CAACE,KAAK,GAAGqC,OAAO,CAAC,CAAC;;EAEhDjD,cAAc,CAACmD,OAAO,CAAC,CAAC5C,KAAK,EAAE6C,KAAK,KAAK;IACvC,IAAIA,KAAK,GAAG,CAAC,EAAE;MACbzD,MAAM,CAAC0D,WAAW,CAAC9C,KAAK,CAAC;MACzB;IACF;EACF,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -43,7 +43,7 @@ function _default() {
|
|
|
43
43
|
const res = {
|
|
44
44
|
message: msg
|
|
45
45
|
};
|
|
46
|
-
res.valid = !(res.message.length >= 1);
|
|
46
|
+
res.valid = !(res.message.length >= 1);
|
|
47
47
|
return res;
|
|
48
48
|
}
|
|
49
49
|
}
|
|
@@ -56,7 +56,7 @@ function createNormalizedClone(field) {
|
|
|
56
56
|
function createNormalizedCloneWithoutRelatorTerms(field) {
|
|
57
57
|
const clonedField = createNormalizedClone(field);
|
|
58
58
|
// Remove relator terms $e subfi:
|
|
59
|
-
clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e');
|
|
59
|
+
clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e');
|
|
60
60
|
return clonedField;
|
|
61
61
|
}
|
|
62
62
|
function getRelatorTermStrings(relatorTermSubfieldCode, field) {
|
|
@@ -78,7 +78,7 @@ function copyRelatorSubfields(fromField, toField) {
|
|
|
78
78
|
newRelatorTerms.forEach(term => toField.subfields.push({
|
|
79
79
|
code: relatorTermSubfieldCode,
|
|
80
80
|
value: term
|
|
81
|
-
})); // eslint-disable-line
|
|
81
|
+
})); // eslint-disable-line array-callback-return
|
|
82
82
|
}
|
|
83
83
|
function mergeRelatorTermFields(record, fix = false) {
|
|
84
84
|
/* eslint-disable */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeRelatorTermFields.js","names":["_clone","_interopRequireDefault","require","_punctuation","_utils","_sortSubfields","_sortRelatorTerms","e","__esModule","default","_default","description","validate","fix","record","msg","mergeRelatorTermFields","res","message","valid","length","createNormalizedClone","field","clonedField","clone","fieldStripPunctuation","createNormalizedCloneWithoutRelatorTerms","subfields","filter","sf","code","getRelatorTermStrings","relatorTermSubfieldCode","map","value","extractAddableRelatorTerms","fromField","toField","tagToRelatorTermSubfieldCode","tag","normalizedFromFieldRelatorTerms","normalizedToFieldRelatorTerms","str","includes","copyRelatorSubfields","newRelatorTerms","forEach","term","push","fields","get","result","comparisonFieldsAsString","f","fieldToString","nvdebug","i","currField","deleted","j","mergableField","substring","fieldFixPunctuation","sortAdjacentSubfields","sortAdjacentRelatorTerms"],"sources":["../src/mergeRelatorTermFields.js"],"sourcesContent":["// Merge author/agent fields\n//\n// Rationale: Same author can appear in one 1XX and multiple 7XX fields having only different $e subfields.\n// These fields can be merged (and $e-subfields can then be sorted)...\n//\n// Author(s): Nicholas Volk\n\n\nimport clone from 'clone';\nimport {fieldFixPunctuation, fieldStripPunctuation} from './punctuation2';\nimport {fieldToString, nvdebug} from './utils';\nimport {sortAdjacentSubfields} from './sortSubfields';\nimport {sortAdjacentRelatorTerms, tagToRelatorTermSubfieldCode} from './sortRelatorTerms';\n//import createDebugLogger from 'debug';\n/*\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:mergeRelatorTermFields');\n//const debugData = debug.extend('data');\n*/\n\nexport default function () {\n\n return {\n description: 'Merge author fields that only differ in $e relator terms',\n validate, fix\n };\n\n function fix(record) {\n const msg = mergeRelatorTermFields(record, true);\n const res = {message: msg, fix: msg, valid: true};\n return res;\n }\n\n function validate(record) {\n const msg = mergeRelatorTermFields(record, false);\n const res = {message: msg};\n\n res.valid = !(res.message.length >= 1)
|
|
1
|
+
{"version":3,"file":"mergeRelatorTermFields.js","names":["_clone","_interopRequireDefault","require","_punctuation","_utils","_sortSubfields","_sortRelatorTerms","e","__esModule","default","_default","description","validate","fix","record","msg","mergeRelatorTermFields","res","message","valid","length","createNormalizedClone","field","clonedField","clone","fieldStripPunctuation","createNormalizedCloneWithoutRelatorTerms","subfields","filter","sf","code","getRelatorTermStrings","relatorTermSubfieldCode","map","value","extractAddableRelatorTerms","fromField","toField","tagToRelatorTermSubfieldCode","tag","normalizedFromFieldRelatorTerms","normalizedToFieldRelatorTerms","str","includes","copyRelatorSubfields","newRelatorTerms","forEach","term","push","fields","get","result","comparisonFieldsAsString","f","fieldToString","nvdebug","i","currField","deleted","j","mergableField","substring","fieldFixPunctuation","sortAdjacentSubfields","sortAdjacentRelatorTerms"],"sources":["../src/mergeRelatorTermFields.js"],"sourcesContent":["// Merge author/agent fields\n//\n// Rationale: Same author can appear in one 1XX and multiple 7XX fields having only different $e subfields.\n// These fields can be merged (and $e-subfields can then be sorted)...\n//\n// Author(s): Nicholas Volk\n\n\nimport clone from 'clone';\nimport {fieldFixPunctuation, fieldStripPunctuation} from './punctuation2';\nimport {fieldToString, nvdebug} from './utils';\nimport {sortAdjacentSubfields} from './sortSubfields';\nimport {sortAdjacentRelatorTerms, tagToRelatorTermSubfieldCode} from './sortRelatorTerms';\n//import createDebugLogger from 'debug';\n/*\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:mergeRelatorTermFields');\n//const debugData = debug.extend('data');\n*/\n\nexport default function () {\n\n return {\n description: 'Merge author fields that only differ in $e relator terms',\n validate, fix\n };\n\n function fix(record) {\n const msg = mergeRelatorTermFields(record, true);\n const res = {message: msg, fix: msg, valid: true};\n return res;\n }\n\n function validate(record) {\n const msg = mergeRelatorTermFields(record, false);\n const res = {message: msg};\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\nfunction createNormalizedClone(field) {\n const clonedField = clone(field);\n // Normalize\n fieldStripPunctuation(clonedField);\n return clonedField;\n}\n\nfunction createNormalizedCloneWithoutRelatorTerms(field) {\n const clonedField = createNormalizedClone(field);\n // Remove relator terms $e subfi:\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e');\n return clonedField;\n}\n\nfunction getRelatorTermStrings(relatorTermSubfieldCode, field) {\n return field.subfields.filter(sf => sf.code === relatorTermSubfieldCode).map(sf => sf.value);\n\n}\n\nfunction extractAddableRelatorTerms(fromField, toField) {\n const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);\n const normalizedFromFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, fromField);\n if (normalizedFromFieldRelatorTerms.length === 0) {\n return [];\n }\n // Remove values that already exist:\n const normalizedToFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, toField);\n return normalizedFromFieldRelatorTerms.filter(str => !normalizedToFieldRelatorTerms.includes(str));\n}\n\n\nfunction copyRelatorSubfields(fromField, toField) {\n const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);\n const newRelatorTerms = extractAddableRelatorTerms(fromField, toField);\n\n newRelatorTerms.forEach(term => toField.subfields.push({code: relatorTermSubfieldCode, value: term})); // eslint-disable-line array-callback-return\n\n}\n\nfunction mergeRelatorTermFields(record, fix = false) {\n /* eslint-disable */\n // NV: 111/711, 751 and 752 where so rare that I did not add them here. Can't remember why I skipped 6XX and 8XX...\n let fields = record.get('(?:[17][01]0|720)'); \n let result = [];\n const comparisonFieldsAsString = fields.map(f => fieldToString(createNormalizedCloneWithoutRelatorTerms(f)));\n\n nvdebug(`mergeRelatorTermFields(): ${fields.length} cand field(s) found`);\n for(let i=0; i < fields.length-1; i++) {\n let currField = fields[i];\n if (currField.deleted) {\n continue;\n }\n nvdebug(`RT: Trying to pair ${comparisonFieldsAsString[i]}/${i}`);\n for (let j=i+1; j < fields.length; j++) {\n nvdebug(` Compare with ${comparisonFieldsAsString[j]}/${j}`);\n let mergableField = fields[j];\n // Skip 1/7 from 1XX/7XX for similarity check:\n if ( comparisonFieldsAsString[i].substring(1) !== comparisonFieldsAsString[j].substring(1)) {\n nvdebug(\" NOT PAIR\");\n continue;\n }\n if (mergableField.deleted) {\n nvdebug(\" DELETED\");\n continue;\n }\n const str = `MERGE RELATOR TERM FIELD: ${fieldToString(mergableField)}`;\n nvdebug(str);\n\n if(!result.includes(str)) {\n result.push(str)\n }\n\n if (fix) {\n mergableField.deleted = 1;\n copyRelatorSubfields(mergableField, currField);\n fieldFixPunctuation(currField);\n sortAdjacentSubfields(currField); // Put the added $e subfield to proper places.\n sortAdjacentRelatorTerms(currField); // Sort $e subfields with each other\n fieldFixPunctuation(currField);\n\n }\n }\n }\n\n if(!fix) {\n fields.forEach(f => delete f.deleted);\n }\n\n record.fields = record.fields.filter(f => !f.deleted);\n /* eslint-enable */\n return result;\n}\n"],"mappings":"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","ignoreList":[]}
|