@natlibfi/marc-record-validators-melinda 11.3.4-alpha → 11.3.5-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cyrillux.js +83 -8
- package/dist/cyrillux.js.map +1 -1
- package/dist/subfield6Utils.js +0 -1
- package/dist/subfield6Utils.js.map +1 -1
- package/package.json +1 -1
- package/src/cyrillux.js +80 -9
- package/src/subfield6Utils.js +0 -1
- package/test-fixtures/cyrillux/f01/expectedResult.json +6 -3
- package/test-fixtures/cyrillux/f01/record.json +2 -1
- package/test-fixtures/cyrillux/f08/expectedResult.json +45 -0
- package/test-fixtures/cyrillux/f08/metadata.json +11 -0
- package/test-fixtures/cyrillux/f08/record.json +27 -0
package/dist/cyrillux.js
CHANGED
|
@@ -12,6 +12,7 @@ var _xregexp = _interopRequireDefault(require("xregexp"));
|
|
|
12
12
|
var sfs4900 = _interopRequireWildcard(require("sfs4900"));
|
|
13
13
|
var _sortFields = _interopRequireDefault(require("./sortFields"));
|
|
14
14
|
var _reindexSubfield6OccurenceNumbers = _interopRequireDefault(require("./reindexSubfield6OccurenceNumbers"));
|
|
15
|
+
var _punctuation = require("./punctuation2");
|
|
15
16
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
16
17
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
17
18
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -103,18 +104,24 @@ function _default(config = {}) {
|
|
|
103
104
|
}
|
|
104
105
|
return containsCyrillicCharacters(subfield.value);
|
|
105
106
|
}
|
|
107
|
+
function tagCanBeTransliterated(tag) {
|
|
108
|
+
return !['336', '337', '338', '880'].includes(tag);
|
|
109
|
+
}
|
|
106
110
|
function fieldCanBeTransliterated(field) {
|
|
107
111
|
// Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well).
|
|
108
112
|
// Discussion: We should probably also skip others like 05X-08X, 648, 650, 651, and 655, but this needs thinking...
|
|
109
|
-
// Also I'd like to
|
|
110
|
-
|
|
113
|
+
// Also I'd like to convert do CYRILLIC->ISO-9 in field 300 (and others?) without 880 mappings... (<- not implemented)
|
|
114
|
+
|
|
115
|
+
// nvdebug(`fieldCanBeTransliterated('${fieldToString(field)}') in...`);
|
|
116
|
+
if (!tagCanBeTransliterated(field.tag)) {
|
|
111
117
|
return false;
|
|
112
118
|
}
|
|
119
|
+
|
|
113
120
|
// Skip control fields:
|
|
114
121
|
if (!field.subfields) {
|
|
115
122
|
return false;
|
|
116
123
|
}
|
|
117
|
-
// MELINDA-10330
|
|
124
|
+
// When doing MELINDA-10330-ish, we noticed that $6 should not prevent translittaration per se, so this restriction is no longer applied!
|
|
118
125
|
|
|
119
126
|
if (field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>'))) {
|
|
120
127
|
return false;
|
|
@@ -125,7 +132,7 @@ function _default(config = {}) {
|
|
|
125
132
|
if (!subfieldShouldTransliterateToIso9(subfield)) {
|
|
126
133
|
return {
|
|
127
134
|
code: subfield.code,
|
|
128
|
-
value: subfield.
|
|
135
|
+
value: subfield.value
|
|
129
136
|
}; // just clone
|
|
130
137
|
}
|
|
131
138
|
const value = iso9.convertToLatin(subfield.value);
|
|
@@ -198,7 +205,7 @@ function _default(config = {}) {
|
|
|
198
205
|
ind2: field.ind2,
|
|
199
206
|
subfields
|
|
200
207
|
};
|
|
201
|
-
(0, _utils.nvdebug)(`
|
|
208
|
+
(0, _utils.nvdebug)(` New CYR 880 ${(0, _utils.fieldToString)(newField)}`);
|
|
202
209
|
return newField;
|
|
203
210
|
}
|
|
204
211
|
function mapFieldToSfs4900Field880(field, occurrenceNumber) {
|
|
@@ -243,16 +250,84 @@ function _default(config = {}) {
|
|
|
243
250
|
}
|
|
244
251
|
return !existingPairedFields.some(f => (0, _utils.fieldHasSubfield)(f, '9', sfs4900Trans));
|
|
245
252
|
}
|
|
253
|
+
function sfs4900PairCanBeTransliterated(field, record) {
|
|
254
|
+
// MELINDA-10330: we already have public library data: (unmarked) SFS-4900 in FIELD and (unmarked) Cyrillic in 880
|
|
255
|
+
if (!tagCanBeTransliterated(field.tag) || !config.doISO9Transliteration) {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Original field: $9 ISO9 <TRANS> is the only legal <TRANS>
|
|
260
|
+
if (fieldContainsCyrillicCharacters(field) || field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== iso9Trans)) {
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
const existingPairedFields = (0, _subfield6Utils.fieldGetOccurrenceNumberPairs)(field, record.get('880'));
|
|
264
|
+
if (existingPairedFields.length !== 1) {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Paired field: $9 CYRILLIC <TRANS> is the only legal <TRANS>
|
|
269
|
+
const [pairedField] = existingPairedFields;
|
|
270
|
+
if (!fieldContainsCyrillicCharacters(pairedField) || pairedField.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== cyrillicTrans)) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Actually check that original field and and sfs-4900-fied cyrillic field are equal (after punctuation clean-up),
|
|
275
|
+
// and thus it's a real case of MELINDA-10330 ISO9 adding:
|
|
276
|
+
const occurrenceNumberAsString = (0, _subfield6Utils.fieldGetUnambiguousOccurrenceNumber)(field);
|
|
277
|
+
const field2 = (0, _utils.fieldToString)(createFieldForSfs4900Comparison(mapFieldToSfs4900Field880(pairedField, occurrenceNumberAsString), field.tag));
|
|
278
|
+
const field1 = (0, _utils.fieldToString)(createFieldForSfs4900Comparison(field, field.tag));
|
|
279
|
+
(0, _utils.nvdebug)(`COMPARE CONTENTS:\n '${field1}' vs\n '${field2}': ${field1 === field2 ? 'OK' : 'FAIL'}`);
|
|
280
|
+
return field1 === field2;
|
|
281
|
+
}
|
|
282
|
+
function createFieldForSfs4900Comparison(field, tag) {
|
|
283
|
+
const clonedField = (0, _clone.default)(field);
|
|
284
|
+
clonedField.tag = tag; // eslint-disable-line functional/immutable-data
|
|
285
|
+
clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== '9' || sf.value !== sfs4900Trans); // eslint-disable-line functional/immutable-data
|
|
286
|
+
return (0, _punctuation.fieldStripPunctuation)(clonedField);
|
|
287
|
+
}
|
|
288
|
+
function transliterateSfs4900Pair(field, record) {
|
|
289
|
+
// Handle MELINDA-10330: Field is already in SFS-4900 and the only paired field is in Cyrillic!
|
|
290
|
+
const [pairedField] = (0, _subfield6Utils.fieldGetOccurrenceNumberPairs)(field, record.get('880'));
|
|
291
|
+
const occurrenceNumberAsString = (0, _subfield6Utils.fieldGetUnambiguousOccurrenceNumber)(field);
|
|
292
|
+
const tmpField = {
|
|
293
|
+
'tag': field.tag,
|
|
294
|
+
'ind1': field.ind1,
|
|
295
|
+
'ind2': field.ind2,
|
|
296
|
+
'subfields': pairedField.subfields
|
|
297
|
+
};
|
|
298
|
+
const newMainField = mapFieldToIso9(tmpField, occurrenceNumberAsString); // Cyrillic => ISO-9
|
|
299
|
+
const newCyrillicField = mapFieldToCyrillicField880(tmpField, occurrenceNumberAsString); // CYRILLIC
|
|
300
|
+
const newSFS4900Field = mapFieldToSfs4900Field880(field, occurrenceNumberAsString); // SFS-4900
|
|
301
|
+
|
|
302
|
+
// Trigger the drop of original counterpart $6 :
|
|
303
|
+
pairedField.cyrilluxSkip = 1; // eslint-disable-line functional/immutable-data
|
|
304
|
+
|
|
305
|
+
return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);
|
|
306
|
+
}
|
|
246
307
|
function processField(originalField, record, maxCreatedOccurrenceNumber = 0) {
|
|
247
308
|
if (!fieldCanBeTransliterated(originalField)) {
|
|
309
|
+
if (sfs4900PairCanBeTransliterated(originalField, record)) {
|
|
310
|
+
// MELINDA-10330
|
|
311
|
+
return transliterateSfs4900Pair(originalField, record);
|
|
312
|
+
}
|
|
313
|
+
if (originalField.cyrilluxSkip) {
|
|
314
|
+
// MELINDA-10330 hack to remove 880 fields that were replaced/sort-of processed with their counterpair.
|
|
315
|
+
return [];
|
|
316
|
+
}
|
|
248
317
|
return [originalField];
|
|
249
318
|
}
|
|
250
|
-
|
|
319
|
+
|
|
320
|
+
// nvdebug(`PROCESSING: ${fieldToString(originalField)}`);
|
|
321
|
+
|
|
251
322
|
const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);
|
|
252
323
|
const newOccurrenceNumberAsString = (0, _subfield6Utils.intToOccurrenceNumberString)(newOccurrenceNumberAsInt);
|
|
253
|
-
|
|
324
|
+
|
|
325
|
+
// nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);
|
|
326
|
+
|
|
254
327
|
const existingPairedFields = (0, _subfield6Utils.fieldGetOccurrenceNumberPairs)(originalField, record.get('880'));
|
|
255
|
-
|
|
328
|
+
|
|
329
|
+
// nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`);
|
|
330
|
+
|
|
256
331
|
const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9
|
|
257
332
|
const newCyrillicField = needsIso9Transliteration(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC
|
|
258
333
|
const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900Field880(originalField, newOccurrenceNumberAsString) : undefined; /// SFS-4900
|
package/dist/cyrillux.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cyrillux.js","names":["_clone","_interopRequireDefault","require","_utils","iso9","_interopRequireWildcard","_subfield6Utils","_xregexp","sfs4900","_sortFields","_reindexSubfield6OccurenceNumbers","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","iso9Trans","cyrillicTrans","sfs4900Trans","_default","config","description","validate","fix","preprocessConfig","doISO9Transliteration","doSFS4900Transliteration","record","res","message","valid","nBefore","fields","length","processFields","reindexSubfield6OccurenceNumbers","sortFields","input","output","currField","remainingInput","fakeRecord","createdMax","recordGetMaxSubfield6OccurrenceNumberAsInteger","result","processField","forEach","field","validateField","orig","fieldToString","normalizedFields","clone","mod","fieldsToString","replace","push","isCyrillicCharacter","char","XRegExp","test","containsCyrillicCharacters","str","split","some","fieldContainsCyrillicCharacters","subfields","sf","subfieldShouldTransliterateToIso9","subfield","isControlSubfieldCode","code","value","fieldCanBeTransliterated","includes","tag","mapSubfieldToIso9","convertToLatin","mapSubfieldToSfs4900","mapFieldToIso9","occurrenceNumber","map","ind1","ind2","subfield6","deriveSubfield6","subfield9","fieldHasSubfield","filter","initialSubfield","resetSubfield6Tag","mapFieldToCyrillicField880","nvdebug","newSubfield6","newSubfield9","newField","mapFieldToSfs4900Field880","getNewOccurrenceNumber","originalField","maxCreatedOccurrenceNumber","fieldGetMaxSubfield6OccurrenceNumberAsInteger","needsIso9Transliteration","existingPairedFields","f","needsSfs4900Transliteration","newOccurrenceNumberAsInt","newOccurrenceNumberAsString","intToOccurrenceNumberString","fieldGetOccurrenceNumberPairs","newMainField","newCyrillicField","undefined","newSFS4900Field"],"sources":["../src/cyrillux.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldHasSubfield, fieldToString, fieldsToString, isControlSubfieldCode, nvdebug} from './utils';\nimport * as iso9 from 'iso9_1995';\nimport {fieldGetMaxSubfield6OccurrenceNumberAsInteger, fieldGetOccurrenceNumberPairs, intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag} from './subfield6Utils';\n\nimport XRegExp from 'xregexp';\nimport * as sfs4900 from 'sfs4900';\nimport {default as sortFields} from './sortFields';\nimport {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers';\n\nconst iso9Trans = 'ISO9 <TRANS>';\nconst cyrillicTrans = 'CYRILLIC <TRANS>';\nconst sfs4900Trans = 'SFS4900 <TRANS>';\n\nexport default function (config = {}) {\n\n return {\n description: 'Cyrillux functionality: convert original field to latinitsa (ISO-9) and add 880s for original cyrillic and latinitsa (SFS-4900)',\n validate, fix\n };\n\n function preprocessConfig() {\n config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration; // eslint-disable-line functional/immutable-data\n config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration; // eslint-disable-line functional/immutable-data\n }\n\n function fix(record) {\n // Fix always succeeds\n const res = {message: [], fix: [], valid: true};\n\n preprocessConfig(config);\n\n const nBefore = record.fields.length;\n\n record.fields = processFields(record.fields); // eslint-disable-line functional/immutable-data\n\n if (nBefore < record.fields.length) { // eslint-disable-line functional/no-conditional-statements\n reindexSubfield6OccurenceNumbers().fix(record);\n sortFields().fix(record);\n }\n\n function processFields(input, output = []) {\n const [currField, ...remainingInput] = input;\n if (!currField) {\n return output;\n }\n\n const fakeRecord = {fields: output};\n const createdMax = recordGetMaxSubfield6OccurrenceNumberAsInteger(fakeRecord);\n const result = processField(currField, record, createdMax);\n\n return processFields(remainingInput, [...output, ...result]);\n }\n\n return res;\n }\n\n function validate(record) {\n const res = {message: [], valid: true};\n\n preprocessConfig(config);\n\n record.fields?.forEach(field => {\n validateField(field, res, record);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res, record) {\n const orig = fieldToString(field);\n\n const normalizedFields = processField(clone(field), record);\n const mod = fieldsToString(normalizedFields).replace(/\\t__SEPARATOR__\\t/ug, ', ').replace(/ (‡6 [0-9][0-9][0-9])-[0-9][0-9]+/gu, ' $1-NN'); // eslint-disable-line prefer-named-capture-group\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`CHANGE: ${orig} => ${mod}`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n\n function isCyrillicCharacter(char) {\n return XRegExp('[\\\\p{Cyrillic}]').test(char); // eslint-disable-line new-cap\n }\n\n function containsCyrillicCharacters(str) { // from melinda-ui-cyrillux\n if (!str) {\n return false;\n }\n return str.split('').some(isCyrillicCharacter);\n }\n\n function fieldContainsCyrillicCharacters(field) { // based on melinda-ui-cyrillux\n return field.subfields && field.subfields.some(sf => subfieldShouldTransliterateToIso9(sf));\n }\n\n function subfieldShouldTransliterateToIso9(subfield) {\n if (isControlSubfieldCode(subfield.code)) {\n return false;\n }\n return containsCyrillicCharacters(subfield.value);\n }\n\n function fieldCanBeTransliterated(field) {\n // Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well).\n // Discussion: We should probably also skip others like 05X-08X, 648, 650, 651, and 655, but this needs thinking...\n // Also I'd like to co CYRILLIC->ISO-9 for field 300 (and others?) without 880 mappings...\n if (['336', '337', '338', '880'].includes(field.tag)) {\n return false;\n }\n // Skip control fields:\n if (!field.subfields) {\n return false;\n }\n // MELINDA-10330: $6 should not prevent translittaration per se, so this restriction is no longer applied!\n\n if (field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>'))) {\n return false;\n }\n\n return fieldContainsCyrillicCharacters(field); // We have something to translitterate:\n }\n\n\n function mapSubfieldToIso9(subfield) {\n if (!subfieldShouldTransliterateToIso9(subfield)) {\n return {code: subfield.code, value: subfield.code}; // just clone\n }\n const value = iso9.convertToLatin(subfield.value);\n\n return {code: subfield.code, value};\n }\n\n function mapSubfieldToSfs4900(subfield) {\n const value = subfieldShouldTransliterateToIso9(subfield) ? sfs4900.convertToLatin(subfield.value).result : subfield.value;\n return {code: subfield.code, value};\n }\n\n\n function mapFieldToIso9(field, occurrenceNumber) {\n // This is the original non-880 field, that will be converted from Cyrillic to ISO\n\n // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either\n if (!config.doISO9Transliteration && !config.doSFS4900Transliteration) {\n const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);\n const subfield9 = fieldHasSubfield(field, '9', iso9Trans) ? [] : [{code: '9', value: iso9Trans}];\n\n const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToIso9(sf));\n\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, ...subfield9]};\n }\n\n function deriveSubfield6(tag, subfields, occurrenceNumber) {\n const initialSubfield = {code: '6', value: `${tag}-${occurrenceNumber}`};\n if (tag === '880') { // If *tag in subfield $6* is 880, field is not 880 :D\n return initialSubfield;\n }\n // Try to use existing subfield\n const [subfield6] = subfields.filter(sf => sf.code === '6').map(sf => clone(sf));\n if (subfield6) {\n resetSubfield6Tag(subfield6, tag); // Should we update occurrence number?\n return subfield6;\n }\n\n return initialSubfield;\n }\n\n function mapFieldToCyrillicField880(field, occurrenceNumber) {\n nvdebug(`Derive CYR 880 from ${fieldToString(field)}`);\n const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);\n const newSubfield9 = fieldHasSubfield(field, '9', cyrillicTrans) ? [] : [{code: '9', value: cyrillicTrans}];\n const subfields = [\n newSubfield6,\n ...field.subfields.filter(sf => sf.code !== '6').map(sf => clone(sf)),\n ...newSubfield9\n ];\n\n const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};\n nvdebug(` CYR 880 ${fieldToString(newField)}`);\n return newField;\n }\n\n function mapFieldToSfs4900Field880(field, occurrenceNumber) {\n nvdebug(`Derive SFS 880 from ${fieldToString(field)}`);\n const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);\n const newSubfield9 = fieldHasSubfield(field, '9', sfs4900Trans) ? [] : [{code: '9', value: sfs4900Trans}];\n const subfields = [\n newSubfield6,\n ...field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf)),\n ...newSubfield9\n ];\n\n const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};\n nvdebug(` SFS 880 ${fieldToString(newField)}`);\n return newField;\n }\n\n function getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber = 0) {\n const occurrenceNumber = fieldGetMaxSubfield6OccurrenceNumberAsInteger(originalField);\n // Return existing occurrence number:\n if (occurrenceNumber > 0) {\n return occurrenceNumber;\n }\n if (maxCreatedOccurrenceNumber) {\n return maxCreatedOccurrenceNumber + 1;\n }\n return recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n }\n\n function needsIso9Transliteration(existingPairedFields) {\n if (!config.doISO9Transliteration) {\n return false;\n }\n // Actually normal field is always converted to ISO-9, and this function checks where we move original cyrillic field to 880.\n // Thus we look for field 880$9 \"CYRILLIC <TRANS>\" here, and not \"ISO9 <TRANS>\"!\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', cyrillicTrans));\n }\n\n function needsSfs4900Transliteration(existingPairedFields) {\n if (!config.doSFS4900Transliteration) {\n return false;\n }\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', sfs4900Trans));\n }\n\n function processField(originalField, record, maxCreatedOccurrenceNumber = 0) {\n if (!fieldCanBeTransliterated(originalField)) {\n return [originalField];\n }\n\n nvdebug(`PROCESSING: ${fieldToString(originalField)}`);\n\n const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);\n const newOccurrenceNumberAsString = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n\n nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);\n\n const existingPairedFields = fieldGetOccurrenceNumberPairs(originalField, record.get('880'));\n\n nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`);\n\n const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9\n const newCyrillicField = needsIso9Transliteration(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900Field880(originalField, newOccurrenceNumberAsString) : undefined; /// SFS-4900\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"cyrillux.js","names":["_clone","_interopRequireDefault","require","_utils","iso9","_interopRequireWildcard","_subfield6Utils","_xregexp","sfs4900","_sortFields","_reindexSubfield6OccurenceNumbers","_punctuation","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","iso9Trans","cyrillicTrans","sfs4900Trans","_default","config","description","validate","fix","preprocessConfig","doISO9Transliteration","doSFS4900Transliteration","record","res","message","valid","nBefore","fields","length","processFields","reindexSubfield6OccurenceNumbers","sortFields","input","output","currField","remainingInput","fakeRecord","createdMax","recordGetMaxSubfield6OccurrenceNumberAsInteger","result","processField","forEach","field","validateField","orig","fieldToString","normalizedFields","clone","mod","fieldsToString","replace","push","isCyrillicCharacter","char","XRegExp","test","containsCyrillicCharacters","str","split","some","fieldContainsCyrillicCharacters","subfields","sf","subfieldShouldTransliterateToIso9","subfield","isControlSubfieldCode","code","value","tagCanBeTransliterated","tag","includes","fieldCanBeTransliterated","mapSubfieldToIso9","convertToLatin","mapSubfieldToSfs4900","mapFieldToIso9","occurrenceNumber","map","ind1","ind2","subfield6","deriveSubfield6","subfield9","fieldHasSubfield","filter","initialSubfield","resetSubfield6Tag","mapFieldToCyrillicField880","nvdebug","newSubfield6","newSubfield9","newField","mapFieldToSfs4900Field880","getNewOccurrenceNumber","originalField","maxCreatedOccurrenceNumber","fieldGetMaxSubfield6OccurrenceNumberAsInteger","needsIso9Transliteration","existingPairedFields","f","needsSfs4900Transliteration","sfs4900PairCanBeTransliterated","fieldGetOccurrenceNumberPairs","pairedField","occurrenceNumberAsString","fieldGetUnambiguousOccurrenceNumber","field2","createFieldForSfs4900Comparison","field1","clonedField","fieldStripPunctuation","transliterateSfs4900Pair","tmpField","newMainField","newCyrillicField","newSFS4900Field","cyrilluxSkip","newOccurrenceNumberAsInt","newOccurrenceNumberAsString","intToOccurrenceNumberString","undefined"],"sources":["../src/cyrillux.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldHasSubfield, fieldToString, fieldsToString, isControlSubfieldCode, nvdebug} from './utils';\nimport * as iso9 from 'iso9_1995';\nimport {fieldGetMaxSubfield6OccurrenceNumberAsInteger, fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag} from './subfield6Utils';\n\nimport XRegExp from 'xregexp';\nimport * as sfs4900 from 'sfs4900';\nimport {default as sortFields} from './sortFields';\nimport {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers';\nimport {fieldStripPunctuation} from './punctuation2';\n\nconst iso9Trans = 'ISO9 <TRANS>';\nconst cyrillicTrans = 'CYRILLIC <TRANS>';\nconst sfs4900Trans = 'SFS4900 <TRANS>';\n\nexport default function (config = {}) {\n\n return {\n description: 'Cyrillux functionality: convert original field to latinitsa (ISO-9) and add 880s for original cyrillic and latinitsa (SFS-4900)',\n validate, fix\n };\n\n function preprocessConfig() {\n config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration; // eslint-disable-line functional/immutable-data\n config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration; // eslint-disable-line functional/immutable-data\n }\n\n function fix(record) {\n // Fix always succeeds\n const res = {message: [], fix: [], valid: true};\n\n preprocessConfig(config);\n\n const nBefore = record.fields.length;\n\n record.fields = processFields(record.fields); // eslint-disable-line functional/immutable-data\n\n if (nBefore < record.fields.length) { // eslint-disable-line functional/no-conditional-statements\n reindexSubfield6OccurenceNumbers().fix(record);\n sortFields().fix(record);\n }\n\n function processFields(input, output = []) {\n const [currField, ...remainingInput] = input;\n if (!currField) {\n return output;\n }\n\n const fakeRecord = {fields: output};\n const createdMax = recordGetMaxSubfield6OccurrenceNumberAsInteger(fakeRecord);\n const result = processField(currField, record, createdMax);\n\n return processFields(remainingInput, [...output, ...result]);\n }\n\n return res;\n }\n\n function validate(record) {\n const res = {message: [], valid: true};\n\n preprocessConfig(config);\n\n record.fields?.forEach(field => {\n validateField(field, res, record);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res, record) {\n const orig = fieldToString(field);\n\n const normalizedFields = processField(clone(field), record);\n const mod = fieldsToString(normalizedFields).replace(/\\t__SEPARATOR__\\t/ug, ', ').replace(/ (‡6 [0-9][0-9][0-9])-[0-9][0-9]+/gu, ' $1-NN'); // eslint-disable-line prefer-named-capture-group\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`CHANGE: ${orig} => ${mod}`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n\n function isCyrillicCharacter(char) {\n return XRegExp('[\\\\p{Cyrillic}]').test(char); // eslint-disable-line new-cap\n }\n\n function containsCyrillicCharacters(str) { // from melinda-ui-cyrillux\n if (!str) {\n return false;\n }\n return str.split('').some(isCyrillicCharacter);\n }\n\n function fieldContainsCyrillicCharacters(field) { // based on melinda-ui-cyrillux\n return field.subfields && field.subfields.some(sf => subfieldShouldTransliterateToIso9(sf));\n }\n\n function subfieldShouldTransliterateToIso9(subfield) {\n if (isControlSubfieldCode(subfield.code)) {\n return false;\n }\n return containsCyrillicCharacters(subfield.value);\n }\n\n function tagCanBeTransliterated(tag) {\n return !['336', '337', '338', '880'].includes(tag);\n }\n\n function fieldCanBeTransliterated(field) {\n // Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well).\n // Discussion: We should probably also skip others like 05X-08X, 648, 650, 651, and 655, but this needs thinking...\n // Also I'd like to convert do CYRILLIC->ISO-9 in field 300 (and others?) without 880 mappings... (<- not implemented)\n\n // nvdebug(`fieldCanBeTransliterated('${fieldToString(field)}') in...`);\n if (!tagCanBeTransliterated(field.tag)) {\n return false;\n }\n\n // Skip control fields:\n if (!field.subfields) {\n return false;\n }\n // When doing MELINDA-10330-ish, we noticed that $6 should not prevent translittaration per se, so this restriction is no longer applied!\n\n if (field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>'))) {\n return false;\n }\n\n return fieldContainsCyrillicCharacters(field); // We have something to translitterate:\n }\n\n\n function mapSubfieldToIso9(subfield) {\n if (!subfieldShouldTransliterateToIso9(subfield)) {\n return {code: subfield.code, value: subfield.value}; // just clone\n }\n const value = iso9.convertToLatin(subfield.value);\n\n return {code: subfield.code, value};\n }\n\n function mapSubfieldToSfs4900(subfield) {\n const value = subfieldShouldTransliterateToIso9(subfield) ? sfs4900.convertToLatin(subfield.value).result : subfield.value;\n return {code: subfield.code, value};\n }\n\n\n function mapFieldToIso9(field, occurrenceNumber) {\n // This is the original non-880 field, that will be converted from Cyrillic to ISO\n\n // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either\n if (!config.doISO9Transliteration && !config.doSFS4900Transliteration) {\n const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);\n const subfield9 = fieldHasSubfield(field, '9', iso9Trans) ? [] : [{code: '9', value: iso9Trans}];\n\n const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToIso9(sf));\n\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, ...subfield9]};\n }\n\n function deriveSubfield6(tag, subfields, occurrenceNumber) {\n const initialSubfield = {code: '6', value: `${tag}-${occurrenceNumber}`};\n if (tag === '880') { // If *tag in subfield $6* is 880, field is not 880 :D\n return initialSubfield;\n }\n // Try to use existing subfield\n const [subfield6] = subfields.filter(sf => sf.code === '6').map(sf => clone(sf));\n if (subfield6) {\n resetSubfield6Tag(subfield6, tag); // Should we update occurrence number?\n return subfield6;\n }\n\n return initialSubfield;\n }\n\n function mapFieldToCyrillicField880(field, occurrenceNumber) {\n nvdebug(`Derive CYR 880 from ${fieldToString(field)}`);\n const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);\n const newSubfield9 = fieldHasSubfield(field, '9', cyrillicTrans) ? [] : [{code: '9', value: cyrillicTrans}];\n const subfields = [\n newSubfield6,\n ...field.subfields.filter(sf => sf.code !== '6').map(sf => clone(sf)),\n ...newSubfield9\n ];\n\n const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};\n nvdebug(` New CYR 880 ${fieldToString(newField)}`);\n return newField;\n }\n\n function mapFieldToSfs4900Field880(field, occurrenceNumber) {\n nvdebug(`Derive SFS 880 from ${fieldToString(field)}`);\n const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);\n const newSubfield9 = fieldHasSubfield(field, '9', sfs4900Trans) ? [] : [{code: '9', value: sfs4900Trans}];\n const subfields = [\n newSubfield6,\n ...field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf)),\n ...newSubfield9\n ];\n\n const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};\n nvdebug(` SFS 880 ${fieldToString(newField)}`);\n return newField;\n }\n\n function getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber = 0) {\n const occurrenceNumber = fieldGetMaxSubfield6OccurrenceNumberAsInteger(originalField);\n // Return existing occurrence number:\n if (occurrenceNumber > 0) {\n return occurrenceNumber;\n }\n if (maxCreatedOccurrenceNumber) {\n return maxCreatedOccurrenceNumber + 1;\n }\n return recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n }\n\n function needsIso9Transliteration(existingPairedFields) {\n if (!config.doISO9Transliteration) {\n return false;\n }\n // Actually normal field is always converted to ISO-9, and this function checks where we move original cyrillic field to 880.\n // Thus we look for field 880$9 \"CYRILLIC <TRANS>\" here, and not \"ISO9 <TRANS>\"!\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', cyrillicTrans));\n }\n\n function needsSfs4900Transliteration(existingPairedFields) {\n if (!config.doSFS4900Transliteration) {\n return false;\n }\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', sfs4900Trans));\n }\n\n function sfs4900PairCanBeTransliterated(field, record) {\n // MELINDA-10330: we already have public library data: (unmarked) SFS-4900 in FIELD and (unmarked) Cyrillic in 880\n if (!tagCanBeTransliterated(field.tag) || !config.doISO9Transliteration) {\n return false;\n }\n\n // Original field: $9 ISO9 <TRANS> is the only legal <TRANS>\n if (fieldContainsCyrillicCharacters(field) || field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== iso9Trans)) {\n return false;\n }\n\n const existingPairedFields = fieldGetOccurrenceNumberPairs(field, record.get('880'));\n if (existingPairedFields.length !== 1) {\n return false;\n }\n\n // Paired field: $9 CYRILLIC <TRANS> is the only legal <TRANS>\n const [pairedField] = existingPairedFields;\n if (!fieldContainsCyrillicCharacters(pairedField) || pairedField.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== cyrillicTrans)) {\n return false;\n }\n\n // Actually check that original field and and sfs-4900-fied cyrillic field are equal (after punctuation clean-up),\n // and thus it's a real case of MELINDA-10330 ISO9 adding:\n const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);\n const field2 = fieldToString(createFieldForSfs4900Comparison(mapFieldToSfs4900Field880(pairedField, occurrenceNumberAsString), field.tag));\n const field1 = fieldToString(createFieldForSfs4900Comparison(field, field.tag));\n nvdebug(`COMPARE CONTENTS:\\n '${field1}' vs\\n '${field2}': ${field1 === field2 ? 'OK' : 'FAIL'}`);\n return field1 === field2;\n }\n\n function createFieldForSfs4900Comparison(field, tag) {\n const clonedField = clone(field);\n clonedField.tag = tag; // eslint-disable-line functional/immutable-data\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== '9' || sf.value !== sfs4900Trans); // eslint-disable-line functional/immutable-data\n return fieldStripPunctuation(clonedField);\n }\n\n function transliterateSfs4900Pair(field, record) {\n // Handle MELINDA-10330: Field is already in SFS-4900 and the only paired field is in Cyrillic!\n const [pairedField] = fieldGetOccurrenceNumberPairs(field, record.get('880'));\n\n const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);\n\n const tmpField = {'tag': field.tag, 'ind1': field.ind1, 'ind2': field.ind2, 'subfields': pairedField.subfields};\n\n const newMainField = mapFieldToIso9(tmpField, occurrenceNumberAsString); // Cyrillic => ISO-9\n const newCyrillicField = mapFieldToCyrillicField880(tmpField, occurrenceNumberAsString); // CYRILLIC\n const newSFS4900Field = mapFieldToSfs4900Field880(field, occurrenceNumberAsString); // SFS-4900\n\n // Trigger the drop of original counterpart $6 :\n pairedField.cyrilluxSkip = 1; // eslint-disable-line functional/immutable-data\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n\n\n function processField(originalField, record, maxCreatedOccurrenceNumber = 0) {\n if (!fieldCanBeTransliterated(originalField)) {\n if (sfs4900PairCanBeTransliterated(originalField, record)) { // MELINDA-10330\n return transliterateSfs4900Pair(originalField, record);\n }\n if (originalField.cyrilluxSkip) { // MELINDA-10330 hack to remove 880 fields that were replaced/sort-of processed with their counterpair.\n return [];\n }\n return [originalField];\n }\n\n // nvdebug(`PROCESSING: ${fieldToString(originalField)}`);\n\n const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);\n const newOccurrenceNumberAsString = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n\n // nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);\n\n const existingPairedFields = fieldGetOccurrenceNumberPairs(originalField, record.get('880'));\n\n // nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`);\n\n const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9\n const newCyrillicField = needsIso9Transliteration(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900Field880(originalField, newOccurrenceNumberAsString) : undefined; /// SFS-4900\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/subfield6Utils.js
CHANGED
|
@@ -104,7 +104,6 @@ function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumb
|
|
|
104
104
|
function fieldGetUnambiguousTag(field) {
|
|
105
105
|
const tags = field.subfields.filter(sf => subfield6GetTag(sf));
|
|
106
106
|
if (tags.length === 1) {
|
|
107
|
-
(0, _utils.nvdebug)(` GOT ${tags.length} tag(s): ${(0, _utils.subfieldToString)(tags[0])}`);
|
|
108
107
|
return subfield6GetTag(tags[0]);
|
|
109
108
|
}
|
|
110
109
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
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":[]}
|
|
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","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","subfieldToString","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 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/package.json
CHANGED
package/src/cyrillux.js
CHANGED
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
import clone from 'clone';
|
|
3
3
|
import {fieldHasSubfield, fieldToString, fieldsToString, isControlSubfieldCode, nvdebug} from './utils';
|
|
4
4
|
import * as iso9 from 'iso9_1995';
|
|
5
|
-
import {fieldGetMaxSubfield6OccurrenceNumberAsInteger, fieldGetOccurrenceNumberPairs, intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag} from './subfield6Utils';
|
|
5
|
+
import {fieldGetMaxSubfield6OccurrenceNumberAsInteger, fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag} from './subfield6Utils';
|
|
6
6
|
|
|
7
7
|
import XRegExp from 'xregexp';
|
|
8
8
|
import * as sfs4900 from 'sfs4900';
|
|
9
9
|
import {default as sortFields} from './sortFields';
|
|
10
10
|
import {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers';
|
|
11
|
+
import {fieldStripPunctuation} from './punctuation2';
|
|
11
12
|
|
|
12
13
|
const iso9Trans = 'ISO9 <TRANS>';
|
|
13
14
|
const cyrillicTrans = 'CYRILLIC <TRANS>';
|
|
@@ -103,18 +104,25 @@ export default function (config = {}) {
|
|
|
103
104
|
return containsCyrillicCharacters(subfield.value);
|
|
104
105
|
}
|
|
105
106
|
|
|
107
|
+
function tagCanBeTransliterated(tag) {
|
|
108
|
+
return !['336', '337', '338', '880'].includes(tag);
|
|
109
|
+
}
|
|
110
|
+
|
|
106
111
|
function fieldCanBeTransliterated(field) {
|
|
107
112
|
// Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well).
|
|
108
113
|
// Discussion: We should probably also skip others like 05X-08X, 648, 650, 651, and 655, but this needs thinking...
|
|
109
|
-
// Also I'd like to
|
|
110
|
-
|
|
114
|
+
// Also I'd like to convert do CYRILLIC->ISO-9 in field 300 (and others?) without 880 mappings... (<- not implemented)
|
|
115
|
+
|
|
116
|
+
// nvdebug(`fieldCanBeTransliterated('${fieldToString(field)}') in...`);
|
|
117
|
+
if (!tagCanBeTransliterated(field.tag)) {
|
|
111
118
|
return false;
|
|
112
119
|
}
|
|
120
|
+
|
|
113
121
|
// Skip control fields:
|
|
114
122
|
if (!field.subfields) {
|
|
115
123
|
return false;
|
|
116
124
|
}
|
|
117
|
-
// MELINDA-10330
|
|
125
|
+
// When doing MELINDA-10330-ish, we noticed that $6 should not prevent translittaration per se, so this restriction is no longer applied!
|
|
118
126
|
|
|
119
127
|
if (field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>'))) {
|
|
120
128
|
return false;
|
|
@@ -126,7 +134,7 @@ export default function (config = {}) {
|
|
|
126
134
|
|
|
127
135
|
function mapSubfieldToIso9(subfield) {
|
|
128
136
|
if (!subfieldShouldTransliterateToIso9(subfield)) {
|
|
129
|
-
return {code: subfield.code, value: subfield.
|
|
137
|
+
return {code: subfield.code, value: subfield.value}; // just clone
|
|
130
138
|
}
|
|
131
139
|
const value = iso9.convertToLatin(subfield.value);
|
|
132
140
|
|
|
@@ -182,7 +190,7 @@ export default function (config = {}) {
|
|
|
182
190
|
];
|
|
183
191
|
|
|
184
192
|
const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};
|
|
185
|
-
nvdebug(`
|
|
193
|
+
nvdebug(` New CYR 880 ${fieldToString(newField)}`);
|
|
186
194
|
return newField;
|
|
187
195
|
}
|
|
188
196
|
|
|
@@ -229,21 +237,84 @@ export default function (config = {}) {
|
|
|
229
237
|
return !existingPairedFields.some(f => fieldHasSubfield(f, '9', sfs4900Trans));
|
|
230
238
|
}
|
|
231
239
|
|
|
240
|
+
function sfs4900PairCanBeTransliterated(field, record) {
|
|
241
|
+
// MELINDA-10330: we already have public library data: (unmarked) SFS-4900 in FIELD and (unmarked) Cyrillic in 880
|
|
242
|
+
if (!tagCanBeTransliterated(field.tag) || !config.doISO9Transliteration) {
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Original field: $9 ISO9 <TRANS> is the only legal <TRANS>
|
|
247
|
+
if (fieldContainsCyrillicCharacters(field) || field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== iso9Trans)) {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const existingPairedFields = fieldGetOccurrenceNumberPairs(field, record.get('880'));
|
|
252
|
+
if (existingPairedFields.length !== 1) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Paired field: $9 CYRILLIC <TRANS> is the only legal <TRANS>
|
|
257
|
+
const [pairedField] = existingPairedFields;
|
|
258
|
+
if (!fieldContainsCyrillicCharacters(pairedField) || pairedField.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== cyrillicTrans)) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Actually check that original field and and sfs-4900-fied cyrillic field are equal (after punctuation clean-up),
|
|
263
|
+
// and thus it's a real case of MELINDA-10330 ISO9 adding:
|
|
264
|
+
const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);
|
|
265
|
+
const field2 = fieldToString(createFieldForSfs4900Comparison(mapFieldToSfs4900Field880(pairedField, occurrenceNumberAsString), field.tag));
|
|
266
|
+
const field1 = fieldToString(createFieldForSfs4900Comparison(field, field.tag));
|
|
267
|
+
nvdebug(`COMPARE CONTENTS:\n '${field1}' vs\n '${field2}': ${field1 === field2 ? 'OK' : 'FAIL'}`);
|
|
268
|
+
return field1 === field2;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function createFieldForSfs4900Comparison(field, tag) {
|
|
272
|
+
const clonedField = clone(field);
|
|
273
|
+
clonedField.tag = tag; // eslint-disable-line functional/immutable-data
|
|
274
|
+
clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== '9' || sf.value !== sfs4900Trans); // eslint-disable-line functional/immutable-data
|
|
275
|
+
return fieldStripPunctuation(clonedField);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function transliterateSfs4900Pair(field, record) {
|
|
279
|
+
// Handle MELINDA-10330: Field is already in SFS-4900 and the only paired field is in Cyrillic!
|
|
280
|
+
const [pairedField] = fieldGetOccurrenceNumberPairs(field, record.get('880'));
|
|
281
|
+
|
|
282
|
+
const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);
|
|
283
|
+
|
|
284
|
+
const tmpField = {'tag': field.tag, 'ind1': field.ind1, 'ind2': field.ind2, 'subfields': pairedField.subfields};
|
|
285
|
+
|
|
286
|
+
const newMainField = mapFieldToIso9(tmpField, occurrenceNumberAsString); // Cyrillic => ISO-9
|
|
287
|
+
const newCyrillicField = mapFieldToCyrillicField880(tmpField, occurrenceNumberAsString); // CYRILLIC
|
|
288
|
+
const newSFS4900Field = mapFieldToSfs4900Field880(field, occurrenceNumberAsString); // SFS-4900
|
|
289
|
+
|
|
290
|
+
// Trigger the drop of original counterpart $6 :
|
|
291
|
+
pairedField.cyrilluxSkip = 1; // eslint-disable-line functional/immutable-data
|
|
292
|
+
|
|
293
|
+
return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
|
|
232
297
|
function processField(originalField, record, maxCreatedOccurrenceNumber = 0) {
|
|
233
298
|
if (!fieldCanBeTransliterated(originalField)) {
|
|
299
|
+
if (sfs4900PairCanBeTransliterated(originalField, record)) { // MELINDA-10330
|
|
300
|
+
return transliterateSfs4900Pair(originalField, record);
|
|
301
|
+
}
|
|
302
|
+
if (originalField.cyrilluxSkip) { // MELINDA-10330 hack to remove 880 fields that were replaced/sort-of processed with their counterpair.
|
|
303
|
+
return [];
|
|
304
|
+
}
|
|
234
305
|
return [originalField];
|
|
235
306
|
}
|
|
236
307
|
|
|
237
|
-
nvdebug(`PROCESSING: ${fieldToString(originalField)}`);
|
|
308
|
+
// nvdebug(`PROCESSING: ${fieldToString(originalField)}`);
|
|
238
309
|
|
|
239
310
|
const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);
|
|
240
311
|
const newOccurrenceNumberAsString = intToOccurrenceNumberString(newOccurrenceNumberAsInt);
|
|
241
312
|
|
|
242
|
-
nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);
|
|
313
|
+
// nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);
|
|
243
314
|
|
|
244
315
|
const existingPairedFields = fieldGetOccurrenceNumberPairs(originalField, record.get('880'));
|
|
245
316
|
|
|
246
|
-
nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`);
|
|
317
|
+
// nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`);
|
|
247
318
|
|
|
248
319
|
const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9
|
|
249
320
|
const newCyrillicField = needsIso9Transliteration(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC
|
package/src/subfield6Utils.js
CHANGED
|
@@ -80,7 +80,6 @@ export function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurre
|
|
|
80
80
|
export function fieldGetUnambiguousTag(field) {
|
|
81
81
|
const tags = field.subfields.filter(sf => subfield6GetTag(sf));
|
|
82
82
|
if (tags.length === 1) {
|
|
83
|
-
nvdebug(` GOT ${tags.length} tag(s): ${subfieldToString(tags[0])}`);
|
|
84
83
|
return subfield6GetTag(tags[0]);
|
|
85
84
|
}
|
|
86
85
|
return undefined;
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
"fields": [
|
|
5
5
|
{ "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
|
|
6
6
|
{ "code": "6", "value": "880-01"},
|
|
7
|
-
{ "code": "a", "value": "Modin, Ûrij Ivanovi
|
|
7
|
+
{ "code": "a", "value": "Modin, Ûrij Ivanovič," },
|
|
8
|
+
{ "code": "e", "value": "testaaja." },
|
|
8
9
|
{ "code": "9", "value": "ISO9 <TRANS>"}
|
|
9
10
|
]},
|
|
10
11
|
{ "tag": "300", "ind1": " ", "ind2": " ", "subfields": [
|
|
@@ -19,12 +20,14 @@
|
|
|
19
20
|
]},
|
|
20
21
|
{ "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
|
|
21
22
|
{"code": "6", "value": "100-01"},
|
|
22
|
-
{"code": "a", "value": "Модин, Юрий
|
|
23
|
+
{"code": "a", "value": "Модин, Юрий Иванович,"},
|
|
24
|
+
{ "code": "e", "value": "testaaja." },
|
|
23
25
|
{"code": "9", "value": "CYRILLIC <TRANS>"}
|
|
24
26
|
]},
|
|
25
27
|
{ "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
|
|
26
28
|
{"code": "6", "value": "100-01"},
|
|
27
|
-
{"code": "a", "value": "Modin, Juri Ivanovit
|
|
29
|
+
{"code": "a", "value": "Modin, Juri Ivanovitš,"},
|
|
30
|
+
{ "code": "e", "value": "testaaja." },
|
|
28
31
|
{"code": "9", "value": "SFS4900 <TRANS>"}
|
|
29
32
|
]},
|
|
30
33
|
{ "tag": "880", "ind1": " ", "ind2": " ", "subfields": [
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
"leader": "12345cam 22123454i 4500",
|
|
3
3
|
"fields": [
|
|
4
4
|
{ "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
|
|
5
|
-
{ "code": "a", "value": "Модин, Юрий
|
|
5
|
+
{ "code": "a", "value": "Модин, Юрий Иванович," },
|
|
6
|
+
{ "code": "e", "value": "testaaja." }
|
|
6
7
|
]},
|
|
7
8
|
{ "tag": "300", "ind1": " ", "ind2": " ", "subfields": [
|
|
8
9
|
{ "code": "a", "value": "5 см." }
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_validationOptions": {},
|
|
3
|
+
"leader": "12345cam 22123454i 4500",
|
|
4
|
+
"fields": [
|
|
5
|
+
{ "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
|
|
6
|
+
{ "code": "6", "value": "880-01"},
|
|
7
|
+
{ "code": "a", "value": "Modin, Ûrij Ivanovič M." },
|
|
8
|
+
{ "code": "e", "value": "kirjoittaja." },
|
|
9
|
+
{ "code": "9", "value": "ISO9 <TRANS>" }
|
|
10
|
+
]},
|
|
11
|
+
{ "tag": "245", "ind1": "1", "ind2": " ", "subfields": [
|
|
12
|
+
{ "code": "6", "value": "880-02"},
|
|
13
|
+
{ "code": "a", "value": "Sekrety peterburgskih dvorcov :" },
|
|
14
|
+
{ "code": "b", "value": "ih tajny, simvoly i sozdateli /" },
|
|
15
|
+
{ "code": "c", "value": "Moskalenko N.V."},
|
|
16
|
+
{ "code": "9", "value": "ISO9 <TRANS>" }
|
|
17
|
+
]},
|
|
18
|
+
{ "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
|
|
19
|
+
{"code": "6", "value": "100-01"},
|
|
20
|
+
{"code": "a", "value": "Модин, Юрий Иванович М."},
|
|
21
|
+
{"code": "e", "value": "kirjoittaja."},
|
|
22
|
+
{"code": "9", "value": "CYRILLIC <TRANS>"}
|
|
23
|
+
]},
|
|
24
|
+
{ "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
|
|
25
|
+
{ "code": "6", "value": "100-01"},
|
|
26
|
+
{ "code": "a", "value": "Modin, Juri Ivanovitš M.," },
|
|
27
|
+
{ "code": "e", "value": "kirjoittaja." },
|
|
28
|
+
{ "code": "9", "value": "SFS4900 <TRANS>"}
|
|
29
|
+
]},
|
|
30
|
+
{ "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
|
|
31
|
+
{ "code": "6", "value": "245-02"},
|
|
32
|
+
{ "code": "a", "value": "Секреты петербургских дворцов :"},
|
|
33
|
+
{ "code": "b", "value": "их тайны, символы и создатели /"},
|
|
34
|
+
{ "code": "c", "value": "Москаленко Н.В."},
|
|
35
|
+
{ "code": "9", "value": "CYRILLIC <TRANS>"}
|
|
36
|
+
]},
|
|
37
|
+
{ "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
|
|
38
|
+
{ "code": "6", "value": "245-02"},
|
|
39
|
+
{ "code": "a", "value": "Sekrety peterburgskih dvortsov :" },
|
|
40
|
+
{ "code": "b", "value": "ih tainy, simvoly i sozdateli /" },
|
|
41
|
+
{ "code": "c", "value": "Moskalenko N.V."},
|
|
42
|
+
{ "code": "9", "value": "SFS4900 <TRANS>"}
|
|
43
|
+
]}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Fix MELINDA-10330: fields 100 and 245 are already in SFS-4900 and their only 880 pairs are Cyrillic",
|
|
3
|
+
"comment": "Use 880 to create 100/245 in ISO-9. Move original SFS-4900 to 880, add $9s",
|
|
4
|
+
"comment #2": "Note that the original punctuation in 100/245 is overwritten with punctuation from paired 880",
|
|
5
|
+
"only": false,
|
|
6
|
+
"fix": true,
|
|
7
|
+
"config": {
|
|
8
|
+
"doISO9Transliteration": true,
|
|
9
|
+
"doSFS4900Transliteration": true
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"leader": "12345cam 22123454i 4500",
|
|
3
|
+
"fields": [
|
|
4
|
+
{ "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
|
|
5
|
+
{ "code": "6", "value": "880-01"},
|
|
6
|
+
{ "code": "a", "value": "Modin, Juri Ivanovitš M.," },
|
|
7
|
+
{ "code": "e", "value": "kirjoittaja." }
|
|
8
|
+
]},
|
|
9
|
+
{ "tag": "245", "ind1": "1", "ind2": " ", "subfields": [
|
|
10
|
+
{ "code": "6", "value": "880-02"},
|
|
11
|
+
{ "code": "a", "value": "Sekrety peterburgskih dvortsov :" },
|
|
12
|
+
{ "code": "b", "value": "ih tainy, simvoly i sozdateli /" },
|
|
13
|
+
{ "code": "c", "value": "Moskalenko N.V."}
|
|
14
|
+
]},
|
|
15
|
+
{ "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
|
|
16
|
+
{"code": "6", "value": "100-01"},
|
|
17
|
+
{"code": "a", "value": "Модин, Юрий Иванович М."},
|
|
18
|
+
{"code": "e", "value": "kirjoittaja."}
|
|
19
|
+
]},
|
|
20
|
+
{ "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
|
|
21
|
+
{"code": "6", "value": "245-02"},
|
|
22
|
+
{"code": "a", "value": "Секреты петербургских дворцов :"},
|
|
23
|
+
{"code": "b", "value": "их тайны, символы и создатели /"},
|
|
24
|
+
{"code": "c", "value": "Москаленко Н.В."}
|
|
25
|
+
]}
|
|
26
|
+
]
|
|
27
|
+
}
|