@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
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import createDebugLogger from 'debug';
|
|
2
|
-
import {fieldHasSubfield, fieldToString, nvdebug
|
|
2
|
+
import {fieldHasSubfield, fieldToString, nvdebug /*, subfieldToString*/ } from './utils.js';
|
|
3
3
|
import {fieldHasWantedTagAndOccurrenceNumber, isValidSubfield6, subfield6GetOccurrenceNumber, subfield6ResetOccurrenceNumber} from './subfield6Utils.js';
|
|
4
4
|
|
|
5
5
|
// Relocated from melinda-marc-record-merge-reducers (and renamed)
|
|
6
6
|
|
|
7
7
|
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s');
|
|
8
|
+
//const debugData = debug.extend('data');
|
|
9
|
+
const debugDev = debug.extend('dev');
|
|
8
10
|
|
|
9
11
|
export default function () {
|
|
10
12
|
return {
|
|
@@ -13,7 +15,7 @@ export default function () {
|
|
|
13
15
|
};
|
|
14
16
|
|
|
15
17
|
function fix(record) {
|
|
16
|
-
nvdebug('Fix SF6 orphaned occurrence numbers');
|
|
18
|
+
nvdebug('Fix SF6 orphaned occurrence numbers', debugDev);
|
|
17
19
|
const res = {message: [], fix: [], valid: true};
|
|
18
20
|
//message.fix = [];
|
|
19
21
|
|
|
@@ -26,7 +28,7 @@ export default function () {
|
|
|
26
28
|
|
|
27
29
|
function validate(record) {
|
|
28
30
|
// Check max, and check number of different indexes
|
|
29
|
-
nvdebug('Validate SF6 orphaned occurrence numbers',
|
|
31
|
+
nvdebug('Validate SF6 orphaned occurrence numbers', debugDev);
|
|
30
32
|
const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));
|
|
31
33
|
|
|
32
34
|
const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);
|
|
@@ -77,7 +79,7 @@ function findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields)
|
|
|
77
79
|
if (!isValidSubfield6(subfield6)) {
|
|
78
80
|
return undefined;
|
|
79
81
|
}
|
|
80
|
-
nvdebug(`LOOKING FOR PAIR: ${myTag} ${subfieldToString(subfield6)}
|
|
82
|
+
//nvdebug(`LOOKING FOR PAIR: ${myTag} ${subfieldToString(subfield6)}`, debugDev);
|
|
81
83
|
candPairFields.forEach(field => fieldToString(field));
|
|
82
84
|
|
|
83
85
|
// Only valid $6 value that fails to map to another field is iffy...
|
|
@@ -88,7 +90,7 @@ function findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields)
|
|
|
88
90
|
return undefined;
|
|
89
91
|
}
|
|
90
92
|
const tagAndOccurrenceNumber = `${myTag}-${occurrenceNumber}`;
|
|
91
|
-
nvdebug(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}
|
|
93
|
+
//nvdebug(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}...`, debugDev);
|
|
92
94
|
//const relevantFields = fields.filter(field => field.tag === referredTag && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));
|
|
93
95
|
const relevantFields = candPairFields.filter(field => field.tag === referredTag && fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber));
|
|
94
96
|
if (relevantFields.length === 0) {
|
|
@@ -3,7 +3,7 @@ import {MarcRecord} from '@natlibfi/marc-record';
|
|
|
3
3
|
import validatorFactory from './resolveOrphanedSubfield6s.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,
|
|
@@ -20,7 +20,7 @@ generateTests({
|
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
22
|
|
|
23
|
-
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/resolveOrphanedSubfield6s:test');
|
|
23
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/resolveOrphanedSubfield6s:test');
|
|
24
24
|
|
|
25
25
|
async function testValidatorFactory() {
|
|
26
26
|
const validator = await validatorFactory();
|
|
@@ -30,12 +30,7 @@ async function testValidatorFactory() {
|
|
|
30
30
|
assert.equal(typeof validator.validate, 'function');
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
async function callback({getFixture,
|
|
34
|
-
if (enabled === false) {
|
|
35
|
-
debug('TEST SKIPPED!');
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
|
|
33
|
+
async function callback({getFixture, fix = false}) {
|
|
39
34
|
const validator = await validatorFactory();
|
|
40
35
|
const record = new MarcRecord(getFixture('record.json'));
|
|
41
36
|
const expectedResult = getFixture('expectedResult.json');
|
|
@@ -3,7 +3,7 @@ import {MarcRecord} from '@natlibfi/marc-record';
|
|
|
3
3
|
import validatorFactory from './sanitize-vocabulary-source-codes.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/sanitize-vocabulary-source-codes:test');
|
|
22
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes: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
|
|
|
40
35
|
const recordFixture = getFixture('record.json');
|
package/src/sortFields.js
CHANGED
|
@@ -211,7 +211,7 @@ export function fieldOrderComparator(fieldA, fieldB) {
|
|
|
211
211
|
|
|
212
212
|
//const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];
|
|
213
213
|
|
|
214
|
-
const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortBySubfield6, preferFenniKeep, sortByFieldLinkAndSequenceNumber];
|
|
214
|
+
const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortBySubfield6, preferFenniKeep, sortByFieldLinkAndSequenceNumber, sortByHacks];
|
|
215
215
|
//const sorterFunctions = [sortByIndexTerms, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];
|
|
216
216
|
|
|
217
217
|
return globalFieldOrderComparator(fieldA, fieldB, sorterFunctions);
|
|
@@ -390,6 +390,25 @@ function sortByFieldLinkAndSequenceNumber(fieldA, fieldB) { // Sort by subfield
|
|
|
390
390
|
return -1;
|
|
391
391
|
}
|
|
392
392
|
|
|
393
|
+
function sortByHacks(fieldA, fieldB) {
|
|
394
|
+
// Place for various hackier rules
|
|
395
|
+
|
|
396
|
+
if (fieldA.tag === fieldB.tag) {
|
|
397
|
+
if (fieldA.tag === '041') {
|
|
398
|
+
// If we have multiple f041, we want to put the $2-less first; Values from $2 whatever can not be copied to 008/35-37. (See sync-language.js.)
|
|
399
|
+
const a2 = fieldA.subfields.some(sf => sf.code === '2');
|
|
400
|
+
const b2 = fieldB.subfields.some(sf => sf.code === '2');
|
|
401
|
+
if (a2 && !b2) {
|
|
402
|
+
return 1;
|
|
403
|
+
}
|
|
404
|
+
if (b2 && !a2) {
|
|
405
|
+
return -1;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
}
|
|
410
|
+
return 0;
|
|
411
|
+
}
|
|
393
412
|
|
|
394
413
|
function sortBySubfield6(fieldA, fieldB) { // Sort by subfield $6, ex-sortByOccurrenceNumber...
|
|
395
414
|
if (fieldA.tag !== '880' || fieldB.tag !== '880') {
|
package/src/sortFields.test.js
CHANGED
|
@@ -3,7 +3,7 @@ import {MarcRecord} from '@natlibfi/marc-record';
|
|
|
3
3
|
import validatorFactory from './sortFields.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/sortFields:test');
|
|
22
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sortFields: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 = true}) {
|
|
38
33
|
const validator = await validatorFactory();
|
|
39
34
|
const record = new MarcRecord(getFixture('input.json'));
|
|
40
35
|
const expectedResult = getFixture('result.json');
|
|
@@ -3,7 +3,7 @@ import {MarcRecord} from '@natlibfi/marc-record';
|
|
|
3
3
|
import validatorFactory from './sortRelatorTerms.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,
|
|
@@ -20,7 +20,7 @@ generateTests({
|
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
22
|
|
|
23
|
-
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sortRelatorTerms:test');
|
|
23
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sortRelatorTerms:test');
|
|
24
24
|
|
|
25
25
|
async function testValidatorFactory() {
|
|
26
26
|
const validator = await validatorFactory();
|
|
@@ -30,12 +30,7 @@ async function testValidatorFactory() {
|
|
|
30
30
|
assert.equal(typeof validator.validate, 'function');
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
async function callback({getFixture,
|
|
34
|
-
if (enabled === false) {
|
|
35
|
-
debug('TEST SKIPPED!');
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
|
|
33
|
+
async function callback({getFixture, fix = false}) {
|
|
39
34
|
const validator = await validatorFactory();
|
|
40
35
|
const record = new MarcRecord(getFixture('record.json'));
|
|
41
36
|
const expectedResult = getFixture('expectedResult.json');
|
package/src/sortSubfields.js
CHANGED
|
@@ -8,8 +8,8 @@ const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortSu
|
|
|
8
8
|
//const debugData = debug.extend('data');
|
|
9
9
|
const debugDev = debug.extend('dev');
|
|
10
10
|
|
|
11
|
-
const defaultSortOrderStringFinns = '
|
|
12
|
-
const defaultSortOrderStringOthers = '
|
|
11
|
+
const defaultSortOrderStringFinns = '863abcdefghijklmnopqrstuvwxyz4201759'; // NB! We Finns like $2 before $0 in 6XX...
|
|
12
|
+
const defaultSortOrderStringOthers = '863abcdefghijklmnopqrstuvwxyz4021759'; // NB 760-788 have '7' in different position...
|
|
13
13
|
|
|
14
14
|
const defaultSortOrderFinns = defaultSortOrderStringFinns.split('');
|
|
15
15
|
const defaultSortOrderOthers = defaultSortOrderStringOthers.split('');
|
|
@@ -70,7 +70,7 @@ export default function (defaultTagPattern) {
|
|
|
70
70
|
const sortOrderForX00 = ['i', 'a', 'b', 'q', 'c', 'd', 'e', 't', 'u', 'l', 'f', 'x', 'y', 'z', '0', '1', '5', '9']; // skip $g. Can't remember why, though...
|
|
71
71
|
const sortOrderForX10 = ['i', 'a', 'b', 't', 'n', 'c', 'e', 'v', 'w', 'x', 'y', 'z', '0', '1', '5', '9']; // somewhat iffy
|
|
72
72
|
const sortOrderForX11 = ['a', 'n', 'd', 'c', 'e', 'g', 'j', '0', '1', '5', '9'];
|
|
73
|
-
const
|
|
73
|
+
const sortOrderFor7XXLinkingEntries = ['8', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w', '0', '1', 'l', '9', '5'];
|
|
74
74
|
const sortOrderFor246 = ['i', 'a', 'b', 'n', 'p', 'f', '5', '9']; // Used by field 946 as well
|
|
75
75
|
|
|
76
76
|
// List *only* exceptional order here. Otherwise default order is used.
|
|
@@ -79,7 +79,11 @@ const subfieldSortOrder = [
|
|
|
79
79
|
{'tag': '028', 'sortOrder': ['b', 'a', 'q']}, // National convention
|
|
80
80
|
//{'tag': '031', 'sortOrder': ['a', 'b', 'c', 'm', 'e', 'd']}, // utter guesswork
|
|
81
81
|
{'tag': '040', 'sortOrder': ['8', 'a', 'b', 'e', 'c', 'd', 'x']},
|
|
82
|
-
|
|
82
|
+
// rda mus: 041: k < h < e < n < g < m < j (I think h<e is bad)
|
|
83
|
+
// rda: g < h, j < p < h, i < j, k < h
|
|
84
|
+
// loc: b < j, $m follows $b or $g
|
|
85
|
+
// NV: $a
|
|
86
|
+
{'tag': '041', 'sortOrder': ['8', 'a', 'd', 'e', 'b', 'f', 'i', 'j', 'p', 'k', 'h', 'n', 'g', 'm']}, // guesswork
|
|
83
87
|
{'tag': '048', 'sortOrder': ['8', 'b', 'a']},
|
|
84
88
|
{'tag': '100', 'sortOrder': sortOrderForX00},
|
|
85
89
|
{'tag': '110', 'sortOrder': sortOrderForX10},
|
|
@@ -103,22 +107,22 @@ const subfieldSortOrder = [
|
|
|
103
107
|
{'tag': '700', 'sortOrder': sortOrderForX00},
|
|
104
108
|
{'tag': '710', 'sortOrder': sortOrderForX10},
|
|
105
109
|
{'tag': '711', 'sortOrder': sortOrderForX11},
|
|
106
|
-
{'tag': '760', 'sortOrder':
|
|
107
|
-
{'tag': '762', 'sortOrder':
|
|
108
|
-
{'tag': '765', 'sortOrder':
|
|
109
|
-
{'tag': '767', 'sortOrder':
|
|
110
|
-
{'tag': '770', 'sortOrder':
|
|
111
|
-
{'tag': '772', 'sortOrder':
|
|
112
|
-
{'tag': '773', 'sortOrder':
|
|
113
|
-
{'tag': '774', 'sortOrder':
|
|
114
|
-
{'tag': '775', 'sortOrder':
|
|
115
|
-
{'tag': '776', 'sortOrder':
|
|
116
|
-
{'tag': '777', 'sortOrder':
|
|
117
|
-
{'tag': '780', 'sortOrder':
|
|
118
|
-
{'tag': '785', 'sortOrder':
|
|
119
|
-
{'tag': '786', 'sortOrder':
|
|
120
|
-
{'tag': '787', 'sortOrder':
|
|
121
|
-
{'tag': '788', 'sortOrder':
|
|
110
|
+
{'tag': '760', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
111
|
+
{'tag': '762', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
112
|
+
{'tag': '765', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
113
|
+
{'tag': '767', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
114
|
+
{'tag': '770', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
115
|
+
{'tag': '772', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
116
|
+
{'tag': '773', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
117
|
+
{'tag': '774', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
118
|
+
{'tag': '775', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
119
|
+
{'tag': '776', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
120
|
+
{'tag': '777', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
121
|
+
{'tag': '780', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
122
|
+
{'tag': '785', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
123
|
+
{'tag': '786', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
124
|
+
{'tag': '787', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
125
|
+
{'tag': '788', 'sortOrder': sortOrderFor7XXLinkingEntries},
|
|
122
126
|
{'tag': '800', 'sortOrder': sortOrderForX00},
|
|
123
127
|
{'tag': '810', 'sortOrder': sortOrderForX10},
|
|
124
128
|
{'tag': '811', 'sortOrder': sortOrderForX11},
|
|
@@ -136,7 +140,9 @@ function getSubfieldSortOrder(field) {
|
|
|
136
140
|
debugDev(`sort order for ${field.tag}: ${entry[0].sortOrder}`);
|
|
137
141
|
return entry[0].sortOrder;
|
|
138
142
|
}
|
|
139
|
-
|
|
143
|
+
if (!['300'].includes(field.tag)) { // Lis tags which use normal $a...$z order here!
|
|
144
|
+
nvdebug(`WARNING!\tNo subfield order found for ${field.tag}.`, debugDev);
|
|
145
|
+
}
|
|
140
146
|
return [];
|
|
141
147
|
}
|
|
142
148
|
|
|
@@ -224,15 +230,15 @@ export function sortAdjacentSubfields(field, externalSortOrder = []) {
|
|
|
224
230
|
swapSubfields(field, controlSubfieldOrder);
|
|
225
231
|
|
|
226
232
|
const sortOrderForField = externalSortOrder.length > 0 ? externalSortOrder : getSubfieldSortOrder(field);
|
|
227
|
-
//nvdebug(`INTERMEDIATE SUBFIELD ORDER FOR ${field.tag}: ${sortOrderForField.join(', ')}
|
|
233
|
+
//nvdebug(`INTERMEDIATE SUBFIELD ORDER FOR ${field.tag}: ${sortOrderForField.join(', ')}`, debugDev);
|
|
228
234
|
|
|
229
235
|
const defaultSortOrder = finnishWay ? defaultSortOrderFinns : defaultSortOrderOthers; // $2 vs $0
|
|
230
236
|
const subfieldOrder = sortOrderForField.length > 0 ? sortOrderForField : defaultSortOrder;
|
|
231
|
-
//nvdebug(`FINAL SUBFIELD ORDER (FINNISH=${finnishWay}) FOR ${field.tag}: ${subfieldOrder.join(', ')}
|
|
237
|
+
//nvdebug(`FINAL SUBFIELD ORDER (FINNISH=${finnishWay}) FOR ${field.tag}: ${subfieldOrder.join(', ')}`, debugDev);
|
|
232
238
|
//if (sortOrder === null) { return field; } //// Currently always sort..
|
|
233
|
-
//nvdebug(`IN: ${fieldToString(field)}
|
|
239
|
+
//nvdebug(`IN: ${fieldToString(field)}`, debugDev);
|
|
234
240
|
swapSubfields(field, subfieldOrder);
|
|
235
|
-
//nvdebug(`OUT: ${fieldToString(field)}
|
|
241
|
+
//nvdebug(`OUT: ${fieldToString(field)}`, debugDev);
|
|
236
242
|
|
|
237
243
|
return field;
|
|
238
244
|
}
|
|
@@ -3,7 +3,7 @@ import {MarcRecord} from '@natlibfi/marc-record';
|
|
|
3
3
|
import validatorFactory from './sortSubfields.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,
|
|
@@ -20,7 +20,7 @@ generateTests({
|
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
22
|
|
|
23
|
-
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sortSubfields:test');
|
|
23
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sortSubfields:test');
|
|
24
24
|
|
|
25
25
|
async function testValidatorFactory() {
|
|
26
26
|
const validator = await validatorFactory();
|
|
@@ -30,12 +30,7 @@ async function testValidatorFactory() {
|
|
|
30
30
|
assert.equal(typeof validator.validate, 'function');
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
async function callback({getFixture,
|
|
34
|
-
if (enabled === false) {
|
|
35
|
-
debug('TEST SKIPPED!');
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
|
|
33
|
+
async function callback({getFixture, fix = false, tagPattern = false}) {
|
|
39
34
|
const validator = await validatorFactory(tagPattern);
|
|
40
35
|
const record = new MarcRecord(getFixture('record.json'));
|
|
41
36
|
const expectedResult = getFixture('expectedResult.json');
|
package/src/stripPunctuation.js
CHANGED
|
@@ -6,26 +6,31 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import {fieldGetFixedString, fieldNeedsModification, fieldStripPunctuation} from './punctuation2.js';
|
|
9
|
-
|
|
9
|
+
import createDebugLogger from 'debug';
|
|
10
|
+
|
|
10
11
|
import {fieldToString, nvdebug} from './utils.js';
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');
|
|
14
|
+
//const debugData = debug.extend('data');
|
|
15
|
+
const debugDev = debug.extend('dev');
|
|
16
|
+
|
|
17
|
+
const description = 'Strip punctuation in data fields';
|
|
13
18
|
|
|
14
19
|
export default function () {
|
|
15
20
|
return {
|
|
16
|
-
description:
|
|
21
|
+
description: description,
|
|
17
22
|
validate, fix
|
|
18
23
|
};
|
|
19
24
|
|
|
20
25
|
function fix(record) {
|
|
21
|
-
nvdebug(
|
|
26
|
+
nvdebug(`${description}: fixer`, debugDev);
|
|
22
27
|
const res = {message: [], fix: [], valid: true};
|
|
23
28
|
record.fields.forEach(f => fieldStripPunctuation(f));
|
|
24
29
|
return res;
|
|
25
30
|
}
|
|
26
31
|
|
|
27
32
|
function validate(record) {
|
|
28
|
-
nvdebug(
|
|
33
|
+
nvdebug(`${description}: validate`, debugDev);
|
|
29
34
|
|
|
30
35
|
const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, false));
|
|
31
36
|
|
|
@@ -3,7 +3,7 @@ import {MarcRecord} from '@natlibfi/marc-record';
|
|
|
3
3
|
import validatorFactory from './stripPunctuation.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,
|
|
@@ -20,7 +20,7 @@ generateTests({
|
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
22
|
|
|
23
|
-
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/stripPunctuation:test');
|
|
23
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/stripPunctuation:test');
|
|
24
24
|
|
|
25
25
|
async function testValidatorFactory() {
|
|
26
26
|
const validator = await validatorFactory();
|
|
@@ -30,12 +30,7 @@ async function testValidatorFactory() {
|
|
|
30
30
|
assert.equal(typeof validator.validate, 'function');
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
async function callback({getFixture,
|
|
34
|
-
if (enabled === false) {
|
|
35
|
-
debug('TEST SKIPPED!');
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
|
|
33
|
+
async function callback({getFixture, fix = false}) {
|
|
39
34
|
const validator = await validatorFactory();
|
|
40
35
|
const record = new MarcRecord(getFixture('record.json'));
|
|
41
36
|
const expectedResult = getFixture('expectedResult.json');
|
package/src/subfield6Utils.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import createDebugLogger from 'debug';
|
|
2
|
-
// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');
|
|
3
|
-
|
|
4
2
|
import {add8s, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, isValidSubfield8} from './subfield8Utils.js';
|
|
5
|
-
import {fieldHasSubfield, fieldToString, fieldsToString, nvdebug, subfieldToString} from './utils.js';
|
|
3
|
+
import {fieldHasSubfield, fieldToString, /* fieldsToString, */ nvdebug, subfieldToString} from './utils.js';
|
|
6
4
|
|
|
7
5
|
const debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:subfield6Utils');
|
|
8
6
|
//const debugData = debug.extend('data');
|
|
@@ -41,7 +39,7 @@ export function subfield6GetOccurrenceNumberAsInteger(subfield) {
|
|
|
41
39
|
return 0;
|
|
42
40
|
}
|
|
43
41
|
const result = parseInt(index, 10);
|
|
44
|
-
//nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`,
|
|
42
|
+
//nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debugDev, debugDev);
|
|
45
43
|
return result;
|
|
46
44
|
}
|
|
47
45
|
|
|
@@ -52,7 +50,7 @@ export function subfield6ResetOccurrenceNumber(subfield, occurrenceNumber) {
|
|
|
52
50
|
const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;
|
|
53
51
|
|
|
54
52
|
const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield);
|
|
55
|
-
//nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}
|
|
53
|
+
//nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`, debugDev);
|
|
56
54
|
subfield.value = newValue;
|
|
57
55
|
}
|
|
58
56
|
|
|
@@ -71,7 +69,7 @@ export function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurre
|
|
|
71
69
|
}
|
|
72
70
|
// We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...
|
|
73
71
|
const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1');
|
|
74
|
-
nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'
|
|
72
|
+
//nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`, debugDev);
|
|
75
73
|
return key === tagAndOccurrenceNumber;
|
|
76
74
|
}
|
|
77
75
|
|
|
@@ -94,7 +92,7 @@ export function fieldGetUnambiguousOccurrenceNumber(field) {
|
|
|
94
92
|
}
|
|
95
93
|
|
|
96
94
|
export function fieldHasOccurrenceNumber(field, occurrenceNumber) {
|
|
97
|
-
//nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}
|
|
95
|
+
//nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`, debugDev);
|
|
98
96
|
return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);
|
|
99
97
|
}
|
|
100
98
|
|
|
@@ -119,13 +117,13 @@ export function intToOccurrenceNumberString(i) {
|
|
|
119
117
|
|
|
120
118
|
export function fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {
|
|
121
119
|
// used by reducer!
|
|
122
|
-
//nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}
|
|
120
|
+
//nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`, debugDev);
|
|
123
121
|
const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];
|
|
124
122
|
if (sf6s.length === 0) {
|
|
125
123
|
return 0;
|
|
126
124
|
}
|
|
127
125
|
// There should always be one, but here we check every subfield.
|
|
128
|
-
//nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`,
|
|
126
|
+
//nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debugDev);
|
|
129
127
|
const vals = sf6s.map(sf => subfield6GetOccurrenceNumberAsInteger(sf));
|
|
130
128
|
return Math.max(...vals);
|
|
131
129
|
}
|
|
@@ -155,20 +153,20 @@ export function fieldHasValidSubfield6(field) {
|
|
|
155
153
|
|
|
156
154
|
export function isSubfield6Pair(field, otherField) {
|
|
157
155
|
// No need to log this:
|
|
158
|
-
//nvdebug(`LOOK for $6-pair:\n ${fieldToString(field)}\n ${fieldToString(otherField)}
|
|
156
|
+
//nvdebug(`LOOK for $6-pair:\n ${fieldToString(field)}\n ${fieldToString(otherField)}`, debugDev);
|
|
159
157
|
if (!fieldHasValidSubfield6(field) || !fieldHasValidSubfield6(otherField)) {
|
|
160
158
|
return false;
|
|
161
159
|
}
|
|
162
160
|
|
|
163
161
|
if (!tagsArePairable6(field.tag, otherField.tag)) {
|
|
164
|
-
//nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE
|
|
162
|
+
//nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`, debugDev);
|
|
165
163
|
return false;
|
|
166
164
|
}
|
|
167
165
|
|
|
168
166
|
|
|
169
167
|
const fieldIndex = fieldGetUnambiguousOccurrenceNumber(field);
|
|
170
168
|
if (fieldIndex === undefined || fieldIndex === '00') {
|
|
171
|
-
//nvdebug(` FAILED. REASON: NO INDEX FOUND
|
|
169
|
+
//nvdebug(` FAILED. REASON: NO INDEX FOUND`, debugDev);
|
|
172
170
|
return false;
|
|
173
171
|
}
|
|
174
172
|
|
|
@@ -176,12 +174,12 @@ export function isSubfield6Pair(field, otherField) {
|
|
|
176
174
|
|
|
177
175
|
|
|
178
176
|
if (fieldIndex !== otherFieldIndex) {
|
|
179
|
-
//nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}
|
|
177
|
+
//nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`, debugDev);
|
|
180
178
|
return false;
|
|
181
179
|
}
|
|
182
180
|
|
|
183
181
|
if (fieldGetUnambiguousTag(field) !== otherField.tag || field.tag !== fieldGetUnambiguousTag(otherField)) {
|
|
184
|
-
//nvdebug(` FAILURE: TAG vs $6 TAG
|
|
182
|
+
//nvdebug(` FAILURE: TAG vs $6 TAG`, debugDev);
|
|
185
183
|
return false;
|
|
186
184
|
}
|
|
187
185
|
return true;
|
|
@@ -219,11 +217,11 @@ export function fieldGetOccurrenceNumberPairs(field, candFields) {
|
|
|
219
217
|
//nvdebug(` Trying to finds pair for ${fieldToString(field)} in ${candFields.length} fields`);
|
|
220
218
|
const pairs = candFields.filter(otherField => isSubfield6Pair(field, otherField));
|
|
221
219
|
if (pairs.length === 0) {
|
|
222
|
-
nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'
|
|
220
|
+
//nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`, debugDev);
|
|
223
221
|
return pairs;
|
|
224
222
|
}
|
|
225
|
-
nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'
|
|
226
|
-
pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'
|
|
223
|
+
//nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`, debugDev);
|
|
224
|
+
pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`, debugDev));
|
|
227
225
|
return pairs;
|
|
228
226
|
}
|
|
229
227
|
|
|
@@ -268,7 +266,7 @@ export function fieldGetSubfield6Pair(field, record) {
|
|
|
268
266
|
return undefined;
|
|
269
267
|
}
|
|
270
268
|
// NB! It is theoretically possible to have multiple pairable 880 fields (one for each encoding)
|
|
271
|
-
nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}
|
|
269
|
+
nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`, debugDev);
|
|
272
270
|
return pairedFields[0];
|
|
273
271
|
}
|
|
274
272
|
*/
|
|
@@ -357,7 +355,7 @@ function guessTargetLinkingNumber(fields, defaultTargetLinkingNumber) {
|
|
|
357
355
|
export function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTag = false) {
|
|
358
356
|
const targetLinkingNumber = guessTargetLinkingNumber(fields, defaultTargetLinkingNumber);
|
|
359
357
|
|
|
360
|
-
nvdebug(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}
|
|
358
|
+
//nvdebug(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`, debugDev);
|
|
361
359
|
const strings = fields.map(field => fieldToNormalizedString(field, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTag));
|
|
362
360
|
strings.sort();
|
|
363
361
|
return strings.join('\t__SEPARATOR__\t');
|
|
@@ -369,32 +367,32 @@ export function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0,
|
|
|
369
367
|
export function removeField6IfNeeded(field, record, fieldsAsString) {
|
|
370
368
|
const pairField = fieldGetSubfield6Pair(field, record);
|
|
371
369
|
const asString = pairField ? fieldsToNormalizedString([field, pairField]) : fieldToNormalizedString(field);
|
|
372
|
-
nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}
|
|
370
|
+
nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`, debugDev);
|
|
373
371
|
const tmp = pairField ? fieldToString(pairField) : 'HUTI';
|
|
374
|
-
nvdebug(`PAIR: ${tmp}
|
|
375
|
-
nvdebug(`BASE:\n ${fieldsAsString.join('\n ')}
|
|
372
|
+
nvdebug(`PAIR: ${tmp}`, debugDev);
|
|
373
|
+
nvdebug(`BASE:\n ${fieldsAsString.join('\n ')}`, debugDev);
|
|
376
374
|
if (!fieldsAsString.includes(asString)) {
|
|
377
375
|
return;
|
|
378
376
|
}
|
|
379
|
-
nvdebug(`Duplicate $6 removal: ${fieldToString(field)}
|
|
377
|
+
nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`, debugDev);
|
|
380
378
|
record.removeField(field);
|
|
381
379
|
|
|
382
380
|
if (pairField === undefined) {
|
|
383
381
|
return;
|
|
384
382
|
}
|
|
385
|
-
nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}
|
|
383
|
+
nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`, debugDev);
|
|
386
384
|
record.removeField(pairField);
|
|
387
385
|
}
|
|
388
386
|
*/
|
|
389
387
|
|
|
390
388
|
function getFirstField(record, fields) {
|
|
391
389
|
const fieldsAsStrings = fields.map(field => fieldToString(field));
|
|
392
|
-
//record.fields.forEach((field, i) => nvdebug(`${i}:\t${fieldToString(field)}
|
|
393
|
-
//nvdebug(`getFirstField: ${fieldsAsStrings.join('\t')}
|
|
390
|
+
//record.fields.forEach((field, i) => nvdebug(`${i}:\t${fieldToString(field)}`, debugDev));
|
|
391
|
+
//nvdebug(`getFirstField: ${fieldsAsStrings.join('\t')}`, debugDev);
|
|
394
392
|
const i = record.fields.findIndex(field => fieldsAsStrings.includes(fieldToString(field)));
|
|
395
393
|
if (i > -1) {
|
|
396
394
|
const field = record.fields[i];
|
|
397
|
-
//nvdebug(`1st F: ${i + 1}/${record.fields.length} ${fieldToString(field)}
|
|
395
|
+
//nvdebug(`1st F: ${i + 1}/${record.fields.length} ${fieldToString(field)}`, debugDev);
|
|
398
396
|
return field;
|
|
399
397
|
}
|
|
400
398
|
return undefined;
|
|
@@ -445,7 +443,7 @@ export function isFirstLinkedSubfield6Field(field, record) {
|
|
|
445
443
|
}
|
|
446
444
|
const chain = getAllLinkedSubfield6Fields(field, record);
|
|
447
445
|
if (!isRelevantSubfield6Chain(chain)) {
|
|
448
|
-
nvdebug(`Rejected 6: ${fieldsToString(chain)}
|
|
446
|
+
//nvdebug(`Rejected 6: ${fieldsToString(chain)}`, debugDev);
|
|
449
447
|
return false;
|
|
450
448
|
}
|
|
451
449
|
|
|
@@ -472,13 +470,13 @@ export function get6s(field, candidateFields) { // NB! Convert field to fields!!
|
|
|
472
470
|
if (sixes.length === 0) {
|
|
473
471
|
return [field];
|
|
474
472
|
}
|
|
475
|
-
nvdebug(`SIXES: ${sixes.length}
|
|
473
|
+
//nvdebug(`SIXES: ${sixes.length}`, debugDev);
|
|
476
474
|
const occurrenceNumbers = sixes.map(sf => subfield6GetOccurrenceNumber(sf)).filter(value => value !== undefined && value !== '00');
|
|
477
|
-
nvdebug(occurrenceNumbers.join(' -- '));
|
|
475
|
+
//nvdebug(occurrenceNumbers.join(' -- '), debugDev);
|
|
478
476
|
|
|
479
477
|
const relevantFields = candidateFields.filter(f => occurrenceNumbers.some(o => fieldHasOccurrenceNumber(f, o)));
|
|
480
|
-
nvdebug(`${fieldToString(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}
|
|
481
|
-
relevantFields.forEach(f => nvdebug(fieldToString(f)));
|
|
478
|
+
//nvdebug(`${fieldToString(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`, debugDev);
|
|
479
|
+
//relevantFields.forEach(f => nvdebug(fieldToString(f), debugDev));
|
|
482
480
|
return relevantFields;
|
|
483
481
|
}
|
|
484
482
|
|
|
@@ -488,6 +486,6 @@ export function resetSubfield6Tag(subfield, tag) {
|
|
|
488
486
|
}
|
|
489
487
|
// NB! mainly for 1XX<->7XX transfers
|
|
490
488
|
const newValue = `${tag}-${subfield.value.substring(4)}`;
|
|
491
|
-
nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`,
|
|
489
|
+
//nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`, debugDevDev);
|
|
492
490
|
subfield.value = newValue;
|
|
493
491
|
}
|