@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 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 => subfieldShouldTransliterateToIso9(sf));
112
+ return field.subfields && field.subfields.some(sf => subfieldRequiresTransliteration(sf));
105
113
  }
106
- function subfieldShouldTransliterateToIso9(subfield) {
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 (!subfieldShouldTransliterateToIso9(subfield)) {
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 = subfieldShouldTransliterateToIso9(subfield) ? sfs4900.convertToLatin(subfield.value, inputLang).result : subfield.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.doSFS4900Transliteration) {
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
- const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);
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
- // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either
190
- if (!config.retainCyrillic && !config.doISO9Transliteration) {
191
- const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));
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
- const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);
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
 
@@ -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":[]}
@@ -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, https://finto.fi/mts/fi/page/m1298
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': 99,
66
- 'author': 99,
67
- 'sarjakuvantekijä': 99,
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
- 'soitonoppaan tekijä': 90,
73
- 'teoksella kunnioitettu': 81,
74
- 'gratulaation kohde': 81,
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/m1298 100-81
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': 85,
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ä': 82,
146
- // volatile
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,
@@ -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":[]}
@@ -86,38 +86,47 @@ function swapRelatorTermSubfields(field, typeOfMaterial = undefined) {
86
86
  return;
87
87
  }
88
88
  const subfieldCode = tagToRelatorTermSubfieldCode(field.tag);
89
- const loopAgain = field.subfields.some((sf, index) => {
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 (currScore === 0 || prevSubfield.code !== subfieldCode) {
119
+ if (prevSubfield.code !== subfieldCode) {
97
120
  return false;
98
121
  }
99
122
  const prevScore = (0, _sortFields.scoreRelatorTerm)(prevSubfield.value, typeOfMaterial);
100
- //console.log(`PREV: ${prevScore}, CURR: ${currScore}`); // eslint-disable-line no-console
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
- if (currScore > prevScore) {
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","loopAgain","some","sf","index","code","currScore","scoreRelatorTerm","value","prevSubfield","prevScore","tmp","fieldFixPunctuation"],"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 const loopAgain = field.subfields.some((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\n const prevSubfield = field.subfields[index - 1];\n if (currScore === 0 || prevSubfield.code !== subfieldCode) {\n return false;\n }\n const prevScore = scoreRelatorTerm(prevSubfield.value, typeOfMaterial);\n //console.log(`PREV: ${prevScore}, CURR: ${currScore}`); // eslint-disable-line no-console\n\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\n if (currScore > prevScore) {\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = sf; // 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 return false;\n\n });\n\n if (loopAgain) {\n swapRelatorTermSubfields(field, typeOfMaterial); // uh, evil recursion...\n return;\n }\n\n return;\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":[]}
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.4-alpha.1",
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": "^1.1.0",
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 => subfieldShouldTransliterateToIso9(sf));
109
+ return field.subfields && field.subfields.some(sf => subfieldRequiresTransliteration(sf));
102
110
  }
103
111
 
104
- function subfieldShouldTransliterateToIso9(subfield) {
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 (!subfieldShouldTransliterateToIso9(subfield)) {
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 = subfieldShouldTransliterateToIso9(subfield) ? sfs4900.convertToLatin(subfield.value, inputLang).result : subfield.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.doSFS4900Transliteration) {
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
- const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);
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
- // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either
179
- if (!config.retainCyrillic && !config.doISO9Transliteration) {
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
- const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);
185
- const subfield9 = fieldHasSubfield(field, '9', sfs4900Trans) ? [] : [{code: '9', value: sfs4900Trans}]; // Add only if needed
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
- //const subfield6 = newField.subfields.find(sf => sf.code === '6');
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, https://finto.fi/mts/fi/page/m1298
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': 99, 'author': 99,
57
- 'sarjakuvantekijä': 99,
58
- 'taiteilija': 98, 'kartantekijä': 98,
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, 'soitonoppaan tekijä': 90,
61
- 'teoksella kunnioitettu': 81, 'gratulaation kohde': 81,
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/m1298 100-81
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': 85,
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ä': 82, // volatile
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,
@@ -86,45 +86,51 @@ function swapRelatorTermSubfields(field, typeOfMaterial = undefined) {
86
86
 
87
87
  const subfieldCode = tagToRelatorTermSubfieldCode(field.tag);
88
88
 
89
- const loopAgain = field.subfields.some((sf, index) => {
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 (currScore === 0 || prevSubfield.code !== subfieldCode) {
122
+ if (prevSubfield.code !== subfieldCode) {
98
123
  return false;
99
124
  }
100
125
  const prevScore = scoreRelatorTerm(prevSubfield.value, typeOfMaterial);
101
- //console.log(`PREV: ${prevScore}, CURR: ${currScore}`); // eslint-disable-line no-console
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, Ûrij Ivanovič." }
6
+ { "code": "a", "value": "Modin, Juri Ivanovitš." }
7
7
  ]},
8
8
  { "tag": "245", "ind1": "1", "ind2": " ", "subfields": [
9
- { "code": "a", "value": "Sudʹby razvedčikov." }
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": "kuvittaja," },
9
- { "code": "e", "value": "valokuvaaja." }
10
-
8
+ { "code": "e", "value": "valokuvaaja," },
9
+ { "code": "e", "value": "kuvittaja." }
11
10
  ]}
12
11
  ],
13
12
  "leader": ""
@@ -1,5 +1,5 @@
1
1
  {
2
- "description": "merge relator terms fields 100 + 700",
2
+ "description": "F02: merge relator terms fields 100 + 700",
3
3
  "comment": "Note that relator term sorting is used from another validator",
4
4
  "fix": true,
5
5
  "only": false
@@ -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": "kuvittaja," },
9
- { "code": "e", "value": "valokuvaaja." }
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": "kuvittaja." }
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": "kirjoittaja," },
11
- { "code": "e", "value": "valokuvaaja." }
10
+ { "code": "e", "value": "kuvittaja," },
11
+ { "code": "e", "value": "kirjoittaja." }
12
12
  ]}
13
13
  ],
14
14