@natlibfi/marc-record-validators-melinda 11.2.2-alpha.1 → 11.2.2
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/dist/access-rights.spec.js +1 -1
- package/dist/access-rights.spec.js.map +1 -1
- package/dist/addMissingField041.js.map +1 -1
- package/dist/addMissingField041.spec.js +1 -1
- package/dist/addMissingField041.spec.js.map +1 -1
- package/dist/addMissingField336.js.map +1 -1
- package/dist/addMissingField336.spec.js +1 -1
- package/dist/addMissingField336.spec.js.map +1 -1
- package/dist/addMissingField337.js.map +1 -1
- package/dist/addMissingField337.spec.js +1 -1
- package/dist/addMissingField337.spec.js.map +1 -1
- package/dist/addMissingField338.js.map +1 -1
- package/dist/addMissingField338.spec.js +1 -1
- package/dist/addMissingField338.spec.js.map +1 -1
- package/dist/cyrillux-usemarcon-replacement.js +82 -22
- package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
- package/dist/cyrillux-usemarcon-replacement.spec.js +1 -1
- package/dist/cyrillux-usemarcon-replacement.spec.js.map +1 -1
- package/dist/double-commas.spec.js +1 -1
- package/dist/double-commas.spec.js.map +1 -1
- package/dist/duplicates-ind1.js.map +1 -1
- package/dist/duplicates-ind1.spec.js +1 -1
- package/dist/duplicates-ind1.spec.js.map +1 -1
- package/dist/empty-fields.js.map +1 -1
- package/dist/empty-fields.spec.js +1 -1
- package/dist/empty-fields.spec.js.map +1 -1
- package/dist/ending-punctuation.js +1 -1
- package/dist/ending-punctuation.js.map +1 -1
- package/dist/ending-punctuation.spec.js +1 -1
- package/dist/ending-punctuation.spec.js.map +1 -1
- package/dist/ending-whitespace.js.map +1 -1
- package/dist/ending-whitespace.spec.js +1 -1
- package/dist/ending-whitespace.spec.js.map +1 -1
- package/dist/field-008-18-34-character-groups.js +1 -1
- package/dist/field-008-18-34-character-groups.js.map +1 -1
- package/dist/field-008-18-34-character-groups.spec.js +1 -1
- package/dist/field-008-18-34-character-groups.spec.js.map +1 -1
- package/dist/field-505-separators.js +1 -1
- package/dist/field-505-separators.js.map +1 -1
- package/dist/field-505-separators.spec.js +1 -1
- package/dist/field-505-separators.spec.js.map +1 -1
- package/dist/field-521-fix.js +1 -1
- package/dist/field-521-fix.js.map +1 -1
- package/dist/field-521-fix.spec.js +1 -1
- package/dist/field-521-fix.spec.js.map +1 -1
- package/dist/field-exclusion.js.map +1 -1
- package/dist/field-exclusion.spec.js +1 -1
- package/dist/field-exclusion.spec.js.map +1 -1
- package/dist/field-structure.js.map +1 -1
- package/dist/field-structure.spec.js +1 -1
- package/dist/field-structure.spec.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 +1 -1
- package/dist/fix-33X.js.map +1 -1
- package/dist/fix-33X.spec.js +1 -1
- package/dist/fix-33X.spec.js.map +1 -1
- package/dist/fix-country-codes.js.map +1 -1
- package/dist/fix-country-codes.spec.js +1 -1
- package/dist/fix-country-codes.spec.js.map +1 -1
- package/dist/fix-language-codes.js +1 -1
- package/dist/fix-language-codes.js.map +1 -1
- package/dist/fix-language-codes.spec.js +1 -1
- package/dist/fix-language-codes.spec.js.map +1 -1
- package/dist/fixRelatorTerms.js +6 -3
- package/dist/fixRelatorTerms.js.map +1 -1
- package/dist/fixRelatorTerms.spec.js +1 -1
- package/dist/fixRelatorTerms.spec.js.map +1 -1
- package/dist/fixed-fields.js.map +1 -1
- package/dist/fixed-fields.spec.js +1 -1
- package/dist/fixed-fields.spec.js.map +1 -1
- package/dist/identical-fields.js.map +1 -1
- package/dist/identical-fields.spec.js +1 -1
- package/dist/identical-fields.spec.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/indicator-fixes.js +17 -0
- package/dist/indicator-fixes.js.map +1 -1
- package/dist/indicator-fixes.spec.js +1 -1
- package/dist/indicator-fixes.spec.js.map +1 -1
- package/dist/isbn-issn.js +1 -1
- package/dist/isbn-issn.js.map +1 -1
- package/dist/isbn-issn.spec.js +1 -1
- package/dist/isbn-issn.spec.js.map +1 -1
- package/dist/item-language.js +1 -1
- package/dist/item-language.js.map +1 -1
- package/dist/item-language.spec.js +1 -1
- package/dist/item-language.spec.js.map +1 -1
- package/dist/mergeField500Lisapainokset.js.map +1 -1
- package/dist/mergeField500Lisapainokset.spec.js +1 -1
- package/dist/mergeField500Lisapainokset.spec.js.map +1 -1
- package/dist/mergeRelatorTermFields.js +1 -1
- package/dist/mergeRelatorTermFields.js.map +1 -1
- package/dist/mergeRelatorTermFields.spec.js +1 -1
- package/dist/mergeRelatorTermFields.spec.js.map +1 -1
- package/dist/multiple-subfield-0.js.map +1 -1
- package/dist/multiple-subfield-0.spec.js +1 -1
- package/dist/multiple-subfield-0.spec.js.map +1 -1
- package/dist/non-breaking-space.js.map +1 -1
- package/dist/non-breaking-space.spec.js +1 -1
- package/dist/non-breaking-space.spec.js.map +1 -1
- package/dist/normalize-dashes.js +1 -1
- package/dist/normalize-dashes.js.map +1 -1
- package/dist/normalize-dashes.spec.js +1 -1
- package/dist/normalize-dashes.spec.js.map +1 -1
- package/dist/normalize-identifiers.js +1 -1
- package/dist/normalize-identifiers.js.map +1 -1
- package/dist/normalize-identifiers.spec.js +1 -1
- package/dist/normalize-identifiers.spec.js.map +1 -1
- package/dist/normalize-qualifying-information.js +1 -1
- package/dist/normalize-qualifying-information.js.map +1 -1
- package/dist/normalize-qualifying-information.spec.js +1 -1
- package/dist/normalize-qualifying-information.spec.js.map +1 -1
- package/dist/normalize-utf8-diacritics.js +1 -1
- package/dist/normalize-utf8-diacritics.js.map +1 -1
- package/dist/normalize-utf8-diacritics.spec.js +1 -1
- package/dist/normalize-utf8-diacritics.spec.js.map +1 -1
- package/dist/normalizeFieldForComparison.js +1 -1
- package/dist/normalizeFieldForComparison.js.map +1 -1
- package/dist/normalizeSubfieldValueForComparison.js +1 -1
- package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
- package/dist/prepublicationUtils.js +1 -1
- package/dist/prepublicationUtils.js.map +1 -1
- package/dist/punctuation/index.js +1 -1
- package/dist/punctuation/index.js.map +1 -1
- package/dist/punctuation/rules/index.js +1 -1
- package/dist/punctuation/rules/index.js.map +1 -1
- package/dist/punctuation.spec.js +1 -1
- package/dist/punctuation.spec.js.map +1 -1
- package/dist/punctuation2.js +1 -1
- package/dist/punctuation2.js.map +1 -1
- package/dist/punctuation2.spec.js +1 -1
- package/dist/punctuation2.spec.js.map +1 -1
- package/dist/reindexSubfield6OccurenceNumbers.js +1 -1
- package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
- package/dist/reindexSubfield6OccurenceNumbers.spec.js +1 -1
- package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +1 -1
- package/dist/removeDuplicateDataFields.js +1 -1
- package/dist/removeDuplicateDataFields.js.map +1 -1
- package/dist/removeDuplicateDataFields.spec.js +1 -1
- package/dist/removeDuplicateDataFields.spec.js.map +1 -1
- package/dist/removeInferiorDataFields.js +1 -1
- package/dist/removeInferiorDataFields.js.map +1 -1
- package/dist/removeInferiorDataFields.spec.js +1 -1
- package/dist/removeInferiorDataFields.spec.js.map +1 -1
- package/dist/resolvable-ext-references-melinda.js +1 -1
- package/dist/resolvable-ext-references-melinda.js.map +1 -1
- package/dist/resolvable-ext-references-melinda.spec.js +1 -1
- package/dist/resolvable-ext-references-melinda.spec.js.map +1 -1
- package/dist/resolveOrphanedSubfield6s.js +1 -1
- package/dist/resolveOrphanedSubfield6s.js.map +1 -1
- package/dist/resolveOrphanedSubfield6s.spec.js +1 -1
- package/dist/resolveOrphanedSubfield6s.spec.js.map +1 -1
- package/dist/sanitize-vocabulary-source-codes.js +5 -1
- package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
- package/dist/sanitize-vocabulary-source-codes.spec.js +1 -1
- package/dist/sanitize-vocabulary-source-codes.spec.js.map +1 -1
- package/dist/sort-tags.spec.js +1 -1
- package/dist/sort-tags.spec.js.map +1 -1
- package/dist/sortFields.js +1 -1
- package/dist/sortFields.js.map +1 -1
- package/dist/sortFields.spec.js +1 -1
- package/dist/sortFields.spec.js.map +1 -1
- package/dist/sortRelatorTerms.js +1 -1
- package/dist/sortRelatorTerms.js.map +1 -1
- package/dist/sortRelatorTerms.spec.js +1 -1
- package/dist/sortRelatorTerms.spec.js.map +1 -1
- package/dist/sortSubfields.js +1 -1
- package/dist/sortSubfields.js.map +1 -1
- package/dist/sortSubfields.spec.js +1 -1
- package/dist/sortSubfields.spec.js.map +1 -1
- package/dist/stripPunctuation.js.map +1 -1
- package/dist/stripPunctuation.spec.js +1 -1
- package/dist/stripPunctuation.spec.js.map +1 -1
- package/dist/subfield-exclusion.js.map +1 -1
- package/dist/subfield-exclusion.spec.js +1 -1
- package/dist/subfield-exclusion.spec.js.map +1 -1
- package/dist/subfield6Utils.js.map +1 -1
- package/dist/subfield8Utils.js.map +1 -1
- package/dist/subfieldValueNormalizations.js +1 -1
- package/dist/subfieldValueNormalizations.js.map +1 -1
- package/dist/subfieldValueNormalizations.spec.js +1 -1
- package/dist/subfieldValueNormalizations.spec.js.map +1 -1
- package/dist/sync-007-and-300.js +1 -1
- package/dist/sync-007-and-300.js.map +1 -1
- package/dist/sync-007-and-300.spec.js +1 -1
- package/dist/sync-007-and-300.spec.js.map +1 -1
- package/dist/typeOfDate-008.js +1 -1
- package/dist/typeOfDate-008.js.map +1 -1
- package/dist/typeOfDate-008.spec.js +1 -1
- package/dist/typeOfDate-008.spec.js.map +1 -1
- package/dist/unicode-decomposition.js.map +1 -1
- package/dist/unicode-decomposition.spec.js +1 -1
- package/dist/unicode-decomposition.spec.js.map +1 -1
- package/dist/update-field-540.spec.js +1 -1
- package/dist/update-field-540.spec.js.map +1 -1
- package/dist/urn.js +1 -1
- package/dist/urn.js.map +1 -1
- package/dist/urn.spec.js +1 -1
- package/dist/urn.spec.js.map +1 -1
- package/dist/utils.js +17 -0
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/cyrillux-usemarcon-replacement.js +87 -24
- package/src/fixRelatorTerms.js +5 -2
- package/src/indicator-fixes.js +19 -0
- package/src/sanitize-vocabulary-source-codes.js +4 -0
- package/src/utils.js +16 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f11/expectedResult.json +3 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f11/record.json +8 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f12/expectedResult.json +32 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f12/metadata.json +6 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f12/record.json +30 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f13/expectedResult.json +38 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f13/metadata.json +6 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f13/record.json +29 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f14/expectedResult.json +42 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f14/metadata.json +6 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f14/record.json +33 -0
- package/test-fixtures/indicator-fixes/09/expectedResult.json +10 -0
- package/test-fixtures/indicator-fixes/09/metadata.json +4 -0
- package/test-fixtures/indicator-fixes/09/record.json +11 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +74 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f04/metadata.json +8 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f04/record.json +75 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v04/expectedResult.json +5 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +8 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +75 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_marcRecord","require","_debug","_interopRequireDefault","_rules","obj","__esModule","default","debug","createDebug","cloneDeep","field","r","MarcRecord","appendField","get","tag","_default","readPunctuationRulesFromJSON","recordType","json","getRules","rules","filter","row","selector","map","namePortion","description","portion","preceedingPunctuation","exceptions","RegExp","replace","trim","autRules","bibRules","fieldToString","subfields","ind1","ind2","subfield","code","value","join","validateField","element","testField","JSON","stringify","punctuated","punctuateField","isEqual","rulesForField","getRulesForField","length","currentPortion","preceedingField","inNamePortion","sub","getPortion","forEach","includes","addSubfieldPunctuation","addNamePortionPunctuation","rule","test","undefined","toUpperCase","preceedingSubfield","subfieldContainsPunctuation","nextValue","currentSubfield","punctType","getPrecedingPunctuation","exceptionsFunctions","getExceptions","isExceptionCase","some","fn","endsInPunctuation","slice","punct","Error","exception","parseExceptions","expectionsString","exceptionRules","split","exceptionFuncs","exceptionRule","match","exec","type","preceededCode","normalizedType","normalizedCode","push","ifPrecededByException","validate","record","valid","fields","every","leader","fix"],"sources":["../../src/punctuation/index.js"],"sourcesContent":["import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebug from 'debug';\nimport {autRules, bibRules} from './rules';\n\nconst debug = createDebug('@natlibfi/marc-record-validator-melinda/punctuation:dev');\n\nfunction cloneDeep(field) {\n const r = new MarcRecord();\n r.appendField(field);\n return r.get(field.tag)?.[0];\n}\n\nexport default function () {\n function readPunctuationRulesFromJSON(recordType) {\n const json = getRules(recordType);\n const rules = json.filter(row => row.selector !== '').map(row => {\n const {selector, namePortion, description, portion, preceedingPunctuation, exceptions} = row;\n return {\n selector: new RegExp(selector.replace(/X/ug, '.'), 'u'),\n namePortion: namePortion.replace(/\\$/ug, '').trim(),\n description, portion, preceedingPunctuation, exceptions\n };\n });\n\n return rules;\n }\n\n function getRules(recordType) {\n if (recordType === 'z') {\n return autRules;\n }\n\n return bibRules;\n }\n\n function fieldToString(field) {\n if (field && field.subfields) {\n const ind1 = field.ind1 || ' ';\n const ind2 = field.ind2 || ' ';\n const subfields = field.subfields.map(subfield => `‡${subfield.code}${subfield.value}`).join('');\n return `${field.tag} ${ind1}${ind2} ${subfields}`;\n }\n\n return `${field.tag} ${field.value}`;\n }\n\n function validateField(recordType = 'a') {\n return function (element) {\n const testField = cloneDeep(element);\n debug(`Original field: ${JSON.stringify(element)}`);\n const punctuated = punctuateField(testField, recordType);\n debug(`Punctuation result: ${JSON.stringify(punctuated)}`);\n if (!punctuated) {\n debug('No punctuation result -> true');\n return true;\n }\n\n if (MarcRecord.isEqual(punctuated, element)) {\n debug(`Original field (element): ${JSON.stringify(element)}`);\n debug('Punctuation result equals original field');\n return true;\n }\n\n return false;\n };\n }\n\n function punctuateField(field, recordType) {\n const rules = readPunctuationRulesFromJSON(recordType);\n debug(`Handling field ${field.tag}`);\n debug(`Field contents: ${fieldToString(field)}`);\n const rulesForField = getRulesForField(field.tag, rules);\n if (rulesForField.length === 0) {\n debug(`No matching rules for field ${field.tag}`);\n return;\n }\n\n let currentPortion; // eslint-disable-line functional/no-let\n let preceedingField; // eslint-disable-line functional/no-let\n let inNamePortion = true; // eslint-disable-line functional/no-let\n\n debug(`Field subfields: ${field.subfields.map(sub => sub.code)}`);\n debug(`Field portions: ${field.subfields.map(sub => getPortion(sub, rulesForField))}`);\n\n field.subfields.forEach(subfield => {\n debug(`Handling subfield ${subfield.code}`);\n let portion = getPortion(subfield, rulesForField); // eslint-disable-line functional/no-let\n\n if (portion === false) {\n return;\n }\n\n if (portion === 'CF' || portion === 'NC') {\n return;\n }\n\n if (inNamePortion && portion.includes('T', 'S')) { // eslint-disable-line functional/no-conditional-statements\n debug(`Portion changed to ${portion}. Not in name portion anymore`);\n inNamePortion = false;\n }\n\n if (inNamePortion && portion === 'NT') { // eslint-disable-line functional/no-conditional-statements\n portion = 'N';\n }\n\n if (!inNamePortion && portion === 'NT') { // eslint-disable-line functional/no-conditional-statements\n portion = 'T';\n }\n\n debug(`Current portion is ${portion}.`);\n\n if (currentPortion) {\n if (currentPortion === portion) { // eslint-disable-line functional/no-conditional-statements\n debug(`Current stayed as ${portion}. Adding punctuation for subfield.`);\n addSubfieldPunctuation(preceedingField, subfield, rulesForField);\n } else {\n debug(`Current portion changed to ${portion}.`);\n if (portion !== 'S') { // eslint-disable-line functional/no-conditional-statements\n debug('Adding punctuation for portion.');\n addNamePortionPunctuation(preceedingField);\n }\n }\n }\n\n currentPortion = portion;\n preceedingField = subfield;\n });\n\n if (recordType !== 'z') { // eslint-disable-line functional/no-conditional-statements\n addNamePortionPunctuation(preceedingField);\n }\n\n debug(`After punctuation: ${fieldToString(field)}`);\n\n return field;\n }\n\n function getRulesForField(tag, rules) {\n return rules.filter(rule => rule.selector.test(tag));\n }\n\n function getPortion(subfield, rules) {\n debug(`Looking for namePortion for ${subfield.code}`);\n const [portion] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => rule.portion);\n\n if (portion === undefined) {\n return false;\n }\n\n return portion.toUpperCase();\n }\n\n function addNamePortionPunctuation(preceedingSubfield) {\n const subfieldContainsPunctuation = (/[?\")\\].\\-!,]$/u).test(preceedingSubfield.value);\n if (!subfieldContainsPunctuation) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value}.`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n }\n\n function addSubfieldPunctuation(preceedingSubfield, currentSubfield, rules) {\n const punctType = getPrecedingPunctuation(currentSubfield, rules);\n const exceptionsFunctions = getExceptions(currentSubfield, rules);\n\n const isExceptionCase = exceptionsFunctions.some(fn => fn(preceedingSubfield));\n\n if (isExceptionCase) {\n return;\n }\n\n const endsInPunctuation = (/[?\")\\]\\-!,]$/u).test(preceedingSubfield.value);\n debug(`addSubfieldPunctuation -- punctType: ${punctType} endsInPunctuation: ${endsInPunctuation}`);\n\n if (!endsInPunctuation) {\n if (punctType === 'PERIOD' && !(/\\.$/u).test(preceedingSubfield.value)) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value}.`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n }\n\n if (punctType === 'COMMA') {\n if (!(/,$/u).test(preceedingSubfield.value)) {\n if (!(/^[[(]/u).test(currentSubfield.value)) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value},`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n }\n }\n\n if (punctType === 'COND_COMMA') {\n if (!(/[-,]$/u).test(preceedingSubfield.value)) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value},`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n }\n\n if (punctType === 'SPACECOLON') {\n if (!(/:$/u).test(preceedingSubfield.value)) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value} :`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n if ((/[^ ]:$/u).test(preceedingSubfield.value)) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value.slice(0, -1)} :`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n\n }\n\n debug('addSubfieldPunctuation -- end');\n }\n\n function getPrecedingPunctuation(subfield, rules) {\n const [punct] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => rule.preceedingPunctuation);\n\n if (punct === undefined) {\n throw new Error(`Unknown subfield code ${subfield.code}`);\n }\n\n return punct.toUpperCase();\n }\n\n function getExceptions(subfield, rules) {\n const [exception] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => parseExceptions(rule.exceptions));\n\n if (exception === undefined) {\n throw new Error(`Unknown subfield code ${subfield.code}`);\n }\n\n return exception;\n }\n\n function parseExceptions(expectionsString) {\n const exceptionRules = expectionsString.split('\\n');\n const exceptionFuncs = [];\n\n exceptionRules.forEach(exceptionRule => {\n const match = (/- (.*) if preceded by (.*)/u).exec(exceptionRule); // eslint-disable-line prefer-named-capture-group\n if (match) { // eslint-disable-line functional/no-conditional-statements\n const [, type, preceededCode] = match;\n const normalizedType = type.trim().toUpperCase().trim();\n const normalizedCode = preceededCode.replace(/\\$/ug, '').trim();\n exceptionFuncs.push(ifPrecededByException(normalizedCode, normalizedType)); // eslint-disable-line functional/immutable-data\n }\n });\n\n return exceptionFuncs;\n }\n\n function ifPrecededByException(code, type) {\n return preceedingSubfield => {\n if (code === preceedingSubfield.code) {\n debug(`Adding ${type} to ${preceedingSubfield.code}`);\n if (type === 'SEMICOLON' && !(/;$/u).test(preceedingSubfield.value)) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value} ;`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n\n if (type === 'COLON' && !(/:$/u).test(preceedingSubfield.value)) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value} :`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n\n return true;\n }\n\n return false;\n };\n }\n\n function validate(record) {\n return {valid: record.fields.every(validateField(record.leader[6]))};\n }\n\n function fix(record) {\n record.fields.map(field => punctuateField(field, record.leader[6]));\n return true;\n }\n\n return {\n description: 'Fixes punctuation of fields',\n validate,\n fix\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_marcRecord","require","_debug","_interopRequireDefault","_rules","e","__esModule","default","debug","createDebug","cloneDeep","field","r","MarcRecord","appendField","get","tag","_default","readPunctuationRulesFromJSON","recordType","json","getRules","rules","filter","row","selector","map","namePortion","description","portion","preceedingPunctuation","exceptions","RegExp","replace","trim","autRules","bibRules","fieldToString","subfields","ind1","ind2","subfield","code","value","join","validateField","element","testField","JSON","stringify","punctuated","punctuateField","isEqual","rulesForField","getRulesForField","length","currentPortion","preceedingField","inNamePortion","sub","getPortion","forEach","includes","addSubfieldPunctuation","addNamePortionPunctuation","rule","test","undefined","toUpperCase","preceedingSubfield","subfieldContainsPunctuation","nextValue","currentSubfield","punctType","getPrecedingPunctuation","exceptionsFunctions","getExceptions","isExceptionCase","some","fn","endsInPunctuation","slice","punct","Error","exception","parseExceptions","expectionsString","exceptionRules","split","exceptionFuncs","exceptionRule","match","exec","type","preceededCode","normalizedType","normalizedCode","push","ifPrecededByException","validate","record","valid","fields","every","leader","fix"],"sources":["../../src/punctuation/index.js"],"sourcesContent":["import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebug from 'debug';\nimport {autRules, bibRules} from './rules';\n\nconst debug = createDebug('@natlibfi/marc-record-validator-melinda/punctuation:dev');\n\nfunction cloneDeep(field) {\n const r = new MarcRecord();\n r.appendField(field);\n return r.get(field.tag)?.[0];\n}\n\nexport default function () {\n function readPunctuationRulesFromJSON(recordType) {\n const json = getRules(recordType);\n const rules = json.filter(row => row.selector !== '').map(row => {\n const {selector, namePortion, description, portion, preceedingPunctuation, exceptions} = row;\n return {\n selector: new RegExp(selector.replace(/X/ug, '.'), 'u'),\n namePortion: namePortion.replace(/\\$/ug, '').trim(),\n description, portion, preceedingPunctuation, exceptions\n };\n });\n\n return rules;\n }\n\n function getRules(recordType) {\n if (recordType === 'z') {\n return autRules;\n }\n\n return bibRules;\n }\n\n function fieldToString(field) {\n if (field && field.subfields) {\n const ind1 = field.ind1 || ' ';\n const ind2 = field.ind2 || ' ';\n const subfields = field.subfields.map(subfield => `‡${subfield.code}${subfield.value}`).join('');\n return `${field.tag} ${ind1}${ind2} ${subfields}`;\n }\n\n return `${field.tag} ${field.value}`;\n }\n\n function validateField(recordType = 'a') {\n return function (element) {\n const testField = cloneDeep(element);\n debug(`Original field: ${JSON.stringify(element)}`);\n const punctuated = punctuateField(testField, recordType);\n debug(`Punctuation result: ${JSON.stringify(punctuated)}`);\n if (!punctuated) {\n debug('No punctuation result -> true');\n return true;\n }\n\n if (MarcRecord.isEqual(punctuated, element)) {\n debug(`Original field (element): ${JSON.stringify(element)}`);\n debug('Punctuation result equals original field');\n return true;\n }\n\n return false;\n };\n }\n\n function punctuateField(field, recordType) {\n const rules = readPunctuationRulesFromJSON(recordType);\n debug(`Handling field ${field.tag}`);\n debug(`Field contents: ${fieldToString(field)}`);\n const rulesForField = getRulesForField(field.tag, rules);\n if (rulesForField.length === 0) {\n debug(`No matching rules for field ${field.tag}`);\n return;\n }\n\n let currentPortion; // eslint-disable-line functional/no-let\n let preceedingField; // eslint-disable-line functional/no-let\n let inNamePortion = true; // eslint-disable-line functional/no-let\n\n debug(`Field subfields: ${field.subfields.map(sub => sub.code)}`);\n debug(`Field portions: ${field.subfields.map(sub => getPortion(sub, rulesForField))}`);\n\n field.subfields.forEach(subfield => {\n debug(`Handling subfield ${subfield.code}`);\n let portion = getPortion(subfield, rulesForField); // eslint-disable-line functional/no-let\n\n if (portion === false) {\n return;\n }\n\n if (portion === 'CF' || portion === 'NC') {\n return;\n }\n\n if (inNamePortion && portion.includes('T', 'S')) { // eslint-disable-line functional/no-conditional-statements\n debug(`Portion changed to ${portion}. Not in name portion anymore`);\n inNamePortion = false;\n }\n\n if (inNamePortion && portion === 'NT') { // eslint-disable-line functional/no-conditional-statements\n portion = 'N';\n }\n\n if (!inNamePortion && portion === 'NT') { // eslint-disable-line functional/no-conditional-statements\n portion = 'T';\n }\n\n debug(`Current portion is ${portion}.`);\n\n if (currentPortion) {\n if (currentPortion === portion) { // eslint-disable-line functional/no-conditional-statements\n debug(`Current stayed as ${portion}. Adding punctuation for subfield.`);\n addSubfieldPunctuation(preceedingField, subfield, rulesForField);\n } else {\n debug(`Current portion changed to ${portion}.`);\n if (portion !== 'S') { // eslint-disable-line functional/no-conditional-statements\n debug('Adding punctuation for portion.');\n addNamePortionPunctuation(preceedingField);\n }\n }\n }\n\n currentPortion = portion;\n preceedingField = subfield;\n });\n\n if (recordType !== 'z') { // eslint-disable-line functional/no-conditional-statements\n addNamePortionPunctuation(preceedingField);\n }\n\n debug(`After punctuation: ${fieldToString(field)}`);\n\n return field;\n }\n\n function getRulesForField(tag, rules) {\n return rules.filter(rule => rule.selector.test(tag));\n }\n\n function getPortion(subfield, rules) {\n debug(`Looking for namePortion for ${subfield.code}`);\n const [portion] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => rule.portion);\n\n if (portion === undefined) {\n return false;\n }\n\n return portion.toUpperCase();\n }\n\n function addNamePortionPunctuation(preceedingSubfield) {\n const subfieldContainsPunctuation = (/[?\")\\].\\-!,]$/u).test(preceedingSubfield.value);\n if (!subfieldContainsPunctuation) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value}.`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n }\n\n function addSubfieldPunctuation(preceedingSubfield, currentSubfield, rules) {\n const punctType = getPrecedingPunctuation(currentSubfield, rules);\n const exceptionsFunctions = getExceptions(currentSubfield, rules);\n\n const isExceptionCase = exceptionsFunctions.some(fn => fn(preceedingSubfield));\n\n if (isExceptionCase) {\n return;\n }\n\n const endsInPunctuation = (/[?\")\\]\\-!,]$/u).test(preceedingSubfield.value);\n debug(`addSubfieldPunctuation -- punctType: ${punctType} endsInPunctuation: ${endsInPunctuation}`);\n\n if (!endsInPunctuation) {\n if (punctType === 'PERIOD' && !(/\\.$/u).test(preceedingSubfield.value)) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value}.`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n }\n\n if (punctType === 'COMMA') {\n if (!(/,$/u).test(preceedingSubfield.value)) {\n if (!(/^[[(]/u).test(currentSubfield.value)) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value},`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n }\n }\n\n if (punctType === 'COND_COMMA') {\n if (!(/[-,]$/u).test(preceedingSubfield.value)) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value},`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n }\n\n if (punctType === 'SPACECOLON') {\n if (!(/:$/u).test(preceedingSubfield.value)) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value} :`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n if ((/[^ ]:$/u).test(preceedingSubfield.value)) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value.slice(0, -1)} :`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n\n }\n\n debug('addSubfieldPunctuation -- end');\n }\n\n function getPrecedingPunctuation(subfield, rules) {\n const [punct] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => rule.preceedingPunctuation);\n\n if (punct === undefined) {\n throw new Error(`Unknown subfield code ${subfield.code}`);\n }\n\n return punct.toUpperCase();\n }\n\n function getExceptions(subfield, rules) {\n const [exception] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => parseExceptions(rule.exceptions));\n\n if (exception === undefined) {\n throw new Error(`Unknown subfield code ${subfield.code}`);\n }\n\n return exception;\n }\n\n function parseExceptions(expectionsString) {\n const exceptionRules = expectionsString.split('\\n');\n const exceptionFuncs = [];\n\n exceptionRules.forEach(exceptionRule => {\n const match = (/- (.*) if preceded by (.*)/u).exec(exceptionRule); // eslint-disable-line prefer-named-capture-group\n if (match) { // eslint-disable-line functional/no-conditional-statements\n const [, type, preceededCode] = match;\n const normalizedType = type.trim().toUpperCase().trim();\n const normalizedCode = preceededCode.replace(/\\$/ug, '').trim();\n exceptionFuncs.push(ifPrecededByException(normalizedCode, normalizedType)); // eslint-disable-line functional/immutable-data\n }\n });\n\n return exceptionFuncs;\n }\n\n function ifPrecededByException(code, type) {\n return preceedingSubfield => {\n if (code === preceedingSubfield.code) {\n debug(`Adding ${type} to ${preceedingSubfield.code}`);\n if (type === 'SEMICOLON' && !(/;$/u).test(preceedingSubfield.value)) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value} ;`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n\n if (type === 'COLON' && !(/:$/u).test(preceedingSubfield.value)) { // eslint-disable-line functional/no-conditional-statements\n const nextValue = `${preceedingSubfield.value} :`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue; // eslint-disable-line functional/immutable-data\n }\n\n return true;\n }\n\n return false;\n };\n }\n\n function validate(record) {\n return {valid: record.fields.every(validateField(record.leader[6]))};\n }\n\n function fix(record) {\n record.fields.map(field => punctuateField(field, record.leader[6]));\n return true;\n }\n\n return {\n description: 'Fixes punctuation of fields',\n validate,\n fix\n };\n}\n"],"mappings":";;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAA2C,SAAAE,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE3C,MAAMG,KAAK,GAAG,IAAAC,cAAW,EAAC,yDAAyD,CAAC;AAEpF,SAASC,SAASA,CAACC,KAAK,EAAE;EACxB,MAAMC,CAAC,GAAG,IAAIC,sBAAU,CAAC,CAAC;EAC1BD,CAAC,CAACE,WAAW,CAACH,KAAK,CAAC;EACpB,OAAOC,CAAC,CAACG,GAAG,CAACJ,KAAK,CAACK,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9B;AAEe,SAAAC,SAAA,EAAY;EACzB,SAASC,4BAA4BA,CAACC,UAAU,EAAE;IAChD,MAAMC,IAAI,GAAGC,QAAQ,CAACF,UAAU,CAAC;IACjC,MAAMG,KAAK,GAAGF,IAAI,CAACG,MAAM,CAACC,GAAG,IAAIA,GAAG,CAACC,QAAQ,KAAK,EAAE,CAAC,CAACC,GAAG,CAACF,GAAG,IAAI;MAC/D,MAAM;QAACC,QAAQ;QAAEE,WAAW;QAAEC,WAAW;QAAEC,OAAO;QAAEC,qBAAqB;QAAEC;MAAU,CAAC,GAAGP,GAAG;MAC5F,OAAO;QACLC,QAAQ,EAAE,IAAIO,MAAM,CAACP,QAAQ,CAACQ,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC;QACvDN,WAAW,EAAEA,WAAW,CAACM,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAACC,IAAI,CAAC,CAAC;QACnDN,WAAW;QAAEC,OAAO;QAAEC,qBAAqB;QAAEC;MAC/C,CAAC;IACH,CAAC,CAAC;IAEF,OAAOT,KAAK;EACd;EAEA,SAASD,QAAQA,CAACF,UAAU,EAAE;IAC5B,IAAIA,UAAU,KAAK,GAAG,EAAE;MACtB,OAAOgB,eAAQ;IACjB;IAEA,OAAOC,eAAQ;EACjB;EAEA,SAASC,aAAaA,CAAC1B,KAAK,EAAE;IAC5B,IAAIA,KAAK,IAAIA,KAAK,CAAC2B,SAAS,EAAE;MAC5B,MAAMC,IAAI,GAAG5B,KAAK,CAAC4B,IAAI,IAAI,GAAG;MAC9B,MAAMC,IAAI,GAAG7B,KAAK,CAAC6B,IAAI,IAAI,GAAG;MAC9B,MAAMF,SAAS,GAAG3B,KAAK,CAAC2B,SAAS,CAACZ,GAAG,CAACe,QAAQ,IAAI,IAAIA,QAAQ,CAACC,IAAI,GAAGD,QAAQ,CAACE,KAAK,EAAE,CAAC,CAACC,IAAI,CAAC,EAAE,CAAC;MAChG,OAAO,GAAGjC,KAAK,CAACK,GAAG,IAAIuB,IAAI,GAAGC,IAAI,IAAIF,SAAS,EAAE;IACnD;IAEA,OAAO,GAAG3B,KAAK,CAACK,GAAG,OAAOL,KAAK,CAACgC,KAAK,EAAE;EACzC;EAEA,SAASE,aAAaA,CAAC1B,UAAU,GAAG,GAAG,EAAE;IACvC,OAAO,UAAU2B,OAAO,EAAE;MACxB,MAAMC,SAAS,GAAGrC,SAAS,CAACoC,OAAO,CAAC;MACpCtC,KAAK,CAAC,mBAAmBwC,IAAI,CAACC,SAAS,CAACH,OAAO,CAAC,EAAE,CAAC;MACnD,MAAMI,UAAU,GAAGC,cAAc,CAACJ,SAAS,EAAE5B,UAAU,CAAC;MACxDX,KAAK,CAAC,uBAAuBwC,IAAI,CAACC,SAAS,CAACC,UAAU,CAAC,EAAE,CAAC;MAC1D,IAAI,CAACA,UAAU,EAAE;QACf1C,KAAK,CAAC,+BAA+B,CAAC;QACtC,OAAO,IAAI;MACb;MAEA,IAAIK,sBAAU,CAACuC,OAAO,CAACF,UAAU,EAAEJ,OAAO,CAAC,EAAE;QAC3CtC,KAAK,CAAC,6BAA6BwC,IAAI,CAACC,SAAS,CAACH,OAAO,CAAC,EAAE,CAAC;QAC7DtC,KAAK,CAAC,0CAA0C,CAAC;QACjD,OAAO,IAAI;MACb;MAEA,OAAO,KAAK;IACd,CAAC;EACH;EAEA,SAAS2C,cAAcA,CAACxC,KAAK,EAAEQ,UAAU,EAAE;IACzC,MAAMG,KAAK,GAAGJ,4BAA4B,CAACC,UAAU,CAAC;IACtDX,KAAK,CAAC,kBAAkBG,KAAK,CAACK,GAAG,EAAE,CAAC;IACpCR,KAAK,CAAC,mBAAmB6B,aAAa,CAAC1B,KAAK,CAAC,EAAE,CAAC;IAChD,MAAM0C,aAAa,GAAGC,gBAAgB,CAAC3C,KAAK,CAACK,GAAG,EAAEM,KAAK,CAAC;IACxD,IAAI+B,aAAa,CAACE,MAAM,KAAK,CAAC,EAAE;MAC9B/C,KAAK,CAAC,+BAA+BG,KAAK,CAACK,GAAG,EAAE,CAAC;MACjD;IACF;IAEA,IAAIwC,cAAc,CAAC,CAAC;IACpB,IAAIC,eAAe,CAAC,CAAC;IACrB,IAAIC,aAAa,GAAG,IAAI,CAAC,CAAC;;IAE1BlD,KAAK,CAAC,oBAAoBG,KAAK,CAAC2B,SAAS,CAACZ,GAAG,CAACiC,GAAG,IAAIA,GAAG,CAACjB,IAAI,CAAC,EAAE,CAAC;IACjElC,KAAK,CAAC,mBAAmBG,KAAK,CAAC2B,SAAS,CAACZ,GAAG,CAACiC,GAAG,IAAIC,UAAU,CAACD,GAAG,EAAEN,aAAa,CAAC,CAAC,EAAE,CAAC;IAEtF1C,KAAK,CAAC2B,SAAS,CAACuB,OAAO,CAACpB,QAAQ,IAAI;MAClCjC,KAAK,CAAC,qBAAqBiC,QAAQ,CAACC,IAAI,EAAE,CAAC;MAC3C,IAAIb,OAAO,GAAG+B,UAAU,CAACnB,QAAQ,EAAEY,aAAa,CAAC,CAAC,CAAC;;MAEnD,IAAIxB,OAAO,KAAK,KAAK,EAAE;QACrB;MACF;MAEA,IAAIA,OAAO,KAAK,IAAI,IAAIA,OAAO,KAAK,IAAI,EAAE;QACxC;MACF;MAEA,IAAI6B,aAAa,IAAI7B,OAAO,CAACiC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;QAAE;QACjDtD,KAAK,CAAC,sBAAsBqB,OAAO,+BAA+B,CAAC;QACnE6B,aAAa,GAAG,KAAK;MACvB;MAEA,IAAIA,aAAa,IAAI7B,OAAO,KAAK,IAAI,EAAE;QAAE;QACvCA,OAAO,GAAG,GAAG;MACf;MAEA,IAAI,CAAC6B,aAAa,IAAI7B,OAAO,KAAK,IAAI,EAAE;QAAE;QACxCA,OAAO,GAAG,GAAG;MACf;MAEArB,KAAK,CAAC,sBAAsBqB,OAAO,GAAG,CAAC;MAEvC,IAAI2B,cAAc,EAAE;QAClB,IAAIA,cAAc,KAAK3B,OAAO,EAAE;UAAE;UAChCrB,KAAK,CAAC,qBAAqBqB,OAAO,oCAAoC,CAAC;UACvEkC,sBAAsB,CAACN,eAAe,EAAEhB,QAAQ,EAAEY,aAAa,CAAC;QAClE,CAAC,MAAM;UACL7C,KAAK,CAAC,8BAA8BqB,OAAO,GAAG,CAAC;UAC/C,IAAIA,OAAO,KAAK,GAAG,EAAE;YAAE;YACrBrB,KAAK,CAAC,iCAAiC,CAAC;YACxCwD,yBAAyB,CAACP,eAAe,CAAC;UAC5C;QACF;MACF;MAEAD,cAAc,GAAG3B,OAAO;MACxB4B,eAAe,GAAGhB,QAAQ;IAC5B,CAAC,CAAC;IAEF,IAAItB,UAAU,KAAK,GAAG,EAAE;MAAE;MACxB6C,yBAAyB,CAACP,eAAe,CAAC;IAC5C;IAEAjD,KAAK,CAAC,sBAAsB6B,aAAa,CAAC1B,KAAK,CAAC,EAAE,CAAC;IAEnD,OAAOA,KAAK;EACd;EAEA,SAAS2C,gBAAgBA,CAACtC,GAAG,EAAEM,KAAK,EAAE;IACpC,OAAOA,KAAK,CAACC,MAAM,CAAC0C,IAAI,IAAIA,IAAI,CAACxC,QAAQ,CAACyC,IAAI,CAAClD,GAAG,CAAC,CAAC;EACtD;EAEA,SAAS4C,UAAUA,CAACnB,QAAQ,EAAEnB,KAAK,EAAE;IACnCd,KAAK,CAAC,+BAA+BiC,QAAQ,CAACC,IAAI,EAAE,CAAC;IACrD,MAAM,CAACb,OAAO,CAAC,GAAGP,KAAK,CAACC,MAAM,CAAC0C,IAAI,IAAIA,IAAI,CAACtC,WAAW,KAAKc,QAAQ,CAACC,IAAI,CAAC,CAAChB,GAAG,CAACuC,IAAI,IAAIA,IAAI,CAACpC,OAAO,CAAC;IAEpG,IAAIA,OAAO,KAAKsC,SAAS,EAAE;MACzB,OAAO,KAAK;IACd;IAEA,OAAOtC,OAAO,CAACuC,WAAW,CAAC,CAAC;EAC9B;EAEA,SAASJ,yBAAyBA,CAACK,kBAAkB,EAAE;IACrD,MAAMC,2BAA2B,GAAI,gBAAgB,CAAEJ,IAAI,CAACG,kBAAkB,CAAC1B,KAAK,CAAC;IACrF,IAAI,CAAC2B,2BAA2B,EAAE;MAAE;MAClC,MAAMC,SAAS,GAAG,GAAGF,kBAAkB,CAAC1B,KAAK,GAAG;MAChDnC,KAAK,CAAC,oBAAoB6D,kBAAkB,CAAC3B,IAAI,UAAU2B,kBAAkB,CAAC1B,KAAK,SAAS4B,SAAS,GAAG,CAAC;MACzGF,kBAAkB,CAAC1B,KAAK,GAAG4B,SAAS,CAAC,CAAC;IACxC;EACF;EAEA,SAASR,sBAAsBA,CAACM,kBAAkB,EAAEG,eAAe,EAAElD,KAAK,EAAE;IAC1E,MAAMmD,SAAS,GAAGC,uBAAuB,CAACF,eAAe,EAAElD,KAAK,CAAC;IACjE,MAAMqD,mBAAmB,GAAGC,aAAa,CAACJ,eAAe,EAAElD,KAAK,CAAC;IAEjE,MAAMuD,eAAe,GAAGF,mBAAmB,CAACG,IAAI,CAACC,EAAE,IAAIA,EAAE,CAACV,kBAAkB,CAAC,CAAC;IAE9E,IAAIQ,eAAe,EAAE;MACnB;IACF;IAEA,MAAMG,iBAAiB,GAAI,eAAe,CAAEd,IAAI,CAACG,kBAAkB,CAAC1B,KAAK,CAAC;IAC1EnC,KAAK,CAAC,wCAAwCiE,SAAS,uBAAuBO,iBAAiB,EAAE,CAAC;IAElG,IAAI,CAACA,iBAAiB,EAAE;MACtB,IAAIP,SAAS,KAAK,QAAQ,IAAI,CAAE,MAAM,CAAEP,IAAI,CAACG,kBAAkB,CAAC1B,KAAK,CAAC,EAAE;QAAE;QACxE,MAAM4B,SAAS,GAAG,GAAGF,kBAAkB,CAAC1B,KAAK,GAAG;QAChDnC,KAAK,CAAC,oBAAoB6D,kBAAkB,CAAC3B,IAAI,UAAU2B,kBAAkB,CAAC1B,KAAK,SAAS4B,SAAS,GAAG,CAAC;QACzGF,kBAAkB,CAAC1B,KAAK,GAAG4B,SAAS,CAAC,CAAC;MACxC;IACF;IAEA,IAAIE,SAAS,KAAK,OAAO,EAAE;MACzB,IAAI,CAAE,KAAK,CAAEP,IAAI,CAACG,kBAAkB,CAAC1B,KAAK,CAAC,EAAE;QAC3C,IAAI,CAAE,QAAQ,CAAEuB,IAAI,CAACM,eAAe,CAAC7B,KAAK,CAAC,EAAE;UAAE;UAC7C,MAAM4B,SAAS,GAAG,GAAGF,kBAAkB,CAAC1B,KAAK,GAAG;UAChDnC,KAAK,CAAC,oBAAoB6D,kBAAkB,CAAC3B,IAAI,UAAU2B,kBAAkB,CAAC1B,KAAK,SAAS4B,SAAS,GAAG,CAAC;UACzGF,kBAAkB,CAAC1B,KAAK,GAAG4B,SAAS,CAAC,CAAC;QACxC;MACF;IACF;IAEA,IAAIE,SAAS,KAAK,YAAY,EAAE;MAC9B,IAAI,CAAE,QAAQ,CAAEP,IAAI,CAACG,kBAAkB,CAAC1B,KAAK,CAAC,EAAE;QAAE;QAChD,MAAM4B,SAAS,GAAG,GAAGF,kBAAkB,CAAC1B,KAAK,GAAG;QAChDnC,KAAK,CAAC,oBAAoB6D,kBAAkB,CAAC3B,IAAI,UAAU2B,kBAAkB,CAAC1B,KAAK,SAAS4B,SAAS,GAAG,CAAC;QACzGF,kBAAkB,CAAC1B,KAAK,GAAG4B,SAAS,CAAC,CAAC;MACxC;IACF;IAEA,IAAIE,SAAS,KAAK,YAAY,EAAE;MAC9B,IAAI,CAAE,KAAK,CAAEP,IAAI,CAACG,kBAAkB,CAAC1B,KAAK,CAAC,EAAE;QAAE;QAC7C,MAAM4B,SAAS,GAAG,GAAGF,kBAAkB,CAAC1B,KAAK,IAAI;QACjDnC,KAAK,CAAC,oBAAoB6D,kBAAkB,CAAC3B,IAAI,UAAU2B,kBAAkB,CAAC1B,KAAK,SAAS4B,SAAS,GAAG,CAAC;QACzGF,kBAAkB,CAAC1B,KAAK,GAAG4B,SAAS,CAAC,CAAC;MACxC;MACA,IAAK,SAAS,CAAEL,IAAI,CAACG,kBAAkB,CAAC1B,KAAK,CAAC,EAAE;QAAE;QAChD,MAAM4B,SAAS,GAAG,GAAGF,kBAAkB,CAAC1B,KAAK,CAACsC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;QAC9DzE,KAAK,CAAC,oBAAoB6D,kBAAkB,CAAC3B,IAAI,UAAU2B,kBAAkB,CAAC1B,KAAK,SAAS4B,SAAS,GAAG,CAAC;QACzGF,kBAAkB,CAAC1B,KAAK,GAAG4B,SAAS,CAAC,CAAC;MACxC;IAEF;IAEA/D,KAAK,CAAC,+BAA+B,CAAC;EACxC;EAEA,SAASkE,uBAAuBA,CAACjC,QAAQ,EAAEnB,KAAK,EAAE;IAChD,MAAM,CAAC4D,KAAK,CAAC,GAAG5D,KAAK,CAACC,MAAM,CAAC0C,IAAI,IAAIA,IAAI,CAACtC,WAAW,KAAKc,QAAQ,CAACC,IAAI,CAAC,CAAChB,GAAG,CAACuC,IAAI,IAAIA,IAAI,CAACnC,qBAAqB,CAAC;IAEhH,IAAIoD,KAAK,KAAKf,SAAS,EAAE;MACvB,MAAM,IAAIgB,KAAK,CAAC,yBAAyB1C,QAAQ,CAACC,IAAI,EAAE,CAAC;IAC3D;IAEA,OAAOwC,KAAK,CAACd,WAAW,CAAC,CAAC;EAC5B;EAEA,SAASQ,aAAaA,CAACnC,QAAQ,EAAEnB,KAAK,EAAE;IACtC,MAAM,CAAC8D,SAAS,CAAC,GAAG9D,KAAK,CAACC,MAAM,CAAC0C,IAAI,IAAIA,IAAI,CAACtC,WAAW,KAAKc,QAAQ,CAACC,IAAI,CAAC,CAAChB,GAAG,CAACuC,IAAI,IAAIoB,eAAe,CAACpB,IAAI,CAAClC,UAAU,CAAC,CAAC;IAE1H,IAAIqD,SAAS,KAAKjB,SAAS,EAAE;MAC3B,MAAM,IAAIgB,KAAK,CAAC,yBAAyB1C,QAAQ,CAACC,IAAI,EAAE,CAAC;IAC3D;IAEA,OAAO0C,SAAS;EAClB;EAEA,SAASC,eAAeA,CAACC,gBAAgB,EAAE;IACzC,MAAMC,cAAc,GAAGD,gBAAgB,CAACE,KAAK,CAAC,IAAI,CAAC;IACnD,MAAMC,cAAc,GAAG,EAAE;IAEzBF,cAAc,CAAC1B,OAAO,CAAC6B,aAAa,IAAI;MACtC,MAAMC,KAAK,GAAI,6BAA6B,CAAEC,IAAI,CAACF,aAAa,CAAC,CAAC,CAAC;MACnE,IAAIC,KAAK,EAAE;QAAE;QACX,MAAM,GAAGE,IAAI,EAAEC,aAAa,CAAC,GAAGH,KAAK;QACrC,MAAMI,cAAc,GAAGF,IAAI,CAAC3D,IAAI,CAAC,CAAC,CAACkC,WAAW,CAAC,CAAC,CAAClC,IAAI,CAAC,CAAC;QACvD,MAAM8D,cAAc,GAAGF,aAAa,CAAC7D,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAACC,IAAI,CAAC,CAAC;QAC/DuD,cAAc,CAACQ,IAAI,CAACC,qBAAqB,CAACF,cAAc,EAAED,cAAc,CAAC,CAAC,CAAC,CAAC;MAC9E;IACF,CAAC,CAAC;IAEF,OAAON,cAAc;EACvB;EAEA,SAASS,qBAAqBA,CAACxD,IAAI,EAAEmD,IAAI,EAAE;IACzC,OAAOxB,kBAAkB,IAAI;MAC3B,IAAI3B,IAAI,KAAK2B,kBAAkB,CAAC3B,IAAI,EAAE;QACpClC,KAAK,CAAC,UAAUqF,IAAI,OAAOxB,kBAAkB,CAAC3B,IAAI,EAAE,CAAC;QACrD,IAAImD,IAAI,KAAK,WAAW,IAAI,CAAE,KAAK,CAAE3B,IAAI,CAACG,kBAAkB,CAAC1B,KAAK,CAAC,EAAE;UAAE;UACrE,MAAM4B,SAAS,GAAG,GAAGF,kBAAkB,CAAC1B,KAAK,IAAI;UACjDnC,KAAK,CAAC,oBAAoB6D,kBAAkB,CAAC3B,IAAI,UAAU2B,kBAAkB,CAAC1B,KAAK,SAAS4B,SAAS,GAAG,CAAC;UACzGF,kBAAkB,CAAC1B,KAAK,GAAG4B,SAAS,CAAC,CAAC;QACxC;QAEA,IAAIsB,IAAI,KAAK,OAAO,IAAI,CAAE,KAAK,CAAE3B,IAAI,CAACG,kBAAkB,CAAC1B,KAAK,CAAC,EAAE;UAAE;UACjE,MAAM4B,SAAS,GAAG,GAAGF,kBAAkB,CAAC1B,KAAK,IAAI;UACjDnC,KAAK,CAAC,oBAAoB6D,kBAAkB,CAAC3B,IAAI,UAAU2B,kBAAkB,CAAC1B,KAAK,SAAS4B,SAAS,GAAG,CAAC;UACzGF,kBAAkB,CAAC1B,KAAK,GAAG4B,SAAS,CAAC,CAAC;QACxC;QAEA,OAAO,IAAI;MACb;MAEA,OAAO,KAAK;IACd,CAAC;EACH;EAEA,SAAS4B,QAAQA,CAACC,MAAM,EAAE;IACxB,OAAO;MAACC,KAAK,EAAED,MAAM,CAACE,MAAM,CAACC,KAAK,CAAC1D,aAAa,CAACuD,MAAM,CAACI,MAAM,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;EACtE;EAEA,SAASC,GAAGA,CAACL,MAAM,EAAE;IACnBA,MAAM,CAACE,MAAM,CAAC5E,GAAG,CAACf,KAAK,IAAIwC,cAAc,CAACxC,KAAK,EAAEyF,MAAM,CAACI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO,IAAI;EACb;EAEA,OAAO;IACL5E,WAAW,EAAE,6BAA6B;IAC1CuE,QAAQ;IACRM;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -17,5 +17,5 @@ Object.defineProperty(exports, "bibRules", {
|
|
|
17
17
|
});
|
|
18
18
|
var _bib = _interopRequireDefault(require("./bib"));
|
|
19
19
|
var _aut = _interopRequireDefault(require("./aut"));
|
|
20
|
-
function _interopRequireDefault(
|
|
20
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
21
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_bib","_interopRequireDefault","require","_aut","
|
|
1
|
+
{"version":3,"file":"index.js","names":["_bib","_interopRequireDefault","require","_aut","e","__esModule","default"],"sources":["../../../src/punctuation/rules/index.js"],"sourcesContent":["import bibRules from './bib';\nimport autRules from './aut';\n\nexport {\n bibRules,\n autRules\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,IAAAA,IAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,IAAA,GAAAF,sBAAA,CAAAC,OAAA;AAA6B,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA","ignoreList":[]}
|
package/dist/punctuation.spec.js
CHANGED
|
@@ -6,7 +6,7 @@ var _punctuation = _interopRequireDefault(require("./punctuation/"));
|
|
|
6
6
|
var _fixura = require("@natlibfi/fixura");
|
|
7
7
|
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
8
8
|
var _debug = _interopRequireDefault(require("debug"));
|
|
9
|
-
function _interopRequireDefault(
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
10
|
(0, _fixugen.default)({
|
|
11
11
|
callback,
|
|
12
12
|
path: [__dirname, '..', 'test-fixtures', 'punctuation'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"punctuation.spec.js","names":["_chai","require","_marcRecord","_punctuation","_interopRequireDefault","_fixura","_fixugen","_debug","
|
|
1
|
+
{"version":3,"file":"punctuation.spec.js","names":["_chai","require","_marcRecord","_punctuation","_interopRequireDefault","_fixura","_fixugen","_debug","e","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/punctuation.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './punctuation/';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'punctuation'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,aAAa,CAAC;EACvDC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,2DAA2D,CAAC;AAE5F,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,oBAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,oBAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC","ignoreList":[]}
|
package/dist/punctuation2.js
CHANGED
|
@@ -12,7 +12,7 @@ var _endingPunctuation = require("./ending-punctuation");
|
|
|
12
12
|
var _subfield6Utils = require("./subfield6Utils");
|
|
13
13
|
var _utils = require("./utils");
|
|
14
14
|
var _clone = _interopRequireDefault(require("clone"));
|
|
15
|
-
function _interopRequireDefault(
|
|
15
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
16
|
/*
|
|
17
17
|
* punctuation.js -- try and fix a marc field punctuation
|
|
18
18
|
*
|
package/dist/punctuation2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"punctuation2.js","names":["_endingPunctuation","require","_subfield6Utils","_utils","_clone","_interopRequireDefault","obj","__esModule","default","descriptionString","_default","description","validate","fix","record","nvdebug","res","message","valid","fields","forEach","f","fieldFixPunctuation","fieldsNeedingModification","filter","fieldNeedsModification","values","map","fieldToString","newValues","fieldGetFixedString","messages","val","i","length","isControlSubfield","subfield","includes","code","getNextRelevantSubfield","field","currSubfieldIndex","subfields","find","index","add","cloneField","clone","operation","subfieldFixPunctuation","subfieldStripPunctuation","sf","originalFieldAsString","modifiedFieldAsString","needsPuncAfterAlphanumeric","defaultNeedsPuncAfter2","doesNotEndInPunc","blocksPuncRHS","allowsPuncRHS","dotIsProbablyPunc","puncIsProbablyPunc","removeColons","removeX00Comma","cleanRHS","cleanX00dCommaOrDot","cleanX00aDot","cleanCorruption","cleanX00eDot","removeCommaBeforeLanguageSubfieldL","removeCommaBeforeTitleSubfieldT","X00RemoveDotAfterBracket","cleanPuncBeforeLanguage","addX00aComma","addX00dComma","addX00aComma2","addX00Dot","addX10iColon","addX10bDot","addX10eComma","addX10Dot","addColonToRelationshipInformation","addDotBeforeLanguageSubfieldL","addSemicolonBeforeVolumeDesignation","NONE","ADD","REMOVE","REMOVE_AND_ADD","removeCrapFromAllEntryFields","removeX00Whatever","removeX10Whatever","removeX11Whatever","removeX30Whatever","remove490And830Whatever","linkingEntryWhatever","crappy24X","cleanCrappyPunctuationRules","cleanLegalX00Comma","cleanLegalX00bDot","context","cleanLegalX00iColon","cleanLegalX00Dot","cleanDotBeforeLanguageSubfieldL","legalEntryField","legalX00punc","cleanLegalX10Comma","cleanLegalX10Dot","legalX10punc","cleanLegalSeriesTitle","clean24X","cleanValidPunctuationRules","addToAllEntryFields","addX00","addX10","addX11","addX30","add24X","add245","addSeriesTitle","addPairedPunctuationRules","ruleAppliesToSubfieldCode","targetSubfieldCodes","currSubfieldCode","negation","ruleAppliesToField","rule","ind1","ind2","ruleAppliesToCurrentSubfield","value","match","ruleAppliesToNextSubfield","nextSubfield","followedBy","contextRHS","checkRule","subfield1","subfield2","applyPunctuationRules","ruleArray","tag2","tag","fieldGetUnambiguousTag","candRules","remove","replace","fieldStripPunctuation","useExternalEndPunctuation","validateSingleField"],"sources":["../src/punctuation2.js"],"sourcesContent":["/*\n* punctuation.js -- try and fix a marc field punctuation\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n* NOTE #1: https://www.kiwi.fi/display/kumea/Loppupisteohje is implemented via another validator/fixer (ending-punctuation).\n* This file has some support but it's now yet thorough. (And mmight never be.)\n* NOTE #2: Validator/fixer punctuation does similar stuff, but focuses on X00 fields.\n* NOTE #3: As of 2023-06-05 control subfields ($0...$9) are obsolete. Don't use them in rules.\n* (They are jumped over when looking for next (non-controlfield subfield)\n*/\nimport {validateSingleField} from './ending-punctuation';\nimport {fieldGetUnambiguousTag} from './subfield6Utils';\n//import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\nimport clone from 'clone';\n\n//const debug = createDebugLogger('debug/punctuation2');\n\nconst descriptionString = 'Remove invalid and add valid punctuation to data fields';\nexport default function () {\n return {\n description: descriptionString,\n validate, fix\n };\n\n function fix(record) {\n nvdebug(`${descriptionString}: fixer`);\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fieldFixPunctuation(f));\n return res;\n }\n\n function validate(record) {\n nvdebug(`${descriptionString}: validate`);\n\n const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, true));\n\n\n const values = fieldsNeedingModification.map(f => fieldToString(f));\n const newValues = fieldsNeedingModification.map(f => fieldGetFixedString(f, true));\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; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nfunction isControlSubfield(subfield) {\n return ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].includes(subfield.code);\n}\n\nfunction getNextRelevantSubfield(field, currSubfieldIndex) {\n return field.subfields.find((subfield, index) => index > currSubfieldIndex && !isControlSubfield(subfield));\n}\n\nexport function fieldGetFixedString(field, add = true) {\n const cloneField = clone(field);\n const operation = add ? subfieldFixPunctuation : subfieldStripPunctuation;\n cloneField.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n operation(cloneField, sf, getNextRelevantSubfield(cloneField, i));\n });\n return fieldToString(cloneField);\n}\n\nexport function fieldNeedsModification(field, add = true) {\n if (!field.subfields) {\n return false;\n }\n\n const originalFieldAsString = fieldToString(field);\n const modifiedFieldAsString = fieldGetFixedString(field, add);\n\n return modifiedFieldAsString !== originalFieldAsString;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////\n// <= Above code is written for the validator logic <= //\n// => Everything below was originally transferred from reducers' punctuation.js => //\n/////////////////////////////////////////////////////////////////////////////////////\n\n\n//const stripCrap = / *[-;:,+]+$/u;\nconst needsPuncAfterAlphanumeric = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö)$/u;\nconst defaultNeedsPuncAfter2 = /(?:[\\]a-zA-Z0-9)]|ä|å|ö|Å|Ä|Ö)$/u;\nconst doesNotEndInPunc = /[^!?.:;,]$/u; // non-punc for pre-240/700/XXX $, note that '.' comes if preceded by ')'\nconst blocksPuncRHS = /^(?:\\()/u;\nconst allowsPuncRHS = /^(?:[A-Za-z0-9]|å|ä|ö|Å|Ä|Ö)/u;\n\nconst dotIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö|(?:[A-Za-z0-9]|Å|Ä|Ö)(?:[A-Z]|Å|Ä|Ö))\\.$/u;\nconst puncIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö) ?[.,:;]$/u;\n// NB! 65X: Finnish terms don't use punctuation, but international ones do. Neither one is currently (2021-11-08) coded here.\n\n// Will unfortunately trigger \"Sukunimi, Th.\" type:\nconst removeColons = {'code': 'abcdefghijklmnopqrstuvwxyz', 'remove': / *[;:]$/u};\nconst removeX00Comma = {'code': 'abcdenqt', 'followedBy': 'abcdenqtv#', 'context': /.,$/u, 'remove': /,$/u};\nconst cleanRHS = {'code': 'abcd', 'followedBy': 'bcde', 'context': /(?:(?:[a-z0-9]|å|ä|ö)\\.|,)$/u, 'contextRHS': blocksPuncRHS, 'remove': /[.,]$/u};\nconst cleanX00dCommaOrDot = {'code': 'd', 'followedBy': 'et#', 'context': /[0-9]-[,.]$/u, 'remove': /[,.]$/u};\nconst cleanX00aDot = {'code': 'abcde', 'followedBy': 'cdegj', 'context': dotIsProbablyPunc, 'remove': /\\.$/u};\nconst cleanCorruption = {'code': 'abcdefghijklmnopqrstuvwxyz', 'remove': / \\.$/u};\n// These $e dot removals are tricky: before removing the comma, we should know that it ain't an abbreviation such as \"esitt.\"...\nconst cleanX00eDot = {'code': 'e', 'followedBy': 'egj#', 'context': /(?:[ai]ja|jä)[.,]$/u, 'remove': /\\.$/u};\nconst removeCommaBeforeLanguageSubfieldL = {'followedBy': 'l', 'remove': /,$/u};\nconst removeCommaBeforeTitleSubfieldT = {'followedBy': 't', 'remove': /,$/u};\n\nconst X00RemoveDotAfterBracket = {'code': 'cq', 'context': /\\)\\.$/u, 'remove': /\\.$/u};\n// 390, 800, 810, 830...\nconst cleanPuncBeforeLanguage = {'code': 'atvxyz', 'followedBy': 'l', 'context': puncIsProbablyPunc, 'remove': / *[.,:;]$/u};\n\nconst addX00aComma = {'add': ',', 'code': 'abcqej', 'followedBy': 'cdeg', 'context': doesNotEndInPunc, 'contextRHS': allowsPuncRHS};\nconst addX00dComma = {'name': 'X00$d ending in \"-\" does not get comma', 'add': ',', 'code': 'd', 'followedBy': 'cdeg', 'context': /[^-,.!]$/u, 'contextRHS': allowsPuncRHS};\nconst addX00aComma2 = {'add': ',', 'code': 'abcdej', 'followedBy': 'cdeg', 'context': /(?:[A-Z]|Å|Ä|Ö)\\.$/u, 'contextRHS': allowsPuncRHS};\nconst addX00Dot = {'add': '.', 'code': 'abcdetv', 'followedBy': '#fklptu', 'context': needsPuncAfterAlphanumeric};\n\n\nconst addX10iColon = {'name': 'Punctuate relationship information', 'code': 'i', 'context': defaultNeedsPuncAfter2};\nconst addX10bDot = {'name': 'Add X10 pre-$b dot', 'add': '.', 'code': 'ab', 'followedBy': 'b', 'context': needsPuncAfterAlphanumeric};\nconst addX10eComma = {'add': ',', 'code': 'abe', 'followedBy': 'e', 'context': defaultNeedsPuncAfter2};\nconst addX10Dot = {'name': 'Add X10 final dot', 'add': '.', 'code': 'abet', 'followedBy': 'tu#', 'context': needsPuncAfterAlphanumeric};\nconst addColonToRelationshipInformation = {'name': 'Add \\':\\' to 7X0 $i relationship info', 'add': ':', 'code': 'i', 'context': defaultNeedsPuncAfter2};\n\nconst addDotBeforeLanguageSubfieldL = {'name': 'Add dot before $l', 'add': '.', 'code': 'abepst', 'followedBy': 'l', 'context': doesNotEndInPunc};\n\n// 490:\nconst addSemicolonBeforeVolumeDesignation = {'name': 'Add \" ;\" before $v', 'add': ' ;', 'code': 'atxyz', 'followedBy': 'v', 'context': /[^;]$/u};\n\nconst NONE = 0;\nconst ADD = 2;\nconst REMOVE = 1;\nconst REMOVE_AND_ADD = 3;\n\n// Crappy punctuation consists of various crap that is somewhat common.\n// We strip crap for merge decisions. We are not trying to actively remove crap here.\n\nconst removeCrapFromAllEntryFields = [removeCommaBeforeLanguageSubfieldL, removeCommaBeforeTitleSubfieldT];\n\nconst removeX00Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, cleanX00dCommaOrDot, cleanRHS, X00RemoveDotAfterBracket, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];\nconst removeX10Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];\nconst removeX11Whatever = removeCrapFromAllEntryFields;\nconst removeX30Whatever = removeCrapFromAllEntryFields;\n\nconst remove490And830Whatever = [{'code': 'axyzv', 'followedBy': 'axyzv', 'remove': /(?: *;| *=|,)$/u}];\n\nconst linkingEntryWhatever = [{'code': 'abdghiklmnopqrstuwxyz', 'followedBy': 'abdghiklmnopqrstuwxyz', 'remove': /\\. -$/u}];\n\n\n// '!' means negation, thus '!b' means any other subfield but 'b'.\n// 'followedBy': '#' means that current subfield is the last subfield.\n// NB! Note that control subfields are ignored in punctuation rules.\n// NB #2! Control field ignorance causes issues with field 257: https://wiki.helsinki.fi/display/rdasovellusohje/Loppupisteohje\n// Might need to work on that at some point. NOT a top priority though.\n// NB #3! Final punctuation creation is/should be handled by endind-punctuation.js validator!\n\nconst crappy24X = [\n {'code': 'abnp', 'followedBy': '!c', 'remove': / \\/$/u},\n {'code': 'abn', 'followedBy': 'c', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'abc', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'abfghinp', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'n', 'followedBy': 'p', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}, // MELINDA-8817\n {'code': 'p', 'followedBy': 'pc', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}, // MELINDA-8817\n removeCommaBeforeLanguageSubfieldL\n];\n\n\nconst cleanCrappyPunctuationRules = {\n '100': removeX00Whatever,\n '110': removeX10Whatever,\n '111': removeX11Whatever,\n '130': removeX30Whatever,\n '240': crappy24X,\n '245': crappy24X,\n '246': crappy24X,\n '300': [\n {'code': 'a', 'followedBy': '!b', 'remove': / *:$/u},\n {'code': 'a', 'followedBy': 'b', 'remove': /:$/u, 'context': /[^ ]:$/u},\n {'code': 'ab', 'followedBy': '!c', 'remove': / *;$/u},\n {'code': 'ab', 'followedBy': 'c', 'remove': /;$/u, 'context': /[^ ];$/u},\n {'code': 'abc', 'followedBy': '!e', 'remove': / *\\+$/u} // Removes both valid (with one space) and invalid (spaceless et al) puncs\n\n ],\n\n '490': remove490And830Whatever,\n '600': removeX00Whatever,\n '610': removeX10Whatever,\n '611': removeX11Whatever,\n '630': removeX30Whatever,\n '700': removeX00Whatever,\n '710': removeX10Whatever,\n '711': removeX11Whatever,\n '730': removeX30Whatever,\n '773': linkingEntryWhatever,\n '774': linkingEntryWhatever,\n '776': linkingEntryWhatever,\n '800': removeX00Whatever,\n '810': removeX10Whatever,\n '830': remove490And830Whatever,\n '946': crappy24X\n};\n\nconst cleanLegalX00Comma = {'code': 'abcde', 'followedBy': 'cdegj', 'context': /.,$/u, 'remove': /,$/u};\n// Accept upper case letters in X00$b, since they are probably Roman numerals.\nconst cleanLegalX00bDot = {'code': 'b', 'followedBy': 't#', context: /^[IVXLCDM]+\\.$/u, 'remove': /\\.$/u};\nconst cleanLegalX00iColon = {'code': 'i', 'followedBy': 'a', 'remove': / *:$/u}; // NB! context is not needed\nconst cleanLegalX00Dot = {'code': 'abcdetvl', 'followedBy': 'tu#', 'context': /(?:[a-z0-9)]|å|ä|ö)\\.$/u, 'remove': /\\.$/u};\nconst cleanDotBeforeLanguageSubfieldL = {'name': 'pre-language-$l dot', 'followedBy': 'l', 'context': /.\\.$/u, 'remove': /\\.$/u};\n\nconst legalEntryField = [cleanDotBeforeLanguageSubfieldL];\n\nconst legalX00punc = [cleanLegalX00Comma, cleanLegalX00iColon, cleanLegalX00bDot, cleanLegalX00Dot, ...legalEntryField];\n\nconst cleanLegalX10Comma = {'name': 'X10comma', 'code': 'abe', 'followedBy': 'e', 'context': /.,$/u, 'remove': /,$/u};\nconst cleanLegalX10Dot = {'name': 'X10dot', 'code': 'abt', 'followedBy': 'bst#', 'context': /.\\.$/u, 'remove': /\\.$/u};\n\nconst legalX10punc = [cleanLegalX10Comma, cleanLegalX10Dot, cleanX00eDot, ...legalEntryField];\n\nconst cleanLegalSeriesTitle = [ // 490 and 830\n {'code': 'a', 'followedBy': 'a', 'remove': / =$/u},\n {'code': 'axyz', 'followedBy': 'xyz', 'remove': /,$/u, 'context': /.,$/u},\n {'code': 'axyz', 'followedBy': 'v', 'remove': / *;$/u}\n];\n\nconst clean24X = [\n {'name': 'I:A', 'code': 'i', 'followedBy': 'a', 'remove': / *:$/u},\n {'name': 'A:B', 'code': 'a', 'followedBy': 'b', 'remove': / [:;=]$/u},\n {'name': 'AB:K', 'code': 'ab', 'followedBy': 'k', 'remove': / :$/u},\n {'name': 'ABK:F', 'code': 'abk', 'followedBy': 'f', 'remove': /,$/u},\n {'name': 'ABFNP:C', 'code': 'abfnp', 'followedBy': 'c', 'remove': / \\/$/u},\n {'name': 'ABN:N', 'code': 'abn', 'followedBy': 'n', 'remove': /\\.$/u},\n {'name': 'ABNP:#', 'code': 'abnp', 'followedBy': '#', 'remove': /\\.$/u},\n {'name': 'N:P', 'code': 'n', 'followedBy': 'p', 'remove': /,$/u},\n cleanDotBeforeLanguageSubfieldL\n];\n\nconst cleanValidPunctuationRules = {\n '100': legalX00punc,\n '110': legalX10punc,\n '111': legalEntryField,\n '130': legalEntryField,\n '240': clean24X,\n '243': clean24X,\n '245': clean24X,\n '246': clean24X,\n '260': [\n {'code': 'abc', 'followedBy': 'a', 'remove': / ;$/u},\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'b', 'followedBy': 'c', 'remove': /,$/u},\n {'code': 'c', 'followedBy': '#', 'remove': /\\.$/u},\n {'code': 'd', 'followedBy': 'e', 'remove': / :$/u},\n {'code': 'e', 'followedBy': 'f', 'remove': /,$/u},\n {'code': 'f', 'followedBy': '#', 'remove': /\\.$/u} // Probably ')' but should it be removed?\n ],\n '264': [\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'b', 'followedBy': 'c', 'remove': /,$/u},\n {'code': 'c', 'followedBy': '#', 'remove': /\\.$/u}\n ],\n '300': [\n // NB! Remove crap as well, thus the '*' in / *:$/\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'ab', 'followedBy': 'c', 'remove': / ;$/u},\n {'code': 'abc', 'followedBy': 'e', 'remove': / \\+$/u}\n ],\n '490': cleanLegalSeriesTitle,\n '534': [{'code': 'p', 'followedBy': 'c', 'remove': /:$/u}],\n '600': legalX00punc,\n '610': legalX10punc,\n '611': legalEntryField,\n '630': legalEntryField,\n // Experimental, MET366-ish (end punc in internationally valid, but we don't use it here in Finland):\n '648': [{'code': 'a', 'content': /^[0-9]+\\.$/u, 'ind2': ['4'], 'remove': /\\.$/u}],\n '700': legalX00punc,\n '710': legalX10punc,\n '711': legalEntryField,\n '730': legalEntryField,\n '800': legalX00punc,\n '810': legalX10punc,\n '811': legalEntryField,\n '830': [...legalEntryField, ...cleanLegalSeriesTitle],\n '946': clean24X\n};\n\n\n// Overgeneralizes a bit: eg. addColonToRelationshipInformation only applies to 700/710 but as others don't have $i, it's fine.\nconst addToAllEntryFields = [addDotBeforeLanguageSubfieldL, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];\n\n\nconst addX00 = [addX00aComma, addX00aComma2, addX00Dot, addX00dComma, ...addToAllEntryFields];\nconst addX10 = [addX10iColon, addX10bDot, addX10eComma, addX10Dot, ...addToAllEntryFields];\nconst addX11 = [...addToAllEntryFields];\nconst addX30 = [...addToAllEntryFields];\n\nconst add24X = [\n {'code': 'i', 'followedBy': 'a', 'add': ':', 'context': needsPuncAfterAlphanumeric},\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': needsPuncAfterAlphanumeric},\n {'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': needsPuncAfterAlphanumeric},\n {'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': needsPuncAfterAlphanumeric},\n addDotBeforeLanguageSubfieldL\n];\n\nconst add245 = [\n ...add24X,\n // Blah! Also \"$a = $b\" and \"$a ; $b\" can be valid... But ' :' is better than nothing, I guess...\n {'code': 'ab', 'followedBy': 'n', 'add': '.', 'context': needsPuncAfterAlphanumeric},\n {'code': 'n', 'followedBy': 'p', 'add': ',', 'context': defaultNeedsPuncAfter2},\n {'code': 'abc', 'followedBy': '#', 'add': '.', 'context': needsPuncAfterAlphanumeric} // Stepping on \"punctuation validator's\" toes\n];\n\nconst addSeriesTitle = [ // 490 and 830\n {'code': 'a', 'followedBy': 'a', 'add': ' =', 'context': defaultNeedsPuncAfter2},\n {'code': 'axyz', 'followedBy': 'xy', 'add': ',', 'context': defaultNeedsPuncAfter2},\n addSemicolonBeforeVolumeDesignation // eg. 490$axyz-$v\n];\n\nconst addPairedPunctuationRules = {\n '100': addX00,\n '110': addX10,\n '111': addX11,\n '130': addX30,\n '240': add24X,\n '243': add24X,\n '245': add245,\n '246': add24X,\n '260': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'ab', 'followedBy': 'c', 'add': ',', 'context': defaultNeedsPuncAfter2},\n {'code': 'abc', 'followedBy': 'a', 'add': ' ;', 'context': defaultNeedsPuncAfter2},\n {'code': 'e', 'followedBy': 'f', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'f', 'followedBy': 'g', 'add': ',', 'context': defaultNeedsPuncAfter2}\n ],\n '264': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'b', 'followedBy': 'c', 'add': ',', 'context': defaultNeedsPuncAfter2},\n // NB! The $c rule messes dotless exception \"264 #4 $c p1983\" up\n // We'll need to add a hacky postprocessor for this? Add 'hasInd1': '0123' etc?\n {'code': 'c', 'followedBy': '#', 'add': '.', 'context': needsPuncAfterAlphanumeric, 'ind2': ['0', '1', '2', '3']}\n ],\n '300': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'ab', 'followedBy': 'c', 'add': ' ;', 'context': defaultNeedsPuncAfter2},\n {'code': 'abc', 'followedBy': 'e', 'add': ' +', 'context': defaultNeedsPuncAfter2}\n ],\n '490': addSeriesTitle,\n '506': [{'code': 'a', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter2}],\n '534': [{'code': 'p', 'followedBy': 'c', 'add': ':', 'context': defaultNeedsPuncAfter2}],\n '600': addX00,\n '610': addX10,\n '611': addX11,\n '630': addX30,\n '700': addX00,\n '710': addX10,\n '711': addX11,\n '730': addX30,\n '800': addX00,\n '810': addX10,\n '811': addX11,\n '830': [...addX30, ...addSeriesTitle],\n '946': [{'code': 'i', 'followedBy': 'a', 'add': ':', 'context': defaultNeedsPuncAfter2}]\n};\n\n/*\nfunction debugRule(rule) {\n //nvdebug('');\n nvdebug(`NAME ${rule.name ? rule.name : '<unnamed>'}`);\n nvdebug(`SUBFIELD CODE '${rule.code}' FOLLOWED BY SUBFIELD CODE '${rule.followedBy}'`);\n if ('add' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`ADD '${rule.add}'`);\n }\n if ('remove' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`REMOVE '${rule.remove}'`);\n }\n if ('context' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`CONTEXT '${rule.context.toString()}'`);\n }\n //nvdebug('');\n}\n*/\n\nfunction ruleAppliesToSubfieldCode(targetSubfieldCodes, currSubfieldCode) {\n if (!targetSubfieldCodes) { // We are not interested in what subfield precedes 240$l, ',' is removed anyway\n return true;\n }\n const negation = targetSubfieldCodes.includes('!');\n if (negation) {\n return !targetSubfieldCodes.includes(currSubfieldCode);\n }\n return targetSubfieldCodes.includes(currSubfieldCode);\n}\n\n\nfunction ruleAppliesToField(rule, field) {\n if ('ind1' in rule && !rule.ind1.includes(field.ind1)) {\n return false;\n }\n\n if ('ind2' in rule && !rule.ind2.includes(field.ind2)) {\n return false;\n }\n\n // If we want to check, say, $2, it should be implemented here!\n\n return true;\n}\n\n\nfunction ruleAppliesToCurrentSubfield(rule, subfield) {\n //nvdebug(` Apply rule on LHS?`);\n if (!ruleAppliesToSubfieldCode(rule.code, subfield.code)) {\n //nvdebug(` Reject rule!`);\n return false;\n }\n if ('context' in rule) {\n //nvdebug(` Check '${subfield.value}' versus '${rule.context.toString()}'`);\n if (!subfield.value.match(rule.context)) { // njsscan-ignore: regex_injection_dos\n //nvdebug(` Reject rule!`);\n return false;\n }\n }\n //nvdebug(` Apply rule!`);\n return true;\n}\n\nfunction ruleAppliesToNextSubfield(rule, nextSubfield) {\n if (!('followedBy' in rule)) { // Return true, if we are not interested in the next subfield\n return true;\n }\n // The '#' existence check applies only to the RHS field. LHS always exists.\n if (!nextSubfield) {\n const negation = rule.followedBy.includes('!');\n if (negation) {\n return !rule.followedBy.includes('#');\n }\n return rule.followedBy.includes('#');\n }\n\n if (!ruleAppliesToSubfieldCode(rule.followedBy, nextSubfield.code)) {\n return false;\n }\n if ('contextRHS' in rule && !nextSubfield.value.match(rule.contextRHS)) { // njsscan-ignore: regex_injection_dos\n return false;\n }\n return true;\n}\n\nfunction checkRule(rule, field, subfield1, subfield2) {\n if (!ruleAppliesToField(rule, field)) {\n //nvdebug(`FAIL ON WHOLE FIELD: '${fieldToString(field)}`);\n return false;\n }\n //const name = rule.name || 'UNNAMED';\n if (!ruleAppliesToCurrentSubfield(rule, subfield1)) {\n //nvdebug(`${name}: FAIL ON LHS SUBFIELD: '$${subfield1.code} ${subfield1.value}', SF=${rule.code}`, debug);\n return false;\n }\n\n // NB! This is not a perfect solution. We might have $e$0$e where $e$0 punctuation should actually be based on $e$e rules\n if (!ruleAppliesToNextSubfield(rule, subfield2)) {\n //const msg = subfield2 ? `${name}: FAIL ON RHS SUBFIELD '${subfield2.code}' not in [${rule.followedBy}]` : `${name}: FAIL ON RHS FIELD`;\n //nvdebug(msg, debug);\n return false;\n }\n\n //nvdebug(`${rule.name ? rule.name : '<unnamed>'}: ACCEPT ${rule.code} (${subfield1.code}), SF2=${rule.followedBy} (${subfield2 ? subfield2.code : '#'})`, debug);\n return true;\n}\n\n\nfunction applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, operation = NONE) {\n if (operation === NONE || ruleArray === null) { // !fieldIsApplicable(field, ruleArray)) {\n return;\n }\n const tag2 = field.tag === '880' ? fieldGetUnambiguousTag(field) : field.tag;\n if (!tag2) {\n return;\n }\n if (!(`${tag2}` in ruleArray)) {\n return;\n }\n\n //nvdebug(`PUNCTUATE ${field.tag}/${tag2} '${subfieldToString(subfield1)}' XXX '${subfield2 ? subfieldToString(subfield2) : '#'} }`);\n\n //nvdebug(`OP=${operation} ${tag2}: '${subfield1.code}: ${subfield1.value}' ??? '${subfield2 ? subfield2.code : '#'}'`);\n const candRules = ruleArray[tag2];\n candRules.forEach(rule => {\n //debugRule(rule);\n //nvdebug(' WP1');\n if (!checkRule(rule, field, subfield1, subfield2)) {\n return;\n }\n //nvdebug(' WP2');\n\n //const originalValue = subfield1.value;\n if (rule.remove && [REMOVE, REMOVE_AND_ADD].includes(operation) && subfield1.value.match(rule.remove)) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(` PUNC REMOVAL TO BE PERFORMED FOR $${subfield1.code} '${subfield1.value}'`, debug);\n subfield1.value = subfield1.value.replace(rule.remove, ''); // eslint-disable-line functional/immutable-data\n //nvdebug(` PUNC REMOVAL PERFORMED FOR '${subfield1.value}'`);\n }\n if (rule.add && [ADD, REMOVE_AND_ADD].includes(operation)) { // eslint-disable-line functional/no-conditional-statements\n subfield1.value += rule.add; // eslint-disable-line functional/immutable-data\n //nvdebug(` ADDED '${rule.add}' TO FORM '${subfield1.value}'`);\n }\n\n /*\n if (subfield1.value !== originalValue) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(` PROCESS PUNC: '‡${subfield1.code} ${originalValue}' => '‡${subfield1.code} ${subfield1.value}'`, debug); // eslint-disable-line functional/immutable-data\n }\n */\n });\n}\n\nfunction subfieldFixPunctuation(field, subfield1, subfield2) {\n applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);\n applyPunctuationRules(field, subfield1, subfield2, addPairedPunctuationRules, ADD);\n}\n\nfunction subfieldStripPunctuation(field, subfield1, subfield2) {\n //nvdebug(`FSP1: '${subfield1.value}'`);\n applyPunctuationRules(field, subfield1, subfield2, cleanValidPunctuationRules, REMOVE);\n //nvdebug(`FSP2: '${subfield1.value}'`);\n applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);\n //nvdebug(`FSP3: '${subfield1.value}'`);\n\n}\n\nexport function fieldStripPunctuation(field) {\n if (!field.subfields) {\n return field;\n }\n\n field.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n subfieldStripPunctuation(field, sf, getNextRelevantSubfield(field, i));\n\n });\n return field;\n}\n\nexport function fieldFixPunctuation(field) {\n if (!field.subfields) {\n return field;\n }\n //nvdebug(`################### fieldFixPunctuation() TEST ${fieldToString(field)}`);\n\n field.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n // We'll need some magic for field 257 here, do we? (Also Finnish lexicons vs global lexicons in 65X fields)\n subfieldFixPunctuation(field, sf, getNextRelevantSubfield(field, i));\n });\n\n // Use shared code for final punctuation (sadly this does not fix intermediate punc):\n if (field.useExternalEndPunctuation) { // eslint-disable-line functional/no-conditional-statements\n // addFinalPunctuation(field); // local version. use shared code instead.\n validateSingleField(field, false, true); // NB! Don't use field.tag as second argument! It's a string, not an int. 3rd arg must be true (=fix)\n }\n return field;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"punctuation2.js","names":["_endingPunctuation","require","_subfield6Utils","_utils","_clone","_interopRequireDefault","e","__esModule","default","descriptionString","_default","description","validate","fix","record","nvdebug","res","message","valid","fields","forEach","f","fieldFixPunctuation","fieldsNeedingModification","filter","fieldNeedsModification","values","map","fieldToString","newValues","fieldGetFixedString","messages","val","i","length","isControlSubfield","subfield","includes","code","getNextRelevantSubfield","field","currSubfieldIndex","subfields","find","index","add","cloneField","clone","operation","subfieldFixPunctuation","subfieldStripPunctuation","sf","originalFieldAsString","modifiedFieldAsString","needsPuncAfterAlphanumeric","defaultNeedsPuncAfter2","doesNotEndInPunc","blocksPuncRHS","allowsPuncRHS","dotIsProbablyPunc","puncIsProbablyPunc","removeColons","removeX00Comma","cleanRHS","cleanX00dCommaOrDot","cleanX00aDot","cleanCorruption","cleanX00eDot","removeCommaBeforeLanguageSubfieldL","removeCommaBeforeTitleSubfieldT","X00RemoveDotAfterBracket","cleanPuncBeforeLanguage","addX00aComma","addX00dComma","addX00aComma2","addX00Dot","addX10iColon","addX10bDot","addX10eComma","addX10Dot","addColonToRelationshipInformation","addDotBeforeLanguageSubfieldL","addSemicolonBeforeVolumeDesignation","NONE","ADD","REMOVE","REMOVE_AND_ADD","removeCrapFromAllEntryFields","removeX00Whatever","removeX10Whatever","removeX11Whatever","removeX30Whatever","remove490And830Whatever","linkingEntryWhatever","crappy24X","cleanCrappyPunctuationRules","cleanLegalX00Comma","cleanLegalX00bDot","context","cleanLegalX00iColon","cleanLegalX00Dot","cleanDotBeforeLanguageSubfieldL","legalEntryField","legalX00punc","cleanLegalX10Comma","cleanLegalX10Dot","legalX10punc","cleanLegalSeriesTitle","clean24X","cleanValidPunctuationRules","addToAllEntryFields","addX00","addX10","addX11","addX30","add24X","add245","addSeriesTitle","addPairedPunctuationRules","ruleAppliesToSubfieldCode","targetSubfieldCodes","currSubfieldCode","negation","ruleAppliesToField","rule","ind1","ind2","ruleAppliesToCurrentSubfield","value","match","ruleAppliesToNextSubfield","nextSubfield","followedBy","contextRHS","checkRule","subfield1","subfield2","applyPunctuationRules","ruleArray","tag2","tag","fieldGetUnambiguousTag","candRules","remove","replace","fieldStripPunctuation","useExternalEndPunctuation","validateSingleField"],"sources":["../src/punctuation2.js"],"sourcesContent":["/*\n* punctuation.js -- try and fix a marc field punctuation\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n* NOTE #1: https://www.kiwi.fi/display/kumea/Loppupisteohje is implemented via another validator/fixer (ending-punctuation).\n* This file has some support but it's now yet thorough. (And mmight never be.)\n* NOTE #2: Validator/fixer punctuation does similar stuff, but focuses on X00 fields.\n* NOTE #3: As of 2023-06-05 control subfields ($0...$9) are obsolete. Don't use them in rules.\n* (They are jumped over when looking for next (non-controlfield subfield)\n*/\nimport {validateSingleField} from './ending-punctuation';\nimport {fieldGetUnambiguousTag} from './subfield6Utils';\n//import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\nimport clone from 'clone';\n\n//const debug = createDebugLogger('debug/punctuation2');\n\nconst descriptionString = 'Remove invalid and add valid punctuation to data fields';\nexport default function () {\n return {\n description: descriptionString,\n validate, fix\n };\n\n function fix(record) {\n nvdebug(`${descriptionString}: fixer`);\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fieldFixPunctuation(f));\n return res;\n }\n\n function validate(record) {\n nvdebug(`${descriptionString}: validate`);\n\n const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, true));\n\n\n const values = fieldsNeedingModification.map(f => fieldToString(f));\n const newValues = fieldsNeedingModification.map(f => fieldGetFixedString(f, true));\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; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nfunction isControlSubfield(subfield) {\n return ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].includes(subfield.code);\n}\n\nfunction getNextRelevantSubfield(field, currSubfieldIndex) {\n return field.subfields.find((subfield, index) => index > currSubfieldIndex && !isControlSubfield(subfield));\n}\n\nexport function fieldGetFixedString(field, add = true) {\n const cloneField = clone(field);\n const operation = add ? subfieldFixPunctuation : subfieldStripPunctuation;\n cloneField.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n operation(cloneField, sf, getNextRelevantSubfield(cloneField, i));\n });\n return fieldToString(cloneField);\n}\n\nexport function fieldNeedsModification(field, add = true) {\n if (!field.subfields) {\n return false;\n }\n\n const originalFieldAsString = fieldToString(field);\n const modifiedFieldAsString = fieldGetFixedString(field, add);\n\n return modifiedFieldAsString !== originalFieldAsString;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////\n// <= Above code is written for the validator logic <= //\n// => Everything below was originally transferred from reducers' punctuation.js => //\n/////////////////////////////////////////////////////////////////////////////////////\n\n\n//const stripCrap = / *[-;:,+]+$/u;\nconst needsPuncAfterAlphanumeric = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö)$/u;\nconst defaultNeedsPuncAfter2 = /(?:[\\]a-zA-Z0-9)]|ä|å|ö|Å|Ä|Ö)$/u;\nconst doesNotEndInPunc = /[^!?.:;,]$/u; // non-punc for pre-240/700/XXX $, note that '.' comes if preceded by ')'\nconst blocksPuncRHS = /^(?:\\()/u;\nconst allowsPuncRHS = /^(?:[A-Za-z0-9]|å|ä|ö|Å|Ä|Ö)/u;\n\nconst dotIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö|(?:[A-Za-z0-9]|Å|Ä|Ö)(?:[A-Z]|Å|Ä|Ö))\\.$/u;\nconst puncIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö) ?[.,:;]$/u;\n// NB! 65X: Finnish terms don't use punctuation, but international ones do. Neither one is currently (2021-11-08) coded here.\n\n// Will unfortunately trigger \"Sukunimi, Th.\" type:\nconst removeColons = {'code': 'abcdefghijklmnopqrstuvwxyz', 'remove': / *[;:]$/u};\nconst removeX00Comma = {'code': 'abcdenqt', 'followedBy': 'abcdenqtv#', 'context': /.,$/u, 'remove': /,$/u};\nconst cleanRHS = {'code': 'abcd', 'followedBy': 'bcde', 'context': /(?:(?:[a-z0-9]|å|ä|ö)\\.|,)$/u, 'contextRHS': blocksPuncRHS, 'remove': /[.,]$/u};\nconst cleanX00dCommaOrDot = {'code': 'd', 'followedBy': 'et#', 'context': /[0-9]-[,.]$/u, 'remove': /[,.]$/u};\nconst cleanX00aDot = {'code': 'abcde', 'followedBy': 'cdegj', 'context': dotIsProbablyPunc, 'remove': /\\.$/u};\nconst cleanCorruption = {'code': 'abcdefghijklmnopqrstuvwxyz', 'remove': / \\.$/u};\n// These $e dot removals are tricky: before removing the comma, we should know that it ain't an abbreviation such as \"esitt.\"...\nconst cleanX00eDot = {'code': 'e', 'followedBy': 'egj#', 'context': /(?:[ai]ja|jä)[.,]$/u, 'remove': /\\.$/u};\nconst removeCommaBeforeLanguageSubfieldL = {'followedBy': 'l', 'remove': /,$/u};\nconst removeCommaBeforeTitleSubfieldT = {'followedBy': 't', 'remove': /,$/u};\n\nconst X00RemoveDotAfterBracket = {'code': 'cq', 'context': /\\)\\.$/u, 'remove': /\\.$/u};\n// 390, 800, 810, 830...\nconst cleanPuncBeforeLanguage = {'code': 'atvxyz', 'followedBy': 'l', 'context': puncIsProbablyPunc, 'remove': / *[.,:;]$/u};\n\nconst addX00aComma = {'add': ',', 'code': 'abcqej', 'followedBy': 'cdeg', 'context': doesNotEndInPunc, 'contextRHS': allowsPuncRHS};\nconst addX00dComma = {'name': 'X00$d ending in \"-\" does not get comma', 'add': ',', 'code': 'd', 'followedBy': 'cdeg', 'context': /[^-,.!]$/u, 'contextRHS': allowsPuncRHS};\nconst addX00aComma2 = {'add': ',', 'code': 'abcdej', 'followedBy': 'cdeg', 'context': /(?:[A-Z]|Å|Ä|Ö)\\.$/u, 'contextRHS': allowsPuncRHS};\nconst addX00Dot = {'add': '.', 'code': 'abcdetv', 'followedBy': '#fklptu', 'context': needsPuncAfterAlphanumeric};\n\n\nconst addX10iColon = {'name': 'Punctuate relationship information', 'code': 'i', 'context': defaultNeedsPuncAfter2};\nconst addX10bDot = {'name': 'Add X10 pre-$b dot', 'add': '.', 'code': 'ab', 'followedBy': 'b', 'context': needsPuncAfterAlphanumeric};\nconst addX10eComma = {'add': ',', 'code': 'abe', 'followedBy': 'e', 'context': defaultNeedsPuncAfter2};\nconst addX10Dot = {'name': 'Add X10 final dot', 'add': '.', 'code': 'abet', 'followedBy': 'tu#', 'context': needsPuncAfterAlphanumeric};\nconst addColonToRelationshipInformation = {'name': 'Add \\':\\' to 7X0 $i relationship info', 'add': ':', 'code': 'i', 'context': defaultNeedsPuncAfter2};\n\nconst addDotBeforeLanguageSubfieldL = {'name': 'Add dot before $l', 'add': '.', 'code': 'abepst', 'followedBy': 'l', 'context': doesNotEndInPunc};\n\n// 490:\nconst addSemicolonBeforeVolumeDesignation = {'name': 'Add \" ;\" before $v', 'add': ' ;', 'code': 'atxyz', 'followedBy': 'v', 'context': /[^;]$/u};\n\nconst NONE = 0;\nconst ADD = 2;\nconst REMOVE = 1;\nconst REMOVE_AND_ADD = 3;\n\n// Crappy punctuation consists of various crap that is somewhat common.\n// We strip crap for merge decisions. We are not trying to actively remove crap here.\n\nconst removeCrapFromAllEntryFields = [removeCommaBeforeLanguageSubfieldL, removeCommaBeforeTitleSubfieldT];\n\nconst removeX00Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, cleanX00dCommaOrDot, cleanRHS, X00RemoveDotAfterBracket, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];\nconst removeX10Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];\nconst removeX11Whatever = removeCrapFromAllEntryFields;\nconst removeX30Whatever = removeCrapFromAllEntryFields;\n\nconst remove490And830Whatever = [{'code': 'axyzv', 'followedBy': 'axyzv', 'remove': /(?: *;| *=|,)$/u}];\n\nconst linkingEntryWhatever = [{'code': 'abdghiklmnopqrstuwxyz', 'followedBy': 'abdghiklmnopqrstuwxyz', 'remove': /\\. -$/u}];\n\n\n// '!' means negation, thus '!b' means any other subfield but 'b'.\n// 'followedBy': '#' means that current subfield is the last subfield.\n// NB! Note that control subfields are ignored in punctuation rules.\n// NB #2! Control field ignorance causes issues with field 257: https://wiki.helsinki.fi/display/rdasovellusohje/Loppupisteohje\n// Might need to work on that at some point. NOT a top priority though.\n// NB #3! Final punctuation creation is/should be handled by endind-punctuation.js validator!\n\nconst crappy24X = [\n {'code': 'abnp', 'followedBy': '!c', 'remove': / \\/$/u},\n {'code': 'abn', 'followedBy': 'c', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'abc', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'abfghinp', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'n', 'followedBy': 'p', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}, // MELINDA-8817\n {'code': 'p', 'followedBy': 'pc', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}, // MELINDA-8817\n removeCommaBeforeLanguageSubfieldL\n];\n\n\nconst cleanCrappyPunctuationRules = {\n '100': removeX00Whatever,\n '110': removeX10Whatever,\n '111': removeX11Whatever,\n '130': removeX30Whatever,\n '240': crappy24X,\n '245': crappy24X,\n '246': crappy24X,\n '300': [\n {'code': 'a', 'followedBy': '!b', 'remove': / *:$/u},\n {'code': 'a', 'followedBy': 'b', 'remove': /:$/u, 'context': /[^ ]:$/u},\n {'code': 'ab', 'followedBy': '!c', 'remove': / *;$/u},\n {'code': 'ab', 'followedBy': 'c', 'remove': /;$/u, 'context': /[^ ];$/u},\n {'code': 'abc', 'followedBy': '!e', 'remove': / *\\+$/u} // Removes both valid (with one space) and invalid (spaceless et al) puncs\n\n ],\n\n '490': remove490And830Whatever,\n '600': removeX00Whatever,\n '610': removeX10Whatever,\n '611': removeX11Whatever,\n '630': removeX30Whatever,\n '700': removeX00Whatever,\n '710': removeX10Whatever,\n '711': removeX11Whatever,\n '730': removeX30Whatever,\n '773': linkingEntryWhatever,\n '774': linkingEntryWhatever,\n '776': linkingEntryWhatever,\n '800': removeX00Whatever,\n '810': removeX10Whatever,\n '830': remove490And830Whatever,\n '946': crappy24X\n};\n\nconst cleanLegalX00Comma = {'code': 'abcde', 'followedBy': 'cdegj', 'context': /.,$/u, 'remove': /,$/u};\n// Accept upper case letters in X00$b, since they are probably Roman numerals.\nconst cleanLegalX00bDot = {'code': 'b', 'followedBy': 't#', context: /^[IVXLCDM]+\\.$/u, 'remove': /\\.$/u};\nconst cleanLegalX00iColon = {'code': 'i', 'followedBy': 'a', 'remove': / *:$/u}; // NB! context is not needed\nconst cleanLegalX00Dot = {'code': 'abcdetvl', 'followedBy': 'tu#', 'context': /(?:[a-z0-9)]|å|ä|ö)\\.$/u, 'remove': /\\.$/u};\nconst cleanDotBeforeLanguageSubfieldL = {'name': 'pre-language-$l dot', 'followedBy': 'l', 'context': /.\\.$/u, 'remove': /\\.$/u};\n\nconst legalEntryField = [cleanDotBeforeLanguageSubfieldL];\n\nconst legalX00punc = [cleanLegalX00Comma, cleanLegalX00iColon, cleanLegalX00bDot, cleanLegalX00Dot, ...legalEntryField];\n\nconst cleanLegalX10Comma = {'name': 'X10comma', 'code': 'abe', 'followedBy': 'e', 'context': /.,$/u, 'remove': /,$/u};\nconst cleanLegalX10Dot = {'name': 'X10dot', 'code': 'abt', 'followedBy': 'bst#', 'context': /.\\.$/u, 'remove': /\\.$/u};\n\nconst legalX10punc = [cleanLegalX10Comma, cleanLegalX10Dot, cleanX00eDot, ...legalEntryField];\n\nconst cleanLegalSeriesTitle = [ // 490 and 830\n {'code': 'a', 'followedBy': 'a', 'remove': / =$/u},\n {'code': 'axyz', 'followedBy': 'xyz', 'remove': /,$/u, 'context': /.,$/u},\n {'code': 'axyz', 'followedBy': 'v', 'remove': / *;$/u}\n];\n\nconst clean24X = [\n {'name': 'I:A', 'code': 'i', 'followedBy': 'a', 'remove': / *:$/u},\n {'name': 'A:B', 'code': 'a', 'followedBy': 'b', 'remove': / [:;=]$/u},\n {'name': 'AB:K', 'code': 'ab', 'followedBy': 'k', 'remove': / :$/u},\n {'name': 'ABK:F', 'code': 'abk', 'followedBy': 'f', 'remove': /,$/u},\n {'name': 'ABFNP:C', 'code': 'abfnp', 'followedBy': 'c', 'remove': / \\/$/u},\n {'name': 'ABN:N', 'code': 'abn', 'followedBy': 'n', 'remove': /\\.$/u},\n {'name': 'ABNP:#', 'code': 'abnp', 'followedBy': '#', 'remove': /\\.$/u},\n {'name': 'N:P', 'code': 'n', 'followedBy': 'p', 'remove': /,$/u},\n cleanDotBeforeLanguageSubfieldL\n];\n\nconst cleanValidPunctuationRules = {\n '100': legalX00punc,\n '110': legalX10punc,\n '111': legalEntryField,\n '130': legalEntryField,\n '240': clean24X,\n '243': clean24X,\n '245': clean24X,\n '246': clean24X,\n '260': [\n {'code': 'abc', 'followedBy': 'a', 'remove': / ;$/u},\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'b', 'followedBy': 'c', 'remove': /,$/u},\n {'code': 'c', 'followedBy': '#', 'remove': /\\.$/u},\n {'code': 'd', 'followedBy': 'e', 'remove': / :$/u},\n {'code': 'e', 'followedBy': 'f', 'remove': /,$/u},\n {'code': 'f', 'followedBy': '#', 'remove': /\\.$/u} // Probably ')' but should it be removed?\n ],\n '264': [\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'b', 'followedBy': 'c', 'remove': /,$/u},\n {'code': 'c', 'followedBy': '#', 'remove': /\\.$/u}\n ],\n '300': [\n // NB! Remove crap as well, thus the '*' in / *:$/\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'ab', 'followedBy': 'c', 'remove': / ;$/u},\n {'code': 'abc', 'followedBy': 'e', 'remove': / \\+$/u}\n ],\n '490': cleanLegalSeriesTitle,\n '534': [{'code': 'p', 'followedBy': 'c', 'remove': /:$/u}],\n '600': legalX00punc,\n '610': legalX10punc,\n '611': legalEntryField,\n '630': legalEntryField,\n // Experimental, MET366-ish (end punc in internationally valid, but we don't use it here in Finland):\n '648': [{'code': 'a', 'content': /^[0-9]+\\.$/u, 'ind2': ['4'], 'remove': /\\.$/u}],\n '700': legalX00punc,\n '710': legalX10punc,\n '711': legalEntryField,\n '730': legalEntryField,\n '800': legalX00punc,\n '810': legalX10punc,\n '811': legalEntryField,\n '830': [...legalEntryField, ...cleanLegalSeriesTitle],\n '946': clean24X\n};\n\n\n// Overgeneralizes a bit: eg. addColonToRelationshipInformation only applies to 700/710 but as others don't have $i, it's fine.\nconst addToAllEntryFields = [addDotBeforeLanguageSubfieldL, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];\n\n\nconst addX00 = [addX00aComma, addX00aComma2, addX00Dot, addX00dComma, ...addToAllEntryFields];\nconst addX10 = [addX10iColon, addX10bDot, addX10eComma, addX10Dot, ...addToAllEntryFields];\nconst addX11 = [...addToAllEntryFields];\nconst addX30 = [...addToAllEntryFields];\n\nconst add24X = [\n {'code': 'i', 'followedBy': 'a', 'add': ':', 'context': needsPuncAfterAlphanumeric},\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': needsPuncAfterAlphanumeric},\n {'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': needsPuncAfterAlphanumeric},\n {'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': needsPuncAfterAlphanumeric},\n addDotBeforeLanguageSubfieldL\n];\n\nconst add245 = [\n ...add24X,\n // Blah! Also \"$a = $b\" and \"$a ; $b\" can be valid... But ' :' is better than nothing, I guess...\n {'code': 'ab', 'followedBy': 'n', 'add': '.', 'context': needsPuncAfterAlphanumeric},\n {'code': 'n', 'followedBy': 'p', 'add': ',', 'context': defaultNeedsPuncAfter2},\n {'code': 'abc', 'followedBy': '#', 'add': '.', 'context': needsPuncAfterAlphanumeric} // Stepping on \"punctuation validator's\" toes\n];\n\nconst addSeriesTitle = [ // 490 and 830\n {'code': 'a', 'followedBy': 'a', 'add': ' =', 'context': defaultNeedsPuncAfter2},\n {'code': 'axyz', 'followedBy': 'xy', 'add': ',', 'context': defaultNeedsPuncAfter2},\n addSemicolonBeforeVolumeDesignation // eg. 490$axyz-$v\n];\n\nconst addPairedPunctuationRules = {\n '100': addX00,\n '110': addX10,\n '111': addX11,\n '130': addX30,\n '240': add24X,\n '243': add24X,\n '245': add245,\n '246': add24X,\n '260': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'ab', 'followedBy': 'c', 'add': ',', 'context': defaultNeedsPuncAfter2},\n {'code': 'abc', 'followedBy': 'a', 'add': ' ;', 'context': defaultNeedsPuncAfter2},\n {'code': 'e', 'followedBy': 'f', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'f', 'followedBy': 'g', 'add': ',', 'context': defaultNeedsPuncAfter2}\n ],\n '264': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'b', 'followedBy': 'c', 'add': ',', 'context': defaultNeedsPuncAfter2},\n // NB! The $c rule messes dotless exception \"264 #4 $c p1983\" up\n // We'll need to add a hacky postprocessor for this? Add 'hasInd1': '0123' etc?\n {'code': 'c', 'followedBy': '#', 'add': '.', 'context': needsPuncAfterAlphanumeric, 'ind2': ['0', '1', '2', '3']}\n ],\n '300': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'ab', 'followedBy': 'c', 'add': ' ;', 'context': defaultNeedsPuncAfter2},\n {'code': 'abc', 'followedBy': 'e', 'add': ' +', 'context': defaultNeedsPuncAfter2}\n ],\n '490': addSeriesTitle,\n '506': [{'code': 'a', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter2}],\n '534': [{'code': 'p', 'followedBy': 'c', 'add': ':', 'context': defaultNeedsPuncAfter2}],\n '600': addX00,\n '610': addX10,\n '611': addX11,\n '630': addX30,\n '700': addX00,\n '710': addX10,\n '711': addX11,\n '730': addX30,\n '800': addX00,\n '810': addX10,\n '811': addX11,\n '830': [...addX30, ...addSeriesTitle],\n '946': [{'code': 'i', 'followedBy': 'a', 'add': ':', 'context': defaultNeedsPuncAfter2}]\n};\n\n/*\nfunction debugRule(rule) {\n //nvdebug('');\n nvdebug(`NAME ${rule.name ? rule.name : '<unnamed>'}`);\n nvdebug(`SUBFIELD CODE '${rule.code}' FOLLOWED BY SUBFIELD CODE '${rule.followedBy}'`);\n if ('add' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`ADD '${rule.add}'`);\n }\n if ('remove' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`REMOVE '${rule.remove}'`);\n }\n if ('context' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`CONTEXT '${rule.context.toString()}'`);\n }\n //nvdebug('');\n}\n*/\n\nfunction ruleAppliesToSubfieldCode(targetSubfieldCodes, currSubfieldCode) {\n if (!targetSubfieldCodes) { // We are not interested in what subfield precedes 240$l, ',' is removed anyway\n return true;\n }\n const negation = targetSubfieldCodes.includes('!');\n if (negation) {\n return !targetSubfieldCodes.includes(currSubfieldCode);\n }\n return targetSubfieldCodes.includes(currSubfieldCode);\n}\n\n\nfunction ruleAppliesToField(rule, field) {\n if ('ind1' in rule && !rule.ind1.includes(field.ind1)) {\n return false;\n }\n\n if ('ind2' in rule && !rule.ind2.includes(field.ind2)) {\n return false;\n }\n\n // If we want to check, say, $2, it should be implemented here!\n\n return true;\n}\n\n\nfunction ruleAppliesToCurrentSubfield(rule, subfield) {\n //nvdebug(` Apply rule on LHS?`);\n if (!ruleAppliesToSubfieldCode(rule.code, subfield.code)) {\n //nvdebug(` Reject rule!`);\n return false;\n }\n if ('context' in rule) {\n //nvdebug(` Check '${subfield.value}' versus '${rule.context.toString()}'`);\n if (!subfield.value.match(rule.context)) { // njsscan-ignore: regex_injection_dos\n //nvdebug(` Reject rule!`);\n return false;\n }\n }\n //nvdebug(` Apply rule!`);\n return true;\n}\n\nfunction ruleAppliesToNextSubfield(rule, nextSubfield) {\n if (!('followedBy' in rule)) { // Return true, if we are not interested in the next subfield\n return true;\n }\n // The '#' existence check applies only to the RHS field. LHS always exists.\n if (!nextSubfield) {\n const negation = rule.followedBy.includes('!');\n if (negation) {\n return !rule.followedBy.includes('#');\n }\n return rule.followedBy.includes('#');\n }\n\n if (!ruleAppliesToSubfieldCode(rule.followedBy, nextSubfield.code)) {\n return false;\n }\n if ('contextRHS' in rule && !nextSubfield.value.match(rule.contextRHS)) { // njsscan-ignore: regex_injection_dos\n return false;\n }\n return true;\n}\n\nfunction checkRule(rule, field, subfield1, subfield2) {\n if (!ruleAppliesToField(rule, field)) {\n //nvdebug(`FAIL ON WHOLE FIELD: '${fieldToString(field)}`);\n return false;\n }\n //const name = rule.name || 'UNNAMED';\n if (!ruleAppliesToCurrentSubfield(rule, subfield1)) {\n //nvdebug(`${name}: FAIL ON LHS SUBFIELD: '$${subfield1.code} ${subfield1.value}', SF=${rule.code}`, debug);\n return false;\n }\n\n // NB! This is not a perfect solution. We might have $e$0$e where $e$0 punctuation should actually be based on $e$e rules\n if (!ruleAppliesToNextSubfield(rule, subfield2)) {\n //const msg = subfield2 ? `${name}: FAIL ON RHS SUBFIELD '${subfield2.code}' not in [${rule.followedBy}]` : `${name}: FAIL ON RHS FIELD`;\n //nvdebug(msg, debug);\n return false;\n }\n\n //nvdebug(`${rule.name ? rule.name : '<unnamed>'}: ACCEPT ${rule.code} (${subfield1.code}), SF2=${rule.followedBy} (${subfield2 ? subfield2.code : '#'})`, debug);\n return true;\n}\n\n\nfunction applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, operation = NONE) {\n if (operation === NONE || ruleArray === null) { // !fieldIsApplicable(field, ruleArray)) {\n return;\n }\n const tag2 = field.tag === '880' ? fieldGetUnambiguousTag(field) : field.tag;\n if (!tag2) {\n return;\n }\n if (!(`${tag2}` in ruleArray)) {\n return;\n }\n\n //nvdebug(`PUNCTUATE ${field.tag}/${tag2} '${subfieldToString(subfield1)}' XXX '${subfield2 ? subfieldToString(subfield2) : '#'} }`);\n\n //nvdebug(`OP=${operation} ${tag2}: '${subfield1.code}: ${subfield1.value}' ??? '${subfield2 ? subfield2.code : '#'}'`);\n const candRules = ruleArray[tag2];\n candRules.forEach(rule => {\n //debugRule(rule);\n //nvdebug(' WP1');\n if (!checkRule(rule, field, subfield1, subfield2)) {\n return;\n }\n //nvdebug(' WP2');\n\n //const originalValue = subfield1.value;\n if (rule.remove && [REMOVE, REMOVE_AND_ADD].includes(operation) && subfield1.value.match(rule.remove)) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(` PUNC REMOVAL TO BE PERFORMED FOR $${subfield1.code} '${subfield1.value}'`, debug);\n subfield1.value = subfield1.value.replace(rule.remove, ''); // eslint-disable-line functional/immutable-data\n //nvdebug(` PUNC REMOVAL PERFORMED FOR '${subfield1.value}'`);\n }\n if (rule.add && [ADD, REMOVE_AND_ADD].includes(operation)) { // eslint-disable-line functional/no-conditional-statements\n subfield1.value += rule.add; // eslint-disable-line functional/immutable-data\n //nvdebug(` ADDED '${rule.add}' TO FORM '${subfield1.value}'`);\n }\n\n /*\n if (subfield1.value !== originalValue) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(` PROCESS PUNC: '‡${subfield1.code} ${originalValue}' => '‡${subfield1.code} ${subfield1.value}'`, debug); // eslint-disable-line functional/immutable-data\n }\n */\n });\n}\n\nfunction subfieldFixPunctuation(field, subfield1, subfield2) {\n applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);\n applyPunctuationRules(field, subfield1, subfield2, addPairedPunctuationRules, ADD);\n}\n\nfunction subfieldStripPunctuation(field, subfield1, subfield2) {\n //nvdebug(`FSP1: '${subfield1.value}'`);\n applyPunctuationRules(field, subfield1, subfield2, cleanValidPunctuationRules, REMOVE);\n //nvdebug(`FSP2: '${subfield1.value}'`);\n applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);\n //nvdebug(`FSP3: '${subfield1.value}'`);\n\n}\n\nexport function fieldStripPunctuation(field) {\n if (!field.subfields) {\n return field;\n }\n\n field.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n subfieldStripPunctuation(field, sf, getNextRelevantSubfield(field, i));\n\n });\n return field;\n}\n\nexport function fieldFixPunctuation(field) {\n if (!field.subfields) {\n return field;\n }\n //nvdebug(`################### fieldFixPunctuation() TEST ${fieldToString(field)}`);\n\n field.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n // We'll need some magic for field 257 here, do we? (Also Finnish lexicons vs global lexicons in 65X fields)\n subfieldFixPunctuation(field, sf, getNextRelevantSubfield(field, i));\n });\n\n // Use shared code for final punctuation (sadly this does not fix intermediate punc):\n if (field.useExternalEndPunctuation) { // eslint-disable-line functional/no-conditional-statements\n // addFinalPunctuation(field); // local version. use shared code instead.\n validateSingleField(field, false, true); // NB! Don't use field.tag as second argument! It's a string, not an int. 3rd arg must be true (=fix)\n }\n return field;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -6,7 +6,7 @@ var _punctuation = _interopRequireDefault(require("./punctuation2"));
|
|
|
6
6
|
var _fixura = require("@natlibfi/fixura");
|
|
7
7
|
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
8
8
|
var _debug = _interopRequireDefault(require("debug"));
|
|
9
|
-
function _interopRequireDefault(
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
10
|
(0, _fixugen.default)({
|
|
11
11
|
callback,
|
|
12
12
|
path: [__dirname, '..', 'test-fixtures', 'punctuation2'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"punctuation2.spec.js","names":["_chai","require","_marcRecord","_punctuation","_interopRequireDefault","_fixura","_fixugen","_debug","
|
|
1
|
+
{"version":3,"file":"punctuation2.spec.js","names":["_chai","require","_marcRecord","_punctuation","_interopRequireDefault","_fixura","_fixugen","_debug","e","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/punctuation2.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './punctuation2';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'punctuation2'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,CAAC;EACxDC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,4DAA4D,CAAC;AAE7F,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,oBAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,oBAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC","ignoreList":[]}
|
|
@@ -8,7 +8,7 @@ exports.recordResetSubfield6OccurrenceNumbers = recordResetSubfield6OccurrenceNu
|
|
|
8
8
|
var _debug = _interopRequireDefault(require("debug"));
|
|
9
9
|
var _utils = require("./utils");
|
|
10
10
|
var _subfield6Utils = require("./subfield6Utils");
|
|
11
|
-
function _interopRequireDefault(
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
12
|
// Relocated from melinda-marc-record-merge-reducers (and renamed)
|
|
13
13
|
|
|
14
14
|
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:reindexSubfield6OccurrenceNumbers');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reindexSubfield6OccurenceNumbers.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","obj","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","recordDisambiguateSharedSubfield6OccurrenceNumbers","recordResetSubfield6OccurrenceNumbers","recordGetSharedOccurrenceNumbers","length","push","max","recordGetMaxSubfield6OccurrenceNumberAsInteger","size","recordGetNumberOfUniqueSubfield6OccurrenceNumbers","getPotentialSharedOccurrenceNumberFields","occurrenceNumber","fields","filter","f","tag","subfields","some","sf","subfield6GetOccurrenceNumber","subfieldHasSharedOccurrenceNumber","subfield","candFields","relevantFields","fieldHasSharedOccurrenceNumber","field","fieldsContainingSubfield6","fieldHasSubfield","sharedOccurrenceNumberFields","forEach","disambiguateOccurrenceNumber","disambiguateable","fieldGetUnambiguousOccurrenceNumber","fieldToString","undefined","allRelevantFields","relevantFieldsWithCurrFieldTag","candField","newOccurrenceNumberAsInt","newOccurrenceNumber","intToOccurrenceNumberString","pairedFields","fieldGetOccurrenceNumberPairs","fieldResetOccurrenceNumber","pairedField","indexArray","gatherFieldData","gatherSubfieldData","isValidSubfield6","i","subfield6GetOccurrenceNumberAsInteger","n","elem","currentInt","oldtoNewCache","fieldResetSubfield6","subfieldReset6","currIndex","newIndex","mapCurrIndexToNewIndex","subfield6ResetOccurrenceNumber"],"sources":["../src/reindexSubfield6OccurenceNumbers.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug} from './utils';\nimport {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fieldResetOccurrenceNumber, intToOccurrenceNumberString, isValidSubfield6,\n recordGetMaxSubfield6OccurrenceNumberAsInteger,\n subfield6GetOccurrenceNumber, subfield6GetOccurrenceNumberAsInteger, subfield6ResetOccurrenceNumber} from './subfield6Utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:reindexSubfield6OccurrenceNumbers');\n\n\n// NB! This validator/fixer has two functionalities:\n// 1) normal reindexing of occurrence numbers\n// 2) disambiguation (when possible) of unambiguous occurrence numbers\n\nexport default function () {\n return {\n description: 'Reindex occurrence numbers in $6 subfield so that they start from 01 and end in NN',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 occurrence numbers', debug);\n const res = {message: [], fix: [], valid: true};\n //message.fix = []; // eslint-disable-line functional/immutable-data\n\n // This can not really fail...\n\n recordDisambiguateSharedSubfield6OccurrenceNumbers(record);\n recordResetSubfield6OccurrenceNumbers(record);\n\n // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n nvdebug('Validate SF6 occurrence number multiuses', debug);\n if (recordGetSharedOccurrenceNumbers(record).length) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`Multi-use of occurrence number(s) detected`); // eslint-disable-line functional/immutable-data\n }\n\n // Check max, and check number of different indexes\n nvdebug('Validate SF6 occurrence number (max vs n instances)', debug);\n const max = recordGetMaxSubfield6OccurrenceNumberAsInteger(record);\n const size = recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record);\n\n\n if (max !== size) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`Gaps detected in occurrence numbers: found ${size}, seen max ${max}`); // eslint-disable-line functional/immutable-data\n }\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nfunction getPotentialSharedOccurrenceNumberFields(occurrenceNumber, fields) {\n return fields.filter(f => f.tag !== '880' && f.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));\n}\n\nfunction subfieldHasSharedOccurrenceNumber(subfield, candFields) {\n const occurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (!occurrenceNumber || occurrenceNumber === '00') {\n return false;\n }\n const relevantFields = getPotentialSharedOccurrenceNumberFields(occurrenceNumber, candFields);\n // record.fields.filter(f => f.tag !== '880' && fieldHasOccurrenceNumber(f, occurrenceNumber));\n return relevantFields.length > 1;\n}\n\nfunction fieldHasSharedOccurrenceNumber(field, candFields) {\n if (!field.subfields || field.tag === '880') { // Should not happen\n return false;\n }\n\n // What if there are multiple $6s in a given field? Should not be, but...\n return field.subfields.some(subfield => subfieldHasSharedOccurrenceNumber(subfield, candFields));\n\n}\n\nfunction recordGetSharedOccurrenceNumbers(record) {\n const fieldsContainingSubfield6 = record.fields.filter(field => field.tag !== '880' && fieldHasSubfield(field, '6'));\n // fieldsContainingSubfield6.some(field => fieldHasSharedOccurrenceNumber(field, fieldsContainingSubfield6)))\n return fieldsContainingSubfield6.filter(field => fieldHasSharedOccurrenceNumber(field, fieldsContainingSubfield6));\n}\n\nfunction recordDisambiguateSharedSubfield6OccurrenceNumbers(record) {\n const sharedOccurrenceNumberFields = recordGetSharedOccurrenceNumbers(record);\n if (sharedOccurrenceNumberFields.length < 2) {\n return;\n }\n nvdebug(`Disambiguate occurrence numbers (N=${sharedOccurrenceNumberFields.length}) in...`, debug);\n sharedOccurrenceNumberFields.forEach(field => disambiguateOccurrenceNumber(field));\n\n function disambiguateable(field) {\n if (field.tag === '880') { // Not needed, already filtered...\n return false;\n }\n const occurrenceNumber = fieldGetUnambiguousOccurrenceNumber(field);\n nvdebug(` Trying to disambiguate ${occurrenceNumber} in '${fieldToString(field)}`);\n if (occurrenceNumber === undefined) {\n return false;\n }\n const allRelevantFields = getPotentialSharedOccurrenceNumberFields(occurrenceNumber, sharedOccurrenceNumberFields);\n if (allRelevantFields.length < 2) {\n nvdebug(` Currently only ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. No action required.`);\n return false;\n }\n nvdebug(` Currently ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. ACTION REQUIRED!`);\n const relevantFieldsWithCurrFieldTag = allRelevantFields.filter(candField => field.tag === candField.tag);\n\n if (relevantFieldsWithCurrFieldTag.length !== 1) {\n nvdebug(` Number of them using tag ${field.tag} is ${relevantFieldsWithCurrFieldTag.length}. Can not disambiguate!`);\n return false;\n }\n\n return true;\n }\n\n function disambiguateOccurrenceNumber(field) {\n if (!disambiguateable(field)) {\n return;\n }\n // Reset field:\n const occurrenceNumber = fieldGetUnambiguousOccurrenceNumber(field);\n const newOccurrenceNumberAsInt = recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n const newOccurrenceNumber = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n const pairedFields = fieldGetOccurrenceNumberPairs(field, record.fields);\n\n nvdebug(` Reindex '${fieldToString(field)}' occurrence number and it's ${pairedFields.length} pair(s) using '${newOccurrenceNumber}'`, debug);\n\n fieldResetOccurrenceNumber(field, newOccurrenceNumber, occurrenceNumber);\n pairedFields.forEach(pairedField => fieldResetOccurrenceNumber(pairedField, newOccurrenceNumber, occurrenceNumber));\n\n }\n\n\n}\nfunction recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record) {\n // Calculates the number of used different occurrence numbers\n /* eslint-disable */\n let indexArray = [];\n record.fields.forEach(field => gatherFieldData(field));\n\n function gatherFieldData(field) {\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(subfield => gatherSubfieldData(subfield));\n }\n\n function gatherSubfieldData(subfield) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const i = subfield6GetOccurrenceNumberAsInteger(subfield);\n if (i === 0) {\n return\n }\n indexArray[i] = 1;\n }\n let n = 0;\n indexArray.forEach(elem => n+= elem); \n /* eslint-enable */\n return n;\n}\n\nexport function recordResetSubfield6OccurrenceNumbers(record) { // Remove gaps\n /* eslint-disable */\n let currentInt = 1;\n let oldtoNewCache = {};\n\n record.fields.forEach(field => fieldResetSubfield6(field));\n\n function fieldResetSubfield6(field) {\n nvdebug(`fieldResetSubfield6(${fieldToString(field)}), CURR:${currentInt}`, debug);\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(subfield => subfieldReset6(subfield));\n }\n\n function subfieldReset6(subfield) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const currIndex = subfield6GetOccurrenceNumber(subfield);\n if (currIndex === undefined || currIndex === '00') {\n return;\n }\n\n const newIndex = mapCurrIndexToNewIndex(currIndex);\n //nvdebug(`subfieldReset6(${subfieldToString(subfield)}): ${newIndex}`, debug);\n subfield6ResetOccurrenceNumber(subfield, newIndex);\n }\n\n function mapCurrIndexToNewIndex(currIndex) {\n if(currIndex in oldtoNewCache) {\n return oldtoNewCache[currIndex];\n }\n const newIndex = intToOccurrenceNumberString(currentInt);\n oldtoNewCache[currIndex] = newIndex;\n currentInt++;\n return newIndex;\n }\n\n /* eslint-enable */\n\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AAE+H,SAAAD,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE/H;;AAEA,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,4EAA4E,CAAC;;AAG7G;AACA;AACA;;AAEe,SAAAC,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,oFAAoF;IACjGC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,IAAAC,cAAO,EAAC,4BAA4B,EAAEP,KAAK,CAAC;IAC5C,MAAMQ,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEJ,GAAG,EAAE,EAAE;MAAEK,KAAK,EAAE;IAAI,CAAC;IAC/C;;IAEA;;IAEAC,kDAAkD,CAACL,MAAM,CAAC;IAC1DM,qCAAqC,CAACN,MAAM,CAAC;;IAE7C;IACA,OAAOE,GAAG;EACZ;EAEA,SAASJ,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAME,GAAG,GAAG;MAACC,OAAO,EAAE;IAAE,CAAC;IAEzB,IAAAF,cAAO,EAAC,0CAA0C,EAAEP,KAAK,CAAC;IAC1D,IAAIa,gCAAgC,CAACP,MAAM,CAAC,CAACQ,MAAM,EAAE;MAAE;MACrDN,GAAG,CAACC,OAAO,CAACM,IAAI,CAAE,4CAA2C,CAAC,CAAC,CAAC;IAClE;;IAEA;IACA,IAAAR,cAAO,EAAC,qDAAqD,EAAEP,KAAK,CAAC;IACrE,MAAMgB,GAAG,GAAG,IAAAC,8DAA8C,EAACX,MAAM,CAAC;IAClE,MAAMY,IAAI,GAAGC,iDAAiD,CAACb,MAAM,CAAC;IAGtE,IAAIU,GAAG,KAAKE,IAAI,EAAE;MAAE;MAClBV,GAAG,CAACC,OAAO,CAACM,IAAI,CAAE,8CAA6CG,IAAK,cAAaF,GAAI,EAAC,CAAC,CAAC,CAAC;IAC3F;IACAR,GAAG,CAACE,KAAK,GAAGF,GAAG,CAACC,OAAO,CAACK,MAAM,GAAG,CAAC,CAAC,CAAC;IACpC,OAAON,GAAG;EACZ;AACF;AAEA,SAASY,wCAAwCA,CAACC,gBAAgB,EAAEC,MAAM,EAAE;EAC1E,OAAOA,MAAM,CAACC,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACC,GAAG,KAAK,KAAK,IAAID,CAAC,CAACE,SAAS,CAACC,IAAI,CAACC,EAAE,IAAI,IAAAC,4CAA4B,EAACD,EAAE,CAAC,KAAKP,gBAAgB,CAAC,CAAC;AAC7H;AAEA,SAASS,iCAAiCA,CAACC,QAAQ,EAAEC,UAAU,EAAE;EAC/D,MAAMX,gBAAgB,GAAG,IAAAQ,4CAA4B,EAACE,QAAQ,CAAC;EAC/D,IAAI,CAACV,gBAAgB,IAAIA,gBAAgB,KAAK,IAAI,EAAE;IAClD,OAAO,KAAK;EACd;EACA,MAAMY,cAAc,GAAGb,wCAAwC,CAACC,gBAAgB,EAAEW,UAAU,CAAC;EAC7F;EACA,OAAOC,cAAc,CAACnB,MAAM,GAAG,CAAC;AAClC;AAEA,SAASoB,8BAA8BA,CAACC,KAAK,EAAEH,UAAU,EAAE;EACzD,IAAI,CAACG,KAAK,CAACT,SAAS,IAAIS,KAAK,CAACV,GAAG,KAAK,KAAK,EAAE;IAAE;IAC7C,OAAO,KAAK;EACd;;EAEA;EACA,OAAOU,KAAK,CAACT,SAAS,CAACC,IAAI,CAACI,QAAQ,IAAID,iCAAiC,CAACC,QAAQ,EAAEC,UAAU,CAAC,CAAC;AAElG;AAEA,SAASnB,gCAAgCA,CAACP,MAAM,EAAE;EAChD,MAAM8B,yBAAyB,GAAG9B,MAAM,CAACgB,MAAM,CAACC,MAAM,CAACY,KAAK,IAAIA,KAAK,CAACV,GAAG,KAAK,KAAK,IAAI,IAAAY,uBAAgB,EAACF,KAAK,EAAE,GAAG,CAAC,CAAC;EACpH;EACA,OAAOC,yBAAyB,CAACb,MAAM,CAACY,KAAK,IAAID,8BAA8B,CAACC,KAAK,EAAEC,yBAAyB,CAAC,CAAC;AACpH;AAEA,SAASzB,kDAAkDA,CAACL,MAAM,EAAE;EAClE,MAAMgC,4BAA4B,GAAGzB,gCAAgC,CAACP,MAAM,CAAC;EAC7E,IAAIgC,4BAA4B,CAACxB,MAAM,GAAG,CAAC,EAAE;IAC3C;EACF;EACA,IAAAP,cAAO,EAAE,sCAAqC+B,4BAA4B,CAACxB,MAAO,SAAQ,EAAEd,KAAK,CAAC;EAClGsC,4BAA4B,CAACC,OAAO,CAACJ,KAAK,IAAIK,4BAA4B,CAACL,KAAK,CAAC,CAAC;EAElF,SAASM,gBAAgBA,CAACN,KAAK,EAAE;IAC/B,IAAIA,KAAK,CAACV,GAAG,KAAK,KAAK,EAAE;MAAE;MACzB,OAAO,KAAK;IACd;IACA,MAAMJ,gBAAgB,GAAG,IAAAqB,mDAAmC,EAACP,KAAK,CAAC;IACnE,IAAA5B,cAAO,EAAE,2BAA0Bc,gBAAiB,QAAO,IAAAsB,oBAAa,EAACR,KAAK,CAAE,EAAC,CAAC;IAClF,IAAId,gBAAgB,KAAKuB,SAAS,EAAE;MAClC,OAAO,KAAK;IACd;IACA,MAAMC,iBAAiB,GAAGzB,wCAAwC,CAACC,gBAAgB,EAAEiB,4BAA4B,CAAC;IAClH,IAAIO,iBAAiB,CAAC/B,MAAM,GAAG,CAAC,EAAE;MAChC,IAAAP,cAAO,EAAE,mBAAkBsC,iBAAiB,CAAC/B,MAAO,mCAAkCO,gBAAiB,uBAAsB,CAAC;MAC9H,OAAO,KAAK;IACd;IACA,IAAAd,cAAO,EAAE,cAAasC,iBAAiB,CAAC/B,MAAO,mCAAkCO,gBAAiB,oBAAmB,CAAC;IACtH,MAAMyB,8BAA8B,GAAGD,iBAAiB,CAACtB,MAAM,CAACwB,SAAS,IAAIZ,KAAK,CAACV,GAAG,KAAKsB,SAAS,CAACtB,GAAG,CAAC;IAEzG,IAAIqB,8BAA8B,CAAChC,MAAM,KAAK,CAAC,EAAE;MAC/C,IAAAP,cAAO,EAAE,6BAA4B4B,KAAK,CAACV,GAAI,OAAMqB,8BAA8B,CAAChC,MAAO,yBAAwB,CAAC;MACpH,OAAO,KAAK;IACd;IAEA,OAAO,IAAI;EACb;EAEA,SAAS0B,4BAA4BA,CAACL,KAAK,EAAE;IAC3C,IAAI,CAACM,gBAAgB,CAACN,KAAK,CAAC,EAAE;MAC5B;IACF;IACA;IACA,MAAMd,gBAAgB,GAAG,IAAAqB,mDAAmC,EAACP,KAAK,CAAC;IACnE,MAAMa,wBAAwB,GAAG,IAAA/B,8DAA8C,EAACX,MAAM,CAAC,GAAG,CAAC;IAC3F,MAAM2C,mBAAmB,GAAG,IAAAC,2CAA2B,EAACF,wBAAwB,CAAC;IACjF,MAAMG,YAAY,GAAG,IAAAC,6CAA6B,EAACjB,KAAK,EAAE7B,MAAM,CAACgB,MAAM,CAAC;IAExE,IAAAf,cAAO,EAAE,aAAY,IAAAoC,oBAAa,EAACR,KAAK,CAAE,gCAA+BgB,YAAY,CAACrC,MAAO,mBAAkBmC,mBAAoB,GAAE,EAAEjD,KAAK,CAAC;IAE7I,IAAAqD,0CAA0B,EAAClB,KAAK,EAAEc,mBAAmB,EAAE5B,gBAAgB,CAAC;IACxE8B,YAAY,CAACZ,OAAO,CAACe,WAAW,IAAI,IAAAD,0CAA0B,EAACC,WAAW,EAAEL,mBAAmB,EAAE5B,gBAAgB,CAAC,CAAC;EAErH;AAGF;AACA,SAASF,iDAAiDA,CAACb,MAAM,EAAE;EACjE;EACA;EACA,IAAIiD,UAAU,GAAG,EAAE;EACnBjD,MAAM,CAACgB,MAAM,CAACiB,OAAO,CAACJ,KAAK,IAAIqB,eAAe,CAACrB,KAAK,CAAC,CAAC;EAEtD,SAASqB,eAAeA,CAACrB,KAAK,EAAE;IAC9B,IAAI,CAACA,KAAK,CAACT,SAAS,EAAE;MACpB;IACF;IACAS,KAAK,CAACT,SAAS,CAACa,OAAO,CAACR,QAAQ,IAAI0B,kBAAkB,CAAC1B,QAAQ,CAAC,CAAC;EACnE;EAEA,SAAS0B,kBAAkBA,CAAC1B,QAAQ,EAAE;IACpC,IAAI,CAAC,IAAA2B,gCAAgB,EAAC3B,QAAQ,CAAC,EAAE;MAC/B;IACF;IACA,MAAM4B,CAAC,GAAG,IAAAC,qDAAqC,EAAC7B,QAAQ,CAAC;IACzD,IAAI4B,CAAC,KAAK,CAAC,EAAE;MACX;IACF;IACAJ,UAAU,CAACI,CAAC,CAAC,GAAG,CAAC;EACnB;EACA,IAAIE,CAAC,GAAG,CAAC;EACTN,UAAU,CAAChB,OAAO,CAACuB,IAAI,IAAID,CAAC,IAAGC,IAAI,CAAC;EACpC;EACA,OAAOD,CAAC;AACV;AAEO,SAASjD,qCAAqCA,CAACN,MAAM,EAAE;EAAE;EAC9D;EACA,IAAIyD,UAAU,GAAG,CAAC;EAClB,IAAIC,aAAa,GAAG,CAAC,CAAC;EAEtB1D,MAAM,CAACgB,MAAM,CAACiB,OAAO,CAACJ,KAAK,IAAI8B,mBAAmB,CAAC9B,KAAK,CAAC,CAAC;EAE1D,SAAS8B,mBAAmBA,CAAC9B,KAAK,EAAE;IAClC,IAAA5B,cAAO,EAAE,uBAAsB,IAAAoC,oBAAa,EAACR,KAAK,CAAE,WAAU4B,UAAW,EAAC,EAAE/D,KAAK,CAAC;IAClF,IAAI,CAACmC,KAAK,CAACT,SAAS,EAAE;MACpB;IACF;IACAS,KAAK,CAACT,SAAS,CAACa,OAAO,CAACR,QAAQ,IAAImC,cAAc,CAACnC,QAAQ,CAAC,CAAC;EAC/D;EAEA,SAASmC,cAAcA,CAACnC,QAAQ,EAAE;IAChC,IAAI,CAAC,IAAA2B,gCAAgB,EAAC3B,QAAQ,CAAC,EAAE;MAC/B;IACF;IACA,MAAMoC,SAAS,GAAG,IAAAtC,4CAA4B,EAACE,QAAQ,CAAC;IACxD,IAAIoC,SAAS,KAAKvB,SAAS,IAAIuB,SAAS,KAAK,IAAI,EAAE;MACjD;IACF;IAEA,MAAMC,QAAQ,GAAGC,sBAAsB,CAACF,SAAS,CAAC;IAClD;IACA,IAAAG,8CAA8B,EAACvC,QAAQ,EAAEqC,QAAQ,CAAC;EACpD;EAEA,SAASC,sBAAsBA,CAACF,SAAS,EAAE;IACzC,IAAGA,SAAS,IAAIH,aAAa,EAAE;MAC7B,OAAOA,aAAa,CAACG,SAAS,CAAC;IACjC;IACA,MAAMC,QAAQ,GAAG,IAAAlB,2CAA2B,EAACa,UAAU,CAAC;IACxDC,aAAa,CAACG,SAAS,CAAC,GAAGC,QAAQ;IACnCL,UAAU,EAAE;IACZ,OAAOK,QAAQ;EACjB;;EAEA;AAEF","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"reindexSubfield6OccurenceNumbers.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","e","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","recordDisambiguateSharedSubfield6OccurrenceNumbers","recordResetSubfield6OccurrenceNumbers","recordGetSharedOccurrenceNumbers","length","push","max","recordGetMaxSubfield6OccurrenceNumberAsInteger","size","recordGetNumberOfUniqueSubfield6OccurrenceNumbers","getPotentialSharedOccurrenceNumberFields","occurrenceNumber","fields","filter","f","tag","subfields","some","sf","subfield6GetOccurrenceNumber","subfieldHasSharedOccurrenceNumber","subfield","candFields","relevantFields","fieldHasSharedOccurrenceNumber","field","fieldsContainingSubfield6","fieldHasSubfield","sharedOccurrenceNumberFields","forEach","disambiguateOccurrenceNumber","disambiguateable","fieldGetUnambiguousOccurrenceNumber","fieldToString","undefined","allRelevantFields","relevantFieldsWithCurrFieldTag","candField","newOccurrenceNumberAsInt","newOccurrenceNumber","intToOccurrenceNumberString","pairedFields","fieldGetOccurrenceNumberPairs","fieldResetOccurrenceNumber","pairedField","indexArray","gatherFieldData","gatherSubfieldData","isValidSubfield6","i","subfield6GetOccurrenceNumberAsInteger","n","elem","currentInt","oldtoNewCache","fieldResetSubfield6","subfieldReset6","currIndex","newIndex","mapCurrIndexToNewIndex","subfield6ResetOccurrenceNumber"],"sources":["../src/reindexSubfield6OccurenceNumbers.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug} from './utils';\nimport {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fieldResetOccurrenceNumber, intToOccurrenceNumberString, isValidSubfield6,\n recordGetMaxSubfield6OccurrenceNumberAsInteger,\n subfield6GetOccurrenceNumber, subfield6GetOccurrenceNumberAsInteger, subfield6ResetOccurrenceNumber} from './subfield6Utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:reindexSubfield6OccurrenceNumbers');\n\n\n// NB! This validator/fixer has two functionalities:\n// 1) normal reindexing of occurrence numbers\n// 2) disambiguation (when possible) of unambiguous occurrence numbers\n\nexport default function () {\n return {\n description: 'Reindex occurrence numbers in $6 subfield so that they start from 01 and end in NN',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 occurrence numbers', debug);\n const res = {message: [], fix: [], valid: true};\n //message.fix = []; // eslint-disable-line functional/immutable-data\n\n // This can not really fail...\n\n recordDisambiguateSharedSubfield6OccurrenceNumbers(record);\n recordResetSubfield6OccurrenceNumbers(record);\n\n // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n nvdebug('Validate SF6 occurrence number multiuses', debug);\n if (recordGetSharedOccurrenceNumbers(record).length) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`Multi-use of occurrence number(s) detected`); // eslint-disable-line functional/immutable-data\n }\n\n // Check max, and check number of different indexes\n nvdebug('Validate SF6 occurrence number (max vs n instances)', debug);\n const max = recordGetMaxSubfield6OccurrenceNumberAsInteger(record);\n const size = recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record);\n\n\n if (max !== size) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`Gaps detected in occurrence numbers: found ${size}, seen max ${max}`); // eslint-disable-line functional/immutable-data\n }\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nfunction getPotentialSharedOccurrenceNumberFields(occurrenceNumber, fields) {\n return fields.filter(f => f.tag !== '880' && f.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));\n}\n\nfunction subfieldHasSharedOccurrenceNumber(subfield, candFields) {\n const occurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (!occurrenceNumber || occurrenceNumber === '00') {\n return false;\n }\n const relevantFields = getPotentialSharedOccurrenceNumberFields(occurrenceNumber, candFields);\n // record.fields.filter(f => f.tag !== '880' && fieldHasOccurrenceNumber(f, occurrenceNumber));\n return relevantFields.length > 1;\n}\n\nfunction fieldHasSharedOccurrenceNumber(field, candFields) {\n if (!field.subfields || field.tag === '880') { // Should not happen\n return false;\n }\n\n // What if there are multiple $6s in a given field? Should not be, but...\n return field.subfields.some(subfield => subfieldHasSharedOccurrenceNumber(subfield, candFields));\n\n}\n\nfunction recordGetSharedOccurrenceNumbers(record) {\n const fieldsContainingSubfield6 = record.fields.filter(field => field.tag !== '880' && fieldHasSubfield(field, '6'));\n // fieldsContainingSubfield6.some(field => fieldHasSharedOccurrenceNumber(field, fieldsContainingSubfield6)))\n return fieldsContainingSubfield6.filter(field => fieldHasSharedOccurrenceNumber(field, fieldsContainingSubfield6));\n}\n\nfunction recordDisambiguateSharedSubfield6OccurrenceNumbers(record) {\n const sharedOccurrenceNumberFields = recordGetSharedOccurrenceNumbers(record);\n if (sharedOccurrenceNumberFields.length < 2) {\n return;\n }\n nvdebug(`Disambiguate occurrence numbers (N=${sharedOccurrenceNumberFields.length}) in...`, debug);\n sharedOccurrenceNumberFields.forEach(field => disambiguateOccurrenceNumber(field));\n\n function disambiguateable(field) {\n if (field.tag === '880') { // Not needed, already filtered...\n return false;\n }\n const occurrenceNumber = fieldGetUnambiguousOccurrenceNumber(field);\n nvdebug(` Trying to disambiguate ${occurrenceNumber} in '${fieldToString(field)}`);\n if (occurrenceNumber === undefined) {\n return false;\n }\n const allRelevantFields = getPotentialSharedOccurrenceNumberFields(occurrenceNumber, sharedOccurrenceNumberFields);\n if (allRelevantFields.length < 2) {\n nvdebug(` Currently only ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. No action required.`);\n return false;\n }\n nvdebug(` Currently ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. ACTION REQUIRED!`);\n const relevantFieldsWithCurrFieldTag = allRelevantFields.filter(candField => field.tag === candField.tag);\n\n if (relevantFieldsWithCurrFieldTag.length !== 1) {\n nvdebug(` Number of them using tag ${field.tag} is ${relevantFieldsWithCurrFieldTag.length}. Can not disambiguate!`);\n return false;\n }\n\n return true;\n }\n\n function disambiguateOccurrenceNumber(field) {\n if (!disambiguateable(field)) {\n return;\n }\n // Reset field:\n const occurrenceNumber = fieldGetUnambiguousOccurrenceNumber(field);\n const newOccurrenceNumberAsInt = recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n const newOccurrenceNumber = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n const pairedFields = fieldGetOccurrenceNumberPairs(field, record.fields);\n\n nvdebug(` Reindex '${fieldToString(field)}' occurrence number and it's ${pairedFields.length} pair(s) using '${newOccurrenceNumber}'`, debug);\n\n fieldResetOccurrenceNumber(field, newOccurrenceNumber, occurrenceNumber);\n pairedFields.forEach(pairedField => fieldResetOccurrenceNumber(pairedField, newOccurrenceNumber, occurrenceNumber));\n\n }\n\n\n}\nfunction recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record) {\n // Calculates the number of used different occurrence numbers\n /* eslint-disable */\n let indexArray = [];\n record.fields.forEach(field => gatherFieldData(field));\n\n function gatherFieldData(field) {\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(subfield => gatherSubfieldData(subfield));\n }\n\n function gatherSubfieldData(subfield) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const i = subfield6GetOccurrenceNumberAsInteger(subfield);\n if (i === 0) {\n return\n }\n indexArray[i] = 1;\n }\n let n = 0;\n indexArray.forEach(elem => n+= elem); \n /* eslint-enable */\n return n;\n}\n\nexport function recordResetSubfield6OccurrenceNumbers(record) { // Remove gaps\n /* eslint-disable */\n let currentInt = 1;\n let oldtoNewCache = {};\n\n record.fields.forEach(field => fieldResetSubfield6(field));\n\n function fieldResetSubfield6(field) {\n nvdebug(`fieldResetSubfield6(${fieldToString(field)}), CURR:${currentInt}`, debug);\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(subfield => subfieldReset6(subfield));\n }\n\n function subfieldReset6(subfield) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const currIndex = subfield6GetOccurrenceNumber(subfield);\n if (currIndex === undefined || currIndex === '00') {\n return;\n }\n\n const newIndex = mapCurrIndexToNewIndex(currIndex);\n //nvdebug(`subfieldReset6(${subfieldToString(subfield)}): ${newIndex}`, debug);\n subfield6ResetOccurrenceNumber(subfield, newIndex);\n }\n\n function mapCurrIndexToNewIndex(currIndex) {\n if(currIndex in oldtoNewCache) {\n return oldtoNewCache[currIndex];\n }\n const newIndex = intToOccurrenceNumberString(currentInt);\n oldtoNewCache[currIndex] = newIndex;\n currentInt++;\n return newIndex;\n }\n\n /* eslint-enable */\n\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -6,7 +6,7 @@ var _reindexSubfield6OccurenceNumbers = _interopRequireDefault(require("./reinde
|
|
|
6
6
|
var _fixura = require("@natlibfi/fixura");
|
|
7
7
|
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
8
8
|
var _debug = _interopRequireDefault(require("debug"));
|
|
9
|
-
function _interopRequireDefault(
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
10
|
(0, _fixugen.default)({
|
|
11
11
|
callback,
|
|
12
12
|
path: [__dirname, '..', 'test-fixtures', 'reindex-sf6-occurence-numbers'],
|