@natlibfi/marc-record-validators-melinda 11.6.6 → 11.6.7
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/urn.js
CHANGED
|
@@ -46,7 +46,6 @@ function _default(isLegalDeposit = false, useMelindaTemp = true) {
|
|
|
46
46
|
// We probably should not do these additions
|
|
47
47
|
|
|
48
48
|
if (f856sUrn.length === 0) {
|
|
49
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
50
49
|
const {
|
|
51
50
|
code,
|
|
52
51
|
value,
|
|
@@ -78,9 +77,8 @@ function _default(isLegalDeposit = false, useMelindaTemp = true) {
|
|
|
78
77
|
}, ...ldSubfields]
|
|
79
78
|
});
|
|
80
79
|
return true;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
|
|
80
|
+
}
|
|
81
|
+
if (isLegalDeposit) {
|
|
84
82
|
// We add here legal deposit information to all URN-f856s - we probably should not do this
|
|
85
83
|
// We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN
|
|
86
84
|
// How do we decide which URN to use as a template if there are several URNs
|
|
@@ -89,16 +87,13 @@ function _default(isLegalDeposit = false, useMelindaTemp = true) {
|
|
|
89
87
|
f856sUrn.forEach(f => {
|
|
90
88
|
// Change phrase from old to new if field with old phrase is found
|
|
91
89
|
if (f.subfields.some(sf => hasOld856LdPhrase(sf))) {
|
|
92
|
-
|
|
93
|
-
f.subfields // eslint-disable-line functional/immutable-data
|
|
94
|
-
.find(sf => hasOld856LdPhrase(sf)).value = 'Käytettävissä vapaakappaletyöasemilla';
|
|
90
|
+
f.subfields.find(sf => hasOld856LdPhrase(sf)).value = 'Käytettävissä vapaakappaletyöasemilla';
|
|
95
91
|
}
|
|
96
92
|
|
|
97
93
|
// Create subfields if necessary
|
|
98
94
|
ldSubfields.forEach(ldsf => {
|
|
99
95
|
if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value && !hasOld856LdPhrase(sf))) {
|
|
100
|
-
|
|
101
|
-
f.subfields.push(ldsf); // eslint-disable-line functional/immutable-data
|
|
96
|
+
f.subfields.push(ldsf);
|
|
102
97
|
}
|
|
103
98
|
});
|
|
104
99
|
});
|
package/dist/urn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urn.js","names":["_nodeFetch","_interopRequireDefault","require","_utils","_debug","e","__esModule","default","URN_GENERATOR_URL","_default","isLegalDeposit","useMelindaTemp","debug","createDebugLogger","debugData","extend","hasLegalDepositURN","field","tag","includes","ind2","subfields","some","sf","code","value","test","description","validate","fix","record","f856sUrn","fields","filter","JSON","stringify","ldSubfields","createLDSubfields","length","generated","createURNSubfield","tempSubField","insertField","ind1","forEach","f","hasOld856LdPhrase","find","ldsf","push","rec","isbn","reduce","acc","a","undefined","createURN","response","fetch","body","text","fieldHasLDSubfields","every","validateLD","f856sUrnWithLdSubfields","isElectronicMaterial","valid"],"sources":["../src/urn.js"],"sourcesContent":["import fetch from 'node-fetch';\nimport {isElectronicMaterial} from './utils';\nimport createDebugLogger from 'debug';\n\nconst URN_GENERATOR_URL = 'https://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';\n\nexport default function (isLegalDeposit = false, useMelindaTemp = true) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:urn');\n const debugData = debug.extend('data');\n\n //console.log(`IS LEGAL DEPOSIT? ${isLegalDeposit ? 'YES' : 'NO'}`); // eslint-disable-line no-console\n\n // We should check that the f856 with URN has second indicator '0' (Resource), ' ' (No information provided) or '8' (No display constant generated)\n // - if second indicator is '1' (Version of resource) or '2' (Related resource) the URN in f856 is not correct for the resource described in the record\n\n // This checks only the existence of URNs from the Finnish urn.fi -resolver\n\n function hasLegalDepositURN(field) {\n if (field.tag !== '856' || ['1', '2', '3', '4'].includes(field.ind2)) {\n return false;\n }\n\n // First attempt to fix MET-573. However, does useMelindaTemp come into play as well?\n if (isLegalDeposit && !field.subfields.some(sf => sf.code === '5' && sf.value === 'FI-Vapaa')) {\n return false;\n }\n\n return field.subfields.some(sf => sf.code === 'u' && (/^https?:\\/\\/urn\\.fi/u).test(sf.value));\n }\n\n\n return {\n description: 'Adds URN for record, to 856-field (if not existing). If isLegalDeposit is active, adds legal deposit subfields to the f856s with URN.',\n validate,\n fix\n };\n\n async function fix(record) {\n const f856sUrn = record.fields.filter(hasLegalDepositURN);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n const ldSubfields = isLegalDeposit ? createLDSubfields() : [];\n debugData(`IsLegalDeposit: ${isLegalDeposit}, LegalDepositSubfields: ${JSON.stringify(ldSubfields)}`);\n\n // We add the URN even if we're not getting the legalDeposit - where does this URN resolve?\n // We probably should not do these additions\n\n if (f856sUrn.length === 0) { // eslint-disable-line functional/no-conditional-statements\n const {code, value, generated} = await createURNSubfield(record);\n\n if (generated && useMelindaTemp) {\n const tempSubField = {code: '9', value: 'MELINDA<TEMP>'};\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields, tempSubField]\n });\n\n return true;\n }\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields]\n });\n\n return true;\n } else if (isLegalDeposit) { // eslint-disable-line functional/no-conditional-statements\n\n // We add here legal deposit information to all URN-f856s - we probably should not do this\n // We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN\n // How do we decide which URN to use as a template if there are several URNs\n // We should check for existence of a legal deposit URN anyways\n\n f856sUrn.forEach(f => {\n // Change phrase from old to new if field with old phrase is found\n if (f.subfields.some(sf => hasOld856LdPhrase(sf))) { // eslint-disable-line functional/no-conditional-statements\n f.subfields // eslint-disable-line functional/immutable-data\n .find(sf => hasOld856LdPhrase(sf))\n .value = 'Käytettävissä vapaakappaletyöasemilla';\n }\n\n // Create subfields if necessary\n ldSubfields.forEach(ldsf => {\n if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value && !hasOld856LdPhrase(sf))) { // eslint-disable-line functional/no-conditional-statements\n f.subfields.push(ldsf); // eslint-disable-line functional/immutable-data\n }\n });\n });\n }\n\n return true;\n\n // We should check existence of URN in f024 i1: '7' $2 urn/URN for this too\n\n async function createURNSubfield(rec) {\n // isbn is picked from the last 020 $a in the record\n // what should we do in case of several 020 $a:s\n const isbn = rec.fields.reduce((acc, f) => {\n if (f.tag === '020') {\n const a = f.subfields.find(sf => sf.code === 'a');\n return a ? a.value : undefined;\n }\n\n return acc;\n }, undefined);\n\n debugData(`isbns: ${isbn}`);\n\n const {generated, value} = await createURN(isbn);\n return {code: 'u', value, generated};\n\n async function createURN(isbn = false) {\n if (isbn) {\n return {generated: false, value: `https://urn.fi/URN:ISBN:${isbn}`};\n }\n\n const response = await fetch(URN_GENERATOR_URL);\n const body = await response.text();\n\n // If we generated URN we could also add it to the 024\n // generated 024 should also have $9 MELINDA<TEMP>\n return {generated: true, value: `https://urn.fi/${body}`};\n }\n }\n\n function hasOld856LdPhrase({code, value}) {\n if (code === 'z' && value === 'Käytettävissä vapaakappalekirjastoissa') {\n return true;\n }\n\n return false;\n }\n\n }\n\n // Later when the new subfields that have f506/f540 -type contents, we should add also them here\n function createLDSubfields() {\n return [\n {\n code: 'z',\n value: 'Käytettävissä vapaakappaletyöasemilla'\n },\n {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n }\n\n function fieldHasLDSubfields(field, ldSubfields) {\n if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {\n return true;\n }\n }\n\n function validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n const ldSubfields = createLDSubfields();\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));\n if (f856sUrnWithLdSubfields.length > 0) {\n debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);\n debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);\n return true;\n }\n return false;\n }\n\n function validate(record) {\n // if not electronic skip this validator\n if (!isElectronicMaterial(record)) {\n debug(`Record is not electronic - no need to validate legal deposit URNs`);\n return {valid: true};\n }\n\n const f856sUrn = record.fields.filter(hasLegalDepositURN);\n\n if (f856sUrn.length > 0) {\n debug(`Record has ${f856sUrn.length} URN fields`);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n if (!isLegalDeposit || validateLD(f856sUrn)) {\n debug(`Record is valid`);\n return {valid: true};\n }\n }\n debug(`No (valid) URN fields - Record is not valid`);\n return {valid: false};\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"urn.js","names":["_nodeFetch","_interopRequireDefault","require","_utils","_debug","e","__esModule","default","URN_GENERATOR_URL","_default","isLegalDeposit","useMelindaTemp","debug","createDebugLogger","debugData","extend","hasLegalDepositURN","field","tag","includes","ind2","subfields","some","sf","code","value","test","description","validate","fix","record","f856sUrn","fields","filter","JSON","stringify","ldSubfields","createLDSubfields","length","generated","createURNSubfield","tempSubField","insertField","ind1","forEach","f","hasOld856LdPhrase","find","ldsf","push","rec","isbn","reduce","acc","a","undefined","createURN","response","fetch","body","text","fieldHasLDSubfields","every","validateLD","f856sUrnWithLdSubfields","isElectronicMaterial","valid"],"sources":["../src/urn.js"],"sourcesContent":["import fetch from 'node-fetch';\nimport {isElectronicMaterial} from './utils';\nimport createDebugLogger from 'debug';\n\nconst URN_GENERATOR_URL = 'https://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';\n\nexport default function (isLegalDeposit = false, useMelindaTemp = true) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:urn');\n const debugData = debug.extend('data');\n\n //console.log(`IS LEGAL DEPOSIT? ${isLegalDeposit ? 'YES' : 'NO'}`); // eslint-disable-line no-console\n\n // We should check that the f856 with URN has second indicator '0' (Resource), ' ' (No information provided) or '8' (No display constant generated)\n // - if second indicator is '1' (Version of resource) or '2' (Related resource) the URN in f856 is not correct for the resource described in the record\n\n // This checks only the existence of URNs from the Finnish urn.fi -resolver\n\n function hasLegalDepositURN(field) {\n if (field.tag !== '856' || ['1', '2', '3', '4'].includes(field.ind2)) {\n return false;\n }\n\n // First attempt to fix MET-573. However, does useMelindaTemp come into play as well?\n if (isLegalDeposit && !field.subfields.some(sf => sf.code === '5' && sf.value === 'FI-Vapaa')) {\n return false;\n }\n\n return field.subfields.some(sf => sf.code === 'u' && (/^https?:\\/\\/urn\\.fi/u).test(sf.value));\n }\n\n\n return {\n description: 'Adds URN for record, to 856-field (if not existing). If isLegalDeposit is active, adds legal deposit subfields to the f856s with URN.',\n validate,\n fix\n };\n\n async function fix(record) {\n const f856sUrn = record.fields.filter(hasLegalDepositURN);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n const ldSubfields = isLegalDeposit ? createLDSubfields() : [];\n debugData(`IsLegalDeposit: ${isLegalDeposit}, LegalDepositSubfields: ${JSON.stringify(ldSubfields)}`);\n\n // We add the URN even if we're not getting the legalDeposit - where does this URN resolve?\n // We probably should not do these additions\n\n if (f856sUrn.length === 0) {\n const {code, value, generated} = await createURNSubfield(record);\n\n if (generated && useMelindaTemp) {\n const tempSubField = {code: '9', value: 'MELINDA<TEMP>'};\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields, tempSubField]\n });\n\n return true;\n }\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields]\n });\n\n return true;\n }\n\n if (isLegalDeposit) {\n\n // We add here legal deposit information to all URN-f856s - we probably should not do this\n // We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN\n // How do we decide which URN to use as a template if there are several URNs\n // We should check for existence of a legal deposit URN anyways\n\n f856sUrn.forEach(f => {\n // Change phrase from old to new if field with old phrase is found\n if (f.subfields.some(sf => hasOld856LdPhrase(sf))) {\n f.subfields\n .find(sf => hasOld856LdPhrase(sf))\n .value = 'Käytettävissä vapaakappaletyöasemilla';\n }\n\n // Create subfields if necessary\n ldSubfields.forEach(ldsf => {\n if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value && !hasOld856LdPhrase(sf))) {\n f.subfields.push(ldsf);\n }\n });\n });\n }\n\n return true;\n\n // We should check existence of URN in f024 i1: '7' $2 urn/URN for this too\n\n async function createURNSubfield(rec) {\n // isbn is picked from the last 020 $a in the record\n // what should we do in case of several 020 $a:s\n const isbn = rec.fields.reduce((acc, f) => {\n if (f.tag === '020') {\n const a = f.subfields.find(sf => sf.code === 'a');\n return a ? a.value : undefined;\n }\n\n return acc;\n }, undefined);\n\n debugData(`isbns: ${isbn}`);\n\n const {generated, value} = await createURN(isbn);\n return {code: 'u', value, generated};\n\n async function createURN(isbn = false) {\n if (isbn) {\n return {generated: false, value: `https://urn.fi/URN:ISBN:${isbn}`};\n }\n\n const response = await fetch(URN_GENERATOR_URL);\n const body = await response.text();\n\n // If we generated URN we could also add it to the 024\n // generated 024 should also have $9 MELINDA<TEMP>\n return {generated: true, value: `https://urn.fi/${body}`};\n }\n }\n\n function hasOld856LdPhrase({code, value}) {\n if (code === 'z' && value === 'Käytettävissä vapaakappalekirjastoissa') {\n return true;\n }\n\n return false;\n }\n\n }\n\n // Later when the new subfields that have f506/f540 -type contents, we should add also them here\n function createLDSubfields() {\n return [\n {\n code: 'z',\n value: 'Käytettävissä vapaakappaletyöasemilla'\n },\n {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n }\n\n function fieldHasLDSubfields(field, ldSubfields) {\n if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {\n return true;\n }\n }\n\n function validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n const ldSubfields = createLDSubfields();\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));\n if (f856sUrnWithLdSubfields.length > 0) {\n debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);\n debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);\n return true;\n }\n return false;\n }\n\n function validate(record) {\n // if not electronic skip this validator\n if (!isElectronicMaterial(record)) {\n debug(`Record is not electronic - no need to validate legal deposit URNs`);\n return {valid: true};\n }\n\n const f856sUrn = record.fields.filter(hasLegalDepositURN);\n\n if (f856sUrn.length > 0) {\n debug(`Record has ${f856sUrn.length} URN fields`);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n if (!isLegalDeposit || validateLD(f856sUrn)) {\n debug(`Record is valid`);\n return {valid: true};\n }\n }\n debug(`No (valid) URN fields - Record is not valid`);\n return {valid: false};\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/utils.js
CHANGED
|
@@ -43,7 +43,6 @@ function isElectronicMaterial(record) {
|
|
|
43
43
|
}
|
|
44
44
|
function nvdebug(message, func = undefined) {
|
|
45
45
|
if (func) {
|
|
46
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
47
46
|
func(message);
|
|
48
47
|
}
|
|
49
48
|
//console.info(message); // eslint-disable-line no-console
|
|
@@ -76,12 +75,11 @@ function recordToString(record) {
|
|
|
76
75
|
}
|
|
77
76
|
function removeSubfield(record, tag, subfieldCode) {
|
|
78
77
|
record.fields = record.fields.map(field => {
|
|
79
|
-
// eslint-disable-line functional/immutable-data
|
|
80
78
|
if (field.tag !== tag || !field.subfields) {
|
|
81
79
|
// Don't procss irrelevant fields
|
|
82
80
|
return field;
|
|
83
81
|
}
|
|
84
|
-
field.subfields = field.subfields.filter(sf => sf.code !== subfieldCode);
|
|
82
|
+
field.subfields = field.subfields.filter(sf => sf.code !== subfieldCode);
|
|
85
83
|
if (field.subfields.length === 0) {
|
|
86
84
|
return false;
|
|
87
85
|
}
|
|
@@ -90,14 +88,12 @@ function removeSubfield(record, tag, subfieldCode) {
|
|
|
90
88
|
}
|
|
91
89
|
function recordRemoveValuelessSubfields(record) {
|
|
92
90
|
record.fields = record.fields.map(field => {
|
|
93
|
-
// eslint-disable-line functional/immutable-data
|
|
94
91
|
if (!field.subfields) {
|
|
95
92
|
// Keep control fields
|
|
96
93
|
return field;
|
|
97
94
|
}
|
|
98
95
|
// Remove empty subfields from datafields:
|
|
99
|
-
field.subfields = field.subfields.filter(sf => sf.value);
|
|
100
|
-
|
|
96
|
+
field.subfields = field.subfields.filter(sf => sf.value);
|
|
101
97
|
if (field.subfields && field.subfields.length === 0) {
|
|
102
98
|
return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.
|
|
103
99
|
}
|
|
@@ -117,7 +113,7 @@ function fieldsToString(fields) {
|
|
|
117
113
|
return fields.map(f => fieldToString(f)).join('\t__SEPARATOR__\t');
|
|
118
114
|
}
|
|
119
115
|
function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {
|
|
120
|
-
fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));
|
|
116
|
+
fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func)); // eslint-disable-line array-callback-return
|
|
121
117
|
}
|
|
122
118
|
function isControlSubfieldCode(subfieldCode) {
|
|
123
119
|
if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {
|
|
@@ -158,7 +154,7 @@ function fieldHasNSubfields(field, subfieldCode /*, subfieldValue = null*/) {
|
|
|
158
154
|
//return subset.length;
|
|
159
155
|
}
|
|
160
156
|
function removeCopyright(value) {
|
|
161
|
-
return value.replace(/^(?:c|p|©|℗|Cop\. ?) ?((?:1[0-9][0-9][0-9]|20[012][0-9])\.?)$/ui, '$1');
|
|
157
|
+
return value.replace(/^(?:c|p|©|℗|Cop\. ?) ?((?:1[0-9][0-9][0-9]|20[012][0-9])\.?)$/ui, '$1');
|
|
162
158
|
}
|
|
163
159
|
function isNonStandardNonrepeatableSubfield(tag, subfieldCode) {
|
|
164
160
|
// Put these into config or so...
|
|
@@ -217,7 +213,7 @@ function marc21GetTagsLegalInd2Value(tag) {
|
|
|
217
213
|
return indicator.ind2;
|
|
218
214
|
}
|
|
219
215
|
function nvdebugSubfieldArray(subfields, prefix = ' ', func = undefined) {
|
|
220
|
-
subfields.forEach(subfield => nvdebug(`${prefix}${subfieldToString(subfield)}`, func));
|
|
216
|
+
subfields.forEach(subfield => nvdebug(`${prefix}${subfieldToString(subfield)}`, func)); // eslint-disable-line array-callback-return
|
|
221
217
|
}
|
|
222
218
|
function subfieldsAreIdentical(subfieldA, subfieldB) {
|
|
223
219
|
return subfieldA.code === subfieldB.code && subfieldA.value === subfieldB.value;
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["_debug","_interopRequireDefault","require","_melindaCustomMergeFields","e","__esModule","default","debug","createDebugLogger","debugDev","extend","isElectronicMaterial","record","f337s","get","length","some","f","fieldHasSubfield","nvdebug","message","func","undefined","field","subfieldCode","subfieldValue","subfields","sf","code","value","subfieldToString","normalizeIndicatorValue","val","recordToString","ldr","leader","fields","map","fieldToString","join","removeSubfield","tag","filter","recordRemoveValuelessSubfields","ind1","ind2","formatSubfields","fieldsToString","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","defaultCatalogingLanguage","field040","b","uniqArray","arr","i","indexOf","fieldsAreIdentical","field1","field2","fieldHasNSubfields","relevantSubfields","removeCopyright","replace","isNonStandardNonrepeatableSubfield","subfieldIsRepeatable","fieldSpecs","melindaFields","subfieldSpecs","subfield","repeatable","marc21GetTagsLegalIndicators","indicators","marc21GetTagsLegalInd1Value","indicator","marc21GetTagsLegalInd2Value","nvdebugSubfieldArray","subfieldsAreIdentical","subfieldA","subfieldB","fieldHasMultipleSubfields","hasCopyright","modValue"],"sources":["../src/utils.js"],"sourcesContent":["import createDebugLogger from 'debug';\n\n//import fs from 'fs';\n//import path from 'path';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nimport {melindaCustomMergeFields as melindaFields} from './melindaCustomMergeFields';\n\n//JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'melindaCustomMergeFields.json'), 'utf8'));\n\nexport function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) { // eslint-disable-line functional/no-conditional-statements\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n if (!sf.value) {\n return `‡${sf.code}`;\n }\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function recordToString(record) {\n const ldr = `LDR ${record.leader}`;\n const fields = record.fields.map(f => fieldToString(f));\n return `${ldr}\\n${fields.join('\\n')}`;\n}\n\nexport function removeSubfield(record, tag, subfieldCode) {\n record.fields = record.fields.map(field => { // eslint-disable-line functional/immutable-data\n if (field.tag !== tag || !field.subfields) { // Don't procss irrelevant fields\n return field;\n }\n field.subfields = field.subfields.filter(sf => sf.code !== subfieldCode); // eslint-disable-line functional/immutable-data\n if (field.subfields.length === 0) {\n return false;\n }\n return field;\n }).filter(field => field);\n}\n\nexport function recordRemoveValuelessSubfields(record) {\n record.fields = record.fields.map(field => { // eslint-disable-line functional/immutable-data\n if (!field.subfields) { // Keep control fields\n return field;\n }\n // Remove empty subfields from datafields:\n field.subfields = field.subfields.filter(sf => sf.value); // eslint-disable-line functional/immutable-data\n\n if (field.subfields && field.subfields.length === 0) {\n return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.\n }\n\n return field; //if field has subfields return it\n }).filter(field => field); // Filter those falses out\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record, defaultCatalogingLanguage = undefined) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return defaultCatalogingLanguage;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return defaultCatalogingLanguage;\n }\n return b.value;\n}\n\n\nexport function uniqArray(arr) {\n return arr.filter((val, i) => arr.indexOf(val) === i);\n}\n\nexport function fieldsAreIdentical(field1, field2) {\n if (field1.tag !== field2.tag) { // NB! We are skipping normalizations here on purpose! They should be done beforehand...\n return false;\n }\n return fieldToString(field1) === fieldToString(field2);\n\n // The order of subfields is relevant! Bloody JS idiotisms make people use conditions such as:\n // return field1.subfields.every(sf => field2.subfields.some(sf2 => sf.code === sf2.code && sf.value === sf2.value));\n}\n\nexport function fieldHasNSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n const relevantSubfields = field.subfields.filter(sf => sf.code === subfieldCode);\n //if (subfieldValue === null) {\n return relevantSubfields.length;\n //}\n //const subset = relevantSubfields.filter(value => value === subfieldValue);\n //return subset.length;\n}\n\nexport function removeCopyright(value) {\n return value.replace(/^(?:c|p|©|℗|Cop\\. ?) ?((?:1[0-9][0-9][0-9]|20[012][0-9])\\.?)$/ui, '$1'); // eslint-disable-line prefer-named-capture-group\n}\n\nfunction isNonStandardNonrepeatableSubfield(tag, subfieldCode) {\n // Put these into config or so...\n if (tag === '264') {\n return ['a', 'b', 'c'].includes(subfieldCode);\n }\n\n if (['336', '337', '338'].includes(tag)) {\n return ['a', 'b', '2'].includes(subfieldCode);\n }\n\n return false;\n}\n\n\nexport function subfieldIsRepeatable(tag, subfieldCode) {\n\n if (isNonStandardNonrepeatableSubfield(tag, subfieldCode)) {\n return false;\n }\n\n // These we know or \"know\":\n // NB! $5 is (according to MARC21 format) non-repeatable, and not usable in all fields, but Melinda has a local exception to this, see MET-300\n if ('0159'.indexOf(subfieldCode) > -1) {\n // Uh, can $0 appear on any field?\n return true;\n }\n\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length !== 1) {\n nvdebug(` WARNING! Getting field ${tag} data failed! ${fieldSpecs.length} hits. Default value true is used for'${subfieldCode}' .`, debugDev);\n return true;\n }\n\n const subfieldSpecs = fieldSpecs[0].subfields.filter(subfield => subfield.code === subfieldCode);\n // Currently we don't support multiple $6 fields due to re-indexing limitations...\n // Well, $6 is non-repeatable, isn't it?!?\n // (This might actually already be fixed... Marginal issue, but check eventually.)\n if (subfieldSpecs.length !== 1 || subfieldCode === '6') {\n return false; // repeatable if not specified, I guess. Maybe add log or warn?\n }\n return subfieldSpecs[0].repeatable;\n}\n\nfunction marc21GetTagsLegalIndicators(tag) {\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length === 0) {\n return undefined;\n }\n return fieldSpecs[0].indicators;\n}\n\nexport function marc21GetTagsLegalInd1Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind1;\n}\n\nexport function marc21GetTagsLegalInd2Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind2;\n}\n\nexport function nvdebugSubfieldArray(subfields, prefix = ' ', func = undefined) {\n subfields.forEach(subfield => nvdebug(`${prefix}${subfieldToString(subfield)}`, func));\n}\n\nexport function subfieldsAreIdentical(subfieldA, subfieldB) {\n return subfieldA.code === subfieldB.code && subfieldA.value === subfieldB.value;\n}\n\nexport function fieldHasMultipleSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n return fieldHasNSubfields(field, subfieldCode) > 1;\n}\n\nexport function hasCopyright(value) {\n const modValue = removeCopyright(value);\n return value !== modValue;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"utils.js","names":["_debug","_interopRequireDefault","require","_melindaCustomMergeFields","e","__esModule","default","debug","createDebugLogger","debugDev","extend","isElectronicMaterial","record","f337s","get","length","some","f","fieldHasSubfield","nvdebug","message","func","undefined","field","subfieldCode","subfieldValue","subfields","sf","code","value","subfieldToString","normalizeIndicatorValue","val","recordToString","ldr","leader","fields","map","fieldToString","join","removeSubfield","tag","filter","recordRemoveValuelessSubfields","ind1","ind2","formatSubfields","fieldsToString","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","defaultCatalogingLanguage","field040","b","uniqArray","arr","i","indexOf","fieldsAreIdentical","field1","field2","fieldHasNSubfields","relevantSubfields","removeCopyright","replace","isNonStandardNonrepeatableSubfield","subfieldIsRepeatable","fieldSpecs","melindaFields","subfieldSpecs","subfield","repeatable","marc21GetTagsLegalIndicators","indicators","marc21GetTagsLegalInd1Value","indicator","marc21GetTagsLegalInd2Value","nvdebugSubfieldArray","subfieldsAreIdentical","subfieldA","subfieldB","fieldHasMultipleSubfields","hasCopyright","modValue"],"sources":["../src/utils.js"],"sourcesContent":["import createDebugLogger from 'debug';\n\n//import fs from 'fs';\n//import path from 'path';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nimport {melindaCustomMergeFields as melindaFields} from './melindaCustomMergeFields';\n\n//JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'melindaCustomMergeFields.json'), 'utf8'));\n\nexport function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) {\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n if (!sf.value) {\n return `‡${sf.code}`;\n }\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function recordToString(record) {\n const ldr = `LDR ${record.leader}`;\n const fields = record.fields.map(f => fieldToString(f));\n return `${ldr}\\n${fields.join('\\n')}`;\n}\n\nexport function removeSubfield(record, tag, subfieldCode) {\n record.fields = record.fields.map(field => {\n if (field.tag !== tag || !field.subfields) { // Don't procss irrelevant fields\n return field;\n }\n field.subfields = field.subfields.filter(sf => sf.code !== subfieldCode);\n if (field.subfields.length === 0) {\n return false;\n }\n return field;\n }).filter(field => field);\n}\n\nexport function recordRemoveValuelessSubfields(record) {\n record.fields = record.fields.map(field => {\n if (!field.subfields) { // Keep control fields\n return field;\n }\n // Remove empty subfields from datafields:\n field.subfields = field.subfields.filter(sf => sf.value);\n\n if (field.subfields && field.subfields.length === 0) {\n return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.\n }\n\n return field; //if field has subfields return it\n }).filter(field => field); // Filter those falses out\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func)); // eslint-disable-line array-callback-return\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record, defaultCatalogingLanguage = undefined) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return defaultCatalogingLanguage;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return defaultCatalogingLanguage;\n }\n return b.value;\n}\n\n\nexport function uniqArray(arr) {\n return arr.filter((val, i) => arr.indexOf(val) === i);\n}\n\nexport function fieldsAreIdentical(field1, field2) {\n if (field1.tag !== field2.tag) { // NB! We are skipping normalizations here on purpose! They should be done beforehand...\n return false;\n }\n return fieldToString(field1) === fieldToString(field2);\n\n // The order of subfields is relevant! Bloody JS idiotisms make people use conditions such as:\n // return field1.subfields.every(sf => field2.subfields.some(sf2 => sf.code === sf2.code && sf.value === sf2.value));\n}\n\nexport function fieldHasNSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n const relevantSubfields = field.subfields.filter(sf => sf.code === subfieldCode);\n //if (subfieldValue === null) {\n return relevantSubfields.length;\n //}\n //const subset = relevantSubfields.filter(value => value === subfieldValue);\n //return subset.length;\n}\n\nexport function removeCopyright(value) {\n return value.replace(/^(?:c|p|©|℗|Cop\\. ?) ?((?:1[0-9][0-9][0-9]|20[012][0-9])\\.?)$/ui, '$1');\n}\n\nfunction isNonStandardNonrepeatableSubfield(tag, subfieldCode) {\n // Put these into config or so...\n if (tag === '264') {\n return ['a', 'b', 'c'].includes(subfieldCode);\n }\n\n if (['336', '337', '338'].includes(tag)) {\n return ['a', 'b', '2'].includes(subfieldCode);\n }\n\n return false;\n}\n\n\nexport function subfieldIsRepeatable(tag, subfieldCode) {\n\n if (isNonStandardNonrepeatableSubfield(tag, subfieldCode)) {\n return false;\n }\n\n // These we know or \"know\":\n // NB! $5 is (according to MARC21 format) non-repeatable, and not usable in all fields, but Melinda has a local exception to this, see MET-300\n if ('0159'.indexOf(subfieldCode) > -1) {\n // Uh, can $0 appear on any field?\n return true;\n }\n\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length !== 1) {\n nvdebug(` WARNING! Getting field ${tag} data failed! ${fieldSpecs.length} hits. Default value true is used for'${subfieldCode}' .`, debugDev);\n return true;\n }\n\n const subfieldSpecs = fieldSpecs[0].subfields.filter(subfield => subfield.code === subfieldCode);\n // Currently we don't support multiple $6 fields due to re-indexing limitations...\n // Well, $6 is non-repeatable, isn't it?!?\n // (This might actually already be fixed... Marginal issue, but check eventually.)\n if (subfieldSpecs.length !== 1 || subfieldCode === '6') {\n return false; // repeatable if not specified, I guess. Maybe add log or warn?\n }\n return subfieldSpecs[0].repeatable;\n}\n\nfunction marc21GetTagsLegalIndicators(tag) {\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length === 0) {\n return undefined;\n }\n return fieldSpecs[0].indicators;\n}\n\nexport function marc21GetTagsLegalInd1Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind1;\n}\n\nexport function marc21GetTagsLegalInd2Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind2;\n}\n\nexport function nvdebugSubfieldArray(subfields, prefix = ' ', func = undefined) {\n subfields.forEach(subfield => nvdebug(`${prefix}${subfieldToString(subfield)}`, func)); // eslint-disable-line array-callback-return\n}\n\nexport function subfieldsAreIdentical(subfieldA, subfieldB) {\n return subfieldA.code === subfieldB.code && subfieldA.value === subfieldB.value;\n}\n\nexport function fieldHasMultipleSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n return fieldHasNSubfields(field, subfieldCode) > 1;\n}\n\nexport function hasCopyright(value) {\n const modValue = removeCopyright(value);\n return value !== modValue;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Eslint configuration object for src
|
|
2
|
+
const configSrc = {
|
|
3
|
+
files: [
|
|
4
|
+
"src/*"
|
|
5
|
+
],
|
|
6
|
+
linterOptions: {
|
|
7
|
+
reportUnusedDisableDirectives: true,
|
|
8
|
+
},
|
|
9
|
+
rules: {
|
|
10
|
+
"no-console": "warn",
|
|
11
|
+
"eqeqeq": ["error", "always"],
|
|
12
|
+
"no-const-assign": "error",
|
|
13
|
+
"max-depth": ["warn", 4],
|
|
14
|
+
"max-lines": ["warn", 500],
|
|
15
|
+
"max-lines-per-function": ["warn", {"max": 100}],
|
|
16
|
+
"no-else-return": ["error", {allowElseIf: false}],
|
|
17
|
+
"no-plusplus": [
|
|
18
|
+
"error",
|
|
19
|
+
{
|
|
20
|
+
"allowForLoopAfterthoughts": true
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"array-callback-return": [
|
|
24
|
+
"error",
|
|
25
|
+
{
|
|
26
|
+
"checkForEach": true
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"no-unused-vars": [
|
|
30
|
+
"error",
|
|
31
|
+
{
|
|
32
|
+
"argsIgnorePattern": "next"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"no-warning-comments": "off"
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// Eslint configuration object for globally ignoring .js files
|
|
40
|
+
// - ignore all files that start with a dot
|
|
41
|
+
// - ignore all files inside directories named 'dist'
|
|
42
|
+
const configIgnores = {
|
|
43
|
+
ignores: [
|
|
44
|
+
"coverage",
|
|
45
|
+
"**/.*",
|
|
46
|
+
"**/dist/"
|
|
47
|
+
]
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export default [
|
|
51
|
+
configSrc,
|
|
52
|
+
configIgnores
|
|
53
|
+
];
|
package/package.json
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"url": "git@github.com:natlibfi/marc-record-validators-melinda.git"
|
|
15
15
|
},
|
|
16
16
|
"license": "MIT",
|
|
17
|
-
"version": "11.6.
|
|
17
|
+
"version": "11.6.7",
|
|
18
18
|
"main": "./dist/index.js",
|
|
19
19
|
"publishConfig": {
|
|
20
20
|
"access": "public"
|
|
@@ -39,16 +39,16 @@
|
|
|
39
39
|
"comment-sfs4900": "Package sfs-4900 npm version is 1.1.0, github 1.1.3.",
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@natlibfi/issn-verify": "^1.0.6",
|
|
42
|
-
"@natlibfi/marc-record": "^9.1.
|
|
42
|
+
"@natlibfi/marc-record": "^9.1.6",
|
|
43
43
|
"@natlibfi/marc-record-serializers": "^10.1.6",
|
|
44
44
|
"@natlibfi/marc-record-validate": "^8.0.14",
|
|
45
|
-
"@natlibfi/melinda-commons": "^13.0.
|
|
45
|
+
"@natlibfi/melinda-commons": "^13.0.21",
|
|
46
46
|
"@natlibfi/sfs-4900": "github:NatLibFi/sfs-4900",
|
|
47
47
|
"@natlibfi/sru-client": "^6.0.18",
|
|
48
48
|
"cld3-asm": "^4.0.0",
|
|
49
49
|
"clone": "^2.1.2",
|
|
50
50
|
"debug": "^4.4.0",
|
|
51
|
-
"isbn3": "^1.2.
|
|
51
|
+
"isbn3": "^1.2.13",
|
|
52
52
|
"iso9_1995": "^0.0.2",
|
|
53
53
|
"langs": "^2.0.0",
|
|
54
54
|
"node-fetch": "^2.7.0",
|
|
@@ -59,22 +59,21 @@
|
|
|
59
59
|
"@natlibfi/marc-record-validate": "^8.0.14"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
|
-
"@babel/cli": "^7.
|
|
63
|
-
"@babel/core": "^7.
|
|
64
|
-
"@babel/preset-env": "^7.
|
|
62
|
+
"@babel/cli": "^7.28.0",
|
|
63
|
+
"@babel/core": "^7.28.0",
|
|
64
|
+
"@babel/preset-env": "^7.28.0",
|
|
65
65
|
"@babel/register": "^7.27.1",
|
|
66
|
-
"@babel/runtime": "^7.
|
|
67
|
-
"@natlibfi/
|
|
68
|
-
"@natlibfi/
|
|
69
|
-
"@natlibfi/fixura": "^3.0.13",
|
|
66
|
+
"@babel/runtime": "^7.28.2",
|
|
67
|
+
"@natlibfi/fixugen": "^2.0.15",
|
|
68
|
+
"@natlibfi/fixura": "^3.0.14",
|
|
70
69
|
"babel-plugin-istanbul": "^7.0.0",
|
|
71
70
|
"babel-plugin-rewire": "^1.2.0",
|
|
72
71
|
"chai": "^4.5.0",
|
|
73
72
|
"chai-as-promised": "^7.1.2",
|
|
74
73
|
"cross-env": "^7.0.3",
|
|
75
|
-
"eslint": "^
|
|
74
|
+
"eslint": "^9.33.0",
|
|
76
75
|
"fetch-mock": "^11.1.5",
|
|
77
|
-
"mocha": "^11.
|
|
76
|
+
"mocha": "^11.7.1",
|
|
78
77
|
"nyc": "^17.1.0"
|
|
79
78
|
},
|
|
80
79
|
"overrides": {
|
package/src/access-rights.js
CHANGED
|
@@ -9,7 +9,7 @@ export default function (isViolaRecord = false) {
|
|
|
9
9
|
// If printed do nothing
|
|
10
10
|
|
|
11
11
|
// If material is electronic add theis if missing
|
|
12
|
-
if (!hasTag(record, '506', sf506) && !hasTag(record, '506', sf506old)) {
|
|
12
|
+
if (!hasTag(record, '506', sf506) && !hasTag(record, '506', sf506old)) {
|
|
13
13
|
const subfield9 = isViolaRecord ? [{code: '9', value: 'VIOLA<KEEP>'}] : [{code: '9', value: 'FENNI<KEEP>'}];
|
|
14
14
|
const staticSubfields = [
|
|
15
15
|
{
|
|
@@ -35,14 +35,14 @@ export default function (isViolaRecord = false) {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
// Change phrase from old to new if field with old phrase is found
|
|
38
|
-
if (!hasTag(record, '506', sf506) && hasTag(record, '506', sf506old)) {
|
|
39
|
-
record.fields
|
|
38
|
+
if (!hasTag(record, '506', sf506) && hasTag(record, '506', sf506old)) {
|
|
39
|
+
record.fields
|
|
40
40
|
.find(f => f.tag === '506' && sf506old.every(({code, value}) => f.subfields.some(sf => sf.code === code && value.test(sf.value))))
|
|
41
41
|
.subfields.find(sf => sf506old.every(({code, value}) => sf.code === code && value.test(sf.value)))
|
|
42
42
|
.value = 'Aineisto on käytettävissä vapaakappaletyöasemilla.';
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
if (!hasTag(record, '540', sf540) && !isViolaRecord) {
|
|
45
|
+
if (!hasTag(record, '540', sf540) && !isViolaRecord) {
|
|
46
46
|
record.insertField({
|
|
47
47
|
tag: '540',
|
|
48
48
|
subfields: [
|
|
@@ -21,7 +21,7 @@ export default function () {
|
|
|
21
21
|
// 336 ## ‡a tietokoneohjelma ‡b cop ‡2 rdacontent
|
|
22
22
|
const res = {message: [], fix: [], valid: true};
|
|
23
23
|
if (newFields.length) {
|
|
24
|
-
newFields.forEach(f => record.insertField(f));
|
|
24
|
+
newFields.forEach(f => record.insertField(f)); // eslint-disable-line array-callback-return
|
|
25
25
|
return res;
|
|
26
26
|
}
|
|
27
27
|
return res;
|
|
@@ -50,15 +50,15 @@ export default function () {
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
// Update LDR/17 to '4'
|
|
53
|
-
record.leader = `${record.leader.substring(0, 17)}4${record.leader.substring(18, 24)}`;
|
|
53
|
+
record.leader = `${record.leader.substring(0, 17)}4${record.leader.substring(18, 24)}`;
|
|
54
54
|
|
|
55
55
|
// Remove unwanted fields:
|
|
56
|
-
record.fields = record.fields.filter(f => !dropTags.includes(f.tag));
|
|
56
|
+
record.fields = record.fields.filter(f => !dropTags.includes(f.tag));
|
|
57
57
|
|
|
58
58
|
removeSubfield(record, '020', 'c');
|
|
59
59
|
|
|
60
60
|
// Remove 084 fields that don't have $2 ykl (based on USEMARCON-RDA/bw_rda_kyril.rul code by LL 2019)
|
|
61
|
-
record.fields = record.fields.filter(f => f.tag !== '084' || f.subfields.some(sf => sf.code === '2' && sf.value === 'ykl'));
|
|
61
|
+
record.fields = record.fields.filter(f => f.tag !== '084' || f.subfields.some(sf => sf.code === '2' && sf.value === 'ykl'));
|
|
62
62
|
|
|
63
63
|
fieldSpecificStuff(record.fields);
|
|
64
64
|
|
|
@@ -93,7 +93,7 @@ export default function () {
|
|
|
93
93
|
|
|
94
94
|
function field100eKirjoittaja(f) { // LL 2019 USEMARCON-RDA rule
|
|
95
95
|
if (f.tag === '100' && !fieldHasSubfield(f, 'e') && record.isBK()) {
|
|
96
|
-
f.subfields = [{code: 'e', value: 'kirjoittaja.'}, ...f.subfields];
|
|
96
|
+
f.subfields = [{code: 'e', value: 'kirjoittaja.'}, ...f.subfields];
|
|
97
97
|
sortAdjacentSubfields(f);
|
|
98
98
|
// Punctuation will be done later on...
|
|
99
99
|
return;
|
|
@@ -121,7 +121,7 @@ export default function () {
|
|
|
121
121
|
|
|
122
122
|
// Field 028: use $b$a, not $a$b:
|
|
123
123
|
const f028 = record.fields.filter(f => f.tag === '028');
|
|
124
|
-
f028.forEach(f => sortAdjacentSubfields(f));
|
|
124
|
+
f028.forEach(f => sortAdjacentSubfields(f)); // eslint-disable-line array-callback-return
|
|
125
125
|
|
|
126
126
|
add041().fix(record);
|
|
127
127
|
|
|
@@ -187,12 +187,12 @@ function fixField040(record) {
|
|
|
187
187
|
return;
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
f040.forEach(f => fixField040Subfields(f));
|
|
190
|
+
f040.forEach(f => fixField040Subfields(f)); // eslint-disable-line array-callback-return
|
|
191
191
|
|
|
192
192
|
function fixField040Subfields(field) {
|
|
193
|
-
field.subfields = field.subfields.filter(sf => !['b', 'e'].includes(sf.code));
|
|
194
|
-
field.subfields.push(subfieldsBE[0]);
|
|
195
|
-
field.subfields.push(subfieldsBE[1]);
|
|
193
|
+
field.subfields = field.subfields.filter(sf => !['b', 'e'].includes(sf.code));
|
|
194
|
+
field.subfields.push(subfieldsBE[0]);
|
|
195
|
+
field.subfields.push(subfieldsBE[1]);
|
|
196
196
|
sortAdjacentSubfields(field); // put $b and $e to their proper places
|
|
197
197
|
}
|
|
198
198
|
|
|
@@ -203,13 +203,13 @@ export function removeFromOldCatalog(field) {
|
|
|
203
203
|
return;
|
|
204
204
|
}
|
|
205
205
|
// See https://catalog.loc.gov/vwebv/ui/en_US/htdocs/help/faqs.html for motivation
|
|
206
|
-
field.subfields?.forEach(sf => removeFromOldCatalogFromSubfield(sf));
|
|
206
|
+
field.subfields?.forEach(sf => removeFromOldCatalogFromSubfield(sf)); // eslint-disable-line array-callback-return
|
|
207
207
|
|
|
208
208
|
function removeFromOldCatalogFromSubfield(subfield) {
|
|
209
209
|
if (!subfield.value.includes('[from old catalog]')) {
|
|
210
210
|
return;
|
|
211
211
|
}
|
|
212
|
-
subfield.value = subfield.value.replace(/ *\[from old catalog\]/gui, '');
|
|
212
|
+
subfield.value = subfield.value.replace(/ *\[from old catalog\]/gui, '');
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
|
|
@@ -220,7 +220,7 @@ function removeSubfieldH(field) {
|
|
|
220
220
|
|
|
221
221
|
const filteredFields = field.subfields.filter(sf => sf.code !== 'h');
|
|
222
222
|
if (filteredFields.length > 0) {
|
|
223
|
-
field.subfields = filteredFields;
|
|
223
|
+
field.subfields = filteredFields;
|
|
224
224
|
return;
|
|
225
225
|
}
|
|
226
226
|
|
|
@@ -234,11 +234,11 @@ export function removeOwnershipSubfield5(field) {
|
|
|
234
234
|
if (remainingSubfields.length === 0) { // sanity check/robustness
|
|
235
235
|
return;
|
|
236
236
|
}
|
|
237
|
-
field.subfields = remainingSubfields;
|
|
237
|
+
field.subfields = remainingSubfields;
|
|
238
238
|
}
|
|
239
239
|
|
|
240
240
|
export function fixLeader(record) {
|
|
241
|
-
record.leader = `${record.leader.substring(0, 9)}a22${record.leader.substring(12, 18)}i${record.leader.substring(19, 20)}4500`;
|
|
241
|
+
record.leader = `${record.leader.substring(0, 9)}a22${record.leader.substring(12, 18)}i${record.leader.substring(19, 20)}4500`;
|
|
242
242
|
}
|
|
243
243
|
|
|
244
244
|
function field410To490And810(field, record) { // might be generic... if so, move to utils...
|
|
@@ -248,15 +248,15 @@ function field410To490And810(field, record) { // might be generic... if so, move
|
|
|
248
248
|
|
|
249
249
|
const field810 = clone(field);
|
|
250
250
|
|
|
251
|
-
field.tag = '490';
|
|
252
|
-
field.ind1 = '1';
|
|
253
|
-
field.ind2 = ' ';
|
|
251
|
+
field.tag = '490';
|
|
252
|
+
field.ind1 = '1';
|
|
253
|
+
field.ind2 = ' ';
|
|
254
254
|
sortAdjacentSubfields(field);
|
|
255
255
|
// 490: Fix punctuation elsewhere. (Note that the current support is lagging...)
|
|
256
256
|
|
|
257
257
|
|
|
258
|
-
field810.tag = '810';
|
|
259
|
-
field810.ind2 = ' ';
|
|
258
|
+
field810.tag = '810';
|
|
259
|
+
field810.ind2 = ' ';
|
|
260
260
|
// 810: Fix punctuation elsewhere. (Note that the current support is lagging...)
|
|
261
261
|
record.insertField(field810);
|
|
262
262
|
}
|
|
@@ -268,11 +268,11 @@ function field440To490And830(field, record) { // might be generic... if so, move
|
|
|
268
268
|
|
|
269
269
|
const field830 = clone(field);
|
|
270
270
|
|
|
271
|
-
field.tag = '490';
|
|
272
|
-
field.ind1 = '1';
|
|
273
|
-
field.ind2 = ' ';
|
|
271
|
+
field.tag = '490';
|
|
272
|
+
field.ind1 = '1';
|
|
273
|
+
field.ind2 = ' ';
|
|
274
274
|
// 490: Fix punctuation elsewhere. (Note that the current support is lagging...)
|
|
275
|
-
field830.tag = '830';
|
|
275
|
+
field830.tag = '830';
|
|
276
276
|
// 830: Fix punctuation elsewhere. (Note that the current support is lagging...)
|
|
277
277
|
record.insertField(field830);
|
|
278
278
|
}
|
|
@@ -290,9 +290,9 @@ function field260To264s(field, record) { // might be generic... if so, move to u
|
|
|
290
290
|
|
|
291
291
|
createCopyright264Field(field);
|
|
292
292
|
|
|
293
|
-
field.tag = '264';
|
|
294
|
-
field.ind1 = ' ';
|
|
295
|
-
field.ind2 = '1';
|
|
293
|
+
field.tag = '264';
|
|
294
|
+
field.ind1 = ' ';
|
|
295
|
+
field.ind2 = '1';
|
|
296
296
|
|
|
297
297
|
// NB! Usemarcon does not handle 260$e$f$g => 264$a$b$c, so I'm not botherin with it either... (However, we could check our merge reducer code...)
|
|
298
298
|
|
|
@@ -303,10 +303,10 @@ function field260To264s(field, record) { // might be generic... if so, move to u
|
|
|
303
303
|
return false;
|
|
304
304
|
}
|
|
305
305
|
|
|
306
|
-
field.subfields?.forEach(sf => field260To264Normalization(sf));
|
|
306
|
+
field.subfields?.forEach(sf => field260To264Normalization(sf)); // eslint-disable-line array-callback-return
|
|
307
307
|
|
|
308
308
|
function field260To264Normalization(subfield) {
|
|
309
|
-
subfield.value = field260To264Normalization2(subfield);
|
|
309
|
+
subfield.value = field260To264Normalization2(subfield);
|
|
310
310
|
}
|
|
311
311
|
|
|
312
312
|
function createCopyright264Value(field) {
|
|
@@ -322,7 +322,7 @@ function field260To264s(field, record) { // might be generic... if so, move to u
|
|
|
322
322
|
const copType = c.value.match(/(?:^\[?p|℗)/u) ? '℗' : '©';
|
|
323
323
|
const returnValue = c.value.includes('[') ? `[${copType}${copyrightYear}]` : `${copType}${copyrightYear}`;
|
|
324
324
|
// Moidy the original value:
|
|
325
|
-
c.value = `[${copyrightYear}]`;
|
|
325
|
+
c.value = `[${copyrightYear}]`;
|
|
326
326
|
return returnValue;
|
|
327
327
|
}
|
|
328
328
|
|
|
@@ -365,12 +365,12 @@ function handle505(field) {
|
|
|
365
365
|
return;
|
|
366
366
|
}
|
|
367
367
|
// Don't know how/why usemarcon-cyrillux is so sure about ind1...
|
|
368
|
-
field.ind1 = '0';
|
|
368
|
+
field.ind1 = '0';
|
|
369
369
|
// usemarcon-cyrillux drops irrelevant subfields, so we do the same. However, we have included some control subfields in the kept side:
|
|
370
370
|
const keptSubfields = field.subfields.filter(sf => ['a', 'g', 'r', 't', 'u', '6', '8', '9'].includes(sf.code));
|
|
371
371
|
|
|
372
372
|
if (keptSubfields.some(sf => ['a', 'g', 'r', 't', 'u'].includes(sf.code))) {
|
|
373
|
-
field.subfields = keptSubfields;
|
|
373
|
+
field.subfields = keptSubfields;
|
|
374
374
|
return;
|
|
375
375
|
}
|
|
376
376
|
}
|
|
@@ -380,15 +380,15 @@ function translateFieldToFinnish(field) {
|
|
|
380
380
|
if (!['020', '300'].includes(field.tag)) {
|
|
381
381
|
return;
|
|
382
382
|
}
|
|
383
|
-
field.subfields?.forEach(sf => translateSubfieldToFinnish(sf));
|
|
383
|
+
field.subfields?.forEach(sf => translateSubfieldToFinnish(sf)); // eslint-disable-line array-callback-return
|
|
384
384
|
|
|
385
385
|
function translateSubfieldToFinnish(subfield) {
|
|
386
386
|
if (field.tag === '020' && ['a', 'q', 'z'].includes(subfield.code)) {
|
|
387
|
-
subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value))));
|
|
387
|
+
subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value))));
|
|
388
388
|
return;
|
|
389
389
|
}
|
|
390
390
|
if (field.tag === '300') {
|
|
391
|
-
subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value))));
|
|
391
|
+
subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value))));
|
|
392
392
|
return;
|
|
393
393
|
}
|
|
394
394
|
}
|
|
@@ -424,7 +424,7 @@ function expandFinnishAbbreviations(value) {
|
|
|
424
424
|
replace(/\bnid\./gu, 'nidottu').replace(/\bnid\b/gui, 'nidottu').
|
|
425
425
|
replace(/\bsid\./gu, 'sidottu').replace(/\bsid\b/gui, 'sidottu').
|
|
426
426
|
replace(/\bverkkojulk\.\b/gu, 'verkkojulkaisu').replace(/\bverkkojulk\b/gu, 'verkkojulkaisu').
|
|
427
|
-
replace(/^\(([^)]+)\)$/u, '$1');
|
|
427
|
+
replace(/^\(([^)]+)\)$/u, '$1');
|
|
428
428
|
// <- removal of brackets above could use a better location
|
|
429
429
|
}
|
|
430
430
|
|
|
@@ -443,9 +443,9 @@ function finnishTranslationsAndMappings(value) {
|
|
|
443
443
|
replace(/\bbilaga\b/gui, 'liite').
|
|
444
444
|
replace(/\bbilagor\b/gui, 'liitettä').
|
|
445
445
|
// https://github.com/NatLibFi/USEMARCON-BOOKWHERE-RDA/blob/master/bw_rda_kyril.rul#L365
|
|
446
|
-
replace(/(\b1\]?) с\./gui, '$1 sivu').
|
|
447
|
-
replace(/(\d\]?) с\./gui, '$1 sivua').
|
|
448
|
-
replace(/(\d) см/gui, '$1 cm').
|
|
446
|
+
replace(/(\b1\]?) с\./gui, '$1 sivu').
|
|
447
|
+
replace(/(\d\]?) с\./gui, '$1 sivua').
|
|
448
|
+
replace(/(\d) см/gui, '$1 cm').
|
|
449
449
|
|
|
450
450
|
replace(/\bcharts\b/gui, 'kaavioita').
|
|
451
451
|
replace('chiefly color illustrations', 'pääosin värikuvitettu').
|