@natlibfi/marc-record-validators-melinda 11.4.4-alpha.1 → 11.4.5-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cyrillux.js +55 -43
- package/dist/cyrillux.js.map +1 -1
- package/dist/sortFields.js +27 -15
- package/dist/sortFields.js.map +1 -1
- package/dist/sortRelatorTerms.js +27 -18
- package/dist/sortRelatorTerms.js.map +1 -1
- package/package.json +3 -2
- package/src/cyrillux.js +51 -29
- package/src/sortFields.js +25 -13
- package/src/sortRelatorTerms.js +30 -24
- package/test-fixtures/cyrillux/f01b/expectedResult.json +55 -0
- package/test-fixtures/cyrillux/f01b/metadata.json +9 -0
- package/test-fixtures/cyrillux/f01b/record.json +15 -0
- package/test-fixtures/cyrillux/f03b/expectedResult.json +2 -2
- package/test-fixtures/merge-fields/f02/expectedResult.json +2 -3
- package/test-fixtures/merge-fields/f02/metadata.json +1 -1
- package/test-fixtures/mergeRelatorTermFields/fixer/01/expectedResult.json +2 -3
- package/test-fixtures/mergeRelatorTermFields/fixer/01/metadata.json +1 -0
- package/test-fixtures/mergeRelatorTermFields/fixer/01/record.json +3 -3
package/dist/cyrillux.js
CHANGED
|
@@ -34,6 +34,14 @@ function _default(config = {}) {
|
|
|
34
34
|
config.retainCyrillic = typeof config.retainCyrillic === 'undefined' ? true : config.retainCyrillic; // eslint-disable-line functional/immutable-data
|
|
35
35
|
config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration; // eslint-disable-line functional/immutable-data
|
|
36
36
|
config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration; // eslint-disable-line functional/immutable-data
|
|
37
|
+
config.preferSFS4900 = setPreference(); // eslint-disable-line functional/immutable-data
|
|
38
|
+
|
|
39
|
+
function setPreference() {
|
|
40
|
+
if (typeof config.preferSFS4900 === 'undefined') {
|
|
41
|
+
return !config.doISO9Transliteration && config.doSFS4900Transliteration;
|
|
42
|
+
}
|
|
43
|
+
return config.preferSFS4900;
|
|
44
|
+
}
|
|
37
45
|
}
|
|
38
46
|
function fix(record) {
|
|
39
47
|
// console.log(`FIX has CONFIG=${JSON.stringify(config)}`); // eslint-disable-line no-console
|
|
@@ -101,9 +109,9 @@ function _default(config = {}) {
|
|
|
101
109
|
}
|
|
102
110
|
function fieldContainsCyrillicCharacters(field) {
|
|
103
111
|
// based on melinda-ui-cyrillux
|
|
104
|
-
return field.subfields && field.subfields.some(sf =>
|
|
112
|
+
return field.subfields && field.subfields.some(sf => subfieldRequiresTransliteration(sf));
|
|
105
113
|
}
|
|
106
|
-
function
|
|
114
|
+
function subfieldRequiresTransliteration(subfield) {
|
|
107
115
|
if ((0, _utils.isControlSubfieldCode)(subfield.code)) {
|
|
108
116
|
return false;
|
|
109
117
|
}
|
|
@@ -137,7 +145,7 @@ function _default(config = {}) {
|
|
|
137
145
|
return fieldContainsCyrillicCharacters(field); // We have something to translitterate:
|
|
138
146
|
}
|
|
139
147
|
function mapSubfieldToIso9(subfield) {
|
|
140
|
-
if (!
|
|
148
|
+
if (!subfieldRequiresTransliteration(subfield)) {
|
|
141
149
|
return {
|
|
142
150
|
code: subfield.code,
|
|
143
151
|
value: subfield.value
|
|
@@ -151,18 +159,51 @@ function _default(config = {}) {
|
|
|
151
159
|
}
|
|
152
160
|
function mapSubfieldToSfs4900(subfield, lang = 'rus') {
|
|
153
161
|
const inputLang = lang === 'ukr' ? 'ukr' : 'rus'; // Support 'ukr' and 'rus', default to 'rus'
|
|
154
|
-
const value =
|
|
162
|
+
const value = subfieldRequiresTransliteration(subfield) ? sfs4900.convertToLatin(subfield.value, inputLang).result : subfield.value;
|
|
163
|
+
console.log(`VAL: ${subfield.value} => ${value} using ${lang}`); // eslint-disable-line no-console
|
|
155
164
|
return {
|
|
156
165
|
code: subfield.code,
|
|
157
166
|
value
|
|
158
167
|
};
|
|
159
168
|
}
|
|
169
|
+
function mapField(field, occurrenceNumber, iso9 = true, lang = 'rus') {
|
|
170
|
+
const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);
|
|
171
|
+
const transliterationText = iso9 ? iso9Trans : sfs4900Trans;
|
|
172
|
+
const subfield9 = (0, _utils.fieldHasSubfield)(field, '9', transliterationText) ? [] : [{
|
|
173
|
+
code: '9',
|
|
174
|
+
value: transliterationText
|
|
175
|
+
}]; // Add only if needed
|
|
176
|
+
const transliterationFunc = iso9 ? mapSubfieldToIso9 : mapSubfieldToSfs4900;
|
|
177
|
+
|
|
178
|
+
// NB! iso9 won't use lang
|
|
179
|
+
const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => transliterationFunc(sf, lang));
|
|
180
|
+
const newField = {
|
|
181
|
+
tag: field.tag,
|
|
182
|
+
ind1: field.ind1,
|
|
183
|
+
ind2: field.ind2,
|
|
184
|
+
subfields: [subfield6, ...subfields, ...subfield9]
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
// Transliteration goes to the original field:
|
|
188
|
+
if (!iso9 && config.preferSFS4900) {
|
|
189
|
+
return newField;
|
|
190
|
+
}
|
|
191
|
+
if (iso9 && !config.preferSFS4900) {
|
|
192
|
+
return newField;
|
|
193
|
+
}
|
|
194
|
+
// Translitetation goes to field 880:
|
|
195
|
+
|
|
196
|
+
//const subfield6 = newField.subfields.find(sf => sf.code === '6');
|
|
197
|
+
newField.tag = '880'; // eslint-disable-line functional/immutable-data
|
|
198
|
+
(0, _subfield6Utils.resetSubfield6Tag)(subfield6, field.tag);
|
|
199
|
+
return newField;
|
|
200
|
+
}
|
|
160
201
|
function mapFieldToIso9(field, occurrenceNumber) {
|
|
161
202
|
if (!config.doISO9Transliteration) {
|
|
162
203
|
return undefined;
|
|
163
204
|
}
|
|
164
205
|
// Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either
|
|
165
|
-
if (!config.retainCyrillic && !config.
|
|
206
|
+
if (!config.retainCyrillic && !config.preferSFS4900) {
|
|
166
207
|
const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));
|
|
167
208
|
return {
|
|
168
209
|
tag: field.tag,
|
|
@@ -171,24 +212,15 @@ function _default(config = {}) {
|
|
|
171
212
|
subfields
|
|
172
213
|
};
|
|
173
214
|
}
|
|
174
|
-
|
|
175
|
-
const subfield9 = (0, _utils.fieldHasSubfield)(field, '9', iso9Trans) ? [] : [{
|
|
176
|
-
code: '9',
|
|
177
|
-
value: iso9Trans
|
|
178
|
-
}]; // Add only if needed
|
|
179
|
-
|
|
180
|
-
const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToIso9(sf));
|
|
181
|
-
return {
|
|
182
|
-
tag: field.tag,
|
|
183
|
-
ind1: field.ind1,
|
|
184
|
-
ind2: field.ind2,
|
|
185
|
-
subfields: [subfield6, ...subfields, ...subfield9]
|
|
186
|
-
};
|
|
215
|
+
return mapField(field, occurrenceNumber, true, 'rus');
|
|
187
216
|
}
|
|
188
217
|
function mapFieldToSfs4900(field, occurrenceNumber, lang = 'rus') {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
218
|
+
if (!config.doSFS4900Transliteration) {
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
// Just converts the field to SFS-4900 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either
|
|
222
|
+
if (!config.retainCyrillic && config.preferSFS4900) {
|
|
223
|
+
const subfields = field.subfields.map(sf => mapSubfieldToSfs4900(sf, lang));
|
|
192
224
|
return {
|
|
193
225
|
tag: field.tag,
|
|
194
226
|
ind1: field.ind1,
|
|
@@ -196,27 +228,7 @@ function _default(config = {}) {
|
|
|
196
228
|
subfields
|
|
197
229
|
};
|
|
198
230
|
}
|
|
199
|
-
|
|
200
|
-
const subfield9 = (0, _utils.fieldHasSubfield)(field, '9', sfs4900Trans) ? [] : [{
|
|
201
|
-
code: '9',
|
|
202
|
-
value: sfs4900Trans
|
|
203
|
-
}]; // Add only if needed
|
|
204
|
-
|
|
205
|
-
const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf, lang));
|
|
206
|
-
const newField = {
|
|
207
|
-
tag: field.tag,
|
|
208
|
-
ind1: field.ind1,
|
|
209
|
-
ind2: field.ind2,
|
|
210
|
-
subfields: [subfield6, ...subfields, ...subfield9]
|
|
211
|
-
};
|
|
212
|
-
if (!config.doISO9Transliteration) {
|
|
213
|
-
return newField;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
//const subfield6 = newField.subfields.find(sf => sf.code === '6');
|
|
217
|
-
newField.tag = '880'; // eslint-disable-line functional/immutable-data
|
|
218
|
-
(0, _subfield6Utils.resetSubfield6Tag)(subfield6, field.tag);
|
|
219
|
-
return newField;
|
|
231
|
+
return mapField(field, occurrenceNumber, false, lang);
|
|
220
232
|
}
|
|
221
233
|
function deriveSubfield6(tag, subfields, occurrenceNumber) {
|
|
222
234
|
const initialSubfield = {
|
|
@@ -282,7 +294,7 @@ function _default(config = {}) {
|
|
|
282
294
|
}
|
|
283
295
|
function sfs4900PairCanBeTransliterated(field, record) {
|
|
284
296
|
// MELINDA-10330: we already have public library data: (unmarked) SFS-4900 in FIELD and (unmarked) Cyrillic in 880
|
|
285
|
-
if (!field.subfields || !tagCanBeTransliterated(field.tag) || !config.doISO9Transliteration) {
|
|
297
|
+
if (!field.subfields || !tagCanBeTransliterated(field.tag) || !config.doISO9Transliteration || !config.retainCyrillic || !config.doSFS4900Transliteration) {
|
|
286
298
|
return false;
|
|
287
299
|
}
|
|
288
300
|
|
package/dist/cyrillux.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cyrillux.js","names":["_clone","_interopRequireDefault","require","_utils","iso9","_interopRequireWildcard","_subfield6Utils","_xregexp","sfs4900","_sortFields","_reindexSubfield6OccurenceNumbers","_punctuation","_addMissingField","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","iso9Trans","cyrillicTrans","sfs4900Trans","_default","config","description","validate","fix","preprocessConfig","retainCyrillic","doISO9Transliteration","doSFS4900Transliteration","record","res","message","valid","nBefore","fields","length","processFields","reindexSubfield6OccurenceNumbers","sortFields","input","output","currField","remainingInput","fakeRecord","createdMax","recordGetMaxSubfield6OccurrenceNumberAsInteger","result","processField","forEach","field","validateField","orig","fieldToString","normalizedFields","clone","mod","fieldsToString","replace","push","isCyrillicCharacter","char","XRegExp","test","containsCyrillicCharacters","str","split","some","fieldContainsCyrillicCharacters","subfields","sf","subfieldShouldTransliterateToIso9","subfield","isControlSubfieldCode","code","value","tagCanBeTransliterated","tag","includes","fieldCanBeTransliterated","mapSubfieldToIso9","convertToLatin","mapSubfieldToSfs4900","lang","inputLang","mapFieldToIso9","occurrenceNumber","undefined","map","ind1","ind2","subfield6","deriveSubfield6","subfield9","fieldHasSubfield","filter","mapFieldToSfs4900","newField","resetSubfield6Tag","initialSubfield","mapFieldToCyrillicField880","nvdebug","newSubfield6","newSubfield9","getNewOccurrenceNumber","originalField","maxCreatedOccurrenceNumber","fieldGetMaxSubfield6OccurrenceNumberAsInteger","existingPairedFields","f","needsSfs4900Transliteration","sfs4900PairCanBeTransliterated","fieldGetOccurrenceNumberPairs","pairedField","occurrenceNumberAsString","fieldGetUnambiguousOccurrenceNumber","languageCode","getLanguageCode","field2","createFieldForSfs4900Comparison","field1","clonedField","fieldStripPunctuation","transliterateSfs4900Pair","tmpField","newMainField","newCyrillicField","newSFS4900Field","cyrilluxSkip","newOccurrenceNumberAsInt","newOccurrenceNumberAsString","intToOccurrenceNumberString"],"sources":["../src/cyrillux.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldHasSubfield, fieldToString, fieldsToString, isControlSubfieldCode, nvdebug} from './utils';\nimport * as iso9 from 'iso9_1995';\nimport {fieldGetMaxSubfield6OccurrenceNumberAsInteger, fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag} from './subfield6Utils';\n\nimport XRegExp from 'xregexp';\nimport * as sfs4900 from '@natlibfi/sfs-4900';\nimport {default as sortFields} from './sortFields';\nimport {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers';\nimport {fieldStripPunctuation} from './punctuation2';\nimport {getLanguageCode} from './addMissingField041';\n\nconst iso9Trans = 'ISO9 <TRANS>';\nconst cyrillicTrans = 'CYRILLIC <TRANS>';\nconst sfs4900Trans = 'SFS4900 <TRANS>';\n\nexport default function (config = {}) {\n // console.log(`CONFIG=${JSON.stringify(config)}`); // eslint-disable-line no-console\n\n return {\n description: 'Cyrillux functionality: convert original field to latinitsa (ISO-9) and add 880s for original cyrillic and latinitsa (SFS-4900)',\n validate, fix\n };\n\n function preprocessConfig() {\n config.retainCyrillic = typeof config.retainCyrillic === 'undefined' ? true : config.retainCyrillic; // eslint-disable-line functional/immutable-data\n config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration; // eslint-disable-line functional/immutable-data\n config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration; // eslint-disable-line functional/immutable-data\n }\n\n function fix(record) {\n // console.log(`FIX has CONFIG=${JSON.stringify(config)}`); // eslint-disable-line no-console\n // Fix always succeeds\n const res = {message: [], fix: [], valid: true};\n\n preprocessConfig();\n\n const nBefore = record.fields.length;\n\n record.fields = processFields(record.fields); // eslint-disable-line functional/immutable-data\n\n if (nBefore < record.fields.length) { // eslint-disable-line functional/no-conditional-statements\n reindexSubfield6OccurenceNumbers().fix(record);\n sortFields().fix(record);\n }\n\n function processFields(input, output = []) {\n const [currField, ...remainingInput] = input;\n if (!currField) {\n return output;\n }\n\n const fakeRecord = {fields: output};\n const createdMax = recordGetMaxSubfield6OccurrenceNumberAsInteger(fakeRecord);\n const result = processField(currField, record, createdMax);\n\n return processFields(remainingInput, [...output, ...result]);\n }\n\n return res;\n }\n\n function validate(record) {\n const res = {message: [], valid: true};\n\n preprocessConfig();\n\n record.fields?.forEach(field => {\n validateField(field, res, record);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res, record) {\n const orig = fieldToString(field);\n\n const normalizedFields = processField(clone(field), record);\n const mod = fieldsToString(normalizedFields).replace(/\\t__SEPARATOR__\\t/ug, ', ').replace(/ (‡6 [0-9][0-9][0-9])-[0-9][0-9]+/gu, ' $1-NN'); // eslint-disable-line prefer-named-capture-group\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`CHANGE: ${orig} => ${mod}`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n\n function isCyrillicCharacter(char) {\n return XRegExp('[\\\\p{Cyrillic}]').test(char); // eslint-disable-line new-cap\n }\n\n function containsCyrillicCharacters(str) { // from melinda-ui-cyrillux\n if (!str) {\n return false;\n }\n return str.split('').some(isCyrillicCharacter);\n }\n\n function fieldContainsCyrillicCharacters(field) { // based on melinda-ui-cyrillux\n return field.subfields && field.subfields.some(sf => subfieldShouldTransliterateToIso9(sf));\n }\n\n function subfieldShouldTransliterateToIso9(subfield) {\n if (isControlSubfieldCode(subfield.code)) {\n return false;\n }\n return containsCyrillicCharacters(subfield.value);\n }\n\n function tagCanBeTransliterated(tag) {\n return !['336', '337', '338', '880'].includes(tag);\n }\n\n function fieldCanBeTransliterated(field) {\n // Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well).\n // Discussion: We should probably also skip others like 05X-08X, 648, 650, 651, and 655, but this needs thinking...\n // Also I'd like to convert do CYRILLIC->ISO-9 in field 300 (and others?) without 880 mappings... (<- not implemented)\n\n // nvdebug(`fieldCanBeTransliterated('${fieldToString(field)}') in...`);\n if (!tagCanBeTransliterated(field.tag)) {\n return false;\n }\n\n if (!config.doISO9Transliteration && !config.doSFS4900Transliteration) {\n return false;\n }\n\n // Skip control fields:\n if (!field.subfields) {\n return false;\n }\n // When doing MELINDA-10330-ish, we noticed that $6 should not prevent translittaration per se, so this restriction is no longer applied!\n\n if (field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>'))) {\n return false;\n }\n\n return fieldContainsCyrillicCharacters(field); // We have something to translitterate:\n }\n\n\n function mapSubfieldToIso9(subfield) {\n if (!subfieldShouldTransliterateToIso9(subfield)) {\n return {code: subfield.code, value: subfield.value}; // just clone\n }\n const value = iso9.convertToLatin(subfield.value);\n\n return {code: subfield.code, value};\n }\n\n function mapSubfieldToSfs4900(subfield, lang = 'rus') {\n const inputLang = lang === 'ukr' ? 'ukr' : 'rus'; // Support 'ukr' and 'rus', default to 'rus'\n const value = subfieldShouldTransliterateToIso9(subfield) ? sfs4900.convertToLatin(subfield.value, inputLang).result : subfield.value;\n return {code: subfield.code, value};\n }\n\n\n function mapFieldToIso9(field, occurrenceNumber) {\n if (!config.doISO9Transliteration) {\n return undefined;\n }\n // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either\n if (!config.retainCyrillic && !config.doSFS4900Transliteration) {\n const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);\n const subfield9 = fieldHasSubfield(field, '9', iso9Trans) ? [] : [{code: '9', value: iso9Trans}]; // Add only if needed\n\n const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToIso9(sf));\n\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, ...subfield9]};\n }\n\n function mapFieldToSfs4900(field, occurrenceNumber, lang = 'rus') {\n // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either\n if (!config.retainCyrillic && !config.doISO9Transliteration) {\n const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);\n const subfield9 = fieldHasSubfield(field, '9', sfs4900Trans) ? [] : [{code: '9', value: sfs4900Trans}]; // Add only if needed\n\n const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf, lang));\n\n const newField = {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, ...subfield9]};\n\n if (!config.doISO9Transliteration) {\n return newField;\n }\n\n //const subfield6 = newField.subfields.find(sf => sf.code === '6');\n newField.tag = '880'; // eslint-disable-line functional/immutable-data\n resetSubfield6Tag(subfield6, field.tag);\n return newField;\n }\n\n function deriveSubfield6(tag, subfields, occurrenceNumber) {\n const initialSubfield = {code: '6', value: `${tag}-${occurrenceNumber}`};\n if (tag === '880') { // If *tag in subfield $6* is 880, field is not 880 :D\n return initialSubfield;\n }\n // Try to use existing subfield\n const [subfield6] = subfields.filter(sf => sf.code === '6').map(sf => clone(sf));\n if (subfield6) {\n resetSubfield6Tag(subfield6, tag); // Should we update occurrence number?\n return subfield6;\n }\n\n return initialSubfield;\n }\n\n function mapFieldToCyrillicField880(field, occurrenceNumber) {\n if (!config.retainCyrillic) {\n return undefined;\n }\n nvdebug(`Derive CYR 880 from ${fieldToString(field)}`);\n const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);\n const newSubfield9 = fieldHasSubfield(field, '9', cyrillicTrans) ? [] : [{code: '9', value: cyrillicTrans}];\n const subfields = [\n newSubfield6,\n ...field.subfields.filter(sf => sf.code !== '6').map(sf => clone(sf)),\n ...newSubfield9\n ];\n\n const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};\n nvdebug(` New CYR 880 ${fieldToString(newField)}`);\n return newField;\n }\n\n function getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber = 0) {\n const occurrenceNumber = fieldGetMaxSubfield6OccurrenceNumberAsInteger(originalField);\n // Return existing occurrence number:\n if (occurrenceNumber > 0) {\n return occurrenceNumber;\n }\n if (maxCreatedOccurrenceNumber) {\n return maxCreatedOccurrenceNumber + 1;\n }\n return recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n }\n\n function retainCyrillic(existingPairedFields) {\n // Should we move cyrillic content from a normali field to a 880?\n if (!config.retainCyrillic) {\n return false;\n }\n // Fail if we already have a paired 880 $9 <CYRILLIC> TRANS\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', cyrillicTrans));\n }\n\n function needsSfs4900Transliteration(existingPairedFields) {\n if (!config.doSFS4900Transliteration) {\n return false;\n }\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', sfs4900Trans));\n }\n\n function sfs4900PairCanBeTransliterated(field, record) {\n // MELINDA-10330: we already have public library data: (unmarked) SFS-4900 in FIELD and (unmarked) Cyrillic in 880\n if (!field.subfields || !tagCanBeTransliterated(field.tag) || !config.doISO9Transliteration) {\n return false;\n }\n\n // Original field: $9 ISO9 <TRANS> is the only legal <TRANS>\n if (fieldContainsCyrillicCharacters(field) || field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== iso9Trans)) {\n return false;\n }\n\n const existingPairedFields = fieldGetOccurrenceNumberPairs(field, record.get('880'));\n if (existingPairedFields.length !== 1) {\n return false;\n }\n\n // Paired field: $9 CYRILLIC <TRANS> is the only legal <TRANS>\n const [pairedField] = existingPairedFields;\n nvdebug(`LOOKING FOR SFS4900 PAIR: ${fieldToString(field)}`);\n nvdebug(` HAVING PAIRED FIELD: ${fieldToString(pairedField)}`);\n if (!fieldContainsCyrillicCharacters(pairedField)) {\n return false;\n }\n if (pairedField.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== cyrillicTrans)) {\n return false;\n }\n\n // Actually check that original field and and sfs-4900-fied cyrillic field are equal (after punctuation clean-up),\n // and thus it's a real case of MELINDA-10330 ISO9 adding:\n const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);\n const languageCode = getLanguageCode(record);\n const field2 = fieldToString(createFieldForSfs4900Comparison(mapFieldToSfs4900(pairedField, occurrenceNumberAsString, languageCode), field.tag));\n const field1 = fieldToString(createFieldForSfs4900Comparison(field, field.tag));\n nvdebug(`COMPARE CONTENTS:\\n '${field1}' vs\\n '${field2}': ${field1 === field2 ? 'OK' : 'FAIL'}`);\n return field1 === field2;\n }\n\n function createFieldForSfs4900Comparison(field, tag) {\n const clonedField = clone(field);\n clonedField.tag = tag; // eslint-disable-line functional/immutable-data\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== '9' || sf.value !== sfs4900Trans); // eslint-disable-line functional/immutable-data\n return fieldStripPunctuation(clonedField);\n }\n\n function transliterateSfs4900Pair(field, record) {\n // Handle MELINDA-10330: Field is already in SFS-4900 and the only paired field is in Cyrillic!\n if (!config.doISO9Transliteration) {\n return [];\n }\n const [pairedField] = fieldGetOccurrenceNumberPairs(field, record.get('880'));\n\n const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);\n const languageCode = getLanguageCode(record);\n\n const tmpField = {'tag': field.tag, 'ind1': field.ind1, 'ind2': field.ind2, 'subfields': pairedField.subfields};\n\n const newMainField = config.doISO9Transliteration ? mapFieldToIso9(tmpField, occurrenceNumberAsString) : undefined; // Cyrillic => ISO-9\n const newCyrillicField = config.retainCyrillic ? mapFieldToCyrillicField880(tmpField, occurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = config.doSFS4900Transliteration ? mapFieldToSfs4900(field, occurrenceNumberAsString, languageCode) : undefined; // SFS-4900\n\n // Trigger the drop of original counterpart $6 :\n pairedField.cyrilluxSkip = 1; // eslint-disable-line functional/immutable-data\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n\n\n function processField(originalField, record, maxCreatedOccurrenceNumber = 0) {\n if (!fieldCanBeTransliterated(originalField)) {\n if (sfs4900PairCanBeTransliterated(originalField, record)) { // MELINDA-10330\n return transliterateSfs4900Pair(originalField, record);\n }\n if (originalField.cyrilluxSkip) { // MELINDA-10330 hack to remove 880 fields that were replaced/sort-of processed with their counterpair.\n return [];\n }\n return [originalField];\n }\n\n // nvdebug(`PROCESSING: ${fieldToString(originalField)}`);\n\n const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);\n const newOccurrenceNumberAsString = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n const languageCode = getLanguageCode(record);\n\n // nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);\n\n const existingPairedFields = fieldGetOccurrenceNumberPairs(originalField, record.get('880'));\n\n // nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`);\n\n const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9\n const newCyrillicField = retainCyrillic(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900(originalField, newOccurrenceNumberAsString, languageCode) : undefined; /// SFS-4900\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"cyrillux.js","names":["_clone","_interopRequireDefault","require","_utils","iso9","_interopRequireWildcard","_subfield6Utils","_xregexp","sfs4900","_sortFields","_reindexSubfield6OccurenceNumbers","_punctuation","_addMissingField","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","iso9Trans","cyrillicTrans","sfs4900Trans","_default","config","description","validate","fix","preprocessConfig","retainCyrillic","doISO9Transliteration","doSFS4900Transliteration","preferSFS4900","setPreference","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","subfieldRequiresTransliteration","subfield","isControlSubfieldCode","code","value","tagCanBeTransliterated","tag","includes","fieldCanBeTransliterated","mapSubfieldToIso9","convertToLatin","mapSubfieldToSfs4900","lang","inputLang","console","log","mapField","occurrenceNumber","subfield6","deriveSubfield6","transliterationText","subfield9","fieldHasSubfield","transliterationFunc","filter","map","newField","ind1","ind2","resetSubfield6Tag","mapFieldToIso9","undefined","mapFieldToSfs4900","initialSubfield","mapFieldToCyrillicField880","nvdebug","newSubfield6","newSubfield9","getNewOccurrenceNumber","originalField","maxCreatedOccurrenceNumber","fieldGetMaxSubfield6OccurrenceNumberAsInteger","existingPairedFields","f","needsSfs4900Transliteration","sfs4900PairCanBeTransliterated","fieldGetOccurrenceNumberPairs","pairedField","occurrenceNumberAsString","fieldGetUnambiguousOccurrenceNumber","languageCode","getLanguageCode","field2","createFieldForSfs4900Comparison","field1","clonedField","fieldStripPunctuation","transliterateSfs4900Pair","tmpField","newMainField","newCyrillicField","newSFS4900Field","cyrilluxSkip","newOccurrenceNumberAsInt","newOccurrenceNumberAsString","intToOccurrenceNumberString"],"sources":["../src/cyrillux.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldHasSubfield, fieldToString, fieldsToString, isControlSubfieldCode, nvdebug} from './utils';\nimport * as iso9 from 'iso9_1995';\nimport {fieldGetMaxSubfield6OccurrenceNumberAsInteger, fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag} from './subfield6Utils';\n\nimport XRegExp from 'xregexp';\nimport * as sfs4900 from '@natlibfi/sfs-4900';\nimport {default as sortFields} from './sortFields';\nimport {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers';\nimport {fieldStripPunctuation} from './punctuation2';\nimport {getLanguageCode} from './addMissingField041';\n\nconst iso9Trans = 'ISO9 <TRANS>';\nconst cyrillicTrans = 'CYRILLIC <TRANS>';\nconst sfs4900Trans = 'SFS4900 <TRANS>';\n\nexport default function (config = {}) {\n // console.log(`CONFIG=${JSON.stringify(config)}`); // eslint-disable-line no-console\n\n return {\n description: 'Cyrillux functionality: convert original field to latinitsa (ISO-9) and add 880s for original cyrillic and latinitsa (SFS-4900)',\n validate, fix\n };\n\n function preprocessConfig() {\n config.retainCyrillic = typeof config.retainCyrillic === 'undefined' ? true : config.retainCyrillic; // eslint-disable-line functional/immutable-data\n config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration; // eslint-disable-line functional/immutable-data\n config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration; // eslint-disable-line functional/immutable-data\n config.preferSFS4900 = setPreference(); // eslint-disable-line functional/immutable-data\n\n function setPreference() {\n if (typeof config.preferSFS4900 === 'undefined') {\n return !config.doISO9Transliteration && config.doSFS4900Transliteration;\n }\n return config.preferSFS4900;\n }\n }\n\n function fix(record) {\n // console.log(`FIX has CONFIG=${JSON.stringify(config)}`); // eslint-disable-line no-console\n // Fix always succeeds\n const res = {message: [], fix: [], valid: true};\n\n preprocessConfig();\n\n const nBefore = record.fields.length;\n\n record.fields = processFields(record.fields); // eslint-disable-line functional/immutable-data\n\n if (nBefore < record.fields.length) { // eslint-disable-line functional/no-conditional-statements\n reindexSubfield6OccurenceNumbers().fix(record);\n sortFields().fix(record);\n }\n\n function processFields(input, output = []) {\n const [currField, ...remainingInput] = input;\n if (!currField) {\n return output;\n }\n\n const fakeRecord = {fields: output};\n const createdMax = recordGetMaxSubfield6OccurrenceNumberAsInteger(fakeRecord);\n const result = processField(currField, record, createdMax);\n\n return processFields(remainingInput, [...output, ...result]);\n }\n\n return res;\n }\n\n function validate(record) {\n const res = {message: [], valid: true};\n\n preprocessConfig();\n\n record.fields?.forEach(field => {\n validateField(field, res, record);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res, record) {\n const orig = fieldToString(field);\n\n const normalizedFields = processField(clone(field), record);\n const mod = fieldsToString(normalizedFields).replace(/\\t__SEPARATOR__\\t/ug, ', ').replace(/ (‡6 [0-9][0-9][0-9])-[0-9][0-9]+/gu, ' $1-NN'); // eslint-disable-line prefer-named-capture-group\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`CHANGE: ${orig} => ${mod}`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n\n function isCyrillicCharacter(char) {\n return XRegExp('[\\\\p{Cyrillic}]').test(char); // eslint-disable-line new-cap\n }\n\n function containsCyrillicCharacters(str) { // from melinda-ui-cyrillux\n if (!str) {\n return false;\n }\n return str.split('').some(isCyrillicCharacter);\n }\n\n function fieldContainsCyrillicCharacters(field) { // based on melinda-ui-cyrillux\n return field.subfields && field.subfields.some(sf => subfieldRequiresTransliteration(sf));\n }\n\n function subfieldRequiresTransliteration(subfield) {\n if (isControlSubfieldCode(subfield.code)) {\n return false;\n }\n return containsCyrillicCharacters(subfield.value);\n }\n\n function tagCanBeTransliterated(tag) {\n return !['336', '337', '338', '880'].includes(tag);\n }\n\n function fieldCanBeTransliterated(field) {\n // Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well).\n // Discussion: We should probably also skip others like 05X-08X, 648, 650, 651, and 655, but this needs thinking...\n // Also I'd like to convert do CYRILLIC->ISO-9 in field 300 (and others?) without 880 mappings... (<- not implemented)\n\n // nvdebug(`fieldCanBeTransliterated('${fieldToString(field)}') in...`);\n if (!tagCanBeTransliterated(field.tag)) {\n return false;\n }\n\n if (!config.doISO9Transliteration && !config.doSFS4900Transliteration) {\n return false;\n }\n\n // Skip control fields:\n if (!field.subfields) {\n return false;\n }\n // When doing MELINDA-10330-ish, we noticed that $6 should not prevent translittaration per se, so this restriction is no longer applied!\n\n if (field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>'))) {\n return false;\n }\n\n return fieldContainsCyrillicCharacters(field); // We have something to translitterate:\n }\n\n\n function mapSubfieldToIso9(subfield) {\n if (!subfieldRequiresTransliteration(subfield)) {\n return {code: subfield.code, value: subfield.value}; // just clone\n }\n const value = iso9.convertToLatin(subfield.value);\n\n return {code: subfield.code, value};\n }\n\n function mapSubfieldToSfs4900(subfield, lang = 'rus') {\n const inputLang = lang === 'ukr' ? 'ukr' : 'rus'; // Support 'ukr' and 'rus', default to 'rus'\n const value = subfieldRequiresTransliteration(subfield) ? sfs4900.convertToLatin(subfield.value, inputLang).result : subfield.value;\n console.log(`VAL: ${subfield.value} => ${value} using ${lang}`); // eslint-disable-line no-console\n return {code: subfield.code, value};\n }\n\n function mapField(field, occurrenceNumber, iso9 = true, lang = 'rus') {\n const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);\n const transliterationText = iso9 ? iso9Trans : sfs4900Trans;\n\n const subfield9 = fieldHasSubfield(field, '9', transliterationText) ? [] : [{code: '9', value: transliterationText}]; // Add only if needed\n const transliterationFunc = iso9 ? mapSubfieldToIso9 : mapSubfieldToSfs4900;\n\n // NB! iso9 won't use lang\n const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => transliterationFunc(sf, lang));\n\n const newField = {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, ...subfield9]};\n\n // Transliteration goes to the original field:\n if (!iso9 && config.preferSFS4900) {\n return newField;\n }\n if (iso9 && !config.preferSFS4900) {\n return newField;\n }\n // Translitetation goes to field 880:\n\n //const subfield6 = newField.subfields.find(sf => sf.code === '6');\n newField.tag = '880'; // eslint-disable-line functional/immutable-data\n resetSubfield6Tag(subfield6, field.tag);\n return newField;\n\n }\n\n function mapFieldToIso9(field, occurrenceNumber) {\n if (!config.doISO9Transliteration) {\n return undefined;\n }\n // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either\n if (!config.retainCyrillic && !config.preferSFS4900) {\n const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n return mapField(field, occurrenceNumber, true, 'rus');\n\n }\n\n function mapFieldToSfs4900(field, occurrenceNumber, lang = 'rus') {\n if (!config.doSFS4900Transliteration) {\n return undefined;\n }\n // Just converts the field to SFS-4900 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either\n if (!config.retainCyrillic && config.preferSFS4900) {\n const subfields = field.subfields.map(sf => mapSubfieldToSfs4900(sf, lang));\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n return mapField(field, occurrenceNumber, false, lang);\n }\n\n function deriveSubfield6(tag, subfields, occurrenceNumber) {\n const initialSubfield = {code: '6', value: `${tag}-${occurrenceNumber}`};\n if (tag === '880') { // If *tag in subfield $6* is 880, field is not 880 :D\n return initialSubfield;\n }\n // Try to use existing subfield\n const [subfield6] = subfields.filter(sf => sf.code === '6').map(sf => clone(sf));\n if (subfield6) {\n resetSubfield6Tag(subfield6, tag); // Should we update occurrence number?\n return subfield6;\n }\n\n return initialSubfield;\n }\n\n function mapFieldToCyrillicField880(field, occurrenceNumber) {\n if (!config.retainCyrillic) {\n return undefined;\n }\n nvdebug(`Derive CYR 880 from ${fieldToString(field)}`);\n const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);\n const newSubfield9 = fieldHasSubfield(field, '9', cyrillicTrans) ? [] : [{code: '9', value: cyrillicTrans}];\n const subfields = [\n newSubfield6,\n ...field.subfields.filter(sf => sf.code !== '6').map(sf => clone(sf)),\n ...newSubfield9\n ];\n\n const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};\n nvdebug(` New CYR 880 ${fieldToString(newField)}`);\n return newField;\n }\n\n\n function getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber = 0) {\n const occurrenceNumber = fieldGetMaxSubfield6OccurrenceNumberAsInteger(originalField);\n // Return existing occurrence number:\n if (occurrenceNumber > 0) {\n return occurrenceNumber;\n }\n if (maxCreatedOccurrenceNumber) {\n return maxCreatedOccurrenceNumber + 1;\n }\n return recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n }\n\n function retainCyrillic(existingPairedFields) {\n // Should we move cyrillic content from a normali field to a 880?\n if (!config.retainCyrillic) {\n return false;\n }\n // Fail if we already have a paired 880 $9 <CYRILLIC> TRANS\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', cyrillicTrans));\n }\n\n function needsSfs4900Transliteration(existingPairedFields) {\n if (!config.doSFS4900Transliteration) {\n return false;\n }\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', sfs4900Trans));\n }\n\n function sfs4900PairCanBeTransliterated(field, record) {\n // MELINDA-10330: we already have public library data: (unmarked) SFS-4900 in FIELD and (unmarked) Cyrillic in 880\n if (!field.subfields || !tagCanBeTransliterated(field.tag) || !config.doISO9Transliteration || !config.retainCyrillic || !config.doSFS4900Transliteration) {\n return false;\n }\n\n // Original field: $9 ISO9 <TRANS> is the only legal <TRANS>\n if (fieldContainsCyrillicCharacters(field) || field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== iso9Trans)) {\n return false;\n }\n\n const existingPairedFields = fieldGetOccurrenceNumberPairs(field, record.get('880'));\n if (existingPairedFields.length !== 1) {\n return false;\n }\n\n // Paired field: $9 CYRILLIC <TRANS> is the only legal <TRANS>\n const [pairedField] = existingPairedFields;\n nvdebug(`LOOKING FOR SFS4900 PAIR: ${fieldToString(field)}`);\n nvdebug(` HAVING PAIRED FIELD: ${fieldToString(pairedField)}`);\n if (!fieldContainsCyrillicCharacters(pairedField)) {\n return false;\n }\n if (pairedField.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== cyrillicTrans)) {\n return false;\n }\n\n // Actually check that original field and and sfs-4900-fied cyrillic field are equal (after punctuation clean-up),\n // and thus it's a real case of MELINDA-10330 ISO9 adding:\n const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);\n const languageCode = getLanguageCode(record);\n const field2 = fieldToString(createFieldForSfs4900Comparison(mapFieldToSfs4900(pairedField, occurrenceNumberAsString, languageCode), field.tag));\n const field1 = fieldToString(createFieldForSfs4900Comparison(field, field.tag));\n nvdebug(`COMPARE CONTENTS:\\n '${field1}' vs\\n '${field2}': ${field1 === field2 ? 'OK' : 'FAIL'}`);\n return field1 === field2;\n }\n\n function createFieldForSfs4900Comparison(field, tag) {\n const clonedField = clone(field);\n clonedField.tag = tag; // eslint-disable-line functional/immutable-data\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== '9' || sf.value !== sfs4900Trans); // eslint-disable-line functional/immutable-data\n return fieldStripPunctuation(clonedField);\n }\n\n function transliterateSfs4900Pair(field, record) {\n // Handle MELINDA-10330: Field is already in SFS-4900 and the only paired field is in Cyrillic!\n if (!config.doISO9Transliteration) {\n return [];\n }\n const [pairedField] = fieldGetOccurrenceNumberPairs(field, record.get('880'));\n\n const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);\n const languageCode = getLanguageCode(record);\n\n const tmpField = {'tag': field.tag, 'ind1': field.ind1, 'ind2': field.ind2, 'subfields': pairedField.subfields};\n\n const newMainField = config.doISO9Transliteration ? mapFieldToIso9(tmpField, occurrenceNumberAsString) : undefined; // Cyrillic => ISO-9\n const newCyrillicField = config.retainCyrillic ? mapFieldToCyrillicField880(tmpField, occurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = config.doSFS4900Transliteration ? mapFieldToSfs4900(field, occurrenceNumberAsString, languageCode) : undefined; // SFS-4900\n\n // Trigger the drop of original counterpart $6 :\n pairedField.cyrilluxSkip = 1; // eslint-disable-line functional/immutable-data\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n\n\n function processField(originalField, record, maxCreatedOccurrenceNumber = 0) {\n if (!fieldCanBeTransliterated(originalField)) {\n if (sfs4900PairCanBeTransliterated(originalField, record)) { // MELINDA-10330\n return transliterateSfs4900Pair(originalField, record);\n }\n if (originalField.cyrilluxSkip) { // MELINDA-10330 hack to remove 880 fields that were replaced/sort-of processed with their counterpair.\n return [];\n }\n return [originalField];\n }\n\n // nvdebug(`PROCESSING: ${fieldToString(originalField)}`);\n\n const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);\n const newOccurrenceNumberAsString = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n const languageCode = getLanguageCode(record);\n\n // nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);\n\n const existingPairedFields = fieldGetOccurrenceNumberPairs(originalField, record.get('880'));\n\n // nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`);\n\n const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9\n const newCyrillicField = retainCyrillic(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900(originalField, newOccurrenceNumberAsString, languageCode) : undefined; /// SFS-4900\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/sortFields.js
CHANGED
|
@@ -59,19 +59,27 @@ const relatorTermScore = {
|
|
|
59
59
|
// NB! The more abstract, the earlier it appears.
|
|
60
60
|
// Note that terms with same abstraction level might also have order preferences
|
|
61
61
|
// We should 1) check the order of these, and 2) add translations (support Swedish at the very least)
|
|
62
|
-
// work/teos > expression/ekspressio > manifestation/manifestaatin,
|
|
62
|
+
// work/teos > expression/ekspressio > manifestation/manifestaatin,
|
|
63
|
+
// Work https://finto.fi/mts/fi/page/m1298
|
|
63
64
|
'säveltäjä': 100,
|
|
64
65
|
'composer': 100,
|
|
65
|
-
'kirjoittaja':
|
|
66
|
-
'author':
|
|
67
|
-
'
|
|
66
|
+
'kirjoittaja': 100,
|
|
67
|
+
'author': 100,
|
|
68
|
+
'libretisti': 100,
|
|
69
|
+
'sarjakuvantekijä': 100,
|
|
70
|
+
'soitonoppaan tekijä': 100,
|
|
71
|
+
'kartantekijä': 99,
|
|
68
72
|
'taiteilija': 98,
|
|
69
|
-
'kartantekijä': 98,
|
|
70
73
|
'sanoittaja': 90,
|
|
71
74
|
'käsikirjoittaja': 90,
|
|
72
|
-
'
|
|
73
|
-
'
|
|
74
|
-
'
|
|
75
|
+
'kuvaaja': 89,
|
|
76
|
+
'valokuvaaja': 89,
|
|
77
|
+
'kokoaja': 86,
|
|
78
|
+
'alkuperäisidean luoja': 85,
|
|
79
|
+
'teoksella kunnioitettu': 84,
|
|
80
|
+
'gratulaation kohde': 84,
|
|
81
|
+
'julkaisija': 82,
|
|
82
|
+
'tuottaja': 81,
|
|
75
83
|
// expression: https://finto.fi/mts/fi/page/m153
|
|
76
84
|
'sovittaja': 79,
|
|
77
85
|
'arranger': 79,
|
|
@@ -90,13 +98,11 @@ const relatorTermScore = {
|
|
|
90
98
|
'lukija': 61,
|
|
91
99
|
'kertoja': 61,
|
|
92
100
|
// Manifestation level: https://finto.fi/mts/fi/page/m491
|
|
93
|
-
|
|
94
|
-
'kustantaja': 41,
|
|
95
|
-
'julkaisija': 40
|
|
101
|
+
'kustantaja': 41
|
|
96
102
|
// Item level: https://finto.fi/mts/fi/page/m1157
|
|
97
103
|
};
|
|
98
104
|
const relatorTermScoreBk = {
|
|
99
|
-
// https://finto.fi/mts/fi/page/
|
|
105
|
+
// https://finto.fi/mts/fi/page/m34 100-81
|
|
100
106
|
'libretisti': 100,
|
|
101
107
|
'sarjakuvantekijä': 100,
|
|
102
108
|
'kirjoittaja': 99,
|
|
@@ -104,7 +110,8 @@ const relatorTermScoreBk = {
|
|
|
104
110
|
'soitonoppaan tekijä': 99,
|
|
105
111
|
'kuvaaja': 98,
|
|
106
112
|
'valokuvaaja': 98,
|
|
107
|
-
'kokoaja':
|
|
113
|
+
'kokoaja': 86,
|
|
114
|
+
'alkuperäisidean luoja': 85,
|
|
108
115
|
'teoksella kunnioitettu': 84,
|
|
109
116
|
'gratulaation kohde': 84,
|
|
110
117
|
'julkaisija': 83,
|
|
@@ -126,6 +133,7 @@ const relatorTermScoreMu = {
|
|
|
126
133
|
'säveltäjä': 100,
|
|
127
134
|
'sanoittaja': 99,
|
|
128
135
|
'soitonoppaan tekijä': 98,
|
|
136
|
+
'alkuperäisidean luoja': 85,
|
|
129
137
|
'teoksella kunnioitettu': 81,
|
|
130
138
|
// expression: https://finto.fi/mts/fi/page/m153
|
|
131
139
|
'sovittaja': 79,
|
|
@@ -135,6 +143,7 @@ const relatorTermScoreMu = {
|
|
|
135
143
|
'miksaaja': 75
|
|
136
144
|
};
|
|
137
145
|
const relatorTermScoreVm = {
|
|
146
|
+
// Visual Material
|
|
138
147
|
// Work
|
|
139
148
|
'ohjaaja': 100,
|
|
140
149
|
'kirjoittaja': 99,
|
|
@@ -142,8 +151,11 @@ const relatorTermScoreVm = {
|
|
|
142
151
|
// Here we assume that film/whatever is based on author's book
|
|
143
152
|
'käsikirjoittaja': 98,
|
|
144
153
|
'kuvaaja': 89,
|
|
145
|
-
'säveltäjä':
|
|
146
|
-
//
|
|
154
|
+
'säveltäjä': 86,
|
|
155
|
+
// Volatile. John Williams?
|
|
156
|
+
'alkuperäisidean luoja': 85,
|
|
157
|
+
'julkaisija': 82,
|
|
158
|
+
'tuottaja': 81,
|
|
147
159
|
// Expression
|
|
148
160
|
'leikkaaja': 80,
|
|
149
161
|
'sovittaja': 79,
|
package/dist/sortFields.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sortFields.js","names":["_clone","_interopRequireDefault","require","_utils","_marcFieldSort","_subfield8Utils","_subfield6Utils","e","__esModule","default","BIG_BAD_NUMBER","_default","description","validate","fix","record","res","message","valid","fields","sort","fieldOrderComparator","map","f","clone","relocatedFields","filter","i","fieldToString","length","push","relatorTermScore","relatorTermScoreBk","relatorTermScoreMu","relatorTermScoreVm","normalizeValue","value","replace","scoreRelatorTermBk","normalizedValue","scoreRelatorTermMu","scoreRelatorTermVm","scoreRelatorTerm","typeOfMaterial","undefined","fieldA","fieldB","sorterFunctions","sortByTag","sortByIndexTerms","sortAlphabetically","sortByRelatorTerm","sortByOccurrenceNumber","preferFenniKeep","sortByFieldLinkAndSequenceNumber","globalFieldOrderComparator","indexTermFields","scoreInd2","val","ind2Score","tag","includes","ind2","scoreDictionary","dictionary","dictionarySortIndex","dictionaryA","selectFirstValue","dictionaryB","dictScoreA","dictScoreB","preferKeep","keepOwner","hasKeepA","fieldHasSubfield","hasKeepB","fenniPreference","violaPreference","fieldGetMaxRelatorTermScore","field","subfields","relatorSubfieldCode","sf","code","scores","Math","max","scoreA","scoreB","fieldGetMinLinkAndSequenceNumber","relevantSubfields","isValidSubfield8","parseFloat","min","fieldGetOccurrenceNumber","subfield6","find","isValidSubfield6","parseInt","subfield6GetOccurrenceNumber","subcode","subfield","slice"],"sources":["../src/sortFields.js"],"sourcesContent":["// Taken from project marc-record-js, file marcSortFields.js as this contains more and more Melinda-specific rules.\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString} from './utils';\nimport {sortByTag, sortAlphabetically, fieldOrderComparator as globalFieldOrderComparator} from '@natlibfi/marc-record/dist/marcFieldSort';\nimport {isValidSubfield8} from './subfield8Utils';\nimport {isValidSubfield6, subfield6GetOccurrenceNumber} from './subfield6Utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortFields');\n//const debugData = debug.extend('data');\n//const debugDev = debug.extend('dev');\n\nconst BIG_BAD_NUMBER = 999999999;\nexport default function () {\n\n return {\n description: 'Sort fields using both generic and Melinda specific rules',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const fields = record.fields.map(f => clone(f));\n fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n\n const relocatedFields = fields.filter((f, i) => fieldToString(f) !== fieldToString(record.fields[i]));\n\n if (relocatedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${relocatedFields.length} field(s) in new places`); // eslint-disable-line functional/immutable-data\n }\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nconst relatorTermScore = { // Here bigger is better\n // NB! This is exportable as field internal $e sorting in marc-record-validators-js uses this.\n // NB! The more abstract, the earlier it appears.\n // Note that terms with same abstraction level might also have order preferences\n // We should 1) check the order of these, and 2) add translations (support Swedish at the very least)\n // work/teos > expression/ekspressio > manifestation/manifestaatin, https://finto.fi/mts/fi/page/m1298\n 'säveltäjä': 100, 'composer': 100,\n 'kirjoittaja': 99, 'author': 99,\n 'sarjakuvantekijä': 99,\n 'taiteilija': 98, 'kartantekijä': 98,\n 'sanoittaja': 90,\n 'käsikirjoittaja': 90, 'soitonoppaan tekijä': 90,\n 'teoksella kunnioitettu': 81, 'gratulaation kohde': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79, 'arranger': 79,\n 'kuvittaja': 78,\n 'esipuheen kirjoittaja': 77,\n 'alkusanojen kirjoittaja': 76, 'loppusanojen kirjoittaja': 76,\n 'toimittaja': 75, 'editor': 75,\n 'esittäjä': 74,\n 'johtaja': 73, // orkesterinjohtaja\n 'editointi': 71, // for music, editor/toimittaja is another thing\n 'kääntäjä': 70,\n 'lukija': 61, 'kertoja': 61,\n // Manifestation level: https://finto.fi/mts/fi/page/m491\n\n 'kustantaja': 41,\n 'julkaisija': 40\n // Item level: https://finto.fi/mts/fi/page/m1157\n};\n\nconst relatorTermScoreBk = {\n // https://finto.fi/mts/fi/page/m1298 100-81\n 'libretisti': 100, 'sarjakuvantekijä': 100,\n 'kirjoittaja': 99, 'author': 99, 'soitonoppaan tekijä': 99,\n 'kuvaaja': 98, 'valokuvaaja': 98,\n 'kokoaja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'julkaisija': 83,\n 'säveltäjä': 82, // if 300$e has CD etc\n 'sanoittaja': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'kuvittaja': 80,\n 'esipuheen kirjoittaja': 79,\n 'alkusanojen kirjoittaja': 78, 'loppusanojen kirjoittaja': 78,\n 'kääntäjä': 70,\n\n 'sovittaja': 50,\n // kappale\n 'sitoja': 25,\n 'gratulaation kirjoittaja': 24\n};\n\nconst relatorTermScoreMu = {\n 'säveltäjä': 100,\n 'sanoittaja': 99,\n 'soitonoppaan tekijä': 98,\n 'teoksella kunnioitettu': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75\n};\n\nconst relatorTermScoreVm = {\n // Work\n 'ohjaaja': 100,\n 'kirjoittaja': 99, 'author': 99, // Here we assume that film/whatever is based on author's book\n 'käsikirjoittaja': 98,\n 'kuvaaja': 89,\n 'säveltäjä': 82, // volatile\n // Expression\n 'leikkaaja': 80,\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75,\n 'kääntäjä': 70\n // Manifestation\n\n // Item\n};\n\nfunction normalizeValue(value) {\n // Removing last punc char is good enough for our purposes.\n // We don't handle abbreviations here etc.\n // Brackets should not happen either, should they?\n return value.replace(/[.,]$/u, '');\n}\n\nfunction scoreRelatorTermBk(normalizedValue) {\n if (normalizedValue in relatorTermScoreBk) {\n return relatorTermScoreBk[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermMu(normalizedValue) {\n if (normalizedValue in relatorTermScoreMu) {\n return relatorTermScoreMu[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermVm(normalizedValue) {\n if (normalizedValue in relatorTermScoreVm) {\n return relatorTermScoreVm[normalizedValue];\n }\n return 0;\n}\n\nexport function scoreRelatorTerm(value, typeOfMaterial = undefined) {\n // NB! We are currently using type of material only for sorting relator terms, not 7XX fields!\n const normalizedValue = normalizeValue(value);\n if (typeOfMaterial === 'BK') { // Books\n return scoreRelatorTermBk(normalizedValue);\n }\n if (typeOfMaterial === 'MU') { // Music (NB: audio books should be BK in this context!)\n return scoreRelatorTermMu(normalizedValue);\n }\n if (typeOfMaterial === 'VM') { // video material\n return scoreRelatorTermVm(normalizedValue);\n }\n if (normalizedValue in relatorTermScore) {\n return relatorTermScore[normalizedValue];\n }\n return 0;\n}\n\nexport function fieldOrderComparator(fieldA, fieldB) {\n\n //const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n //const sorterFunctions = [sortByIndexTerms, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n return globalFieldOrderComparator(fieldA, fieldB, sorterFunctions);\n}\n\nfunction sortByIndexTerms(fieldA, fieldB) { // eslint-disable-line complexity, max-statements\n\n const indexTermFields = ['600', '610', '611', '630', '648', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', '662'];\n\n function scoreInd2(val) {\n const ind2Score = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 8, '5': 5, '6': 6, '7': 7};\n\n if (val in ind2Score) {\n return ind2Score[val];\n }\n return 9;\n }\n\n // ATM this is not needed.\n // You may need this, if you change compare function order in sorterFunctions\n // istanbul ignore next\n if (fieldA.tag !== fieldB.tag) {\n return 0;\n }\n\n if (!indexTermFields.includes(fieldA.tag)) {\n return 0;\n }\n\n // Puts ind2=4 last\n if (scoreInd2(fieldA.ind2) > scoreInd2(fieldB.ind2)) {\n return 1;\n }\n if (scoreInd2(fieldA.ind2) < scoreInd2(fieldB.ind2)) {\n return -1;\n }\n\n function scoreDictionary(dictionary) {\n const dictionarySortIndex = {\n 'yso/fin': 0,\n 'yso/swe': 1,\n 'yso/eng': 2,\n 'slm/fin': 0.1,\n 'slm/swe': 1.1,\n 'kauno/fin': 2.1,\n 'kauno/swe': 2.2,\n 'kaunokki': 4,\n 'bella': 5\n };\n\n if (dictionary in dictionarySortIndex) {\n return dictionarySortIndex[dictionary];\n }\n return BIG_BAD_NUMBER;\n }\n\n const dictionaryA = selectFirstValue(fieldA, '2');\n const dictionaryB = selectFirstValue(fieldB, '2');\n\n const dictScoreA = scoreDictionary(dictionaryA);\n const dictScoreB = scoreDictionary(dictionaryB);\n // Use priority order for listed dictionaries:\n if (dictScoreA > dictScoreB) {\n return 1;\n }\n if (dictScoreA < dictScoreB) {\n return -1;\n }\n // Unlisted dictionaries: sort $2 value alphabetically:\n //if (dictScoreA === BIG_BAD_NUMBER) {\n if (dictionaryA > dictionaryB) {\n return 1;\n }\n if (dictionaryA < dictionaryB) {\n return -1;\n }\n //}\n return 0;\n}\n\n\nfunction preferKeep(fieldA, fieldB, keepOwner = 'FENNI') {\n const hasKeepA = fieldHasSubfield(fieldA, '9', `${keepOwner}<KEEP>`);\n const hasKeepB = fieldHasSubfield(fieldB, '9', `${keepOwner}<KEEP>`);\n\n if (hasKeepA && !hasKeepB) {\n return -1;\n }\n if (!hasKeepA && hasKeepB) {\n return 1;\n }\n\n return 0;\n}\n\n\nfunction preferFenniKeep(fieldA, fieldB) {\n const fenniPreference = preferKeep(fieldA, fieldB, 'FENNI');\n if (fenniPreference !== 0) {\n return fenniPreference;\n }\n const violaPreference = preferKeep(fieldA, fieldB, 'VIOLA');\n if (violaPreference !== 0) {\n return violaPreference;\n }\n return preferKeep(fieldA, fieldB, 'FIKKA');\n}\n\nfunction sortByRelatorTerm(fieldA, fieldB) {\n //if (!['600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'].includes(fieldA.tag)) {\n if (!['700', '710', '711', '730'].includes(fieldA.tag)) {\n return 0;\n }\n\n function fieldGetMaxRelatorTermScore(field) {\n if (!field.subfields) {\n return -1;\n }\n // If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...\n if (fieldHasSubfield(field, 't')) {\n return -1;\n }\n const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';\n const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);\n if (e.length === 0) { // No $e is still better than having a $t\n return 0;\n }\n const scores = e.map(sf => scoreRelatorTerm(sf.value));\n //debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);\n return Math.max(...scores);\n }\n\n const scoreA = fieldGetMaxRelatorTermScore(fieldA);\n const scoreB = fieldGetMaxRelatorTermScore(fieldB);\n\n if (scoreA < scoreB) {\n return 1;\n }\n if (scoreA > scoreB) {\n return -1;\n }\n return 0;\n}\n\n\nfunction fieldGetMinLinkAndSequenceNumber(field) {\n if (!field.subfields) {\n return BIG_BAD_NUMBER;\n }\n const relevantSubfields = field.subfields.filter(sf => isValidSubfield8(sf));\n // If val is something like \"1.2\\x\" parseFloat() would give a syntax erro because of hex-like escape sequnce (at least on Chrome). Thus remove tail:\n const scores = relevantSubfields.map(sf => parseFloat(sf.value.replace(/\\\\.*$/u, '')));\n if (scores.length === 0) {\n return BIG_BAD_NUMBER;\n }\n return Math.min(...scores);\n}\n\nfunction sortByFieldLinkAndSequenceNumber(fieldA, fieldB) { // Sort by subfield $8 that is...\n const scoreA = fieldGetMinLinkAndSequenceNumber(fieldA);\n const scoreB = fieldGetMinLinkAndSequenceNumber(fieldB);\n //debugDev(` sf-8-A-score for '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(` sf-8-B-score for '${fieldToString(fieldB)}: ${scoreB}`);\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return 1;\n }\n if (scoreA === 0) {\n return -1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction sortByOccurrenceNumber(fieldA, fieldB) { // Sort by subfield $6\n\n function fieldGetOccurrenceNumber(field) { // should this function be exported? (based on validator sortRelatorFields.js)\n if (!field.subfields) {\n return 0;\n }\n const subfield6 = field.subfields.find(sf => isValidSubfield6(sf));\n if (subfield6 === undefined) {\n return 0;\n }\n return parseInt(subfield6GetOccurrenceNumber(subfield6), 10);\n }\n\n if (fieldA.tag !== '880') {\n return 0;\n }\n const scoreA = fieldGetOccurrenceNumber(fieldA);\n const scoreB = fieldGetOccurrenceNumber(fieldB);\n\n //debugDev(`A: '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(`B: '${fieldToString(fieldB)}: ${scoreB}`);\n\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return -1;\n }\n if (scoreA === 0) {\n return 1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction selectFirstValue(field, subcode) {\n return field.subfields\n .filter(subfield => subcode === subfield.code)\n .map(subfield => subfield.value)\n .slice(0, 1);\n}\n\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"sortFields.js","names":["_clone","_interopRequireDefault","require","_utils","_marcFieldSort","_subfield8Utils","_subfield6Utils","e","__esModule","default","BIG_BAD_NUMBER","_default","description","validate","fix","record","res","message","valid","fields","sort","fieldOrderComparator","map","f","clone","relocatedFields","filter","i","fieldToString","length","push","relatorTermScore","relatorTermScoreBk","relatorTermScoreMu","relatorTermScoreVm","normalizeValue","value","replace","scoreRelatorTermBk","normalizedValue","scoreRelatorTermMu","scoreRelatorTermVm","scoreRelatorTerm","typeOfMaterial","undefined","fieldA","fieldB","sorterFunctions","sortByTag","sortByIndexTerms","sortAlphabetically","sortByRelatorTerm","sortByOccurrenceNumber","preferFenniKeep","sortByFieldLinkAndSequenceNumber","globalFieldOrderComparator","indexTermFields","scoreInd2","val","ind2Score","tag","includes","ind2","scoreDictionary","dictionary","dictionarySortIndex","dictionaryA","selectFirstValue","dictionaryB","dictScoreA","dictScoreB","preferKeep","keepOwner","hasKeepA","fieldHasSubfield","hasKeepB","fenniPreference","violaPreference","fieldGetMaxRelatorTermScore","field","subfields","relatorSubfieldCode","sf","code","scores","Math","max","scoreA","scoreB","fieldGetMinLinkAndSequenceNumber","relevantSubfields","isValidSubfield8","parseFloat","min","fieldGetOccurrenceNumber","subfield6","find","isValidSubfield6","parseInt","subfield6GetOccurrenceNumber","subcode","subfield","slice"],"sources":["../src/sortFields.js"],"sourcesContent":["// Taken from project marc-record-js, file marcSortFields.js as this contains more and more Melinda-specific rules.\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString} from './utils';\nimport {sortByTag, sortAlphabetically, fieldOrderComparator as globalFieldOrderComparator} from '@natlibfi/marc-record/dist/marcFieldSort';\nimport {isValidSubfield8} from './subfield8Utils';\nimport {isValidSubfield6, subfield6GetOccurrenceNumber} from './subfield6Utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortFields');\n//const debugData = debug.extend('data');\n//const debugDev = debug.extend('dev');\n\nconst BIG_BAD_NUMBER = 999999999;\nexport default function () {\n\n return {\n description: 'Sort fields using both generic and Melinda specific rules',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const fields = record.fields.map(f => clone(f));\n fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n\n const relocatedFields = fields.filter((f, i) => fieldToString(f) !== fieldToString(record.fields[i]));\n\n if (relocatedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${relocatedFields.length} field(s) in new places`); // eslint-disable-line functional/immutable-data\n }\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nconst relatorTermScore = { // Here bigger is better\n // NB! This is exportable as field internal $e sorting in marc-record-validators-js uses this.\n // NB! The more abstract, the earlier it appears.\n // Note that terms with same abstraction level might also have order preferences\n // We should 1) check the order of these, and 2) add translations (support Swedish at the very least)\n // work/teos > expression/ekspressio > manifestation/manifestaatin,\n // Work https://finto.fi/mts/fi/page/m1298\n 'säveltäjä': 100, 'composer': 100,\n 'kirjoittaja': 100, 'author': 100,\n 'libretisti': 100,\n 'sarjakuvantekijä': 100, 'soitonoppaan tekijä': 100,\n 'kartantekijä': 99,\n 'taiteilija': 98,\n 'sanoittaja': 90,\n 'käsikirjoittaja': 90,\n\n 'kuvaaja': 89, 'valokuvaaja': 89,\n 'kokoaja': 86,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'julkaisija': 82,\n 'tuottaja': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79, 'arranger': 79,\n 'kuvittaja': 78,\n 'esipuheen kirjoittaja': 77,\n 'alkusanojen kirjoittaja': 76, 'loppusanojen kirjoittaja': 76,\n 'toimittaja': 75, 'editor': 75,\n 'esittäjä': 74,\n 'johtaja': 73, // orkesterinjohtaja\n 'editointi': 71, // for music, editor/toimittaja is another thing\n 'kääntäjä': 70,\n 'lukija': 61, 'kertoja': 61,\n // Manifestation level: https://finto.fi/mts/fi/page/m491\n 'kustantaja': 41\n // Item level: https://finto.fi/mts/fi/page/m1157\n};\n\nconst relatorTermScoreBk = {\n // https://finto.fi/mts/fi/page/m34 100-81\n 'libretisti': 100, 'sarjakuvantekijä': 100,\n 'kirjoittaja': 99, 'author': 99, 'soitonoppaan tekijä': 99,\n 'kuvaaja': 98, 'valokuvaaja': 98,\n 'kokoaja': 86,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'julkaisija': 83,\n 'säveltäjä': 82, // if 300$e has CD etc\n 'sanoittaja': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'kuvittaja': 80,\n 'esipuheen kirjoittaja': 79,\n 'alkusanojen kirjoittaja': 78, 'loppusanojen kirjoittaja': 78,\n 'kääntäjä': 70,\n\n 'sovittaja': 50,\n // kappale\n 'sitoja': 25,\n 'gratulaation kirjoittaja': 24\n};\n\nconst relatorTermScoreMu = {\n 'säveltäjä': 100,\n 'sanoittaja': 99,\n 'soitonoppaan tekijä': 98,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75\n};\n\nconst relatorTermScoreVm = { // Visual Material\n // Work\n 'ohjaaja': 100,\n 'kirjoittaja': 99, 'author': 99, // Here we assume that film/whatever is based on author's book\n 'käsikirjoittaja': 98,\n 'kuvaaja': 89,\n 'säveltäjä': 86, // Volatile. John Williams?\n 'alkuperäisidean luoja': 85,\n 'julkaisija': 82,\n 'tuottaja': 81,\n // Expression\n 'leikkaaja': 80,\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75,\n 'kääntäjä': 70\n // Manifestation\n\n // Item\n};\n\nfunction normalizeValue(value) {\n // Removing last punc char is good enough for our purposes.\n // We don't handle abbreviations here etc.\n // Brackets should not happen either, should they?\n return value.replace(/[.,]$/u, '');\n}\n\nfunction scoreRelatorTermBk(normalizedValue) {\n if (normalizedValue in relatorTermScoreBk) {\n return relatorTermScoreBk[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermMu(normalizedValue) {\n if (normalizedValue in relatorTermScoreMu) {\n return relatorTermScoreMu[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermVm(normalizedValue) {\n if (normalizedValue in relatorTermScoreVm) {\n return relatorTermScoreVm[normalizedValue];\n }\n return 0;\n}\n\nexport function scoreRelatorTerm(value, typeOfMaterial = undefined) {\n // NB! We are currently using type of material only for sorting relator terms, not 7XX fields!\n const normalizedValue = normalizeValue(value);\n if (typeOfMaterial === 'BK') { // Books\n return scoreRelatorTermBk(normalizedValue);\n }\n if (typeOfMaterial === 'MU') { // Music (NB: audio books should be BK in this context!)\n return scoreRelatorTermMu(normalizedValue);\n }\n if (typeOfMaterial === 'VM') { // video material\n return scoreRelatorTermVm(normalizedValue);\n }\n if (normalizedValue in relatorTermScore) {\n return relatorTermScore[normalizedValue];\n }\n return 0;\n}\n\nexport function fieldOrderComparator(fieldA, fieldB) {\n\n //const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n //const sorterFunctions = [sortByIndexTerms, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n return globalFieldOrderComparator(fieldA, fieldB, sorterFunctions);\n}\n\nfunction sortByIndexTerms(fieldA, fieldB) { // eslint-disable-line complexity, max-statements\n\n const indexTermFields = ['600', '610', '611', '630', '648', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', '662'];\n\n function scoreInd2(val) {\n const ind2Score = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 8, '5': 5, '6': 6, '7': 7};\n\n if (val in ind2Score) {\n return ind2Score[val];\n }\n return 9;\n }\n\n // ATM this is not needed.\n // You may need this, if you change compare function order in sorterFunctions\n // istanbul ignore next\n if (fieldA.tag !== fieldB.tag) {\n return 0;\n }\n\n if (!indexTermFields.includes(fieldA.tag)) {\n return 0;\n }\n\n // Puts ind2=4 last\n if (scoreInd2(fieldA.ind2) > scoreInd2(fieldB.ind2)) {\n return 1;\n }\n if (scoreInd2(fieldA.ind2) < scoreInd2(fieldB.ind2)) {\n return -1;\n }\n\n function scoreDictionary(dictionary) {\n const dictionarySortIndex = {\n 'yso/fin': 0,\n 'yso/swe': 1,\n 'yso/eng': 2,\n 'slm/fin': 0.1,\n 'slm/swe': 1.1,\n 'kauno/fin': 2.1,\n 'kauno/swe': 2.2,\n 'kaunokki': 4,\n 'bella': 5\n };\n\n if (dictionary in dictionarySortIndex) {\n return dictionarySortIndex[dictionary];\n }\n return BIG_BAD_NUMBER;\n }\n\n const dictionaryA = selectFirstValue(fieldA, '2');\n const dictionaryB = selectFirstValue(fieldB, '2');\n\n const dictScoreA = scoreDictionary(dictionaryA);\n const dictScoreB = scoreDictionary(dictionaryB);\n // Use priority order for listed dictionaries:\n if (dictScoreA > dictScoreB) {\n return 1;\n }\n if (dictScoreA < dictScoreB) {\n return -1;\n }\n // Unlisted dictionaries: sort $2 value alphabetically:\n //if (dictScoreA === BIG_BAD_NUMBER) {\n if (dictionaryA > dictionaryB) {\n return 1;\n }\n if (dictionaryA < dictionaryB) {\n return -1;\n }\n //}\n return 0;\n}\n\n\nfunction preferKeep(fieldA, fieldB, keepOwner = 'FENNI') {\n const hasKeepA = fieldHasSubfield(fieldA, '9', `${keepOwner}<KEEP>`);\n const hasKeepB = fieldHasSubfield(fieldB, '9', `${keepOwner}<KEEP>`);\n\n if (hasKeepA && !hasKeepB) {\n return -1;\n }\n if (!hasKeepA && hasKeepB) {\n return 1;\n }\n\n return 0;\n}\n\n\nfunction preferFenniKeep(fieldA, fieldB) {\n const fenniPreference = preferKeep(fieldA, fieldB, 'FENNI');\n if (fenniPreference !== 0) {\n return fenniPreference;\n }\n const violaPreference = preferKeep(fieldA, fieldB, 'VIOLA');\n if (violaPreference !== 0) {\n return violaPreference;\n }\n return preferKeep(fieldA, fieldB, 'FIKKA');\n}\n\nfunction sortByRelatorTerm(fieldA, fieldB) {\n //if (!['600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'].includes(fieldA.tag)) {\n if (!['700', '710', '711', '730'].includes(fieldA.tag)) {\n return 0;\n }\n\n function fieldGetMaxRelatorTermScore(field) {\n if (!field.subfields) {\n return -1;\n }\n // If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...\n if (fieldHasSubfield(field, 't')) {\n return -1;\n }\n const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';\n const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);\n if (e.length === 0) { // No $e is still better than having a $t\n return 0;\n }\n const scores = e.map(sf => scoreRelatorTerm(sf.value));\n //debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);\n return Math.max(...scores);\n }\n\n const scoreA = fieldGetMaxRelatorTermScore(fieldA);\n const scoreB = fieldGetMaxRelatorTermScore(fieldB);\n\n if (scoreA < scoreB) {\n return 1;\n }\n if (scoreA > scoreB) {\n return -1;\n }\n return 0;\n}\n\n\nfunction fieldGetMinLinkAndSequenceNumber(field) {\n if (!field.subfields) {\n return BIG_BAD_NUMBER;\n }\n const relevantSubfields = field.subfields.filter(sf => isValidSubfield8(sf));\n // If val is something like \"1.2\\x\" parseFloat() would give a syntax erro because of hex-like escape sequnce (at least on Chrome). Thus remove tail:\n const scores = relevantSubfields.map(sf => parseFloat(sf.value.replace(/\\\\.*$/u, '')));\n if (scores.length === 0) {\n return BIG_BAD_NUMBER;\n }\n return Math.min(...scores);\n}\n\nfunction sortByFieldLinkAndSequenceNumber(fieldA, fieldB) { // Sort by subfield $8 that is...\n const scoreA = fieldGetMinLinkAndSequenceNumber(fieldA);\n const scoreB = fieldGetMinLinkAndSequenceNumber(fieldB);\n //debugDev(` sf-8-A-score for '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(` sf-8-B-score for '${fieldToString(fieldB)}: ${scoreB}`);\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return 1;\n }\n if (scoreA === 0) {\n return -1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction sortByOccurrenceNumber(fieldA, fieldB) { // Sort by subfield $6\n\n function fieldGetOccurrenceNumber(field) { // should this function be exported? (based on validator sortRelatorFields.js)\n if (!field.subfields) {\n return 0;\n }\n const subfield6 = field.subfields.find(sf => isValidSubfield6(sf));\n if (subfield6 === undefined) {\n return 0;\n }\n return parseInt(subfield6GetOccurrenceNumber(subfield6), 10);\n }\n\n if (fieldA.tag !== '880') {\n return 0;\n }\n const scoreA = fieldGetOccurrenceNumber(fieldA);\n const scoreB = fieldGetOccurrenceNumber(fieldB);\n\n //debugDev(`A: '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(`B: '${fieldToString(fieldB)}: ${scoreB}`);\n\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return -1;\n }\n if (scoreA === 0) {\n return 1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction selectFirstValue(field, subcode) {\n return field.subfields\n .filter(subfield => subcode === subfield.code)\n .map(subfield => subfield.value)\n .slice(0, 1);\n}\n\n"],"mappings":"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","ignoreList":[]}
|
package/dist/sortRelatorTerms.js
CHANGED
|
@@ -86,38 +86,47 @@ function swapRelatorTermSubfields(field, typeOfMaterial = undefined) {
|
|
|
86
86
|
return;
|
|
87
87
|
}
|
|
88
88
|
const subfieldCode = tagToRelatorTermSubfieldCode(field.tag);
|
|
89
|
-
|
|
89
|
+
console.log(`Processing ${(0, _utils.fieldToString)(field)}`); // eslint-disable-line no-console
|
|
90
|
+
|
|
91
|
+
const swapPosition = field.subfields.findIndex((subfield, index) => isSwappable(subfield, index));
|
|
92
|
+
if (swapPosition > 0) {
|
|
93
|
+
swapRelatorTermPair(swapPosition);
|
|
94
|
+
swapRelatorTermSubfields(field, typeOfMaterial); // uh, evil recursion...
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
console.log(`END ${(0, _utils.fieldToString)(field)}`); // eslint-disable-line no-console
|
|
98
|
+
|
|
99
|
+
function swapRelatorTermPair(index) {
|
|
100
|
+
console.log(` SWAP`); // eslint-disable-line no-console
|
|
101
|
+
|
|
102
|
+
// Swap:
|
|
103
|
+
const tmp = field.subfields[index - 1];
|
|
104
|
+
field.subfields[index - 1] = field.subfields[index]; // eslint-disable-line functional/immutable-data
|
|
105
|
+
field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data
|
|
106
|
+
(0, _punctuation.fieldFixPunctuation)(field);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
function isSwappable(sf, index) {
|
|
90
110
|
// NB! we should fix 'e' to 'e' or 'j'....
|
|
91
111
|
if (index === 0 || sf.code !== subfieldCode) {
|
|
92
112
|
return false;
|
|
93
113
|
}
|
|
94
114
|
const currScore = (0, _sortFields.scoreRelatorTerm)(sf.value, typeOfMaterial);
|
|
115
|
+
if (currScore === 0) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
95
118
|
const prevSubfield = field.subfields[index - 1];
|
|
96
|
-
if (
|
|
119
|
+
if (prevSubfield.code !== subfieldCode) {
|
|
97
120
|
return false;
|
|
98
121
|
}
|
|
99
122
|
const prevScore = (0, _sortFields.scoreRelatorTerm)(prevSubfield.value, typeOfMaterial);
|
|
100
|
-
|
|
101
|
-
|
|
123
|
+
console.log(`PREV: ${prevSubfield.value}/${prevScore}, CURR: ${sf.value}/${currScore}`); // eslint-disable-line no-console
|
|
102
124
|
// If this subfield maps to a Work, then subfields can be swapped, even if we don't have a score for the prev subfield!
|
|
103
125
|
if (prevScore === 0 && currScore < WORST_WORK) {
|
|
104
126
|
return false;
|
|
105
127
|
}
|
|
106
|
-
|
|
107
|
-
// Swap:
|
|
108
|
-
const tmp = field.subfields[index - 1];
|
|
109
|
-
field.subfields[index - 1] = sf; // eslint-disable-line functional/immutable-data
|
|
110
|
-
field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data
|
|
111
|
-
(0, _punctuation.fieldFixPunctuation)(field);
|
|
112
|
-
return true;
|
|
113
|
-
}
|
|
114
|
-
return false;
|
|
115
|
-
});
|
|
116
|
-
if (loopAgain) {
|
|
117
|
-
swapRelatorTermSubfields(field, typeOfMaterial); // uh, evil recursion...
|
|
118
|
-
return;
|
|
128
|
+
return currScore > prevScore;
|
|
119
129
|
}
|
|
120
|
-
return;
|
|
121
130
|
}
|
|
122
131
|
function sortAdjacentRelatorTerms(field, typeOfMaterial = undefined) {
|
|
123
132
|
if (!field.subfields || !isRelatorTermTag(field.tag)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sortRelatorTerms.js","names":["_clone","_interopRequireDefault","require","_utils","_punctuation","_sortFields","e","__esModule","default","WORST_WORK","_default","description","validate","fix","record","res","message","valid","typeOfMaterial","recordToTypeOfMaterial","fields","forEach","field","sortAdjacentRelatorTerms","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","leader","undefined","charAt","getTypeOfMaterial","tagToRelatorTermSubfieldCode","tag","includes","isRelatorTermTag","swapRelatorTermSubfields","subfields","subfieldCode","
|
|
1
|
+
{"version":3,"file":"sortRelatorTerms.js","names":["_clone","_interopRequireDefault","require","_utils","_punctuation","_sortFields","e","__esModule","default","WORST_WORK","_default","description","validate","fix","record","res","message","valid","typeOfMaterial","recordToTypeOfMaterial","fields","forEach","field","sortAdjacentRelatorTerms","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","leader","undefined","charAt","getTypeOfMaterial","tagToRelatorTermSubfieldCode","tag","includes","isRelatorTermTag","swapRelatorTermSubfields","subfields","subfieldCode","console","log","swapPosition","findIndex","subfield","index","isSwappable","swapRelatorTermPair","tmp","fieldFixPunctuation","sf","code","currScore","scoreRelatorTerm","value","prevSubfield","prevScore"],"sources":["../src/sortRelatorTerms.js"],"sourcesContent":["// Validator/fixer for sorting $e relator term subfields\n//\n// Author(s): Nicholas Volk\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport {fieldFixPunctuation} from './punctuation2';\nimport {scoreRelatorTerm} from './sortFields';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortRelatorTerms');\n//const debugData = debug.extend('data');\n\nconst WORST_WORK = 81;\n\n\nexport default function () {\n\n return {\n description: 'Sort adjacent $e subfields in field [1678][01]0',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n sortAdjacentRelatorTerms(field, typeOfMaterial);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentRelatorTerms(clonedField, typeOfMaterial);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${fieldAsString} => ${clonedFieldAsString}`); // eslint-disable-line functional/immutable-data\n }\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction recordToTypeOfMaterial(record) {\n if (!record.leader) {\n return undefined;\n }\n\n if (record.leader.charAt(6) === 'i') { // Audio books should follow rules of a book, I guess...\n return 'BK';\n }\n\n return record.getTypeOfMaterial();\n}\n\nexport function tagToRelatorTermSubfieldCode(tag) {\n if (['100', '110', '600', '610', '700', '710', '720', '751', '752', '800', '810'].includes(tag)) {\n return 'e';\n }\n if (['111', '611', '711', '811'].includes(tag)) {\n return 'j';\n }\n return '?'; // No need to complain. Nothing is found.\n}\n\nfunction isRelatorTermTag(tag) {\n // NV: 111/711, 751 and 752 are very rare\n return ['e', 'j'].includes(tagToRelatorTermSubfieldCode(tag));\n}\n\nfunction swapRelatorTermSubfields(field, typeOfMaterial = undefined) {\n if (!field.subfields) {\n return;\n }\n\n const subfieldCode = tagToRelatorTermSubfieldCode(field.tag);\n\n console.log(`Processing ${fieldToString(field)}`); // eslint-disable-line no-console\n\n const swapPosition = field.subfields.findIndex((subfield, index) => isSwappable(subfield, index));\n\n if (swapPosition > 0) {\n swapRelatorTermPair(swapPosition);\n swapRelatorTermSubfields(field, typeOfMaterial); // uh, evil recursion...\n return;\n }\n\n console.log(`END ${fieldToString(field)}`); // eslint-disable-line no-console\n\n function swapRelatorTermPair(index) {\n console.log(` SWAP`); // eslint-disable-line no-console\n\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = field.subfields[index]; // eslint-disable-line functional/immutable-data\n field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data\n fieldFixPunctuation(field);\n return true;\n }\n\n function isSwappable(sf, index) {\n // NB! we should fix 'e' to 'e' or 'j'....\n if (index === 0 || sf.code !== subfieldCode) {\n return false;\n }\n const currScore = scoreRelatorTerm(sf.value, typeOfMaterial);\n if (currScore === 0) {\n return false;\n }\n const prevSubfield = field.subfields[index - 1];\n if (prevSubfield.code !== subfieldCode) {\n return false;\n }\n const prevScore = scoreRelatorTerm(prevSubfield.value, typeOfMaterial);\n console.log(`PREV: ${prevSubfield.value}/${prevScore}, CURR: ${sf.value}/${currScore}`); // eslint-disable-line no-console\n // If this subfield maps to a Work, then subfields can be swapped, even if we don't have a score for the prev subfield!\n if (prevScore === 0 && currScore < WORST_WORK) {\n return false;\n }\n return currScore > prevScore;\n }\n\n}\n\nexport function sortAdjacentRelatorTerms(field, typeOfMaterial = undefined) {\n if (!field.subfields || !isRelatorTermTag(field.tag)) {\n return field;\n }\n swapRelatorTermSubfields(field, typeOfMaterial);\n\n return field;\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.4.
|
|
17
|
+
"version": "11.4.5-alpha.1",
|
|
18
18
|
"main": "./dist/index.js",
|
|
19
19
|
"publishConfig": {
|
|
20
20
|
"access": "public"
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"@natlibfi/issn-verify": "^1.0.4",
|
|
41
41
|
"@natlibfi/marc-record": "^9.1.1",
|
|
42
42
|
"@natlibfi/marc-record-validate": "^8.0.12",
|
|
43
|
-
"@natlibfi/sfs-4900": "
|
|
43
|
+
"@natlibfi/sfs-4900": "https://github.com/NatLibFi/sfs-4900",
|
|
44
44
|
"cld3-asm": "^4.0.0",
|
|
45
45
|
"clone": "^2.1.2",
|
|
46
46
|
"debug": "^4.4.0",
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
"xml2js": "^0.6.2",
|
|
52
52
|
"xregexp": "^5.1.1"
|
|
53
53
|
},
|
|
54
|
+
"nvolkComment": "sfs-4900 has deployment issues, thus npmjs.com has only sfs-4900 1.1.0; use github version for now",
|
|
54
55
|
"peerDependencies": {
|
|
55
56
|
"@natlibfi/marc-record-validate": "^8.0.12"
|
|
56
57
|
},
|
package/src/cyrillux.js
CHANGED
|
@@ -27,6 +27,14 @@ export default function (config = {}) {
|
|
|
27
27
|
config.retainCyrillic = typeof config.retainCyrillic === 'undefined' ? true : config.retainCyrillic; // eslint-disable-line functional/immutable-data
|
|
28
28
|
config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration; // eslint-disable-line functional/immutable-data
|
|
29
29
|
config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration; // eslint-disable-line functional/immutable-data
|
|
30
|
+
config.preferSFS4900 = setPreference(); // eslint-disable-line functional/immutable-data
|
|
31
|
+
|
|
32
|
+
function setPreference() {
|
|
33
|
+
if (typeof config.preferSFS4900 === 'undefined') {
|
|
34
|
+
return !config.doISO9Transliteration && config.doSFS4900Transliteration;
|
|
35
|
+
}
|
|
36
|
+
return config.preferSFS4900;
|
|
37
|
+
}
|
|
30
38
|
}
|
|
31
39
|
|
|
32
40
|
function fix(record) {
|
|
@@ -98,10 +106,10 @@ export default function (config = {}) {
|
|
|
98
106
|
}
|
|
99
107
|
|
|
100
108
|
function fieldContainsCyrillicCharacters(field) { // based on melinda-ui-cyrillux
|
|
101
|
-
return field.subfields && field.subfields.some(sf =>
|
|
109
|
+
return field.subfields && field.subfields.some(sf => subfieldRequiresTransliteration(sf));
|
|
102
110
|
}
|
|
103
111
|
|
|
104
|
-
function
|
|
112
|
+
function subfieldRequiresTransliteration(subfield) {
|
|
105
113
|
if (isControlSubfieldCode(subfield.code)) {
|
|
106
114
|
return false;
|
|
107
115
|
}
|
|
@@ -141,7 +149,7 @@ export default function (config = {}) {
|
|
|
141
149
|
|
|
142
150
|
|
|
143
151
|
function mapSubfieldToIso9(subfield) {
|
|
144
|
-
if (!
|
|
152
|
+
if (!subfieldRequiresTransliteration(subfield)) {
|
|
145
153
|
return {code: subfield.code, value: subfield.value}; // just clone
|
|
146
154
|
}
|
|
147
155
|
const value = iso9.convertToLatin(subfield.value);
|
|
@@ -151,51 +159,64 @@ export default function (config = {}) {
|
|
|
151
159
|
|
|
152
160
|
function mapSubfieldToSfs4900(subfield, lang = 'rus') {
|
|
153
161
|
const inputLang = lang === 'ukr' ? 'ukr' : 'rus'; // Support 'ukr' and 'rus', default to 'rus'
|
|
154
|
-
const value =
|
|
162
|
+
const value = subfieldRequiresTransliteration(subfield) ? sfs4900.convertToLatin(subfield.value, inputLang).result : subfield.value;
|
|
163
|
+
console.log(`VAL: ${subfield.value} => ${value} using ${lang}`); // eslint-disable-line no-console
|
|
155
164
|
return {code: subfield.code, value};
|
|
156
165
|
}
|
|
157
166
|
|
|
167
|
+
function mapField(field, occurrenceNumber, iso9 = true, lang = 'rus') {
|
|
168
|
+
const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);
|
|
169
|
+
const transliterationText = iso9 ? iso9Trans : sfs4900Trans;
|
|
170
|
+
|
|
171
|
+
const subfield9 = fieldHasSubfield(field, '9', transliterationText) ? [] : [{code: '9', value: transliterationText}]; // Add only if needed
|
|
172
|
+
const transliterationFunc = iso9 ? mapSubfieldToIso9 : mapSubfieldToSfs4900;
|
|
173
|
+
|
|
174
|
+
// NB! iso9 won't use lang
|
|
175
|
+
const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => transliterationFunc(sf, lang));
|
|
176
|
+
|
|
177
|
+
const newField = {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, ...subfield9]};
|
|
178
|
+
|
|
179
|
+
// Transliteration goes to the original field:
|
|
180
|
+
if (!iso9 && config.preferSFS4900) {
|
|
181
|
+
return newField;
|
|
182
|
+
}
|
|
183
|
+
if (iso9 && !config.preferSFS4900) {
|
|
184
|
+
return newField;
|
|
185
|
+
}
|
|
186
|
+
// Translitetation goes to field 880:
|
|
187
|
+
|
|
188
|
+
//const subfield6 = newField.subfields.find(sf => sf.code === '6');
|
|
189
|
+
newField.tag = '880'; // eslint-disable-line functional/immutable-data
|
|
190
|
+
resetSubfield6Tag(subfield6, field.tag);
|
|
191
|
+
return newField;
|
|
192
|
+
|
|
193
|
+
}
|
|
158
194
|
|
|
159
195
|
function mapFieldToIso9(field, occurrenceNumber) {
|
|
160
196
|
if (!config.doISO9Transliteration) {
|
|
161
197
|
return undefined;
|
|
162
198
|
}
|
|
163
199
|
// Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either
|
|
164
|
-
if (!config.retainCyrillic && !config.
|
|
200
|
+
if (!config.retainCyrillic && !config.preferSFS4900) {
|
|
165
201
|
const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));
|
|
166
202
|
return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};
|
|
167
203
|
}
|
|
168
204
|
|
|
169
|
-
|
|
170
|
-
const subfield9 = fieldHasSubfield(field, '9', iso9Trans) ? [] : [{code: '9', value: iso9Trans}]; // Add only if needed
|
|
205
|
+
return mapField(field, occurrenceNumber, true, 'rus');
|
|
171
206
|
|
|
172
|
-
const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToIso9(sf));
|
|
173
|
-
|
|
174
|
-
return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, ...subfield9]};
|
|
175
207
|
}
|
|
176
208
|
|
|
177
209
|
function mapFieldToSfs4900(field, occurrenceNumber, lang = 'rus') {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));
|
|
181
|
-
return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};
|
|
210
|
+
if (!config.doSFS4900Transliteration) {
|
|
211
|
+
return undefined;
|
|
182
212
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => mapSubfieldToSfs4900(sf, lang));
|
|
188
|
-
|
|
189
|
-
const newField = {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, ...subfield9]};
|
|
190
|
-
|
|
191
|
-
if (!config.doISO9Transliteration) {
|
|
192
|
-
return newField;
|
|
213
|
+
// Just converts the field to SFS-4900 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either
|
|
214
|
+
if (!config.retainCyrillic && config.preferSFS4900) {
|
|
215
|
+
const subfields = field.subfields.map(sf => mapSubfieldToSfs4900(sf, lang));
|
|
216
|
+
return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};
|
|
193
217
|
}
|
|
194
218
|
|
|
195
|
-
|
|
196
|
-
newField.tag = '880'; // eslint-disable-line functional/immutable-data
|
|
197
|
-
resetSubfield6Tag(subfield6, field.tag);
|
|
198
|
-
return newField;
|
|
219
|
+
return mapField(field, occurrenceNumber, false, lang);
|
|
199
220
|
}
|
|
200
221
|
|
|
201
222
|
function deriveSubfield6(tag, subfields, occurrenceNumber) {
|
|
@@ -231,6 +252,7 @@ export default function (config = {}) {
|
|
|
231
252
|
return newField;
|
|
232
253
|
}
|
|
233
254
|
|
|
255
|
+
|
|
234
256
|
function getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber = 0) {
|
|
235
257
|
const occurrenceNumber = fieldGetMaxSubfield6OccurrenceNumberAsInteger(originalField);
|
|
236
258
|
// Return existing occurrence number:
|
|
@@ -261,7 +283,7 @@ export default function (config = {}) {
|
|
|
261
283
|
|
|
262
284
|
function sfs4900PairCanBeTransliterated(field, record) {
|
|
263
285
|
// MELINDA-10330: we already have public library data: (unmarked) SFS-4900 in FIELD and (unmarked) Cyrillic in 880
|
|
264
|
-
if (!field.subfields || !tagCanBeTransliterated(field.tag) || !config.doISO9Transliteration) {
|
|
286
|
+
if (!field.subfields || !tagCanBeTransliterated(field.tag) || !config.doISO9Transliteration || !config.retainCyrillic || !config.doSFS4900Transliteration) {
|
|
265
287
|
return false;
|
|
266
288
|
}
|
|
267
289
|
|
package/src/sortFields.js
CHANGED
|
@@ -51,14 +51,23 @@ const relatorTermScore = { // Here bigger is better
|
|
|
51
51
|
// NB! The more abstract, the earlier it appears.
|
|
52
52
|
// Note that terms with same abstraction level might also have order preferences
|
|
53
53
|
// We should 1) check the order of these, and 2) add translations (support Swedish at the very least)
|
|
54
|
-
// work/teos > expression/ekspressio > manifestation/manifestaatin,
|
|
54
|
+
// work/teos > expression/ekspressio > manifestation/manifestaatin,
|
|
55
|
+
// Work https://finto.fi/mts/fi/page/m1298
|
|
55
56
|
'säveltäjä': 100, 'composer': 100,
|
|
56
|
-
'kirjoittaja':
|
|
57
|
-
'
|
|
58
|
-
'
|
|
57
|
+
'kirjoittaja': 100, 'author': 100,
|
|
58
|
+
'libretisti': 100,
|
|
59
|
+
'sarjakuvantekijä': 100, 'soitonoppaan tekijä': 100,
|
|
60
|
+
'kartantekijä': 99,
|
|
61
|
+
'taiteilija': 98,
|
|
59
62
|
'sanoittaja': 90,
|
|
60
|
-
'käsikirjoittaja': 90,
|
|
61
|
-
|
|
63
|
+
'käsikirjoittaja': 90,
|
|
64
|
+
|
|
65
|
+
'kuvaaja': 89, 'valokuvaaja': 89,
|
|
66
|
+
'kokoaja': 86,
|
|
67
|
+
'alkuperäisidean luoja': 85,
|
|
68
|
+
'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,
|
|
69
|
+
'julkaisija': 82,
|
|
70
|
+
'tuottaja': 81,
|
|
62
71
|
// expression: https://finto.fi/mts/fi/page/m153
|
|
63
72
|
'sovittaja': 79, 'arranger': 79,
|
|
64
73
|
'kuvittaja': 78,
|
|
@@ -71,18 +80,17 @@ const relatorTermScore = { // Here bigger is better
|
|
|
71
80
|
'kääntäjä': 70,
|
|
72
81
|
'lukija': 61, 'kertoja': 61,
|
|
73
82
|
// Manifestation level: https://finto.fi/mts/fi/page/m491
|
|
74
|
-
|
|
75
|
-
'kustantaja': 41,
|
|
76
|
-
'julkaisija': 40
|
|
83
|
+
'kustantaja': 41
|
|
77
84
|
// Item level: https://finto.fi/mts/fi/page/m1157
|
|
78
85
|
};
|
|
79
86
|
|
|
80
87
|
const relatorTermScoreBk = {
|
|
81
|
-
// https://finto.fi/mts/fi/page/
|
|
88
|
+
// https://finto.fi/mts/fi/page/m34 100-81
|
|
82
89
|
'libretisti': 100, 'sarjakuvantekijä': 100,
|
|
83
90
|
'kirjoittaja': 99, 'author': 99, 'soitonoppaan tekijä': 99,
|
|
84
91
|
'kuvaaja': 98, 'valokuvaaja': 98,
|
|
85
|
-
'kokoaja':
|
|
92
|
+
'kokoaja': 86,
|
|
93
|
+
'alkuperäisidean luoja': 85,
|
|
86
94
|
'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,
|
|
87
95
|
'julkaisija': 83,
|
|
88
96
|
'säveltäjä': 82, // if 300$e has CD etc
|
|
@@ -103,6 +111,7 @@ const relatorTermScoreMu = {
|
|
|
103
111
|
'säveltäjä': 100,
|
|
104
112
|
'sanoittaja': 99,
|
|
105
113
|
'soitonoppaan tekijä': 98,
|
|
114
|
+
'alkuperäisidean luoja': 85,
|
|
106
115
|
'teoksella kunnioitettu': 81,
|
|
107
116
|
// expression: https://finto.fi/mts/fi/page/m153
|
|
108
117
|
'sovittaja': 79,
|
|
@@ -112,13 +121,16 @@ const relatorTermScoreMu = {
|
|
|
112
121
|
'miksaaja': 75
|
|
113
122
|
};
|
|
114
123
|
|
|
115
|
-
const relatorTermScoreVm = {
|
|
124
|
+
const relatorTermScoreVm = { // Visual Material
|
|
116
125
|
// Work
|
|
117
126
|
'ohjaaja': 100,
|
|
118
127
|
'kirjoittaja': 99, 'author': 99, // Here we assume that film/whatever is based on author's book
|
|
119
128
|
'käsikirjoittaja': 98,
|
|
120
129
|
'kuvaaja': 89,
|
|
121
|
-
'säveltäjä':
|
|
130
|
+
'säveltäjä': 86, // Volatile. John Williams?
|
|
131
|
+
'alkuperäisidean luoja': 85,
|
|
132
|
+
'julkaisija': 82,
|
|
133
|
+
'tuottaja': 81,
|
|
122
134
|
// Expression
|
|
123
135
|
'leikkaaja': 80,
|
|
124
136
|
'sovittaja': 79,
|
package/src/sortRelatorTerms.js
CHANGED
|
@@ -86,45 +86,51 @@ function swapRelatorTermSubfields(field, typeOfMaterial = undefined) {
|
|
|
86
86
|
|
|
87
87
|
const subfieldCode = tagToRelatorTermSubfieldCode(field.tag);
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
console.log(`Processing ${fieldToString(field)}`); // eslint-disable-line no-console
|
|
90
|
+
|
|
91
|
+
const swapPosition = field.subfields.findIndex((subfield, index) => isSwappable(subfield, index));
|
|
92
|
+
|
|
93
|
+
if (swapPosition > 0) {
|
|
94
|
+
swapRelatorTermPair(swapPosition);
|
|
95
|
+
swapRelatorTermSubfields(field, typeOfMaterial); // uh, evil recursion...
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
console.log(`END ${fieldToString(field)}`); // eslint-disable-line no-console
|
|
100
|
+
|
|
101
|
+
function swapRelatorTermPair(index) {
|
|
102
|
+
console.log(` SWAP`); // eslint-disable-line no-console
|
|
103
|
+
|
|
104
|
+
// Swap:
|
|
105
|
+
const tmp = field.subfields[index - 1];
|
|
106
|
+
field.subfields[index - 1] = field.subfields[index]; // eslint-disable-line functional/immutable-data
|
|
107
|
+
field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data
|
|
108
|
+
fieldFixPunctuation(field);
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function isSwappable(sf, index) {
|
|
90
113
|
// NB! we should fix 'e' to 'e' or 'j'....
|
|
91
114
|
if (index === 0 || sf.code !== subfieldCode) {
|
|
92
115
|
return false;
|
|
93
116
|
}
|
|
94
117
|
const currScore = scoreRelatorTerm(sf.value, typeOfMaterial);
|
|
95
|
-
|
|
118
|
+
if (currScore === 0) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
96
121
|
const prevSubfield = field.subfields[index - 1];
|
|
97
|
-
if (
|
|
122
|
+
if (prevSubfield.code !== subfieldCode) {
|
|
98
123
|
return false;
|
|
99
124
|
}
|
|
100
125
|
const prevScore = scoreRelatorTerm(prevSubfield.value, typeOfMaterial);
|
|
101
|
-
|
|
102
|
-
|
|
126
|
+
console.log(`PREV: ${prevSubfield.value}/${prevScore}, CURR: ${sf.value}/${currScore}`); // eslint-disable-line no-console
|
|
103
127
|
// If this subfield maps to a Work, then subfields can be swapped, even if we don't have a score for the prev subfield!
|
|
104
128
|
if (prevScore === 0 && currScore < WORST_WORK) {
|
|
105
129
|
return false;
|
|
106
130
|
}
|
|
107
|
-
|
|
108
|
-
if (currScore > prevScore) {
|
|
109
|
-
// Swap:
|
|
110
|
-
const tmp = field.subfields[index - 1];
|
|
111
|
-
field.subfields[index - 1] = sf; // eslint-disable-line functional/immutable-data
|
|
112
|
-
field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data
|
|
113
|
-
fieldFixPunctuation(field);
|
|
114
|
-
return true;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return false;
|
|
118
|
-
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
if (loopAgain) {
|
|
122
|
-
swapRelatorTermSubfields(field, typeOfMaterial); // uh, evil recursion...
|
|
123
|
-
return;
|
|
131
|
+
return currScore > prevScore;
|
|
124
132
|
}
|
|
125
133
|
|
|
126
|
-
return;
|
|
127
|
-
|
|
128
134
|
}
|
|
129
135
|
|
|
130
136
|
export function sortAdjacentRelatorTerms(field, typeOfMaterial = undefined) {
|
|
@@ -0,0 +1,55 @@
|
|
|
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, Juri Ivanovitš,"},
|
|
8
|
+
{ "code": "e", "value": "testaaja." },
|
|
9
|
+
{"code": "9", "value": "SFS4900 <TRANS>"}
|
|
10
|
+
]},
|
|
11
|
+
{ "tag": "300", "ind1": " ", "ind2": " ", "subfields": [
|
|
12
|
+
{ "code": "6", "value": "880-02" },
|
|
13
|
+
{ "code": "a", "value": "5 sm." },
|
|
14
|
+
{ "code": "9", "value": "SFS4900 <TRANS>" }
|
|
15
|
+
]},
|
|
16
|
+
{ "tag": "500", "ind1": " ", "ind2": " ", "subfields": [
|
|
17
|
+
{ "code": "6", "value": "880-03" },
|
|
18
|
+
{ "code": "a", "value": "5 sm." },
|
|
19
|
+
{ "code": "9", "value": "SFS4900 <TRANS>" }
|
|
20
|
+
]},
|
|
21
|
+
{ "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
|
|
22
|
+
{ "code": "6", "value": "100-01"},
|
|
23
|
+
{ "code": "a", "value": "Modin, Ûrij Ivanovič," },
|
|
24
|
+
{ "code": "e", "value": "testaaja." },
|
|
25
|
+
{ "code": "9", "value": "ISO9 <TRANS>"}
|
|
26
|
+
]},
|
|
27
|
+
{ "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
|
|
28
|
+
{"code": "6", "value": "100-01"},
|
|
29
|
+
{"code": "a", "value": "Модин, Юрий Иванович,"},
|
|
30
|
+
{ "code": "e", "value": "testaaja." },
|
|
31
|
+
{"code": "9", "value": "CYRILLIC <TRANS>"}
|
|
32
|
+
]},
|
|
33
|
+
{ "tag": "880", "ind1": " ", "ind2": " ", "subfields": [
|
|
34
|
+
{ "code": "6", "value": "300-02"},
|
|
35
|
+
{ "code": "a", "value": "5 sm." },
|
|
36
|
+
{ "code": "9", "value": "ISO9 <TRANS>"}
|
|
37
|
+
]},
|
|
38
|
+
{ "tag": "880", "ind1": " ", "ind2": " ", "subfields": [
|
|
39
|
+
{ "code": "6", "value": "300-02" },
|
|
40
|
+
{ "code": "a", "value": "5 см."},
|
|
41
|
+
{ "code": "9", "value": "CYRILLIC <TRANS>"}
|
|
42
|
+
]},
|
|
43
|
+
{ "tag": "880", "ind1": " ", "ind2": " ", "subfields": [
|
|
44
|
+
{ "code": "6", "value": "500-03"},
|
|
45
|
+
{ "code": "a", "value": "5 sm." },
|
|
46
|
+
{ "code": "9", "value": "ISO9 <TRANS>"}
|
|
47
|
+
]},
|
|
48
|
+
{ "tag": "880", "ind1": " ", "ind2": " ", "subfields": [
|
|
49
|
+
{ "code": "6", "value": "500-03" },
|
|
50
|
+
{ "code": "a", "value": "5 см." },
|
|
51
|
+
{ "code": "9", "value": "CYRILLIC <TRANS>" }
|
|
52
|
+
]}
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "01b Fix: field 100 required translitteration, but prefer SFS 4900 in original field and put ISO9 to field 880",
|
|
3
|
+
"comment": "Note that the order of 880 fields with the same occurrence number is currently hard-coded to ISO9, CYRILLIC, SFS4900.",
|
|
4
|
+
"only": false,
|
|
5
|
+
"fix": true,
|
|
6
|
+
"config": {
|
|
7
|
+
"preferSFS4900": true
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"leader": "12345cam 22123454i 4500",
|
|
3
|
+
"fields": [
|
|
4
|
+
{ "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
|
|
5
|
+
{ "code": "a", "value": "Модин, Юрий Иванович," },
|
|
6
|
+
{ "code": "e", "value": "testaaja." }
|
|
7
|
+
]},
|
|
8
|
+
{ "tag": "300", "ind1": " ", "ind2": " ", "subfields": [
|
|
9
|
+
{ "code": "a", "value": "5 см." }
|
|
10
|
+
]},
|
|
11
|
+
{ "tag": "500", "ind1": " ", "ind2": " ", "subfields": [
|
|
12
|
+
{ "code": "a", "value": "5 см." }
|
|
13
|
+
]}
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
"leader": "12345cam 22123454i 4500",
|
|
4
4
|
"fields": [
|
|
5
5
|
{ "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
|
|
6
|
-
{ "code": "a", "value": "Modin,
|
|
6
|
+
{ "code": "a", "value": "Modin, Juri Ivanovitš." }
|
|
7
7
|
]},
|
|
8
8
|
{ "tag": "245", "ind1": "1", "ind2": " ", "subfields": [
|
|
9
|
-
{ "code": "a", "value": "
|
|
9
|
+
{ "code": "a", "value": "Sudby razvedtšikov." }
|
|
10
10
|
]},
|
|
11
11
|
{"tag": "500", "ind1": " ", "ind2": " ", "subfields": [
|
|
12
12
|
{ "code": "6", "value": "880-01"},
|
|
@@ -5,9 +5,8 @@
|
|
|
5
5
|
{ "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
|
|
6
6
|
{ "code": "a", "value": "Sukunimi, Etunimi," },
|
|
7
7
|
{ "code": "e", "value": "kirjoittaja," },
|
|
8
|
-
{ "code": "e", "value": "
|
|
9
|
-
{ "code": "e", "value": "
|
|
10
|
-
|
|
8
|
+
{ "code": "e", "value": "valokuvaaja," },
|
|
9
|
+
{ "code": "e", "value": "kuvittaja." }
|
|
11
10
|
]}
|
|
12
11
|
],
|
|
13
12
|
"leader": ""
|
|
@@ -5,9 +5,8 @@
|
|
|
5
5
|
{ "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
|
|
6
6
|
{ "code": "a", "value": "Sukunimi, Etunimi," },
|
|
7
7
|
{ "code": "e", "value": "kirjoittaja," },
|
|
8
|
-
{ "code": "e", "value": "
|
|
9
|
-
{ "code": "e", "value": "
|
|
10
|
-
|
|
8
|
+
{ "code": "e", "value": "valokuvaaja," },
|
|
9
|
+
{ "code": "e", "value": "kuvittaja." }
|
|
11
10
|
]}
|
|
12
11
|
],
|
|
13
12
|
"leader": ""
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"description": "merge relator terms fields 100 + 700",
|
|
3
3
|
"comment": "Note that relator term sorting is used from another validator",
|
|
4
|
+
"comment #2": "kirjoittaja and valokuvaaja are work level terms, kuvittaja is expression level term, thus last",
|
|
4
5
|
"fix": true,
|
|
5
6
|
"only": false
|
|
6
7
|
}
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
{ "tag": "005", "value": "20220202020202.0" },
|
|
4
4
|
{ "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
|
|
5
5
|
{ "code": "a", "value": "Sukunimi, Etunimi," },
|
|
6
|
-
{ "code": "e", "value": "
|
|
6
|
+
{ "code": "e", "value": "valokuvaaja." }
|
|
7
7
|
]},
|
|
8
8
|
{ "tag": "700", "ind1": "1", "ind2": " ", "subfields": [
|
|
9
9
|
{ "code": "a", "value": "Sukunimi, Etunimi," },
|
|
10
|
-
{ "code": "e", "value": "
|
|
11
|
-
{ "code": "e", "value": "
|
|
10
|
+
{ "code": "e", "value": "kuvittaja," },
|
|
11
|
+
{ "code": "e", "value": "kirjoittaja." }
|
|
12
12
|
]}
|
|
13
13
|
],
|
|
14
14
|
|