@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 +1,7 @@
|
|
|
1
|
-
{"version":3,"file":"ending-punctuation.js","names":["_endingPunctuationConf","require","_debug","_interopRequireDefault","e","__esModule","default","debug","createDebugLogger","_default","description","validate","record","validatePunc","fix","message","fields","forEach","field","validateField","valid","length","linkedTag","findLastSubfield","subfields","filter","sf","isNaN","code","slice","shift","normalPuncRules","subfield","punc","tag","checkEnd","overrideValidPuncMarks","puncMarks","validPuncMarks","lastPuncMark","includes","value","lastPuncDot","push","concat","charAt","specialCases","res","lastSubField","special","afterOnly","strict","noPuncIfField","some","subField","ifBoth","puncSubField","ifInd2","ind2","ifLastCharNot","noPuncIfInd2","secondLastIfLast","last","termField","languageField","find","finnishTerms","p","test","else","lastOf","indexOf","mandatory","linked","parseInt","substr","err","Error","stack","Object","values","confSpec","o","rangeFine","rangeStart","rangeEnd","index","console","error","validateSingleField"],"sources":["../src/ending-punctuation.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* MARC record validators used in Melinda\n*\n* Copyright (c) 2014-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of marc-record-validators-melinda\n*\n* marc-record-validators-melinda program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Lesser General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* marc-record-validators-melinda is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Lesser General Public License for more details.\n*\n* You should have received a copy of the GNU Lesser General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\n// Import {validPuncMarks, finnishTerms, confSpec} from './ending-punctuation-conf.js';\nimport {validPuncMarks, finnishTerms, confSpec} from './ending-punctuation-conf';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/ending-punctuation');\n\nexport default function () {\n return {\n description:\n 'Handles invalid ending punctuation',\n validate: record => validatePunc(record, false), // Record (Object), fix (boolean)\n fix: record => validatePunc(record, true) // Record (Object), fix (boolean)\n\n };\n\n // This is used to validate record against configuration\n function validatePunc(record, fix) {\n const message = {message: []};\n\n if (fix) {\n message.fix = [];\n }\n\n // Actual parsing of all fields\n if (!record.fields) {\n return false;\n }\n\n record.fields.forEach(field => {\n validateField(field, false, fix, message);\n });\n\n message.valid = !(message.message.length >= 1);\n return message;\n }\n}\n\n// Field validation with punctuation rules for normal and special cases in subfunction (to reduce complexity to please travisci)\nfunction validateField(field, linkedTag, fix, message) {\n // This is used to find last subfield that should have punctuation\n function findLastSubfield(field) {\n const subfields = field.subfields.filter(sf => isNaN(sf.code) && 'value' in sf);\n return subfields.slice(-1).shift();\n }\n\n // Punctuation rule (Boolean), Check no ending dot strict (Boolean)\n function normalPuncRules(subfield, punc, tag, checkEnd, overrideValidPuncMarks) {\n const puncMarks = overrideValidPuncMarks || validPuncMarks;\n const lastPuncMark = puncMarks.includes(subfield.value.slice(-1)); // If string ends to punctuation char\n const lastPuncDot = '.'.includes(subfield.value.slice(-1)); // If string ends to dot\n\n // Last char should be punc, but its not one of marks nor dot\n if (punc && !(lastPuncMark || lastPuncDot)) {\n // Console.log(\"1. Invalid punctuation - missing\")\n message.message.push(`Field ${tag} has invalid ending punctuation`);\n if (fix) {\n subfield.value = subfield.value.concat('.');\n message.fix.push(`Field ${tag} - Added punctuation to $${subfield.code}`);\n }\n\n // Last char is dot, but previous char is one of punc marks, like 'Question?.'\n } else if (lastPuncDot && subfield.value.length > 1 && puncMarks.includes(subfield.value.charAt(subfield.value.length - 2))) {\n // Console.log(\"2. Invalid punctuation - duplicate, like '?.'\")\n message.message.push(`Field ${tag} has invalid ending punctuation`);\n if (fix) {\n subfield.value = subfield.value.slice(0, -1);\n message.fix.push(`Field ${tag} - Removed double punctuation from $${subfield.code}`);\n }\n\n // Last char shouldn't be dot !! This is behind checkEnd boolean, because of dots at end of abbreviations, so this is checked only in special cases !!//\n } else if (checkEnd && (!punc && lastPuncDot)) {\n // Console.log(\"3. Invalid punctuation - Shouldn't be dot, is\")\n message.message.push(`Field ${tag} has invalid ending punctuation`);\n if (fix) {\n subfield.value = subfield.value.slice(0, -1);\n message.fix.push(`Field ${tag} - Removed punctuation from $${subfield.code}`);\n }\n }\n }\n\n // Special cases from here on\n function specialCases(res, field, tag) {\n let lastSubField = null;\n // Punctuation should be only after specific field\n if (res.special.afterOnly) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n if (typeof res.special.strict === 'undefined') {\n res.special.strict = true;\n }\n\n if (lastSubField.code === res.special.afterOnly) {\n normalPuncRules(lastSubField, res.punc, tag, res.special.strict, false);\n } else {\n normalPuncRules(lastSubField, !res.punc, tag, true, false);\n }\n }\n } else if (res.special.noPuncIfField) {\n if (field.subfields.some(subField => subField.code === res.special.noPuncIfField) === false) {\n lastSubField = findLastSubfield(field);\n normalPuncRules(lastSubField, res.punc, tag, true, false);\n }\n } else if (res.special.ifBoth) {\n lastSubField = findLastSubfield(field);\n if (lastSubField && lastSubField.code === res.special.puncSubField) {\n // Ind2 match, check second if at punc rules with special punc char override\n if (res.special.ifInd2 && res.special.ifInd2.includes(field.ind2)) {\n normalPuncRules(lastSubField, res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n\n // Matches execption to special rule, noPuncIfInd2 (likely with value 4, that indicates copyright mark)\n } else if (res.special.noPuncIfInd2 && field.ind2 && res.special.noPuncIfInd2.includes(field.ind2)) {\n normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n\n // Does not match rules -> shouldn't have punc\n } else {\n normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n }\n }\n } else if (res.special.secondLastIfLast) {\n field.subfields.forEach(subField => {\n if (isNaN(subField.code) && res.special.secondLastIfLast !== subField.code) {\n lastSubField = subField;\n } // Not control field\n\n if (typeof res.special.last !== 'undefined' && res.special.secondLastIfLast === subField.code) {\n normalPuncRules(subField, res.special.last, tag, true, false);\n } // Strict because this field should not be abbreviation\n });\n normalPuncRules(lastSubField, res.punc, tag, false, false);\n\n // Search for Finnish terms\n } else if (res.special.termField) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n const languageField = field.subfields.find(({code}) => code === res.special.termField);\n if (languageField && languageField.value && finnishTerms.some(p => p.test(languageField.value))) {\n // If (languageField && languageField.value && finnishTerms.indexOf(languageField.value) > -1) {\n normalPuncRules(lastSubField, res.punc, tag, true, false);\n } else {\n normalPuncRules(lastSubField, res.special.else, tag, false, false); // Strict because of years etc (648, 650)\n }\n }\n // Search last of array in subfields and check if it has punc\n } else if (res.special.lastOf) {\n lastSubField = null;\n field.subfields.filter(subField => 'value' in subField).forEach(subField => {\n if (isNaN(subField.code) && res.special.lastOf.indexOf(subField.code) > -1) {\n lastSubField = subField;\n } // Not control field\n\n if (res.special.mandatory && res.special.mandatory.indexOf(subField.code) > -1) {\n normalPuncRules(subField, res.punc, tag, true, false);\n } // Strict because of mandatory\n });\n\n if (lastSubField) {\n normalPuncRules(lastSubField, res.punc, tag, false, false);\n }\n\n // If field has linked rules (tag: 880), find rules and re-validate\n } else if (res.special.linked) {\n let linkedTag = null;\n try {\n linkedTag = parseInt(field.subfields.find(({code}) => code === res.special.linked).value.substr(0, 3), 10); // Substring feels stupid, but is used in MarcRecord to extract tag.\n } catch (err) {\n debug(`Got error while parsing tag: ${err instanceof Error ? err.stack : err}`);\n return false;\n }\n\n validateField(field, linkedTag, fix, message);\n }\n }\n\n let res = null;\n let tag = null;\n let lastSubField = null;\n\n if (linkedTag) {\n tag = linkedTag;\n } else {\n try {\n tag = parseInt(field.tag, 10);\n } catch (err) {\n debug(`Got error while parsing tag: ${err instanceof Error ? err.stack : err}`);\n return false;\n }\n }\n\n // Find configuration object matching tag:\n res = Object.values(confSpec).find(o => {\n const rangeFine = o.rangeStart <= tag && o.rangeEnd >= tag;\n return o.index === tag || rangeFine;\n });\n\n if (!res) {\n return;\n } // Configuration not found, pass field without error\n\n // Field does not have subfields; invalid\n if (typeof field.subfields === 'undefined' || field.subfields === null) {\n message.message.push(`Field ${field.tag} has invalid ending punctuation`);\n return;\n }\n\n // Normal rules\n if (typeof res.special === 'undefined' || res.special === null) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n normalPuncRules(lastSubField, res.punc, field.tag, false, false, fix, message);\n }\n } else {\n try {\n specialCases(res, field, field.tag);\n } catch (e) {\n console.error('Catched error from special case: ', e); // eslint-disable-line no-console\n }\n }\n}\n\nexport function validateSingleField(field, linkedTag, fix) {\n const message = {};\n message.message = [];\n if (fix) {\n message.fix = [];\n }\n\n validateField(field, linkedTag, fix, message);\n message.valid = !(message.message.length >= 1);\n return message;\n}\n\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/ending-punctuation.js"],
|
|
4
|
+
"sourcesContent": ["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* MARC record validators used in Melinda\n*\n* Copyright (c) 2014-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of marc-record-validators-melinda\n*\n* marc-record-validators-melinda program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Lesser General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* marc-record-validators-melinda is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Lesser General Public License for more details.\n*\n* You should have received a copy of the GNU Lesser General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\n// Import {validPuncMarks, finnishTerms, confSpec} from './ending-punctuation-conf.js';\nimport {validPuncMarks, validQuoteChars, finnishTerms, confSpec} from './ending-punctuation-conf.js';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/ending-punctuation');\n\nexport default function () {\n return {\n description:\n 'Handles invalid ending punctuation',\n validate: record => validatePunc(record, false), // Record (Object), fix (boolean)\n fix: record => validatePunc(record, true) // Record (Object), fix (boolean)\n\n };\n\n // This is used to validate record against configuration\n function validatePunc(record, fix) {\n const message = {message: []};\n\n if (fix) {\n message.fix = [];\n }\n\n // Actual parsing of all fields\n if (!record.fields) {\n return false;\n }\n\n record.fields.forEach(field => {\n validateField(field, false, fix, message);\n });\n\n message.valid = !(message.message.length >= 1);\n return message;\n }\n}\n\n// Field validation with punctuation rules for normal and special cases in subfunction (to reduce complexity to please travisci)\nfunction validateField(field, linkedTag, fix, message) {\n function getDefaultPuncMarks(tag) {\n if (tag.match(/^[1678](?:00|10|11|30)/u) || tag === '740') { // As defined in Loppupisteohje\n return `${validPuncMarks})`;\n }\n // We don't want ').' here either. However, Loppupisteohje is a bit iffy here.\n // BUG: Note that our generic rules will remove dot from Finnish terms such as https://finto.fi/yso-aika/fi/page/p1069910600\n if (['647', '648', '650', '651', '654', '655', '656', '657', '658', '662'].includes(tag)) {\n return `${validPuncMarks})`;\n }\n if(['260'].includes(tag)) {\n return `${validPuncMarks})]`;\n }\n return validPuncMarks;\n }\n\n // Punctuation rule (Boolean), Check no ending dot strict (Boolean)\n function normalPuncRules(subfield, punc, tag, checkEnd, overrideValidPuncMarks) {\n const puncMarks = overrideValidPuncMarks || getDefaultPuncMarks(tag);\n const lastChar = subfield.value.slice(-1);\n const lastPuncMark = puncMarks.includes(lastChar); // If string ends to punctuation char\n const lastPuncDot = '.'.includes(lastChar); // If string ends to dot\n const penultimateCharacter = subfield.value.length >= 2 ? subfield.value.charAt(subfield.value.length - 2) : undefined;\n const antePenultimateCharacter = subfield.value.length >= 3 ? subfield.value.charAt(subfield.value.length - 3) : undefined;\n\n\n // Last char should be punc, but it's not one of listed punctuation marks nor dot\n if (punc && !(lastPuncMark || lastPuncDot)) {\n //console.log(puncMarks)\n if (penultimateCharacter && validQuoteChars.includes(lastChar) && puncMarks.includes(penultimateCharacter)) {\n // Exception: do nothing! Ending in punc+quote combo is all right, and does not imply a missing punc\n }\n else {\n // Console.log(\"1. Invalid punctuation - missing\")\n message.message.push(`Field ${tag} requires ending punctuation, ends in '${lastChar}'`);\n if (fix) {\n subfield.value = subfield.value.concat('.');\n message.fix.push(`Field ${tag} - Added punctuation to $${subfield.code}`);\n }\n }\n\n // Last char is dot, but previous char is one of punc marks, like 'Question?.'\n } else if (lastPuncDot && penultimateCharacter && puncMarks.includes(penultimateCharacter)) {\n // Console.log(\"2. Invalid punctuation - duplicate, like '?.'\")\n message.message.push(`Field ${tag} has an extra dot after '${penultimateCharacter}'`);\n if (fix) {\n subfield.value = subfield.value.slice(0, -1);\n message.fix.push(`Field ${tag} - Removed dot after punctuation from $${subfield.code}`);\n }\n // Last char is dot, but previous two cars are punc+quote, like 'Lorum \"Ipsum.\".'\n } else if (lastPuncDot && antePenultimateCharacter && validQuoteChars.includes(penultimateCharacter) && puncMarks.includes(antePenultimateCharacter)) {\n message.message.push(`Field ${tag} has an extra dot in '${antePenultimateCharacter}${penultimateCharacter}${lastChar}'`);\n if (fix) {\n subfield.value = subfield.value.slice(0, -1);\n message.fix.push(`Field ${tag} - Removed '${lastChar}' after '${antePenultimateCharacter}${penultimateCharacter}'`);\n }\n // Last char shouldn't be dot !! This is behind checkEnd boolean, because of dots at end of abbreviations, so this is checked only in special cases !!//\n } else if (checkEnd && (!punc && lastPuncDot)) {\n // Console.log(\"3. Invalid punctuation - Shouldn't be dot, is\")\n message.message.push(`Field ${tag} has unwanted ending punctuation '${lastChar}'`);\n if (fix) {\n subfield.value = subfield.value.slice(0, -1);\n message.fix.push(`Field ${tag} - Removed punctuation from $${subfield.code}`);\n }\n }\n }\n\n // Special cases from here on\n function specialCases(res, field, tag) {\n let lastSubField = null;\n // Punctuation should be only after specific field\n if (res.special.afterOnly) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n if (typeof res.special.strict === 'undefined') {\n res.special.strict = true;\n }\n\n if (lastSubField.code === res.special.afterOnly) {\n normalPuncRules(lastSubField, res.punc, tag, res.special.strict, false);\n } else {\n normalPuncRules(lastSubField, !res.punc, tag, true, false);\n }\n }\n } else if (res.special.noPuncIfField) {\n if (field.subfields.some(subField => subField.code === res.special.noPuncIfField) === false) {\n lastSubField = findLastSubfield(field);\n normalPuncRules(lastSubField, res.punc, tag, true, false);\n }\n } else if (res.special.ifBoth) {\n lastSubField = findLastSubfield(field);\n if (lastSubField && lastSubField.code === res.special.puncSubField) {\n // Ind2 match, check second if at punc rules with special punc char override\n if (res.special.ifInd2 && res.special.ifInd2.includes(field.ind2)) {\n normalPuncRules(lastSubField, res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n\n // Matches exception to special rule, noPuncIfInd2 (likely with value 4, that indicates copyright mark)\n } else if (res.special.noPuncIfInd2 && field.ind2 && res.special.noPuncIfInd2.includes(field.ind2)) {\n normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n\n // Does not match rules -> shouldn't have punc\n } else {\n normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n }\n }\n } else if (res.special.secondLastIfLast) {\n field.subfields.forEach(subField => {\n if (isNaN(subField.code) && res.special.secondLastIfLast !== subField.code) {\n lastSubField = subField;\n } // Not control field\n\n if (typeof res.special.last !== 'undefined' && res.special.secondLastIfLast === subField.code) {\n normalPuncRules(subField, res.special.last, tag, true, false);\n } // Strict because this field should not be abbreviation\n });\n normalPuncRules(lastSubField, res.punc, tag, false, false);\n\n // Search for Finnish terms\n } else if (res.special.termSubfieldCode) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n const lexicon = getLexicon(field, res.special.termSubfieldCode);\n const proceed = !finnishException(field, res.special.termSubfieldCode, false);\n\n\n //const languageField = field.subfields.find(({code}) => code === res.special.termSubfieldCode);\n //if (languageField && languageField.value && finnishTerms.some(p => p.test(languageField.value))) {\n if (lexicon && finnishTerms.some(p => p.test(lexicon)) && proceed) {\n // If (languageField && languageField.value && finnishTerms.indexOf(languageField.value) > -1) {\n normalPuncRules(lastSubField, res.punc, tag, true, false);\n } else {\n normalPuncRules(lastSubField, res.special.else, tag, false, false); // Strict because of years etc (648, 650)\n }\n }\n // Search last of array in subfields and check if it has punc\n } else if (res.special.lastOf) {\n lastSubField = null;\n field.subfields.filter(subField => 'value' in subField).forEach(subField => {\n if (isNaN(subField.code) && res.special.lastOf.indexOf(subField.code) > -1) {\n lastSubField = subField;\n } // Not control field\n\n if (res.special.mandatory && res.special.mandatory.indexOf(subField.code) > -1) {\n normalPuncRules(subField, res.punc, tag, true, false);\n } // Strict because of mandatory\n });\n\n if (lastSubField) {\n normalPuncRules(lastSubField, res.punc, tag, false, false);\n }\n\n // If field has linked rules (tag: 880), find rules and re-validate\n } else if (res.special.linked) {\n let linkedTag = null;\n try {\n linkedTag = parseInt(field.subfields.find(({code}) => code === res.special.linked).value.substr(0, 3), 10); // Substring feels stupid, but is used in MarcRecord to extract tag.\n } catch (err) {\n debug(`Got error while parsing tag: ${err instanceof Error ? err.stack : err}`);\n return false;\n }\n\n validateField(field, linkedTag, fix, message);\n }\n // fallback\n else {\n debug(`special is definedm but no rule applies`);\n const lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n normalPuncRules(lastSubField, res.punc, field.tag, false, false, fix, message);\n }\n }\n }\n\n let res = null;\n let tag = null;\n let lastSubField = null;\n\n if (linkedTag) {\n tag = linkedTag;\n } else {\n try {\n tag = parseInt(field.tag, 10);\n } catch (err) {\n debug(`Got error while parsing tag: ${err instanceof Error ? err.stack : err}`);\n return false;\n }\n }\n\n // Find configuration object matching tag:\n res = Object.values(confSpec).find(o => {\n const rangeFine = o.rangeStart <= tag && o.rangeEnd >= tag;\n return o.index === tag || rangeFine;\n });\n\n if (!res) {\n return;\n } // Configuration not found, pass field without error\n\n // Field does not have subfields; invalid\n if (typeof field.subfields === 'undefined' || field.subfields === null) {\n message.message.push(`Field ${field.tag} has invalid ending punctuation`);\n return;\n }\n\n const forceNormal = res.special ? finnishException(field, res.special.termSubfieldCode, true) : false;\n // Normal rules\n if (typeof res.special === 'undefined' || res.special === null || forceNormal) {\n if (forceNormal) {\n console.info(\"EXCEPTION. SKIP FINNISH RULES\");\n }\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n normalPuncRules(lastSubField, res.punc, field.tag, false, false, fix, message);\n }\n } else {\n try {\n specialCases(res, field, field.tag);\n } catch (e) {\n console.error('Catched error from special case: ', e); // eslint-disable-line no-console\n }\n }\n}\n\nexport function validateSingleField(field, linkedTag, fix) {\n const message = {};\n message.message = [];\n if (fix) {\n message.fix = [];\n }\n\n validateField(field, linkedTag, fix, message);\n message.valid = !(message.message.length >= 1);\n return message;\n}\n\nfunction getLexicon(field, subfieldCode) {\n const languageSubfield = field.subfields.find(({code}) => code === subfieldCode); // res.special.termSubfieldCode);\n if (!languageSubfield || !languageSubfield.value) {\n return undefined;\n }\n if (finnishTerms.find(p => p.test(languageSubfield.value))) {\n return languageSubfield.value;\n }\n return undefined;\n}\n\nfunction finnishException(field, termSubfieldCode, hasDot = true) {\n const lexicon = getLexicon(field, termSubfieldCode);\n if (!lexicon) {\n return false;\n }\n\n const lastSubfield = findLastSubfield(field);\n if (!lastSubfield || !lastSubfield.value) {\n return false;\n }\n // Some terms can end in '.' that we want to keep\n if (field.tag === '648') { // Yso-aika checks\n //console.log(`Finnish Exception? '${lastSubfield.value}', '${lexicon}', '${field.tag}'`);\n if (lexicon === 'yso/fin') { // 'eaa.' appears in prefLAbels and 'eKr.' in altLabels\n if (hasDot) {\n return lastSubfield.value.match(/ (?:eaa|[ej]Kr|jaa)\\.$/u); // Finnish term from which the dot is not to be removed\n }\n return lastSubfield.value.match(/ (?:eaa|[ej]Kr)|jaa$/u); // Finnish word that needs a dot\n }\n\n if (lexicon === 'yso/swe') {\n if (hasDot) {\n return lastSubfield.value.match(/ (?:[ef]\\.Kr|f\\.v\\.t)\\.$/u);\n }\n return lastSubfield.value.match(/ (?:[ef]\\.Kr|f\\.v\\.t)$/u);\n }\n }\n // yso has 'MODEL.LA.' and 'Corel R.A.V.E.' but these are so rare I'm not listing them\n\n return false;\n}\n\n // This is used to find last subfield that should have punctuation\n function findLastSubfield(field) {\n const subfields = field.subfields.filter(sf => isNaN(sf.code) && 'value' in sf);\n return subfields.slice(-1).shift();\n }"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["tag", "res", "field", "lastSubField", "linkedTag"]
|
|
7
|
+
}
|