@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 +99 -33
- package/dist/cyrillux.js.map +1 -1
- package/package.json +12 -12
- package/src/cyrillux.js +108 -27
- package/test-fixtures/cyrillux/f01/expectedResult.json +30 -1
- package/test-fixtures/cyrillux/f01/record.json +6 -0
- package/test-fixtures/cyrillux/f03/expectedResult.json +8 -0
- package/test-fixtures/cyrillux/f03/record.json +8 -0
- package/test-fixtures/cyrillux/f06/expectedResult.json +53 -0
- package/test-fixtures/cyrillux/f06/metadata.json +10 -0
- package/test-fixtures/cyrillux/f06/record.json +29 -0
- package/test-fixtures/cyrillux/f07/expectedResult.json +40 -0
- package/test-fixtures/cyrillux/f07/metadata.json +10 -0
- package/test-fixtures/cyrillux/f07/record.json +27 -0
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
|
|
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
|
|
109
|
-
if (!field.subfields
|
|
113
|
+
// Skip control fields:
|
|
114
|
+
if (!field.subfields) {
|
|
110
115
|
return false;
|
|
111
116
|
}
|
|
112
|
-
|
|
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
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
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
|
|
155
|
-
const
|
|
170
|
+
function deriveSubfield6(tag, subfields, occurrenceNumber) {
|
|
171
|
+
const initialSubfield = {
|
|
156
172
|
code: '6',
|
|
157
|
-
value: `${
|
|
158
|
-
}
|
|
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:
|
|
192
|
+
value: cyrillicTrans
|
|
161
193
|
}];
|
|
162
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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:
|
|
209
|
+
value: sfs4900Trans
|
|
176
210
|
}];
|
|
177
|
-
|
|
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 (!
|
|
247
|
+
if (!fieldCanBeTransliterated(originalField)) {
|
|
186
248
|
return [originalField];
|
|
187
249
|
}
|
|
188
|
-
|
|
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 =
|
|
192
|
-
const newSFS4900Field =
|
|
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
|
}
|
package/dist/cyrillux.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cyrillux.js","names":["_clone","_interopRequireDefault","require","_utils","iso9","_interopRequireWildcard","_subfield6Utils","_xregexp","sfs4900","_sortFields","_reindexSubfield6OccurenceNumbers","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_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.
|
|
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.
|
|
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.
|
|
46
|
+
"debug": "^4.3.7",
|
|
47
47
|
"iso9_1995": "^0.0.2",
|
|
48
|
-
"isbn3": "^1.
|
|
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.
|
|
56
|
+
"@natlibfi/marc-record-validate": "^8.0.10"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@babel/cli": "^7.25.6",
|
|
60
|
-
"@babel/core": "^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.
|
|
64
|
-
"@natlibfi/fixura": "^3.0.
|
|
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.
|
|
71
|
-
"fetch-mock": "^11.1.
|
|
72
|
-
"mocha": "^10.
|
|
73
|
-
"nyc": "^17.
|
|
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
|
|
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
|
|
108
|
-
if (!field.subfields
|
|
113
|
+
// Skip control fields:
|
|
114
|
+
if (!field.subfields) {
|
|
109
115
|
return false;
|
|
110
116
|
}
|
|
111
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
142
|
-
...field.subfields.map(sf => clone(sf)),
|
|
143
|
-
|
|
179
|
+
newSubfield6,
|
|
180
|
+
...field.subfields.filter(sf => sf.code !== '6').map(sf => clone(sf)),
|
|
181
|
+
...newSubfield9
|
|
144
182
|
];
|
|
145
183
|
|
|
146
|
-
|
|
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
|
-
|
|
153
|
-
...field.subfields.map(sf => mapSubfieldToSfs4900(sf)),
|
|
154
|
-
|
|
194
|
+
newSubfield6,
|
|
195
|
+
...field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf)),
|
|
196
|
+
...newSubfield9
|
|
155
197
|
];
|
|
156
198
|
|
|
157
|
-
|
|
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 (!
|
|
233
|
+
if (!fieldCanBeTransliterated(originalField)) {
|
|
162
234
|
return [originalField];
|
|
163
235
|
}
|
|
164
|
-
|
|
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 =
|
|
169
|
-
const newSFS4900Field =
|
|
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
|
+
}
|