@natlibfi/marc-record-validators-melinda 11.3.3 → 11.3.4-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cyrillux.js CHANGED
@@ -17,6 +17,9 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
17
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
18
  //import createDebugLogger from 'debug';
19
19
 
20
+ const iso9Trans = 'ISO9 <TRANS>';
21
+ const cyrillicTrans = 'CYRILLIC <TRANS>';
22
+ const sfs4900Trans = 'SFS4900 <TRANS>';
20
23
  function _default(config = {}) {
21
24
  return {
22
25
  description: 'Cyrillux functionality: convert original field to latinitsa (ISO-9) and add 880s for original cyrillic and latinitsa (SFS-4900)',
@@ -100,19 +103,32 @@ function _default(config = {}) {
100
103
  }
101
104
  return containsCyrillicCharacters(subfield.value);
102
105
  }
103
- function fieldShouldTransliterateToIso9(field) {
104
- // Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well)
106
+ function fieldCanBeTransliterated(field) {
107
+ // Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well).
108
+ // Discussion: We should probably also skip others like 05X-08X, 648, 650, 651, and 655, but this needs thinking...
109
+ // Also I'd like to co CYRILLIC->ISO-9 for field 300 (and others?) without 880 mappings...
105
110
  if (['336', '337', '338', '880'].includes(field.tag)) {
106
111
  return false;
107
112
  }
108
- // Skip control fields and fields that already have a translitteration
109
- if (!field.subfields || field.subfields.some(sf => sf.code === '6')) {
113
+ // Skip control fields:
114
+ if (!field.subfields) {
110
115
  return false;
111
116
  }
112
- return fieldContainsCyrillicCharacters(field);
117
+ // MELINDA-10330: $6 should not prevent translittaration per se, so this restriction is no longer applied!
118
+
119
+ if (field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>'))) {
120
+ return false;
121
+ }
122
+ return fieldContainsCyrillicCharacters(field); // We have something to translitterate:
113
123
  }
114
124
  function mapSubfieldToIso9(subfield) {
115
- const value = subfieldShouldTransliterateToIso9(subfield) ? iso9.convertToLatin(subfield.value) : subfield.value;
125
+ if (!subfieldShouldTransliterateToIso9(subfield)) {
126
+ return {
127
+ code: subfield.code,
128
+ value: subfield.code
129
+ }; // just clone
130
+ }
131
+ const value = iso9.convertToLatin(subfield.value);
116
132
  return {
117
133
  code: subfield.code,
118
134
  value
@@ -126,17 +142,11 @@ function _default(config = {}) {
126
142
  };
127
143
  }
128
144
  function mapFieldToIso9(field, occurrenceNumber) {
129
- const subfield6 = {
130
- code: '6',
131
- value: `880-${occurrenceNumber}`
132
- };
133
- const subfield9 = {
134
- code: '9',
135
- value: 'ISO9 <TRANS>'
136
- };
137
- const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));
145
+ // This is the original non-880 field, that will be converted from Cyrillic to ISO
146
+
147
+ // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either
138
148
  if (!config.doISO9Transliteration && !config.doSFS4900Transliteration) {
139
- // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either
149
+ const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));
140
150
  return {
141
151
  tag: field.tag,
142
152
  ind1: field.ind1,
@@ -144,52 +154,108 @@ function _default(config = {}) {
144
154
  subfields
145
155
  };
146
156
  }
157
+ const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);
158
+ const subfield9 = (0, _utils.fieldHasSubfield)(field, '9', iso9Trans) ? [] : [{
159
+ code: '9',
160
+ value: iso9Trans
161
+ }];
162
+ const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToIso9(sf));
147
163
  return {
148
164
  tag: field.tag,
149
165
  ind1: field.ind1,
150
166
  ind2: field.ind2,
151
- subfields: [subfield6, ...subfields, subfield9]
167
+ subfields: [subfield6, ...subfields, ...subfield9]
152
168
  };
153
169
  }
154
- function mapFieldToCyrillicField880(field, occurrenceNumber) {
155
- const subfields = [{
170
+ function deriveSubfield6(tag, subfields, occurrenceNumber) {
171
+ const initialSubfield = {
156
172
  code: '6',
157
- value: `${field.tag}-${occurrenceNumber}`
158
- }, ...field.subfields.map(sf => (0, _clone.default)(sf)), {
173
+ value: `${tag}-${occurrenceNumber}`
174
+ };
175
+ if (tag === '880') {
176
+ // If *tag in subfield $6* is 880, field is not 880 :D
177
+ return initialSubfield;
178
+ }
179
+ // Try to use existing subfield
180
+ const [subfield6] = subfields.filter(sf => sf.code === '6').map(sf => (0, _clone.default)(sf));
181
+ if (subfield6) {
182
+ (0, _subfield6Utils.resetSubfield6Tag)(subfield6, tag); // Should we update occurrence number?
183
+ return subfield6;
184
+ }
185
+ return initialSubfield;
186
+ }
187
+ function mapFieldToCyrillicField880(field, occurrenceNumber) {
188
+ (0, _utils.nvdebug)(`Derive CYR 880 from ${(0, _utils.fieldToString)(field)}`);
189
+ const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);
190
+ const newSubfield9 = (0, _utils.fieldHasSubfield)(field, '9', cyrillicTrans) ? [] : [{
159
191
  code: '9',
160
- value: 'CYRILLIC <TRANS>'
192
+ value: cyrillicTrans
161
193
  }];
162
- return {
194
+ const subfields = [newSubfield6, ...field.subfields.filter(sf => sf.code !== '6').map(sf => (0, _clone.default)(sf)), ...newSubfield9];
195
+ const newField = {
163
196
  tag: '880',
164
197
  ind1: field.ind1,
165
198
  ind2: field.ind2,
166
199
  subfields
167
200
  };
201
+ (0, _utils.nvdebug)(` CYR 880 ${(0, _utils.fieldToString)(newField)}`);
202
+ return newField;
168
203
  }
169
204
  function mapFieldToSfs4900Field880(field, occurrenceNumber) {
170
- const subfields = [{
171
- code: '6',
172
- value: `${field.tag}-${occurrenceNumber}`
173
- }, ...field.subfields.map(sf => mapSubfieldToSfs4900(sf)), {
205
+ (0, _utils.nvdebug)(`Derive SFS 880 from ${(0, _utils.fieldToString)(field)}`);
206
+ const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);
207
+ const newSubfield9 = (0, _utils.fieldHasSubfield)(field, '9', sfs4900Trans) ? [] : [{
174
208
  code: '9',
175
- value: 'SFS4900 <TRANS>'
209
+ value: sfs4900Trans
176
210
  }];
177
- return {
211
+ const subfields = [newSubfield6, ...field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf)), ...newSubfield9];
212
+ const newField = {
178
213
  tag: '880',
179
214
  ind1: field.ind1,
180
215
  ind2: field.ind2,
181
216
  subfields
182
217
  };
218
+ (0, _utils.nvdebug)(` SFS 880 ${(0, _utils.fieldToString)(newField)}`);
219
+ return newField;
220
+ }
221
+ function getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber = 0) {
222
+ const occurrenceNumber = (0, _subfield6Utils.fieldGetMaxSubfield6OccurrenceNumberAsInteger)(originalField);
223
+ // Return existing occurrence number:
224
+ if (occurrenceNumber > 0) {
225
+ return occurrenceNumber;
226
+ }
227
+ if (maxCreatedOccurrenceNumber) {
228
+ return maxCreatedOccurrenceNumber + 1;
229
+ }
230
+ return (0, _subfield6Utils.recordGetMaxSubfield6OccurrenceNumberAsInteger)(record) + 1;
231
+ }
232
+ function needsIso9Transliteration(existingPairedFields) {
233
+ if (!config.doISO9Transliteration) {
234
+ return false;
235
+ }
236
+ // Actually normal field is always converted to ISO-9, and this function checks where we move original cyrillic field to 880.
237
+ // Thus we look for field 880$9 "CYRILLIC <TRANS>" here, and not "ISO9 <TRANS>"!
238
+ return !existingPairedFields.some(f => (0, _utils.fieldHasSubfield)(f, '9', cyrillicTrans));
239
+ }
240
+ function needsSfs4900Transliteration(existingPairedFields) {
241
+ if (!config.doSFS4900Transliteration) {
242
+ return false;
243
+ }
244
+ return !existingPairedFields.some(f => (0, _utils.fieldHasSubfield)(f, '9', sfs4900Trans));
183
245
  }
184
246
  function processField(originalField, record, maxCreatedOccurrenceNumber = 0) {
185
- if (!fieldShouldTransliterateToIso9(originalField)) {
247
+ if (!fieldCanBeTransliterated(originalField)) {
186
248
  return [originalField];
187
249
  }
188
- const newOccurrenceNumberAsInt = maxCreatedOccurrenceNumber ? maxCreatedOccurrenceNumber + 1 : (0, _subfield6Utils.recordGetMaxSubfield6OccurrenceNumberAsInteger)(record) + 1;
250
+ (0, _utils.nvdebug)(`PROCESSING: ${(0, _utils.fieldToString)(originalField)}`);
251
+ const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);
189
252
  const newOccurrenceNumberAsString = (0, _subfield6Utils.intToOccurrenceNumberString)(newOccurrenceNumberAsInt);
253
+ (0, _utils.nvdebug)(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);
254
+ const existingPairedFields = (0, _subfield6Utils.fieldGetOccurrenceNumberPairs)(originalField, record.get('880'));
255
+ (0, _utils.nvdebug)(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`);
190
256
  const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9
191
- const newCyrillicField = config.doISO9Transliteration ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC
192
- const newSFS4900Field = config.doSFS4900Transliteration ? mapFieldToSfs4900Field880(originalField, newOccurrenceNumberAsString) : undefined; /// SFS-4900
257
+ const newCyrillicField = needsIso9Transliteration(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC
258
+ const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900Field880(originalField, newOccurrenceNumberAsString) : undefined; /// SFS-4900
193
259
 
194
260
  return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);
195
261
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cyrillux.js","names":["_clone","_interopRequireDefault","require","_utils","iso9","_interopRequireWildcard","_subfield6Utils","_xregexp","sfs4900","_sortFields","_reindexSubfield6OccurenceNumbers","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_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","fieldShouldTransliterateToIso9","includes","tag","mapSubfieldToIso9","convertToLatin","mapSubfieldToSfs4900","mapFieldToIso9","occurrenceNumber","subfield6","subfield9","map","ind1","ind2","mapFieldToCyrillicField880","mapFieldToSfs4900Field880","originalField","maxCreatedOccurrenceNumber","newOccurrenceNumberAsInt","newOccurrenceNumberAsString","intToOccurrenceNumberString","newMainField","newCyrillicField","undefined","newSFS4900Field","filter","f"],"sources":["../src/cyrillux.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString, fieldsToString, isControlSubfieldCode} from './utils';\nimport * as iso9 from 'iso9_1995';\nimport {intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger} from './subfield6Utils';\n\nimport XRegExp from 'xregexp';\nimport * as sfs4900 from 'sfs4900';\nimport {default as sortFields} from './sortFields';\nimport {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers';\n\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 fieldShouldTransliterateToIso9(field) {\n // Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well)\n if (['336', '337', '338', '880'].includes(field.tag)) {\n return false;\n }\n // Skip control fields and fields that already have a translitteration\n if (!field.subfields || field.subfields.some(sf => sf.code === '6')) {\n return false;\n }\n return fieldContainsCyrillicCharacters(field);\n }\n\n function mapSubfieldToIso9(subfield) {\n const value = subfieldShouldTransliterateToIso9(subfield) ? iso9.convertToLatin(subfield.value) : subfield.value;\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 const subfield6 = {code: '6', value: `880-${occurrenceNumber}`};\n const subfield9 = {code: '9', value: 'ISO9 <TRANS>'};\n\n const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));\n\n if (!config.doISO9Transliteration && !config.doSFS4900Transliteration) {\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 return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, subfield9]};\n }\n\n function mapFieldToCyrillicField880(field, occurrenceNumber) {\n const subfields = [\n {code: '6', value: `${field.tag}-${occurrenceNumber}`},\n ...field.subfields.map(sf => clone(sf)),\n {code: '9', value: 'CYRILLIC <TRANS>'}\n ];\n\n return {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n function mapFieldToSfs4900Field880(field, occurrenceNumber) {\n\n const subfields = [\n {code: '6', value: `${field.tag}-${occurrenceNumber}`},\n ...field.subfields.map(sf => mapSubfieldToSfs4900(sf)),\n {code: '9', value: 'SFS4900 <TRANS>'}\n ];\n\n return {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n function processField(originalField, record, maxCreatedOccurrenceNumber = 0) {\n if (!fieldShouldTransliterateToIso9(originalField)) {\n return [originalField];\n }\n const newOccurrenceNumberAsInt = maxCreatedOccurrenceNumber ? maxCreatedOccurrenceNumber + 1 : recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n const newOccurrenceNumberAsString = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n\n const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9\n const newCyrillicField = config.doISO9Transliteration ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = config.doSFS4900Transliteration ? 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","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","iso9Trans","cyrillicTrans","sfs4900Trans","_default","config","description","validate","fix","preprocessConfig","doISO9Transliteration","doSFS4900Transliteration","record","res","message","valid","nBefore","fields","length","processFields","reindexSubfield6OccurenceNumbers","sortFields","input","output","currField","remainingInput","fakeRecord","createdMax","recordGetMaxSubfield6OccurrenceNumberAsInteger","result","processField","forEach","field","validateField","orig","fieldToString","normalizedFields","clone","mod","fieldsToString","replace","push","isCyrillicCharacter","char","XRegExp","test","containsCyrillicCharacters","str","split","some","fieldContainsCyrillicCharacters","subfields","sf","subfieldShouldTransliterateToIso9","subfield","isControlSubfieldCode","code","value","fieldCanBeTransliterated","includes","tag","mapSubfieldToIso9","convertToLatin","mapSubfieldToSfs4900","mapFieldToIso9","occurrenceNumber","map","ind1","ind2","subfield6","deriveSubfield6","subfield9","fieldHasSubfield","filter","initialSubfield","resetSubfield6Tag","mapFieldToCyrillicField880","nvdebug","newSubfield6","newSubfield9","newField","mapFieldToSfs4900Field880","getNewOccurrenceNumber","originalField","maxCreatedOccurrenceNumber","fieldGetMaxSubfield6OccurrenceNumberAsInteger","needsIso9Transliteration","existingPairedFields","f","needsSfs4900Transliteration","newOccurrenceNumberAsInt","newOccurrenceNumberAsString","intToOccurrenceNumberString","fieldGetOccurrenceNumberPairs","newMainField","newCyrillicField","undefined","newSFS4900Field"],"sources":["../src/cyrillux.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldHasSubfield, fieldToString, fieldsToString, isControlSubfieldCode, nvdebug} from './utils';\nimport * as iso9 from 'iso9_1995';\nimport {fieldGetMaxSubfield6OccurrenceNumberAsInteger, fieldGetOccurrenceNumberPairs, intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag} from './subfield6Utils';\n\nimport XRegExp from 'xregexp';\nimport * as sfs4900 from 'sfs4900';\nimport {default as sortFields} from './sortFields';\nimport {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers';\n\nconst iso9Trans = 'ISO9 <TRANS>';\nconst cyrillicTrans = 'CYRILLIC <TRANS>';\nconst sfs4900Trans = 'SFS4900 <TRANS>';\n\nexport default function (config = {}) {\n\n return {\n description: 'Cyrillux functionality: convert original field to latinitsa (ISO-9) and add 880s for original cyrillic and latinitsa (SFS-4900)',\n validate, fix\n };\n\n function preprocessConfig() {\n config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration; // eslint-disable-line functional/immutable-data\n config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration; // eslint-disable-line functional/immutable-data\n }\n\n function fix(record) {\n // Fix always succeeds\n const res = {message: [], fix: [], valid: true};\n\n preprocessConfig(config);\n\n const nBefore = record.fields.length;\n\n record.fields = processFields(record.fields); // eslint-disable-line functional/immutable-data\n\n if (nBefore < record.fields.length) { // eslint-disable-line functional/no-conditional-statements\n reindexSubfield6OccurenceNumbers().fix(record);\n sortFields().fix(record);\n }\n\n function processFields(input, output = []) {\n const [currField, ...remainingInput] = input;\n if (!currField) {\n return output;\n }\n\n const fakeRecord = {fields: output};\n const createdMax = recordGetMaxSubfield6OccurrenceNumberAsInteger(fakeRecord);\n const result = processField(currField, record, createdMax);\n\n return processFields(remainingInput, [...output, ...result]);\n }\n\n return res;\n }\n\n function validate(record) {\n const res = {message: [], valid: true};\n\n preprocessConfig(config);\n\n record.fields?.forEach(field => {\n validateField(field, res, record);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res, record) {\n const orig = fieldToString(field);\n\n const normalizedFields = processField(clone(field), record);\n const mod = fieldsToString(normalizedFields).replace(/\\t__SEPARATOR__\\t/ug, ', ').replace(/ (‡6 [0-9][0-9][0-9])-[0-9][0-9]+/gu, ' $1-NN'); // eslint-disable-line prefer-named-capture-group\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`CHANGE: ${orig} => ${mod}`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n\n function isCyrillicCharacter(char) {\n return XRegExp('[\\\\p{Cyrillic}]').test(char); // eslint-disable-line new-cap\n }\n\n function containsCyrillicCharacters(str) { // from melinda-ui-cyrillux\n if (!str) {\n return false;\n }\n return str.split('').some(isCyrillicCharacter);\n }\n\n function fieldContainsCyrillicCharacters(field) { // based on melinda-ui-cyrillux\n return field.subfields && field.subfields.some(sf => subfieldShouldTransliterateToIso9(sf));\n }\n\n function subfieldShouldTransliterateToIso9(subfield) {\n if (isControlSubfieldCode(subfield.code)) {\n return false;\n }\n return containsCyrillicCharacters(subfield.value);\n }\n\n function fieldCanBeTransliterated(field) {\n // Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well).\n // Discussion: We should probably also skip others like 05X-08X, 648, 650, 651, and 655, but this needs thinking...\n // Also I'd like to co CYRILLIC->ISO-9 for field 300 (and others?) without 880 mappings...\n if (['336', '337', '338', '880'].includes(field.tag)) {\n return false;\n }\n // Skip control fields:\n if (!field.subfields) {\n return false;\n }\n // MELINDA-10330: $6 should not prevent translittaration per se, so this restriction is no longer applied!\n\n if (field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>'))) {\n return false;\n }\n\n return fieldContainsCyrillicCharacters(field); // We have something to translitterate:\n }\n\n\n function mapSubfieldToIso9(subfield) {\n if (!subfieldShouldTransliterateToIso9(subfield)) {\n return {code: subfield.code, value: subfield.code}; // just clone\n }\n const value = iso9.convertToLatin(subfield.value);\n\n return {code: subfield.code, value};\n }\n\n function mapSubfieldToSfs4900(subfield) {\n const value = subfieldShouldTransliterateToIso9(subfield) ? sfs4900.convertToLatin(subfield.value).result : subfield.value;\n return {code: subfield.code, value};\n }\n\n\n function mapFieldToIso9(field, occurrenceNumber) {\n // This is the original non-880 field, that will be converted from Cyrillic to ISO\n\n // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either\n if (!config.doISO9Transliteration && !config.doSFS4900Transliteration) {\n const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);\n const subfield9 = fieldHasSubfield(field, '9', iso9Trans) ? [] : [{code: '9', value: iso9Trans}];\n\n const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToIso9(sf));\n\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, ...subfield9]};\n }\n\n function deriveSubfield6(tag, subfields, occurrenceNumber) {\n const initialSubfield = {code: '6', value: `${tag}-${occurrenceNumber}`};\n if (tag === '880') { // If *tag in subfield $6* is 880, field is not 880 :D\n return initialSubfield;\n }\n // Try to use existing subfield\n const [subfield6] = subfields.filter(sf => sf.code === '6').map(sf => clone(sf));\n if (subfield6) {\n resetSubfield6Tag(subfield6, tag); // Should we update occurrence number?\n return subfield6;\n }\n\n return initialSubfield;\n }\n\n function mapFieldToCyrillicField880(field, occurrenceNumber) {\n nvdebug(`Derive CYR 880 from ${fieldToString(field)}`);\n const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);\n const newSubfield9 = fieldHasSubfield(field, '9', cyrillicTrans) ? [] : [{code: '9', value: cyrillicTrans}];\n const subfields = [\n newSubfield6,\n ...field.subfields.filter(sf => sf.code !== '6').map(sf => clone(sf)),\n ...newSubfield9\n ];\n\n const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};\n nvdebug(` CYR 880 ${fieldToString(newField)}`);\n return newField;\n }\n\n function mapFieldToSfs4900Field880(field, occurrenceNumber) {\n nvdebug(`Derive SFS 880 from ${fieldToString(field)}`);\n const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);\n const newSubfield9 = fieldHasSubfield(field, '9', sfs4900Trans) ? [] : [{code: '9', value: sfs4900Trans}];\n const subfields = [\n newSubfield6,\n ...field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf)),\n ...newSubfield9\n ];\n\n const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};\n nvdebug(` SFS 880 ${fieldToString(newField)}`);\n return newField;\n }\n\n function getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber = 0) {\n const occurrenceNumber = fieldGetMaxSubfield6OccurrenceNumberAsInteger(originalField);\n // Return existing occurrence number:\n if (occurrenceNumber > 0) {\n return occurrenceNumber;\n }\n if (maxCreatedOccurrenceNumber) {\n return maxCreatedOccurrenceNumber + 1;\n }\n return recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n }\n\n function needsIso9Transliteration(existingPairedFields) {\n if (!config.doISO9Transliteration) {\n return false;\n }\n // Actually normal field is always converted to ISO-9, and this function checks where we move original cyrillic field to 880.\n // Thus we look for field 880$9 \"CYRILLIC <TRANS>\" here, and not \"ISO9 <TRANS>\"!\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', cyrillicTrans));\n }\n\n function needsSfs4900Transliteration(existingPairedFields) {\n if (!config.doSFS4900Transliteration) {\n return false;\n }\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', sfs4900Trans));\n }\n\n function processField(originalField, record, maxCreatedOccurrenceNumber = 0) {\n if (!fieldCanBeTransliterated(originalField)) {\n return [originalField];\n }\n\n nvdebug(`PROCESSING: ${fieldToString(originalField)}`);\n\n const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);\n const newOccurrenceNumberAsString = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n\n nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);\n\n const existingPairedFields = fieldGetOccurrenceNumberPairs(originalField, record.get('880'));\n\n nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`);\n\n const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9\n const newCyrillicField = needsIso9Transliteration(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900Field880(originalField, newOccurrenceNumberAsString) : undefined; /// SFS-4900\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n}\n"],"mappings":"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","ignoreList":[]}
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.3",
17
+ "version": "11.3.4-alpha",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"
@@ -40,12 +40,12 @@
40
40
  "@babel/register": "^7.24.6",
41
41
  "@natlibfi/issn-verify": "^1.0.4",
42
42
  "@natlibfi/marc-record": "^9.0.1",
43
- "@natlibfi/marc-record-validate": "^8.0.8",
43
+ "@natlibfi/marc-record-validate": "^8.0.10",
44
44
  "cld3-asm": "^3.1.1",
45
45
  "clone": "^2.1.2",
46
- "debug": "^4.3.4",
46
+ "debug": "^4.3.7",
47
47
  "iso9_1995": "^0.0.2",
48
- "isbn3": "^1.1.52",
48
+ "isbn3": "^1.2.0",
49
49
  "langs": "^2.0.0",
50
50
  "node-fetch": "^2.7.0",
51
51
  "sfs4900": "^0.0.1",
@@ -53,24 +53,24 @@
53
53
  "xregexp": "^5.1.1"
54
54
  },
55
55
  "peerDependencies": {
56
- "@natlibfi/marc-record-validate": "^8.0.7"
56
+ "@natlibfi/marc-record-validate": "^8.0.10"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@babel/cli": "^7.25.6",
60
- "@babel/core": "^7.24.7",
60
+ "@babel/core": "^7.25.2",
61
61
  "@babel/preset-env": "^7.25.4",
62
62
  "@natlibfi/eslint-config-melinda-backend": "^3.0.5",
63
- "@natlibfi/fixugen": "^2.0.5",
64
- "@natlibfi/fixura": "^3.0.5",
63
+ "@natlibfi/fixugen": "^2.0.9",
64
+ "@natlibfi/fixura": "^3.0.8",
65
65
  "babel-plugin-istanbul": "^7.0.0",
66
66
  "babel-plugin-rewire": "^1.2.0",
67
67
  "chai": "^4.5.0",
68
68
  "chai-as-promised": "^7.1.2",
69
69
  "cross-env": "^7.0.3",
70
- "eslint": "^8.57.0",
71
- "fetch-mock": "^11.1.3",
72
- "mocha": "^10.4.0",
73
- "nyc": "^17.0.0"
70
+ "eslint": "^8.57.1",
71
+ "fetch-mock": "^11.1.4",
72
+ "mocha": "^10.7.3",
73
+ "nyc": "^17.1.0"
74
74
  },
75
75
  "eslintConfig": {
76
76
  "extends": [
package/src/cyrillux.js CHANGED
@@ -1,14 +1,18 @@
1
1
  //import createDebugLogger from 'debug';
2
2
  import clone from 'clone';
3
- import {fieldToString, fieldsToString, isControlSubfieldCode} from './utils';
3
+ import {fieldHasSubfield, fieldToString, fieldsToString, isControlSubfieldCode, nvdebug} from './utils';
4
4
  import * as iso9 from 'iso9_1995';
5
- import {intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger} from './subfield6Utils';
5
+ import {fieldGetMaxSubfield6OccurrenceNumberAsInteger, fieldGetOccurrenceNumberPairs, intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag} from './subfield6Utils';
6
6
 
7
7
  import XRegExp from 'xregexp';
8
8
  import * as sfs4900 from 'sfs4900';
9
9
  import {default as sortFields} from './sortFields';
10
10
  import {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers';
11
11
 
12
+ const iso9Trans = 'ISO9 <TRANS>';
13
+ const cyrillicTrans = 'CYRILLIC <TRANS>';
14
+ const sfs4900Trans = 'SFS4900 <TRANS>';
15
+
12
16
  export default function (config = {}) {
13
17
 
14
18
  return {
@@ -99,20 +103,33 @@ export default function (config = {}) {
99
103
  return containsCyrillicCharacters(subfield.value);
100
104
  }
101
105
 
102
- function fieldShouldTransliterateToIso9(field) {
103
- // Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well)
106
+ function fieldCanBeTransliterated(field) {
107
+ // Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well).
108
+ // Discussion: We should probably also skip others like 05X-08X, 648, 650, 651, and 655, but this needs thinking...
109
+ // Also I'd like to co CYRILLIC->ISO-9 for field 300 (and others?) without 880 mappings...
104
110
  if (['336', '337', '338', '880'].includes(field.tag)) {
105
111
  return false;
106
112
  }
107
- // Skip control fields and fields that already have a translitteration
108
- if (!field.subfields || field.subfields.some(sf => sf.code === '6')) {
113
+ // Skip control fields:
114
+ if (!field.subfields) {
109
115
  return false;
110
116
  }
111
- return fieldContainsCyrillicCharacters(field);
117
+ // MELINDA-10330: $6 should not prevent translittaration per se, so this restriction is no longer applied!
118
+
119
+ if (field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>'))) {
120
+ return false;
121
+ }
122
+
123
+ return fieldContainsCyrillicCharacters(field); // We have something to translitterate:
112
124
  }
113
125
 
126
+
114
127
  function mapSubfieldToIso9(subfield) {
115
- const value = subfieldShouldTransliterateToIso9(subfield) ? iso9.convertToLatin(subfield.value) : subfield.value;
128
+ if (!subfieldShouldTransliterateToIso9(subfield)) {
129
+ return {code: subfield.code, value: subfield.code}; // just clone
130
+ }
131
+ const value = iso9.convertToLatin(subfield.value);
132
+
116
133
  return {code: subfield.code, value};
117
134
  }
118
135
 
@@ -123,50 +140,114 @@ export default function (config = {}) {
123
140
 
124
141
 
125
142
  function mapFieldToIso9(field, occurrenceNumber) {
126
- const subfield6 = {code: '6', value: `880-${occurrenceNumber}`};
127
- const subfield9 = {code: '9', value: 'ISO9 <TRANS>'};
128
-
129
- const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));
143
+ // This is the original non-880 field, that will be converted from Cyrillic to ISO
130
144
 
145
+ // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either
131
146
  if (!config.doISO9Transliteration && !config.doSFS4900Transliteration) {
132
- // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either
147
+ const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));
133
148
  return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};
134
149
  }
135
150
 
136
- return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, subfield9]};
151
+ const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);
152
+ const subfield9 = fieldHasSubfield(field, '9', iso9Trans) ? [] : [{code: '9', value: iso9Trans}];
153
+
154
+ const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToIso9(sf));
155
+
156
+ return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, ...subfield9]};
157
+ }
158
+
159
+ function deriveSubfield6(tag, subfields, occurrenceNumber) {
160
+ const initialSubfield = {code: '6', value: `${tag}-${occurrenceNumber}`};
161
+ if (tag === '880') { // If *tag in subfield $6* is 880, field is not 880 :D
162
+ return initialSubfield;
163
+ }
164
+ // Try to use existing subfield
165
+ const [subfield6] = subfields.filter(sf => sf.code === '6').map(sf => clone(sf));
166
+ if (subfield6) {
167
+ resetSubfield6Tag(subfield6, tag); // Should we update occurrence number?
168
+ return subfield6;
169
+ }
170
+
171
+ return initialSubfield;
137
172
  }
138
173
 
139
174
  function mapFieldToCyrillicField880(field, occurrenceNumber) {
175
+ nvdebug(`Derive CYR 880 from ${fieldToString(field)}`);
176
+ const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);
177
+ const newSubfield9 = fieldHasSubfield(field, '9', cyrillicTrans) ? [] : [{code: '9', value: cyrillicTrans}];
140
178
  const subfields = [
141
- {code: '6', value: `${field.tag}-${occurrenceNumber}`},
142
- ...field.subfields.map(sf => clone(sf)),
143
- {code: '9', value: 'CYRILLIC <TRANS>'}
179
+ newSubfield6,
180
+ ...field.subfields.filter(sf => sf.code !== '6').map(sf => clone(sf)),
181
+ ...newSubfield9
144
182
  ];
145
183
 
146
- return {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};
184
+ const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};
185
+ nvdebug(` CYR 880 ${fieldToString(newField)}`);
186
+ return newField;
147
187
  }
148
188
 
149
189
  function mapFieldToSfs4900Field880(field, occurrenceNumber) {
150
-
190
+ nvdebug(`Derive SFS 880 from ${fieldToString(field)}`);
191
+ const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);
192
+ const newSubfield9 = fieldHasSubfield(field, '9', sfs4900Trans) ? [] : [{code: '9', value: sfs4900Trans}];
151
193
  const subfields = [
152
- {code: '6', value: `${field.tag}-${occurrenceNumber}`},
153
- ...field.subfields.map(sf => mapSubfieldToSfs4900(sf)),
154
- {code: '9', value: 'SFS4900 <TRANS>'}
194
+ newSubfield6,
195
+ ...field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf)),
196
+ ...newSubfield9
155
197
  ];
156
198
 
157
- return {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};
199
+ const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};
200
+ nvdebug(` SFS 880 ${fieldToString(newField)}`);
201
+ return newField;
202
+ }
203
+
204
+ function getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber = 0) {
205
+ const occurrenceNumber = fieldGetMaxSubfield6OccurrenceNumberAsInteger(originalField);
206
+ // Return existing occurrence number:
207
+ if (occurrenceNumber > 0) {
208
+ return occurrenceNumber;
209
+ }
210
+ if (maxCreatedOccurrenceNumber) {
211
+ return maxCreatedOccurrenceNumber + 1;
212
+ }
213
+ return recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;
214
+ }
215
+
216
+ function needsIso9Transliteration(existingPairedFields) {
217
+ if (!config.doISO9Transliteration) {
218
+ return false;
219
+ }
220
+ // Actually normal field is always converted to ISO-9, and this function checks where we move original cyrillic field to 880.
221
+ // Thus we look for field 880$9 "CYRILLIC <TRANS>" here, and not "ISO9 <TRANS>"!
222
+ return !existingPairedFields.some(f => fieldHasSubfield(f, '9', cyrillicTrans));
223
+ }
224
+
225
+ function needsSfs4900Transliteration(existingPairedFields) {
226
+ if (!config.doSFS4900Transliteration) {
227
+ return false;
228
+ }
229
+ return !existingPairedFields.some(f => fieldHasSubfield(f, '9', sfs4900Trans));
158
230
  }
159
231
 
160
232
  function processField(originalField, record, maxCreatedOccurrenceNumber = 0) {
161
- if (!fieldShouldTransliterateToIso9(originalField)) {
233
+ if (!fieldCanBeTransliterated(originalField)) {
162
234
  return [originalField];
163
235
  }
164
- const newOccurrenceNumberAsInt = maxCreatedOccurrenceNumber ? maxCreatedOccurrenceNumber + 1 : recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;
236
+
237
+ nvdebug(`PROCESSING: ${fieldToString(originalField)}`);
238
+
239
+ const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);
165
240
  const newOccurrenceNumberAsString = intToOccurrenceNumberString(newOccurrenceNumberAsInt);
166
241
 
242
+ nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);
243
+
244
+ const existingPairedFields = fieldGetOccurrenceNumberPairs(originalField, record.get('880'));
245
+
246
+ nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`);
247
+
167
248
  const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9
168
- const newCyrillicField = config.doISO9Transliteration ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC
169
- const newSFS4900Field = config.doSFS4900Transliteration ? mapFieldToSfs4900Field880(originalField, newOccurrenceNumberAsString) : undefined; /// SFS-4900
249
+ const newCyrillicField = needsIso9Transliteration(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC
250
+ const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900Field880(originalField, newOccurrenceNumberAsString) : undefined; /// SFS-4900
170
251
 
171
252
  return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);
172
253
  }
@@ -7,6 +7,16 @@
7
7
  { "code": "a", "value": "Modin, Ûrij Ivanovič." },
8
8
  { "code": "9", "value": "ISO9 <TRANS>"}
9
9
  ]},
10
+ { "tag": "300", "ind1": " ", "ind2": " ", "subfields": [
11
+ { "code": "6", "value": "880-02"},
12
+ { "code": "a", "value": "5 sm." },
13
+ { "code": "9", "value": "ISO9 <TRANS>"}
14
+ ]},
15
+ { "tag": "500", "ind1": " ", "ind2": " ", "subfields": [
16
+ { "code": "6", "value": "880-03"},
17
+ { "code": "a", "value": "5 sm." },
18
+ { "code": "9", "value": "ISO9 <TRANS>"}
19
+ ]},
10
20
  { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
11
21
  {"code": "6", "value": "100-01"},
12
22
  {"code": "a", "value": "Модин, Юрий Иванович."},
@@ -16,8 +26,27 @@
16
26
  {"code": "6", "value": "100-01"},
17
27
  {"code": "a", "value": "Modin, Juri Ivanovitš."},
18
28
  {"code": "9", "value": "SFS4900 <TRANS>"}
29
+ ]},
30
+ { "tag": "880", "ind1": " ", "ind2": " ", "subfields": [
31
+ { "code": "6", "value": "300-02" },
32
+ { "code": "a", "value": "5 см."},
33
+ { "code": "9", "value": "CYRILLIC <TRANS>"}
34
+ ]},
35
+ { "tag": "880", "ind1": " ", "ind2": " ", "subfields": [
36
+ { "code": "6", "value": "300-02" },
37
+ { "code": "a", "value": "5 sm." },
38
+ { "code": "9", "value": "SFS4900 <TRANS>" }
39
+ ]},
40
+ { "tag": "880", "ind1": " ", "ind2": " ", "subfields": [
41
+ { "code": "6", "value": "500-03" },
42
+ { "code": "a", "value": "5 см." },
43
+ { "code": "9", "value": "CYRILLIC <TRANS>" }
44
+ ]},
45
+ { "tag": "880", "ind1": " ", "ind2": " ", "subfields": [
46
+ { "code": "6", "value": "500-03" },
47
+ { "code": "a", "value": "5 sm." },
48
+ { "code": "9", "value": "SFS4900 <TRANS>" }
19
49
  ]}
20
-
21
50
  ]
22
51
  }
23
52
 
@@ -3,6 +3,12 @@
3
3
  "fields": [
4
4
  { "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
5
5
  { "code": "a", "value": "Модин, Юрий Иванович." }
6
+ ]},
7
+ { "tag": "300", "ind1": " ", "ind2": " ", "subfields": [
8
+ { "code": "a", "value": "5 см." }
9
+ ]},
10
+ { "tag": "500", "ind1": " ", "ind2": " ", "subfields": [
11
+ { "code": "a", "value": "5 см." }
6
12
  ]}
7
13
  ]
8
14
  }
@@ -7,6 +7,14 @@
7
7
  ]},
8
8
  { "tag": "245", "ind1": "1", "ind2": " ", "subfields": [
9
9
  { "code": "a", "value": "Sudʹby razvedčikov." }
10
+ ]},
11
+ {"tag": "500", "ind1": " ", "ind2": " ", "subfields": [
12
+ { "code": "6", "value": "880-01"},
13
+ { "code": "a", "value": "FOO."}
14
+ ]},
15
+ {"tag": "880", "ind1": " ", "ind2": " ", "subfields": [
16
+ { "code": "6", "value": "500-01"},
17
+ { "code": "a", "value": "BAR."}
10
18
  ]}
11
19
  ]
12
20
  }
@@ -6,6 +6,14 @@
6
6
  ]},
7
7
  {"tag": "245", "ind1": "1", "ind2": " ", "subfields": [
8
8
  { "code": "a", "value": "Судьбы разведчиков."}
9
+ ]},
10
+ {"tag": "500", "ind1": " ", "ind2": " ", "subfields": [
11
+ { "code": "6", "value": "880-01"},
12
+ { "code": "a", "value": "FOO."}
13
+ ]},
14
+ {"tag": "880", "ind1": " ", "ind2": " ", "subfields": [
15
+ { "code": "6", "value": "500-01"},
16
+ { "code": "a", "value": "BAR."}
9
17
  ]}
10
18
  ]
11
19
  }
@@ -0,0 +1,53 @@
1
+ {
2
+ "_validationOptions": {},
3
+ "leader": "12345cam 22123454i 4500",
4
+ "fields": [
5
+ { "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
6
+ { "code": "6", "value": "880-01"},
7
+ { "code": "a", "value": "Modin, Ûrij Ivanovič." },
8
+ { "code": "9", "value": "ISO9 <TRANS>"}
9
+ ]},
10
+ { "tag": "245", "ind1": "1", "ind2": " ", "subfields": [
11
+ { "code": "6", "value": "880-02"},
12
+ { "code": "a", "value": "Sudʹby razvedčikov." },
13
+ { "code": "9", "value": "ISO9 <TRANS>"}
14
+ ]},
15
+ { "tag": "650", "ind1": "4", "ind2": " ", "subfields": [
16
+ { "code": "6", "value": "880-03" },
17
+ { "code": "a", "value": "whatever." }
18
+ ]},
19
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
20
+ {"code": "6", "value": "100-01"},
21
+ {"code": "a", "value": "Модин, Юрий Иванович."},
22
+ {"code": "9", "value": "CYRILLIC <TRANS>"}
23
+ ]},
24
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
25
+ {"code": "6", "value": "100-01"},
26
+ {"code": "a", "value": "Modin, Juri Ivanovitš."},
27
+ {"code": "9", "value": "SFS4900 <TRANS>"}
28
+ ]},
29
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
30
+ { "code": "6", "value": "100-01" },
31
+ { "code": "a", "value": "whatever100." }
32
+ ]},
33
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
34
+ {"code": "6", "value": "245-02"},
35
+ {"code": "a", "value": "Судьбы разведчиков."},
36
+ {"code": "9", "value": "CYRILLIC <TRANS>"}
37
+ ]},
38
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
39
+ {"code": "6", "value": "245-02"},
40
+ {"code": "a", "value": "Sudby razvedtšikov."},
41
+ {"code": "9", "value": "SFS4900 <TRANS>"}
42
+ ]},
43
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
44
+ { "code": "6", "value": "245-02" },
45
+ { "code": "a", "value": "whatever245." }
46
+ ]},
47
+ { "tag": "880", "ind1": "4", "ind2": " ", "subfields": [
48
+ { "code": "6", "value": "650-03" },
49
+ { "code": "a", "value": "whatever650." }
50
+ ]}
51
+ ]
52
+ }
53
+
@@ -0,0 +1,10 @@
1
+ {
2
+ "description": "Fix: fields 100 and 245 require translitteration, even if they already have unnamed 880 pair",
3
+ "comment": "Tests incrementation of occurrence numbers and usage of config",
4
+ "only": false,
5
+ "fix": true,
6
+ "config": {
7
+ "doISO9Transliteration": true,
8
+ "doSFS4900Transliteration": true
9
+ }
10
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "leader": "12345cam 22123454i 4500",
3
+ "fields": [
4
+ { "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
5
+ { "code": "6", "value": "880-01" },
6
+ { "code": "a", "value": "Модин, Юрий Иванович." }
7
+ ]},
8
+ {"tag": "245", "ind1": "1", "ind2": " ", "subfields": [
9
+ { "code": "6", "value": "880-02" },
10
+ { "code": "a", "value": "Судьбы разведчиков."}
11
+ ]},
12
+ { "tag": "650", "ind1": "4", "ind2": " ", "subfields": [
13
+ { "code": "6", "value": "880-03" },
14
+ { "code": "a", "value": "whatever." }
15
+ ]},
16
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
17
+ { "code": "6", "value": "100-01" },
18
+ { "code": "a", "value": "whatever100." }
19
+ ]},
20
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
21
+ { "code": "6", "value": "245-02" },
22
+ { "code": "a", "value": "whatever245." }
23
+ ]},
24
+ { "tag": "880", "ind1": "4", "ind2": " ", "subfields": [
25
+ { "code": "6", "value": "650-03" },
26
+ { "code": "a", "value": "whatever650." }
27
+ ]}
28
+ ]
29
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "_validationOptions": {},
3
+ "leader": "12345cam 22123454i 4500",
4
+ "fields": [
5
+ { "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
6
+ { "code": "6", "value": "880-01"},
7
+ { "code": "a", "value": "Modin, Ûrij Ivanovič." },
8
+ { "code": "9", "value": "ISO9 <TRANS>"}
9
+ ]},
10
+ { "tag": "245", "ind1": "1", "ind2": " ", "subfields": [
11
+ { "code": "6", "value": "880-02"},
12
+ { "code": "a", "value": "Sudʹby razvedčikov." },
13
+ { "code": "9", "value": "ISO9 <TRANS>"}
14
+ ]},
15
+ { "tag": "650", "ind1": "4", "ind2": " ", "subfields": [
16
+ { "code": "6", "value": "880-03" },
17
+ { "code": "a", "value": "whatever." }
18
+ ]},
19
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
20
+ {"code": "6", "value": "100-01"},
21
+ {"code": "a", "value": "Модин, Юрий Иванович."},
22
+ {"code": "9", "value": "CYRILLIC <TRANS>"}
23
+ ]},
24
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
25
+ {"code": "6", "value": "100-01"},
26
+ {"code": "a", "value": "PIDÄ ALKUPERÄINEN ARVO 1."},
27
+ {"code": "9", "value": "SFS4900 <TRANS>"}
28
+ ]},
29
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
30
+ {"code": "6", "value": "245-02"},
31
+ {"code": "a", "value": "Sudby razvedtšikov."},
32
+ {"code": "9", "value": "SFS4900 <TRANS>"}
33
+ ]},
34
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
35
+ {"code": "6", "value": "245-02"},
36
+ {"code": "a", "value": "PIDÄ ALKUPERÄINEN ARVO 2."},
37
+ {"code": "9", "value": "CYRILLIC <TRANS>"}
38
+ ]}
39
+ ]
40
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "description": "Fix: fields 100 and 245: one translation is missing and the other one exists: add missing translation, keep existin (crappy translation) ",
3
+ "comment": "Tests also incrementation of occurrence number.",
4
+ "only": false,
5
+ "fix": true,
6
+ "config": {
7
+ "doISO9Transliteration": true,
8
+ "doSFS4900Transliteration": true
9
+ }
10
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "leader": "12345cam 22123454i 4500",
3
+ "fields": [
4
+ { "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
5
+ { "code": "6", "value": "880-04" },
6
+ { "code": "a", "value": "Модин, Юрий Иванович." }
7
+ ]},
8
+ {"tag": "245", "ind1": "1", "ind2": " ", "subfields": [
9
+ { "code": "6", "value": "880-03" },
10
+ { "code": "a", "value": "Судьбы разведчиков."}
11
+ ]},
12
+ { "tag": "650", "ind1": "4", "ind2": " ", "subfields": [
13
+ { "code": "6", "value": "880-02" },
14
+ { "code": "a", "value": "whatever." }
15
+ ]},
16
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
17
+ {"code": "6", "value": "100-04"},
18
+ {"code": "a", "value": "PIDÄ ALKUPERÄINEN ARVO 1."},
19
+ {"code": "9", "value": "SFS4900 <TRANS>"}
20
+ ]},
21
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
22
+ {"code": "6", "value": "245-03"},
23
+ {"code": "a", "value": "PIDÄ ALKUPERÄINEN ARVO 2."},
24
+ {"code": "9", "value": "CYRILLIC <TRANS>"}
25
+ ]}
26
+ ]
27
+ }