@natlibfi/marc-record-validators-melinda 11.2.1 → 11.2.2-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-rights.spec.js +1 -1
- package/dist/access-rights.spec.js.map +1 -1
- package/dist/addMissingField041.js.map +1 -1
- package/dist/addMissingField041.spec.js +1 -1
- package/dist/addMissingField041.spec.js.map +1 -1
- package/dist/addMissingField336.js.map +1 -1
- package/dist/addMissingField336.spec.js +1 -1
- package/dist/addMissingField336.spec.js.map +1 -1
- package/dist/addMissingField337.js.map +1 -1
- package/dist/addMissingField337.spec.js +1 -1
- package/dist/addMissingField337.spec.js.map +1 -1
- package/dist/addMissingField338.js.map +1 -1
- package/dist/addMissingField338.spec.js +1 -1
- package/dist/addMissingField338.spec.js.map +1 -1
- package/dist/cyrillux-usemarcon-replacement.js +82 -22
- package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
- package/dist/cyrillux-usemarcon-replacement.spec.js +1 -1
- package/dist/cyrillux-usemarcon-replacement.spec.js.map +1 -1
- package/dist/double-commas.spec.js +1 -1
- package/dist/double-commas.spec.js.map +1 -1
- package/dist/duplicates-ind1.js.map +1 -1
- package/dist/duplicates-ind1.spec.js +1 -1
- package/dist/duplicates-ind1.spec.js.map +1 -1
- package/dist/empty-fields.js.map +1 -1
- package/dist/empty-fields.spec.js +1 -1
- package/dist/empty-fields.spec.js.map +1 -1
- package/dist/ending-punctuation.js +1 -1
- package/dist/ending-punctuation.js.map +1 -1
- package/dist/ending-punctuation.spec.js +1 -1
- package/dist/ending-punctuation.spec.js.map +1 -1
- package/dist/ending-whitespace.js.map +1 -1
- package/dist/ending-whitespace.spec.js +1 -1
- package/dist/ending-whitespace.spec.js.map +1 -1
- package/dist/field-008-18-34-character-groups.js +1 -1
- package/dist/field-008-18-34-character-groups.js.map +1 -1
- package/dist/field-008-18-34-character-groups.spec.js +1 -1
- package/dist/field-008-18-34-character-groups.spec.js.map +1 -1
- package/dist/field-505-separators.js +1 -1
- package/dist/field-505-separators.js.map +1 -1
- package/dist/field-505-separators.spec.js +1 -1
- package/dist/field-505-separators.spec.js.map +1 -1
- package/dist/field-521-fix.js +1 -1
- package/dist/field-521-fix.js.map +1 -1
- package/dist/field-521-fix.spec.js +1 -1
- package/dist/field-521-fix.spec.js.map +1 -1
- package/dist/field-exclusion.js.map +1 -1
- package/dist/field-exclusion.spec.js +1 -1
- package/dist/field-exclusion.spec.js.map +1 -1
- package/dist/field-structure.js.map +1 -1
- package/dist/field-structure.spec.js +1 -1
- package/dist/field-structure.spec.js.map +1 -1
- package/dist/fields-present.spec.js +1 -1
- package/dist/fields-present.spec.js.map +1 -1
- package/dist/fix-33X.js +1 -1
- package/dist/fix-33X.js.map +1 -1
- package/dist/fix-33X.spec.js +1 -1
- package/dist/fix-33X.spec.js.map +1 -1
- package/dist/fix-country-codes.js.map +1 -1
- package/dist/fix-country-codes.spec.js +1 -1
- package/dist/fix-country-codes.spec.js.map +1 -1
- package/dist/fix-language-codes.js +1 -1
- package/dist/fix-language-codes.js.map +1 -1
- package/dist/fix-language-codes.spec.js +1 -1
- package/dist/fix-language-codes.spec.js.map +1 -1
- package/dist/fixRelatorTerms.js +6 -3
- package/dist/fixRelatorTerms.js.map +1 -1
- package/dist/fixRelatorTerms.spec.js +1 -1
- package/dist/fixRelatorTerms.spec.js.map +1 -1
- package/dist/fixed-fields.js.map +1 -1
- package/dist/fixed-fields.spec.js +1 -1
- package/dist/fixed-fields.spec.js.map +1 -1
- package/dist/identical-fields.js.map +1 -1
- package/dist/identical-fields.spec.js +1 -1
- package/dist/identical-fields.spec.js.map +1 -1
- package/dist/index.js +66 -3
- package/dist/index.js.map +1 -1
- package/dist/indicator-fixes.js +17 -0
- package/dist/indicator-fixes.js.map +1 -1
- package/dist/indicator-fixes.spec.js +1 -1
- package/dist/indicator-fixes.spec.js.map +1 -1
- package/dist/isbn-issn.js +1 -1
- package/dist/isbn-issn.js.map +1 -1
- package/dist/isbn-issn.spec.js +1 -1
- package/dist/isbn-issn.spec.js.map +1 -1
- package/dist/item-language.js +1 -1
- package/dist/item-language.js.map +1 -1
- package/dist/item-language.spec.js +1 -1
- package/dist/item-language.spec.js.map +1 -1
- package/dist/mergeField500Lisapainokset.js.map +1 -1
- package/dist/mergeField500Lisapainokset.spec.js +1 -1
- package/dist/mergeField500Lisapainokset.spec.js.map +1 -1
- package/dist/mergeRelatorTermFields.js +1 -1
- package/dist/mergeRelatorTermFields.js.map +1 -1
- package/dist/mergeRelatorTermFields.spec.js +1 -1
- package/dist/mergeRelatorTermFields.spec.js.map +1 -1
- package/dist/multiple-subfield-0.js.map +1 -1
- package/dist/multiple-subfield-0.spec.js +1 -1
- package/dist/multiple-subfield-0.spec.js.map +1 -1
- package/dist/non-breaking-space.js.map +1 -1
- package/dist/non-breaking-space.spec.js +1 -1
- package/dist/non-breaking-space.spec.js.map +1 -1
- package/dist/normalize-dashes.js +1 -1
- package/dist/normalize-dashes.js.map +1 -1
- package/dist/normalize-dashes.spec.js +1 -1
- package/dist/normalize-dashes.spec.js.map +1 -1
- package/dist/normalize-identifiers.js +1 -1
- package/dist/normalize-identifiers.js.map +1 -1
- package/dist/normalize-identifiers.spec.js +1 -1
- package/dist/normalize-identifiers.spec.js.map +1 -1
- package/dist/normalize-qualifying-information.js +1 -1
- package/dist/normalize-qualifying-information.js.map +1 -1
- package/dist/normalize-qualifying-information.spec.js +1 -1
- package/dist/normalize-qualifying-information.spec.js.map +1 -1
- package/dist/normalize-utf8-diacritics.js +1 -1
- package/dist/normalize-utf8-diacritics.js.map +1 -1
- package/dist/normalize-utf8-diacritics.spec.js +1 -1
- package/dist/normalize-utf8-diacritics.spec.js.map +1 -1
- package/dist/normalizeFieldForComparison.js +1 -1
- package/dist/normalizeFieldForComparison.js.map +1 -1
- package/dist/normalizeSubfieldValueForComparison.js +1 -1
- package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
- package/dist/prepublicationUtils.js +1 -1
- package/dist/prepublicationUtils.js.map +1 -1
- package/dist/punctuation/index.js +1 -1
- package/dist/punctuation/index.js.map +1 -1
- package/dist/punctuation/rules/index.js +1 -1
- package/dist/punctuation/rules/index.js.map +1 -1
- package/dist/punctuation.spec.js +1 -1
- package/dist/punctuation.spec.js.map +1 -1
- package/dist/punctuation2.js +1 -1
- package/dist/punctuation2.js.map +1 -1
- package/dist/punctuation2.spec.js +1 -1
- package/dist/punctuation2.spec.js.map +1 -1
- package/dist/reindexSubfield6OccurenceNumbers.js +1 -1
- package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
- package/dist/reindexSubfield6OccurenceNumbers.spec.js +1 -1
- package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +1 -1
- package/dist/removeDuplicateDataFields.js +1 -1
- package/dist/removeDuplicateDataFields.js.map +1 -1
- package/dist/removeDuplicateDataFields.spec.js +1 -1
- package/dist/removeDuplicateDataFields.spec.js.map +1 -1
- package/dist/removeInferiorDataFields.js +1 -1
- package/dist/removeInferiorDataFields.js.map +1 -1
- package/dist/removeInferiorDataFields.spec.js +1 -1
- package/dist/removeInferiorDataFields.spec.js.map +1 -1
- package/dist/resolvable-ext-references-melinda.js +1 -1
- package/dist/resolvable-ext-references-melinda.js.map +1 -1
- package/dist/resolvable-ext-references-melinda.spec.js +1 -1
- package/dist/resolvable-ext-references-melinda.spec.js.map +1 -1
- package/dist/resolveOrphanedSubfield6s.js +1 -1
- package/dist/resolveOrphanedSubfield6s.js.map +1 -1
- package/dist/resolveOrphanedSubfield6s.spec.js +1 -1
- package/dist/resolveOrphanedSubfield6s.spec.js.map +1 -1
- package/dist/sanitize-vocabulary-source-codes.js +5 -1
- package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
- package/dist/sanitize-vocabulary-source-codes.spec.js +1 -1
- package/dist/sanitize-vocabulary-source-codes.spec.js.map +1 -1
- package/dist/sort-tags.spec.js +1 -1
- package/dist/sort-tags.spec.js.map +1 -1
- package/dist/sortFields.js +1 -1
- package/dist/sortFields.js.map +1 -1
- package/dist/sortFields.spec.js +1 -1
- package/dist/sortFields.spec.js.map +1 -1
- package/dist/sortRelatorTerms.js +1 -1
- package/dist/sortRelatorTerms.js.map +1 -1
- package/dist/sortRelatorTerms.spec.js +1 -1
- package/dist/sortRelatorTerms.spec.js.map +1 -1
- package/dist/sortSubfields.js +1 -1
- package/dist/sortSubfields.js.map +1 -1
- package/dist/sortSubfields.spec.js +1 -1
- package/dist/sortSubfields.spec.js.map +1 -1
- package/dist/stripPunctuation.js.map +1 -1
- package/dist/stripPunctuation.spec.js +1 -1
- package/dist/stripPunctuation.spec.js.map +1 -1
- package/dist/subfield-exclusion.js.map +1 -1
- package/dist/subfield-exclusion.spec.js +1 -1
- package/dist/subfield-exclusion.spec.js.map +1 -1
- package/dist/subfield6Utils.js.map +1 -1
- package/dist/subfield8Utils.js.map +1 -1
- package/dist/subfieldValueNormalizations.js +1 -1
- package/dist/subfieldValueNormalizations.js.map +1 -1
- package/dist/subfieldValueNormalizations.spec.js +1 -1
- package/dist/subfieldValueNormalizations.spec.js.map +1 -1
- package/dist/sync-007-and-300.js +1 -1
- package/dist/sync-007-and-300.js.map +1 -1
- package/dist/sync-007-and-300.spec.js +1 -1
- package/dist/sync-007-and-300.spec.js.map +1 -1
- package/dist/typeOfDate-008.js +1 -1
- package/dist/typeOfDate-008.js.map +1 -1
- package/dist/typeOfDate-008.spec.js +1 -1
- package/dist/typeOfDate-008.spec.js.map +1 -1
- package/dist/unicode-decomposition.js.map +1 -1
- package/dist/unicode-decomposition.spec.js +1 -1
- package/dist/unicode-decomposition.spec.js.map +1 -1
- package/dist/update-field-540.spec.js +1 -1
- package/dist/update-field-540.spec.js.map +1 -1
- package/dist/urn.js +1 -1
- package/dist/urn.js.map +1 -1
- package/dist/urn.spec.js +1 -1
- package/dist/urn.spec.js.map +1 -1
- package/dist/utils.js +17 -0
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/cyrillux-usemarcon-replacement.js +87 -24
- package/src/fixRelatorTerms.js +5 -2
- package/src/index.js +21 -3
- package/src/indicator-fixes.js +19 -0
- package/src/sanitize-vocabulary-source-codes.js +4 -0
- package/src/utils.js +16 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f11/expectedResult.json +3 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f11/record.json +8 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f12/expectedResult.json +32 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f12/metadata.json +6 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f12/record.json +30 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f13/expectedResult.json +38 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f13/metadata.json +6 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f13/record.json +29 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f14/expectedResult.json +42 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f14/metadata.json +6 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f14/record.json +33 -0
- package/test-fixtures/indicator-fixes/09/expectedResult.json +10 -0
- package/test-fixtures/indicator-fixes/09/metadata.json +4 -0
- package/test-fixtures/indicator-fixes/09/record.json +11 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +74 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f04/metadata.json +8 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f04/record.json +75 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v04/expectedResult.json +5 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +8 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +75 -0
package/dist/urn.js
CHANGED
|
@@ -7,7 +7,7 @@ exports.default = _default;
|
|
|
7
7
|
var _nodeFetch = _interopRequireDefault(require("node-fetch"));
|
|
8
8
|
var _utils = require("./utils");
|
|
9
9
|
var _debug = _interopRequireDefault(require("debug"));
|
|
10
|
-
function _interopRequireDefault(
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
11
|
const URN_GENERATOR_URL = 'https://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';
|
|
12
12
|
function _default(isLegalDeposit = false, useMelindaTemp = true) {
|
|
13
13
|
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:urn');
|
package/dist/urn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urn.js","names":["_nodeFetch","_interopRequireDefault","require","_utils","_debug","obj","__esModule","default","URN_GENERATOR_URL","_default","isLegalDeposit","useMelindaTemp","debug","createDebugLogger","debugData","extend","hasURN","f","tag","subfields","some","code","value","test","description","validate","fix","record","f856sUrn","fields","filter","JSON","stringify","ldSubfields","createLDSubfields","length","generated","createURNSubfield","tempSubField","insertField","ind1","ind2","forEach","sf","hasOld856LdPhrase","find","ldsf","push","rec","isbn","reduce","acc","a","undefined","createURN","response","fetch","body","text","fieldHasLDSubfields","field","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 // 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 const hasURN = f => f.tag === '856' && f.subfields.some(({code, value}) => code === 'u' && (/urn.fi/u).test(value));\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(hasURN);\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(hasURN);\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":";;;;;;AAAA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAH,sBAAA,CAAAC,OAAA;AAAsC,SAAAD,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,MAAMG,iBAAiB,GAAG,6DAA6D;AAExE,SAAAC,SAAUC,cAAc,GAAG,KAAK,EAAEC,cAAc,GAAG,IAAI,EAAE;EACtE,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,8CAA8C,CAAC;EAC/E,MAAMC,SAAS,GAAGF,KAAK,CAACG,MAAM,CAAC,MAAM,CAAC;;EAEtC;EACA;;EAEA;;EAEA,MAAMC,MAAM,GAAGC,CAAC,IAAIA,CAAC,CAACC,GAAG,KAAK,KAAK,IAAID,CAAC,CAACE,SAAS,CAACC,IAAI,CAAC,CAAC;IAACC,IAAI;IAAEC;EAAK,CAAC,KAAKD,IAAI,KAAK,GAAG,IAAK,SAAS,CAAEE,IAAI,CAACD,KAAK,CAAC,CAAC;EAEnH,OAAO;IACLE,WAAW,EAAE,uIAAuI;IACpJC,QAAQ;IACRC;EACF,CAAC;EAED,eAAeA,GAAGA,CAACC,MAAM,EAAE;IACzB,MAAMC,QAAQ,GAAGD,MAAM,CAACE,MAAM,CAACC,MAAM,CAACd,MAAM,CAAC;IAC7CF,SAAS,CAAE,aAAYiB,IAAI,CAACC,SAAS,CAACJ,QAAQ,CAAE,EAAC,CAAC;IAElD,MAAMK,WAAW,GAAGvB,cAAc,GAAGwB,iBAAiB,CAAC,CAAC,GAAG,EAAE;IAC7DpB,SAAS,CAAE,mBAAkBJ,cAAe,4BAA2BqB,IAAI,CAACC,SAAS,CAACC,WAAW,CAAE,EAAC,CAAC;;IAErG;IACA;;IAEA,IAAIL,QAAQ,CAACO,MAAM,KAAK,CAAC,EAAE;MAAE;MAC3B,MAAM;QAACd,IAAI;QAAEC,KAAK;QAAEc;MAAS,CAAC,GAAG,MAAMC,iBAAiB,CAACV,MAAM,CAAC;MAEhE,IAAIS,SAAS,IAAIzB,cAAc,EAAE;QAC/B,MAAM2B,YAAY,GAAG;UAACjB,IAAI,EAAE,GAAG;UAAEC,KAAK,EAAE;QAAe,CAAC;QAExDK,MAAM,CAACY,WAAW,CAAC;UACjBrB,GAAG,EAAE,KAAK;UACVsB,IAAI,EAAE,GAAG;UACTC,IAAI,EAAE,GAAG;UACTtB,SAAS,EAAE,CAAC;YAACE,IAAI;YAAEC;UAAK,CAAC,EAAE,GAAGW,WAAW,EAAEK,YAAY;QACzD,CAAC,CAAC;QAEF,OAAO,IAAI;MACb;MAEAX,MAAM,CAACY,WAAW,CAAC;QACjBrB,GAAG,EAAE,KAAK;QACVsB,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTtB,SAAS,EAAE,CAAC;UAACE,IAAI;UAAEC;QAAK,CAAC,EAAE,GAAGW,WAAW;MAC3C,CAAC,CAAC;MAEF,OAAO,IAAI;IACb,CAAC,MAAM,IAAIvB,cAAc,EAAE;MAAE;;MAE3B;MACA;MACA;MACA;;MAEAkB,QAAQ,CAACc,OAAO,CAACzB,CAAC,IAAI;QACpB;QACA,IAAIA,CAAC,CAACE,SAAS,CAACC,IAAI,CAACuB,EAAE,IAAIC,iBAAiB,CAACD,EAAE,CAAC,CAAC,EAAE;UAAE;UACnD1B,CAAC,CAACE,SAAS,CAAC;UAAA,CACT0B,IAAI,CAACF,EAAE,IAAIC,iBAAiB,CAACD,EAAE,CAAC,CAAC,CACjCrB,KAAK,GAAG,uCAAuC;QACpD;;QAEA;QACAW,WAAW,CAACS,OAAO,CAACI,IAAI,IAAI;UAC1B,IAAI,CAAC7B,CAAC,CAACE,SAAS,CAACC,IAAI,CAACuB,EAAE,IAAIA,EAAE,CAACtB,IAAI,KAAKyB,IAAI,CAACzB,IAAI,IAAIsB,EAAE,CAACrB,KAAK,KAAKwB,IAAI,CAACxB,KAAK,IAAI,CAACsB,iBAAiB,CAACD,EAAE,CAAC,CAAC,EAAE;YAAE;YACzG1B,CAAC,CAACE,SAAS,CAAC4B,IAAI,CAACD,IAAI,CAAC,CAAC,CAAC;UAC1B;QACF,CAAC,CAAC;MACJ,CAAC,CAAC;IACJ;IAEA,OAAO,IAAI;;IAEX;;IAEA,eAAeT,iBAAiBA,CAACW,GAAG,EAAE;MACpC;MACA;MACA,MAAMC,IAAI,GAAGD,GAAG,CAACnB,MAAM,CAACqB,MAAM,CAAC,CAACC,GAAG,EAAElC,CAAC,KAAK;QACzC,IAAIA,CAAC,CAACC,GAAG,KAAK,KAAK,EAAE;UACnB,MAAMkC,CAAC,GAAGnC,CAAC,CAACE,SAAS,CAAC0B,IAAI,CAACF,EAAE,IAAIA,EAAE,CAACtB,IAAI,KAAK,GAAG,CAAC;UACjD,OAAO+B,CAAC,GAAGA,CAAC,CAAC9B,KAAK,GAAG+B,SAAS;QAChC;QAEA,OAAOF,GAAG;MACZ,CAAC,EAAEE,SAAS,CAAC;MAEbvC,SAAS,CAAE,UAASmC,IAAK,EAAC,CAAC;MAE3B,MAAM;QAACb,SAAS;QAAEd;MAAK,CAAC,GAAG,MAAMgC,SAAS,CAACL,IAAI,CAAC;MAChD,OAAO;QAAC5B,IAAI,EAAE,GAAG;QAAEC,KAAK;QAAEc;MAAS,CAAC;MAEpC,eAAekB,SAASA,CAACL,IAAI,GAAG,KAAK,EAAE;QACrC,IAAIA,IAAI,EAAE;UACR,OAAO;YAACb,SAAS,EAAE,KAAK;YAAEd,KAAK,EAAG,2BAA0B2B,IAAK;UAAC,CAAC;QACrE;QAEA,MAAMM,QAAQ,GAAG,MAAM,IAAAC,kBAAK,EAAChD,iBAAiB,CAAC;QAC/C,MAAMiD,IAAI,GAAG,MAAMF,QAAQ,CAACG,IAAI,CAAC,CAAC;;QAElC;QACA;QACA,OAAO;UAACtB,SAAS,EAAE,IAAI;UAAEd,KAAK,EAAG,kBAAiBmC,IAAK;QAAC,CAAC;MAC3D;IACF;IAEA,SAASb,iBAAiBA,CAAC;MAACvB,IAAI;MAAEC;IAAK,CAAC,EAAE;MACxC,IAAID,IAAI,KAAK,GAAG,IAAIC,KAAK,KAAK,wCAAwC,EAAE;QACtE,OAAO,IAAI;MACb;MAEA,OAAO,KAAK;IACd;EAEF;;EAEA;EACA,SAASY,iBAAiBA,CAAA,EAAG;IAC3B,OAAO,CACL;MACEb,IAAI,EAAE,GAAG;MACTC,KAAK,EAAE;IACT,CAAC,EACD;MACED,IAAI,EAAE,GAAG;MACTC,KAAK,EAAE;IACT,CAAC,CACF;EACH;EAEA,SAASqC,mBAAmBA,CAACC,KAAK,EAAE3B,WAAW,EAAE;IAC/C,IAAIA,WAAW,CAAC4B,KAAK,CAACf,IAAI,IAAIc,KAAK,CAACzC,SAAS,CAACC,IAAI,CAACuB,EAAE,IAAIA,EAAE,CAACtB,IAAI,KAAKyB,IAAI,CAACzB,IAAI,IAAIsB,EAAE,CAACrB,KAAK,KAAKwB,IAAI,CAACxB,KAAK,CAAC,CAAC,EAAE;MAC3G,OAAO,IAAI;IACb;EACF;EAEA,SAASwC,UAAUA,CAAClC,QAAQ,EAAE;IAC5BhB,KAAK,CAAE,qDAAoD,CAAC;IAC5D,MAAMqB,WAAW,GAAGC,iBAAiB,CAAC,CAAC;IACvC,MAAM6B,uBAAuB,GAAGnC,QAAQ,CAACE,MAAM,CAAC8B,KAAK,IAAID,mBAAmB,CAACC,KAAK,EAAE3B,WAAW,CAAC,CAAC;IACjG,IAAI8B,uBAAuB,CAAC5B,MAAM,GAAG,CAAC,EAAE;MACtCvB,KAAK,CAAE,cAAamD,uBAAuB,CAAC5B,MAAO,wDAAuD,CAAC;MAC3GrB,SAAS,CAAE,4BAA2BiB,IAAI,CAACC,SAAS,CAAC+B,uBAAuB,CAAE,EAAC,CAAC;MAChF,OAAO,IAAI;IACb;IACA,OAAO,KAAK;EACd;EAEA,SAAStC,QAAQA,CAACE,MAAM,EAAE;IACxB;IACA,IAAI,CAAC,IAAAqC,2BAAoB,EAACrC,MAAM,CAAC,EAAE;MACjCf,KAAK,CAAE,mEAAkE,CAAC;MAC1E,OAAO;QAACqD,KAAK,EAAE;MAAI,CAAC;IACtB;IAEA,MAAMrC,QAAQ,GAAGD,MAAM,CAACE,MAAM,CAACC,MAAM,CAACd,MAAM,CAAC;IAE7C,IAAIY,QAAQ,CAACO,MAAM,GAAG,CAAC,EAAE;MACvBvB,KAAK,CAAE,cAAagB,QAAQ,CAACO,MAAO,aAAY,CAAC;MACjDrB,SAAS,CAAE,aAAYiB,IAAI,CAACC,SAAS,CAACJ,QAAQ,CAAE,EAAC,CAAC;MAElD,IAAI,CAAClB,cAAc,IAAIoD,UAAU,CAAClC,QAAQ,CAAC,EAAE;QAC3ChB,KAAK,CAAE,iBAAgB,CAAC;QACxB,OAAO;UAACqD,KAAK,EAAE;QAAI,CAAC;MACtB;IACF;IACArD,KAAK,CAAE,6CAA4C,CAAC;IACpD,OAAO;MAACqD,KAAK,EAAE;IAAK,CAAC;EACvB;AACF","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","hasURN","f","tag","subfields","some","code","value","test","description","validate","fix","record","f856sUrn","fields","filter","JSON","stringify","ldSubfields","createLDSubfields","length","generated","createURNSubfield","tempSubField","insertField","ind1","ind2","forEach","sf","hasOld856LdPhrase","find","ldsf","push","rec","isbn","reduce","acc","a","undefined","createURN","response","fetch","body","text","fieldHasLDSubfields","field","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 // 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 const hasURN = f => f.tag === '856' && f.subfields.some(({code, value}) => code === 'u' && (/urn.fi/u).test(value));\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(hasURN);\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(hasURN);\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/urn.spec.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var _chai = require("chai");
|
|
4
4
|
var _marcRecord = require("@natlibfi/marc-record");
|
|
5
5
|
var _urn = _interopRequireDefault(require("../src/urn"));
|
|
6
|
-
function _interopRequireDefault(
|
|
6
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
7
|
describe('urn', async () => {
|
|
8
8
|
// Fields
|
|
9
9
|
const f337 = {
|
package/dist/urn.spec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urn.spec.js","names":["_chai","require","_marcRecord","_urn","_interopRequireDefault","obj","__esModule","default","describe","f337","tag","ind1","ind2","subfields","code","value","f337nonElectronic","ldf856","ldf856old","ldf856Https","ldf856partial","f856URN","f856URNHttps","f856URNnotResource","f856URL","f020","f020second","it","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","test","isLegalDeposit","valid","recfields","result","MarcRecord","fields","eql","fix","resfields","record","nonld","ld","skip"],"sources":["../src/urn.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/urn';\n\ndescribe('urn', async () => {\n // Fields\n const f337 = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'b', value: 'c'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const f337nonElectronic = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'b', value: 'n'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const ldf856 = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: 'z', value: 'Käytettävissä vapaakappaletyöasemilla'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const ldf856old = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: 'z', value: 'Käytettävissä vapaakappalekirjastoissa'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const ldf856Https = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'https://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: 'z', value: 'Käytettävissä vapaakappaletyöasemilla'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const ldf856partial = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const f856URN = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'}]\n };\n\n const f856URNHttps = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code: 'u', value: 'https://urn.fi/URN:ISBN:978-951-9155-47-0'}]\n };\n\n const f856URNnotResource = {\n tag: '856',\n ind1: '4',\n ind2: '1',\n subfields: [{code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'}]\n };\n\n\n const f856URL = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code: 'u', value: 'http://foo.bar/'}]\n };\n\n const f020 = {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '978-951-9155-47-0'}]\n };\n\n const f020second = {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9789519155470'}]\n };\n\n\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n // Tests\n const test = async isLegalDeposit => {\n const validator = await validatorFactory(isLegalDeposit);\n return {\n validate: async (valid, ...recfields) => {\n const result = await validator.validate(new MarcRecord({fields: recfields}));\n expect(result).to.eql({valid});\n },\n\n fix: async (recfields, resfields) => {\n const record = new MarcRecord({fields: recfields});\n await validator.fix(record);\n expect(record.fields).to.eql(resfields);\n }\n };\n };\n\n /// Non-legal and legal deposit\n const nonld = await test(false);\n const ld = await test(true);\n\n describe('#validate', () => {\n // Validate non-electoronic\n it('Finds the record valid; non-electronic record', async () => {\n await nonld.validate(true, f337nonElectronic);\n });\n\n // Validate non-legal deposit\n it('Finds the record valid; 856 with urn, and is non-legal deposit', async () => {\n await nonld.validate(true, f337, f856URN);\n });\n\n // we should recognize that 856 with second indicator 1 is not describing the resource itself\n it.skip('Finds the record invalid; 856 ind2: 1 with urn, and is non-legal deposit', async () => {\n await nonld.validate(false, f337, f856URNnotResource);\n });\n\n // should we require urn if we're not handling a legal deposit\n it('Finds the record invalid; 856 without urn, and is non-legal deposit', async () => {\n await nonld.validate(false, f337, f856URL);\n });\n\n\n // should we require urn if we're not handling a legal deposit\n it('Finds the record invalid; Missing 856, and is non-legal deposit', async () => {\n await nonld.validate(false, f337, f020);\n });\n\n // Validate legal deposit\n it('Finds the record invalid; 856 with urn, and is legal deposit', async () => {\n await ld.validate(false, f020, f337, f856URN);\n });\n\n it('Finds the record invalid; 856 without urn, and is legal deposit', async () => {\n await ld.validate(false, f020, f337, f856URL);\n });\n\n it('Finds the record invalid; Missing 856, and is legal deposit', async () => {\n await ld.validate(false, f337, f020);\n });\n\n it('Finds the record valid; 856 with URN and legal deposit subfields, and is legal deposit', async () => {\n await ld.validate(true, f337, f020, ldf856);\n });\n\n it('Finds the record invalid; old phrase is used in $z', async () => {\n await ld.validate(false, f337, f020, ldf856old);\n });\n\n it('Finds the record valid; 856 with URN and legal deposit subfields and other f856s, and is legal deposit', async () => {\n await ld.validate(true, f337, f020, ldf856partial, ldf856, f856URL);\n });\n\n it('Finds the record invalid; 856 with URN and partial legal deposit subfields, and is legal deposit', async () => {\n await ld.validate(false, f337, f020, ldf856partial);\n });\n\n\n });\n\n describe('#fix', () => {\n // Fix non-legal deposit\n it('856 with urn, and is non-legal deposit; Nothing to add', async () => {\n await nonld.fix([f020, f856URL, f856URN], [f020, f856URL, f856URN]);\n });\n\n // should we actually add non-resolvable urns?\n it('856 without urn, and is non-legal deposit; Adds 856 with urn (https)', async () => {\n await nonld.fix([f020, f856URL], [f020, f856URL, f856URNHttps]);\n });\n\n // should we actually add non-resolvable urns?\n it('Missing 856, and is non-legal deposit; Adds 856 with urn (https)', async () => {\n await nonld.fix([f020], [f020, f856URNHttps]);\n });\n\n // should we actually add non-resolvable urns?\n it('Missing 856, and is non-legal deposit, two 020 fields; Adds 856 with urn from second 020 (https)', async () => {\n await nonld.fix([f020second, f020], [f020second, f020, f856URNHttps]);\n });\n\n // should we actually add non resovable urns?\n // we should think about how to choose the isbn to use in case of several ISBNs\n it.skip('Missing 856, and is non-legal deposit, two 020 fields; Adds 856 with urn from first 020 (https)', async () => {\n await nonld.fix([f020, f020second], [f020, f020second, f856URNHttps]);\n });\n\n\n // Fix legal deposit\n it('856 with urn and legal deposit fields, and is legal deposit; Nothing to add', async () => {\n await ld.fix([f020, f856URL, ldf856], [f020, f856URL, ldf856]);\n });\n\n it('856 with urn and legal deposit fields, and is legal deposit but phrase is old; change phrase to new', async () => {\n await ld.fix([f020, f856URL, ldf856old], [f020, f856URL, ldf856]);\n });\n\n it('856 without urn, and is legal deposit; Adds 856 with urn (https) and legal deposit fields', async () => {\n await ld.fix([f020, f856URL], [f020, f856URL, ldf856Https]);\n });\n\n // we should test generating the URN in case of no ISBN\n\n // we should test creating Melinda-temp field\n\n // We shouldn't lock the open URN for legal deposit use\n it('Missing 856, and is legal deposit; Adds 856 with urn (https) and legal deposit fields', async () => {\n await ld.fix([f020], [f020, ldf856Https]);\n });\n\n // We should actually do this instead of locking the original non-legal deposit URN for legal deposit use\n it.skip('856 with urn, and is legal deposit; Adds another f856 with URN and legal deposit fields', async () => {\n await ld.fix([f020, f856URL, f856URN], [f020, f856URL, f856URN, ldf856Https]);\n });\n\n // We should actually add a new urn in case of a non-resource URN\n it.skip('856 with non-resource-urn, and is legal deposit; Adds another f856 with URN and legal deposit fields', async () => {\n await ld.fix([f020, f856URL, f856URNnotResource], [f020, f856URL, f856URNnotResource, ldf856Https]);\n });\n\n\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"urn.spec.js","names":["_chai","require","_marcRecord","_urn","_interopRequireDefault","e","__esModule","default","describe","f337","tag","ind1","ind2","subfields","code","value","f337nonElectronic","ldf856","ldf856old","ldf856Https","ldf856partial","f856URN","f856URNHttps","f856URNnotResource","f856URL","f020","f020second","it","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","test","isLegalDeposit","valid","recfields","result","MarcRecord","fields","eql","fix","resfields","record","nonld","ld","skip"],"sources":["../src/urn.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/urn';\n\ndescribe('urn', async () => {\n // Fields\n const f337 = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'b', value: 'c'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const f337nonElectronic = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'b', value: 'n'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const ldf856 = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: 'z', value: 'Käytettävissä vapaakappaletyöasemilla'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const ldf856old = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: 'z', value: 'Käytettävissä vapaakappalekirjastoissa'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const ldf856Https = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'https://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: 'z', value: 'Käytettävissä vapaakappaletyöasemilla'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const ldf856partial = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const f856URN = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'}]\n };\n\n const f856URNHttps = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code: 'u', value: 'https://urn.fi/URN:ISBN:978-951-9155-47-0'}]\n };\n\n const f856URNnotResource = {\n tag: '856',\n ind1: '4',\n ind2: '1',\n subfields: [{code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'}]\n };\n\n\n const f856URL = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code: 'u', value: 'http://foo.bar/'}]\n };\n\n const f020 = {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '978-951-9155-47-0'}]\n };\n\n const f020second = {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9789519155470'}]\n };\n\n\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n // Tests\n const test = async isLegalDeposit => {\n const validator = await validatorFactory(isLegalDeposit);\n return {\n validate: async (valid, ...recfields) => {\n const result = await validator.validate(new MarcRecord({fields: recfields}));\n expect(result).to.eql({valid});\n },\n\n fix: async (recfields, resfields) => {\n const record = new MarcRecord({fields: recfields});\n await validator.fix(record);\n expect(record.fields).to.eql(resfields);\n }\n };\n };\n\n /// Non-legal and legal deposit\n const nonld = await test(false);\n const ld = await test(true);\n\n describe('#validate', () => {\n // Validate non-electoronic\n it('Finds the record valid; non-electronic record', async () => {\n await nonld.validate(true, f337nonElectronic);\n });\n\n // Validate non-legal deposit\n it('Finds the record valid; 856 with urn, and is non-legal deposit', async () => {\n await nonld.validate(true, f337, f856URN);\n });\n\n // we should recognize that 856 with second indicator 1 is not describing the resource itself\n it.skip('Finds the record invalid; 856 ind2: 1 with urn, and is non-legal deposit', async () => {\n await nonld.validate(false, f337, f856URNnotResource);\n });\n\n // should we require urn if we're not handling a legal deposit\n it('Finds the record invalid; 856 without urn, and is non-legal deposit', async () => {\n await nonld.validate(false, f337, f856URL);\n });\n\n\n // should we require urn if we're not handling a legal deposit\n it('Finds the record invalid; Missing 856, and is non-legal deposit', async () => {\n await nonld.validate(false, f337, f020);\n });\n\n // Validate legal deposit\n it('Finds the record invalid; 856 with urn, and is legal deposit', async () => {\n await ld.validate(false, f020, f337, f856URN);\n });\n\n it('Finds the record invalid; 856 without urn, and is legal deposit', async () => {\n await ld.validate(false, f020, f337, f856URL);\n });\n\n it('Finds the record invalid; Missing 856, and is legal deposit', async () => {\n await ld.validate(false, f337, f020);\n });\n\n it('Finds the record valid; 856 with URN and legal deposit subfields, and is legal deposit', async () => {\n await ld.validate(true, f337, f020, ldf856);\n });\n\n it('Finds the record invalid; old phrase is used in $z', async () => {\n await ld.validate(false, f337, f020, ldf856old);\n });\n\n it('Finds the record valid; 856 with URN and legal deposit subfields and other f856s, and is legal deposit', async () => {\n await ld.validate(true, f337, f020, ldf856partial, ldf856, f856URL);\n });\n\n it('Finds the record invalid; 856 with URN and partial legal deposit subfields, and is legal deposit', async () => {\n await ld.validate(false, f337, f020, ldf856partial);\n });\n\n\n });\n\n describe('#fix', () => {\n // Fix non-legal deposit\n it('856 with urn, and is non-legal deposit; Nothing to add', async () => {\n await nonld.fix([f020, f856URL, f856URN], [f020, f856URL, f856URN]);\n });\n\n // should we actually add non-resolvable urns?\n it('856 without urn, and is non-legal deposit; Adds 856 with urn (https)', async () => {\n await nonld.fix([f020, f856URL], [f020, f856URL, f856URNHttps]);\n });\n\n // should we actually add non-resolvable urns?\n it('Missing 856, and is non-legal deposit; Adds 856 with urn (https)', async () => {\n await nonld.fix([f020], [f020, f856URNHttps]);\n });\n\n // should we actually add non-resolvable urns?\n it('Missing 856, and is non-legal deposit, two 020 fields; Adds 856 with urn from second 020 (https)', async () => {\n await nonld.fix([f020second, f020], [f020second, f020, f856URNHttps]);\n });\n\n // should we actually add non resovable urns?\n // we should think about how to choose the isbn to use in case of several ISBNs\n it.skip('Missing 856, and is non-legal deposit, two 020 fields; Adds 856 with urn from first 020 (https)', async () => {\n await nonld.fix([f020, f020second], [f020, f020second, f856URNHttps]);\n });\n\n\n // Fix legal deposit\n it('856 with urn and legal deposit fields, and is legal deposit; Nothing to add', async () => {\n await ld.fix([f020, f856URL, ldf856], [f020, f856URL, ldf856]);\n });\n\n it('856 with urn and legal deposit fields, and is legal deposit but phrase is old; change phrase to new', async () => {\n await ld.fix([f020, f856URL, ldf856old], [f020, f856URL, ldf856]);\n });\n\n it('856 without urn, and is legal deposit; Adds 856 with urn (https) and legal deposit fields', async () => {\n await ld.fix([f020, f856URL], [f020, f856URL, ldf856Https]);\n });\n\n // we should test generating the URN in case of no ISBN\n\n // we should test creating Melinda-temp field\n\n // We shouldn't lock the open URN for legal deposit use\n it('Missing 856, and is legal deposit; Adds 856 with urn (https) and legal deposit fields', async () => {\n await ld.fix([f020], [f020, ldf856Https]);\n });\n\n // We should actually do this instead of locking the original non-legal deposit URN for legal deposit use\n it.skip('856 with urn, and is legal deposit; Adds another f856 with URN and legal deposit fields', async () => {\n await ld.fix([f020, f856URL, f856URN], [f020, f856URL, f856URN, ldf856Https]);\n });\n\n // We should actually add a new urn in case of a non-resource URN\n it.skip('856 with non-resource-urn, and is legal deposit; Adds another f856 with URN and legal deposit fields', async () => {\n await ld.fix([f020, f856URL, f856URNnotResource], [f020, f856URL, f856URNnotResource, ldf856Https]);\n });\n\n\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
package/dist/utils.js
CHANGED
|
@@ -11,6 +11,7 @@ exports.isControlSubfieldCode = isControlSubfieldCode;
|
|
|
11
11
|
exports.isElectronicMaterial = isElectronicMaterial;
|
|
12
12
|
exports.nvdebug = nvdebug;
|
|
13
13
|
exports.nvdebugFieldArray = nvdebugFieldArray;
|
|
14
|
+
exports.recordRemoveValuelessSubfields = recordRemoveValuelessSubfields;
|
|
14
15
|
exports.recordToString = recordToString;
|
|
15
16
|
exports.subfieldToString = subfieldToString;
|
|
16
17
|
exports.uniqArray = uniqArray;
|
|
@@ -51,6 +52,22 @@ function recordToString(record) {
|
|
|
51
52
|
const fields = record.fields.map(f => fieldToString(f));
|
|
52
53
|
return `${ldr}\n${fields.join('\n')}`;
|
|
53
54
|
}
|
|
55
|
+
function recordRemoveValuelessSubfields(record) {
|
|
56
|
+
record.fields = record.fields.map(field => {
|
|
57
|
+
// eslint-disable-line functional/immutable-data
|
|
58
|
+
if (!field.subfields) {
|
|
59
|
+
// Keep control fields
|
|
60
|
+
return field;
|
|
61
|
+
}
|
|
62
|
+
// Remove empty subfields from datafields:
|
|
63
|
+
field.subfields = field.subfields.filter(sf => sf.value); // eslint-disable-line functional/immutable-data
|
|
64
|
+
|
|
65
|
+
if (field.subfields && field.subfields.length === 0) {
|
|
66
|
+
return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.
|
|
67
|
+
}
|
|
68
|
+
return field; //if field has subfields return it
|
|
69
|
+
}).filter(field => field); // Filter those falses out
|
|
70
|
+
}
|
|
54
71
|
function fieldToString(f) {
|
|
55
72
|
if ('subfields' in f) {
|
|
56
73
|
return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["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","tag","ind1","ind2","formatSubfields","fieldsToString","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","defaultCatalogingLanguage","field040","b","
|
|
1
|
+
{"version":3,"file":"utils.js","names":["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","recordRemoveValuelessSubfields","filter","tag","ind1","ind2","formatSubfields","fieldsToString","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","defaultCatalogingLanguage","field040","b","uniqArray","arr","i","indexOf"],"sources":["../src/utils.js"],"sourcesContent":["export 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 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"],"mappings":";;;;;;;;;;;;;;;;;AAAO,SAASA,oBAAoBA,CAACC,MAAM,EAAE;EAC3C,MAAMC,KAAK,GAAGD,MAAM,CAACE,GAAG,CAAC,KAAK,CAAC;EAE/B,OAAOD,KAAK,CAACE,MAAM,GAAG,CAAC,IAAIF,KAAK,CAACG,IAAI,CAACC,CAAC,IAAIC,gBAAgB,CAACD,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAIC,gBAAgB,CAACD,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;AACnH;AAEO,SAASE,OAAOA,CAACC,OAAO,EAAEC,IAAI,GAAGC,SAAS,EAAE;EACjD,IAAID,IAAI,EAAE;IAAE;IACVA,IAAI,CAACD,OAAO,CAAC;EACf;EACA;AACF;AAEO,SAASF,gBAAgBA,CAACK,KAAK,EAAEC,YAAY,EAAEC,aAAa,GAAG,IAAI,EAAE;EAC1E,IAAI,CAACF,KAAK,CAACG,SAAS,EAAE;IACpB,OAAO,KAAK;EACd;EACA,IAAID,aAAa,KAAK,IAAI,EAAE;IAC1B,OAAOF,KAAK,CAACG,SAAS,CAACV,IAAI,CAACW,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAKJ,YAAY,CAAC;EAC7D;EACA,OAAOD,KAAK,CAACG,SAAS,CAACV,IAAI,CAACW,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAKJ,YAAY,IAAIC,aAAa,KAAKE,EAAE,CAACE,KAAK,CAAC;AAC3F;AAEO,SAASC,gBAAgBA,CAACH,EAAE,EAAE;EACnC,IAAI,CAACA,EAAE,CAACE,KAAK,EAAE;IACb,OAAO,IAAIF,EAAE,CAACC,IAAI,EAAE;EACtB;EACA,OAAO,IAAID,EAAE,CAACC,IAAI,IAAID,EAAE,CAACE,KAAK,EAAE;AAClC;AAEA,SAASE,uBAAuBA,CAACC,GAAG,EAAE;EACpC,IAAIA,GAAG,KAAK,GAAG,EAAE;IACf,OAAO,GAAG;EACZ;EACA,OAAOA,GAAG;AACZ;AAEO,SAASC,cAAcA,CAACrB,MAAM,EAAE;EACrC,MAAMsB,GAAG,GAAG,SAAStB,MAAM,CAACuB,MAAM,EAAE;EACpC,MAAMC,MAAM,GAAGxB,MAAM,CAACwB,MAAM,CAACC,GAAG,CAACpB,CAAC,IAAIqB,aAAa,CAACrB,CAAC,CAAC,CAAC;EACvD,OAAO,GAAGiB,GAAG,KAAKE,MAAM,CAACG,IAAI,CAAC,IAAI,CAAC,EAAE;AACvC;AAEO,SAASC,8BAA8BA,CAAC5B,MAAM,EAAE;EACrDA,MAAM,CAACwB,MAAM,GAAGxB,MAAM,CAACwB,MAAM,CAACC,GAAG,CAACd,KAAK,IAAI;IAAE;IAC3C,IAAI,CAACA,KAAK,CAACG,SAAS,EAAE;MAAE;MACtB,OAAOH,KAAK;IACd;IACA;IACAA,KAAK,CAACG,SAAS,GAAGH,KAAK,CAACG,SAAS,CAACe,MAAM,CAACd,EAAE,IAAIA,EAAE,CAACE,KAAK,CAAC,CAAC,CAAC;;IAE1D,IAAIN,KAAK,CAACG,SAAS,IAAIH,KAAK,CAACG,SAAS,CAACX,MAAM,KAAK,CAAC,EAAE;MACnD,OAAO,KAAK,CAAC,CAAC;IAChB;IAEA,OAAOQ,KAAK,CAAC,CAAC;EAChB,CAAC,CAAC,CAACkB,MAAM,CAAClB,KAAK,IAAIA,KAAK,CAAC,CAAC,CAAC;AAC7B;AAEO,SAASe,aAAaA,CAACrB,CAAC,EAAE;EAC/B,IAAI,WAAW,IAAIA,CAAC,EAAE;IACpB,OAAO,GAAGA,CAAC,CAACyB,GAAG,IAAIX,uBAAuB,CAACd,CAAC,CAAC0B,IAAI,CAAC,GAAGZ,uBAAuB,CAACd,CAAC,CAAC2B,IAAI,CAAC,GAAGC,eAAe,CAAC5B,CAAC,CAAC,EAAE;EAC7G;EACA,OAAO,GAAGA,CAAC,CAACyB,GAAG,OAAOzB,CAAC,CAACY,KAAK,EAAE;EAE/B,SAASgB,eAAeA,CAACtB,KAAK,EAAE;IAC9B,OAAOA,KAAK,CAACG,SAAS,CAACW,GAAG,CAACV,EAAE,IAAI,IAAIG,gBAAgB,CAACH,EAAE,CAAC,EAAE,CAAC,CAACY,IAAI,CAAC,EAAE,CAAC;EACvE;AACF;AAEO,SAASO,cAAcA,CAACV,MAAM,EAAE;EACrC,OAAOA,MAAM,CAACC,GAAG,CAACpB,CAAC,IAAIqB,aAAa,CAACrB,CAAC,CAAC,CAAC,CAACsB,IAAI,CAAC,mBAAmB,CAAC;AACpE;AAEO,SAASQ,iBAAiBA,CAACX,MAAM,EAAEY,MAAM,GAAG,IAAI,EAAE3B,IAAI,GAAGC,SAAS,EAAE;EACzEc,MAAM,CAACa,OAAO,CAAC1B,KAAK,IAAIJ,OAAO,CAAC,GAAG6B,MAAM,GAAGV,aAAa,CAACf,KAAK,CAAC,EAAE,EAAEF,IAAI,CAAC,CAAC;AAC5E;AAEO,SAAS6B,qBAAqBA,CAAC1B,YAAY,EAAE;EAClD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC2B,QAAQ,CAAC3B,YAAY,CAAC,EAAE;IAClF,OAAO,IAAI;EACb;EACA,OAAO,KAAK;AACd;AAEO,SAAS4B,qBAAqBA,CAACxC,MAAM,EAAEyC,yBAAyB,GAAG/B,SAAS,EAAE;EACnF,MAAM,CAACgC,QAAQ,CAAC,GAAG1C,MAAM,CAACE,GAAG,CAAC,QAAQ,CAAC;EACvC,IAAI,CAACwC,QAAQ,EAAE;IACb,OAAOD,yBAAyB;EAClC;EACA,MAAM,CAACE,CAAC,CAAC,GAAGD,QAAQ,CAAC5B,SAAS,CAACe,MAAM,CAACd,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC;EAC5D,IAAI,CAAC2B,CAAC,EAAE;IACN,OAAOF,yBAAyB;EAClC;EACA,OAAOE,CAAC,CAAC1B,KAAK;AAChB;AAGO,SAAS2B,SAASA,CAACC,GAAG,EAAE;EAC7B,OAAOA,GAAG,CAAChB,MAAM,CAAC,CAACT,GAAG,EAAE0B,CAAC,KAAKD,GAAG,CAACE,OAAO,CAAC3B,GAAG,CAAC,KAAK0B,CAAC,CAAC;AACvD","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -20,16 +20,17 @@ import {default as fixPunctuation} from './punctuation2';
|
|
|
20
20
|
import {default as fixQualifyingInformation} from './normalize-qualifying-information';
|
|
21
21
|
import {sortAdjacentSubfields} from './sortSubfields';
|
|
22
22
|
|
|
23
|
-
|
|
24
23
|
// import createDebugLogger from 'debug';
|
|
25
|
-
import {nvdebug, recordToString} from './utils';
|
|
24
|
+
import {fieldHasSubfield, nvdebug, recordRemoveValuelessSubfields, recordToString} from './utils';
|
|
26
25
|
|
|
27
26
|
// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');
|
|
28
27
|
|
|
29
28
|
const description = 'Replacement for Cyrillux usemarcon rules';
|
|
30
29
|
|
|
31
30
|
// Extended original list with 541, 561, 562, 583, 584
|
|
32
|
-
|
|
31
|
+
// 017, 044... et al are LL additions from 2019 (via USEMARCON-RDA)
|
|
32
|
+
const dropTags = ['001', '003', '010', '012', '014', '015', '016', '017', '019', '025', '029', '032', '035', '036', '037', '038', '042', '044', '049', '051', '061', '068', '071', '074', '079', '090', '091', '092', '094', '095', '096', '097', '099', '249', '261', '262', '350', '400', '411', '541', '561', '562', '574', '575', '577', '578', '583', '584', '589', '590', '591', '592', '593', '594', '595', '596', '597', '598', '599', '653', '698', '741', '742', '744', '751', '761', '790', '841', '842', '843', '844', '845', '850', '852', '853', '854', '855', '858', '859', '863', '864', '865', '866', '867', '868', '876', '877', '878', '882', '886', '887', '888', '890', '899'];
|
|
33
|
+
|
|
33
34
|
|
|
34
35
|
export default function () {
|
|
35
36
|
return {
|
|
@@ -43,59 +44,109 @@ export default function () {
|
|
|
43
44
|
return res;
|
|
44
45
|
}
|
|
45
46
|
|
|
46
|
-
function
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
function realFixNonAleph(record) {
|
|
48
|
+
if (isAlephRecord(record)) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Update LDR/17 to '4'
|
|
49
52
|
record.leader = `${record.leader.substring(0, 17)}4${record.leader.substring(18, 24)}`; // eslint-disable-line functional/immutable-data
|
|
50
53
|
|
|
51
54
|
// Remove unwanted fields:
|
|
52
55
|
record.fields = record.fields.filter(f => !dropTags.includes(f.tag)); // eslint-disable-line functional/immutable-data
|
|
53
56
|
|
|
54
|
-
|
|
57
|
+
// Remove 084 fields that don't have $2 ykl (based on USEMARCON-RDA/bw_rda_kyril.rul code by LL 2019)
|
|
58
|
+
record.fields = record.fields.filter(f => f.tag !== '084' || f.subfields.some(sf => sf.code === '2' && sf.value === 'ykl')); // eslint-disable-line functional/immutable-data
|
|
59
|
+
|
|
60
|
+
fieldSpecificStuff(record.fields);
|
|
61
|
+
|
|
62
|
+
function fieldSpecificStuff(fields) {
|
|
63
|
+
const [field, ...rest] = fields;
|
|
64
|
+
|
|
65
|
+
if (field === undefined) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
55
68
|
|
|
56
|
-
function fieldSpecificStuff(field) {
|
|
57
69
|
removeOwnershipSubfield5(field);
|
|
58
70
|
removeFromOldCatalog(field); // Remove LoC phrase "[from old catalog]" from srings
|
|
59
71
|
translateFieldToFinnish(field);
|
|
72
|
+
|
|
73
|
+
return fieldSpecificStuff(rest);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
fixField040(record); // All $b values are changed to 'mul'. As a side effect 33X$b=>$a mappings are in Finnish! Ok in this domain!
|
|
77
|
+
|
|
78
|
+
fieldSpecificStuff2(record.fields);
|
|
79
|
+
|
|
80
|
+
function fieldSpecificStuff2(fields) {
|
|
81
|
+
const [field, ...rest] = fields;
|
|
82
|
+
|
|
83
|
+
if (field === undefined) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
removeSubfieldH(field); // NB! Do this only after 33X creation, as 245$h might be useful there!
|
|
88
|
+
|
|
89
|
+
field100eKirjoittaja(field);
|
|
90
|
+
|
|
91
|
+
function field100eKirjoittaja(f) { // LL 2019 USEMARCON-RDA rule
|
|
92
|
+
if (f.tag === '100' && !fieldHasSubfield(f, 'e') && record.isBK()) {
|
|
93
|
+
f.subfields = [{code: 'e', value: 'kirjoittaja.'}, ...f.subfields]; // eslint-disable-line functional/immutable-data
|
|
94
|
+
sortAdjacentSubfields(f);
|
|
95
|
+
// Punctuation will be done later on...
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
field260To264s(field, record);
|
|
101
|
+
|
|
102
|
+
// NB! 300 (before or after 33X creation?)
|
|
103
|
+
field410To490And810(field, record);
|
|
104
|
+
field440To490And830(field, record);
|
|
105
|
+
// handle505(field); // not applying them usemarcon-cyrillux rules for field 505 as I can't understand their motivation.
|
|
106
|
+
return fieldSpecificStuff2(rest);
|
|
60
107
|
}
|
|
61
108
|
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function realFixAll1(record) {
|
|
112
|
+
fixLeader(record); // Fix defaults, esp. LDR/18=i
|
|
113
|
+
|
|
62
114
|
fixCountryCodes().fix(record); // 008/15-17
|
|
63
115
|
fixLanguageCodes().fix(record); // 008/35-37 AND 041 (note that all relevant subfield codes are fixed, not just $a)
|
|
64
116
|
|
|
65
|
-
|
|
117
|
+
recordRemoveValuelessSubfields(record);
|
|
66
118
|
|
|
67
119
|
// Field 028: use $b$a, not $a$b:
|
|
68
120
|
const f028 = record.fields.filter(f => f.tag === '028');
|
|
69
121
|
f028.forEach(f => sortAdjacentSubfields(f));
|
|
70
122
|
|
|
71
|
-
fixField040(record); // All $b values are changed to 'mul'. As a side effect 33X$b=>$a mappings are in Finnish! Ok in this domain!
|
|
72
123
|
add041().fix(record);
|
|
73
124
|
|
|
74
125
|
fixRelatorTerms().fix(record);
|
|
75
126
|
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function realFixAll2(record) {
|
|
130
|
+
fixQualifyingInformation().fix(record); // 015, 020, 024 and 028
|
|
131
|
+
|
|
132
|
+
// Cyrillux specific code might change 040$b and thus affect these rules:
|
|
76
133
|
fix33X().fix(record); // 33X$a => 33X$a$b$2
|
|
77
134
|
add336().fix(record);
|
|
78
135
|
add337().fix(record);
|
|
79
136
|
add338().fix(record);
|
|
80
137
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
function fieldSpecificStuff2(field) {
|
|
84
|
-
removeSubfieldH(field); // only after 33X creation, as 245$h might be useful
|
|
85
|
-
|
|
86
|
-
field260To264s(field, record);
|
|
138
|
+
// The fixer below implements Cyrillux rules such as 245I1 | 245I1 | If (Exists(@100) Or Exists(@110) Or Exists(@111) Or Exists(@130)) Then '1' Else '0' and plenty of other good stuff:
|
|
139
|
+
fixIndicators().fix(record);
|
|
87
140
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
field440To490And830(field, record);
|
|
91
|
-
// handle505(field); // not applying them usemarcon-cyrillux rules for field 505 as I can't understand their motivation.
|
|
141
|
+
fixPunctuation().fix(record);
|
|
142
|
+
}
|
|
92
143
|
|
|
93
|
-
|
|
144
|
+
function realFix(record) {
|
|
145
|
+
realFixAll1(record);
|
|
94
146
|
|
|
95
|
-
|
|
96
|
-
fixIndicators().fix(record);
|
|
147
|
+
realFixNonAleph(record);
|
|
97
148
|
|
|
98
|
-
|
|
149
|
+
realFixAll2(record);
|
|
99
150
|
|
|
100
151
|
const res = {message: [], fix: [], valid: true};
|
|
101
152
|
return res;
|
|
@@ -146,6 +197,9 @@ function fixField040(record) {
|
|
|
146
197
|
}
|
|
147
198
|
|
|
148
199
|
export function removeFromOldCatalog(field) {
|
|
200
|
+
if (!field.tag.match(/^(?:240|65[0135]|[1678](?:00|10|11|30))$/u)) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
149
203
|
// See https://catalog.loc.gov/vwebv/ui/en_US/htdocs/help/faqs.html for motivation
|
|
150
204
|
field.subfields?.forEach(sf => removeFromOldCatalogFromSubfield(sf));
|
|
151
205
|
|
|
@@ -221,6 +275,10 @@ function field440To490And830(field, record) { // might be generic... if so, move
|
|
|
221
275
|
record.insertField(field830);
|
|
222
276
|
}
|
|
223
277
|
|
|
278
|
+
function isAlephRecord(record) {
|
|
279
|
+
// Records that are already in Aleph are not processed as aggressively as genuinely new ones:
|
|
280
|
+
return record.fields.some(field => ['CAT', 'LKR', 'LOW', 'SID'].includes(field.tag));
|
|
281
|
+
}
|
|
224
282
|
|
|
225
283
|
function field260To264s(field, record) { // might be generic... if so, move to utils...
|
|
226
284
|
// As per my quick reading of usemarcon-cyrillux
|
|
@@ -382,6 +440,11 @@ function finnishTranslationsAndMappings(value) {
|
|
|
382
440
|
replace('black and white', 'mustavalkoinen').
|
|
383
441
|
replace(/\bbilaga\b/gui, 'liite').
|
|
384
442
|
replace(/\bbilagor\b/gui, 'liitettä').
|
|
443
|
+
// https://github.com/NatLibFi/USEMARCON-BOOKWHERE-RDA/blob/master/bw_rda_kyril.rul#L365
|
|
444
|
+
replace(/(\b1\]?) с\./gui, '$1 sivu'). // eslint-disable-line prefer-named-capture-group
|
|
445
|
+
replace(/(\d\]?) с\./gui, '$1 sivua'). // eslint-disable-line prefer-named-capture-group
|
|
446
|
+
replace(/(\d) см/gui, '$1 cm'). // eslint-disable-line prefer-named-capture-group
|
|
447
|
+
|
|
385
448
|
replace(/\bcharts\b/gui, 'kaavioita').
|
|
386
449
|
replace('chiefly color illustrations', 'pääosin värikuvitettu').
|
|
387
450
|
replace('chiefly', 'pääosin').
|
package/src/fixRelatorTerms.js
CHANGED
|
@@ -108,7 +108,10 @@ const finnishAbbreviations = {
|
|
|
108
108
|
'san.': 'sanoittaja',
|
|
109
109
|
'sov.': 'sovittaja',
|
|
110
110
|
'säv.': 'säveltäjä',
|
|
111
|
-
'toim.': 'toimittaja'
|
|
111
|
+
'toim.': 'toimittaja',
|
|
112
|
+
// Quick and dirty implementation of https://github.com/NatLibFi/USEMARCON-BOOKWHERE-RDA/blob/master/bw_rda_kyril.rul#L651
|
|
113
|
+
'сост.': 'toimittaja',
|
|
114
|
+
'ред.': 'toimittaja'
|
|
112
115
|
};
|
|
113
116
|
|
|
114
117
|
function subfieldHandleRelatorTermAbbreviation(subfield, language) {
|
|
@@ -127,7 +130,7 @@ function subfieldHandleRelatorTermAbbreviation(subfield, language) {
|
|
|
127
130
|
const lcValue = value.toLowerCase(); // Check Å, Ä, Ö...
|
|
128
131
|
|
|
129
132
|
// NB: Policy: if no language or multi-language: apply all rules! (Not much overlap I hope...)
|
|
130
|
-
if (language === 'fin') {
|
|
133
|
+
if (language === 'fin' || language === 'mul') {
|
|
131
134
|
nvdebug(`Relator try Finnish for '${lcValue}}'...`, debugDev);
|
|
132
135
|
if (lcValue in finnishAbbreviations) {
|
|
133
136
|
const hit = `${finnishAbbreviations[lcValue]}${punc}`;
|
package/src/index.js
CHANGED
|
@@ -1,16 +1,25 @@
|
|
|
1
1
|
import AccessRights from './access-rights';
|
|
2
|
+
import AddMissingField041 from './addMissingField041';
|
|
3
|
+
import AddMissingField336 from './addMissingField336';
|
|
4
|
+
import AddMissingField337 from './addMissingField337';
|
|
5
|
+
import AddMissingField338 from './addMissingField338';
|
|
6
|
+
import CyrilluxUsemarconReplacement from './cyrillux-usemarcon-replacement';
|
|
2
7
|
import DoubleCommas from './double-commas';
|
|
3
8
|
import DuplicatesInd1 from './duplicates-ind1';
|
|
4
9
|
import EmptyFields from './empty-fields';
|
|
5
10
|
import EndingPunctuation from './ending-punctuation';
|
|
6
11
|
import EndingWhitespace from './ending-whitespace';
|
|
12
|
+
import Field008CharacterGroups from './field-008-18-34-character-groups';
|
|
7
13
|
import Field505Separators from './field-505-separators';
|
|
8
14
|
import Field521Fix from './field-521-fix';
|
|
9
15
|
import FieldExclusion from './field-exclusion';
|
|
10
16
|
import FieldStructure from './field-structure';
|
|
11
17
|
import FieldsPresent from './fields-present';
|
|
12
|
-
import
|
|
18
|
+
import Fix33X from './fix-33X';
|
|
19
|
+
import FixCountryCodes from './fix-country-codes';
|
|
20
|
+
import FixLanguageCodes from './fix-language-codes';
|
|
13
21
|
import FixRelatorTerms from './fixRelatorTerms';
|
|
22
|
+
import FixedFields from './fixed-fields';
|
|
14
23
|
import IdenticalFields from './identical-fields';
|
|
15
24
|
import IndicatorFixes from './indicator-fixes';
|
|
16
25
|
import IsbnIssn from './isbn-issn';
|
|
@@ -25,11 +34,11 @@ import NormalizeQualifyingInformation from './normalize-qualifying-information';
|
|
|
25
34
|
import NormalizeUTF8Diacritics from './normalize-utf8-diacritics';
|
|
26
35
|
import Punctuation from './punctuation/';
|
|
27
36
|
import Punctuation2 from './punctuation2';
|
|
28
|
-
import ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s'; // Do this before reindexing! (thus not in alphabetical order)
|
|
29
37
|
import ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers';
|
|
30
38
|
import RemoveDuplicateDataFields from './removeDuplicateDataFields';
|
|
31
39
|
import RemoveInferiorDataFields from './removeInferiorDataFields';
|
|
32
40
|
import ResolvableExtReferences from './resolvable-ext-references-melinda';
|
|
41
|
+
import ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s';
|
|
33
42
|
import SanitizeVocabularySourceCodes from './sanitize-vocabulary-source-codes';
|
|
34
43
|
import SortFields from './sortFields';
|
|
35
44
|
import SortRelatorTerms from './sortRelatorTerms';
|
|
@@ -46,16 +55,25 @@ import Urn from './urn';
|
|
|
46
55
|
|
|
47
56
|
export {
|
|
48
57
|
AccessRights,
|
|
58
|
+
AddMissingField041,
|
|
59
|
+
AddMissingField336,
|
|
60
|
+
AddMissingField337,
|
|
61
|
+
AddMissingField338,
|
|
62
|
+
CyrilluxUsemarconReplacement,
|
|
49
63
|
DoubleCommas,
|
|
50
64
|
DuplicatesInd1,
|
|
51
65
|
EmptyFields,
|
|
52
66
|
EndingPunctuation,
|
|
53
67
|
EndingWhitespace,
|
|
68
|
+
Field008CharacterGroups,
|
|
54
69
|
Field505Separators,
|
|
55
70
|
Field521Fix,
|
|
56
71
|
FieldExclusion,
|
|
57
72
|
FieldsPresent,
|
|
58
73
|
FieldStructure,
|
|
74
|
+
Fix33X,
|
|
75
|
+
FixCountryCodes,
|
|
76
|
+
FixLanguageCodes,
|
|
59
77
|
FixRelatorTerms,
|
|
60
78
|
FixedFields,
|
|
61
79
|
IdenticalFields,
|
|
@@ -72,7 +90,7 @@ export {
|
|
|
72
90
|
NormalizeUTF8Diacritics,
|
|
73
91
|
Punctuation,
|
|
74
92
|
Punctuation2,
|
|
75
|
-
ResolveOrphanedSubfield6s,
|
|
93
|
+
ResolveOrphanedSubfield6s, // Do this before reindexing! (thus I'm not sticking with alphabetical order here)
|
|
76
94
|
ReindexSubfield6OccurenceNumbers,
|
|
77
95
|
RemoveDuplicateDataFields,
|
|
78
96
|
RemoveInferiorDataFields,
|
package/src/indicator-fixes.js
CHANGED
|
@@ -144,6 +144,24 @@ function normalizeNonFilingIndicator2(field, languages = []) {
|
|
|
144
144
|
field.ind2 = determineNonFilingIndicatorValue(field, languages); // eslint-disable-line functional/immutable-data
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
+
const fiktiivisenAineistonLisaluokatFI = ['Eläimet', 'Erotiikka', 'Erä', 'Fantasia', 'Historia', 'Huumori', 'Jännitys', 'Kauhu', 'Novellit', 'Romantiikka', 'Scifi', 'Sota', 'Urheilu', 'Uskonto'];
|
|
148
|
+
|
|
149
|
+
function containsFiktiivisenAineistonLisaluokka(field) {
|
|
150
|
+
// Should we check Swedish versions as well?
|
|
151
|
+
return field.subfields.some(sf => sf.code === 'a' && fiktiivisenAineistonLisaluokatFI.includes(sf.value));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function normalize084Indicator1(field) {
|
|
155
|
+
if (field.tag !== '084') {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// https://marc21.kansalliskirjasto.fi/bib/05X-08X.htm#084 and https://finto.fi/ykl/fi/page/fiktioluokka
|
|
160
|
+
if (field.ind1 !== '9' && containsFiktiivisenAineistonLisaluokka(field) && field.subfields.some(sf => sf.code === '2' && sf.value === 'ykl')) {
|
|
161
|
+
field.ind1 = '9'; // eslint-disable-line functional/immutable-data
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
147
165
|
|
|
148
166
|
function normalize245Indicator1(field, record) {
|
|
149
167
|
if (field.tag !== '245') {
|
|
@@ -222,6 +240,7 @@ export function recordNormalizeIndicators(record) {
|
|
|
222
240
|
}
|
|
223
241
|
|
|
224
242
|
function fieldNormalizeIndicators(field, record, languages) {
|
|
243
|
+
normalize084Indicator1(field);
|
|
225
244
|
normalize245Indicator1(field, record);
|
|
226
245
|
normalizeNonFilingIndicator1(field, languages);
|
|
227
246
|
normalizeNonFilingIndicator2(field, languages);
|
|
@@ -88,6 +88,10 @@ function fieldHasUnfixableVocabularySourceCode(field) {
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
function subfieldHasUnfixableVocabularySourceCode(subfield) {
|
|
91
|
+
if (subfield.code !== '2') {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
|
|
91
95
|
// As we can't fix this here, apply this yso-rule only when validating!
|
|
92
96
|
if (subfield.value.indexOf('yso/') === 0) {
|
|
93
97
|
return !['yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'].includes(subfield.value);
|
package/src/utils.js
CHANGED
|
@@ -41,6 +41,22 @@ export function recordToString(record) {
|
|
|
41
41
|
return `${ldr}\n${fields.join('\n')}`;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
export function recordRemoveValuelessSubfields(record) {
|
|
45
|
+
record.fields = record.fields.map(field => { // eslint-disable-line functional/immutable-data
|
|
46
|
+
if (!field.subfields) { // Keep control fields
|
|
47
|
+
return field;
|
|
48
|
+
}
|
|
49
|
+
// Remove empty subfields from datafields:
|
|
50
|
+
field.subfields = field.subfields.filter(sf => sf.value); // eslint-disable-line functional/immutable-data
|
|
51
|
+
|
|
52
|
+
if (field.subfields && field.subfields.length === 0) {
|
|
53
|
+
return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return field; //if field has subfields return it
|
|
57
|
+
}).filter(field => field); // Filter those falses out
|
|
58
|
+
}
|
|
59
|
+
|
|
44
60
|
export function fieldToString(f) {
|
|
45
61
|
if ('subfields' in f) {
|
|
46
62
|
return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;
|