@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
package/dist/fixRelatorTerms.js
CHANGED
|
@@ -1,53 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
exports.recordFixRelatorTerms = recordFixRelatorTerms;
|
|
9
|
-
var _clone = _interopRequireDefault(require("clone"));
|
|
10
|
-
var _punctuation = require("./punctuation2");
|
|
11
|
-
var _utils = require("./utils");
|
|
12
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
13
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
-
// Currently mainly translates X00$e values, so that we don't have "$a Name, $e kirjoittaja, $e författare.".
|
|
15
|
-
// Later on we could try and handle $4 stuff here as well.
|
|
16
|
-
|
|
17
|
-
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:fixRelatorterms');
|
|
18
|
-
//const debugData = debug.extend('data');
|
|
19
|
-
const debugDev = debug.extend('dev');
|
|
20
|
-
function _default() {
|
|
1
|
+
import clone from "clone";
|
|
2
|
+
import { fieldFixPunctuation } from "./punctuation2.js";
|
|
3
|
+
import { fieldToString, getCatalogingLanguage, nvdebug, subfieldToString } from "./utils.js";
|
|
4
|
+
import createDebugLogger from "debug";
|
|
5
|
+
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:fixRelatorterms");
|
|
6
|
+
const debugDev = debug.extend("dev");
|
|
7
|
+
export default function() {
|
|
21
8
|
return {
|
|
22
|
-
description:
|
|
9
|
+
description: "Fix $e subfields in field [1678][01]0 and 720",
|
|
23
10
|
validate,
|
|
24
11
|
fix
|
|
25
12
|
};
|
|
26
13
|
function fix(record) {
|
|
27
|
-
const res = {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
valid: true
|
|
31
|
-
};
|
|
32
|
-
const language = (0, _utils.getCatalogingLanguage)(record);
|
|
33
|
-
record.fields.forEach(field => {
|
|
14
|
+
const res = { message: [], fix: [], valid: true };
|
|
15
|
+
const language = getCatalogingLanguage(record);
|
|
16
|
+
record.fields.forEach((field) => {
|
|
34
17
|
fieldFixRelatorTerms(field, language, language);
|
|
35
18
|
});
|
|
36
19
|
return res;
|
|
37
20
|
}
|
|
38
21
|
function validate(record) {
|
|
39
|
-
const res = {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
record.fields.forEach(field => {
|
|
44
|
-
const clonedField = (0, _clone.default)(field);
|
|
45
|
-
// Rather hackily/abnormally use language as both fromLanguage and toLanguage.
|
|
46
|
-
// fromLanguage is used to expand "esitt." => "esittäjä".
|
|
47
|
-
// toLanguage is used by translations (fixes "författere" to "kirjoittaja", if 040$b is "fin")
|
|
22
|
+
const res = { message: [] };
|
|
23
|
+
const language = getCatalogingLanguage(record);
|
|
24
|
+
record.fields.forEach((field) => {
|
|
25
|
+
const clonedField = clone(field);
|
|
48
26
|
fieldFixRelatorTerms(field, language, language);
|
|
49
|
-
const clonedFieldAsString =
|
|
50
|
-
const fieldAsString =
|
|
27
|
+
const clonedFieldAsString = fieldToString(clonedField);
|
|
28
|
+
const fieldAsString = fieldToString(field);
|
|
51
29
|
if (fieldAsString !== clonedFieldAsString) {
|
|
52
30
|
res.message.push(`${fieldAsString} => ${clonedFieldAsString}`);
|
|
53
31
|
}
|
|
@@ -56,233 +34,128 @@ function _default() {
|
|
|
56
34
|
return res;
|
|
57
35
|
}
|
|
58
36
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
'eng': 'arranger',
|
|
79
|
-
'fin': 'sovittaja',
|
|
80
|
-
'swe': 'arrangör av musikalisk komposition'
|
|
81
|
-
}, {
|
|
82
|
-
'code': 'art',
|
|
83
|
-
'eng': 'artist',
|
|
84
|
-
'fin': 'taiteilija',
|
|
85
|
-
'swe': 'konstnär'
|
|
86
|
-
}, {
|
|
87
|
-
'code': 'aui',
|
|
88
|
-
'eng': 'author of introduction',
|
|
89
|
-
'fin': 'esipuheen tekijä'
|
|
90
|
-
}, {
|
|
91
|
-
'code': 'aut',
|
|
92
|
-
'eng': 'author',
|
|
93
|
-
'fin': 'kirjoittaja',
|
|
94
|
-
'swe': 'författare'
|
|
95
|
-
}, {
|
|
96
|
-
'code': 'cmp',
|
|
97
|
-
'eng': 'composer',
|
|
98
|
-
'fin': 'säveltäjä',
|
|
99
|
-
'swe': 'kompositör'
|
|
100
|
-
}, {
|
|
101
|
-
'code': 'drt',
|
|
102
|
-
'eng': 'director',
|
|
103
|
-
'fin': 'ohjaaja',
|
|
104
|
-
'swe': 'regissör'
|
|
105
|
-
}, {
|
|
106
|
-
'code': 'edt',
|
|
107
|
-
'eng': 'editor',
|
|
108
|
-
'fin': 'toimittaja',
|
|
109
|
-
'swe': 'redaktör'
|
|
110
|
-
}, {
|
|
111
|
-
'code': 'ill',
|
|
112
|
-
'eng': 'illustrator',
|
|
113
|
-
'fin': 'kuvittaja',
|
|
114
|
-
'swe': 'illustratör'
|
|
115
|
-
}, {
|
|
116
|
-
'code': 'lyr',
|
|
117
|
-
'eng': 'lyricist',
|
|
118
|
-
'fin': 'sanoittaja',
|
|
119
|
-
'swe': 'sångtext'
|
|
120
|
-
}, {
|
|
121
|
-
'code': 'nrt',
|
|
122
|
-
'eng': 'narrator',
|
|
123
|
-
'fin': 'kertoja',
|
|
124
|
-
'swe': 'berättare'
|
|
125
|
-
},
|
|
126
|
-
// berättare/inläsare
|
|
127
|
-
{
|
|
128
|
-
'code': 'pbl',
|
|
129
|
-
'eng': 'publisher',
|
|
130
|
-
'fin': 'julkaisija',
|
|
131
|
-
'swe': 'utgivare'
|
|
132
|
-
}, {
|
|
133
|
-
'code': 'pht',
|
|
134
|
-
'eng': 'photographer',
|
|
135
|
-
'fin': 'valokuvaaja',
|
|
136
|
-
'swe': 'fotograf'
|
|
137
|
-
}, {
|
|
138
|
-
'code': 'prf',
|
|
139
|
-
'eng': 'performer',
|
|
140
|
-
'fin': 'esittäjä',
|
|
141
|
-
'swe': 'framförande'
|
|
142
|
-
}, {
|
|
143
|
-
'code': 'pro',
|
|
144
|
-
'eng': 'producer',
|
|
145
|
-
'fin': 'tuottaja',
|
|
146
|
-
'swe': 'producent'
|
|
147
|
-
}, {
|
|
148
|
-
'code': 'trl',
|
|
149
|
-
'eng': 'translator',
|
|
150
|
-
'fin': 'kääntäjä',
|
|
151
|
-
'swe': 'översättare'
|
|
152
|
-
}, {
|
|
153
|
-
'code': '__FAKE_VALUE1__',
|
|
154
|
-
'fin': 'sarjakuvantekijä',
|
|
155
|
-
'swe': 'serieskapare'
|
|
156
|
-
}];
|
|
157
|
-
|
|
158
|
-
/*
|
|
159
|
-
function recordNormalizeRelatorTerms(record, defaultLanguageCode = undef) {
|
|
160
|
-
const languageCode = defaultLanguageCode ? defaultLanguageCode : getCatalogingLanguage(record);
|
|
161
|
-
if (!languageCode || ['eng', 'fin', 'swe'].includes(languageCode)) {
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
}
|
|
166
|
-
*/
|
|
167
|
-
|
|
37
|
+
const relatorTerms = [
|
|
38
|
+
{ "code": "arr", "eng": "arranger", "fin": "sovittaja", "swe": "arrang\xF6r av musikalisk komposition" },
|
|
39
|
+
{ "code": "art", "eng": "artist", "fin": "taiteilija", "swe": "konstn\xE4r" },
|
|
40
|
+
{ "code": "aui", "eng": "author of introduction", "fin": "esipuheen tekij\xE4" },
|
|
41
|
+
{ "code": "aut", "eng": "author", "fin": "kirjoittaja", "swe": "f\xF6rfattare" },
|
|
42
|
+
{ "code": "cmp", "eng": "composer", "fin": "s\xE4velt\xE4j\xE4", "swe": "komposit\xF6r" },
|
|
43
|
+
{ "code": "drt", "eng": "director", "fin": "ohjaaja", "swe": "regiss\xF6r" },
|
|
44
|
+
{ "code": "edt", "eng": "editor", "fin": "toimittaja", "swe": "redakt\xF6r" },
|
|
45
|
+
{ "code": "ill", "eng": "illustrator", "fin": "kuvittaja", "swe": "illustrat\xF6r" },
|
|
46
|
+
{ "code": "lyr", "eng": "lyricist", "fin": "sanoittaja", "swe": "s\xE5ngtext" },
|
|
47
|
+
{ "code": "nrt", "eng": "narrator", "fin": "kertoja", "swe": "ber\xE4ttare" },
|
|
48
|
+
// berättare/inläsare
|
|
49
|
+
{ "code": "pbl", "eng": "publisher", "fin": "julkaisija", "swe": "utgivare" },
|
|
50
|
+
{ "code": "pht", "eng": "photographer", "fin": "valokuvaaja", "swe": "fotograf" },
|
|
51
|
+
{ "code": "prf", "eng": "performer", "fin": "esitt\xE4j\xE4", "swe": "framf\xF6rande" },
|
|
52
|
+
{ "code": "pro", "eng": "producer", "fin": "tuottaja", "swe": "producent" },
|
|
53
|
+
{ "code": "trl", "eng": "translator", "fin": "k\xE4\xE4nt\xE4j\xE4", "swe": "\xF6vers\xE4ttare" },
|
|
54
|
+
{ "code": "__FAKE_VALUE1__", "fin": "sarjakuvantekij\xE4", "swe": "serieskapare" }
|
|
55
|
+
];
|
|
168
56
|
const finnishAbbreviations = {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
57
|
+
"esitt.": "esitt\xE4j\xE4",
|
|
58
|
+
"k\xE4\xE4nt.": "k\xE4\xE4nt\xE4j\xE4",
|
|
59
|
+
"n\xE4ytt.": "n\xE4yttelij\xE4",
|
|
60
|
+
"san.": "sanoittaja",
|
|
61
|
+
"sov.": "sovittaja",
|
|
62
|
+
"s\xE4v.": "s\xE4velt\xE4j\xE4",
|
|
63
|
+
"toim.": "toimittaja",
|
|
176
64
|
// Quick and dirty implementation of https://github.com/NatLibFi/USEMARCON-BOOKWHERE-RDA/blob/master/bw_rda_kyril.rul#L651
|
|
177
65
|
// As per M.I./Slavica
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
66
|
+
"\u0445\u0443\u0434\u043E\u0436.": "kuvittaja",
|
|
67
|
+
"\u043F\u0435\u0440.": "k\xE4\xE4nt\xE4j\xE4",
|
|
68
|
+
"\u0441\u043E\u0441\u0442.": "toimittaja",
|
|
181
69
|
// might also be 'kokoaja'
|
|
182
|
-
|
|
70
|
+
"\u0440\u0435\u0434.": "toimittaja"
|
|
183
71
|
};
|
|
184
72
|
function subfieldHandleRelatorTermAbbreviation(subfield, language) {
|
|
185
|
-
if (subfield.code !==
|
|
73
|
+
if (subfield.code !== "e") {
|
|
186
74
|
return;
|
|
187
75
|
}
|
|
188
|
-
|
|
189
|
-
if (!language || language ===
|
|
190
|
-
subfieldHandleRelatorTermAbbreviation(subfield,
|
|
191
|
-
// Maybe later add Swedish here...
|
|
76
|
+
nvdebug(`Relator cand subfield: '${subfieldToString(subfield)}', lang: ${language ? language : "NULL"}`, debugDev);
|
|
77
|
+
if (!language || language === "mul") {
|
|
78
|
+
subfieldHandleRelatorTermAbbreviation(subfield, "fin");
|
|
192
79
|
return;
|
|
193
80
|
}
|
|
194
|
-
const value = subfield.value.replace(/,$/u,
|
|
195
|
-
const punc = value === subfield.value ?
|
|
196
|
-
const lcValue = value.toLowerCase();
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
if (!language || language === 'fin' || language === 'mul') {
|
|
200
|
-
(0, _utils.nvdebug)(`Relator try Finnish for '${lcValue}}'...`, debugDev);
|
|
81
|
+
const value = subfield.value.replace(/,$/u, "");
|
|
82
|
+
const punc = value === subfield.value ? "" : ",";
|
|
83
|
+
const lcValue = value.toLowerCase();
|
|
84
|
+
if (!language || language === "fin" || language === "mul") {
|
|
85
|
+
nvdebug(`Relator try Finnish for '${lcValue}}'...`, debugDev);
|
|
201
86
|
if (lcValue in finnishAbbreviations) {
|
|
202
87
|
const hit = `${finnishAbbreviations[lcValue]}${punc}`;
|
|
203
|
-
|
|
204
|
-
// NB! 'esitt.' => 'esittäjä'
|
|
88
|
+
nvdebug(`Relator hit: ${hit}`, debugDev);
|
|
205
89
|
subfield.value = hit;
|
|
206
90
|
return;
|
|
207
91
|
}
|
|
208
92
|
}
|
|
209
93
|
}
|
|
210
94
|
function isRelatorField(field) {
|
|
211
|
-
// Tag list might be incomplete!
|
|
212
95
|
return field.tag.match(/^(?:100|110|600|610|700|710|720|800|810)$/u);
|
|
213
96
|
}
|
|
214
97
|
function fieldHandleRelatorTermAbbreviations(field, language) {
|
|
215
98
|
if (!isRelatorField(field)) {
|
|
216
99
|
return;
|
|
217
100
|
}
|
|
218
|
-
const originalValue =
|
|
219
|
-
field.subfields.forEach(sf => subfieldHandleRelatorTermAbbreviation(sf, language));
|
|
220
|
-
const modifiedValue =
|
|
101
|
+
const originalValue = fieldToString(field);
|
|
102
|
+
field.subfields.forEach((sf) => subfieldHandleRelatorTermAbbreviation(sf, language));
|
|
103
|
+
const modifiedValue = fieldToString(field);
|
|
221
104
|
if (modifiedValue === originalValue) {
|
|
222
105
|
return;
|
|
223
106
|
}
|
|
224
|
-
|
|
225
|
-
// (NB! We need punctuation as a module, if we are to make abbr expansion a marc-record-validators-melinda validator/fixer)
|
|
226
|
-
(0, _punctuation.fieldFixPunctuation)(field);
|
|
107
|
+
fieldFixPunctuation(field);
|
|
227
108
|
}
|
|
228
109
|
function termIsInGivenLanguage(term, language) {
|
|
229
|
-
return relatorTerms.some(row => language in row && row[language] === term);
|
|
110
|
+
return relatorTerms.some((row) => language in row && row[language] === term);
|
|
230
111
|
}
|
|
231
112
|
function anyToLanguage(originalTerm) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
return 'fin';
|
|
113
|
+
if (termIsInGivenLanguage(originalTerm, "fin")) {
|
|
114
|
+
return "fin";
|
|
235
115
|
}
|
|
236
|
-
if (termIsInGivenLanguage(originalTerm,
|
|
237
|
-
return
|
|
116
|
+
if (termIsInGivenLanguage(originalTerm, "swe")) {
|
|
117
|
+
return "swe";
|
|
238
118
|
}
|
|
239
|
-
if (termIsInGivenLanguage(originalTerm,
|
|
240
|
-
return
|
|
119
|
+
if (termIsInGivenLanguage(originalTerm, "eng")) {
|
|
120
|
+
return "eng";
|
|
241
121
|
}
|
|
242
122
|
return null;
|
|
243
123
|
}
|
|
244
124
|
function translateRelatorTerm(originalTerm, defaultFromLanguage, toLanguage) {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
(0, _utils.nvdebug)(`Try to translate '${term}' from ${defaultFromLanguage} to ${toLanguage}`, debugDev);
|
|
248
|
-
|
|
249
|
-
// Kind of hacky... If term is in toLanguage, do nothing. defaultFromLanguage (040$b) isn't that reliable.
|
|
125
|
+
const term = originalTerm.replace(/[,.]$/u, "");
|
|
126
|
+
nvdebug(`Try to translate '${term}' from ${defaultFromLanguage} to ${toLanguage}`, debugDev);
|
|
250
127
|
if (termIsInGivenLanguage(term, toLanguage)) {
|
|
251
128
|
return originalTerm;
|
|
252
129
|
}
|
|
253
|
-
// defaultFomLanguage (typically 040$b) isn't that reliable:
|
|
254
130
|
const fromLanguage = defaultFromLanguage === null || !termIsInGivenLanguage(term, defaultFromLanguage) ? anyToLanguage(term) : defaultFromLanguage;
|
|
255
|
-
const [candRow] = relatorTerms.filter(row => fromLanguage in row && toLanguage in row && row[fromLanguage] === term);
|
|
131
|
+
const [candRow] = relatorTerms.filter((row) => fromLanguage in row && toLanguage in row && row[fromLanguage] === term);
|
|
256
132
|
if (candRow) {
|
|
257
|
-
const punc = term === originalTerm ?
|
|
133
|
+
const punc = term === originalTerm ? "" : originalTerm.slice(-1);
|
|
258
134
|
const translation = `${candRow[toLanguage]}${punc}`;
|
|
259
|
-
|
|
135
|
+
nvdebug(`Translate relator term: ${originalTerm} => ${translation}`, debugDev);
|
|
260
136
|
return translation;
|
|
261
137
|
}
|
|
262
138
|
return originalTerm;
|
|
263
139
|
}
|
|
264
140
|
function subfieldTranslateRelatorTerm(subfield, fromLanguage, toLanguage) {
|
|
265
|
-
if (subfield.code !==
|
|
141
|
+
if (subfield.code !== "e") {
|
|
266
142
|
return;
|
|
267
143
|
}
|
|
268
144
|
subfield.value = translateRelatorTerm(subfield.value, fromLanguage, toLanguage);
|
|
269
145
|
}
|
|
270
|
-
function fieldFixRelatorTerms(field, fromLanguage, toLanguage) {
|
|
271
|
-
|
|
272
|
-
if (!isRelatorField(field) /* || fromLanguage === toLanguage*/) {
|
|
146
|
+
export function fieldFixRelatorTerms(field, fromLanguage, toLanguage) {
|
|
147
|
+
if (!isRelatorField(field)) {
|
|
273
148
|
return;
|
|
274
149
|
}
|
|
275
150
|
fieldHandleRelatorTermAbbreviations(field, fromLanguage);
|
|
276
|
-
field.subfields.forEach(sf => subfieldTranslateRelatorTerm(sf, fromLanguage, toLanguage));
|
|
151
|
+
field.subfields.forEach((sf) => subfieldTranslateRelatorTerm(sf, fromLanguage, toLanguage));
|
|
277
152
|
}
|
|
278
|
-
function recordFixRelatorTerms(record, defaultToLanguage = null, defaultFromLanguage = null) {
|
|
279
|
-
|
|
280
|
-
const
|
|
281
|
-
|
|
282
|
-
record.fields.forEach(field => translateField(field, fromLanguage, toLanguage)); // eslint-disable-line array-callback-return
|
|
283
|
-
|
|
153
|
+
export function recordFixRelatorTerms(record, defaultToLanguage = null, defaultFromLanguage = null) {
|
|
154
|
+
const fromLanguage = defaultFromLanguage ? defaultFromLanguage : getCatalogingLanguage(record);
|
|
155
|
+
const toLanguage = defaultToLanguage ? defaultToLanguage : getCatalogingLanguage(record);
|
|
156
|
+
record.fields.forEach((field) => translateField(field, fromLanguage, toLanguage));
|
|
284
157
|
function translateField(field, from, to) {
|
|
285
158
|
fieldFixRelatorTerms(field, from, to);
|
|
286
159
|
}
|
|
287
160
|
}
|
|
288
|
-
//# sourceMappingURL=fixRelatorTerms.js.map
|
|
161
|
+
//# sourceMappingURL=fixRelatorTerms.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{"version":3,"file":"fixRelatorTerms.js","names":["_clone","_interopRequireDefault","require","_punctuation","_utils","_debug","e","__esModule","default","debug","createDebugLogger","debugDev","extend","_default","description","validate","fix","record","res","message","valid","language","getCatalogingLanguage","fields","forEach","field","fieldFixRelatorTerms","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","relatorTerms","finnishAbbreviations","subfieldHandleRelatorTermAbbreviation","subfield","code","nvdebug","subfieldToString","value","replace","punc","lcValue","toLowerCase","hit","isRelatorField","tag","match","fieldHandleRelatorTermAbbreviations","originalValue","subfields","sf","modifiedValue","fieldFixPunctuation","termIsInGivenLanguage","term","some","row","anyToLanguage","originalTerm","translateRelatorTerm","defaultFromLanguage","toLanguage","fromLanguage","candRow","filter","slice","translation","subfieldTranslateRelatorTerm","recordFixRelatorTerms","defaultToLanguage","translateField","from","to"],"sources":["../src/fixRelatorTerms.js"],"sourcesContent":["import clone from 'clone';\nimport {fieldFixPunctuation} from './punctuation2';\nimport {fieldToString, getCatalogingLanguage, nvdebug, subfieldToString} from './utils';\nimport createDebugLogger from 'debug';\n\n// Currently mainly translates X00$e values, so that we don't have \"$a Name, $e kirjoittaja, $e författare.\".\n// Later on we could try and handle $4 stuff here as well.\n\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fixRelatorterms');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport default function () {\n return {\n description: 'Fix $e subfields in field [1678][01]0 and 720',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n const language = getCatalogingLanguage(record);\n\n record.fields.forEach(field => {\n fieldFixRelatorTerms(field, language, language);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const language = getCatalogingLanguage(record);\n\n record.fields.forEach(field => {\n const clonedField = clone(field);\n // Rather hackily/abnormally use language as both fromLanguage and toLanguage.\n // fromLanguage is used to expand \"esitt.\" => \"esittäjä\".\n // toLanguage is used by translations (fixes \"författere\" to \"kirjoittaja\", if 040$b is \"fin\")\n fieldFixRelatorTerms(field, language, language);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) {\n res.message.push(`${fieldAsString} => ${clonedFieldAsString}`);\n }\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\n\n/*\nexport default () => (base, source) => {\n recordTranslateRelatorTerms(base);\n recordTranslateRelatorTerms(source);\n recordHandleRelatorTermAbbreviations(base);\n recordHandleRelatorTermAbbreviations(source);\n const result = {base, source};\n return result;\n};\n*/\n\n\n// Partial source: https://marc21.kansalliskirjasto.fi/funktiot_koodit.htm\n// https://wiki.helsinki.fi/display/MARC21svenska/Funktions-+och+relationskoder+-+alfabetiskt+efter+funktion\n// New, better source: https://id.kb.se/find?q=relator&_sort=_sortKeyByLang.en\n\n\n// NB! How to handle German sex-based Verfasser/Verfasserin pairs?\nconst relatorTerms = [\n {'code': 'arr', 'eng': 'arranger', 'fin': 'sovittaja', 'swe': 'arrangör av musikalisk komposition'},\n {'code': 'art', 'eng': 'artist', 'fin': 'taiteilija', 'swe': 'konstnär'},\n {'code': 'aui', 'eng': 'author of introduction', 'fin': 'esipuheen tekijä'},\n {'code': 'aut', 'eng': 'author', 'fin': 'kirjoittaja', 'swe': 'författare'},\n {'code': 'cmp', 'eng': 'composer', 'fin': 'säveltäjä', 'swe': 'kompositör'},\n {'code': 'drt', 'eng': 'director', 'fin': 'ohjaaja', 'swe': 'regissör'},\n {'code': 'edt', 'eng': 'editor', 'fin': 'toimittaja', 'swe': 'redaktör'},\n {'code': 'ill', 'eng': 'illustrator', 'fin': 'kuvittaja', 'swe': 'illustratör'},\n {'code': 'lyr', 'eng': 'lyricist', 'fin': 'sanoittaja', 'swe': 'sångtext'},\n {'code': 'nrt', 'eng': 'narrator', 'fin': 'kertoja', 'swe': 'berättare'}, // berättare/inläsare\n {'code': 'pbl', 'eng': 'publisher', 'fin': 'julkaisija', 'swe': 'utgivare'},\n {'code': 'pht', 'eng': 'photographer', 'fin': 'valokuvaaja', 'swe': 'fotograf'},\n {'code': 'prf', 'eng': 'performer', 'fin': 'esittäjä', 'swe': 'framförande'},\n {'code': 'pro', 'eng': 'producer', 'fin': 'tuottaja', 'swe': 'producent'},\n {'code': 'trl', 'eng': 'translator', 'fin': 'kääntäjä', 'swe': 'översättare'},\n {'code': '__FAKE_VALUE1__', 'fin': 'sarjakuvantekijä', 'swe': 'serieskapare'}\n];\n\n/*\nfunction recordNormalizeRelatorTerms(record, defaultLanguageCode = undef) {\n const languageCode = defaultLanguageCode ? defaultLanguageCode : getCatalogingLanguage(record);\n if (!languageCode || ['eng', 'fin', 'swe'].includes(languageCode)) {\n return;\n }\n\n}\n*/\n\n\nconst finnishAbbreviations = {\n 'esitt.': 'esittäjä',\n 'käänt.': 'kääntäjä',\n 'näytt.': 'näyttelijä',\n 'san.': 'sanoittaja',\n 'sov.': 'sovittaja',\n 'säv.': 'säveltäjä',\n 'toim.': 'toimittaja',\n // Quick and dirty implementation of https://github.com/NatLibFi/USEMARCON-BOOKWHERE-RDA/blob/master/bw_rda_kyril.rul#L651\n // As per M.I./Slavica\n 'худож.': 'kuvittaja',\n 'пер.': 'kääntäjä',\n 'сост.': 'toimittaja', // might also be 'kokoaja'\n 'ред.': 'toimittaja'\n};\n\nfunction subfieldHandleRelatorTermAbbreviation(subfield, language) {\n if (subfield.code !== 'e') {\n return;\n }\n nvdebug(`Relator cand subfield: '${subfieldToString(subfield)}', lang: ${language ? language : 'NULL'}`, debugDev);\n if (!language || language === 'mul') {\n subfieldHandleRelatorTermAbbreviation(subfield, 'fin');\n // Maybe later add Swedish here...\n return;\n }\n const value = subfield.value.replace(/,$/u, '');\n const punc = value === subfield.value ? '' : ',';\n\n const lcValue = value.toLowerCase(); // Check Å, Ä, Ö...\n\n // NB: Policy: if no language or multi-language: apply all rules! (Not much overlap I hope...)\n if (!language || language === 'fin' || language === 'mul') {\n nvdebug(`Relator try Finnish for '${lcValue}}'...`, debugDev);\n if (lcValue in finnishAbbreviations) {\n const hit = `${finnishAbbreviations[lcValue]}${punc}`;\n nvdebug(`Relator hit: ${hit}`, debugDev);\n // NB! 'esitt.' => 'esittäjä'\n subfield.value = hit;\n return;\n }\n }\n}\n\n\nfunction isRelatorField(field) {\n // Tag list might be incomplete!\n return field.tag.match(/^(?:100|110|600|610|700|710|720|800|810)$/u);\n}\n\nfunction fieldHandleRelatorTermAbbreviations(field, language) {\n if (!isRelatorField(field)) {\n return;\n }\n\n const originalValue = fieldToString(field);\n field.subfields.forEach(sf => subfieldHandleRelatorTermAbbreviation(sf, language)); // eslint-disable-line array-callback-return\n const modifiedValue = fieldToString(field);\n if (modifiedValue === originalValue) {\n return;\n }\n // Changes have happened... Try to punctuate.\n // (NB! We need punctuation as a module, if we are to make abbr expansion a marc-record-validators-melinda validator/fixer)\n fieldFixPunctuation(field);\n}\n\nfunction termIsInGivenLanguage(term, language) {\n return relatorTerms.some(row => language in row && row[language] === term);\n}\n\nfunction anyToLanguage(originalTerm) {\n // Sometimes there's no 040$b or 040$b and, say, 040$b and 700$e value don't correlate\n if (termIsInGivenLanguage(originalTerm, 'fin')) {\n return 'fin';\n }\n if (termIsInGivenLanguage(originalTerm, 'swe')) {\n return 'swe';\n }\n if (termIsInGivenLanguage(originalTerm, 'eng')) {\n return 'eng';\n }\n return null;\n}\n\nfunction translateRelatorTerm(originalTerm, defaultFromLanguage, toLanguage) {\n\n // originalTerm is supposed to be normal version (abbrs have been expanded), possibly with punctuation\n const term = originalTerm.replace(/[,.]$/u, '');\n nvdebug(`Try to translate '${term}' from ${defaultFromLanguage} to ${toLanguage}`, debugDev);\n\n // Kind of hacky... If term is in toLanguage, do nothing. defaultFromLanguage (040$b) isn't that reliable.\n if (termIsInGivenLanguage(term, toLanguage)) {\n return originalTerm;\n }\n // defaultFomLanguage (typically 040$b) isn't that reliable:\n const fromLanguage = defaultFromLanguage === null || !termIsInGivenLanguage(term, defaultFromLanguage) ? anyToLanguage(term) : defaultFromLanguage;\n\n const [candRow] = relatorTerms.filter(row => fromLanguage in row && toLanguage in row && row[fromLanguage] === term);\n if (candRow) {\n const punc = term === originalTerm ? '' : originalTerm.slice(-1);\n const translation = `${candRow[toLanguage]}${punc}`;\n nvdebug(`Translate relator term: ${originalTerm} => ${translation}`, debugDev);\n return translation;\n }\n return originalTerm;\n}\n\nfunction subfieldTranslateRelatorTerm(subfield, fromLanguage, toLanguage) {\n if (subfield.code !== 'e') {\n return;\n }\n subfield.value = translateRelatorTerm(subfield.value, fromLanguage, toLanguage);\n}\n\nexport function fieldFixRelatorTerms(field, fromLanguage, toLanguage) {\n // fromLanguage can not be relied upon.\n if (!isRelatorField(field)/* || fromLanguage === toLanguage*/) {\n return;\n }\n fieldHandleRelatorTermAbbreviations(field, fromLanguage);\n\n field.subfields.forEach(sf => subfieldTranslateRelatorTerm(sf, fromLanguage, toLanguage)); // eslint-disable-line array-callback-return\n}\n\n\nexport function recordFixRelatorTerms(record, defaultToLanguage = null, defaultFromLanguage = null) { // WAS: translateRecord()\n const fromLanguage = defaultFromLanguage ? defaultFromLanguage : getCatalogingLanguage(record);\n const toLanguage = defaultToLanguage ? defaultToLanguage : getCatalogingLanguage(record);\n\n record.fields.forEach(field => translateField(field, fromLanguage, toLanguage)); // eslint-disable-line array-callback-return\n\n function translateField(field, from, to) {\n fieldFixRelatorTerms(field, from, to);\n }\n}\n\n\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/fixRelatorTerms.js"],
|
|
4
|
+
"sourcesContent": ["import clone from 'clone';\nimport {fieldFixPunctuation} from './punctuation2.js';\nimport {fieldToString, getCatalogingLanguage, nvdebug, subfieldToString} from './utils.js';\nimport createDebugLogger from 'debug';\n\n// Currently mainly translates X00$e values, so that we don't have \"$a Name, $e kirjoittaja, $e f\u00F6rfattare.\".\n// Later on we could try and handle $4 stuff here as well.\n\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fixRelatorterms');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport default function () {\n return {\n description: 'Fix $e subfields in field [1678][01]0 and 720',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n const language = getCatalogingLanguage(record);\n\n record.fields.forEach(field => {\n fieldFixRelatorTerms(field, language, language);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const language = getCatalogingLanguage(record);\n\n record.fields.forEach(field => {\n const clonedField = clone(field);\n // Rather hackily/abnormally use language as both fromLanguage and toLanguage.\n // fromLanguage is used to expand \"esitt.\" => \"esitt\u00E4j\u00E4\".\n // toLanguage is used by translations (fixes \"f\u00F6rfattere\" to \"kirjoittaja\", if 040$b is \"fin\")\n fieldFixRelatorTerms(field, language, language);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) {\n res.message.push(`${fieldAsString} => ${clonedFieldAsString}`);\n }\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\n\n/*\nexport default () => (base, source) => {\n recordTranslateRelatorTerms(base);\n recordTranslateRelatorTerms(source);\n recordHandleRelatorTermAbbreviations(base);\n recordHandleRelatorTermAbbreviations(source);\n const result = {base, source};\n return result;\n};\n*/\n\n\n// Partial source: https://marc21.kansalliskirjasto.fi/funktiot_koodit.htm\n// https://wiki.helsinki.fi/display/MARC21svenska/Funktions-+och+relationskoder+-+alfabetiskt+efter+funktion\n// New, better source: https://id.kb.se/find?q=relator&_sort=_sortKeyByLang.en\n\n\n// NB! How to handle German sex-based Verfasser/Verfasserin pairs?\nconst relatorTerms = [\n {'code': 'arr', 'eng': 'arranger', 'fin': 'sovittaja', 'swe': 'arrang\u00F6r av musikalisk komposition'},\n {'code': 'art', 'eng': 'artist', 'fin': 'taiteilija', 'swe': 'konstn\u00E4r'},\n {'code': 'aui', 'eng': 'author of introduction', 'fin': 'esipuheen tekij\u00E4'},\n {'code': 'aut', 'eng': 'author', 'fin': 'kirjoittaja', 'swe': 'f\u00F6rfattare'},\n {'code': 'cmp', 'eng': 'composer', 'fin': 's\u00E4velt\u00E4j\u00E4', 'swe': 'komposit\u00F6r'},\n {'code': 'drt', 'eng': 'director', 'fin': 'ohjaaja', 'swe': 'regiss\u00F6r'},\n {'code': 'edt', 'eng': 'editor', 'fin': 'toimittaja', 'swe': 'redakt\u00F6r'},\n {'code': 'ill', 'eng': 'illustrator', 'fin': 'kuvittaja', 'swe': 'illustrat\u00F6r'},\n {'code': 'lyr', 'eng': 'lyricist', 'fin': 'sanoittaja', 'swe': 's\u00E5ngtext'},\n {'code': 'nrt', 'eng': 'narrator', 'fin': 'kertoja', 'swe': 'ber\u00E4ttare'}, // ber\u00E4ttare/inl\u00E4sare\n {'code': 'pbl', 'eng': 'publisher', 'fin': 'julkaisija', 'swe': 'utgivare'},\n {'code': 'pht', 'eng': 'photographer', 'fin': 'valokuvaaja', 'swe': 'fotograf'},\n {'code': 'prf', 'eng': 'performer', 'fin': 'esitt\u00E4j\u00E4', 'swe': 'framf\u00F6rande'},\n {'code': 'pro', 'eng': 'producer', 'fin': 'tuottaja', 'swe': 'producent'},\n {'code': 'trl', 'eng': 'translator', 'fin': 'k\u00E4\u00E4nt\u00E4j\u00E4', 'swe': '\u00F6vers\u00E4ttare'},\n {'code': '__FAKE_VALUE1__', 'fin': 'sarjakuvantekij\u00E4', 'swe': 'serieskapare'}\n];\n\n/*\nfunction recordNormalizeRelatorTerms(record, defaultLanguageCode = undef) {\n const languageCode = defaultLanguageCode ? defaultLanguageCode : getCatalogingLanguage(record);\n if (!languageCode || ['eng', 'fin', 'swe'].includes(languageCode)) {\n return;\n }\n\n}\n*/\n\n\nconst finnishAbbreviations = {\n 'esitt.': 'esitt\u00E4j\u00E4',\n 'k\u00E4\u00E4nt.': 'k\u00E4\u00E4nt\u00E4j\u00E4',\n 'n\u00E4ytt.': 'n\u00E4yttelij\u00E4',\n 'san.': 'sanoittaja',\n 'sov.': 'sovittaja',\n 's\u00E4v.': 's\u00E4velt\u00E4j\u00E4',\n 'toim.': 'toimittaja',\n // Quick and dirty implementation of https://github.com/NatLibFi/USEMARCON-BOOKWHERE-RDA/blob/master/bw_rda_kyril.rul#L651\n // As per M.I./Slavica\n '\u0445\u0443\u0434\u043E\u0436.': 'kuvittaja',\n '\u043F\u0435\u0440.': 'k\u00E4\u00E4nt\u00E4j\u00E4',\n '\u0441\u043E\u0441\u0442.': 'toimittaja', // might also be 'kokoaja'\n '\u0440\u0435\u0434.': 'toimittaja'\n};\n\nfunction subfieldHandleRelatorTermAbbreviation(subfield, language) {\n if (subfield.code !== 'e') {\n return;\n }\n nvdebug(`Relator cand subfield: '${subfieldToString(subfield)}', lang: ${language ? language : 'NULL'}`, debugDev);\n if (!language || language === 'mul') {\n subfieldHandleRelatorTermAbbreviation(subfield, 'fin');\n // Maybe later add Swedish here...\n return;\n }\n const value = subfield.value.replace(/,$/u, '');\n const punc = value === subfield.value ? '' : ',';\n\n const lcValue = value.toLowerCase(); // Check \u00C5, \u00C4, \u00D6...\n\n // NB: Policy: if no language or multi-language: apply all rules! (Not much overlap I hope...)\n if (!language || language === 'fin' || language === 'mul') {\n nvdebug(`Relator try Finnish for '${lcValue}}'...`, debugDev);\n if (lcValue in finnishAbbreviations) {\n const hit = `${finnishAbbreviations[lcValue]}${punc}`;\n nvdebug(`Relator hit: ${hit}`, debugDev);\n // NB! 'esitt.' => 'esitt\u00E4j\u00E4'\n subfield.value = hit;\n return;\n }\n }\n}\n\n\nfunction isRelatorField(field) {\n // Tag list might be incomplete!\n return field.tag.match(/^(?:100|110|600|610|700|710|720|800|810)$/u);\n}\n\nfunction fieldHandleRelatorTermAbbreviations(field, language) {\n if (!isRelatorField(field)) {\n return;\n }\n\n const originalValue = fieldToString(field);\n field.subfields.forEach(sf => subfieldHandleRelatorTermAbbreviation(sf, language));\n const modifiedValue = fieldToString(field);\n if (modifiedValue === originalValue) {\n return;\n }\n // Changes have happened... Try to punctuate.\n // (NB! We need punctuation as a module, if we are to make abbr expansion a marc-record-validators-melinda validator/fixer)\n fieldFixPunctuation(field);\n}\n\nfunction termIsInGivenLanguage(term, language) {\n return relatorTerms.some(row => language in row && row[language] === term);\n}\n\nfunction anyToLanguage(originalTerm) {\n // Sometimes there's no 040$b or 040$b and, say, 040$b and 700$e value don't correlate\n if (termIsInGivenLanguage(originalTerm, 'fin')) {\n return 'fin';\n }\n if (termIsInGivenLanguage(originalTerm, 'swe')) {\n return 'swe';\n }\n if (termIsInGivenLanguage(originalTerm, 'eng')) {\n return 'eng';\n }\n return null;\n}\n\nfunction translateRelatorTerm(originalTerm, defaultFromLanguage, toLanguage) {\n\n // originalTerm is supposed to be normal version (abbrs have been expanded), possibly with punctuation\n const term = originalTerm.replace(/[,.]$/u, '');\n nvdebug(`Try to translate '${term}' from ${defaultFromLanguage} to ${toLanguage}`, debugDev);\n\n // Kind of hacky... If term is in toLanguage, do nothing. defaultFromLanguage (040$b) isn't that reliable.\n if (termIsInGivenLanguage(term, toLanguage)) {\n return originalTerm;\n }\n // defaultFomLanguage (typically 040$b) isn't that reliable:\n const fromLanguage = defaultFromLanguage === null || !termIsInGivenLanguage(term, defaultFromLanguage) ? anyToLanguage(term) : defaultFromLanguage;\n\n const [candRow] = relatorTerms.filter(row => fromLanguage in row && toLanguage in row && row[fromLanguage] === term);\n if (candRow) {\n const punc = term === originalTerm ? '' : originalTerm.slice(-1);\n const translation = `${candRow[toLanguage]}${punc}`;\n nvdebug(`Translate relator term: ${originalTerm} => ${translation}`, debugDev);\n return translation;\n }\n return originalTerm;\n}\n\nfunction subfieldTranslateRelatorTerm(subfield, fromLanguage, toLanguage) {\n if (subfield.code !== 'e') {\n return;\n }\n subfield.value = translateRelatorTerm(subfield.value, fromLanguage, toLanguage);\n}\n\nexport function fieldFixRelatorTerms(field, fromLanguage, toLanguage) {\n // fromLanguage can not be relied upon.\n if (!isRelatorField(field)/* || fromLanguage === toLanguage*/) {\n return;\n }\n fieldHandleRelatorTermAbbreviations(field, fromLanguage);\n\n field.subfields.forEach(sf => subfieldTranslateRelatorTerm(sf, fromLanguage, toLanguage));\n}\n\n\nexport function recordFixRelatorTerms(record, defaultToLanguage = null, defaultFromLanguage = null) { // WAS: translateRecord()\n const fromLanguage = defaultFromLanguage ? defaultFromLanguage : getCatalogingLanguage(record);\n const toLanguage = defaultToLanguage ? defaultToLanguage : getCatalogingLanguage(record);\n\n record.fields.forEach(field => translateField(field, fromLanguage, toLanguage));\n\n function translateField(field, from, to) {\n fieldFixRelatorTerms(field, from, to);\n }\n}\n\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 "../src/fixRelatorTerms.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", "fix-relator-terms"],
|
|
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/fixRelatorTerms: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=fixRelatorTerms.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/fixRelatorTerms.test.js"],
|
|
4
|
+
"sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/fixRelatorTerms.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', 'fix-relator-terms'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/fixRelatorTerms: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,mBAAmB;AAAA,EACtE,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;AAED,MAAM,QAAQ,kBAAkB,+DAA+D;AAE/F,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
|
+
}
|
package/dist/fixed-fields.js
CHANGED
|
@@ -1,64 +1,55 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = _default;
|
|
7
|
-
function _default(configuration) {
|
|
1
|
+
export default function(configuration) {
|
|
8
2
|
if (Array.isArray(configuration)) {
|
|
9
3
|
return {
|
|
10
|
-
description:
|
|
4
|
+
description: "Validates fixed fields",
|
|
11
5
|
validate
|
|
12
6
|
};
|
|
13
7
|
}
|
|
14
|
-
throw new Error(
|
|
8
|
+
throw new Error("No configuration provided");
|
|
15
9
|
function validate(record) {
|
|
16
|
-
const messages = configuration.reduce((
|
|
10
|
+
const messages = configuration.reduce((messages2, item) => {
|
|
17
11
|
let results;
|
|
18
12
|
if (item.leader) {
|
|
19
13
|
results = validateField(record.leader, item);
|
|
20
14
|
} else {
|
|
21
|
-
results = record.get(item.tag).map(f => validateField(f.value, item, f.tag));
|
|
15
|
+
results = record.get(item.tag).map((f) => validateField(f.value, item, f.tag));
|
|
22
16
|
}
|
|
23
17
|
if (results && results.length > 0) {
|
|
24
|
-
return
|
|
18
|
+
return messages2.concat(...results).reduce((acc, item2) => acc.includes(item2) ? acc : acc.concat(item2), []);
|
|
25
19
|
}
|
|
26
|
-
return
|
|
20
|
+
return messages2;
|
|
27
21
|
}, []);
|
|
28
|
-
return {
|
|
29
|
-
valid: messages.length === 0,
|
|
30
|
-
messages
|
|
31
|
-
};
|
|
22
|
+
return { valid: messages.length === 0, messages };
|
|
32
23
|
function validateField(value, spec, tag) {
|
|
33
|
-
const messagePrefix = tag ? `Field ${tag}` :
|
|
34
|
-
if (typeof spec.length ===
|
|
24
|
+
const messagePrefix = tag ? `Field ${tag}` : "Leader";
|
|
25
|
+
if (typeof spec.length === "number") {
|
|
35
26
|
if (value.length !== spec.length) {
|
|
36
27
|
return [`${messagePrefix} has invalid length`];
|
|
37
28
|
}
|
|
38
29
|
}
|
|
39
30
|
if (spec.rules) {
|
|
40
|
-
return spec.rules.reduce((
|
|
31
|
+
return spec.rules.reduce((messages2, rule, ruleIndex) => {
|
|
41
32
|
const indexes = getIndexes(rule.position);
|
|
42
|
-
const positions = value.split(
|
|
33
|
+
const positions = value.split("").reduce((positions2, char, index) => {
|
|
43
34
|
if (indexes.includes(index) && (!rule.dependencies || rule.dependencies.every(checkDependency))) {
|
|
44
35
|
if (!rule.pattern.test(char)) {
|
|
45
|
-
return
|
|
36
|
+
return positions2.concat(index);
|
|
46
37
|
}
|
|
47
38
|
}
|
|
48
|
-
return
|
|
39
|
+
return positions2;
|
|
49
40
|
function checkDependency(dependency) {
|
|
50
|
-
const
|
|
51
|
-
return value.split(
|
|
41
|
+
const indexes2 = getIndexes(dependency.position);
|
|
42
|
+
return value.split("").every((char2, index2) => !indexes2.includes(index2) || dependency.pattern.test(char2));
|
|
52
43
|
}
|
|
53
44
|
}, []);
|
|
54
45
|
if (positions.length > 0) {
|
|
55
|
-
return
|
|
46
|
+
return messages2.concat(`${messagePrefix} has invalid values at positions: ${positions.join()} (Rule index ${ruleIndex})`);
|
|
56
47
|
}
|
|
57
|
-
return
|
|
48
|
+
return messages2;
|
|
58
49
|
function getIndexes(arg) {
|
|
59
50
|
if (Array.isArray(arg)) {
|
|
60
|
-
const
|
|
61
|
-
return
|
|
51
|
+
const indexes2 = [...new Array(arg[1] + 1).keys()];
|
|
52
|
+
return indexes2.slice(arg[0], arg[1] + 1);
|
|
62
53
|
}
|
|
63
54
|
return [arg];
|
|
64
55
|
}
|
|
@@ -67,4 +58,4 @@ function _default(configuration) {
|
|
|
67
58
|
}
|
|
68
59
|
}
|
|
69
60
|
}
|
|
70
|
-
//# sourceMappingURL=fixed-fields.js.map
|
|
61
|
+
//# sourceMappingURL=fixed-fields.js.map
|