@natlibfi/marc-record-validators-melinda 11.3.7-alpha.1 → 11.3.8-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.
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = _default;
7
+ exports.getLanguageCode = getLanguageCode;
7
8
  var _utils = require("./utils");
8
9
  //import createDebugLogger from 'debug';
9
10
 
@@ -17,13 +18,6 @@ function _default() {
17
18
  validate,
18
19
  fix
19
20
  };
20
- function getLanguageCode(record) {
21
- const [f008] = record.get('008');
22
- if (f008 && f008.value.length === 40) {
23
- return f008.value.substring(35, 38);
24
- }
25
- return '|||';
26
- }
27
21
  function isRealLanguageCode(languageCode = '|||') {
28
22
  (0, _utils.nvdebug)(`Language code 008/35-37: ${languageCode}`);
29
23
  if (!languageCode.match(/^[a-z]{3}$/u) || ['mul', 'und', 'zxx'].includes(languageCode)) {
@@ -90,4 +84,11 @@ function _default() {
90
84
  };
91
85
  }
92
86
  }
87
+ function getLanguageCode(record) {
88
+ const [f008] = record.get('008');
89
+ if (f008 && f008.value.length === 40) {
90
+ return f008.value.substring(35, 38);
91
+ }
92
+ return '|||';
93
+ }
93
94
  //# sourceMappingURL=addMissingField041.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"addMissingField041.js","names":["_utils","require","description","_default","validate","fix","getLanguageCode","record","f008","get","value","length","substring","isRealLanguageCode","languageCode","nvdebug","match","includes","determineSubfieldCode","typeOfRecord","getTypeOfRecord","generateContent","languageCodeFields","subfieldCode","tag","ind1","ind2","subfields","code","data","res","message","valid","insertField","msg","fieldToString"],"sources":["../src/addMissingField041.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\nconst description = 'Add missing 041 field based on 008/35-37';\n\n// const multimediaRegexp = /multimedia/ui;\n\nexport default function () {\n\n return {\n description, validate, fix\n };\n\n function getLanguageCode(record) {\n const [f008] = record.get('008');\n if (f008 && f008.value.length === 40) {\n return f008.value.substring(35, 38);\n }\n return '|||';\n }\n\n function isRealLanguageCode(languageCode = '|||') {\n nvdebug(`Language code 008/35-37: ${languageCode}`);\n if (!languageCode.match(/^[a-z]{3}$/u) || ['mul', 'und', 'zxx'].includes(languageCode)) {\n return false;\n }\n // Assume that value is valid:\n return true;\n }\n\n function determineSubfieldCode(record) {\n const typeOfRecord = record.getTypeOfRecord(record);\n if (typeOfRecord === 'i' || typeOfRecord === 'j') {\n return 'd';\n }\n return 'a';\n }\n\n function generateContent(record) {\n const languageCodeFields = record.get('041');\n if (languageCodeFields.length > 0) {\n return null;\n }\n const languageCode = getLanguageCode(record);\n if (!isRealLanguageCode(languageCode)) {\n return null;\n }\n const subfieldCode = determineSubfieldCode(record);\n // NB! Usemarcon-bookwhere had IND1=0...\n return {tag: '041', ind1: ' ', ind2: ' ', subfields: [{code: subfieldCode, value: languageCode}]};\n }\n\n function fix(record) {\n nvdebug(`FIX ${description}...`);\n const data = generateContent(record);\n const res = {message: [], fix: [], valid: true};\n if (data) {\n record.insertField(data);\n return res;\n }\n return res;\n }\n\n function validate(record) {\n nvdebug(`VALIDATE ${description}...`);\n const data = generateContent(record);\n if (!data) {\n return {message: [], valid: true};\n }\n const msg = `${description}: '${fieldToString(data)}'`;\n return {message: [msg], valid: false};\n }\n}\n\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AADA;;AAGA,MAAMC,WAAW,GAAG,0CAA0C;;AAE9D;;AAEe,SAAAC,SAAA,EAAY;EAEzB,OAAO;IACLD,WAAW;IAAEE,QAAQ;IAAEC;EACzB,CAAC;EAED,SAASC,eAAeA,CAACC,MAAM,EAAE;IAC/B,MAAM,CAACC,IAAI,CAAC,GAAGD,MAAM,CAACE,GAAG,CAAC,KAAK,CAAC;IAChC,IAAID,IAAI,IAAIA,IAAI,CAACE,KAAK,CAACC,MAAM,KAAK,EAAE,EAAE;MACpC,OAAOH,IAAI,CAACE,KAAK,CAACE,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;IACrC;IACA,OAAO,KAAK;EACd;EAEA,SAASC,kBAAkBA,CAACC,YAAY,GAAG,KAAK,EAAE;IAChD,IAAAC,cAAO,EAAC,4BAA4BD,YAAY,EAAE,CAAC;IACnD,IAAI,CAACA,YAAY,CAACE,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACC,QAAQ,CAACH,YAAY,CAAC,EAAE;MACtF,OAAO,KAAK;IACd;IACA;IACA,OAAO,IAAI;EACb;EAEA,SAASI,qBAAqBA,CAACX,MAAM,EAAE;IACrC,MAAMY,YAAY,GAAGZ,MAAM,CAACa,eAAe,CAACb,MAAM,CAAC;IACnD,IAAIY,YAAY,KAAK,GAAG,IAAIA,YAAY,KAAK,GAAG,EAAE;MAChD,OAAO,GAAG;IACZ;IACA,OAAO,GAAG;EACZ;EAEA,SAASE,eAAeA,CAACd,MAAM,EAAE;IAC/B,MAAMe,kBAAkB,GAAGf,MAAM,CAACE,GAAG,CAAC,KAAK,CAAC;IAC5C,IAAIa,kBAAkB,CAACX,MAAM,GAAG,CAAC,EAAE;MACjC,OAAO,IAAI;IACb;IACA,MAAMG,YAAY,GAAGR,eAAe,CAACC,MAAM,CAAC;IAC5C,IAAI,CAACM,kBAAkB,CAACC,YAAY,CAAC,EAAE;MACrC,OAAO,IAAI;IACb;IACA,MAAMS,YAAY,GAAGL,qBAAqB,CAACX,MAAM,CAAC;IAClD;IACA,OAAO;MAACiB,GAAG,EAAE,KAAK;MAAEC,IAAI,EAAE,GAAG;MAAEC,IAAI,EAAE,GAAG;MAAEC,SAAS,EAAE,CAAC;QAACC,IAAI,EAAEL,YAAY;QAAEb,KAAK,EAAEI;MAAY,CAAC;IAAC,CAAC;EACnG;EAEA,SAAST,GAAGA,CAACE,MAAM,EAAE;IACnB,IAAAQ,cAAO,EAAC,OAAOb,WAAW,KAAK,CAAC;IAChC,MAAM2B,IAAI,GAAGR,eAAe,CAACd,MAAM,CAAC;IACpC,MAAMuB,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAE1B,GAAG,EAAE,EAAE;MAAE2B,KAAK,EAAE;IAAI,CAAC;IAC/C,IAAIH,IAAI,EAAE;MACRtB,MAAM,CAAC0B,WAAW,CAACJ,IAAI,CAAC;MACxB,OAAOC,GAAG;IACZ;IACA,OAAOA,GAAG;EACZ;EAEA,SAAS1B,QAAQA,CAACG,MAAM,EAAE;IACxB,IAAAQ,cAAO,EAAC,YAAYb,WAAW,KAAK,CAAC;IACrC,MAAM2B,IAAI,GAAGR,eAAe,CAACd,MAAM,CAAC;IACpC,IAAI,CAACsB,IAAI,EAAE;MACT,OAAO;QAACE,OAAO,EAAE,EAAE;QAAEC,KAAK,EAAE;MAAI,CAAC;IACnC;IACA,MAAME,GAAG,GAAG,GAAGhC,WAAW,MAAM,IAAAiC,oBAAa,EAACN,IAAI,CAAC,GAAG;IACtD,OAAO;MAACE,OAAO,EAAE,CAACG,GAAG,CAAC;MAAEF,KAAK,EAAE;IAAK,CAAC;EACvC;AACF","ignoreList":[]}
1
+ {"version":3,"file":"addMissingField041.js","names":["_utils","require","description","_default","validate","fix","isRealLanguageCode","languageCode","nvdebug","match","includes","determineSubfieldCode","record","typeOfRecord","getTypeOfRecord","generateContent","languageCodeFields","get","length","getLanguageCode","subfieldCode","tag","ind1","ind2","subfields","code","value","data","res","message","valid","insertField","msg","fieldToString","f008","substring"],"sources":["../src/addMissingField041.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\nconst description = 'Add missing 041 field based on 008/35-37';\n\n// const multimediaRegexp = /multimedia/ui;\n\nexport default function () {\n\n return {\n description, validate, fix\n };\n\n function isRealLanguageCode(languageCode = '|||') {\n nvdebug(`Language code 008/35-37: ${languageCode}`);\n if (!languageCode.match(/^[a-z]{3}$/u) || ['mul', 'und', 'zxx'].includes(languageCode)) {\n return false;\n }\n // Assume that value is valid:\n return true;\n }\n\n function determineSubfieldCode(record) {\n const typeOfRecord = record.getTypeOfRecord(record);\n if (typeOfRecord === 'i' || typeOfRecord === 'j') {\n return 'd';\n }\n return 'a';\n }\n\n function generateContent(record) {\n const languageCodeFields = record.get('041');\n if (languageCodeFields.length > 0) {\n return null;\n }\n const languageCode = getLanguageCode(record);\n if (!isRealLanguageCode(languageCode)) {\n return null;\n }\n const subfieldCode = determineSubfieldCode(record);\n // NB! Usemarcon-bookwhere had IND1=0...\n return {tag: '041', ind1: ' ', ind2: ' ', subfields: [{code: subfieldCode, value: languageCode}]};\n }\n\n function fix(record) {\n nvdebug(`FIX ${description}...`);\n const data = generateContent(record);\n const res = {message: [], fix: [], valid: true};\n if (data) {\n record.insertField(data);\n return res;\n }\n return res;\n }\n\n function validate(record) {\n nvdebug(`VALIDATE ${description}...`);\n const data = generateContent(record);\n if (!data) {\n return {message: [], valid: true};\n }\n const msg = `${description}: '${fieldToString(data)}'`;\n return {message: [msg], valid: false};\n }\n}\n\nexport function getLanguageCode(record) {\n const [f008] = record.get('008');\n if (f008 && f008.value.length === 40) {\n return f008.value.substring(35, 38);\n }\n return '|||';\n}\n"],"mappings":";;;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AADA;;AAGA,MAAMC,WAAW,GAAG,0CAA0C;;AAE9D;;AAEe,SAAAC,SAAA,EAAY;EAEzB,OAAO;IACLD,WAAW;IAAEE,QAAQ;IAAEC;EACzB,CAAC;EAED,SAASC,kBAAkBA,CAACC,YAAY,GAAG,KAAK,EAAE;IAChD,IAAAC,cAAO,EAAC,4BAA4BD,YAAY,EAAE,CAAC;IACnD,IAAI,CAACA,YAAY,CAACE,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACC,QAAQ,CAACH,YAAY,CAAC,EAAE;MACtF,OAAO,KAAK;IACd;IACA;IACA,OAAO,IAAI;EACb;EAEA,SAASI,qBAAqBA,CAACC,MAAM,EAAE;IACrC,MAAMC,YAAY,GAAGD,MAAM,CAACE,eAAe,CAACF,MAAM,CAAC;IACnD,IAAIC,YAAY,KAAK,GAAG,IAAIA,YAAY,KAAK,GAAG,EAAE;MAChD,OAAO,GAAG;IACZ;IACA,OAAO,GAAG;EACZ;EAEA,SAASE,eAAeA,CAACH,MAAM,EAAE;IAC/B,MAAMI,kBAAkB,GAAGJ,MAAM,CAACK,GAAG,CAAC,KAAK,CAAC;IAC5C,IAAID,kBAAkB,CAACE,MAAM,GAAG,CAAC,EAAE;MACjC,OAAO,IAAI;IACb;IACA,MAAMX,YAAY,GAAGY,eAAe,CAACP,MAAM,CAAC;IAC5C,IAAI,CAACN,kBAAkB,CAACC,YAAY,CAAC,EAAE;MACrC,OAAO,IAAI;IACb;IACA,MAAMa,YAAY,GAAGT,qBAAqB,CAACC,MAAM,CAAC;IAClD;IACA,OAAO;MAACS,GAAG,EAAE,KAAK;MAAEC,IAAI,EAAE,GAAG;MAAEC,IAAI,EAAE,GAAG;MAAEC,SAAS,EAAE,CAAC;QAACC,IAAI,EAAEL,YAAY;QAAEM,KAAK,EAAEnB;MAAY,CAAC;IAAC,CAAC;EACnG;EAEA,SAASF,GAAGA,CAACO,MAAM,EAAE;IACnB,IAAAJ,cAAO,EAAC,OAAON,WAAW,KAAK,CAAC;IAChC,MAAMyB,IAAI,GAAGZ,eAAe,CAACH,MAAM,CAAC;IACpC,MAAMgB,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAExB,GAAG,EAAE,EAAE;MAAEyB,KAAK,EAAE;IAAI,CAAC;IAC/C,IAAIH,IAAI,EAAE;MACRf,MAAM,CAACmB,WAAW,CAACJ,IAAI,CAAC;MACxB,OAAOC,GAAG;IACZ;IACA,OAAOA,GAAG;EACZ;EAEA,SAASxB,QAAQA,CAACQ,MAAM,EAAE;IACxB,IAAAJ,cAAO,EAAC,YAAYN,WAAW,KAAK,CAAC;IACrC,MAAMyB,IAAI,GAAGZ,eAAe,CAACH,MAAM,CAAC;IACpC,IAAI,CAACe,IAAI,EAAE;MACT,OAAO;QAACE,OAAO,EAAE,EAAE;QAAEC,KAAK,EAAE;MAAI,CAAC;IACnC;IACA,MAAME,GAAG,GAAG,GAAG9B,WAAW,MAAM,IAAA+B,oBAAa,EAACN,IAAI,CAAC,GAAG;IACtD,OAAO;MAACE,OAAO,EAAE,CAACG,GAAG,CAAC;MAAEF,KAAK,EAAE;IAAK,CAAC;EACvC;AACF;AAEO,SAASX,eAAeA,CAACP,MAAM,EAAE;EACtC,MAAM,CAACsB,IAAI,CAAC,GAAGtB,MAAM,CAACK,GAAG,CAAC,KAAK,CAAC;EAChC,IAAIiB,IAAI,IAAIA,IAAI,CAACR,KAAK,CAACR,MAAM,KAAK,EAAE,EAAE;IACpC,OAAOgB,IAAI,CAACR,KAAK,CAACS,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;EACrC;EACA,OAAO,KAAK;AACd","ignoreList":[]}
package/dist/cyrillux.js CHANGED
@@ -9,10 +9,11 @@ var _utils = require("./utils");
9
9
  var iso9 = _interopRequireWildcard(require("iso9_1995"));
10
10
  var _subfield6Utils = require("./subfield6Utils");
11
11
  var _xregexp = _interopRequireDefault(require("xregexp"));
12
- var sfs4900 = _interopRequireWildcard(require("sfs4900"));
12
+ var sfs4900 = _interopRequireWildcard(require("@natlibfi/sfs-4900"));
13
13
  var _sortFields = _interopRequireDefault(require("./sortFields"));
14
14
  var _reindexSubfield6OccurenceNumbers = _interopRequireDefault(require("./reindexSubfield6OccurenceNumbers"));
15
15
  var _punctuation = require("./punctuation2");
16
+ var _addMissingField = require("./addMissingField041");
16
17
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
17
18
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
18
19
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -141,8 +142,9 @@ function _default(config = {}) {
141
142
  value
142
143
  };
143
144
  }
144
- function mapSubfieldToSfs4900(subfield) {
145
- const value = subfieldShouldTransliterateToIso9(subfield) ? sfs4900.convertToLatin(subfield.value).result : subfield.value;
145
+ function mapSubfieldToSfs4900(subfield, lang = 'rus') {
146
+ const inputLang = lang === 'ukr' ? 'ukr' : 'rus'; // Support 'ukr' and 'rus', default to 'rus'
147
+ const value = subfieldShouldTransliterateToIso9(subfield) ? sfs4900.convertToLatin(subfield.value, inputLang).result : subfield.value;
146
148
  return {
147
149
  code: subfield.code,
148
150
  value
@@ -208,14 +210,14 @@ function _default(config = {}) {
208
210
  (0, _utils.nvdebug)(` New CYR 880 ${(0, _utils.fieldToString)(newField)}`);
209
211
  return newField;
210
212
  }
211
- function mapFieldToSfs4900Field880(field, occurrenceNumber) {
213
+ function mapFieldToSfs4900Field880(field, occurrenceNumber, lang = 'rus') {
212
214
  (0, _utils.nvdebug)(`Derive SFS 880 from ${(0, _utils.fieldToString)(field)}`);
213
215
  const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);
214
216
  const newSubfield9 = (0, _utils.fieldHasSubfield)(field, '9', sfs4900Trans) ? [] : [{
215
217
  code: '9',
216
218
  value: sfs4900Trans
217
219
  }];
218
- const subfields = [newSubfield6, ...field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf)), ...newSubfield9];
220
+ const subfields = [newSubfield6, ...field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf, lang)), ...newSubfield9];
219
221
  const newField = {
220
222
  tag: '880',
221
223
  ind1: field.ind1,
@@ -274,7 +276,8 @@ function _default(config = {}) {
274
276
  // Actually check that original field and and sfs-4900-fied cyrillic field are equal (after punctuation clean-up),
275
277
  // and thus it's a real case of MELINDA-10330 ISO9 adding:
276
278
  const occurrenceNumberAsString = (0, _subfield6Utils.fieldGetUnambiguousOccurrenceNumber)(field);
277
- const field2 = (0, _utils.fieldToString)(createFieldForSfs4900Comparison(mapFieldToSfs4900Field880(pairedField, occurrenceNumberAsString), field.tag));
279
+ const languageCode = (0, _addMissingField.getLanguageCode)(record);
280
+ const field2 = (0, _utils.fieldToString)(createFieldForSfs4900Comparison(mapFieldToSfs4900Field880(pairedField, occurrenceNumberAsString, languageCode), field.tag));
278
281
  const field1 = (0, _utils.fieldToString)(createFieldForSfs4900Comparison(field, field.tag));
279
282
  (0, _utils.nvdebug)(`COMPARE CONTENTS:\n '${field1}' vs\n '${field2}': ${field1 === field2 ? 'OK' : 'FAIL'}`);
280
283
  return field1 === field2;
@@ -289,6 +292,7 @@ function _default(config = {}) {
289
292
  // Handle MELINDA-10330: Field is already in SFS-4900 and the only paired field is in Cyrillic!
290
293
  const [pairedField] = (0, _subfield6Utils.fieldGetOccurrenceNumberPairs)(field, record.get('880'));
291
294
  const occurrenceNumberAsString = (0, _subfield6Utils.fieldGetUnambiguousOccurrenceNumber)(field);
295
+ const languageCode = (0, _addMissingField.getLanguageCode)(record);
292
296
  const tmpField = {
293
297
  'tag': field.tag,
294
298
  'ind1': field.ind1,
@@ -297,7 +301,7 @@ function _default(config = {}) {
297
301
  };
298
302
  const newMainField = mapFieldToIso9(tmpField, occurrenceNumberAsString); // Cyrillic => ISO-9
299
303
  const newCyrillicField = mapFieldToCyrillicField880(tmpField, occurrenceNumberAsString); // CYRILLIC
300
- const newSFS4900Field = mapFieldToSfs4900Field880(field, occurrenceNumberAsString); // SFS-4900
304
+ const newSFS4900Field = mapFieldToSfs4900Field880(field, occurrenceNumberAsString, languageCode); // SFS-4900
301
305
 
302
306
  // Trigger the drop of original counterpart $6 :
303
307
  pairedField.cyrilluxSkip = 1; // eslint-disable-line functional/immutable-data
@@ -321,6 +325,7 @@ function _default(config = {}) {
321
325
 
322
326
  const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);
323
327
  const newOccurrenceNumberAsString = (0, _subfield6Utils.intToOccurrenceNumberString)(newOccurrenceNumberAsInt);
328
+ const languageCode = (0, _addMissingField.getLanguageCode)(record);
324
329
 
325
330
  // nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);
326
331
 
@@ -330,7 +335,7 @@ function _default(config = {}) {
330
335
 
331
336
  const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9
332
337
  const newCyrillicField = needsIso9Transliteration(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC
333
- const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900Field880(originalField, newOccurrenceNumberAsString) : undefined; /// SFS-4900
338
+ const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900Field880(originalField, newOccurrenceNumberAsString, languageCode) : undefined; /// SFS-4900
334
339
 
335
340
  return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);
336
341
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cyrillux.js","names":["_clone","_interopRequireDefault","require","_utils","iso9","_interopRequireWildcard","_subfield6Utils","_xregexp","sfs4900","_sortFields","_reindexSubfield6OccurenceNumbers","_punctuation","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","iso9Trans","cyrillicTrans","sfs4900Trans","_default","config","description","validate","fix","preprocessConfig","doISO9Transliteration","doSFS4900Transliteration","record","res","message","valid","nBefore","fields","length","processFields","reindexSubfield6OccurenceNumbers","sortFields","input","output","currField","remainingInput","fakeRecord","createdMax","recordGetMaxSubfield6OccurrenceNumberAsInteger","result","processField","forEach","field","validateField","orig","fieldToString","normalizedFields","clone","mod","fieldsToString","replace","push","isCyrillicCharacter","char","XRegExp","test","containsCyrillicCharacters","str","split","some","fieldContainsCyrillicCharacters","subfields","sf","subfieldShouldTransliterateToIso9","subfield","isControlSubfieldCode","code","value","tagCanBeTransliterated","tag","includes","fieldCanBeTransliterated","mapSubfieldToIso9","convertToLatin","mapSubfieldToSfs4900","mapFieldToIso9","occurrenceNumber","map","ind1","ind2","subfield6","deriveSubfield6","subfield9","fieldHasSubfield","filter","initialSubfield","resetSubfield6Tag","mapFieldToCyrillicField880","nvdebug","newSubfield6","newSubfield9","newField","mapFieldToSfs4900Field880","getNewOccurrenceNumber","originalField","maxCreatedOccurrenceNumber","fieldGetMaxSubfield6OccurrenceNumberAsInteger","needsIso9Transliteration","existingPairedFields","f","needsSfs4900Transliteration","sfs4900PairCanBeTransliterated","fieldGetOccurrenceNumberPairs","pairedField","occurrenceNumberAsString","fieldGetUnambiguousOccurrenceNumber","field2","createFieldForSfs4900Comparison","field1","clonedField","fieldStripPunctuation","transliterateSfs4900Pair","tmpField","newMainField","newCyrillicField","newSFS4900Field","cyrilluxSkip","newOccurrenceNumberAsInt","newOccurrenceNumberAsString","intToOccurrenceNumberString","undefined"],"sources":["../src/cyrillux.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldHasSubfield, fieldToString, fieldsToString, isControlSubfieldCode, nvdebug} from './utils';\nimport * as iso9 from 'iso9_1995';\nimport {fieldGetMaxSubfield6OccurrenceNumberAsInteger, fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag} from './subfield6Utils';\n\nimport XRegExp from 'xregexp';\nimport * as sfs4900 from 'sfs4900';\nimport {default as sortFields} from './sortFields';\nimport {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers';\nimport {fieldStripPunctuation} from './punctuation2';\n\nconst iso9Trans = 'ISO9 <TRANS>';\nconst cyrillicTrans = 'CYRILLIC <TRANS>';\nconst sfs4900Trans = 'SFS4900 <TRANS>';\n\nexport default function (config = {}) {\n\n return {\n description: 'Cyrillux functionality: convert original field to latinitsa (ISO-9) and add 880s for original cyrillic and latinitsa (SFS-4900)',\n validate, fix\n };\n\n function preprocessConfig() {\n config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration; // eslint-disable-line functional/immutable-data\n config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration; // eslint-disable-line functional/immutable-data\n }\n\n function fix(record) {\n // Fix always succeeds\n const res = {message: [], fix: [], valid: true};\n\n preprocessConfig(config);\n\n const nBefore = record.fields.length;\n\n record.fields = processFields(record.fields); // eslint-disable-line functional/immutable-data\n\n if (nBefore < record.fields.length) { // eslint-disable-line functional/no-conditional-statements\n reindexSubfield6OccurenceNumbers().fix(record);\n sortFields().fix(record);\n }\n\n function processFields(input, output = []) {\n const [currField, ...remainingInput] = input;\n if (!currField) {\n return output;\n }\n\n const fakeRecord = {fields: output};\n const createdMax = recordGetMaxSubfield6OccurrenceNumberAsInteger(fakeRecord);\n const result = processField(currField, record, createdMax);\n\n return processFields(remainingInput, [...output, ...result]);\n }\n\n return res;\n }\n\n function validate(record) {\n const res = {message: [], valid: true};\n\n preprocessConfig(config);\n\n record.fields?.forEach(field => {\n validateField(field, res, record);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res, record) {\n const orig = fieldToString(field);\n\n const normalizedFields = processField(clone(field), record);\n const mod = fieldsToString(normalizedFields).replace(/\\t__SEPARATOR__\\t/ug, ', ').replace(/ (‡6 [0-9][0-9][0-9])-[0-9][0-9]+/gu, ' $1-NN'); // eslint-disable-line prefer-named-capture-group\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`CHANGE: ${orig} => ${mod}`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n\n function isCyrillicCharacter(char) {\n return XRegExp('[\\\\p{Cyrillic}]').test(char); // eslint-disable-line new-cap\n }\n\n function containsCyrillicCharacters(str) { // from melinda-ui-cyrillux\n if (!str) {\n return false;\n }\n return str.split('').some(isCyrillicCharacter);\n }\n\n function fieldContainsCyrillicCharacters(field) { // based on melinda-ui-cyrillux\n return field.subfields && field.subfields.some(sf => subfieldShouldTransliterateToIso9(sf));\n }\n\n function subfieldShouldTransliterateToIso9(subfield) {\n if (isControlSubfieldCode(subfield.code)) {\n return false;\n }\n return containsCyrillicCharacters(subfield.value);\n }\n\n function tagCanBeTransliterated(tag) {\n return !['336', '337', '338', '880'].includes(tag);\n }\n\n function fieldCanBeTransliterated(field) {\n // Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well).\n // Discussion: We should probably also skip others like 05X-08X, 648, 650, 651, and 655, but this needs thinking...\n // Also I'd like to convert do CYRILLIC->ISO-9 in field 300 (and others?) without 880 mappings... (<- not implemented)\n\n // nvdebug(`fieldCanBeTransliterated('${fieldToString(field)}') in...`);\n if (!tagCanBeTransliterated(field.tag)) {\n return false;\n }\n\n // Skip control fields:\n if (!field.subfields) {\n return false;\n }\n // When doing MELINDA-10330-ish, we noticed that $6 should not prevent translittaration per se, so this restriction is no longer applied!\n\n if (field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>'))) {\n return false;\n }\n\n return fieldContainsCyrillicCharacters(field); // We have something to translitterate:\n }\n\n\n function mapSubfieldToIso9(subfield) {\n if (!subfieldShouldTransliterateToIso9(subfield)) {\n return {code: subfield.code, value: subfield.value}; // just clone\n }\n const value = iso9.convertToLatin(subfield.value);\n\n return {code: subfield.code, value};\n }\n\n function mapSubfieldToSfs4900(subfield) {\n const value = subfieldShouldTransliterateToIso9(subfield) ? sfs4900.convertToLatin(subfield.value).result : subfield.value;\n return {code: subfield.code, value};\n }\n\n\n function mapFieldToIso9(field, occurrenceNumber) {\n // This is the original non-880 field, that will be converted from Cyrillic to ISO\n\n // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either\n if (!config.doISO9Transliteration && !config.doSFS4900Transliteration) {\n const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);\n const subfield9 = fieldHasSubfield(field, '9', iso9Trans) ? [] : [{code: '9', value: iso9Trans}];\n\n const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToIso9(sf));\n\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, ...subfield9]};\n }\n\n function deriveSubfield6(tag, subfields, occurrenceNumber) {\n const initialSubfield = {code: '6', value: `${tag}-${occurrenceNumber}`};\n if (tag === '880') { // If *tag in subfield $6* is 880, field is not 880 :D\n return initialSubfield;\n }\n // Try to use existing subfield\n const [subfield6] = subfields.filter(sf => sf.code === '6').map(sf => clone(sf));\n if (subfield6) {\n resetSubfield6Tag(subfield6, tag); // Should we update occurrence number?\n return subfield6;\n }\n\n return initialSubfield;\n }\n\n function mapFieldToCyrillicField880(field, occurrenceNumber) {\n nvdebug(`Derive CYR 880 from ${fieldToString(field)}`);\n const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);\n const newSubfield9 = fieldHasSubfield(field, '9', cyrillicTrans) ? [] : [{code: '9', value: cyrillicTrans}];\n const subfields = [\n newSubfield6,\n ...field.subfields.filter(sf => sf.code !== '6').map(sf => clone(sf)),\n ...newSubfield9\n ];\n\n const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};\n nvdebug(` New CYR 880 ${fieldToString(newField)}`);\n return newField;\n }\n\n function mapFieldToSfs4900Field880(field, occurrenceNumber) {\n nvdebug(`Derive SFS 880 from ${fieldToString(field)}`);\n const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);\n const newSubfield9 = fieldHasSubfield(field, '9', sfs4900Trans) ? [] : [{code: '9', value: sfs4900Trans}];\n const subfields = [\n newSubfield6,\n ...field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf)),\n ...newSubfield9\n ];\n\n const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};\n nvdebug(` SFS 880 ${fieldToString(newField)}`);\n return newField;\n }\n\n function getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber = 0) {\n const occurrenceNumber = fieldGetMaxSubfield6OccurrenceNumberAsInteger(originalField);\n // Return existing occurrence number:\n if (occurrenceNumber > 0) {\n return occurrenceNumber;\n }\n if (maxCreatedOccurrenceNumber) {\n return maxCreatedOccurrenceNumber + 1;\n }\n return recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n }\n\n function needsIso9Transliteration(existingPairedFields) {\n if (!config.doISO9Transliteration) {\n return false;\n }\n // Actually normal field is always converted to ISO-9, and this function checks where we move original cyrillic field to 880.\n // Thus we look for field 880$9 \"CYRILLIC <TRANS>\" here, and not \"ISO9 <TRANS>\"!\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', cyrillicTrans));\n }\n\n function needsSfs4900Transliteration(existingPairedFields) {\n if (!config.doSFS4900Transliteration) {\n return false;\n }\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', sfs4900Trans));\n }\n\n function sfs4900PairCanBeTransliterated(field, record) {\n // MELINDA-10330: we already have public library data: (unmarked) SFS-4900 in FIELD and (unmarked) Cyrillic in 880\n if (!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 field2 = fieldToString(createFieldForSfs4900Comparison(mapFieldToSfs4900Field880(pairedField, occurrenceNumberAsString), field.tag));\n const field1 = fieldToString(createFieldForSfs4900Comparison(field, field.tag));\n nvdebug(`COMPARE CONTENTS:\\n '${field1}' vs\\n '${field2}': ${field1 === field2 ? 'OK' : 'FAIL'}`);\n return field1 === field2;\n }\n\n function createFieldForSfs4900Comparison(field, tag) {\n const clonedField = clone(field);\n clonedField.tag = tag; // eslint-disable-line functional/immutable-data\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== '9' || sf.value !== sfs4900Trans); // eslint-disable-line functional/immutable-data\n return fieldStripPunctuation(clonedField);\n }\n\n function transliterateSfs4900Pair(field, record) {\n // Handle MELINDA-10330: Field is already in SFS-4900 and the only paired field is in Cyrillic!\n const [pairedField] = fieldGetOccurrenceNumberPairs(field, record.get('880'));\n\n const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);\n\n const tmpField = {'tag': field.tag, 'ind1': field.ind1, 'ind2': field.ind2, 'subfields': pairedField.subfields};\n\n const newMainField = mapFieldToIso9(tmpField, occurrenceNumberAsString); // Cyrillic => ISO-9\n const newCyrillicField = mapFieldToCyrillicField880(tmpField, occurrenceNumberAsString); // CYRILLIC\n const newSFS4900Field = mapFieldToSfs4900Field880(field, occurrenceNumberAsString); // SFS-4900\n\n // Trigger the drop of original counterpart $6 :\n pairedField.cyrilluxSkip = 1; // eslint-disable-line functional/immutable-data\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n\n\n function processField(originalField, record, maxCreatedOccurrenceNumber = 0) {\n if (!fieldCanBeTransliterated(originalField)) {\n if (sfs4900PairCanBeTransliterated(originalField, record)) { // MELINDA-10330\n return transliterateSfs4900Pair(originalField, record);\n }\n if (originalField.cyrilluxSkip) { // MELINDA-10330 hack to remove 880 fields that were replaced/sort-of processed with their counterpair.\n return [];\n }\n return [originalField];\n }\n\n // nvdebug(`PROCESSING: ${fieldToString(originalField)}`);\n\n const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);\n const newOccurrenceNumberAsString = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n\n // nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);\n\n const existingPairedFields = fieldGetOccurrenceNumberPairs(originalField, record.get('880'));\n\n // nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`);\n\n const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9\n const newCyrillicField = needsIso9Transliteration(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900Field880(originalField, newOccurrenceNumberAsString) : undefined; /// SFS-4900\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n}\n"],"mappings":"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","ignoreList":[]}
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":";;;;;;AACA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,IAAA,GAAAC,uBAAA,CAAAH,OAAA;AACA,IAAAI,eAAA,GAAAJ,OAAA;AAEA,IAAAK,QAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,OAAA,GAAAH,uBAAA,CAAAH,OAAA;AACA,IAAAO,WAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,iCAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,YAAA,GAAAT,OAAA;AACA,IAAAU,gBAAA,GAAAV,OAAA;AAAqD,SAAAW,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAT,wBAAAS,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAAA,SAAArB,uBAAAa,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAI,UAAA,GAAAJ,CAAA,KAAAK,OAAA,EAAAL,CAAA;AAXrD;;AAaA,MAAMmB,SAAS,GAAG,cAAc;AAChC,MAAMC,aAAa,GAAG,kBAAkB;AACxC,MAAMC,YAAY,GAAG,iBAAiB;AAEvB,SAAAC,SAAUC,MAAM,GAAG,CAAC,CAAC,EAAE;EAEpC,OAAO;IACLC,WAAW,EAAE,iIAAiI;IAC9IC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASC,gBAAgBA,CAAA,EAAG;IAC1BJ,MAAM,CAACK,qBAAqB,GAAG,OAAOL,MAAM,CAACK,qBAAqB,KAAK,WAAW,GAAG,IAAI,GAAGL,MAAM,CAACK,qBAAqB,CAAC,CAAC;IAC1HL,MAAM,CAACM,wBAAwB,GAAG,OAAON,MAAM,CAACM,wBAAwB,KAAK,WAAW,GAAG,IAAI,GAAGN,MAAM,CAACM,wBAAwB,CAAC,CAAC;EACrI;EAEA,SAASH,GAAGA,CAACI,MAAM,EAAE;IACnB;IACA,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEN,GAAG,EAAE,EAAE;MAAEO,KAAK,EAAE;IAAI,CAAC;IAE/CN,gBAAgB,CAACJ,MAAM,CAAC;IAExB,MAAMW,OAAO,GAAGJ,MAAM,CAACK,MAAM,CAACC,MAAM;IAEpCN,MAAM,CAACK,MAAM,GAAGE,aAAa,CAACP,MAAM,CAACK,MAAM,CAAC,CAAC,CAAC;;IAE9C,IAAID,OAAO,GAAGJ,MAAM,CAACK,MAAM,CAACC,MAAM,EAAE;MAAE;MACpC,IAAAE,yCAAgC,EAAC,CAAC,CAACZ,GAAG,CAACI,MAAM,CAAC;MAC9C,IAAAS,mBAAU,EAAC,CAAC,CAACb,GAAG,CAACI,MAAM,CAAC;IAC1B;IAEA,SAASO,aAAaA,CAACG,KAAK,EAAEC,MAAM,GAAG,EAAE,EAAE;MACzC,MAAM,CAACC,SAAS,EAAE,GAAGC,cAAc,CAAC,GAAGH,KAAK;MAC5C,IAAI,CAACE,SAAS,EAAE;QACd,OAAOD,MAAM;MACf;MAEA,MAAMG,UAAU,GAAG;QAACT,MAAM,EAAEM;MAAM,CAAC;MACnC,MAAMI,UAAU,GAAG,IAAAC,8DAA8C,EAACF,UAAU,CAAC;MAC7E,MAAMG,MAAM,GAAGC,YAAY,CAACN,SAAS,EAAEZ,MAAM,EAAEe,UAAU,CAAC;MAE1D,OAAOR,aAAa,CAACM,cAAc,EAAE,CAAC,GAAGF,MAAM,EAAE,GAAGM,MAAM,CAAC,CAAC;IAC9D;IAEA,OAAOhB,GAAG;EACZ;EAEA,SAASN,QAAQA,CAACK,MAAM,EAAE;IACxB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEC,KAAK,EAAE;IAAI,CAAC;IAEtCN,gBAAgB,CAACJ,MAAM,CAAC;IAExBO,MAAM,CAACK,MAAM,EAAEc,OAAO,CAACC,KAAK,IAAI;MAC9BC,aAAa,CAACD,KAAK,EAAEnB,GAAG,EAAED,MAAM,CAAC;IACnC,CAAC,CAAC;IAEFC,GAAG,CAACE,KAAK,GAAG,EAAEF,GAAG,CAACC,OAAO,CAACI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,OAAOL,GAAG;EACZ;EAEA,SAASoB,aAAaA,CAACD,KAAK,EAAEnB,GAAG,EAAED,MAAM,EAAE;IACzC,MAAMsB,IAAI,GAAG,IAAAC,oBAAa,EAACH,KAAK,CAAC;IAEjC,MAAMI,gBAAgB,GAAGN,YAAY,CAAC,IAAAO,cAAK,EAACL,KAAK,CAAC,EAAEpB,MAAM,CAAC;IAC3D,MAAM0B,GAAG,GAAG,IAAAC,qBAAc,EAACH,gBAAgB,CAAC,CAACI,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAACA,OAAO,CAAC,qCAAqC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5I,IAAIN,IAAI,KAAKI,GAAG,EAAE;MAAE;MAClBzB,GAAG,CAACC,OAAO,CAAC2B,IAAI,CAAC,WAAWP,IAAI,OAAOI,GAAG,EAAE,CAAC,CAAC,CAAC;MAC/C;IACF;IACA;EACF;EAEA,SAASI,mBAAmBA,CAACC,IAAI,EAAE;IACjC,OAAO,IAAAC,gBAAO,EAAC,iBAAiB,CAAC,CAACC,IAAI,CAACF,IAAI,CAAC,CAAC,CAAC;EAChD;EAEA,SAASG,0BAA0BA,CAACC,GAAG,EAAE;IAAE;IACzC,IAAI,CAACA,GAAG,EAAE;MACR,OAAO,KAAK;IACd;IACA,OAAOA,GAAG,CAACC,KAAK,CAAC,EAAE,CAAC,CAACC,IAAI,CAACP,mBAAmB,CAAC;EAChD;EAEA,SAASQ,+BAA+BA,CAAClB,KAAK,EAAE;IAAE;IAChD,OAAOA,KAAK,CAACmB,SAAS,IAAInB,KAAK,CAACmB,SAAS,CAACF,IAAI,CAACG,EAAE,IAAIC,iCAAiC,CAACD,EAAE,CAAC,CAAC;EAC7F;EAEA,SAASC,iCAAiCA,CAACC,QAAQ,EAAE;IACnD,IAAI,IAAAC,4BAAqB,EAACD,QAAQ,CAACE,IAAI,CAAC,EAAE;MACxC,OAAO,KAAK;IACd;IACA,OAAOV,0BAA0B,CAACQ,QAAQ,CAACG,KAAK,CAAC;EACnD;EAEA,SAASC,sBAAsBA,CAACC,GAAG,EAAE;IACnC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACC,QAAQ,CAACD,GAAG,CAAC;EACpD;EAEA,SAASE,wBAAwBA,CAAC7B,KAAK,EAAE;IACvC;IACA;IACA;;IAEA;IACA,IAAI,CAAC0B,sBAAsB,CAAC1B,KAAK,CAAC2B,GAAG,CAAC,EAAE;MACtC,OAAO,KAAK;IACd;;IAEA;IACA,IAAI,CAAC3B,KAAK,CAACmB,SAAS,EAAE;MACpB,OAAO,KAAK;IACd;IACA;;IAEA,IAAInB,KAAK,CAACmB,SAAS,CAACF,IAAI,CAACG,EAAE,IAAIA,EAAE,CAACI,IAAI,KAAK,GAAG,IAAIJ,EAAE,CAACK,KAAK,CAACG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE;MAC/E,OAAO,KAAK;IACd;IAEA,OAAOV,+BAA+B,CAAClB,KAAK,CAAC,CAAC,CAAC;EACjD;EAGA,SAAS8B,iBAAiBA,CAACR,QAAQ,EAAE;IACnC,IAAI,CAACD,iCAAiC,CAACC,QAAQ,CAAC,EAAE;MAChD,OAAO;QAACE,IAAI,EAAEF,QAAQ,CAACE,IAAI;QAAEC,KAAK,EAAEH,QAAQ,CAACG;MAAK,CAAC,CAAC,CAAC;IACvD;IACA,MAAMA,KAAK,GAAGrF,IAAI,CAAC2F,cAAc,CAACT,QAAQ,CAACG,KAAK,CAAC;IAEjD,OAAO;MAACD,IAAI,EAAEF,QAAQ,CAACE,IAAI;MAAEC;IAAK,CAAC;EACrC;EAEA,SAASO,oBAAoBA,CAACV,QAAQ,EAAEW,IAAI,GAAG,KAAK,EAAE;IACpD,MAAMC,SAAS,GAAGD,IAAI,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC;IAClD,MAAMR,KAAK,GAAGJ,iCAAiC,CAACC,QAAQ,CAAC,GAAG9E,OAAO,CAACuF,cAAc,CAACT,QAAQ,CAACG,KAAK,EAAES,SAAS,CAAC,CAACrC,MAAM,GAAGyB,QAAQ,CAACG,KAAK;IACrI,OAAO;MAACD,IAAI,EAAEF,QAAQ,CAACE,IAAI;MAAEC;IAAK,CAAC;EACrC;EAGA,SAASU,cAAcA,CAACnC,KAAK,EAAEoC,gBAAgB,EAAE;IAC/C;;IAEA;IACA,IAAI,CAAC/D,MAAM,CAACK,qBAAqB,IAAI,CAACL,MAAM,CAACM,wBAAwB,EAAE;MACrE,MAAMwC,SAAS,GAAGnB,KAAK,CAACmB,SAAS,CAACkB,GAAG,CAACjB,EAAE,IAAIU,iBAAiB,CAACV,EAAE,CAAC,CAAC;MAClE,OAAO;QAACO,GAAG,EAAE3B,KAAK,CAAC2B,GAAG;QAAEW,IAAI,EAAEtC,KAAK,CAACsC,IAAI;QAAEC,IAAI,EAAEvC,KAAK,CAACuC,IAAI;QAAEpB;MAAS,CAAC;IACxE;IAEA,MAAMqB,SAAS,GAAGC,eAAe,CAAC,KAAK,EAAEzC,KAAK,CAACmB,SAAS,EAAEiB,gBAAgB,CAAC;IAC3E,MAAMM,SAAS,GAAG,IAAAC,uBAAgB,EAAC3C,KAAK,EAAE,GAAG,EAAE/B,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;MAACuD,IAAI,EAAE,GAAG;MAAEC,KAAK,EAAExD;IAAS,CAAC,CAAC;IAEhG,MAAMkD,SAAS,GAAGnB,KAAK,CAACmB,SAAS,CAACyB,MAAM,CAACxB,EAAE,IAAIA,EAAE,CAACI,IAAI,KAAK,GAAG,CAAC,CAACa,GAAG,CAACjB,EAAE,IAAIU,iBAAiB,CAACV,EAAE,CAAC,CAAC;IAEhG,OAAO;MAACO,GAAG,EAAE3B,KAAK,CAAC2B,GAAG;MAAEW,IAAI,EAAEtC,KAAK,CAACsC,IAAI;MAAEC,IAAI,EAAEvC,KAAK,CAACuC,IAAI;MAAEpB,SAAS,EAAE,CAACqB,SAAS,EAAE,GAAGrB,SAAS,EAAE,GAAGuB,SAAS;IAAC,CAAC;EACjH;EAEA,SAASD,eAAeA,CAACd,GAAG,EAAER,SAAS,EAAEiB,gBAAgB,EAAE;IACzD,MAAMS,eAAe,GAAG;MAACrB,IAAI,EAAE,GAAG;MAAEC,KAAK,EAAE,GAAGE,GAAG,IAAIS,gBAAgB;IAAE,CAAC;IACxE,IAAIT,GAAG,KAAK,KAAK,EAAE;MAAE;MACnB,OAAOkB,eAAe;IACxB;IACA;IACA,MAAM,CAACL,SAAS,CAAC,GAAGrB,SAAS,CAACyB,MAAM,CAACxB,EAAE,IAAIA,EAAE,CAACI,IAAI,KAAK,GAAG,CAAC,CAACa,GAAG,CAACjB,EAAE,IAAI,IAAAf,cAAK,EAACe,EAAE,CAAC,CAAC;IAChF,IAAIoB,SAAS,EAAE;MACb,IAAAM,iCAAiB,EAACN,SAAS,EAAEb,GAAG,CAAC,CAAC,CAAC;MACnC,OAAOa,SAAS;IAClB;IAEA,OAAOK,eAAe;EACxB;EAEA,SAASE,0BAA0BA,CAAC/C,KAAK,EAAEoC,gBAAgB,EAAE;IAC3D,IAAAY,cAAO,EAAC,uBAAuB,IAAA7C,oBAAa,EAACH,KAAK,CAAC,EAAE,CAAC;IACtD,MAAMiD,YAAY,GAAGR,eAAe,CAACzC,KAAK,CAAC2B,GAAG,EAAE3B,KAAK,CAACmB,SAAS,EAAEiB,gBAAgB,CAAC;IAClF,MAAMc,YAAY,GAAG,IAAAP,uBAAgB,EAAC3C,KAAK,EAAE,GAAG,EAAE9B,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC;MAACsD,IAAI,EAAE,GAAG;MAAEC,KAAK,EAAEvD;IAAa,CAAC,CAAC;IAC3G,MAAMiD,SAAS,GAAG,CAChB8B,YAAY,EACZ,GAAGjD,KAAK,CAACmB,SAAS,CAACyB,MAAM,CAACxB,EAAE,IAAIA,EAAE,CAACI,IAAI,KAAK,GAAG,CAAC,CAACa,GAAG,CAACjB,EAAE,IAAI,IAAAf,cAAK,EAACe,EAAE,CAAC,CAAC,EACrE,GAAG8B,YAAY,CAChB;IAED,MAAMC,QAAQ,GAAG;MAACxB,GAAG,EAAE,KAAK;MAAEW,IAAI,EAAEtC,KAAK,CAACsC,IAAI;MAAEC,IAAI,EAAEvC,KAAK,CAACuC,IAAI;MAAEpB;IAAS,CAAC;IAC5E,IAAA6B,cAAO,EAAC,uBAAuB,IAAA7C,oBAAa,EAACgD,QAAQ,CAAC,EAAE,CAAC;IACzD,OAAOA,QAAQ;EACjB;EAEA,SAASC,yBAAyBA,CAACpD,KAAK,EAAEoC,gBAAgB,EAAEH,IAAI,GAAG,KAAK,EAAE;IACxE,IAAAe,cAAO,EAAC,uBAAuB,IAAA7C,oBAAa,EAACH,KAAK,CAAC,EAAE,CAAC;IACtD,MAAMiD,YAAY,GAAGR,eAAe,CAACzC,KAAK,CAAC2B,GAAG,EAAE3B,KAAK,CAACmB,SAAS,EAAEiB,gBAAgB,CAAC;IAClF,MAAMc,YAAY,GAAG,IAAAP,uBAAgB,EAAC3C,KAAK,EAAE,GAAG,EAAE7B,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC;MAACqD,IAAI,EAAE,GAAG;MAAEC,KAAK,EAAEtD;IAAY,CAAC,CAAC;IACzG,MAAMgD,SAAS,GAAG,CAChB8B,YAAY,EACZ,GAAGjD,KAAK,CAACmB,SAAS,CAACyB,MAAM,CAACxB,EAAE,IAAIA,EAAE,CAACI,IAAI,KAAK,GAAG,CAAC,CAACa,GAAG,CAACjB,EAAE,IAAIY,oBAAoB,CAACZ,EAAE,EAAEa,IAAI,CAAC,CAAC,EAC1F,GAAGiB,YAAY,CAChB;IAED,MAAMC,QAAQ,GAAG;MAACxB,GAAG,EAAE,KAAK;MAAEW,IAAI,EAAEtC,KAAK,CAACsC,IAAI;MAAEC,IAAI,EAAEvC,KAAK,CAACuC,IAAI;MAAEpB;IAAS,CAAC;IAC5E,IAAA6B,cAAO,EAAC,uBAAuB,IAAA7C,oBAAa,EAACgD,QAAQ,CAAC,EAAE,CAAC;IACzD,OAAOA,QAAQ;EACjB;EAEA,SAASE,sBAAsBA,CAACC,aAAa,EAAE1E,MAAM,EAAE2E,0BAA0B,GAAG,CAAC,EAAE;IACrF,MAAMnB,gBAAgB,GAAG,IAAAoB,6DAA6C,EAACF,aAAa,CAAC;IACrF;IACA,IAAIlB,gBAAgB,GAAG,CAAC,EAAE;MACxB,OAAOA,gBAAgB;IACzB;IACA,IAAImB,0BAA0B,EAAE;MAC9B,OAAOA,0BAA0B,GAAG,CAAC;IACvC;IACA,OAAO,IAAA3D,8DAA8C,EAAChB,MAAM,CAAC,GAAG,CAAC;EACnE;EAEA,SAAS6E,wBAAwBA,CAACC,oBAAoB,EAAE;IACtD,IAAI,CAACrF,MAAM,CAACK,qBAAqB,EAAE;MACjC,OAAO,KAAK;IACd;IACA;IACA;IACA,OAAO,CAACgF,oBAAoB,CAACzC,IAAI,CAAC0C,CAAC,IAAI,IAAAhB,uBAAgB,EAACgB,CAAC,EAAE,GAAG,EAAEzF,aAAa,CAAC,CAAC;EACjF;EAEA,SAAS0F,2BAA2BA,CAACF,oBAAoB,EAAE;IACzD,IAAI,CAACrF,MAAM,CAACM,wBAAwB,EAAE;MACpC,OAAO,KAAK;IACd;IACA,OAAO,CAAC+E,oBAAoB,CAACzC,IAAI,CAAC0C,CAAC,IAAI,IAAAhB,uBAAgB,EAACgB,CAAC,EAAE,GAAG,EAAExF,YAAY,CAAC,CAAC;EAChF;EAEA,SAAS0F,8BAA8BA,CAAC7D,KAAK,EAAEpB,MAAM,EAAE;IACrD;IACA,IAAI,CAACoB,KAAK,CAACmB,SAAS,IAAI,CAACO,sBAAsB,CAAC1B,KAAK,CAAC2B,GAAG,CAAC,IAAI,CAACtD,MAAM,CAACK,qBAAqB,EAAE;MAC3F,OAAO,KAAK;IACd;;IAEA;IACA,IAAIwC,+BAA+B,CAAClB,KAAK,CAAC,IAAIA,KAAK,CAACmB,SAAS,CAACF,IAAI,CAACG,EAAE,IAAIA,EAAE,CAACI,IAAI,KAAK,GAAG,IAAIJ,EAAE,CAACK,KAAK,CAACG,QAAQ,CAAC,SAAS,CAAC,IAAIR,EAAE,CAACK,KAAK,KAAKxD,SAAS,CAAC,EAAE;MACnJ,OAAO,KAAK;IACd;IAEA,MAAMyF,oBAAoB,GAAG,IAAAI,6CAA6B,EAAC9D,KAAK,EAAEpB,MAAM,CAACvB,GAAG,CAAC,KAAK,CAAC,CAAC;IACpF,IAAIqG,oBAAoB,CAACxE,MAAM,KAAK,CAAC,EAAE;MACrC,OAAO,KAAK;IACd;;IAEA;IACA,MAAM,CAAC6E,WAAW,CAAC,GAAGL,oBAAoB;IAC1C,IAAI,CAACxC,+BAA+B,CAAC6C,WAAW,CAAC,IAAIA,WAAW,CAAC5C,SAAS,CAACF,IAAI,CAACG,EAAE,IAAIA,EAAE,CAACI,IAAI,KAAK,GAAG,IAAIJ,EAAE,CAACK,KAAK,CAACG,QAAQ,CAAC,SAAS,CAAC,IAAIR,EAAE,CAACK,KAAK,KAAKvD,aAAa,CAAC,EAAE;MACpK,OAAO,KAAK;IACd;;IAEA;IACA;IACA,MAAM8F,wBAAwB,GAAG,IAAAC,mDAAmC,EAACjE,KAAK,CAAC;IAC3E,MAAMkE,YAAY,GAAG,IAAAC,gCAAe,EAACvF,MAAM,CAAC;IAC5C,MAAMwF,MAAM,GAAG,IAAAjE,oBAAa,EAACkE,+BAA+B,CAACjB,yBAAyB,CAACW,WAAW,EAAEC,wBAAwB,EAAEE,YAAY,CAAC,EAAElE,KAAK,CAAC2B,GAAG,CAAC,CAAC;IACxJ,MAAM2C,MAAM,GAAG,IAAAnE,oBAAa,EAACkE,+BAA+B,CAACrE,KAAK,EAAEA,KAAK,CAAC2B,GAAG,CAAC,CAAC;IAC/E,IAAAqB,cAAO,EAAC,yBAAyBsB,MAAM,YAAYF,MAAM,MAAME,MAAM,KAAKF,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;IACnG,OAAOE,MAAM,KAAKF,MAAM;EAC1B;EAEA,SAASC,+BAA+BA,CAACrE,KAAK,EAAE2B,GAAG,EAAE;IACnD,MAAM4C,WAAW,GAAG,IAAAlE,cAAK,EAACL,KAAK,CAAC;IAChCuE,WAAW,CAAC5C,GAAG,GAAGA,GAAG,CAAC,CAAC;IACvB4C,WAAW,CAACpD,SAAS,GAAGoD,WAAW,CAACpD,SAAS,CAACyB,MAAM,CAACxB,EAAE,IAAIA,EAAE,CAACI,IAAI,KAAK,GAAG,IAAIJ,EAAE,CAACK,KAAK,KAAKtD,YAAY,CAAC,CAAC,CAAC;IAC1G,OAAO,IAAAqG,kCAAqB,EAACD,WAAW,CAAC;EAC3C;EAEA,SAASE,wBAAwBA,CAACzE,KAAK,EAAEpB,MAAM,EAAE;IAC/C;IACA,MAAM,CAACmF,WAAW,CAAC,GAAG,IAAAD,6CAA6B,EAAC9D,KAAK,EAAEpB,MAAM,CAACvB,GAAG,CAAC,KAAK,CAAC,CAAC;IAE7E,MAAM2G,wBAAwB,GAAG,IAAAC,mDAAmC,EAACjE,KAAK,CAAC;IAC3E,MAAMkE,YAAY,GAAG,IAAAC,gCAAe,EAACvF,MAAM,CAAC;IAE5C,MAAM8F,QAAQ,GAAG;MAAC,KAAK,EAAE1E,KAAK,CAAC2B,GAAG;MAAE,MAAM,EAAE3B,KAAK,CAACsC,IAAI;MAAE,MAAM,EAAEtC,KAAK,CAACuC,IAAI;MAAE,WAAW,EAAEwB,WAAW,CAAC5C;IAAS,CAAC;IAE/G,MAAMwD,YAAY,GAAGxC,cAAc,CAACuC,QAAQ,EAAEV,wBAAwB,CAAC,CAAC,CAAC;IACzE,MAAMY,gBAAgB,GAAG7B,0BAA0B,CAAC2B,QAAQ,EAAEV,wBAAwB,CAAC,CAAC,CAAC;IACzF,MAAMa,eAAe,GAAGzB,yBAAyB,CAACpD,KAAK,EAAEgE,wBAAwB,EAAEE,YAAY,CAAC,CAAC,CAAC;;IAElG;IACAH,WAAW,CAACe,YAAY,GAAG,CAAC,CAAC,CAAC;;IAE9B,OAAO,CAACH,YAAY,EAAEC,gBAAgB,EAAEC,eAAe,CAAC,CAACjC,MAAM,CAACe,CAAC,IAAIA,CAAC,CAAC;EACzE;EAGA,SAAS7D,YAAYA,CAACwD,aAAa,EAAE1E,MAAM,EAAE2E,0BAA0B,GAAG,CAAC,EAAE;IAC3E,IAAI,CAAC1B,wBAAwB,CAACyB,aAAa,CAAC,EAAE;MAC5C,IAAIO,8BAA8B,CAACP,aAAa,EAAE1E,MAAM,CAAC,EAAE;QAAE;QAC3D,OAAO6F,wBAAwB,CAACnB,aAAa,EAAE1E,MAAM,CAAC;MACxD;MACA,IAAI0E,aAAa,CAACwB,YAAY,EAAE;QAAE;QAChC,OAAO,EAAE;MACX;MACA,OAAO,CAACxB,aAAa,CAAC;IACxB;;IAEA;;IAEA,MAAMyB,wBAAwB,GAAG1B,sBAAsB,CAACC,aAAa,EAAE1E,MAAM,EAAE2E,0BAA0B,CAAC;IAC1G,MAAMyB,2BAA2B,GAAG,IAAAC,2CAA2B,EAACF,wBAAwB,CAAC;IACzF,MAAMb,YAAY,GAAG,IAAAC,gCAAe,EAACvF,MAAM,CAAC;;IAE5C;;IAEA,MAAM8E,oBAAoB,GAAG,IAAAI,6CAA6B,EAACR,aAAa,EAAE1E,MAAM,CAACvB,GAAG,CAAC,KAAK,CAAC,CAAC;;IAE5F;;IAEA,MAAMsH,YAAY,GAAGxC,cAAc,CAACmB,aAAa,EAAE0B,2BAA2B,CAAC,CAAC,CAAC;IACjF,MAAMJ,gBAAgB,GAAGnB,wBAAwB,CAACC,oBAAoB,CAAC,GAAGX,0BAA0B,CAACO,aAAa,EAAE0B,2BAA2B,CAAC,GAAGE,SAAS,CAAC,CAAC;IAC9J,MAAML,eAAe,GAAGjB,2BAA2B,CAACF,oBAAoB,CAAC,GAAGN,yBAAyB,CAACE,aAAa,EAAE0B,2BAA2B,EAAEd,YAAY,CAAC,GAAGgB,SAAS,CAAC,CAAC;;IAE7K,OAAO,CAACP,YAAY,EAAEC,gBAAgB,EAAEC,eAAe,CAAC,CAACjC,MAAM,CAACe,CAAC,IAAIA,CAAC,CAAC;EACzE;AACF","ignoreList":[]}
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/marc-record-validators-melinda.git"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "11.3.7-alpha.1",
17
+ "version": "11.3.8-alpha.1",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"
@@ -37,18 +37,18 @@
37
37
  "cover:report": "nyc report"
38
38
  },
39
39
  "dependencies": {
40
- "@babel/register": "^7.25.7",
40
+ "@babel/register": "^7.25.9",
41
41
  "@natlibfi/issn-verify": "^1.0.4",
42
- "@natlibfi/marc-record": "^9.0.2",
43
- "@natlibfi/marc-record-validate": "^8.0.10",
42
+ "@natlibfi/marc-record": "^9.1.1",
43
+ "@natlibfi/marc-record-validate": "^8.0.11",
44
+ "@natlibfi/sfs-4900": "^1.1.0",
44
45
  "cld3-asm": "^3.1.1",
45
46
  "clone": "^2.1.2",
46
47
  "debug": "^4.3.7",
47
48
  "iso9_1995": "^0.0.2",
48
- "isbn3": "^1.2.2",
49
+ "isbn3": "^1.2.3",
49
50
  "langs": "^2.0.0",
50
51
  "node-fetch": "^2.7.0",
51
- "sfs4900": "^0.0.1",
52
52
  "xml2js": "^0.6.2",
53
53
  "xregexp": "^5.1.1"
54
54
  },
@@ -56,9 +56,9 @@
56
56
  "@natlibfi/marc-record-validate": "^8.0.10"
57
57
  },
58
58
  "devDependencies": {
59
- "@babel/cli": "^7.25.7",
60
- "@babel/core": "^7.25.8",
61
- "@babel/preset-env": "^7.25.8",
59
+ "@babel/cli": "^7.25.9",
60
+ "@babel/core": "^7.26.0",
61
+ "@babel/preset-env": "^7.26.0",
62
62
  "@natlibfi/eslint-config-melinda-backend": "^3.0.5",
63
63
  "@natlibfi/fixugen": "^2.0.10",
64
64
  "@natlibfi/fixura": "^3.0.10",
@@ -69,7 +69,7 @@
69
69
  "cross-env": "^7.0.3",
70
70
  "eslint": "^8.57.1",
71
71
  "fetch-mock": "^11.1.5",
72
- "mocha": "^10.7.3",
72
+ "mocha": "^10.8.2",
73
73
  "nyc": "^17.1.0"
74
74
  },
75
75
  "eslintConfig": {
@@ -11,14 +11,6 @@ export default function () {
11
11
  description, validate, fix
12
12
  };
13
13
 
14
- function getLanguageCode(record) {
15
- const [f008] = record.get('008');
16
- if (f008 && f008.value.length === 40) {
17
- return f008.value.substring(35, 38);
18
- }
19
- return '|||';
20
- }
21
-
22
14
  function isRealLanguageCode(languageCode = '|||') {
23
15
  nvdebug(`Language code 008/35-37: ${languageCode}`);
24
16
  if (!languageCode.match(/^[a-z]{3}$/u) || ['mul', 'und', 'zxx'].includes(languageCode)) {
@@ -72,3 +64,10 @@ export default function () {
72
64
  }
73
65
  }
74
66
 
67
+ export function getLanguageCode(record) {
68
+ const [f008] = record.get('008');
69
+ if (f008 && f008.value.length === 40) {
70
+ return f008.value.substring(35, 38);
71
+ }
72
+ return '|||';
73
+ }
package/src/cyrillux.js CHANGED
@@ -5,10 +5,11 @@ import * as iso9 from 'iso9_1995';
5
5
  import {fieldGetMaxSubfield6OccurrenceNumberAsInteger, fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag} from './subfield6Utils';
6
6
 
7
7
  import XRegExp from 'xregexp';
8
- import * as sfs4900 from 'sfs4900';
8
+ import * as sfs4900 from '@natlibfi/sfs-4900';
9
9
  import {default as sortFields} from './sortFields';
10
10
  import {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers';
11
11
  import {fieldStripPunctuation} from './punctuation2';
12
+ import {getLanguageCode} from './addMissingField041';
12
13
 
13
14
  const iso9Trans = 'ISO9 <TRANS>';
14
15
  const cyrillicTrans = 'CYRILLIC <TRANS>';
@@ -141,8 +142,9 @@ export default function (config = {}) {
141
142
  return {code: subfield.code, value};
142
143
  }
143
144
 
144
- function mapSubfieldToSfs4900(subfield) {
145
- const value = subfieldShouldTransliterateToIso9(subfield) ? sfs4900.convertToLatin(subfield.value).result : subfield.value;
145
+ function mapSubfieldToSfs4900(subfield, lang = 'rus') {
146
+ const inputLang = lang === 'ukr' ? 'ukr' : 'rus'; // Support 'ukr' and 'rus', default to 'rus'
147
+ const value = subfieldShouldTransliterateToIso9(subfield) ? sfs4900.convertToLatin(subfield.value, inputLang).result : subfield.value;
146
148
  return {code: subfield.code, value};
147
149
  }
148
150
 
@@ -194,13 +196,13 @@ export default function (config = {}) {
194
196
  return newField;
195
197
  }
196
198
 
197
- function mapFieldToSfs4900Field880(field, occurrenceNumber) {
199
+ function mapFieldToSfs4900Field880(field, occurrenceNumber, lang = 'rus') {
198
200
  nvdebug(`Derive SFS 880 from ${fieldToString(field)}`);
199
201
  const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);
200
202
  const newSubfield9 = fieldHasSubfield(field, '9', sfs4900Trans) ? [] : [{code: '9', value: sfs4900Trans}];
201
203
  const subfields = [
202
204
  newSubfield6,
203
- ...field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf)),
205
+ ...field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf, lang)),
204
206
  ...newSubfield9
205
207
  ];
206
208
 
@@ -262,7 +264,8 @@ export default function (config = {}) {
262
264
  // Actually check that original field and and sfs-4900-fied cyrillic field are equal (after punctuation clean-up),
263
265
  // and thus it's a real case of MELINDA-10330 ISO9 adding:
264
266
  const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);
265
- const field2 = fieldToString(createFieldForSfs4900Comparison(mapFieldToSfs4900Field880(pairedField, occurrenceNumberAsString), field.tag));
267
+ const languageCode = getLanguageCode(record);
268
+ const field2 = fieldToString(createFieldForSfs4900Comparison(mapFieldToSfs4900Field880(pairedField, occurrenceNumberAsString, languageCode), field.tag));
266
269
  const field1 = fieldToString(createFieldForSfs4900Comparison(field, field.tag));
267
270
  nvdebug(`COMPARE CONTENTS:\n '${field1}' vs\n '${field2}': ${field1 === field2 ? 'OK' : 'FAIL'}`);
268
271
  return field1 === field2;
@@ -280,12 +283,13 @@ export default function (config = {}) {
280
283
  const [pairedField] = fieldGetOccurrenceNumberPairs(field, record.get('880'));
281
284
 
282
285
  const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);
286
+ const languageCode = getLanguageCode(record);
283
287
 
284
288
  const tmpField = {'tag': field.tag, 'ind1': field.ind1, 'ind2': field.ind2, 'subfields': pairedField.subfields};
285
289
 
286
290
  const newMainField = mapFieldToIso9(tmpField, occurrenceNumberAsString); // Cyrillic => ISO-9
287
291
  const newCyrillicField = mapFieldToCyrillicField880(tmpField, occurrenceNumberAsString); // CYRILLIC
288
- const newSFS4900Field = mapFieldToSfs4900Field880(field, occurrenceNumberAsString); // SFS-4900
292
+ const newSFS4900Field = mapFieldToSfs4900Field880(field, occurrenceNumberAsString, languageCode); // SFS-4900
289
293
 
290
294
  // Trigger the drop of original counterpart $6 :
291
295
  pairedField.cyrilluxSkip = 1; // eslint-disable-line functional/immutable-data
@@ -309,6 +313,7 @@ export default function (config = {}) {
309
313
 
310
314
  const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);
311
315
  const newOccurrenceNumberAsString = intToOccurrenceNumberString(newOccurrenceNumberAsInt);
316
+ const languageCode = getLanguageCode(record);
312
317
 
313
318
  // nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);
314
319
 
@@ -318,7 +323,7 @@ export default function (config = {}) {
318
323
 
319
324
  const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9
320
325
  const newCyrillicField = needsIso9Transliteration(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC
321
- const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900Field880(originalField, newOccurrenceNumberAsString) : undefined; /// SFS-4900
326
+ const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900Field880(originalField, newOccurrenceNumberAsString, languageCode) : undefined; /// SFS-4900
322
327
 
323
328
  return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);
324
329
  }
@@ -0,0 +1,24 @@
1
+ {
2
+ "_validationOptions": {},
3
+ "leader": "12345cam 22123454i 4500",
4
+ "fields": [
5
+ { "tag": "008", "value": "01234567890123456789012345678901234rus89"},
6
+ { "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
7
+ { "code": "6", "value": "880-01" },
8
+ { "code": "a", "value": "Gogolʹ." },
9
+ { "code": "9", "value": "ISO9 <TRANS>" }
10
+ ]},
11
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
12
+ { "code": "6", "value": "100-01" },
13
+ { "code": "a", "value": "Гоголь." },
14
+ { "code": "9", "value": "CYRILLIC <TRANS>" }
15
+ ]},
16
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
17
+ { "code": "6", "value": "100-01" },
18
+ { "code": "a", "value": "Gogol." },
19
+ { "code": "9", "value": "SFS4900 <TRANS>" }
20
+ ]}
21
+
22
+ ]
23
+ }
24
+
@@ -0,0 +1,9 @@
1
+ {
2
+ "description": "Fix 10a: convert to SFS-4900 using rules for Russian (language based on 008/35-37)",
3
+ "only": false,
4
+ "fix": true,
5
+ "config": {
6
+ "doISO9Transliteration": true,
7
+ "doSFS4900Transliteration": true
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "leader": "12345cam 22123454i 4500",
3
+ "fields": [
4
+ { "tag": "008", "value": "01234567890123456789012345678901234rus89"},
5
+ { "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
6
+ { "code": "a", "value": "Гоголь." }
7
+ ]}
8
+ ]
9
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "_validationOptions": {},
3
+ "leader": "12345cam 22123454i 4500",
4
+ "fields": [
5
+ { "tag": "008", "value": "01234567890123456789012345678901234ukr89"},
6
+ { "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
7
+ { "code": "6", "value": "880-01" },
8
+ { "code": "a", "value": "Gogolʹ." },
9
+ { "code": "9", "value": "ISO9 <TRANS>" }
10
+ ]},
11
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
12
+ { "code": "6", "value": "100-01" },
13
+ { "code": "a", "value": "Гоголь." },
14
+ { "code": "9", "value": "CYRILLIC <TRANS>" }
15
+ ]},
16
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
17
+ { "code": "6", "value": "100-01" },
18
+ { "code": "a", "value": "Hohol." },
19
+ { "code": "9", "value": "SFS4900 <TRANS>" }
20
+ ]}
21
+ ]
22
+ }
23
+
@@ -0,0 +1,9 @@
1
+ {
2
+ "description": "Fix 10b: convert to SFS-4900 using rules for Ukrainian (language based on 008/35-37)",
3
+ "only": false,
4
+ "fix": true,
5
+ "config": {
6
+ "doISO9Transliteration": true,
7
+ "doSFS4900Transliteration": true
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "leader": "12345cam 22123454i 4500",
3
+ "fields": [
4
+ { "tag": "008", "value": "01234567890123456789012345678901234ukr89"},
5
+ { "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
6
+ { "code": "a", "value": "Гоголь." }
7
+ ]}
8
+ ]
9
+ }