@natlibfi/marc-record-validators-melinda 12.0.5 → 12.0.6-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
@@ -94,6 +94,9 @@ export default function(config = {}) {
94
94
  return containsCyrillicCharacters(subfield.value);
95
95
  }
96
96
  function tagCanBeTransliterated(tag) {
97
+ if (config.tagPattern && !tag.match(config.tagPattern)) {
98
+ return false;
99
+ }
97
100
  return !["336", "337", "338", "880"].includes(tag);
98
101
  }
99
102
  function fieldCanBeTransliterated(field) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/cyrillux.js"],
4
- "sourcesContent": ["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport XRegExp from 'xregexp';\nimport * as iso9 from '@natlibfi/iso9-1995';\nimport * as sfs4900 from '@natlibfi/sfs-4900';\nimport {fieldHasSubfield, fieldToString, fieldsToString, isControlSubfieldCode, nvdebug} from './utils.js';\nimport {fieldGetMaxSubfield6OccurrenceNumberAsInteger, fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag} from './subfield6Utils.js';\nimport {default as sortFields} from './sortFields.js';\nimport {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers.js';\nimport {fieldStripPunctuation} from './punctuation2.js';\nimport {getLanguageCode} from './addMissingField041.js';\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;\n config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration;\n config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration;\n config.preferSFS4900 = setPreference();\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);\n\n if (nBefore < record.fields.length) {\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);\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(/ (\u20216 [0-9][0-9][0-9])-[0-9][0-9]+/gu, ' $1-NN');\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`CHANGE: ${orig} => ${mod}`);\n return;\n }\n return;\n }\n\n function isCyrillicCharacter(char) {\n return XRegExp('[\\\\p{Cyrillic}]').test(char);\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\n const conversionResult = iso9.convertToLatin(subfield.value);\n\n return {code: subfield.code, value: conversionResult.result};\n }\n\n function mapSubfieldToSfs4900(subfield, lang = 'rus') {\n const inputLang = lang === 'ukr' ? 'ukr' : 'rus'; // Support 'ukr' and 'rus', default to 'rus'\n if (!subfieldRequiresTransliteration(subfield)) {\n return {code: subfield.code, value: subfield.value};\n }\n const conversionResult = sfs4900.convertToLatin(subfield.value, inputLang);\n\n console.log(JSON.stringify(conversionResult));\n const result = conversionResult.result;\n console.log(JSON.stringify(result));\n //console.log(`VAL: ${subfield.value} => ${value} using ${lang}`); // eslint-disable-line no-console\n return {code: subfield.code, value: result};\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';\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;\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== '9' || sf.value !== sfs4900Trans);\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;\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"],
5
- "mappings": "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",
4
+ "sourcesContent": ["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport XRegExp from 'xregexp';\nimport * as iso9 from '@natlibfi/iso9-1995';\nimport * as sfs4900 from '@natlibfi/sfs-4900';\nimport {fieldHasSubfield, fieldToString, fieldsToString, isControlSubfieldCode, nvdebug} from './utils.js';\nimport {fieldGetMaxSubfield6OccurrenceNumberAsInteger, fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag} from './subfield6Utils.js';\nimport {default as sortFields} from './sortFields.js';\nimport {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers.js';\nimport {fieldStripPunctuation} from './punctuation2.js';\nimport {getLanguageCode} from './addMissingField041.js';\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;\n config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration;\n config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration;\n config.preferSFS4900 = setPreference();\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);\n\n if (nBefore < record.fields.length) {\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);\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(/ (\u20216 [0-9][0-9][0-9])-[0-9][0-9]+/gu, ' $1-NN');\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`CHANGE: ${orig} => ${mod}`);\n return;\n }\n return;\n }\n\n function isCyrillicCharacter(char) {\n return XRegExp('[\\\\p{Cyrillic}]').test(char);\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 // Use this to filter out \"(0..)\" etc\n if (config.tagPattern && !tag.match(config.tagPattern)) {\n return false;\n }\n // These are hard-coded, and will fail anyway:\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\n const conversionResult = iso9.convertToLatin(subfield.value);\n\n return {code: subfield.code, value: conversionResult.result};\n }\n\n function mapSubfieldToSfs4900(subfield, lang = 'rus') {\n const inputLang = lang === 'ukr' ? 'ukr' : 'rus'; // Support 'ukr' and 'rus', default to 'rus'\n if (!subfieldRequiresTransliteration(subfield)) {\n return {code: subfield.code, value: subfield.value};\n }\n const conversionResult = sfs4900.convertToLatin(subfield.value, inputLang);\n\n console.log(JSON.stringify(conversionResult));\n const result = conversionResult.result;\n console.log(JSON.stringify(result));\n //console.log(`VAL: ${subfield.value} => ${value} using ${lang}`); // eslint-disable-line no-console\n return {code: subfield.code, value: result};\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';\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;\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== '9' || sf.value !== sfs4900Trans);\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;\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"],
5
+ "mappings": "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",
6
6
  "names": ["iso9"]
7
7
  }
package/dist/index.js CHANGED
@@ -65,12 +65,14 @@ import { mergeField } from "./merge-fields/mergeField.js";
65
65
  import {
66
66
  fieldGetOccurrenceNumberPairs,
67
67
  fieldGetUnambiguousOccurrenceNumber,
68
+ fieldHasValidSubfield6,
68
69
  fieldToNormalizedString,
69
70
  fieldsToNormalizedString,
70
71
  get6s,
72
+ isSubfield6Pair,
71
73
  isValidSubfield6,
72
- recordGetMaxSubfield6OccurrenceNumberAsInteger,
73
74
  intToOccurrenceNumberString,
75
+ recordGetMaxSubfield6OccurrenceNumberAsInteger,
74
76
  resetSubfield6Tag,
75
77
  subfield6ResetOccurrenceNumber,
76
78
  subfield6GetOccurrenceNumber,
@@ -86,7 +88,7 @@ import { removeWorsePrepubField500s, removeWorsePrepubField594s } from "./prepub
86
88
  import { fieldFixPunctuation } from "./punctuation2.js";
87
89
  import { recordResetSubfield6OccurrenceNumbers } from "./reindexSubfield6OccurenceNumbers.js";
88
90
  import { sortAdjacentSubfields } from "./sortSubfields.js";
89
- import { fieldsToString } from "./utils.js";
91
+ import { fieldHasSubfield, fieldToString, fieldsToString } from "./utils.js";
90
92
  export {
91
93
  AccessRights,
92
94
  AddMissingField041,
@@ -152,7 +154,9 @@ export {
152
154
  getEncodingLevel,
153
155
  cloneAndRemovePunctuation,
154
156
  fieldFixPunctuation,
157
+ fieldHasSubfield,
155
158
  fieldToNormalizedString,
159
+ fieldToString,
156
160
  fieldTrimSubfieldValues,
157
161
  fieldsToNormalizedString,
158
162
  fieldsToString,
@@ -168,7 +172,9 @@ export {
168
172
  fieldGetOccurrenceNumberPairs,
169
173
  get6s,
170
174
  fieldGetUnambiguousOccurrenceNumber,
175
+ fieldHasValidSubfield6,
171
176
  intToOccurrenceNumberString,
177
+ isSubfield6Pair,
172
178
  isValidSubfield6,
173
179
  recordGetMaxSubfield6OccurrenceNumberAsInteger,
174
180
  recordResetSubfield6OccurrenceNumbers,
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.js"],
4
- "sourcesContent": ["import AccessRights from './access-rights.js';\nimport AddMissingField041 from './addMissingField041.js';\nimport AddMissingField336 from './addMissingField336.js';\nimport AddMissingField337 from './addMissingField337.js';\nimport AddMissingField338 from './addMissingField338.js';\nimport Cyrillux from './cyrillux.js';\nimport CyrilluxUsemarconReplacement from './cyrillux-usemarcon-replacement.js';\nimport DisambiguateSeriesStatements from './disambiguateSeriesStatements.js';\nimport DoubleCommas from './double-commas.js';\nimport DuplicatesInd1 from './duplicates-ind1.js';\nimport EmptyFields from './empty-fields.js';\nimport EndingPunctuation from './ending-punctuation.js';\nimport EndingWhitespace from './ending-whitespace.js';\nimport Field008CharacterGroups from './field-008-18-34-character-groups.js';\nimport Field505Separators from './field-505-separators.js';\nimport Field521Fix from './field-521-fix.js';\nimport FieldExclusion from './field-exclusion.js';\nimport FieldStructure from './field-structure.js';\nimport FieldsPresent from './fields-present.js';\nimport Fix33X from './fix-33X.js';\nimport FixCountryCodes from './fix-country-codes.js';\nimport FixLanguageCodes from './fix-language-codes.js';\nimport FixRelatorTerms from './fixRelatorTerms.js';\nimport FixSami041 from './fix-sami-041.js';\nimport FixedFields from './fixed-fields.js';\nimport IdenticalFields from './identical-fields.js';\nimport IndicatorFixes from './indicator-fixes.js';\nimport IsbnIssn from './isbn-issn.js';\nimport ItemLanguage from './item-language.js';\nimport MergeField500Lisapainokset from './mergeField500Lisapainokset.js';\nimport MergeFields from './merge-fields/index.js';\nimport MergeRelatorTermFields from './mergeRelatorTermFields.js';\nimport Modernize502 from './modernize-502.js';\nimport MultipleSubfield0s from './multiple-subfield-0.js';\nimport NonBreakingSpace from './non-breaking-space.js';\nimport NormalizeDashes from './normalize-dashes.js';\nimport NormalizeIdentifiers from './normalize-identifiers.js';\nimport NormalizeQualifyingInformation from './normalize-qualifying-information.js';\nimport NormalizeUTF8Diacritics from './normalize-utf8-diacritics.js';\nimport Punctuation from './punctuation/index.js';\nimport Punctuation2 from './punctuation2.js';\nimport ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers.js';\nimport Remove041zxx from './remove-041-zxx.js';\nimport RemoveDuplicateDataFields from './removeDuplicateDataFields.js';\nimport RemoveInferiorDataFields from './removeInferiorDataFields.js';\nimport ResolvableExtReferences from './resolvable-ext-references-melinda.js';\nimport ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s.js';\nimport SanitizeVocabularySourceCodes from './sanitize-vocabulary-source-codes.js';\nimport SortFields from './sortFields.js';\nimport SortRelatorTerms from './sortRelatorTerms.js';\nimport SortSubfields from './sortSubfields.js';\nimport SortTags from './sort-tags.js';\n// import StripPunctuation from './stripPunctuation'; // Can we add this here? Should be used very cautiosly!\nimport SubfieldValueNormalizations from './subfieldValueNormalizations.js';\nimport SubfieldExclusion from './subfield-exclusion.js';\nimport Sync007And300 from './sync-007-and-300.js';\nimport SyncLanguage from './sync-language.js';\nimport TranslateTerms from './translate-terms.js';\nimport TypeOfDateF008 from './typeOfDate-008.js';\nimport UnicodeDecomposition from './unicode-decomposition.js';\nimport UpdateField540 from './update-field-540.js';\nimport Urn from './urn.js';\n\nimport {getCounterpart} from './merge-fields/counterpartField.js';\n\nimport {postprocessRecords} from './merge-fields/mergeOrAddPostprocess.js';\nimport {mergeField} from './merge-fields/mergeField.js';\nimport {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fieldToNormalizedString, fieldsToNormalizedString, get6s,\n isValidSubfield6, recordGetMaxSubfield6OccurrenceNumberAsInteger,\n intToOccurrenceNumberString, resetSubfield6Tag, subfield6ResetOccurrenceNumber, subfield6GetOccurrenceNumber,\n subfield6GetOccurrenceNumberAsInteger} from './subfield6Utils.js';\n\nimport {getSubfield8LinkingNumber, isValidSubfield8, recordGetAllSubfield8LinkingNumbers, recordGetFieldsWithSubfield8LinkingNumber} from './subfield8Utils.js';\n\nimport {recordFixRelatorTerms} from './fixRelatorTerms.js';\nimport {fieldTrimSubfieldValues} from './normalizeFieldForComparison.js';\nimport {baseHasEqualOrHigherEncodingLevel, deleteAllPrepublicationNotesFromField500InNonPubRecord, encodingLevelIsBetterThanPrepublication, getEncodingLevel, isEnnakkotietoField, isEnnakkotietoSubfield} from './prepublicationUtils.js';\nimport {melindaFieldSpecs} from './melindaCustomMergeFields.js';\n\nimport {cloneAndRemovePunctuation} from './normalizeFieldForComparison.js';\nimport {removeWorsePrepubField500s, removeWorsePrepubField594s} from './prepublicationUtils.js';\nimport {fieldFixPunctuation} from './punctuation2.js';\nimport {recordResetSubfield6OccurrenceNumbers} from './reindexSubfield6OccurenceNumbers.js';\nimport {sortAdjacentSubfields} from './sortSubfields.js';\nimport {fieldsToString} from './utils.js';\n\nexport {\n AccessRights,\n AddMissingField041,\n AddMissingField336,\n AddMissingField337,\n AddMissingField338,\n Cyrillux,\n CyrilluxUsemarconReplacement,\n DisambiguateSeriesStatements,\n DoubleCommas,\n DuplicatesInd1,\n EmptyFields,\n EndingPunctuation,\n EndingWhitespace,\n Field008CharacterGroups,\n Field505Separators,\n Field521Fix,\n FieldExclusion,\n FieldsPresent,\n FieldStructure,\n Fix33X,\n FixCountryCodes,\n FixLanguageCodes,\n FixRelatorTerms,\n FixSami041,\n FixedFields,\n IdenticalFields,\n IndicatorFixes,\n IsbnIssn,\n ItemLanguage,\n\n MergeField500Lisapainokset,\n MergeRelatorTermFields,\n Modernize502, //\n MultipleSubfield0s,\n NonBreakingSpace,\n NormalizeDashes,\n NormalizeIdentifiers,\n NormalizeQualifyingInformation,\n NormalizeUTF8Diacritics,\n Punctuation,\n Punctuation2,\n ResolveOrphanedSubfield6s, // Do this before reindexing! (thus I'm not sticking with alphabetical order here)\n ReindexSubfield6OccurenceNumbers,\n Remove041zxx,\n RemoveDuplicateDataFields,\n RemoveInferiorDataFields,\n ResolvableExtReferences,\n SanitizeVocabularySourceCodes,\n SortRelatorTerms,\n SortSubfields,\n SortTags,\n SubfieldExclusion,\n SubfieldValueNormalizations,\n Sync007And300,\n SyncLanguage,\n TranslateTerms,\n TypeOfDateF008,\n UnicodeDecomposition,\n UpdateField540,\n Urn,\n SortFields, // Keep this penultimate\n MergeFields, // Run this last *iff* you want to use this at all\n\n // Functions for processing record... These should probably go to some other project.\n // Too specific for marc-record-js though...\n // 1. generic low level stuff\n getEncodingLevel,\n\n // 2. text normalizations (eg. for similarity comparisons, field merge)\n cloneAndRemovePunctuation,\n fieldFixPunctuation,\n fieldToNormalizedString,\n fieldTrimSubfieldValues,\n fieldsToNormalizedString,\n fieldsToString,\n recordFixRelatorTerms,\n sortAdjacentSubfields,\n\n // 3. prepublication stuff\n baseHasEqualOrHigherEncodingLevel,\n deleteAllPrepublicationNotesFromField500InNonPubRecord,\n encodingLevelIsBetterThanPrepublication,\n isEnnakkotietoField,\n isEnnakkotietoSubfield,\n removeWorsePrepubField500s,\n removeWorsePrepubField594s,\n\n // 4. subfield $6 related functions\n fieldGetOccurrenceNumberPairs,\n get6s,\n fieldGetUnambiguousOccurrenceNumber,\n intToOccurrenceNumberString,\n isValidSubfield6,\n recordGetMaxSubfield6OccurrenceNumberAsInteger,\n recordResetSubfield6OccurrenceNumbers,\n resetSubfield6Tag,\n subfield6ResetOccurrenceNumber,\n subfield6GetOccurrenceNumber,\n subfield6GetOccurrenceNumberAsInteger,\n\n // 5. subfield $8 related functions\n getSubfield8LinkingNumber,\n isValidSubfield8,\n recordGetAllSubfield8LinkingNumbers,\n recordGetFieldsWithSubfield8LinkingNumber,\n\n // 6. merge, other\n getCounterpart, // field merge: finds a similar field with which a field can merge\n melindaFieldSpecs, // contains information about the legal fields and subfields, and their repeatability\n mergeField,\n postprocessRecords // clean-up function that cleans up both base and source record (which may be the same)\n\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import AccessRights from './access-rights.js';\nimport AddMissingField041 from './addMissingField041.js';\nimport AddMissingField336 from './addMissingField336.js';\nimport AddMissingField337 from './addMissingField337.js';\nimport AddMissingField338 from './addMissingField338.js';\nimport Cyrillux from './cyrillux.js';\nimport CyrilluxUsemarconReplacement from './cyrillux-usemarcon-replacement.js';\nimport DisambiguateSeriesStatements from './disambiguateSeriesStatements.js';\nimport DoubleCommas from './double-commas.js';\nimport DuplicatesInd1 from './duplicates-ind1.js';\nimport EmptyFields from './empty-fields.js';\nimport EndingPunctuation from './ending-punctuation.js';\nimport EndingWhitespace from './ending-whitespace.js';\nimport Field008CharacterGroups from './field-008-18-34-character-groups.js';\nimport Field505Separators from './field-505-separators.js';\nimport Field521Fix from './field-521-fix.js';\nimport FieldExclusion from './field-exclusion.js';\nimport FieldStructure from './field-structure.js';\nimport FieldsPresent from './fields-present.js';\nimport Fix33X from './fix-33X.js';\nimport FixCountryCodes from './fix-country-codes.js';\nimport FixLanguageCodes from './fix-language-codes.js';\nimport FixRelatorTerms from './fixRelatorTerms.js';\nimport FixSami041 from './fix-sami-041.js';\nimport FixedFields from './fixed-fields.js';\nimport IdenticalFields from './identical-fields.js';\nimport IndicatorFixes from './indicator-fixes.js';\nimport IsbnIssn from './isbn-issn.js';\nimport ItemLanguage from './item-language.js';\nimport MergeField500Lisapainokset from './mergeField500Lisapainokset.js';\nimport MergeFields from './merge-fields/index.js';\nimport MergeRelatorTermFields from './mergeRelatorTermFields.js';\nimport Modernize502 from './modernize-502.js';\nimport MultipleSubfield0s from './multiple-subfield-0.js';\nimport NonBreakingSpace from './non-breaking-space.js';\nimport NormalizeDashes from './normalize-dashes.js';\nimport NormalizeIdentifiers from './normalize-identifiers.js';\nimport NormalizeQualifyingInformation from './normalize-qualifying-information.js';\nimport NormalizeUTF8Diacritics from './normalize-utf8-diacritics.js';\nimport Punctuation from './punctuation/index.js';\nimport Punctuation2 from './punctuation2.js';\nimport ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers.js';\nimport Remove041zxx from './remove-041-zxx.js';\nimport RemoveDuplicateDataFields from './removeDuplicateDataFields.js';\nimport RemoveInferiorDataFields from './removeInferiorDataFields.js';\nimport ResolvableExtReferences from './resolvable-ext-references-melinda.js';\nimport ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s.js';\nimport SanitizeVocabularySourceCodes from './sanitize-vocabulary-source-codes.js';\nimport SortFields from './sortFields.js';\nimport SortRelatorTerms from './sortRelatorTerms.js';\nimport SortSubfields from './sortSubfields.js';\nimport SortTags from './sort-tags.js';\n// import StripPunctuation from './stripPunctuation'; // Can we add this here? Should be used very cautiosly!\nimport SubfieldValueNormalizations from './subfieldValueNormalizations.js';\nimport SubfieldExclusion from './subfield-exclusion.js';\nimport Sync007And300 from './sync-007-and-300.js';\nimport SyncLanguage from './sync-language.js';\nimport TranslateTerms from './translate-terms.js';\nimport TypeOfDateF008 from './typeOfDate-008.js';\nimport UnicodeDecomposition from './unicode-decomposition.js';\nimport UpdateField540 from './update-field-540.js';\nimport Urn from './urn.js';\n\nimport {getCounterpart} from './merge-fields/counterpartField.js';\n\nimport {postprocessRecords} from './merge-fields/mergeOrAddPostprocess.js';\nimport {mergeField} from './merge-fields/mergeField.js';\nimport {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fieldHasValidSubfield6, fieldToNormalizedString, fieldsToNormalizedString, get6s,\n isSubfield6Pair, isValidSubfield6, intToOccurrenceNumberString,\n recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag, subfield6ResetOccurrenceNumber, subfield6GetOccurrenceNumber,\n subfield6GetOccurrenceNumberAsInteger} from './subfield6Utils.js';\n\nimport {getSubfield8LinkingNumber, isValidSubfield8, recordGetAllSubfield8LinkingNumbers, recordGetFieldsWithSubfield8LinkingNumber} from './subfield8Utils.js';\n\nimport {recordFixRelatorTerms} from './fixRelatorTerms.js';\nimport {fieldTrimSubfieldValues} from './normalizeFieldForComparison.js';\nimport {baseHasEqualOrHigherEncodingLevel, deleteAllPrepublicationNotesFromField500InNonPubRecord, encodingLevelIsBetterThanPrepublication, getEncodingLevel, isEnnakkotietoField, isEnnakkotietoSubfield} from './prepublicationUtils.js';\nimport {melindaFieldSpecs} from './melindaCustomMergeFields.js';\n\nimport {cloneAndRemovePunctuation} from './normalizeFieldForComparison.js';\nimport {removeWorsePrepubField500s, removeWorsePrepubField594s} from './prepublicationUtils.js';\nimport {fieldFixPunctuation} from './punctuation2.js';\nimport {recordResetSubfield6OccurrenceNumbers} from './reindexSubfield6OccurenceNumbers.js';\nimport {sortAdjacentSubfields} from './sortSubfields.js';\nimport {fieldHasSubfield, fieldToString, fieldsToString} from './utils.js';\n\nexport {\n AccessRights,\n AddMissingField041,\n AddMissingField336,\n AddMissingField337,\n AddMissingField338,\n Cyrillux,\n CyrilluxUsemarconReplacement,\n DisambiguateSeriesStatements,\n DoubleCommas,\n DuplicatesInd1,\n EmptyFields,\n EndingPunctuation,\n EndingWhitespace,\n Field008CharacterGroups,\n Field505Separators,\n Field521Fix,\n FieldExclusion,\n FieldsPresent,\n FieldStructure,\n Fix33X,\n FixCountryCodes,\n FixLanguageCodes,\n FixRelatorTerms,\n FixSami041,\n FixedFields,\n IdenticalFields,\n IndicatorFixes,\n IsbnIssn,\n ItemLanguage,\n\n MergeField500Lisapainokset,\n MergeRelatorTermFields,\n Modernize502, //\n MultipleSubfield0s,\n NonBreakingSpace,\n NormalizeDashes,\n NormalizeIdentifiers,\n NormalizeQualifyingInformation,\n NormalizeUTF8Diacritics,\n Punctuation,\n Punctuation2,\n ResolveOrphanedSubfield6s, // Do this before reindexing! (thus I'm not sticking with alphabetical order here)\n ReindexSubfield6OccurenceNumbers,\n Remove041zxx,\n RemoveDuplicateDataFields,\n RemoveInferiorDataFields,\n ResolvableExtReferences,\n SanitizeVocabularySourceCodes,\n SortRelatorTerms,\n SortSubfields,\n SortTags,\n SubfieldExclusion,\n SubfieldValueNormalizations,\n Sync007And300,\n SyncLanguage,\n TranslateTerms,\n TypeOfDateF008,\n UnicodeDecomposition,\n UpdateField540,\n Urn,\n SortFields, // Keep this penultimate\n MergeFields, // Run this last *iff* you want to use this at all\n\n // Functions for processing record... These should probably go to some other project.\n // Too specific for marc-record-js though...\n // 1. generic low level stuff\n getEncodingLevel,\n\n // 2. text normalizations + other generic utils (eg. for similarity comparisons, field merge)\n cloneAndRemovePunctuation,\n fieldFixPunctuation,\n fieldHasSubfield,\n fieldToNormalizedString,\n fieldToString,\n fieldTrimSubfieldValues,\n fieldsToNormalizedString,\n fieldsToString,\n recordFixRelatorTerms,\n sortAdjacentSubfields,\n\n // 3. prepublication stuff\n baseHasEqualOrHigherEncodingLevel,\n deleteAllPrepublicationNotesFromField500InNonPubRecord,\n encodingLevelIsBetterThanPrepublication,\n isEnnakkotietoField,\n isEnnakkotietoSubfield,\n removeWorsePrepubField500s,\n removeWorsePrepubField594s,\n\n // 4. subfield $6 related functions\n fieldGetOccurrenceNumberPairs,\n get6s,\n fieldGetUnambiguousOccurrenceNumber,\n fieldHasValidSubfield6,\n intToOccurrenceNumberString,\n isSubfield6Pair,\n isValidSubfield6,\n recordGetMaxSubfield6OccurrenceNumberAsInteger,\n recordResetSubfield6OccurrenceNumbers,\n resetSubfield6Tag,\n subfield6ResetOccurrenceNumber,\n subfield6GetOccurrenceNumber,\n subfield6GetOccurrenceNumberAsInteger,\n\n // 5. subfield $8 related functions\n getSubfield8LinkingNumber,\n isValidSubfield8,\n recordGetAllSubfield8LinkingNumbers,\n recordGetFieldsWithSubfield8LinkingNumber,\n\n // 6. merge, other\n getCounterpart, // field merge: finds a similar field with which a field can merge\n melindaFieldSpecs, // contains information about the legal fields and subfields, and their repeatability\n mergeField,\n postprocessRecords // clean-up function that cleans up both base and source record (which may be the same)\n\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "https://github.com/NatLibFi/marc-record-validators-melinda"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "12.0.5",
17
+ "version": "12.0.6-alpha.1",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"
package/src/cyrillux.js CHANGED
@@ -122,6 +122,11 @@ export default function (config = {}) {
122
122
  }
123
123
 
124
124
  function tagCanBeTransliterated(tag) {
125
+ // Use this to filter out "(0..)" etc
126
+ if (config.tagPattern && !tag.match(config.tagPattern)) {
127
+ return false;
128
+ }
129
+ // These are hard-coded, and will fail anyway:
125
130
  return !['336', '337', '338', '880'].includes(tag);
126
131
  }
127
132
 
package/src/index.js CHANGED
@@ -65,9 +65,9 @@ import {getCounterpart} from './merge-fields/counterpartField.js';
65
65
 
66
66
  import {postprocessRecords} from './merge-fields/mergeOrAddPostprocess.js';
67
67
  import {mergeField} from './merge-fields/mergeField.js';
68
- import {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fieldToNormalizedString, fieldsToNormalizedString, get6s,
69
- isValidSubfield6, recordGetMaxSubfield6OccurrenceNumberAsInteger,
70
- intToOccurrenceNumberString, resetSubfield6Tag, subfield6ResetOccurrenceNumber, subfield6GetOccurrenceNumber,
68
+ import {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fieldHasValidSubfield6, fieldToNormalizedString, fieldsToNormalizedString, get6s,
69
+ isSubfield6Pair, isValidSubfield6, intToOccurrenceNumberString,
70
+ recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag, subfield6ResetOccurrenceNumber, subfield6GetOccurrenceNumber,
71
71
  subfield6GetOccurrenceNumberAsInteger} from './subfield6Utils.js';
72
72
 
73
73
  import {getSubfield8LinkingNumber, isValidSubfield8, recordGetAllSubfield8LinkingNumbers, recordGetFieldsWithSubfield8LinkingNumber} from './subfield8Utils.js';
@@ -82,7 +82,7 @@ import {removeWorsePrepubField500s, removeWorsePrepubField594s} from './prepubli
82
82
  import {fieldFixPunctuation} from './punctuation2.js';
83
83
  import {recordResetSubfield6OccurrenceNumbers} from './reindexSubfield6OccurenceNumbers.js';
84
84
  import {sortAdjacentSubfields} from './sortSubfields.js';
85
- import {fieldsToString} from './utils.js';
85
+ import {fieldHasSubfield, fieldToString, fieldsToString} from './utils.js';
86
86
 
87
87
  export {
88
88
  AccessRights,
@@ -153,10 +153,12 @@ export {
153
153
  // 1. generic low level stuff
154
154
  getEncodingLevel,
155
155
 
156
- // 2. text normalizations (eg. for similarity comparisons, field merge)
156
+ // 2. text normalizations + other generic utils (eg. for similarity comparisons, field merge)
157
157
  cloneAndRemovePunctuation,
158
158
  fieldFixPunctuation,
159
+ fieldHasSubfield,
159
160
  fieldToNormalizedString,
161
+ fieldToString,
160
162
  fieldTrimSubfieldValues,
161
163
  fieldsToNormalizedString,
162
164
  fieldsToString,
@@ -176,7 +178,9 @@ export {
176
178
  fieldGetOccurrenceNumberPairs,
177
179
  get6s,
178
180
  fieldGetUnambiguousOccurrenceNumber,
181
+ fieldHasValidSubfield6,
179
182
  intToOccurrenceNumberString,
183
+ isSubfield6Pair,
180
184
  isValidSubfield6,
181
185
  recordGetMaxSubfield6OccurrenceNumberAsInteger,
182
186
  recordResetSubfield6OccurrenceNumbers,
@@ -0,0 +1,23 @@
1
+ {
2
+ "_validationOptions": {},
3
+ "leader": "12345cam 22123454i 4500",
4
+ "fields": [
5
+ { "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
6
+ { "code": "6", "value": "880-01"},
7
+ { "code": "a", "value": "Modin, Ûrij Ivanovič." },
8
+ { "code": "9", "value": "ISO9 <TRANS>"}
9
+ ]},
10
+ {"tag": "245", "ind1": "1", "ind2": " ", "subfields": [
11
+ { "code": "a", "value": "Судьбы разведчиков."}
12
+ ]},
13
+ { "tag": "650", "ind1": "4", "ind2": " ", "subfields": [
14
+ { "code": "a", "value": "whatever." }
15
+ ]},
16
+ { "tag": "880", "ind1": "1", "ind2": " ", "subfields": [
17
+ {"code": "6", "value": "100-01"},
18
+ {"code": "a", "value": "Модин, Юрий Иванович."},
19
+ {"code": "9", "value": "CYRILLIC <TRANS>"}
20
+ ]}
21
+ ]
22
+ }
23
+
@@ -0,0 +1,11 @@
1
+ {
2
+ "description": "Fix: only f100 as f245 is not included in the tag pattern",
3
+ "comment": "Test f02 with a tag pattern.",
4
+ "only": false,
5
+ "fix": true,
6
+ "config": {
7
+ "doISO9Transliteration": true,
8
+ "doSFS4900Transliteration": false,
9
+ "tagPattern": "^1..$"
10
+ }
11
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "leader": "12345cam 22123454i 4500",
3
+ "fields": [
4
+ { "tag": "100", "ind1": "1", "ind2": " ", "subfields": [
5
+ { "code": "a", "value": "Модин, Юрий Иванович." }
6
+ ]},
7
+ {"tag": "245", "ind1": "1", "ind2": " ", "subfields": [
8
+ { "code": "a", "value": "Судьбы разведчиков."}
9
+ ]},
10
+ { "tag": "650", "ind1": "4", "ind2": " ", "subfields": [
11
+ { "code": "a", "value": "whatever." }
12
+ ]}
13
+ ]
14
+ }