@natlibfi/marc-record-validators-melinda 11.5.0-alpha.1 → 11.5.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
@@ -166,7 +166,7 @@ function _default(config = {}) {
166
166
  function mapSubfieldToSfs4900(subfield, lang = 'rus') {
167
167
  const inputLang = lang === 'ukr' ? 'ukr' : 'rus'; // Support 'ukr' and 'rus', default to 'rus'
168
168
  const value = subfieldRequiresTransliteration(subfield) ? sfs4900.convertToLatin(subfield.value, inputLang).result : subfield.value;
169
- console.log(`VAL: ${subfield.value} => ${value} using ${lang}`); // eslint-disable-line no-console
169
+ //console.log(`VAL: ${subfield.value} => ${value} using ${lang}`); // eslint-disable-line no-console
170
170
  return {
171
171
  code: subfield.code,
172
172
  value
@@ -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","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 (!config.doSFS4900Transliteration) {\n return false;\n }\n if (!config.doISO9Transliteration && config.doSFS4900Transliteration) {\n return true;\n }\n if (typeof config.preferSFS4900 === 'undefined') {\n return false;\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":[]}
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","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 (!config.doSFS4900Transliteration) {\n return false;\n }\n if (!config.doISO9Transliteration && config.doSFS4900Transliteration) {\n return true;\n }\n if (typeof config.preferSFS4900 === 'undefined') {\n return false;\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":[]}
@@ -31,7 +31,7 @@ function isEnnakkotietoSubfieldG(subfield) {
31
31
  if (subfield.code !== 'g') {
32
32
  return false;
33
33
  }
34
- return subfield.value.match(/^ENNAKKOTIETO\.?$/gu);
34
+ return subfield.value.match(/^ENNAKKOTIETO\.?$/gui);
35
35
  }
36
36
  function debugFieldComparison(oldField, newField) {
37
37
  // NB: Debug-only function!
@@ -1 +1 @@
1
- {"version":3,"file":"normalizeFieldForComparison.js","names":["_clone","_interopRequireDefault","require","_punctuation","_utils","_normalizeIdentifiers","_debug","_normalizeSubfieldValueForComparison","e","__esModule","default","debug","createDebugLogger","debugDev","extend","isEnnakkotietoSubfieldG","subfield","code","value","match","debugFieldComparison","oldField","newField","oldString","fieldToString","newString","containsHumanName","tag","subfieldCode","undefined","includes","containsCorporateName","skipAllSubfieldNormalizations","isControlSubfieldCode","skipSubfieldLowercase","subfieldContainsPartData","skipAllFieldNormalizations","subfieldValueLowercase","newValue","toLowerCase","subfieldLowercase","sf","fieldLowercase","field","skipFieldLowercase","subfields","forEach","hack490SubfieldA","removeSarja","tmp","replace","length","tagAndSubfieldCodeReferToIsbn","looksLikeIsbn","normalizeISBN","relevantSubfields","filter","normalizeIsbnSubfield","fieldSpecificHacks","fieldTrimSubfieldValues","fieldRemoveDecomposedDiacritics","removeDecomposedDiacritics","String","normalizeSubfieldValue","normalizePartData","cloneAndRemovePunctuation","clonedField","clone","fieldSkipNormalization","fieldStripPunctuation","removeCharsThatDontCarryMeaning","normalizeField","fieldNormalizeControlNumbers","cloneAndNormalizeFieldForComparison"],"sources":["../src/normalizeFieldForComparison.js"],"sourcesContent":["/*\n Note that this file contains very powerful normalizations and spells that are:\n - meant for comparing similarity/mergability of two fields (clone, normalize, compare),\n - and NOT for modifying the actual field!\n\n This is mainly used by melinda-marc-record-merge-reducers. However, also removeInferiorDataFields fixer also used this.\n Thus it is here. However, most of the testing is done via merge-reducers...\n*/\nimport clone from 'clone';\nimport {fieldStripPunctuation} from './punctuation2';\nimport {fieldToString, isControlSubfieldCode} from './utils.js';\n\nimport {fieldNormalizeControlNumbers/*, normalizeControlSubfieldValue*/} from './normalize-identifiers';\nimport createDebugLogger from 'debug';\nimport {normalizePartData, subfieldContainsPartData} from './normalizeSubfieldValueForComparison';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:normalizeFieldForComparison');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport function isEnnakkotietoSubfieldG(subfield) {\n if (subfield.code !== 'g') {\n return false;\n }\n return subfield.value.match(/^ENNAKKOTIETO\\.?$/gu);\n}\n\nfunction debugFieldComparison(oldField, newField) { // NB: Debug-only function!\n /*\n // We may drop certain subfields:\n if (oldField.subfields.length === newField.subfields.length) { // eslint-disable-line functional/no-conditional-statements\n oldField.subfields.forEach((subfield, index) => {\n const newValue = newField.subfields[index].value;\n if (subfield.value !== newValue) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`NORMALIZE SUBFIELD: '${subfield.value}' => '${newValue}'`, debugDev);\n }\n });\n }\n */\n const oldString = fieldToString(oldField);\n const newString = fieldToString(newField);\n if (oldString === newString) {\n return;\n }\n //nvdebug(`NORMALIZE FIELD:\\n '${fieldToString(oldField)}' =>\\n '${fieldToString(newField)}'`, debugDev);\n}\n\nfunction containsHumanName(tag = '???', subfieldCode = undefined) {\n // NB! This set is for bibs! Auth has 400... What else...\n if (['100', '600', '700', '800'].includes(tag)) {\n if (subfieldCode === undefined || subfieldCode === 'a') {\n return true;\n }\n }\n // Others?\n return false;\n}\n\nfunction containsCorporateName(tag = '???', subfieldCode = undefined) {\n // NB! This set is for bibs! Auth has 400... What else...\n if (['110', '610', '710', '810'].includes(tag)) {\n if (subfieldCode === undefined || subfieldCode === 'a') {\n return true;\n }\n }\n // Others?\n return false;\n}\n\nfunction skipAllSubfieldNormalizations(value, subfieldCode, tag) {\n\n if (isEnnakkotietoSubfieldG({'code': subfieldCode, value})) {\n return true;\n }\n\n if (tag === '035' && ['a', 'z'].includes(subfieldCode)) { // A\n return true;\n }\n\n if (isControlSubfieldCode(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nfunction skipSubfieldLowercase(value, subfieldCode, tag) {\n // These may contain Roman Numerals...\n if (subfieldContainsPartData(tag, subfieldCode)) {\n return true;\n }\n\n return skipAllSubfieldNormalizations(value, subfieldCode, tag);\n}\n\nfunction skipAllFieldNormalizations(tag) {\n if (['LOW', 'SID'].includes(tag)) {\n return true;\n }\n return false;\n}\n\n\nfunction subfieldValueLowercase(value, subfieldCode, tag) {\n if (skipSubfieldLowercase(value, subfieldCode, tag)) {\n return value;\n }\n\n //return value.toLowerCase();\n const newValue = value.toLowerCase();\n if (newValue !== value) {\n //nvdebug(`SVL ${tag} $${subfieldCode} '${value}' =>`, debugDev);\n //nvdebug(`SVL ${tag} $${subfieldCode} '${newValue}'`, debugDev);\n return newValue;\n }\n return value;\n}\n\nfunction subfieldLowercase(sf, tag) {\n sf.value = subfieldValueLowercase(sf.value, sf.code, tag); // eslint-disable-line functional/immutable-data\n}\n\nfunction fieldLowercase(field) {\n if (skipFieldLowercase(field)) {\n return;\n }\n\n field.subfields.forEach(sf => subfieldLowercase(sf, field.tag));\n\n function skipFieldLowercase(field) {\n if (skipAllFieldNormalizations(field.tag)) {\n return true;\n }\n // Skip non-interesting fields\n if (!containsHumanName(field.tag) && !containsCorporateName(field.tag) && !['240', '245', '630'].includes(field.tag)) {\n return true;\n }\n\n return false;\n }\n}\n\n\nfunction hack490SubfieldA(field) {\n if (field.tag !== '490') {\n return;\n }\n field.subfields.forEach(sf => removeSarja(sf));\n\n // NB! This won't work, if the punctuation has not been stripped beforehand!\n function removeSarja(subfield) {\n if (subfield.code !== 'a') {\n return;\n }\n const tmp = subfield.value.replace(/ ?-(?:[a-z]|ä|ö)*sarja$/u, '');\n if (tmp.length > 0) {\n subfield.value = tmp; // eslint-disable-line functional/immutable-data\n return;\n }\n }\n}\n\nexport function tagAndSubfieldCodeReferToIsbn(tag, subfieldCode) {\n // NB! We don't do this to 020$z!\n if (subfieldCode === 'z' && ['765', '767', '770', '772', '773', '774', '776', '777', '780', '785', '786', '787'].includes(tag)) {\n return true;\n }\n if (tag === '020' && subfieldCode === 'a') {\n return true;\n }\n return false;\n}\n\nfunction looksLikeIsbn(value) {\n // Does not check validity!\n if (value.match(/^(?:[0-9]-?){9}(?:[0-9]-?[0-9]-?[0-9]-?)?[0-9Xx]$/u)) {\n return true;\n }\n return false;\n}\n\nfunction normalizeISBN(field) {\n if (!field.subfields) {\n return;\n }\n\n //nvdebug(`ISBN-field? ${fieldToString(field)}`);\n const relevantSubfields = field.subfields.filter(sf => tagAndSubfieldCodeReferToIsbn(field.tag, sf.code) && looksLikeIsbn(sf.value));\n relevantSubfields.forEach(sf => normalizeIsbnSubfield(sf));\n\n function normalizeIsbnSubfield(sf) {\n //nvdebug(` ISBN-subfield? ${subfieldToString(sf)}`);\n sf.value = sf.value.replace(/-/ug, ''); // eslint-disable-line functional/immutable-data\n sf.value = sf.value.replace(/x/u, 'X'); // eslint-disable-line functional/immutable-data\n }\n\n}\n\nfunction fieldSpecificHacks(field) {\n normalizeISBN(field); // 020$a, not $z!\n hack490SubfieldA(field);\n}\n\nexport function fieldTrimSubfieldValues(field) {\n field.subfields?.forEach((sf) => {\n sf.value = sf.value.replace(/^[ \\t\\n]+/u, ''); // eslint-disable-line functional/immutable-data\n sf.value = sf.value.replace(/[ \\t\\n]+$/u, ''); // eslint-disable-line functional/immutable-data\n sf.value = sf.value.replace(/[ \\t\\n]+/gu, ' '); // eslint-disable-line functional/immutable-data\n });\n}\n\nfunction fieldRemoveDecomposedDiacritics(field) {\n // Raison d'être/motivation: \"Sirén\" and diacriticless \"Siren\" might refer to a same surname, so this normalization\n // allows us to compare authors and avoid duplicate fields.\n field.subfields.forEach((sf) => {\n sf.value = removeDecomposedDiacritics(sf.value); // eslint-disable-line functional/immutable-data\n });\n}\n\nfunction removeDecomposedDiacritics(value = '') {\n // NB #1: Does nothing to precomposed letters. Do String.normalize('NFD') first, if you want to handle them.\n // NB #2: Finnish letters 'å', 'ä', 'ö', 'Å', Ä', and 'Ö' should be handled (=precomposed) before calling this. (= keep them as is)\n // NB #3: Calling our very own fixComposition() before this function handles both #1 and #2.\n return String(value).replace(/\\p{Diacritic}/gu, '');\n}\n\nfunction normalizeSubfieldValue(value, subfieldCode, tag) {\n // NB! For comparison of values only\n /* eslint-disable */\n value = subfieldValueLowercase(value, subfieldCode, tag);\n\n // Normalize: s. = sivut = pp.\n value = normalizePartData(value, subfieldCode, tag);\n value = value.replace(/^\\[([^[\\]]+)\\]/gu, '$1'); // eslint-disable-line functional/immutable-data, prefer-named-capture-group\n\n if (['130', '730'].includes(tag) && subfieldCode === 'a') {\n value = value.replace(' : ', ', '); // \"Halloween ends (elokuva, 2022)\" vs \"Halloween ends (elokuva : 2023)\"\n }\n /* eslint-enable */\n\n // Not going to do these in the foreseeable future, but keeping them here for discussion:\n // Possible normalizations include but are not limited to:\n // ø => ö? Might be language dependent: 041 $a fin => ö, 041 $a eng => o?\n // Ø => Ö?\n // ß => ss\n // þ => th (NB! Both upper and lower case)\n // ...\n // Probably nots:\n // ü => y (probably not, though this correlates with Finnish letter-to-sound rules)\n // w => v (OK for Finnish sorting in certain cases, but we are not here, are we?)\n // I guess we should use decomposed values in code here. (Not sure what composition my examples above use.)\n return value;\n}\n\nexport function cloneAndRemovePunctuation(field) {\n const clonedField = clone(field);\n if (fieldSkipNormalization(field)) {\n return clonedField;\n }\n fieldStripPunctuation(clonedField);\n fieldTrimSubfieldValues(clonedField);\n debugDev('PUNC');\n debugFieldComparison(field, clonedField);\n\n return clonedField;\n}\n\nfunction removeCharsThatDontCarryMeaning(value, tag, subfieldCode) {\n if (tag === '080') {\n return value;\n }\n /* eslint-disable */\n // 3\" refers to inches, but as this is for comparison only we don't mind...\n value = value.replace(/['‘’\"„“”«»]/gu, ''); // MET-570 et al. Subset of https://hexdocs.pm/ex_unicode/Unicode.Category.QuoteMarks.html\n // MRA-273: Handle X00$a name initials.\n // NB #1: that we remove spaces for comparison (as it simpler), though actually space should be used. Doesn't matter as this is comparison only.\n // NB #2: we might/should eventually write a validator/fixer that adds those spaces. After that point, this expection should become obsolete.\n if (subfieldCode === 'a' && ['100', '400', '600', '700', '800'].includes(tag)) { // 400 is used in auth records. It's not a bib field at all.\n value = value.replace(/([A-Z]|Å|Ä|Ö)\\. +/ugi, '$1.');\n }\n /* eslint-enable */\n return value;\n}\n\nfunction normalizeField(field) {\n //sf.value = removeDecomposedDiacritics(sf.value); // eslint-disable-line functional/immutable-data\n fieldStripPunctuation(field);\n fieldLowercase(field);\n fieldNormalizeControlNumbers(field); // FIN11 vs FI-MELINDA etc.\n return field;\n}\n\nexport function cloneAndNormalizeFieldForComparison(field) {\n // NB! This new field is for comparison purposes only.\n // Some of the normalizations might be considered a bit overkill for other purposes.\n const clonedField = clone(field);\n if (fieldSkipNormalization(field)) {\n return clonedField;\n }\n clonedField.subfields.forEach((sf) => { // Do this for all fields or some fields?\n sf.value = normalizeSubfieldValue(sf.value, sf.code, field.tag); // eslint-disable-line functional/immutable-data\n sf.value = removeCharsThatDontCarryMeaning(sf.value, field.tag, sf.code);// eslint-disable-line functional/immutable-data\n });\n\n normalizeField(clonedField); // eslint-disable-line functional/immutable-data\n fieldRemoveDecomposedDiacritics(clonedField);\n fieldSpecificHacks(clonedField);\n fieldTrimSubfieldValues(clonedField);\n\n\n debugFieldComparison(field, clonedField); // For debugging purposes only\n\n return clonedField;\n}\n\nfunction fieldSkipNormalization(field) {\n if (!field.subfields || ['018', '066', '080', '083'].includes(field.tag)) {\n return true;\n }\n return false;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"normalizeFieldForComparison.js","names":["_clone","_interopRequireDefault","require","_punctuation","_utils","_normalizeIdentifiers","_debug","_normalizeSubfieldValueForComparison","e","__esModule","default","debug","createDebugLogger","debugDev","extend","isEnnakkotietoSubfieldG","subfield","code","value","match","debugFieldComparison","oldField","newField","oldString","fieldToString","newString","containsHumanName","tag","subfieldCode","undefined","includes","containsCorporateName","skipAllSubfieldNormalizations","isControlSubfieldCode","skipSubfieldLowercase","subfieldContainsPartData","skipAllFieldNormalizations","subfieldValueLowercase","newValue","toLowerCase","subfieldLowercase","sf","fieldLowercase","field","skipFieldLowercase","subfields","forEach","hack490SubfieldA","removeSarja","tmp","replace","length","tagAndSubfieldCodeReferToIsbn","looksLikeIsbn","normalizeISBN","relevantSubfields","filter","normalizeIsbnSubfield","fieldSpecificHacks","fieldTrimSubfieldValues","fieldRemoveDecomposedDiacritics","removeDecomposedDiacritics","String","normalizeSubfieldValue","normalizePartData","cloneAndRemovePunctuation","clonedField","clone","fieldSkipNormalization","fieldStripPunctuation","removeCharsThatDontCarryMeaning","normalizeField","fieldNormalizeControlNumbers","cloneAndNormalizeFieldForComparison"],"sources":["../src/normalizeFieldForComparison.js"],"sourcesContent":["/*\n Note that this file contains very powerful normalizations and spells that are:\n - meant for comparing similarity/mergability of two fields (clone, normalize, compare),\n - and NOT for modifying the actual field!\n\n This is mainly used by melinda-marc-record-merge-reducers. However, also removeInferiorDataFields fixer also used this.\n Thus it is here. However, most of the testing is done via merge-reducers...\n*/\nimport clone from 'clone';\nimport {fieldStripPunctuation} from './punctuation2';\nimport {fieldToString, isControlSubfieldCode} from './utils.js';\n\nimport {fieldNormalizeControlNumbers/*, normalizeControlSubfieldValue*/} from './normalize-identifiers';\nimport createDebugLogger from 'debug';\nimport {normalizePartData, subfieldContainsPartData} from './normalizeSubfieldValueForComparison';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:normalizeFieldForComparison');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport function isEnnakkotietoSubfieldG(subfield) {\n if (subfield.code !== 'g') {\n return false;\n }\n return subfield.value.match(/^ENNAKKOTIETO\\.?$/gui);\n}\n\nfunction debugFieldComparison(oldField, newField) { // NB: Debug-only function!\n /*\n // We may drop certain subfields:\n if (oldField.subfields.length === newField.subfields.length) { // eslint-disable-line functional/no-conditional-statements\n oldField.subfields.forEach((subfield, index) => {\n const newValue = newField.subfields[index].value;\n if (subfield.value !== newValue) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`NORMALIZE SUBFIELD: '${subfield.value}' => '${newValue}'`, debugDev);\n }\n });\n }\n */\n const oldString = fieldToString(oldField);\n const newString = fieldToString(newField);\n if (oldString === newString) {\n return;\n }\n //nvdebug(`NORMALIZE FIELD:\\n '${fieldToString(oldField)}' =>\\n '${fieldToString(newField)}'`, debugDev);\n}\n\nfunction containsHumanName(tag = '???', subfieldCode = undefined) {\n // NB! This set is for bibs! Auth has 400... What else...\n if (['100', '600', '700', '800'].includes(tag)) {\n if (subfieldCode === undefined || subfieldCode === 'a') {\n return true;\n }\n }\n // Others?\n return false;\n}\n\nfunction containsCorporateName(tag = '???', subfieldCode = undefined) {\n // NB! This set is for bibs! Auth has 400... What else...\n if (['110', '610', '710', '810'].includes(tag)) {\n if (subfieldCode === undefined || subfieldCode === 'a') {\n return true;\n }\n }\n // Others?\n return false;\n}\n\nfunction skipAllSubfieldNormalizations(value, subfieldCode, tag) {\n\n if (isEnnakkotietoSubfieldG({'code': subfieldCode, value})) {\n return true;\n }\n\n if (tag === '035' && ['a', 'z'].includes(subfieldCode)) { // A\n return true;\n }\n\n if (isControlSubfieldCode(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nfunction skipSubfieldLowercase(value, subfieldCode, tag) {\n // These may contain Roman Numerals...\n if (subfieldContainsPartData(tag, subfieldCode)) {\n return true;\n }\n\n return skipAllSubfieldNormalizations(value, subfieldCode, tag);\n}\n\nfunction skipAllFieldNormalizations(tag) {\n if (['LOW', 'SID'].includes(tag)) {\n return true;\n }\n return false;\n}\n\n\nfunction subfieldValueLowercase(value, subfieldCode, tag) {\n if (skipSubfieldLowercase(value, subfieldCode, tag)) {\n return value;\n }\n\n //return value.toLowerCase();\n const newValue = value.toLowerCase();\n if (newValue !== value) {\n //nvdebug(`SVL ${tag} $${subfieldCode} '${value}' =>`, debugDev);\n //nvdebug(`SVL ${tag} $${subfieldCode} '${newValue}'`, debugDev);\n return newValue;\n }\n return value;\n}\n\nfunction subfieldLowercase(sf, tag) {\n sf.value = subfieldValueLowercase(sf.value, sf.code, tag); // eslint-disable-line functional/immutable-data\n}\n\nfunction fieldLowercase(field) {\n if (skipFieldLowercase(field)) {\n return;\n }\n\n field.subfields.forEach(sf => subfieldLowercase(sf, field.tag));\n\n function skipFieldLowercase(field) {\n if (skipAllFieldNormalizations(field.tag)) {\n return true;\n }\n // Skip non-interesting fields\n if (!containsHumanName(field.tag) && !containsCorporateName(field.tag) && !['240', '245', '630'].includes(field.tag)) {\n return true;\n }\n\n return false;\n }\n}\n\n\nfunction hack490SubfieldA(field) {\n if (field.tag !== '490') {\n return;\n }\n field.subfields.forEach(sf => removeSarja(sf));\n\n // NB! This won't work, if the punctuation has not been stripped beforehand!\n function removeSarja(subfield) {\n if (subfield.code !== 'a') {\n return;\n }\n const tmp = subfield.value.replace(/ ?-(?:[a-z]|ä|ö)*sarja$/u, '');\n if (tmp.length > 0) {\n subfield.value = tmp; // eslint-disable-line functional/immutable-data\n return;\n }\n }\n}\n\nexport function tagAndSubfieldCodeReferToIsbn(tag, subfieldCode) {\n // NB! We don't do this to 020$z!\n if (subfieldCode === 'z' && ['765', '767', '770', '772', '773', '774', '776', '777', '780', '785', '786', '787'].includes(tag)) {\n return true;\n }\n if (tag === '020' && subfieldCode === 'a') {\n return true;\n }\n return false;\n}\n\nfunction looksLikeIsbn(value) {\n // Does not check validity!\n if (value.match(/^(?:[0-9]-?){9}(?:[0-9]-?[0-9]-?[0-9]-?)?[0-9Xx]$/u)) {\n return true;\n }\n return false;\n}\n\nfunction normalizeISBN(field) {\n if (!field.subfields) {\n return;\n }\n\n //nvdebug(`ISBN-field? ${fieldToString(field)}`);\n const relevantSubfields = field.subfields.filter(sf => tagAndSubfieldCodeReferToIsbn(field.tag, sf.code) && looksLikeIsbn(sf.value));\n relevantSubfields.forEach(sf => normalizeIsbnSubfield(sf));\n\n function normalizeIsbnSubfield(sf) {\n //nvdebug(` ISBN-subfield? ${subfieldToString(sf)}`);\n sf.value = sf.value.replace(/-/ug, ''); // eslint-disable-line functional/immutable-data\n sf.value = sf.value.replace(/x/u, 'X'); // eslint-disable-line functional/immutable-data\n }\n\n}\n\nfunction fieldSpecificHacks(field) {\n normalizeISBN(field); // 020$a, not $z!\n hack490SubfieldA(field);\n}\n\nexport function fieldTrimSubfieldValues(field) {\n field.subfields?.forEach((sf) => {\n sf.value = sf.value.replace(/^[ \\t\\n]+/u, ''); // eslint-disable-line functional/immutable-data\n sf.value = sf.value.replace(/[ \\t\\n]+$/u, ''); // eslint-disable-line functional/immutable-data\n sf.value = sf.value.replace(/[ \\t\\n]+/gu, ' '); // eslint-disable-line functional/immutable-data\n });\n}\n\nfunction fieldRemoveDecomposedDiacritics(field) {\n // Raison d'être/motivation: \"Sirén\" and diacriticless \"Siren\" might refer to a same surname, so this normalization\n // allows us to compare authors and avoid duplicate fields.\n field.subfields.forEach((sf) => {\n sf.value = removeDecomposedDiacritics(sf.value); // eslint-disable-line functional/immutable-data\n });\n}\n\nfunction removeDecomposedDiacritics(value = '') {\n // NB #1: Does nothing to precomposed letters. Do String.normalize('NFD') first, if you want to handle them.\n // NB #2: Finnish letters 'å', 'ä', 'ö', 'Å', Ä', and 'Ö' should be handled (=precomposed) before calling this. (= keep them as is)\n // NB #3: Calling our very own fixComposition() before this function handles both #1 and #2.\n return String(value).replace(/\\p{Diacritic}/gu, '');\n}\n\nfunction normalizeSubfieldValue(value, subfieldCode, tag) {\n // NB! For comparison of values only\n /* eslint-disable */\n value = subfieldValueLowercase(value, subfieldCode, tag);\n\n // Normalize: s. = sivut = pp.\n value = normalizePartData(value, subfieldCode, tag);\n value = value.replace(/^\\[([^[\\]]+)\\]/gu, '$1'); // eslint-disable-line functional/immutable-data, prefer-named-capture-group\n\n if (['130', '730'].includes(tag) && subfieldCode === 'a') {\n value = value.replace(' : ', ', '); // \"Halloween ends (elokuva, 2022)\" vs \"Halloween ends (elokuva : 2023)\"\n }\n /* eslint-enable */\n\n // Not going to do these in the foreseeable future, but keeping them here for discussion:\n // Possible normalizations include but are not limited to:\n // ø => ö? Might be language dependent: 041 $a fin => ö, 041 $a eng => o?\n // Ø => Ö?\n // ß => ss\n // þ => th (NB! Both upper and lower case)\n // ...\n // Probably nots:\n // ü => y (probably not, though this correlates with Finnish letter-to-sound rules)\n // w => v (OK for Finnish sorting in certain cases, but we are not here, are we?)\n // I guess we should use decomposed values in code here. (Not sure what composition my examples above use.)\n return value;\n}\n\nexport function cloneAndRemovePunctuation(field) {\n const clonedField = clone(field);\n if (fieldSkipNormalization(field)) {\n return clonedField;\n }\n fieldStripPunctuation(clonedField);\n fieldTrimSubfieldValues(clonedField);\n debugDev('PUNC');\n debugFieldComparison(field, clonedField);\n\n return clonedField;\n}\n\nfunction removeCharsThatDontCarryMeaning(value, tag, subfieldCode) {\n if (tag === '080') {\n return value;\n }\n /* eslint-disable */\n // 3\" refers to inches, but as this is for comparison only we don't mind...\n value = value.replace(/['‘’\"„“”«»]/gu, ''); // MET-570 et al. Subset of https://hexdocs.pm/ex_unicode/Unicode.Category.QuoteMarks.html\n // MRA-273: Handle X00$a name initials.\n // NB #1: that we remove spaces for comparison (as it simpler), though actually space should be used. Doesn't matter as this is comparison only.\n // NB #2: we might/should eventually write a validator/fixer that adds those spaces. After that point, this expection should become obsolete.\n if (subfieldCode === 'a' && ['100', '400', '600', '700', '800'].includes(tag)) { // 400 is used in auth records. It's not a bib field at all.\n value = value.replace(/([A-Z]|Å|Ä|Ö)\\. +/ugi, '$1.');\n }\n /* eslint-enable */\n return value;\n}\n\nfunction normalizeField(field) {\n //sf.value = removeDecomposedDiacritics(sf.value); // eslint-disable-line functional/immutable-data\n fieldStripPunctuation(field);\n fieldLowercase(field);\n fieldNormalizeControlNumbers(field); // FIN11 vs FI-MELINDA etc.\n return field;\n}\n\nexport function cloneAndNormalizeFieldForComparison(field) {\n // NB! This new field is for comparison purposes only.\n // Some of the normalizations might be considered a bit overkill for other purposes.\n const clonedField = clone(field);\n if (fieldSkipNormalization(field)) {\n return clonedField;\n }\n clonedField.subfields.forEach((sf) => { // Do this for all fields or some fields?\n sf.value = normalizeSubfieldValue(sf.value, sf.code, field.tag); // eslint-disable-line functional/immutable-data\n sf.value = removeCharsThatDontCarryMeaning(sf.value, field.tag, sf.code);// eslint-disable-line functional/immutable-data\n });\n\n normalizeField(clonedField); // eslint-disable-line functional/immutable-data\n fieldRemoveDecomposedDiacritics(clonedField);\n fieldSpecificHacks(clonedField);\n fieldTrimSubfieldValues(clonedField);\n\n\n debugFieldComparison(field, clonedField); // For debugging purposes only\n\n return clonedField;\n}\n\nfunction fieldSkipNormalization(field) {\n if (!field.subfields || ['018', '066', '080', '083'].includes(field.tag)) {\n return true;\n }\n return false;\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.5.0-alpha.1",
17
+ "version": "11.5.1",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"
package/src/cyrillux.js CHANGED
@@ -166,7 +166,7 @@ export default function (config = {}) {
166
166
  function mapSubfieldToSfs4900(subfield, lang = 'rus') {
167
167
  const inputLang = lang === 'ukr' ? 'ukr' : 'rus'; // Support 'ukr' and 'rus', default to 'rus'
168
168
  const value = subfieldRequiresTransliteration(subfield) ? sfs4900.convertToLatin(subfield.value, inputLang).result : subfield.value;
169
- console.log(`VAL: ${subfield.value} => ${value} using ${lang}`); // eslint-disable-line no-console
169
+ //console.log(`VAL: ${subfield.value} => ${value} using ${lang}`); // eslint-disable-line no-console
170
170
  return {code: subfield.code, value};
171
171
  }
172
172
 
@@ -22,7 +22,7 @@ export function isEnnakkotietoSubfieldG(subfield) {
22
22
  if (subfield.code !== 'g') {
23
23
  return false;
24
24
  }
25
- return subfield.value.match(/^ENNAKKOTIETO\.?$/gu);
25
+ return subfield.value.match(/^ENNAKKOTIETO\.?$/gui);
26
26
  }
27
27
 
28
28
  function debugFieldComparison(oldField, newField) { // NB: Debug-only function!
@@ -9,7 +9,7 @@
9
9
  {"code": "2", "value": "rdamedia"}
10
10
  ]},
11
11
  { "tag": "490", "ind1": " ", "ind2": " ", "subfields": [
12
- {"code": "a", "value": "Sisu"},
12
+ {"code": "a", "value": "Sisu,"},
13
13
  {"code": "x", "value": "1797-7746"}
14
14
  ]}
15
15
  ]
@@ -9,7 +9,7 @@
9
9
  {"code": "2", "value": "rdamedia"}
10
10
  ]},
11
11
  { "tag": "490", "ind1": " ", "ind2": " ", "subfields": [
12
- {"code": "a", "value": "Sisu"},
12
+ {"code": "a", "value": "Sisu,"},
13
13
  {"code": "x", "value": "1797-5905"}
14
14
  ]}
15
15
  ]
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "description": "Fixer 05: (f02-ish with proper punctuation): remove 490$x eletronic ISSN as record is printed",
3
- "only": true,
3
+ "only": false,
4
4
  "fix": true
5
5
  }