@natlibfi/marc-record-validators-melinda 11.6.6 → 11.6.7-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/melinda-node-tests.yml +1 -1
- package/dist/access-rights.js +1 -5
- package/dist/access-rights.js.map +1 -1
- package/dist/addMissingField336.js +1 -1
- package/dist/addMissingField336.js.map +1 -1
- package/dist/cyrillux-usemarcon-replacement.js +41 -45
- package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
- package/dist/cyrillux.js +13 -17
- package/dist/cyrillux.js.map +1 -1
- package/dist/disambiguateSeriesStatements.js +3 -4
- package/dist/disambiguateSeriesStatements.js.map +1 -1
- package/dist/double-commas.js +2 -1
- package/dist/double-commas.js.map +1 -1
- package/dist/duplicates-ind1.js +1 -1
- package/dist/duplicates-ind1.js.map +1 -1
- package/dist/empty-fields.js +0 -4
- package/dist/empty-fields.js.map +1 -1
- package/dist/ending-punctuation.js +21 -49
- package/dist/ending-punctuation.js.map +1 -1
- package/dist/ending-whitespace.js +0 -4
- package/dist/ending-whitespace.js.map +1 -1
- package/dist/field-008-18-34-character-groups.js +4 -5
- package/dist/field-008-18-34-character-groups.js.map +1 -1
- package/dist/field-505-separators.js +8 -6
- package/dist/field-505-separators.js.map +1 -1
- package/dist/field-521-fix.js +5 -6
- package/dist/field-521-fix.js.map +1 -1
- package/dist/field-exclusion.js +5 -12
- package/dist/field-exclusion.js.map +1 -1
- package/dist/field-exclusion.spec.js +3 -5
- package/dist/field-exclusion.spec.js.map +1 -1
- package/dist/field-structure.js +2 -5
- package/dist/field-structure.js.map +1 -1
- package/dist/fields-present.js +1 -1
- package/dist/fields-present.js.map +1 -1
- package/dist/fields-present.spec.js +1 -1
- package/dist/fields-present.spec.js.map +1 -1
- package/dist/fix-33X.js +5 -6
- package/dist/fix-33X.js.map +1 -1
- package/dist/fix-country-codes.js +3 -4
- package/dist/fix-country-codes.js.map +1 -1
- package/dist/fix-language-codes.js +12 -9
- package/dist/fix-language-codes.js.map +1 -1
- package/dist/fixRelatorTerms.js +8 -8
- package/dist/fixRelatorTerms.js.map +1 -1
- package/dist/fixed-fields.js +1 -4
- package/dist/fixed-fields.js.map +1 -1
- package/dist/identical-fields.js +2 -3
- package/dist/identical-fields.js.map +1 -1
- package/dist/indicator-fixes.js +14 -15
- package/dist/indicator-fixes.js.map +1 -1
- package/dist/isbn-issn.js +8 -11
- package/dist/isbn-issn.js.map +1 -1
- package/dist/item-language.js +5 -12
- package/dist/item-language.js.map +1 -1
- package/dist/merge-fields/counterpartField.js +6 -8
- package/dist/merge-fields/counterpartField.js.map +1 -1
- package/dist/merge-fields/index.js +3 -3
- package/dist/merge-fields/index.js.map +1 -1
- package/dist/merge-fields/mergeConstraints.js +0 -1
- package/dist/merge-fields/mergeConstraints.js.map +1 -1
- package/dist/merge-fields/mergeField.js +12 -18
- package/dist/merge-fields/mergeField.js.map +1 -1
- package/dist/merge-fields/mergeIndicator.js +5 -5
- package/dist/merge-fields/mergeIndicator.js.map +1 -1
- package/dist/merge-fields/mergeOrAddPostprocess.js +6 -9
- package/dist/merge-fields/mergeOrAddPostprocess.js.map +1 -1
- package/dist/merge-fields/mergeOrAddSubfield.js +6 -8
- package/dist/merge-fields/mergeOrAddSubfield.js.map +1 -1
- package/dist/merge-fields/mergeSubfield.js +8 -8
- package/dist/merge-fields/mergeSubfield.js.map +1 -1
- package/dist/merge-fields/removeDuplicateSubfields.js +1 -2
- package/dist/merge-fields/removeDuplicateSubfields.js.map +1 -1
- package/dist/merge-fields/worldKnowledge.js +1 -1
- package/dist/merge-fields/worldKnowledge.js.map +1 -1
- package/dist/mergeField500Lisapainokset.js +0 -3
- package/dist/mergeField500Lisapainokset.js.map +1 -1
- package/dist/mergeRelatorTermFields.js +3 -3
- package/dist/mergeRelatorTermFields.js.map +1 -1
- package/dist/modernize-502.js +6 -6
- package/dist/modernize-502.js.map +1 -1
- package/dist/multiple-subfield-0.js +4 -4
- package/dist/multiple-subfield-0.js.map +1 -1
- package/dist/non-breaking-space.js +0 -4
- package/dist/non-breaking-space.js.map +1 -1
- package/dist/normalize-dashes.js +5 -4
- package/dist/normalize-dashes.js.map +1 -1
- package/dist/normalize-identifiers.js +6 -6
- package/dist/normalize-identifiers.js.map +1 -1
- package/dist/normalize-qualifying-information.js +4 -4
- package/dist/normalize-qualifying-information.js.map +1 -1
- package/dist/normalize-utf8-diacritics.js +7 -7
- package/dist/normalize-utf8-diacritics.js.map +1 -1
- package/dist/normalizeFieldForComparison.js +21 -20
- package/dist/normalizeFieldForComparison.js.map +1 -1
- package/dist/normalizeSubfieldValueForComparison.js +1 -2
- package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
- package/dist/prepublicationUtils.js +3 -3
- package/dist/prepublicationUtils.js.map +1 -1
- package/dist/punctuation/index.js +14 -31
- package/dist/punctuation/index.js.map +1 -1
- package/dist/punctuation2.js +9 -10
- package/dist/punctuation2.js.map +1 -1
- package/dist/reindexSubfield6OccurenceNumbers.js +8 -9
- package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
- package/dist/removeDuplicateDataFields.js +18 -20
- package/dist/removeDuplicateDataFields.js.map +1 -1
- package/dist/removeInferiorDataFields.js +16 -19
- package/dist/removeInferiorDataFields.js.map +1 -1
- package/dist/resolvable-ext-references-melinda.js +4 -8
- package/dist/resolvable-ext-references-melinda.js.map +1 -1
- package/dist/resolveOrphanedSubfield6s.js +9 -9
- package/dist/resolveOrphanedSubfield6s.js.map +1 -1
- package/dist/sanitize-vocabulary-source-codes.js +9 -9
- package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
- package/dist/sort-tags.js +2 -2
- package/dist/sort-tags.js.map +1 -1
- package/dist/sortFields.js +4 -9
- package/dist/sortFields.js.map +1 -1
- package/dist/sortRelatorTerms.js +4 -5
- package/dist/sortRelatorTerms.js.map +1 -1
- package/dist/sortSubfields.js +5 -6
- package/dist/sortSubfields.js.map +1 -1
- package/dist/stripPunctuation.js +2 -2
- package/dist/stripPunctuation.js.map +1 -1
- package/dist/subfield-exclusion.js +4 -11
- package/dist/subfield-exclusion.js.map +1 -1
- package/dist/subfield6Utils.js +12 -11
- package/dist/subfield6Utils.js.map +1 -1
- package/dist/subfield8Utils.js +8 -9
- package/dist/subfield8Utils.js.map +1 -1
- package/dist/subfieldValueNormalizations.js +5 -8
- package/dist/subfieldValueNormalizations.js.map +1 -1
- package/dist/sync-007-and-300.js +8 -8
- package/dist/sync-007-and-300.js.map +1 -1
- package/dist/translate-terms.js +5 -6
- package/dist/translate-terms.js.map +1 -1
- package/dist/typeOfDate-008.js +3 -4
- package/dist/typeOfDate-008.js.map +1 -1
- package/dist/unicode-decomposition.js +1 -1
- package/dist/unicode-decomposition.js.map +1 -1
- package/dist/update-field-540.js +5 -6
- package/dist/update-field-540.js.map +1 -1
- package/dist/urn.js +4 -9
- package/dist/urn.js.map +1 -1
- package/dist/utils.js +5 -9
- package/dist/utils.js.map +1 -1
- package/eslint.config.mjs +53 -0
- package/package.json +12 -13
- package/src/access-rights.js +4 -4
- package/src/addMissingField336.js +1 -1
- package/src/cyrillux-usemarcon-replacement.js +38 -38
- package/src/cyrillux.js +14 -14
- package/src/disambiguateSeriesStatements.js +3 -3
- package/src/double-commas.js +2 -2
- package/src/duplicates-ind1.js +1 -1
- package/src/empty-fields.js +4 -4
- package/src/ending-punctuation.js +46 -49
- package/src/ending-whitespace.js +0 -2
- package/src/field-008-18-34-character-groups.js +5 -5
- package/src/field-505-separators.js +6 -6
- package/src/field-521-fix.js +6 -6
- package/src/field-exclusion.js +12 -12
- package/src/field-exclusion.spec.js +4 -4
- package/src/field-structure.js +5 -5
- package/src/fields-present.js +1 -1
- package/src/fields-present.spec.js +1 -1
- package/src/fix-33X.js +5 -5
- package/src/fix-country-codes.js +3 -3
- package/src/fix-language-codes.js +10 -9
- package/src/fixRelatorTerms.js +8 -8
- package/src/fixed-fields.js +3 -3
- package/src/identical-fields.js +3 -3
- package/src/indicator-fixes.js +15 -15
- package/src/isbn-issn.js +11 -11
- package/src/item-language.js +10 -10
- package/src/merge-fields/counterpartField.js +7 -7
- package/src/merge-fields/index.js +3 -3
- package/src/merge-fields/mergeConstraints.js +1 -1
- package/src/merge-fields/mergeField.js +16 -17
- package/src/merge-fields/mergeIndicator.js +5 -5
- package/src/merge-fields/mergeOrAddPostprocess.js +9 -9
- package/src/merge-fields/mergeOrAddSubfield.js +6 -6
- package/src/merge-fields/mergeSubfield.js +8 -8
- package/src/merge-fields/removeDuplicateSubfields.js +1 -2
- package/src/merge-fields/worldKnowledge.js +1 -1
- package/src/mergeField500Lisapainokset.js +0 -2
- package/src/mergeRelatorTermFields.js +3 -3
- package/src/modernize-502.js +6 -6
- package/src/multiple-subfield-0.js +4 -4
- package/src/non-breaking-space.js +0 -2
- package/src/normalize-dashes.js +4 -4
- package/src/normalize-identifiers.js +6 -6
- package/src/normalize-qualifying-information.js +4 -4
- package/src/normalize-utf8-diacritics.js +7 -7
- package/src/normalizeFieldForComparison.js +20 -20
- package/src/normalizeSubfieldValueForComparison.js +1 -1
- package/src/prepublicationUtils.js +3 -3
- package/src/punctuation/index.js +29 -29
- package/src/punctuation2.js +10 -10
- package/src/reindexSubfield6OccurenceNumbers.js +9 -9
- package/src/removeDuplicateDataFields.js +21 -23
- package/src/removeInferiorDataFields.js +19 -19
- package/src/resolvable-ext-references-melinda.js +8 -8
- package/src/resolveOrphanedSubfield6s.js +9 -9
- package/src/sanitize-vocabulary-source-codes.js +8 -8
- package/src/sort-tags.js +2 -2
- package/src/sortFields.js +6 -6
- package/src/sortRelatorTerms.js +5 -5
- package/src/sortSubfields.js +6 -6
- package/src/stripPunctuation.js +2 -2
- package/src/subfield-exclusion.js +11 -11
- package/src/subfield6Utils.js +11 -11
- package/src/subfield8Utils.js +6 -9
- package/src/subfieldValueNormalizations.js +5 -7
- package/src/sync-007-and-300.js +8 -8
- package/src/translate-terms.js +3 -5
- package/src/typeOfDate-008.js +3 -3
- package/src/unicode-decomposition.js +1 -1
- package/src/update-field-540.js +6 -6
- package/src/urn.js +8 -6
- package/src/utils.js +8 -8
- package/.eslintignore +0 -1
package/dist/fixed-fields.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixed-fields.js","names":["_default","configuration","Array","isArray","description","validate","Error","record","messages","reduce","item","results","leader","validateField","get","tag","map","f","value","length","concat","acc","includes","valid","spec","messagePrefix","rules","rule","ruleIndex","indexes","getIndexes","position","positions","split","char","index","dependencies","every","checkDependency","pattern","test","dependency","join","arg","keys","slice"],"sources":["../src/fixed-fields.js"],"sourcesContent":["export default function (configuration) {\n if (Array.isArray(configuration)) {\n return {\n description:\n 'Validates fixed fields',\n validate\n };\n }\n\n throw new Error('No configuration provided');\n\n function validate(record) {\n const messages = configuration.reduce((messages, item) => {\n let results
|
|
1
|
+
{"version":3,"file":"fixed-fields.js","names":["_default","configuration","Array","isArray","description","validate","Error","record","messages","reduce","item","results","leader","validateField","get","tag","map","f","value","length","concat","acc","includes","valid","spec","messagePrefix","rules","rule","ruleIndex","indexes","getIndexes","position","positions","split","char","index","dependencies","every","checkDependency","pattern","test","dependency","join","arg","keys","slice"],"sources":["../src/fixed-fields.js"],"sourcesContent":["export default function (configuration) {\n if (Array.isArray(configuration)) {\n return {\n description:\n 'Validates fixed fields',\n validate\n };\n }\n\n throw new Error('No configuration provided');\n\n function validate(record) {\n const messages = configuration.reduce((messages, item) => {\n let results;\n\n if (item.leader) {\n results = validateField(record.leader, item);\n } else {\n results = record.get(item.tag)\n .map(f => validateField(f.value, item, f.tag));\n }\n\n if (results && results.length > 0) {\n return messages.concat(...results).reduce((acc, item) => acc.includes(item) ? acc : acc.concat(item), []);\n }\n\n return messages;\n }, []);\n\n return {valid: messages.length === 0, messages};\n\n function validateField(value, spec, tag) {\n const messagePrefix = tag ? `Field ${tag}` : 'Leader';\n\n if (typeof spec.length === 'number') {\n if (value.length !== spec.length) {\n return [`${messagePrefix} has invalid length`];\n }\n }\n\n if (spec.rules) {\n return spec.rules.reduce((messages, rule, ruleIndex) => {\n const indexes = getIndexes(rule.position);\n const positions = value.split('').reduce((positions, char, index) => {\n if (indexes.includes(index) && (!rule.dependencies || rule.dependencies.every(checkDependency))) {\n if (!rule.pattern.test(char)) {\n return positions.concat(index);\n }\n }\n\n return positions;\n\n function checkDependency(dependency) {\n const indexes = getIndexes(dependency.position);\n return value.split('').every((char, index) => !indexes.includes(index) || dependency.pattern.test(char));\n }\n }, []);\n\n if (positions.length > 0) {\n return messages.concat(`${messagePrefix} has invalid values at positions: ${positions.join()} (Rule index ${ruleIndex})`);\n }\n\n return messages;\n\n function getIndexes(arg) {\n if (Array.isArray(arg)) {\n const indexes = [...new Array(arg[1] + 1).keys()];\n return indexes.slice(arg[0], arg[1] + 1);\n }\n\n return [arg];\n }\n }, []);\n }\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/identical-fields.js
CHANGED
|
@@ -28,13 +28,12 @@ function _default() {
|
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
30
|
function fix(record) {
|
|
31
|
-
record.fields.filter(tag => !uniqWith(record.fields).includes(tag)).forEach(tag => record.removeField(tag));
|
|
31
|
+
record.fields.filter(tag => !uniqWith(record.fields).includes(tag)).forEach(tag => record.removeField(tag)); // eslint-disable-line array-callback-return
|
|
32
32
|
}
|
|
33
33
|
function uniqWith(fields) {
|
|
34
34
|
return fields.reduce((uniq, field) => {
|
|
35
35
|
if (!uniq.some(f => _marcRecord.MarcRecord.isEqual(f, field))) {
|
|
36
|
-
|
|
37
|
-
uniq.push(field); // eslint-disable-line functional/immutable-data
|
|
36
|
+
uniq.push(field);
|
|
38
37
|
}
|
|
39
38
|
return uniq;
|
|
40
39
|
}, []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identical-fields.js","names":["_marcRecord","require","_default","description","validate","fix","record","uniq","uniqWith","fields","valid","length","messages","filter","tag","includes","map","obj","forEach","removeField","reduce","field","some","f","MarcRecord","isEqual","push"],"sources":["../src/identical-fields.js"],"sourcesContent":["/**\n * This validator de-duplicates identical fields in a record.\n */\n\nimport {MarcRecord} from '@natlibfi/marc-record';\n\nexport default function () {\n return {\n description: 'Handles identical duplicate in record fields',\n validate,\n fix\n };\n\n function validate(record) {\n const uniq = uniqWith(record.fields);\n const valid = uniq.length === record.fields.length;\n const messages = record.fields.filter(tag => !uniq.includes(tag))\n .map(obj => `Field ${obj.tag} has duplicates`);\n\n return valid ? {valid, messages: []} : {valid, messages};\n }\n\n function fix(record) {\n record.fields\n .filter(tag => !uniqWith(record.fields).includes(tag))\n .forEach(tag => record.removeField(tag))
|
|
1
|
+
{"version":3,"file":"identical-fields.js","names":["_marcRecord","require","_default","description","validate","fix","record","uniq","uniqWith","fields","valid","length","messages","filter","tag","includes","map","obj","forEach","removeField","reduce","field","some","f","MarcRecord","isEqual","push"],"sources":["../src/identical-fields.js"],"sourcesContent":["/**\n * This validator de-duplicates identical fields in a record.\n */\n\nimport {MarcRecord} from '@natlibfi/marc-record';\n\nexport default function () {\n return {\n description: 'Handles identical duplicate in record fields',\n validate,\n fix\n };\n\n function validate(record) {\n const uniq = uniqWith(record.fields);\n const valid = uniq.length === record.fields.length;\n const messages = record.fields.filter(tag => !uniq.includes(tag))\n .map(obj => `Field ${obj.tag} has duplicates`);\n\n return valid ? {valid, messages: []} : {valid, messages};\n }\n\n function fix(record) {\n record.fields\n .filter(tag => !uniqWith(record.fields).includes(tag))\n .forEach(tag => record.removeField(tag)); // eslint-disable-line array-callback-return\n }\n\n function uniqWith(fields) {\n return fields.reduce((uniq, field) => {\n if (!uniq.some(f => MarcRecord.isEqual(f, field))) {\n uniq.push(field);\n }\n\n return uniq;\n }, []);\n }\n}\n"],"mappings":";;;;;;AAIA,IAAAA,WAAA,GAAAC,OAAA;AAJA;AACA;AACA;;AAIe,SAAAC,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,8CAA8C;IAC3DC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMC,IAAI,GAAGC,QAAQ,CAACF,MAAM,CAACG,MAAM,CAAC;IACpC,MAAMC,KAAK,GAAGH,IAAI,CAACI,MAAM,KAAKL,MAAM,CAACG,MAAM,CAACE,MAAM;IAClD,MAAMC,QAAQ,GAAGN,MAAM,CAACG,MAAM,CAACI,MAAM,CAACC,GAAG,IAAI,CAACP,IAAI,CAACQ,QAAQ,CAACD,GAAG,CAAC,CAAC,CAC9DE,GAAG,CAACC,GAAG,IAAI,SAASA,GAAG,CAACH,GAAG,iBAAiB,CAAC;IAEhD,OAAOJ,KAAK,GAAG;MAACA,KAAK;MAAEE,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACF,KAAK;MAAEE;IAAQ,CAAC;EAC1D;EAEA,SAASP,GAAGA,CAACC,MAAM,EAAE;IACnBA,MAAM,CAACG,MAAM,CACVI,MAAM,CAACC,GAAG,IAAI,CAACN,QAAQ,CAACF,MAAM,CAACG,MAAM,CAAC,CAACM,QAAQ,CAACD,GAAG,CAAC,CAAC,CACrDI,OAAO,CAACJ,GAAG,IAAIR,MAAM,CAACa,WAAW,CAACL,GAAG,CAAC,CAAC,CAAC,CAAC;EAC9C;EAEA,SAASN,QAAQA,CAACC,MAAM,EAAE;IACxB,OAAOA,MAAM,CAACW,MAAM,CAAC,CAACb,IAAI,EAAEc,KAAK,KAAK;MACpC,IAAI,CAACd,IAAI,CAACe,IAAI,CAACC,CAAC,IAAIC,sBAAU,CAACC,OAAO,CAACF,CAAC,EAAEF,KAAK,CAAC,CAAC,EAAE;QACjDd,IAAI,CAACmB,IAAI,CAACL,KAAK,CAAC;MAClB;MAEA,OAAOd,IAAI;IACb,CAAC,EAAE,EAAE,CAAC;EACR;AACF","ignoreList":[]}
|
package/dist/indicator-fixes.js
CHANGED
|
@@ -30,30 +30,29 @@ function _default() {
|
|
|
30
30
|
message: []
|
|
31
31
|
};
|
|
32
32
|
validateRecord(record, res);
|
|
33
|
-
res.valid = res.message.length < 1;
|
|
33
|
+
res.valid = res.message.length < 1;
|
|
34
34
|
return res;
|
|
35
35
|
}
|
|
36
36
|
function validateRecord(record, res) {
|
|
37
37
|
//nvdebug(record);
|
|
38
38
|
const clonedFields = JSON.parse(JSON.stringify(record.fields));
|
|
39
39
|
recordNormalizeIndicators(record);
|
|
40
|
-
record.fields.forEach((field, index) => compareFields(field, index));
|
|
40
|
+
record.fields.forEach((field, index) => compareFields(field, index)); // eslint-disable-line array-callback-return
|
|
41
|
+
|
|
41
42
|
function compareFields(field, index) {
|
|
42
43
|
const origFieldAsString = (0, _utils.fieldToString)(clonedFields[index]);
|
|
43
44
|
//const clonedFieldAsString = fieldToString(field);
|
|
44
45
|
if (clonedFields[index].ind1 !== field.ind1) {
|
|
45
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
46
46
|
//nvdebug(`FIX IND1: '${clonedFields[index].ind1}' => '${field.ind1}': ${clonedFieldAsString}`);
|
|
47
|
-
res.message.push(`Expected IND1 for '${origFieldAsString}' is '${field.ind1}'`);
|
|
47
|
+
res.message.push(`Expected IND1 for '${origFieldAsString}' is '${field.ind1}'`);
|
|
48
48
|
}
|
|
49
49
|
if (clonedFields[index].ind2 !== field.ind2) {
|
|
50
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
51
50
|
//nvdebug(`FIX IND2: '${clonedFields[index].ind2}' => '${field.ind2}': ${clonedFieldAsString}`);
|
|
52
|
-
res.message.push(`Expected IND2 for '${origFieldAsString}' is '${field.ind2}'`);
|
|
51
|
+
res.message.push(`Expected IND2 for '${origFieldAsString}' is '${field.ind2}'`);
|
|
53
52
|
}
|
|
54
53
|
}
|
|
55
54
|
// Validator should not change the original record:
|
|
56
|
-
record.fields = clonedFields;
|
|
55
|
+
record.fields = clonedFields;
|
|
57
56
|
return;
|
|
58
57
|
}
|
|
59
58
|
}
|
|
@@ -122,13 +121,13 @@ function normalizeNonFilingIndicator1(field, languages = []) {
|
|
|
122
121
|
if (!hasNonFilingIndicator1(field) || !modifiableIndicatorValue(field.ind1)) {
|
|
123
122
|
return;
|
|
124
123
|
}
|
|
125
|
-
field.ind1 = determineNonFilingIndicatorValue(field, languages);
|
|
124
|
+
field.ind1 = determineNonFilingIndicatorValue(field, languages);
|
|
126
125
|
}
|
|
127
126
|
function normalizeNonFilingIndicator2(field, languages = []) {
|
|
128
127
|
if (!hasNonFilingIndicator2(field) || !modifiableIndicatorValue(field.ind2)) {
|
|
129
128
|
return;
|
|
130
129
|
}
|
|
131
|
-
field.ind2 = determineNonFilingIndicatorValue(field, languages);
|
|
130
|
+
field.ind2 = determineNonFilingIndicatorValue(field, languages);
|
|
132
131
|
}
|
|
133
132
|
const fiktiivisenAineistonLisaluokatFI = ['Eläimet', 'Erotiikka', 'Erä', 'Fantasia', 'Historia', 'Huumori', 'Jännitys', 'Kauhu', 'Novellit', 'Romantiikka', 'Scifi', 'Sota', 'Urheilu', 'Uskonto'];
|
|
134
133
|
function containsFiktiivisenAineistonLisaluokka(field) {
|
|
@@ -142,7 +141,7 @@ function normalize084Indicator1(field) {
|
|
|
142
141
|
|
|
143
142
|
// https://marc21.kansalliskirjasto.fi/bib/05X-08X.htm#084 and https://finto.fi/ykl/fi/page/fiktioluokka
|
|
144
143
|
if (field.ind1 !== '9' && containsFiktiivisenAineistonLisaluokka(field) && field.subfields.some(sf => sf.code === '2' && sf.value === 'ykl')) {
|
|
145
|
-
field.ind1 = '9';
|
|
144
|
+
field.ind1 = '9';
|
|
146
145
|
return;
|
|
147
146
|
}
|
|
148
147
|
}
|
|
@@ -151,7 +150,7 @@ function normalize245Indicator1(field, record) {
|
|
|
151
150
|
return;
|
|
152
151
|
}
|
|
153
152
|
const field1XX = record.get('^1..$');
|
|
154
|
-
field.ind1 = field1XX.length === 0 ? '0' : '1';
|
|
153
|
+
field.ind1 = field1XX.length === 0 ? '0' : '1';
|
|
155
154
|
}
|
|
156
155
|
function normalize776Indicator2(field) {
|
|
157
156
|
if (field.tag !== '776') {
|
|
@@ -159,7 +158,7 @@ function normalize776Indicator2(field) {
|
|
|
159
158
|
}
|
|
160
159
|
// If subfield $i exists, ind2 must me '8'
|
|
161
160
|
if (field.subfields.some(sf => sf.code === 'i')) {
|
|
162
|
-
field.ind2 = '8';
|
|
161
|
+
field.ind2 = '8';
|
|
163
162
|
return;
|
|
164
163
|
}
|
|
165
164
|
}
|
|
@@ -172,14 +171,14 @@ function recordNormalize490(record) {
|
|
|
172
171
|
if (fields490.length <= fields8XX.length) {
|
|
173
172
|
// Trace found for each field 490:
|
|
174
173
|
fields490.forEach(f => {
|
|
175
|
-
f.ind1 = '1';
|
|
174
|
+
f.ind1 = '1';
|
|
176
175
|
});
|
|
177
176
|
return;
|
|
178
177
|
}
|
|
179
178
|
if (fields8XX.length === 0) {
|
|
180
179
|
// Fields 490 are always untraced (no traces found)
|
|
181
180
|
fields490.forEach(f => {
|
|
182
|
-
f.ind1 = '0';
|
|
181
|
+
f.ind1 = '0';
|
|
183
182
|
});
|
|
184
183
|
return;
|
|
185
184
|
}
|
|
@@ -207,7 +206,7 @@ function recordNormalizeIndicators(record) {
|
|
|
207
206
|
|
|
208
207
|
// Language is used to handle non-filing indicators
|
|
209
208
|
const languages = getLanguages(record);
|
|
210
|
-
record.fields.forEach(field => fieldNormalizeIndicators(field, record, languages));
|
|
209
|
+
record.fields.forEach(field => fieldNormalizeIndicators(field, record, languages)); // eslint-disable-line array-callback-return
|
|
211
210
|
}
|
|
212
211
|
function fieldNormalizeIndicators(field, record, languages) {
|
|
213
212
|
normalize084Indicator1(field);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indicator-fixes.js","names":["_utils","require","_default","description","validate","fix","record","res","message","valid","recordNormalizeIndicators","validateRecord","length","clonedFields","JSON","parse","stringify","fields","forEach","field","index","compareFields","origFieldAsString","fieldToString","ind1","push","ind2","ind1NonFilingChars","ind2NonFilingChars","hasNonFilingIndicator1","includes","tag","modifiableIndicatorValue","value","hasNonFilingIndicator2","valueBeginsWithDeterminer","cands","find","cand","substring","determineNonFilingIndicatorValue","languages","undefined","subfieldA","subfields","sf","code","name","toLowerCase","match","normalizeNonFilingIndicator1","normalizeNonFilingIndicator2","fiktiivisenAineistonLisaluokatFI","containsFiktiivisenAineistonLisaluokka","some","normalize084Indicator1","normalize245Indicator1","field1XX","get","normalize776Indicator2","recordNormalize490","fields490","fields8XX","f","getLanguages","langFields","filter","isRelevantSubfield","map","subfield","fieldNormalizeIndicators"],"sources":["../src/indicator-fixes.js"],"sourcesContent":["// Relocated from melinda-marc-record-merge-reducers (and renamed)\n//import createDebugLogger from 'debug';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:normalizeIdentifiers');\n\nimport {fieldToString} from './utils';\n\n\nexport default function () {\n\n return {\n description: 'Normalizes indicator values',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n recordNormalizeIndicators(record);\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n validateRecord(record, res);\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n\n\n function validateRecord(record, res) {\n //nvdebug(record);\n const clonedFields = JSON.parse(JSON.stringify(record.fields));\n recordNormalizeIndicators(record);\n\n record.fields.forEach((field, index) => compareFields(field, index));\n\n function compareFields(field, index) {\n const origFieldAsString = fieldToString(clonedFields[index]);\n //const clonedFieldAsString = fieldToString(field);\n if (clonedFields[index].ind1 !== field.ind1) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(`FIX IND1: '${clonedFields[index].ind1}' => '${field.ind1}': ${clonedFieldAsString}`);\n res.message.push(`Expected IND1 for '${origFieldAsString}' is '${field.ind1}'`); // eslint-disable-line functional/immutable-data\n }\n if (clonedFields[index].ind2 !== field.ind2) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(`FIX IND2: '${clonedFields[index].ind2}' => '${field.ind2}': ${clonedFieldAsString}`);\n res.message.push(`Expected IND2 for '${origFieldAsString}' is '${field.ind2}'`); // eslint-disable-line functional/immutable-data\n }\n }\n // Validator should not change the original record:\n record.fields = clonedFields; // eslint-disable-line functional/immutable-data\n return;\n }\n}\n\n\nconst ind1NonFilingChars = ['130', '630', '730', '740'];\nconst ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];\n\nfunction hasNonFilingIndicator1(field) {\n return ind1NonFilingChars.includes(field.tag);\n}\n\nfunction modifiableIndicatorValue(value) {\n // If field contains a legit-looking value, don't try to modify it here...\n return !['9', '8', '7', '6', '5', '4', '3', '2', '1'].includes(value);\n}\n\nfunction hasNonFilingIndicator2(field) {\n return ind2NonFilingChars.includes(field.tag);\n}\n\nfunction valueBeginsWithDeterminer(value, cands) {\n return cands.find(cand => value.substring(0, cand.length) === cand);\n}\n\nfunction determineNonFilingIndicatorValue(field, languages = undefined) {\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n if (!subfieldA) {\n // nvdebug(' Subfield $a miss!');\n return;\n }\n\n const name = subfieldA.value.toLowerCase();\n\n if (languages.includes('eng')) {\n const match = valueBeginsWithDeterminer(name, ['a ', 'an ', 'the ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('fre')) {\n const match = valueBeginsWithDeterminer(name, ['l\\'', 'le ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('ger')) {\n const match = valueBeginsWithDeterminer(name, ['das ', 'der ', 'die ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('swe')) {\n const match = valueBeginsWithDeterminer(name, ['en ', 'ett ']);\n if (match) {\n return `${match.length}`;\n }\n if (name.match(/^de[nt] /u) && !name.match(/^de[nt] som /u)) {\n return '4';\n }\n }\n\n // Fallback-ish: try to guess even without languages:\n const match = valueBeginsWithDeterminer(name, ['the ']);\n if (match) {\n return `${match.length}`;\n }\n if (name.match(/^a /u) && !languages.includes('hun') && !name.match(/^a (?:b |la )/u)) { // Skip \"a b c\", \"a la carte\"...\n return '2';\n }\n\n return '0';\n}\n\nfunction normalizeNonFilingIndicator1(field, languages = []) {\n if (!hasNonFilingIndicator1(field) || !modifiableIndicatorValue(field.ind1)) {\n return;\n }\n\n field.ind1 = determineNonFilingIndicatorValue(field, languages); // eslint-disable-line functional/immutable-data\n}\n\nfunction normalizeNonFilingIndicator2(field, languages = []) {\n if (!hasNonFilingIndicator2(field) || !modifiableIndicatorValue(field.ind2)) {\n return;\n }\n\n field.ind2 = determineNonFilingIndicatorValue(field, languages); // eslint-disable-line functional/immutable-data\n}\n\nconst fiktiivisenAineistonLisaluokatFI = ['Eläimet', 'Erotiikka', 'Erä', 'Fantasia', 'Historia', 'Huumori', 'Jännitys', 'Kauhu', 'Novellit', 'Romantiikka', 'Scifi', 'Sota', 'Urheilu', 'Uskonto'];\n\nfunction containsFiktiivisenAineistonLisaluokka(field) {\n // Should we check Swedish versions as well?\n return field.subfields.some(sf => sf.code === 'a' && fiktiivisenAineistonLisaluokatFI.includes(sf.value));\n}\n\nfunction normalize084Indicator1(field) {\n if (field.tag !== '084') {\n return;\n }\n\n // https://marc21.kansalliskirjasto.fi/bib/05X-08X.htm#084 and https://finto.fi/ykl/fi/page/fiktioluokka\n if (field.ind1 !== '9' && containsFiktiivisenAineistonLisaluokka(field) && field.subfields.some(sf => sf.code === '2' && sf.value === 'ykl')) {\n field.ind1 = '9'; // eslint-disable-line functional/immutable-data\n return;\n }\n}\n\nfunction normalize245Indicator1(field, record) {\n if (field.tag !== '245') {\n return;\n }\n const field1XX = record.get('^1..$');\n field.ind1 = field1XX.length === 0 ? '0' : '1'; // eslint-disable-line functional/immutable-data\n}\n\nfunction normalize776Indicator2(field) {\n if (field.tag !== '776') {\n return;\n }\n // If subfield $i exists, ind2 must me '8'\n if (field.subfields.some(sf => sf.code === 'i')) {\n field.ind2 = '8'; // eslint-disable-line functional/immutable-data\n return;\n }\n}\n\n\nfunction recordNormalize490(record) {\n const fields490 = record.get('^490$');\n const fields8XX = record.get('^(?:800|810|811|830)$');\n\n if (fields490.length === 0) {\n return;\n }\n if (fields490.length <= fields8XX.length) {\n // Trace found for each field 490:\n fields490.forEach(f => {\n f.ind1 = '1'; // eslint-disable-line functional/immutable-data\n });\n return;\n }\n if (fields8XX.length === 0) { // Fields 490 are always untraced (no traces found)\n fields490.forEach(f => {\n f.ind1 = '0'; // eslint-disable-line functional/immutable-data\n });\n return;\n }\n // For other combinations we just can't be sure, so leave them as they are.\n}\n\n\nfunction getLanguages(record) {\n const langFields = record.get('^041$');\n\n if (langFields.length === 0) {\n return [];\n }\n\n return langFields[0].subfields.filter(sf => isRelevantSubfield(sf)).map(subfield => subfield.value);\n\n function isRelevantSubfield(subfield) {\n if (!['a', 'd', 'h'].includes(subfield.code)) {\n return false;\n }\n if (subfield.value.length !== 3) {\n return false;\n }\n // We could require /^[a-z][a-z][a-z]$/ etc as well, but it's not really that relevant.\n return true;\n }\n\n}\n\nexport function recordNormalizeIndicators(record) {\n recordNormalize490(record);\n\n // Language is used to handle non-filing indicators\n const languages = getLanguages(record);\n\n record.fields.forEach(field => fieldNormalizeIndicators(field, record, languages));\n\n}\n\nfunction fieldNormalizeIndicators(field, record, languages) {\n normalize084Indicator1(field);\n normalize245Indicator1(field, record);\n normalizeNonFilingIndicator1(field, languages);\n normalizeNonFilingIndicator2(field, languages);\n normalize776Indicator2(field);\n}\n"],"mappings":";;;;;;;AAIA,IAAAA,MAAA,GAAAC,OAAA;AAJA;AACA;AACA;;AAKe,SAAAC,SAAA,EAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,6BAA6B;IAC1CC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEH,GAAG,EAAE,EAAE;MAAEI,KAAK,EAAE;IAAI,CAAC;IAE/CC,yBAAyB,CAACJ,MAAM,CAAC;IAEjC,OAAOC,GAAG;EACZ;EAEA,SAASH,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE;IAAE,CAAC;IAEzBG,cAAc,CAACL,MAAM,EAAEC,GAAG,CAAC;IAE3BA,GAAG,CAACE,KAAK,GAAGF,GAAG,CAACC,OAAO,CAACI,MAAM,GAAG,CAAC,CAAC,CAAC;IACpC,OAAOL,GAAG;EACZ;EAGA,SAASI,cAAcA,CAACL,MAAM,EAAEC,GAAG,EAAE;IACnC;IACA,MAAMM,YAAY,GAAGC,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,SAAS,CAACV,MAAM,CAACW,MAAM,CAAC,CAAC;IAC9DP,yBAAyB,CAACJ,MAAM,CAAC;IAEjCA,MAAM,CAACW,MAAM,CAACC,OAAO,CAAC,CAACC,KAAK,EAAEC,KAAK,KAAKC,aAAa,CAACF,KAAK,EAAEC,KAAK,CAAC,CAAC;IAEpE,SAASC,aAAaA,CAACF,KAAK,EAAEC,KAAK,EAAE;MACnC,MAAME,iBAAiB,GAAG,IAAAC,oBAAa,EAACV,YAAY,CAACO,KAAK,CAAC,CAAC;MAC5D;MACA,IAAIP,YAAY,CAACO,KAAK,CAAC,CAACI,IAAI,KAAKL,KAAK,CAACK,IAAI,EAAE;QAAE;QAC7C;QACAjB,GAAG,CAACC,OAAO,CAACiB,IAAI,CAAC,sBAAsBH,iBAAiB,SAASH,KAAK,CAACK,IAAI,GAAG,CAAC,CAAC,CAAC;MACnF;MACA,IAAIX,YAAY,CAACO,KAAK,CAAC,CAACM,IAAI,KAAKP,KAAK,CAACO,IAAI,EAAE;QAAE;QAC7C;QACAnB,GAAG,CAACC,OAAO,CAACiB,IAAI,CAAC,sBAAsBH,iBAAiB,SAASH,KAAK,CAACO,IAAI,GAAG,CAAC,CAAC,CAAC;MACnF;IACF;IACA;IACApB,MAAM,CAACW,MAAM,GAAGJ,YAAY,CAAC,CAAC;IAC9B;EACF;AACF;AAGA,MAAMc,kBAAkB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AACvD,MAAMC,kBAAkB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AAErE,SAASC,sBAAsBA,CAACV,KAAK,EAAE;EACrC,OAAOQ,kBAAkB,CAACG,QAAQ,CAACX,KAAK,CAACY,GAAG,CAAC;AAC/C;AAEA,SAASC,wBAAwBA,CAACC,KAAK,EAAE;EACvC;EACA,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAACH,QAAQ,CAACG,KAAK,CAAC;AACvE;AAEA,SAASC,sBAAsBA,CAACf,KAAK,EAAE;EACrC,OAAOS,kBAAkB,CAACE,QAAQ,CAACX,KAAK,CAACY,GAAG,CAAC;AAC/C;AAEA,SAASI,yBAAyBA,CAACF,KAAK,EAAEG,KAAK,EAAE;EAC/C,OAAOA,KAAK,CAACC,IAAI,CAACC,IAAI,IAAIL,KAAK,CAACM,SAAS,CAAC,CAAC,EAAED,IAAI,CAAC1B,MAAM,CAAC,KAAK0B,IAAI,CAAC;AACrE;AAEA,SAASE,gCAAgCA,CAACrB,KAAK,EAAEsB,SAAS,GAAGC,SAAS,EAAE;EACtE,MAAMC,SAAS,GAAGxB,KAAK,CAACyB,SAAS,CAACP,IAAI,CAACQ,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC;EAC7D,IAAI,CAACH,SAAS,EAAE;IACd;IACA;EACF;EAEA,MAAMI,IAAI,GAAGJ,SAAS,CAACV,KAAK,CAACe,WAAW,CAAC,CAAC;EAE1C,IAAIP,SAAS,CAACX,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC7B,MAAMmB,KAAK,GAAGd,yBAAyB,CAACY,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACpE,IAAIE,KAAK,EAAE;MACT,OAAO,GAAGA,KAAK,CAACrC,MAAM,EAAE;IAC1B;EACF;EAEA,IAAI6B,SAAS,CAACX,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC7B,MAAMmB,KAAK,GAAGd,yBAAyB,CAACY,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7D,IAAIE,KAAK,EAAE;MACT,OAAO,GAAGA,KAAK,CAACrC,MAAM,EAAE;IAC1B;EACF;EAEA,IAAI6B,SAAS,CAACX,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC7B,MAAMmB,KAAK,GAAGd,yBAAyB,CAACY,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACvE,IAAIE,KAAK,EAAE;MACT,OAAO,GAAGA,KAAK,CAACrC,MAAM,EAAE;IAC1B;EACF;EAEA,IAAI6B,SAAS,CAACX,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC7B,MAAMmB,KAAK,GAAGd,yBAAyB,CAACY,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAIE,KAAK,EAAE;MACT,OAAO,GAAGA,KAAK,CAACrC,MAAM,EAAE;IAC1B;IACA,IAAImC,IAAI,CAACE,KAAK,CAAC,WAAW,CAAC,IAAI,CAACF,IAAI,CAACE,KAAK,CAAC,eAAe,CAAC,EAAE;MAC3D,OAAO,GAAG;IACZ;EACF;;EAEA;EACA,MAAMA,KAAK,GAAGd,yBAAyB,CAACY,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;EACvD,IAAIE,KAAK,EAAE;IACT,OAAO,GAAGA,KAAK,CAACrC,MAAM,EAAE;EAC1B;EACA,IAAImC,IAAI,CAACE,KAAK,CAAC,MAAM,CAAC,IAAI,CAACR,SAAS,CAACX,QAAQ,CAAC,KAAK,CAAC,IAAI,CAACiB,IAAI,CAACE,KAAK,CAAC,gBAAgB,CAAC,EAAE;IAAE;IACvF,OAAO,GAAG;EACZ;EAEA,OAAO,GAAG;AACZ;AAEA,SAASC,4BAA4BA,CAAC/B,KAAK,EAAEsB,SAAS,GAAG,EAAE,EAAE;EAC3D,IAAI,CAACZ,sBAAsB,CAACV,KAAK,CAAC,IAAI,CAACa,wBAAwB,CAACb,KAAK,CAACK,IAAI,CAAC,EAAE;IAC3E;EACF;EAEAL,KAAK,CAACK,IAAI,GAAGgB,gCAAgC,CAACrB,KAAK,EAAEsB,SAAS,CAAC,CAAC,CAAC;AACnE;AAEA,SAASU,4BAA4BA,CAAChC,KAAK,EAAEsB,SAAS,GAAG,EAAE,EAAE;EAC3D,IAAI,CAACP,sBAAsB,CAACf,KAAK,CAAC,IAAI,CAACa,wBAAwB,CAACb,KAAK,CAACO,IAAI,CAAC,EAAE;IAC3E;EACF;EAEAP,KAAK,CAACO,IAAI,GAAGc,gCAAgC,CAACrB,KAAK,EAAEsB,SAAS,CAAC,CAAC,CAAC;AACnE;AAEA,MAAMW,gCAAgC,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;AAElM,SAASC,sCAAsCA,CAAClC,KAAK,EAAE;EACrD;EACA,OAAOA,KAAK,CAACyB,SAAS,CAACU,IAAI,CAACT,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,IAAIM,gCAAgC,CAACtB,QAAQ,CAACe,EAAE,CAACZ,KAAK,CAAC,CAAC;AAC3G;AAEA,SAASsB,sBAAsBA,CAACpC,KAAK,EAAE;EACrC,IAAIA,KAAK,CAACY,GAAG,KAAK,KAAK,EAAE;IACvB;EACF;;EAEA;EACA,IAAIZ,KAAK,CAACK,IAAI,KAAK,GAAG,IAAI6B,sCAAsC,CAAClC,KAAK,CAAC,IAAIA,KAAK,CAACyB,SAAS,CAACU,IAAI,CAACT,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,IAAID,EAAE,CAACZ,KAAK,KAAK,KAAK,CAAC,EAAE;IAC5Id,KAAK,CAACK,IAAI,GAAG,GAAG,CAAC,CAAC;IAClB;EACF;AACF;AAEA,SAASgC,sBAAsBA,CAACrC,KAAK,EAAEb,MAAM,EAAE;EAC7C,IAAIa,KAAK,CAACY,GAAG,KAAK,KAAK,EAAE;IACvB;EACF;EACA,MAAM0B,QAAQ,GAAGnD,MAAM,CAACoD,GAAG,CAAC,OAAO,CAAC;EACpCvC,KAAK,CAACK,IAAI,GAAGiC,QAAQ,CAAC7C,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;AAClD;AAEA,SAAS+C,sBAAsBA,CAACxC,KAAK,EAAE;EACrC,IAAIA,KAAK,CAACY,GAAG,KAAK,KAAK,EAAE;IACvB;EACF;EACA;EACA,IAAIZ,KAAK,CAACyB,SAAS,CAACU,IAAI,CAACT,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC,EAAE;IAC/C3B,KAAK,CAACO,IAAI,GAAG,GAAG,CAAC,CAAC;IAClB;EACF;AACF;AAGA,SAASkC,kBAAkBA,CAACtD,MAAM,EAAE;EAClC,MAAMuD,SAAS,GAAGvD,MAAM,CAACoD,GAAG,CAAC,OAAO,CAAC;EACrC,MAAMI,SAAS,GAAGxD,MAAM,CAACoD,GAAG,CAAC,uBAAuB,CAAC;EAErD,IAAIG,SAAS,CAACjD,MAAM,KAAK,CAAC,EAAE;IAC1B;EACF;EACA,IAAIiD,SAAS,CAACjD,MAAM,IAAIkD,SAAS,CAAClD,MAAM,EAAE;IACxC;IACAiD,SAAS,CAAC3C,OAAO,CAAC6C,CAAC,IAAI;MACrBA,CAAC,CAACvC,IAAI,GAAG,GAAG,CAAC,CAAC;IAChB,CAAC,CAAC;IACF;EACF;EACA,IAAIsC,SAAS,CAAClD,MAAM,KAAK,CAAC,EAAE;IAAE;IAC5BiD,SAAS,CAAC3C,OAAO,CAAC6C,CAAC,IAAI;MACrBA,CAAC,CAACvC,IAAI,GAAG,GAAG,CAAC,CAAC;IAChB,CAAC,CAAC;IACF;EACF;EACA;AACF;AAGA,SAASwC,YAAYA,CAAC1D,MAAM,EAAE;EAC5B,MAAM2D,UAAU,GAAG3D,MAAM,CAACoD,GAAG,CAAC,OAAO,CAAC;EAEtC,IAAIO,UAAU,CAACrD,MAAM,KAAK,CAAC,EAAE;IAC3B,OAAO,EAAE;EACX;EAEA,OAAOqD,UAAU,CAAC,CAAC,CAAC,CAACrB,SAAS,CAACsB,MAAM,CAACrB,EAAE,IAAIsB,kBAAkB,CAACtB,EAAE,CAAC,CAAC,CAACuB,GAAG,CAACC,QAAQ,IAAIA,QAAQ,CAACpC,KAAK,CAAC;EAEnG,SAASkC,kBAAkBA,CAACE,QAAQ,EAAE;IACpC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAACvC,QAAQ,CAACuC,QAAQ,CAACvB,IAAI,CAAC,EAAE;MAC5C,OAAO,KAAK;IACd;IACA,IAAIuB,QAAQ,CAACpC,KAAK,CAACrB,MAAM,KAAK,CAAC,EAAE;MAC/B,OAAO,KAAK;IACd;IACA;IACA,OAAO,IAAI;EACb;AAEF;AAEO,SAASF,yBAAyBA,CAACJ,MAAM,EAAE;EAChDsD,kBAAkB,CAACtD,MAAM,CAAC;;EAE1B;EACA,MAAMmC,SAAS,GAAGuB,YAAY,CAAC1D,MAAM,CAAC;EAEtCA,MAAM,CAACW,MAAM,CAACC,OAAO,CAACC,KAAK,IAAImD,wBAAwB,CAACnD,KAAK,EAAEb,MAAM,EAAEmC,SAAS,CAAC,CAAC;AAEpF;AAEA,SAAS6B,wBAAwBA,CAACnD,KAAK,EAAEb,MAAM,EAAEmC,SAAS,EAAE;EAC1Dc,sBAAsB,CAACpC,KAAK,CAAC;EAC7BqC,sBAAsB,CAACrC,KAAK,EAAEb,MAAM,CAAC;EACrC4C,4BAA4B,CAAC/B,KAAK,EAAEsB,SAAS,CAAC;EAC9CU,4BAA4B,CAAChC,KAAK,EAAEsB,SAAS,CAAC;EAC9CkB,sBAAsB,CAACxC,KAAK,CAAC;AAC/B","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"indicator-fixes.js","names":["_utils","require","_default","description","validate","fix","record","res","message","valid","recordNormalizeIndicators","validateRecord","length","clonedFields","JSON","parse","stringify","fields","forEach","field","index","compareFields","origFieldAsString","fieldToString","ind1","push","ind2","ind1NonFilingChars","ind2NonFilingChars","hasNonFilingIndicator1","includes","tag","modifiableIndicatorValue","value","hasNonFilingIndicator2","valueBeginsWithDeterminer","cands","find","cand","substring","determineNonFilingIndicatorValue","languages","undefined","subfieldA","subfields","sf","code","name","toLowerCase","match","normalizeNonFilingIndicator1","normalizeNonFilingIndicator2","fiktiivisenAineistonLisaluokatFI","containsFiktiivisenAineistonLisaluokka","some","normalize084Indicator1","normalize245Indicator1","field1XX","get","normalize776Indicator2","recordNormalize490","fields490","fields8XX","f","getLanguages","langFields","filter","isRelevantSubfield","map","subfield","fieldNormalizeIndicators"],"sources":["../src/indicator-fixes.js"],"sourcesContent":["// Relocated from melinda-marc-record-merge-reducers (and renamed)\n//import createDebugLogger from 'debug';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:normalizeIdentifiers');\n\nimport {fieldToString} from './utils';\n\n\nexport default function () {\n\n return {\n description: 'Normalizes indicator values',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n recordNormalizeIndicators(record);\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n validateRecord(record, res);\n\n res.valid = res.message.length < 1;\n return res;\n }\n\n\n function validateRecord(record, res) {\n //nvdebug(record);\n const clonedFields = JSON.parse(JSON.stringify(record.fields));\n recordNormalizeIndicators(record);\n\n record.fields.forEach((field, index) => compareFields(field, index)); // eslint-disable-line array-callback-return\n\n function compareFields(field, index) {\n const origFieldAsString = fieldToString(clonedFields[index]);\n //const clonedFieldAsString = fieldToString(field);\n if (clonedFields[index].ind1 !== field.ind1) {\n //nvdebug(`FIX IND1: '${clonedFields[index].ind1}' => '${field.ind1}': ${clonedFieldAsString}`);\n res.message.push(`Expected IND1 for '${origFieldAsString}' is '${field.ind1}'`);\n }\n if (clonedFields[index].ind2 !== field.ind2) {\n //nvdebug(`FIX IND2: '${clonedFields[index].ind2}' => '${field.ind2}': ${clonedFieldAsString}`);\n res.message.push(`Expected IND2 for '${origFieldAsString}' is '${field.ind2}'`);\n }\n }\n // Validator should not change the original record:\n record.fields = clonedFields;\n return;\n }\n}\n\n\nconst ind1NonFilingChars = ['130', '630', '730', '740'];\nconst ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];\n\nfunction hasNonFilingIndicator1(field) {\n return ind1NonFilingChars.includes(field.tag);\n}\n\nfunction modifiableIndicatorValue(value) {\n // If field contains a legit-looking value, don't try to modify it here...\n return !['9', '8', '7', '6', '5', '4', '3', '2', '1'].includes(value);\n}\n\nfunction hasNonFilingIndicator2(field) {\n return ind2NonFilingChars.includes(field.tag);\n}\n\nfunction valueBeginsWithDeterminer(value, cands) {\n return cands.find(cand => value.substring(0, cand.length) === cand);\n}\n\nfunction determineNonFilingIndicatorValue(field, languages = undefined) {\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n if (!subfieldA) {\n // nvdebug(' Subfield $a miss!');\n return;\n }\n\n const name = subfieldA.value.toLowerCase();\n\n if (languages.includes('eng')) {\n const match = valueBeginsWithDeterminer(name, ['a ', 'an ', 'the ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('fre')) {\n const match = valueBeginsWithDeterminer(name, ['l\\'', 'le ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('ger')) {\n const match = valueBeginsWithDeterminer(name, ['das ', 'der ', 'die ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('swe')) {\n const match = valueBeginsWithDeterminer(name, ['en ', 'ett ']);\n if (match) {\n return `${match.length}`;\n }\n if (name.match(/^de[nt] /u) && !name.match(/^de[nt] som /u)) {\n return '4';\n }\n }\n\n // Fallback-ish: try to guess even without languages:\n const match = valueBeginsWithDeterminer(name, ['the ']);\n if (match) {\n return `${match.length}`;\n }\n if (name.match(/^a /u) && !languages.includes('hun') && !name.match(/^a (?:b |la )/u)) { // Skip \"a b c\", \"a la carte\"...\n return '2';\n }\n\n return '0';\n}\n\nfunction normalizeNonFilingIndicator1(field, languages = []) {\n if (!hasNonFilingIndicator1(field) || !modifiableIndicatorValue(field.ind1)) {\n return;\n }\n\n field.ind1 = determineNonFilingIndicatorValue(field, languages);\n}\n\nfunction normalizeNonFilingIndicator2(field, languages = []) {\n if (!hasNonFilingIndicator2(field) || !modifiableIndicatorValue(field.ind2)) {\n return;\n }\n\n field.ind2 = determineNonFilingIndicatorValue(field, languages);\n}\n\nconst fiktiivisenAineistonLisaluokatFI = ['Eläimet', 'Erotiikka', 'Erä', 'Fantasia', 'Historia', 'Huumori', 'Jännitys', 'Kauhu', 'Novellit', 'Romantiikka', 'Scifi', 'Sota', 'Urheilu', 'Uskonto'];\n\nfunction containsFiktiivisenAineistonLisaluokka(field) {\n // Should we check Swedish versions as well?\n return field.subfields.some(sf => sf.code === 'a' && fiktiivisenAineistonLisaluokatFI.includes(sf.value));\n}\n\nfunction normalize084Indicator1(field) {\n if (field.tag !== '084') {\n return;\n }\n\n // https://marc21.kansalliskirjasto.fi/bib/05X-08X.htm#084 and https://finto.fi/ykl/fi/page/fiktioluokka\n if (field.ind1 !== '9' && containsFiktiivisenAineistonLisaluokka(field) && field.subfields.some(sf => sf.code === '2' && sf.value === 'ykl')) {\n field.ind1 = '9';\n return;\n }\n}\n\nfunction normalize245Indicator1(field, record) {\n if (field.tag !== '245') {\n return;\n }\n const field1XX = record.get('^1..$');\n field.ind1 = field1XX.length === 0 ? '0' : '1';\n}\n\nfunction normalize776Indicator2(field) {\n if (field.tag !== '776') {\n return;\n }\n // If subfield $i exists, ind2 must me '8'\n if (field.subfields.some(sf => sf.code === 'i')) {\n field.ind2 = '8';\n return;\n }\n}\n\n\nfunction recordNormalize490(record) {\n const fields490 = record.get('^490$');\n const fields8XX = record.get('^(?:800|810|811|830)$');\n\n if (fields490.length === 0) {\n return;\n }\n if (fields490.length <= fields8XX.length) {\n // Trace found for each field 490:\n fields490.forEach(f => {\n f.ind1 = '1';\n });\n return;\n }\n if (fields8XX.length === 0) { // Fields 490 are always untraced (no traces found)\n fields490.forEach(f => {\n f.ind1 = '0';\n });\n return;\n }\n // For other combinations we just can't be sure, so leave them as they are.\n}\n\n\nfunction getLanguages(record) {\n const langFields = record.get('^041$');\n\n if (langFields.length === 0) {\n return [];\n }\n\n return langFields[0].subfields.filter(sf => isRelevantSubfield(sf)).map(subfield => subfield.value);\n\n function isRelevantSubfield(subfield) {\n if (!['a', 'd', 'h'].includes(subfield.code)) {\n return false;\n }\n if (subfield.value.length !== 3) {\n return false;\n }\n // We could require /^[a-z][a-z][a-z]$/ etc as well, but it's not really that relevant.\n return true;\n }\n\n}\n\nexport function recordNormalizeIndicators(record) {\n recordNormalize490(record);\n\n // Language is used to handle non-filing indicators\n const languages = getLanguages(record);\n\n record.fields.forEach(field => fieldNormalizeIndicators(field, record, languages)); // eslint-disable-line array-callback-return\n\n}\n\nfunction fieldNormalizeIndicators(field, record, languages) {\n normalize084Indicator1(field);\n normalize245Indicator1(field, record);\n normalizeNonFilingIndicator1(field, languages);\n normalizeNonFilingIndicator2(field, languages);\n normalize776Indicator2(field);\n}\n"],"mappings":";;;;;;;AAIA,IAAAA,MAAA,GAAAC,OAAA;AAJA;AACA;AACA;;AAKe,SAAAC,SAAA,EAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,6BAA6B;IAC1CC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEH,GAAG,EAAE,EAAE;MAAEI,KAAK,EAAE;IAAI,CAAC;IAE/CC,yBAAyB,CAACJ,MAAM,CAAC;IAEjC,OAAOC,GAAG;EACZ;EAEA,SAASH,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE;IAAE,CAAC;IAEzBG,cAAc,CAACL,MAAM,EAAEC,GAAG,CAAC;IAE3BA,GAAG,CAACE,KAAK,GAAGF,GAAG,CAACC,OAAO,CAACI,MAAM,GAAG,CAAC;IAClC,OAAOL,GAAG;EACZ;EAGA,SAASI,cAAcA,CAACL,MAAM,EAAEC,GAAG,EAAE;IACnC;IACA,MAAMM,YAAY,GAAGC,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,SAAS,CAACV,MAAM,CAACW,MAAM,CAAC,CAAC;IAC9DP,yBAAyB,CAACJ,MAAM,CAAC;IAEjCA,MAAM,CAACW,MAAM,CAACC,OAAO,CAAC,CAACC,KAAK,EAAEC,KAAK,KAAKC,aAAa,CAACF,KAAK,EAAEC,KAAK,CAAC,CAAC,CAAC,CAAC;;IAEtE,SAASC,aAAaA,CAACF,KAAK,EAAEC,KAAK,EAAE;MACnC,MAAME,iBAAiB,GAAG,IAAAC,oBAAa,EAACV,YAAY,CAACO,KAAK,CAAC,CAAC;MAC5D;MACA,IAAIP,YAAY,CAACO,KAAK,CAAC,CAACI,IAAI,KAAKL,KAAK,CAACK,IAAI,EAAE;QAC3C;QACAjB,GAAG,CAACC,OAAO,CAACiB,IAAI,CAAC,sBAAsBH,iBAAiB,SAASH,KAAK,CAACK,IAAI,GAAG,CAAC;MACjF;MACA,IAAIX,YAAY,CAACO,KAAK,CAAC,CAACM,IAAI,KAAKP,KAAK,CAACO,IAAI,EAAE;QAC3C;QACAnB,GAAG,CAACC,OAAO,CAACiB,IAAI,CAAC,sBAAsBH,iBAAiB,SAASH,KAAK,CAACO,IAAI,GAAG,CAAC;MACjF;IACF;IACA;IACApB,MAAM,CAACW,MAAM,GAAGJ,YAAY;IAC5B;EACF;AACF;AAGA,MAAMc,kBAAkB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AACvD,MAAMC,kBAAkB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AAErE,SAASC,sBAAsBA,CAACV,KAAK,EAAE;EACrC,OAAOQ,kBAAkB,CAACG,QAAQ,CAACX,KAAK,CAACY,GAAG,CAAC;AAC/C;AAEA,SAASC,wBAAwBA,CAACC,KAAK,EAAE;EACvC;EACA,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAACH,QAAQ,CAACG,KAAK,CAAC;AACvE;AAEA,SAASC,sBAAsBA,CAACf,KAAK,EAAE;EACrC,OAAOS,kBAAkB,CAACE,QAAQ,CAACX,KAAK,CAACY,GAAG,CAAC;AAC/C;AAEA,SAASI,yBAAyBA,CAACF,KAAK,EAAEG,KAAK,EAAE;EAC/C,OAAOA,KAAK,CAACC,IAAI,CAACC,IAAI,IAAIL,KAAK,CAACM,SAAS,CAAC,CAAC,EAAED,IAAI,CAAC1B,MAAM,CAAC,KAAK0B,IAAI,CAAC;AACrE;AAEA,SAASE,gCAAgCA,CAACrB,KAAK,EAAEsB,SAAS,GAAGC,SAAS,EAAE;EACtE,MAAMC,SAAS,GAAGxB,KAAK,CAACyB,SAAS,CAACP,IAAI,CAACQ,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC;EAC7D,IAAI,CAACH,SAAS,EAAE;IACd;IACA;EACF;EAEA,MAAMI,IAAI,GAAGJ,SAAS,CAACV,KAAK,CAACe,WAAW,CAAC,CAAC;EAE1C,IAAIP,SAAS,CAACX,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC7B,MAAMmB,KAAK,GAAGd,yBAAyB,CAACY,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACpE,IAAIE,KAAK,EAAE;MACT,OAAO,GAAGA,KAAK,CAACrC,MAAM,EAAE;IAC1B;EACF;EAEA,IAAI6B,SAAS,CAACX,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC7B,MAAMmB,KAAK,GAAGd,yBAAyB,CAACY,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7D,IAAIE,KAAK,EAAE;MACT,OAAO,GAAGA,KAAK,CAACrC,MAAM,EAAE;IAC1B;EACF;EAEA,IAAI6B,SAAS,CAACX,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC7B,MAAMmB,KAAK,GAAGd,yBAAyB,CAACY,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACvE,IAAIE,KAAK,EAAE;MACT,OAAO,GAAGA,KAAK,CAACrC,MAAM,EAAE;IAC1B;EACF;EAEA,IAAI6B,SAAS,CAACX,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC7B,MAAMmB,KAAK,GAAGd,yBAAyB,CAACY,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAIE,KAAK,EAAE;MACT,OAAO,GAAGA,KAAK,CAACrC,MAAM,EAAE;IAC1B;IACA,IAAImC,IAAI,CAACE,KAAK,CAAC,WAAW,CAAC,IAAI,CAACF,IAAI,CAACE,KAAK,CAAC,eAAe,CAAC,EAAE;MAC3D,OAAO,GAAG;IACZ;EACF;;EAEA;EACA,MAAMA,KAAK,GAAGd,yBAAyB,CAACY,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;EACvD,IAAIE,KAAK,EAAE;IACT,OAAO,GAAGA,KAAK,CAACrC,MAAM,EAAE;EAC1B;EACA,IAAImC,IAAI,CAACE,KAAK,CAAC,MAAM,CAAC,IAAI,CAACR,SAAS,CAACX,QAAQ,CAAC,KAAK,CAAC,IAAI,CAACiB,IAAI,CAACE,KAAK,CAAC,gBAAgB,CAAC,EAAE;IAAE;IACvF,OAAO,GAAG;EACZ;EAEA,OAAO,GAAG;AACZ;AAEA,SAASC,4BAA4BA,CAAC/B,KAAK,EAAEsB,SAAS,GAAG,EAAE,EAAE;EAC3D,IAAI,CAACZ,sBAAsB,CAACV,KAAK,CAAC,IAAI,CAACa,wBAAwB,CAACb,KAAK,CAACK,IAAI,CAAC,EAAE;IAC3E;EACF;EAEAL,KAAK,CAACK,IAAI,GAAGgB,gCAAgC,CAACrB,KAAK,EAAEsB,SAAS,CAAC;AACjE;AAEA,SAASU,4BAA4BA,CAAChC,KAAK,EAAEsB,SAAS,GAAG,EAAE,EAAE;EAC3D,IAAI,CAACP,sBAAsB,CAACf,KAAK,CAAC,IAAI,CAACa,wBAAwB,CAACb,KAAK,CAACO,IAAI,CAAC,EAAE;IAC3E;EACF;EAEAP,KAAK,CAACO,IAAI,GAAGc,gCAAgC,CAACrB,KAAK,EAAEsB,SAAS,CAAC;AACjE;AAEA,MAAMW,gCAAgC,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;AAElM,SAASC,sCAAsCA,CAAClC,KAAK,EAAE;EACrD;EACA,OAAOA,KAAK,CAACyB,SAAS,CAACU,IAAI,CAACT,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,IAAIM,gCAAgC,CAACtB,QAAQ,CAACe,EAAE,CAACZ,KAAK,CAAC,CAAC;AAC3G;AAEA,SAASsB,sBAAsBA,CAACpC,KAAK,EAAE;EACrC,IAAIA,KAAK,CAACY,GAAG,KAAK,KAAK,EAAE;IACvB;EACF;;EAEA;EACA,IAAIZ,KAAK,CAACK,IAAI,KAAK,GAAG,IAAI6B,sCAAsC,CAAClC,KAAK,CAAC,IAAIA,KAAK,CAACyB,SAAS,CAACU,IAAI,CAACT,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,IAAID,EAAE,CAACZ,KAAK,KAAK,KAAK,CAAC,EAAE;IAC5Id,KAAK,CAACK,IAAI,GAAG,GAAG;IAChB;EACF;AACF;AAEA,SAASgC,sBAAsBA,CAACrC,KAAK,EAAEb,MAAM,EAAE;EAC7C,IAAIa,KAAK,CAACY,GAAG,KAAK,KAAK,EAAE;IACvB;EACF;EACA,MAAM0B,QAAQ,GAAGnD,MAAM,CAACoD,GAAG,CAAC,OAAO,CAAC;EACpCvC,KAAK,CAACK,IAAI,GAAGiC,QAAQ,CAAC7C,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG;AAChD;AAEA,SAAS+C,sBAAsBA,CAACxC,KAAK,EAAE;EACrC,IAAIA,KAAK,CAACY,GAAG,KAAK,KAAK,EAAE;IACvB;EACF;EACA;EACA,IAAIZ,KAAK,CAACyB,SAAS,CAACU,IAAI,CAACT,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC,EAAE;IAC/C3B,KAAK,CAACO,IAAI,GAAG,GAAG;IAChB;EACF;AACF;AAGA,SAASkC,kBAAkBA,CAACtD,MAAM,EAAE;EAClC,MAAMuD,SAAS,GAAGvD,MAAM,CAACoD,GAAG,CAAC,OAAO,CAAC;EACrC,MAAMI,SAAS,GAAGxD,MAAM,CAACoD,GAAG,CAAC,uBAAuB,CAAC;EAErD,IAAIG,SAAS,CAACjD,MAAM,KAAK,CAAC,EAAE;IAC1B;EACF;EACA,IAAIiD,SAAS,CAACjD,MAAM,IAAIkD,SAAS,CAAClD,MAAM,EAAE;IACxC;IACAiD,SAAS,CAAC3C,OAAO,CAAC6C,CAAC,IAAI;MACrBA,CAAC,CAACvC,IAAI,GAAG,GAAG;IACd,CAAC,CAAC;IACF;EACF;EACA,IAAIsC,SAAS,CAAClD,MAAM,KAAK,CAAC,EAAE;IAAE;IAC5BiD,SAAS,CAAC3C,OAAO,CAAC6C,CAAC,IAAI;MACrBA,CAAC,CAACvC,IAAI,GAAG,GAAG;IACd,CAAC,CAAC;IACF;EACF;EACA;AACF;AAGA,SAASwC,YAAYA,CAAC1D,MAAM,EAAE;EAC5B,MAAM2D,UAAU,GAAG3D,MAAM,CAACoD,GAAG,CAAC,OAAO,CAAC;EAEtC,IAAIO,UAAU,CAACrD,MAAM,KAAK,CAAC,EAAE;IAC3B,OAAO,EAAE;EACX;EAEA,OAAOqD,UAAU,CAAC,CAAC,CAAC,CAACrB,SAAS,CAACsB,MAAM,CAACrB,EAAE,IAAIsB,kBAAkB,CAACtB,EAAE,CAAC,CAAC,CAACuB,GAAG,CAACC,QAAQ,IAAIA,QAAQ,CAACpC,KAAK,CAAC;EAEnG,SAASkC,kBAAkBA,CAACE,QAAQ,EAAE;IACpC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAACvC,QAAQ,CAACuC,QAAQ,CAACvB,IAAI,CAAC,EAAE;MAC5C,OAAO,KAAK;IACd;IACA,IAAIuB,QAAQ,CAACpC,KAAK,CAACrB,MAAM,KAAK,CAAC,EAAE;MAC/B,OAAO,KAAK;IACd;IACA;IACA,OAAO,IAAI;EACb;AAEF;AAEO,SAASF,yBAAyBA,CAACJ,MAAM,EAAE;EAChDsD,kBAAkB,CAACtD,MAAM,CAAC;;EAE1B;EACA,MAAMmC,SAAS,GAAGuB,YAAY,CAAC1D,MAAM,CAAC;EAEtCA,MAAM,CAACW,MAAM,CAACC,OAAO,CAACC,KAAK,IAAImD,wBAAwB,CAACnD,KAAK,EAAEb,MAAM,EAAEmC,SAAS,CAAC,CAAC,CAAC,CAAC;AAEtF;AAEA,SAAS6B,wBAAwBA,CAACnD,KAAK,EAAEb,MAAM,EAAEmC,SAAS,EAAE;EAC1Dc,sBAAsB,CAACpC,KAAK,CAAC;EAC7BqC,sBAAsB,CAACrC,KAAK,EAAEb,MAAM,CAAC;EACrC4C,4BAA4B,CAAC/B,KAAK,EAAEsB,SAAS,CAAC;EAC9CU,4BAA4B,CAAChC,KAAK,EAAEsB,SAAS,CAAC;EAC9CkB,sBAAsB,CAACxC,KAAK,CAAC;AAC/B","ignoreList":[]}
|
package/dist/isbn-issn.js
CHANGED
|
@@ -174,18 +174,17 @@ var _default = ({
|
|
|
174
174
|
function fix(record) {
|
|
175
175
|
getRelevantFields(record).forEach(field => {
|
|
176
176
|
if (field.tag === '020') {
|
|
177
|
-
field.subfields.forEach(subfield => fixField020Subfield(field, subfield));
|
|
177
|
+
field.subfields.forEach(subfield => fixField020Subfield(field, subfield)); // eslint-disable-line array-callback-return
|
|
178
178
|
return;
|
|
179
179
|
}
|
|
180
180
|
// 022 ISSN:
|
|
181
181
|
const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
|
|
182
182
|
if (subfield && handleInvalid) {
|
|
183
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
184
183
|
// $a/$l => $y (bit overkill to add $z and remove $a/$l instead of just renaming)
|
|
185
184
|
field.subfields.push({
|
|
186
185
|
code: 'y',
|
|
187
186
|
value: subfield.value
|
|
188
|
-
});
|
|
187
|
+
});
|
|
189
188
|
record.removeSubfield(subfield, field);
|
|
190
189
|
}
|
|
191
190
|
});
|
|
@@ -201,8 +200,7 @@ var _default = ({
|
|
|
201
200
|
// ISBN is valid but is missing hyphens
|
|
202
201
|
const normalizedValue = normalizeIsbnValue(subfield.value);
|
|
203
202
|
if (normalizedValue !== undefined) {
|
|
204
|
-
|
|
205
|
-
subfield.value = normalizedValue; // eslint-disable-line functional/immutable-data
|
|
203
|
+
subfield.value = normalizedValue;
|
|
206
204
|
}
|
|
207
205
|
}
|
|
208
206
|
function handleInvalidIsbn(field, subfield) {
|
|
@@ -217,7 +215,7 @@ var _default = ({
|
|
|
217
215
|
field.subfields.push({
|
|
218
216
|
code: 'z',
|
|
219
217
|
value: subfield.value
|
|
220
|
-
});
|
|
218
|
+
});
|
|
221
219
|
record.removeSubfield(subfield, field);
|
|
222
220
|
}
|
|
223
221
|
function split020A() {
|
|
@@ -236,11 +234,11 @@ var _default = ({
|
|
|
236
234
|
return;
|
|
237
235
|
}
|
|
238
236
|
const tail = value.substring(position + 1);
|
|
239
|
-
subfield.value = head;
|
|
237
|
+
subfield.value = head;
|
|
240
238
|
field.subfields.push({
|
|
241
239
|
code: 'q',
|
|
242
240
|
value: tail
|
|
243
|
-
});
|
|
241
|
+
});
|
|
244
242
|
}
|
|
245
243
|
function normalizeIsbnValue(value) {
|
|
246
244
|
const trimmedValue = getFirstWord(value);
|
|
@@ -252,10 +250,9 @@ var _default = ({
|
|
|
252
250
|
const numbersOnly = trimmedValue.replace(/[^0-9Xx]+/ug, '');
|
|
253
251
|
const parsedIsbn = _isbn.default.parse(trimmedValue);
|
|
254
252
|
if (hyphenateISBN) {
|
|
255
|
-
|
|
256
|
-
return numbersOnly.length === 10 ? parsedIsbn.isbn10h : parsedIsbn.isbn13h; // eslint-disable-line functional/immutable-data
|
|
253
|
+
return numbersOnly.length === 10 ? parsedIsbn.isbn10h : parsedIsbn.isbn13h;
|
|
257
254
|
}
|
|
258
|
-
return numbersOnly.length === 10 ? parsedIsbn.isbn10 : parsedIsbn.isbn13;
|
|
255
|
+
return numbersOnly.length === 10 ? parsedIsbn.isbn10 : parsedIsbn.isbn13;
|
|
259
256
|
}
|
|
260
257
|
}
|
|
261
258
|
}
|
package/dist/isbn-issn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isbn-issn.js","names":["_isbn","_interopRequireDefault","require","_issnVerify","e","__esModule","default","_default","hyphenateISBN","handleInvalid","validate","fix","description","stringHasSpace","str","indexOf","trimSpaces","value","replace","isMultiWord","inputString","trimmedString","getFirstWord","arr","split","invalidISBN","isbn","isbnOnly","auditedIsbn","ISBN","audit","validIsbn","invalidSubfield","subfield","code","invalidField020","field","subfields","some","sf","subfieldsIsbnRequiresHyphenation","includes","requiresHyphenation","isbn2","parsedIsbn","parse","isbn10h","isbn13h","getRelevantFields","record","fields","filter","tag","fieldsIsbnRequiresHyphenation","invalidField022","find","validateISSN","subfieldAorL","undefined","subfieldY","length","valid","map","subfieldA","name","subfieldZ","getISSN","reduce","acc","obj","msg","messages","concat","forEach","fixField020Subfield","push","removeSubfield","split020A","addHyphens","handleInvalidIsbn","normalizedValue","normalizeIsbnValue","head","position","tail","substring","trimmedValue","auditResult","numbersOnly","isbn10","isbn13","exports"],"sources":["../src/isbn-issn.js"],"sourcesContent":["import ISBN from 'isbn3';\nimport validateISSN from '@natlibfi/issn-verify';\n\n// handleInvalid: move invalid 020$a to 020$z, and invalid 022$a to 022$y\nexport default ({hyphenateISBN = false, handleInvalid = false} = {}) => {\n return {\n validate, fix,\n description: 'Validates ISBN and ISSN values'\n };\n\n function stringHasSpace(str) {\n return str.indexOf(' ') > -1;\n }\n\n function trimSpaces(value) {\n return value.replace(/^\\s+/u, '').replace(/\\s+$/u, '').replace(/\\s+/gu, ' ');\n }\n\n function isMultiWord(inputString) {\n const trimmedString = trimSpaces(inputString);\n return stringHasSpace(trimmedString);\n }\n\n function getFirstWord(inputString) {\n const trimmedString = trimSpaces(inputString);\n const arr = trimmedString.split(' ');\n return arr[0];\n }\n\n function invalidISBN(isbn) {\n const isbnOnly = getFirstWord(isbn);\n const auditedIsbn = ISBN.audit(isbnOnly);\n return !auditedIsbn.validIsbn;\n }\n\n function invalidSubfield(subfield) {\n if (subfield.code !== 'a') {\n return false;\n }\n return invalidISBN(subfield.value) || isMultiWord(subfield.value);\n }\n\n\n function invalidField020(field) {\n if (field.subfields && field.subfields.some(sf => invalidSubfield(sf))) {\n return true;\n }\n return false;\n }\n\n function subfieldsIsbnRequiresHyphenation(subfield) {\n if (!hyphenateISBN || !['a', 'z'].includes(subfield.code)) {\n return false;\n }\n\n const isbn = getFirstWord(subfield.value);\n if (subfield.code === 'a') {\n return requiresHyphenation(isbn);\n }\n\n // $z is a bit hacky: hyphenation is required only iff valid and no '-' chars\n if (isbn.indexOf('-') > -1) {\n return false;\n }\n return !invalidISBN(isbn);\n\n function requiresHyphenation(isbn) {\n if (!hyphenateISBN) {\n return false;\n }\n // Handle old notation such as \"978-952-396-001-5 (nid.)\"\n const isbn2 = getFirstWord(isbn);\n\n if (invalidISBN(isbn2)) {\n return false;\n }\n\n const parsedIsbn = ISBN.parse(isbn2);\n // Return true only if existing ISBN is a valid and hyphenated 10 or 13 digit ISBN:\n return !(isbn2 === parsedIsbn.isbn10h || isbn2 === parsedIsbn.isbn13h);\n }\n }\n\n function getRelevantFields(record) {\n //return record.get(/^(?:020|022)$/u).filter(field => {\n return record.fields.filter(field => {\n if (!field.subfields) {\n return false;\n }\n // Check ISBN:\n if (field.tag === '020') {\n if (invalidField020(field)) { // checks multiwordness\n return true;\n }\n return fieldsIsbnRequiresHyphenation(field);\n }\n\n // Check ISSN:\n if (field.tag === '022') {\n if (invalidField022(field)) {\n return true;\n }\n\n const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n return !validateISSN(subfield.value);\n }\n return false;\n });\n\n function fieldsIsbnRequiresHyphenation(field) {\n return field.subfields && field.subfields.some(sf => subfieldsIsbnRequiresHyphenation(sf));\n }\n\n function invalidField022(field) {\n const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n if (subfieldAorL === undefined) {\n const subfieldY = field.subfields.find(sf => sf.code === 'y');\n if (subfieldY) {\n return false;\n }\n\n return true;\n }\n return false;\n }\n }\n\n function validate(record) {\n const fields = getRelevantFields(record);\n\n if (fields.length === 0) {\n return {valid: true};\n }\n\n return fields\n .map(field => {\n if (field.tag === '020') {\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n if (subfieldA) {\n return {name: 'ISBN', value: subfieldA.value};\n }\n const subfieldZ = field.subfields.find(sf => sf.code === 'z');\n if (subfieldZ) {\n return {name: 'ISBN (subfield Z)', value: subfieldZ.value};\n }\n\n return {name: 'ISBN', value: undefined};\n }\n\n return {name: 'ISSN', value: getISSN()};\n\n function getISSN() {\n const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n if (subfieldAorL) {\n return subfieldAorL.value;\n }\n\n return undefined;\n }\n })\n .reduce((acc, obj) => {\n const {name, value} = obj;\n const msg = `${name} (${value}) is not valid`;\n\n return {...acc, messages: acc.messages.concat(msg)};\n }, {valid: false, messages: []});\n }\n\n\n function fix(record) {\n getRelevantFields(record).forEach(field => {\n if (field.tag === '020') {\n field.subfields.forEach(subfield => fixField020Subfield(field, subfield));\n return;\n }\n // 022 ISSN:\n const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n if (subfield && handleInvalid) { // eslint-disable-line functional/no-conditional-statements\n // $a/$l => $y (bit overkill to add $z and remove $a/$l instead of just renaming)\n field.subfields.push({code: 'y', value: subfield.value}); // eslint-disable-line functional/immutable-data\n record.removeSubfield(subfield, field);\n }\n });\n\n\n function fixField020Subfield(field, subfield) {\n split020A(); // subfield and field are in the scope\n addHyphens(subfield);\n handleInvalidIsbn(field, subfield); // remove 020$a, add 020$z, Do this last, as it uses deletion\n return;\n\n function addHyphens(subfield) {\n if (!subfieldsIsbnRequiresHyphenation(subfield)) {\n return;\n }\n // ISBN is valid but is missing hyphens\n const normalizedValue = normalizeIsbnValue(subfield.value);\n if (normalizedValue !== undefined) { // eslint-disable-line functional/no-conditional-statements\n subfield.value = normalizedValue; // eslint-disable-line functional/immutable-data\n }\n }\n\n function handleInvalidIsbn(field, subfield) {\n if (subfield.code !== 'a' || !handleInvalid) {\n return;\n }\n const head = getFirstWord(subfield.value);\n if (!invalidISBN(head)) {\n return;\n }\n // $a => $z (bit overkill to add $z and remove $a instead of just renaming, but too lazy to fix/test thorougly)\n field.subfields.push({code: 'z', value: subfield.value}); // eslint-disable-line functional/immutable-data\n record.removeSubfield(subfield, field);\n }\n\n function split020A() {\n // Move non-initial words from $a to $q:\n if (subfield.code !== 'a') {\n return;\n }\n const value = trimSpaces(subfield.value);\n const position = value.indexOf(' ');\n if (position === -1) {\n return;\n }\n const head = getFirstWord(value);\n if (invalidISBN(head)) { // Don't split, if first word ain't ISBN\n return;\n }\n const tail = value.substring(position + 1);\n subfield.value = head; // eslint-disable-line functional/immutable-data\n field.subfields.push({code: 'q', value: tail}); // eslint-disable-line functional/immutable-data\n }\n\n function normalizeIsbnValue(value) {\n const trimmedValue = getFirstWord(value);\n //const trimmedValue = trimISBN(value); // NB! This might lose information that should be stored in $q...\n const auditResult = ISBN.audit(trimmedValue);\n if (!auditResult.validIsbn) {\n return undefined;\n }\n const numbersOnly = trimmedValue.replace(/[^0-9Xx]+/ug, '');\n const parsedIsbn = ISBN.parse(trimmedValue);\n if (hyphenateISBN) { // eslint-disable-line functional/no-conditional-statements\n return numbersOnly.length === 10 ? parsedIsbn.isbn10h : parsedIsbn.isbn13h; // eslint-disable-line functional/immutable-data\n }\n return numbersOnly.length === 10 ? parsedIsbn.isbn10 : parsedIsbn.isbn13; // eslint-disable-line functional/immutable-data\n }\n }\n }\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"isbn-issn.js","names":["_isbn","_interopRequireDefault","require","_issnVerify","e","__esModule","default","_default","hyphenateISBN","handleInvalid","validate","fix","description","stringHasSpace","str","indexOf","trimSpaces","value","replace","isMultiWord","inputString","trimmedString","getFirstWord","arr","split","invalidISBN","isbn","isbnOnly","auditedIsbn","ISBN","audit","validIsbn","invalidSubfield","subfield","code","invalidField020","field","subfields","some","sf","subfieldsIsbnRequiresHyphenation","includes","requiresHyphenation","isbn2","parsedIsbn","parse","isbn10h","isbn13h","getRelevantFields","record","fields","filter","tag","fieldsIsbnRequiresHyphenation","invalidField022","find","validateISSN","subfieldAorL","undefined","subfieldY","length","valid","map","subfieldA","name","subfieldZ","getISSN","reduce","acc","obj","msg","messages","concat","forEach","fixField020Subfield","push","removeSubfield","split020A","addHyphens","handleInvalidIsbn","normalizedValue","normalizeIsbnValue","head","position","tail","substring","trimmedValue","auditResult","numbersOnly","isbn10","isbn13","exports"],"sources":["../src/isbn-issn.js"],"sourcesContent":["import ISBN from 'isbn3';\nimport validateISSN from '@natlibfi/issn-verify';\n\n// handleInvalid: move invalid 020$a to 020$z, and invalid 022$a to 022$y\nexport default ({hyphenateISBN = false, handleInvalid = false} = {}) => {\n return {\n validate, fix,\n description: 'Validates ISBN and ISSN values'\n };\n\n function stringHasSpace(str) {\n return str.indexOf(' ') > -1;\n }\n\n function trimSpaces(value) {\n return value.replace(/^\\s+/u, '').replace(/\\s+$/u, '').replace(/\\s+/gu, ' ');\n }\n\n function isMultiWord(inputString) {\n const trimmedString = trimSpaces(inputString);\n return stringHasSpace(trimmedString);\n }\n\n function getFirstWord(inputString) {\n const trimmedString = trimSpaces(inputString);\n const arr = trimmedString.split(' ');\n return arr[0];\n }\n\n function invalidISBN(isbn) {\n const isbnOnly = getFirstWord(isbn);\n const auditedIsbn = ISBN.audit(isbnOnly);\n return !auditedIsbn.validIsbn;\n }\n\n function invalidSubfield(subfield) {\n if (subfield.code !== 'a') {\n return false;\n }\n return invalidISBN(subfield.value) || isMultiWord(subfield.value);\n }\n\n\n function invalidField020(field) {\n if (field.subfields && field.subfields.some(sf => invalidSubfield(sf))) {\n return true;\n }\n return false;\n }\n\n function subfieldsIsbnRequiresHyphenation(subfield) {\n if (!hyphenateISBN || !['a', 'z'].includes(subfield.code)) {\n return false;\n }\n\n const isbn = getFirstWord(subfield.value);\n if (subfield.code === 'a') {\n return requiresHyphenation(isbn);\n }\n\n // $z is a bit hacky: hyphenation is required only iff valid and no '-' chars\n if (isbn.indexOf('-') > -1) {\n return false;\n }\n return !invalidISBN(isbn);\n\n function requiresHyphenation(isbn) {\n if (!hyphenateISBN) {\n return false;\n }\n // Handle old notation such as \"978-952-396-001-5 (nid.)\"\n const isbn2 = getFirstWord(isbn);\n\n if (invalidISBN(isbn2)) {\n return false;\n }\n\n const parsedIsbn = ISBN.parse(isbn2);\n // Return true only if existing ISBN is a valid and hyphenated 10 or 13 digit ISBN:\n return !(isbn2 === parsedIsbn.isbn10h || isbn2 === parsedIsbn.isbn13h);\n }\n }\n\n function getRelevantFields(record) {\n //return record.get(/^(?:020|022)$/u).filter(field => {\n return record.fields.filter(field => {\n if (!field.subfields) {\n return false;\n }\n // Check ISBN:\n if (field.tag === '020') {\n if (invalidField020(field)) { // checks multiwordness\n return true;\n }\n return fieldsIsbnRequiresHyphenation(field);\n }\n\n // Check ISSN:\n if (field.tag === '022') {\n if (invalidField022(field)) {\n return true;\n }\n\n const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n return !validateISSN(subfield.value);\n }\n return false;\n });\n\n function fieldsIsbnRequiresHyphenation(field) {\n return field.subfields && field.subfields.some(sf => subfieldsIsbnRequiresHyphenation(sf));\n }\n\n function invalidField022(field) {\n const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n if (subfieldAorL === undefined) {\n const subfieldY = field.subfields.find(sf => sf.code === 'y');\n if (subfieldY) {\n return false;\n }\n\n return true;\n }\n return false;\n }\n }\n\n function validate(record) {\n const fields = getRelevantFields(record);\n\n if (fields.length === 0) {\n return {valid: true};\n }\n\n return fields\n .map(field => {\n if (field.tag === '020') {\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n if (subfieldA) {\n return {name: 'ISBN', value: subfieldA.value};\n }\n const subfieldZ = field.subfields.find(sf => sf.code === 'z');\n if (subfieldZ) {\n return {name: 'ISBN (subfield Z)', value: subfieldZ.value};\n }\n\n return {name: 'ISBN', value: undefined};\n }\n\n return {name: 'ISSN', value: getISSN()};\n\n function getISSN() {\n const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n if (subfieldAorL) {\n return subfieldAorL.value;\n }\n\n return undefined;\n }\n })\n .reduce((acc, obj) => {\n const {name, value} = obj;\n const msg = `${name} (${value}) is not valid`;\n\n return {...acc, messages: acc.messages.concat(msg)};\n }, {valid: false, messages: []});\n }\n\n\n function fix(record) {\n getRelevantFields(record).forEach(field => {\n if (field.tag === '020') {\n field.subfields.forEach(subfield => fixField020Subfield(field, subfield)); // eslint-disable-line array-callback-return\n return;\n }\n // 022 ISSN:\n const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n if (subfield && handleInvalid) {\n // $a/$l => $y (bit overkill to add $z and remove $a/$l instead of just renaming)\n field.subfields.push({code: 'y', value: subfield.value});\n record.removeSubfield(subfield, field);\n }\n });\n\n\n function fixField020Subfield(field, subfield) {\n split020A(); // subfield and field are in the scope\n addHyphens(subfield);\n handleInvalidIsbn(field, subfield); // remove 020$a, add 020$z, Do this last, as it uses deletion\n return;\n\n function addHyphens(subfield) {\n if (!subfieldsIsbnRequiresHyphenation(subfield)) {\n return;\n }\n // ISBN is valid but is missing hyphens\n const normalizedValue = normalizeIsbnValue(subfield.value);\n if (normalizedValue !== undefined) {\n subfield.value = normalizedValue;\n }\n }\n\n function handleInvalidIsbn(field, subfield) {\n if (subfield.code !== 'a' || !handleInvalid) {\n return;\n }\n const head = getFirstWord(subfield.value);\n if (!invalidISBN(head)) {\n return;\n }\n // $a => $z (bit overkill to add $z and remove $a instead of just renaming, but too lazy to fix/test thorougly)\n field.subfields.push({code: 'z', value: subfield.value});\n record.removeSubfield(subfield, field);\n }\n\n function split020A() {\n // Move non-initial words from $a to $q:\n if (subfield.code !== 'a') {\n return;\n }\n const value = trimSpaces(subfield.value);\n const position = value.indexOf(' ');\n if (position === -1) {\n return;\n }\n const head = getFirstWord(value);\n if (invalidISBN(head)) { // Don't split, if first word ain't ISBN\n return;\n }\n const tail = value.substring(position + 1);\n subfield.value = head;\n field.subfields.push({code: 'q', value: tail});\n }\n\n function normalizeIsbnValue(value) {\n const trimmedValue = getFirstWord(value);\n //const trimmedValue = trimISBN(value); // NB! This might lose information that should be stored in $q...\n const auditResult = ISBN.audit(trimmedValue);\n if (!auditResult.validIsbn) {\n return undefined;\n }\n const numbersOnly = trimmedValue.replace(/[^0-9Xx]+/ug, '');\n const parsedIsbn = ISBN.parse(trimmedValue);\n if (hyphenateISBN) {\n return numbersOnly.length === 10 ? parsedIsbn.isbn10h : parsedIsbn.isbn13h;\n }\n return numbersOnly.length === 10 ? parsedIsbn.isbn10 : parsedIsbn.isbn13;\n }\n }\n }\n};\n"],"mappings":"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","ignoreList":[]}
|
package/dist/item-language.js
CHANGED
|
@@ -54,29 +54,23 @@ async function _default(tagPattern, treshold = 0.9) {
|
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
56
|
if (results.detected && results.detected !== results.currentCode) {
|
|
57
|
-
const f008 = record.get(/^008$/u).shift();
|
|
58
|
-
|
|
57
|
+
const f008 = record.get(/^008$/u).shift();
|
|
59
58
|
if (f008) {
|
|
60
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
61
59
|
const start = f008.value.slice(0, 35);
|
|
62
60
|
const end = f008.value.slice(38);
|
|
63
|
-
f008.value = `${start}${results.detected}${end}`;
|
|
61
|
+
f008.value = `${start}${results.detected}${end}`;
|
|
64
62
|
}
|
|
65
|
-
const f041 = record.get(/^041$/u).shift();
|
|
66
|
-
|
|
63
|
+
const f041 = record.get(/^041$/u).shift();
|
|
67
64
|
if (f041) {
|
|
68
65
|
const subfield = f041.subfields.find(sf => sf.code === 'a');
|
|
69
66
|
if (subfield) {
|
|
70
|
-
|
|
71
|
-
subfield.value = results.detected; // eslint-disable-line functional/immutable-data
|
|
67
|
+
subfield.value = results.detected;
|
|
72
68
|
} else {
|
|
73
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
74
69
|
f041.subfields.push({
|
|
75
70
|
code: 'a',
|
|
76
71
|
value: results.detected
|
|
77
|
-
});
|
|
72
|
+
});
|
|
78
73
|
f041.subfields.sort((a, b) => {
|
|
79
|
-
// eslint-disable-line functional/immutable-data
|
|
80
74
|
if (a.code < b.code) {
|
|
81
75
|
return -1;
|
|
82
76
|
}
|
|
@@ -87,7 +81,6 @@ async function _default(tagPattern, treshold = 0.9) {
|
|
|
87
81
|
});
|
|
88
82
|
}
|
|
89
83
|
} else {
|
|
90
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
91
84
|
record.insertField({
|
|
92
85
|
tag: '041',
|
|
93
86
|
ind1: ' ',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item-language.js","names":["_cld3Asm","require","_langs","_interopRequireDefault","_debug","e","__esModule","default","_default","tagPattern","treshold","debug","createDebugLogger","cldFactory","loadCLD","RegExp","description","validate","fix","Error","record","results","checkLanguage","failed","valid","Boolean","currentCode","messages","detected","suggested","join","f008","get","shift","start","value","slice","end","f041","subfield","subfields","find","sf","code","push","sort","a","b","insertField","tag","ind1","ind2","text","getText","langCode","getLanguageCode","Identifier","create","length","dispose","findLanguage","is_reliable","probability","get2TLangCode","language","err","err2","stack","message","reduce","acc","field","fieldText","test","LanguageCodes","where"],"sources":["../src/item-language.js"],"sourcesContent":["import {loadModule as loadCLD} from 'cld3-asm';\nimport LanguageCodes from 'langs';\nimport createDebugLogger from 'debug';\n\nexport default async function (tagPattern, treshold = 0.9) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/item-language');\n const cldFactory = await loadCLD();\n\n if (tagPattern instanceof RegExp) {\n return {\n description:\n 'Handles invalid/missing item language code',\n validate,\n fix\n };\n }\n\n throw new Error('No tagPattern provided');\n\n async function validate(record) {\n const results = await checkLanguage(record);\n\n if (results.failed) {\n return {valid: Boolean(results.currentCode), messages: ['Language detection failed']};\n }\n\n if (results.detected) {\n if (results.detected !== results.currentCode) {\n return {valid: false, messages: [`Item language code is invalid. Correct language code: ${results.detected}`]};\n }\n\n return {valid: true};\n }\n\n if (results.suggested) {\n return {valid: Boolean(results.currentCode), messages: [`Item language code is invalid. Current code: ${results.currentCode}, suggestions: ${results.suggested.join()}`]};\n }\n }\n\n async function fix(record) {\n const results = await checkLanguage(record);\n\n if (results.suggested && results.currentCode) {\n return;\n }\n\n if (results.failed && !results.currentCode) {\n return;\n }\n\n if (results.detected && results.detected !== results.currentCode) {\n const f008 = record.get(/^008$/u).shift(); // eslint-disable-line functional/immutable-data\n\n if (f008) { // eslint-disable-line functional/no-conditional-statements\n const start = f008.value.slice(0, 35);\n const end = f008.value.slice(38);\n f008.value = `${start}${results.detected}${end}`; // eslint-disable-line functional/immutable-data\n }\n\n const f041 = record.get(/^041$/u).shift(); // eslint-disable-line functional/immutable-data\n\n if (f041) {\n const subfield = f041.subfields.find(sf => sf.code === 'a');\n\n if (subfield) { // eslint-disable-line functional/no-conditional-statements\n subfield.value = results.detected; // eslint-disable-line functional/immutable-data\n } else { // eslint-disable-line functional/no-conditional-statements\n f041.subfields.push({code: 'a', value: results.detected}); // eslint-disable-line functional/immutable-data\n f041.subfields.sort((a, b) => { // eslint-disable-line functional/immutable-data\n if (a.code < b.code) {\n return -1;\n }\n\n if (a.code > b.code) {\n return 1;\n }\n\n return 0;\n });\n }\n } else { // eslint-disable-line functional/no-conditional-statements\n record.insertField({tag: '041', ind1: ' ', ind2: ' ', subfields: [\n {\n code: 'a',\n value: results.detected\n }\n ]});\n }\n }\n }\n\n async function checkLanguage(record) {\n const text = getText(record);\n const langCode = getLanguageCode(record);\n\n const Identifier = cldFactory.create();\n\n if (text.length === 0) {\n Identifier.dispose();\n return {failed: true, currentCode: langCode};\n }\n\n try {\n const results = await Identifier.findLanguage(text);\n Identifier.dispose();\n\n if (results.is_reliable) {\n if (results.probability >= treshold) {\n return {\n detected: get2TLangCode(results.language),\n currentCode: langCode\n };\n }\n\n return {\n currentCode: langCode,\n suggested: [get2TLangCode(results.language)]\n };\n }\n\n return {failed: true, currentCode: langCode};\n } catch (err) {\n /* istanbul ignore next: How to cause errors? */\n try {\n Identifier.dispose();\n } catch (err2) {\n debug(`Got error disposing identifier: ${err2 instanceof Error ? err2.stack : err2}`);\n }\n\n /* istanbul ignore next: How to cause errors? */\n throw err instanceof Error ? err : new Error(err.message);\n }\n\n function getText(record) {\n return record.get(tagPattern).reduce((acc, field) => {\n const fieldText = field.subfields.find(sf => sf.code === 'a').value;\n return `${acc}${fieldText}`;\n }, '');\n }\n\n function getLanguageCode(record) {\n const [f008] = record.get(/^008$/u);\n\n if (f008) {\n const code = f008.value.slice(35, 38);\n if ((/^[a-z][a-z][a-z]$/u).test(code) && code !== 'zxx') {\n return code;\n }\n }\n\n const [f041] = record.get(/^041$/u);\n\n if (f041) {\n const code = f041.subfields.find(sf => sf.code === 'a').value;\n return code;\n }\n }\n\n function get2TLangCode(code) {\n return LanguageCodes.where('1', code)['2T'];\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"item-language.js","names":["_cld3Asm","require","_langs","_interopRequireDefault","_debug","e","__esModule","default","_default","tagPattern","treshold","debug","createDebugLogger","cldFactory","loadCLD","RegExp","description","validate","fix","Error","record","results","checkLanguage","failed","valid","Boolean","currentCode","messages","detected","suggested","join","f008","get","shift","start","value","slice","end","f041","subfield","subfields","find","sf","code","push","sort","a","b","insertField","tag","ind1","ind2","text","getText","langCode","getLanguageCode","Identifier","create","length","dispose","findLanguage","is_reliable","probability","get2TLangCode","language","err","err2","stack","message","reduce","acc","field","fieldText","test","LanguageCodes","where"],"sources":["../src/item-language.js"],"sourcesContent":["import {loadModule as loadCLD} from 'cld3-asm';\nimport LanguageCodes from 'langs';\nimport createDebugLogger from 'debug';\n\nexport default async function (tagPattern, treshold = 0.9) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/item-language');\n const cldFactory = await loadCLD();\n\n if (tagPattern instanceof RegExp) {\n return {\n description:\n 'Handles invalid/missing item language code',\n validate,\n fix\n };\n }\n\n throw new Error('No tagPattern provided');\n\n async function validate(record) {\n const results = await checkLanguage(record);\n\n if (results.failed) {\n return {valid: Boolean(results.currentCode), messages: ['Language detection failed']};\n }\n\n if (results.detected) {\n if (results.detected !== results.currentCode) {\n return {valid: false, messages: [`Item language code is invalid. Correct language code: ${results.detected}`]};\n }\n\n return {valid: true};\n }\n\n if (results.suggested) {\n return {valid: Boolean(results.currentCode), messages: [`Item language code is invalid. Current code: ${results.currentCode}, suggestions: ${results.suggested.join()}`]};\n }\n }\n\n async function fix(record) {\n const results = await checkLanguage(record);\n\n if (results.suggested && results.currentCode) {\n return;\n }\n\n if (results.failed && !results.currentCode) {\n return;\n }\n\n if (results.detected && results.detected !== results.currentCode) {\n const f008 = record.get(/^008$/u).shift();\n\n if (f008) {\n const start = f008.value.slice(0, 35);\n const end = f008.value.slice(38);\n f008.value = `${start}${results.detected}${end}`;\n }\n\n const f041 = record.get(/^041$/u).shift();\n\n if (f041) {\n const subfield = f041.subfields.find(sf => sf.code === 'a');\n\n if (subfield) {\n subfield.value = results.detected;\n } else {\n f041.subfields.push({code: 'a', value: results.detected});\n f041.subfields.sort((a, b) => {\n if (a.code < b.code) {\n return -1;\n }\n\n if (a.code > b.code) {\n return 1;\n }\n\n return 0;\n });\n }\n } else {\n record.insertField({tag: '041', ind1: ' ', ind2: ' ', subfields: [\n {\n code: 'a',\n value: results.detected\n }\n ]});\n }\n }\n }\n\n async function checkLanguage(record) {\n const text = getText(record);\n const langCode = getLanguageCode(record);\n\n const Identifier = cldFactory.create();\n\n if (text.length === 0) {\n Identifier.dispose();\n return {failed: true, currentCode: langCode};\n }\n\n try {\n const results = await Identifier.findLanguage(text);\n Identifier.dispose();\n\n if (results.is_reliable) {\n if (results.probability >= treshold) {\n return {\n detected: get2TLangCode(results.language),\n currentCode: langCode\n };\n }\n\n return {\n currentCode: langCode,\n suggested: [get2TLangCode(results.language)]\n };\n }\n\n return {failed: true, currentCode: langCode};\n } catch (err) {\n /* istanbul ignore next: How to cause errors? */\n try {\n Identifier.dispose();\n } catch (err2) {\n debug(`Got error disposing identifier: ${err2 instanceof Error ? err2.stack : err2}`);\n }\n\n /* istanbul ignore next: How to cause errors? */\n throw err instanceof Error ? err : new Error(err.message);\n }\n\n function getText(record) {\n return record.get(tagPattern).reduce((acc, field) => {\n const fieldText = field.subfields.find(sf => sf.code === 'a').value;\n return `${acc}${fieldText}`;\n }, '');\n }\n\n function getLanguageCode(record) {\n const [f008] = record.get(/^008$/u);\n\n if (f008) {\n const code = f008.value.slice(35, 38);\n if ((/^[a-z][a-z][a-z]$/u).test(code) && code !== 'zxx') {\n return code;\n }\n }\n\n const [f041] = record.get(/^041$/u);\n\n if (f041) {\n const code = f041.subfields.find(sf => sf.code === 'a').value;\n return code;\n }\n }\n\n function get2TLangCode(code) {\n return LanguageCodes.where('1', code)['2T'];\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -69,8 +69,8 @@ function differentPublisherSubfields(field1, field2) {
|
|
|
69
69
|
|
|
70
70
|
function splitToNameAndQualifier(value) {
|
|
71
71
|
if (value.match(/^.* \([^()]+\)$/u)) {
|
|
72
|
-
const name = value.replace(/^(.*) \([^()]+\)$/u, '$1');
|
|
73
|
-
const qualifier = value.replace(/^.* (\([^()]+\))$/u, '$1');
|
|
72
|
+
const name = value.replace(/^(.*) \([^()]+\)$/u, '$1');
|
|
73
|
+
const qualifier = value.replace(/^.* (\([^()]+\))$/u, '$1');
|
|
74
74
|
return [name, qualifier];
|
|
75
75
|
}
|
|
76
76
|
return [value, undefined];
|
|
@@ -190,7 +190,6 @@ function pairableValue(tag, subfieldCode, value1, value2) {
|
|
|
190
190
|
return undefined;
|
|
191
191
|
}
|
|
192
192
|
function counterpartExtraNormalize(tag, subfieldCode, value) {
|
|
193
|
-
/* eslint-disable prefer-named-capture-group, no-param-reassign */
|
|
194
193
|
// Remove trailing punctuation:
|
|
195
194
|
value = value.replace(/(\S)(?:,|\.|\?|!|\. -| *:| *;| =| \/)$/u, '$1');
|
|
196
195
|
// Remove brackets:
|
|
@@ -504,7 +503,7 @@ function fieldToNamePart(field) {
|
|
|
504
503
|
};
|
|
505
504
|
|
|
506
505
|
/*
|
|
507
|
-
if (index > -1) {
|
|
506
|
+
if (index > -1) {
|
|
508
507
|
debugDev(`Name subset: ${fieldToString(subsetField)}`);
|
|
509
508
|
}
|
|
510
509
|
*/
|
|
@@ -580,8 +579,7 @@ function mergablePairWithAltName(normCandField, normalizedField, altName, config
|
|
|
580
579
|
if (!a) {
|
|
581
580
|
return false;
|
|
582
581
|
}
|
|
583
|
-
a.value = altName;
|
|
584
|
-
|
|
582
|
+
a.value = altName;
|
|
585
583
|
return mergablePair(normCandField, normalizedField, config);
|
|
586
584
|
}
|
|
587
585
|
function getCounterpartIndex(field, counterpartCands, altNames, config) {
|
|
@@ -629,9 +627,9 @@ function getCounterpartCandidates(field, record) {
|
|
|
629
627
|
return counterpartCands;
|
|
630
628
|
}
|
|
631
629
|
function baseIsSource(base, source) {
|
|
632
|
-
base.localTest = true;
|
|
630
|
+
base.localTest = true;
|
|
633
631
|
const result = source.localTest;
|
|
634
|
-
delete base.localTest;
|
|
632
|
+
delete base.localTest;
|
|
635
633
|
return result;
|
|
636
634
|
}
|
|
637
635
|
function getCounterpart(baseRecord, sourceRecord, field, config) {
|