@natlibfi/marc-record-validators-melinda 11.6.7 → 12.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/melinda-node-tests.yml +1 -1
- package/dist/access-rights.js +63 -91
- package/dist/access-rights.js.map +7 -1
- package/dist/access-rights.test.js +137 -0
- package/dist/access-rights.test.js.map +7 -0
- package/dist/addMissingField041.js +21 -53
- package/dist/addMissingField041.js.map +7 -1
- package/dist/addMissingField041.test.js +39 -0
- package/dist/addMissingField041.test.js.map +7 -0
- package/dist/addMissingField336.js +99 -191
- package/dist/addMissingField336.js.map +7 -1
- package/dist/addMissingField336.test.js +39 -0
- package/dist/addMissingField336.test.js.map +7 -0
- package/dist/addMissingField337.js +63 -132
- package/dist/addMissingField337.js.map +7 -1
- package/dist/addMissingField337.test.js +39 -0
- package/dist/addMissingField337.test.js.map +7 -0
- package/dist/addMissingField338.js +147 -253
- package/dist/addMissingField338.js.map +7 -1
- package/dist/addMissingField338.test.js +39 -0
- package/dist/addMissingField338.test.js.map +7 -0
- package/dist/cyrillux-usemarcon-replacement.js +119 -272
- package/dist/cyrillux-usemarcon-replacement.js.map +7 -1
- package/dist/cyrillux-usemarcon-replacement.test.js +46 -0
- package/dist/cyrillux-usemarcon-replacement.test.js.map +7 -0
- package/dist/cyrillux.js +119 -223
- package/dist/cyrillux.js.map +7 -1
- package/dist/cyrillux.test.js +39 -0
- package/dist/cyrillux.test.js.map +7 -0
- package/dist/disambiguateSeriesStatements.js +40 -81
- package/dist/disambiguateSeriesStatements.js.map +7 -1
- package/dist/disambiguateSeriesStatements.test.js +44 -0
- package/dist/disambiguateSeriesStatements.test.js.map +7 -0
- package/dist/double-commas.js +7 -14
- package/dist/double-commas.js.map +7 -1
- package/dist/double-commas.test.js +48 -0
- package/dist/double-commas.test.js.map +7 -0
- package/dist/duplicates-ind1.js +10 -31
- package/dist/duplicates-ind1.js.map +7 -1
- package/dist/duplicates-ind1.test.js +40 -0
- package/dist/duplicates-ind1.test.js.map +7 -0
- package/dist/empty-fields.js +10 -22
- package/dist/empty-fields.js.map +7 -1
- package/dist/empty-fields.test.js +129 -0
- package/dist/empty-fields.test.js.map +7 -0
- package/dist/ending-punctuation-conf.js +871 -769
- package/dist/ending-punctuation-conf.js.map +7 -1
- package/dist/ending-punctuation.js +84 -167
- package/dist/ending-punctuation.js.map +7 -1
- package/dist/ending-punctuation.test.js +2290 -0
- package/dist/ending-punctuation.test.js.map +7 -0
- package/dist/ending-whitespace.js +10 -35
- package/dist/ending-whitespace.js.map +7 -1
- package/dist/ending-whitespace.test.js +38 -0
- package/dist/ending-whitespace.test.js.map +7 -0
- package/dist/field-008-18-34-character-groups.js +40 -125
- package/dist/field-008-18-34-character-groups.js.map +7 -1
- package/dist/field-008-18-34-character-groups.test.js +45 -0
- package/dist/field-008-18-34-character-groups.test.js.map +7 -0
- package/dist/field-505-separators.js +19 -39
- package/dist/field-505-separators.js.map +7 -1
- package/dist/field-505-separators.test.js +45 -0
- package/dist/field-505-separators.test.js.map +7 -0
- package/dist/field-521-fix.js +19 -47
- package/dist/field-521-fix.js.map +7 -1
- package/dist/field-521-fix.test.js +44 -0
- package/dist/field-521-fix.test.js.map +7 -0
- package/dist/field-exclusion.js +37 -91
- package/dist/field-exclusion.js.map +7 -1
- package/dist/field-exclusion.test.js +821 -0
- package/dist/field-exclusion.test.js.map +7 -0
- package/dist/field-structure.js +52 -104
- package/dist/field-structure.js.map +7 -1
- package/dist/field-structure.test.js +587 -0
- package/dist/field-structure.test.js.map +7 -0
- package/dist/field33XUtils.js +119 -503
- package/dist/field33XUtils.js.map +7 -1
- package/dist/fields-present.js +11 -23
- package/dist/fields-present.js.map +7 -1
- package/dist/fields-present.test.js +95 -0
- package/dist/fields-present.test.js.map +7 -0
- package/dist/fix-33X.js +393 -431
- package/dist/fix-33X.js.map +7 -1
- package/dist/fix-33X.test.js +39 -0
- package/dist/fix-33X.test.js.map +7 -0
- package/dist/fix-country-codes.js +20 -50
- package/dist/fix-country-codes.js.map +7 -1
- package/dist/fix-country-codes.test.js +44 -0
- package/dist/fix-country-codes.test.js.map +7 -0
- package/dist/fix-language-codes.js +23 -53
- package/dist/fix-language-codes.js.map +7 -1
- package/dist/fix-language-codes.test.js +38 -0
- package/dist/fix-language-codes.test.js.map +7 -0
- package/dist/fixRelatorTerms.js +82 -209
- package/dist/fixRelatorTerms.js.map +7 -1
- package/dist/fixRelatorTerms.test.js +44 -0
- package/dist/fixRelatorTerms.test.js.map +7 -0
- package/dist/fixed-fields.js +21 -30
- package/dist/fixed-fields.js.map +7 -1
- package/dist/fixed-fields.test.js +87 -0
- package/dist/fixed-fields.test.js.map +7 -0
- package/dist/identical-fields.js +8 -24
- package/dist/identical-fields.js.map +7 -1
- package/dist/identical-fields.test.js +119 -0
- package/dist/identical-fields.test.js.map +7 -0
- package/dist/index.js +119 -413
- package/dist/index.js.map +7 -1
- package/dist/indicator-fixes.js +57 -95
- package/dist/indicator-fixes.js.map +7 -1
- package/dist/indicator-fixes.test.js +42 -0
- package/dist/indicator-fixes.test.js.map +7 -0
- package/dist/isbn-issn.js +66 -126
- package/dist/isbn-issn.js.map +7 -1
- package/dist/isbn-issn.test.js +398 -0
- package/dist/isbn-issn.test.js.map +7 -0
- package/dist/item-language.js +32 -65
- package/dist/item-language.js.map +7 -1
- package/dist/item-language.test.js +322 -0
- package/dist/item-language.test.js.map +7 -0
- package/dist/melindaCustomMergeFields.js +5182 -11233
- package/dist/melindaCustomMergeFields.js.map +7 -1
- package/dist/merge-fields/controlSubfields.js +75 -142
- package/dist/merge-fields/controlSubfields.js.map +7 -1
- package/dist/merge-fields/counterpartField.js +182 -379
- package/dist/merge-fields/counterpartField.js.map +7 -1
- package/dist/merge-fields/index.js +15 -49
- package/dist/merge-fields/index.js.map +7 -1
- package/dist/merge-fields/mergableIndicator.js +18 -51
- package/dist/merge-fields/mergableIndicator.js.map +7 -1
- package/dist/merge-fields/mergableTag.js +78 -30
- package/dist/merge-fields/mergableTag.js.map +7 -1
- package/dist/merge-fields/mergeConfig.js +66 -171
- package/dist/merge-fields/mergeConfig.js.map +7 -1
- package/dist/merge-fields/mergeConstraints.js +323 -1214
- package/dist/merge-fields/mergeConstraints.js.map +7 -1
- package/dist/merge-fields/mergeField.js +47 -111
- package/dist/merge-fields/mergeField.js.map +7 -1
- package/dist/merge-fields/mergeIndicator.js +64 -118
- package/dist/merge-fields/mergeIndicator.js.map +7 -1
- package/dist/merge-fields/mergeOrAddPostprocess.js +14 -38
- package/dist/merge-fields/mergeOrAddPostprocess.js.map +7 -1
- package/dist/merge-fields/mergeOrAddSubfield.js +62 -104
- package/dist/merge-fields/mergeOrAddSubfield.js.map +7 -1
- package/dist/merge-fields/mergeSubfield.js +47 -95
- package/dist/merge-fields/mergeSubfield.js.map +7 -1
- package/dist/merge-fields/removeDuplicateSubfields.js +18 -31
- package/dist/merge-fields/removeDuplicateSubfields.js.map +7 -1
- package/dist/merge-fields/worldKnowledge.js +15 -40
- package/dist/merge-fields/worldKnowledge.js.map +7 -1
- package/dist/merge-fields.test.js +44 -0
- package/dist/merge-fields.test.js.map +7 -0
- package/dist/mergeField500Lisapainokset.js +28 -57
- package/dist/mergeField500Lisapainokset.js.map +7 -1
- package/dist/mergeField500Lisapainokset.test.js +44 -0
- package/dist/mergeField500Lisapainokset.test.js.map +7 -0
- package/dist/mergeRelatorTermFields.js +33 -69
- package/dist/mergeRelatorTermFields.js.map +7 -1
- package/dist/mergeRelatorTermFields.test.js +44 -0
- package/dist/mergeRelatorTermFields.test.js.map +7 -0
- package/dist/modernize-502.js +23 -55
- package/dist/modernize-502.js.map +7 -1
- package/dist/modernize-502.test.js +38 -0
- package/dist/modernize-502.test.js.map +7 -0
- package/dist/multiple-subfield-0.js +23 -48
- package/dist/multiple-subfield-0.js.map +7 -1
- package/dist/multiple-subfield-0.test.js +44 -0
- package/dist/multiple-subfield-0.test.js.map +7 -0
- package/dist/non-breaking-space.js +11 -32
- package/dist/non-breaking-space.js.map +7 -1
- package/dist/non-breaking-space.test.js +38 -0
- package/dist/non-breaking-space.test.js.map +7 -0
- package/dist/normalize-dashes.js +18 -37
- package/dist/normalize-dashes.js.map +7 -1
- package/dist/normalize-dashes.test.js +44 -0
- package/dist/normalize-dashes.test.js.map +7 -0
- package/dist/normalize-identifiers.js +54 -140
- package/dist/normalize-identifiers.js.map +7 -1
- package/dist/normalize-identifiers.test.js +44 -0
- package/dist/normalize-identifiers.test.js.map +7 -0
- package/dist/normalize-qualifying-information.js +23 -48
- package/dist/normalize-qualifying-information.js.map +7 -1
- package/dist/normalize-qualifying-information.test.js +44 -0
- package/dist/normalize-qualifying-information.test.js.map +7 -0
- package/dist/normalize-utf8-diacritics.js +19 -105
- package/dist/normalize-utf8-diacritics.js.map +7 -1
- package/dist/normalize-utf8-diacritics.test.js +44 -0
- package/dist/normalize-utf8-diacritics.test.js.map +7 -0
- package/dist/normalizeFieldForComparison.js +67 -158
- package/dist/normalizeFieldForComparison.js.map +7 -1
- package/dist/normalizeSubfieldValueForComparison.js +37 -77
- package/dist/normalizeSubfieldValueForComparison.js.map +7 -1
- package/dist/prepublicationUtils.js +58 -111
- package/dist/prepublicationUtils.js.map +7 -1
- package/dist/punctuation/index.js +56 -72
- package/dist/punctuation/index.js.map +7 -1
- package/dist/punctuation/rules/aut.js +372 -331
- package/dist/punctuation/rules/aut.js.map +7 -1
- package/dist/punctuation/rules/bib.js +420 -373
- package/dist/punctuation/rules/bib.js.map +7 -1
- package/dist/punctuation/rules/index.js +7 -21
- package/dist/punctuation/rules/index.js.map +7 -1
- package/dist/punctuation.test.js +44 -0
- package/dist/punctuation.test.js.map +7 -0
- package/dist/punctuation2.js +251 -800
- package/dist/punctuation2.js.map +7 -1
- package/dist/punctuation2.test.js +44 -0
- package/dist/punctuation2.test.js.map +7 -0
- package/dist/reindexSubfield6OccurenceNumbers.js +61 -96
- package/dist/reindexSubfield6OccurenceNumbers.js.map +7 -1
- package/dist/reindexSubfield6OccurenceNumbers.test.js +44 -0
- package/dist/reindexSubfield6OccurenceNumbers.test.js.map +7 -0
- package/dist/removeDuplicateDataFields.js +102 -202
- package/dist/removeDuplicateDataFields.js.map +7 -1
- package/dist/removeDuplicateDataFields.test.js +44 -0
- package/dist/removeDuplicateDataFields.test.js.map +7 -0
- package/dist/removeInferiorDataFields.js +103 -227
- package/dist/removeInferiorDataFields.js.map +7 -1
- package/dist/removeInferiorDataFields.test.js +44 -0
- package/dist/removeInferiorDataFields.test.js.map +7 -0
- package/dist/resolvable-ext-references-melinda.js +25 -60
- package/dist/resolvable-ext-references-melinda.js.map +7 -1
- package/dist/resolvable-ext-references-melinda.test.js +160 -0
- package/dist/resolvable-ext-references-melinda.test.js.map +7 -0
- package/dist/resolveOrphanedSubfield6s.js +33 -64
- package/dist/resolveOrphanedSubfield6s.js.map +7 -1
- package/dist/resolveOrphanedSubfield6s.test.js +44 -0
- package/dist/resolveOrphanedSubfield6s.test.js.map +7 -0
- package/dist/sanitize-vocabulary-source-codes.js +27 -55
- package/dist/sanitize-vocabulary-source-codes.js.map +7 -1
- package/dist/sanitize-vocabulary-source-codes.test.js +45 -0
- package/dist/sanitize-vocabulary-source-codes.test.js.map +7 -0
- package/dist/sort-tags.js +13 -25
- package/dist/sort-tags.js.map +7 -1
- package/dist/sort-tags.test.js +261 -0
- package/dist/sort-tags.test.js.map +7 -0
- package/dist/sortFields.js +152 -222
- package/dist/sortFields.js.map +7 -1
- package/dist/sortFields.test.js +44 -0
- package/dist/sortFields.test.js.map +7 -0
- package/dist/sortRelatorTerms.js +30 -68
- package/dist/sortRelatorTerms.js.map +7 -1
- package/dist/sortRelatorTerms.test.js +44 -0
- package/dist/sortRelatorTerms.test.js.map +7 -0
- package/dist/sortSubfields.js +102 -255
- package/dist/sortSubfields.js.map +7 -1
- package/dist/sortSubfields.test.js +44 -0
- package/dist/sortSubfields.test.js.map +7 -0
- package/dist/stripPunctuation.js +13 -36
- package/dist/stripPunctuation.js.map +7 -1
- package/dist/stripPunctuation.test.js +44 -0
- package/dist/stripPunctuation.test.js.map +7 -0
- package/dist/subfield-exclusion.js +28 -75
- package/dist/subfield-exclusion.js.map +7 -1
- package/dist/subfield-exclusion.test.js +471 -0
- package/dist/subfield-exclusion.test.js.map +7 -0
- package/dist/subfield6Utils.js +107 -269
- package/dist/subfield6Utils.js.map +7 -1
- package/dist/subfield8Utils.js +26 -50
- package/dist/subfield8Utils.js.map +7 -1
- package/dist/subfieldValueNormalizations.js +40 -74
- package/dist/subfieldValueNormalizations.js.map +7 -1
- package/dist/subfieldValueNormalizations.test.js +45 -0
- package/dist/subfieldValueNormalizations.test.js.map +7 -0
- package/dist/sync-007-and-300.js +22 -53
- package/dist/sync-007-and-300.js.map +7 -1
- package/dist/sync-007-and-300.test.js +44 -0
- package/dist/sync-007-and-300.test.js.map +7 -0
- package/dist/translate-terms.js +67 -155
- package/dist/translate-terms.js.map +7 -1
- package/dist/translate-terms.test.js +44 -0
- package/dist/translate-terms.test.js.map +7 -0
- package/dist/typeOfDate-008.js +10 -25
- package/dist/typeOfDate-008.js.map +7 -1
- package/dist/typeOfDate-008.test.js +40 -0
- package/dist/typeOfDate-008.test.js.map +7 -0
- package/dist/unicode-decomposition.js +94 -107
- package/dist/unicode-decomposition.js.map +7 -1
- package/dist/unicode-decomposition.test.js +94 -0
- package/dist/unicode-decomposition.test.js.map +7 -0
- package/dist/update-field-540.js +30 -75
- package/dist/update-field-540.js.map +7 -1
- package/dist/update-field-540.test.js +44 -0
- package/dist/update-field-540.test.js.map +7 -0
- package/dist/urn.js +55 -128
- package/dist/urn.js.map +7 -1
- package/dist/urn.test.js +44 -0
- package/dist/urn.test.js.map +7 -0
- package/dist/utils.js +72 -126
- package/dist/utils.js.map +7 -1
- package/eslint.config.mjs +1 -2
- package/package.json +21 -93
- package/src/access-rights.js +1 -1
- package/src/{access-rights.spec.js → access-rights.test.js} +9 -10
- package/src/addMissingField041.js +1 -1
- package/src/{addMissingField336.spec.js → addMissingField041.test.js} +13 -14
- package/src/addMissingField336.js +3 -3
- package/src/{addMissingField041.spec.js → addMissingField336.test.js} +13 -14
- package/src/addMissingField337.js +2 -2
- package/src/{addMissingField337.spec.js → addMissingField337.test.js} +13 -14
- package/src/addMissingField338.js +2 -2
- package/src/{addMissingField338.spec.js → addMissingField338.test.js} +13 -14
- package/src/cyrillux-usemarcon-replacement.js +18 -18
- package/src/cyrillux-usemarcon-replacement.test.js +55 -0
- package/src/cyrillux.js +19 -12
- package/src/{cyrillux.spec.js → cyrillux.test.js} +13 -14
- package/src/disambiguateSeriesStatements.js +2 -2
- package/src/{disambiguateSeriesStatements.spec.js → disambiguateSeriesStatements.test.js} +12 -13
- package/src/double-commas.js +1 -1
- package/src/{double-commas.spec.js → double-commas.test.js} +9 -11
- package/src/duplicates-ind1.js +1 -1
- package/src/{duplicates-ind1.spec.js → duplicates-ind1.test.js} +12 -13
- package/src/{empty-fields.spec.js → empty-fields.test.js} +11 -13
- package/src/ending-punctuation.js +1 -1
- package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +172 -173
- package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
- package/src/field-008-18-34-character-groups.js +2 -2
- package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
- package/src/field-505-separators.js +3 -3
- package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
- package/src/field-521-fix.js +2 -2
- package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
- package/src/field-exclusion.js +1 -1
- package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
- package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
- package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
- package/src/fix-33X.js +4 -4
- package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
- package/src/fix-country-codes.js +1 -1
- package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
- package/src/fix-language-codes.js +5 -5
- package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
- package/src/fixRelatorTerms.js +5 -5
- package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
- package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
- package/src/identical-fields.js +1 -1
- package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
- package/src/indicator-fixes.js +3 -3
- package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
- package/src/isbn-issn.js +1 -1
- package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
- package/src/{item-language.spec.js → item-language.test.js} +21 -22
- package/src/merge-fields/controlSubfields.js +1 -1
- package/src/merge-fields/counterpartField.js +8 -9
- package/src/merge-fields/index.js +1 -1
- package/src/merge-fields/mergableIndicator.js +1 -1
- package/src/merge-fields/mergeField.js +6 -6
- package/src/merge-fields/mergeIndicator.js +1 -1
- package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
- package/src/merge-fields/mergeOrAddSubfield.js +2 -2
- package/src/merge-fields/mergeSubfield.js +4 -4
- package/src/merge-fields/removeDuplicateSubfields.js +2 -2
- package/src/{merge-fields.spec.js → merge-fields.test.js} +12 -13
- package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
- package/src/mergeRelatorTermFields.js +5 -7
- package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
- package/src/modernize-502.js +1 -1
- package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
- package/src/multiple-subfield-0.js +3 -3
- package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
- package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
- package/src/normalize-dashes.js +2 -2
- package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
- package/src/normalize-identifiers.js +1 -1
- package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
- package/src/normalize-qualifying-information.js +2 -2
- package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
- package/src/normalize-utf8-diacritics.js +2 -2
- package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
- package/src/normalizeFieldForComparison.js +6 -6
- package/src/normalizeSubfieldValueForComparison.js +1 -1
- package/src/prepublicationUtils.js +4 -4
- package/src/punctuation/index.js +1 -1
- package/src/punctuation/rules/index.js +2 -2
- package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
- package/src/punctuation2.js +4 -4
- package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
- package/src/reindexSubfield6OccurenceNumbers.js +5 -7
- package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
- package/src/removeDuplicateDataFields.js +11 -19
- package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
- package/src/removeInferiorDataFields.js +11 -11
- package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
- package/src/resolvable-ext-references-melinda.js +1 -1
- package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
- package/src/resolveOrphanedSubfield6s.js +5 -5
- package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
- package/src/sanitize-vocabulary-source-codes.js +4 -4
- package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
- package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
- package/src/sortFields.js +4 -4
- package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
- package/src/sortRelatorTerms.js +3 -3
- package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
- package/src/sortSubfields.js +1 -1
- package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
- package/src/stripPunctuation.js +3 -3
- package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
- package/src/subfield-exclusion.js +1 -1
- package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
- package/src/subfield6Utils.js +6 -10
- package/src/subfield8Utils.js +4 -4
- package/src/subfieldValueNormalizations.js +3 -3
- package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
- package/src/sync-007-and-300.js +2 -2
- package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
- package/src/translate-terms.js +3 -3
- package/src/{translate-terms.spec.js → translate-terms.test.js} +13 -13
- package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
- package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
- package/src/update-field-540.js +2 -2
- package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
- package/src/urn.js +2 -2
- package/src/{urn.spec.js → urn.test.js} +12 -13
- package/src/utils.js +3 -3
- package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
- package/test-fixtures/field-505-separators/03/record.json +3 -0
- package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
- package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
- package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
- package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
- package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
- package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
- package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
- package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
- package/dist/access-rights.spec.js +0 -195
- package/dist/access-rights.spec.js.map +0 -1
- package/dist/addMissingField041.spec.js +0 -45
- package/dist/addMissingField041.spec.js.map +0 -1
- package/dist/addMissingField336.spec.js +0 -45
- package/dist/addMissingField336.spec.js.map +0 -1
- package/dist/addMissingField337.spec.js +0 -43
- package/dist/addMissingField337.spec.js.map +0 -1
- package/dist/addMissingField338.spec.js +0 -45
- package/dist/addMissingField338.spec.js.map +0 -1
- package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
- package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
- package/dist/cyrillux.spec.js +0 -46
- package/dist/cyrillux.spec.js.map +0 -1
- package/dist/disambiguateSeriesStatements.spec.js +0 -51
- package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
- package/dist/double-commas.spec.js +0 -73
- package/dist/double-commas.spec.js.map +0 -1
- package/dist/duplicates-ind1.spec.js +0 -45
- package/dist/duplicates-ind1.spec.js.map +0 -1
- package/dist/empty-fields.spec.js +0 -118
- package/dist/empty-fields.spec.js.map +0 -1
- package/dist/ending-punctuation.spec.js +0 -2654
- package/dist/ending-punctuation.spec.js.map +0 -1
- package/dist/ending-whitespace.spec.js +0 -42
- package/dist/ending-whitespace.spec.js.map +0 -1
- package/dist/field-008-18-34-character-groups.spec.js +0 -51
- package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
- package/dist/field-505-separators.spec.js +0 -51
- package/dist/field-505-separators.spec.js.map +0 -1
- package/dist/field-521-fix.spec.js +0 -51
- package/dist/field-521-fix.spec.js.map +0 -1
- package/dist/field-exclusion.spec.js +0 -1054
- package/dist/field-exclusion.spec.js.map +0 -1
- package/dist/field-structure.spec.js +0 -535
- package/dist/field-structure.spec.js.map +0 -1
- package/dist/fields-present.spec.js +0 -121
- package/dist/fields-present.spec.js.map +0 -1
- package/dist/fix-33X.spec.js +0 -45
- package/dist/fix-33X.spec.js.map +0 -1
- package/dist/fix-country-codes.spec.js +0 -51
- package/dist/fix-country-codes.spec.js.map +0 -1
- package/dist/fix-language-codes.spec.js +0 -44
- package/dist/fix-language-codes.spec.js.map +0 -1
- package/dist/fixRelatorTerms.spec.js +0 -51
- package/dist/fixRelatorTerms.spec.js.map +0 -1
- package/dist/fixed-fields.spec.js +0 -140
- package/dist/fixed-fields.spec.js.map +0 -1
- package/dist/identical-fields.spec.js +0 -99
- package/dist/identical-fields.spec.js.map +0 -1
- package/dist/indicator-fixes.spec.js +0 -51
- package/dist/indicator-fixes.spec.js.map +0 -1
- package/dist/isbn-issn.spec.js +0 -595
- package/dist/isbn-issn.spec.js.map +0 -1
- package/dist/item-language.spec.js +0 -306
- package/dist/item-language.spec.js.map +0 -1
- package/dist/melindaCustomMergeFields.json +0 -5120
- package/dist/merge-fields.spec.js +0 -51
- package/dist/merge-fields.spec.js.map +0 -1
- package/dist/mergeField500Lisapainokset.spec.js +0 -51
- package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
- package/dist/mergeRelatorTermFields.spec.js +0 -51
- package/dist/mergeRelatorTermFields.spec.js.map +0 -1
- package/dist/modernize-502.spec.js +0 -49
- package/dist/modernize-502.spec.js.map +0 -1
- package/dist/multiple-subfield-0.spec.js +0 -51
- package/dist/multiple-subfield-0.spec.js.map +0 -1
- package/dist/non-breaking-space.spec.js +0 -42
- package/dist/non-breaking-space.spec.js.map +0 -1
- package/dist/normalize-dashes.spec.js +0 -51
- package/dist/normalize-dashes.spec.js.map +0 -1
- package/dist/normalize-identifiers.spec.js +0 -51
- package/dist/normalize-identifiers.spec.js.map +0 -1
- package/dist/normalize-qualifying-information.spec.js +0 -51
- package/dist/normalize-qualifying-information.spec.js.map +0 -1
- package/dist/normalize-utf8-diacritics.spec.js +0 -51
- package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
- package/dist/punctuation.spec.js +0 -51
- package/dist/punctuation.spec.js.map +0 -1
- package/dist/punctuation2.spec.js +0 -51
- package/dist/punctuation2.spec.js.map +0 -1
- package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
- package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
- package/dist/removeDuplicateDataFields.spec.js +0 -51
- package/dist/removeDuplicateDataFields.spec.js.map +0 -1
- package/dist/removeInferiorDataFields.spec.js +0 -51
- package/dist/removeInferiorDataFields.spec.js.map +0 -1
- package/dist/resolvable-ext-references-melinda.spec.js +0 -166
- package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
- package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
- package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
- package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
- package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
- package/dist/sort-tags.spec.js +0 -207
- package/dist/sort-tags.spec.js.map +0 -1
- package/dist/sortFields.spec.js +0 -51
- package/dist/sortFields.spec.js.map +0 -1
- package/dist/sortRelatorTerms.spec.js +0 -51
- package/dist/sortRelatorTerms.spec.js.map +0 -1
- package/dist/sortSubfields.spec.js +0 -52
- package/dist/sortSubfields.spec.js.map +0 -1
- package/dist/stripPunctuation.spec.js +0 -51
- package/dist/stripPunctuation.spec.js.map +0 -1
- package/dist/subfield-exclusion.spec.js +0 -523
- package/dist/subfield-exclusion.spec.js.map +0 -1
- package/dist/subfieldValueNormalizations.spec.js +0 -51
- package/dist/subfieldValueNormalizations.spec.js.map +0 -1
- package/dist/sync-007-and-300.spec.js +0 -51
- package/dist/sync-007-and-300.spec.js.map +0 -1
- package/dist/translate-terms.spec.js +0 -51
- package/dist/translate-terms.spec.js.map +0 -1
- package/dist/typeOfDate-008.spec.js +0 -47
- package/dist/typeOfDate-008.spec.js.map +0 -1
- package/dist/unicode-decomposition.spec.js +0 -91
- package/dist/unicode-decomposition.spec.js.map +0 -1
- package/dist/update-field-540.spec.js +0 -51
- package/dist/update-field-540.spec.js.map +0 -1
- package/dist/urn.spec.js +0 -52
- package/dist/urn.spec.js.map +0 -1
- package/src/cyrillux-usemarcon-replacement.spec.js +0 -47
package/dist/punctuation2.js
CHANGED
|
@@ -1,926 +1,390 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
exports.fieldFixPunctuation = fieldFixPunctuation;
|
|
8
|
-
exports.fieldGetFixedString = fieldGetFixedString;
|
|
9
|
-
exports.fieldNeedsModification = fieldNeedsModification;
|
|
10
|
-
exports.fieldStripPunctuation = fieldStripPunctuation;
|
|
11
|
-
var _endingPunctuation = require("./ending-punctuation");
|
|
12
|
-
var _subfield6Utils = require("./subfield6Utils");
|
|
13
|
-
var _utils = require("./utils");
|
|
14
|
-
var _clone = _interopRequireDefault(require("clone"));
|
|
15
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
-
/*
|
|
17
|
-
* punctuation.js -- try and fix a marc field punctuation
|
|
18
|
-
*
|
|
19
|
-
* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>
|
|
20
|
-
*
|
|
21
|
-
* NOTE #1: https://www.kiwi.fi/display/kumea/Loppupisteohje is implemented via another validator/fixer (ending-punctuation).
|
|
22
|
-
* This file has some support but it's now yet thorough. (And mmight never be.)
|
|
23
|
-
* NOTE #2: Validator/fixer punctuation does similar stuff, but focuses on X00 fields.
|
|
24
|
-
* NOTE #3: As of 2023-06-05 control subfields ($0...$9) are obsolete. Don't use them in rules.
|
|
25
|
-
* (They are jumped over when looking for next (non-controlfield subfield)
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
//import createDebugLogger from 'debug';
|
|
29
|
-
|
|
30
|
-
//const debug = createDebugLogger('debug/punctuation2');
|
|
31
|
-
|
|
32
|
-
const descriptionString = 'Remove invalid and add valid punctuation to data fields';
|
|
33
|
-
function _default() {
|
|
1
|
+
import { validateSingleField } from "./ending-punctuation.js";
|
|
2
|
+
import { fieldGetUnambiguousTag } from "./subfield6Utils.js";
|
|
3
|
+
import { fieldToString, nvdebug } from "./utils.js";
|
|
4
|
+
import clone from "clone";
|
|
5
|
+
const descriptionString = "Remove invalid and add valid punctuation to data fields";
|
|
6
|
+
export default function() {
|
|
34
7
|
return {
|
|
35
8
|
description: descriptionString,
|
|
36
9
|
validate,
|
|
37
10
|
fix
|
|
38
11
|
};
|
|
39
12
|
function fix(record) {
|
|
40
|
-
|
|
41
|
-
const res = {
|
|
42
|
-
|
|
43
|
-
fix: [],
|
|
44
|
-
valid: true
|
|
45
|
-
};
|
|
46
|
-
record.fields.forEach(f => fieldFixPunctuation(f)); // eslint-disable-line array-callback-return
|
|
13
|
+
nvdebug(`${descriptionString}: fixer`);
|
|
14
|
+
const res = { message: [], fix: [], valid: true };
|
|
15
|
+
record.fields.forEach((f) => fieldFixPunctuation(f));
|
|
47
16
|
return res;
|
|
48
17
|
}
|
|
49
18
|
function validate(record) {
|
|
50
|
-
|
|
51
|
-
const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, true));
|
|
52
|
-
const values = fieldsNeedingModification.map(f =>
|
|
53
|
-
const newValues = fieldsNeedingModification.map(f => fieldGetFixedString(f, true));
|
|
19
|
+
nvdebug(`${descriptionString}: validate`);
|
|
20
|
+
const fieldsNeedingModification = record.fields.filter((f) => fieldNeedsModification(f, true));
|
|
21
|
+
const values = fieldsNeedingModification.map((f) => fieldToString(f));
|
|
22
|
+
const newValues = fieldsNeedingModification.map((f) => fieldGetFixedString(f, true));
|
|
54
23
|
const messages = values.map((val, i) => `'${val}' => '${newValues[i]}'`);
|
|
55
|
-
const res = {
|
|
56
|
-
message: messages
|
|
57
|
-
};
|
|
24
|
+
const res = { message: messages };
|
|
58
25
|
res.valid = res.message.length < 1;
|
|
59
26
|
return res;
|
|
60
27
|
}
|
|
61
28
|
}
|
|
62
29
|
function isControlSubfield(subfield) {
|
|
63
|
-
return [
|
|
30
|
+
return ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"].includes(subfield.code);
|
|
64
31
|
}
|
|
65
32
|
function getNextRelevantSubfield(field, currSubfieldIndex) {
|
|
66
33
|
return field.subfields.find((subfield, index) => index > currSubfieldIndex && !isControlSubfield(subfield));
|
|
67
34
|
}
|
|
68
|
-
function fieldGetFixedString(field, add = true) {
|
|
69
|
-
const cloneField = (
|
|
35
|
+
export function fieldGetFixedString(field, add = true) {
|
|
36
|
+
const cloneField = clone(field);
|
|
70
37
|
const operation = add ? subfieldFixPunctuation : subfieldStripPunctuation;
|
|
71
38
|
cloneField.subfields.forEach((sf, i) => {
|
|
72
|
-
// NB! instead of next subfield, we should actually get next *non-control-subfield*!!!
|
|
73
|
-
// (In plain English: We should skip $0 - $9 at least, maybe $w as well...)
|
|
74
39
|
operation(cloneField, sf, getNextRelevantSubfield(cloneField, i));
|
|
75
40
|
});
|
|
76
|
-
return
|
|
41
|
+
return fieldToString(cloneField);
|
|
77
42
|
}
|
|
78
|
-
function fieldNeedsModification(field, add = true) {
|
|
43
|
+
export function fieldNeedsModification(field, add = true) {
|
|
79
44
|
if (!field.subfields) {
|
|
80
45
|
return false;
|
|
81
46
|
}
|
|
82
|
-
const originalFieldAsString =
|
|
47
|
+
const originalFieldAsString = fieldToString(field);
|
|
83
48
|
const modifiedFieldAsString = fieldGetFixedString(field, add);
|
|
84
49
|
return modifiedFieldAsString !== originalFieldAsString;
|
|
85
50
|
}
|
|
86
|
-
|
|
87
|
-
/////////////////////////////////////////////////////////////////////////////////////
|
|
88
|
-
// <= Above code is written for the validator logic <= //
|
|
89
|
-
// => Everything below was originally transferred from reducers' punctuation.js => //
|
|
90
|
-
/////////////////////////////////////////////////////////////////////////////////////
|
|
91
|
-
|
|
92
|
-
//const stripCrap = / *[-;:,+]+$/u;
|
|
93
51
|
const needsPuncAfterAlphanumeric = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö)$/u;
|
|
94
52
|
const defaultNeedsPuncAfter2 = /(?:[\]a-zA-Z0-9)]|ä|å|ö|Å|Ä|Ö)$/u;
|
|
95
|
-
const doesNotEndInPunc = /[^!?.:;,]$/u;
|
|
53
|
+
const doesNotEndInPunc = /[^!?.:;,]$/u;
|
|
96
54
|
const blocksPuncRHS = /^(?:\()/u;
|
|
97
55
|
const allowsPuncRHS = /^(?:[A-Za-z0-9]|å|ä|ö|Å|Ä|Ö)/u;
|
|
98
|
-
const aToZ =
|
|
56
|
+
const aToZ = "abcdefghijklmnopqrstuvwxyz";
|
|
99
57
|
const dotIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö|(?:[A-Za-z0-9]|Å|Ä|Ö)(?:[A-Z]|Å|Ä|Ö))\.$/u;
|
|
100
58
|
const puncIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö) ?[.,:;]$/u;
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
};
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
};
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
};
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
};
|
|
127
|
-
const cleanX00aDot = {
|
|
128
|
-
'code': 'abcde',
|
|
129
|
-
'followedBy': 'cdegj',
|
|
130
|
-
'context': dotIsProbablyPunc,
|
|
131
|
-
'remove': /\.$/u
|
|
132
|
-
};
|
|
133
|
-
const cleanCorruption = {
|
|
134
|
-
'code': 'abcdefghijklmnopqrstuvwxyz',
|
|
135
|
-
'remove': / \.$/u
|
|
136
|
-
};
|
|
137
|
-
// These $e dot removals are tricky: before removing the comma, we should know that it ain't an abbreviation such as "esitt."...
|
|
138
|
-
const cleanX00eDot = {
|
|
139
|
-
'code': 'e',
|
|
140
|
-
'followedBy': 'egj#',
|
|
141
|
-
'context': /(?:[ai]ja|jä)[.,]$/u,
|
|
142
|
-
'remove': /\.$/u
|
|
143
|
-
};
|
|
144
|
-
const cleanX11jDot = {
|
|
145
|
-
'code': 'e',
|
|
146
|
-
'followedBy': 'egj#',
|
|
147
|
-
'context': /(?:[ai]ja|jä)[.,]$/u,
|
|
148
|
-
'remove': /\.$/u
|
|
149
|
-
};
|
|
150
|
-
const removeCommaBeforeLanguageSubfieldL = {
|
|
151
|
-
'followedBy': 'l',
|
|
152
|
-
'remove': /,$/u
|
|
153
|
-
};
|
|
154
|
-
const removeCommaBeforeTitleSubfieldT = {
|
|
155
|
-
'followedBy': 't',
|
|
156
|
-
'remove': /,$/u
|
|
157
|
-
};
|
|
158
|
-
const X00RemoveDotAfterBracket = {
|
|
159
|
-
'code': 'cq',
|
|
160
|
-
'context': /\)\.$/u,
|
|
161
|
-
'remove': /\.$/u
|
|
162
|
-
};
|
|
163
|
-
// 390, 800, 810, 830...
|
|
164
|
-
const cleanPuncBeforeLanguage = {
|
|
165
|
-
'code': 'atvxyz',
|
|
166
|
-
'followedBy': 'l',
|
|
167
|
-
'context': puncIsProbablyPunc,
|
|
168
|
-
'remove': / *[.,:;]$/u
|
|
169
|
-
};
|
|
170
|
-
const addX00aComma = {
|
|
171
|
-
'add': ',',
|
|
172
|
-
'code': 'abcqej',
|
|
173
|
-
'followedBy': 'cdeg',
|
|
174
|
-
'context': doesNotEndInPunc,
|
|
175
|
-
'contextRHS': allowsPuncRHS
|
|
176
|
-
};
|
|
177
|
-
const addX00dComma = {
|
|
178
|
-
'name': 'X00$d ending in "-" does not get comma',
|
|
179
|
-
'add': ',',
|
|
180
|
-
'code': 'd',
|
|
181
|
-
'followedBy': 'cdeg',
|
|
182
|
-
'context': /[^-,.!]$/u,
|
|
183
|
-
'contextRHS': allowsPuncRHS
|
|
184
|
-
};
|
|
185
|
-
const addX00aComma2 = {
|
|
186
|
-
'add': ',',
|
|
187
|
-
'code': 'abcdej',
|
|
188
|
-
'followedBy': 'cdeg',
|
|
189
|
-
'context': /(?:[A-Z]|Å|Ä|Ö)\.$/u,
|
|
190
|
-
'contextRHS': allowsPuncRHS
|
|
191
|
-
};
|
|
192
|
-
const addX00Dot = {
|
|
193
|
-
'add': '.',
|
|
194
|
-
'code': 'abcdetv',
|
|
195
|
-
'followedBy': 'fklptu',
|
|
196
|
-
'context': needsPuncAfterAlphanumeric
|
|
197
|
-
};
|
|
198
|
-
const addEntryFieldFinalDot = {
|
|
199
|
-
'name': 'X00 final dot',
|
|
200
|
-
'add': '.',
|
|
201
|
-
'code': 'abcdefghijklmnopqrstuvwxyz',
|
|
202
|
-
'followedBy': '#',
|
|
203
|
-
'context': /[^.)!?-]$/u
|
|
204
|
-
};
|
|
205
|
-
const addX10iColon = {
|
|
206
|
-
name: 'Punctuate relationship information',
|
|
207
|
-
add: ':',
|
|
208
|
-
code: 'i',
|
|
209
|
-
context: defaultNeedsPuncAfter2
|
|
210
|
-
};
|
|
211
|
-
const addX10bDot = {
|
|
212
|
-
'name': 'Add X10 pre-$b dot',
|
|
213
|
-
'add': '.',
|
|
214
|
-
'code': 'ab',
|
|
215
|
-
'followedBy': 'b',
|
|
216
|
-
'context': defaultNeedsPuncAfter2
|
|
217
|
-
};
|
|
218
|
-
const addX10eComma = {
|
|
219
|
-
'add': ',',
|
|
220
|
-
'code': 'abe',
|
|
221
|
-
'followedBy': 'e',
|
|
222
|
-
'context': defaultNeedsPuncAfter2
|
|
223
|
-
};
|
|
224
|
-
const addX10Dot = {
|
|
225
|
-
'name': 'Add X10 final dot',
|
|
226
|
-
'add': '.',
|
|
227
|
-
'code': 'abet',
|
|
228
|
-
'followedBy': 'tu#',
|
|
229
|
-
'context': needsPuncAfterAlphanumeric
|
|
230
|
-
};
|
|
231
|
-
const addColonToRelationshipInformation = {
|
|
232
|
-
'name': 'Add \':\' to 7X0 $i relationship info',
|
|
233
|
-
'add': ':',
|
|
234
|
-
'code': 'i',
|
|
235
|
-
'context': defaultNeedsPuncAfter2
|
|
236
|
-
};
|
|
237
|
-
const addX11Spacecolon = {
|
|
238
|
-
name: '611 space colon(y :-)',
|
|
239
|
-
add: ' :',
|
|
240
|
-
code: 'nd',
|
|
241
|
-
followedBy: 'dc',
|
|
242
|
-
'context': defaultNeedsPuncAfter2
|
|
243
|
-
};
|
|
244
|
-
const addDotBeforeLanguageSubfieldL = {
|
|
245
|
-
'name': 'Add dot before $l',
|
|
246
|
-
'add': '.',
|
|
247
|
-
'code': 'abepst',
|
|
248
|
-
'followedBy': 'l',
|
|
249
|
-
'context': doesNotEndInPunc
|
|
250
|
-
};
|
|
251
|
-
|
|
252
|
-
// 490:
|
|
253
|
-
const addSemicolonBeforeVolumeDesignation = {
|
|
254
|
-
'name': 'Add " ;" before $v',
|
|
255
|
-
'add': ' ;',
|
|
256
|
-
'code': 'atxyz',
|
|
257
|
-
'followedBy': 'v',
|
|
258
|
-
'context': /[^;]$/u
|
|
259
|
-
};
|
|
59
|
+
const removeColons = { "code": "abcdefghijklmnopqrstuvwxyz", "remove": / *[;:]$/u };
|
|
60
|
+
const removeX00Comma = { "code": "abcdejnqt", "followedBy": "abcdenqtv#", "context": /.,$/u, "remove": /,$/u };
|
|
61
|
+
const cleanRHS = { "code": "abcd", "followedBy": "bcde", "context": /(?:(?:[a-z0-9]|å|ä|ö)\.|,)$/u, "contextRHS": blocksPuncRHS, "remove": /[.,]$/u };
|
|
62
|
+
const cleanX00dCommaOrDot = { "code": "d", "followedBy": "et#", "context": /[0-9]-[,.]$/u, "remove": /[,.]$/u };
|
|
63
|
+
const cleanX00aDot = { "code": "abcde", "followedBy": "cdegj", "context": dotIsProbablyPunc, "remove": /\.$/u };
|
|
64
|
+
const cleanCorruption = { "code": "abcdefghijklmnopqrstuvwxyz", "remove": / \.$/u };
|
|
65
|
+
const cleanX00eDot = { "code": "e", "followedBy": "egj#", "context": /(?:[ai]ja|jä)[.,]$/u, "remove": /\.$/u };
|
|
66
|
+
const cleanX11jDot = { "code": "e", "followedBy": "egj#", "context": /(?:[ai]ja|jä)[.,]$/u, "remove": /\.$/u };
|
|
67
|
+
const removeCommaBeforeLanguageSubfieldL = { "followedBy": "l", "remove": /,$/u };
|
|
68
|
+
const removeCommaBeforeTitleSubfieldT = { "followedBy": "t", "remove": /,$/u };
|
|
69
|
+
const X00RemoveDotAfterBracket = { "code": "cq", "context": /\)\.$/u, "remove": /\.$/u };
|
|
70
|
+
const cleanPuncBeforeLanguage = { "code": "atvxyz", "followedBy": "l", "context": puncIsProbablyPunc, "remove": / *[.,:;]$/u };
|
|
71
|
+
const addX00aComma = { "add": ",", "code": "abcqej", "followedBy": "cdeg", "context": doesNotEndInPunc, "contextRHS": allowsPuncRHS };
|
|
72
|
+
const addX00dComma = { "name": 'X00$d ending in "-" does not get comma', "add": ",", "code": "d", "followedBy": "cdeg", "context": /[^-,.!]$/u, "contextRHS": allowsPuncRHS };
|
|
73
|
+
const addX00aComma2 = { "add": ",", "code": "abcdej", "followedBy": "cdeg", "context": /(?:[A-Z]|Å|Ä|Ö)\.$/u, "contextRHS": allowsPuncRHS };
|
|
74
|
+
const addX00Dot = { "add": ".", "code": "abcdetv", "followedBy": "fklptu", "context": needsPuncAfterAlphanumeric };
|
|
75
|
+
const addEntryFieldFinalDot = { "name": "X00 final dot", "add": ".", "code": "abcdefghijklmnopqrstuvwxyz", "followedBy": "#", "context": /[^.)!?-]$/u };
|
|
76
|
+
const addX10iColon = { name: "Punctuate relationship information", add: ":", code: "i", context: defaultNeedsPuncAfter2 };
|
|
77
|
+
const addX10bDot = { "name": "Add X10 pre-$b dot", "add": ".", "code": "ab", "followedBy": "b", "context": defaultNeedsPuncAfter2 };
|
|
78
|
+
const addX10eComma = { "add": ",", "code": "abe", "followedBy": "e", "context": defaultNeedsPuncAfter2 };
|
|
79
|
+
const addX10Dot = { "name": "Add X10 final dot", "add": ".", "code": "abet", "followedBy": "tu#", "context": needsPuncAfterAlphanumeric };
|
|
80
|
+
const addColonToRelationshipInformation = { "name": "Add ':' to 7X0 $i relationship info", "add": ":", "code": "i", "context": defaultNeedsPuncAfter2 };
|
|
81
|
+
const addX11Spacecolon = { name: "611 space colon(y :-)", add: " :", code: "nd", followedBy: "dc", "context": defaultNeedsPuncAfter2 };
|
|
82
|
+
const addDotBeforeLanguageSubfieldL = { "name": "Add dot before $l", "add": ".", "code": "abepst", "followedBy": "l", "context": doesNotEndInPunc };
|
|
83
|
+
const addSemicolonBeforeVolumeDesignation = { "name": 'Add " ;" before $v', "add": " ;", "code": "atxyz", "followedBy": "v", "context": /[^;]$/u };
|
|
260
84
|
const NONE = 0;
|
|
261
85
|
const ADD = 2;
|
|
262
86
|
const REMOVE = 1;
|
|
263
87
|
const REMOVE_AND_ADD = 3;
|
|
264
|
-
|
|
265
|
-
// Crappy punctuation consists of various crap that is somewhat common.
|
|
266
|
-
// We strip crap for merge decisions. We are not trying to actively remove crap here.
|
|
267
|
-
|
|
268
88
|
const removeCrapFromAllEntryFields = [removeCommaBeforeLanguageSubfieldL, removeCommaBeforeTitleSubfieldT];
|
|
269
89
|
const removeX00Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, cleanX00dCommaOrDot, cleanRHS, X00RemoveDotAfterBracket, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];
|
|
270
90
|
const removeX10Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];
|
|
271
91
|
const removeX11Whatever = [removeX00Comma, cleanX11jDot, ...removeCrapFromAllEntryFields];
|
|
272
92
|
const removeX30Whatever = removeCrapFromAllEntryFields;
|
|
273
|
-
const remove490And830Whatever = [{
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
'
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
},
|
|
283
|
-
|
|
284
|
-
{
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
// '!' means negation, thus '!b' means any other subfield but 'b'.
|
|
294
|
-
// 'followedBy': '#' means that current subfield is the last subfield.
|
|
295
|
-
// NB! Note that control subfields are ignored in punctuation rules.
|
|
296
|
-
// NB #2! Control field ignorance causes issues with field 257: https://wiki.helsinki.fi/display/rdasovellusohje/Loppupisteohje
|
|
297
|
-
// Might need to work on that at some point. NOT a top priority though.
|
|
298
|
-
// NB #3! Final punctuation creation is/should be handled by endind-punctuation.js validator!
|
|
299
|
-
|
|
300
|
-
const crappy24X = [{
|
|
301
|
-
'code': 'abnp',
|
|
302
|
-
'followedBy': '!c',
|
|
303
|
-
'remove': / \/$/u
|
|
304
|
-
}, {
|
|
305
|
-
'code': 'abn',
|
|
306
|
-
'followedBy': 'c',
|
|
307
|
-
'remove': /\.$/u,
|
|
308
|
-
'context': dotIsProbablyPunc
|
|
309
|
-
}, {
|
|
310
|
-
'code': 'abn',
|
|
311
|
-
'followedBy': 'c',
|
|
312
|
-
'remove': /\.$/u,
|
|
313
|
-
'context': dotIsProbablyPunc
|
|
314
|
-
}, {
|
|
315
|
-
'code': 'abc',
|
|
316
|
-
'followedBy': '#',
|
|
317
|
-
'remove': /\.$/u,
|
|
318
|
-
'context': dotIsProbablyPunc
|
|
319
|
-
}, {
|
|
320
|
-
'code': 'abfghinp',
|
|
321
|
-
'followedBy': '#',
|
|
322
|
-
'remove': /\.$/u,
|
|
323
|
-
'context': dotIsProbablyPunc
|
|
324
|
-
}, {
|
|
325
|
-
'code': 'n',
|
|
326
|
-
'followedBy': 'p',
|
|
327
|
-
'remove': /\.$/u,
|
|
328
|
-
'context': dotIsProbablyPunc
|
|
329
|
-
},
|
|
330
|
-
// MELINDA-8817
|
|
331
|
-
{
|
|
332
|
-
'code': 'p',
|
|
333
|
-
'followedBy': 'pc',
|
|
334
|
-
'remove': /\.$/u,
|
|
335
|
-
'context': dotIsProbablyPunc
|
|
336
|
-
},
|
|
337
|
-
// MELINDA-8817
|
|
338
|
-
removeCommaBeforeLanguageSubfieldL];
|
|
93
|
+
const remove490And830Whatever = [{ "code": "axyzv", "followedBy": "axyzv", "remove": /(?: *;| *=|,)$/u }];
|
|
94
|
+
const linkingEntryRemoveWhatever = [
|
|
95
|
+
{ "code": "i", "followedBy": "at", "remove": / ?:$/u },
|
|
96
|
+
// ':'
|
|
97
|
+
{ "code": "at", "remove": /\.$/u },
|
|
98
|
+
{ "code": "abdghiklmnopqrstuwxyz", "followedBy": "abdghiklmnopqrstuwxyz", "remove": /\. -$/u }
|
|
99
|
+
];
|
|
100
|
+
const crappy24X = [
|
|
101
|
+
{ "code": "abnp", "followedBy": "!c", "remove": / \/$/u },
|
|
102
|
+
{ "code": "abn", "followedBy": "c", "remove": /\.$/u, "context": dotIsProbablyPunc },
|
|
103
|
+
{ "code": "abn", "followedBy": "c", "remove": /\.$/u, "context": dotIsProbablyPunc },
|
|
104
|
+
{ "code": "abc", "followedBy": "#", "remove": /\.$/u, "context": dotIsProbablyPunc },
|
|
105
|
+
{ "code": "abfghinp", "followedBy": "#", "remove": /\.$/u, "context": dotIsProbablyPunc },
|
|
106
|
+
{ "code": "n", "followedBy": "p", "remove": /\.$/u, "context": dotIsProbablyPunc },
|
|
107
|
+
// MELINDA-8817
|
|
108
|
+
{ "code": "p", "followedBy": "pc", "remove": /\.$/u, "context": dotIsProbablyPunc },
|
|
109
|
+
// MELINDA-8817
|
|
110
|
+
removeCommaBeforeLanguageSubfieldL
|
|
111
|
+
];
|
|
339
112
|
const cleanCrappyPunctuationRules = {
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
'remove': /:$/u,
|
|
355
|
-
'context': /[^ ]:$/u
|
|
356
|
-
}, {
|
|
357
|
-
'code': 'ab',
|
|
358
|
-
'followedBy': '!c',
|
|
359
|
-
'remove': / *;$/u
|
|
360
|
-
}, {
|
|
361
|
-
'code': 'ab',
|
|
362
|
-
'followedBy': 'c',
|
|
363
|
-
'remove': /;$/u,
|
|
364
|
-
'context': /[^ ];$/u
|
|
365
|
-
}, {
|
|
366
|
-
'code': 'abc',
|
|
367
|
-
'followedBy': '!e',
|
|
368
|
-
'remove': / *\+$/u
|
|
369
|
-
} // Removes both valid (with one space) and invalid (spaceless et al) puncs
|
|
113
|
+
"100": removeX00Whatever,
|
|
114
|
+
"110": removeX10Whatever,
|
|
115
|
+
"111": removeX11Whatever,
|
|
116
|
+
"130": removeX30Whatever,
|
|
117
|
+
"240": crappy24X,
|
|
118
|
+
"245": crappy24X,
|
|
119
|
+
"246": crappy24X,
|
|
120
|
+
"300": [
|
|
121
|
+
{ "code": "a", "followedBy": "!b", "remove": / *:$/u },
|
|
122
|
+
{ "code": "a", "followedBy": "b", "remove": /:$/u, "context": /[^ ]:$/u },
|
|
123
|
+
{ "code": "ab", "followedBy": "!c", "remove": / *;$/u },
|
|
124
|
+
{ "code": "ab", "followedBy": "c", "remove": /;$/u, "context": /[^ ];$/u },
|
|
125
|
+
{ "code": "abc", "followedBy": "!e", "remove": / *\+$/u }
|
|
126
|
+
// Removes both valid (with one space) and invalid (spaceless et al) puncs
|
|
370
127
|
],
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
};
|
|
389
|
-
const cleanLegalX00Comma = {
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
};
|
|
395
|
-
// Accept upper case letters in X00$b, since they are probably Roman numerals.
|
|
396
|
-
const cleanLegalX00bDot = {
|
|
397
|
-
'code': 'b',
|
|
398
|
-
'followedBy': 't#',
|
|
399
|
-
context: /^[IVXLCDM]+\.$/u,
|
|
400
|
-
'remove': /\.$/u
|
|
401
|
-
};
|
|
402
|
-
const cleanLegalX00iColon = {
|
|
403
|
-
'code': 'i',
|
|
404
|
-
'followedBy': 'a',
|
|
405
|
-
'remove': / *:$/u
|
|
406
|
-
}; // NB! context is not needed
|
|
407
|
-
const cleanLegalX00Dot = {
|
|
408
|
-
'code': 'abcdetvl',
|
|
409
|
-
'followedBy': 'tu#',
|
|
410
|
-
'context': /(?:[a-z0-9)]|å|ä|ö)\.$/u,
|
|
411
|
-
'remove': /\.$/u
|
|
412
|
-
};
|
|
413
|
-
const cleanDotBeforeLanguageSubfieldL = {
|
|
414
|
-
'name': 'pre-language-$l dot',
|
|
415
|
-
'followedBy': 'l',
|
|
416
|
-
'context': /.\.$/u,
|
|
417
|
-
'remove': /\.$/u
|
|
418
|
-
};
|
|
128
|
+
"490": remove490And830Whatever,
|
|
129
|
+
"600": removeX00Whatever,
|
|
130
|
+
"610": removeX10Whatever,
|
|
131
|
+
"611": removeX11Whatever,
|
|
132
|
+
"630": removeX30Whatever,
|
|
133
|
+
"700": removeX00Whatever,
|
|
134
|
+
"710": removeX10Whatever,
|
|
135
|
+
"711": removeX11Whatever,
|
|
136
|
+
"730": removeX30Whatever,
|
|
137
|
+
"773": linkingEntryRemoveWhatever,
|
|
138
|
+
"774": linkingEntryRemoveWhatever,
|
|
139
|
+
"776": linkingEntryRemoveWhatever,
|
|
140
|
+
"787": linkingEntryRemoveWhatever,
|
|
141
|
+
"800": removeX00Whatever,
|
|
142
|
+
"810": removeX10Whatever,
|
|
143
|
+
"830": remove490And830Whatever,
|
|
144
|
+
"946": crappy24X
|
|
145
|
+
};
|
|
146
|
+
const cleanLegalX00Comma = { "code": "abcde", "followedBy": "cdegj", "context": /.,$/u, "remove": /,$/u };
|
|
147
|
+
const cleanLegalX00bDot = { "code": "b", "followedBy": "t#", context: /^[IVXLCDM]+\.$/u, "remove": /\.$/u };
|
|
148
|
+
const cleanLegalX00iColon = { "code": "i", "followedBy": "a", "remove": / *:$/u };
|
|
149
|
+
const cleanLegalX00Dot = { "code": "abcdetvl", "followedBy": "tu#", "context": /(?:[a-z0-9)]|å|ä|ö)\.$/u, "remove": /\.$/u };
|
|
150
|
+
const cleanDotBeforeLanguageSubfieldL = { "name": "pre-language-$l dot", "followedBy": "l", "context": /.\.$/u, "remove": /\.$/u };
|
|
419
151
|
const legalEntryField = [cleanDotBeforeLanguageSubfieldL];
|
|
420
|
-
const legalX11SpaceColon = {
|
|
421
|
-
name: 'legal X11 spacecolony',
|
|
422
|
-
code: 'nd',
|
|
423
|
-
followedBy: 'dc',
|
|
424
|
-
context: / :$/u,
|
|
425
|
-
remove: / :$/u
|
|
426
|
-
};
|
|
152
|
+
const legalX11SpaceColon = { name: "legal X11 spacecolony", code: "nd", followedBy: "dc", context: / :$/u, remove: / :$/u };
|
|
427
153
|
const legalX00punc = [cleanLegalX00Comma, cleanLegalX00iColon, cleanLegalX00bDot, cleanLegalX00Dot, ...legalEntryField];
|
|
428
|
-
const cleanLegalX10Comma = {
|
|
429
|
-
|
|
430
|
-
'code': 'abe',
|
|
431
|
-
'followedBy': 'e',
|
|
432
|
-
'context': /.,$/u,
|
|
433
|
-
'remove': /,$/u
|
|
434
|
-
};
|
|
435
|
-
const cleanLegalX10Dot = {
|
|
436
|
-
'name': 'X10dot',
|
|
437
|
-
'code': 'abt',
|
|
438
|
-
'followedBy': 'bst#',
|
|
439
|
-
'context': /.\.$/u,
|
|
440
|
-
'remove': /\.$/u
|
|
441
|
-
};
|
|
154
|
+
const cleanLegalX10Comma = { "name": "X10comma", "code": "abe", "followedBy": "e", "context": /.,$/u, "remove": /,$/u };
|
|
155
|
+
const cleanLegalX10Dot = { "name": "X10dot", "code": "abt", "followedBy": "bst#", "context": /.\.$/u, "remove": /\.$/u };
|
|
442
156
|
const legalX10punc = [cleanLegalX10Comma, cleanLegalX10Dot, cleanX00eDot, ...legalEntryField];
|
|
443
157
|
const cleanLegalSeriesTitle = [
|
|
444
|
-
// 490 and 830
|
|
445
|
-
{
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
},
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
'name': 'I:A',
|
|
461
|
-
'code': 'i',
|
|
462
|
-
'followedBy': 'a',
|
|
463
|
-
'remove': / *:$/u
|
|
464
|
-
}, {
|
|
465
|
-
'name': 'A:B',
|
|
466
|
-
'code': 'a',
|
|
467
|
-
'followedBy': 'b',
|
|
468
|
-
'remove': / [:;=]$/u
|
|
469
|
-
}, {
|
|
470
|
-
'name': 'AB:K',
|
|
471
|
-
'code': 'ab',
|
|
472
|
-
'followedBy': 'k',
|
|
473
|
-
'remove': / :$/u
|
|
474
|
-
}, {
|
|
475
|
-
'name': 'ABK:F',
|
|
476
|
-
'code': 'abk',
|
|
477
|
-
'followedBy': 'f',
|
|
478
|
-
'remove': /,$/u
|
|
479
|
-
}, {
|
|
480
|
-
'name': 'ABFNP:C',
|
|
481
|
-
'code': 'abfnp',
|
|
482
|
-
'followedBy': 'c',
|
|
483
|
-
'remove': / \/$/u
|
|
484
|
-
}, {
|
|
485
|
-
'name': 'ABN:N',
|
|
486
|
-
'code': 'abn',
|
|
487
|
-
'followedBy': 'n',
|
|
488
|
-
'remove': /\.$/u
|
|
489
|
-
}, {
|
|
490
|
-
'name': 'ABNP:#',
|
|
491
|
-
'code': 'abnp',
|
|
492
|
-
'followedBy': '#',
|
|
493
|
-
'remove': /\.$/u
|
|
494
|
-
}, {
|
|
495
|
-
'name': 'N:P',
|
|
496
|
-
'code': 'n',
|
|
497
|
-
'followedBy': 'p',
|
|
498
|
-
'remove': /,$/u
|
|
499
|
-
}, cleanDotBeforeLanguageSubfieldL];
|
|
158
|
+
// 490 and 830
|
|
159
|
+
{ "code": "a", "followedBy": "a", "remove": / =$/u },
|
|
160
|
+
{ "code": "axyz", "followedBy": "xyz", "remove": /,$/u, "context": /.,$/u },
|
|
161
|
+
{ "code": "axyz", "followedBy": "v", "remove": / *;$/u }
|
|
162
|
+
];
|
|
163
|
+
const clean24X = [
|
|
164
|
+
{ "name": "I:A", "code": "i", "followedBy": "a", "remove": / *:$/u },
|
|
165
|
+
{ "name": "A:B", "code": "a", "followedBy": "b", "remove": / [:;=]$/u },
|
|
166
|
+
{ "name": "AB:K", "code": "ab", "followedBy": "k", "remove": / :$/u },
|
|
167
|
+
{ "name": "ABK:F", "code": "abk", "followedBy": "f", "remove": /,$/u },
|
|
168
|
+
{ "name": "ABFNP:C", "code": "abfnp", "followedBy": "c", "remove": / \/$/u },
|
|
169
|
+
{ "name": "ABN:N", "code": "abn", "followedBy": "n", "remove": /\.$/u },
|
|
170
|
+
{ "name": "ABNP:#", "code": "abnp", "followedBy": "#", "remove": /\.$/u },
|
|
171
|
+
{ "name": "N:P", "code": "n", "followedBy": "p", "remove": /,$/u },
|
|
172
|
+
cleanDotBeforeLanguageSubfieldL
|
|
173
|
+
];
|
|
500
174
|
const legalX11Punc = [...legalEntryField, legalX11SpaceColon];
|
|
501
175
|
const cleanValidPunctuationRules = {
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
'code': 'b',
|
|
520
|
-
'followedBy': 'c',
|
|
521
|
-
'remove': /,$/u
|
|
522
|
-
}, {
|
|
523
|
-
'code': 'c',
|
|
524
|
-
'followedBy': '#',
|
|
525
|
-
'remove': /\.$/u
|
|
526
|
-
}, {
|
|
527
|
-
'code': 'd',
|
|
528
|
-
'followedBy': 'e',
|
|
529
|
-
'remove': / :$/u
|
|
530
|
-
}, {
|
|
531
|
-
'code': 'e',
|
|
532
|
-
'followedBy': 'f',
|
|
533
|
-
'remove': /,$/u
|
|
534
|
-
}, {
|
|
535
|
-
'code': 'f',
|
|
536
|
-
'followedBy': '#',
|
|
537
|
-
'remove': /\.$/u
|
|
538
|
-
} // Probably ')' but should it be removed?
|
|
176
|
+
"100": legalX00punc,
|
|
177
|
+
"110": legalX10punc,
|
|
178
|
+
"111": legalX11Punc,
|
|
179
|
+
"130": legalEntryField,
|
|
180
|
+
"240": clean24X,
|
|
181
|
+
"243": clean24X,
|
|
182
|
+
"245": clean24X,
|
|
183
|
+
"246": clean24X,
|
|
184
|
+
"260": [
|
|
185
|
+
{ "code": "abc", "followedBy": "a", "remove": / ;$/u },
|
|
186
|
+
{ "code": "a", "followedBy": "b", "remove": / :$/u },
|
|
187
|
+
{ "code": "b", "followedBy": "c", "remove": /,$/u },
|
|
188
|
+
{ "code": "c", "followedBy": "#", "remove": /\.$/u },
|
|
189
|
+
{ "code": "d", "followedBy": "e", "remove": / :$/u },
|
|
190
|
+
{ "code": "e", "followedBy": "f", "remove": /,$/u },
|
|
191
|
+
{ "code": "f", "followedBy": "#", "remove": /\.$/u }
|
|
192
|
+
// Probably ')' but should it be removed?
|
|
539
193
|
],
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
'
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
}],
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
'followedBy': 'b',
|
|
558
|
-
'remove': / :$/u
|
|
559
|
-
}, {
|
|
560
|
-
'code': 'ab',
|
|
561
|
-
'followedBy': 'c',
|
|
562
|
-
'remove': / ;$/u
|
|
563
|
-
}, {
|
|
564
|
-
'code': 'abc',
|
|
565
|
-
'followedBy': 'e',
|
|
566
|
-
'remove': / \+$/u
|
|
567
|
-
}],
|
|
568
|
-
'490': cleanLegalSeriesTitle,
|
|
569
|
-
'534': [{
|
|
570
|
-
'code': 'p',
|
|
571
|
-
'followedBy': 'c',
|
|
572
|
-
'remove': /:$/u
|
|
573
|
-
}],
|
|
574
|
-
'600': legalX00punc,
|
|
575
|
-
'610': legalX10punc,
|
|
576
|
-
'611': legalX11Punc,
|
|
577
|
-
'630': legalEntryField,
|
|
194
|
+
"264": [
|
|
195
|
+
{ "code": "a", "followedBy": "b", "remove": / :$/u },
|
|
196
|
+
{ "code": "b", "followedBy": "c", "remove": /,$/u },
|
|
197
|
+
{ "code": "c", "followedBy": "#", "remove": /\.$/u }
|
|
198
|
+
],
|
|
199
|
+
"300": [
|
|
200
|
+
// NB! Remove crap as well, thus the '*' in / *:$/
|
|
201
|
+
{ "code": "a", "followedBy": "b", "remove": / :$/u },
|
|
202
|
+
{ "code": "ab", "followedBy": "c", "remove": / ;$/u },
|
|
203
|
+
{ "code": "abc", "followedBy": "e", "remove": / \+$/u }
|
|
204
|
+
],
|
|
205
|
+
"490": cleanLegalSeriesTitle,
|
|
206
|
+
"534": [{ "code": "p", "followedBy": "c", "remove": /:$/u }],
|
|
207
|
+
"600": legalX00punc,
|
|
208
|
+
"610": legalX10punc,
|
|
209
|
+
"611": legalX11Punc,
|
|
210
|
+
"630": legalEntryField,
|
|
578
211
|
// Experimental, MET366-ish (end punc in internationally valid, but we don't use it here in Finland):
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
'800': legalX00punc,
|
|
590
|
-
'810': legalX10punc,
|
|
591
|
-
'811': legalX11Punc,
|
|
592
|
-
'830': [...legalEntryField, ...cleanLegalSeriesTitle],
|
|
593
|
-
'946': clean24X
|
|
212
|
+
"648": [{ "code": "a", "content": /^[0-9]+\.$/u, "ind2": ["4"], "remove": /\.$/u }],
|
|
213
|
+
"700": legalX00punc,
|
|
214
|
+
"710": legalX10punc,
|
|
215
|
+
"711": legalX11Punc,
|
|
216
|
+
"730": legalEntryField,
|
|
217
|
+
"800": legalX00punc,
|
|
218
|
+
"810": legalX10punc,
|
|
219
|
+
"811": legalX11Punc,
|
|
220
|
+
"830": [...legalEntryField, ...cleanLegalSeriesTitle],
|
|
221
|
+
"946": clean24X
|
|
594
222
|
};
|
|
595
|
-
|
|
596
|
-
// Overgeneralizes a bit: eg. addColonToRelationshipInformation only applies to 700/710 but as others don't have $i, it's fine.
|
|
597
223
|
const addToAllEntryFields = [addDotBeforeLanguageSubfieldL, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation, addEntryFieldFinalDot];
|
|
598
224
|
const addX00 = [addX00aComma, addX00aComma2, addX00Dot, addX00dComma, ...addToAllEntryFields];
|
|
599
225
|
const addX10 = [addX10iColon, addX10bDot, addX10eComma, addX10Dot, ...addToAllEntryFields];
|
|
600
226
|
const addX11 = [...addToAllEntryFields, addX11Spacecolon];
|
|
601
227
|
const addX30 = [...addToAllEntryFields];
|
|
602
|
-
const add24X = [
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
'
|
|
612
|
-
},
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
'
|
|
616
|
-
'context': needsPuncAfterAlphanumeric
|
|
617
|
-
}, {
|
|
618
|
-
'code': 'abfnp',
|
|
619
|
-
'followedBy': 'c',
|
|
620
|
-
'add': ' /',
|
|
621
|
-
'context': '[^/]$'
|
|
622
|
-
}, addDotBeforeLanguageSubfieldL];
|
|
623
|
-
const add245 = [...add24X,
|
|
624
|
-
// Blah! Also "$a = $b" and "$a ; $b" can be valid... But ' :' is better than nothing, I guess...
|
|
625
|
-
{
|
|
626
|
-
'code': 'ab',
|
|
627
|
-
'followedBy': 'n',
|
|
628
|
-
'add': '.',
|
|
629
|
-
'context': needsPuncAfterAlphanumeric
|
|
630
|
-
}, {
|
|
631
|
-
'code': 'n',
|
|
632
|
-
'followedBy': 'p',
|
|
633
|
-
'add': ',',
|
|
634
|
-
'context': defaultNeedsPuncAfter2
|
|
635
|
-
}, {
|
|
636
|
-
'code': 'abnpc',
|
|
637
|
-
'followedBy': '#',
|
|
638
|
-
'add': '.',
|
|
639
|
-
'context': needsPuncAfterAlphanumeric
|
|
640
|
-
} // Stepping on "punctuation validator's" toes
|
|
228
|
+
const add24X = [
|
|
229
|
+
{ "code": "i", "followedBy": "a", "add": ":", "context": needsPuncAfterAlphanumeric },
|
|
230
|
+
{ "code": "a", "followedBy": "b", "add": " :", "context": "[^:]$" },
|
|
231
|
+
{ "code": "abk", "followedBy": "f", "add": ",", "context": needsPuncAfterAlphanumeric },
|
|
232
|
+
{ "code": "abfnp", "followedBy": "c", "add": " /", "context": "[^/]$" },
|
|
233
|
+
addDotBeforeLanguageSubfieldL
|
|
234
|
+
];
|
|
235
|
+
const add245 = [
|
|
236
|
+
...add24X,
|
|
237
|
+
// Blah! Also "$a = $b" and "$a ; $b" can be valid... But ' :' is better than nothing, I guess...
|
|
238
|
+
{ "code": "ab", "followedBy": "n", "add": ".", "context": needsPuncAfterAlphanumeric },
|
|
239
|
+
{ "code": "n", "followedBy": "p", "add": ",", "context": defaultNeedsPuncAfter2 },
|
|
240
|
+
{ "code": "abnpc", "followedBy": "#", "add": ".", "context": needsPuncAfterAlphanumeric }
|
|
241
|
+
// Stepping on "punctuation validator's" toes
|
|
641
242
|
];
|
|
642
243
|
const addSeriesTitle = [
|
|
643
|
-
// 490 and 830
|
|
644
|
-
{
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
'context': defaultNeedsPuncAfter2
|
|
649
|
-
}, {
|
|
650
|
-
'code': 'axyz',
|
|
651
|
-
'followedBy': 'xy',
|
|
652
|
-
'add': ',',
|
|
653
|
-
'context': defaultNeedsPuncAfter2
|
|
654
|
-
}, addSemicolonBeforeVolumeDesignation // eg. 490$axyz-$v
|
|
244
|
+
// 490 and 830
|
|
245
|
+
{ "code": "a", "followedBy": "a", "add": " =", "context": defaultNeedsPuncAfter2 },
|
|
246
|
+
{ "code": "axyz", "followedBy": "xy", "add": ",", "context": defaultNeedsPuncAfter2 },
|
|
247
|
+
addSemicolonBeforeVolumeDesignation
|
|
248
|
+
// eg. 490$axyz-$v
|
|
655
249
|
];
|
|
656
250
|
const addLinkingEntry = [
|
|
657
|
-
// NB! Music 773 uses different punctuation rules, that are not implement here (can they even be?)
|
|
658
|
-
{
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
'context': defaultNeedsPuncAfter2
|
|
663
|
-
}, {
|
|
664
|
-
'code': 'a',
|
|
665
|
-
'followedBy': 't',
|
|
666
|
-
'add': '.',
|
|
667
|
-
'context': defaultNeedsPuncAfter2
|
|
668
|
-
}, {
|
|
669
|
-
'code': 't',
|
|
670
|
-
'followedBy': 'dghoz',
|
|
671
|
-
'add': '.',
|
|
672
|
-
'context': defaultNeedsPuncAfter2
|
|
673
|
-
}];
|
|
251
|
+
// NB! Music 773 uses different punctuation rules, that are not implement here (can they even be?)
|
|
252
|
+
{ "code": "i", "followedBy": aToZ, "add": ":", "context": defaultNeedsPuncAfter2 },
|
|
253
|
+
{ "code": "a", "followedBy": "t", "add": ".", "context": defaultNeedsPuncAfter2 },
|
|
254
|
+
{ "code": "t", "followedBy": "dghoz", "add": ".", "context": defaultNeedsPuncAfter2 }
|
|
255
|
+
];
|
|
674
256
|
const addPairedPunctuationRules = {
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
'
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
},
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
}
|
|
720
|
-
// NB! The $c rule messes dotless exception "264 #4 $c p1983" up
|
|
721
|
-
// We'll need to add a hacky postprocessor for this? Add 'hasInd1': '0123' etc?
|
|
722
|
-
{
|
|
723
|
-
'code': 'c',
|
|
724
|
-
'followedBy': '#',
|
|
725
|
-
'add': '.',
|
|
726
|
-
'context': needsPuncAfterAlphanumeric,
|
|
727
|
-
'ind2': ['0', '1', '2', '3']
|
|
728
|
-
}],
|
|
729
|
-
'300': [{
|
|
730
|
-
'code': 'a',
|
|
731
|
-
'followedBy': 'b',
|
|
732
|
-
'add': ' :',
|
|
733
|
-
'context': defaultNeedsPuncAfter2
|
|
734
|
-
}, {
|
|
735
|
-
'code': 'ab',
|
|
736
|
-
'followedBy': 'c',
|
|
737
|
-
'add': ' ;',
|
|
738
|
-
'context': defaultNeedsPuncAfter2
|
|
739
|
-
}, {
|
|
740
|
-
'code': 'abc',
|
|
741
|
-
'followedBy': 'e',
|
|
742
|
-
'add': ' +',
|
|
743
|
-
'context': defaultNeedsPuncAfter2
|
|
744
|
-
}],
|
|
745
|
-
'490': addSeriesTitle,
|
|
746
|
-
'506': [{
|
|
747
|
-
'code': 'a',
|
|
748
|
-
'followedBy': '#',
|
|
749
|
-
'add': '.',
|
|
750
|
-
'context': defaultNeedsPuncAfter2
|
|
751
|
-
}],
|
|
752
|
-
'534': [{
|
|
753
|
-
'code': 'p',
|
|
754
|
-
'followedBy': 'c',
|
|
755
|
-
'add': ':',
|
|
756
|
-
'context': defaultNeedsPuncAfter2
|
|
757
|
-
}],
|
|
758
|
-
'600': addX00,
|
|
759
|
-
'610': addX10,
|
|
760
|
-
'611': addX11,
|
|
761
|
-
'630': addX30,
|
|
762
|
-
'700': addX00,
|
|
763
|
-
'710': addX10,
|
|
764
|
-
'711': addX11,
|
|
765
|
-
'730': addX30,
|
|
766
|
-
'773': addLinkingEntry,
|
|
767
|
-
'787': addLinkingEntry,
|
|
768
|
-
'800': addX00,
|
|
769
|
-
'810': addX10,
|
|
770
|
-
'811': addX11,
|
|
771
|
-
'830': [...addX30, ...addSeriesTitle],
|
|
772
|
-
'946': [{
|
|
773
|
-
'code': 'i',
|
|
774
|
-
'followedBy': 'a',
|
|
775
|
-
'add': ':',
|
|
776
|
-
'context': defaultNeedsPuncAfter2
|
|
777
|
-
}]
|
|
257
|
+
"100": addX00,
|
|
258
|
+
"110": addX10,
|
|
259
|
+
"111": addX11,
|
|
260
|
+
"130": addX30,
|
|
261
|
+
"240": add24X,
|
|
262
|
+
"243": add24X,
|
|
263
|
+
"245": add245,
|
|
264
|
+
"246": add24X,
|
|
265
|
+
"260": [
|
|
266
|
+
{ "code": "a", "followedBy": "b", "add": " :", "context": defaultNeedsPuncAfter2 },
|
|
267
|
+
{ "code": "ab", "followedBy": "c", "add": ",", "context": defaultNeedsPuncAfter2 },
|
|
268
|
+
{ "code": "abc", "followedBy": "a", "add": " ;", "context": defaultNeedsPuncAfter2 },
|
|
269
|
+
{ "code": "e", "followedBy": "f", "add": " :", "context": defaultNeedsPuncAfter2 },
|
|
270
|
+
{ "code": "f", "followedBy": "g", "add": ",", "context": defaultNeedsPuncAfter2 }
|
|
271
|
+
],
|
|
272
|
+
"264": [
|
|
273
|
+
{ "code": "a", "followedBy": "b", "add": " :", "context": defaultNeedsPuncAfter2 },
|
|
274
|
+
{ "code": "b", "followedBy": "c", "add": ",", "context": defaultNeedsPuncAfter2 },
|
|
275
|
+
// NB! The $c rule messes dotless exception "264 #4 $c p1983" up
|
|
276
|
+
// We'll need to add a hacky postprocessor for this? Add 'hasInd1': '0123' etc?
|
|
277
|
+
{ "code": "c", "followedBy": "#", "add": ".", "context": needsPuncAfterAlphanumeric, "ind2": ["0", "1", "2", "3"] }
|
|
278
|
+
],
|
|
279
|
+
"300": [
|
|
280
|
+
{ "code": "a", "followedBy": "b", "add": " :", "context": defaultNeedsPuncAfter2 },
|
|
281
|
+
{ "code": "ab", "followedBy": "c", "add": " ;", "context": defaultNeedsPuncAfter2 },
|
|
282
|
+
{ "code": "abc", "followedBy": "e", "add": " +", "context": defaultNeedsPuncAfter2 }
|
|
283
|
+
],
|
|
284
|
+
"490": addSeriesTitle,
|
|
285
|
+
"506": [{ "code": "a", "followedBy": "#", "add": ".", "context": defaultNeedsPuncAfter2 }],
|
|
286
|
+
"534": [{ "code": "p", "followedBy": "c", "add": ":", "context": defaultNeedsPuncAfter2 }],
|
|
287
|
+
"600": addX00,
|
|
288
|
+
"610": addX10,
|
|
289
|
+
"611": addX11,
|
|
290
|
+
"630": addX30,
|
|
291
|
+
"700": addX00,
|
|
292
|
+
"710": addX10,
|
|
293
|
+
"711": addX11,
|
|
294
|
+
"730": addX30,
|
|
295
|
+
"773": addLinkingEntry,
|
|
296
|
+
"787": addLinkingEntry,
|
|
297
|
+
"800": addX00,
|
|
298
|
+
"810": addX10,
|
|
299
|
+
"811": addX11,
|
|
300
|
+
"830": [...addX30, ...addSeriesTitle],
|
|
301
|
+
"946": [{ "code": "i", "followedBy": "a", "add": ":", "context": defaultNeedsPuncAfter2 }]
|
|
778
302
|
};
|
|
779
|
-
|
|
780
|
-
/*
|
|
781
|
-
function debugRule(rule) {
|
|
782
|
-
//nvdebug('');
|
|
783
|
-
nvdebug(`NAME ${rule.name ? rule.name : '<unnamed>'}`);
|
|
784
|
-
nvdebug(`SUBFIELD CODE '${rule.code}' FOLLOWED BY SUBFIELD CODE '${rule.followedBy}'`);
|
|
785
|
-
if ('add' in rule) {
|
|
786
|
-
nvdebug(`ADD '${rule.add}'`);
|
|
787
|
-
}
|
|
788
|
-
if ('remove' in rule) {
|
|
789
|
-
nvdebug(`REMOVE '${rule.remove}'`);
|
|
790
|
-
}
|
|
791
|
-
if ('context' in rule) {
|
|
792
|
-
nvdebug(`CONTEXT '${rule.context.toString()}'`);
|
|
793
|
-
}
|
|
794
|
-
//nvdebug('');
|
|
795
|
-
}
|
|
796
|
-
*/
|
|
797
|
-
|
|
798
303
|
function ruleAppliesToSubfieldCode(targetSubfieldCodes, currSubfieldCode) {
|
|
799
304
|
if (!targetSubfieldCodes) {
|
|
800
|
-
// We are not interested in what subfield precedes 240$l, ',' is removed anyway
|
|
801
305
|
return true;
|
|
802
306
|
}
|
|
803
|
-
const negation = targetSubfieldCodes.includes(
|
|
307
|
+
const negation = targetSubfieldCodes.includes("!");
|
|
804
308
|
if (negation) {
|
|
805
309
|
return !targetSubfieldCodes.includes(currSubfieldCode);
|
|
806
310
|
}
|
|
807
311
|
return targetSubfieldCodes.includes(currSubfieldCode);
|
|
808
312
|
}
|
|
809
313
|
function ruleAppliesToField(rule, field) {
|
|
810
|
-
if (
|
|
314
|
+
if ("ind1" in rule && !rule.ind1.includes(field.ind1)) {
|
|
811
315
|
return false;
|
|
812
316
|
}
|
|
813
|
-
if (
|
|
317
|
+
if ("ind2" in rule && !rule.ind2.includes(field.ind2)) {
|
|
814
318
|
return false;
|
|
815
319
|
}
|
|
816
|
-
|
|
817
|
-
// If we want to check, say, $2, it should be implemented here!
|
|
818
|
-
|
|
819
320
|
return true;
|
|
820
321
|
}
|
|
821
322
|
function ruleAppliesToCurrentSubfield(rule, subfield) {
|
|
822
|
-
//nvdebug(` Apply rule on LHS?`);
|
|
823
323
|
if (!ruleAppliesToSubfieldCode(rule.code, subfield.code)) {
|
|
824
|
-
//nvdebug(` Reject rule!`);
|
|
825
324
|
return false;
|
|
826
325
|
}
|
|
827
|
-
if (
|
|
828
|
-
//nvdebug(` Check '${subfield.value}' versus '${rule.context.toString()}'`);
|
|
326
|
+
if ("context" in rule) {
|
|
829
327
|
if (!subfield.value.match(rule.context)) {
|
|
830
|
-
// njsscan-ignore: regex_injection_dos
|
|
831
|
-
//nvdebug(` Reject rule!`);
|
|
832
328
|
return false;
|
|
833
329
|
}
|
|
834
330
|
}
|
|
835
|
-
//nvdebug(` Apply rule!`);
|
|
836
331
|
return true;
|
|
837
332
|
}
|
|
838
333
|
function ruleAppliesToNextSubfield(rule, nextSubfield) {
|
|
839
|
-
if (!(
|
|
840
|
-
// Return true, if we are not interested in the next subfield
|
|
334
|
+
if (!("followedBy" in rule)) {
|
|
841
335
|
return true;
|
|
842
336
|
}
|
|
843
|
-
// The '#' existence check applies only to the RHS field. LHS always exists.
|
|
844
337
|
if (!nextSubfield) {
|
|
845
|
-
const negation = rule.followedBy.includes(
|
|
338
|
+
const negation = rule.followedBy.includes("!");
|
|
846
339
|
if (negation) {
|
|
847
|
-
return !rule.followedBy.includes(
|
|
340
|
+
return !rule.followedBy.includes("#");
|
|
848
341
|
}
|
|
849
|
-
return rule.followedBy.includes(
|
|
342
|
+
return rule.followedBy.includes("#");
|
|
850
343
|
}
|
|
851
344
|
if (!ruleAppliesToSubfieldCode(rule.followedBy, nextSubfield.code)) {
|
|
852
345
|
return false;
|
|
853
346
|
}
|
|
854
|
-
if (
|
|
855
|
-
// njsscan-ignore: regex_injection_dos
|
|
347
|
+
if ("contextRHS" in rule && !nextSubfield.value.match(rule.contextRHS)) {
|
|
856
348
|
return false;
|
|
857
349
|
}
|
|
858
350
|
return true;
|
|
859
351
|
}
|
|
860
352
|
function checkRule(rule, field, subfield1, subfield2) {
|
|
861
353
|
if (!ruleAppliesToField(rule, field)) {
|
|
862
|
-
//nvdebug(`FAIL ON WHOLE FIELD: '${fieldToString(field)}`);
|
|
863
354
|
return false;
|
|
864
355
|
}
|
|
865
|
-
//const name = rule.name || 'UNNAMED';
|
|
866
356
|
if (!ruleAppliesToCurrentSubfield(rule, subfield1)) {
|
|
867
|
-
//nvdebug(`${name}: FAIL ON LHS SUBFIELD: '$${subfield1.code} ${subfield1.value}', SF=${rule.code}`, debug);
|
|
868
357
|
return false;
|
|
869
358
|
}
|
|
870
|
-
|
|
871
|
-
// NB! This is not a perfect solution. We might have $e$0$e where $e$0 punctuation should actually be based on $e$e rules
|
|
872
359
|
if (!ruleAppliesToNextSubfield(rule, subfield2)) {
|
|
873
|
-
//const msg = subfield2 ? `${name}: FAIL ON RHS SUBFIELD '${subfield2.code}' not in [${rule.followedBy}]` : `${name}: FAIL ON RHS FIELD`;
|
|
874
|
-
//nvdebug(msg, debug);
|
|
875
360
|
return false;
|
|
876
361
|
}
|
|
877
|
-
|
|
878
|
-
//nvdebug(`${rule.name ? rule.name : '<unnamed>'}: ACCEPT ${rule.code} (${subfield1.code}), SF2=${rule.followedBy} (${subfield2 ? subfield2.code : '#'})`, debug);
|
|
879
362
|
return true;
|
|
880
363
|
}
|
|
881
364
|
function applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, operation = NONE) {
|
|
882
365
|
if (operation === NONE || ruleArray === null) {
|
|
883
|
-
// !fieldIsApplicable(field, ruleArray)) {
|
|
884
366
|
return;
|
|
885
367
|
}
|
|
886
|
-
const tag2 = field.tag ===
|
|
368
|
+
const tag2 = field.tag === "880" ? fieldGetUnambiguousTag(field) : field.tag;
|
|
887
369
|
if (!tag2) {
|
|
888
370
|
return;
|
|
889
371
|
}
|
|
890
372
|
if (!(`${tag2}` in ruleArray)) {
|
|
891
373
|
return;
|
|
892
374
|
}
|
|
893
|
-
|
|
894
|
-
//nvdebug(`PUNCTUATE ${field.tag}/${tag2} '${subfieldToString(subfield1)}' XXX '${subfield2 ? subfieldToString(subfield2) : '#'} }`);
|
|
895
|
-
|
|
896
|
-
//nvdebug(`OP=${operation} ${tag2}: '${subfield1.code}: ${subfield1.value}' ??? '${subfield2 ? subfield2.code : '#'}'`);
|
|
897
375
|
const candRules = ruleArray[tag2];
|
|
898
|
-
candRules.every(rule => {
|
|
899
|
-
// uses "every", not "forEach", so that only one rule is applies to the given subfields
|
|
900
|
-
//debugRule(rule);
|
|
376
|
+
candRules.every((rule) => {
|
|
901
377
|
if (!checkRule(rule, field, subfield1, subfield2)) {
|
|
902
378
|
return true;
|
|
903
379
|
}
|
|
904
|
-
|
|
905
|
-
//const originalValue = subfield1.value;
|
|
906
380
|
if (rule.remove && [REMOVE, REMOVE_AND_ADD].includes(operation) && subfield1.value.match(rule.remove)) {
|
|
907
|
-
|
|
908
|
-
subfield1.value = subfield1.value.replace(rule.remove, '');
|
|
909
|
-
//nvdebug(` PUNC REMOVAL PERFORMED FOR '${subfield1.value}'`);
|
|
381
|
+
subfield1.value = subfield1.value.replace(rule.remove, "");
|
|
910
382
|
return false;
|
|
911
383
|
}
|
|
912
384
|
if (rule.add && [ADD, REMOVE_AND_ADD].includes(operation)) {
|
|
913
385
|
subfield1.value += rule.add;
|
|
914
|
-
//nvdebug(` ADDED '${rule.add}' TO FORM '${subfield1.value}' USING RULE ${rule.name}`);
|
|
915
386
|
return false;
|
|
916
387
|
}
|
|
917
|
-
|
|
918
|
-
/*
|
|
919
|
-
if (subfield1.value !== originalValue) {
|
|
920
|
-
nvdebug(` PROCESS PUNC: '‡${subfield1.code} ${originalValue}' => '‡${subfield1.code} ${subfield1.value}'`, debug);
|
|
921
|
-
}
|
|
922
|
-
*/
|
|
923
|
-
|
|
924
388
|
return true;
|
|
925
389
|
});
|
|
926
390
|
}
|
|
@@ -929,41 +393,28 @@ function subfieldFixPunctuation(field, subfield1, subfield2) {
|
|
|
929
393
|
applyPunctuationRules(field, subfield1, subfield2, addPairedPunctuationRules, ADD);
|
|
930
394
|
}
|
|
931
395
|
function subfieldStripPunctuation(field, subfield1, subfield2) {
|
|
932
|
-
//nvdebug(`FSP1: '${subfield1.value}'`);
|
|
933
396
|
applyPunctuationRules(field, subfield1, subfield2, cleanValidPunctuationRules, REMOVE);
|
|
934
|
-
//nvdebug(`FSP2: '${subfield1.value}'`);
|
|
935
397
|
applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);
|
|
936
|
-
//nvdebug(`FSP3: '${subfield1.value}'`);
|
|
937
398
|
}
|
|
938
|
-
function fieldStripPunctuation(field) {
|
|
399
|
+
export function fieldStripPunctuation(field) {
|
|
939
400
|
if (!field.subfields) {
|
|
940
401
|
return field;
|
|
941
402
|
}
|
|
942
403
|
field.subfields.forEach((sf, i) => {
|
|
943
|
-
// NB! instead of next subfield, we should actually get next *non-control-subfield*!!!
|
|
944
|
-
// (In plain English: We should skip $0 - $9 at least, maybe $w as well...)
|
|
945
404
|
subfieldStripPunctuation(field, sf, getNextRelevantSubfield(field, i));
|
|
946
405
|
});
|
|
947
406
|
return field;
|
|
948
407
|
}
|
|
949
|
-
function fieldFixPunctuation(field) {
|
|
408
|
+
export function fieldFixPunctuation(field) {
|
|
950
409
|
if (!field.subfields) {
|
|
951
410
|
return field;
|
|
952
411
|
}
|
|
953
|
-
//nvdebug(`################### fieldFixPunctuation() TEST ${fieldToString(field)}`);
|
|
954
|
-
|
|
955
412
|
field.subfields.forEach((sf, i) => {
|
|
956
|
-
// NB! instead of next subfield, we should actually get next *non-control-subfield*!!!
|
|
957
|
-
// (In plain English: We should skip $0 - $9 at least, maybe $w as well...)
|
|
958
|
-
// We'll need some magic for field 257 here, do we? (Also Finnish lexicons vs global lexicons in 65X fields)
|
|
959
413
|
subfieldFixPunctuation(field, sf, getNextRelevantSubfield(field, i));
|
|
960
414
|
});
|
|
961
|
-
|
|
962
|
-
// Use shared code for final punctuation (sadly this does not fix intermediate punc):
|
|
963
415
|
if (field.useExternalEndPunctuation) {
|
|
964
|
-
|
|
965
|
-
(0, _endingPunctuation.validateSingleField)(field, false, true); // NB! Don't use field.tag as second argument! It's a string, not an int. 3rd arg must be true (=fix)
|
|
416
|
+
validateSingleField(field, false, true);
|
|
966
417
|
}
|
|
967
418
|
return field;
|
|
968
419
|
}
|
|
969
|
-
//# sourceMappingURL=punctuation2.js.map
|
|
420
|
+
//# sourceMappingURL=punctuation2.js.map
|