@natlibfi/marc-record-validators-melinda 11.6.7-alpha.1 → 12.0.0-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 +63 -91
- package/dist/access-rights.js.map +7 -1
- package/dist/access-rights.test.js +137 -0
- package/dist/access-rights.test.js.map +7 -0
- package/dist/addMissingField041.js +21 -53
- package/dist/addMissingField041.js.map +7 -1
- package/dist/addMissingField041.test.js +39 -0
- package/dist/addMissingField041.test.js.map +7 -0
- package/dist/addMissingField336.js +99 -191
- package/dist/addMissingField336.js.map +7 -1
- package/dist/addMissingField336.test.js +39 -0
- package/dist/addMissingField336.test.js.map +7 -0
- package/dist/addMissingField337.js +63 -132
- package/dist/addMissingField337.js.map +7 -1
- package/dist/addMissingField337.test.js +39 -0
- package/dist/addMissingField337.test.js.map +7 -0
- package/dist/addMissingField338.js +147 -253
- package/dist/addMissingField338.js.map +7 -1
- package/dist/addMissingField338.test.js +39 -0
- package/dist/addMissingField338.test.js.map +7 -0
- package/dist/cyrillux-usemarcon-replacement.js +119 -272
- package/dist/cyrillux-usemarcon-replacement.js.map +7 -1
- package/dist/cyrillux-usemarcon-replacement.test.js +46 -0
- package/dist/cyrillux-usemarcon-replacement.test.js.map +7 -0
- package/dist/cyrillux.js +119 -223
- package/dist/cyrillux.js.map +7 -1
- package/dist/cyrillux.test.js +39 -0
- package/dist/cyrillux.test.js.map +7 -0
- package/dist/disambiguateSeriesStatements.js +40 -81
- package/dist/disambiguateSeriesStatements.js.map +7 -1
- package/dist/disambiguateSeriesStatements.test.js +44 -0
- package/dist/disambiguateSeriesStatements.test.js.map +7 -0
- package/dist/double-commas.js +7 -14
- package/dist/double-commas.js.map +7 -1
- package/dist/double-commas.test.js +48 -0
- package/dist/double-commas.test.js.map +7 -0
- package/dist/duplicates-ind1.js +10 -31
- package/dist/duplicates-ind1.js.map +7 -1
- package/dist/duplicates-ind1.test.js +40 -0
- package/dist/duplicates-ind1.test.js.map +7 -0
- package/dist/empty-fields.js +10 -22
- package/dist/empty-fields.js.map +7 -1
- package/dist/empty-fields.test.js +129 -0
- package/dist/empty-fields.test.js.map +7 -0
- package/dist/ending-punctuation-conf.js +871 -769
- package/dist/ending-punctuation-conf.js.map +7 -1
- package/dist/ending-punctuation.js +84 -167
- package/dist/ending-punctuation.js.map +7 -1
- package/dist/ending-punctuation.test.js +2290 -0
- package/dist/ending-punctuation.test.js.map +7 -0
- package/dist/ending-whitespace.js +10 -35
- package/dist/ending-whitespace.js.map +7 -1
- package/dist/ending-whitespace.test.js +38 -0
- package/dist/ending-whitespace.test.js.map +7 -0
- package/dist/field-008-18-34-character-groups.js +40 -125
- package/dist/field-008-18-34-character-groups.js.map +7 -1
- package/dist/field-008-18-34-character-groups.test.js +45 -0
- package/dist/field-008-18-34-character-groups.test.js.map +7 -0
- package/dist/field-505-separators.js +19 -39
- package/dist/field-505-separators.js.map +7 -1
- package/dist/field-505-separators.test.js +45 -0
- package/dist/field-505-separators.test.js.map +7 -0
- package/dist/field-521-fix.js +19 -47
- package/dist/field-521-fix.js.map +7 -1
- package/dist/field-521-fix.test.js +44 -0
- package/dist/field-521-fix.test.js.map +7 -0
- package/dist/field-exclusion.js +37 -91
- package/dist/field-exclusion.js.map +7 -1
- package/dist/field-exclusion.test.js +821 -0
- package/dist/field-exclusion.test.js.map +7 -0
- package/dist/field-structure.js +52 -104
- package/dist/field-structure.js.map +7 -1
- package/dist/field-structure.test.js +587 -0
- package/dist/field-structure.test.js.map +7 -0
- package/dist/field33XUtils.js +119 -503
- package/dist/field33XUtils.js.map +7 -1
- package/dist/fields-present.js +11 -23
- package/dist/fields-present.js.map +7 -1
- package/dist/fields-present.test.js +95 -0
- package/dist/fields-present.test.js.map +7 -0
- package/dist/fix-33X.js +393 -431
- package/dist/fix-33X.js.map +7 -1
- package/dist/fix-33X.test.js +39 -0
- package/dist/fix-33X.test.js.map +7 -0
- package/dist/fix-country-codes.js +20 -50
- package/dist/fix-country-codes.js.map +7 -1
- package/dist/fix-country-codes.test.js +44 -0
- package/dist/fix-country-codes.test.js.map +7 -0
- package/dist/fix-language-codes.js +23 -53
- package/dist/fix-language-codes.js.map +7 -1
- package/dist/fix-language-codes.test.js +38 -0
- package/dist/fix-language-codes.test.js.map +7 -0
- package/dist/fixRelatorTerms.js +82 -209
- package/dist/fixRelatorTerms.js.map +7 -1
- package/dist/fixRelatorTerms.test.js +44 -0
- package/dist/fixRelatorTerms.test.js.map +7 -0
- package/dist/fixed-fields.js +21 -30
- package/dist/fixed-fields.js.map +7 -1
- package/dist/fixed-fields.test.js +87 -0
- package/dist/fixed-fields.test.js.map +7 -0
- package/dist/identical-fields.js +8 -24
- package/dist/identical-fields.js.map +7 -1
- package/dist/identical-fields.test.js +119 -0
- package/dist/identical-fields.test.js.map +7 -0
- package/dist/index.js +119 -413
- package/dist/index.js.map +7 -1
- package/dist/indicator-fixes.js +57 -95
- package/dist/indicator-fixes.js.map +7 -1
- package/dist/indicator-fixes.test.js +42 -0
- package/dist/indicator-fixes.test.js.map +7 -0
- package/dist/isbn-issn.js +66 -126
- package/dist/isbn-issn.js.map +7 -1
- package/dist/isbn-issn.test.js +398 -0
- package/dist/isbn-issn.test.js.map +7 -0
- package/dist/item-language.js +32 -65
- package/dist/item-language.js.map +7 -1
- package/dist/item-language.test.js +322 -0
- package/dist/item-language.test.js.map +7 -0
- package/dist/melindaCustomMergeFields.js +5182 -11233
- package/dist/melindaCustomMergeFields.js.map +7 -1
- package/dist/merge-fields/controlSubfields.js +75 -142
- package/dist/merge-fields/controlSubfields.js.map +7 -1
- package/dist/merge-fields/counterpartField.js +182 -379
- package/dist/merge-fields/counterpartField.js.map +7 -1
- package/dist/merge-fields/index.js +15 -49
- package/dist/merge-fields/index.js.map +7 -1
- package/dist/merge-fields/mergableIndicator.js +18 -51
- package/dist/merge-fields/mergableIndicator.js.map +7 -1
- package/dist/merge-fields/mergableTag.js +78 -30
- package/dist/merge-fields/mergableTag.js.map +7 -1
- package/dist/merge-fields/mergeConfig.js +66 -171
- package/dist/merge-fields/mergeConfig.js.map +7 -1
- package/dist/merge-fields/mergeConstraints.js +323 -1214
- package/dist/merge-fields/mergeConstraints.js.map +7 -1
- package/dist/merge-fields/mergeField.js +47 -111
- package/dist/merge-fields/mergeField.js.map +7 -1
- package/dist/merge-fields/mergeIndicator.js +64 -118
- package/dist/merge-fields/mergeIndicator.js.map +7 -1
- package/dist/merge-fields/mergeOrAddPostprocess.js +14 -38
- package/dist/merge-fields/mergeOrAddPostprocess.js.map +7 -1
- package/dist/merge-fields/mergeOrAddSubfield.js +62 -104
- package/dist/merge-fields/mergeOrAddSubfield.js.map +7 -1
- package/dist/merge-fields/mergeSubfield.js +47 -95
- package/dist/merge-fields/mergeSubfield.js.map +7 -1
- package/dist/merge-fields/removeDuplicateSubfields.js +18 -31
- package/dist/merge-fields/removeDuplicateSubfields.js.map +7 -1
- package/dist/merge-fields/worldKnowledge.js +15 -40
- package/dist/merge-fields/worldKnowledge.js.map +7 -1
- package/dist/merge-fields.test.js +44 -0
- package/dist/merge-fields.test.js.map +7 -0
- package/dist/mergeField500Lisapainokset.js +28 -57
- package/dist/mergeField500Lisapainokset.js.map +7 -1
- package/dist/mergeField500Lisapainokset.test.js +44 -0
- package/dist/mergeField500Lisapainokset.test.js.map +7 -0
- package/dist/mergeRelatorTermFields.js +33 -69
- package/dist/mergeRelatorTermFields.js.map +7 -1
- package/dist/mergeRelatorTermFields.test.js +44 -0
- package/dist/mergeRelatorTermFields.test.js.map +7 -0
- package/dist/modernize-502.js +23 -55
- package/dist/modernize-502.js.map +7 -1
- package/dist/modernize-502.test.js +38 -0
- package/dist/modernize-502.test.js.map +7 -0
- package/dist/multiple-subfield-0.js +23 -48
- package/dist/multiple-subfield-0.js.map +7 -1
- package/dist/multiple-subfield-0.test.js +44 -0
- package/dist/multiple-subfield-0.test.js.map +7 -0
- package/dist/non-breaking-space.js +11 -32
- package/dist/non-breaking-space.js.map +7 -1
- package/dist/non-breaking-space.test.js +38 -0
- package/dist/non-breaking-space.test.js.map +7 -0
- package/dist/normalize-dashes.js +18 -37
- package/dist/normalize-dashes.js.map +7 -1
- package/dist/normalize-dashes.test.js +44 -0
- package/dist/normalize-dashes.test.js.map +7 -0
- package/dist/normalize-identifiers.js +54 -140
- package/dist/normalize-identifiers.js.map +7 -1
- package/dist/normalize-identifiers.test.js +44 -0
- package/dist/normalize-identifiers.test.js.map +7 -0
- package/dist/normalize-qualifying-information.js +23 -48
- package/dist/normalize-qualifying-information.js.map +7 -1
- package/dist/normalize-qualifying-information.test.js +44 -0
- package/dist/normalize-qualifying-information.test.js.map +7 -0
- package/dist/normalize-utf8-diacritics.js +19 -105
- package/dist/normalize-utf8-diacritics.js.map +7 -1
- package/dist/normalize-utf8-diacritics.test.js +44 -0
- package/dist/normalize-utf8-diacritics.test.js.map +7 -0
- package/dist/normalizeFieldForComparison.js +67 -158
- package/dist/normalizeFieldForComparison.js.map +7 -1
- package/dist/normalizeSubfieldValueForComparison.js +37 -77
- package/dist/normalizeSubfieldValueForComparison.js.map +7 -1
- package/dist/prepublicationUtils.js +58 -111
- package/dist/prepublicationUtils.js.map +7 -1
- package/dist/punctuation/index.js +56 -72
- package/dist/punctuation/index.js.map +7 -1
- package/dist/punctuation/rules/aut.js +372 -331
- package/dist/punctuation/rules/aut.js.map +7 -1
- package/dist/punctuation/rules/bib.js +420 -373
- package/dist/punctuation/rules/bib.js.map +7 -1
- package/dist/punctuation/rules/index.js +7 -21
- package/dist/punctuation/rules/index.js.map +7 -1
- package/dist/punctuation.test.js +44 -0
- package/dist/punctuation.test.js.map +7 -0
- package/dist/punctuation2.js +251 -800
- package/dist/punctuation2.js.map +7 -1
- package/dist/punctuation2.test.js +44 -0
- package/dist/punctuation2.test.js.map +7 -0
- package/dist/reindexSubfield6OccurenceNumbers.js +61 -96
- package/dist/reindexSubfield6OccurenceNumbers.js.map +7 -1
- package/dist/reindexSubfield6OccurenceNumbers.test.js +44 -0
- package/dist/reindexSubfield6OccurenceNumbers.test.js.map +7 -0
- package/dist/removeDuplicateDataFields.js +102 -202
- package/dist/removeDuplicateDataFields.js.map +7 -1
- package/dist/removeDuplicateDataFields.test.js +44 -0
- package/dist/removeDuplicateDataFields.test.js.map +7 -0
- package/dist/removeInferiorDataFields.js +103 -227
- package/dist/removeInferiorDataFields.js.map +7 -1
- package/dist/removeInferiorDataFields.test.js +44 -0
- package/dist/removeInferiorDataFields.test.js.map +7 -0
- package/dist/resolvable-ext-references-melinda.js +25 -60
- package/dist/resolvable-ext-references-melinda.js.map +7 -1
- package/dist/resolvable-ext-references-melinda.test.js +160 -0
- package/dist/resolvable-ext-references-melinda.test.js.map +7 -0
- package/dist/resolveOrphanedSubfield6s.js +33 -64
- package/dist/resolveOrphanedSubfield6s.js.map +7 -1
- package/dist/resolveOrphanedSubfield6s.test.js +44 -0
- package/dist/resolveOrphanedSubfield6s.test.js.map +7 -0
- package/dist/sanitize-vocabulary-source-codes.js +27 -55
- package/dist/sanitize-vocabulary-source-codes.js.map +7 -1
- package/dist/sanitize-vocabulary-source-codes.test.js +45 -0
- package/dist/sanitize-vocabulary-source-codes.test.js.map +7 -0
- package/dist/sort-tags.js +13 -25
- package/dist/sort-tags.js.map +7 -1
- package/dist/sort-tags.test.js +261 -0
- package/dist/sort-tags.test.js.map +7 -0
- package/dist/sortFields.js +152 -222
- package/dist/sortFields.js.map +7 -1
- package/dist/sortFields.test.js +44 -0
- package/dist/sortFields.test.js.map +7 -0
- package/dist/sortRelatorTerms.js +30 -68
- package/dist/sortRelatorTerms.js.map +7 -1
- package/dist/sortRelatorTerms.test.js +44 -0
- package/dist/sortRelatorTerms.test.js.map +7 -0
- package/dist/sortSubfields.js +102 -255
- package/dist/sortSubfields.js.map +7 -1
- package/dist/sortSubfields.test.js +44 -0
- package/dist/sortSubfields.test.js.map +7 -0
- package/dist/stripPunctuation.js +13 -36
- package/dist/stripPunctuation.js.map +7 -1
- package/dist/stripPunctuation.test.js +44 -0
- package/dist/stripPunctuation.test.js.map +7 -0
- package/dist/subfield-exclusion.js +28 -75
- package/dist/subfield-exclusion.js.map +7 -1
- package/dist/subfield-exclusion.test.js +471 -0
- package/dist/subfield-exclusion.test.js.map +7 -0
- package/dist/subfield6Utils.js +107 -269
- package/dist/subfield6Utils.js.map +7 -1
- package/dist/subfield8Utils.js +26 -50
- package/dist/subfield8Utils.js.map +7 -1
- package/dist/subfieldValueNormalizations.js +40 -74
- package/dist/subfieldValueNormalizations.js.map +7 -1
- package/dist/subfieldValueNormalizations.test.js +45 -0
- package/dist/subfieldValueNormalizations.test.js.map +7 -0
- package/dist/sync-007-and-300.js +22 -53
- package/dist/sync-007-and-300.js.map +7 -1
- package/dist/sync-007-and-300.test.js +44 -0
- package/dist/sync-007-and-300.test.js.map +7 -0
- package/dist/translate-terms.js +67 -155
- package/dist/translate-terms.js.map +7 -1
- package/dist/translate-terms.test.js +44 -0
- package/dist/translate-terms.test.js.map +7 -0
- package/dist/typeOfDate-008.js +10 -25
- package/dist/typeOfDate-008.js.map +7 -1
- package/dist/typeOfDate-008.test.js +40 -0
- package/dist/typeOfDate-008.test.js.map +7 -0
- package/dist/unicode-decomposition.js +94 -107
- package/dist/unicode-decomposition.js.map +7 -1
- package/dist/unicode-decomposition.test.js +94 -0
- package/dist/unicode-decomposition.test.js.map +7 -0
- package/dist/update-field-540.js +30 -75
- package/dist/update-field-540.js.map +7 -1
- package/dist/update-field-540.test.js +44 -0
- package/dist/update-field-540.test.js.map +7 -0
- package/dist/urn.js +55 -128
- package/dist/urn.js.map +7 -1
- package/dist/urn.test.js +44 -0
- package/dist/urn.test.js.map +7 -0
- package/dist/utils.js +72 -126
- package/dist/utils.js.map +7 -1
- package/eslint.config.mjs +1 -2
- package/package.json +21 -93
- package/src/access-rights.js +1 -1
- package/src/{access-rights.spec.js → access-rights.test.js} +9 -10
- package/src/addMissingField041.js +1 -1
- package/src/{addMissingField336.spec.js → addMissingField041.test.js} +13 -14
- package/src/addMissingField336.js +3 -3
- package/src/{addMissingField041.spec.js → addMissingField336.test.js} +13 -14
- package/src/addMissingField337.js +2 -2
- package/src/{addMissingField337.spec.js → addMissingField337.test.js} +13 -14
- package/src/addMissingField338.js +2 -2
- package/src/{addMissingField338.spec.js → addMissingField338.test.js} +13 -14
- package/src/cyrillux-usemarcon-replacement.js +18 -18
- package/src/cyrillux-usemarcon-replacement.test.js +55 -0
- package/src/cyrillux.js +19 -12
- package/src/{cyrillux.spec.js → cyrillux.test.js} +13 -14
- package/src/disambiguateSeriesStatements.js +2 -2
- package/src/{disambiguateSeriesStatements.spec.js → disambiguateSeriesStatements.test.js} +12 -13
- package/src/double-commas.js +1 -1
- package/src/{double-commas.spec.js → double-commas.test.js} +9 -11
- package/src/duplicates-ind1.js +1 -1
- package/src/{duplicates-ind1.spec.js → duplicates-ind1.test.js} +12 -13
- package/src/{empty-fields.spec.js → empty-fields.test.js} +11 -13
- package/src/ending-punctuation.js +1 -1
- package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +172 -173
- package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
- package/src/field-008-18-34-character-groups.js +2 -2
- package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
- package/src/field-505-separators.js +3 -3
- package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
- package/src/field-521-fix.js +2 -2
- package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
- package/src/field-exclusion.js +1 -1
- package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
- package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
- package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
- package/src/fix-33X.js +4 -4
- package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
- package/src/fix-country-codes.js +1 -1
- package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
- package/src/fix-language-codes.js +5 -5
- package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
- package/src/fixRelatorTerms.js +5 -5
- package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
- package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
- package/src/identical-fields.js +1 -1
- package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
- package/src/indicator-fixes.js +3 -3
- package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
- package/src/isbn-issn.js +1 -1
- package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
- package/src/{item-language.spec.js → item-language.test.js} +21 -22
- package/src/merge-fields/controlSubfields.js +1 -1
- package/src/merge-fields/counterpartField.js +8 -9
- package/src/merge-fields/index.js +1 -1
- package/src/merge-fields/mergableIndicator.js +1 -1
- package/src/merge-fields/mergeField.js +6 -6
- package/src/merge-fields/mergeIndicator.js +1 -1
- package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
- package/src/merge-fields/mergeOrAddSubfield.js +2 -2
- package/src/merge-fields/mergeSubfield.js +4 -4
- package/src/merge-fields/removeDuplicateSubfields.js +2 -2
- package/src/{merge-fields.spec.js → merge-fields.test.js} +12 -13
- package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
- package/src/mergeRelatorTermFields.js +5 -7
- package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
- package/src/modernize-502.js +1 -1
- package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
- package/src/multiple-subfield-0.js +3 -3
- package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
- package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
- package/src/normalize-dashes.js +2 -2
- package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
- package/src/normalize-identifiers.js +1 -1
- package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
- package/src/normalize-qualifying-information.js +2 -2
- package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
- package/src/normalize-utf8-diacritics.js +2 -2
- package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
- package/src/normalizeFieldForComparison.js +6 -6
- package/src/normalizeSubfieldValueForComparison.js +1 -1
- package/src/prepublicationUtils.js +4 -4
- package/src/punctuation/index.js +1 -1
- package/src/punctuation/rules/index.js +2 -2
- package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
- package/src/punctuation2.js +4 -4
- package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
- package/src/reindexSubfield6OccurenceNumbers.js +5 -7
- package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
- package/src/removeDuplicateDataFields.js +11 -19
- package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
- package/src/removeInferiorDataFields.js +11 -11
- package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
- package/src/resolvable-ext-references-melinda.js +1 -1
- package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
- package/src/resolveOrphanedSubfield6s.js +5 -5
- package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
- package/src/sanitize-vocabulary-source-codes.js +4 -4
- package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
- package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
- package/src/sortFields.js +4 -4
- package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
- package/src/sortRelatorTerms.js +3 -3
- package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
- package/src/sortSubfields.js +1 -1
- package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
- package/src/stripPunctuation.js +3 -3
- package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
- package/src/subfield-exclusion.js +1 -1
- package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
- package/src/subfield6Utils.js +6 -10
- package/src/subfield8Utils.js +4 -4
- package/src/subfieldValueNormalizations.js +3 -3
- package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
- package/src/sync-007-and-300.js +2 -2
- package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
- package/src/translate-terms.js +3 -3
- package/src/{translate-terms.spec.js → translate-terms.test.js} +13 -13
- package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
- package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
- package/src/update-field-540.js +2 -2
- package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
- package/src/urn.js +2 -2
- package/src/{urn.spec.js → urn.test.js} +12 -13
- package/src/utils.js +3 -3
- package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
- package/test-fixtures/field-505-separators/03/record.json +3 -0
- package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
- package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
- package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
- package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
- package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
- package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
- package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
- package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
- package/dist/access-rights.spec.js +0 -195
- package/dist/access-rights.spec.js.map +0 -1
- package/dist/addMissingField041.spec.js +0 -45
- package/dist/addMissingField041.spec.js.map +0 -1
- package/dist/addMissingField336.spec.js +0 -45
- package/dist/addMissingField336.spec.js.map +0 -1
- package/dist/addMissingField337.spec.js +0 -43
- package/dist/addMissingField337.spec.js.map +0 -1
- package/dist/addMissingField338.spec.js +0 -45
- package/dist/addMissingField338.spec.js.map +0 -1
- package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
- package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
- package/dist/cyrillux.spec.js +0 -46
- package/dist/cyrillux.spec.js.map +0 -1
- package/dist/disambiguateSeriesStatements.spec.js +0 -51
- package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
- package/dist/double-commas.spec.js +0 -73
- package/dist/double-commas.spec.js.map +0 -1
- package/dist/duplicates-ind1.spec.js +0 -45
- package/dist/duplicates-ind1.spec.js.map +0 -1
- package/dist/empty-fields.spec.js +0 -118
- package/dist/empty-fields.spec.js.map +0 -1
- package/dist/ending-punctuation.spec.js +0 -2654
- package/dist/ending-punctuation.spec.js.map +0 -1
- package/dist/ending-whitespace.spec.js +0 -42
- package/dist/ending-whitespace.spec.js.map +0 -1
- package/dist/field-008-18-34-character-groups.spec.js +0 -51
- package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
- package/dist/field-505-separators.spec.js +0 -51
- package/dist/field-505-separators.spec.js.map +0 -1
- package/dist/field-521-fix.spec.js +0 -51
- package/dist/field-521-fix.spec.js.map +0 -1
- package/dist/field-exclusion.spec.js +0 -1054
- package/dist/field-exclusion.spec.js.map +0 -1
- package/dist/field-structure.spec.js +0 -535
- package/dist/field-structure.spec.js.map +0 -1
- package/dist/fields-present.spec.js +0 -121
- package/dist/fields-present.spec.js.map +0 -1
- package/dist/fix-33X.spec.js +0 -45
- package/dist/fix-33X.spec.js.map +0 -1
- package/dist/fix-country-codes.spec.js +0 -51
- package/dist/fix-country-codes.spec.js.map +0 -1
- package/dist/fix-language-codes.spec.js +0 -44
- package/dist/fix-language-codes.spec.js.map +0 -1
- package/dist/fixRelatorTerms.spec.js +0 -51
- package/dist/fixRelatorTerms.spec.js.map +0 -1
- package/dist/fixed-fields.spec.js +0 -140
- package/dist/fixed-fields.spec.js.map +0 -1
- package/dist/identical-fields.spec.js +0 -99
- package/dist/identical-fields.spec.js.map +0 -1
- package/dist/indicator-fixes.spec.js +0 -51
- package/dist/indicator-fixes.spec.js.map +0 -1
- package/dist/isbn-issn.spec.js +0 -595
- package/dist/isbn-issn.spec.js.map +0 -1
- package/dist/item-language.spec.js +0 -306
- package/dist/item-language.spec.js.map +0 -1
- package/dist/melindaCustomMergeFields.json +0 -5120
- package/dist/merge-fields.spec.js +0 -51
- package/dist/merge-fields.spec.js.map +0 -1
- package/dist/mergeField500Lisapainokset.spec.js +0 -51
- package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
- package/dist/mergeRelatorTermFields.spec.js +0 -51
- package/dist/mergeRelatorTermFields.spec.js.map +0 -1
- package/dist/modernize-502.spec.js +0 -49
- package/dist/modernize-502.spec.js.map +0 -1
- package/dist/multiple-subfield-0.spec.js +0 -51
- package/dist/multiple-subfield-0.spec.js.map +0 -1
- package/dist/non-breaking-space.spec.js +0 -42
- package/dist/non-breaking-space.spec.js.map +0 -1
- package/dist/normalize-dashes.spec.js +0 -51
- package/dist/normalize-dashes.spec.js.map +0 -1
- package/dist/normalize-identifiers.spec.js +0 -51
- package/dist/normalize-identifiers.spec.js.map +0 -1
- package/dist/normalize-qualifying-information.spec.js +0 -51
- package/dist/normalize-qualifying-information.spec.js.map +0 -1
- package/dist/normalize-utf8-diacritics.spec.js +0 -51
- package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
- package/dist/punctuation.spec.js +0 -51
- package/dist/punctuation.spec.js.map +0 -1
- package/dist/punctuation2.spec.js +0 -51
- package/dist/punctuation2.spec.js.map +0 -1
- package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
- package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
- package/dist/removeDuplicateDataFields.spec.js +0 -51
- package/dist/removeDuplicateDataFields.spec.js.map +0 -1
- package/dist/removeInferiorDataFields.spec.js +0 -51
- package/dist/removeInferiorDataFields.spec.js.map +0 -1
- package/dist/resolvable-ext-references-melinda.spec.js +0 -166
- package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
- package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
- package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
- package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
- package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
- package/dist/sort-tags.spec.js +0 -207
- package/dist/sort-tags.spec.js.map +0 -1
- package/dist/sortFields.spec.js +0 -51
- package/dist/sortFields.spec.js.map +0 -1
- package/dist/sortRelatorTerms.spec.js +0 -51
- package/dist/sortRelatorTerms.spec.js.map +0 -1
- package/dist/sortSubfields.spec.js +0 -52
- package/dist/sortSubfields.spec.js.map +0 -1
- package/dist/stripPunctuation.spec.js +0 -51
- package/dist/stripPunctuation.spec.js.map +0 -1
- package/dist/subfield-exclusion.spec.js +0 -523
- package/dist/subfield-exclusion.spec.js.map +0 -1
- package/dist/subfieldValueNormalizations.spec.js +0 -51
- package/dist/subfieldValueNormalizations.spec.js.map +0 -1
- package/dist/sync-007-and-300.spec.js +0 -51
- package/dist/sync-007-and-300.spec.js.map +0 -1
- package/dist/translate-terms.spec.js +0 -51
- package/dist/translate-terms.spec.js.map +0 -1
- package/dist/typeOfDate-008.spec.js +0 -47
- package/dist/typeOfDate-008.spec.js.map +0 -1
- package/dist/unicode-decomposition.spec.js +0 -91
- package/dist/unicode-decomposition.spec.js.map +0 -1
- package/dist/update-field-540.spec.js +0 -51
- package/dist/update-field-540.spec.js.map +0 -1
- package/dist/urn.spec.js +0 -52
- package/dist/urn.spec.js.map +0 -1
- package/src/cyrillux-usemarcon-replacement.spec.js +0 -47
|
@@ -1,72 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
var _utils = require("../utils");
|
|
9
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
-
// Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...
|
|
11
|
-
|
|
12
|
-
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:merge-fields:mergeIndicator');
|
|
13
|
-
//const debugData = debug.extend('data');
|
|
14
|
-
const debugDev = debug.extend('dev');
|
|
15
|
-
const ind1NonFilingChars = ['130', '630', '730', '740'];
|
|
16
|
-
const ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];
|
|
17
|
-
function mergeIndicators(toField, fromField, config) {
|
|
18
|
-
// NB! For non-filing indicators we deem that bigger is better. This is a bit quick'n'dirty, as usual.
|
|
19
|
-
// We could and should checks the relevant article length (using language information whilst doing it).
|
|
20
|
-
// However, this is a task for record internal fixer, not merge.
|
|
21
|
-
//
|
|
22
|
-
// For other indicators the situation is trickier, as we don't know which one is the good value.
|
|
23
|
-
//
|
|
24
|
-
// NB! We could add fixes for various other indicator types as well. However, it gets quickly pretty ad hoc.
|
|
25
|
-
// nvdebug(fieldToString(toField), debugDev);
|
|
26
|
-
// nvdebug(fieldToString(fromField), debugDev);
|
|
27
|
-
|
|
1
|
+
import createDebugLogger from "debug";
|
|
2
|
+
import { fieldToString, marc21GetTagsLegalInd1Value, marc21GetTagsLegalInd2Value, nvdebug } from "../utils.js";
|
|
3
|
+
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:merge-fields:mergeIndicator");
|
|
4
|
+
const debugDev = debug.extend("dev");
|
|
5
|
+
const ind1NonFilingChars = ["130", "630", "730", "740"];
|
|
6
|
+
const ind2NonFilingChars = ["222", "240", "242", "243", "245", "830"];
|
|
7
|
+
export function mergeIndicators(toField, fromField, config) {
|
|
28
8
|
mergeIndicator1(toField, fromField, config);
|
|
29
9
|
mergeIndicator2(toField, fromField, config);
|
|
30
|
-
function getIndicatorPreferredValues(tag, indicatorNumber,
|
|
31
|
-
const cands = getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber,
|
|
32
|
-
|
|
33
|
-
// Example: field 506 might return {"0": 1, "1": 1, " ": 2}
|
|
34
|
-
// Here indicator values '0' and '1' share top priority 1, and '#' is of lesser importance, namely 2.
|
|
35
|
-
if (Array.isArray(cands) || typeof cands === 'object') {
|
|
10
|
+
function getIndicatorPreferredValues(tag, indicatorNumber, config2) {
|
|
11
|
+
const cands = getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config2);
|
|
12
|
+
if (Array.isArray(cands) || typeof cands === "object") {
|
|
36
13
|
return cands;
|
|
37
14
|
}
|
|
38
|
-
if (typeof cands ===
|
|
39
|
-
|
|
40
|
-
return cands.split('');
|
|
15
|
+
if (typeof cands === "string") {
|
|
16
|
+
return cands.split("");
|
|
41
17
|
}
|
|
42
18
|
return [];
|
|
43
|
-
function getIndicatorPreferredValuesForGivenTag(
|
|
44
|
-
const preferredValues =
|
|
45
|
-
|
|
19
|
+
function getIndicatorPreferredValuesForGivenTag(tag2, indicatorNumber2, config3) {
|
|
20
|
+
const preferredValues = indicatorNumber2 === 1 ? config3.indicator1PreferredValues : config3.indicator2PreferredValues;
|
|
21
|
+
nvdebug(`${tag2} IND${indicatorNumber2}: get preferred values...
|
|
22
|
+
CONFIG: ${JSON.stringify(config3)}`, debugDev);
|
|
46
23
|
if (preferredValues) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return preferredValues[tag];
|
|
24
|
+
if (tag2 in preferredValues) {
|
|
25
|
+
return preferredValues[tag2];
|
|
50
26
|
}
|
|
51
27
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (indicatorNumber === 1 && ind1NonFilingChars.includes(tag)) {
|
|
55
|
-
return '9876543210 ';
|
|
28
|
+
if (indicatorNumber2 === 1 && ind1NonFilingChars.includes(tag2)) {
|
|
29
|
+
return "9876543210 ";
|
|
56
30
|
}
|
|
57
|
-
if (
|
|
58
|
-
return
|
|
31
|
+
if (indicatorNumber2 === 2 && ind2NonFilingChars.includes(tag2)) {
|
|
32
|
+
return "9876543210 ";
|
|
59
33
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (typeof cands === 'string' && cands.length === 1) {
|
|
65
|
-
// single cand
|
|
66
|
-
return [cands];
|
|
34
|
+
const cands2 = indicatorNumber2 === 1 ? marc21GetTagsLegalInd1Value(tag2) : marc21GetTagsLegalInd2Value(tag2);
|
|
35
|
+
if (cands2) {
|
|
36
|
+
if (typeof cands2 === "string" && cands2.length === 1) {
|
|
37
|
+
return [cands2];
|
|
67
38
|
}
|
|
68
|
-
if (Array.isArray(
|
|
69
|
-
return
|
|
39
|
+
if (Array.isArray(cands2) && cands2.length === 1) {
|
|
40
|
+
return cands2;
|
|
70
41
|
}
|
|
71
42
|
}
|
|
72
43
|
return [];
|
|
@@ -76,96 +47,71 @@ function mergeIndicators(toField, fromField, config) {
|
|
|
76
47
|
const i1 = scoreValue(preferences, val1);
|
|
77
48
|
const i2 = scoreValue(preferences, val2);
|
|
78
49
|
if (i1 === -1) {
|
|
79
|
-
return i2 === -1 ?
|
|
50
|
+
return i2 === -1 ? void 0 : val2;
|
|
80
51
|
}
|
|
81
52
|
if (i2 === -1) {
|
|
82
53
|
return val1;
|
|
83
54
|
}
|
|
84
|
-
// The sooner, the better:
|
|
85
55
|
return i1 < i2 ? val1 : val2;
|
|
86
|
-
function scoreValue(
|
|
87
|
-
if (Array.isArray(
|
|
88
|
-
return
|
|
56
|
+
function scoreValue(preferences2, val) {
|
|
57
|
+
if (Array.isArray(preferences2)) {
|
|
58
|
+
return preferences2.indexOf(val);
|
|
89
59
|
}
|
|
90
|
-
|
|
91
|
-
// (eg. 506 ind1 values '0' and '1' are equal but better than '#')
|
|
92
|
-
if (!(val in preferences)) {
|
|
60
|
+
if (!(val in preferences2)) {
|
|
93
61
|
return -1;
|
|
94
62
|
}
|
|
95
|
-
return
|
|
63
|
+
return preferences2[val];
|
|
96
64
|
}
|
|
97
65
|
}
|
|
98
66
|
function fieldIsFenniKept(field) {
|
|
99
|
-
return field.subfields && field.subfields.some(sf => sf.code ===
|
|
67
|
+
return field.subfields && field.subfields.some((sf) => sf.code === "9" && sf.value === "FENNI<KEEP>");
|
|
100
68
|
}
|
|
101
|
-
function mergeIndicator1(
|
|
102
|
-
if (
|
|
103
|
-
return;
|
|
69
|
+
function mergeIndicator1(toField2, fromField2, config2) {
|
|
70
|
+
if (toField2.ind1 === fromField2.ind1) {
|
|
71
|
+
return;
|
|
104
72
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
if (!fieldIsFenniKept(toField) && fieldIsFenniKept(fromField)) {
|
|
108
|
-
toField.ind1 = fromField.ind1;
|
|
73
|
+
if (!fieldIsFenniKept(toField2) && fieldIsFenniKept(fromField2)) {
|
|
74
|
+
toField2.ind1 = fromField2.ind1;
|
|
109
75
|
return;
|
|
110
76
|
}
|
|
111
|
-
const preferredValues = getIndicatorPreferredValues(
|
|
77
|
+
const preferredValues = getIndicatorPreferredValues(toField2.tag, 1, config2);
|
|
112
78
|
if (preferredValues) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
if (typeof preferredValue !== 'undefined') {
|
|
117
|
-
//nvdebug(`${preferredValue} WINS!`, debugDev);
|
|
118
|
-
toField.ind1 = preferredValue;
|
|
79
|
+
const preferredValue = getPreferredValue(preferredValues, fromField2.ind1, toField2.ind1);
|
|
80
|
+
if (typeof preferredValue !== "undefined") {
|
|
81
|
+
toField2.ind1 = preferredValue;
|
|
119
82
|
return;
|
|
120
83
|
}
|
|
121
|
-
//nvdebug(`No winner found indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);
|
|
122
|
-
//return;
|
|
123
84
|
}
|
|
124
|
-
//nvdebug(`TAG '${toField.tag}': No rule to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);
|
|
125
85
|
}
|
|
126
|
-
function publisherTagSwapHack(
|
|
127
|
-
|
|
128
|
-
// (Not sure whether our ind2 sanity check list should contain '4' (copyright year) as well:)
|
|
129
|
-
if (toField.tag !== '260' || fromField.tag !== '264' || !['0', '1', '2'].includes(fromField.ind2)) {
|
|
86
|
+
function publisherTagSwapHack(toField2, fromField2) {
|
|
87
|
+
if (toField2.tag !== "260" || fromField2.tag !== "264" || !["0", "1", "2"].includes(fromField2.ind2)) {
|
|
130
88
|
return;
|
|
131
89
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
(0, _utils.nvdebug)(`WARNING: can not change base 260 to 264 as it contains $e, $f and/or $g. Source IND2 info lost.`, debugDev);
|
|
137
|
-
(0, _utils.nvdebug)(` ${(0, _utils.fieldToString)(toField)}\n ${(0, _utils.fieldToString)(fromField)}`, debugDev);
|
|
90
|
+
if (toField2.subfields.some((sf) => ["e", "f", "g"].includes(sf.code))) {
|
|
91
|
+
nvdebug(`WARNING: can not change base 260 to 264 as it contains $e, $f and/or $g. Source IND2 info lost.`, debugDev);
|
|
92
|
+
nvdebug(` ${fieldToString(toField2)}
|
|
93
|
+
${fieldToString(fromField2)}`, debugDev);
|
|
138
94
|
return;
|
|
139
95
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
toField.ind2 = fromField.ind2;
|
|
96
|
+
nvdebug(`Apply base 260->264 tag swap hack`, debugDev);
|
|
97
|
+
nvdebug(` ${fieldToString(toField2)}
|
|
98
|
+
${fieldToString(fromField2)}`, debugDev);
|
|
99
|
+
toField2.tag = "264";
|
|
100
|
+
toField2.ind2 = fromField2.ind2;
|
|
146
101
|
}
|
|
147
|
-
function mergeIndicator2(
|
|
148
|
-
if (
|
|
149
|
-
return;
|
|
102
|
+
function mergeIndicator2(toField2, fromField2, config2) {
|
|
103
|
+
if (toField2.ind2 === fromField2.ind2) {
|
|
104
|
+
return;
|
|
150
105
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
//nvdebug(` ${fieldToString(toField)}\n ${fieldToString(fromField)}`, debugDev);
|
|
154
|
-
|
|
155
|
-
publisherTagSwapHack(toField, fromField); // Easter egg/hack for base-260 vs source-264
|
|
156
|
-
|
|
157
|
-
// If source contains $9 FENNI<KEEP>, we might prefer it?
|
|
158
|
-
|
|
159
|
-
//nvdebug(`Try to merge indicator 2: '${toField.ind2}' vs '${fromField.ind2}'`, debugDev);
|
|
160
|
-
const preferredValues = getIndicatorPreferredValues(toField.tag, 2, config);
|
|
106
|
+
publisherTagSwapHack(toField2, fromField2);
|
|
107
|
+
const preferredValues = getIndicatorPreferredValues(toField2.tag, 2, config2);
|
|
161
108
|
if (preferredValues) {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
toField.ind2 = preferredValue;
|
|
109
|
+
const preferredValue = getPreferredValue(preferredValues, fromField2.ind2, toField2.ind2);
|
|
110
|
+
if (typeof preferredValue !== "undefined") {
|
|
111
|
+
toField2.ind2 = preferredValue;
|
|
166
112
|
return;
|
|
167
113
|
}
|
|
168
114
|
}
|
|
169
115
|
}
|
|
170
116
|
}
|
|
171
|
-
//# sourceMappingURL=mergeIndicator.js.map
|
|
117
|
+
//# sourceMappingURL=mergeIndicator.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{"version":3,"file":"mergeIndicator.js","names":["_debug","_interopRequireDefault","require","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","ind1NonFilingChars","ind2NonFilingChars","mergeIndicators","toField","fromField","config","mergeIndicator1","mergeIndicator2","getIndicatorPreferredValues","tag","indicatorNumber","cands","getIndicatorPreferredValuesForGivenTag","Array","isArray","split","preferredValues","indicator1PreferredValues","indicator2PreferredValues","nvdebug","JSON","stringify","includes","marc21GetTagsLegalInd1Value","marc21GetTagsLegalInd2Value","length","getPreferredValue","preferences","val1","val2","i1","scoreValue","i2","undefined","val","indexOf","fieldIsFenniKept","field","subfields","some","sf","code","value","ind1","preferredValue","publisherTagSwapHack","ind2","fieldToString"],"sources":["../../src/merge-fields/mergeIndicator.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToString, marc21GetTagsLegalInd1Value, marc21GetTagsLegalInd2Value, nvdebug} from '../utils';\n\n// Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:merge-fields:mergeIndicator');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst ind1NonFilingChars = ['130', '630', '730', '740'];\nconst ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];\n\n\nexport function mergeIndicators(toField, fromField, config) {\n // NB! For non-filing indicators we deem that bigger is better. This is a bit quick'n'dirty, as usual.\n // We could and should checks the relevant article length (using language information whilst doing it).\n // However, this is a task for record internal fixer, not merge.\n //\n // For other indicators the situation is trickier, as we don't know which one is the good value.\n //\n // NB! We could add fixes for various other indicator types as well. However, it gets quickly pretty ad hoc.\n // nvdebug(fieldToString(toField), debugDev);\n // nvdebug(fieldToString(fromField), debugDev);\n\n mergeIndicator1(toField, fromField, config);\n mergeIndicator2(toField, fromField, config);\n\n function getIndicatorPreferredValues(tag, indicatorNumber, config) {\n const cands = getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config);\n // More complex systems where multiple indicators have same priority are objects.\n // Example: field 506 might return {\"0\": 1, \"1\": 1, \" \": 2}\n // Here indicator values '0' and '1' share top priority 1, and '#' is of lesser importance, namely 2.\n if (Array.isArray(cands) || typeof cands === 'object') {\n return cands;\n }\n if (typeof cands === 'string') { // single cand as string (seen in json in the past), though now they should all be arrays\n return cands.split('');\n }\n\n return [];\n\n function getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config) {\n const preferredValues = indicatorNumber === 1 ? config.indicator1PreferredValues : config.indicator2PreferredValues;\n nvdebug(`${tag} IND${indicatorNumber}: get preferred values...\\nCONFIG: ${JSON.stringify(config)}`, debugDev);\n if (preferredValues) {\n //nvdebug(`${tag} PREF VALS: ${JSON.stringify(preferredValues)}`, debugDev);\n if (tag in preferredValues) {\n return preferredValues[tag];\n }\n }\n\n // Easter Egg #1: Use good-ish hard-coded defaults as not defined by user:\n if (indicatorNumber === 1 && ind1NonFilingChars.includes(tag)) {\n return '9876543210 ';\n }\n if (indicatorNumber === 2 && ind2NonFilingChars.includes(tag)) {\n return '9876543210 ';\n }\n\n // Easter Egg #2: Marc21 standard has just one value for given indicator, so prefer it:\n const cands = indicatorNumber === 1 ? marc21GetTagsLegalInd1Value(tag) : marc21GetTagsLegalInd2Value(tag);\n if (cands) {\n if (typeof cands === 'string' && cands.length === 1) { // single cand\n return [cands];\n }\n if (Array.isArray(cands) && cands.length === 1) {\n return cands;\n }\n }\n\n return [];\n }\n }\n\n function getPreferredValue(preferences, val1, val2) {\n const i1 = scoreValue(preferences, val1);\n const i2 = scoreValue(preferences, val2);\n if (i1 === -1) {\n return i2 === -1 ? undefined : val2;\n }\n if (i2 === -1) {\n return val1;\n }\n // The sooner, the better:\n return i1 < i2 ? val1 : val2;\n\n function scoreValue(preferences, val) {\n if (Array.isArray(preferences)) {\n return preferences.indexOf(val);\n }\n // preferences may be an object, since diffent values can return same score\n // (eg. 506 ind1 values '0' and '1' are equal but better than '#')\n if (!(val in preferences)) {\n return -1;\n }\n return preferences[val];\n }\n }\n\n\n function fieldIsFenniKept(field) {\n return field.subfields && field.subfields.some(sf => sf.code === '9' && sf.value === 'FENNI<KEEP>');\n }\n\n function mergeIndicator1(toField, fromField, config) {\n if (toField.ind1 === fromField.ind1) {\n return; // Do nothing\n }\n\n // MRA-300: If source contains the (un)holy $9 FENNI<KEEP>, we prefer that value regardless of whatever...\n if (!fieldIsFenniKept(toField) && fieldIsFenniKept(fromField)) {\n toField.ind1 = fromField.ind1;\n return;\n }\n\n\n const preferredValues = getIndicatorPreferredValues(toField.tag, 1, config);\n\n if (preferredValues) {\n //nvdebug(`Try to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}'`, debugDev);\n //nvdebug(`PREF VALS: ${preferredValues}`, debugDev);\n const preferredValue = getPreferredValue(preferredValues, fromField.ind1, toField.ind1);\n if (typeof preferredValue !== 'undefined') {\n //nvdebug(`${preferredValue} WINS!`, debugDev);\n toField.ind1 = preferredValue;\n return;\n }\n //nvdebug(`No winner found indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);\n //return;\n }\n //nvdebug(`TAG '${toField.tag}': No rule to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);\n }\n\n\n function publisherTagSwapHack(toField, fromField) {\n // NB! Note that field 264.ind2==3 maps to $efg in field 260, so it is not relevant *here*:\n // (Not sure whether our ind2 sanity check list should contain '4' (copyright year) as well:)\n if (toField.tag !== '260' || fromField.tag !== '264' || !['0', '1', '2'].includes(fromField.ind2)) {\n return;\n }\n // Field 264 IND2 contains information that can not be coded into field 260.\n\n // However, 260 contains data that cannot be converted to 264 as well\n if (toField.subfields.some(sf => ['e', 'f', 'g'].includes(sf.code))) {\n nvdebug(`WARNING: can not change base 260 to 264 as it contains $e, $f and/or $g. Source IND2 info lost.`, debugDev);\n nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n return;\n }\n\n // Convert 260 to 264 so that no information is lost:\n nvdebug(`Apply base 260->264 tag swap hack`, debugDev);\n nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n\n toField.tag = '264';\n toField.ind2 = fromField.ind2;\n }\n\n function mergeIndicator2(toField, fromField, config) {\n if (toField.ind2 === fromField.ind2) {\n return; // Do nothing\n }\n\n //nvdebug(`Merge IND2`, debugDev);\n //nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n\n\n publisherTagSwapHack(toField, fromField); // Easter egg/hack for base-260 vs source-264\n\n // If source contains $9 FENNI<KEEP>, we might prefer it?\n\n //nvdebug(`Try to merge indicator 2: '${toField.ind2}' vs '${fromField.ind2}'`, debugDev);\n const preferredValues = getIndicatorPreferredValues(toField.tag, 2, config);\n\n if (preferredValues) {\n //nvdebug(` Try to merge indicator 2. Got preferred values '${preferredValues}'`, debugDev);\n const preferredValue = getPreferredValue(preferredValues, fromField.ind2, toField.ind2);\n if (typeof preferredValue !== 'undefined') {\n toField.ind2 = preferredValue;\n return;\n }\n }\n\n }\n\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/merge-fields/mergeIndicator.js"],
|
|
4
|
+
"sourcesContent": ["import createDebugLogger from 'debug';\nimport {fieldToString, marc21GetTagsLegalInd1Value, marc21GetTagsLegalInd2Value, nvdebug} from '../utils.js';\n\n// Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:merge-fields:mergeIndicator');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst ind1NonFilingChars = ['130', '630', '730', '740'];\nconst ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];\n\n\nexport function mergeIndicators(toField, fromField, config) {\n // NB! For non-filing indicators we deem that bigger is better. This is a bit quick'n'dirty, as usual.\n // We could and should checks the relevant article length (using language information whilst doing it).\n // However, this is a task for record internal fixer, not merge.\n //\n // For other indicators the situation is trickier, as we don't know which one is the good value.\n //\n // NB! We could add fixes for various other indicator types as well. However, it gets quickly pretty ad hoc.\n // nvdebug(fieldToString(toField), debugDev);\n // nvdebug(fieldToString(fromField), debugDev);\n\n mergeIndicator1(toField, fromField, config);\n mergeIndicator2(toField, fromField, config);\n\n function getIndicatorPreferredValues(tag, indicatorNumber, config) {\n const cands = getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config);\n // More complex systems where multiple indicators have same priority are objects.\n // Example: field 506 might return {\"0\": 1, \"1\": 1, \" \": 2}\n // Here indicator values '0' and '1' share top priority 1, and '#' is of lesser importance, namely 2.\n if (Array.isArray(cands) || typeof cands === 'object') {\n return cands;\n }\n if (typeof cands === 'string') { // single cand as string (seen in json in the past), though now they should all be arrays\n return cands.split('');\n }\n\n return [];\n\n function getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config) {\n const preferredValues = indicatorNumber === 1 ? config.indicator1PreferredValues : config.indicator2PreferredValues;\n nvdebug(`${tag} IND${indicatorNumber}: get preferred values...\\nCONFIG: ${JSON.stringify(config)}`, debugDev);\n if (preferredValues) {\n //nvdebug(`${tag} PREF VALS: ${JSON.stringify(preferredValues)}`, debugDev);\n if (tag in preferredValues) {\n return preferredValues[tag];\n }\n }\n\n // Easter Egg #1: Use good-ish hard-coded defaults as not defined by user:\n if (indicatorNumber === 1 && ind1NonFilingChars.includes(tag)) {\n return '9876543210 ';\n }\n if (indicatorNumber === 2 && ind2NonFilingChars.includes(tag)) {\n return '9876543210 ';\n }\n\n // Easter Egg #2: Marc21 standard has just one value for given indicator, so prefer it:\n const cands = indicatorNumber === 1 ? marc21GetTagsLegalInd1Value(tag) : marc21GetTagsLegalInd2Value(tag);\n if (cands) {\n if (typeof cands === 'string' && cands.length === 1) { // single cand\n return [cands];\n }\n if (Array.isArray(cands) && cands.length === 1) {\n return cands;\n }\n }\n\n return [];\n }\n }\n\n function getPreferredValue(preferences, val1, val2) {\n const i1 = scoreValue(preferences, val1);\n const i2 = scoreValue(preferences, val2);\n if (i1 === -1) {\n return i2 === -1 ? undefined : val2;\n }\n if (i2 === -1) {\n return val1;\n }\n // The sooner, the better:\n return i1 < i2 ? val1 : val2;\n\n function scoreValue(preferences, val) {\n if (Array.isArray(preferences)) {\n return preferences.indexOf(val);\n }\n // preferences may be an object, since diffent values can return same score\n // (eg. 506 ind1 values '0' and '1' are equal but better than '#')\n if (!(val in preferences)) {\n return -1;\n }\n return preferences[val];\n }\n }\n\n\n function fieldIsFenniKept(field) {\n return field.subfields && field.subfields.some(sf => sf.code === '9' && sf.value === 'FENNI<KEEP>');\n }\n\n function mergeIndicator1(toField, fromField, config) {\n if (toField.ind1 === fromField.ind1) {\n return; // Do nothing\n }\n\n // MRA-300: If source contains the (un)holy $9 FENNI<KEEP>, we prefer that value regardless of whatever...\n if (!fieldIsFenniKept(toField) && fieldIsFenniKept(fromField)) {\n toField.ind1 = fromField.ind1;\n return;\n }\n\n\n const preferredValues = getIndicatorPreferredValues(toField.tag, 1, config);\n\n if (preferredValues) {\n //nvdebug(`Try to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}'`, debugDev);\n //nvdebug(`PREF VALS: ${preferredValues}`, debugDev);\n const preferredValue = getPreferredValue(preferredValues, fromField.ind1, toField.ind1);\n if (typeof preferredValue !== 'undefined') {\n //nvdebug(`${preferredValue} WINS!`, debugDev);\n toField.ind1 = preferredValue;\n return;\n }\n //nvdebug(`No winner found indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);\n //return;\n }\n //nvdebug(`TAG '${toField.tag}': No rule to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);\n }\n\n\n function publisherTagSwapHack(toField, fromField) {\n // NB! Note that field 264.ind2==3 maps to $efg in field 260, so it is not relevant *here*:\n // (Not sure whether our ind2 sanity check list should contain '4' (copyright year) as well:)\n if (toField.tag !== '260' || fromField.tag !== '264' || !['0', '1', '2'].includes(fromField.ind2)) {\n return;\n }\n // Field 264 IND2 contains information that can not be coded into field 260.\n\n // However, 260 contains data that cannot be converted to 264 as well\n if (toField.subfields.some(sf => ['e', 'f', 'g'].includes(sf.code))) {\n nvdebug(`WARNING: can not change base 260 to 264 as it contains $e, $f and/or $g. Source IND2 info lost.`, debugDev);\n nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n return;\n }\n\n // Convert 260 to 264 so that no information is lost:\n nvdebug(`Apply base 260->264 tag swap hack`, debugDev);\n nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n\n toField.tag = '264';\n toField.ind2 = fromField.ind2;\n }\n\n function mergeIndicator2(toField, fromField, config) {\n if (toField.ind2 === fromField.ind2) {\n return; // Do nothing\n }\n\n //nvdebug(`Merge IND2`, debugDev);\n //nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n\n\n publisherTagSwapHack(toField, fromField); // Easter egg/hack for base-260 vs source-264\n\n // If source contains $9 FENNI<KEEP>, we might prefer it?\n\n //nvdebug(`Try to merge indicator 2: '${toField.ind2}' vs '${fromField.ind2}'`, debugDev);\n const preferredValues = getIndicatorPreferredValues(toField.tag, 2, config);\n\n if (preferredValues) {\n //nvdebug(` Try to merge indicator 2. Got preferred values '${preferredValues}'`, debugDev);\n const preferredValue = getPreferredValue(preferredValues, fromField.ind2, toField.ind2);\n if (typeof preferredValue !== 'undefined') {\n toField.ind2 = preferredValue;\n return;\n }\n }\n\n }\n\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["config", "tag", "indicatorNumber", "cands", "preferences", "toField", "fromField"]
|
|
7
|
+
}
|
|
@@ -1,32 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
exports.postprocessRecords = postprocessRecords;
|
|
7
|
-
var _punctuation = require("../punctuation2");
|
|
8
|
-
var _removeDuplicateSubfields = require("./removeDuplicateSubfields");
|
|
9
|
-
var _sortSubfields = require("../sortSubfields");
|
|
10
|
-
var _sortRelatorTerms = require("../sortRelatorTerms");
|
|
11
|
-
// This field should be renamed, as it is called also from outside megre.
|
|
12
|
-
|
|
13
|
-
//import {MarcRecord} from '@natlibfi/marc-record';
|
|
14
|
-
|
|
1
|
+
import { fieldFixPunctuation } from "../punctuation2.js";
|
|
2
|
+
import { fieldRemoveDuplicateSubfields } from "./removeDuplicateSubfields.js";
|
|
3
|
+
import { sortAdjacentSubfields } from "../sortSubfields.js";
|
|
4
|
+
import { sortAdjacentRelatorTerms } from "../sortRelatorTerms.js";
|
|
15
5
|
function postprocessBaseRecord(base) {
|
|
16
|
-
base.fields.forEach(field => {
|
|
17
|
-
// NB! Relator terms are now expanded and translated already at preprocess stage!
|
|
18
|
-
|
|
19
|
-
// remove merge-specific information:
|
|
6
|
+
base.fields.forEach((field) => {
|
|
20
7
|
if (field.merged) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
(
|
|
26
|
-
(0, _punctuation.fieldFixPunctuation)(field); // NB! This will fix only fields with merged content
|
|
27
|
-
(0, _sortSubfields.sortAdjacentSubfields)(field); // Put the added $e subfield to proper places.
|
|
28
|
-
(0, _sortRelatorTerms.sortAdjacentRelatorTerms)(field); // Sort $e subfields with each other
|
|
29
|
-
(0, _punctuation.fieldFixPunctuation)(field);
|
|
8
|
+
fieldRemoveDuplicateSubfields(field);
|
|
9
|
+
fieldFixPunctuation(field);
|
|
10
|
+
sortAdjacentSubfields(field);
|
|
11
|
+
sortAdjacentRelatorTerms(field);
|
|
12
|
+
fieldFixPunctuation(field);
|
|
30
13
|
delete field.merged;
|
|
31
14
|
}
|
|
32
15
|
if (field.useExternalEndPunctuation) {
|
|
@@ -35,20 +18,13 @@ function postprocessBaseRecord(base) {
|
|
|
35
18
|
if (field.added) {
|
|
36
19
|
delete field.added;
|
|
37
20
|
}
|
|
38
|
-
|
|
39
|
-
/*
|
|
40
|
-
if (field.deleted) {
|
|
41
|
-
delete field.deleted;
|
|
42
|
-
}
|
|
43
|
-
*/
|
|
44
21
|
});
|
|
45
22
|
}
|
|
46
23
|
function removeDeletedFields(record) {
|
|
47
|
-
|
|
48
|
-
record.fields = record.fields.filter(f => !f.deleted);
|
|
24
|
+
record.fields = record.fields.filter((f) => !f.deleted);
|
|
49
25
|
}
|
|
50
|
-
function postprocessRecords(base, source) {
|
|
26
|
+
export function postprocessRecords(base, source) {
|
|
51
27
|
postprocessBaseRecord(base);
|
|
52
|
-
removeDeletedFields(source);
|
|
28
|
+
removeDeletedFields(source);
|
|
53
29
|
}
|
|
54
|
-
//# sourceMappingURL=mergeOrAddPostprocess.js.map
|
|
30
|
+
//# sourceMappingURL=mergeOrAddPostprocess.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/merge-fields/mergeOrAddPostprocess.js"],
|
|
4
|
+
"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.js';\nimport {fieldRemoveDuplicateSubfields} from './removeDuplicateSubfields.js';\nimport {sortAdjacentSubfields} from '../sortSubfields.js';\nimport {sortAdjacentRelatorTerms} from '../sortRelatorTerms.js';\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"],
|
|
5
|
+
"mappings": "AAGA,SAAQ,2BAA0B;AAClC,SAAQ,qCAAoC;AAC5C,SAAQ,6BAA4B;AACpC,SAAQ,gCAA+B;AAEvC,SAAS,sBAAsB,MAAM;AAEnC,OAAK,OAAO,QAAQ,WAAS;AAI3B,QAAI,MAAM,QAAQ;AAKhB,oCAA8B,KAAK;AACnC,0BAAoB,KAAK;AACzB,4BAAsB,KAAK;AAC3B,+BAAyB,KAAK;AAC9B,0BAAoB,KAAK;AAEzB,aAAO,MAAM;AAAA,IACf;AAEA,QAAI,MAAM,2BAA2B;AACnC,aAAO,MAAM;AAAA,IACf;AAEA,QAAI,MAAM,OAAO;AACf,aAAO,MAAM;AAAA,IACf;AAAA,EAQF,CAAC;AACH;AAGA,SAAS,oBAAoB,QAAQ;AAEnC,SAAO,SAAS,OAAO,OAAO,OAAO,OAAK,CAAC,EAAE,OAAO;AACtD;AAGO,gBAAS,mBAAmB,MAAM,QAAQ;AAC/C,wBAAsB,IAAI;AAC1B,sBAAoB,MAAM;AAC5B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|