@natlibfi/marc-record-validators-melinda 11.6.7 → 12.0.0-alpha.12
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 → melinda-node-tests-and-publish.yml} +37 -12
- 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 +43 -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 +873 -769
- package/dist/ending-punctuation-conf.js.map +7 -1
- package/dist/ending-punctuation.js +156 -169
- package/dist/ending-punctuation.js.map +7 -1
- package/dist/ending-punctuation.test.js +2385 -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 +182 -413
- package/dist/index.js.map +7 -1
- package/dist/indicator-fixes.js +66 -94
- 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 +71 -128
- 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 +187 -379
- package/dist/merge-fields/counterpartField.js.map +7 -1
- package/dist/merge-fields/dataProvenance.js +29 -0
- package/dist/merge-fields/dataProvenance.js.map +7 -0
- package/dist/merge-fields/index.js +25 -50
- 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 +46 -0
- package/dist/merge-fields.test.js.map +7 -0
- package/dist/mergeField500Lisapainokset.js +27 -56
- 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 +91 -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 +259 -802
- 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 +104 -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 +32 -63
- 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 +54 -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 +78 -126
- package/dist/utils.js.map +7 -1
- package/eslint.config.mjs +1 -2
- package/package.json +28 -101
- 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.spec.js → cyrillux-usemarcon-replacement.test.js} +17 -14
- 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-conf.js +6 -5
- package/src/ending-punctuation.js +115 -24
- package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +357 -275
- package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
- package/src/field-008-18-34-character-groups.js +2 -2
- package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
- package/src/field-505-separators.js +3 -3
- package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
- package/src/field-521-fix.js +2 -2
- package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
- package/src/field-exclusion.js +1 -1
- package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
- package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
- package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
- package/src/fix-33X.js +4 -4
- package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
- package/src/fix-country-codes.js +1 -1
- package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
- package/src/fix-language-codes.js +5 -5
- package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
- package/src/fixRelatorTerms.js +5 -5
- package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
- package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
- package/src/identical-fields.js +1 -1
- package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
- package/src/index.js +132 -59
- package/src/indicator-fixes.js +17 -4
- package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
- package/src/isbn-issn.js +12 -7
- 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/melindaCustomMergeFields.js +1 -1
- package/src/merge-fields/controlSubfields.js +1 -1
- package/src/merge-fields/counterpartField.js +14 -9
- package/src/merge-fields/dataProvenance.js +41 -0
- package/src/merge-fields/index.js +12 -3
- package/src/merge-fields/mergableIndicator.js +1 -1
- package/src/merge-fields/mergeField.js +8 -8
- 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} +18 -15
- package/src/mergeField500Lisapainokset.js +1 -1
- 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 +32 -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 +17 -8
- 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 +15 -12
- 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 +6 -6
- 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 +8 -6
- 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.test.js +75 -0
- 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 +21 -5
- 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/indicator-fixes/10/expectedResult.json +11 -0
- package/test-fixtures/indicator-fixes/10/metadata.json +4 -0
- package/test-fixtures/indicator-fixes/10/record.json +11 -0
- package/test-fixtures/merge-fields/f05/expectedResult.json +24 -0
- package/test-fixtures/merge-fields/f05/metadata.json +6 -0
- package/test-fixtures/merge-fields/f05/record.json +30 -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/remove-inferior-datafields/f16/expectedResult.json +12 -0
- package/test-fixtures/remove-inferior-datafields/f16/metadata.json +5 -0
- package/test-fixtures/remove-inferior-datafields/f16/record.json +14 -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/test-fixtures/translate-terms-data.js +42 -0
- 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/melindaCustomMergeFields.json +0 -5120
- package/src/translate-terms.spec.js +0 -52
|
@@ -1,188 +1,103 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = _default;
|
|
7
|
-
exports.justifyAndSortField008CharacterGroups = justifyAndSortField008CharacterGroups;
|
|
8
|
-
var _clone = _interopRequireDefault(require("clone"));
|
|
9
|
-
var _utils = require("./utils");
|
|
10
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
-
//import createDebugLogger from 'debug';
|
|
12
|
-
|
|
13
|
-
// Author(s): Nicholas Volk
|
|
14
|
-
// NB! CR 008/24 vs 008/25-27 is not supported yet!
|
|
15
|
-
|
|
16
|
-
function _default() {
|
|
1
|
+
import clone from "clone";
|
|
2
|
+
import { fieldToString } from "./utils.js";
|
|
3
|
+
export default function() {
|
|
17
4
|
return {
|
|
18
|
-
description:
|
|
5
|
+
description: "Justify left and sort character groups within 008/18-24",
|
|
19
6
|
validate,
|
|
20
7
|
fix
|
|
21
8
|
};
|
|
22
9
|
function fix(record) {
|
|
23
10
|
const typeOfMaterial = record.getTypeOfMaterial();
|
|
24
|
-
record.fields.forEach(field => {
|
|
11
|
+
record.fields.forEach((field) => {
|
|
25
12
|
justifyAndSortField008CharacterGroups(field, typeOfMaterial);
|
|
26
13
|
});
|
|
27
|
-
|
|
28
|
-
const res = {
|
|
29
|
-
message: [],
|
|
30
|
-
fix: [],
|
|
31
|
-
valid: true
|
|
32
|
-
};
|
|
14
|
+
const res = { message: [], fix: [], valid: true };
|
|
33
15
|
return res;
|
|
34
16
|
}
|
|
35
17
|
function validate(record) {
|
|
36
|
-
const res = {
|
|
37
|
-
message: []
|
|
38
|
-
};
|
|
18
|
+
const res = { message: [] };
|
|
39
19
|
const typeOfMaterial = record.getTypeOfMaterial();
|
|
40
|
-
record.fields?.forEach(field => {
|
|
20
|
+
record.fields?.forEach((field) => {
|
|
41
21
|
validateField(field, res, typeOfMaterial);
|
|
42
22
|
});
|
|
43
23
|
res.valid = !(res.message.length >= 1);
|
|
44
24
|
return res;
|
|
45
25
|
}
|
|
46
26
|
function validateField(field, res, typeOfMaterial) {
|
|
47
|
-
if (field.tag !==
|
|
48
|
-
// Optimize code a bit...
|
|
27
|
+
if (field.tag !== "008") {
|
|
49
28
|
return;
|
|
50
29
|
}
|
|
51
|
-
const orig =
|
|
52
|
-
const normalizedField = justifyAndSortField008CharacterGroups((
|
|
53
|
-
const mod =
|
|
30
|
+
const orig = fieldToString(field);
|
|
31
|
+
const normalizedField = justifyAndSortField008CharacterGroups(clone(field), typeOfMaterial);
|
|
32
|
+
const mod = fieldToString(normalizedField);
|
|
54
33
|
if (orig !== mod) {
|
|
55
|
-
// Fail as the input is "broken"/"crap"/sumthing
|
|
56
34
|
res.message.push(`TODO: '${orig}' => '${mod}'`);
|
|
57
35
|
return;
|
|
58
36
|
}
|
|
59
37
|
return;
|
|
60
38
|
}
|
|
61
39
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
start:
|
|
67
|
-
|
|
68
|
-
sort:
|
|
69
|
-
|
|
70
|
-
},
|
|
71
|
-
|
|
72
|
-
start: 24,
|
|
73
|
-
end:
|
|
74
|
-
|
|
75
|
-
name: 'nature of contents'
|
|
76
|
-
},
|
|
77
|
-
// English doc does not explicitly mention alphabetical sorting... Finnish does.
|
|
78
|
-
{
|
|
79
|
-
type: 'CR',
|
|
80
|
-
start: 25,
|
|
81
|
-
end: 27,
|
|
82
|
-
sort: true,
|
|
83
|
-
name: 'nature of contents'
|
|
84
|
-
},
|
|
85
|
-
// NB! 24 vs 25-27 logic needs to be implemented separately
|
|
86
|
-
{
|
|
87
|
-
type: 'MP',
|
|
88
|
-
start: 18,
|
|
89
|
-
end: 21,
|
|
90
|
-
sort: false,
|
|
91
|
-
name: 'relief'
|
|
92
|
-
},
|
|
93
|
-
// Order of importance!
|
|
94
|
-
{
|
|
95
|
-
type: 'MP',
|
|
96
|
-
start: 33,
|
|
97
|
-
end: 34,
|
|
98
|
-
sort: false,
|
|
99
|
-
name: 'special format of characteristics'
|
|
100
|
-
},
|
|
101
|
-
// Order of importance!
|
|
102
|
-
{
|
|
103
|
-
type: 'MU',
|
|
104
|
-
start: 24,
|
|
105
|
-
end: 29,
|
|
106
|
-
sort: true,
|
|
107
|
-
name: 'accompanying material'
|
|
108
|
-
}, {
|
|
109
|
-
type: 'MU',
|
|
110
|
-
start: 30,
|
|
111
|
-
end: 31,
|
|
112
|
-
sort: true,
|
|
113
|
-
name: 'literary text for sound recordings'
|
|
114
|
-
}];
|
|
40
|
+
const characterGroups = [
|
|
41
|
+
{ type: "BK", start: 18, end: 21, sort: true, name: "illustrations" },
|
|
42
|
+
{ type: "BK", start: 24, end: 27, sort: true, name: "nature of contents" },
|
|
43
|
+
// English doc does not explicitly mention alphabetical sorting... Finnish does.
|
|
44
|
+
{ type: "CR", start: 25, end: 27, sort: true, name: "nature of contents" },
|
|
45
|
+
// NB! 24 vs 25-27 logic needs to be implemented separately
|
|
46
|
+
{ type: "MP", start: 18, end: 21, sort: false, name: "relief" },
|
|
47
|
+
// Order of importance!
|
|
48
|
+
{ type: "MP", start: 33, end: 34, sort: false, name: "special format of characteristics" },
|
|
49
|
+
// Order of importance!
|
|
50
|
+
{ type: "MU", start: 24, end: 29, sort: true, name: "accompanying material" },
|
|
51
|
+
{ type: "MU", start: 30, end: 31, sort: true, name: "literary text for sound recordings" }
|
|
52
|
+
];
|
|
115
53
|
const BIG_BAD_VALUE = 999999999;
|
|
116
54
|
function processCharacterGroup(field, group) {
|
|
117
55
|
const originalContent = field.value.substring(group.start, group.end + 1);
|
|
118
56
|
const content = removeDuplicateValues(fixBlanks(originalContent));
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
charArray.sort(function (a, b) {
|
|
57
|
+
const charArray = content.split("");
|
|
58
|
+
charArray.sort(function(a, b) {
|
|
122
59
|
return scoreChar(a) - scoreChar(b);
|
|
123
60
|
});
|
|
124
|
-
const newContent = charArray.join(
|
|
61
|
+
const newContent = charArray.join("");
|
|
125
62
|
if (originalContent === newContent) {
|
|
126
63
|
return;
|
|
127
64
|
}
|
|
128
|
-
|
|
129
|
-
//console.info(`'${fieldToString(field)}' =>`); // eslint-disable-line no-console
|
|
130
|
-
|
|
131
65
|
field.value = `${field.value.substring(0, group.start)}${newContent}${field.value.substring(group.end + 1)}`;
|
|
132
|
-
//console.info(`'${fieldToString(field)}'`); // eslint-disable-line no-console
|
|
133
|
-
|
|
134
66
|
function fixBlanks(str) {
|
|
135
|
-
if (str.includes(
|
|
136
|
-
return str.replaceAll(
|
|
67
|
+
if (str.includes("|") && str.match(/[^ |]/u)) {
|
|
68
|
+
return str.replaceAll("|", " ");
|
|
137
69
|
}
|
|
138
70
|
return str;
|
|
139
71
|
}
|
|
140
72
|
function scoreChar(c) {
|
|
141
|
-
if (c ===
|
|
142
|
-
return BIG_BAD_VALUE;
|
|
73
|
+
if (c === "|" || c === " ") {
|
|
74
|
+
return BIG_BAD_VALUE;
|
|
143
75
|
}
|
|
144
76
|
if (!group.sort) {
|
|
145
|
-
// more meaningful comes first: keep the original order
|
|
146
77
|
return 1;
|
|
147
78
|
}
|
|
148
79
|
const asciiCode = c.charCodeAt(0);
|
|
149
|
-
// a-z get values 1-26:
|
|
150
80
|
if (asciiCode >= 97 && asciiCode <= 122) {
|
|
151
81
|
return asciiCode - 96;
|
|
152
82
|
}
|
|
153
|
-
// 0-9 get values 100-109
|
|
154
83
|
if (asciiCode >= 48 && asciiCode <= 57) {
|
|
155
84
|
return asciiCode + 52;
|
|
156
85
|
}
|
|
157
|
-
// Others (=crap) return something between '9' and BIG BAD VALUE
|
|
158
86
|
return asciiCode + 200;
|
|
159
87
|
}
|
|
160
88
|
}
|
|
161
|
-
function justifyAndSortField008CharacterGroups(field, typeOfMaterial) {
|
|
162
|
-
if (field.tag !==
|
|
89
|
+
export function justifyAndSortField008CharacterGroups(field, typeOfMaterial) {
|
|
90
|
+
if (field.tag !== "008" || field.subfields) {
|
|
163
91
|
return field;
|
|
164
92
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
const relevantCharacterGroups = characterGroups.filter(gr => gr.type === typeOfMaterial);
|
|
169
|
-
relevantCharacterGroups.forEach(group => processCharacterGroup(field, group)); // eslint-disable-line array-callback-return
|
|
170
|
-
|
|
171
|
-
//justifyField008CharacterGroups(field, typeOfMaterial); // Oops: also sorts...
|
|
172
|
-
|
|
173
|
-
// NB! add value # and | normalizations
|
|
174
|
-
//fixBlanks(field, typeOfMaterial);
|
|
175
|
-
|
|
93
|
+
const relevantCharacterGroups = characterGroups.filter((gr) => gr.type === typeOfMaterial);
|
|
94
|
+
relevantCharacterGroups.forEach((group) => processCharacterGroup(field, group));
|
|
176
95
|
return field;
|
|
177
96
|
}
|
|
178
97
|
function removeDuplicateValues(str) {
|
|
179
|
-
const arr = str.split(
|
|
180
|
-
|
|
181
|
-
const
|
|
182
|
-
//console.info(`I: '${str}'`); // eslint-disable-line no-console
|
|
183
|
-
//console.info(`M: '${reducedStr}'`); // eslint-disable-line no-console
|
|
184
|
-
const output = `${reducedStr}${' '.repeat(str.length - reducedStr.length)}`; // Had some weird trouble with str.padEnd(n)
|
|
185
|
-
//console.info(`M: '${output}'`); // eslint-disable-line no-console
|
|
98
|
+
const arr = str.split("");
|
|
99
|
+
const reducedStr = arr.filter((c, i) => c === " " || c === "|" || arr.indexOf(c) === i).join("");
|
|
100
|
+
const output = `${reducedStr}${" ".repeat(str.length - reducedStr.length)}`;
|
|
186
101
|
return output;
|
|
187
102
|
}
|
|
188
|
-
//# sourceMappingURL=field-008-18-34-character-groups.js.map
|
|
103
|
+
//# sourceMappingURL=field-008-18-34-character-groups.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{"version":3,"file":"field-008-18-34-character-groups.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","typeOfMaterial","getTypeOfMaterial","fields","forEach","field","justifyAndSortField008CharacterGroups","res","message","valid","validateField","length","tag","orig","fieldToString","normalizedField","clone","mod","push","characterGroups","type","start","end","sort","name","BIG_BAD_VALUE","processCharacterGroup","group","originalContent","value","substring","content","removeDuplicateValues","fixBlanks","charArray","split","a","b","scoreChar","newContent","join","str","includes","match","replaceAll","c","asciiCode","charCodeAt","subfields","relevantCharacterGroups","filter","gr","arr","reducedStr","i","indexOf","output","repeat"],"sources":["../src/field-008-18-34-character-groups.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n// Author(s): Nicholas Volk\n// NB! CR 008/24 vs 008/25-27 is not supported yet!\n\nexport default function () {\n\n return {\n description: 'Justify left and sort character groups within 008/18-24',\n validate, fix\n };\n\n function fix(record) {\n const typeOfMaterial = record.getTypeOfMaterial();\n record.fields.forEach(field => {\n justifyAndSortField008CharacterGroups(field, typeOfMaterial);\n });\n // Fix always succeeds (even when it really does not):\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const typeOfMaterial = record.getTypeOfMaterial();\n\n record.fields?.forEach(field => {\n validateField(field, res, typeOfMaterial);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res, typeOfMaterial) {\n if (field.tag !== '008') { // Optimize code a bit...\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = justifyAndSortField008CharacterGroups(clone(field), typeOfMaterial);\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`TODO: '${orig}' => '${mod}'`);\n return;\n }\n return;\n }\n}\n\n// Should we add legal values?\nconst characterGroups = [\n {type: 'BK', start: 18, end: 21, sort: true, name: 'illustrations'},\n {type: 'BK', start: 24, end: 27, sort: true, name: 'nature of contents'}, // English doc does not explicitly mention alphabetical sorting... Finnish does.\n {type: 'CR', start: 25, end: 27, sort: true, name: 'nature of contents'}, // NB! 24 vs 25-27 logic needs to be implemented separately\n {type: 'MP', start: 18, end: 21, sort: false, name: 'relief'}, // Order of importance!\n {type: 'MP', start: 33, end: 34, sort: false, name: 'special format of characteristics'}, // Order of importance!\n {type: 'MU', start: 24, end: 29, sort: true, name: 'accompanying material'},\n {type: 'MU', start: 30, end: 31, sort: true, name: 'literary text for sound recordings'}\n];\n\nconst BIG_BAD_VALUE = 999999999;\n\nfunction processCharacterGroup(field, group) {\n const originalContent = field.value.substring(group.start, group.end + 1);\n const content = removeDuplicateValues(fixBlanks(originalContent));\n //console.info(`008/${group.start}-${group.end}: '${originalContent}'`); // eslint-disable-line no-console\n const charArray = content.split('');\n\n charArray.sort(function(a, b) {\n return scoreChar(a) - scoreChar(b);\n });\n\n const newContent = charArray.join('');\n if (originalContent === newContent) {\n return;\n }\n\n //console.info(`'${fieldToString(field)}' =>`); // eslint-disable-line no-console\n\n field.value = `${field.value.substring(0, group.start)}${newContent}${field.value.substring(group.end + 1)}`;\n //console.info(`'${fieldToString(field)}'`); // eslint-disable-line no-console\n\n function fixBlanks(str) {\n if (str.includes('|') && str.match(/[^ |]/u)) {\n return str.replaceAll('|', ' ');\n }\n return str;\n }\n\n function scoreChar(c) {\n if (c === '|' || c === ' ') {\n return BIG_BAD_VALUE; // Max value, these should code last\n }\n if (!group.sort) { // more meaningful comes first: keep the original order\n return 1;\n }\n const asciiCode = c.charCodeAt(0);\n // a-z get values 1-26:\n if (asciiCode >= 97 && asciiCode <= 122) {\n return asciiCode - 96;\n }\n // 0-9 get values 100-109\n if (asciiCode >= 48 && asciiCode <= 57) {\n return asciiCode + 52;\n }\n // Others (=crap) return something between '9' and BIG BAD VALUE\n return asciiCode + 200;\n }\n}\n\nexport function justifyAndSortField008CharacterGroups(field, typeOfMaterial) {\n if (field.tag !== '008' || field.subfields) {\n return field;\n }\n\n //console.info(typeOfMaterial); // eslint-disable-line no-console\n\n const relevantCharacterGroups = characterGroups.filter(gr => gr.type === typeOfMaterial);\n\n relevantCharacterGroups.forEach(group => processCharacterGroup(field, group)); // eslint-disable-line array-callback-return\n\n //justifyField008CharacterGroups(field, typeOfMaterial); // Oops: also sorts...\n\n // NB! add value # and | normalizations\n //fixBlanks(field, typeOfMaterial);\n\n return field;\n}\n\nfunction removeDuplicateValues(str) {\n const arr = str.split('');\n // Take only the first instance of a proper value-carrying character\n const reducedStr = arr.filter((c, i) => c === ' ' || c === '|' || arr.indexOf(c) === i).join('');\n //console.info(`I: '${str}'`); // eslint-disable-line no-console\n //console.info(`M: '${reducedStr}'`); // eslint-disable-line no-console\n const output = `${reducedStr}${' '.repeat(str.length - reducedStr.length)}`; // Had some weird trouble with str.padEnd(n)\n //console.info(`M: '${output}'`); // eslint-disable-line no-console\n return output;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/field-008-18-34-character-groups.js"],
|
|
4
|
+
"sourcesContent": ["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils.js';\n// Author(s): Nicholas Volk\n// NB! CR 008/24 vs 008/25-27 is not supported yet!\n\nexport default function () {\n\n return {\n description: 'Justify left and sort character groups within 008/18-24',\n validate, fix\n };\n\n function fix(record) {\n const typeOfMaterial = record.getTypeOfMaterial();\n record.fields.forEach(field => {\n justifyAndSortField008CharacterGroups(field, typeOfMaterial);\n });\n // Fix always succeeds (even when it really does not):\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const typeOfMaterial = record.getTypeOfMaterial();\n\n record.fields?.forEach(field => {\n validateField(field, res, typeOfMaterial);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res, typeOfMaterial) {\n if (field.tag !== '008') { // Optimize code a bit...\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = justifyAndSortField008CharacterGroups(clone(field), typeOfMaterial);\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`TODO: '${orig}' => '${mod}'`);\n return;\n }\n return;\n }\n}\n\n// Should we add legal values?\nconst characterGroups = [\n {type: 'BK', start: 18, end: 21, sort: true, name: 'illustrations'},\n {type: 'BK', start: 24, end: 27, sort: true, name: 'nature of contents'}, // English doc does not explicitly mention alphabetical sorting... Finnish does.\n {type: 'CR', start: 25, end: 27, sort: true, name: 'nature of contents'}, // NB! 24 vs 25-27 logic needs to be implemented separately\n {type: 'MP', start: 18, end: 21, sort: false, name: 'relief'}, // Order of importance!\n {type: 'MP', start: 33, end: 34, sort: false, name: 'special format of characteristics'}, // Order of importance!\n {type: 'MU', start: 24, end: 29, sort: true, name: 'accompanying material'},\n {type: 'MU', start: 30, end: 31, sort: true, name: 'literary text for sound recordings'}\n];\n\nconst BIG_BAD_VALUE = 999999999;\n\nfunction processCharacterGroup(field, group) {\n const originalContent = field.value.substring(group.start, group.end + 1);\n const content = removeDuplicateValues(fixBlanks(originalContent));\n //console.info(`008/${group.start}-${group.end}: '${originalContent}'`); // eslint-disable-line no-console\n const charArray = content.split('');\n\n charArray.sort(function(a, b) {\n return scoreChar(a) - scoreChar(b);\n });\n\n const newContent = charArray.join('');\n if (originalContent === newContent) {\n return;\n }\n\n //console.info(`'${fieldToString(field)}' =>`); // eslint-disable-line no-console\n\n field.value = `${field.value.substring(0, group.start)}${newContent}${field.value.substring(group.end + 1)}`;\n //console.info(`'${fieldToString(field)}'`); // eslint-disable-line no-console\n\n function fixBlanks(str) {\n if (str.includes('|') && str.match(/[^ |]/u)) {\n return str.replaceAll('|', ' ');\n }\n return str;\n }\n\n function scoreChar(c) {\n if (c === '|' || c === ' ') {\n return BIG_BAD_VALUE; // Max value, these should code last\n }\n if (!group.sort) { // more meaningful comes first: keep the original order\n return 1;\n }\n const asciiCode = c.charCodeAt(0);\n // a-z get values 1-26:\n if (asciiCode >= 97 && asciiCode <= 122) {\n return asciiCode - 96;\n }\n // 0-9 get values 100-109\n if (asciiCode >= 48 && asciiCode <= 57) {\n return asciiCode + 52;\n }\n // Others (=crap) return something between '9' and BIG BAD VALUE\n return asciiCode + 200;\n }\n}\n\nexport function justifyAndSortField008CharacterGroups(field, typeOfMaterial) {\n if (field.tag !== '008' || field.subfields) {\n return field;\n }\n\n //console.info(typeOfMaterial); // eslint-disable-line no-console\n\n const relevantCharacterGroups = characterGroups.filter(gr => gr.type === typeOfMaterial);\n\n relevantCharacterGroups.forEach(group => processCharacterGroup(field, group));\n\n //justifyField008CharacterGroups(field, typeOfMaterial); // Oops: also sorts...\n\n // NB! add value # and | normalizations\n //fixBlanks(field, typeOfMaterial);\n\n return field;\n}\n\nfunction removeDuplicateValues(str) {\n const arr = str.split('');\n // Take only the first instance of a proper value-carrying character\n const reducedStr = arr.filter((c, i) => c === ' ' || c === '|' || arr.indexOf(c) === i).join('');\n //console.info(`I: '${str}'`); // eslint-disable-line no-console\n //console.info(`M: '${reducedStr}'`); // eslint-disable-line no-console\n const output = `${reducedStr}${' '.repeat(str.length - reducedStr.length)}`; // Had some weird trouble with str.padEnd(n)\n //console.info(`M: '${output}'`); // eslint-disable-line no-console\n return output;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
3
|
+
import validatorFactory from "./field-008-18-34-character-groups.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", "field-008-18-34-character-groups"],
|
|
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/field-008-18-34-character-groups: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.fix, "function");
|
|
27
|
+
assert.equal(typeof validator.validate, "function");
|
|
28
|
+
}
|
|
29
|
+
async function callback({ getFixture, enabled = true, fix = false }) {
|
|
30
|
+
if (enabled === false) {
|
|
31
|
+
debug("TEST SKIPPED!");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const validator = await validatorFactory();
|
|
35
|
+
const record = new MarcRecord(getFixture("record.json"));
|
|
36
|
+
const expectedResult = getFixture("expectedResult.json");
|
|
37
|
+
if (!fix) {
|
|
38
|
+
const result = await validator.validate(record);
|
|
39
|
+
assert.deepEqual(result, expectedResult);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
await validator.fix(record);
|
|
43
|
+
assert.deepEqual(record, expectedResult);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=field-008-18-34-character-groups.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/field-008-18-34-character-groups.test.js"],
|
|
4
|
+
"sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './field-008-18-34-character-groups.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', 'field-008-18-34-character-groups'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/field-008-18-34-character-groups: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.fix, 'function');\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,kCAAkC;AAAA,EACrF,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AACD,MAAM,QAAQ,kBAAkB,gFAAgF;AAEhH,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,KAAK,UAAU;AAC7C,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;AAEA,eAAe,SAAS,EAAC,YAAY,UAAU,MAAM,MAAM,MAAK,GAAG;AACjE,MAAI,YAAY,OAAO;AACrB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,48 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = _default;
|
|
7
|
-
var _clone = _interopRequireDefault(require("clone"));
|
|
8
|
-
var _utils = require("./utils");
|
|
9
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
-
//import createDebugLogger from 'debug';
|
|
11
|
-
|
|
12
|
-
// Author(s): Nicholas Volk
|
|
13
|
-
function _default() {
|
|
1
|
+
import clone from "clone";
|
|
2
|
+
import { fieldToString } from "./utils.js";
|
|
3
|
+
export default function() {
|
|
14
4
|
return {
|
|
15
5
|
description: 'Normalize " ; " separators as " -- "',
|
|
16
6
|
validate,
|
|
17
7
|
fix
|
|
18
8
|
};
|
|
19
9
|
function fix(record) {
|
|
20
|
-
record.fields.forEach(field => {
|
|
10
|
+
record.fields.forEach((field) => {
|
|
21
11
|
fix505(field);
|
|
22
12
|
});
|
|
23
|
-
const res = {
|
|
24
|
-
message: [],
|
|
25
|
-
fix: [],
|
|
26
|
-
valid: true
|
|
27
|
-
};
|
|
13
|
+
const res = { message: [], fix: [], valid: true };
|
|
28
14
|
return res;
|
|
29
15
|
}
|
|
30
16
|
function validate(record) {
|
|
31
|
-
const res = {
|
|
32
|
-
|
|
33
|
-
};
|
|
34
|
-
record.fields?.forEach(field => {
|
|
17
|
+
const res = { message: [] };
|
|
18
|
+
record.fields?.forEach((field) => {
|
|
35
19
|
validateField(field, res);
|
|
36
20
|
});
|
|
37
21
|
res.valid = !(res.message.length >= 1);
|
|
38
22
|
return res;
|
|
39
23
|
}
|
|
40
24
|
function validateField(field, res) {
|
|
41
|
-
const orig =
|
|
42
|
-
const normalizedField = fix505((
|
|
43
|
-
const mod =
|
|
25
|
+
const orig = fieldToString(field);
|
|
26
|
+
const normalizedField = fix505(clone(field));
|
|
27
|
+
const mod = fieldToString(normalizedField);
|
|
44
28
|
if (orig !== mod) {
|
|
45
|
-
// Fail as the input is "broken"/"crap"/sumthing
|
|
46
29
|
res.message.push(`'TODO: ${orig}' => '${mod}'`);
|
|
47
30
|
return;
|
|
48
31
|
}
|
|
@@ -50,31 +33,28 @@ function _default() {
|
|
|
50
33
|
}
|
|
51
34
|
}
|
|
52
35
|
function field505FixSubfieldA(field) {
|
|
53
|
-
const a = field.subfields.filter(sf => sf.code ===
|
|
54
|
-
a.forEach(sf => fixSubfieldA(sf));
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
a.value = a.value.replace(/ ; /ug, ' -- ');
|
|
36
|
+
const a = field.subfields.filter((sf) => sf.code === "a");
|
|
37
|
+
a.forEach((sf) => fixSubfieldA(sf));
|
|
38
|
+
function fixSubfieldA(a2) {
|
|
39
|
+
a2.value = a2.value.replace(/ ; /ug, " -- ");
|
|
58
40
|
}
|
|
59
41
|
}
|
|
60
42
|
function field505FixSubfieldTRG(field) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
subfieldsThatWillBeModified.forEach(sf => fixSubfieldThatPrecedesT(sf)); // eslint-disable-line array-callback-return
|
|
64
|
-
|
|
43
|
+
const subfieldsThatWillBeModified = field.subfields.filter((sf, i) => i + 1 < field.subfields.length && field.subfields[i + 1].code === "t");
|
|
44
|
+
subfieldsThatWillBeModified.forEach((sf) => fixSubfieldThatPrecedesT(sf));
|
|
65
45
|
function fixSubfieldThatPrecedesT(sf) {
|
|
66
46
|
if (!sf.value) {
|
|
67
47
|
return;
|
|
68
48
|
}
|
|
69
|
-
sf.value = sf.value.replace(/ ;$/u,
|
|
49
|
+
sf.value = sf.value.replace(/ ;$/u, " --");
|
|
70
50
|
}
|
|
71
51
|
}
|
|
72
52
|
function fix505(field) {
|
|
73
|
-
if (field.tag !==
|
|
53
|
+
if (field.tag !== "505" || !field.subfields) {
|
|
74
54
|
return field;
|
|
75
55
|
}
|
|
76
56
|
field505FixSubfieldTRG(field);
|
|
77
57
|
field505FixSubfieldA(field);
|
|
78
58
|
return field;
|
|
79
59
|
}
|
|
80
|
-
//# sourceMappingURL=field-505-separators.js.map
|
|
60
|
+
//# sourceMappingURL=field-505-separators.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/field-505-separators.js"],
|
|
4
|
+
"sourcesContent": ["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils.js';\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Normalize \" ; \" separators as \" -- \"',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n fix505(field);\n });\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields?.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = fix505(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'TODO: ${orig}' => '${mod}'`);\n return;\n }\n return;\n }\n}\n\n\nfunction field505FixSubfieldA(field) {\n const a = field.subfields.filter(sf => sf.code === 'a');\n\n a.forEach(sf => fixSubfieldA(sf));\n\n function fixSubfieldA(a) {\n a.value = a.value.replace(/ ; /ug, ' -- ');\n }\n}\n\nfunction field505FixSubfieldTRG(field) {\n // Modify subfield if next subfield is $t:\n const subfieldsThatWillBeModified = field.subfields.filter((sf, i) => i + 1 < field.subfields.length && field.subfields[i + 1].code === 't');\n\n subfieldsThatWillBeModified.forEach(sf => fixSubfieldThatPrecedesT(sf));\n\n function fixSubfieldThatPrecedesT(sf) {\n if (!sf.value) {\n return;\n }\n sf.value = sf.value.replace(/ ;$/u, ' --');\n }\n}\n\nfunction fix505(field) {\n if (field.tag !== '505' || !field.subfields) {\n return field;\n }\n field505FixSubfieldTRG(field);\n field505FixSubfieldA(field);\n return field;\n}\n"],
|
|
5
|
+
"mappings": "AACA,OAAO,WAAW;AAClB,SAAQ,qBAAoB;AAG5B,0BAA2B;AAEzB,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IAAU;AAAA,EACZ;AAEA,WAAS,IAAI,QAAQ;AACnB,WAAO,OAAO,QAAQ,WAAS;AAC7B,aAAO,KAAK;AAAA,IACd,CAAC;AAED,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAC9C,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,QAAQ;AACxB,UAAM,MAAM,EAAC,SAAS,CAAC,EAAC;AAExB,WAAO,QAAQ,QAAQ,WAAS;AAC9B,oBAAc,OAAO,GAAG;AAAA,IAC1B,CAAC;AAED,QAAI,QAAQ,EAAE,IAAI,QAAQ,UAAU;AACpC,WAAO;AAAA,EACT;AAEA,WAAS,cAAc,OAAO,KAAK;AACjC,UAAM,OAAO,cAAc,KAAK;AAEhC,UAAM,kBAAkB,OAAO,MAAM,KAAK,CAAC;AAC3C,UAAM,MAAM,cAAc,eAAe;AACzC,QAAI,SAAS,KAAK;AAChB,UAAI,QAAQ,KAAK,UAAU,IAAI,SAAS,GAAG,GAAG;AAC9C;AAAA,IACF;AACA;AAAA,EACF;AACF;AAGA,SAAS,qBAAqB,OAAO;AACnC,QAAM,IAAI,MAAM,UAAU,OAAO,QAAM,GAAG,SAAS,GAAG;AAEtD,IAAE,QAAQ,QAAM,aAAa,EAAE,CAAC;AAEhC,WAAS,aAAaA,IAAG;AACvB,IAAAA,GAAE,QAAQA,GAAE,MAAM,QAAQ,SAAS,MAAM;AAAA,EAC3C;AACF;AAEA,SAAS,uBAAuB,OAAO;AAErC,QAAM,8BAA8B,MAAM,UAAU,OAAO,CAAC,IAAI,MAAM,IAAI,IAAI,MAAM,UAAU,UAAU,MAAM,UAAU,IAAI,CAAC,EAAE,SAAS,GAAG;AAE3I,8BAA4B,QAAQ,QAAM,yBAAyB,EAAE,CAAC;AAEtE,WAAS,yBAAyB,IAAI;AACpC,QAAI,CAAC,GAAG,OAAO;AACb;AAAA,IACF;AACA,OAAG,QAAQ,GAAG,MAAM,QAAQ,QAAQ,KAAK;AAAA,EAC3C;AACF;AAEA,SAAS,OAAO,OAAO;AACrB,MAAI,MAAM,QAAQ,SAAS,CAAC,MAAM,WAAW;AAC3C,WAAO;AAAA,EACT;AACA,yBAAuB,KAAK;AAC5B,uBAAqB,KAAK;AAC1B,SAAO;AACT;",
|
|
6
|
+
"names": ["a"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
3
|
+
import validatorFactory from "./field-505-separators.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", "field-505-separators"],
|
|
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/field-505-separators: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 recordFixture = getFixture("record.json");
|
|
35
|
+
const record = recordFixture._validationOptions ? new MarcRecord(recordFixture, recordFixture._validationOptions) : new MarcRecord(recordFixture);
|
|
36
|
+
const expectedResult = getFixture("expectedResult.json");
|
|
37
|
+
if (!fix) {
|
|
38
|
+
const result = await validator.validate(record);
|
|
39
|
+
assert.deepEqual(result, expectedResult);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
await validator.fix(record);
|
|
43
|
+
assert.deepEqual(record, expectedResult);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=field-505-separators.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/field-505-separators.test.js"],
|
|
4
|
+
"sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './field-505-separators.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', 'field-505-separators'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/field-505-separators: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\n const recordFixture = getFixture('record.json');\n const record = recordFixture._validationOptions ? new MarcRecord(recordFixture, recordFixture._validationOptions) : new MarcRecord(recordFixture);\n\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,sBAAsB;AAAA,EACzE,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AACD,MAAM,QAAQ,kBAAkB,oEAAoE;AAEpG,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;AAEzC,QAAM,gBAAgB,WAAW,aAAa;AAC9C,QAAM,SAAS,cAAc,qBAAqB,IAAI,WAAW,eAAe,cAAc,kBAAkB,IAAI,IAAI,WAAW,aAAa;AAEhJ,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/field-521-fix.js
CHANGED
|
@@ -1,57 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = _default;
|
|
7
|
-
var _clone = _interopRequireDefault(require("clone"));
|
|
8
|
-
var _utils = require("./utils");
|
|
9
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
-
//import createDebugLogger from 'debug';
|
|
11
|
-
|
|
12
|
-
// Author(s): Nicholas Volk
|
|
13
|
-
function _default() {
|
|
1
|
+
import clone from "clone";
|
|
2
|
+
import { fieldToString } from "./utils.js";
|
|
3
|
+
export default function() {
|
|
14
4
|
return {
|
|
15
|
-
description:
|
|
5
|
+
description: "Various fixes for field 521",
|
|
16
6
|
validate,
|
|
17
7
|
fix
|
|
18
8
|
};
|
|
19
9
|
function fix(record) {
|
|
20
|
-
record.fields.forEach(field => {
|
|
10
|
+
record.fields.forEach((field) => {
|
|
21
11
|
fix521(field);
|
|
22
12
|
});
|
|
23
|
-
|
|
24
|
-
const res = {
|
|
25
|
-
message: [],
|
|
26
|
-
fix: [],
|
|
27
|
-
valid: true
|
|
28
|
-
};
|
|
13
|
+
const res = { message: [], fix: [], valid: true };
|
|
29
14
|
return res;
|
|
30
15
|
}
|
|
31
16
|
function validate(record) {
|
|
32
|
-
const res = {
|
|
33
|
-
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
// Actual parsing of all fields
|
|
37
|
-
/*
|
|
38
|
-
if (!record.fields) {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
*/
|
|
42
|
-
|
|
43
|
-
record.fields?.forEach(field => {
|
|
17
|
+
const res = { message: [] };
|
|
18
|
+
record.fields?.forEach((field) => {
|
|
44
19
|
validateField(field, res);
|
|
45
20
|
});
|
|
46
21
|
res.valid = !(res.message.length >= 1);
|
|
47
22
|
return res;
|
|
48
23
|
}
|
|
49
24
|
function validateField(field, res) {
|
|
50
|
-
const orig =
|
|
51
|
-
const normalizedField = fix521((
|
|
52
|
-
const mod =
|
|
25
|
+
const orig = fieldToString(field);
|
|
26
|
+
const normalizedField = fix521(clone(field));
|
|
27
|
+
const mod = fieldToString(normalizedField);
|
|
53
28
|
if (orig !== mod) {
|
|
54
|
-
// Fail as the input is "broken"/"crap"/sumthing
|
|
55
29
|
res.message.push(`'TODO: ${orig}' => '${mod}'`);
|
|
56
30
|
return;
|
|
57
31
|
}
|
|
@@ -59,22 +33,20 @@ function _default() {
|
|
|
59
33
|
}
|
|
60
34
|
}
|
|
61
35
|
function fixSubfieldA(a) {
|
|
62
|
-
a.value = a.value.
|
|
63
|
-
// MET-332:
|
|
64
|
-
replace(/^(Ikäsuositus) ([0-9])/u, '$1: $2');
|
|
36
|
+
a.value = a.value.replace(/^(Ikäsuositus) ([0-9])/u, "$1: $2");
|
|
65
37
|
}
|
|
66
38
|
function fixSubfieldAInternalPunctuation(field) {
|
|
67
|
-
const a = field.subfields.filter(sf => sf.code ===
|
|
68
|
-
a.forEach(sf => fixSubfieldA(sf));
|
|
39
|
+
const a = field.subfields.filter((sf) => sf.code === "a");
|
|
40
|
+
a.forEach((sf) => fixSubfieldA(sf));
|
|
69
41
|
}
|
|
70
42
|
function getIndicator1(field) {
|
|
71
|
-
const [a] = field.subfields.filter(sf => sf.code ===
|
|
43
|
+
const [a] = field.subfields.filter((sf) => sf.code === "a");
|
|
72
44
|
if (a) {
|
|
73
45
|
if (a.value.match(/^Ikäsuositus/u)) {
|
|
74
|
-
return
|
|
46
|
+
return "1";
|
|
75
47
|
}
|
|
76
48
|
}
|
|
77
|
-
return
|
|
49
|
+
return void 0;
|
|
78
50
|
}
|
|
79
51
|
function fixIndicator1(field) {
|
|
80
52
|
const value = getIndicator1(field);
|
|
@@ -84,11 +56,11 @@ function fixIndicator1(field) {
|
|
|
84
56
|
}
|
|
85
57
|
}
|
|
86
58
|
function fix521(field) {
|
|
87
|
-
if (field.tag !==
|
|
59
|
+
if (field.tag !== "521" || !field.subfields) {
|
|
88
60
|
return field;
|
|
89
61
|
}
|
|
90
62
|
fixIndicator1(field);
|
|
91
63
|
fixSubfieldAInternalPunctuation(field);
|
|
92
64
|
return field;
|
|
93
65
|
}
|
|
94
|
-
//# sourceMappingURL=field-521-fix.js.map
|
|
66
|
+
//# sourceMappingURL=field-521-fix.js.map
|