@natlibfi/marc-record-validators-melinda 11.6.6 → 11.6.7-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/melinda-node-tests.yml +1 -1
- package/dist/access-rights.js +1 -5
- package/dist/access-rights.js.map +1 -1
- package/dist/addMissingField336.js +1 -1
- package/dist/addMissingField336.js.map +1 -1
- package/dist/cyrillux-usemarcon-replacement.js +41 -45
- package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
- package/dist/cyrillux.js +13 -17
- package/dist/cyrillux.js.map +1 -1
- package/dist/disambiguateSeriesStatements.js +3 -4
- package/dist/disambiguateSeriesStatements.js.map +1 -1
- package/dist/double-commas.js +2 -1
- package/dist/double-commas.js.map +1 -1
- package/dist/duplicates-ind1.js +1 -1
- package/dist/duplicates-ind1.js.map +1 -1
- package/dist/empty-fields.js +0 -4
- package/dist/empty-fields.js.map +1 -1
- package/dist/ending-punctuation.js +21 -49
- package/dist/ending-punctuation.js.map +1 -1
- package/dist/ending-whitespace.js +0 -4
- package/dist/ending-whitespace.js.map +1 -1
- package/dist/field-008-18-34-character-groups.js +4 -5
- package/dist/field-008-18-34-character-groups.js.map +1 -1
- package/dist/field-505-separators.js +8 -6
- package/dist/field-505-separators.js.map +1 -1
- package/dist/field-521-fix.js +5 -6
- package/dist/field-521-fix.js.map +1 -1
- package/dist/field-exclusion.js +5 -12
- package/dist/field-exclusion.js.map +1 -1
- package/dist/field-exclusion.spec.js +3 -5
- package/dist/field-exclusion.spec.js.map +1 -1
- package/dist/field-structure.js +2 -5
- package/dist/field-structure.js.map +1 -1
- package/dist/fields-present.js +1 -1
- package/dist/fields-present.js.map +1 -1
- package/dist/fields-present.spec.js +1 -1
- package/dist/fields-present.spec.js.map +1 -1
- package/dist/fix-33X.js +5 -6
- package/dist/fix-33X.js.map +1 -1
- package/dist/fix-country-codes.js +3 -4
- package/dist/fix-country-codes.js.map +1 -1
- package/dist/fix-language-codes.js +12 -9
- package/dist/fix-language-codes.js.map +1 -1
- package/dist/fixRelatorTerms.js +8 -8
- package/dist/fixRelatorTerms.js.map +1 -1
- package/dist/fixed-fields.js +1 -4
- package/dist/fixed-fields.js.map +1 -1
- package/dist/identical-fields.js +2 -3
- package/dist/identical-fields.js.map +1 -1
- package/dist/indicator-fixes.js +14 -15
- package/dist/indicator-fixes.js.map +1 -1
- package/dist/isbn-issn.js +8 -11
- package/dist/isbn-issn.js.map +1 -1
- package/dist/item-language.js +5 -12
- package/dist/item-language.js.map +1 -1
- package/dist/merge-fields/counterpartField.js +6 -8
- package/dist/merge-fields/counterpartField.js.map +1 -1
- package/dist/merge-fields/index.js +3 -3
- package/dist/merge-fields/index.js.map +1 -1
- package/dist/merge-fields/mergeConstraints.js +0 -1
- package/dist/merge-fields/mergeConstraints.js.map +1 -1
- package/dist/merge-fields/mergeField.js +12 -18
- package/dist/merge-fields/mergeField.js.map +1 -1
- package/dist/merge-fields/mergeIndicator.js +5 -5
- package/dist/merge-fields/mergeIndicator.js.map +1 -1
- package/dist/merge-fields/mergeOrAddPostprocess.js +6 -9
- package/dist/merge-fields/mergeOrAddPostprocess.js.map +1 -1
- package/dist/merge-fields/mergeOrAddSubfield.js +6 -8
- package/dist/merge-fields/mergeOrAddSubfield.js.map +1 -1
- package/dist/merge-fields/mergeSubfield.js +8 -8
- package/dist/merge-fields/mergeSubfield.js.map +1 -1
- package/dist/merge-fields/removeDuplicateSubfields.js +1 -2
- package/dist/merge-fields/removeDuplicateSubfields.js.map +1 -1
- package/dist/merge-fields/worldKnowledge.js +1 -1
- package/dist/merge-fields/worldKnowledge.js.map +1 -1
- package/dist/mergeField500Lisapainokset.js +0 -3
- package/dist/mergeField500Lisapainokset.js.map +1 -1
- package/dist/mergeRelatorTermFields.js +3 -3
- package/dist/mergeRelatorTermFields.js.map +1 -1
- package/dist/modernize-502.js +6 -6
- package/dist/modernize-502.js.map +1 -1
- package/dist/multiple-subfield-0.js +4 -4
- package/dist/multiple-subfield-0.js.map +1 -1
- package/dist/non-breaking-space.js +0 -4
- package/dist/non-breaking-space.js.map +1 -1
- package/dist/normalize-dashes.js +5 -4
- package/dist/normalize-dashes.js.map +1 -1
- package/dist/normalize-identifiers.js +6 -6
- package/dist/normalize-identifiers.js.map +1 -1
- package/dist/normalize-qualifying-information.js +4 -4
- package/dist/normalize-qualifying-information.js.map +1 -1
- package/dist/normalize-utf8-diacritics.js +7 -7
- package/dist/normalize-utf8-diacritics.js.map +1 -1
- package/dist/normalizeFieldForComparison.js +21 -20
- package/dist/normalizeFieldForComparison.js.map +1 -1
- package/dist/normalizeSubfieldValueForComparison.js +1 -2
- package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
- package/dist/prepublicationUtils.js +3 -3
- package/dist/prepublicationUtils.js.map +1 -1
- package/dist/punctuation/index.js +14 -31
- package/dist/punctuation/index.js.map +1 -1
- package/dist/punctuation2.js +9 -10
- package/dist/punctuation2.js.map +1 -1
- package/dist/reindexSubfield6OccurenceNumbers.js +8 -9
- package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
- package/dist/removeDuplicateDataFields.js +18 -20
- package/dist/removeDuplicateDataFields.js.map +1 -1
- package/dist/removeInferiorDataFields.js +16 -19
- package/dist/removeInferiorDataFields.js.map +1 -1
- package/dist/resolvable-ext-references-melinda.js +4 -8
- package/dist/resolvable-ext-references-melinda.js.map +1 -1
- package/dist/resolveOrphanedSubfield6s.js +9 -9
- package/dist/resolveOrphanedSubfield6s.js.map +1 -1
- package/dist/sanitize-vocabulary-source-codes.js +9 -9
- package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
- package/dist/sort-tags.js +2 -2
- package/dist/sort-tags.js.map +1 -1
- package/dist/sortFields.js +4 -9
- package/dist/sortFields.js.map +1 -1
- package/dist/sortRelatorTerms.js +4 -5
- package/dist/sortRelatorTerms.js.map +1 -1
- package/dist/sortSubfields.js +5 -6
- package/dist/sortSubfields.js.map +1 -1
- package/dist/stripPunctuation.js +2 -2
- package/dist/stripPunctuation.js.map +1 -1
- package/dist/subfield-exclusion.js +4 -11
- package/dist/subfield-exclusion.js.map +1 -1
- package/dist/subfield6Utils.js +12 -11
- package/dist/subfield6Utils.js.map +1 -1
- package/dist/subfield8Utils.js +8 -9
- package/dist/subfield8Utils.js.map +1 -1
- package/dist/subfieldValueNormalizations.js +5 -8
- package/dist/subfieldValueNormalizations.js.map +1 -1
- package/dist/sync-007-and-300.js +8 -8
- package/dist/sync-007-and-300.js.map +1 -1
- package/dist/translate-terms.js +5 -6
- package/dist/translate-terms.js.map +1 -1
- package/dist/typeOfDate-008.js +3 -4
- package/dist/typeOfDate-008.js.map +1 -1
- package/dist/unicode-decomposition.js +1 -1
- package/dist/unicode-decomposition.js.map +1 -1
- package/dist/update-field-540.js +5 -6
- package/dist/update-field-540.js.map +1 -1
- package/dist/urn.js +4 -9
- package/dist/urn.js.map +1 -1
- package/dist/utils.js +5 -9
- package/dist/utils.js.map +1 -1
- package/eslint.config.mjs +53 -0
- package/package.json +12 -13
- package/src/access-rights.js +4 -4
- package/src/addMissingField336.js +1 -1
- package/src/cyrillux-usemarcon-replacement.js +38 -38
- package/src/cyrillux.js +14 -14
- package/src/disambiguateSeriesStatements.js +3 -3
- package/src/double-commas.js +2 -2
- package/src/duplicates-ind1.js +1 -1
- package/src/empty-fields.js +4 -4
- package/src/ending-punctuation.js +46 -49
- package/src/ending-whitespace.js +0 -2
- package/src/field-008-18-34-character-groups.js +5 -5
- package/src/field-505-separators.js +6 -6
- package/src/field-521-fix.js +6 -6
- package/src/field-exclusion.js +12 -12
- package/src/field-exclusion.spec.js +4 -4
- package/src/field-structure.js +5 -5
- package/src/fields-present.js +1 -1
- package/src/fields-present.spec.js +1 -1
- package/src/fix-33X.js +5 -5
- package/src/fix-country-codes.js +3 -3
- package/src/fix-language-codes.js +10 -9
- package/src/fixRelatorTerms.js +8 -8
- package/src/fixed-fields.js +3 -3
- package/src/identical-fields.js +3 -3
- package/src/indicator-fixes.js +15 -15
- package/src/isbn-issn.js +11 -11
- package/src/item-language.js +10 -10
- package/src/merge-fields/counterpartField.js +7 -7
- package/src/merge-fields/index.js +3 -3
- package/src/merge-fields/mergeConstraints.js +1 -1
- package/src/merge-fields/mergeField.js +16 -17
- package/src/merge-fields/mergeIndicator.js +5 -5
- package/src/merge-fields/mergeOrAddPostprocess.js +9 -9
- package/src/merge-fields/mergeOrAddSubfield.js +6 -6
- package/src/merge-fields/mergeSubfield.js +8 -8
- package/src/merge-fields/removeDuplicateSubfields.js +1 -2
- package/src/merge-fields/worldKnowledge.js +1 -1
- package/src/mergeField500Lisapainokset.js +0 -2
- package/src/mergeRelatorTermFields.js +3 -3
- package/src/modernize-502.js +6 -6
- package/src/multiple-subfield-0.js +4 -4
- package/src/non-breaking-space.js +0 -2
- package/src/normalize-dashes.js +4 -4
- package/src/normalize-identifiers.js +6 -6
- package/src/normalize-qualifying-information.js +4 -4
- package/src/normalize-utf8-diacritics.js +7 -7
- package/src/normalizeFieldForComparison.js +20 -20
- package/src/normalizeSubfieldValueForComparison.js +1 -1
- package/src/prepublicationUtils.js +3 -3
- package/src/punctuation/index.js +29 -29
- package/src/punctuation2.js +10 -10
- package/src/reindexSubfield6OccurenceNumbers.js +9 -9
- package/src/removeDuplicateDataFields.js +21 -23
- package/src/removeInferiorDataFields.js +19 -19
- package/src/resolvable-ext-references-melinda.js +8 -8
- package/src/resolveOrphanedSubfield6s.js +9 -9
- package/src/sanitize-vocabulary-source-codes.js +8 -8
- package/src/sort-tags.js +2 -2
- package/src/sortFields.js +6 -6
- package/src/sortRelatorTerms.js +5 -5
- package/src/sortSubfields.js +6 -6
- package/src/stripPunctuation.js +2 -2
- package/src/subfield-exclusion.js +11 -11
- package/src/subfield6Utils.js +11 -11
- package/src/subfield8Utils.js +6 -9
- package/src/subfieldValueNormalizations.js +5 -7
- package/src/sync-007-and-300.js +8 -8
- package/src/translate-terms.js +3 -5
- package/src/typeOfDate-008.js +3 -3
- package/src/unicode-decomposition.js +1 -1
- package/src/update-field-540.js +6 -6
- package/src/urn.js +8 -6
- package/src/utils.js +8 -8
- package/.eslintignore +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sortSubfields.js","names":["_clone","_interopRequireDefault","require","_debug","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","defaultSortOrderStringFinns","defaultSortOrderStringOthers","defaultSortOrderFinns","split","defaultSortOrderOthers","_default","defaultTagPattern","description","validate","fix","getRelevantFields","record","tagPattern","datafields","fields","filter","f","subfields","regexp","RegExp","test","tag","res","message","valid","relevantFields","forEach","field","sortAdjacentSubfields","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","sortOrderForX00","sortOrderForX10","sortOrderForX11","sortOrderFor7XX","sortOrderFor246","subfieldSortOrder","getSubfieldSortOrder","entry","currEntry","sortOrder","nvdebug","swapSubfields","loopAgain","some","sf","index","currPos","getPosition","prevPos","tmp","subfield","indexOf","code","includes","value","twoBeforeZero","sf2","moveSubfield6ToTheFront","sf6s","others","externalSortOrder","finnishWay","controlSubfieldOrder","sortOrderForField","defaultSortOrder","subfieldOrder"],"sources":["../src/sortSubfields.js"],"sourcesContent":["// Author(s): Nicholas Volk\n\nimport clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst defaultSortOrderStringFinns = '8673abcdefghijklmnopqrstuvwxyz420159'; // NB! We Finns like $2 before $0 in 6XX...\nconst defaultSortOrderStringOthers = '8673abcdefghijklmnopqrstuvwxyz402159';\n\nconst defaultSortOrderFinns = defaultSortOrderStringFinns.split('');\nconst defaultSortOrderOthers = defaultSortOrderStringOthers.split('');\n\n\nexport default function (defaultTagPattern) {\n\n return {\n description: 'Swap adjacent subfields',\n validate, fix\n };\n\n function getRelevantFields(record, tagPattern) {\n const datafields = record.fields.filter(f => f.subfields);\n if (!tagPattern) {\n return datafields;\n }\n\n const regexp = new RegExp(tagPattern, 'u');\n return datafields.filter(f => regexp.test(f.tag));\n }\n\n function fix(record, tagPattern = defaultTagPattern) {\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n sortAdjacentSubfields(field);\n });\n\n return res;\n }\n\n function validate(record, tagPattern = defaultTagPattern) {\n const res = {message: []};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentSubfields(clonedField);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(clonedFieldAsString); // eslint-disable-line functional/immutable-data\n }\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\n// X00, X10, X11 and X130 could also for their own sets...\n// (ouch! sometimes $c comes after $d...): LoC: 100 0# ‡a Black Foot, ‡c Chief, ‡d d. 1877 ‡c (Spirit)\nconst sortOrderForX00 = ['i', 'a', 'b', 'q', 'c', 'd', 'e', 't', 'u', 'l', 'f', 'x', 'y', 'z', '0', '5', '9']; // skip $g. Can't remember why, though...\nconst sortOrderForX10 = ['i', 'a', 'b', 't', 'n', 'c', 'e', 'v', 'w', 'x', 'y', 'z', '0', '5', '9']; // somewhat iffy\nconst sortOrderForX11 = ['a', 'n', 'd', 'c', 'e', 'g', 'j', '0', '5', '9'];\nconst sortOrderFor7XX = ['8', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w'];\nconst sortOrderFor246 = ['i', 'a', 'b', 'n', 'p', 'f', '5', '9']; // Used by field 946 as well\n\n// List *only* exceptional order here. Otherwise default order is used.\nconst subfieldSortOrder = [\n {'tag': '017', 'sortOrder': ['i', 'a', 'b', 'd']},\n {'tag': '028', 'sortOrder': ['b', 'a', 'q']}, // National convention\n //{'tag': '031', 'sortOrder': ['a', 'b', 'c', 'm', 'e', 'd']}, // utter guesswork\n {'tag': '040', 'sortOrder': ['8', 'a', 'b', 'e', 'c', 'd', 'x']},\n {'tag': '041', 'sortOrder': ['8', 'a', 'd', 'j', 'p', 'h', 'e', 'g', 'm']}, // guesswork\n {'tag': '048', 'sortOrder': ['8', 'b', 'a']},\n {'tag': '100', 'sortOrder': sortOrderForX00},\n {'tag': '110', 'sortOrder': sortOrderForX10},\n {'tag': '111', 'sortOrder': sortOrderForX11},\n {'tag': '130', 'sortOrder': ['a', 'n', 'p', 'k', 'l']},\n {'tag': '240', 'sortOrder': ['a', 'm', 'n', 'p', 's', 'l', '2', '0', '1', '5', '9']},\n {'tag': '245', 'sortOrder': ['a', 'b', 'n', 'p', 'k', 'f', 'c']},\n {'tag': '246', 'sortOrder': sortOrderFor246},\n {'tag': '382', 'sortOrder': ['a']},\n {'tag': '385', 'sortOrder': ['8', 'm', 'n', 'a', '2', '0']},\n {'tag': '386', 'sortOrder': ['8', 'm', 'n', 'a']},\n {'tag': '490', 'sortOrder': ['a', 'x', 'y', 'v', 'l']},\n {'tag': '505', 'sortOrder': ['a']},\n {'tag': '526', 'sortOrder': ['i', 'a', 'b', 'x', 'z']},\n {'tag': '534', 'sortOrder': ['3', 'p', 'a', 't', 'l', 'c', 'f', 'b', 'e', 'o', 'x', 'z']},\n {'tag': '540', 'sortOrder': ['a', 'b', 'c', 'd', 'f', '2', 'u']},\n {'tag': '600', 'sortOrder': sortOrderForX00},\n {'tag': '610', 'sortOrder': sortOrderForX10},\n {'tag': '611', 'sortOrder': sortOrderForX11},\n {'tag': '650', 'sortOrder': ['a', 'x', 'y', 'z']},\n {'tag': '700', 'sortOrder': sortOrderForX00},\n {'tag': '710', 'sortOrder': sortOrderForX10},\n {'tag': '711', 'sortOrder': sortOrderForX11},\n {'tag': '760', 'sortOrder': sortOrderFor7XX},\n {'tag': '762', 'sortOrder': sortOrderFor7XX},\n {'tag': '765', 'sortOrder': sortOrderFor7XX},\n {'tag': '767', 'sortOrder': sortOrderFor7XX},\n {'tag': '770', 'sortOrder': sortOrderFor7XX},\n {'tag': '772', 'sortOrder': sortOrderFor7XX},\n {'tag': '773', 'sortOrder': sortOrderFor7XX},\n {'tag': '774', 'sortOrder': sortOrderFor7XX},\n {'tag': '775', 'sortOrder': sortOrderFor7XX},\n {'tag': '776', 'sortOrder': sortOrderFor7XX},\n {'tag': '777', 'sortOrder': sortOrderFor7XX},\n {'tag': '780', 'sortOrder': sortOrderFor7XX},\n {'tag': '785', 'sortOrder': sortOrderFor7XX},\n {'tag': '786', 'sortOrder': sortOrderFor7XX},\n {'tag': '787', 'sortOrder': sortOrderFor7XX},\n {'tag': '788', 'sortOrder': sortOrderFor7XX},\n {'tag': '800', 'sortOrder': sortOrderForX00},\n {'tag': '810', 'sortOrder': sortOrderForX10},\n {'tag': '811', 'sortOrder': sortOrderForX11},\n {'tag': '830', 'sortOrder': ['a', 'n', 'x', 'v']}, // INCOMPLETE, SAME AS 490? APPARENTLY NOT...\n {'tag': '856', 'sortOrder': ['3', 'u', 'q', 'x', 'y', 'z', '5']}, // incomplete, LoC examples are inconclusive\n {'tag': '880', 'sortOrder': ['a']},\n {'tag': '946', 'sortOrder': sortOrderFor246},\n {'tag': 'LOW', 'sortOrder': ['a', 'b', 'c', 'l', 'h']},\n {'tag': 'SID', 'sortOrder': ['c', 'b']} // Hack, so that default order is not used\n];\n\nfunction getSubfieldSortOrder(field) {\n const entry = subfieldSortOrder.filter(currEntry => field.tag === currEntry.tag);\n if (entry.length > 0 && 'sortOrder' in entry[0]) {\n debugDev(`sort order for ${field.tag}: ${entry[0].sortOrder}`);\n return entry[0].sortOrder;\n }\n nvdebug(`WARNING!\\tNo subfield order found for ${field.tag}.`);\n return [];\n}\n\n\nfunction swapSubfields(field, sortOrder) {\n if (!field.subfields) {\n return;\n }\n\n const loopAgain = field.subfields.some((sf, index) => {\n if (index === 0) {\n return false;\n }\n const currPos = getPosition(sf, sortOrder);\n const prevPos = getPosition(field.subfields[index - 1], sortOrder);\n if (currPos === -1 || prevPos === -1 || currPos >= prevPos) {\n return false;\n }\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = sf; // eslint-disable-line functional/immutable-data\n field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data\n return true;\n });\n\n if (loopAgain) {\n return swapSubfields(field, sortOrder);\n }\n\n return;\n\n function getPosition(subfield, sortOrder) {\n // Magic exception that *always* comes first, used by Aleph in linking overlong fields\n if (sortOrder.indexOf('9') > -1 && subfield.code === '9' && ['^', '^^'].includes(subfield.value)) {\n return -0.5; // normal \"best value\" is 0, and \"worst value\" is N\n }\n return sortOrder.indexOf(subfield.code);\n }\n}\n\n\nfunction twoBeforeZero(field) {\n const sf2 = field.subfields.filter(sf => sf.code === '2');\n if (sf2.length !== 1) {\n return true; // both true and false are ok here\n }\n // MRA-465: gcipplatform (field 753)\n // rdasco (344), creatorbio (353), gbd (668), lsch (eg. 385)\n if (['creatorbio', 'gbd', 'gcipplatform', 'lscsh', 'rdasco'].includes(sf2[0].value)) {\n return false;\n }\n return true;\n}\n\nfunction moveSubfield6ToTheFront(field) {\n // https://www.loc.gov/marc/bibliographic/ecbdcntf.html says \"Subfield $6 is always the first subfield in the field.\"\n const sf6s = field.subfields.filter(sf => sf.code === '6');\n const others = field.subfields.filter(sf => sf.code !== '6');\n field.subfields = [...sf6s, ...others]; // eslint-disable-line functional/immutable-data\n}\n\nexport function sortAdjacentSubfields(field, externalSortOrder = []) {\n if (!field.subfields) {\n return field;\n }\n\n moveSubfield6ToTheFront(field); // specs: \"Subfield $6 is always the first subfield in the field.\"\n\n // Features:\n // - Swap only sort adjacent pairs.\n // - No sorting over unlisted subfield codes. Thus a given subfield can not shift to wrong side of 700$t...\n\n // Implement: 880 field should use values from $6...\n\n // Should we support multiple sort orders per field?\n\n // Try to handle control subfield order. This is not 100% fool proof. Control subfields are pretty stable, though.\n // However, there are exceptions (eg. $9 ^^ comes first and $2 $0 is a Finnish convention...)\n\n\n const finnishWay = twoBeforeZero(field);\n const controlSubfieldOrder = finnishWay ? ['8', '7', '3', 'a', '4', '2', '0', '1', '5', '9'] : ['8', '7', '3', 'a', '4', '0', '2', '1', '5', '9'];\n swapSubfields(field, controlSubfieldOrder);\n\n const sortOrderForField = externalSortOrder.length > 0 ? externalSortOrder : getSubfieldSortOrder(field);\n //nvdebug(`INTERMEDIATE SUBFIELD ORDER FOR ${field.tag}: ${sortOrderForField.join(', ')}`);\n\n const defaultSortOrder = finnishWay ? defaultSortOrderFinns : defaultSortOrderOthers; // $2 vs $0\n const subfieldOrder = sortOrderForField.length > 0 ? sortOrderForField : defaultSortOrder;\n //nvdebug(`FINAL SUBFIELD ORDER (FINNISH=${finnishWay}) FOR ${field.tag}: ${subfieldOrder.join(', ')}`);\n //if (sortOrder === null) { return field; } //// Currently always sort..\n //nvdebug(`IN: ${fieldToString(field)}`);\n swapSubfields(field, subfieldOrder);\n //nvdebug(`OUT: ${fieldToString(field)}`);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"sortSubfields.js","names":["_clone","_interopRequireDefault","require","_debug","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","defaultSortOrderStringFinns","defaultSortOrderStringOthers","defaultSortOrderFinns","split","defaultSortOrderOthers","_default","defaultTagPattern","description","validate","fix","getRelevantFields","record","tagPattern","datafields","fields","filter","f","subfields","regexp","RegExp","test","tag","res","message","valid","relevantFields","forEach","field","sortAdjacentSubfields","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","sortOrderForX00","sortOrderForX10","sortOrderForX11","sortOrderFor7XX","sortOrderFor246","subfieldSortOrder","getSubfieldSortOrder","entry","currEntry","sortOrder","nvdebug","swapSubfields","loopAgain","some","sf","index","currPos","getPosition","prevPos","tmp","subfield","indexOf","code","includes","value","twoBeforeZero","sf2","moveSubfield6ToTheFront","sf6s","others","externalSortOrder","finnishWay","controlSubfieldOrder","sortOrderForField","defaultSortOrder","subfieldOrder"],"sources":["../src/sortSubfields.js"],"sourcesContent":["// Author(s): Nicholas Volk\n\nimport clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst defaultSortOrderStringFinns = '8673abcdefghijklmnopqrstuvwxyz420159'; // NB! We Finns like $2 before $0 in 6XX...\nconst defaultSortOrderStringOthers = '8673abcdefghijklmnopqrstuvwxyz402159';\n\nconst defaultSortOrderFinns = defaultSortOrderStringFinns.split('');\nconst defaultSortOrderOthers = defaultSortOrderStringOthers.split('');\n\n\nexport default function (defaultTagPattern) {\n\n return {\n description: 'Swap adjacent subfields',\n validate, fix\n };\n\n function getRelevantFields(record, tagPattern) {\n const datafields = record.fields.filter(f => f.subfields);\n if (!tagPattern) {\n return datafields;\n }\n\n const regexp = new RegExp(tagPattern, 'u');\n return datafields.filter(f => regexp.test(f.tag));\n }\n\n function fix(record, tagPattern = defaultTagPattern) {\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n sortAdjacentSubfields(field);\n });\n\n return res;\n }\n\n function validate(record, tagPattern = defaultTagPattern) {\n const res = {message: []};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentSubfields(clonedField);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) {\n res.message.push(clonedFieldAsString);\n }\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\n\n// X00, X10, X11 and X130 could also for their own sets...\n// (ouch! sometimes $c comes after $d...): LoC: 100 0# ‡a Black Foot, ‡c Chief, ‡d d. 1877 ‡c (Spirit)\nconst sortOrderForX00 = ['i', 'a', 'b', 'q', 'c', 'd', 'e', 't', 'u', 'l', 'f', 'x', 'y', 'z', '0', '5', '9']; // skip $g. Can't remember why, though...\nconst sortOrderForX10 = ['i', 'a', 'b', 't', 'n', 'c', 'e', 'v', 'w', 'x', 'y', 'z', '0', '5', '9']; // somewhat iffy\nconst sortOrderForX11 = ['a', 'n', 'd', 'c', 'e', 'g', 'j', '0', '5', '9'];\nconst sortOrderFor7XX = ['8', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w'];\nconst sortOrderFor246 = ['i', 'a', 'b', 'n', 'p', 'f', '5', '9']; // Used by field 946 as well\n\n// List *only* exceptional order here. Otherwise default order is used.\nconst subfieldSortOrder = [\n {'tag': '017', 'sortOrder': ['i', 'a', 'b', 'd']},\n {'tag': '028', 'sortOrder': ['b', 'a', 'q']}, // National convention\n //{'tag': '031', 'sortOrder': ['a', 'b', 'c', 'm', 'e', 'd']}, // utter guesswork\n {'tag': '040', 'sortOrder': ['8', 'a', 'b', 'e', 'c', 'd', 'x']},\n {'tag': '041', 'sortOrder': ['8', 'a', 'd', 'j', 'p', 'h', 'e', 'g', 'm']}, // guesswork\n {'tag': '048', 'sortOrder': ['8', 'b', 'a']},\n {'tag': '100', 'sortOrder': sortOrderForX00},\n {'tag': '110', 'sortOrder': sortOrderForX10},\n {'tag': '111', 'sortOrder': sortOrderForX11},\n {'tag': '130', 'sortOrder': ['a', 'n', 'p', 'k', 'l']},\n {'tag': '240', 'sortOrder': ['a', 'm', 'n', 'p', 's', 'l', '2', '0', '1', '5', '9']},\n {'tag': '245', 'sortOrder': ['a', 'b', 'n', 'p', 'k', 'f', 'c']},\n {'tag': '246', 'sortOrder': sortOrderFor246},\n {'tag': '382', 'sortOrder': ['a']},\n {'tag': '385', 'sortOrder': ['8', 'm', 'n', 'a', '2', '0']},\n {'tag': '386', 'sortOrder': ['8', 'm', 'n', 'a']},\n {'tag': '490', 'sortOrder': ['a', 'x', 'y', 'v', 'l']},\n {'tag': '505', 'sortOrder': ['a']},\n {'tag': '526', 'sortOrder': ['i', 'a', 'b', 'x', 'z']},\n {'tag': '534', 'sortOrder': ['3', 'p', 'a', 't', 'l', 'c', 'f', 'b', 'e', 'o', 'x', 'z']},\n {'tag': '540', 'sortOrder': ['a', 'b', 'c', 'd', 'f', '2', 'u']},\n {'tag': '600', 'sortOrder': sortOrderForX00},\n {'tag': '610', 'sortOrder': sortOrderForX10},\n {'tag': '611', 'sortOrder': sortOrderForX11},\n {'tag': '650', 'sortOrder': ['a', 'x', 'y', 'z']},\n {'tag': '700', 'sortOrder': sortOrderForX00},\n {'tag': '710', 'sortOrder': sortOrderForX10},\n {'tag': '711', 'sortOrder': sortOrderForX11},\n {'tag': '760', 'sortOrder': sortOrderFor7XX},\n {'tag': '762', 'sortOrder': sortOrderFor7XX},\n {'tag': '765', 'sortOrder': sortOrderFor7XX},\n {'tag': '767', 'sortOrder': sortOrderFor7XX},\n {'tag': '770', 'sortOrder': sortOrderFor7XX},\n {'tag': '772', 'sortOrder': sortOrderFor7XX},\n {'tag': '773', 'sortOrder': sortOrderFor7XX},\n {'tag': '774', 'sortOrder': sortOrderFor7XX},\n {'tag': '775', 'sortOrder': sortOrderFor7XX},\n {'tag': '776', 'sortOrder': sortOrderFor7XX},\n {'tag': '777', 'sortOrder': sortOrderFor7XX},\n {'tag': '780', 'sortOrder': sortOrderFor7XX},\n {'tag': '785', 'sortOrder': sortOrderFor7XX},\n {'tag': '786', 'sortOrder': sortOrderFor7XX},\n {'tag': '787', 'sortOrder': sortOrderFor7XX},\n {'tag': '788', 'sortOrder': sortOrderFor7XX},\n {'tag': '800', 'sortOrder': sortOrderForX00},\n {'tag': '810', 'sortOrder': sortOrderForX10},\n {'tag': '811', 'sortOrder': sortOrderForX11},\n {'tag': '830', 'sortOrder': ['a', 'n', 'x', 'v']}, // INCOMPLETE, SAME AS 490? APPARENTLY NOT...\n {'tag': '856', 'sortOrder': ['3', 'u', 'q', 'x', 'y', 'z', '5']}, // incomplete, LoC examples are inconclusive\n {'tag': '880', 'sortOrder': ['a']},\n {'tag': '946', 'sortOrder': sortOrderFor246},\n {'tag': 'LOW', 'sortOrder': ['a', 'b', 'c', 'l', 'h']},\n {'tag': 'SID', 'sortOrder': ['c', 'b']} // Hack, so that default order is not used\n];\n\nfunction getSubfieldSortOrder(field) {\n const entry = subfieldSortOrder.filter(currEntry => field.tag === currEntry.tag);\n if (entry.length > 0 && 'sortOrder' in entry[0]) {\n debugDev(`sort order for ${field.tag}: ${entry[0].sortOrder}`);\n return entry[0].sortOrder;\n }\n nvdebug(`WARNING!\\tNo subfield order found for ${field.tag}.`);\n return [];\n}\n\n\nfunction swapSubfields(field, sortOrder) {\n if (!field.subfields) {\n return;\n }\n\n const loopAgain = field.subfields.some((sf, index) => {\n if (index === 0) {\n return false;\n }\n const currPos = getPosition(sf, sortOrder);\n const prevPos = getPosition(field.subfields[index - 1], sortOrder);\n if (currPos === -1 || prevPos === -1 || currPos >= prevPos) {\n return false;\n }\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = sf;\n field.subfields[index] = tmp;\n return true;\n });\n\n if (loopAgain) {\n return swapSubfields(field, sortOrder);\n }\n\n return;\n\n function getPosition(subfield, sortOrder) {\n // Magic exception that *always* comes first, used by Aleph in linking overlong fields\n if (sortOrder.indexOf('9') > -1 && subfield.code === '9' && ['^', '^^'].includes(subfield.value)) {\n return -0.5; // normal \"best value\" is 0, and \"worst value\" is N\n }\n return sortOrder.indexOf(subfield.code);\n }\n}\n\n\nfunction twoBeforeZero(field) {\n const sf2 = field.subfields.filter(sf => sf.code === '2');\n if (sf2.length !== 1) {\n return true; // both true and false are ok here\n }\n // MRA-465: gcipplatform (field 753)\n // rdasco (344), creatorbio (353), gbd (668), lsch (eg. 385)\n if (['creatorbio', 'gbd', 'gcipplatform', 'lscsh', 'rdasco'].includes(sf2[0].value)) {\n return false;\n }\n return true;\n}\n\nfunction moveSubfield6ToTheFront(field) {\n // https://www.loc.gov/marc/bibliographic/ecbdcntf.html says \"Subfield $6 is always the first subfield in the field.\"\n const sf6s = field.subfields.filter(sf => sf.code === '6');\n const others = field.subfields.filter(sf => sf.code !== '6');\n field.subfields = [...sf6s, ...others];\n}\n\nexport function sortAdjacentSubfields(field, externalSortOrder = []) {\n if (!field.subfields) {\n return field;\n }\n\n moveSubfield6ToTheFront(field); // specs: \"Subfield $6 is always the first subfield in the field.\"\n\n // Features:\n // - Swap only sort adjacent pairs.\n // - No sorting over unlisted subfield codes. Thus a given subfield can not shift to wrong side of 700$t...\n\n // Implement: 880 field should use values from $6...\n\n // Should we support multiple sort orders per field?\n\n // Try to handle control subfield order. This is not 100% fool proof. Control subfields are pretty stable, though.\n // However, there are exceptions (eg. $9 ^^ comes first and $2 $0 is a Finnish convention...)\n\n\n const finnishWay = twoBeforeZero(field);\n const controlSubfieldOrder = finnishWay ? ['8', '7', '3', 'a', '4', '2', '0', '1', '5', '9'] : ['8', '7', '3', 'a', '4', '0', '2', '1', '5', '9'];\n swapSubfields(field, controlSubfieldOrder);\n\n const sortOrderForField = externalSortOrder.length > 0 ? externalSortOrder : getSubfieldSortOrder(field);\n //nvdebug(`INTERMEDIATE SUBFIELD ORDER FOR ${field.tag}: ${sortOrderForField.join(', ')}`);\n\n const defaultSortOrder = finnishWay ? defaultSortOrderFinns : defaultSortOrderOthers; // $2 vs $0\n const subfieldOrder = sortOrderForField.length > 0 ? sortOrderForField : defaultSortOrder;\n //nvdebug(`FINAL SUBFIELD ORDER (FINNISH=${finnishWay}) FOR ${field.tag}: ${subfieldOrder.join(', ')}`);\n //if (sortOrder === null) { return field; } //// Currently always sort..\n //nvdebug(`IN: ${fieldToString(field)}`);\n swapSubfields(field, subfieldOrder);\n //nvdebug(`OUT: ${fieldToString(field)}`);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
|
package/dist/stripPunctuation.js
CHANGED
|
@@ -30,7 +30,7 @@ function _default() {
|
|
|
30
30
|
fix: [],
|
|
31
31
|
valid: true
|
|
32
32
|
};
|
|
33
|
-
record.fields.forEach(f => (0, _punctuation.fieldStripPunctuation)(f));
|
|
33
|
+
record.fields.forEach(f => (0, _punctuation.fieldStripPunctuation)(f)); // eslint-disable-line array-callback-return
|
|
34
34
|
return res;
|
|
35
35
|
}
|
|
36
36
|
function validate(record) {
|
|
@@ -42,7 +42,7 @@ function _default() {
|
|
|
42
42
|
const res = {
|
|
43
43
|
message: messages
|
|
44
44
|
};
|
|
45
|
-
res.valid = res.message.length < 1;
|
|
45
|
+
res.valid = res.message.length < 1;
|
|
46
46
|
return res;
|
|
47
47
|
}
|
|
48
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stripPunctuation.js","names":["_punctuation","require","_utils","_default","description","validate","fix","record","nvdebug","res","message","valid","fields","forEach","f","fieldStripPunctuation","fieldsNeedingModification","filter","fieldNeedsModification","values","map","fieldToString","newValues","fieldGetFixedString","messages","val","i","length"],"sources":["../src/stripPunctuation.js"],"sourcesContent":["/*\n* stripPunctuation.js -- try and remove a marc field punctuation (based on and reverse of punctuation2.js)\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n*/\n\nimport {fieldGetFixedString, fieldNeedsModification, fieldStripPunctuation} from './punctuation2';\n// import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');\n\nexport default function () {\n return {\n description: 'Strip punctuation to data fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Strip punctuation to data fields: fixer');\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fieldStripPunctuation(f))
|
|
1
|
+
{"version":3,"file":"stripPunctuation.js","names":["_punctuation","require","_utils","_default","description","validate","fix","record","nvdebug","res","message","valid","fields","forEach","f","fieldStripPunctuation","fieldsNeedingModification","filter","fieldNeedsModification","values","map","fieldToString","newValues","fieldGetFixedString","messages","val","i","length"],"sources":["../src/stripPunctuation.js"],"sourcesContent":["/*\n* stripPunctuation.js -- try and remove a marc field punctuation (based on and reverse of punctuation2.js)\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n*/\n\nimport {fieldGetFixedString, fieldNeedsModification, fieldStripPunctuation} from './punctuation2';\n// import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');\n\nexport default function () {\n return {\n description: 'Strip punctuation to data fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Strip punctuation to data fields: fixer');\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fieldStripPunctuation(f)); // eslint-disable-line array-callback-return\n return res;\n }\n\n function validate(record) {\n nvdebug('Strip punctuation to data fields: validate');\n\n const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, false));\n\n const values = fieldsNeedingModification.map(f => fieldToString(f));\n const newValues = fieldsNeedingModification.map(f => fieldGetFixedString(f, false));\n\n const messages = values.map((val, i) => `'${val}' => '${newValues[i]}'`);\n\n const res = {message: messages};\n\n res.valid = res.message.length < 1;\n return res;\n }\n}\n"],"mappings":";;;;;;AAOA,IAAAA,YAAA,GAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AATA;AACA;AACA;AACA;AACA;AACA;;AAGA;;AAGA;;AAEe,SAAAE,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,kCAAkC;IAC/CC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,IAAAC,cAAO,EAAC,yCAAyC,CAAC;IAClD,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEJ,GAAG,EAAE,EAAE;MAAEK,KAAK,EAAE;IAAI,CAAC;IAC/CJ,MAAM,CAACK,MAAM,CAACC,OAAO,CAACC,CAAC,IAAI,IAAAC,kCAAqB,EAACD,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,OAAOL,GAAG;EACZ;EAEA,SAASJ,QAAQA,CAACE,MAAM,EAAE;IACxB,IAAAC,cAAO,EAAC,4CAA4C,CAAC;IAErD,MAAMQ,yBAAyB,GAAGT,MAAM,CAACK,MAAM,CAACK,MAAM,CAACH,CAAC,IAAI,IAAAI,mCAAsB,EAACJ,CAAC,EAAE,KAAK,CAAC,CAAC;IAE7F,MAAMK,MAAM,GAAGH,yBAAyB,CAACI,GAAG,CAACN,CAAC,IAAI,IAAAO,oBAAa,EAACP,CAAC,CAAC,CAAC;IACnE,MAAMQ,SAAS,GAAGN,yBAAyB,CAACI,GAAG,CAACN,CAAC,IAAI,IAAAS,gCAAmB,EAACT,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnF,MAAMU,QAAQ,GAAGL,MAAM,CAACC,GAAG,CAAC,CAACK,GAAG,EAAEC,CAAC,KAAK,IAAID,GAAG,SAASH,SAAS,CAACI,CAAC,CAAC,GAAG,CAAC;IAExE,MAAMjB,GAAG,GAAG;MAACC,OAAO,EAAEc;IAAQ,CAAC;IAE/Bf,GAAG,CAACE,KAAK,GAAGF,GAAG,CAACC,OAAO,CAACiB,MAAM,GAAG,CAAC;IAClC,OAAOlB,GAAG;EACZ;AACF","ignoreList":[]}
|
|
@@ -80,11 +80,9 @@ function _default(config) {
|
|
|
80
80
|
|
|
81
81
|
// Check subfields recursively
|
|
82
82
|
if (key === 'subfields') {
|
|
83
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
84
83
|
forEach(data, ([, subObj]) => {
|
|
85
84
|
// Console.log("subObj: ", subObj, " type: ", typeof subObj, !(Array.isArray(subObj)))
|
|
86
85
|
if (typeof subObj === 'object' && !Array.isArray(subObj)) {
|
|
87
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
88
86
|
checkMandatory(spec[key], subObj);
|
|
89
87
|
forEach(subObj, ([subKey, subVal]) => {
|
|
90
88
|
configMatchesSpec(subVal, subKey, spec[key]);
|
|
@@ -134,7 +132,6 @@ function _default(config) {
|
|
|
134
132
|
// Configuration object not found from found element
|
|
135
133
|
return false;
|
|
136
134
|
})) {
|
|
137
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
138
135
|
// All configuration fields match, check if some subfields should be excluded.
|
|
139
136
|
confObj.subfields.forEach(subField => {
|
|
140
137
|
const excluded = [];
|
|
@@ -144,18 +141,15 @@ function _default(config) {
|
|
|
144
141
|
const subFieldValueFine = subField.value && elemSub.value && subField.value.test(elemSub.value);
|
|
145
142
|
if (subFieldCodeFine && (typeof subField.value === 'undefined' || subFieldValueFine)) {
|
|
146
143
|
if (fix) {
|
|
147
|
-
|
|
148
|
-
excluded.push(elemSub); // eslint-disable-line functional/immutable-data
|
|
144
|
+
excluded.push(elemSub);
|
|
149
145
|
} else {
|
|
150
|
-
|
|
151
|
-
res.message.push(`Subfield $${element.tag}$$${elemSub.code}should be excluded`); // eslint-disable-line functional/immutable-data
|
|
146
|
+
res.message.push(`Subfield $${element.tag}$$${elemSub.code}should be excluded`);
|
|
152
147
|
}
|
|
153
148
|
}
|
|
154
149
|
});
|
|
155
|
-
excluded.forEach(sf => record.removeSubfield(sf, element));
|
|
150
|
+
excluded.forEach(sf => record.removeSubfield(sf, element)); // eslint-disable-line array-callback-return
|
|
156
151
|
// If no subfields remains, the whole field will be removed as well:
|
|
157
152
|
if (element.subfields && element.subfields.length === 0) {
|
|
158
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
159
153
|
record.removeField(element);
|
|
160
154
|
}
|
|
161
155
|
});
|
|
@@ -166,8 +160,7 @@ function _default(config) {
|
|
|
166
160
|
// Fix does not send response
|
|
167
161
|
if (!fix) {
|
|
168
162
|
if (res.message.length > 0) {
|
|
169
|
-
|
|
170
|
-
res.valid = false; // eslint-disable-line functional/immutable-data
|
|
163
|
+
res.valid = false;
|
|
171
164
|
}
|
|
172
165
|
return res;
|
|
173
166
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subfield-exclusion.js","names":["confSpec","tag","type","mandatory","ind1","ind2","subfields","code","value","forEach","obj","fun","Object","entries","isRegExp","re","RegExp","_default","config","Array","isArray","TypeError","configValid","description","validate","record","excludeSubfields","fix","checkMandatory","key","val","configMatchesSpec","data","spec","Error","subObj","subKey","subVal","conf","res","message","valid","confObj","found","get","element","every","confKey","confField","test","subField","excluded","elemSub","subFieldCodeFine","subFieldValueFine","push","sf","removeSubfield","length","removeField"],"sources":["../src/subfield-exclusion.js"],"sourcesContent":["// Tag (RegExp): Pattern to match the field's tags Mandatory\n// ind1 (RegExp): Pattern to match the field's ind1 property\n// ind2 (RegExp): Pattern to match the field's ind2 property\n// subfields (Array<Object>): An array of objects with the following properties (Mandatory):\n// // code (RegExp): Pattern to match the subfield's code Mandatory\n// // value (RegExp): Pattern to match the subfield's value\n\n// Configuration specification\nconst confSpec = {\n tag: { // Pattern to match the field's tags\n type: 'RegExp',\n mandatory: true\n },\n ind1: { // Pattern to match the field's ind1 property.\n type: 'RegExp' // Array<Indicator>\n },\n ind2: { // Pattern to match the field's ind2 property.\n type: 'RegExp' // Array<Indicator>\n },\n subfields: { // An array of objects with the following properties\n code: {\n type: 'RegExp',\n mandatory: true\n },\n value: {\n type: 'RegExp'\n },\n mandatory: true\n }\n};\n\nfunction forEach(obj, fun) {\n Object.entries(obj).forEach(fun);\n}\n\nfunction isRegExp(re) {\n return re instanceof RegExp;\n}\n\nexport default function (config) {\n if (!Array.isArray(config)) {\n throw new TypeError('Configuration array not provided');\n }\n\n configValid(config);\n\n return {\n description:\n 'Checks that the record does not contain the configured subfields',\n validate: record => excludeSubfields(record, config, false),\n fix: record => excludeSubfields(record, config, true)\n };\n\n /// /////////////////////////////////////////\n // These check that configuration is valid\n function configValid(config) {\n config.forEach(obj => {\n checkMandatory(confSpec, obj);\n\n forEach(obj, ([key, val]) => {\n configMatchesSpec(val, key, confSpec);\n });\n });\n }\n\n // Recursive validator\n function configMatchesSpec(data, key, spec) {\n // Field not found in configuration spec\n if (!spec[key]) {\n throw new Error(`Configuration not valid - unidentified value: ${key}`);\n }\n\n // If configuration type does not match type in configuration spec\n if (typeof data !== spec[key].type &&\n (spec[key].type === 'RegExp' && !isRegExp(data))) {\n throw new Error(`Configuration not valid - invalid data type for: ${key}`);\n }\n\n // Check subfields recursively\n if (key === 'subfields') { // eslint-disable-line functional/no-conditional-statements\n forEach(data, ([, subObj]) => {\n // Console.log(\"subObj: \", subObj, \" type: \", typeof subObj, !(Array.isArray(subObj)))\n if (typeof subObj === 'object' && !Array.isArray(subObj)) { // eslint-disable-line functional/no-conditional-statements\n checkMandatory(spec[key], subObj);\n\n forEach(subObj, ([subKey, subVal]) => {\n configMatchesSpec(subVal, subKey, spec[key]);\n });\n } else {\n throw new TypeError(`Configuration not valid - subfield: ${subObj} not object`);\n }\n });\n }\n }\n\n function checkMandatory(spec, obj) {\n // Check if all mandatory fields are present\n forEach(spec, ([key, val]) => {\n if (val.mandatory && typeof obj[key] === 'undefined') {\n throw new Error(`Configuration not valid - missing mandatory element: ${key}`);\n }\n });\n }\n /// /////////////////////////////////////////\n\n /// /////////////////////////////////////////\n // These check that record is valid\n function excludeSubfields(record, conf, fix) {\n const res = {message: [], valid: true};\n\n // Parse trough every element of config array\n conf.forEach(confObj => {\n const found = record.get(confObj.tag); // Find matching record fields based on mandatory tag\n\n // Check if some of found record fields matches all configuration fields\n found.forEach(element => {\n // Compare each found element against each configuration object\n if (Object.entries(confObj).every(([confKey, confField]) => {\n // Tag already checked at .get(), subfields later\n if (confKey === 'tag' || confKey === 'subfields') {\n return true;\n }\n\n // Configuration object is RegExp and record value matches it\n if (element[confKey] && isRegExp(confField) && confField.test(element[confKey])) {\n return true;\n }\n\n // Configuration object not found from found element\n return false;\n })) { // eslint-disable-line functional/no-conditional-statements\n // All configuration fields match, check if some subfields should be excluded.\n confObj.subfields.forEach(subField => {\n const excluded = [];\n\n element.subfields.forEach(elemSub => {\n // Check if subfield matches configuration spec\n const subFieldCodeFine = subField.code && elemSub.code && subField.code.test(elemSub.code);\n const subFieldValueFine = subField.value && elemSub.value && subField.value.test(elemSub.value);\n if (subFieldCodeFine && (typeof subField.value === 'undefined' || subFieldValueFine)) {\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n excluded.push(elemSub); // eslint-disable-line functional/immutable-data\n } else { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`Subfield $${element.tag}$$${elemSub.code}should be excluded`); // eslint-disable-line functional/immutable-data\n }\n }\n });\n\n excluded.forEach(sf => record.removeSubfield(sf, element));\n // If no subfields remains, the whole field will be removed as well:\n if (element.subfields && element.subfields.length === 0) { // eslint-disable-line functional/no-conditional-statements\n record.removeField(element);\n }\n });\n }\n });\n });\n\n // Fix does not send response\n if (!fix) {\n if (res.message.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.valid = false; // eslint-disable-line functional/immutable-data\n }\n\n return res;\n }\n // Res.fix.push('Field $' + element.tag + ' excluded');\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"subfield-exclusion.js","names":["confSpec","tag","type","mandatory","ind1","ind2","subfields","code","value","forEach","obj","fun","Object","entries","isRegExp","re","RegExp","_default","config","Array","isArray","TypeError","configValid","description","validate","record","excludeSubfields","fix","checkMandatory","key","val","configMatchesSpec","data","spec","Error","subObj","subKey","subVal","conf","res","message","valid","confObj","found","get","element","every","confKey","confField","test","subField","excluded","elemSub","subFieldCodeFine","subFieldValueFine","push","sf","removeSubfield","length","removeField"],"sources":["../src/subfield-exclusion.js"],"sourcesContent":["// Tag (RegExp): Pattern to match the field's tags Mandatory\n// ind1 (RegExp): Pattern to match the field's ind1 property\n// ind2 (RegExp): Pattern to match the field's ind2 property\n// subfields (Array<Object>): An array of objects with the following properties (Mandatory):\n// // code (RegExp): Pattern to match the subfield's code Mandatory\n// // value (RegExp): Pattern to match the subfield's value\n\n// Configuration specification\nconst confSpec = {\n tag: { // Pattern to match the field's tags\n type: 'RegExp',\n mandatory: true\n },\n ind1: { // Pattern to match the field's ind1 property.\n type: 'RegExp' // Array<Indicator>\n },\n ind2: { // Pattern to match the field's ind2 property.\n type: 'RegExp' // Array<Indicator>\n },\n subfields: { // An array of objects with the following properties\n code: {\n type: 'RegExp',\n mandatory: true\n },\n value: {\n type: 'RegExp'\n },\n mandatory: true\n }\n};\n\nfunction forEach(obj, fun) {\n Object.entries(obj).forEach(fun);\n}\n\nfunction isRegExp(re) {\n return re instanceof RegExp;\n}\n\nexport default function (config) {\n if (!Array.isArray(config)) {\n throw new TypeError('Configuration array not provided');\n }\n\n configValid(config);\n\n return {\n description:\n 'Checks that the record does not contain the configured subfields',\n validate: record => excludeSubfields(record, config, false),\n fix: record => excludeSubfields(record, config, true)\n };\n\n /// /////////////////////////////////////////\n // These check that configuration is valid\n function configValid(config) {\n config.forEach(obj => {\n checkMandatory(confSpec, obj);\n\n forEach(obj, ([key, val]) => {\n configMatchesSpec(val, key, confSpec);\n });\n });\n }\n\n // Recursive validator\n function configMatchesSpec(data, key, spec) {\n // Field not found in configuration spec\n if (!spec[key]) {\n throw new Error(`Configuration not valid - unidentified value: ${key}`);\n }\n\n // If configuration type does not match type in configuration spec\n if (typeof data !== spec[key].type &&\n (spec[key].type === 'RegExp' && !isRegExp(data))) {\n throw new Error(`Configuration not valid - invalid data type for: ${key}`);\n }\n\n // Check subfields recursively\n if (key === 'subfields') {\n forEach(data, ([, subObj]) => {\n // Console.log(\"subObj: \", subObj, \" type: \", typeof subObj, !(Array.isArray(subObj)))\n if (typeof subObj === 'object' && !Array.isArray(subObj)) {\n checkMandatory(spec[key], subObj);\n\n forEach(subObj, ([subKey, subVal]) => {\n configMatchesSpec(subVal, subKey, spec[key]);\n });\n } else {\n throw new TypeError(`Configuration not valid - subfield: ${subObj} not object`);\n }\n });\n }\n }\n\n function checkMandatory(spec, obj) {\n // Check if all mandatory fields are present\n forEach(spec, ([key, val]) => {\n if (val.mandatory && typeof obj[key] === 'undefined') {\n throw new Error(`Configuration not valid - missing mandatory element: ${key}`);\n }\n });\n }\n /// /////////////////////////////////////////\n\n /// /////////////////////////////////////////\n // These check that record is valid\n function excludeSubfields(record, conf, fix) {\n const res = {message: [], valid: true};\n\n // Parse trough every element of config array\n conf.forEach(confObj => {\n const found = record.get(confObj.tag); // Find matching record fields based on mandatory tag\n\n // Check if some of found record fields matches all configuration fields\n found.forEach(element => {\n // Compare each found element against each configuration object\n if (Object.entries(confObj).every(([confKey, confField]) => {\n // Tag already checked at .get(), subfields later\n if (confKey === 'tag' || confKey === 'subfields') {\n return true;\n }\n\n // Configuration object is RegExp and record value matches it\n if (element[confKey] && isRegExp(confField) && confField.test(element[confKey])) {\n return true;\n }\n\n // Configuration object not found from found element\n return false;\n })) {\n // All configuration fields match, check if some subfields should be excluded.\n confObj.subfields.forEach(subField => {\n const excluded = [];\n\n element.subfields.forEach(elemSub => {\n // Check if subfield matches configuration spec\n const subFieldCodeFine = subField.code && elemSub.code && subField.code.test(elemSub.code);\n const subFieldValueFine = subField.value && elemSub.value && subField.value.test(elemSub.value);\n if (subFieldCodeFine && (typeof subField.value === 'undefined' || subFieldValueFine)) {\n if (fix) {\n excluded.push(elemSub);\n } else {\n res.message.push(`Subfield $${element.tag}$$${elemSub.code}should be excluded`);\n }\n }\n });\n\n excluded.forEach(sf => record.removeSubfield(sf, element)); // eslint-disable-line array-callback-return\n // If no subfields remains, the whole field will be removed as well:\n if (element.subfields && element.subfields.length === 0) {\n record.removeField(element);\n }\n });\n }\n });\n });\n\n // Fix does not send response\n if (!fix) {\n if (res.message.length > 0) {\n res.valid = false;\n }\n\n return res;\n }\n // Res.fix.push('Field $' + element.tag + ' excluded');\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/subfield6Utils.js
CHANGED
|
@@ -79,9 +79,9 @@ function subfield6ResetOccurrenceNumber(subfield, occurrenceNumber) {
|
|
|
79
79
|
return;
|
|
80
80
|
}
|
|
81
81
|
const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;
|
|
82
|
-
const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield);
|
|
82
|
+
const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield);
|
|
83
83
|
//nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);
|
|
84
|
-
subfield.value = newValue;
|
|
84
|
+
subfield.value = newValue;
|
|
85
85
|
}
|
|
86
86
|
function subfield6GetTail(subfield) {
|
|
87
87
|
if (isValidSubfield6(subfield)) {
|
|
@@ -95,7 +95,7 @@ function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumb
|
|
|
95
95
|
return false;
|
|
96
96
|
}
|
|
97
97
|
// We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...
|
|
98
|
-
const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1');
|
|
98
|
+
const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1');
|
|
99
99
|
(0, _utils.nvdebug)(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);
|
|
100
100
|
return key === tagAndOccurrenceNumber;
|
|
101
101
|
}
|
|
@@ -121,7 +121,8 @@ function fieldHasOccurrenceNumber(field, occurrenceNumber) {
|
|
|
121
121
|
return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);
|
|
122
122
|
}
|
|
123
123
|
function fieldResetOccurrenceNumber(field, newOccurrenceNumber, oldOccurrenceNumber = undefined) {
|
|
124
|
-
field.subfields.forEach(subfield => innerReset(subfield));
|
|
124
|
+
field.subfields.forEach(subfield => innerReset(subfield)); // eslint-disable-line array-callback-return
|
|
125
|
+
|
|
125
126
|
function innerReset(subfield) {
|
|
126
127
|
// (Optional) Check that this is really the occurrence number we wan't to reseot
|
|
127
128
|
if (oldOccurrenceNumber !== undefined) {
|
|
@@ -208,13 +209,13 @@ function subfieldSevenToOneOccurrenceNumber(subfield) {
|
|
|
208
209
|
if (subfield.code !== '6' || subfield.value.substring(0, 1) !== '7') {
|
|
209
210
|
return;
|
|
210
211
|
}
|
|
211
|
-
subfield.value = `1${subfield.value.substring(1)}`;
|
|
212
|
+
subfield.value = `1${subfield.value.substring(1)}`;
|
|
212
213
|
}
|
|
213
214
|
function fieldSevenToOneOccurrenceNumber(field) {
|
|
214
215
|
if (field.tag !== '880') {
|
|
215
216
|
return;
|
|
216
217
|
}
|
|
217
|
-
field.subfields.forEach(sf => subfieldSevenToOneOccurrenceNumber(sf));
|
|
218
|
+
field.subfields.forEach(sf => subfieldSevenToOneOccurrenceNumber(sf)); // eslint-disable-line array-callback-return
|
|
218
219
|
}
|
|
219
220
|
function fieldGetOccurrenceNumberPairs(field, candFields) {
|
|
220
221
|
// NB! TAG!=880 returns 880 fields, TAG==880 returns non-880 field
|
|
@@ -225,7 +226,7 @@ function fieldGetOccurrenceNumberPairs(field, candFields) {
|
|
|
225
226
|
return pairs;
|
|
226
227
|
}
|
|
227
228
|
(0, _utils.nvdebug)(`${pairs.length} PAIR(S) FOUND FOR '${(0, _utils.fieldToString)(field)}'`);
|
|
228
|
-
pairs.forEach(pairedField => (0, _utils.nvdebug)(` '${(0, _utils.fieldToString)(pairedField)}'`));
|
|
229
|
+
pairs.forEach(pairedField => (0, _utils.nvdebug)(` '${(0, _utils.fieldToString)(pairedField)}'`)); // eslint-disable-line array-callback-return
|
|
229
230
|
return pairs;
|
|
230
231
|
}
|
|
231
232
|
function fieldGetOccurrenceNumbers(field) {
|
|
@@ -342,13 +343,13 @@ function guessTargetLinkingNumber(fields, defaultTargetLinkingNumber) {
|
|
|
342
343
|
return defaultTargetLinkingNumber;
|
|
343
344
|
}
|
|
344
345
|
const linkingNumbers = (0, _subfield8Utils.fieldsGetAllSubfield8LinkingNumbers)(fields);
|
|
345
|
-
return linkingNumbers.length === 1 ? linkingNumbers[0] : 0;
|
|
346
|
+
return linkingNumbers.length === 1 ? linkingNumbers[0] : 0;
|
|
346
347
|
}
|
|
347
348
|
function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTag = false) {
|
|
348
349
|
const targetLinkingNumber = guessTargetLinkingNumber(fields, defaultTargetLinkingNumber);
|
|
349
350
|
(0, _utils.nvdebug)(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`);
|
|
350
351
|
const strings = fields.map(field => fieldToNormalizedString(field, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTag));
|
|
351
|
-
strings.sort();
|
|
352
|
+
strings.sort();
|
|
352
353
|
return strings.join('\t__SEPARATOR__\t');
|
|
353
354
|
}
|
|
354
355
|
|
|
@@ -455,7 +456,7 @@ function get6s(field, candidateFields) {
|
|
|
455
456
|
(0, _utils.nvdebug)(occurrenceNumbers.join(' -- '));
|
|
456
457
|
const relevantFields = candidateFields.filter(f => occurrenceNumbers.some(o => fieldHasOccurrenceNumber(f, o)));
|
|
457
458
|
(0, _utils.nvdebug)(`${(0, _utils.fieldToString)(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`);
|
|
458
|
-
relevantFields.forEach(f => (0, _utils.nvdebug)((0, _utils.fieldToString)(f)));
|
|
459
|
+
relevantFields.forEach(f => (0, _utils.nvdebug)((0, _utils.fieldToString)(f))); // eslint-disable-line array-callback-return
|
|
459
460
|
return relevantFields;
|
|
460
461
|
}
|
|
461
462
|
function resetSubfield6Tag(subfield, tag) {
|
|
@@ -465,6 +466,6 @@ function resetSubfield6Tag(subfield, tag) {
|
|
|
465
466
|
// NB! mainly for 1XX<->7XX transfers
|
|
466
467
|
const newValue = `${tag}-${subfield.value.substring(4)}`;
|
|
467
468
|
(0, _utils.nvdebug)(`Set subfield $6 value from ${(0, _utils.subfieldToString)(subfield)} to ${newValue}`, debugDev);
|
|
468
|
-
subfield.value = newValue;
|
|
469
|
+
subfield.value = newValue;
|
|
469
470
|
}
|
|
470
471
|
//# sourceMappingURL=subfield6Utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subfield6Utils.js","names":["_debug","_interopRequireDefault","require","_subfield8Utils","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","sf6Regexp","isValidSubfield6","subfield","code","value","match","subfield6GetTag","substring","undefined","subfield6GetOccurrenceNumber","replace","subfield6GetOccurrenceNumberAsInteger","index","result","parseInt","subfield6ResetOccurrenceNumber","occurrenceNumber","occurrenceNumberAsString","intToOccurrenceNumberString","newValue","subfield6GetTail","subfield6HasWantedTagAndOccurrenceNumber","tagAndOccurrenceNumber","key","nvdebug","fieldGetUnambiguousTag","field","tags","subfields","filter","sf","length","fieldGetUnambiguousOccurrenceNumber","occurrenceNumbers","fieldHasOccurrenceNumber","some","fieldResetOccurrenceNumber","newOccurrenceNumber","oldOccurrenceNumber","forEach","innerReset","currOccurrenceNumber","i","fieldGetMaxSubfield6OccurrenceNumberAsInteger","sf6s","vals","map","Math","max","fieldHasWantedTagAndOccurrenceNumber","fieldHasValidSubfield6","isSubfield6Pair","otherField","tagsArePairable6","tag","fieldIndex","otherFieldIndex","tag1","tag2","subfieldSevenToOneOccurrenceNumber","fieldSevenToOneOccurrenceNumber","fieldGetOccurrenceNumberPairs","candFields","pairs","fieldToString","pairedField","fieldGetOccurrenceNumbers","subfieldExtractOccurrenceNumber","includes","push","fieldsGetOccurrenceNumbers","fields","f","fieldProcessOccurrenceNumbers","newOccurrenceNumbers","is7XX","normalizeEntryTag","subfieldToNormalizedString","targetLinkingNumber","normalizeOccurrenceNumber","normalizeEntryTagBoolean","isValidSubfield8","currLinkingNumber","getSubfield8LinkingNumber","normVal","subfieldToString","fieldToNormalizedString","ind1","ind2","formatAndNormalizeSubfields","join","guessTargetLinkingNumber","defaultTargetLinkingNumber","linkingNumbers","fieldsGetAllSubfield8LinkingNumbers","fieldsToNormalizedString","strings","sort","getFirstField","record","fieldsAsStrings","findIndex","isRelevantSubfield6Chain","non880","every","fieldHasSubfield","fieldIsFirstFieldInChain","chain","firstField","getAllLinkedSubfield6Fields","get6s","moreFields","add8s","isFirstLinkedSubfield6Field","fieldsToString","recordGetSubfield6ChainHeads","recordGetMaxSubfield6OccurrenceNumberAsInteger","candidateFields","sixes","relevantFields","o","resetSubfield6Tag"],"sources":["../src/subfield6Utils.js"],"sourcesContent":["import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');\n\nimport {add8s, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, isValidSubfield8} from './subfield8Utils';\nimport {fieldHasSubfield, fieldToString, fieldsToString, nvdebug, subfieldToString} from './utils';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:subfield6Utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! Subfield 6 is non-repeatable and it should always comes first!\n// NB! Index size should always be 2 (preceding 0 required for 01..09) However, support for 100+ was added on 2023-02-27.\n// NB! Index value '00' are left as they are (is not paired/indexed/whatever.\nconst sf6Regexp = /^[0-9][0-9][0-9]-(?:[0-9][0-9]|[1-9][0-9]+)(?:[^0-9].*)?$/u;\n\nexport function isValidSubfield6(subfield) {\n if (subfield.code !== '6') {\n return false;\n }\n return subfield.value.match(sf6Regexp);\n}\n\nexport function subfield6GetTag(subfield) {\n if (isValidSubfield6(subfield)) {\n return subfield.value.substring(0, 3);\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumber(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.substring(4).replace(/\\D.*$/u, '');\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumberAsInteger(subfield) {\n const index = subfield6GetOccurrenceNumber(subfield);\n if (index === undefined || index === '00') {\n return 0;\n }\n const result = parseInt(index, 10);\n //nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debug);\n return result;\n}\n\nexport function subfield6ResetOccurrenceNumber(subfield, occurrenceNumber) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;\n\n const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield); // eslint-disable-line functional/immutable-data\n //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);\n subfield.value = newValue; // eslint-disable-line functional/immutable-data\n}\n\n\nfunction subfield6GetTail(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.replace(/^\\d+-\\d+/u, '');\n }\n return '';\n}\n\nexport function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumber) {\n if (subfield.code !== '6') {\n return false;\n }\n // We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...\n const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1'); // eslint-disable-line prefer-named-capture-group\n nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);\n return key === tagAndOccurrenceNumber;\n}\n\n// <= SUBFIELD, FIELD =>\n\nexport function fieldGetUnambiguousTag(field) {\n const tags = field.subfields.filter(sf => subfield6GetTag(sf));\n if (tags.length === 1) {\n return subfield6GetTag(tags[0]);\n }\n return undefined;\n}\n\nexport function fieldGetUnambiguousOccurrenceNumber(field) {\n const occurrenceNumbers = field.subfields.filter(sf => subfield6GetOccurrenceNumber(sf));\n if (occurrenceNumbers.length === 1) {\n return subfield6GetOccurrenceNumber(occurrenceNumbers[0]);\n }\n return undefined;\n}\n\nexport function fieldHasOccurrenceNumber(field, occurrenceNumber) {\n //nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`);\n return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);\n}\n\nexport function fieldResetOccurrenceNumber(field, newOccurrenceNumber, oldOccurrenceNumber = undefined) {\n field.subfields.forEach(subfield => innerReset(subfield));\n\n function innerReset(subfield) {\n // (Optional) Check that this is really the occurrence number we wan't to reseot\n if (oldOccurrenceNumber !== undefined) {\n const currOccurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (currOccurrenceNumber !== oldOccurrenceNumber) {\n return;\n }\n }\n subfield6ResetOccurrenceNumber(subfield, newOccurrenceNumber);\n }\n}\n\nexport function intToOccurrenceNumberString(i) {\n return i < 10 ? `0${i}` : `${i}`;\n}\n\nexport function fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {\n // used by reducer!\n //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`);\n const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];\n if (sf6s.length === 0) {\n return 0;\n }\n // There should always be one, but here we check every subfield.\n //nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debug);\n const vals = sf6s.map(sf => subfield6GetOccurrenceNumberAsInteger(sf));\n return Math.max(...vals);\n}\n\nexport function fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber) {\n return field.subfields && field.subfields.some(sf => subfield6HasWantedTagAndOccurrenceNumber(sf, tagAndOccurrenceNumber));\n}\n\n\n/*\nexport function getFieldsWithGivenOccurrenceNumberSubfield6(record, occurrenceNumberAsString) {\n const record.fields.filter(field => field\n\n function fieldHasIndex(field, index) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.find(sf => isValidSubfield6(sf) && subfieldGetOccurrenceNumber6(sf) === index);\n }\n}\n*/\n\n\nexport function fieldHasValidSubfield6(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield6(sf));\n}\n\nexport function isSubfield6Pair(field, otherField) {\n // No need to log this:\n //nvdebug(`LOOK for $6-pair:\\n ${fieldToString(field)}\\n ${fieldToString(otherField)}`);\n if (!fieldHasValidSubfield6(field) || !fieldHasValidSubfield6(otherField)) {\n return false;\n }\n\n if (!tagsArePairable6(field.tag, otherField.tag)) {\n //nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`);\n return false;\n }\n\n\n const fieldIndex = fieldGetUnambiguousOccurrenceNumber(field);\n if (fieldIndex === undefined || fieldIndex === '00') {\n //nvdebug(` FAILED. REASON: NO INDEX FOUND`);\n return false;\n }\n\n const otherFieldIndex = fieldGetUnambiguousOccurrenceNumber(otherField);\n\n\n if (fieldIndex !== otherFieldIndex) {\n //nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`);\n return false;\n }\n\n if (fieldGetUnambiguousTag(field) !== otherField.tag || field.tag !== fieldGetUnambiguousTag(otherField)) {\n //nvdebug(` FAILURE: TAG vs $6 TAG`);\n return false;\n }\n return true;\n\n function tagsArePairable6(tag1, tag2) {\n // How to do XOR operation in one line? Well, this is probably more readable...\n if (tag1 === '880' && tag2 === '880') {\n return false;\n }\n if (tag1 !== '880' && tag2 !== '880') {\n return false;\n }\n return true;\n }\n}\n\n\nfunction subfieldSevenToOneOccurrenceNumber(subfield) {\n if (subfield.code !== '6' || subfield.value.substring(0, 1) !== '7') {\n return;\n }\n subfield.value = `1${subfield.value.substring(1)}`; // eslint-disable-line functional/immutable-data\n}\n\nexport function fieldSevenToOneOccurrenceNumber(field) {\n if (field.tag !== '880') {\n return;\n }\n field.subfields.forEach(sf => subfieldSevenToOneOccurrenceNumber(sf));\n}\n\n\nexport function fieldGetOccurrenceNumberPairs(field, candFields) {\n // NB! TAG!=880 returns 880 fields, TAG==880 returns non-880 field\n //nvdebug(` Trying to finds pair for ${fieldToString(field)} in ${candFields.length} fields`);\n const pairs = candFields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairs.length === 0) {\n nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`);\n return pairs;\n }\n nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`);\n pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`));\n return pairs;\n}\n\nexport function fieldGetOccurrenceNumbers(field) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n field.subfields?.forEach(sf => subfieldExtractOccurrenceNumber(sf));\n\n function subfieldExtractOccurrenceNumber(sf) {\n if (!isValidSubfield6(sf)) {\n return;\n }\n const occurrenceNumber = subfield6GetOccurrenceNumber(sf);\n if (occurrenceNumber === '00' || occurrenceNumbers.includes(occurrenceNumber)) {\n return;\n }\n occurrenceNumbers.push(occurrenceNumber);\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\nexport function fieldsGetOccurrenceNumbers(fields) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n\n fields.forEach(f => fieldProcessOccurrenceNumbers(f));\n\n function fieldProcessOccurrenceNumbers(f) {\n const newOccurrenceNumbers = fieldGetOccurrenceNumbers(f);\n newOccurrenceNumbers.forEach(occurrenceNumber => {\n if (!occurrenceNumbers.includes(occurrenceNumber)) {\n occurrenceNumbers.push(occurrenceNumber);\n }\n\n });\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\n/*\nexport function fieldGetSubfield6Pair(field, record) {\n const pairedFields = record.fields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairedFields.length !== 1) {\n return undefined;\n }\n // NB! It is theoretically possible to have multiple pairable 880 fields (one for each encoding)\n nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`);\n return pairedFields[0];\n}\n*/\n\n/*\nexport function pairAndStringify6(field, record) {\n const pair6 = fieldGetSubfield6Pair(field, record);\n if (!pair6) {\n return fieldToNormalizedString(field);\n }\n return fieldsToNormalizedString([field, pair6]);\n}\n*/\n\n// Frequencly list for $6 subfields in 1XX/7XX fields:\n// 231115 100\n// 183832 700\n// 28773 710\n// 2047 711\n// 661 110\n// 341 111\n// 284 130\n// 63 730\n// Thus there's a real risk of ending up with, say, identical 100 vs 700 chains.\n// Semi-hackily support 1XX/7XX-version: 7XX can be deleted if corresponding 1XX exists:\n\nexport function is7XX(tag) {\n return ['700', '710', '711', '730'].includes(tag);\n}\n\n\nfunction normalizeEntryTag(tag) {\n if (tag.match(/^[17](?:00|10|11|30)$/u)) {\n return `X${tag.substring(1)}`;\n }\n return tag;\n}\n\nfunction subfieldToNormalizedString(sf, tag, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n // targetLinkingNumber refers to $8.\n // normalizeEntryTagBoolean refers to 1XX/7XX tag values in subfield $6 value.\n if (isValidSubfield6(sf)) { // && targetLinkingNumber === 0) {\n // 1XX/7XX (entry tag) normalization:\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(tag) : tag;\n\n const occurrenceNumber = normalizeOccurrenceNumber ? 'XX' : subfield6GetOccurrenceNumber(sf);\n // If we are normalizing a $8 chain, don't normalize $6 occurrence number!\n // Replace $6 occurrence number with XX:\n return ` ‡${sf.code} ${tag2}-${occurrenceNumber}${subfield6GetTail(sf)}`;\n }\n\n if (isValidSubfield8(sf)) {\n const currLinkingNumber = getSubfield8LinkingNumber(sf); //getSubfield8Index(sf);\n if (targetLinkingNumber > 0 && currLinkingNumber === targetLinkingNumber) {\n // For $8 we should only XX the index we are looking at...\n const normVal = sf.value.replace(/^[0-9]+/u, 'XX');\n return ` ‡${sf.code} ${normVal}`;\n }\n return ''; // Other $8 subfields are meaningless in this context\n }\n return ` ${subfieldToString(sf)}`; // `‡${sf.code} ${sf.value}`;\n}\n\nexport function fieldToNormalizedString(field, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n if ('subfields' in field) {\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(field.tag) : field.tag;\n return `${tag2} ${field.ind1}${field.ind2}${formatAndNormalizeSubfields(field)}`;\n }\n return `${field.tag} ${field.value}`;\n\n function formatAndNormalizeSubfields(field) {\n return field.subfields.map(sf => subfieldToNormalizedString(sf, field.tag, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTagBoolean)).join('');\n }\n\n}\n\n\nfunction guessTargetLinkingNumber(fields, defaultTargetLinkingNumber) {\n if (defaultTargetLinkingNumber !== 0) {\n return defaultTargetLinkingNumber;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n return linkingNumbers.length === 1 ? linkingNumbers[0] : 0; // eslint-disable-line no-param-reassign\n}\n\nexport function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTag = false) {\n const targetLinkingNumber = guessTargetLinkingNumber(fields, defaultTargetLinkingNumber);\n\n nvdebug(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`);\n const strings = fields.map(field => fieldToNormalizedString(field, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTag));\n strings.sort(); // eslint-disable-line functional/immutable-data\n return strings.join('\\t__SEPARATOR__\\t');\n}\n\n\n/*\n\nexport function removeField6IfNeeded(field, record, fieldsAsString) {\n const pairField = fieldGetSubfield6Pair(field, record);\n const asString = pairField ? fieldsToNormalizedString([field, pairField]) : fieldToNormalizedString(field);\n nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`);\n const tmp = pairField ? fieldToString(pairField) : 'HUTI';\n nvdebug(`PAIR: ${tmp}`);\n nvdebug(`BASE:\\n ${fieldsAsString.join('\\n ')}`);\n if (!fieldsAsString.includes(asString)) {\n return;\n }\n nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`);\n record.removeField(field);\n\n if (pairField === undefined) {\n return;\n }\n nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`);\n record.removeField(pairField);\n}\n*/\n\nfunction getFirstField(record, fields) {\n const fieldsAsStrings = fields.map(field => fieldToString(field));\n //record.fields.forEach((field, i) => nvdebug(`${i}:\\t${fieldToString(field)}`));\n //nvdebug(`getFirstField: ${fieldsAsStrings.join('\\t')}`);\n const i = record.fields.findIndex(field => fieldsAsStrings.includes(fieldToString(field)));\n if (i > -1) {\n const field = record.fields[i];\n //nvdebug(`1st F: ${i + 1}/${record.fields.length} ${fieldToString(field)}`);\n return field;\n }\n return undefined;\n}\n\nfunction isRelevantSubfield6Chain(fields) {\n if (fields.length < 2) { // 1 non-880-field and 1+ 880 fields\n return false;\n }\n const non880 = fields.filter(f => f.tag !== '880');\n if (non880.length !== 1) {\n return false;\n }\n\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n if (linkingNumbers.length !== 0) {\n return false;\n }\n\n return fields.every(f => fieldHasSubfield(f, '6'));\n}\n\nexport function fieldIsFirstFieldInChain(field, chain, record) {\n // Interpretation of first: position of field in record (however, we might have a duplicate field. See tests...)\n const firstField = getFirstField(record, chain);\n if (firstField) {\n return fieldToString(field) === fieldToString(firstField);\n }\n return false;\n\n}\n\n\nexport function getAllLinkedSubfield6Fields(field, record) {\n const fields = get6s(field, record);\n const moreFields = add8s(fields, record);\n\n // Currently we don't handle fields with more than one $6 and/or $8 subfield.\n if (moreFields.length > fields.length) {\n return []; // Don't fix!\n }\n return moreFields;\n}\n\nexport function isFirstLinkedSubfield6Field(field, record) {\n if (!field.subfields) { // Is not a datafield\n return false;\n }\n const chain = getAllLinkedSubfield6Fields(field, record);\n if (!isRelevantSubfield6Chain(chain)) {\n nvdebug(`Rejected 6: ${fieldsToString(chain)}`);\n return false;\n }\n\n return fieldIsFirstFieldInChain(field, chain, record);\n}\n\nexport function recordGetSubfield6ChainHeads(record) {\n return record.fields.filter(field => isFirstLinkedSubfield6Field(field, record));\n}\n\nexport function recordGetMaxSubfield6OccurrenceNumberAsInteger(record) {\n if (record.fields.length === 0) {\n return 0;\n }\n // Should we cache the value here?\n const vals = record.fields.map((field) => fieldGetMaxSubfield6OccurrenceNumberAsInteger(field));\n return Math.max(...vals);\n}\n\nexport function get6s(field, candidateFields) { // NB! Convert field to fields!!!\n // Get all fields with given occurrence number\n const sixes = field.subfields.filter(sf => isValidSubfield6(sf));\n\n if (sixes.length === 0) {\n return [field];\n }\n nvdebug(`SIXES: ${sixes.length}`);\n const occurrenceNumbers = sixes.map(sf => subfield6GetOccurrenceNumber(sf)).filter(value => value !== undefined && value !== '00');\n nvdebug(occurrenceNumbers.join(' -- '));\n\n const relevantFields = candidateFields.filter(f => occurrenceNumbers.some(o => fieldHasOccurrenceNumber(f, o)));\n nvdebug(`${fieldToString(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`);\n relevantFields.forEach(f => nvdebug(fieldToString(f)));\n return relevantFields;\n}\n\nexport function resetSubfield6Tag(subfield, tag) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n // NB! mainly for 1XX<->7XX transfers\n const newValue = `${tag}-${subfield.value.substring(4)}`;\n nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`, debugDev);\n subfield.value = newValue; // eslint-disable-line functional/immutable-data\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"subfield6Utils.js","names":["_debug","_interopRequireDefault","require","_subfield8Utils","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","sf6Regexp","isValidSubfield6","subfield","code","value","match","subfield6GetTag","substring","undefined","subfield6GetOccurrenceNumber","replace","subfield6GetOccurrenceNumberAsInteger","index","result","parseInt","subfield6ResetOccurrenceNumber","occurrenceNumber","occurrenceNumberAsString","intToOccurrenceNumberString","newValue","subfield6GetTail","subfield6HasWantedTagAndOccurrenceNumber","tagAndOccurrenceNumber","key","nvdebug","fieldGetUnambiguousTag","field","tags","subfields","filter","sf","length","fieldGetUnambiguousOccurrenceNumber","occurrenceNumbers","fieldHasOccurrenceNumber","some","fieldResetOccurrenceNumber","newOccurrenceNumber","oldOccurrenceNumber","forEach","innerReset","currOccurrenceNumber","i","fieldGetMaxSubfield6OccurrenceNumberAsInteger","sf6s","vals","map","Math","max","fieldHasWantedTagAndOccurrenceNumber","fieldHasValidSubfield6","isSubfield6Pair","otherField","tagsArePairable6","tag","fieldIndex","otherFieldIndex","tag1","tag2","subfieldSevenToOneOccurrenceNumber","fieldSevenToOneOccurrenceNumber","fieldGetOccurrenceNumberPairs","candFields","pairs","fieldToString","pairedField","fieldGetOccurrenceNumbers","subfieldExtractOccurrenceNumber","includes","push","fieldsGetOccurrenceNumbers","fields","f","fieldProcessOccurrenceNumbers","newOccurrenceNumbers","is7XX","normalizeEntryTag","subfieldToNormalizedString","targetLinkingNumber","normalizeOccurrenceNumber","normalizeEntryTagBoolean","isValidSubfield8","currLinkingNumber","getSubfield8LinkingNumber","normVal","subfieldToString","fieldToNormalizedString","ind1","ind2","formatAndNormalizeSubfields","join","guessTargetLinkingNumber","defaultTargetLinkingNumber","linkingNumbers","fieldsGetAllSubfield8LinkingNumbers","fieldsToNormalizedString","strings","sort","getFirstField","record","fieldsAsStrings","findIndex","isRelevantSubfield6Chain","non880","every","fieldHasSubfield","fieldIsFirstFieldInChain","chain","firstField","getAllLinkedSubfield6Fields","get6s","moreFields","add8s","isFirstLinkedSubfield6Field","fieldsToString","recordGetSubfield6ChainHeads","recordGetMaxSubfield6OccurrenceNumberAsInteger","candidateFields","sixes","relevantFields","o","resetSubfield6Tag"],"sources":["../src/subfield6Utils.js"],"sourcesContent":["import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');\n\nimport {add8s, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, isValidSubfield8} from './subfield8Utils';\nimport {fieldHasSubfield, fieldToString, fieldsToString, nvdebug, subfieldToString} from './utils';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:subfield6Utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! Subfield 6 is non-repeatable and it should always comes first!\n// NB! Index size should always be 2 (preceding 0 required for 01..09) However, support for 100+ was added on 2023-02-27.\n// NB! Index value '00' are left as they are (is not paired/indexed/whatever.\nconst sf6Regexp = /^[0-9][0-9][0-9]-(?:[0-9][0-9]|[1-9][0-9]+)(?:[^0-9].*)?$/u;\n\nexport function isValidSubfield6(subfield) {\n if (subfield.code !== '6') {\n return false;\n }\n return subfield.value.match(sf6Regexp);\n}\n\nexport function subfield6GetTag(subfield) {\n if (isValidSubfield6(subfield)) {\n return subfield.value.substring(0, 3);\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumber(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.substring(4).replace(/\\D.*$/u, '');\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumberAsInteger(subfield) {\n const index = subfield6GetOccurrenceNumber(subfield);\n if (index === undefined || index === '00') {\n return 0;\n }\n const result = parseInt(index, 10);\n //nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debug);\n return result;\n}\n\nexport function subfield6ResetOccurrenceNumber(subfield, occurrenceNumber) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;\n\n const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield);\n //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);\n subfield.value = newValue;\n}\n\n\nfunction subfield6GetTail(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.replace(/^\\d+-\\d+/u, '');\n }\n return '';\n}\n\nexport function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumber) {\n if (subfield.code !== '6') {\n return false;\n }\n // We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...\n const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1');\n nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);\n return key === tagAndOccurrenceNumber;\n}\n\n// <= SUBFIELD, FIELD =>\n\nexport function fieldGetUnambiguousTag(field) {\n const tags = field.subfields.filter(sf => subfield6GetTag(sf));\n if (tags.length === 1) {\n return subfield6GetTag(tags[0]);\n }\n return undefined;\n}\n\nexport function fieldGetUnambiguousOccurrenceNumber(field) {\n const occurrenceNumbers = field.subfields.filter(sf => subfield6GetOccurrenceNumber(sf));\n if (occurrenceNumbers.length === 1) {\n return subfield6GetOccurrenceNumber(occurrenceNumbers[0]);\n }\n return undefined;\n}\n\nexport function fieldHasOccurrenceNumber(field, occurrenceNumber) {\n //nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`);\n return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);\n}\n\nexport function fieldResetOccurrenceNumber(field, newOccurrenceNumber, oldOccurrenceNumber = undefined) {\n field.subfields.forEach(subfield => innerReset(subfield)); // eslint-disable-line array-callback-return\n\n function innerReset(subfield) {\n // (Optional) Check that this is really the occurrence number we wan't to reseot\n if (oldOccurrenceNumber !== undefined) {\n const currOccurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (currOccurrenceNumber !== oldOccurrenceNumber) {\n return;\n }\n }\n subfield6ResetOccurrenceNumber(subfield, newOccurrenceNumber);\n }\n}\n\nexport function intToOccurrenceNumberString(i) {\n return i < 10 ? `0${i}` : `${i}`;\n}\n\nexport function fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {\n // used by reducer!\n //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`);\n const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];\n if (sf6s.length === 0) {\n return 0;\n }\n // There should always be one, but here we check every subfield.\n //nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debug);\n const vals = sf6s.map(sf => subfield6GetOccurrenceNumberAsInteger(sf));\n return Math.max(...vals);\n}\n\nexport function fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber) {\n return field.subfields && field.subfields.some(sf => subfield6HasWantedTagAndOccurrenceNumber(sf, tagAndOccurrenceNumber));\n}\n\n\n/*\nexport function getFieldsWithGivenOccurrenceNumberSubfield6(record, occurrenceNumberAsString) {\n const record.fields.filter(field => field\n\n function fieldHasIndex(field, index) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.find(sf => isValidSubfield6(sf) && subfieldGetOccurrenceNumber6(sf) === index);\n }\n}\n*/\n\n\nexport function fieldHasValidSubfield6(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield6(sf));\n}\n\nexport function isSubfield6Pair(field, otherField) {\n // No need to log this:\n //nvdebug(`LOOK for $6-pair:\\n ${fieldToString(field)}\\n ${fieldToString(otherField)}`);\n if (!fieldHasValidSubfield6(field) || !fieldHasValidSubfield6(otherField)) {\n return false;\n }\n\n if (!tagsArePairable6(field.tag, otherField.tag)) {\n //nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`);\n return false;\n }\n\n\n const fieldIndex = fieldGetUnambiguousOccurrenceNumber(field);\n if (fieldIndex === undefined || fieldIndex === '00') {\n //nvdebug(` FAILED. REASON: NO INDEX FOUND`);\n return false;\n }\n\n const otherFieldIndex = fieldGetUnambiguousOccurrenceNumber(otherField);\n\n\n if (fieldIndex !== otherFieldIndex) {\n //nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`);\n return false;\n }\n\n if (fieldGetUnambiguousTag(field) !== otherField.tag || field.tag !== fieldGetUnambiguousTag(otherField)) {\n //nvdebug(` FAILURE: TAG vs $6 TAG`);\n return false;\n }\n return true;\n\n function tagsArePairable6(tag1, tag2) {\n // How to do XOR operation in one line? Well, this is probably more readable...\n if (tag1 === '880' && tag2 === '880') {\n return false;\n }\n if (tag1 !== '880' && tag2 !== '880') {\n return false;\n }\n return true;\n }\n}\n\n\nfunction subfieldSevenToOneOccurrenceNumber(subfield) {\n if (subfield.code !== '6' || subfield.value.substring(0, 1) !== '7') {\n return;\n }\n subfield.value = `1${subfield.value.substring(1)}`;\n}\n\nexport function fieldSevenToOneOccurrenceNumber(field) {\n if (field.tag !== '880') {\n return;\n }\n field.subfields.forEach(sf => subfieldSevenToOneOccurrenceNumber(sf)); // eslint-disable-line array-callback-return\n}\n\n\nexport function fieldGetOccurrenceNumberPairs(field, candFields) {\n // NB! TAG!=880 returns 880 fields, TAG==880 returns non-880 field\n //nvdebug(` Trying to finds pair for ${fieldToString(field)} in ${candFields.length} fields`);\n const pairs = candFields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairs.length === 0) {\n nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`);\n return pairs;\n }\n nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`);\n pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`)); // eslint-disable-line array-callback-return\n return pairs;\n}\n\nexport function fieldGetOccurrenceNumbers(field) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n field.subfields?.forEach(sf => subfieldExtractOccurrenceNumber(sf));\n\n function subfieldExtractOccurrenceNumber(sf) {\n if (!isValidSubfield6(sf)) {\n return;\n }\n const occurrenceNumber = subfield6GetOccurrenceNumber(sf);\n if (occurrenceNumber === '00' || occurrenceNumbers.includes(occurrenceNumber)) {\n return;\n }\n occurrenceNumbers.push(occurrenceNumber);\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\nexport function fieldsGetOccurrenceNumbers(fields) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n\n fields.forEach(f => fieldProcessOccurrenceNumbers(f));\n\n function fieldProcessOccurrenceNumbers(f) {\n const newOccurrenceNumbers = fieldGetOccurrenceNumbers(f);\n newOccurrenceNumbers.forEach(occurrenceNumber => {\n if (!occurrenceNumbers.includes(occurrenceNumber)) {\n occurrenceNumbers.push(occurrenceNumber);\n }\n\n });\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\n/*\nexport function fieldGetSubfield6Pair(field, record) {\n const pairedFields = record.fields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairedFields.length !== 1) {\n return undefined;\n }\n // NB! It is theoretically possible to have multiple pairable 880 fields (one for each encoding)\n nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`);\n return pairedFields[0];\n}\n*/\n\n/*\nexport function pairAndStringify6(field, record) {\n const pair6 = fieldGetSubfield6Pair(field, record);\n if (!pair6) {\n return fieldToNormalizedString(field);\n }\n return fieldsToNormalizedString([field, pair6]);\n}\n*/\n\n// Frequencly list for $6 subfields in 1XX/7XX fields:\n// 231115 100\n// 183832 700\n// 28773 710\n// 2047 711\n// 661 110\n// 341 111\n// 284 130\n// 63 730\n// Thus there's a real risk of ending up with, say, identical 100 vs 700 chains.\n// Semi-hackily support 1XX/7XX-version: 7XX can be deleted if corresponding 1XX exists:\n\nexport function is7XX(tag) {\n return ['700', '710', '711', '730'].includes(tag);\n}\n\n\nfunction normalizeEntryTag(tag) {\n if (tag.match(/^[17](?:00|10|11|30)$/u)) {\n return `X${tag.substring(1)}`;\n }\n return tag;\n}\n\nfunction subfieldToNormalizedString(sf, tag, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n // targetLinkingNumber refers to $8.\n // normalizeEntryTagBoolean refers to 1XX/7XX tag values in subfield $6 value.\n if (isValidSubfield6(sf)) { // && targetLinkingNumber === 0) {\n // 1XX/7XX (entry tag) normalization:\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(tag) : tag;\n\n const occurrenceNumber = normalizeOccurrenceNumber ? 'XX' : subfield6GetOccurrenceNumber(sf);\n // If we are normalizing a $8 chain, don't normalize $6 occurrence number!\n // Replace $6 occurrence number with XX:\n return ` ‡${sf.code} ${tag2}-${occurrenceNumber}${subfield6GetTail(sf)}`;\n }\n\n if (isValidSubfield8(sf)) {\n const currLinkingNumber = getSubfield8LinkingNumber(sf); //getSubfield8Index(sf);\n if (targetLinkingNumber > 0 && currLinkingNumber === targetLinkingNumber) {\n // For $8 we should only XX the index we are looking at...\n const normVal = sf.value.replace(/^[0-9]+/u, 'XX');\n return ` ‡${sf.code} ${normVal}`;\n }\n return ''; // Other $8 subfields are meaningless in this context\n }\n return ` ${subfieldToString(sf)}`; // `‡${sf.code} ${sf.value}`;\n}\n\nexport function fieldToNormalizedString(field, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n if ('subfields' in field) {\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(field.tag) : field.tag;\n return `${tag2} ${field.ind1}${field.ind2}${formatAndNormalizeSubfields(field)}`;\n }\n return `${field.tag} ${field.value}`;\n\n function formatAndNormalizeSubfields(field) {\n return field.subfields.map(sf => subfieldToNormalizedString(sf, field.tag, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTagBoolean)).join('');\n }\n\n}\n\n\nfunction guessTargetLinkingNumber(fields, defaultTargetLinkingNumber) {\n if (defaultTargetLinkingNumber !== 0) {\n return defaultTargetLinkingNumber;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n return linkingNumbers.length === 1 ? linkingNumbers[0] : 0;\n}\n\nexport function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTag = false) {\n const targetLinkingNumber = guessTargetLinkingNumber(fields, defaultTargetLinkingNumber);\n\n nvdebug(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`);\n const strings = fields.map(field => fieldToNormalizedString(field, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTag));\n strings.sort();\n return strings.join('\\t__SEPARATOR__\\t');\n}\n\n\n/*\n\nexport function removeField6IfNeeded(field, record, fieldsAsString) {\n const pairField = fieldGetSubfield6Pair(field, record);\n const asString = pairField ? fieldsToNormalizedString([field, pairField]) : fieldToNormalizedString(field);\n nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`);\n const tmp = pairField ? fieldToString(pairField) : 'HUTI';\n nvdebug(`PAIR: ${tmp}`);\n nvdebug(`BASE:\\n ${fieldsAsString.join('\\n ')}`);\n if (!fieldsAsString.includes(asString)) {\n return;\n }\n nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`);\n record.removeField(field);\n\n if (pairField === undefined) {\n return;\n }\n nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`);\n record.removeField(pairField);\n}\n*/\n\nfunction getFirstField(record, fields) {\n const fieldsAsStrings = fields.map(field => fieldToString(field));\n //record.fields.forEach((field, i) => nvdebug(`${i}:\\t${fieldToString(field)}`));\n //nvdebug(`getFirstField: ${fieldsAsStrings.join('\\t')}`);\n const i = record.fields.findIndex(field => fieldsAsStrings.includes(fieldToString(field)));\n if (i > -1) {\n const field = record.fields[i];\n //nvdebug(`1st F: ${i + 1}/${record.fields.length} ${fieldToString(field)}`);\n return field;\n }\n return undefined;\n}\n\nfunction isRelevantSubfield6Chain(fields) {\n if (fields.length < 2) { // 1 non-880-field and 1+ 880 fields\n return false;\n }\n const non880 = fields.filter(f => f.tag !== '880');\n if (non880.length !== 1) {\n return false;\n }\n\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n if (linkingNumbers.length !== 0) {\n return false;\n }\n\n return fields.every(f => fieldHasSubfield(f, '6'));\n}\n\nexport function fieldIsFirstFieldInChain(field, chain, record) {\n // Interpretation of first: position of field in record (however, we might have a duplicate field. See tests...)\n const firstField = getFirstField(record, chain);\n if (firstField) {\n return fieldToString(field) === fieldToString(firstField);\n }\n return false;\n\n}\n\n\nexport function getAllLinkedSubfield6Fields(field, record) {\n const fields = get6s(field, record);\n const moreFields = add8s(fields, record);\n\n // Currently we don't handle fields with more than one $6 and/or $8 subfield.\n if (moreFields.length > fields.length) {\n return []; // Don't fix!\n }\n return moreFields;\n}\n\nexport function isFirstLinkedSubfield6Field(field, record) {\n if (!field.subfields) { // Is not a datafield\n return false;\n }\n const chain = getAllLinkedSubfield6Fields(field, record);\n if (!isRelevantSubfield6Chain(chain)) {\n nvdebug(`Rejected 6: ${fieldsToString(chain)}`);\n return false;\n }\n\n return fieldIsFirstFieldInChain(field, chain, record);\n}\n\nexport function recordGetSubfield6ChainHeads(record) {\n return record.fields.filter(field => isFirstLinkedSubfield6Field(field, record));\n}\n\nexport function recordGetMaxSubfield6OccurrenceNumberAsInteger(record) {\n if (record.fields.length === 0) {\n return 0;\n }\n // Should we cache the value here?\n const vals = record.fields.map((field) => fieldGetMaxSubfield6OccurrenceNumberAsInteger(field));\n return Math.max(...vals);\n}\n\nexport function get6s(field, candidateFields) { // NB! Convert field to fields!!!\n // Get all fields with given occurrence number\n const sixes = field.subfields.filter(sf => isValidSubfield6(sf));\n\n if (sixes.length === 0) {\n return [field];\n }\n nvdebug(`SIXES: ${sixes.length}`);\n const occurrenceNumbers = sixes.map(sf => subfield6GetOccurrenceNumber(sf)).filter(value => value !== undefined && value !== '00');\n nvdebug(occurrenceNumbers.join(' -- '));\n\n const relevantFields = candidateFields.filter(f => occurrenceNumbers.some(o => fieldHasOccurrenceNumber(f, o)));\n nvdebug(`${fieldToString(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`);\n relevantFields.forEach(f => nvdebug(fieldToString(f))); // eslint-disable-line array-callback-return\n return relevantFields;\n}\n\nexport function resetSubfield6Tag(subfield, tag) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n // NB! mainly for 1XX<->7XX transfers\n const newValue = `${tag}-${subfield.value.substring(4)}`;\n nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`, debugDev);\n subfield.value = newValue;\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/subfield8Utils.js
CHANGED
|
@@ -16,8 +16,7 @@ var _utils = require("./utils");
|
|
|
16
16
|
// import createDebugLogger from 'debug';
|
|
17
17
|
// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield8Utils');
|
|
18
18
|
|
|
19
|
-
const sf8Regexp = /^([1-9][0-9]*)(?:\.[0-9]+)?(?:\\[acprux])?$/u;
|
|
20
|
-
|
|
19
|
+
const sf8Regexp = /^([1-9][0-9]*)(?:\.[0-9]+)?(?:\\[acprux])?$/u;
|
|
21
20
|
function isValidSubfield8(subfield) {
|
|
22
21
|
if (subfield.code !== '8') {
|
|
23
22
|
return false;
|
|
@@ -54,7 +53,6 @@ function recordGetFieldsWithSubfield8LinkingNumber(record, linkingNumber) {
|
|
|
54
53
|
return record.fields.filter(field => fieldHasLinkingNumber(field, linkingNumber));
|
|
55
54
|
}
|
|
56
55
|
function fieldsGetAllSubfield8LinkingNumbers(fields) {
|
|
57
|
-
/* eslint-disable */
|
|
58
56
|
let subfield8LinkingNumbers = [];
|
|
59
57
|
fields.forEach(field => {
|
|
60
58
|
if (!field.subfields) {
|
|
@@ -69,7 +67,6 @@ function fieldsGetAllSubfield8LinkingNumbers(fields) {
|
|
|
69
67
|
});
|
|
70
68
|
});
|
|
71
69
|
return subfield8LinkingNumbers;
|
|
72
|
-
/* eslint-enable */
|
|
73
70
|
}
|
|
74
71
|
function recordGetAllSubfield8LinkingNumbers(record) {
|
|
75
72
|
return fieldsGetAllSubfield8LinkingNumbers(record.fields);
|
|
@@ -80,16 +77,18 @@ function add8s(fields, record) {
|
|
|
80
77
|
return fields;
|
|
81
78
|
}
|
|
82
79
|
(0, _utils.nvdebug)(`Linking number(s): ${linkingNumbers.join(', ')}`);
|
|
83
|
-
linkingNumbers.forEach(number => collectLinkingNumberFields(number));
|
|
84
|
-
|
|
80
|
+
linkingNumbers.forEach(number => collectLinkingNumberFields(number)); // eslint-disable-line array-callback-return
|
|
81
|
+
|
|
82
|
+
fields.forEach(f => (0, _utils.nvdebug)(`AFTER ADDING 8s: '${(0, _utils.fieldToString)(f)}'`)); // eslint-disable-line array-callback-return
|
|
83
|
+
|
|
85
84
|
return fields;
|
|
86
85
|
function collectLinkingNumberFields(linkingNumber) {
|
|
87
86
|
// Remove existing hits (to avoid field repetition):
|
|
88
|
-
fields = fields.filter(f => !fieldHasLinkingNumber(f, linkingNumber));
|
|
87
|
+
fields = fields.filter(f => !fieldHasLinkingNumber(f, linkingNumber));
|
|
89
88
|
// Add them and their "sisters" back:
|
|
90
89
|
const addableFields = record.fields.filter(f => fieldHasLinkingNumber(f, linkingNumber));
|
|
91
|
-
addableFields.forEach(f => (0, _utils.nvdebug)(`(RE-?)ADD ${(0, _utils.fieldToString)(f)}`));
|
|
92
|
-
fields = fields.concat(addableFields);
|
|
90
|
+
addableFields.forEach(f => (0, _utils.nvdebug)(`(RE-?)ADD ${(0, _utils.fieldToString)(f)}`)); // eslint-disable-line array-callback-return
|
|
91
|
+
fields = fields.concat(addableFields);
|
|
93
92
|
}
|
|
94
93
|
}
|
|
95
94
|
function fieldHasValidSubfield8(field) {
|