@natlibfi/marc-record-validators-melinda 11.6.7-alpha.1 → 12.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/melinda-node-tests.yml +1 -1
- package/dist/access-rights.js +63 -91
- package/dist/access-rights.js.map +7 -1
- package/dist/access-rights.test.js +137 -0
- package/dist/access-rights.test.js.map +7 -0
- package/dist/addMissingField041.js +21 -53
- package/dist/addMissingField041.js.map +7 -1
- package/dist/addMissingField041.test.js +39 -0
- package/dist/addMissingField041.test.js.map +7 -0
- package/dist/addMissingField336.js +99 -191
- package/dist/addMissingField336.js.map +7 -1
- package/dist/addMissingField336.test.js +39 -0
- package/dist/addMissingField336.test.js.map +7 -0
- package/dist/addMissingField337.js +63 -132
- package/dist/addMissingField337.js.map +7 -1
- package/dist/addMissingField337.test.js +39 -0
- package/dist/addMissingField337.test.js.map +7 -0
- package/dist/addMissingField338.js +147 -253
- package/dist/addMissingField338.js.map +7 -1
- package/dist/addMissingField338.test.js +39 -0
- package/dist/addMissingField338.test.js.map +7 -0
- package/dist/cyrillux-usemarcon-replacement.js +119 -272
- package/dist/cyrillux-usemarcon-replacement.js.map +7 -1
- package/dist/cyrillux-usemarcon-replacement.test.js +46 -0
- package/dist/cyrillux-usemarcon-replacement.test.js.map +7 -0
- package/dist/cyrillux.js +119 -223
- package/dist/cyrillux.js.map +7 -1
- package/dist/cyrillux.test.js +39 -0
- package/dist/cyrillux.test.js.map +7 -0
- package/dist/disambiguateSeriesStatements.js +40 -81
- package/dist/disambiguateSeriesStatements.js.map +7 -1
- package/dist/disambiguateSeriesStatements.test.js +44 -0
- package/dist/disambiguateSeriesStatements.test.js.map +7 -0
- package/dist/double-commas.js +7 -14
- package/dist/double-commas.js.map +7 -1
- package/dist/double-commas.test.js +48 -0
- package/dist/double-commas.test.js.map +7 -0
- package/dist/duplicates-ind1.js +10 -31
- package/dist/duplicates-ind1.js.map +7 -1
- package/dist/duplicates-ind1.test.js +40 -0
- package/dist/duplicates-ind1.test.js.map +7 -0
- package/dist/empty-fields.js +10 -22
- package/dist/empty-fields.js.map +7 -1
- package/dist/empty-fields.test.js +129 -0
- package/dist/empty-fields.test.js.map +7 -0
- package/dist/ending-punctuation-conf.js +871 -769
- package/dist/ending-punctuation-conf.js.map +7 -1
- package/dist/ending-punctuation.js +84 -167
- package/dist/ending-punctuation.js.map +7 -1
- package/dist/ending-punctuation.test.js +2290 -0
- package/dist/ending-punctuation.test.js.map +7 -0
- package/dist/ending-whitespace.js +10 -35
- package/dist/ending-whitespace.js.map +7 -1
- package/dist/ending-whitespace.test.js +38 -0
- package/dist/ending-whitespace.test.js.map +7 -0
- package/dist/field-008-18-34-character-groups.js +40 -125
- package/dist/field-008-18-34-character-groups.js.map +7 -1
- package/dist/field-008-18-34-character-groups.test.js +45 -0
- package/dist/field-008-18-34-character-groups.test.js.map +7 -0
- package/dist/field-505-separators.js +19 -39
- package/dist/field-505-separators.js.map +7 -1
- package/dist/field-505-separators.test.js +45 -0
- package/dist/field-505-separators.test.js.map +7 -0
- package/dist/field-521-fix.js +19 -47
- package/dist/field-521-fix.js.map +7 -1
- package/dist/field-521-fix.test.js +44 -0
- package/dist/field-521-fix.test.js.map +7 -0
- package/dist/field-exclusion.js +37 -91
- package/dist/field-exclusion.js.map +7 -1
- package/dist/field-exclusion.test.js +821 -0
- package/dist/field-exclusion.test.js.map +7 -0
- package/dist/field-structure.js +52 -104
- package/dist/field-structure.js.map +7 -1
- package/dist/field-structure.test.js +587 -0
- package/dist/field-structure.test.js.map +7 -0
- package/dist/field33XUtils.js +119 -503
- package/dist/field33XUtils.js.map +7 -1
- package/dist/fields-present.js +11 -23
- package/dist/fields-present.js.map +7 -1
- package/dist/fields-present.test.js +95 -0
- package/dist/fields-present.test.js.map +7 -0
- package/dist/fix-33X.js +393 -431
- package/dist/fix-33X.js.map +7 -1
- package/dist/fix-33X.test.js +39 -0
- package/dist/fix-33X.test.js.map +7 -0
- package/dist/fix-country-codes.js +20 -50
- package/dist/fix-country-codes.js.map +7 -1
- package/dist/fix-country-codes.test.js +44 -0
- package/dist/fix-country-codes.test.js.map +7 -0
- package/dist/fix-language-codes.js +23 -53
- package/dist/fix-language-codes.js.map +7 -1
- package/dist/fix-language-codes.test.js +38 -0
- package/dist/fix-language-codes.test.js.map +7 -0
- package/dist/fixRelatorTerms.js +82 -209
- package/dist/fixRelatorTerms.js.map +7 -1
- package/dist/fixRelatorTerms.test.js +44 -0
- package/dist/fixRelatorTerms.test.js.map +7 -0
- package/dist/fixed-fields.js +21 -30
- package/dist/fixed-fields.js.map +7 -1
- package/dist/fixed-fields.test.js +87 -0
- package/dist/fixed-fields.test.js.map +7 -0
- package/dist/identical-fields.js +8 -24
- package/dist/identical-fields.js.map +7 -1
- package/dist/identical-fields.test.js +119 -0
- package/dist/identical-fields.test.js.map +7 -0
- package/dist/index.js +119 -413
- package/dist/index.js.map +7 -1
- package/dist/indicator-fixes.js +57 -95
- package/dist/indicator-fixes.js.map +7 -1
- package/dist/indicator-fixes.test.js +42 -0
- package/dist/indicator-fixes.test.js.map +7 -0
- package/dist/isbn-issn.js +66 -126
- package/dist/isbn-issn.js.map +7 -1
- package/dist/isbn-issn.test.js +398 -0
- package/dist/isbn-issn.test.js.map +7 -0
- package/dist/item-language.js +32 -65
- package/dist/item-language.js.map +7 -1
- package/dist/item-language.test.js +322 -0
- package/dist/item-language.test.js.map +7 -0
- package/dist/melindaCustomMergeFields.js +5182 -11233
- package/dist/melindaCustomMergeFields.js.map +7 -1
- package/dist/merge-fields/controlSubfields.js +75 -142
- package/dist/merge-fields/controlSubfields.js.map +7 -1
- package/dist/merge-fields/counterpartField.js +182 -379
- package/dist/merge-fields/counterpartField.js.map +7 -1
- package/dist/merge-fields/index.js +15 -49
- package/dist/merge-fields/index.js.map +7 -1
- package/dist/merge-fields/mergableIndicator.js +18 -51
- package/dist/merge-fields/mergableIndicator.js.map +7 -1
- package/dist/merge-fields/mergableTag.js +78 -30
- package/dist/merge-fields/mergableTag.js.map +7 -1
- package/dist/merge-fields/mergeConfig.js +66 -171
- package/dist/merge-fields/mergeConfig.js.map +7 -1
- package/dist/merge-fields/mergeConstraints.js +323 -1214
- package/dist/merge-fields/mergeConstraints.js.map +7 -1
- package/dist/merge-fields/mergeField.js +47 -111
- package/dist/merge-fields/mergeField.js.map +7 -1
- package/dist/merge-fields/mergeIndicator.js +64 -118
- package/dist/merge-fields/mergeIndicator.js.map +7 -1
- package/dist/merge-fields/mergeOrAddPostprocess.js +14 -38
- package/dist/merge-fields/mergeOrAddPostprocess.js.map +7 -1
- package/dist/merge-fields/mergeOrAddSubfield.js +62 -104
- package/dist/merge-fields/mergeOrAddSubfield.js.map +7 -1
- package/dist/merge-fields/mergeSubfield.js +47 -95
- package/dist/merge-fields/mergeSubfield.js.map +7 -1
- package/dist/merge-fields/removeDuplicateSubfields.js +18 -31
- package/dist/merge-fields/removeDuplicateSubfields.js.map +7 -1
- package/dist/merge-fields/worldKnowledge.js +15 -40
- package/dist/merge-fields/worldKnowledge.js.map +7 -1
- package/dist/merge-fields.test.js +44 -0
- package/dist/merge-fields.test.js.map +7 -0
- package/dist/mergeField500Lisapainokset.js +28 -57
- package/dist/mergeField500Lisapainokset.js.map +7 -1
- package/dist/mergeField500Lisapainokset.test.js +44 -0
- package/dist/mergeField500Lisapainokset.test.js.map +7 -0
- package/dist/mergeRelatorTermFields.js +33 -69
- package/dist/mergeRelatorTermFields.js.map +7 -1
- package/dist/mergeRelatorTermFields.test.js +44 -0
- package/dist/mergeRelatorTermFields.test.js.map +7 -0
- package/dist/modernize-502.js +23 -55
- package/dist/modernize-502.js.map +7 -1
- package/dist/modernize-502.test.js +38 -0
- package/dist/modernize-502.test.js.map +7 -0
- package/dist/multiple-subfield-0.js +23 -48
- package/dist/multiple-subfield-0.js.map +7 -1
- package/dist/multiple-subfield-0.test.js +44 -0
- package/dist/multiple-subfield-0.test.js.map +7 -0
- package/dist/non-breaking-space.js +11 -32
- package/dist/non-breaking-space.js.map +7 -1
- package/dist/non-breaking-space.test.js +38 -0
- package/dist/non-breaking-space.test.js.map +7 -0
- package/dist/normalize-dashes.js +18 -37
- package/dist/normalize-dashes.js.map +7 -1
- package/dist/normalize-dashes.test.js +44 -0
- package/dist/normalize-dashes.test.js.map +7 -0
- package/dist/normalize-identifiers.js +54 -140
- package/dist/normalize-identifiers.js.map +7 -1
- package/dist/normalize-identifiers.test.js +44 -0
- package/dist/normalize-identifiers.test.js.map +7 -0
- package/dist/normalize-qualifying-information.js +23 -48
- package/dist/normalize-qualifying-information.js.map +7 -1
- package/dist/normalize-qualifying-information.test.js +44 -0
- package/dist/normalize-qualifying-information.test.js.map +7 -0
- package/dist/normalize-utf8-diacritics.js +19 -105
- package/dist/normalize-utf8-diacritics.js.map +7 -1
- package/dist/normalize-utf8-diacritics.test.js +44 -0
- package/dist/normalize-utf8-diacritics.test.js.map +7 -0
- package/dist/normalizeFieldForComparison.js +67 -158
- package/dist/normalizeFieldForComparison.js.map +7 -1
- package/dist/normalizeSubfieldValueForComparison.js +37 -77
- package/dist/normalizeSubfieldValueForComparison.js.map +7 -1
- package/dist/prepublicationUtils.js +58 -111
- package/dist/prepublicationUtils.js.map +7 -1
- package/dist/punctuation/index.js +56 -72
- package/dist/punctuation/index.js.map +7 -1
- package/dist/punctuation/rules/aut.js +372 -331
- package/dist/punctuation/rules/aut.js.map +7 -1
- package/dist/punctuation/rules/bib.js +420 -373
- package/dist/punctuation/rules/bib.js.map +7 -1
- package/dist/punctuation/rules/index.js +7 -21
- package/dist/punctuation/rules/index.js.map +7 -1
- package/dist/punctuation.test.js +44 -0
- package/dist/punctuation.test.js.map +7 -0
- package/dist/punctuation2.js +251 -800
- package/dist/punctuation2.js.map +7 -1
- package/dist/punctuation2.test.js +44 -0
- package/dist/punctuation2.test.js.map +7 -0
- package/dist/reindexSubfield6OccurenceNumbers.js +61 -96
- package/dist/reindexSubfield6OccurenceNumbers.js.map +7 -1
- package/dist/reindexSubfield6OccurenceNumbers.test.js +44 -0
- package/dist/reindexSubfield6OccurenceNumbers.test.js.map +7 -0
- package/dist/removeDuplicateDataFields.js +102 -202
- package/dist/removeDuplicateDataFields.js.map +7 -1
- package/dist/removeDuplicateDataFields.test.js +44 -0
- package/dist/removeDuplicateDataFields.test.js.map +7 -0
- package/dist/removeInferiorDataFields.js +103 -227
- package/dist/removeInferiorDataFields.js.map +7 -1
- package/dist/removeInferiorDataFields.test.js +44 -0
- package/dist/removeInferiorDataFields.test.js.map +7 -0
- package/dist/resolvable-ext-references-melinda.js +25 -60
- package/dist/resolvable-ext-references-melinda.js.map +7 -1
- package/dist/resolvable-ext-references-melinda.test.js +160 -0
- package/dist/resolvable-ext-references-melinda.test.js.map +7 -0
- package/dist/resolveOrphanedSubfield6s.js +33 -64
- package/dist/resolveOrphanedSubfield6s.js.map +7 -1
- package/dist/resolveOrphanedSubfield6s.test.js +44 -0
- package/dist/resolveOrphanedSubfield6s.test.js.map +7 -0
- package/dist/sanitize-vocabulary-source-codes.js +27 -55
- package/dist/sanitize-vocabulary-source-codes.js.map +7 -1
- package/dist/sanitize-vocabulary-source-codes.test.js +45 -0
- package/dist/sanitize-vocabulary-source-codes.test.js.map +7 -0
- package/dist/sort-tags.js +13 -25
- package/dist/sort-tags.js.map +7 -1
- package/dist/sort-tags.test.js +261 -0
- package/dist/sort-tags.test.js.map +7 -0
- package/dist/sortFields.js +152 -222
- package/dist/sortFields.js.map +7 -1
- package/dist/sortFields.test.js +44 -0
- package/dist/sortFields.test.js.map +7 -0
- package/dist/sortRelatorTerms.js +30 -68
- package/dist/sortRelatorTerms.js.map +7 -1
- package/dist/sortRelatorTerms.test.js +44 -0
- package/dist/sortRelatorTerms.test.js.map +7 -0
- package/dist/sortSubfields.js +102 -255
- package/dist/sortSubfields.js.map +7 -1
- package/dist/sortSubfields.test.js +44 -0
- package/dist/sortSubfields.test.js.map +7 -0
- package/dist/stripPunctuation.js +13 -36
- package/dist/stripPunctuation.js.map +7 -1
- package/dist/stripPunctuation.test.js +44 -0
- package/dist/stripPunctuation.test.js.map +7 -0
- package/dist/subfield-exclusion.js +28 -75
- package/dist/subfield-exclusion.js.map +7 -1
- package/dist/subfield-exclusion.test.js +471 -0
- package/dist/subfield-exclusion.test.js.map +7 -0
- package/dist/subfield6Utils.js +107 -269
- package/dist/subfield6Utils.js.map +7 -1
- package/dist/subfield8Utils.js +26 -50
- package/dist/subfield8Utils.js.map +7 -1
- package/dist/subfieldValueNormalizations.js +40 -74
- package/dist/subfieldValueNormalizations.js.map +7 -1
- package/dist/subfieldValueNormalizations.test.js +45 -0
- package/dist/subfieldValueNormalizations.test.js.map +7 -0
- package/dist/sync-007-and-300.js +22 -53
- package/dist/sync-007-and-300.js.map +7 -1
- package/dist/sync-007-and-300.test.js +44 -0
- package/dist/sync-007-and-300.test.js.map +7 -0
- package/dist/translate-terms.js +67 -155
- package/dist/translate-terms.js.map +7 -1
- package/dist/translate-terms.test.js +44 -0
- package/dist/translate-terms.test.js.map +7 -0
- package/dist/typeOfDate-008.js +10 -25
- package/dist/typeOfDate-008.js.map +7 -1
- package/dist/typeOfDate-008.test.js +40 -0
- package/dist/typeOfDate-008.test.js.map +7 -0
- package/dist/unicode-decomposition.js +94 -107
- package/dist/unicode-decomposition.js.map +7 -1
- package/dist/unicode-decomposition.test.js +94 -0
- package/dist/unicode-decomposition.test.js.map +7 -0
- package/dist/update-field-540.js +30 -75
- package/dist/update-field-540.js.map +7 -1
- package/dist/update-field-540.test.js +44 -0
- package/dist/update-field-540.test.js.map +7 -0
- package/dist/urn.js +55 -128
- package/dist/urn.js.map +7 -1
- package/dist/urn.test.js +44 -0
- package/dist/urn.test.js.map +7 -0
- package/dist/utils.js +72 -126
- package/dist/utils.js.map +7 -1
- package/eslint.config.mjs +1 -2
- package/package.json +21 -93
- package/src/access-rights.js +1 -1
- package/src/{access-rights.spec.js → access-rights.test.js} +9 -10
- package/src/addMissingField041.js +1 -1
- package/src/{addMissingField336.spec.js → addMissingField041.test.js} +13 -14
- package/src/addMissingField336.js +3 -3
- package/src/{addMissingField041.spec.js → addMissingField336.test.js} +13 -14
- package/src/addMissingField337.js +2 -2
- package/src/{addMissingField337.spec.js → addMissingField337.test.js} +13 -14
- package/src/addMissingField338.js +2 -2
- package/src/{addMissingField338.spec.js → addMissingField338.test.js} +13 -14
- package/src/cyrillux-usemarcon-replacement.js +18 -18
- package/src/cyrillux-usemarcon-replacement.test.js +55 -0
- package/src/cyrillux.js +19 -12
- package/src/{cyrillux.spec.js → cyrillux.test.js} +13 -14
- package/src/disambiguateSeriesStatements.js +2 -2
- package/src/{disambiguateSeriesStatements.spec.js → disambiguateSeriesStatements.test.js} +12 -13
- package/src/double-commas.js +1 -1
- package/src/{double-commas.spec.js → double-commas.test.js} +9 -11
- package/src/duplicates-ind1.js +1 -1
- package/src/{duplicates-ind1.spec.js → duplicates-ind1.test.js} +12 -13
- package/src/{empty-fields.spec.js → empty-fields.test.js} +11 -13
- package/src/ending-punctuation.js +1 -1
- package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +172 -173
- package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
- package/src/field-008-18-34-character-groups.js +2 -2
- package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
- package/src/field-505-separators.js +3 -3
- package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
- package/src/field-521-fix.js +2 -2
- package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
- package/src/field-exclusion.js +1 -1
- package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
- package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
- package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
- package/src/fix-33X.js +4 -4
- package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
- package/src/fix-country-codes.js +1 -1
- package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
- package/src/fix-language-codes.js +5 -5
- package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
- package/src/fixRelatorTerms.js +5 -5
- package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
- package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
- package/src/identical-fields.js +1 -1
- package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
- package/src/indicator-fixes.js +3 -3
- package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
- package/src/isbn-issn.js +1 -1
- package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
- package/src/{item-language.spec.js → item-language.test.js} +21 -22
- package/src/merge-fields/controlSubfields.js +1 -1
- package/src/merge-fields/counterpartField.js +8 -9
- package/src/merge-fields/index.js +1 -1
- package/src/merge-fields/mergableIndicator.js +1 -1
- package/src/merge-fields/mergeField.js +6 -6
- package/src/merge-fields/mergeIndicator.js +1 -1
- package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
- package/src/merge-fields/mergeOrAddSubfield.js +2 -2
- package/src/merge-fields/mergeSubfield.js +4 -4
- package/src/merge-fields/removeDuplicateSubfields.js +2 -2
- package/src/{merge-fields.spec.js → merge-fields.test.js} +12 -13
- package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
- package/src/mergeRelatorTermFields.js +5 -7
- package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
- package/src/modernize-502.js +1 -1
- package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
- package/src/multiple-subfield-0.js +3 -3
- package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
- package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
- package/src/normalize-dashes.js +2 -2
- package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
- package/src/normalize-identifiers.js +1 -1
- package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
- package/src/normalize-qualifying-information.js +2 -2
- package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
- package/src/normalize-utf8-diacritics.js +2 -2
- package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
- package/src/normalizeFieldForComparison.js +6 -6
- package/src/normalizeSubfieldValueForComparison.js +1 -1
- package/src/prepublicationUtils.js +4 -4
- package/src/punctuation/index.js +1 -1
- package/src/punctuation/rules/index.js +2 -2
- package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
- package/src/punctuation2.js +4 -4
- package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
- package/src/reindexSubfield6OccurenceNumbers.js +5 -7
- package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
- package/src/removeDuplicateDataFields.js +11 -19
- package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
- package/src/removeInferiorDataFields.js +11 -11
- package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
- package/src/resolvable-ext-references-melinda.js +1 -1
- package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
- package/src/resolveOrphanedSubfield6s.js +5 -5
- package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
- package/src/sanitize-vocabulary-source-codes.js +4 -4
- package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
- package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
- package/src/sortFields.js +4 -4
- package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
- package/src/sortRelatorTerms.js +3 -3
- package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
- package/src/sortSubfields.js +1 -1
- package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
- package/src/stripPunctuation.js +3 -3
- package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
- package/src/subfield-exclusion.js +1 -1
- package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
- package/src/subfield6Utils.js +6 -10
- package/src/subfield8Utils.js +4 -4
- package/src/subfieldValueNormalizations.js +3 -3
- package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
- package/src/sync-007-and-300.js +2 -2
- package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
- package/src/translate-terms.js +3 -3
- package/src/{translate-terms.spec.js → translate-terms.test.js} +13 -13
- package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
- package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
- package/src/update-field-540.js +2 -2
- package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
- package/src/urn.js +2 -2
- package/src/{urn.spec.js → urn.test.js} +12 -13
- package/src/utils.js +3 -3
- package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
- package/test-fixtures/field-505-separators/03/record.json +3 -0
- package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
- package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
- package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
- package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
- package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
- package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
- package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
- package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
- package/dist/access-rights.spec.js +0 -195
- package/dist/access-rights.spec.js.map +0 -1
- package/dist/addMissingField041.spec.js +0 -45
- package/dist/addMissingField041.spec.js.map +0 -1
- package/dist/addMissingField336.spec.js +0 -45
- package/dist/addMissingField336.spec.js.map +0 -1
- package/dist/addMissingField337.spec.js +0 -43
- package/dist/addMissingField337.spec.js.map +0 -1
- package/dist/addMissingField338.spec.js +0 -45
- package/dist/addMissingField338.spec.js.map +0 -1
- package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
- package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
- package/dist/cyrillux.spec.js +0 -46
- package/dist/cyrillux.spec.js.map +0 -1
- package/dist/disambiguateSeriesStatements.spec.js +0 -51
- package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
- package/dist/double-commas.spec.js +0 -73
- package/dist/double-commas.spec.js.map +0 -1
- package/dist/duplicates-ind1.spec.js +0 -45
- package/dist/duplicates-ind1.spec.js.map +0 -1
- package/dist/empty-fields.spec.js +0 -118
- package/dist/empty-fields.spec.js.map +0 -1
- package/dist/ending-punctuation.spec.js +0 -2654
- package/dist/ending-punctuation.spec.js.map +0 -1
- package/dist/ending-whitespace.spec.js +0 -42
- package/dist/ending-whitespace.spec.js.map +0 -1
- package/dist/field-008-18-34-character-groups.spec.js +0 -51
- package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
- package/dist/field-505-separators.spec.js +0 -51
- package/dist/field-505-separators.spec.js.map +0 -1
- package/dist/field-521-fix.spec.js +0 -51
- package/dist/field-521-fix.spec.js.map +0 -1
- package/dist/field-exclusion.spec.js +0 -1054
- package/dist/field-exclusion.spec.js.map +0 -1
- package/dist/field-structure.spec.js +0 -535
- package/dist/field-structure.spec.js.map +0 -1
- package/dist/fields-present.spec.js +0 -121
- package/dist/fields-present.spec.js.map +0 -1
- package/dist/fix-33X.spec.js +0 -45
- package/dist/fix-33X.spec.js.map +0 -1
- package/dist/fix-country-codes.spec.js +0 -51
- package/dist/fix-country-codes.spec.js.map +0 -1
- package/dist/fix-language-codes.spec.js +0 -44
- package/dist/fix-language-codes.spec.js.map +0 -1
- package/dist/fixRelatorTerms.spec.js +0 -51
- package/dist/fixRelatorTerms.spec.js.map +0 -1
- package/dist/fixed-fields.spec.js +0 -140
- package/dist/fixed-fields.spec.js.map +0 -1
- package/dist/identical-fields.spec.js +0 -99
- package/dist/identical-fields.spec.js.map +0 -1
- package/dist/indicator-fixes.spec.js +0 -51
- package/dist/indicator-fixes.spec.js.map +0 -1
- package/dist/isbn-issn.spec.js +0 -595
- package/dist/isbn-issn.spec.js.map +0 -1
- package/dist/item-language.spec.js +0 -306
- package/dist/item-language.spec.js.map +0 -1
- package/dist/melindaCustomMergeFields.json +0 -5120
- package/dist/merge-fields.spec.js +0 -51
- package/dist/merge-fields.spec.js.map +0 -1
- package/dist/mergeField500Lisapainokset.spec.js +0 -51
- package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
- package/dist/mergeRelatorTermFields.spec.js +0 -51
- package/dist/mergeRelatorTermFields.spec.js.map +0 -1
- package/dist/modernize-502.spec.js +0 -49
- package/dist/modernize-502.spec.js.map +0 -1
- package/dist/multiple-subfield-0.spec.js +0 -51
- package/dist/multiple-subfield-0.spec.js.map +0 -1
- package/dist/non-breaking-space.spec.js +0 -42
- package/dist/non-breaking-space.spec.js.map +0 -1
- package/dist/normalize-dashes.spec.js +0 -51
- package/dist/normalize-dashes.spec.js.map +0 -1
- package/dist/normalize-identifiers.spec.js +0 -51
- package/dist/normalize-identifiers.spec.js.map +0 -1
- package/dist/normalize-qualifying-information.spec.js +0 -51
- package/dist/normalize-qualifying-information.spec.js.map +0 -1
- package/dist/normalize-utf8-diacritics.spec.js +0 -51
- package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
- package/dist/punctuation.spec.js +0 -51
- package/dist/punctuation.spec.js.map +0 -1
- package/dist/punctuation2.spec.js +0 -51
- package/dist/punctuation2.spec.js.map +0 -1
- package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
- package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
- package/dist/removeDuplicateDataFields.spec.js +0 -51
- package/dist/removeDuplicateDataFields.spec.js.map +0 -1
- package/dist/removeInferiorDataFields.spec.js +0 -51
- package/dist/removeInferiorDataFields.spec.js.map +0 -1
- package/dist/resolvable-ext-references-melinda.spec.js +0 -166
- package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
- package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
- package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
- package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
- package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
- package/dist/sort-tags.spec.js +0 -207
- package/dist/sort-tags.spec.js.map +0 -1
- package/dist/sortFields.spec.js +0 -51
- package/dist/sortFields.spec.js.map +0 -1
- package/dist/sortRelatorTerms.spec.js +0 -51
- package/dist/sortRelatorTerms.spec.js.map +0 -1
- package/dist/sortSubfields.spec.js +0 -52
- package/dist/sortSubfields.spec.js.map +0 -1
- package/dist/stripPunctuation.spec.js +0 -51
- package/dist/stripPunctuation.spec.js.map +0 -1
- package/dist/subfield-exclusion.spec.js +0 -523
- package/dist/subfield-exclusion.spec.js.map +0 -1
- package/dist/subfieldValueNormalizations.spec.js +0 -51
- package/dist/subfieldValueNormalizations.spec.js.map +0 -1
- package/dist/sync-007-and-300.spec.js +0 -51
- package/dist/sync-007-and-300.spec.js.map +0 -1
- package/dist/translate-terms.spec.js +0 -51
- package/dist/translate-terms.spec.js.map +0 -1
- package/dist/typeOfDate-008.spec.js +0 -47
- package/dist/typeOfDate-008.spec.js.map +0 -1
- package/dist/unicode-decomposition.spec.js +0 -91
- package/dist/unicode-decomposition.spec.js.map +0 -1
- package/dist/update-field-540.spec.js +0 -51
- package/dist/update-field-540.spec.js.map +0 -1
- package/dist/urn.spec.js +0 -52
- package/dist/urn.spec.js.map +0 -1
- package/src/cyrillux-usemarcon-replacement.spec.js +0 -47
|
@@ -1,76 +1,44 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
var _removeDuplicateDataFields = require("./removeDuplicateDataFields");
|
|
12
|
-
var _subfield6Utils = require("./subfield6Utils");
|
|
13
|
-
var _utils = require("./utils");
|
|
14
|
-
var _subfield8Utils = require("./subfield8Utils");
|
|
15
|
-
var _prepublicationUtils = require("./prepublicationUtils");
|
|
16
|
-
var _normalizeFieldForComparison = require("./normalizeFieldForComparison");
|
|
17
|
-
var _normalizeUtf8Diacritics = require("./normalize-utf8-diacritics");
|
|
18
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
|
-
// Relocated from melinda-marc-record-merge-reducers (and renamed)
|
|
20
|
-
|
|
21
|
-
// NB! This validator handles only full fields, and does not support subfield $8 removal.
|
|
22
|
-
// Also, having multiple $8 subfields in same fields is not supported.
|
|
23
|
-
// If this functionality is needed, see removeDuplicateDatafields.js for examples of subfield-only stuff.
|
|
24
|
-
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:removeInferiorDataFields');
|
|
25
|
-
function _default() {
|
|
1
|
+
import createDebugLogger from "debug";
|
|
2
|
+
import { fieldToChain, sameField } from "./removeDuplicateDataFields.js";
|
|
3
|
+
import { fieldGetOccurrenceNumberPairs, fieldHasValidSubfield6, fieldSevenToOneOccurrenceNumber, fieldsToNormalizedString } from "./subfield6Utils.js";
|
|
4
|
+
import { fieldHasSubfield, fieldsToString, fieldToString, nvdebug, uniqArray } from "./utils.js";
|
|
5
|
+
import { fieldHasValidSubfield8 } from "./subfield8Utils.js";
|
|
6
|
+
import { encodingLevelIsBetterThanPrepublication, fieldRefersToKoneellisestiTuotettuTietue, getEncodingLevel } from "./prepublicationUtils.js";
|
|
7
|
+
import { cloneAndNormalizeFieldForComparison } from "./normalizeFieldForComparison.js";
|
|
8
|
+
import { fixComposition, precomposeFinnishLetters } from "./normalize-utf8-diacritics.js";
|
|
9
|
+
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:removeInferiorDataFields");
|
|
10
|
+
export default function() {
|
|
26
11
|
return {
|
|
27
|
-
description:
|
|
12
|
+
description: "Remove subset data fields. Certain exceptions apply, mainly too complicated for chained fields",
|
|
28
13
|
validate,
|
|
29
14
|
fix
|
|
30
15
|
};
|
|
31
16
|
function fix(record) {
|
|
32
|
-
|
|
33
|
-
const res = {
|
|
34
|
-
message: [],
|
|
35
|
-
fix: [],
|
|
36
|
-
valid: true
|
|
37
|
-
};
|
|
17
|
+
nvdebug("Fix record: remove inferior (eg. subset) data fields", debug);
|
|
18
|
+
const res = { message: [], fix: [], valid: true };
|
|
38
19
|
removeInferiorDatafields(record, true);
|
|
39
|
-
// This can not really fail...
|
|
40
20
|
return res;
|
|
41
21
|
}
|
|
42
22
|
function validate(record) {
|
|
43
|
-
|
|
44
|
-
(0, _utils.nvdebug)('Validate record: remove inferior (eg. subset) data fields', debug);
|
|
23
|
+
nvdebug("Validate record: remove inferior (eg. subset) data fields", debug);
|
|
45
24
|
const duplicates = removeInferiorDatafields(record, false);
|
|
46
|
-
const res = {
|
|
47
|
-
message: duplicates
|
|
48
|
-
};
|
|
25
|
+
const res = { message: duplicates };
|
|
49
26
|
res.valid = res.message.length < 1;
|
|
50
27
|
return res;
|
|
51
28
|
}
|
|
52
29
|
}
|
|
53
30
|
function deriveInferiorChains(fields, record) {
|
|
54
|
-
//nvdebug(`======= GOT ${fields.length} FIELDS TO CHAINIFY`);
|
|
55
31
|
const hash = {};
|
|
56
|
-
fields.forEach(f => fieldToChainToDeletables(f));
|
|
57
|
-
|
|
32
|
+
fields.forEach((f) => fieldToChainToDeletables(f));
|
|
58
33
|
return hash;
|
|
59
|
-
|
|
60
|
-
//nvdebug(`WP1: GOT ${todoList.length} CHAINS`);
|
|
61
|
-
|
|
62
|
-
// here we map deletableStringObject[str] => field. The idea is to help debugging. We don't actually need the field object...
|
|
63
|
-
//return deriveChainDeletables(todoList);
|
|
64
|
-
|
|
65
34
|
function fieldToChainToDeletables(field) {
|
|
66
|
-
const chain =
|
|
35
|
+
const chain = fieldToChain(field, record);
|
|
67
36
|
if (chain.length < 2) {
|
|
68
37
|
return;
|
|
69
38
|
}
|
|
70
|
-
const chainAsString =
|
|
39
|
+
const chainAsString = fieldsToNormalizedString(chain, 0, true, true);
|
|
71
40
|
const arr = deriveChainDeletables([chainAsString]);
|
|
72
|
-
|
|
73
|
-
arr.forEach(val => {
|
|
41
|
+
arr.forEach((val) => {
|
|
74
42
|
if (!(val in hash)) {
|
|
75
43
|
hash[val] = field;
|
|
76
44
|
}
|
|
@@ -78,19 +46,13 @@ function deriveInferiorChains(fields, record) {
|
|
|
78
46
|
}
|
|
79
47
|
function deriveChainDeletables(todoList, deletables = []) {
|
|
80
48
|
const [chainAsString, ...stillToDo] = todoList;
|
|
81
|
-
if (chainAsString ===
|
|
49
|
+
if (chainAsString === void 0) {
|
|
82
50
|
return deletables;
|
|
83
51
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
// Remove keepless versions:
|
|
89
|
-
const keepless = chainAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');
|
|
90
|
-
|
|
91
|
-
// MRA-433: 490 ind1=1 vs ind1=0: remove latter (luckily no 2nd indicator etc)
|
|
92
|
-
const linked490Ind1 = chainAsString.replace(/^490 1/u, '490 0').replace(/\t880 1/ug, '\t880 0');
|
|
93
|
-
const arr = [withoutScriptIdentificationCode, keepless, linked490Ind1].filter(val => val !== chainAsString);
|
|
52
|
+
const withoutScriptIdentificationCode = chainAsString.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\/[^ ]+/u, "$1");
|
|
53
|
+
const keepless = chainAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, "");
|
|
54
|
+
const linked490Ind1 = chainAsString.replace(/^490 1/u, "490 0").replace(/\t880 1/ug, " 880 0");
|
|
55
|
+
const arr = [withoutScriptIdentificationCode, keepless, linked490Ind1].filter((val) => val !== chainAsString);
|
|
94
56
|
if (arr.length > 0) {
|
|
95
57
|
return deriveChainDeletables([...stillToDo, ...arr], [...deletables, ...arr]);
|
|
96
58
|
}
|
|
@@ -98,147 +60,104 @@ function deriveInferiorChains(fields, record) {
|
|
|
98
60
|
}
|
|
99
61
|
}
|
|
100
62
|
function isRelevantChain6(field, record) {
|
|
101
|
-
|
|
102
|
-
if (!(0, _subfield6Utils.fieldHasValidSubfield6)(field) && !(0, _subfield8Utils.fieldHasValidSubfield8)(field)) {
|
|
63
|
+
if (!fieldHasValidSubfield6(field) && !fieldHasValidSubfield8(field)) {
|
|
103
64
|
return false;
|
|
104
65
|
}
|
|
105
|
-
|
|
106
|
-
const chain = (0, _removeDuplicateDataFields.fieldToChain)(field, record);
|
|
66
|
+
const chain = fieldToChain(field, record);
|
|
107
67
|
if (chain.length < 2) {
|
|
108
68
|
return false;
|
|
109
69
|
}
|
|
110
|
-
|
|
111
|
-
if (chain.some(f => f.subfields.filter(sf => sf.code === '6').length > 1)) {
|
|
70
|
+
if (chain.some((f) => f.subfields.filter((sf) => sf.code === "6").length > 1)) {
|
|
112
71
|
return false;
|
|
113
72
|
}
|
|
114
|
-
|
|
115
|
-
// Check whether our field is the head of a chain:
|
|
116
|
-
return (0, _removeDuplicateDataFields.sameField)(field, chain[0]);
|
|
73
|
+
return sameField(field, chain[0]);
|
|
117
74
|
}
|
|
118
|
-
function removeInferiorChains(record, fix = true) {
|
|
119
|
-
const fields = record.fields.filter(f => isRelevantChain6(f, record));
|
|
120
|
-
//nvdebug(`WP2.0: GOT ${fields.length} chain(s)`);
|
|
121
|
-
|
|
75
|
+
export function removeInferiorChains(record, fix = true) {
|
|
76
|
+
const fields = record.fields.filter((f) => isRelevantChain6(f, record));
|
|
122
77
|
const deletableChainsAsKeys = deriveInferiorChains(fields, record);
|
|
123
78
|
const nChains = Object.keys(deletableChainsAsKeys).length;
|
|
124
|
-
//nvdebug(`WP2: GOT ${nChains} chain(s)`);
|
|
125
79
|
if (nChains === 0) {
|
|
126
80
|
return [];
|
|
127
81
|
}
|
|
128
|
-
|
|
129
|
-
//nvdebug(`removeInferiorChains() has ${fields.length} fields-in-chain(s), and a list of ${nChains} deletable(s)`);
|
|
130
|
-
|
|
131
82
|
return innerRemoveInferiorChains(fields);
|
|
132
|
-
function innerRemoveInferiorChains(
|
|
133
|
-
const [currField, ...remainingFields] =
|
|
134
|
-
if (currField ===
|
|
83
|
+
function innerRemoveInferiorChains(fields2, deletedStringsArray = []) {
|
|
84
|
+
const [currField, ...remainingFields] = fields2;
|
|
85
|
+
if (currField === void 0) {
|
|
135
86
|
return deletedStringsArray;
|
|
136
87
|
}
|
|
137
|
-
const chain =
|
|
138
|
-
if (chain.length === 0 || !
|
|
88
|
+
const chain = fieldToChain(currField, record);
|
|
89
|
+
if (chain.length === 0 || !sameField(currField, chain[0])) {
|
|
139
90
|
return innerRemoveInferiorChains(remainingFields, deletedStringsArray);
|
|
140
91
|
}
|
|
141
|
-
const chainAsString =
|
|
92
|
+
const chainAsString = fieldsToNormalizedString(chain, 0, true, true);
|
|
142
93
|
if (!(chainAsString in deletableChainsAsKeys)) {
|
|
143
94
|
return innerRemoveInferiorChains(remainingFields, deletedStringsArray);
|
|
144
95
|
}
|
|
145
96
|
const triggeringField = deletableChainsAsKeys[chainAsString];
|
|
146
|
-
const triggeringChain =
|
|
147
|
-
|
|
148
|
-
// If the inferior (deletable) chain is 1XX-based, convert the triggering better chain from 7XX to 1XX:
|
|
97
|
+
const triggeringChain = fieldToChain(triggeringField, record);
|
|
149
98
|
if (chainContains1XX(chain)) {
|
|
150
|
-
triggeringChain.forEach(f => sevenToOne(f, triggeringChain));
|
|
99
|
+
triggeringChain.forEach((f) => sevenToOne(f, triggeringChain));
|
|
151
100
|
}
|
|
152
|
-
|
|
153
|
-
const
|
|
154
|
-
const message = `DEL: '${deletedString}' REASON: '${(0, _utils.fieldsToString)(triggeringChain)}'`;
|
|
101
|
+
const deletedString = fieldsToString(chain);
|
|
102
|
+
const message = `DEL: '${deletedString}' REASON: '${fieldsToString(triggeringChain)}'`;
|
|
155
103
|
if (fix) {
|
|
156
|
-
|
|
157
|
-
chain.forEach(field => record.removeField(field)); // eslint-disable-line array-callback-return
|
|
104
|
+
chain.forEach((field) => record.removeField(field));
|
|
158
105
|
}
|
|
159
106
|
return innerRemoveInferiorChains(remainingFields, [...deletedStringsArray, message]);
|
|
160
107
|
}
|
|
161
108
|
function chainContains1XX(chain) {
|
|
162
|
-
return chain.some(f => f.tag.substring(0, 1) ===
|
|
109
|
+
return chain.some((f) => f.tag.substring(0, 1) === "1");
|
|
163
110
|
}
|
|
164
111
|
function sevenToOne(field, chain) {
|
|
165
|
-
|
|
166
|
-
// NB! This function should be called only if the original 1XX gets deleted!
|
|
167
|
-
if (!['700', '710', '711', '730'].includes(field.tag)) {
|
|
112
|
+
if (!["700", "710", "711", "730"].includes(field.tag)) {
|
|
168
113
|
return;
|
|
169
114
|
}
|
|
170
|
-
|
|
171
|
-
const pairs = (0, _subfield6Utils.fieldGetOccurrenceNumberPairs)(field, chain);
|
|
115
|
+
const pairs = fieldGetOccurrenceNumberPairs(field, chain);
|
|
172
116
|
field.tag = `1${field.tag.substring(1)}`;
|
|
173
|
-
|
|
174
|
-
pairs.forEach(pairedField => (0, _subfield6Utils.fieldSevenToOneOccurrenceNumber)(pairedField)); // eslint-disable-line array-callback-return
|
|
117
|
+
pairs.forEach((pairedField) => fieldSevenToOneOccurrenceNumber(pairedField));
|
|
175
118
|
}
|
|
176
119
|
}
|
|
177
120
|
function getIdentifierlessAndKeeplessSubsets(fieldAsString) {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
const identifierlessString = fieldAsString.replace(/ ‡[01] [^‡]+($| ‡)/u, '$1');
|
|
182
|
-
const keeplessString = fieldAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');
|
|
183
|
-
return [identifierlessString, keeplessString].filter(val => val !== fieldAsString);
|
|
121
|
+
const identifierlessString = fieldAsString.replace(/ ‡[01] [^‡]+($| ‡)/u, "$1");
|
|
122
|
+
const keeplessString = fieldAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, "");
|
|
123
|
+
return [identifierlessString, keeplessString].filter((val) => val !== fieldAsString);
|
|
184
124
|
}
|
|
185
125
|
function deriveIndividualDeletables490(todoList, deletables = []) {
|
|
186
126
|
const [fieldAsString, ...stillToDo] = todoList;
|
|
187
|
-
if (fieldAsString ===
|
|
127
|
+
if (fieldAsString === void 0) {
|
|
188
128
|
return deletables;
|
|
189
129
|
}
|
|
190
|
-
//nvdebug(`PROCESS ${fieldAsString}`);
|
|
191
130
|
if (!fieldAsString.match(/^490/u)) {
|
|
192
131
|
return deriveIndividualDeletables490(stillToDo, deletables);
|
|
193
132
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
const
|
|
197
|
-
|
|
198
|
-
// Without final $v or $x:
|
|
199
|
-
const withoutFinalVOrX = fieldAsString.replace(/ *[;,] ‡[vx] [^‡]+$/u, '');
|
|
200
|
-
// Add intermediate $x-less version
|
|
201
|
-
const xless = fieldAsString.replace(/, ‡x [^‡]+(, ‡x| ; ‡v)/u, '$1');
|
|
202
|
-
|
|
203
|
-
// Add $xv-less version (handled by recursion?)
|
|
204
|
-
const xvless = fieldAsString.replace(/, ‡x [^‡]+ ‡v [^‡]+$/u, '');
|
|
205
|
-
|
|
206
|
-
// MRA-433-ish (non-chain): 490 ind1=1 vs ind1=0: remove latter
|
|
133
|
+
const sixless = fieldAsString.replace(/ ‡6 [^‡]+ ‡/u, " \u2021");
|
|
134
|
+
const withoutFinalVOrX = fieldAsString.replace(/ *[;,] ‡[vx] [^‡]+$/u, "");
|
|
135
|
+
const xless = fieldAsString.replace(/, ‡x [^‡]+(, ‡x| ; ‡v)/u, "$1");
|
|
136
|
+
const xvless = fieldAsString.replace(/, ‡x [^‡]+ ‡v [^‡]+$/u, "");
|
|
207
137
|
const modifiedInd2 = fieldAsString.match(/^490 1/u) ? `490 0${fieldAsString.substring(5)}` : fieldAsString;
|
|
208
|
-
const arr = [sixless, withoutFinalVOrX, xless, xvless, modifiedInd2].filter(val => val !== fieldAsString);
|
|
209
|
-
|
|
210
|
-
/*
|
|
211
|
-
if (arr.length) {
|
|
212
|
-
nvdebug(`${arr.length} derivation(s) for ${fieldAsString}`);
|
|
213
|
-
nvdebug(arr.join('\n'));
|
|
214
|
-
}
|
|
215
|
-
*/
|
|
138
|
+
const arr = [sixless, withoutFinalVOrX, xless, xvless, modifiedInd2].filter((val) => val !== fieldAsString);
|
|
216
139
|
return arr;
|
|
217
140
|
}
|
|
218
141
|
function deriveIndividualDeletables(record) {
|
|
219
|
-
const todoList = record.fields.map(f =>
|
|
220
|
-
//const finishedRecord = encodingLevelIsBetterThanPrepublication(getEncodingLevel(record));
|
|
221
|
-
|
|
142
|
+
const todoList = record.fields.map((f) => fieldToString(f));
|
|
222
143
|
const deletableStringsArray = processTodoList(todoList);
|
|
223
144
|
const inferiorTerms = getInferiorTerms(record);
|
|
224
|
-
return
|
|
225
|
-
function getInferiorTerms(
|
|
226
|
-
const inputFields =
|
|
227
|
-
const result = inputFields.flatMap(f => fieldToInferiorFields(f));
|
|
228
|
-
|
|
229
|
-
// console.log(result.join('\n')); // eslint-disable-line no-console
|
|
145
|
+
return uniqArray([...deletableStringsArray, ...inferiorTerms]);
|
|
146
|
+
function getInferiorTerms(record2) {
|
|
147
|
+
const inputFields = record2.fields.filter((f) => ["648", "650", "651"].includes(f.tag) && f.subfields);
|
|
148
|
+
const result = inputFields.flatMap((f) => fieldToInferiorFields(f));
|
|
230
149
|
return result;
|
|
231
150
|
}
|
|
232
151
|
function fieldToInferiorFields(field) {
|
|
233
|
-
const aArray = field.subfields.filter(sf => sf.code ===
|
|
234
|
-
if (field.tag ===
|
|
235
|
-
return aArray.flatMap(sf => [`653 ##
|
|
152
|
+
const aArray = field.subfields.filter((sf) => sf.code === "a");
|
|
153
|
+
if (field.tag === "650") {
|
|
154
|
+
return aArray.flatMap((sf) => [`653 ## \u2021a ${sf.value}`, `653 #0 \u2021a ${sf.value}`]);
|
|
236
155
|
}
|
|
237
|
-
return aArray.map(sf => `653 ##
|
|
156
|
+
return aArray.map((sf) => `653 ## \u2021a ${sf.value}`);
|
|
238
157
|
}
|
|
239
158
|
function processTodoList(thingsToDo, deletables = []) {
|
|
240
159
|
const [currString, ...stillToDo] = thingsToDo;
|
|
241
|
-
if (currString ===
|
|
160
|
+
if (currString === void 0) {
|
|
242
161
|
return deletables;
|
|
243
162
|
}
|
|
244
163
|
const accentless = getAccentlessVersion(currString);
|
|
@@ -246,155 +165,114 @@ function deriveIndividualDeletables(record) {
|
|
|
246
165
|
const subsets = getIdentifierlessAndKeeplessSubsets(currString);
|
|
247
166
|
const moreToDo = [...accentless, ...d490, ...subsets];
|
|
248
167
|
if (currString.match(/^[1678]00/u)) {
|
|
249
|
-
// Proof-of-concept rule. Should be improved eventually...
|
|
250
168
|
if (currString.match(/, ‡e [^‡]+\.$/u)) {
|
|
251
|
-
const tmp = currString.replace(/, ‡e [^‡]+\.$/u,
|
|
169
|
+
const tmp = currString.replace(/, ‡e [^‡]+\.$/u, ".");
|
|
252
170
|
return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);
|
|
253
171
|
}
|
|
254
172
|
}
|
|
255
173
|
if (currString.match(/^500 ## ‡a Lisäpainokset: Lisäpainos /u)) {
|
|
256
|
-
|
|
257
|
-
const
|
|
258
|
-
const tmp2 = currString.replace(' Lisäpainos ', ' ');
|
|
174
|
+
const tmp1 = currString.replace(" Lis\xE4painos ", " [Lis\xE4painos] ");
|
|
175
|
+
const tmp2 = currString.replace(" Lis\xE4painos ", " ");
|
|
259
176
|
if (tmp1 !== currString && tmp2 !== currString) {
|
|
260
177
|
return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp1, tmp2]);
|
|
261
178
|
}
|
|
262
179
|
}
|
|
263
180
|
if (currString.match(/^500 ## ‡a Lisäpainokset: \[Lisäpainos\] /u)) {
|
|
264
|
-
|
|
265
|
-
const tmp = currString.replace(' [Lisäpainos] ', ' ');
|
|
181
|
+
const tmp = currString.replace(" [Lis\xE4painos] ", " ");
|
|
266
182
|
if (tmp !== currString) {
|
|
267
183
|
return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);
|
|
268
184
|
}
|
|
269
185
|
}
|
|
270
186
|
if (currString.match(/^500 ## ‡a Ei vastaanotettu\.$/u)) {
|
|
271
|
-
|
|
272
|
-
return processTodoList([...stillToDo, ...moreToDo], [...deletables, '500 ## ‡a EI VASTAANOTETTU.']);
|
|
187
|
+
return processTodoList([...stillToDo, ...moreToDo], [...deletables, "500 ## \u2021a EI VASTAANOTETTU."]);
|
|
273
188
|
}
|
|
274
189
|
if (currString.match(/^500 ## ‡a Ei ilmesty\.$/u)) {
|
|
275
|
-
|
|
276
|
-
return processTodoList([...stillToDo, ...moreToDo], [...deletables, '500 ## ‡a EI ILMESTY.']);
|
|
190
|
+
return processTodoList([...stillToDo, ...moreToDo], [...deletables, "500 ## \u2021a EI ILMESTY."]);
|
|
277
191
|
}
|
|
278
192
|
if (currString.match(/^505 .0.*-- ‡t/u)) {
|
|
279
|
-
|
|
280
|
-
const tmp = currString.replace(/ -- ‡t /gu, ' -- ').
|
|
281
|
-
// remove non-initial $t subfields
|
|
282
|
-
replace(/ ‡[rg] /gu, ' ').
|
|
283
|
-
// remove $r and $g subfields
|
|
284
|
-
replace(/ ‡t /u, ' ‡a ').
|
|
285
|
-
// change first $t to $a
|
|
286
|
-
// ind2: '1' => '#':
|
|
287
|
-
replace(/^505 (.)0/u, '505 $1#');
|
|
193
|
+
const tmp = currString.replace(/ -- ‡t /gu, " -- ").replace(/ ‡[rg] /gu, " ").replace(/ ‡t /u, " \u2021a ").replace(/^505 (.)0/u, "505 $1#");
|
|
288
194
|
if (tmp !== currString) {
|
|
289
195
|
return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);
|
|
290
196
|
}
|
|
291
|
-
//nvdebug(`505 ORIGINAL: '${fieldAsString}'`)
|
|
292
|
-
//nvdebug(`505 DERIVATE: '${tmp}'`)
|
|
293
197
|
}
|
|
294
198
|
if (currString.match(/^594 ## ‡a Ei vastaanotettu ‡5 FENNI$/u)) {
|
|
295
|
-
|
|
296
|
-
return processTodoList([...stillToDo, ...moreToDo], [...deletables, '594 ## ‡a EI VASTAANOTETTU ‡5 FENNI']);
|
|
199
|
+
return processTodoList([...stillToDo, ...moreToDo], [...deletables, "594 ## \u2021a EI VASTAANOTETTU \u20215 FENNI"]);
|
|
297
200
|
}
|
|
298
201
|
if (currString.match(/^594 ## ‡a Ei ilmesty ‡5 FENNI$/u)) {
|
|
299
|
-
|
|
300
|
-
return processTodoList([...stillToDo, ...moreToDo], [...deletables, '594 ## ‡a EI ILMESTY ‡5 FENNI']);
|
|
202
|
+
return processTodoList([...stillToDo, ...moreToDo], [...deletables, "594 ## \u2021a EI ILMESTY \u20215 FENNI"]);
|
|
301
203
|
}
|
|
302
|
-
|
|
303
|
-
// MET-381: remove occurence number TAG-00, if TAG-NN existists
|
|
304
204
|
if (currString.match(/^880.* ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/u)) {
|
|
305
|
-
const tmp = currString.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/u,
|
|
306
|
-
//nvdebug(`MET-381: ADD TO DELETABLES: '${tmp}'`);
|
|
307
|
-
//deletableStringsArray.push(tmp);
|
|
205
|
+
const tmp = currString.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/u, "$1-00");
|
|
308
206
|
if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\/[^ ]+ /u)) {
|
|
309
|
-
const tmp2 = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/u,
|
|
310
|
-
//nvdebug(`MET-381: ADD TO DELETABLES: '${tmp2}'`);
|
|
207
|
+
const tmp2 = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/u, "$1");
|
|
311
208
|
return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp, tmp2]);
|
|
312
209
|
}
|
|
313
210
|
return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);
|
|
314
211
|
}
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
const inferiorTerms = getPrepublicationTerms(currString);
|
|
318
|
-
const newDeletables = [...deletables, ...subsets, ...accentless, ...d490, ...inferiorTerms];
|
|
212
|
+
const inferiorTerms2 = getPrepublicationTerms(currString);
|
|
213
|
+
const newDeletables = [...deletables, ...subsets, ...accentless, ...d490, ...inferiorTerms2];
|
|
319
214
|
if (subsets.length) {
|
|
320
215
|
return processTodoList([...stillToDo, ...moreToDo], newDeletables);
|
|
321
216
|
}
|
|
322
217
|
return processTodoList([...stillToDo, ...moreToDo], newDeletables);
|
|
323
218
|
}
|
|
324
219
|
function getAccentlessVersion(string) {
|
|
325
|
-
|
|
326
|
-
//nvdebug(`START: '${string}`);
|
|
327
|
-
// This is a sanity check: if precomposition does something, there's something wrong, and we don't want to proceed..
|
|
328
|
-
if (string !== (0, _normalizeUtf8Diacritics.precomposeFinnishLetters)(string)) {
|
|
220
|
+
if (string !== precomposeFinnishLetters(string)) {
|
|
329
221
|
return [];
|
|
330
222
|
}
|
|
331
|
-
const accentless = String(
|
|
332
|
-
//nvdebug(`FROM '${string}'\n TO '${accentless}'`);
|
|
223
|
+
const accentless = String(fixComposition(string)).replace(/\p{Diacritic}/gu, "");
|
|
333
224
|
if (accentless === string) {
|
|
334
|
-
// Don't self-destruct
|
|
335
225
|
return [];
|
|
336
226
|
}
|
|
337
227
|
return [accentless];
|
|
338
228
|
}
|
|
339
229
|
function getPrepublicationTerms(fieldAsString) {
|
|
340
230
|
if (fieldAsString.match(/^653./u)) {
|
|
341
|
-
|
|
342
|
-
return [`${fieldAsString} ‡g ENNAKKOTIETO`, `${fieldAsString} ‡g Ennakkotieto`, `${fieldAsString} ‡g ennakkotieto`, `${fieldAsString} ‡g ENNAKKOTIETO.`, `${fieldAsString} ‡g Ennakkotieto.`, `${fieldAsString} ‡g ennakkotieto.`];
|
|
231
|
+
return [`${fieldAsString} \u2021g ENNAKKOTIETO`, `${fieldAsString} \u2021g Ennakkotieto`, `${fieldAsString} \u2021g ennakkotieto`, `${fieldAsString} \u2021g ENNAKKOTIETO.`, `${fieldAsString} \u2021g Ennakkotieto.`, `${fieldAsString} \u2021g ennakkotieto.`];
|
|
343
232
|
}
|
|
344
233
|
return [];
|
|
345
234
|
}
|
|
346
235
|
}
|
|
347
236
|
function fieldToNormalizedString(field) {
|
|
348
|
-
const normalizedField =
|
|
349
|
-
return
|
|
237
|
+
const normalizedField = cloneAndNormalizeFieldForComparison(field);
|
|
238
|
+
return fieldToString(normalizedField);
|
|
350
239
|
}
|
|
351
240
|
function deriveIndividualNormalizedDeletables(record) {
|
|
352
|
-
|
|
353
|
-
const
|
|
354
|
-
const
|
|
355
|
-
const met495 = encodingLevel === '2' && record.fields.some(f => f.tag === '500' && (0, _prepublicationUtils.fieldRefersToKoneellisestiTuotettuTietue)(f));
|
|
241
|
+
const encodingLevel = getEncodingLevel(record);
|
|
242
|
+
const recordIsFinished = encodingLevelIsBetterThanPrepublication(encodingLevel);
|
|
243
|
+
const met495 = encodingLevel === "2" && record.fields.some((f) => f.tag === "500" && fieldRefersToKoneellisestiTuotettuTietue(f));
|
|
356
244
|
if (!recordIsFinished || met495) {
|
|
357
245
|
return [];
|
|
358
246
|
}
|
|
359
|
-
const relevantFields = record.fields.filter(f => [
|
|
247
|
+
const relevantFields = record.fields.filter((f) => ["245", "246"].includes(f.tag) && fieldHasSubfield(f, "a"));
|
|
360
248
|
return deriveDeletable946s(relevantFields);
|
|
361
249
|
function deriveDeletable946s(fields, results = []) {
|
|
362
250
|
const [currField, ...remainingFields] = fields;
|
|
363
|
-
if (currField ===
|
|
251
|
+
if (currField === void 0) {
|
|
364
252
|
return results;
|
|
365
253
|
}
|
|
366
254
|
const fieldAsNormalizedString = fieldToNormalizedString(currField);
|
|
367
|
-
const tmp = fieldAsNormalizedString.replace(/^(?:...) ../u,
|
|
368
|
-
|
|
369
|
-
replace(' ‡a ', ' ‡i nimeke onixissa ‡a ').
|
|
370
|
-
// Add $i before $a. NB! This is added in the normalized lower-cased form!
|
|
371
|
-
replace(/(?: \/)? ‡c[^‡]+$/u, ''); // Remove $c. (Can $c be non-last?)
|
|
372
|
-
const candArray = [tmp, `${tmp} ‡5 MELINDA`].filter(val => val !== fieldAsNormalizedString);
|
|
255
|
+
const tmp = fieldAsNormalizedString.replace(/^(?:...) ../u, "946 ##").replace(" \u2021a ", " \u2021i nimeke onixissa \u2021a ").replace(/(?: \/)? ‡c[^‡]+$/u, "");
|
|
256
|
+
const candArray = [tmp, `${tmp} \u20215 MELINDA`].filter((val) => val !== fieldAsNormalizedString);
|
|
373
257
|
if (candArray.length) {
|
|
374
258
|
return deriveDeletable946s(remainingFields, [...results, ...candArray]);
|
|
375
259
|
}
|
|
376
260
|
return deriveDeletable946s(remainingFields, results);
|
|
377
261
|
}
|
|
378
262
|
}
|
|
379
|
-
function removeIndividualInferiorDatafields(record, fix = true) {
|
|
380
|
-
// No $6 nor $8 in field
|
|
263
|
+
export function removeIndividualInferiorDatafields(record, fix = true) {
|
|
381
264
|
const deletableFieldsAsStrings = deriveIndividualDeletables(record);
|
|
382
265
|
const deletableFieldsAsNormalizedStrings = deriveIndividualNormalizedDeletables(record);
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
// nvdebug(`Normalized deletables:\n ${deletableFieldsAsNormalizedStrings.join('\n ')}`);
|
|
386
|
-
|
|
387
|
-
const hits = record.fields.filter(field => isDeletableField(field));
|
|
388
|
-
const deletedFieldsAsStrings = hits.map(f => (0, _utils.fieldToString)(f));
|
|
266
|
+
const hits = record.fields.filter((field) => isDeletableField(field));
|
|
267
|
+
const deletedFieldsAsStrings = hits.map((f) => fieldToString(f));
|
|
389
268
|
if (fix) {
|
|
390
|
-
hits.forEach(field => {
|
|
391
|
-
//nvdebug(`Remove inferior field: ${fieldToString(field)}`, debug);
|
|
269
|
+
hits.forEach((field) => {
|
|
392
270
|
record.removeField(field);
|
|
393
271
|
});
|
|
394
272
|
}
|
|
395
273
|
return deletedFieldsAsStrings;
|
|
396
274
|
function isDeletableField(field) {
|
|
397
|
-
const fieldAsString =
|
|
275
|
+
const fieldAsString = fieldToString(field);
|
|
398
276
|
if (deletableFieldsAsStrings.includes(fieldAsString)) {
|
|
399
277
|
return true;
|
|
400
278
|
}
|
|
@@ -405,16 +283,14 @@ function removeIndividualInferiorDatafields(record, fix = true) {
|
|
|
405
283
|
return false;
|
|
406
284
|
}
|
|
407
285
|
}
|
|
408
|
-
function removeInferiorDatafields(record, fix = true) {
|
|
409
|
-
const removables = removeIndividualInferiorDatafields(record, fix);
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
const removablesAll = removables.concat(removables6); //.concat(removables8);
|
|
417
|
-
|
|
286
|
+
export function removeInferiorDatafields(record, fix = true) {
|
|
287
|
+
const removables = removeIndividualInferiorDatafields(record, fix);
|
|
288
|
+
const removables6 = removeInferiorChains(record, fix);
|
|
289
|
+
nvdebug(`REMOVABLES:
|
|
290
|
+
${removables.join("\n ")}`, debug);
|
|
291
|
+
nvdebug(`REMOVABLES 6:
|
|
292
|
+
${removables6.join("\n ")}`, debug);
|
|
293
|
+
const removablesAll = removables.concat(removables6);
|
|
418
294
|
return removablesAll;
|
|
419
295
|
}
|
|
420
|
-
//# sourceMappingURL=removeInferiorDataFields.js.map
|
|
296
|
+
//# sourceMappingURL=removeInferiorDataFields.js.map
|