@natlibfi/marc-record-validators-melinda 11.3.1 → 11.3.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/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/melindaCustomMergeFields.json +5120 -0
- package/dist/merge-fields/config.json +83 -0
- package/dist/merge-fields/controlSubfields.js +278 -0
- package/dist/merge-fields/controlSubfields.js.map +1 -0
- package/dist/merge-fields/counterpartField.js +674 -0
- package/dist/merge-fields/counterpartField.js.map +1 -0
- package/dist/merge-fields/index.js +76 -0
- package/dist/merge-fields/index.js.map +1 -0
- package/dist/merge-fields/mergableIndicator.js +95 -0
- package/dist/merge-fields/mergableIndicator.js.map +1 -0
- package/dist/merge-fields/mergableTag.js +33 -0
- package/dist/merge-fields/mergableTag.js.map +1 -0
- package/dist/merge-fields/mergeConstraints.js +1225 -0
- package/dist/merge-fields/mergeConstraints.js.map +1 -0
- package/dist/merge-fields/mergeField.js +190 -0
- package/dist/merge-fields/mergeField.js.map +1 -0
- package/dist/merge-fields/mergeIndicator.js +171 -0
- package/dist/merge-fields/mergeIndicator.js.map +1 -0
- package/dist/merge-fields/mergeOrAddPostprocess.js +57 -0
- package/dist/merge-fields/mergeOrAddPostprocess.js.map +1 -0
- package/dist/merge-fields/mergeOrAddSubfield.js +203 -0
- package/dist/merge-fields/mergeOrAddSubfield.js.map +1 -0
- package/dist/merge-fields/mergeSubfield.js +277 -0
- package/dist/merge-fields/mergeSubfield.js.map +1 -0
- package/dist/merge-fields/removeDuplicateSubfields.js +48 -0
- package/dist/merge-fields/removeDuplicateSubfields.js.map +1 -0
- package/dist/merge-fields/worldKnowledge.js +98 -0
- package/dist/merge-fields/worldKnowledge.js.map +1 -0
- package/dist/merge-fields.spec.js +51 -0
- package/dist/merge-fields.spec.js.map +1 -0
- package/dist/subfield6Utils.js +16 -1
- package/dist/subfield6Utils.js.map +1 -1
- package/dist/utils.js +108 -0
- package/dist/utils.js.map +1 -1
- package/package.json +6 -6
- package/src/index.js +3 -1
- package/src/melindaCustomMergeFields.json +5120 -0
- package/src/merge-fields/config.json +83 -0
- package/src/merge-fields/controlSubfields.js +307 -0
- package/src/merge-fields/counterpartField.js +736 -0
- package/src/merge-fields/index.js +69 -0
- package/src/merge-fields/mergableIndicator.js +90 -0
- package/src/merge-fields/mergableTag.js +89 -0
- package/src/merge-fields/mergeConstraints.js +309 -0
- package/src/merge-fields/mergeField.js +187 -0
- package/src/merge-fields/mergeIndicator.js +185 -0
- package/src/merge-fields/mergeOrAddPostprocess.js +56 -0
- package/src/merge-fields/mergeOrAddSubfield.js +218 -0
- package/src/merge-fields/mergeSubfield.js +306 -0
- package/src/merge-fields/removeDuplicateSubfields.js +50 -0
- package/src/merge-fields/worldKnowledge.js +104 -0
- package/src/merge-fields.spec.js +52 -0
- package/src/subfield6Utils.js +14 -1
- package/src/utils.js +119 -0
- package/test-fixtures/merge-fields/f01/expectedResult.json +11 -0
- package/test-fixtures/merge-fields/f01/metadata.json +5 -0
- package/test-fixtures/merge-fields/f01/record.json +13 -0
- package/test-fixtures/merge-fields/f02/expectedResult.json +14 -0
- package/test-fixtures/merge-fields/f02/metadata.json +6 -0
- package/test-fixtures/merge-fields/f02/record.json +16 -0
- package/test-fixtures/merge-fields/f03/expectedResult.json +17 -0
- package/test-fixtures/merge-fields/f03/metadata.json +7 -0
- package/test-fixtures/merge-fields/f03/record.json +23 -0
- package/test-fixtures/merge-fields/f04/expectedResult.json +14 -0
- package/test-fixtures/merge-fields/f04/metadata.json +5 -0
- package/test-fixtures/merge-fields/f04/record.json +19 -0
- package/test-fixtures/merge-fields/v01/expectedResult.json +6 -0
- package/test-fixtures/merge-fields/v01/metadata.json +5 -0
- package/test-fixtures/merge-fields/v01/record.json +13 -0
- package/test-fixtures/merge-fields/v02/expectedResult.json +4 -0
- package/test-fixtures/merge-fields/v02/metadata.json +5 -0
- package/test-fixtures/merge-fields/v02/record.json +13 -0
- package/test-fixtures/merge-fields/v03/expectedResult.json +6 -0
- package/test-fixtures/merge-fields/v03/metadata.json +6 -0
- package/test-fixtures/merge-fields/v03/record.json +16 -0
- package/test-fixtures/merge-fields/v04/expectedResult.json +4 -0
- package/test-fixtures/merge-fields/v04/metadata.json +6 -0
- package/test-fixtures/merge-fields/v04/record.json +16 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"removeDuplicateSubfields.js","names":["_utils","require","_debug","_interopRequireDefault","_normalizeFieldForComparison","_sortSubfields","_punctuation","e","__esModule","default","debug","createDebugLogger","debugDev","extend","recordRemoveDuplicateSubfieldsFromFields","record","fields","forEach","field","fieldRemoveDuplicateSubfields","subfields","includes","tag","strippedField","cloneAndRemovePunctuation","seen","filter","sf","i","notSeenBefore","collapsed","sortAdjacentSubfields","fieldFixPunctuation","index","subfieldAsString","subfieldToString","nvdebug"],"sources":["../../src/merge-fields/removeDuplicateSubfields.js"],"sourcesContent":["\nimport {nvdebug, subfieldToString} from '../utils.js';\nimport createDebugLogger from 'debug';\nimport {cloneAndRemovePunctuation} from '../normalizeFieldForComparison.js';\nimport {sortAdjacentSubfields} from '../sortSubfields';\nimport {fieldFixPunctuation} from '../punctuation2';\n\n\n// NB This should be moved and converted to a validator/fixer as well...\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:merge-fields:removeDuplicateSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport function recordRemoveDuplicateSubfieldsFromFields(record) {\n record.fields.forEach(field => fieldRemoveDuplicateSubfields(field));\n}\n\nexport function fieldRemoveDuplicateSubfields(field) {\n // Skip bad (382, 505) and risky (264 ...) stuff: 382$n, 505$r, others...\n if (!field.subfields || ['264', '300', '382', '505'].includes(field.tag)) {\n return;\n }\n\n const strippedField = cloneAndRemovePunctuation(field); // make punctuation-less version\n /* eslint-disable */\n let seen = {};\n\n field.subfields = field.subfields.filter((sf, i) => notSeenBefore(sf, i));\n\n if (field.collapsed) {\n sortAdjacentSubfields(field);\n fieldFixPunctuation(field);\n delete field.collapsed;\n }\n\n\n function notSeenBefore(sf, index) {\n const subfieldAsString = subfieldToString(strippedField.subfields[index]); // use normalized form\n if (seen[subfieldAsString]) {\n nvdebug(`Remove field-internal duplicate subfield ${subfieldToString(sf)}`, debugDev);\n field.collapsed = 1; // trigger punctuation reset\n return false;\n }\n //nvdebug(`identical subfield removal: Add ${subfieldAsString} to seen[]`, debugDev);\n seen[subfieldAsString] = subfieldAsString;\n return true;\n }\n /* eslint-enable */\n\n}\n"],"mappings":";;;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,4BAAA,GAAAH,OAAA;AACA,IAAAI,cAAA,GAAAJ,OAAA;AACA,IAAAK,YAAA,GAAAL,OAAA;AAAoD,SAAAE,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGpD;AACA,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,gFAAgF,CAAC;AACjH;AACA,MAAMC,QAAQ,GAAGF,KAAK,CAACG,MAAM,CAAC,KAAK,CAAC;AAE7B,SAASC,wCAAwCA,CAACC,MAAM,EAAE;EAC/DA,MAAM,CAACC,MAAM,CAACC,OAAO,CAACC,KAAK,IAAIC,6BAA6B,CAACD,KAAK,CAAC,CAAC;AACtE;AAEO,SAASC,6BAA6BA,CAACD,KAAK,EAAE;EACnD;EACA,IAAI,CAACA,KAAK,CAACE,SAAS,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACC,QAAQ,CAACH,KAAK,CAACI,GAAG,CAAC,EAAE;IACxE;EACF;EAEA,MAAMC,aAAa,GAAG,IAAAC,sDAAyB,EAACN,KAAK,CAAC,CAAC,CAAC;EACxD;EACA,IAAIO,IAAI,GAAG,CAAC,CAAC;EAEbP,KAAK,CAACE,SAAS,GAAGF,KAAK,CAACE,SAAS,CAACM,MAAM,CAAC,CAACC,EAAE,EAAEC,CAAC,KAAKC,aAAa,CAACF,EAAE,EAAEC,CAAC,CAAC,CAAC;EAEzE,IAAIV,KAAK,CAACY,SAAS,EAAE;IACnB,IAAAC,oCAAqB,EAACb,KAAK,CAAC;IAC5B,IAAAc,gCAAmB,EAACd,KAAK,CAAC;IAC1B,OAAOA,KAAK,CAACY,SAAS;EACxB;EAGA,SAASD,aAAaA,CAACF,EAAE,EAAEM,KAAK,EAAE;IAChC,MAAMC,gBAAgB,GAAG,IAAAC,uBAAgB,EAACZ,aAAa,CAACH,SAAS,CAACa,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAIR,IAAI,CAACS,gBAAgB,CAAC,EAAE;MAC1B,IAAAE,cAAO,EAAC,4CAA4C,IAAAD,uBAAgB,EAACR,EAAE,CAAC,EAAE,EAAEf,QAAQ,CAAC;MACrFM,KAAK,CAACY,SAAS,GAAG,CAAC,CAAC,CAAC;MACrB,OAAO,KAAK;IACd;IACA;IACAL,IAAI,CAACS,gBAAgB,CAAC,GAAGA,gBAAgB;IACzC,OAAO,IAAI;EACb;EACA;AAEF","ignoreList":[]}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.normalizeForSamenessCheck = normalizeForSamenessCheck;
|
|
7
|
+
exports.valueCarriesMeaning = valueCarriesMeaning;
|
|
8
|
+
//import {nvdebug} from '../utils';
|
|
9
|
+
|
|
10
|
+
function valueCarriesMeaning(tag, subfieldCode, value) {
|
|
11
|
+
// Some data is pretty meaningless and as meaningless is pretty close to nothing, this meaningless data should no prevent merge.
|
|
12
|
+
// The list below is incomples (swedish translations etc)
|
|
13
|
+
if (tag === '260' || tag === '264') {
|
|
14
|
+
// We drop these, instead of normalizing, as KV does not put this information in place...
|
|
15
|
+
if (subfieldCode === 'a') {
|
|
16
|
+
if (value.match(/^[^a-z]*(?:Kustannuspaikka tuntematon|S\.l)[^a-z]*$/ui)) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (subfieldCode === 'b') {
|
|
21
|
+
if (value.match(/^[^a-z]*(?:Kustantaja tuntematon|S\.n)[^a-z]*$/ui)) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
function normalizeForSamenessCheck(tag, subfieldCode, originalValue) {
|
|
30
|
+
// NB! These work only for non-repeatable subfields!
|
|
31
|
+
// Repeatable subfields are currently handled in mergeSubfields.js. Only non-repeatable subfields block field merge,
|
|
32
|
+
// (This split is suboptiomal... Minimum fix: make this disctinction cleaner...)
|
|
33
|
+
if (subfieldCode === 'a' && ['100', '600', '700', '800'].includes(tag)) {
|
|
34
|
+
return normalizePersonalName(originalValue);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// NB! originalValue should already be lowercased, stripped on initial '[' chars and postpunctuation.
|
|
38
|
+
if (tag === '250' && subfieldCode === 'a') {
|
|
39
|
+
return normalizeEditionStatement(originalValue);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// 506 - Restrictions on Access Note (R), $a - Terms governing access (NR)
|
|
43
|
+
if (tag === '506' && subfieldCode === 'a') {
|
|
44
|
+
return normalize506a(originalValue);
|
|
45
|
+
}
|
|
46
|
+
if (tag === '534' && subfieldCode === 'p') {
|
|
47
|
+
return normalizeOriginalVersionNoteIntroductoryPhrase(originalValue);
|
|
48
|
+
}
|
|
49
|
+
return originalValue;
|
|
50
|
+
}
|
|
51
|
+
function normalizePersonalName(originalValue) {
|
|
52
|
+
// Use more readable "Forename Surname" format in comparisons:
|
|
53
|
+
return originalValue.replace(/^([^,]+), ([^,]+)$/u, '$2 $1'); // eslint-disable-line prefer-named-capture-group
|
|
54
|
+
}
|
|
55
|
+
const sallittu506a = ['sallittu kaikenikäisille', 'sallittu', 's']; // downcased, without punctuation
|
|
56
|
+
function normalize506a(originalValue) {
|
|
57
|
+
if (sallittu506a.includes(originalValue)) {
|
|
58
|
+
return sallittu506a[0];
|
|
59
|
+
}
|
|
60
|
+
return originalValue;
|
|
61
|
+
}
|
|
62
|
+
const introductoryPhrasesMeaning1 = ['alkuperäinen', 'alkuperäisen julkaisutiedot', 'alun perin julkaistu', 'alunperin julkaistu'];
|
|
63
|
+
function normalizeOriginalVersionNoteIntroductoryPhrase(originalValue) {
|
|
64
|
+
// MELKEHITYS-1935-ish:
|
|
65
|
+
if (introductoryPhrasesMeaning1.includes(originalValue)) {
|
|
66
|
+
return introductoryPhrasesMeaning1[0];
|
|
67
|
+
}
|
|
68
|
+
return originalValue;
|
|
69
|
+
}
|
|
70
|
+
function normalizeEditionStatement(originalValue) {
|
|
71
|
+
const value = originalValue;
|
|
72
|
+
|
|
73
|
+
// As normalization tries to translate things info Finnish, use this for similarity check only!
|
|
74
|
+
if (value.match(/^[1-9][0-9]*(?:\.|:a|nd|rd|st|th) (?:ed\.?|edition|p\.?|painos|uppl\.?|upplagan)[.\]]*$/ui)) {
|
|
75
|
+
const nth = value.replace(/[^0-9].*$/u, '');
|
|
76
|
+
return `${nth}. painos`;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Quick and dirty fix for
|
|
80
|
+
if (value.match(/^[1-9][0-9]*(?:\.|:a|nd|rd|st|th)(?: förnyade|,? rev\.| uud\.| uudistettu) (?:ed\.?|edition|p\.?|painos|uppl\.?|upplagan)[.\]]*$/ui)) {
|
|
81
|
+
const nth = value.replace(/[^0-9].*$/u, '');
|
|
82
|
+
return `${nth}. uudistettu painos`;
|
|
83
|
+
}
|
|
84
|
+
if (value.match(/^(?:First|Första|Ensimmäinen) (?:ed\.?|edition|p\.?|painos|uppl\.?|upplagan)[.\]]*$/ui)) {
|
|
85
|
+
return `1. painos`;
|
|
86
|
+
}
|
|
87
|
+
if (value.match(/^(?:Andra|Second|Toinen) (?:ed\.?|edition|p\.?|painos|uppl\.?|upplagan)[.\]]*$/ui)) {
|
|
88
|
+
return `2. painos`;
|
|
89
|
+
}
|
|
90
|
+
if (value.match(/^(?:Kolmas|Third|Tredje) (?:ed\.?|edition|p\.?|painos|uppl\.?|upplagan)[.\]]*$/ui)) {
|
|
91
|
+
return `3. painos`;
|
|
92
|
+
}
|
|
93
|
+
if (value.match(/^(?:Fourth|Fjärde|Neljäs) (?:ed\.?|edition|p\.?|painos|uppl\.?|upplagan)[.\]]*$/ui)) {
|
|
94
|
+
return `4. painos`;
|
|
95
|
+
}
|
|
96
|
+
return originalValue;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=worldKnowledge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worldKnowledge.js","names":["valueCarriesMeaning","tag","subfieldCode","value","match","normalizeForSamenessCheck","originalValue","includes","normalizePersonalName","normalizeEditionStatement","normalize506a","normalizeOriginalVersionNoteIntroductoryPhrase","replace","sallittu506a","introductoryPhrasesMeaning1","nth"],"sources":["../../src/merge-fields/worldKnowledge.js"],"sourcesContent":["//import {nvdebug} from '../utils';\n\nexport function valueCarriesMeaning(tag, subfieldCode, value) {\n // Some data is pretty meaningless and as meaningless is pretty close to nothing, this meaningless data should no prevent merge.\n // The list below is incomples (swedish translations etc)\n if (tag === '260' || tag === '264') {\n // We drop these, instead of normalizing, as KV does not put this information in place...\n if (subfieldCode === 'a') {\n if (value.match(/^[^a-z]*(?:Kustannuspaikka tuntematon|S\\.l)[^a-z]*$/ui)) {\n return false;\n }\n }\n if (subfieldCode === 'b') {\n if (value.match(/^[^a-z]*(?:Kustantaja tuntematon|S\\.n)[^a-z]*$/ui)) {\n return false;\n }\n }\n return true;\n }\n return true;\n}\n\nexport function normalizeForSamenessCheck(tag, subfieldCode, originalValue) {\n // NB! These work only for non-repeatable subfields!\n // Repeatable subfields are currently handled in mergeSubfields.js. Only non-repeatable subfields block field merge,\n // (This split is suboptiomal... Minimum fix: make this disctinction cleaner...)\n if (subfieldCode === 'a' && ['100', '600', '700', '800'].includes(tag)) {\n return normalizePersonalName(originalValue);\n }\n\n // NB! originalValue should already be lowercased, stripped on initial '[' chars and postpunctuation.\n if (tag === '250' && subfieldCode === 'a') {\n return normalizeEditionStatement(originalValue);\n }\n\n // 506 - Restrictions on Access Note (R), $a - Terms governing access (NR)\n if (tag === '506' && subfieldCode === 'a') {\n return normalize506a(originalValue);\n }\n\n if (tag === '534' && subfieldCode === 'p') {\n return normalizeOriginalVersionNoteIntroductoryPhrase(originalValue);\n }\n\n return originalValue;\n}\n\n\nfunction normalizePersonalName(originalValue) {\n // Use more readable \"Forename Surname\" format in comparisons:\n return originalValue.replace(/^([^,]+), ([^,]+)$/u, '$2 $1'); // eslint-disable-line prefer-named-capture-group\n}\n\nconst sallittu506a = ['sallittu kaikenikäisille', 'sallittu', 's']; // downcased, without punctuation\nfunction normalize506a(originalValue) {\n if (sallittu506a.includes(originalValue)) {\n return sallittu506a[0];\n }\n return originalValue;\n}\n\nconst introductoryPhrasesMeaning1 = ['alkuperäinen', 'alkuperäisen julkaisutiedot', 'alun perin julkaistu', 'alunperin julkaistu'];\nfunction normalizeOriginalVersionNoteIntroductoryPhrase(originalValue) {\n // MELKEHITYS-1935-ish:\n if (introductoryPhrasesMeaning1.includes(originalValue)) {\n return introductoryPhrasesMeaning1[0];\n }\n\n return originalValue;\n}\n\nfunction normalizeEditionStatement(originalValue) {\n const value = originalValue;\n\n // As normalization tries to translate things info Finnish, use this for similarity check only!\n if (value.match(/^[1-9][0-9]*(?:\\.|:a|nd|rd|st|th) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n const nth = value.replace(/[^0-9].*$/u, '');\n return `${nth}. painos`;\n }\n\n // Quick and dirty fix for\n if (value.match(/^[1-9][0-9]*(?:\\.|:a|nd|rd|st|th)(?: förnyade|,? rev\\.| uud\\.| uudistettu) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n const nth = value.replace(/[^0-9].*$/u, '');\n return `${nth}. uudistettu painos`;\n }\n\n if (value.match(/^(?:First|Första|Ensimmäinen) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `1. painos`;\n }\n\n if (value.match(/^(?:Andra|Second|Toinen) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `2. painos`;\n }\n\n if (value.match(/^(?:Kolmas|Third|Tredje) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `3. painos`;\n }\n\n if (value.match(/^(?:Fourth|Fjärde|Neljäs) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `4. painos`;\n }\n\n return originalValue;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _chai = require("chai");
|
|
4
|
+
var _marcRecord = require("@natlibfi/marc-record");
|
|
5
|
+
var _mergeFields = _interopRequireDefault(require("./merge-fields/"));
|
|
6
|
+
var _fixura = require("@natlibfi/fixura");
|
|
7
|
+
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
8
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
(0, _fixugen.default)({
|
|
11
|
+
callback,
|
|
12
|
+
path: [__dirname, '..', 'test-fixtures', 'merge-fields'],
|
|
13
|
+
useMetadataFile: true,
|
|
14
|
+
recurse: false,
|
|
15
|
+
fixura: {
|
|
16
|
+
reader: _fixura.READERS.JSON
|
|
17
|
+
},
|
|
18
|
+
mocha: {
|
|
19
|
+
before: () => testValidatorFactory()
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/merge-field:test');
|
|
23
|
+
async function testValidatorFactory() {
|
|
24
|
+
const validator = await (0, _mergeFields.default)();
|
|
25
|
+
(0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
|
|
26
|
+
(0, _chai.expect)(validator.description).to.be.a('string');
|
|
27
|
+
(0, _chai.expect)(validator.validate).to.be.a('function');
|
|
28
|
+
}
|
|
29
|
+
async function callback({
|
|
30
|
+
getFixture,
|
|
31
|
+
enabled = true,
|
|
32
|
+
fix = false
|
|
33
|
+
}) {
|
|
34
|
+
if (enabled === false) {
|
|
35
|
+
debug('TEST SKIPPED!');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const validator = await (0, _mergeFields.default)();
|
|
39
|
+
const record = new _marcRecord.MarcRecord(getFixture('record.json'));
|
|
40
|
+
const expectedResult = getFixture('expectedResult.json');
|
|
41
|
+
// console.log(expectedResult); // eslint-disable-line
|
|
42
|
+
|
|
43
|
+
if (!fix) {
|
|
44
|
+
const result = await validator.validate(record);
|
|
45
|
+
(0, _chai.expect)(result).to.eql(expectedResult);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
await validator.fix(record);
|
|
49
|
+
(0, _chai.expect)(record).to.eql(expectedResult);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=merge-fields.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-fields.spec.js","names":["_chai","require","_marcRecord","_mergeFields","_interopRequireDefault","_fixura","_fixugen","_debug","e","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/merge-fields.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './merge-fields/';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'merge-fields'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/merge-field:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,CAAC;EACxDC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,2DAA2D,CAAC;AAE5F,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,oBAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,oBAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC","ignoreList":[]}
|
package/dist/subfield6Utils.js
CHANGED
|
@@ -26,15 +26,21 @@ exports.isSubfield6Pair = isSubfield6Pair;
|
|
|
26
26
|
exports.isValidSubfield6 = isValidSubfield6;
|
|
27
27
|
exports.recordGetMaxSubfield6OccurrenceNumberAsInteger = recordGetMaxSubfield6OccurrenceNumberAsInteger;
|
|
28
28
|
exports.recordGetSubfield6ChainHeads = recordGetSubfield6ChainHeads;
|
|
29
|
+
exports.resetSubfield6Tag = resetSubfield6Tag;
|
|
29
30
|
exports.subfield6GetOccurrenceNumber = subfield6GetOccurrenceNumber;
|
|
30
31
|
exports.subfield6GetOccurrenceNumberAsInteger = subfield6GetOccurrenceNumberAsInteger;
|
|
31
32
|
exports.subfield6HasWantedTagAndOccurrenceNumber = subfield6HasWantedTagAndOccurrenceNumber;
|
|
32
33
|
exports.subfield6ResetOccurrenceNumber = subfield6ResetOccurrenceNumber;
|
|
34
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
33
35
|
var _subfield8Utils = require("./subfield8Utils");
|
|
34
36
|
var _utils = require("./utils");
|
|
35
|
-
|
|
37
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
36
38
|
// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');
|
|
37
39
|
|
|
40
|
+
const debug = (0, _debug.default)('@natlibfi/melinda-marc-record-merge-reducers:subfield6Utils');
|
|
41
|
+
//const debugData = debug.extend('data');
|
|
42
|
+
const debugDev = debug.extend('dev');
|
|
43
|
+
|
|
38
44
|
// NB! Subfield 6 is non-repeatable and it should always comes first!
|
|
39
45
|
// NB! Index size should always be 2 (preceding 0 required for 01..09) However, support for 100+ was added on 2023-02-27.
|
|
40
46
|
// NB! Index value '00' are left as they are (is not paired/indexed/whatever.
|
|
@@ -452,4 +458,13 @@ function get6s(field, candidateFields) {
|
|
|
452
458
|
relevantFields.forEach(f => (0, _utils.nvdebug)((0, _utils.fieldToString)(f)));
|
|
453
459
|
return relevantFields;
|
|
454
460
|
}
|
|
461
|
+
function resetSubfield6Tag(subfield, tag) {
|
|
462
|
+
if (!isValidSubfield6(subfield)) {
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
// NB! mainly for 1XX<->7XX transfers
|
|
466
|
+
const newValue = `${tag}-${subfield.value.substring(4)}`;
|
|
467
|
+
(0, _utils.nvdebug)(`Set subfield $6 value from ${(0, _utils.subfieldToString)(subfield)} to ${newValue}`, debugDev);
|
|
468
|
+
subfield.value = newValue; // eslint-disable-line functional/immutable-data
|
|
469
|
+
}
|
|
455
470
|
//# sourceMappingURL=subfield6Utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subfield6Utils.js","names":["_subfield8Utils","require","_utils","sf6Regexp","isValidSubfield6","subfield","code","value","match","subfield6GetTag","substring","undefined","subfield6GetOccurrenceNumber","replace","subfield6GetOccurrenceNumberAsInteger","index","result","parseInt","subfield6ResetOccurrenceNumber","occurrenceNumber","occurrenceNumberAsString","intToOccurrenceNumberString","newValue","subfield6GetTail","subfield6HasWantedTagAndOccurrenceNumber","tagAndOccurrenceNumber","key","nvdebug","fieldGetUnambiguousTag","field","tags","subfields","filter","sf","length","subfieldToString","fieldGetUnambiguousOccurrenceNumber","occurrenceNumbers","fieldHasOccurrenceNumber","some","fieldResetOccurrenceNumber","newOccurrenceNumber","oldOccurrenceNumber","forEach","innerReset","currOccurrenceNumber","i","fieldGetMaxSubfield6OccurrenceNumberAsInteger","sf6s","vals","map","Math","max","fieldHasWantedTagAndOccurrenceNumber","fieldHasValidSubfield6","isSubfield6Pair","otherField","tagsArePairable6","tag","fieldIndex","otherFieldIndex","tag1","tag2","subfieldSevenToOneOccurrenceNumber","fieldSevenToOneOccurrenceNumber","fieldGetOccurrenceNumberPairs","candFields","pairs","fieldToString","pairedField","fieldGetOccurrenceNumbers","subfieldExtractOccurrenceNumber","includes","push","fieldsGetOccurrenceNumbers","fields","f","fieldProcessOccurrenceNumbers","newOccurrenceNumbers","is7XX","normalizeEntryTag","subfieldToNormalizedString","targetLinkingNumber","normalizeOccurrenceNumber","normalizeEntryTagBoolean","isValidSubfield8","currLinkingNumber","getSubfield8LinkingNumber","normVal","fieldToNormalizedString","ind1","ind2","formatAndNormalizeSubfields","join","guessTargetLinkingNumber","defaultTargetLinkingNumber","linkingNumbers","fieldsGetAllSubfield8LinkingNumbers","fieldsToNormalizedString","strings","sort","getFirstField","record","fieldsAsStrings","findIndex","isRelevantSubfield6Chain","non880","every","fieldHasSubfield","fieldIsFirstFieldInChain","chain","firstField","getAllLinkedSubfield6Fields","get6s","moreFields","add8s","isFirstLinkedSubfield6Field","fieldsToString","recordGetSubfield6ChainHeads","recordGetMaxSubfield6OccurrenceNumberAsInteger","candidateFields","sixes","relevantFields","o"],"sources":["../src/subfield6Utils.js"],"sourcesContent":["// import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');\n\nimport {add8s, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, isValidSubfield8} from './subfield8Utils';\nimport {fieldHasSubfield, fieldToString, fieldsToString, nvdebug, subfieldToString} from './utils';\n\n// NB! Subfield 6 is non-repeatable and it should always comes first!\n// NB! Index size should always be 2 (preceding 0 required for 01..09) However, support for 100+ was added on 2023-02-27.\n// NB! Index value '00' are left as they are (is not paired/indexed/whatever.\nconst sf6Regexp = /^[0-9][0-9][0-9]-(?:[0-9][0-9]|[1-9][0-9]+)(?:[^0-9].*)?$/u;\n\nexport function isValidSubfield6(subfield) {\n if (subfield.code !== '6') {\n return false;\n }\n return subfield.value.match(sf6Regexp);\n}\n\nfunction subfield6GetTag(subfield) {\n if (isValidSubfield6(subfield)) {\n return subfield.value.substring(0, 3);\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumber(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.substring(4).replace(/\\D.*$/u, '');\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumberAsInteger(subfield) {\n const index = subfield6GetOccurrenceNumber(subfield);\n if (index === undefined || index === '00') {\n return 0;\n }\n const result = parseInt(index, 10);\n //nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debug);\n return result;\n}\n\nexport function subfield6ResetOccurrenceNumber(subfield, occurrenceNumber) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;\n\n const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield); // eslint-disable-line functional/immutable-data\n //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);\n subfield.value = newValue; // eslint-disable-line functional/immutable-data\n}\n\n\nfunction subfield6GetTail(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.replace(/^\\d+-\\d+/u, '');\n }\n return '';\n}\n\nexport function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumber) {\n if (subfield.code !== '6') {\n return false;\n }\n // We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...\n const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1'); // eslint-disable-line prefer-named-capture-group\n nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);\n return key === tagAndOccurrenceNumber;\n}\n\n// <= SUBFIELD, FIELD =>\n\nexport function fieldGetUnambiguousTag(field) {\n const tags = field.subfields.filter(sf => subfield6GetTag(sf));\n if (tags.length === 1) {\n nvdebug(` GOT ${tags.length} tag(s): ${subfieldToString(tags[0])}`);\n return subfield6GetTag(tags[0]);\n }\n return undefined;\n}\n\nexport function fieldGetUnambiguousOccurrenceNumber(field) {\n const occurrenceNumbers = field.subfields.filter(sf => subfield6GetOccurrenceNumber(sf));\n if (occurrenceNumbers.length === 1) {\n return subfield6GetOccurrenceNumber(occurrenceNumbers[0]);\n }\n return undefined;\n}\n\nexport function fieldHasOccurrenceNumber(field, occurrenceNumber) {\n //nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`);\n return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);\n}\n\nexport function fieldResetOccurrenceNumber(field, newOccurrenceNumber, oldOccurrenceNumber = undefined) {\n field.subfields.forEach(subfield => innerReset(subfield));\n\n function innerReset(subfield) {\n // (Optional) Check that this is really the occurrence number we wan't to reseot\n if (oldOccurrenceNumber !== undefined) {\n const currOccurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (currOccurrenceNumber !== oldOccurrenceNumber) {\n return;\n }\n }\n subfield6ResetOccurrenceNumber(subfield, newOccurrenceNumber);\n }\n}\n\nexport function intToOccurrenceNumberString(i) {\n return i < 10 ? `0${i}` : `${i}`;\n}\n\nexport function fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {\n // used by reducer!\n //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`);\n const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];\n if (sf6s.length === 0) {\n return 0;\n }\n // There should always be one, but here we check every subfield.\n //nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debug);\n const vals = sf6s.map(sf => subfield6GetOccurrenceNumberAsInteger(sf));\n return Math.max(...vals);\n}\n\nexport function fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber) {\n return field.subfields && field.subfields.some(sf => subfield6HasWantedTagAndOccurrenceNumber(sf, tagAndOccurrenceNumber));\n}\n\n\n/*\nexport function getFieldsWithGivenOccurrenceNumberSubfield6(record, occurrenceNumberAsString) {\n const record.fields.filter(field => field\n\n function fieldHasIndex(field, index) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.find(sf => isValidSubfield6(sf) && subfieldGetOccurrenceNumber6(sf) === index);\n }\n}\n*/\n\n\nexport function fieldHasValidSubfield6(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield6(sf));\n}\n\nexport function isSubfield6Pair(field, otherField) {\n // No need to log this:\n //nvdebug(`LOOK for $6-pair:\\n ${fieldToString(field)}\\n ${fieldToString(otherField)}`);\n if (!fieldHasValidSubfield6(field) || !fieldHasValidSubfield6(otherField)) {\n return false;\n }\n\n if (!tagsArePairable6(field.tag, otherField.tag)) {\n //nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`);\n return false;\n }\n\n\n const fieldIndex = fieldGetUnambiguousOccurrenceNumber(field);\n if (fieldIndex === undefined || fieldIndex === '00') {\n //nvdebug(` FAILED. REASON: NO INDEX FOUND`);\n return false;\n }\n\n const otherFieldIndex = fieldGetUnambiguousOccurrenceNumber(otherField);\n\n\n if (fieldIndex !== otherFieldIndex) {\n //nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`);\n return false;\n }\n\n if (fieldGetUnambiguousTag(field) !== otherField.tag || field.tag !== fieldGetUnambiguousTag(otherField)) {\n //nvdebug(` FAILURE: TAG vs $6 TAG`);\n return false;\n }\n return true;\n\n function tagsArePairable6(tag1, tag2) {\n // How to do XOR operation in one line? Well, this is probably more readable...\n if (tag1 === '880' && tag2 === '880') {\n return false;\n }\n if (tag1 !== '880' && tag2 !== '880') {\n return false;\n }\n return true;\n }\n}\n\n\nfunction subfieldSevenToOneOccurrenceNumber(subfield) {\n if (subfield.code !== '6' || subfield.value.substring(0, 1) !== '7') {\n return;\n }\n subfield.value = `1${subfield.value.substring(1)}`; // eslint-disable-line functional/immutable-data\n}\n\nexport function fieldSevenToOneOccurrenceNumber(field) {\n if (field.tag !== '880') {\n return;\n }\n field.subfields.forEach(sf => subfieldSevenToOneOccurrenceNumber(sf));\n}\n\n\nexport function fieldGetOccurrenceNumberPairs(field, candFields) {\n // NB! TAG!=880 returns 880 fields, TAG==880 returns non-880 field\n //nvdebug(` Trying to finds pair for ${fieldToString(field)} in ${candFields.length} fields`);\n const pairs = candFields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairs.length === 0) {\n nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`);\n return pairs;\n }\n nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`);\n pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`));\n return pairs;\n}\n\nexport function fieldGetOccurrenceNumbers(field) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n field.subfields?.forEach(sf => subfieldExtractOccurrenceNumber(sf));\n\n function subfieldExtractOccurrenceNumber(sf) {\n if (!isValidSubfield6(sf)) {\n return;\n }\n const occurrenceNumber = subfield6GetOccurrenceNumber(sf);\n if (occurrenceNumber === '00' || occurrenceNumbers.includes(occurrenceNumber)) {\n return;\n }\n occurrenceNumbers.push(occurrenceNumber);\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\nexport function fieldsGetOccurrenceNumbers(fields) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n\n fields.forEach(f => fieldProcessOccurrenceNumbers(f));\n\n function fieldProcessOccurrenceNumbers(f) {\n const newOccurrenceNumbers = fieldGetOccurrenceNumbers(f);\n newOccurrenceNumbers.forEach(occurrenceNumber => {\n if (!occurrenceNumbers.includes(occurrenceNumber)) {\n occurrenceNumbers.push(occurrenceNumber);\n }\n\n });\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\n/*\nexport function fieldGetSubfield6Pair(field, record) {\n const pairedFields = record.fields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairedFields.length !== 1) {\n return undefined;\n }\n // NB! It is theoretically possible to have multiple pairable 880 fields (one for each encoding)\n nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`);\n return pairedFields[0];\n}\n*/\n\n/*\nexport function pairAndStringify6(field, record) {\n const pair6 = fieldGetSubfield6Pair(field, record);\n if (!pair6) {\n return fieldToNormalizedString(field);\n }\n return fieldsToNormalizedString([field, pair6]);\n}\n*/\n\n// Frequencly list for $6 subfields in 1XX/7XX fields:\n// 231115 100\n// 183832 700\n// 28773 710\n// 2047 711\n// 661 110\n// 341 111\n// 284 130\n// 63 730\n// Thus there's a real risk of ending up with, say, identical 100 vs 700 chains.\n// Semi-hackily support 1XX/7XX-version: 7XX can be deleted if corresponding 1XX exists:\n\nexport function is7XX(tag) {\n return ['700', '710', '711', '730'].includes(tag);\n}\n\n\nfunction normalizeEntryTag(tag) {\n if (tag.match(/^[17](?:00|10|11|30)$/u)) {\n return `X${tag.substring(1)}`;\n }\n return tag;\n}\n\nfunction subfieldToNormalizedString(sf, tag, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n // targetLinkingNumber refers to $8.\n // normalizeEntryTagBoolean refers to 1XX/7XX tag values in subfield $6 value.\n if (isValidSubfield6(sf)) { // && targetLinkingNumber === 0) {\n // 1XX/7XX (entry tag) normalization:\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(tag) : tag;\n\n const occurrenceNumber = normalizeOccurrenceNumber ? 'XX' : subfield6GetOccurrenceNumber(sf);\n // If we are normalizing a $8 chain, don't normalize $6 occurrence number!\n // Replace $6 occurrence number with XX:\n return ` ‡${sf.code} ${tag2}-${occurrenceNumber}${subfield6GetTail(sf)}`;\n }\n\n if (isValidSubfield8(sf)) {\n const currLinkingNumber = getSubfield8LinkingNumber(sf); //getSubfield8Index(sf);\n if (targetLinkingNumber > 0 && currLinkingNumber === targetLinkingNumber) {\n // For $8 we should only XX the index we are looking at...\n const normVal = sf.value.replace(/^[0-9]+/u, 'XX');\n return ` ‡${sf.code} ${normVal}`;\n }\n return ''; // Other $8 subfields are meaningless in this context\n }\n return ` ${subfieldToString(sf)}`; // `‡${sf.code} ${sf.value}`;\n}\n\nexport function fieldToNormalizedString(field, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n if ('subfields' in field) {\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(field.tag) : field.tag;\n return `${tag2} ${field.ind1}${field.ind2}${formatAndNormalizeSubfields(field)}`;\n }\n return `${field.tag} ${field.value}`;\n\n function formatAndNormalizeSubfields(field) {\n return field.subfields.map(sf => subfieldToNormalizedString(sf, field.tag, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTagBoolean)).join('');\n }\n\n}\n\n\nfunction guessTargetLinkingNumber(fields, defaultTargetLinkingNumber) {\n if (defaultTargetLinkingNumber !== 0) {\n return defaultTargetLinkingNumber;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n return linkingNumbers.length === 1 ? linkingNumbers[0] : 0; // eslint-disable-line no-param-reassign\n}\n\nexport function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTag = false) {\n const targetLinkingNumber = guessTargetLinkingNumber(fields, defaultTargetLinkingNumber);\n\n nvdebug(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`);\n const strings = fields.map(field => fieldToNormalizedString(field, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTag));\n strings.sort(); // eslint-disable-line functional/immutable-data\n return strings.join('\\t__SEPARATOR__\\t');\n}\n\n\n/*\n\nexport function removeField6IfNeeded(field, record, fieldsAsString) {\n const pairField = fieldGetSubfield6Pair(field, record);\n const asString = pairField ? fieldsToNormalizedString([field, pairField]) : fieldToNormalizedString(field);\n nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`);\n const tmp = pairField ? fieldToString(pairField) : 'HUTI';\n nvdebug(`PAIR: ${tmp}`);\n nvdebug(`BASE:\\n ${fieldsAsString.join('\\n ')}`);\n if (!fieldsAsString.includes(asString)) {\n return;\n }\n nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`);\n record.removeField(field);\n\n if (pairField === undefined) {\n return;\n }\n nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`);\n record.removeField(pairField);\n}\n*/\n\nfunction getFirstField(record, fields) {\n const fieldsAsStrings = fields.map(field => fieldToString(field));\n //record.fields.forEach((field, i) => nvdebug(`${i}:\\t${fieldToString(field)}`));\n //nvdebug(`getFirstField: ${fieldsAsStrings.join('\\t')}`);\n const i = record.fields.findIndex(field => fieldsAsStrings.includes(fieldToString(field)));\n if (i > -1) {\n const field = record.fields[i];\n //nvdebug(`1st F: ${i + 1}/${record.fields.length} ${fieldToString(field)}`);\n return field;\n }\n return undefined;\n}\n\nfunction isRelevantSubfield6Chain(fields) {\n if (fields.length < 2) { // 1 non-880-field and 1+ 880 fields\n return false;\n }\n const non880 = fields.filter(f => f.tag !== '880');\n if (non880.length !== 1) {\n return false;\n }\n\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n if (linkingNumbers.length !== 0) {\n return false;\n }\n\n return fields.every(f => fieldHasSubfield(f, '6'));\n}\n\nexport function fieldIsFirstFieldInChain(field, chain, record) {\n // Interpretation of first: position of field in record (however, we might have a duplicate field. See tests...)\n const firstField = getFirstField(record, chain);\n if (firstField) {\n return fieldToString(field) === fieldToString(firstField);\n }\n return false;\n\n}\n\n\nexport function getAllLinkedSubfield6Fields(field, record) {\n const fields = get6s(field, record);\n const moreFields = add8s(fields, record);\n\n // Currently we don't handle fields with more than one $6 and/or $8 subfield.\n if (moreFields.length > fields.length) {\n return []; // Don't fix!\n }\n return moreFields;\n}\n\nexport function isFirstLinkedSubfield6Field(field, record) {\n if (!field.subfields) { // Is not a datafield\n return false;\n }\n const chain = getAllLinkedSubfield6Fields(field, record);\n if (!isRelevantSubfield6Chain(chain)) {\n nvdebug(`Rejected 6: ${fieldsToString(chain)}`);\n return false;\n }\n\n return fieldIsFirstFieldInChain(field, chain, record);\n}\n\nexport function recordGetSubfield6ChainHeads(record) {\n return record.fields.filter(field => isFirstLinkedSubfield6Field(field, record));\n}\n\nexport function recordGetMaxSubfield6OccurrenceNumberAsInteger(record) {\n if (record.fields.length === 0) {\n return 0;\n }\n // Should we cache the value here?\n const vals = record.fields.map((field) => fieldGetMaxSubfield6OccurrenceNumberAsInteger(field));\n return Math.max(...vals);\n}\n\nexport function get6s(field, candidateFields) { // NB! Convert field to fields!!!\n // Get all fields with given occurrence number\n const sixes = field.subfields.filter(sf => isValidSubfield6(sf));\n\n if (sixes.length === 0) {\n return [field];\n }\n nvdebug(`SIXES: ${sixes.length}`);\n const occurrenceNumbers = sixes.map(sf => subfield6GetOccurrenceNumber(sf)).filter(value => value !== undefined && value !== '00');\n nvdebug(occurrenceNumbers.join(' -- '));\n\n const relevantFields = candidateFields.filter(f => occurrenceNumbers.some(o => fieldHasOccurrenceNumber(f, o)));\n nvdebug(`${fieldToString(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`);\n relevantFields.forEach(f => nvdebug(fieldToString(f)));\n return relevantFields;\n}\n\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"subfield6Utils.js","names":["_debug","_interopRequireDefault","require","_subfield8Utils","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","sf6Regexp","isValidSubfield6","subfield","code","value","match","subfield6GetTag","substring","undefined","subfield6GetOccurrenceNumber","replace","subfield6GetOccurrenceNumberAsInteger","index","result","parseInt","subfield6ResetOccurrenceNumber","occurrenceNumber","occurrenceNumberAsString","intToOccurrenceNumberString","newValue","subfield6GetTail","subfield6HasWantedTagAndOccurrenceNumber","tagAndOccurrenceNumber","key","nvdebug","fieldGetUnambiguousTag","field","tags","subfields","filter","sf","length","subfieldToString","fieldGetUnambiguousOccurrenceNumber","occurrenceNumbers","fieldHasOccurrenceNumber","some","fieldResetOccurrenceNumber","newOccurrenceNumber","oldOccurrenceNumber","forEach","innerReset","currOccurrenceNumber","i","fieldGetMaxSubfield6OccurrenceNumberAsInteger","sf6s","vals","map","Math","max","fieldHasWantedTagAndOccurrenceNumber","fieldHasValidSubfield6","isSubfield6Pair","otherField","tagsArePairable6","tag","fieldIndex","otherFieldIndex","tag1","tag2","subfieldSevenToOneOccurrenceNumber","fieldSevenToOneOccurrenceNumber","fieldGetOccurrenceNumberPairs","candFields","pairs","fieldToString","pairedField","fieldGetOccurrenceNumbers","subfieldExtractOccurrenceNumber","includes","push","fieldsGetOccurrenceNumbers","fields","f","fieldProcessOccurrenceNumbers","newOccurrenceNumbers","is7XX","normalizeEntryTag","subfieldToNormalizedString","targetLinkingNumber","normalizeOccurrenceNumber","normalizeEntryTagBoolean","isValidSubfield8","currLinkingNumber","getSubfield8LinkingNumber","normVal","fieldToNormalizedString","ind1","ind2","formatAndNormalizeSubfields","join","guessTargetLinkingNumber","defaultTargetLinkingNumber","linkingNumbers","fieldsGetAllSubfield8LinkingNumbers","fieldsToNormalizedString","strings","sort","getFirstField","record","fieldsAsStrings","findIndex","isRelevantSubfield6Chain","non880","every","fieldHasSubfield","fieldIsFirstFieldInChain","chain","firstField","getAllLinkedSubfield6Fields","get6s","moreFields","add8s","isFirstLinkedSubfield6Field","fieldsToString","recordGetSubfield6ChainHeads","recordGetMaxSubfield6OccurrenceNumberAsInteger","candidateFields","sixes","relevantFields","o","resetSubfield6Tag"],"sources":["../src/subfield6Utils.js"],"sourcesContent":["import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');\n\nimport {add8s, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, isValidSubfield8} from './subfield8Utils';\nimport {fieldHasSubfield, fieldToString, fieldsToString, nvdebug, subfieldToString} from './utils';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:subfield6Utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! Subfield 6 is non-repeatable and it should always comes first!\n// NB! Index size should always be 2 (preceding 0 required for 01..09) However, support for 100+ was added on 2023-02-27.\n// NB! Index value '00' are left as they are (is not paired/indexed/whatever.\nconst sf6Regexp = /^[0-9][0-9][0-9]-(?:[0-9][0-9]|[1-9][0-9]+)(?:[^0-9].*)?$/u;\n\nexport function isValidSubfield6(subfield) {\n if (subfield.code !== '6') {\n return false;\n }\n return subfield.value.match(sf6Regexp);\n}\n\nfunction subfield6GetTag(subfield) {\n if (isValidSubfield6(subfield)) {\n return subfield.value.substring(0, 3);\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumber(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.substring(4).replace(/\\D.*$/u, '');\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumberAsInteger(subfield) {\n const index = subfield6GetOccurrenceNumber(subfield);\n if (index === undefined || index === '00') {\n return 0;\n }\n const result = parseInt(index, 10);\n //nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debug);\n return result;\n}\n\nexport function subfield6ResetOccurrenceNumber(subfield, occurrenceNumber) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;\n\n const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield); // eslint-disable-line functional/immutable-data\n //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);\n subfield.value = newValue; // eslint-disable-line functional/immutable-data\n}\n\n\nfunction subfield6GetTail(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.replace(/^\\d+-\\d+/u, '');\n }\n return '';\n}\n\nexport function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumber) {\n if (subfield.code !== '6') {\n return false;\n }\n // We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...\n const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1'); // eslint-disable-line prefer-named-capture-group\n nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);\n return key === tagAndOccurrenceNumber;\n}\n\n// <= SUBFIELD, FIELD =>\n\nexport function fieldGetUnambiguousTag(field) {\n const tags = field.subfields.filter(sf => subfield6GetTag(sf));\n if (tags.length === 1) {\n nvdebug(` GOT ${tags.length} tag(s): ${subfieldToString(tags[0])}`);\n return subfield6GetTag(tags[0]);\n }\n return undefined;\n}\n\nexport function fieldGetUnambiguousOccurrenceNumber(field) {\n const occurrenceNumbers = field.subfields.filter(sf => subfield6GetOccurrenceNumber(sf));\n if (occurrenceNumbers.length === 1) {\n return subfield6GetOccurrenceNumber(occurrenceNumbers[0]);\n }\n return undefined;\n}\n\nexport function fieldHasOccurrenceNumber(field, occurrenceNumber) {\n //nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`);\n return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);\n}\n\nexport function fieldResetOccurrenceNumber(field, newOccurrenceNumber, oldOccurrenceNumber = undefined) {\n field.subfields.forEach(subfield => innerReset(subfield));\n\n function innerReset(subfield) {\n // (Optional) Check that this is really the occurrence number we wan't to reseot\n if (oldOccurrenceNumber !== undefined) {\n const currOccurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (currOccurrenceNumber !== oldOccurrenceNumber) {\n return;\n }\n }\n subfield6ResetOccurrenceNumber(subfield, newOccurrenceNumber);\n }\n}\n\nexport function intToOccurrenceNumberString(i) {\n return i < 10 ? `0${i}` : `${i}`;\n}\n\nexport function fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {\n // used by reducer!\n //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`);\n const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];\n if (sf6s.length === 0) {\n return 0;\n }\n // There should always be one, but here we check every subfield.\n //nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debug);\n const vals = sf6s.map(sf => subfield6GetOccurrenceNumberAsInteger(sf));\n return Math.max(...vals);\n}\n\nexport function fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber) {\n return field.subfields && field.subfields.some(sf => subfield6HasWantedTagAndOccurrenceNumber(sf, tagAndOccurrenceNumber));\n}\n\n\n/*\nexport function getFieldsWithGivenOccurrenceNumberSubfield6(record, occurrenceNumberAsString) {\n const record.fields.filter(field => field\n\n function fieldHasIndex(field, index) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.find(sf => isValidSubfield6(sf) && subfieldGetOccurrenceNumber6(sf) === index);\n }\n}\n*/\n\n\nexport function fieldHasValidSubfield6(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield6(sf));\n}\n\nexport function isSubfield6Pair(field, otherField) {\n // No need to log this:\n //nvdebug(`LOOK for $6-pair:\\n ${fieldToString(field)}\\n ${fieldToString(otherField)}`);\n if (!fieldHasValidSubfield6(field) || !fieldHasValidSubfield6(otherField)) {\n return false;\n }\n\n if (!tagsArePairable6(field.tag, otherField.tag)) {\n //nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`);\n return false;\n }\n\n\n const fieldIndex = fieldGetUnambiguousOccurrenceNumber(field);\n if (fieldIndex === undefined || fieldIndex === '00') {\n //nvdebug(` FAILED. REASON: NO INDEX FOUND`);\n return false;\n }\n\n const otherFieldIndex = fieldGetUnambiguousOccurrenceNumber(otherField);\n\n\n if (fieldIndex !== otherFieldIndex) {\n //nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`);\n return false;\n }\n\n if (fieldGetUnambiguousTag(field) !== otherField.tag || field.tag !== fieldGetUnambiguousTag(otherField)) {\n //nvdebug(` FAILURE: TAG vs $6 TAG`);\n return false;\n }\n return true;\n\n function tagsArePairable6(tag1, tag2) {\n // How to do XOR operation in one line? Well, this is probably more readable...\n if (tag1 === '880' && tag2 === '880') {\n return false;\n }\n if (tag1 !== '880' && tag2 !== '880') {\n return false;\n }\n return true;\n }\n}\n\n\nfunction subfieldSevenToOneOccurrenceNumber(subfield) {\n if (subfield.code !== '6' || subfield.value.substring(0, 1) !== '7') {\n return;\n }\n subfield.value = `1${subfield.value.substring(1)}`; // eslint-disable-line functional/immutable-data\n}\n\nexport function fieldSevenToOneOccurrenceNumber(field) {\n if (field.tag !== '880') {\n return;\n }\n field.subfields.forEach(sf => subfieldSevenToOneOccurrenceNumber(sf));\n}\n\n\nexport function fieldGetOccurrenceNumberPairs(field, candFields) {\n // NB! TAG!=880 returns 880 fields, TAG==880 returns non-880 field\n //nvdebug(` Trying to finds pair for ${fieldToString(field)} in ${candFields.length} fields`);\n const pairs = candFields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairs.length === 0) {\n nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`);\n return pairs;\n }\n nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`);\n pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`));\n return pairs;\n}\n\nexport function fieldGetOccurrenceNumbers(field) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n field.subfields?.forEach(sf => subfieldExtractOccurrenceNumber(sf));\n\n function subfieldExtractOccurrenceNumber(sf) {\n if (!isValidSubfield6(sf)) {\n return;\n }\n const occurrenceNumber = subfield6GetOccurrenceNumber(sf);\n if (occurrenceNumber === '00' || occurrenceNumbers.includes(occurrenceNumber)) {\n return;\n }\n occurrenceNumbers.push(occurrenceNumber);\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\nexport function fieldsGetOccurrenceNumbers(fields) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n\n fields.forEach(f => fieldProcessOccurrenceNumbers(f));\n\n function fieldProcessOccurrenceNumbers(f) {\n const newOccurrenceNumbers = fieldGetOccurrenceNumbers(f);\n newOccurrenceNumbers.forEach(occurrenceNumber => {\n if (!occurrenceNumbers.includes(occurrenceNumber)) {\n occurrenceNumbers.push(occurrenceNumber);\n }\n\n });\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\n/*\nexport function fieldGetSubfield6Pair(field, record) {\n const pairedFields = record.fields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairedFields.length !== 1) {\n return undefined;\n }\n // NB! It is theoretically possible to have multiple pairable 880 fields (one for each encoding)\n nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`);\n return pairedFields[0];\n}\n*/\n\n/*\nexport function pairAndStringify6(field, record) {\n const pair6 = fieldGetSubfield6Pair(field, record);\n if (!pair6) {\n return fieldToNormalizedString(field);\n }\n return fieldsToNormalizedString([field, pair6]);\n}\n*/\n\n// Frequencly list for $6 subfields in 1XX/7XX fields:\n// 231115 100\n// 183832 700\n// 28773 710\n// 2047 711\n// 661 110\n// 341 111\n// 284 130\n// 63 730\n// Thus there's a real risk of ending up with, say, identical 100 vs 700 chains.\n// Semi-hackily support 1XX/7XX-version: 7XX can be deleted if corresponding 1XX exists:\n\nexport function is7XX(tag) {\n return ['700', '710', '711', '730'].includes(tag);\n}\n\n\nfunction normalizeEntryTag(tag) {\n if (tag.match(/^[17](?:00|10|11|30)$/u)) {\n return `X${tag.substring(1)}`;\n }\n return tag;\n}\n\nfunction subfieldToNormalizedString(sf, tag, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n // targetLinkingNumber refers to $8.\n // normalizeEntryTagBoolean refers to 1XX/7XX tag values in subfield $6 value.\n if (isValidSubfield6(sf)) { // && targetLinkingNumber === 0) {\n // 1XX/7XX (entry tag) normalization:\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(tag) : tag;\n\n const occurrenceNumber = normalizeOccurrenceNumber ? 'XX' : subfield6GetOccurrenceNumber(sf);\n // If we are normalizing a $8 chain, don't normalize $6 occurrence number!\n // Replace $6 occurrence number with XX:\n return ` ‡${sf.code} ${tag2}-${occurrenceNumber}${subfield6GetTail(sf)}`;\n }\n\n if (isValidSubfield8(sf)) {\n const currLinkingNumber = getSubfield8LinkingNumber(sf); //getSubfield8Index(sf);\n if (targetLinkingNumber > 0 && currLinkingNumber === targetLinkingNumber) {\n // For $8 we should only XX the index we are looking at...\n const normVal = sf.value.replace(/^[0-9]+/u, 'XX');\n return ` ‡${sf.code} ${normVal}`;\n }\n return ''; // Other $8 subfields are meaningless in this context\n }\n return ` ${subfieldToString(sf)}`; // `‡${sf.code} ${sf.value}`;\n}\n\nexport function fieldToNormalizedString(field, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n if ('subfields' in field) {\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(field.tag) : field.tag;\n return `${tag2} ${field.ind1}${field.ind2}${formatAndNormalizeSubfields(field)}`;\n }\n return `${field.tag} ${field.value}`;\n\n function formatAndNormalizeSubfields(field) {\n return field.subfields.map(sf => subfieldToNormalizedString(sf, field.tag, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTagBoolean)).join('');\n }\n\n}\n\n\nfunction guessTargetLinkingNumber(fields, defaultTargetLinkingNumber) {\n if (defaultTargetLinkingNumber !== 0) {\n return defaultTargetLinkingNumber;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n return linkingNumbers.length === 1 ? linkingNumbers[0] : 0; // eslint-disable-line no-param-reassign\n}\n\nexport function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTag = false) {\n const targetLinkingNumber = guessTargetLinkingNumber(fields, defaultTargetLinkingNumber);\n\n nvdebug(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`);\n const strings = fields.map(field => fieldToNormalizedString(field, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTag));\n strings.sort(); // eslint-disable-line functional/immutable-data\n return strings.join('\\t__SEPARATOR__\\t');\n}\n\n\n/*\n\nexport function removeField6IfNeeded(field, record, fieldsAsString) {\n const pairField = fieldGetSubfield6Pair(field, record);\n const asString = pairField ? fieldsToNormalizedString([field, pairField]) : fieldToNormalizedString(field);\n nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`);\n const tmp = pairField ? fieldToString(pairField) : 'HUTI';\n nvdebug(`PAIR: ${tmp}`);\n nvdebug(`BASE:\\n ${fieldsAsString.join('\\n ')}`);\n if (!fieldsAsString.includes(asString)) {\n return;\n }\n nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`);\n record.removeField(field);\n\n if (pairField === undefined) {\n return;\n }\n nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`);\n record.removeField(pairField);\n}\n*/\n\nfunction getFirstField(record, fields) {\n const fieldsAsStrings = fields.map(field => fieldToString(field));\n //record.fields.forEach((field, i) => nvdebug(`${i}:\\t${fieldToString(field)}`));\n //nvdebug(`getFirstField: ${fieldsAsStrings.join('\\t')}`);\n const i = record.fields.findIndex(field => fieldsAsStrings.includes(fieldToString(field)));\n if (i > -1) {\n const field = record.fields[i];\n //nvdebug(`1st F: ${i + 1}/${record.fields.length} ${fieldToString(field)}`);\n return field;\n }\n return undefined;\n}\n\nfunction isRelevantSubfield6Chain(fields) {\n if (fields.length < 2) { // 1 non-880-field and 1+ 880 fields\n return false;\n }\n const non880 = fields.filter(f => f.tag !== '880');\n if (non880.length !== 1) {\n return false;\n }\n\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n if (linkingNumbers.length !== 0) {\n return false;\n }\n\n return fields.every(f => fieldHasSubfield(f, '6'));\n}\n\nexport function fieldIsFirstFieldInChain(field, chain, record) {\n // Interpretation of first: position of field in record (however, we might have a duplicate field. See tests...)\n const firstField = getFirstField(record, chain);\n if (firstField) {\n return fieldToString(field) === fieldToString(firstField);\n }\n return false;\n\n}\n\n\nexport function getAllLinkedSubfield6Fields(field, record) {\n const fields = get6s(field, record);\n const moreFields = add8s(fields, record);\n\n // Currently we don't handle fields with more than one $6 and/or $8 subfield.\n if (moreFields.length > fields.length) {\n return []; // Don't fix!\n }\n return moreFields;\n}\n\nexport function isFirstLinkedSubfield6Field(field, record) {\n if (!field.subfields) { // Is not a datafield\n return false;\n }\n const chain = getAllLinkedSubfield6Fields(field, record);\n if (!isRelevantSubfield6Chain(chain)) {\n nvdebug(`Rejected 6: ${fieldsToString(chain)}`);\n return false;\n }\n\n return fieldIsFirstFieldInChain(field, chain, record);\n}\n\nexport function recordGetSubfield6ChainHeads(record) {\n return record.fields.filter(field => isFirstLinkedSubfield6Field(field, record));\n}\n\nexport function recordGetMaxSubfield6OccurrenceNumberAsInteger(record) {\n if (record.fields.length === 0) {\n return 0;\n }\n // Should we cache the value here?\n const vals = record.fields.map((field) => fieldGetMaxSubfield6OccurrenceNumberAsInteger(field));\n return Math.max(...vals);\n}\n\nexport function get6s(field, candidateFields) { // NB! Convert field to fields!!!\n // Get all fields with given occurrence number\n const sixes = field.subfields.filter(sf => isValidSubfield6(sf));\n\n if (sixes.length === 0) {\n return [field];\n }\n nvdebug(`SIXES: ${sixes.length}`);\n const occurrenceNumbers = sixes.map(sf => subfield6GetOccurrenceNumber(sf)).filter(value => value !== undefined && value !== '00');\n nvdebug(occurrenceNumbers.join(' -- '));\n\n const relevantFields = candidateFields.filter(f => occurrenceNumbers.some(o => fieldHasOccurrenceNumber(f, o)));\n nvdebug(`${fieldToString(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`);\n relevantFields.forEach(f => nvdebug(fieldToString(f)));\n return relevantFields;\n}\n\nexport function resetSubfield6Tag(subfield, tag) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n // NB! mainly for 1XX<->7XX transfers\n const newValue = `${tag}-${subfield.value.substring(4)}`;\n nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`, debugDev);\n subfield.value = newValue; // eslint-disable-line functional/immutable-data\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/utils.js
CHANGED
|
@@ -3,19 +3,37 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.fieldHasMultipleSubfields = fieldHasMultipleSubfields;
|
|
7
|
+
exports.fieldHasNSubfields = fieldHasNSubfields;
|
|
6
8
|
exports.fieldHasSubfield = fieldHasSubfield;
|
|
7
9
|
exports.fieldToString = fieldToString;
|
|
10
|
+
exports.fieldsAreIdentical = fieldsAreIdentical;
|
|
8
11
|
exports.fieldsToString = fieldsToString;
|
|
9
12
|
exports.getCatalogingLanguage = getCatalogingLanguage;
|
|
13
|
+
exports.hasCopyright = hasCopyright;
|
|
10
14
|
exports.isControlSubfieldCode = isControlSubfieldCode;
|
|
11
15
|
exports.isElectronicMaterial = isElectronicMaterial;
|
|
16
|
+
exports.marc21GetTagsLegalInd1Value = marc21GetTagsLegalInd1Value;
|
|
17
|
+
exports.marc21GetTagsLegalInd2Value = marc21GetTagsLegalInd2Value;
|
|
12
18
|
exports.nvdebug = nvdebug;
|
|
13
19
|
exports.nvdebugFieldArray = nvdebugFieldArray;
|
|
20
|
+
exports.nvdebugSubfieldArray = nvdebugSubfieldArray;
|
|
14
21
|
exports.recordRemoveValuelessSubfields = recordRemoveValuelessSubfields;
|
|
15
22
|
exports.recordToString = recordToString;
|
|
23
|
+
exports.removeCopyright = removeCopyright;
|
|
16
24
|
exports.removeSubfield = removeSubfield;
|
|
25
|
+
exports.subfieldIsRepeatable = subfieldIsRepeatable;
|
|
17
26
|
exports.subfieldToString = subfieldToString;
|
|
27
|
+
exports.subfieldsAreIdentical = subfieldsAreIdentical;
|
|
18
28
|
exports.uniqArray = uniqArray;
|
|
29
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
30
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
31
|
+
var _path = _interopRequireDefault(require("path"));
|
|
32
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
33
|
+
const debug = (0, _debug.default)('@natlibfi/melinda-marc-record-merge-reducers:utils');
|
|
34
|
+
//const debugData = debug.extend('data');
|
|
35
|
+
const debugDev = debug.extend('dev');
|
|
36
|
+
const melindaFields = JSON.parse(_fs.default.readFileSync(_path.default.join(__dirname, '..', 'src', 'melindaCustomMergeFields.json'), 'utf8'));
|
|
19
37
|
function isElectronicMaterial(record) {
|
|
20
38
|
const f337s = record.get('337');
|
|
21
39
|
return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));
|
|
@@ -118,4 +136,94 @@ function getCatalogingLanguage(record, defaultCatalogingLanguage = undefined) {
|
|
|
118
136
|
function uniqArray(arr) {
|
|
119
137
|
return arr.filter((val, i) => arr.indexOf(val) === i);
|
|
120
138
|
}
|
|
139
|
+
function fieldsAreIdentical(field1, field2) {
|
|
140
|
+
if (field1.tag !== field2.tag) {
|
|
141
|
+
// NB! We are skipping normalizations here on purpose! They should be done beforehand...
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
return fieldToString(field1) === fieldToString(field2);
|
|
145
|
+
|
|
146
|
+
// The order of subfields is relevant! Bloody JS idiotisms make people use conditions such as:
|
|
147
|
+
// return field1.subfields.every(sf => field2.subfields.some(sf2 => sf.code === sf2.code && sf.value === sf2.value));
|
|
148
|
+
}
|
|
149
|
+
function fieldHasNSubfields(field, subfieldCode /*, subfieldValue = null*/) {
|
|
150
|
+
const relevantSubfields = field.subfields.filter(sf => sf.code === subfieldCode);
|
|
151
|
+
//if (subfieldValue === null) {
|
|
152
|
+
return relevantSubfields.length;
|
|
153
|
+
//}
|
|
154
|
+
//const subset = relevantSubfields.filter(value => value === subfieldValue);
|
|
155
|
+
//return subset.length;
|
|
156
|
+
}
|
|
157
|
+
function removeCopyright(value) {
|
|
158
|
+
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
|
|
159
|
+
}
|
|
160
|
+
function isNonStandardNonrepeatableSubfield(tag, subfieldCode) {
|
|
161
|
+
// Put these into config or so...
|
|
162
|
+
if (tag === '264') {
|
|
163
|
+
return ['a', 'b', 'c'].includes(subfieldCode);
|
|
164
|
+
}
|
|
165
|
+
if (['336', '337', '338'].includes(tag)) {
|
|
166
|
+
return ['a', 'b', '2'].includes(subfieldCode);
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
function subfieldIsRepeatable(tag, subfieldCode) {
|
|
171
|
+
if (isNonStandardNonrepeatableSubfield(tag, subfieldCode)) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// These we know or "know":
|
|
176
|
+
// 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
|
|
177
|
+
if ('0159'.indexOf(subfieldCode) > -1) {
|
|
178
|
+
// Uh, can $0 appear on any field?
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);
|
|
182
|
+
if (fieldSpecs.length !== 1) {
|
|
183
|
+
nvdebug(` WARNING! Getting field ${tag} data failed! ${fieldSpecs.length} hits. Default value true is used for'${subfieldCode}' .`, debugDev);
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
const subfieldSpecs = fieldSpecs[0].subfields.filter(subfield => subfield.code === subfieldCode);
|
|
187
|
+
// Currently we don't support multiple $6 fields due to re-indexing limitations...
|
|
188
|
+
// Well, $6 is non-repeatable, isn't it?!?
|
|
189
|
+
// (This might actually already be fixed... Marginal issue, but check eventually.)
|
|
190
|
+
if (subfieldSpecs.length !== 1 || subfieldCode === '6') {
|
|
191
|
+
return false; // repeatable if not specified, I guess. Maybe add log or warn?
|
|
192
|
+
}
|
|
193
|
+
return subfieldSpecs[0].repeatable;
|
|
194
|
+
}
|
|
195
|
+
function marc21GetTagsLegalIndicators(tag) {
|
|
196
|
+
const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);
|
|
197
|
+
if (fieldSpecs.length === 0) {
|
|
198
|
+
return undefined;
|
|
199
|
+
}
|
|
200
|
+
return fieldSpecs[0].indicators;
|
|
201
|
+
}
|
|
202
|
+
function marc21GetTagsLegalInd1Value(tag) {
|
|
203
|
+
const indicator = marc21GetTagsLegalIndicators(tag);
|
|
204
|
+
if (indicator === undefined) {
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
return indicator.ind1;
|
|
208
|
+
}
|
|
209
|
+
function marc21GetTagsLegalInd2Value(tag) {
|
|
210
|
+
const indicator = marc21GetTagsLegalIndicators(tag);
|
|
211
|
+
if (indicator === undefined) {
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
return indicator.ind2;
|
|
215
|
+
}
|
|
216
|
+
function nvdebugSubfieldArray(subfields, prefix = ' ', func = undefined) {
|
|
217
|
+
subfields.forEach(subfield => nvdebug(`${prefix}${subfieldToString(subfield)}`, func));
|
|
218
|
+
}
|
|
219
|
+
function subfieldsAreIdentical(subfieldA, subfieldB) {
|
|
220
|
+
return subfieldA.code === subfieldB.code && subfieldA.value === subfieldB.value;
|
|
221
|
+
}
|
|
222
|
+
function fieldHasMultipleSubfields(field, subfieldCode /*, subfieldValue = null*/) {
|
|
223
|
+
return fieldHasNSubfields(field, subfieldCode) > 1;
|
|
224
|
+
}
|
|
225
|
+
function hasCopyright(value) {
|
|
226
|
+
const modValue = removeCopyright(value);
|
|
227
|
+
return value !== modValue;
|
|
228
|
+
}
|
|
121
229
|
//# sourceMappingURL=utils.js.map
|
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","removeSubfield","tag","filter","recordRemoveValuelessSubfields","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 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"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"utils.js","names":["_debug","_interopRequireDefault","require","_fs","_path","e","__esModule","default","debug","createDebugLogger","debugDev","extend","melindaFields","JSON","parse","fs","readFileSync","path","join","__dirname","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","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","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\nimport fs from 'fs';\nimport 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\nconst melindaFields = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'melindaCustomMergeFields.json'), 'utf8'));\n\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":[]}
|