@natlibfi/marc-record-validators-melinda 11.6.7 → 12.0.0-alpha.2
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/index.js +58 -58
- 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
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
3
|
+
import validatorFactory from "./merge-fields/index.js";
|
|
4
|
+
import { READERS } from "@natlibfi/fixura";
|
|
5
|
+
import generateTests from "@natlibfi/fixugen";
|
|
6
|
+
import createDebugLogger from "debug";
|
|
7
|
+
generateTests({
|
|
8
|
+
callback,
|
|
9
|
+
path: [import.meta.dirname, "..", "test-fixtures", "merge-fields"],
|
|
10
|
+
useMetadataFile: true,
|
|
11
|
+
recurse: false,
|
|
12
|
+
fixura: {
|
|
13
|
+
reader: READERS.JSON
|
|
14
|
+
},
|
|
15
|
+
hooks: {
|
|
16
|
+
before: async () => {
|
|
17
|
+
testValidatorFactory();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/merge-fields:test");
|
|
22
|
+
async function testValidatorFactory() {
|
|
23
|
+
const validator = await validatorFactory();
|
|
24
|
+
assert.equal(typeof validator, "object");
|
|
25
|
+
assert.equal(typeof validator.description, "string");
|
|
26
|
+
assert.equal(typeof validator.validate, "function");
|
|
27
|
+
}
|
|
28
|
+
async function callback({ getFixture, enabled = true, fix = false }) {
|
|
29
|
+
if (enabled === false) {
|
|
30
|
+
debug("TEST SKIPPED!");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const validator = await validatorFactory();
|
|
34
|
+
const record = new MarcRecord(getFixture("record.json"));
|
|
35
|
+
const expectedResult = getFixture("expectedResult.json");
|
|
36
|
+
if (!fix) {
|
|
37
|
+
const result = await validator.validate(record);
|
|
38
|
+
assert.deepEqual(result, expectedResult);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
await validator.fix(record);
|
|
42
|
+
assert.deepEqual(record, expectedResult);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=merge-fields.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/merge-fields.test.js"],
|
|
4
|
+
"sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './merge-fields/index.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'merge-fields'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/merge-fields:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAC1B,OAAO,uBAAuB;AAE9B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,cAAc;AAAA,EACjE,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AACD,MAAM,QAAQ,kBAAkB,4DAA4D;AAE5F,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;AAEA,eAAe,SAAS,EAAC,YAAY,UAAU,MAAM,MAAM,MAAK,GAAG;AACjE,MAAI,YAAY,OAAO;AACrB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,71 +1,46 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = _default;
|
|
7
|
-
exports.mergeLisapainokset = mergeLisapainokset;
|
|
8
|
-
function _default() {
|
|
1
|
+
export default function() {
|
|
9
2
|
return {
|
|
10
|
-
description:
|
|
3
|
+
description: "Merge 500 $a Lis\xE4painokset fields",
|
|
11
4
|
validate,
|
|
12
5
|
fix
|
|
13
6
|
};
|
|
14
7
|
function fix(record) {
|
|
15
|
-
const res = {
|
|
16
|
-
message: [],
|
|
17
|
-
fix: [],
|
|
18
|
-
valid: true
|
|
19
|
-
};
|
|
8
|
+
const res = { message: [], fix: [], valid: true };
|
|
20
9
|
mergeLisapainokset(record);
|
|
21
10
|
return res;
|
|
22
11
|
}
|
|
23
12
|
function validate(record) {
|
|
24
13
|
const relevantFields = getRelevantFields(record);
|
|
25
14
|
if (relevantFields.length < 2) {
|
|
26
|
-
return {
|
|
27
|
-
message: [],
|
|
28
|
-
'valid': true
|
|
29
|
-
}; // No action required
|
|
15
|
+
return { message: [], "valid": true };
|
|
30
16
|
}
|
|
31
17
|
const printData = extractAllPrintData(relevantFields);
|
|
32
18
|
if (printData.length === 0) {
|
|
33
|
-
return {
|
|
34
|
-
message: ['There are issues, but the fixer can not fix them!'],
|
|
35
|
-
'valid': false
|
|
36
|
-
}; // No action required
|
|
19
|
+
return { message: ["There are issues, but the fixer can not fix them!"], "valid": false };
|
|
37
20
|
}
|
|
38
|
-
return {
|
|
39
|
-
message: [`Fixer can merge ${relevantFields.length} 500 $a Lisäpainokset fields into one`],
|
|
40
|
-
'valid': false
|
|
41
|
-
};
|
|
21
|
+
return { message: [`Fixer can merge ${relevantFields.length} 500 $a Lis\xE4painokset fields into one`], "valid": false };
|
|
42
22
|
}
|
|
43
23
|
}
|
|
44
24
|
function getRelevantFields(record) {
|
|
45
|
-
return record.fields.filter(field => validLisapainosField(field));
|
|
25
|
+
return record.fields.filter((field) => validLisapainosField(field));
|
|
46
26
|
}
|
|
47
27
|
function validLisapainosField(field) {
|
|
48
|
-
|
|
49
|
-
// Especially $9 FENNI<KEEP> should not be merged!
|
|
50
|
-
if (field.tag !== '500' || field.subfields.length !== 1 || field.subfields[0].code !== 'a') {
|
|
28
|
+
if (field.tag !== "500" || field.subfields.length !== 1 || field.subfields[0].code !== "a") {
|
|
51
29
|
return false;
|
|
52
30
|
}
|
|
53
31
|
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);
|
|
54
32
|
}
|
|
55
33
|
function fieldToPrintsString(field) {
|
|
56
|
-
|
|
57
|
-
return field.subfields[0].value.replace(/^(?:Lisäpainokset|Lisäpainos): /u, '').replace(/\.$/u, '');
|
|
34
|
+
return field.subfields[0].value.replace(/^(?:Lisäpainokset|Lisäpainos): /u, "").replace(/\.$/u, "");
|
|
58
35
|
}
|
|
59
|
-
const printPreference = [
|
|
36
|
+
const printPreference = ["painos", "p.", "upplaga", "uppl."];
|
|
60
37
|
function getPrintPreference(value) {
|
|
61
|
-
return printPreference.findIndex(pp => pp === value);
|
|
38
|
+
return printPreference.findIndex((pp) => pp === value);
|
|
62
39
|
}
|
|
63
40
|
function mergePrintData(value1, value2) {
|
|
64
|
-
const [index1, print1, year1] = value1.split(
|
|
65
|
-
const [index2, print2, year2] = value2.split(
|
|
66
|
-
const betterIndex = index1 ? index1 : index2;
|
|
67
|
-
|
|
68
|
-
// merge print1 and print2
|
|
41
|
+
const [index1, print1, year1] = value1.split(" ");
|
|
42
|
+
const [index2, print2, year2] = value2.split(" ");
|
|
43
|
+
const betterIndex = index1 ? index1 : index2;
|
|
69
44
|
const betterPrint = getBetterPrint(print1, print2);
|
|
70
45
|
if (!betterPrint) {
|
|
71
46
|
return null;
|
|
@@ -84,12 +59,12 @@ function mergePrintData(value1, value2) {
|
|
|
84
59
|
}
|
|
85
60
|
return null;
|
|
86
61
|
}
|
|
87
|
-
function getBetterPrint(
|
|
88
|
-
if (
|
|
89
|
-
return
|
|
62
|
+
function getBetterPrint(print12, print22) {
|
|
63
|
+
if (print12 === print22) {
|
|
64
|
+
return print12;
|
|
90
65
|
}
|
|
91
|
-
const i1 = getPrintPreference(
|
|
92
|
-
const i2 = getPrintPreference(
|
|
66
|
+
const i1 = getPrintPreference(print12);
|
|
67
|
+
const i2 = getPrintPreference(print22);
|
|
93
68
|
if (i1 === -1 || i2 === -1) {
|
|
94
69
|
return null;
|
|
95
70
|
}
|
|
@@ -100,23 +75,20 @@ function mergePrintData(value1, value2) {
|
|
|
100
75
|
}
|
|
101
76
|
}
|
|
102
77
|
function extractAllPrintData(relevantFields) {
|
|
103
|
-
/* eslint-disable */
|
|
104
|
-
// Gather data about 500 $a Lisäpainokset.*
|
|
105
78
|
let allPrintData = [];
|
|
106
79
|
let i;
|
|
107
80
|
let j;
|
|
108
81
|
for (i = 0; i < relevantFields.length; i++) {
|
|
109
82
|
const value = fieldToPrintsString(relevantFields[i]);
|
|
110
|
-
const fieldsPrintData = value.split(
|
|
83
|
+
const fieldsPrintData = value.split(". - ");
|
|
111
84
|
for (j = 0; j < fieldsPrintData.length; j++) {
|
|
112
85
|
let currPrintData = fieldsPrintData[j];
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (allPrintData[printIndex] !== undefined) {
|
|
86
|
+
const [printIndex] = currPrintData.split(".");
|
|
87
|
+
if (allPrintData[printIndex] !== void 0) {
|
|
116
88
|
if (allPrintData[printIndex] !== currPrintData) {
|
|
117
89
|
const mergedPrintData = mergePrintData(allPrintData[printIndex], currPrintData);
|
|
118
90
|
if (!mergedPrintData) {
|
|
119
|
-
return [];
|
|
91
|
+
return [];
|
|
120
92
|
}
|
|
121
93
|
currPrintData = mergedPrintData;
|
|
122
94
|
}
|
|
@@ -125,9 +97,9 @@ function extractAllPrintData(relevantFields) {
|
|
|
125
97
|
}
|
|
126
98
|
}
|
|
127
99
|
;
|
|
128
|
-
return allPrintData.filter(p => p !==
|
|
100
|
+
return allPrintData.filter((p) => p !== void 0);
|
|
129
101
|
}
|
|
130
|
-
function mergeLisapainokset(record) {
|
|
102
|
+
export function mergeLisapainokset(record) {
|
|
131
103
|
const relevantFields = getRelevantFields(record);
|
|
132
104
|
if (relevantFields.length < 2) {
|
|
133
105
|
return;
|
|
@@ -136,9 +108,8 @@ function mergeLisapainokset(record) {
|
|
|
136
108
|
if (collapsedArray.length === 0) {
|
|
137
109
|
return;
|
|
138
110
|
}
|
|
139
|
-
const content = "
|
|
140
|
-
relevantFields[0].subfields[0].value = content;
|
|
141
|
-
|
|
111
|
+
const content = "Lis\xE4painokset: " + collapsedArray.join(". - ") + ".";
|
|
112
|
+
relevantFields[0].subfields[0].value = content;
|
|
142
113
|
relevantFields.forEach((field, index) => {
|
|
143
114
|
if (index > 0) {
|
|
144
115
|
record.removeField(field);
|
|
@@ -146,4 +117,4 @@ function mergeLisapainokset(record) {
|
|
|
146
117
|
}
|
|
147
118
|
});
|
|
148
119
|
}
|
|
149
|
-
//# sourceMappingURL=mergeField500Lisapainokset.js.map
|
|
120
|
+
//# sourceMappingURL=mergeField500Lisapainokset.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/mergeField500Lisapainokset.js"],
|
|
4
|
+
"sourcesContent": ["export default function () {\n\n return {\n description: 'Merge 500 $a Lis\u00E4painokset 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\u00E4painokset 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\u00E4painokset|Lis\u00E4painos): (?:[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\u00E4painokset|Lis\u00E4painos): /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\u00E4painokset.*\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\u00E4painokset: \" + 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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["print1", "print2"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
3
|
+
import validatorFactory from "./mergeField500Lisapainokset.js";
|
|
4
|
+
import { READERS } from "@natlibfi/fixura";
|
|
5
|
+
import generateTests from "@natlibfi/fixugen";
|
|
6
|
+
import createDebugLogger from "debug";
|
|
7
|
+
generateTests({
|
|
8
|
+
callback,
|
|
9
|
+
path: [import.meta.dirname, "..", "test-fixtures", "lisapainokset"],
|
|
10
|
+
useMetadataFile: true,
|
|
11
|
+
recurse: true,
|
|
12
|
+
fixura: {
|
|
13
|
+
reader: READERS.JSON
|
|
14
|
+
},
|
|
15
|
+
hooks: {
|
|
16
|
+
before: async () => {
|
|
17
|
+
testValidatorFactory();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/mergeField500Lisapainokset:test");
|
|
22
|
+
async function testValidatorFactory() {
|
|
23
|
+
const validator = await validatorFactory();
|
|
24
|
+
assert.equal(typeof validator, "object");
|
|
25
|
+
assert.equal(typeof validator.description, "string");
|
|
26
|
+
assert.equal(typeof validator.validate, "function");
|
|
27
|
+
}
|
|
28
|
+
async function callback({ getFixture, enabled = true, fix = false }) {
|
|
29
|
+
if (enabled === false) {
|
|
30
|
+
debug("TEST SKIPPED!");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const validator = await validatorFactory();
|
|
34
|
+
const record = new MarcRecord(getFixture("record.json"));
|
|
35
|
+
const expectedResult = getFixture("expectedResult.json");
|
|
36
|
+
if (!fix) {
|
|
37
|
+
const result = await validator.validate(record);
|
|
38
|
+
assert.deepEqual(result, expectedResult);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
await validator.fix(record);
|
|
42
|
+
assert.deepEqual(record, expectedResult);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=mergeField500Lisapainokset.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/mergeField500Lisapainokset.test.js"],
|
|
4
|
+
"sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './mergeField500Lisapainokset.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'lisapainokset'],\n useMetadataFile: true,\n recurse: true,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/mergeField500Lisapainokset:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAC1B,OAAO,uBAAuB;AAE9B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,eAAe;AAAA,EAClE,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AACD,MAAM,QAAQ,kBAAkB,0EAA0E;AAE1G,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;AAEA,eAAe,SAAS,EAAC,YAAY,UAAU,MAAM,MAAM,MAAK,GAAG;AACjE,MAAI,YAAY,OAAO;AACrB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,130 +1,94 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
var _clone = _interopRequireDefault(require("clone"));
|
|
8
|
-
var _punctuation = require("./punctuation2");
|
|
9
|
-
var _utils = require("./utils");
|
|
10
|
-
var _sortSubfields = require("./sortSubfields");
|
|
11
|
-
var _sortRelatorTerms = require("./sortRelatorTerms");
|
|
12
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
-
// Merge author/agent fields
|
|
14
|
-
//
|
|
15
|
-
// Rationale: Same author can appear in one 1XX and multiple 7XX fields having only different $e subfields.
|
|
16
|
-
// These fields can be merged (and $e-subfields can then be sorted)...
|
|
17
|
-
//
|
|
18
|
-
// Author(s): Nicholas Volk
|
|
19
|
-
|
|
20
|
-
//import createDebugLogger from 'debug';
|
|
21
|
-
/*
|
|
22
|
-
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:mergeRelatorTermFields');
|
|
23
|
-
//const debugData = debug.extend('data');
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
function _default() {
|
|
1
|
+
import clone from "clone";
|
|
2
|
+
import { fieldFixPunctuation, fieldStripPunctuation } from "./punctuation2.js";
|
|
3
|
+
import { fieldToString, nvdebug } from "./utils.js";
|
|
4
|
+
import { sortAdjacentSubfields } from "./sortSubfields.js";
|
|
5
|
+
import { sortAdjacentRelatorTerms, tagToRelatorTermSubfieldCode } from "./sortRelatorTerms.js";
|
|
6
|
+
export default function() {
|
|
27
7
|
return {
|
|
28
|
-
description:
|
|
8
|
+
description: "Merge author fields that only differ in $e relator terms",
|
|
29
9
|
validate,
|
|
30
10
|
fix
|
|
31
11
|
};
|
|
32
12
|
function fix(record) {
|
|
33
13
|
const msg = mergeRelatorTermFields(record, true);
|
|
34
|
-
const res = {
|
|
35
|
-
message: msg,
|
|
36
|
-
fix: msg,
|
|
37
|
-
valid: true
|
|
38
|
-
};
|
|
14
|
+
const res = { message: msg, fix: msg, valid: true };
|
|
39
15
|
return res;
|
|
40
16
|
}
|
|
41
17
|
function validate(record) {
|
|
42
18
|
const msg = mergeRelatorTermFields(record, false);
|
|
43
|
-
const res = {
|
|
44
|
-
message: msg
|
|
45
|
-
};
|
|
19
|
+
const res = { message: msg };
|
|
46
20
|
res.valid = !(res.message.length >= 1);
|
|
47
21
|
return res;
|
|
48
22
|
}
|
|
49
23
|
}
|
|
50
24
|
function createNormalizedClone(field) {
|
|
51
|
-
const clonedField = (
|
|
52
|
-
|
|
53
|
-
(0, _punctuation.fieldStripPunctuation)(clonedField);
|
|
25
|
+
const clonedField = clone(field);
|
|
26
|
+
fieldStripPunctuation(clonedField);
|
|
54
27
|
return clonedField;
|
|
55
28
|
}
|
|
56
29
|
function createNormalizedCloneWithoutRelatorTerms(field) {
|
|
57
30
|
const clonedField = createNormalizedClone(field);
|
|
58
|
-
|
|
59
|
-
clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e');
|
|
31
|
+
clonedField.subfields = clonedField.subfields.filter((sf) => sf.code !== "e");
|
|
60
32
|
return clonedField;
|
|
61
33
|
}
|
|
62
34
|
function getRelatorTermStrings(relatorTermSubfieldCode, field) {
|
|
63
|
-
return field.subfields.filter(sf => sf.code === relatorTermSubfieldCode).map(sf => sf.value);
|
|
35
|
+
return field.subfields.filter((sf) => sf.code === relatorTermSubfieldCode).map((sf) => sf.value);
|
|
64
36
|
}
|
|
65
37
|
function extractAddableRelatorTerms(fromField, toField) {
|
|
66
|
-
const relatorTermSubfieldCode =
|
|
38
|
+
const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);
|
|
67
39
|
const normalizedFromFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, fromField);
|
|
68
40
|
if (normalizedFromFieldRelatorTerms.length === 0) {
|
|
69
41
|
return [];
|
|
70
42
|
}
|
|
71
|
-
// Remove values that already exist:
|
|
72
43
|
const normalizedToFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, toField);
|
|
73
|
-
return normalizedFromFieldRelatorTerms.filter(str => !normalizedToFieldRelatorTerms.includes(str));
|
|
44
|
+
return normalizedFromFieldRelatorTerms.filter((str) => !normalizedToFieldRelatorTerms.includes(str));
|
|
74
45
|
}
|
|
75
46
|
function copyRelatorSubfields(fromField, toField) {
|
|
76
|
-
const relatorTermSubfieldCode =
|
|
47
|
+
const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);
|
|
77
48
|
const newRelatorTerms = extractAddableRelatorTerms(fromField, toField);
|
|
78
|
-
newRelatorTerms.forEach(term => toField.subfields.push({
|
|
79
|
-
code: relatorTermSubfieldCode,
|
|
80
|
-
value: term
|
|
81
|
-
})); // eslint-disable-line array-callback-return
|
|
49
|
+
newRelatorTerms.forEach((term) => toField.subfields.push({ code: relatorTermSubfieldCode, value: term }));
|
|
82
50
|
}
|
|
83
51
|
function mergeRelatorTermFields(record, fix = false) {
|
|
84
|
-
|
|
85
|
-
// 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...
|
|
86
|
-
let fields = record.get('(?:[17][01]0|720)');
|
|
52
|
+
let fields = record.get("(?:[17][01]0|720)");
|
|
87
53
|
let result = [];
|
|
88
|
-
const comparisonFieldsAsString = fields.map(f =>
|
|
89
|
-
|
|
54
|
+
const comparisonFieldsAsString = fields.map((f) => fieldToString(createNormalizedCloneWithoutRelatorTerms(f)));
|
|
55
|
+
nvdebug(`mergeRelatorTermFields(): ${fields.length} cand field(s) found`);
|
|
90
56
|
for (let i = 0; i < fields.length - 1; i++) {
|
|
91
57
|
let currField = fields[i];
|
|
92
58
|
if (currField.deleted) {
|
|
93
59
|
continue;
|
|
94
60
|
}
|
|
95
|
-
|
|
61
|
+
nvdebug(`RT: Trying to pair ${comparisonFieldsAsString[i]}/${i}`);
|
|
96
62
|
for (let j = i + 1; j < fields.length; j++) {
|
|
97
|
-
|
|
63
|
+
nvdebug(` Compare with ${comparisonFieldsAsString[j]}/${j}`);
|
|
98
64
|
let mergableField = fields[j];
|
|
99
|
-
// Skip 1/7 from 1XX/7XX for similarity check:
|
|
100
65
|
if (comparisonFieldsAsString[i].substring(1) !== comparisonFieldsAsString[j].substring(1)) {
|
|
101
|
-
|
|
66
|
+
nvdebug(" NOT PAIR");
|
|
102
67
|
continue;
|
|
103
68
|
}
|
|
104
69
|
if (mergableField.deleted) {
|
|
105
|
-
|
|
70
|
+
nvdebug(" DELETED");
|
|
106
71
|
continue;
|
|
107
72
|
}
|
|
108
|
-
const str = `MERGE RELATOR TERM FIELD: ${
|
|
109
|
-
|
|
73
|
+
const str = `MERGE RELATOR TERM FIELD: ${fieldToString(mergableField)}`;
|
|
74
|
+
nvdebug(str);
|
|
110
75
|
if (!result.includes(str)) {
|
|
111
76
|
result.push(str);
|
|
112
77
|
}
|
|
113
78
|
if (fix) {
|
|
114
79
|
mergableField.deleted = 1;
|
|
115
80
|
copyRelatorSubfields(mergableField, currField);
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
81
|
+
fieldFixPunctuation(currField);
|
|
82
|
+
sortAdjacentSubfields(currField);
|
|
83
|
+
sortAdjacentRelatorTerms(currField);
|
|
84
|
+
fieldFixPunctuation(currField);
|
|
120
85
|
}
|
|
121
86
|
}
|
|
122
87
|
}
|
|
123
88
|
if (!fix) {
|
|
124
|
-
fields.forEach(f => delete f.deleted);
|
|
89
|
+
fields.forEach((f) => delete f.deleted);
|
|
125
90
|
}
|
|
126
|
-
record.fields = record.fields.filter(f => !f.deleted);
|
|
127
|
-
/* eslint-enable */
|
|
91
|
+
record.fields = record.fields.filter((f) => !f.deleted);
|
|
128
92
|
return result;
|
|
129
93
|
}
|
|
130
|
-
//# sourceMappingURL=mergeRelatorTermFields.js.map
|
|
94
|
+
//# sourceMappingURL=mergeRelatorTermFields.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/mergeRelatorTermFields.js"],
|
|
4
|
+
"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.js';\nimport {fieldToString, nvdebug} from './utils.js';\nimport {sortAdjacentSubfields} from './sortSubfields.js';\nimport {sortAdjacentRelatorTerms, tagToRelatorTermSubfieldCode} from './sortRelatorTerms.js';\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}));\n\n}\n\nfunction mergeRelatorTermFields(record, fix = false) {\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 return result;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
3
|
+
import validatorFactory from "./mergeRelatorTermFields.js";
|
|
4
|
+
import { READERS } from "@natlibfi/fixura";
|
|
5
|
+
import generateTests from "@natlibfi/fixugen";
|
|
6
|
+
import createDebugLogger from "debug";
|
|
7
|
+
generateTests({
|
|
8
|
+
callback,
|
|
9
|
+
path: [import.meta.dirname, "..", "test-fixtures", "mergeRelatorTermFields"],
|
|
10
|
+
useMetadataFile: true,
|
|
11
|
+
recurse: true,
|
|
12
|
+
fixura: {
|
|
13
|
+
reader: READERS.JSON
|
|
14
|
+
},
|
|
15
|
+
hooks: {
|
|
16
|
+
before: async () => {
|
|
17
|
+
testValidatorFactory();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/mergeRelatorTermFields:test");
|
|
22
|
+
async function testValidatorFactory() {
|
|
23
|
+
const validator = await validatorFactory();
|
|
24
|
+
assert.equal(typeof validator, "object");
|
|
25
|
+
assert.equal(typeof validator.description, "string");
|
|
26
|
+
assert.equal(typeof validator.validate, "function");
|
|
27
|
+
}
|
|
28
|
+
async function callback({ getFixture, enabled = true, fix = false }) {
|
|
29
|
+
if (enabled === false) {
|
|
30
|
+
debug("TEST SKIPPED!");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const validator = await validatorFactory();
|
|
34
|
+
const record = new MarcRecord(getFixture("record.json"));
|
|
35
|
+
const expectedResult = getFixture("expectedResult.json");
|
|
36
|
+
if (!fix) {
|
|
37
|
+
const result = await validator.validate(record);
|
|
38
|
+
assert.deepEqual(result, expectedResult);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
await validator.fix(record);
|
|
42
|
+
assert.deepEqual(record, expectedResult);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=mergeRelatorTermFields.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/mergeRelatorTermFields.test.js"],
|
|
4
|
+
"sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './mergeRelatorTermFields.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'mergeRelatorTermFields'],\n useMetadataFile: true,\n recurse: true,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/mergeRelatorTermFields:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAC1B,OAAO,uBAAuB;AAE9B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,wBAAwB;AAAA,EAC3E,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AACD,MAAM,QAAQ,kBAAkB,sEAAsE;AAEtG,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;AAEA,eAAe,SAAS,EAAC,YAAY,UAAU,MAAM,MAAM,MAAK,GAAG;AACjE,MAAI,YAAY,OAAO;AACrB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|