@natlibfi/marc-record-validators-melinda 11.3.8 → 11.4.0-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 +67 -34
- package/dist/cyrillux.js.map +1 -1
- package/dist/translate-terms.js +291 -0
- package/dist/translate-terms.js.map +1 -0
- package/dist/translate-terms.spec.js +51 -0
- package/dist/translate-terms.spec.js.map +1 -0
- package/package.json +1 -1
- package/src/cyrillux.js +56 -32
- package/src/translate-terms.js +274 -0
- package/src/translate-terms.spec.js +52 -0
- package/test-fixtures/cyrillux/f01/metadata.json +1 -1
- package/test-fixtures/cyrillux/f03/metadata.json +4 -3
- package/test-fixtures/cyrillux/f03b/expectedResult.json +21 -0
- package/test-fixtures/cyrillux/f03b/metadata.json +11 -0
- package/test-fixtures/cyrillux/f03b/record.json +19 -0
- package/test-fixtures/cyrillux/f04/metadata.json +4 -3
- package/test-fixtures/cyrillux/f08/metadata.json +1 -1
- package/test-fixtures/cyrillux/f09/metadata.json +1 -1
- package/test-fixtures/cyrillux/f11/expectedResult.json +18 -0
- package/test-fixtures/cyrillux/f11/metadata.json +9 -0
- package/test-fixtures/cyrillux/f11/record.json +9 -0
- package/test-fixtures/cyrillux/f11b/expectedResult.json +18 -0
- package/test-fixtures/cyrillux/f11b/metadata.json +9 -0
- package/test-fixtures/cyrillux/f11b/record.json +16 -0
- package/test-fixtures/translate-terms/01/expectedResult.json +37 -0
- package/test-fixtures/translate-terms/01/metadata.json +6 -0
- package/test-fixtures/translate-terms/01/record.json +27 -0
- package/test-fixtures/translate-terms/02/expectedResult.json +37 -0
- package/test-fixtures/translate-terms/02/metadata.json +6 -0
- package/test-fixtures/translate-terms/02/record.json +27 -0
- package/test-fixtures/translate-terms/03/expectedResult.json +26 -0
- package/test-fixtures/translate-terms/03/metadata.json +5 -0
- package/test-fixtures/translate-terms/03/record.json +26 -0
- package/test-fixtures/translate-terms/04/expectedResult.json +16 -0
- package/test-fixtures/translate-terms/04/metadata.json +7 -0
- package/test-fixtures/translate-terms/04/record.json +17 -0
package/dist/cyrillux.js
CHANGED
|
@@ -23,23 +23,27 @@ const iso9Trans = 'ISO9 <TRANS>';
|
|
|
23
23
|
const cyrillicTrans = 'CYRILLIC <TRANS>';
|
|
24
24
|
const sfs4900Trans = 'SFS4900 <TRANS>';
|
|
25
25
|
function _default(config = {}) {
|
|
26
|
+
// console.log(`CONFIG=${JSON.stringify(config)}`); // eslint-disable-line no-console
|
|
27
|
+
|
|
26
28
|
return {
|
|
27
29
|
description: 'Cyrillux functionality: convert original field to latinitsa (ISO-9) and add 880s for original cyrillic and latinitsa (SFS-4900)',
|
|
28
30
|
validate,
|
|
29
31
|
fix
|
|
30
32
|
};
|
|
31
33
|
function preprocessConfig() {
|
|
34
|
+
config.retainCyrillic = typeof config.retainCyrillic === 'undefined' ? true : config.retainCyrillic; // eslint-disable-line functional/immutable-data
|
|
32
35
|
config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration; // eslint-disable-line functional/immutable-data
|
|
33
36
|
config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration; // eslint-disable-line functional/immutable-data
|
|
34
37
|
}
|
|
35
38
|
function fix(record) {
|
|
39
|
+
// console.log(`FIX has CONFIG=${JSON.stringify(config)}`); // eslint-disable-line no-console
|
|
36
40
|
// Fix always succeeds
|
|
37
41
|
const res = {
|
|
38
42
|
message: [],
|
|
39
43
|
fix: [],
|
|
40
44
|
valid: true
|
|
41
45
|
};
|
|
42
|
-
preprocessConfig(
|
|
46
|
+
preprocessConfig();
|
|
43
47
|
const nBefore = record.fields.length;
|
|
44
48
|
record.fields = processFields(record.fields); // eslint-disable-line functional/immutable-data
|
|
45
49
|
|
|
@@ -67,7 +71,7 @@ function _default(config = {}) {
|
|
|
67
71
|
message: [],
|
|
68
72
|
valid: true
|
|
69
73
|
};
|
|
70
|
-
preprocessConfig(
|
|
74
|
+
preprocessConfig();
|
|
71
75
|
record.fields?.forEach(field => {
|
|
72
76
|
validateField(field, res, record);
|
|
73
77
|
});
|
|
@@ -151,10 +155,11 @@ function _default(config = {}) {
|
|
|
151
155
|
};
|
|
152
156
|
}
|
|
153
157
|
function mapFieldToIso9(field, occurrenceNumber) {
|
|
154
|
-
|
|
155
|
-
|
|
158
|
+
if (!config.doISO9Transliteration) {
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
156
161
|
// Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either
|
|
157
|
-
if (!config.
|
|
162
|
+
if (!config.retainCyrillic && !config.doSFS4900Transliteration) {
|
|
158
163
|
const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));
|
|
159
164
|
return {
|
|
160
165
|
tag: field.tag,
|
|
@@ -167,7 +172,8 @@ function _default(config = {}) {
|
|
|
167
172
|
const subfield9 = (0, _utils.fieldHasSubfield)(field, '9', iso9Trans) ? [] : [{
|
|
168
173
|
code: '9',
|
|
169
174
|
value: iso9Trans
|
|
170
|
-
}];
|
|
175
|
+
}]; // Add only if needed
|
|
176
|
+
|
|
171
177
|
const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToIso9(sf));
|
|
172
178
|
return {
|
|
173
179
|
tag: field.tag,
|
|
@@ -176,6 +182,39 @@ function _default(config = {}) {
|
|
|
176
182
|
subfields: [subfield6, ...subfields, ...subfield9]
|
|
177
183
|
};
|
|
178
184
|
}
|
|
185
|
+
function mapFieldToSfs4900(field, occurrenceNumber, lang = 'rus') {
|
|
186
|
+
// Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either
|
|
187
|
+
if (!config.retainCyrillic && !config.doISO9Transliteration) {
|
|
188
|
+
const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));
|
|
189
|
+
return {
|
|
190
|
+
tag: field.tag,
|
|
191
|
+
ind1: field.ind1,
|
|
192
|
+
ind2: field.ind2,
|
|
193
|
+
subfields
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
const subfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);
|
|
197
|
+
const subfield9 = (0, _utils.fieldHasSubfield)(field, '9', sfs4900Trans) ? [] : [{
|
|
198
|
+
code: '9',
|
|
199
|
+
value: sfs4900Trans
|
|
200
|
+
}]; // Add only if needed
|
|
201
|
+
|
|
202
|
+
const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf, lang));
|
|
203
|
+
const newField = {
|
|
204
|
+
tag: field.tag,
|
|
205
|
+
ind1: field.ind1,
|
|
206
|
+
ind2: field.ind2,
|
|
207
|
+
subfields: [subfield6, ...subfields, ...subfield9]
|
|
208
|
+
};
|
|
209
|
+
if (!config.doISO9Transliteration) {
|
|
210
|
+
return newField;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
//const subfield6 = newField.subfields.find(sf => sf.code === '6');
|
|
214
|
+
newField.tag = '880'; // eslint-disable-line functional/immutable-data
|
|
215
|
+
(0, _subfield6Utils.resetSubfield6Tag)(subfield6, field.tag);
|
|
216
|
+
return newField;
|
|
217
|
+
}
|
|
179
218
|
function deriveSubfield6(tag, subfields, occurrenceNumber) {
|
|
180
219
|
const initialSubfield = {
|
|
181
220
|
code: '6',
|
|
@@ -194,6 +233,9 @@ function _default(config = {}) {
|
|
|
194
233
|
return initialSubfield;
|
|
195
234
|
}
|
|
196
235
|
function mapFieldToCyrillicField880(field, occurrenceNumber) {
|
|
236
|
+
if (!config.retainCyrillic) {
|
|
237
|
+
return undefined;
|
|
238
|
+
}
|
|
197
239
|
(0, _utils.nvdebug)(`Derive CYR 880 from ${(0, _utils.fieldToString)(field)}`);
|
|
198
240
|
const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);
|
|
199
241
|
const newSubfield9 = (0, _utils.fieldHasSubfield)(field, '9', cyrillicTrans) ? [] : [{
|
|
@@ -210,23 +252,6 @@ function _default(config = {}) {
|
|
|
210
252
|
(0, _utils.nvdebug)(` New CYR 880 ${(0, _utils.fieldToString)(newField)}`);
|
|
211
253
|
return newField;
|
|
212
254
|
}
|
|
213
|
-
function mapFieldToSfs4900Field880(field, occurrenceNumber, lang = 'rus') {
|
|
214
|
-
(0, _utils.nvdebug)(`Derive SFS 880 from ${(0, _utils.fieldToString)(field)}`);
|
|
215
|
-
const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);
|
|
216
|
-
const newSubfield9 = (0, _utils.fieldHasSubfield)(field, '9', sfs4900Trans) ? [] : [{
|
|
217
|
-
code: '9',
|
|
218
|
-
value: sfs4900Trans
|
|
219
|
-
}];
|
|
220
|
-
const subfields = [newSubfield6, ...field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf, lang)), ...newSubfield9];
|
|
221
|
-
const newField = {
|
|
222
|
-
tag: '880',
|
|
223
|
-
ind1: field.ind1,
|
|
224
|
-
ind2: field.ind2,
|
|
225
|
-
subfields
|
|
226
|
-
};
|
|
227
|
-
(0, _utils.nvdebug)(` SFS 880 ${(0, _utils.fieldToString)(newField)}`);
|
|
228
|
-
return newField;
|
|
229
|
-
}
|
|
230
255
|
function getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber = 0) {
|
|
231
256
|
const occurrenceNumber = (0, _subfield6Utils.fieldGetMaxSubfield6OccurrenceNumberAsInteger)(originalField);
|
|
232
257
|
// Return existing occurrence number:
|
|
@@ -238,12 +263,12 @@ function _default(config = {}) {
|
|
|
238
263
|
}
|
|
239
264
|
return (0, _subfield6Utils.recordGetMaxSubfield6OccurrenceNumberAsInteger)(record) + 1;
|
|
240
265
|
}
|
|
241
|
-
function
|
|
242
|
-
|
|
266
|
+
function retainCyrillic(existingPairedFields) {
|
|
267
|
+
// Should we move cyrillic content from a normali field to a 880?
|
|
268
|
+
if (!config.retainCyrillic) {
|
|
243
269
|
return false;
|
|
244
270
|
}
|
|
245
|
-
//
|
|
246
|
-
// Thus we look for field 880$9 "CYRILLIC <TRANS>" here, and not "ISO9 <TRANS>"!
|
|
271
|
+
// Fail if we already have a paired 880 $9 <CYRILLIC> TRANS
|
|
247
272
|
return !existingPairedFields.some(f => (0, _utils.fieldHasSubfield)(f, '9', cyrillicTrans));
|
|
248
273
|
}
|
|
249
274
|
function needsSfs4900Transliteration(existingPairedFields) {
|
|
@@ -269,7 +294,12 @@ function _default(config = {}) {
|
|
|
269
294
|
|
|
270
295
|
// Paired field: $9 CYRILLIC <TRANS> is the only legal <TRANS>
|
|
271
296
|
const [pairedField] = existingPairedFields;
|
|
272
|
-
|
|
297
|
+
(0, _utils.nvdebug)(`LOOKING FOR SFS4900 PAIR: ${(0, _utils.fieldToString)(field)}`);
|
|
298
|
+
(0, _utils.nvdebug)(` HAVING PAIRED FIELD: ${(0, _utils.fieldToString)(pairedField)}`);
|
|
299
|
+
if (!fieldContainsCyrillicCharacters(pairedField)) {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
if (pairedField.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== cyrillicTrans)) {
|
|
273
303
|
return false;
|
|
274
304
|
}
|
|
275
305
|
|
|
@@ -277,7 +307,7 @@ function _default(config = {}) {
|
|
|
277
307
|
// and thus it's a real case of MELINDA-10330 ISO9 adding:
|
|
278
308
|
const occurrenceNumberAsString = (0, _subfield6Utils.fieldGetUnambiguousOccurrenceNumber)(field);
|
|
279
309
|
const languageCode = (0, _addMissingField.getLanguageCode)(record);
|
|
280
|
-
const field2 = (0, _utils.fieldToString)(createFieldForSfs4900Comparison(
|
|
310
|
+
const field2 = (0, _utils.fieldToString)(createFieldForSfs4900Comparison(mapFieldToSfs4900(pairedField, occurrenceNumberAsString, languageCode), field.tag));
|
|
281
311
|
const field1 = (0, _utils.fieldToString)(createFieldForSfs4900Comparison(field, field.tag));
|
|
282
312
|
(0, _utils.nvdebug)(`COMPARE CONTENTS:\n '${field1}' vs\n '${field2}': ${field1 === field2 ? 'OK' : 'FAIL'}`);
|
|
283
313
|
return field1 === field2;
|
|
@@ -290,6 +320,9 @@ function _default(config = {}) {
|
|
|
290
320
|
}
|
|
291
321
|
function transliterateSfs4900Pair(field, record) {
|
|
292
322
|
// Handle MELINDA-10330: Field is already in SFS-4900 and the only paired field is in Cyrillic!
|
|
323
|
+
if (!config.doISO9Transliteration) {
|
|
324
|
+
return [];
|
|
325
|
+
}
|
|
293
326
|
const [pairedField] = (0, _subfield6Utils.fieldGetOccurrenceNumberPairs)(field, record.get('880'));
|
|
294
327
|
const occurrenceNumberAsString = (0, _subfield6Utils.fieldGetUnambiguousOccurrenceNumber)(field);
|
|
295
328
|
const languageCode = (0, _addMissingField.getLanguageCode)(record);
|
|
@@ -299,9 +332,9 @@ function _default(config = {}) {
|
|
|
299
332
|
'ind2': field.ind2,
|
|
300
333
|
'subfields': pairedField.subfields
|
|
301
334
|
};
|
|
302
|
-
const newMainField = mapFieldToIso9(tmpField, occurrenceNumberAsString); // Cyrillic => ISO-9
|
|
303
|
-
const newCyrillicField = mapFieldToCyrillicField880(tmpField, occurrenceNumberAsString); // CYRILLIC
|
|
304
|
-
const newSFS4900Field =
|
|
335
|
+
const newMainField = config.doISO9Transliteration ? mapFieldToIso9(tmpField, occurrenceNumberAsString) : undefined; // Cyrillic => ISO-9
|
|
336
|
+
const newCyrillicField = config.retainCyrillic ? mapFieldToCyrillicField880(tmpField, occurrenceNumberAsString) : undefined; // CYRILLIC
|
|
337
|
+
const newSFS4900Field = config.doSFS4900Transliteration ? mapFieldToSfs4900(field, occurrenceNumberAsString, languageCode) : undefined; // SFS-4900
|
|
305
338
|
|
|
306
339
|
// Trigger the drop of original counterpart $6 :
|
|
307
340
|
pairedField.cyrilluxSkip = 1; // eslint-disable-line functional/immutable-data
|
|
@@ -334,8 +367,8 @@ function _default(config = {}) {
|
|
|
334
367
|
// nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`);
|
|
335
368
|
|
|
336
369
|
const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9
|
|
337
|
-
const newCyrillicField =
|
|
338
|
-
const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ?
|
|
370
|
+
const newCyrillicField = retainCyrillic(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC
|
|
371
|
+
const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900(originalField, newOccurrenceNumberAsString, languageCode) : undefined; /// SFS-4900
|
|
339
372
|
|
|
340
373
|
return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);
|
|
341
374
|
}
|
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","_punctuation","_addMissingField","_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","lang","inputLang","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","languageCode","getLanguageCode","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 '@natlibfi/sfs-4900';\nimport {default as sortFields} from './sortFields';\nimport {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers';\nimport {fieldStripPunctuation} from './punctuation2';\nimport {getLanguageCode} from './addMissingField041';\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, lang = 'rus') {\n const inputLang = lang === 'ukr' ? 'ukr' : 'rus'; // Support 'ukr' and 'rus', default to 'rus'\n const value = subfieldShouldTransliterateToIso9(subfield) ? sfs4900.convertToLatin(subfield.value, inputLang).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, lang = 'rus') {\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, lang)),\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 (!field.subfields || !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 languageCode = getLanguageCode(record);\n const field2 = fieldToString(createFieldForSfs4900Comparison(mapFieldToSfs4900Field880(pairedField, occurrenceNumberAsString, languageCode), 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 const languageCode = getLanguageCode(record);\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, languageCode); // 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 const languageCode = getLanguageCode(record);\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, languageCode) : 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","_addMissingField","_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","retainCyrillic","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","lang","inputLang","mapFieldToIso9","occurrenceNumber","undefined","map","ind1","ind2","subfield6","deriveSubfield6","subfield9","fieldHasSubfield","filter","mapFieldToSfs4900","newField","resetSubfield6Tag","initialSubfield","mapFieldToCyrillicField880","nvdebug","newSubfield6","newSubfield9","getNewOccurrenceNumber","originalField","maxCreatedOccurrenceNumber","fieldGetMaxSubfield6OccurrenceNumberAsInteger","existingPairedFields","f","needsSfs4900Transliteration","sfs4900PairCanBeTransliterated","fieldGetOccurrenceNumberPairs","pairedField","occurrenceNumberAsString","fieldGetUnambiguousOccurrenceNumber","languageCode","getLanguageCode","field2","createFieldForSfs4900Comparison","field1","clonedField","fieldStripPunctuation","transliterateSfs4900Pair","tmpField","newMainField","newCyrillicField","newSFS4900Field","cyrilluxSkip","newOccurrenceNumberAsInt","newOccurrenceNumberAsString","intToOccurrenceNumberString"],"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 '@natlibfi/sfs-4900';\nimport {default as sortFields} from './sortFields';\nimport {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers';\nimport {fieldStripPunctuation} from './punctuation2';\nimport {getLanguageCode} from './addMissingField041';\n\nconst iso9Trans = 'ISO9 <TRANS>';\nconst cyrillicTrans = 'CYRILLIC <TRANS>';\nconst sfs4900Trans = 'SFS4900 <TRANS>';\n\nexport default function (config = {}) {\n // console.log(`CONFIG=${JSON.stringify(config)}`); // eslint-disable-line no-console\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.retainCyrillic = typeof config.retainCyrillic === 'undefined' ? true : config.retainCyrillic; // eslint-disable-line functional/immutable-data\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 // console.log(`FIX has CONFIG=${JSON.stringify(config)}`); // eslint-disable-line no-console\n // Fix always succeeds\n const res = {message: [], fix: [], valid: true};\n\n preprocessConfig();\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();\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, lang = 'rus') {\n const inputLang = lang === 'ukr' ? 'ukr' : 'rus'; // Support 'ukr' and 'rus', default to 'rus'\n const value = subfieldShouldTransliterateToIso9(subfield) ? sfs4900.convertToLatin(subfield.value, inputLang).result : subfield.value;\n return {code: subfield.code, value};\n }\n\n\n function mapFieldToIso9(field, occurrenceNumber) {\n if (!config.doISO9Transliteration) {\n return undefined;\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.retainCyrillic && !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}]; // Add only if needed\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 mapFieldToSfs4900(field, occurrenceNumber, lang = 'rus') {\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.retainCyrillic && !config.doISO9Transliteration) {\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(field.tag, field.subfields, occurrenceNumber);\n const subfield9 = fieldHasSubfield(field, '9', sfs4900Trans) ? [] : [{code: '9', value: sfs4900Trans}]; // Add only if needed\n\n const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf, lang));\n\n const newField = {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, ...subfield9]};\n\n if (!config.doISO9Transliteration) {\n return newField;\n }\n\n //const subfield6 = newField.subfields.find(sf => sf.code === '6');\n newField.tag = '880'; // eslint-disable-line functional/immutable-data\n resetSubfield6Tag(subfield6, field.tag);\n return newField;\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 if (!config.retainCyrillic) {\n return undefined;\n }\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 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 retainCyrillic(existingPairedFields) {\n // Should we move cyrillic content from a normali field to a 880?\n if (!config.retainCyrillic) {\n return false;\n }\n // Fail if we already have a paired 880 $9 <CYRILLIC> 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 (!field.subfields || !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 nvdebug(`LOOKING FOR SFS4900 PAIR: ${fieldToString(field)}`);\n nvdebug(` HAVING PAIRED FIELD: ${fieldToString(pairedField)}`);\n if (!fieldContainsCyrillicCharacters(pairedField)) {\n return false;\n }\n if (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 languageCode = getLanguageCode(record);\n const field2 = fieldToString(createFieldForSfs4900Comparison(mapFieldToSfs4900(pairedField, occurrenceNumberAsString, languageCode), 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 if (!config.doISO9Transliteration) {\n return [];\n }\n const [pairedField] = fieldGetOccurrenceNumberPairs(field, record.get('880'));\n\n const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);\n const languageCode = getLanguageCode(record);\n\n const tmpField = {'tag': field.tag, 'ind1': field.ind1, 'ind2': field.ind2, 'subfields': pairedField.subfields};\n\n const newMainField = config.doISO9Transliteration ? mapFieldToIso9(tmpField, occurrenceNumberAsString) : undefined; // Cyrillic => ISO-9\n const newCyrillicField = config.retainCyrillic ? mapFieldToCyrillicField880(tmpField, occurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = config.doSFS4900Transliteration ? mapFieldToSfs4900(field, occurrenceNumberAsString, languageCode) : undefined; // 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 const languageCode = getLanguageCode(record);\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 = retainCyrillic(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900(originalField, newOccurrenceNumberAsString, languageCode) : undefined; /// SFS-4900\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = _default;
|
|
7
|
+
var _clone = _interopRequireDefault(require("clone"));
|
|
8
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
9
|
+
var _utils = require("./utils");
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:sortSubfields');
|
|
12
|
+
const defaultTags = ['648', '650', '651', '655'];
|
|
13
|
+
const swapLanguageCode = {
|
|
14
|
+
'fin': 'swe',
|
|
15
|
+
'fi': 'sv',
|
|
16
|
+
'sv': 'fi',
|
|
17
|
+
'swe': 'fin'
|
|
18
|
+
};
|
|
19
|
+
const changeAbbrHash = {
|
|
20
|
+
'fi': 'fin',
|
|
21
|
+
'fin': 'fi',
|
|
22
|
+
'sv': 'swe',
|
|
23
|
+
'swe': 'sv'
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/translate-term');
|
|
27
|
+
const termCache = {};
|
|
28
|
+
|
|
29
|
+
// Author(s): Nicholas Volk
|
|
30
|
+
function _default() {
|
|
31
|
+
return {
|
|
32
|
+
description: 'Translate yso (648, 650, 651) and slm (655) terms (FIN <=> SWE)',
|
|
33
|
+
validate,
|
|
34
|
+
fix
|
|
35
|
+
};
|
|
36
|
+
async function fix(record) {
|
|
37
|
+
const newFields = await getFields(record, defaultTags, []);
|
|
38
|
+
newFields.forEach(nf => (0, _utils.nvdebug)(`Add new field '${(0, _utils.fieldToString)(nf)}'`, debug));
|
|
39
|
+
newFields.forEach(nf => record.insertField(nf));
|
|
40
|
+
const newFieldsAsStrings = newFields.map(f => (0, _utils.fieldToString)(f));
|
|
41
|
+
return {
|
|
42
|
+
message: [],
|
|
43
|
+
fix: newFieldsAsStrings,
|
|
44
|
+
valid: true
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async function validate(record) {
|
|
48
|
+
const newFields = await getFields(record, defaultTags, []);
|
|
49
|
+
if (newFields.length === 0) {
|
|
50
|
+
return {
|
|
51
|
+
'message': [],
|
|
52
|
+
'valid': true
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const messages = newFields.map(f => (0, _utils.fieldToString)(f));
|
|
56
|
+
return {
|
|
57
|
+
'message': messages,
|
|
58
|
+
'valid': false
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async function getFields(record, tags, fieldsToAdd) {
|
|
62
|
+
const [currTag, ...remainingTags] = tags;
|
|
63
|
+
if (!currTag) {
|
|
64
|
+
return fieldsToAdd;
|
|
65
|
+
}
|
|
66
|
+
const missingFields = await deriveMissingFields(record, currTag);
|
|
67
|
+
const tmp = await getFields(record, remainingTags, [...fieldsToAdd, ...missingFields]);
|
|
68
|
+
return tmp;
|
|
69
|
+
}
|
|
70
|
+
function getPairlessFinnishAndSwedishFields(record, tag) {
|
|
71
|
+
const expectedLex = mapTagToLex(tag);
|
|
72
|
+
if (!expectedLex) {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
const fields = record.get(tag);
|
|
76
|
+
const finnishFields = fields.filter(f => isRelevantField(f, 'fin'));
|
|
77
|
+
const swedishFields = fields.filter(f => isRelevantField(f, 'swe'));
|
|
78
|
+
const finnishOnly = getMisses(finnishFields, swedishFields);
|
|
79
|
+
const swedishOnly = getMisses(swedishFields, finnishFields);
|
|
80
|
+
|
|
81
|
+
//console.log(` Looking at ${finnishOnly.length} + ${swedishOnly.length} fields`); // eslint-disable-line no-console
|
|
82
|
+
return [...finnishOnly, ...swedishOnly].filter(f => tagAndFieldAgree(f));
|
|
83
|
+
function tagAndFieldAgree(field) {
|
|
84
|
+
// Check that tag and $2 value are pairable:
|
|
85
|
+
const lexData = getLexiconAndLanguage(field); // $2 data
|
|
86
|
+
return expectedLex === lexData.lex;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function deriveMissingFields(record, tag) {
|
|
90
|
+
const pairlessFields = getPairlessFinnishAndSwedishFields(record, tag);
|
|
91
|
+
|
|
92
|
+
/* eslint-disable */
|
|
93
|
+
// Dunno how to handle loop+promise combo in our normal coding style. Spent half a day trying... (I reckon it takes like 2 minuts to do this properly...)
|
|
94
|
+
let prefLabels = [];
|
|
95
|
+
for (let i = 0; i < pairlessFields.length; i += 1) {
|
|
96
|
+
prefLabels[i] = await getPrefLabel(pairlessFields[i]);
|
|
97
|
+
}
|
|
98
|
+
/* eslint-enable */
|
|
99
|
+
|
|
100
|
+
const missingFields = pairlessFields.map((f, i) => pairField(f, prefLabels[i]));
|
|
101
|
+
return missingFields.filter(f => f);
|
|
102
|
+
}
|
|
103
|
+
function pairField(field, prefLabels) {
|
|
104
|
+
if (!prefLabels) {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
//console.log(`pairField() WP 1: ${fieldToString(field)}`); // eslint-disable-line no-console
|
|
108
|
+
const lexAndLang = getLexiconAndLanguage(field);
|
|
109
|
+
//console.log(`pairField() WP 2: ${JSON.stringify(lexAndLang)}`); // eslint-disable-line no-console
|
|
110
|
+
const twoLetterOtherLang = swapLanguageCodeBetweenLanguages(changeAbbr(lexAndLang.lang));
|
|
111
|
+
const prefLabel = prefLabels.find(l => l.lang === twoLetterOtherLang);
|
|
112
|
+
//console.log(`pairField() WP 4: ${JSON.stringify(prefLabel)}`); // eslint-disable-line no-console
|
|
113
|
+
const sfA = {
|
|
114
|
+
'code': 'a',
|
|
115
|
+
'value': prefLabel.value
|
|
116
|
+
}; // field.subfields.field(sf => sf.code === 'a');
|
|
117
|
+
const sf0 = (0, _clone.default)(field.subfields.find(sf => sf.code === '0'));
|
|
118
|
+
const sf2 = {
|
|
119
|
+
'code': '2',
|
|
120
|
+
'value': `${lexAndLang.lex}/${lexAndLang.lang === 'fin' ? 'swe' : 'fin'}`
|
|
121
|
+
}; // swap fin <=> swe
|
|
122
|
+
const newField = {
|
|
123
|
+
tag: field.tag,
|
|
124
|
+
ind1: field.ind1,
|
|
125
|
+
ind2: field.ind2,
|
|
126
|
+
subfields: [sfA, sf2, sf0]
|
|
127
|
+
};
|
|
128
|
+
return newField;
|
|
129
|
+
}
|
|
130
|
+
function getLexiconAndLanguage(field) {
|
|
131
|
+
const subfield2 = field.subfields.find(sf => sf.code === '2');
|
|
132
|
+
if (subfield2.value === 'slm/fin') {
|
|
133
|
+
return {
|
|
134
|
+
'lex': 'slm',
|
|
135
|
+
'lang': 'fin'
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
if (subfield2.value === 'slm/swe') {
|
|
139
|
+
return {
|
|
140
|
+
'lex': 'slm',
|
|
141
|
+
'lang': 'swe'
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
if (subfield2.value === 'yso/fin') {
|
|
145
|
+
return {
|
|
146
|
+
'lex': 'yso',
|
|
147
|
+
'lang': 'fin'
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
if (subfield2.value === 'yso/swe') {
|
|
151
|
+
return {
|
|
152
|
+
'lex': 'yso',
|
|
153
|
+
'lang': 'swe'
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
return {};
|
|
157
|
+
}
|
|
158
|
+
async function getPrefLabel(field) {
|
|
159
|
+
// Tag vs $2 correlation has already been checked!
|
|
160
|
+
const uri = fieldToUri(field);
|
|
161
|
+
if (!uri) {
|
|
162
|
+
// $0 is invalid or sumthing
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
const prefLabels = await getTermData(uri);
|
|
166
|
+
if (!prefLabels) {
|
|
167
|
+
// Sanity check. Miss caused by illegal id etc.
|
|
168
|
+
(0, _utils.nvdebug)(`No labels found for ${uri}`, debug);
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
const lexData = getLexiconAndLanguage(field); // $2 data
|
|
172
|
+
const lang = changeAbbr(lexData.lang);
|
|
173
|
+
const subfieldA = field.subfields.find(sf => sf.code === 'a');
|
|
174
|
+
const prefLabel = prefLabels.find(pl => pl.lang === lang);
|
|
175
|
+
//console.info(`Compare prefLabel '${prefLabel.value}' AND $a '${subfieldA.value}'`); // eslint-disable-line no-console
|
|
176
|
+
if (prefLabel.value === subfieldA.value) {
|
|
177
|
+
(0, _utils.nvdebug)(`'${(0, _utils.fieldToString)(field)}' requires translating`, debug);
|
|
178
|
+
return prefLabels;
|
|
179
|
+
}
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
function swapLanguageCodeBetweenLanguages(code) {
|
|
183
|
+
if (swapLanguageCode[code]) {
|
|
184
|
+
return swapLanguageCode[code];
|
|
185
|
+
}
|
|
186
|
+
return code;
|
|
187
|
+
}
|
|
188
|
+
function changeAbbr(abbr) {
|
|
189
|
+
if (changeAbbrHash[abbr]) {
|
|
190
|
+
return changeAbbrHash[abbr];
|
|
191
|
+
}
|
|
192
|
+
return abbr;
|
|
193
|
+
}
|
|
194
|
+
function swaggerQuery(uri) {
|
|
195
|
+
// This would work for only yso, not yso-paikat etc `https://api.finto.fi/rest/v1/yso/data?format=application%2Fjson&uri=${uri}`;
|
|
196
|
+
return `https://api.finto.fi/rest/v1/data?uri=${uri}&format=application%2Fjson`; // This is simpler, but contains more irrelevant data
|
|
197
|
+
}
|
|
198
|
+
async function getTermData(uri) {
|
|
199
|
+
//console.log(`getTermData(${uri})`); // eslint-disable-line no-console
|
|
200
|
+
if (termCache[uri]) {
|
|
201
|
+
// Don't think current implementation uses the cache any more.
|
|
202
|
+
//console.log(`CACHED ${uri}`); // eslint-disable-line no-console
|
|
203
|
+
return termCache[uri];
|
|
204
|
+
}
|
|
205
|
+
const tmp = await getTermDataFromFinto(uri);
|
|
206
|
+
termCache[uri] = tmp; // eslint-disable-line functional/immutable-data, require-atomic-updates
|
|
207
|
+
return tmp;
|
|
208
|
+
}
|
|
209
|
+
async function getTermDataFromFinto(uri) {
|
|
210
|
+
const headers = {
|
|
211
|
+
'Accept': 'application/json'
|
|
212
|
+
};
|
|
213
|
+
const uri2 = swaggerQuery(uri);
|
|
214
|
+
const response = await fetch(uri2, {
|
|
215
|
+
method: 'GET',
|
|
216
|
+
headers
|
|
217
|
+
});
|
|
218
|
+
if (!response.ok) {
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
const json = await response.json();
|
|
222
|
+
if (!json.graph) {
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
const arr = json.graph;
|
|
226
|
+
const [hit] = arr.filter(row => row.uri === uri);
|
|
227
|
+
//console.log(`NEW JSON: ${JSON.stringify(hit.prefLabel)}`); // eslint-disable-line no-console
|
|
228
|
+
return hit.prefLabel;
|
|
229
|
+
}
|
|
230
|
+
function fieldToUri(field) {
|
|
231
|
+
const lex = mapTagToLex(field.tag);
|
|
232
|
+
const subfield0 = field.subfields.find(sf => sf.code === '0');
|
|
233
|
+
const id = subfield0.value.replace(/^[^0-9]+/u, '');
|
|
234
|
+
if (lex === 'yso') {
|
|
235
|
+
//return `http%3A%2F%2Fwww.yso.fi%2Fonto%2Fyso%2Fp${id}`;
|
|
236
|
+
return `http://www.yso.fi/onto/yso/p${id}`;
|
|
237
|
+
}
|
|
238
|
+
if (lex === 'slm') {
|
|
239
|
+
return `http://urn.fi/URN:NBN:fi:au:slm:s${id}`;
|
|
240
|
+
}
|
|
241
|
+
return undefined;
|
|
242
|
+
}
|
|
243
|
+
function isRelevantField(field, lang) {
|
|
244
|
+
const fieldAsString = (0, _utils.fieldToString)(field);
|
|
245
|
+
|
|
246
|
+
// We should probably allow an optional $8 as the first subfield.
|
|
247
|
+
if (!fieldAsString.match(/^... #7 ‡a [^‡]+ ‡2 [^‡]+ ‡0 [^‡]+(?: ‡9 [A-Z]+<(?:KEEP|DROP)>)*$/u)) {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
const lex = mapTagToLex(field.tag);
|
|
251
|
+
const lexLang = `${lex}/${lang}`;
|
|
252
|
+
if (!(0, _utils.fieldHasSubfield)(field, '2', lexLang)) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
return fieldHasValidSubfield0(field);
|
|
256
|
+
}
|
|
257
|
+
function fieldHasValidSubfield0(field) {
|
|
258
|
+
const lex = mapTagToLex(field.tag);
|
|
259
|
+
const subfield0 = field.subfields.find(sf => sf.code === '0');
|
|
260
|
+
if (lex === 'yso' && subfield0.value.match(/^http:\/\/www\.yso\.fi\/onto\/yso\/p[0-9]+$/u)) {
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
if (lex === 'slm' && subfield0.value.match(/^http:\/\/urn\.fi\/URN:NBN:fi:au:slm:s[0-9]+$/u)) {
|
|
264
|
+
return true;
|
|
265
|
+
}
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
function getMisses(fieldList1, fieldList2) {
|
|
269
|
+
return fieldList1.filter(f => !hasSubfield0Match(f, fieldList2));
|
|
270
|
+
}
|
|
271
|
+
function hasSubfield0Match(field, pairFields) {
|
|
272
|
+
const subfield0 = field.subfields.find(sf => sf.code === '0');
|
|
273
|
+
return pairFields.some(f => f.subfields.some(sf => sf.code === '0' && sf.value === subfield0.value));
|
|
274
|
+
}
|
|
275
|
+
function mapTagToLex(tag) {
|
|
276
|
+
if (tag === '655') {
|
|
277
|
+
return 'slm';
|
|
278
|
+
}
|
|
279
|
+
return 'yso';
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/*
|
|
283
|
+
function getValidIdentifiers(record, tag, lang) {
|
|
284
|
+
const lex = mapTagToLex(tag);
|
|
285
|
+
const subfield2Value = `${lex}/${lang}`;
|
|
286
|
+
const candFields = record.get(tag).filter(f => f.subfields.some(sf => sf.code === '2' && sf.value === subfield2Value)); // TODO: filter
|
|
287
|
+
return [];
|
|
288
|
+
}
|
|
289
|
+
*/
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=translate-terms.js.map
|