@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.
Files changed (36) hide show
  1. package/dist/cyrillux.js +67 -34
  2. package/dist/cyrillux.js.map +1 -1
  3. package/dist/translate-terms.js +291 -0
  4. package/dist/translate-terms.js.map +1 -0
  5. package/dist/translate-terms.spec.js +51 -0
  6. package/dist/translate-terms.spec.js.map +1 -0
  7. package/package.json +1 -1
  8. package/src/cyrillux.js +56 -32
  9. package/src/translate-terms.js +274 -0
  10. package/src/translate-terms.spec.js +52 -0
  11. package/test-fixtures/cyrillux/f01/metadata.json +1 -1
  12. package/test-fixtures/cyrillux/f03/metadata.json +4 -3
  13. package/test-fixtures/cyrillux/f03b/expectedResult.json +21 -0
  14. package/test-fixtures/cyrillux/f03b/metadata.json +11 -0
  15. package/test-fixtures/cyrillux/f03b/record.json +19 -0
  16. package/test-fixtures/cyrillux/f04/metadata.json +4 -3
  17. package/test-fixtures/cyrillux/f08/metadata.json +1 -1
  18. package/test-fixtures/cyrillux/f09/metadata.json +1 -1
  19. package/test-fixtures/cyrillux/f11/expectedResult.json +18 -0
  20. package/test-fixtures/cyrillux/f11/metadata.json +9 -0
  21. package/test-fixtures/cyrillux/f11/record.json +9 -0
  22. package/test-fixtures/cyrillux/f11b/expectedResult.json +18 -0
  23. package/test-fixtures/cyrillux/f11b/metadata.json +9 -0
  24. package/test-fixtures/cyrillux/f11b/record.json +16 -0
  25. package/test-fixtures/translate-terms/01/expectedResult.json +37 -0
  26. package/test-fixtures/translate-terms/01/metadata.json +6 -0
  27. package/test-fixtures/translate-terms/01/record.json +27 -0
  28. package/test-fixtures/translate-terms/02/expectedResult.json +37 -0
  29. package/test-fixtures/translate-terms/02/metadata.json +6 -0
  30. package/test-fixtures/translate-terms/02/record.json +27 -0
  31. package/test-fixtures/translate-terms/03/expectedResult.json +26 -0
  32. package/test-fixtures/translate-terms/03/metadata.json +5 -0
  33. package/test-fixtures/translate-terms/03/record.json +26 -0
  34. package/test-fixtures/translate-terms/04/expectedResult.json +16 -0
  35. package/test-fixtures/translate-terms/04/metadata.json +7 -0
  36. 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(config);
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(config);
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
- // This is the original non-880 field, that will be converted from Cyrillic to ISO
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.doISO9Transliteration && !config.doSFS4900Transliteration) {
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 needsIso9Transliteration(existingPairedFields) {
242
- if (!config.doISO9Transliteration) {
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
- // Actually normal field is always converted to ISO-9, and this function checks where we move original cyrillic field to 880.
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
- if (!fieldContainsCyrillicCharacters(pairedField) || pairedField.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== cyrillicTrans)) {
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(mapFieldToSfs4900Field880(pairedField, occurrenceNumberAsString, languageCode), field.tag));
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 = mapFieldToSfs4900Field880(field, occurrenceNumberAsString, languageCode); // SFS-4900
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 = needsIso9Transliteration(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC
338
- const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900Field880(originalField, newOccurrenceNumberAsString, languageCode) : undefined; /// SFS-4900
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
  }
@@ -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