@natlibfi/marc-record-validators-melinda 12.1.0-alpha.1 → 13.0.0
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-and-publish.yml +17 -17
- package/README.md +1 -1
- package/dist/addMissingField041.js +6 -3
- package/dist/addMissingField041.js.map +2 -2
- package/dist/addMissingField336.js +7 -4
- package/dist/addMissingField336.js.map +2 -2
- package/dist/addMissingField337.js +6 -3
- package/dist/addMissingField337.js.map +2 -2
- package/dist/addMissingField338.js +8 -5
- package/dist/addMissingField338.js.map +2 -2
- package/dist/cyrillux-usemarcon-replacement.js +5 -2
- package/dist/cyrillux-usemarcon-replacement.js.map +2 -2
- package/dist/cyrillux.js +24 -18
- package/dist/cyrillux.js.map +2 -2
- package/dist/dataProvenanceUtils.js +19 -0
- package/dist/dataProvenanceUtils.js.map +7 -0
- package/dist/disambiguateSeriesStatements.js +2 -1
- package/dist/disambiguateSeriesStatements.js.map +2 -2
- package/dist/disambiguateSeriesStatements.test.js +1 -7
- package/dist/disambiguateSeriesStatements.test.js.map +2 -2
- package/dist/drop-terms.js +123 -0
- package/dist/drop-terms.js.map +7 -0
- package/dist/drop-terms.test.js +56 -0
- package/dist/drop-terms.test.js.map +7 -0
- package/dist/field-008-18-34-character-groups.test.js +1 -7
- package/dist/field-008-18-34-character-groups.test.js.map +2 -2
- package/dist/field-505-separators.test.js +1 -7
- package/dist/field-505-separators.test.js.map +2 -2
- package/dist/field-521-fix.test.js +1 -7
- package/dist/field-521-fix.test.js.map +2 -2
- package/dist/fix-33X.js +7 -4
- package/dist/fix-33X.js.map +2 -2
- package/dist/fix-33X.test.js +1 -1
- package/dist/fix-33X.test.js.map +1 -1
- package/dist/fix-country-codes.js +5 -0
- package/dist/fix-country-codes.js.map +2 -2
- package/dist/fix-country-codes.test.js +1 -7
- package/dist/fix-country-codes.test.js.map +2 -2
- package/dist/fix-language-codes.js +5 -1
- package/dist/fix-language-codes.js.map +2 -2
- package/dist/fix-sami-041.js +109 -0
- package/dist/fix-sami-041.js.map +7 -0
- package/dist/fix-sami-041.test.js +40 -0
- package/dist/fix-sami-041.test.js.map +7 -0
- package/dist/fixRelatorTerms.js +2 -0
- package/dist/fixRelatorTerms.js.map +2 -2
- package/dist/fixRelatorTerms.test.js +1 -7
- package/dist/fixRelatorTerms.test.js.map +2 -2
- package/dist/index.js +18 -4
- package/dist/index.js.map +2 -2
- package/dist/indicator-fixes.js +15 -1
- package/dist/indicator-fixes.js.map +2 -2
- package/dist/indicator-fixes.test.js +1 -7
- package/dist/indicator-fixes.test.js.map +2 -2
- package/dist/item-language.js +41 -39
- package/dist/item-language.js.map +2 -2
- package/dist/item-language.test.js +3 -3
- package/dist/item-language.test.js.map +2 -2
- package/dist/melindaCustomMergeFields.js +31 -0
- package/dist/melindaCustomMergeFields.js.map +2 -2
- package/dist/merge-fields/controlSubfields.js.map +2 -2
- package/dist/merge-fields/counterpartField.js +149 -152
- package/dist/merge-fields/counterpartField.js.map +3 -3
- package/dist/merge-fields/dataProvenance.js +6 -20
- package/dist/merge-fields/dataProvenance.js.map +2 -2
- package/dist/merge-fields/index.js +1 -1
- package/dist/merge-fields/index.js.map +2 -2
- package/dist/merge-fields/mergableIndicator.js +1 -5
- package/dist/merge-fields/mergableIndicator.js.map +2 -2
- package/dist/merge-fields/mergableTag.js +2 -0
- package/dist/merge-fields/mergableTag.js.map +2 -2
- package/dist/merge-fields/mergeConfig.js +2 -0
- package/dist/merge-fields/mergeConfig.js.map +2 -2
- package/dist/merge-fields/mergeConstraints.js +38 -35
- package/dist/merge-fields/mergeConstraints.js.map +3 -3
- package/dist/merge-fields/mergeField.js +4 -3
- package/dist/merge-fields/mergeField.js.map +2 -2
- package/dist/merge-fields/mergeOrAddSubfield.js +8 -7
- package/dist/merge-fields/mergeOrAddSubfield.js.map +2 -2
- package/dist/merge-fields/mergeSubfield.js +5 -1
- package/dist/merge-fields/mergeSubfield.js.map +2 -2
- package/dist/merge-fields/worldKnowledge.js +52 -0
- package/dist/merge-fields/worldKnowledge.js.map +2 -2
- package/dist/merge-fields.test.js +4 -9
- package/dist/merge-fields.test.js.map +2 -2
- package/dist/mergeField500Lisapainokset.test.js +1 -7
- package/dist/mergeField500Lisapainokset.test.js.map +2 -2
- package/dist/mergeRelatorTermFields.js +9 -6
- package/dist/mergeRelatorTermFields.js.map +2 -2
- package/dist/mergeRelatorTermFields.test.js +1 -7
- package/dist/mergeRelatorTermFields.test.js.map +2 -2
- package/dist/multiple-subfield-0.test.js +1 -7
- package/dist/multiple-subfield-0.test.js.map +2 -2
- package/dist/normalize-dashes.js +9 -6
- package/dist/normalize-dashes.js.map +2 -2
- package/dist/normalize-dashes.test.js +1 -7
- package/dist/normalize-dashes.test.js.map +2 -2
- package/dist/normalize-identifiers.js.map +2 -2
- package/dist/normalize-identifiers.test.js +1 -7
- package/dist/normalize-identifiers.test.js.map +2 -2
- package/dist/normalize-qualifying-information.test.js +1 -7
- package/dist/normalize-qualifying-information.test.js.map +2 -2
- package/dist/normalize-utf8-diacritics.js.map +2 -2
- package/dist/normalize-utf8-diacritics.test.js +1 -7
- package/dist/normalize-utf8-diacritics.test.js.map +2 -2
- package/dist/normalizeFieldForComparison.js +24 -14
- package/dist/normalizeFieldForComparison.js.map +2 -2
- package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
- package/dist/prepublicationUtils.js +1 -1
- package/dist/prepublicationUtils.js.map +2 -2
- package/dist/punctuation.test.js +1 -7
- package/dist/punctuation.test.js.map +2 -2
- package/dist/punctuation2.js +15 -12
- package/dist/punctuation2.js.map +2 -2
- package/dist/punctuation2.test.js +1 -7
- package/dist/punctuation2.test.js.map +2 -2
- package/dist/reindexSubfield6OccurenceNumbers.js +11 -10
- package/dist/reindexSubfield6OccurenceNumbers.js.map +2 -2
- package/dist/reindexSubfield6OccurenceNumbers.test.js +1 -7
- package/dist/reindexSubfield6OccurenceNumbers.test.js.map +2 -2
- package/dist/remove-041-zxx.js +56 -0
- package/dist/remove-041-zxx.js.map +7 -0
- package/dist/remove-041-zxx.test.js +40 -0
- package/dist/remove-041-zxx.test.js.map +7 -0
- package/dist/removeDuplicateDataFields.js +4 -26
- package/dist/removeDuplicateDataFields.js.map +2 -2
- package/dist/removeDuplicateDataFields.test.js +1 -7
- package/dist/removeDuplicateDataFields.test.js.map +2 -2
- package/dist/removeInferiorDataFields.js +82 -45
- package/dist/removeInferiorDataFields.js.map +3 -3
- package/dist/removeInferiorDataFields.test.js +5 -9
- package/dist/removeInferiorDataFields.test.js.map +2 -2
- package/dist/resolveOrphanedSubfield6s.js +4 -5
- package/dist/resolveOrphanedSubfield6s.js.map +2 -2
- package/dist/resolveOrphanedSubfield6s.test.js +1 -7
- package/dist/resolveOrphanedSubfield6s.test.js.map +2 -2
- package/dist/sanitize-vocabulary-source-codes.test.js +1 -7
- package/dist/sanitize-vocabulary-source-codes.test.js.map +2 -2
- package/dist/sortFields.js +16 -1
- package/dist/sortFields.js.map +2 -2
- package/dist/sortFields.test.js +1 -7
- package/dist/sortFields.test.js.map +2 -2
- package/dist/sortRelatorTerms.test.js +1 -7
- package/dist/sortRelatorTerms.test.js.map +2 -2
- package/dist/sortSubfields.js +27 -21
- package/dist/sortSubfields.js.map +2 -2
- package/dist/sortSubfields.test.js +1 -7
- package/dist/sortSubfields.test.js.map +2 -2
- package/dist/stripPunctuation.js +7 -3
- package/dist/stripPunctuation.js.map +2 -2
- package/dist/stripPunctuation.test.js +1 -7
- package/dist/stripPunctuation.test.js.map +2 -2
- package/dist/subfield6Utils.js +2 -12
- package/dist/subfield6Utils.js.map +2 -2
- package/dist/subfield8Utils.js +0 -5
- package/dist/subfield8Utils.js.map +2 -2
- package/dist/subfieldValueNormalizations.test.js +1 -7
- package/dist/subfieldValueNormalizations.test.js.map +2 -2
- package/dist/sync-007-and-300.test.js +1 -7
- package/dist/sync-007-and-300.test.js.map +2 -2
- package/dist/sync-language.js +103 -0
- package/dist/sync-language.js.map +7 -0
- package/dist/sync-language.test.js +40 -0
- package/dist/sync-language.test.js.map +7 -0
- package/dist/translate-terms.js +124 -87
- package/dist/translate-terms.js.map +3 -3
- package/dist/translate-terms.test.js +5 -8
- package/dist/translate-terms.test.js.map +2 -2
- package/dist/typeOfDate-008.js +3 -1
- package/dist/typeOfDate-008.js.map +2 -2
- package/dist/update-field-540.js.map +2 -2
- package/dist/update-field-540.test.js +1 -7
- package/dist/update-field-540.test.js.map +2 -2
- package/dist/urn.js +13 -12
- package/dist/urn.js.map +2 -2
- package/dist/urn.test.js +1 -7
- package/dist/urn.test.js.map +2 -2
- package/dist/utils.js +29 -3
- package/dist/utils.js.map +2 -2
- package/package.json +20 -27
- package/src/addMissingField041.js +8 -4
- package/src/addMissingField336.js +10 -5
- package/src/addMissingField337.js +9 -5
- package/src/addMissingField338.js +11 -6
- package/src/cyrillux-usemarcon-replacement.js +9 -5
- package/src/cyrillux.js +34 -23
- package/src/dataProvenanceUtils.js +21 -0
- package/src/disambiguateSeriesStatements.js +4 -1
- package/src/disambiguateSeriesStatements.test.js +3 -8
- package/src/drop-terms.js +164 -0
- package/src/drop-terms.test.js +81 -0
- package/src/field-008-18-34-character-groups.test.js +3 -8
- package/src/field-505-separators.test.js +3 -8
- package/src/field-521-fix.test.js +3 -8
- package/src/fix-33X.js +10 -6
- package/src/fix-33X.test.js +1 -1
- package/src/fix-country-codes.js +7 -3
- package/src/fix-country-codes.test.js +3 -8
- package/src/fix-language-codes.js +8 -4
- package/src/fix-sami-041.js +147 -0
- package/src/fix-sami-041.test.js +52 -0
- package/src/fixRelatorTerms.js +5 -0
- package/src/fixRelatorTerms.test.js +3 -8
- package/src/index.js +20 -7
- package/src/indicator-fixes.js +22 -7
- package/src/indicator-fixes.test.js +3 -8
- package/src/item-language.js +49 -42
- package/src/item-language.test.js +3 -3
- package/src/melindaCustomMergeFields.js +31 -0
- package/src/merge-fields/controlSubfields.js +0 -1
- package/src/merge-fields/counterpartField.js +191 -290
- package/src/merge-fields/dataProvenance.js +8 -25
- package/src/merge-fields/index.js +1 -1
- package/src/merge-fields/mergableIndicator.js +4 -5
- package/src/merge-fields/mergableTag.js +2 -0
- package/src/merge-fields/mergeConfig.js +2 -1
- package/src/merge-fields/mergeConstraints.js +41 -36
- package/src/merge-fields/mergeField.js +4 -7
- package/src/merge-fields/mergeOrAddSubfield.js +8 -7
- package/src/merge-fields/mergeSubfield.js +11 -2
- package/src/merge-fields/worldKnowledge.js +77 -3
- package/src/merge-fields.test.js +5 -10
- package/src/mergeField500Lisapainokset.test.js +3 -8
- package/src/mergeRelatorTermFields.js +12 -11
- package/src/mergeRelatorTermFields.test.js +3 -8
- package/src/multiple-subfield-0.test.js +3 -8
- package/src/normalize-dashes.js +13 -7
- package/src/normalize-dashes.test.js +3 -8
- package/src/normalize-identifiers.js +12 -19
- package/src/normalize-identifiers.test.js +3 -8
- package/src/normalize-qualifying-information.test.js +3 -8
- package/src/normalize-utf8-diacritics.js +6 -3
- package/src/normalize-utf8-diacritics.test.js +3 -8
- package/src/normalizeFieldForComparison.js +39 -22
- package/src/normalizeSubfieldValueForComparison.js +2 -2
- package/src/prepublicationUtils.js +1 -1
- package/src/punctuation.test.js +3 -8
- package/src/punctuation2.js +44 -40
- package/src/punctuation2.test.js +3 -8
- package/src/reindexSubfield6OccurenceNumbers.js +13 -11
- package/src/reindexSubfield6OccurenceNumbers.test.js +3 -8
- package/src/remove-041-zxx.js +85 -0
- package/src/remove-041-zxx.test.js +52 -0
- package/src/removeDuplicateDataFields.js +30 -28
- package/src/removeDuplicateDataFields.test.js +3 -8
- package/src/removeInferiorDataFields.js +126 -71
- package/src/removeInferiorDataFields.test.js +7 -10
- package/src/resolveOrphanedSubfield6s.js +7 -5
- package/src/resolveOrphanedSubfield6s.test.js +3 -8
- package/src/sanitize-vocabulary-source-codes.test.js +3 -8
- package/src/sortFields.js +20 -1
- package/src/sortFields.test.js +3 -8
- package/src/sortRelatorTerms.test.js +3 -8
- package/src/sortSubfields.js +31 -25
- package/src/sortSubfields.test.js +3 -8
- package/src/stripPunctuation.js +10 -5
- package/src/stripPunctuation.test.js +3 -8
- package/src/subfield6Utils.js +31 -33
- package/src/subfield8Utils.js +10 -7
- package/src/subfieldValueNormalizations.test.js +3 -8
- package/src/sync-007-and-300.test.js +3 -8
- package/src/sync-language.js +148 -0
- package/src/sync-language.test.js +52 -0
- package/src/translate-terms.js +168 -109
- package/src/translate-terms.test.js +12 -16
- package/src/typeOfDate-008.js +4 -1
- package/src/update-field-540.js +7 -5
- package/src/update-field-540.test.js +3 -8
- package/src/urn.js +17 -13
- package/src/urn.test.js +3 -8
- package/src/utils.js +39 -12
- package/test-fixtures/cyrillux/f02b/expectedResult.json +23 -0
- package/test-fixtures/cyrillux/f02b/metadata.json +11 -0
- package/test-fixtures/cyrillux/f02b/record.json +14 -0
- package/test-fixtures/cyrillux/f14/expectedResult.json +32 -0
- package/test-fixtures/cyrillux/f14/metadata.json +10 -0
- package/test-fixtures/cyrillux/f14/record.json +14 -0
- package/test-fixtures/drop-terms/01/expectedResult.json +31 -0
- package/test-fixtures/drop-terms/01/metadata.json +6 -0
- package/test-fixtures/drop-terms/01/record.json +35 -0
- package/test-fixtures/drop-terms/02/expectedResult.json +7 -0
- package/test-fixtures/drop-terms/02/metadata.json +6 -0
- package/test-fixtures/drop-terms/02/record.json +40 -0
- package/test-fixtures/drop-terms/03/expectedResult.json +6 -0
- package/test-fixtures/drop-terms/03/metadata.json +18 -0
- package/test-fixtures/drop-terms/03/record.json +39 -0
- package/test-fixtures/drop-terms/04/expectedResult.json +6 -0
- package/test-fixtures/drop-terms/04/metadata.json +19 -0
- package/test-fixtures/drop-terms/04/record.json +24 -0
- package/test-fixtures/fix-language-codes/02/metadata.json +1 -1
- package/test-fixtures/fix-relator-terms/f02/metadata.json +1 -1
- package/test-fixtures/fix-relator-terms/f04/expectedResult.json +18 -0
- package/test-fixtures/fix-relator-terms/f04/metadata.json +5 -0
- package/test-fixtures/fix-relator-terms/f04/record.json +20 -0
- package/test-fixtures/fix-sami-041/01/expectedResult.json +6 -0
- package/test-fixtures/fix-sami-041/01/metadata.json +4 -0
- package/test-fixtures/fix-sami-041/01/record.json +14 -0
- package/test-fixtures/fix-sami-041/02/expectedResult.json +10 -0
- package/test-fixtures/fix-sami-041/02/metadata.json +4 -0
- package/test-fixtures/fix-sami-041/02/record.json +8 -0
- package/test-fixtures/fix-sami-041/03/expectedResult.json +5 -0
- package/test-fixtures/fix-sami-041/03/metadata.json +5 -0
- package/test-fixtures/fix-sami-041/03/record.json +8 -0
- package/test-fixtures/fix-sami-041/04/expectedResult.json +7 -0
- package/test-fixtures/fix-sami-041/04/metadata.json +4 -0
- package/test-fixtures/fix-sami-041/04/record.json +10 -0
- package/test-fixtures/fix-sami-041/05/expectedResult.json +10 -0
- package/test-fixtures/fix-sami-041/05/metadata.json +6 -0
- package/test-fixtures/fix-sami-041/05/record.json +8 -0
- package/test-fixtures/fix-sami-041/06/expectedResult.json +10 -0
- package/test-fixtures/fix-sami-041/06/metadata.json +4 -0
- package/test-fixtures/fix-sami-041/06/record.json +9 -0
- package/test-fixtures/indicator-fixes/11/expectedResult.json +10 -0
- package/test-fixtures/indicator-fixes/11/metadata.json +4 -0
- package/test-fixtures/indicator-fixes/11/record.json +10 -0
- package/test-fixtures/merge-fields/f042_01/expectedResult.json +12 -0
- package/test-fixtures/merge-fields/f042_01/metadata.json +6 -0
- package/test-fixtures/merge-fields/f042_01/record.json +13 -0
- package/test-fixtures/merge-fields/f05/metadata.json +1 -1
- package/test-fixtures/merge-fields/f06/expectedResult.json +42 -0
- package/test-fixtures/merge-fields/f06/metadata.json +6 -0
- package/test-fixtures/merge-fields/f06/record.json +41 -0
- package/test-fixtures/merge-fields/f07/expectedResult.json +18 -0
- package/test-fixtures/merge-fields/f07/metadata.json +6 -0
- package/test-fixtures/merge-fields/f07/record.json +18 -0
- package/test-fixtures/merge-fields/f08/expectedResult.json +12 -0
- package/test-fixtures/merge-fields/f08/metadata.json +7 -0
- package/test-fixtures/merge-fields/f08/record.json +10 -0
- package/test-fixtures/merge-fields/f09/expectedResult.json +14 -0
- package/test-fixtures/merge-fields/f09/metadata.json +6 -0
- package/test-fixtures/merge-fields/f09/record.json +14 -0
- package/test-fixtures/merge-fields/f10/expectedResult.json +25 -0
- package/test-fixtures/merge-fields/f10/metadata.json +6 -0
- package/test-fixtures/merge-fields/f10/record.json +25 -0
- package/test-fixtures/merge-fields/f11/expectedResult.json +40 -0
- package/test-fixtures/merge-fields/f11/metadata.json +7 -0
- package/test-fixtures/merge-fields/f11/record.json +50 -0
- package/test-fixtures/merge-fields/f12/expectedResult.json +17 -0
- package/test-fixtures/merge-fields/f12/metadata.json +6 -0
- package/test-fixtures/merge-fields/f12/record.json +25 -0
- package/test-fixtures/merge-fields/f13/expectedResult.json +18 -0
- package/test-fixtures/merge-fields/f13/metadata.json +6 -0
- package/test-fixtures/merge-fields/f13/record.json +28 -0
- package/test-fixtures/merge-fields/f14/expectedResult.json +25 -0
- package/test-fixtures/merge-fields/f14/metadata.json +6 -0
- package/test-fixtures/merge-fields/f14/record.json +25 -0
- package/test-fixtures/merge-fields/f15/expectedResult.json +8 -0
- package/test-fixtures/merge-fields/f15/metadata.json +6 -0
- package/test-fixtures/merge-fields/f15/record.json +9 -0
- package/test-fixtures/merge-fields/f16/expectedResult.json +12 -0
- package/test-fixtures/merge-fields/f16/metadata.json +7 -0
- package/test-fixtures/merge-fields/f16/record.json +13 -0
- package/test-fixtures/merge-fields/f300_01/expectedResult.json +9 -0
- package/test-fixtures/merge-fields/f300_01/metadata.json +6 -0
- package/test-fixtures/merge-fields/f300_01/record.json +8 -0
- package/test-fixtures/merge-fields/f300_02/expectedResult.json +13 -0
- package/test-fixtures/merge-fields/f300_02/metadata.json +6 -0
- package/test-fixtures/merge-fields/f300_02/record.json +16 -0
- package/test-fixtures/merge-fields/f300_03/expectedResult.json +13 -0
- package/test-fixtures/merge-fields/f300_03/metadata.json +6 -0
- package/test-fixtures/merge-fields/f300_03/record.json +16 -0
- package/test-fixtures/merge-fields/f490_01/expectedResult.json +13 -0
- package/test-fixtures/merge-fields/f490_01/metadata.json +6 -0
- package/test-fixtures/merge-fields/f490_01/record.json +16 -0
- package/test-fixtures/remove-041-zxx/01/expectedResult.json +5 -0
- package/test-fixtures/remove-041-zxx/01/metadata.json +5 -0
- package/test-fixtures/remove-041-zxx/01/record.json +10 -0
- package/test-fixtures/remove-041-zxx/02/expectedResult.json +7 -0
- package/test-fixtures/remove-041-zxx/02/metadata.json +5 -0
- package/test-fixtures/remove-041-zxx/02/record.json +9 -0
- package/test-fixtures/remove-041-zxx/11/expectedResult.json +10 -0
- package/test-fixtures/remove-041-zxx/11/metadata.json +5 -0
- package/test-fixtures/remove-041-zxx/11/record.json +9 -0
- package/test-fixtures/remove-041-zxx/12/expectedResult.json +10 -0
- package/test-fixtures/remove-041-zxx/12/metadata.json +5 -0
- package/test-fixtures/remove-041-zxx/12/record.json +9 -0
- package/test-fixtures/remove-inferior-datafields/f17/expectedResult.json +11 -0
- package/test-fixtures/remove-inferior-datafields/f17/metadata.json +5 -0
- package/test-fixtures/remove-inferior-datafields/f17/record.json +15 -0
- package/test-fixtures/remove-inferior-datafields/f18/expectedResult.json +13 -0
- package/test-fixtures/remove-inferior-datafields/f18/metadata.json +5 -0
- package/test-fixtures/remove-inferior-datafields/f18/record.json +18 -0
- package/test-fixtures/remove-inferior-datafields/f19/expectedResult.json +17 -0
- package/test-fixtures/remove-inferior-datafields/f19/metadata.json +5 -0
- package/test-fixtures/remove-inferior-datafields/f19/record.json +18 -0
- package/test-fixtures/remove-inferior-datafields/f20/expectedResult.json +15 -0
- package/test-fixtures/remove-inferior-datafields/f20/metadata.json +5 -0
- package/test-fixtures/remove-inferior-datafields/f20/record.json +29 -0
- package/test-fixtures/sort-fields/15/input.json +9 -0
- package/test-fixtures/sort-fields/15/metadata.json +5 -0
- package/test-fixtures/sort-fields/15/result.json +10 -0
- package/test-fixtures/sync-language/01/expectedResult.json +5 -0
- package/test-fixtures/sync-language/01/metadata.json +5 -0
- package/test-fixtures/sync-language/01/record.json +7 -0
- package/test-fixtures/sync-language/02/expectedResult.json +6 -0
- package/test-fixtures/sync-language/02/metadata.json +5 -0
- package/test-fixtures/sync-language/02/record.json +10 -0
- package/test-fixtures/sync-language/03/expectedResult.json +6 -0
- package/test-fixtures/sync-language/03/metadata.json +5 -0
- package/test-fixtures/sync-language/03/record.json +6 -0
- package/test-fixtures/sync-language/10/expectedResult.json +10 -0
- package/test-fixtures/sync-language/10/metadata.json +5 -0
- package/test-fixtures/sync-language/10/record.json +8 -0
- package/test-fixtures/sync-language/11/expectedResult.json +10 -0
- package/test-fixtures/sync-language/11/metadata.json +5 -0
- package/test-fixtures/sync-language/11/record.json +7 -0
- package/test-fixtures/sync-language/12/expectedResult.json +9 -0
- package/test-fixtures/sync-language/12/metadata.json +6 -0
- package/test-fixtures/sync-language/12/record.json +6 -0
- package/test-fixtures/sync-language/13/expectedResult.json +10 -0
- package/test-fixtures/sync-language/13/metadata.json +5 -0
- package/test-fixtures/sync-language/13/record.json +8 -0
- package/test-fixtures/sync-language/14/expectedResult.json +9 -0
- package/test-fixtures/sync-language/14/metadata.json +5 -0
- package/test-fixtures/sync-language/14/record.json +7 -0
- package/test-fixtures/sync-language/15/expectedResult.json +9 -0
- package/test-fixtures/sync-language/15/metadata.json +5 -0
- package/test-fixtures/sync-language/15/record.json +7 -0
- package/test-fixtures/translate-terms/05/expectedResult.json +12 -0
- package/test-fixtures/translate-terms/05/metadata.json +7 -0
- package/test-fixtures/translate-terms/05/record.json +11 -0
- package/test-fixtures/translate-terms/06/expectedResult.json +12 -0
- package/test-fixtures/translate-terms/06/metadata.json +7 -0
- package/test-fixtures/translate-terms/06/record.json +11 -0
- package/test-fixtures/translate-terms-data.js +23 -0
package/src/punctuation2.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable max-lines */
|
|
1
2
|
/*
|
|
2
3
|
* punctuation.js -- try and fix a marc field punctuation
|
|
3
4
|
*
|
|
@@ -10,13 +11,15 @@
|
|
|
10
11
|
* (They are jumped over when looking for next (non-controlfield subfield)
|
|
11
12
|
*/
|
|
12
13
|
import {validateSingleField} from './ending-punctuation.js';
|
|
13
|
-
import {tagToDataProvenanceSubfieldCode} from './
|
|
14
|
+
import {tagToDataProvenanceSubfieldCode} from './dataProvenanceUtils.js';
|
|
14
15
|
import {fieldGetUnambiguousTag} from './subfield6Utils.js';
|
|
15
|
-
|
|
16
|
-
import {fieldToString,
|
|
16
|
+
import createDebugLogger from 'debug';
|
|
17
|
+
import {fieldToString, isContentSubfieldCode, nvdebug} from './utils.js';
|
|
17
18
|
import clone from 'clone';
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:punctuation2');
|
|
21
|
+
//const debugData = debug.extend('data');
|
|
22
|
+
const debugDev = debug.extend('dev');
|
|
20
23
|
|
|
21
24
|
const descriptionString = 'Remove invalid and add valid punctuation to data fields';
|
|
22
25
|
export default function () {
|
|
@@ -26,14 +29,14 @@ export default function () {
|
|
|
26
29
|
};
|
|
27
30
|
|
|
28
31
|
function fix(record) {
|
|
29
|
-
nvdebug(`${descriptionString}: fixer
|
|
32
|
+
nvdebug(`${descriptionString}: fixer`, debugDev);
|
|
30
33
|
const res = {message: [], fix: [], valid: true};
|
|
31
34
|
record.fields.forEach(f => fieldFixPunctuation(f));
|
|
32
35
|
return res;
|
|
33
36
|
}
|
|
34
37
|
|
|
35
38
|
function validate(record) {
|
|
36
|
-
nvdebug(`${descriptionString}: validate
|
|
39
|
+
nvdebug(`${descriptionString}: validate`, debugDev);
|
|
37
40
|
|
|
38
41
|
const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, true));
|
|
39
42
|
|
|
@@ -57,7 +60,7 @@ function isIrrelevantSubfield(subfield, tag) {
|
|
|
57
60
|
if (subfield.code === dataProvenanceSubfieldCode) {
|
|
58
61
|
return true;
|
|
59
62
|
}
|
|
60
|
-
return
|
|
63
|
+
return !isContentSubfieldCode(subfield.code); // Currently this contains other stuff as well ($3, $4, $7, $9...)
|
|
61
64
|
}
|
|
62
65
|
|
|
63
66
|
|
|
@@ -123,16 +126,16 @@ const X00RemoveDotAfterBracket = {'code': 'cq', 'context': /\)\.$/u, 'remove': /
|
|
|
123
126
|
// 390, 800, 810, 830...
|
|
124
127
|
const cleanPuncBeforeLanguage = {'code': 'atvxyz', 'followedBy': 'l', 'context': puncIsProbablyPunc, 'remove': / *[.,:;]$/u};
|
|
125
128
|
|
|
126
|
-
const addX00aComma = {'add': ',', 'code': '
|
|
129
|
+
const addX00aComma = {'add': ',', 'code': 'abcqejt', 'followedBy': 'cdegnr', 'context': doesNotEndInPunc, 'contextRHS': allowsPuncRHS};
|
|
127
130
|
const addX00dComma = {'name': 'X00$d ending in "-" does not get comma', 'add': ',', 'code': 'd', 'followedBy': 'cdeg', 'context': /[^-,.!]$/u, 'contextRHS': allowsPuncRHS};
|
|
128
131
|
const addX00aComma2 = {'add': ',', 'code': 'abcdej', 'followedBy': 'cdeg', 'context': /(?:[A-Z]|Å|Ä|Ö)\.$/u, 'contextRHS': allowsPuncRHS};
|
|
129
132
|
const addX00Dot = {'add': '.', 'code': 'abcdetv', 'followedBy': 'fklptu', 'context': needsPuncAfterAlphanumeric};
|
|
130
133
|
const addEntryFieldFinalDot = {'name': 'X00 final dot', 'add': '.', 'code': 'abcdefghijklmnopqrstuvwxyz', 'followedBy': '#', 'context': /[^.)!?-]$/u};
|
|
131
134
|
|
|
132
135
|
|
|
133
|
-
const
|
|
136
|
+
const addXX0iColon = {name: 'Punctuate relationship information', add: ':', code: 'i', context: defaultNeedsPuncAfter2}; // Not explicitly checking it, but this should always be followed by 'a' or 't'
|
|
134
137
|
const addX10bDot = {'name': 'Add X10 pre-$b dot', 'add': '.', 'code': 'ab', 'followedBy': 'b', 'context': defaultNeedsPuncAfter2};
|
|
135
|
-
const
|
|
138
|
+
const addX10Comma = {'add': ',', 'code': 'abet', 'followedBy': 'en', 'context': defaultNeedsPuncAfter2};
|
|
136
139
|
const addX10Dot = {'name': 'Add X10 final dot', 'add': '.', 'code': 'abet', 'followedBy': 'tu#', 'context': needsPuncAfterAlphanumeric};
|
|
137
140
|
const addColonToRelationshipInformation = {'name': 'Add \':\' to 7X0 $i relationship info', 'add': ':', 'code': 'i', 'context': defaultNeedsPuncAfter2};
|
|
138
141
|
|
|
@@ -223,11 +226,11 @@ const cleanCrappyPunctuationRules = {
|
|
|
223
226
|
'946': crappy24X
|
|
224
227
|
};
|
|
225
228
|
|
|
226
|
-
const cleanLegalX00Comma = {'code': '
|
|
229
|
+
const cleanLegalX00Comma = {'code': 'abcdetn', 'followedBy': 'cdegjnr', 'context': /.,$/u, 'remove': /,$/u};
|
|
227
230
|
// Accept upper case letters in X00$b, since they are probably Roman numerals.
|
|
228
231
|
const cleanLegalX00bDot = {'code': 'b', 'followedBy': 't#', context: /^[IVXLCDM]+\.$/u, 'remove': /\.$/u};
|
|
229
232
|
const cleanLegalX00iColon = {'code': 'i', 'followedBy': 'a', 'remove': / *:$/u}; // NB! context is not needed
|
|
230
|
-
const cleanLegalX00Dot = {'code': '
|
|
233
|
+
const cleanLegalX00Dot = {'code': 'abcdetkvl', 'followedBy': 'tklu#', 'context': /(?:[a-z0-9)]|å|ä|ö)\.$/u, 'remove': /\.$/u};
|
|
231
234
|
const cleanDotBeforeLanguageSubfieldL = {'name': 'pre-language-$l dot', 'followedBy': 'l', 'context': /.\.$/u, 'remove': /\.$/u};
|
|
232
235
|
|
|
233
236
|
const legalEntryField = [cleanDotBeforeLanguageSubfieldL];
|
|
@@ -313,8 +316,8 @@ const cleanValidPunctuationRules = {
|
|
|
313
316
|
const addToAllEntryFields = [addDotBeforeLanguageSubfieldL, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation, addEntryFieldFinalDot];
|
|
314
317
|
|
|
315
318
|
|
|
316
|
-
const addX00 = [addX00aComma, addX00aComma2, addX00Dot, addX00dComma, ...addToAllEntryFields];
|
|
317
|
-
const addX10 = [
|
|
319
|
+
const addX00 = [addXX0iColon, addX00aComma, addX00aComma2, addX00Dot, addX00dComma, ...addToAllEntryFields];
|
|
320
|
+
const addX10 = [addXX0iColon, addX10bDot, addX10Comma, addX10Dot, ...addToAllEntryFields];
|
|
318
321
|
const addX11 = [...addToAllEntryFields, addX11Spacecolon];
|
|
319
322
|
const addX30 = [...addToAllEntryFields];
|
|
320
323
|
|
|
@@ -396,19 +399,19 @@ const addPairedPunctuationRules = {
|
|
|
396
399
|
|
|
397
400
|
/*
|
|
398
401
|
function debugRule(rule) {
|
|
399
|
-
//nvdebug('');
|
|
400
|
-
nvdebug(`NAME ${rule.name ? rule.name : '<unnamed>'}
|
|
401
|
-
nvdebug(`SUBFIELD CODE '${rule.code}' FOLLOWED BY SUBFIELD CODE '${rule.followedBy}'
|
|
402
|
+
//nvdebug('', debugDev);
|
|
403
|
+
nvdebug(`NAME ${rule.name ? rule.name : '<unnamed>'}`, debugDev);
|
|
404
|
+
nvdebug(`SUBFIELD CODE '${rule.code}' FOLLOWED BY SUBFIELD CODE '${rule.followedBy}'`, debugDev);
|
|
402
405
|
if ('add' in rule) {
|
|
403
|
-
nvdebug(`ADD '${rule.add}'
|
|
406
|
+
nvdebug(`ADD '${rule.add}'`, debugDev);
|
|
404
407
|
}
|
|
405
408
|
if ('remove' in rule) {
|
|
406
|
-
nvdebug(`REMOVE '${rule.remove}'
|
|
409
|
+
nvdebug(`REMOVE '${rule.remove}'`, debugDev);
|
|
407
410
|
}
|
|
408
411
|
if ('context' in rule) {
|
|
409
|
-
nvdebug(`CONTEXT '${rule.context.toString()}'
|
|
412
|
+
nvdebug(`CONTEXT '${rule.context.toString()}'`, debugDev);
|
|
410
413
|
}
|
|
411
|
-
//nvdebug('');
|
|
414
|
+
//nvdebug('', debugDev);
|
|
412
415
|
}
|
|
413
416
|
*/
|
|
414
417
|
|
|
@@ -440,19 +443,19 @@ function ruleAppliesToField(rule, field) {
|
|
|
440
443
|
|
|
441
444
|
|
|
442
445
|
function ruleAppliesToCurrentSubfield(rule, subfield) {
|
|
443
|
-
//nvdebug(` Apply rule on LHS
|
|
446
|
+
//nvdebug(` Apply rule on LHS?`, debugDev);
|
|
444
447
|
if (!ruleAppliesToSubfieldCode(rule.code, subfield.code)) {
|
|
445
|
-
//nvdebug(` Reject rule
|
|
448
|
+
//nvdebug(` Reject rule!`, debugDev);
|
|
446
449
|
return false;
|
|
447
450
|
}
|
|
448
451
|
if ('context' in rule) {
|
|
449
|
-
//nvdebug(` Check '${subfield.value}' versus '${rule.context.toString()}'
|
|
452
|
+
//nvdebug(` Check '${subfield.value}' versus '${rule.context.toString()}'`, debugDev);
|
|
450
453
|
if (!subfield.value.match(rule.context)) { // njsscan-ignore: regex_injection_dos
|
|
451
|
-
//nvdebug(` Reject rule
|
|
454
|
+
//nvdebug(` Reject rule!`, debugDev);
|
|
452
455
|
return false;
|
|
453
456
|
}
|
|
454
457
|
}
|
|
455
|
-
//nvdebug(` Apply rule
|
|
458
|
+
//nvdebug(` Apply rule!`, debugDev);
|
|
456
459
|
return true;
|
|
457
460
|
}
|
|
458
461
|
|
|
@@ -480,23 +483,24 @@ function ruleAppliesToNextSubfield(rule, nextSubfield) {
|
|
|
480
483
|
|
|
481
484
|
function checkRule(rule, field, subfield1, subfield2) {
|
|
482
485
|
if (!ruleAppliesToField(rule, field)) {
|
|
483
|
-
//nvdebug(`FAIL ON WHOLE FIELD: '${fieldToString(field)}
|
|
486
|
+
//nvdebug(`FAIL ON WHOLE FIELD: '${fieldToString(field)}`, debugDev);
|
|
484
487
|
return false;
|
|
485
488
|
}
|
|
486
489
|
//const name = rule.name || 'UNNAMED';
|
|
487
490
|
if (!ruleAppliesToCurrentSubfield(rule, subfield1)) {
|
|
488
|
-
//nvdebug(`${name}: FAIL ON LHS SUBFIELD: '$${subfield1.code} ${subfield1.value}', SF=${rule.code}`,
|
|
491
|
+
//nvdebug(`${name}: FAIL ON LHS SUBFIELD: '$${subfield1.code} ${subfield1.value}', SF=${rule.code}`, debugDev);
|
|
489
492
|
return false;
|
|
490
493
|
}
|
|
491
494
|
|
|
492
495
|
// 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
|
|
493
496
|
if (!ruleAppliesToNextSubfield(rule, subfield2)) {
|
|
494
497
|
//const msg = subfield2 ? `${name}: FAIL ON RHS SUBFIELD '${subfield2.code}' not in [${rule.followedBy}]` : `${name}: FAIL ON RHS FIELD`;
|
|
495
|
-
//nvdebug(msg,
|
|
498
|
+
//nvdebug(msg, debugDev);
|
|
496
499
|
return false;
|
|
497
500
|
}
|
|
498
501
|
|
|
499
|
-
|
|
502
|
+
|
|
503
|
+
//nvdebug(`${rule.name ? rule.name : '<unnamed>'}: ACCEPT ${rule.code} (${subfield1.code}), SF2=${rule.followedBy} (${subfield2 ? subfield2.code : '#'})`, debugDev);
|
|
500
504
|
return true;
|
|
501
505
|
}
|
|
502
506
|
|
|
@@ -513,9 +517,9 @@ function applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, op
|
|
|
513
517
|
return;
|
|
514
518
|
}
|
|
515
519
|
|
|
516
|
-
//nvdebug(`PUNCTUATE ${field.tag}/${tag2} '${subfieldToString(subfield1)}' XXX '${subfield2 ? subfieldToString(subfield2) : '#'} }
|
|
520
|
+
//nvdebug(`PUNCTUATE ${field.tag}/${tag2} '${subfieldToString(subfield1)}' XXX '${subfield2 ? subfieldToString(subfield2) : '#'} }`, debugDev);
|
|
517
521
|
|
|
518
|
-
//nvdebug(`OP=${operation} ${tag2}: '${subfield1.code}: ${subfield1.value}' ??? '${subfield2 ? subfield2.code : '#'}'
|
|
522
|
+
//nvdebug(`OP=${operation} ${tag2}: '${subfield1.code}: ${subfield1.value}' ??? '${subfield2 ? subfield2.code : '#'}'`, debugDev);
|
|
519
523
|
const candRules = ruleArray[tag2];
|
|
520
524
|
candRules.every(rule => { // uses "every", not "forEach", so that only one rule is applies to the given subfields
|
|
521
525
|
//debugRule(rule);
|
|
@@ -525,20 +529,20 @@ function applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, op
|
|
|
525
529
|
|
|
526
530
|
//const originalValue = subfield1.value;
|
|
527
531
|
if (rule.remove && [REMOVE, REMOVE_AND_ADD].includes(operation) && subfield1.value.match(rule.remove)) {
|
|
528
|
-
//nvdebug(` PUNC REMOVAL TO BE PERFORMED FOR $${subfield1.code} '${subfield1.value}'`,
|
|
532
|
+
//nvdebug(` PUNC REMOVAL TO BE PERFORMED FOR $${subfield1.code} '${subfield1.value}'`, debugDev);
|
|
529
533
|
subfield1.value = subfield1.value.replace(rule.remove, '');
|
|
530
|
-
//nvdebug(` PUNC REMOVAL PERFORMED FOR '${subfield1.value}'
|
|
534
|
+
//nvdebug(` PUNC REMOVAL PERFORMED FOR '${subfield1.value}'`, debugDev);
|
|
531
535
|
return false;
|
|
532
536
|
}
|
|
533
537
|
if (rule.add && [ADD, REMOVE_AND_ADD].includes(operation)) {
|
|
534
538
|
subfield1.value += rule.add;
|
|
535
|
-
//nvdebug(` ADDED '${rule.add}' TO FORM '${subfield1.value}' USING RULE ${rule.name}
|
|
539
|
+
//nvdebug(` ADDED '${rule.add}' TO FORM '${subfield1.value}' USING RULE ${rule.name}`, debugDev);
|
|
536
540
|
return false;
|
|
537
541
|
}
|
|
538
542
|
|
|
539
543
|
/*
|
|
540
544
|
if (subfield1.value !== originalValue) {
|
|
541
|
-
nvdebug(` PROCESS PUNC: '‡${subfield1.code} ${originalValue}' => '‡${subfield1.code} ${subfield1.value}'`,
|
|
545
|
+
nvdebug(` PROCESS PUNC: '‡${subfield1.code} ${originalValue}' => '‡${subfield1.code} ${subfield1.value}'`, debugDev);
|
|
542
546
|
}
|
|
543
547
|
*/
|
|
544
548
|
|
|
@@ -552,11 +556,11 @@ function subfieldFixPunctuation(field, subfield1, subfield2) {
|
|
|
552
556
|
}
|
|
553
557
|
|
|
554
558
|
function subfieldStripPunctuation(field, subfield1, subfield2) {
|
|
555
|
-
//nvdebug(`FSP1: '${subfield1.value}'
|
|
559
|
+
//nvdebug(`FSP1: '${subfield1.value}'`, debugDev);
|
|
556
560
|
applyPunctuationRules(field, subfield1, subfield2, cleanValidPunctuationRules, REMOVE);
|
|
557
|
-
//nvdebug(`FSP2: '${subfield1.value}'
|
|
561
|
+
//nvdebug(`FSP2: '${subfield1.value}'`, debugDev);
|
|
558
562
|
applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);
|
|
559
|
-
//nvdebug(`FSP3: '${subfield1.value}'
|
|
563
|
+
//nvdebug(`FSP3: '${subfield1.value}'`, debugDev);
|
|
560
564
|
|
|
561
565
|
}
|
|
562
566
|
|
|
@@ -578,7 +582,7 @@ export function fieldFixPunctuation(field) {
|
|
|
578
582
|
if (!field.subfields) {
|
|
579
583
|
return field;
|
|
580
584
|
}
|
|
581
|
-
//nvdebug(`################### fieldFixPunctuation() TEST ${fieldToString(field)}
|
|
585
|
+
//nvdebug(`################### fieldFixPunctuation() TEST ${fieldToString(field)}`, debugDev);
|
|
582
586
|
|
|
583
587
|
field.subfields.forEach((sf, i) => {
|
|
584
588
|
// NB! instead of next subfield, we should actually get next *non-control-subfield*!!!
|
package/src/punctuation2.test.js
CHANGED
|
@@ -3,7 +3,7 @@ import {MarcRecord} from '@natlibfi/marc-record';
|
|
|
3
3
|
import validatorFactory from './punctuation2.js';
|
|
4
4
|
import {READERS} from '@natlibfi/fixura';
|
|
5
5
|
import generateTests from '@natlibfi/fixugen';
|
|
6
|
-
import createDebugLogger from 'debug';
|
|
6
|
+
//import createDebugLogger from 'debug';
|
|
7
7
|
|
|
8
8
|
generateTests({
|
|
9
9
|
callback,
|
|
@@ -19,7 +19,7 @@ generateTests({
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
|
-
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2:test');
|
|
22
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2:test');
|
|
23
23
|
|
|
24
24
|
async function testValidatorFactory() {
|
|
25
25
|
const validator = await validatorFactory();
|
|
@@ -29,12 +29,7 @@ async function testValidatorFactory() {
|
|
|
29
29
|
assert.equal(typeof validator.validate, 'function');
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
async function callback({getFixture,
|
|
33
|
-
if (enabled === false) {
|
|
34
|
-
debug('TEST SKIPPED!');
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
|
|
32
|
+
async function callback({getFixture, fix = false}) {
|
|
38
33
|
const validator = await validatorFactory();
|
|
39
34
|
const record = new MarcRecord(getFixture('record.json'));
|
|
40
35
|
const expectedResult = getFixture('expectedResult.json');
|
|
@@ -7,6 +7,8 @@ import {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fiel
|
|
|
7
7
|
// Relocated from melinda-marc-record-merge-reducers (and renamed)
|
|
8
8
|
|
|
9
9
|
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:reindexSubfield6OccurrenceNumbers');
|
|
10
|
+
//const debugData = debug.extend('data');
|
|
11
|
+
const debugDev = debug.extend('dev');
|
|
10
12
|
|
|
11
13
|
|
|
12
14
|
// NB! This validator/fixer has two functionalities:
|
|
@@ -20,7 +22,7 @@ export default function () {
|
|
|
20
22
|
};
|
|
21
23
|
|
|
22
24
|
function fix(record) {
|
|
23
|
-
nvdebug('Fix SF6 occurrence numbers',
|
|
25
|
+
nvdebug('Fix SF6 occurrence numbers', debugDev);
|
|
24
26
|
const res = {message: [], fix: [], valid: true};
|
|
25
27
|
//message.fix = [];
|
|
26
28
|
|
|
@@ -36,13 +38,13 @@ export default function () {
|
|
|
36
38
|
function validate(record) {
|
|
37
39
|
const res = {message: []};
|
|
38
40
|
|
|
39
|
-
nvdebug('Validate SF6 occurrence number multiuses',
|
|
41
|
+
nvdebug('Validate SF6 occurrence number multiuses', debugDev);
|
|
40
42
|
if (recordGetSharedOccurrenceNumbers(record).length) {
|
|
41
43
|
res.message.push(`Multi-use of occurrence number(s) detected`);
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
// Check max, and check number of different indexes
|
|
45
|
-
nvdebug('Validate SF6 occurrence number (max vs n instances)',
|
|
47
|
+
nvdebug('Validate SF6 occurrence number (max vs n instances)', debugDev);
|
|
46
48
|
const max = recordGetMaxSubfield6OccurrenceNumberAsInteger(record);
|
|
47
49
|
const size = recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record);
|
|
48
50
|
|
|
@@ -90,7 +92,7 @@ function recordDisambiguateSharedSubfield6OccurrenceNumbers(record) {
|
|
|
90
92
|
if (sharedOccurrenceNumberFields.length < 2) {
|
|
91
93
|
return;
|
|
92
94
|
}
|
|
93
|
-
nvdebug(`Disambiguate occurrence numbers (N=${sharedOccurrenceNumberFields.length}) in...`,
|
|
95
|
+
nvdebug(`Disambiguate occurrence numbers (N=${sharedOccurrenceNumberFields.length}) in...`, debugDev);
|
|
94
96
|
sharedOccurrenceNumberFields.forEach(field => disambiguateOccurrenceNumber(field));
|
|
95
97
|
|
|
96
98
|
function disambiguateable(field) {
|
|
@@ -98,20 +100,20 @@ function recordDisambiguateSharedSubfield6OccurrenceNumbers(record) {
|
|
|
98
100
|
return false;
|
|
99
101
|
}
|
|
100
102
|
const occurrenceNumber = fieldGetUnambiguousOccurrenceNumber(field);
|
|
101
|
-
nvdebug(` Trying to disambiguate ${occurrenceNumber} in '${fieldToString(field)}
|
|
103
|
+
nvdebug(` Trying to disambiguate ${occurrenceNumber} in '${fieldToString(field)}`, debugDev);
|
|
102
104
|
if (occurrenceNumber === undefined) {
|
|
103
105
|
return false;
|
|
104
106
|
}
|
|
105
107
|
const allRelevantFields = getPotentialSharedOccurrenceNumberFields(occurrenceNumber, sharedOccurrenceNumberFields);
|
|
106
108
|
if (allRelevantFields.length < 2) {
|
|
107
|
-
nvdebug(` Currently only ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. No action required
|
|
109
|
+
nvdebug(` Currently only ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. No action required.`, debugDev);
|
|
108
110
|
return false;
|
|
109
111
|
}
|
|
110
|
-
nvdebug(` Currently ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. ACTION REQUIRED
|
|
112
|
+
nvdebug(` Currently ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. ACTION REQUIRED!`, debugDev);
|
|
111
113
|
const relevantFieldsWithCurrFieldTag = allRelevantFields.filter(candField => field.tag === candField.tag);
|
|
112
114
|
|
|
113
115
|
if (relevantFieldsWithCurrFieldTag.length !== 1) {
|
|
114
|
-
nvdebug(` Number of them using tag ${field.tag} is ${relevantFieldsWithCurrFieldTag.length}. Can not disambiguate
|
|
116
|
+
nvdebug(` Number of them using tag ${field.tag} is ${relevantFieldsWithCurrFieldTag.length}. Can not disambiguate!`, debugDev);
|
|
115
117
|
return false;
|
|
116
118
|
}
|
|
117
119
|
|
|
@@ -128,7 +130,7 @@ function recordDisambiguateSharedSubfield6OccurrenceNumbers(record) {
|
|
|
128
130
|
const newOccurrenceNumber = intToOccurrenceNumberString(newOccurrenceNumberAsInt);
|
|
129
131
|
const pairedFields = fieldGetOccurrenceNumberPairs(field, record.fields);
|
|
130
132
|
|
|
131
|
-
nvdebug(` Reindex '${fieldToString(field)}' occurrence number and it's ${pairedFields.length} pair(s) using '${newOccurrenceNumber}'`,
|
|
133
|
+
nvdebug(` Reindex '${fieldToString(field)}' occurrence number and it's ${pairedFields.length} pair(s) using '${newOccurrenceNumber}'`, debugDev);
|
|
132
134
|
|
|
133
135
|
fieldResetOccurrenceNumber(field, newOccurrenceNumber, occurrenceNumber);
|
|
134
136
|
pairedFields.forEach(pairedField => fieldResetOccurrenceNumber(pairedField, newOccurrenceNumber, occurrenceNumber));
|
|
@@ -172,7 +174,7 @@ export function recordResetSubfield6OccurrenceNumbers(record) { // Remove gaps
|
|
|
172
174
|
record.fields.forEach(field => fieldResetSubfield6(field));
|
|
173
175
|
|
|
174
176
|
function fieldResetSubfield6(field) {
|
|
175
|
-
nvdebug(`fieldResetSubfield6(${fieldToString(field)}), CURR:${currentInt}`,
|
|
177
|
+
nvdebug(`fieldResetSubfield6(${fieldToString(field)}), CURR:${currentInt}`, debugDev);
|
|
176
178
|
if (!field.subfields) {
|
|
177
179
|
return;
|
|
178
180
|
}
|
|
@@ -189,7 +191,7 @@ export function recordResetSubfield6OccurrenceNumbers(record) { // Remove gaps
|
|
|
189
191
|
}
|
|
190
192
|
|
|
191
193
|
const newIndex = mapCurrIndexToNewIndex(currIndex);
|
|
192
|
-
//nvdebug(`subfieldReset6(${subfieldToString(subfield)}): ${newIndex}`,
|
|
194
|
+
//nvdebug(`subfieldReset6(${subfieldToString(subfield)}): ${newIndex}`, debugDev);
|
|
193
195
|
subfield6ResetOccurrenceNumber(subfield, newIndex);
|
|
194
196
|
}
|
|
195
197
|
|
|
@@ -3,7 +3,7 @@ import {MarcRecord} from '@natlibfi/marc-record';
|
|
|
3
3
|
import validatorFactory from './reindexSubfield6OccurenceNumbers.js';
|
|
4
4
|
import {READERS} from '@natlibfi/fixura';
|
|
5
5
|
import generateTests from '@natlibfi/fixugen';
|
|
6
|
-
import createDebugLogger from 'debug';
|
|
6
|
+
//import createDebugLogger from 'debug';
|
|
7
7
|
|
|
8
8
|
generateTests({
|
|
9
9
|
callback,
|
|
@@ -19,7 +19,7 @@ generateTests({
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
|
-
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/reindexSubfield6OccurrenceNumbers:test');
|
|
22
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/reindexSubfield6OccurrenceNumbers:test');
|
|
23
23
|
|
|
24
24
|
async function testValidatorFactory() {
|
|
25
25
|
const validator = await validatorFactory();
|
|
@@ -29,12 +29,7 @@ async function testValidatorFactory() {
|
|
|
29
29
|
assert.equal(typeof validator.validate, 'function');
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
async function callback({getFixture,
|
|
33
|
-
if (enabled === false) {
|
|
34
|
-
debug('TEST SKIPPED!');
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
|
|
32
|
+
async function callback({getFixture, fix = false}) {
|
|
38
33
|
const validator = await validatorFactory();
|
|
39
34
|
const record = new MarcRecord(getFixture('record.json'));
|
|
40
35
|
const expectedResult = getFixture('expectedResult.json');
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/*
|
|
2
|
+
// remove-041-zxx.js
|
|
3
|
+
//
|
|
4
|
+
// https://wiki.helsinki.fi/xwiki/bin/view/rdasovellusohje/RDA-kuvailu%20MARC%2021%20-formaatilla/RDA-sovellusohje/008%20Kontrollikentt%C3%A4/#Hmp.35-37Kieli
|
|
5
|
+
// "008-kielikoodi on sama kuin ensimmäinen 041-kentän a- (tai d-) osakenttä. Poikkeuksen muodostaa koodi zxx:
|
|
6
|
+
// jos tietueen 008ssa on kielikoodi zxx (ei kielellistä sisältöä, esim. soitinmusiikki), tietueessa ei voi olla 041 a- eikä d-osakenttää."
|
|
7
|
+
// Effectively this means, that 'zxx' does not appear in 041!
|
|
8
|
+
// Author(s): Nicholas Volk
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
//import createDebugLogger from 'debug';
|
|
12
|
+
import clone from 'clone';
|
|
13
|
+
|
|
14
|
+
import {fieldToString} from './utils.js';
|
|
15
|
+
|
|
16
|
+
// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:remove-041-zxx');
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
export default function () {
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
description: "Remove 'zxx' from f041",
|
|
25
|
+
validate, fix
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
function zxxRemoval041(record, validateMode) {
|
|
29
|
+
const fields041 = record.fields.filter(f => f.tag === '041');
|
|
30
|
+
|
|
31
|
+
return handleZxx(fields041);
|
|
32
|
+
|
|
33
|
+
function handleZxx(fields, result = []) {
|
|
34
|
+
const [currField, ...remainingFields] = fields;
|
|
35
|
+
if ( !currField) {
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
// Theoretically 'zxx' might mean something in ISO-639-3 or some other language code list:
|
|
39
|
+
if (!currField.subfields || currField.subfields.some(sf => sf.code === '2')) {
|
|
40
|
+
return handleZxx(remainingFields, result);
|
|
41
|
+
}
|
|
42
|
+
// Presumable 'zxx' is bad in any data subfield, not just 'a' and 'd':
|
|
43
|
+
const otherSubfields = currField.subfields.filter(sf => (!sf.code.match(/^[a-z]$/u) || sf.value !== 'zxx'));
|
|
44
|
+
if (otherSubfields.length === currField.subfields.length) {
|
|
45
|
+
return handleZxx(remainingFields, result);
|
|
46
|
+
}
|
|
47
|
+
const originalString = fieldToString(currField);
|
|
48
|
+
if (otherSubfields.length === 0) {
|
|
49
|
+
const message = `Remove '${originalString}'`;
|
|
50
|
+
if (!validateMode) {
|
|
51
|
+
record.removeField(currField);
|
|
52
|
+
}
|
|
53
|
+
return handleZxx(remainingFields, [...result, message]);
|
|
54
|
+
}
|
|
55
|
+
// Some subfields are removed:
|
|
56
|
+
if (validateMode) {
|
|
57
|
+
// NB! In validation field is not really deleted, and the non-deleted field might trigger other fixes (than won't be done to a deleted field) later on
|
|
58
|
+
const clonedField = clone(currField);
|
|
59
|
+
clonedField.subfields = otherSubfields;
|
|
60
|
+
const modifiedString = fieldToString(clonedField);
|
|
61
|
+
const message = `Modify '${originalString}' => '${modifiedString}`;
|
|
62
|
+
return handleZxx(remainingFields, [...result, message]);
|
|
63
|
+
}
|
|
64
|
+
currField.subfields = otherSubfields;
|
|
65
|
+
const modifiedString = fieldToString(currField);
|
|
66
|
+
const message = `Modify '${originalString}' => '${modifiedString}`;
|
|
67
|
+
return handleZxx(remainingFields, [...result, message]);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function fix(record, validateMode = false) {
|
|
72
|
+
const messages = zxxRemoval041(record, validateMode);
|
|
73
|
+
|
|
74
|
+
if (validateMode) {
|
|
75
|
+
return {message: messages, valid: messages.length === 0};
|
|
76
|
+
}
|
|
77
|
+
return {message: [], fix: messages, valid: true};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
function validate(record) {
|
|
82
|
+
return fix(record, true);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
//import createDebugLogger from 'debug';
|
|
3
|
+
|
|
4
|
+
import validatorFactory from './remove-041-zxx.js';
|
|
5
|
+
|
|
6
|
+
import {MarcRecord} from '@natlibfi/marc-record';
|
|
7
|
+
import {READERS} from '@natlibfi/fixura';
|
|
8
|
+
import generateTests from '@natlibfi/fixugen';
|
|
9
|
+
|
|
10
|
+
generateTests({
|
|
11
|
+
callback,
|
|
12
|
+
path: [import.meta.dirname, '..', 'test-fixtures', 'remove-041-zxx'],
|
|
13
|
+
useMetadataFile: true,
|
|
14
|
+
recurse: false,
|
|
15
|
+
fixura: {
|
|
16
|
+
reader: READERS.JSON
|
|
17
|
+
},
|
|
18
|
+
hooks: {
|
|
19
|
+
before: async () => {
|
|
20
|
+
testValidatorFactory();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/drop-terms:test');
|
|
26
|
+
|
|
27
|
+
async function testValidatorFactory() {
|
|
28
|
+
const validator = await validatorFactory();
|
|
29
|
+
|
|
30
|
+
assert.equal(typeof validator, 'object');
|
|
31
|
+
assert.equal(typeof validator.description, 'string');
|
|
32
|
+
assert.equal(typeof validator.validate, 'function');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function callback({getFixture, fix = false}) {
|
|
36
|
+
const validator = await validatorFactory();
|
|
37
|
+
const record = new MarcRecord(getFixture('record.json'));
|
|
38
|
+
const expectedResult = getFixture('expectedResult.json');
|
|
39
|
+
//const expectedResult = new MarcRecord(getFixture('expectedResult.json'));
|
|
40
|
+
// console.log(expectedResult); // eslint-disable-line
|
|
41
|
+
|
|
42
|
+
if (!fix) {
|
|
43
|
+
const result = await validator.validate(record);
|
|
44
|
+
assert.deepEqual(result, expectedResult);
|
|
45
|
+
const originalRecord = new MarcRecord(getFixture('record.json'));
|
|
46
|
+
assert.deepEqual(record, originalRecord); // Validation should not change the record
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
await validator.fix(record);
|
|
51
|
+
assert.deepEqual(record, new MarcRecord(expectedResult));
|
|
52
|
+
}
|