@natlibfi/marc-record-validators-melinda 11.4.8 → 11.5.0

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.
Files changed (69) hide show
  1. package/dist/disambiguateSeriesStatements.js +200 -0
  2. package/dist/disambiguateSeriesStatements.js.map +1 -0
  3. package/dist/disambiguateSeriesStatements.spec.js +51 -0
  4. package/dist/disambiguateSeriesStatements.spec.js.map +1 -0
  5. package/dist/fix-country-codes.spec.js +1 -1
  6. package/dist/fix-country-codes.spec.js.map +1 -1
  7. package/dist/index.js +7 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/merge-fields/mergeField.js +2 -2
  10. package/dist/merge-fields/mergeField.js.map +1 -1
  11. package/dist/merge-fields/mergeOrAddSubfield.js +5 -2
  12. package/dist/merge-fields/mergeOrAddSubfield.js.map +1 -1
  13. package/dist/merge-fields.spec.js +1 -1
  14. package/dist/merge-fields.spec.js.map +1 -1
  15. package/dist/normalize-identifiers.js +1 -1
  16. package/dist/normalize-identifiers.js.map +1 -1
  17. package/dist/normalizeFieldForComparison.js +12 -2
  18. package/dist/normalizeFieldForComparison.js.map +1 -1
  19. package/dist/normalizeSubfieldValueForComparison.js +1 -1
  20. package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
  21. package/dist/prepublicationUtils.js +17 -6
  22. package/dist/prepublicationUtils.js.map +1 -1
  23. package/dist/removeInferiorDataFields.js +27 -4
  24. package/dist/removeInferiorDataFields.js.map +1 -1
  25. package/dist/sortRelatorTerms.js +6 -4
  26. package/dist/sortRelatorTerms.js.map +1 -1
  27. package/dist/translate-terms.js +1 -3
  28. package/dist/translate-terms.js.map +1 -1
  29. package/package.json +5 -2
  30. package/src/disambiguateSeriesStatements.js +228 -0
  31. package/src/disambiguateSeriesStatements.spec.js +52 -0
  32. package/src/fix-country-codes.spec.js +1 -1
  33. package/src/index.js +2 -0
  34. package/src/merge-fields/mergeField.js +4 -4
  35. package/src/merge-fields/mergeOrAddSubfield.js +3 -3
  36. package/src/merge-fields.spec.js +1 -1
  37. package/src/normalize-identifiers.js +1 -1
  38. package/src/normalizeFieldForComparison.js +9 -4
  39. package/src/normalizeSubfieldValueForComparison.js +1 -1
  40. package/src/prepublicationUtils.js +17 -6
  41. package/src/removeInferiorDataFields.js +32 -5
  42. package/src/sortRelatorTerms.js +4 -4
  43. package/src/translate-terms.js +1 -2
  44. package/test-fixtures/disambiguate-series-statements/f01/expectedResult.json +16 -0
  45. package/test-fixtures/disambiguate-series-statements/f01/metadata.json +5 -0
  46. package/test-fixtures/disambiguate-series-statements/f01/record.json +16 -0
  47. package/test-fixtures/disambiguate-series-statements/f02/expectedResult.json +16 -0
  48. package/test-fixtures/disambiguate-series-statements/f02/metadata.json +5 -0
  49. package/test-fixtures/disambiguate-series-statements/f02/record.json +16 -0
  50. package/test-fixtures/disambiguate-series-statements/f03/expectedResult.json +16 -0
  51. package/test-fixtures/disambiguate-series-statements/f03/metadata.json +5 -0
  52. package/test-fixtures/disambiguate-series-statements/f03/record.json +15 -0
  53. package/test-fixtures/disambiguate-series-statements/f04/expectedResult.json +17 -0
  54. package/test-fixtures/disambiguate-series-statements/f04/metadata.json +6 -0
  55. package/test-fixtures/disambiguate-series-statements/f04/record.json +16 -0
  56. package/test-fixtures/disambiguate-series-statements/f05/expectedResult.json +17 -0
  57. package/test-fixtures/disambiguate-series-statements/f05/metadata.json +5 -0
  58. package/test-fixtures/disambiguate-series-statements/f05/record.json +17 -0
  59. package/test-fixtures/disambiguate-series-statements/v01/expectedResult.json +6 -0
  60. package/test-fixtures/disambiguate-series-statements/v01/metadata.json +5 -0
  61. package/test-fixtures/disambiguate-series-statements/v01/record.json +16 -0
  62. package/test-fixtures/disambiguate-series-statements/v04/expectedResult.json +4 -0
  63. package/test-fixtures/disambiguate-series-statements/v04/metadata.json +6 -0
  64. package/test-fixtures/disambiguate-series-statements/v04/record.json +16 -0
  65. package/test-fixtures/remove-inferior-datafields/f13/expectedResult.json +7 -0
  66. package/test-fixtures/remove-inferior-datafields/f13/record.json +11 -0
  67. package/test-fixtures/remove-inferior-datafields/f15/expectedResult.json +12 -0
  68. package/test-fixtures/remove-inferior-datafields/f15/metadata.json +6 -0
  69. package/test-fixtures/remove-inferior-datafields/f15/record.json +17 -0
@@ -21,7 +21,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
21
21
  // NB! This validator handles only full fields, and does not support subfield $8 removal.
22
22
  // Also, having multiple $8 subfields in same fields is not supported.
23
23
  // If this functionality is needed, see removeDuplicateDatafields.js for examples of subfield-only stuff.
24
- const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:removeSubsetDataFields');
24
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:removeInferiorDataFields');
25
25
  function _default() {
26
26
  return {
27
27
  description: 'Remove subset data fields. Certain exceptions apply, mainly too complicated for chained fields',
@@ -222,7 +222,22 @@ function deriveIndividualDeletables(record) {
222
222
  //const finishedRecord = encodingLevelIsBetterThanPrepublication(getEncodingLevel(record));
223
223
 
224
224
  const deletableStringsArray = processTodoList(todoList);
225
- return (0, _utils.uniqArray)(deletableStringsArray);
225
+ const inferiorTerms = getInferiorTerms(record);
226
+ return (0, _utils.uniqArray)([...deletableStringsArray, ...inferiorTerms]);
227
+ function getInferiorTerms(record) {
228
+ const inputFields = record.fields.filter(f => ['648', '650', '651'].includes(f.tag) && f.subfields);
229
+ const result = inputFields.flatMap(f => fieldToInferiorFields(f));
230
+
231
+ // console.log(result.join('\n')); // eslint-disable-line no-console
232
+ return result;
233
+ }
234
+ function fieldToInferiorFields(field) {
235
+ const aArray = field.subfields.filter(sf => sf.code === 'a');
236
+ if (field.tag === '650') {
237
+ return aArray.flatMap(sf => [`653 ## ‡a ${sf.value}`, `653 #0 ‡a ${sf.value}`]);
238
+ }
239
+ return aArray.map(sf => `653 ## ‡a ${sf.value}`);
240
+ }
226
241
  function processTodoList(thingsToDo, deletables = []) {
227
242
  const [currString, ...stillToDo] = thingsToDo;
228
243
  if (currString === undefined) {
@@ -283,9 +298,10 @@ function deriveIndividualDeletables(record) {
283
298
  }
284
299
  return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);
285
300
  }
286
- const ennakkotieto653 = currString.match(/^653./u) ? [`${currString} ‡g ENNAKKOTIETO`] : []; // MET-528
287
301
 
288
- const newDeletables = [...deletables, ...subsets, ...accentless, ...d490, ...ennakkotieto653];
302
+ // MET-575 (merge: applies in postprocessing)
303
+ const inferiorTerms = getPrepublicationTerms(currString);
304
+ const newDeletables = [...deletables, ...subsets, ...accentless, ...d490, ...inferiorTerms];
289
305
  if (subsets.length) {
290
306
  return processTodoList([...stillToDo, ...moreToDo], newDeletables);
291
307
  }
@@ -306,6 +322,13 @@ function deriveIndividualDeletables(record) {
306
322
  }
307
323
  return [accentless];
308
324
  }
325
+ function getPrepublicationTerms(fieldAsString) {
326
+ if (fieldAsString.match(/^653./u)) {
327
+ // MET-528 (extented by MET-575)
328
+ return [`${fieldAsString} ‡g ENNAKKOTIETO`, `${fieldAsString} ‡g ennakkotieto`, `${fieldAsString} ‡g ENNAKKOTIETO.`, `${fieldAsString} ‡g ennakkotieto.`];
329
+ }
330
+ return [];
331
+ }
309
332
  }
310
333
  function fieldToNormalizedString(field) {
311
334
  const normalizedField = (0, _normalizeFieldForComparison.cloneAndNormalizeFieldForComparison)(field);
@@ -1 +1 @@
1
- {"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","_subfield8Utils","_prepublicationUtils","_normalizeFieldForComparison","_normalizeUtf8Diacritics","e","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeInferiorDatafields","duplicates","length","deriveInferiorChains","fields","hash","forEach","f","fieldToChainToDeletables","field","chain","fieldToChain","chainAsString","fieldsToNormalizedString","arr","deriveChainDeletables","val","todoList","deletables","stillToDo","undefined","withoutScriptIdentificationCode","replace","keepless","linked490Ind1","filter","isRelevantChain6","fieldHasValidSubfield6","fieldHasValidSubfield8","some","subfields","sf","code","sameField","removeInferiorChains","deletableChainsAsKeys","nChains","Object","keys","innerRemoveInferiorChains","deletedStringsArray","currField","remainingFields","triggeringField","triggeringChain","chainContains1XX","sevenToOne","deletedString","fieldsToString","removeField","tag","substring","includes","pairs","fieldGetOccurrenceNumberPairs","pairedField","fieldSevenToOneOccurrenceNumber","getIdentifierlessAndKeeplessSubsets","fieldAsString","identifierlessString","keeplessString","deriveIndividualDeletables490","match","sixless","withoutFinalVOrX","xless","xvless","modifiedInd2","deriveIndividualDeletables","map","fieldToString","deletableStringsArray","processTodoList","uniqArray","thingsToDo","currString","accentless","getAccentlessVersion","d490","subsets","moreToDo","tmp","tmp1","tmp2","ennakkotieto653","newDeletables","string","precomposeFinnishLetters","String","fixComposition","fieldToNormalizedString","normalizedField","cloneAndNormalizeFieldForComparison","deriveIndividualNormalizedDeletables","encodingLevel","getEncodingLevel","recordIsFinished","encodingLevelIsBetterThanPrepublication","met495","fieldRefersToKoneellisestiTuotettuTietue","relevantFields","fieldHasSubfield","deriveDeletable946s","results","fieldAsNormalizedString","candArray","removeIndividualInferiorDatafields","deletableFieldsAsStrings","deletableFieldsAsNormalizedStrings","hits","isDeletableField","deletedFieldsAsStrings","removables","removables6","join","removablesAll","concat"],"sources":["../src/removeInferiorDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToChain, sameField} from './removeDuplicateDataFields';\nimport {fieldGetOccurrenceNumberPairs, fieldHasValidSubfield6, fieldSevenToOneOccurrenceNumber, fieldsToNormalizedString} from './subfield6Utils';\nimport {fieldHasSubfield, fieldsToString, fieldToString, nvdebug, uniqArray} from './utils';\nimport {fieldHasValidSubfield8} from './subfield8Utils';\nimport {encodingLevelIsBetterThanPrepublication, fieldRefersToKoneellisestiTuotettuTietue, getEncodingLevel} from './prepublicationUtils';\nimport {cloneAndNormalizeFieldForComparison} from './normalizeFieldForComparison';\nimport {fixComposition, precomposeFinnishLetters} from './normalize-utf8-diacritics';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\n// NB! This validator handles only full fields, and does not support subfield $8 removal.\n// Also, having multiple $8 subfields in same fields is not supported.\n// If this functionality is needed, see removeDuplicateDatafields.js for examples of subfield-only stuff.\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeSubsetDataFields');\n\nexport default function () {\n return {\n description: 'Remove subset data fields. Certain exceptions apply, mainly too complicated for chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix record: remove inferior (eg. subset) data fields', debug);\n const res = {message: [], fix: [], valid: true};\n removeInferiorDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: remove inferior (eg. subset) data fields', debug);\n\n const duplicates = removeInferiorDatafields(record, false);\n\n const res = {message: duplicates};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction deriveInferiorChains(fields, record) {\n //nvdebug(`======= GOT ${fields.length} FIELDS TO CHAINIFY`);\n const hash = {};\n\n fields.forEach(f => fieldToChainToDeletables(f));\n\n return hash;\n\n //nvdebug(`WP1: GOT ${todoList.length} CHAINS`);\n\n\n // here we map deletableStringObject[str] => field. The idea is to help debugging. We don't actually need the field object...\n //return deriveChainDeletables(todoList);\n\n function fieldToChainToDeletables(field) {\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n const arr = deriveChainDeletables([chainAsString]);\n //nvdebug(`GOT ${arr.length} DELETABLES FOR ${chainAsString}`);\n arr.forEach(val => {\n if (!(val in hash)) { // eslint-disable-line functional/no-conditional-statements\n hash[val] = field; // eslint-disable-line functional/immutable-data\n }\n });\n }\n\n function deriveChainDeletables(todoList, deletables = []) {\n const [chainAsString, ...stillToDo] = todoList;\n if (chainAsString === undefined) {\n return deletables;\n }\n\n // Fix MRA-476 (part 1): one $6 value can be worse than the other\n const withoutScriptIdentificationCode = chainAsString.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\\/[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group\n\n // Remove keepless versions:\n const keepless = chainAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n // MRA-433: 490 ind1=1 vs ind1=0: remove latter (luckily no 2nd indicator etc)\n const linked490Ind1 = chainAsString.replace(/^490 1/u, '490 0').replace(/\\t880 1/ug, '\\t880 0');\n const arr = [withoutScriptIdentificationCode, keepless, linked490Ind1].filter(val => val !== chainAsString);\n if (arr.length > 0) {\n return deriveChainDeletables([...stillToDo, ...arr], [...deletables, ...arr]);\n }\n\n return deriveChainDeletables(stillToDo, deletables);\n }\n\n}\n\nfunction isRelevantChain6(field, record) {\n //Can't be a chain:\n if (!fieldHasValidSubfield6(field) && !fieldHasValidSubfield8(field)) {\n return false;\n }\n // Too short to be a chain:\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return false;\n }\n // No field can contains no more than one subfield $6\n if (chain.some(f => f.subfields.filter(sf => sf.code === '6').length > 1)) {\n return false;\n }\n\n // Check whether our field is the head of a chain:\n return sameField(field, chain[0]);\n}\n\nexport function removeInferiorChains(record, fix = true) {\n const fields = record.fields.filter(f => isRelevantChain6(f, record));\n //nvdebug(`WP2.0: GOT ${fields.length} chain(s)`);\n\n const deletableChainsAsKeys = deriveInferiorChains(fields, record);\n const nChains = Object.keys(deletableChainsAsKeys).length;\n //nvdebug(`WP2: GOT ${nChains} chain(s)`);\n if (nChains === 0) {\n return [];\n }\n\n //nvdebug(`removeInferiorChains() has ${fields.length} fields-in-chain(s), and a list of ${nChains} deletable(s)`);\n\n return innerRemoveInferiorChains(fields);\n\n function innerRemoveInferiorChains(fields, deletedStringsArray = []) {\n const [currField, ...remainingFields] = fields;\n\n if (currField === undefined) {\n return deletedStringsArray;\n }\n\n const chain = fieldToChain(currField, record);\n if (chain.length === 0 || !sameField(currField, chain[0])) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n if (!(chainAsString in deletableChainsAsKeys)) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const triggeringField = deletableChainsAsKeys[chainAsString];\n const triggeringChain = fieldToChain(triggeringField, record);\n\n // If the inferior (deletable) chain is 1XX-based, convert the triggering better chain from 7XX to 1XX:\n if (chainContains1XX(chain)) { // eslint-disable-line functional/no-conditional-statements\n triggeringChain.forEach(f => sevenToOne(f, triggeringChain));\n }\n //nvdebug(`iRIS6C: ${chainAsString}`);\n const deletedString = fieldsToString(chain);\n const message = `DEL: '${deletedString}' REASON: '${fieldsToString(triggeringChain)}'`;\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(`INFERIOR $6 CHAIN REMOVAL: ${message}}`, debug);\n chain.forEach(field => record.removeField(field));\n }\n return innerRemoveInferiorChains(remainingFields, [...deletedStringsArray, message]);\n }\n\n function chainContains1XX(chain) {\n return chain.some(f => f.tag.substring(0, 1) === '1');\n }\n\n function sevenToOne(field, chain) { // Change 7XX field to 1XX field. Also handle the corresponding 880$6 7XX-NN subfields\n // NB! This function should be called only if the original 1XX gets deleted!\n if (!['700', '710', '711', '730'].includes(field.tag)) {\n return;\n }\n // Retag field 7XX as 1XX and fix corresponding occurrence numbers as well:\n const pairs = fieldGetOccurrenceNumberPairs(field, chain);\n field.tag = `1${field.tag.substring(1)}`; // eslint-disable-line functional/immutable-data\n // There should always be one pair, but I'm not sanity-checking this\n pairs.forEach(pairedField => fieldSevenToOneOccurrenceNumber(pairedField));\n }\n\n}\n\n\nfunction getIdentifierlessAndKeeplessSubsets(fieldAsString) {\n // The rules below are not perfect (in complex cases they don't catch all permutations), but good enough:\n // Remove identifier(s) (MELKEHITYS-2383-ish):\n\n const identifierlessString = fieldAsString.replace(/ ‡[01] [^‡]+($| ‡)/u, '$1'); // eslint-disable-line prefer-named-capture-group\n const keeplessString = fieldAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n return [identifierlessString, keeplessString].filter(val => val !== fieldAsString);\n}\n\nfunction deriveIndividualDeletables490(todoList, deletables = []) {\n const [fieldAsString, ...stillToDo] = todoList;\n if (fieldAsString === undefined) {\n return deletables;\n }\n //nvdebug(`PROCESS ${fieldAsString}`);\n if (!fieldAsString.match(/^490/u)) {\n return deriveIndividualDeletables490(stillToDo, deletables);\n }\n\n // $6-less version (keep this first)\n const sixless = fieldAsString.replace(/ ‡6 [^‡]+ ‡/u, ' ‡');\n\n // Without final $v or $x:\n const withoutFinalVOrX = fieldAsString.replace(/ *[;,] ‡[vx] [^‡]+$/u, '');\n // Add intermediate $x-less version\n const xless = fieldAsString.replace(/, ‡x [^‡]+(, ‡x| ; ‡v)/u, '$1'); // eslint-disable-line prefer-named-capture-group\n\n // Add $xv-less version (handled by recursion?)\n const xvless = fieldAsString.replace(/, ‡x [^‡]+ ‡v [^‡]+$/u, '');\n\n // MRA-433-ish (non-chain): 490 ind1=1 vs ind1=0: remove latter\n const modifiedInd2 = fieldAsString.match(/^490 1/u) ? `490 0${fieldAsString.substring(5)}` : fieldAsString;\n\n const arr = [sixless, withoutFinalVOrX, xless, xvless, modifiedInd2].filter(val => val !== fieldAsString);\n\n /*\n if (arr.length) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`${arr.length} derivation(s) for ${fieldAsString}`);\n nvdebug(arr.join('\\n'));\n }\n */\n return arr;\n}\n\nfunction deriveIndividualDeletables(record) {\n const todoList = record.fields.map(f => fieldToString(f));\n //const finishedRecord = encodingLevelIsBetterThanPrepublication(getEncodingLevel(record));\n\n const deletableStringsArray = processTodoList(todoList);\n\n return uniqArray(deletableStringsArray);\n\n function processTodoList(thingsToDo, deletables = []) {\n const [currString, ...stillToDo] = thingsToDo;\n\n if (currString === undefined) {\n return deletables;\n }\n\n const accentless = getAccentlessVersion(currString);\n const d490 = deriveIndividualDeletables490([currString]);\n const subsets = getIdentifierlessAndKeeplessSubsets(currString); // eslint-disable-line no-param-reassign\n const moreToDo = [...accentless, ...d490, ...subsets];\n\n\n if (currString.match(/^[1678]00/u)) {\n // Proof-of-concept rule. Should be improved eventually...\n if (currString.match(/, ‡e [^‡]+\\.$/u)) {\n const tmp = currString.replace(/, ‡e [^‡]+\\.$/u, '.');\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Lisäpainokset: Lisäpainos /u)) { // MET-569\n const tmp1 = currString.replace(' Lisäpainos ', ' [Lisäpainos] ');\n const tmp2 = currString.replace(' Lisäpainos ', ' ');\n if (tmp1 !== currString && tmp2 !== currString) {\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp1, tmp2]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Lisäpainokset: \\[Lisäpainos\\] /u)) { // MET-569\n const tmp = currString.replace(' [Lisäpainos] ', ' ');\n if (tmp !== currString) {\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n }\n\n if (currString.match(/^505 .0.*-- ‡t/u)) { // MRA-413-ish\n const tmp = currString.replace(/ -- ‡t /gu, ' -- '). // remove non-initial $t subfields\n replace(/ ‡[rg] /gu, ' '). // remove $r and $g subfields\n replace(/ ‡t /u, ' ‡a '). // change first $t to $a\n // ind2: '1' => '#':\n replace(/^505 (.)0/u, '505 $1#'); // eslint-disable-line prefer-named-capture-group\n if (tmp !== currString) {\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n //nvdebug(`505 ORIGINAL: '${fieldAsString}'`)\n //nvdebug(`505 DERIVATE: '${tmp}'`)\n }\n\n // MET-381: remove occurence number TAG-00, if TAG-NN existists\n if (currString.match(/^880.* ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/u)) {\n const tmp = currString.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/u, '$1-00'); // eslint-disable-line prefer-named-capture-group\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp}'`);\n //deletableStringsArray.push(tmp);\n if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\\/[^ ]+ /u)) {\n const tmp2 = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp2}'`);\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp, tmp2]);\n }\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n\n\n const ennakkotieto653 = currString.match(/^653./u) ? [`${currString} ‡g ENNAKKOTIETO`] : []; // MET-528\n\n const newDeletables = [...deletables, ...subsets, ...accentless, ...d490, ...ennakkotieto653];\n\n if (subsets.length) {\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n function getAccentlessVersion(string) { // MET-527\n //nvdebug(`START: '${string}`);\n // This is a sanity check: if precomposition does something, there's something wrong, and we don't want to proceed..\n if (string !== precomposeFinnishLetters(string)) {\n return [];\n }\n const accentless = String(fixComposition(string)).replace(/\\p{Diacritic}/gu, '');\n //nvdebug(`FROM '${string}'\\n TO '${accentless}'`);\n if (accentless === string) { // Don't self-destruct\n return [];\n }\n return [accentless];\n }\n\n}\n\nfunction fieldToNormalizedString(field) {\n const normalizedField = cloneAndNormalizeFieldForComparison(field);\n return fieldToString(normalizedField);\n}\n\nfunction deriveIndividualNormalizedDeletables(record) { // MET-461:\n const encodingLevel = getEncodingLevel(record);\n const recordIsFinished = encodingLevelIsBetterThanPrepublication(encodingLevel);\n const met495 = encodingLevel === '2' && record.fields.some(f => f.tag === '500' && fieldRefersToKoneellisestiTuotettuTietue(f));\n if (!recordIsFinished || met495) {\n return [];\n }\n const relevantFields = record.fields.filter(f => ['245', '246'].includes(f.tag) && fieldHasSubfield(f, 'a'));\n\n return deriveDeletable946s(relevantFields);\n\n function deriveDeletable946s(fields, results = []) {\n const [currField, ...remainingFields] = fields;\n if (currField === undefined) {\n return results;\n }\n\n const fieldAsNormalizedString = fieldToNormalizedString(currField);\n const tmp = fieldAsNormalizedString.replace(/^(?:...) ../u, '946 ##'). // <= Change tag to 946 and indicators to '##'\n replace(' ‡a ', ' ‡i nimeke onixissa ‡a '). // Add $i before $a. NB! This is added in the normalized lower-cased form!\n replace(/(?: \\/)? ‡c[^‡]+$/u, ''); // Remove $c. (Can $c be non-last?)\n const candArray = [tmp, `${tmp} ‡5 MELINDA`].filter(val => val !== fieldAsNormalizedString);\n if (candArray.length) {\n return deriveDeletable946s(remainingFields, [...results, ...candArray]);\n }\n return deriveDeletable946s(remainingFields, results);\n }\n}\n\nexport function removeIndividualInferiorDatafields(record, fix = true) { // No $6 nor $8 in field\n const deletableFieldsAsStrings = deriveIndividualDeletables(record);\n const deletableFieldsAsNormalizedStrings = deriveIndividualNormalizedDeletables(record);\n\n // nvdebug(`Deletables:\\n ${deletableFieldsAsStrings.join('\\n ')}`);\n // nvdebug(`Normalized deletables:\\n ${deletableFieldsAsNormalizedStrings.join('\\n ')}`);\n\n const hits = record.fields.filter(field => isDeletableField(field));\n\n const deletedFieldsAsStrings = hits.map(f => fieldToString(f));\n\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n hits.forEach(field => {\n //nvdebug(`Remove inferior field: ${fieldToString(field)}`, debug);\n record.removeField(field);\n });\n }\n\n return deletedFieldsAsStrings;\n\n function isDeletableField(field) {\n const fieldAsString = fieldToString(field);\n if (deletableFieldsAsStrings.includes(fieldAsString)) {\n return true;\n }\n const fieldAsNormalizedString = fieldToNormalizedString(field);\n if (deletableFieldsAsNormalizedStrings.includes(fieldAsNormalizedString)) {\n return true;\n }\n\n return false;\n }\n}\n\n\nexport function removeInferiorDatafields(record, fix = true) {\n const removables = removeIndividualInferiorDatafields(record, fix); // Lone fields\n //const removables8 = removeDuplicateSubfield8Chains(record, fix); // Lone subfield $8 chains\n const removables6 = removeInferiorChains(record, fix); // Lone subfield $6 chains\n // HOW TO HANDLE $6+$8 combos? Skipping is relatively OK.\n\n nvdebug(`REMOVABLES:\\n ${removables.join('\\n ')}`, debug);\n nvdebug(`REMOVABLES 6:\\n ${removables6.join('\\n ')}`, debug);\n\n const removablesAll = removables.concat(removables6); //.concat(removables8);\n\n return removablesAll;\n}\n"],"mappings":";;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,0BAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AACA,IAAAI,eAAA,GAAAJ,OAAA;AACA,IAAAK,oBAAA,GAAAL,OAAA;AACA,IAAAM,4BAAA,GAAAN,OAAA;AACA,IAAAO,wBAAA,GAAAP,OAAA;AAAqF,SAAAD,uBAAAS,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAErF;;AAEA;AACA;AACA;AACA,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,iEAAiE,CAAC;AAEnF,SAAAC,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,gGAAgG;IAC7GC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,IAAAC,cAAO,EAAC,sDAAsD,EAAEP,KAAK,CAAC;IACtE,MAAMQ,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEJ,GAAG,EAAE,EAAE;MAAEK,KAAK,EAAE;IAAI,CAAC;IAC/CC,wBAAwB,CAACL,MAAM,EAAE,IAAI,CAAC;IACtC;IACA,OAAOE,GAAG;EACZ;EAEA,SAASJ,QAAQA,CAACE,MAAM,EAAE;IACxB;IACA,IAAAC,cAAO,EAAC,2DAA2D,EAAEP,KAAK,CAAC;IAE3E,MAAMY,UAAU,GAAGD,wBAAwB,CAACL,MAAM,EAAE,KAAK,CAAC;IAE1D,MAAME,GAAG,GAAG;MAACC,OAAO,EAAEG;IAAU,CAAC;IAEjCJ,GAAG,CAACE,KAAK,GAAGF,GAAG,CAACC,OAAO,CAACI,MAAM,GAAG,CAAC,CAAC,CAAC;IACpC,OAAOL,GAAG;EACZ;AACF;AAGA,SAASM,oBAAoBA,CAACC,MAAM,EAAET,MAAM,EAAE;EAC5C;EACA,MAAMU,IAAI,GAAG,CAAC,CAAC;EAEfD,MAAM,CAACE,OAAO,CAACC,CAAC,IAAIC,wBAAwB,CAACD,CAAC,CAAC,CAAC;EAEhD,OAAOF,IAAI;;EAEX;;EAGA;EACA;;EAEA,SAASG,wBAAwBA,CAACC,KAAK,EAAE;IACvC,MAAMC,KAAK,GAAG,IAAAC,uCAAY,EAACF,KAAK,EAAEd,MAAM,CAAC;IACzC,IAAIe,KAAK,CAACR,MAAM,GAAG,CAAC,EAAE;MACpB;IACF;IACA,MAAMU,aAAa,GAAG,IAAAC,wCAAwB,EAACH,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IACpE,MAAMI,GAAG,GAAGC,qBAAqB,CAAC,CAACH,aAAa,CAAC,CAAC;IAClD;IACAE,GAAG,CAACR,OAAO,CAACU,GAAG,IAAI;MACjB,IAAI,EAAEA,GAAG,IAAIX,IAAI,CAAC,EAAE;QAAE;QACpBA,IAAI,CAACW,GAAG,CAAC,GAAGP,KAAK,CAAC,CAAC;MACrB;IACF,CAAC,CAAC;EACJ;EAEA,SAASM,qBAAqBA,CAACE,QAAQ,EAAEC,UAAU,GAAG,EAAE,EAAE;IACxD,MAAM,CAACN,aAAa,EAAE,GAAGO,SAAS,CAAC,GAAGF,QAAQ;IAC9C,IAAIL,aAAa,KAAKQ,SAAS,EAAE;MAC/B,OAAOF,UAAU;IACnB;;IAEA;IACA,MAAMG,+BAA+B,GAAGT,aAAa,CAACU,OAAO,CAAC,8CAA8C,EAAE,IAAI,CAAC,CAAC,CAAC;;IAErH;IACA,MAAMC,QAAQ,GAAGX,aAAa,CAACU,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;;IAE/D;IACA,MAAME,aAAa,GAAGZ,aAAa,CAACU,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAACA,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC;IAC/F,MAAMR,GAAG,GAAG,CAACO,+BAA+B,EAAEE,QAAQ,EAAEC,aAAa,CAAC,CAACC,MAAM,CAACT,GAAG,IAAIA,GAAG,KAAKJ,aAAa,CAAC;IAC3G,IAAIE,GAAG,CAACZ,MAAM,GAAG,CAAC,EAAE;MAClB,OAAOa,qBAAqB,CAAC,CAAC,GAAGI,SAAS,EAAE,GAAGL,GAAG,CAAC,EAAE,CAAC,GAAGI,UAAU,EAAE,GAAGJ,GAAG,CAAC,CAAC;IAC/E;IAEA,OAAOC,qBAAqB,CAACI,SAAS,EAAED,UAAU,CAAC;EACrD;AAEF;AAEA,SAASQ,gBAAgBA,CAACjB,KAAK,EAAEd,MAAM,EAAE;EACvC;EACA,IAAI,CAAC,IAAAgC,sCAAsB,EAAClB,KAAK,CAAC,IAAI,CAAC,IAAAmB,sCAAsB,EAACnB,KAAK,CAAC,EAAE;IACpE,OAAO,KAAK;EACd;EACA;EACA,MAAMC,KAAK,GAAG,IAAAC,uCAAY,EAACF,KAAK,EAAEd,MAAM,CAAC;EACzC,IAAIe,KAAK,CAACR,MAAM,GAAG,CAAC,EAAE;IACpB,OAAO,KAAK;EACd;EACA;EACA,IAAIQ,KAAK,CAACmB,IAAI,CAACtB,CAAC,IAAIA,CAAC,CAACuB,SAAS,CAACL,MAAM,CAACM,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC,CAAC9B,MAAM,GAAG,CAAC,CAAC,EAAE;IACzE,OAAO,KAAK;EACd;;EAEA;EACA,OAAO,IAAA+B,oCAAS,EAACxB,KAAK,EAAEC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC;AAEO,SAASwB,oBAAoBA,CAACvC,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EACvD,MAAMU,MAAM,GAAGT,MAAM,CAACS,MAAM,CAACqB,MAAM,CAAClB,CAAC,IAAImB,gBAAgB,CAACnB,CAAC,EAAEZ,MAAM,CAAC,CAAC;EACrE;;EAEA,MAAMwC,qBAAqB,GAAGhC,oBAAoB,CAACC,MAAM,EAAET,MAAM,CAAC;EAClE,MAAMyC,OAAO,GAAGC,MAAM,CAACC,IAAI,CAACH,qBAAqB,CAAC,CAACjC,MAAM;EACzD;EACA,IAAIkC,OAAO,KAAK,CAAC,EAAE;IACjB,OAAO,EAAE;EACX;;EAEA;;EAEA,OAAOG,yBAAyB,CAACnC,MAAM,CAAC;EAExC,SAASmC,yBAAyBA,CAACnC,MAAM,EAAEoC,mBAAmB,GAAG,EAAE,EAAE;IACnE,MAAM,CAACC,SAAS,EAAE,GAAGC,eAAe,CAAC,GAAGtC,MAAM;IAE9C,IAAIqC,SAAS,KAAKrB,SAAS,EAAE;MAC3B,OAAOoB,mBAAmB;IAC5B;IAEA,MAAM9B,KAAK,GAAG,IAAAC,uCAAY,EAAC8B,SAAS,EAAE9C,MAAM,CAAC;IAC7C,IAAIe,KAAK,CAACR,MAAM,KAAK,CAAC,IAAI,CAAC,IAAA+B,oCAAS,EAACQ,SAAS,EAAE/B,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;MACzD,OAAO6B,yBAAyB,CAACG,eAAe,EAAEF,mBAAmB,CAAC;IACxE;IAEA,MAAM5B,aAAa,GAAG,IAAAC,wCAAwB,EAACH,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IACpE,IAAI,EAAEE,aAAa,IAAIuB,qBAAqB,CAAC,EAAE;MAC7C,OAAOI,yBAAyB,CAACG,eAAe,EAAEF,mBAAmB,CAAC;IACxE;IAEA,MAAMG,eAAe,GAAGR,qBAAqB,CAACvB,aAAa,CAAC;IAC5D,MAAMgC,eAAe,GAAG,IAAAjC,uCAAY,EAACgC,eAAe,EAAEhD,MAAM,CAAC;;IAE7D;IACA,IAAIkD,gBAAgB,CAACnC,KAAK,CAAC,EAAE;MAAE;MAC7BkC,eAAe,CAACtC,OAAO,CAACC,CAAC,IAAIuC,UAAU,CAACvC,CAAC,EAAEqC,eAAe,CAAC,CAAC;IAC9D;IACA;IACA,MAAMG,aAAa,GAAG,IAAAC,qBAAc,EAACtC,KAAK,CAAC;IAC3C,MAAMZ,OAAO,GAAG,SAASiD,aAAa,eAAe,IAAAC,qBAAc,EAACJ,eAAe,CAAC,GAAG;IACvF,IAAIlD,GAAG,EAAE;MAAE;MACT;MACAgB,KAAK,CAACJ,OAAO,CAACG,KAAK,IAAId,MAAM,CAACsD,WAAW,CAACxC,KAAK,CAAC,CAAC;IACnD;IACA,OAAO8B,yBAAyB,CAACG,eAAe,EAAE,CAAC,GAAGF,mBAAmB,EAAE1C,OAAO,CAAC,CAAC;EACtF;EAEA,SAAS+C,gBAAgBA,CAACnC,KAAK,EAAE;IAC/B,OAAOA,KAAK,CAACmB,IAAI,CAACtB,CAAC,IAAIA,CAAC,CAAC2C,GAAG,CAACC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC;EACvD;EAEA,SAASL,UAAUA,CAACrC,KAAK,EAAEC,KAAK,EAAE;IAAE;IAClC;IACA,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC0C,QAAQ,CAAC3C,KAAK,CAACyC,GAAG,CAAC,EAAE;MACrD;IACF;IACA;IACA,MAAMG,KAAK,GAAG,IAAAC,6CAA6B,EAAC7C,KAAK,EAAEC,KAAK,CAAC;IACzDD,KAAK,CAACyC,GAAG,GAAG,IAAIzC,KAAK,CAACyC,GAAG,CAACC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1C;IACAE,KAAK,CAAC/C,OAAO,CAACiD,WAAW,IAAI,IAAAC,+CAA+B,EAACD,WAAW,CAAC,CAAC;EAC5E;AAEF;AAGA,SAASE,mCAAmCA,CAACC,aAAa,EAAE;EAC1D;EACA;;EAEA,MAAMC,oBAAoB,GAAGD,aAAa,CAACpC,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC,CAAC;EACjF,MAAMsC,cAAc,GAAGF,aAAa,CAACpC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;EAErE,OAAO,CAACqC,oBAAoB,EAAEC,cAAc,CAAC,CAACnC,MAAM,CAACT,GAAG,IAAIA,GAAG,KAAK0C,aAAa,CAAC;AACpF;AAEA,SAASG,6BAA6BA,CAAC5C,QAAQ,EAAEC,UAAU,GAAG,EAAE,EAAE;EAChE,MAAM,CAACwC,aAAa,EAAE,GAAGvC,SAAS,CAAC,GAAGF,QAAQ;EAC9C,IAAIyC,aAAa,KAAKtC,SAAS,EAAE;IAC/B,OAAOF,UAAU;EACnB;EACA;EACA,IAAI,CAACwC,aAAa,CAACI,KAAK,CAAC,OAAO,CAAC,EAAE;IACjC,OAAOD,6BAA6B,CAAC1C,SAAS,EAAED,UAAU,CAAC;EAC7D;;EAEA;EACA,MAAM6C,OAAO,GAAGL,aAAa,CAACpC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;;EAE3D;EACA,MAAM0C,gBAAgB,GAAGN,aAAa,CAACpC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC;EAC1E;EACA,MAAM2C,KAAK,GAAGP,aAAa,CAACpC,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC,CAAC;;EAEtE;EACA,MAAM4C,MAAM,GAAGR,aAAa,CAACpC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC;;EAEjE;EACA,MAAM6C,YAAY,GAAGT,aAAa,CAACI,KAAK,CAAC,SAAS,CAAC,GAAG,QAAQJ,aAAa,CAACP,SAAS,CAAC,CAAC,CAAC,EAAE,GAAGO,aAAa;EAE1G,MAAM5C,GAAG,GAAG,CAACiD,OAAO,EAAEC,gBAAgB,EAAEC,KAAK,EAAEC,MAAM,EAAEC,YAAY,CAAC,CAAC1C,MAAM,CAACT,GAAG,IAAIA,GAAG,KAAK0C,aAAa,CAAC;;EAEzG;AACF;AACA;AACA;AACA;AACA;EACE,OAAO5C,GAAG;AACZ;AAEA,SAASsD,0BAA0BA,CAACzE,MAAM,EAAE;EAC1C,MAAMsB,QAAQ,GAAGtB,MAAM,CAACS,MAAM,CAACiE,GAAG,CAAC9D,CAAC,IAAI,IAAA+D,oBAAa,EAAC/D,CAAC,CAAC,CAAC;EACzD;;EAEA,MAAMgE,qBAAqB,GAAGC,eAAe,CAACvD,QAAQ,CAAC;EAEvD,OAAO,IAAAwD,gBAAS,EAACF,qBAAqB,CAAC;EAEvC,SAASC,eAAeA,CAACE,UAAU,EAAExD,UAAU,GAAG,EAAE,EAAE;IACpD,MAAM,CAACyD,UAAU,EAAE,GAAGxD,SAAS,CAAC,GAAGuD,UAAU;IAE7C,IAAIC,UAAU,KAAKvD,SAAS,EAAE;MAC5B,OAAOF,UAAU;IACnB;IAEA,MAAM0D,UAAU,GAAGC,oBAAoB,CAACF,UAAU,CAAC;IACnD,MAAMG,IAAI,GAAGjB,6BAA6B,CAAC,CAACc,UAAU,CAAC,CAAC;IACxD,MAAMI,OAAO,GAAGtB,mCAAmC,CAACkB,UAAU,CAAC,CAAC,CAAC;IACjE,MAAMK,QAAQ,GAAG,CAAC,GAAGJ,UAAU,EAAE,GAAGE,IAAI,EAAE,GAAGC,OAAO,CAAC;IAGrD,IAAIJ,UAAU,CAACb,KAAK,CAAC,YAAY,CAAC,EAAE;MAClC;MACA,IAAIa,UAAU,CAACb,KAAK,CAAC,gBAAgB,CAAC,EAAE;QACtC,MAAMmB,GAAG,GAAGN,UAAU,CAACrD,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;QACrD,OAAOkD,eAAe,CAAC,CAACS,GAAG,EAAE,GAAG9D,SAAS,EAAE,GAAG6D,QAAQ,CAAC,EAAE,CAAC,GAAG9D,UAAU,EAAE+D,GAAG,CAAC,CAAC;MAChF;IACF;IAEA,IAAIN,UAAU,CAACb,KAAK,CAAC,wCAAwC,CAAC,EAAE;MAAE;MAChE,MAAMoB,IAAI,GAAGP,UAAU,CAACrD,OAAO,CAAC,cAAc,EAAE,gBAAgB,CAAC;MACjE,MAAM6D,IAAI,GAAGR,UAAU,CAACrD,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;MACpD,IAAI4D,IAAI,KAAKP,UAAU,IAAIQ,IAAI,KAAKR,UAAU,EAAE;QAC9C,OAAOH,eAAe,CAAC,CAAC,GAAGrD,SAAS,EAAE,GAAG6D,QAAQ,CAAC,EAAE,CAAC,GAAG9D,UAAU,EAAEgE,IAAI,EAAEC,IAAI,CAAC,CAAC;MAClF;IACF;IAEA,IAAIR,UAAU,CAACb,KAAK,CAAC,4CAA4C,CAAC,EAAE;MAAE;MACpE,MAAMmB,GAAG,GAAGN,UAAU,CAACrD,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;MACrD,IAAI2D,GAAG,KAAKN,UAAU,EAAE;QACtB,OAAOH,eAAe,CAAC,CAAC,GAAGrD,SAAS,EAAE,GAAG6D,QAAQ,CAAC,EAAE,CAAC,GAAG9D,UAAU,EAAE+D,GAAG,CAAC,CAAC;MAC3E;IACF;IAEA,IAAIN,UAAU,CAACb,KAAK,CAAC,iBAAiB,CAAC,EAAE;MAAE;MACzC,MAAMmB,GAAG,GAAGN,UAAU,CAACrD,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC;MAAE;MACnDA,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC;MAAE;MAC3BA,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;MAAE;MAC1B;MACAA,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;MACpC,IAAI2D,GAAG,KAAKN,UAAU,EAAE;QACtB,OAAOH,eAAe,CAAC,CAACS,GAAG,EAAE,GAAG9D,SAAS,EAAE,GAAG6D,QAAQ,CAAC,EAAE,CAAC,GAAG9D,UAAU,EAAE+D,GAAG,CAAC,CAAC;MAChF;MACA;MACA;IACF;;IAEA;IACA,IAAIN,UAAU,CAACb,KAAK,CAAC,kDAAkD,CAAC,EAAE;MACxE,MAAMmB,GAAG,GAAGN,UAAU,CAACrD,OAAO,CAAC,+BAA+B,EAAE,OAAO,CAAC,CAAC,CAAC;MAC1E;MACA;MACA,IAAI2D,GAAG,CAACnB,KAAK,CAAC,iCAAiC,CAAC,EAAE;QAChD,MAAMqB,IAAI,GAAGF,GAAG,CAAC3D,OAAO,CAAC,gCAAgC,EAAE,IAAI,CAAC,CAAC,CAAC;QAClE;QACA,OAAOkD,eAAe,CAAC,CAAC,GAAGrD,SAAS,EAAE,GAAG6D,QAAQ,CAAC,EAAE,CAAC,GAAG9D,UAAU,EAAE+D,GAAG,EAAEE,IAAI,CAAC,CAAC;MACjF;MACA,OAAOX,eAAe,CAAC,CAAC,GAAGrD,SAAS,EAAE,GAAG6D,QAAQ,CAAC,EAAE,CAAC,GAAG9D,UAAU,EAAE+D,GAAG,CAAC,CAAC;IAC3E;IAGA,MAAMG,eAAe,GAAGT,UAAU,CAACb,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAGa,UAAU,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;;IAE7F,MAAMU,aAAa,GAAG,CAAC,GAAGnE,UAAU,EAAE,GAAG6D,OAAO,EAAE,GAAGH,UAAU,EAAE,GAAGE,IAAI,EAAE,GAAGM,eAAe,CAAC;IAE7F,IAAIL,OAAO,CAAC7E,MAAM,EAAE;MAClB,OAAOsE,eAAe,CAAC,CAAC,GAAGrD,SAAS,EAAE,GAAG6D,QAAQ,CAAC,EAAEK,aAAa,CAAC;IACpE;IAEA,OAAOb,eAAe,CAAC,CAAC,GAAGrD,SAAS,EAAE,GAAG6D,QAAQ,CAAC,EAAEK,aAAa,CAAC;EACpE;EAEA,SAASR,oBAAoBA,CAACS,MAAM,EAAE;IAAE;IACtC;IACA;IACA,IAAIA,MAAM,KAAK,IAAAC,iDAAwB,EAACD,MAAM,CAAC,EAAE;MAC/C,OAAO,EAAE;IACX;IACA,MAAMV,UAAU,GAAGY,MAAM,CAAC,IAAAC,uCAAc,EAACH,MAAM,CAAC,CAAC,CAAChE,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;IAChF;IACA,IAAIsD,UAAU,KAAKU,MAAM,EAAE;MAAE;MAC3B,OAAO,EAAE;IACX;IACA,OAAO,CAACV,UAAU,CAAC;EACrB;AAEF;AAEA,SAASc,uBAAuBA,CAACjF,KAAK,EAAE;EACtC,MAAMkF,eAAe,GAAG,IAAAC,gEAAmC,EAACnF,KAAK,CAAC;EAClE,OAAO,IAAA6D,oBAAa,EAACqB,eAAe,CAAC;AACvC;AAEA,SAASE,oCAAoCA,CAAClG,MAAM,EAAE;EAAE;EACtD,MAAMmG,aAAa,GAAG,IAAAC,qCAAgB,EAACpG,MAAM,CAAC;EAC9C,MAAMqG,gBAAgB,GAAG,IAAAC,4DAAuC,EAACH,aAAa,CAAC;EAC/E,MAAMI,MAAM,GAAGJ,aAAa,KAAK,GAAG,IAAInG,MAAM,CAACS,MAAM,CAACyB,IAAI,CAACtB,CAAC,IAAIA,CAAC,CAAC2C,GAAG,KAAK,KAAK,IAAI,IAAAiD,6DAAwC,EAAC5F,CAAC,CAAC,CAAC;EAC/H,IAAI,CAACyF,gBAAgB,IAAIE,MAAM,EAAE;IAC/B,OAAO,EAAE;EACX;EACA,MAAME,cAAc,GAAGzG,MAAM,CAACS,MAAM,CAACqB,MAAM,CAAClB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC6C,QAAQ,CAAC7C,CAAC,CAAC2C,GAAG,CAAC,IAAI,IAAAmD,uBAAgB,EAAC9F,CAAC,EAAE,GAAG,CAAC,CAAC;EAE5G,OAAO+F,mBAAmB,CAACF,cAAc,CAAC;EAE1C,SAASE,mBAAmBA,CAAClG,MAAM,EAAEmG,OAAO,GAAG,EAAE,EAAE;IACjD,MAAM,CAAC9D,SAAS,EAAE,GAAGC,eAAe,CAAC,GAAGtC,MAAM;IAC9C,IAAIqC,SAAS,KAAKrB,SAAS,EAAE;MAC3B,OAAOmF,OAAO;IAChB;IAEA,MAAMC,uBAAuB,GAAGd,uBAAuB,CAACjD,SAAS,CAAC;IAClE,MAAMwC,GAAG,GAAGuB,uBAAuB,CAAClF,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC;IAAE;IACrEA,OAAO,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAAE;IAC5CA,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,CAAC;IACrC,MAAMmF,SAAS,GAAG,CAACxB,GAAG,EAAE,GAAGA,GAAG,aAAa,CAAC,CAACxD,MAAM,CAACT,GAAG,IAAIA,GAAG,KAAKwF,uBAAuB,CAAC;IAC3F,IAAIC,SAAS,CAACvG,MAAM,EAAE;MACpB,OAAOoG,mBAAmB,CAAC5D,eAAe,EAAE,CAAC,GAAG6D,OAAO,EAAE,GAAGE,SAAS,CAAC,CAAC;IACzE;IACA,OAAOH,mBAAmB,CAAC5D,eAAe,EAAE6D,OAAO,CAAC;EACtD;AACF;AAEO,SAASG,kCAAkCA,CAAC/G,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EAAE;EACvE,MAAMiH,wBAAwB,GAAGvC,0BAA0B,CAACzE,MAAM,CAAC;EACnE,MAAMiH,kCAAkC,GAAGf,oCAAoC,CAAClG,MAAM,CAAC;;EAEvF;EACA;;EAEA,MAAMkH,IAAI,GAAGlH,MAAM,CAACS,MAAM,CAACqB,MAAM,CAAChB,KAAK,IAAIqG,gBAAgB,CAACrG,KAAK,CAAC,CAAC;EAEnE,MAAMsG,sBAAsB,GAAGF,IAAI,CAACxC,GAAG,CAAC9D,CAAC,IAAI,IAAA+D,oBAAa,EAAC/D,CAAC,CAAC,CAAC;EAE9D,IAAIb,GAAG,EAAE;IAAE;IACTmH,IAAI,CAACvG,OAAO,CAACG,KAAK,IAAI;MACpB;MACAd,MAAM,CAACsD,WAAW,CAACxC,KAAK,CAAC;IAC3B,CAAC,CAAC;EACJ;EAEA,OAAOsG,sBAAsB;EAE7B,SAASD,gBAAgBA,CAACrG,KAAK,EAAE;IAC/B,MAAMiD,aAAa,GAAG,IAAAY,oBAAa,EAAC7D,KAAK,CAAC;IAC1C,IAAIkG,wBAAwB,CAACvD,QAAQ,CAACM,aAAa,CAAC,EAAE;MACpD,OAAO,IAAI;IACb;IACA,MAAM8C,uBAAuB,GAAGd,uBAAuB,CAACjF,KAAK,CAAC;IAC9D,IAAImG,kCAAkC,CAACxD,QAAQ,CAACoD,uBAAuB,CAAC,EAAE;MACxE,OAAO,IAAI;IACb;IAEA,OAAO,KAAK;EACd;AACF;AAGO,SAASxG,wBAAwBA,CAACL,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EAC3D,MAAMsH,UAAU,GAAGN,kCAAkC,CAAC/G,MAAM,EAAED,GAAG,CAAC,CAAC,CAAC;EACpE;EACA,MAAMuH,WAAW,GAAG/E,oBAAoB,CAACvC,MAAM,EAAED,GAAG,CAAC,CAAC,CAAC;EACvD;;EAEA,IAAAE,cAAO,EAAC,kBAAkBoH,UAAU,CAACE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE7H,KAAK,CAAC;EAC3D,IAAAO,cAAO,EAAC,oBAAoBqH,WAAW,CAACC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE7H,KAAK,CAAC;EAE9D,MAAM8H,aAAa,GAAGH,UAAU,CAACI,MAAM,CAACH,WAAW,CAAC,CAAC,CAAC;;EAEtD,OAAOE,aAAa;AACtB","ignoreList":[]}
1
+ {"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","_subfield8Utils","_prepublicationUtils","_normalizeFieldForComparison","_normalizeUtf8Diacritics","e","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeInferiorDatafields","duplicates","length","deriveInferiorChains","fields","hash","forEach","f","fieldToChainToDeletables","field","chain","fieldToChain","chainAsString","fieldsToNormalizedString","arr","deriveChainDeletables","val","todoList","deletables","stillToDo","undefined","withoutScriptIdentificationCode","replace","keepless","linked490Ind1","filter","isRelevantChain6","fieldHasValidSubfield6","fieldHasValidSubfield8","some","subfields","sf","code","sameField","removeInferiorChains","deletableChainsAsKeys","nChains","Object","keys","innerRemoveInferiorChains","deletedStringsArray","currField","remainingFields","triggeringField","triggeringChain","chainContains1XX","sevenToOne","deletedString","fieldsToString","removeField","tag","substring","includes","pairs","fieldGetOccurrenceNumberPairs","pairedField","fieldSevenToOneOccurrenceNumber","getIdentifierlessAndKeeplessSubsets","fieldAsString","identifierlessString","keeplessString","deriveIndividualDeletables490","match","sixless","withoutFinalVOrX","xless","xvless","modifiedInd2","deriveIndividualDeletables","map","fieldToString","deletableStringsArray","processTodoList","inferiorTerms","getInferiorTerms","uniqArray","inputFields","result","flatMap","fieldToInferiorFields","aArray","value","thingsToDo","currString","accentless","getAccentlessVersion","d490","subsets","moreToDo","tmp","tmp1","tmp2","getPrepublicationTerms","newDeletables","string","precomposeFinnishLetters","String","fixComposition","fieldToNormalizedString","normalizedField","cloneAndNormalizeFieldForComparison","deriveIndividualNormalizedDeletables","encodingLevel","getEncodingLevel","recordIsFinished","encodingLevelIsBetterThanPrepublication","met495","fieldRefersToKoneellisestiTuotettuTietue","relevantFields","fieldHasSubfield","deriveDeletable946s","results","fieldAsNormalizedString","candArray","removeIndividualInferiorDatafields","deletableFieldsAsStrings","deletableFieldsAsNormalizedStrings","hits","isDeletableField","deletedFieldsAsStrings","removables","removables6","join","removablesAll","concat"],"sources":["../src/removeInferiorDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToChain, sameField} from './removeDuplicateDataFields';\nimport {fieldGetOccurrenceNumberPairs, fieldHasValidSubfield6, fieldSevenToOneOccurrenceNumber, fieldsToNormalizedString} from './subfield6Utils';\nimport {fieldHasSubfield, fieldsToString, fieldToString, nvdebug, uniqArray} from './utils';\nimport {fieldHasValidSubfield8} from './subfield8Utils';\nimport {encodingLevelIsBetterThanPrepublication, fieldRefersToKoneellisestiTuotettuTietue, getEncodingLevel} from './prepublicationUtils';\nimport {cloneAndNormalizeFieldForComparison} from './normalizeFieldForComparison';\nimport {fixComposition, precomposeFinnishLetters} from './normalize-utf8-diacritics';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\n// NB! This validator handles only full fields, and does not support subfield $8 removal.\n// Also, having multiple $8 subfields in same fields is not supported.\n// If this functionality is needed, see removeDuplicateDatafields.js for examples of subfield-only stuff.\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeInferiorDataFields');\n\nexport default function () {\n return {\n description: 'Remove subset data fields. Certain exceptions apply, mainly too complicated for chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix record: remove inferior (eg. subset) data fields', debug);\n const res = {message: [], fix: [], valid: true};\n removeInferiorDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: remove inferior (eg. subset) data fields', debug);\n\n const duplicates = removeInferiorDatafields(record, false);\n\n const res = {message: duplicates};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction deriveInferiorChains(fields, record) {\n //nvdebug(`======= GOT ${fields.length} FIELDS TO CHAINIFY`);\n const hash = {};\n\n fields.forEach(f => fieldToChainToDeletables(f));\n\n return hash;\n\n //nvdebug(`WP1: GOT ${todoList.length} CHAINS`);\n\n\n // here we map deletableStringObject[str] => field. The idea is to help debugging. We don't actually need the field object...\n //return deriveChainDeletables(todoList);\n\n function fieldToChainToDeletables(field) {\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n const arr = deriveChainDeletables([chainAsString]);\n //nvdebug(`GOT ${arr.length} DELETABLES FOR ${chainAsString}`);\n arr.forEach(val => {\n if (!(val in hash)) { // eslint-disable-line functional/no-conditional-statements\n hash[val] = field; // eslint-disable-line functional/immutable-data\n }\n });\n }\n\n function deriveChainDeletables(todoList, deletables = []) {\n const [chainAsString, ...stillToDo] = todoList;\n if (chainAsString === undefined) {\n return deletables;\n }\n\n // Fix MRA-476 (part 1): one $6 value can be worse than the other\n const withoutScriptIdentificationCode = chainAsString.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\\/[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group\n\n // Remove keepless versions:\n const keepless = chainAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n // MRA-433: 490 ind1=1 vs ind1=0: remove latter (luckily no 2nd indicator etc)\n const linked490Ind1 = chainAsString.replace(/^490 1/u, '490 0').replace(/\\t880 1/ug, '\\t880 0');\n const arr = [withoutScriptIdentificationCode, keepless, linked490Ind1].filter(val => val !== chainAsString);\n if (arr.length > 0) {\n return deriveChainDeletables([...stillToDo, ...arr], [...deletables, ...arr]);\n }\n\n return deriveChainDeletables(stillToDo, deletables);\n }\n\n}\n\nfunction isRelevantChain6(field, record) {\n //Can't be a chain:\n if (!fieldHasValidSubfield6(field) && !fieldHasValidSubfield8(field)) {\n return false;\n }\n // Too short to be a chain:\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return false;\n }\n // No field can contains no more than one subfield $6\n if (chain.some(f => f.subfields.filter(sf => sf.code === '6').length > 1)) {\n return false;\n }\n\n // Check whether our field is the head of a chain:\n return sameField(field, chain[0]);\n}\n\nexport function removeInferiorChains(record, fix = true) {\n const fields = record.fields.filter(f => isRelevantChain6(f, record));\n //nvdebug(`WP2.0: GOT ${fields.length} chain(s)`);\n\n const deletableChainsAsKeys = deriveInferiorChains(fields, record);\n const nChains = Object.keys(deletableChainsAsKeys).length;\n //nvdebug(`WP2: GOT ${nChains} chain(s)`);\n if (nChains === 0) {\n return [];\n }\n\n //nvdebug(`removeInferiorChains() has ${fields.length} fields-in-chain(s), and a list of ${nChains} deletable(s)`);\n\n return innerRemoveInferiorChains(fields);\n\n function innerRemoveInferiorChains(fields, deletedStringsArray = []) {\n const [currField, ...remainingFields] = fields;\n\n if (currField === undefined) {\n return deletedStringsArray;\n }\n\n const chain = fieldToChain(currField, record);\n if (chain.length === 0 || !sameField(currField, chain[0])) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n if (!(chainAsString in deletableChainsAsKeys)) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const triggeringField = deletableChainsAsKeys[chainAsString];\n const triggeringChain = fieldToChain(triggeringField, record);\n\n // If the inferior (deletable) chain is 1XX-based, convert the triggering better chain from 7XX to 1XX:\n if (chainContains1XX(chain)) { // eslint-disable-line functional/no-conditional-statements\n triggeringChain.forEach(f => sevenToOne(f, triggeringChain));\n }\n //nvdebug(`iRIS6C: ${chainAsString}`);\n const deletedString = fieldsToString(chain);\n const message = `DEL: '${deletedString}' REASON: '${fieldsToString(triggeringChain)}'`;\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(`INFERIOR $6 CHAIN REMOVAL: ${message}}`, debug);\n chain.forEach(field => record.removeField(field));\n }\n return innerRemoveInferiorChains(remainingFields, [...deletedStringsArray, message]);\n }\n\n function chainContains1XX(chain) {\n return chain.some(f => f.tag.substring(0, 1) === '1');\n }\n\n function sevenToOne(field, chain) { // Change 7XX field to 1XX field. Also handle the corresponding 880$6 7XX-NN subfields\n // NB! This function should be called only if the original 1XX gets deleted!\n if (!['700', '710', '711', '730'].includes(field.tag)) {\n return;\n }\n // Retag field 7XX as 1XX and fix corresponding occurrence numbers as well:\n const pairs = fieldGetOccurrenceNumberPairs(field, chain);\n field.tag = `1${field.tag.substring(1)}`; // eslint-disable-line functional/immutable-data\n // There should always be one pair, but I'm not sanity-checking this\n pairs.forEach(pairedField => fieldSevenToOneOccurrenceNumber(pairedField));\n }\n\n}\n\n\nfunction getIdentifierlessAndKeeplessSubsets(fieldAsString) {\n // The rules below are not perfect (in complex cases they don't catch all permutations), but good enough:\n // Remove identifier(s) (MELKEHITYS-2383-ish):\n\n const identifierlessString = fieldAsString.replace(/ ‡[01] [^‡]+($| ‡)/u, '$1'); // eslint-disable-line prefer-named-capture-group\n const keeplessString = fieldAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n return [identifierlessString, keeplessString].filter(val => val !== fieldAsString);\n}\n\nfunction deriveIndividualDeletables490(todoList, deletables = []) {\n const [fieldAsString, ...stillToDo] = todoList;\n if (fieldAsString === undefined) {\n return deletables;\n }\n //nvdebug(`PROCESS ${fieldAsString}`);\n if (!fieldAsString.match(/^490/u)) {\n return deriveIndividualDeletables490(stillToDo, deletables);\n }\n\n // $6-less version (keep this first)\n const sixless = fieldAsString.replace(/ ‡6 [^‡]+ ‡/u, ' ‡');\n\n // Without final $v or $x:\n const withoutFinalVOrX = fieldAsString.replace(/ *[;,] ‡[vx] [^‡]+$/u, '');\n // Add intermediate $x-less version\n const xless = fieldAsString.replace(/, ‡x [^‡]+(, ‡x| ; ‡v)/u, '$1'); // eslint-disable-line prefer-named-capture-group\n\n // Add $xv-less version (handled by recursion?)\n const xvless = fieldAsString.replace(/, ‡x [^‡]+ ‡v [^‡]+$/u, '');\n\n // MRA-433-ish (non-chain): 490 ind1=1 vs ind1=0: remove latter\n const modifiedInd2 = fieldAsString.match(/^490 1/u) ? `490 0${fieldAsString.substring(5)}` : fieldAsString;\n\n const arr = [sixless, withoutFinalVOrX, xless, xvless, modifiedInd2].filter(val => val !== fieldAsString);\n\n /*\n if (arr.length) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`${arr.length} derivation(s) for ${fieldAsString}`);\n nvdebug(arr.join('\\n'));\n }\n */\n return arr;\n}\n\nfunction deriveIndividualDeletables(record) {\n const todoList = record.fields.map(f => fieldToString(f));\n //const finishedRecord = encodingLevelIsBetterThanPrepublication(getEncodingLevel(record));\n\n const deletableStringsArray = processTodoList(todoList);\n\n const inferiorTerms = getInferiorTerms(record);\n\n return uniqArray([...deletableStringsArray, ...inferiorTerms]);\n\n function getInferiorTerms(record) {\n const inputFields = record.fields.filter(f => ['648', '650', '651'].includes(f.tag) && f.subfields);\n const result = inputFields.flatMap(f => fieldToInferiorFields(f));\n\n // console.log(result.join('\\n')); // eslint-disable-line no-console\n return result;\n }\n\n function fieldToInferiorFields(field) {\n const aArray = field.subfields.filter(sf => sf.code === 'a');\n if (field.tag === '650') {\n return aArray.flatMap(sf => [`653 ## ‡a ${sf.value}`, `653 #0 ‡a ${sf.value}`]);\n }\n return aArray.map(sf => `653 ## ‡a ${sf.value}`);\n }\n\n function processTodoList(thingsToDo, deletables = []) {\n const [currString, ...stillToDo] = thingsToDo;\n\n if (currString === undefined) {\n return deletables;\n }\n\n const accentless = getAccentlessVersion(currString);\n const d490 = deriveIndividualDeletables490([currString]);\n const subsets = getIdentifierlessAndKeeplessSubsets(currString); // eslint-disable-line no-param-reassign\n const moreToDo = [...accentless, ...d490, ...subsets];\n\n\n if (currString.match(/^[1678]00/u)) {\n // Proof-of-concept rule. Should be improved eventually...\n if (currString.match(/, ‡e [^‡]+\\.$/u)) {\n const tmp = currString.replace(/, ‡e [^‡]+\\.$/u, '.');\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Lisäpainokset: Lisäpainos /u)) { // MET-569\n const tmp1 = currString.replace(' Lisäpainos ', ' [Lisäpainos] ');\n const tmp2 = currString.replace(' Lisäpainos ', ' ');\n if (tmp1 !== currString && tmp2 !== currString) {\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp1, tmp2]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Lisäpainokset: \\[Lisäpainos\\] /u)) { // MET-569\n const tmp = currString.replace(' [Lisäpainos] ', ' ');\n if (tmp !== currString) {\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n }\n\n if (currString.match(/^505 .0.*-- ‡t/u)) { // MRA-413-ish\n const tmp = currString.replace(/ -- ‡t /gu, ' -- '). // remove non-initial $t subfields\n replace(/ ‡[rg] /gu, ' '). // remove $r and $g subfields\n replace(/ ‡t /u, ' ‡a '). // change first $t to $a\n // ind2: '1' => '#':\n replace(/^505 (.)0/u, '505 $1#'); // eslint-disable-line prefer-named-capture-group\n if (tmp !== currString) {\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n //nvdebug(`505 ORIGINAL: '${fieldAsString}'`)\n //nvdebug(`505 DERIVATE: '${tmp}'`)\n }\n\n // MET-381: remove occurence number TAG-00, if TAG-NN existists\n if (currString.match(/^880.* ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/u)) {\n const tmp = currString.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/u, '$1-00'); // eslint-disable-line prefer-named-capture-group\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp}'`);\n //deletableStringsArray.push(tmp);\n if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\\/[^ ]+ /u)) {\n const tmp2 = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp2}'`);\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp, tmp2]);\n }\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n\n // MET-575 (merge: applies in postprocessing)\n const inferiorTerms = getPrepublicationTerms(currString);\n\n const newDeletables = [...deletables, ...subsets, ...accentless, ...d490, ...inferiorTerms];\n\n if (subsets.length) {\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n function getAccentlessVersion(string) { // MET-527\n //nvdebug(`START: '${string}`);\n // This is a sanity check: if precomposition does something, there's something wrong, and we don't want to proceed..\n if (string !== precomposeFinnishLetters(string)) {\n return [];\n }\n const accentless = String(fixComposition(string)).replace(/\\p{Diacritic}/gu, '');\n //nvdebug(`FROM '${string}'\\n TO '${accentless}'`);\n if (accentless === string) { // Don't self-destruct\n return [];\n }\n return [accentless];\n }\n\n function getPrepublicationTerms(fieldAsString) {\n if (fieldAsString.match(/^653./u)) {\n // MET-528 (extented by MET-575)\n return [`${fieldAsString} ‡g ENNAKKOTIETO`, `${fieldAsString} ‡g ennakkotieto`, `${fieldAsString} ‡g ENNAKKOTIETO.`, `${fieldAsString} ‡g ennakkotieto.`];\n }\n\n return [];\n }\n\n}\n\nfunction fieldToNormalizedString(field) {\n const normalizedField = cloneAndNormalizeFieldForComparison(field);\n return fieldToString(normalizedField);\n}\n\nfunction deriveIndividualNormalizedDeletables(record) { // MET-461:\n const encodingLevel = getEncodingLevel(record);\n const recordIsFinished = encodingLevelIsBetterThanPrepublication(encodingLevel);\n const met495 = encodingLevel === '2' && record.fields.some(f => f.tag === '500' && fieldRefersToKoneellisestiTuotettuTietue(f));\n if (!recordIsFinished || met495) {\n return [];\n }\n const relevantFields = record.fields.filter(f => ['245', '246'].includes(f.tag) && fieldHasSubfield(f, 'a'));\n\n return deriveDeletable946s(relevantFields);\n\n function deriveDeletable946s(fields, results = []) {\n const [currField, ...remainingFields] = fields;\n if (currField === undefined) {\n return results;\n }\n\n const fieldAsNormalizedString = fieldToNormalizedString(currField);\n const tmp = fieldAsNormalizedString.replace(/^(?:...) ../u, '946 ##'). // <= Change tag to 946 and indicators to '##'\n replace(' ‡a ', ' ‡i nimeke onixissa ‡a '). // Add $i before $a. NB! This is added in the normalized lower-cased form!\n replace(/(?: \\/)? ‡c[^‡]+$/u, ''); // Remove $c. (Can $c be non-last?)\n const candArray = [tmp, `${tmp} ‡5 MELINDA`].filter(val => val !== fieldAsNormalizedString);\n if (candArray.length) {\n return deriveDeletable946s(remainingFields, [...results, ...candArray]);\n }\n return deriveDeletable946s(remainingFields, results);\n }\n}\n\nexport function removeIndividualInferiorDatafields(record, fix = true) { // No $6 nor $8 in field\n const deletableFieldsAsStrings = deriveIndividualDeletables(record);\n const deletableFieldsAsNormalizedStrings = deriveIndividualNormalizedDeletables(record);\n\n // nvdebug(`Deletables:\\n ${deletableFieldsAsStrings.join('\\n ')}`);\n // nvdebug(`Normalized deletables:\\n ${deletableFieldsAsNormalizedStrings.join('\\n ')}`);\n\n const hits = record.fields.filter(field => isDeletableField(field));\n\n const deletedFieldsAsStrings = hits.map(f => fieldToString(f));\n\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n hits.forEach(field => {\n //nvdebug(`Remove inferior field: ${fieldToString(field)}`, debug);\n record.removeField(field);\n });\n }\n\n return deletedFieldsAsStrings;\n\n function isDeletableField(field) {\n const fieldAsString = fieldToString(field);\n if (deletableFieldsAsStrings.includes(fieldAsString)) {\n return true;\n }\n const fieldAsNormalizedString = fieldToNormalizedString(field);\n if (deletableFieldsAsNormalizedStrings.includes(fieldAsNormalizedString)) {\n return true;\n }\n\n return false;\n }\n}\n\n\nexport function removeInferiorDatafields(record, fix = true) {\n const removables = removeIndividualInferiorDatafields(record, fix); // Lone fields\n //const removables8 = removeDuplicateSubfield8Chains(record, fix); // Lone subfield $8 chains\n const removables6 = removeInferiorChains(record, fix); // Lone subfield $6 chains\n // HOW TO HANDLE $6+$8 combos? Skipping is relatively OK.\n\n nvdebug(`REMOVABLES:\\n ${removables.join('\\n ')}`, debug);\n nvdebug(`REMOVABLES 6:\\n ${removables6.join('\\n ')}`, debug);\n\n const removablesAll = removables.concat(removables6); //.concat(removables8);\n\n return removablesAll;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -86,7 +86,8 @@ function swapRelatorTermSubfields(field, typeOfMaterial = undefined) {
86
86
  return;
87
87
  }
88
88
  const subfieldCode = tagToRelatorTermSubfieldCode(field.tag);
89
- console.log(`Processing ${(0, _utils.fieldToString)(field)}`); // eslint-disable-line no-console
89
+
90
+ //console.log(`Processing ${fieldToString(field)}`); // eslint-disable-line no-console
90
91
 
91
92
  const swapPosition = field.subfields.findIndex((subfield, index) => isSwappable(subfield, index));
92
93
  if (swapPosition > 0) {
@@ -94,10 +95,11 @@ function swapRelatorTermSubfields(field, typeOfMaterial = undefined) {
94
95
  swapRelatorTermSubfields(field, typeOfMaterial); // uh, evil recursion...
95
96
  return;
96
97
  }
97
- console.log(`END ${(0, _utils.fieldToString)(field)}`); // eslint-disable-line no-console
98
+
99
+ //console.log(`END ${fieldToString(field)}`); // eslint-disable-line no-console
98
100
 
99
101
  function swapRelatorTermPair(index) {
100
- console.log(` SWAP`); // eslint-disable-line no-console
102
+ //console.log(` SWAP`); // eslint-disable-line no-console
101
103
 
102
104
  // Swap:
103
105
  const tmp = field.subfields[index - 1];
@@ -120,7 +122,7 @@ function swapRelatorTermSubfields(field, typeOfMaterial = undefined) {
120
122
  return false;
121
123
  }
122
124
  const prevScore = (0, _sortFields.scoreRelatorTerm)(prevSubfield.value, typeOfMaterial);
123
- console.log(`PREV: ${prevSubfield.value}/${prevScore}, CURR: ${sf.value}/${currScore}`); // eslint-disable-line no-console
125
+ // console.log(`PREV: ${prevSubfield.value}/${prevScore}, CURR: ${sf.value}/${currScore}`); // eslint-disable-line no-console
124
126
  // If this subfield maps to a Work, then subfields can be swapped, even if we don't have a score for the prev subfield!
125
127
  if (prevScore === 0 && currScore < WORST_WORK) {
126
128
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"sortRelatorTerms.js","names":["_clone","_interopRequireDefault","require","_utils","_punctuation","_sortFields","e","__esModule","default","WORST_WORK","_default","description","validate","fix","record","res","message","valid","typeOfMaterial","recordToTypeOfMaterial","fields","forEach","field","sortAdjacentRelatorTerms","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","leader","undefined","charAt","getTypeOfMaterial","tagToRelatorTermSubfieldCode","tag","includes","isRelatorTermTag","swapRelatorTermSubfields","subfields","subfieldCode","console","log","swapPosition","findIndex","subfield","index","isSwappable","swapRelatorTermPair","tmp","fieldFixPunctuation","sf","code","currScore","scoreRelatorTerm","value","prevSubfield","prevScore"],"sources":["../src/sortRelatorTerms.js"],"sourcesContent":["// Validator/fixer for sorting $e relator term subfields\n//\n// Author(s): Nicholas Volk\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport {fieldFixPunctuation} from './punctuation2';\nimport {scoreRelatorTerm} from './sortFields';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortRelatorTerms');\n//const debugData = debug.extend('data');\n\nconst WORST_WORK = 81;\n\n\nexport default function () {\n\n return {\n description: 'Sort adjacent $e subfields in field [1678][01]0',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n sortAdjacentRelatorTerms(field, typeOfMaterial);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentRelatorTerms(clonedField, typeOfMaterial);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${fieldAsString} => ${clonedFieldAsString}`); // eslint-disable-line functional/immutable-data\n }\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction recordToTypeOfMaterial(record) {\n if (!record.leader) {\n return undefined;\n }\n\n if (record.leader.charAt(6) === 'i') { // Audio books should follow rules of a book, I guess...\n return 'BK';\n }\n\n return record.getTypeOfMaterial();\n}\n\nexport function tagToRelatorTermSubfieldCode(tag) {\n if (['100', '110', '600', '610', '700', '710', '720', '751', '752', '800', '810'].includes(tag)) {\n return 'e';\n }\n if (['111', '611', '711', '811'].includes(tag)) {\n return 'j';\n }\n return '?'; // No need to complain. Nothing is found.\n}\n\nfunction isRelatorTermTag(tag) {\n // NV: 111/711, 751 and 752 are very rare\n return ['e', 'j'].includes(tagToRelatorTermSubfieldCode(tag));\n}\n\nfunction swapRelatorTermSubfields(field, typeOfMaterial = undefined) {\n if (!field.subfields) {\n return;\n }\n\n const subfieldCode = tagToRelatorTermSubfieldCode(field.tag);\n\n console.log(`Processing ${fieldToString(field)}`); // eslint-disable-line no-console\n\n const swapPosition = field.subfields.findIndex((subfield, index) => isSwappable(subfield, index));\n\n if (swapPosition > 0) {\n swapRelatorTermPair(swapPosition);\n swapRelatorTermSubfields(field, typeOfMaterial); // uh, evil recursion...\n return;\n }\n\n console.log(`END ${fieldToString(field)}`); // eslint-disable-line no-console\n\n function swapRelatorTermPair(index) {\n console.log(` SWAP`); // eslint-disable-line no-console\n\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = field.subfields[index]; // eslint-disable-line functional/immutable-data\n field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data\n fieldFixPunctuation(field);\n return true;\n }\n\n function isSwappable(sf, index) {\n // NB! we should fix 'e' to 'e' or 'j'....\n if (index === 0 || sf.code !== subfieldCode) {\n return false;\n }\n const currScore = scoreRelatorTerm(sf.value, typeOfMaterial);\n if (currScore === 0) {\n return false;\n }\n const prevSubfield = field.subfields[index - 1];\n if (prevSubfield.code !== subfieldCode) {\n return false;\n }\n const prevScore = scoreRelatorTerm(prevSubfield.value, typeOfMaterial);\n console.log(`PREV: ${prevSubfield.value}/${prevScore}, CURR: ${sf.value}/${currScore}`); // eslint-disable-line no-console\n // If this subfield maps to a Work, then subfields can be swapped, even if we don't have a score for the prev subfield!\n if (prevScore === 0 && currScore < WORST_WORK) {\n return false;\n }\n return currScore > prevScore;\n }\n\n}\n\nexport function sortAdjacentRelatorTerms(field, typeOfMaterial = undefined) {\n if (!field.subfields || !isRelatorTermTag(field.tag)) {\n return field;\n }\n swapRelatorTermSubfields(field, typeOfMaterial);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"sortRelatorTerms.js","names":["_clone","_interopRequireDefault","require","_utils","_punctuation","_sortFields","e","__esModule","default","WORST_WORK","_default","description","validate","fix","record","res","message","valid","typeOfMaterial","recordToTypeOfMaterial","fields","forEach","field","sortAdjacentRelatorTerms","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","leader","undefined","charAt","getTypeOfMaterial","tagToRelatorTermSubfieldCode","tag","includes","isRelatorTermTag","swapRelatorTermSubfields","subfields","subfieldCode","swapPosition","findIndex","subfield","index","isSwappable","swapRelatorTermPair","tmp","fieldFixPunctuation","sf","code","currScore","scoreRelatorTerm","value","prevSubfield","prevScore"],"sources":["../src/sortRelatorTerms.js"],"sourcesContent":["// Validator/fixer for sorting $e relator term subfields\n//\n// Author(s): Nicholas Volk\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport {fieldFixPunctuation} from './punctuation2';\nimport {scoreRelatorTerm} from './sortFields';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortRelatorTerms');\n//const debugData = debug.extend('data');\n\nconst WORST_WORK = 81;\n\n\nexport default function () {\n\n return {\n description: 'Sort adjacent $e subfields in field [1678][01]0',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n sortAdjacentRelatorTerms(field, typeOfMaterial);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentRelatorTerms(clonedField, typeOfMaterial);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${fieldAsString} => ${clonedFieldAsString}`); // eslint-disable-line functional/immutable-data\n }\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction recordToTypeOfMaterial(record) {\n if (!record.leader) {\n return undefined;\n }\n\n if (record.leader.charAt(6) === 'i') { // Audio books should follow rules of a book, I guess...\n return 'BK';\n }\n\n return record.getTypeOfMaterial();\n}\n\nexport function tagToRelatorTermSubfieldCode(tag) {\n if (['100', '110', '600', '610', '700', '710', '720', '751', '752', '800', '810'].includes(tag)) {\n return 'e';\n }\n if (['111', '611', '711', '811'].includes(tag)) {\n return 'j';\n }\n return '?'; // No need to complain. Nothing is found.\n}\n\nfunction isRelatorTermTag(tag) {\n // NV: 111/711, 751 and 752 are very rare\n return ['e', 'j'].includes(tagToRelatorTermSubfieldCode(tag));\n}\n\nfunction swapRelatorTermSubfields(field, typeOfMaterial = undefined) {\n if (!field.subfields) {\n return;\n }\n\n const subfieldCode = tagToRelatorTermSubfieldCode(field.tag);\n\n //console.log(`Processing ${fieldToString(field)}`); // eslint-disable-line no-console\n\n const swapPosition = field.subfields.findIndex((subfield, index) => isSwappable(subfield, index));\n\n if (swapPosition > 0) {\n swapRelatorTermPair(swapPosition);\n swapRelatorTermSubfields(field, typeOfMaterial); // uh, evil recursion...\n return;\n }\n\n //console.log(`END ${fieldToString(field)}`); // eslint-disable-line no-console\n\n function swapRelatorTermPair(index) {\n //console.log(` SWAP`); // eslint-disable-line no-console\n\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = field.subfields[index]; // eslint-disable-line functional/immutable-data\n field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data\n fieldFixPunctuation(field);\n return true;\n }\n\n function isSwappable(sf, index) {\n // NB! we should fix 'e' to 'e' or 'j'....\n if (index === 0 || sf.code !== subfieldCode) {\n return false;\n }\n const currScore = scoreRelatorTerm(sf.value, typeOfMaterial);\n if (currScore === 0) {\n return false;\n }\n const prevSubfield = field.subfields[index - 1];\n if (prevSubfield.code !== subfieldCode) {\n return false;\n }\n const prevScore = scoreRelatorTerm(prevSubfield.value, typeOfMaterial);\n // console.log(`PREV: ${prevSubfield.value}/${prevScore}, CURR: ${sf.value}/${currScore}`); // eslint-disable-line no-console\n // If this subfield maps to a Work, then subfields can be swapped, even if we don't have a score for the prev subfield!\n if (prevScore === 0 && currScore < WORST_WORK) {\n return false;\n }\n return currScore > prevScore;\n }\n\n}\n\nexport function sortAdjacentRelatorTerms(field, typeOfMaterial = undefined) {\n if (!field.subfields || !isRelatorTermTag(field.tag)) {\n return field;\n }\n swapRelatorTermSubfields(field, typeOfMaterial);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
@@ -8,7 +8,7 @@ var _clone = _interopRequireDefault(require("clone"));
8
8
  var _debug = _interopRequireDefault(require("debug"));
9
9
  var _utils = require("./utils");
10
10
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
- const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:sortSubfields');
11
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:translate-terms');
12
12
  const defaultTags = ['648', '650', '651', '655'];
13
13
  const swapLanguageCode = {
14
14
  'fin': 'swe',
@@ -22,8 +22,6 @@ const changeAbbrHash = {
22
22
  'sv': 'swe',
23
23
  'swe': 'sv'
24
24
  };
25
-
26
- //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/translate-term');
27
25
  const termCache = {};
28
26
 
29
27
  // Author(s): Nicholas Volk
@@ -1 +1 @@
1
- {"version":3,"file":"translate-terms.js","names":["_clone","_interopRequireDefault","require","_debug","_utils","e","__esModule","default","debug","createDebugLogger","defaultTags","swapLanguageCode","changeAbbrHash","termCache","_default","description","validate","fix","record","newFields","getFields","forEach","nf","nvdebug","fieldToString","insertField","newFieldsAsStrings","map","f","message","valid","length","messages","tags","fieldsToAdd","currTag","remainingTags","missingFields","deriveMissingFields","tmp","getPairlessFinnishAndSwedishFields","tag","expectedLex","mapTagToLex","fields","get","finnishFields","filter","isRelevantField","swedishFields","finnishOnly","getMisses","swedishOnly","tagAndFieldAgree","field","lexData","getLexiconAndLanguage","lex","pairlessFields","prefLabels","i","getPrefLabel","pairField","undefined","lexAndLang","twoLetterOtherLang","swapLanguageCodeBetweenLanguages","changeAbbr","lang","prefLabel","find","l","sfA","value","sf0","clone","subfields","sf","code","sf2","newField","ind1","ind2","subfield2","uri","fieldToUri","getTermData","subfieldA","pl","abbr","swaggerQuery","getTermDataFromFinto","headers","uri2","response","fetch","method","ok","json","graph","arr","hit","row","subfield0","id","replace","fieldAsString","match","lexLang","fieldHasSubfield","fieldHasValidSubfield0","fieldList1","fieldList2","hasSubfield0Match","pairFields","some"],"sources":["../src/translate-terms.js"],"sourcesContent":["import clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug} from './utils';\n\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortSubfields');\nconst defaultTags = ['648', '650', '651', '655'];\n\nconst swapLanguageCode = {'fin': 'swe', 'fi': 'sv', 'sv': 'fi', 'swe': 'fin'};\nconst changeAbbrHash = {'fi': 'fin', 'fin': 'fi', 'sv': 'swe', 'swe': 'sv'};\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/translate-term');\nconst termCache = {};\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n\n return {\n description: 'Translate yso (648, 650, 651) and slm (655) terms (FIN <=> SWE)',\n validate, fix\n };\n\n async function fix(record) {\n const newFields = await getFields(record, defaultTags, []);\n\n newFields.forEach(nf => nvdebug(`Add new field '${fieldToString(nf)}'`, debug));\n\n newFields.forEach(nf => record.insertField(nf));\n\n const newFieldsAsStrings = newFields.map(f => fieldToString(f));\n\n\n return {message: [], fix: newFieldsAsStrings, valid: true};\n }\n\n async function validate(record) {\n const newFields = await getFields(record, defaultTags, []);\n if (newFields.length === 0) {\n return {'message': [], 'valid': true};\n }\n const messages = newFields.map(f => fieldToString(f));\n\n return {'message': messages, 'valid': false};\n }\n\n async function getFields(record, tags, fieldsToAdd) {\n const [currTag, ...remainingTags] = tags;\n if (!currTag) {\n return fieldsToAdd;\n }\n const missingFields = await deriveMissingFields(record, currTag);\n\n const tmp = await getFields(record, remainingTags, [...fieldsToAdd, ...missingFields]);\n return tmp;\n }\n\n function getPairlessFinnishAndSwedishFields(record, tag) {\n const expectedLex = mapTagToLex(tag);\n if (!expectedLex) {\n return [];\n }\n const fields = record.get(tag);\n const finnishFields = fields.filter(f => isRelevantField(f, 'fin'));\n const swedishFields = fields.filter(f => isRelevantField(f, 'swe'));\n const finnishOnly = getMisses(finnishFields, swedishFields);\n const swedishOnly = getMisses(swedishFields, finnishFields);\n\n //console.log(` Looking at ${finnishOnly.length} + ${swedishOnly.length} fields`); // eslint-disable-line no-console\n return [...finnishOnly, ...swedishOnly].filter(f => tagAndFieldAgree(f));\n\n function tagAndFieldAgree(field) {\n // Check that tag and $2 value are pairable:\n const lexData = getLexiconAndLanguage(field); // $2 data\n return expectedLex === lexData.lex;\n }\n }\n\n async function deriveMissingFields(record, tag) {\n const pairlessFields = getPairlessFinnishAndSwedishFields(record, tag);\n\n /* eslint-disable */\n // Dunno how to handle loop+promise combo in our normal coding style. Spent half a day trying... (I reckon it takes like 2 minuts to do this properly...)\n let prefLabels = [];\n for (let i=0; i < pairlessFields.length; i += 1) {\n prefLabels[i] = await getPrefLabel(pairlessFields[i]);\n }\n /* eslint-enable */\n\n const missingFields = pairlessFields.map((f, i) => pairField(f, prefLabels[i]));\n return missingFields.filter(f => f);\n }\n\n function pairField(field, prefLabels) {\n if (!prefLabels) {\n return undefined;\n }\n //console.log(`pairField() WP 1: ${fieldToString(field)}`); // eslint-disable-line no-console\n const lexAndLang = getLexiconAndLanguage(field);\n //console.log(`pairField() WP 2: ${JSON.stringify(lexAndLang)}`); // eslint-disable-line no-console\n const twoLetterOtherLang = swapLanguageCodeBetweenLanguages(changeAbbr(lexAndLang.lang));\n const prefLabel = prefLabels.find(l => l.lang === twoLetterOtherLang);\n //console.log(`pairField() WP 4: ${JSON.stringify(prefLabel)}`); // eslint-disable-line no-console\n const sfA = {'code': 'a', 'value': prefLabel.value}; // field.subfields.field(sf => sf.code === 'a');\n const sf0 = clone(field.subfields.find(sf => sf.code === '0'));\n const sf2 = {'code': '2', 'value': `${lexAndLang.lex}/${lexAndLang.lang === 'fin' ? 'swe' : 'fin'}`}; // swap fin <=> swe\n const newField = {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [sfA, sf2, sf0]};\n return newField;\n }\n\n function getLexiconAndLanguage(field) {\n const subfield2 = field.subfields.find(sf => sf.code === '2');\n if (subfield2.value === 'slm/fin') {\n return {'lex': 'slm', 'lang': 'fin'};\n }\n if (subfield2.value === 'slm/swe') {\n return {'lex': 'slm', 'lang': 'swe'};\n }\n if (subfield2.value === 'yso/fin') {\n return {'lex': 'yso', 'lang': 'fin'};\n }\n if (subfield2.value === 'yso/swe') {\n return {'lex': 'yso', 'lang': 'swe'};\n }\n return {};\n }\n\n async function getPrefLabel(field) {\n // Tag vs $2 correlation has already been checked!\n const uri = fieldToUri(field);\n if (!uri) { // $0 is invalid or sumthing\n return undefined;\n }\n const prefLabels = await getTermData(uri);\n if (!prefLabels) { // Sanity check. Miss caused by illegal id etc.\n nvdebug(`No labels found for ${uri}`, debug);\n return undefined;\n }\n const lexData = getLexiconAndLanguage(field); // $2 data\n const lang = changeAbbr(lexData.lang);\n\n\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n\n const prefLabel = prefLabels.find(pl => pl.lang === lang);\n //console.info(`Compare prefLabel '${prefLabel.value}' AND $a '${subfieldA.value}'`); // eslint-disable-line no-console\n if (prefLabel.value === subfieldA.value) {\n nvdebug(`'${fieldToString(field)}' requires translating`, debug);\n return prefLabels;\n }\n return undefined;\n }\n\n function swapLanguageCodeBetweenLanguages(code) {\n if (swapLanguageCode[code]) {\n return swapLanguageCode[code];\n }\n return code;\n }\n\n function changeAbbr(abbr) {\n if (changeAbbrHash[abbr]) {\n return changeAbbrHash[abbr];\n }\n return abbr;\n }\n\n function swaggerQuery(uri) {\n // This would work for only yso, not yso-paikat etc `https://api.finto.fi/rest/v1/yso/data?format=application%2Fjson&uri=${uri}`;\n return `https://api.finto.fi/rest/v1/data?uri=${uri}&format=application%2Fjson`; // This is simpler, but contains more irrelevant data\n }\n\n async function getTermData(uri) {\n //console.log(`getTermData(${uri})`); // eslint-disable-line no-console\n if (termCache[uri]) { // Don't think current implementation uses the cache any more.\n //console.log(`CACHED ${uri}`); // eslint-disable-line no-console\n return termCache[uri];\n }\n const tmp = await getTermDataFromFinto(uri);\n termCache[uri] = tmp; // eslint-disable-line functional/immutable-data, require-atomic-updates\n return tmp;\n }\n\n async function getTermDataFromFinto(uri) {\n const headers = {'Accept': 'application/json'};\n const uri2 = swaggerQuery(uri);\n\n const response = await fetch(uri2, {method: 'GET', headers});\n if (!response.ok) {\n return undefined;\n }\n const json = await response.json();\n\n if (!json.graph) {\n return undefined;\n }\n const arr = json.graph;\n const [hit] = arr.filter(row => row.uri === uri);\n //console.log(`NEW JSON: ${JSON.stringify(hit.prefLabel)}`); // eslint-disable-line no-console\n return hit.prefLabel;\n }\n\n\n function fieldToUri(field) {\n const lex = mapTagToLex(field.tag);\n\n const subfield0 = field.subfields.find(sf => sf.code === '0');\n const id = subfield0.value.replace(/^[^0-9]+/u, '');\n if (lex === 'yso') {\n //return `http%3A%2F%2Fwww.yso.fi%2Fonto%2Fyso%2Fp${id}`;\n return `http://www.yso.fi/onto/yso/p${id}`;\n }\n if (lex === 'slm') {\n return `http://urn.fi/URN:NBN:fi:au:slm:s${id}`;\n }\n return undefined;\n }\n\n function isRelevantField(field, lang) {\n const fieldAsString = fieldToString(field);\n\n // We should probably allow an optional $8 as the first subfield.\n if (!fieldAsString.match(/^... #7 ‡a [^‡]+ ‡2 [^‡]+ ‡0 [^‡]+(?: ‡9 [A-Z]+<(?:KEEP|DROP)>)*$/u)) {\n return false;\n }\n const lex = mapTagToLex(field.tag);\n const lexLang = `${lex}/${lang}`;\n if (!fieldHasSubfield(field, '2', lexLang)) {\n return false;\n }\n return fieldHasValidSubfield0(field);\n }\n\n function fieldHasValidSubfield0(field) {\n const lex = mapTagToLex(field.tag);\n const subfield0 = field.subfields.find(sf => sf.code === '0');\n if (lex === 'yso' && subfield0.value.match(/^http:\\/\\/www\\.yso\\.fi\\/onto\\/yso\\/p[0-9]+$/u)) {\n return true;\n }\n if (lex === 'slm' && subfield0.value.match(/^http:\\/\\/urn\\.fi\\/URN:NBN:fi:au:slm:s[0-9]+$/u)) {\n return true;\n }\n return false;\n }\n\n function getMisses(fieldList1, fieldList2) {\n return fieldList1.filter(f => !hasSubfield0Match(f, fieldList2));\n }\n\n function hasSubfield0Match(field, pairFields) {\n const subfield0 = field.subfields.find(sf => sf.code === '0');\n return pairFields.some(f => f.subfields.some(sf => sf.code === '0' && sf.value === subfield0.value));\n }\n\n\n function mapTagToLex(tag) {\n if (tag === '655') {\n return 'slm';\n }\n return 'yso';\n }\n\n\n /*\n function getValidIdentifiers(record, tag, lang) {\n const lex = mapTagToLex(tag);\n const subfield2Value = `${lex}/${lang}`;\n const candFields = record.get(tag).filter(f => f.subfields.some(sf => sf.code === '2' && sf.value === subfield2Value)); // TODO: filter\n return [];\n }\n */\n\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"translate-terms.js","names":["_clone","_interopRequireDefault","require","_debug","_utils","e","__esModule","default","debug","createDebugLogger","defaultTags","swapLanguageCode","changeAbbrHash","termCache","_default","description","validate","fix","record","newFields","getFields","forEach","nf","nvdebug","fieldToString","insertField","newFieldsAsStrings","map","f","message","valid","length","messages","tags","fieldsToAdd","currTag","remainingTags","missingFields","deriveMissingFields","tmp","getPairlessFinnishAndSwedishFields","tag","expectedLex","mapTagToLex","fields","get","finnishFields","filter","isRelevantField","swedishFields","finnishOnly","getMisses","swedishOnly","tagAndFieldAgree","field","lexData","getLexiconAndLanguage","lex","pairlessFields","prefLabels","i","getPrefLabel","pairField","undefined","lexAndLang","twoLetterOtherLang","swapLanguageCodeBetweenLanguages","changeAbbr","lang","prefLabel","find","l","sfA","value","sf0","clone","subfields","sf","code","sf2","newField","ind1","ind2","subfield2","uri","fieldToUri","getTermData","subfieldA","pl","abbr","swaggerQuery","getTermDataFromFinto","headers","uri2","response","fetch","method","ok","json","graph","arr","hit","row","subfield0","id","replace","fieldAsString","match","lexLang","fieldHasSubfield","fieldHasValidSubfield0","fieldList1","fieldList2","hasSubfield0Match","pairFields","some"],"sources":["../src/translate-terms.js"],"sourcesContent":["import clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug} from './utils';\n\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:translate-terms');\nconst defaultTags = ['648', '650', '651', '655'];\n\nconst swapLanguageCode = {'fin': 'swe', 'fi': 'sv', 'sv': 'fi', 'swe': 'fin'};\nconst changeAbbrHash = {'fi': 'fin', 'fin': 'fi', 'sv': 'swe', 'swe': 'sv'};\n\nconst termCache = {};\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n\n return {\n description: 'Translate yso (648, 650, 651) and slm (655) terms (FIN <=> SWE)',\n validate, fix\n };\n\n async function fix(record) {\n const newFields = await getFields(record, defaultTags, []);\n\n newFields.forEach(nf => nvdebug(`Add new field '${fieldToString(nf)}'`, debug));\n\n newFields.forEach(nf => record.insertField(nf));\n\n const newFieldsAsStrings = newFields.map(f => fieldToString(f));\n\n\n return {message: [], fix: newFieldsAsStrings, valid: true};\n }\n\n async function validate(record) {\n const newFields = await getFields(record, defaultTags, []);\n if (newFields.length === 0) {\n return {'message': [], 'valid': true};\n }\n const messages = newFields.map(f => fieldToString(f));\n\n return {'message': messages, 'valid': false};\n }\n\n async function getFields(record, tags, fieldsToAdd) {\n const [currTag, ...remainingTags] = tags;\n if (!currTag) {\n return fieldsToAdd;\n }\n const missingFields = await deriveMissingFields(record, currTag);\n\n const tmp = await getFields(record, remainingTags, [...fieldsToAdd, ...missingFields]);\n return tmp;\n }\n\n function getPairlessFinnishAndSwedishFields(record, tag) {\n const expectedLex = mapTagToLex(tag);\n if (!expectedLex) {\n return [];\n }\n const fields = record.get(tag);\n const finnishFields = fields.filter(f => isRelevantField(f, 'fin'));\n const swedishFields = fields.filter(f => isRelevantField(f, 'swe'));\n const finnishOnly = getMisses(finnishFields, swedishFields);\n const swedishOnly = getMisses(swedishFields, finnishFields);\n\n //console.log(` Looking at ${finnishOnly.length} + ${swedishOnly.length} fields`); // eslint-disable-line no-console\n return [...finnishOnly, ...swedishOnly].filter(f => tagAndFieldAgree(f));\n\n function tagAndFieldAgree(field) {\n // Check that tag and $2 value are pairable:\n const lexData = getLexiconAndLanguage(field); // $2 data\n return expectedLex === lexData.lex;\n }\n }\n\n async function deriveMissingFields(record, tag) {\n const pairlessFields = getPairlessFinnishAndSwedishFields(record, tag);\n\n /* eslint-disable */\n // Dunno how to handle loop+promise combo in our normal coding style. Spent half a day trying... (I reckon it takes like 2 minuts to do this properly...)\n let prefLabels = [];\n for (let i=0; i < pairlessFields.length; i += 1) {\n prefLabels[i] = await getPrefLabel(pairlessFields[i]);\n }\n /* eslint-enable */\n\n const missingFields = pairlessFields.map((f, i) => pairField(f, prefLabels[i]));\n return missingFields.filter(f => f);\n }\n\n function pairField(field, prefLabels) {\n if (!prefLabels) {\n return undefined;\n }\n //console.log(`pairField() WP 1: ${fieldToString(field)}`); // eslint-disable-line no-console\n const lexAndLang = getLexiconAndLanguage(field);\n //console.log(`pairField() WP 2: ${JSON.stringify(lexAndLang)}`); // eslint-disable-line no-console\n const twoLetterOtherLang = swapLanguageCodeBetweenLanguages(changeAbbr(lexAndLang.lang));\n const prefLabel = prefLabels.find(l => l.lang === twoLetterOtherLang);\n //console.log(`pairField() WP 4: ${JSON.stringify(prefLabel)}`); // eslint-disable-line no-console\n const sfA = {'code': 'a', 'value': prefLabel.value}; // field.subfields.field(sf => sf.code === 'a');\n const sf0 = clone(field.subfields.find(sf => sf.code === '0'));\n const sf2 = {'code': '2', 'value': `${lexAndLang.lex}/${lexAndLang.lang === 'fin' ? 'swe' : 'fin'}`}; // swap fin <=> swe\n const newField = {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [sfA, sf2, sf0]};\n return newField;\n }\n\n function getLexiconAndLanguage(field) {\n const subfield2 = field.subfields.find(sf => sf.code === '2');\n if (subfield2.value === 'slm/fin') {\n return {'lex': 'slm', 'lang': 'fin'};\n }\n if (subfield2.value === 'slm/swe') {\n return {'lex': 'slm', 'lang': 'swe'};\n }\n if (subfield2.value === 'yso/fin') {\n return {'lex': 'yso', 'lang': 'fin'};\n }\n if (subfield2.value === 'yso/swe') {\n return {'lex': 'yso', 'lang': 'swe'};\n }\n return {};\n }\n\n async function getPrefLabel(field) {\n // Tag vs $2 correlation has already been checked!\n const uri = fieldToUri(field);\n if (!uri) { // $0 is invalid or sumthing\n return undefined;\n }\n const prefLabels = await getTermData(uri);\n if (!prefLabels) { // Sanity check. Miss caused by illegal id etc.\n nvdebug(`No labels found for ${uri}`, debug);\n return undefined;\n }\n const lexData = getLexiconAndLanguage(field); // $2 data\n const lang = changeAbbr(lexData.lang);\n\n\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n\n const prefLabel = prefLabels.find(pl => pl.lang === lang);\n //console.info(`Compare prefLabel '${prefLabel.value}' AND $a '${subfieldA.value}'`); // eslint-disable-line no-console\n if (prefLabel.value === subfieldA.value) {\n nvdebug(`'${fieldToString(field)}' requires translating`, debug);\n return prefLabels;\n }\n return undefined;\n }\n\n function swapLanguageCodeBetweenLanguages(code) {\n if (swapLanguageCode[code]) {\n return swapLanguageCode[code];\n }\n return code;\n }\n\n function changeAbbr(abbr) {\n if (changeAbbrHash[abbr]) {\n return changeAbbrHash[abbr];\n }\n return abbr;\n }\n\n function swaggerQuery(uri) {\n // This would work for only yso, not yso-paikat etc `https://api.finto.fi/rest/v1/yso/data?format=application%2Fjson&uri=${uri}`;\n return `https://api.finto.fi/rest/v1/data?uri=${uri}&format=application%2Fjson`; // This is simpler, but contains more irrelevant data\n }\n\n async function getTermData(uri) {\n //console.log(`getTermData(${uri})`); // eslint-disable-line no-console\n if (termCache[uri]) { // Don't think current implementation uses the cache any more.\n //console.log(`CACHED ${uri}`); // eslint-disable-line no-console\n return termCache[uri];\n }\n const tmp = await getTermDataFromFinto(uri);\n termCache[uri] = tmp; // eslint-disable-line functional/immutable-data, require-atomic-updates\n return tmp;\n }\n\n async function getTermDataFromFinto(uri) {\n const headers = {'Accept': 'application/json'};\n const uri2 = swaggerQuery(uri);\n\n const response = await fetch(uri2, {method: 'GET', headers});\n if (!response.ok) {\n return undefined;\n }\n const json = await response.json();\n\n if (!json.graph) {\n return undefined;\n }\n const arr = json.graph;\n const [hit] = arr.filter(row => row.uri === uri);\n //console.log(`NEW JSON: ${JSON.stringify(hit.prefLabel)}`); // eslint-disable-line no-console\n return hit.prefLabel;\n }\n\n\n function fieldToUri(field) {\n const lex = mapTagToLex(field.tag);\n\n const subfield0 = field.subfields.find(sf => sf.code === '0');\n const id = subfield0.value.replace(/^[^0-9]+/u, '');\n if (lex === 'yso') {\n //return `http%3A%2F%2Fwww.yso.fi%2Fonto%2Fyso%2Fp${id}`;\n return `http://www.yso.fi/onto/yso/p${id}`;\n }\n if (lex === 'slm') {\n return `http://urn.fi/URN:NBN:fi:au:slm:s${id}`;\n }\n return undefined;\n }\n\n function isRelevantField(field, lang) {\n const fieldAsString = fieldToString(field);\n\n // We should probably allow an optional $8 as the first subfield.\n if (!fieldAsString.match(/^... #7 ‡a [^‡]+ ‡2 [^‡]+ ‡0 [^‡]+(?: ‡9 [A-Z]+<(?:KEEP|DROP)>)*$/u)) {\n return false;\n }\n const lex = mapTagToLex(field.tag);\n const lexLang = `${lex}/${lang}`;\n if (!fieldHasSubfield(field, '2', lexLang)) {\n return false;\n }\n return fieldHasValidSubfield0(field);\n }\n\n function fieldHasValidSubfield0(field) {\n const lex = mapTagToLex(field.tag);\n const subfield0 = field.subfields.find(sf => sf.code === '0');\n if (lex === 'yso' && subfield0.value.match(/^http:\\/\\/www\\.yso\\.fi\\/onto\\/yso\\/p[0-9]+$/u)) {\n return true;\n }\n if (lex === 'slm' && subfield0.value.match(/^http:\\/\\/urn\\.fi\\/URN:NBN:fi:au:slm:s[0-9]+$/u)) {\n return true;\n }\n return false;\n }\n\n function getMisses(fieldList1, fieldList2) {\n return fieldList1.filter(f => !hasSubfield0Match(f, fieldList2));\n }\n\n function hasSubfield0Match(field, pairFields) {\n const subfield0 = field.subfields.find(sf => sf.code === '0');\n return pairFields.some(f => f.subfields.some(sf => sf.code === '0' && sf.value === subfield0.value));\n }\n\n\n function mapTagToLex(tag) {\n if (tag === '655') {\n return 'slm';\n }\n return 'yso';\n }\n\n\n /*\n function getValidIdentifiers(record, tag, lang) {\n const lex = mapTagToLex(tag);\n const subfield2Value = `${lex}/${lang}`;\n const candFields = record.get(tag).filter(f => f.subfields.some(sf => sf.code === '2' && sf.value === subfield2Value)); // TODO: filter\n return [];\n }\n */\n\n}\n\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/marc-record-validators-melinda.git"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "11.4.8",
17
+ "version": "11.5.0",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"
@@ -38,8 +38,11 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@natlibfi/issn-verify": "^1.0.6",
41
- "@natlibfi/marc-record": "^9.1.1",
41
+ "@natlibfi/marc-record": "^9.1.2",
42
+ "@natlibfi/marc-record-serializers": "^10.1.2",
42
43
  "@natlibfi/marc-record-validate": "^8.0.12",
44
+ "@natlibfi/melinda-commons": "^13.0.18",
45
+ "@natlibfi/sru-client": "^6.0.17",
43
46
  "@natlibfi/sfs-4900": "github:NatLibFi/sfs-4900",
44
47
  "cld3-asm": "^4.0.0",
45
48
  "clone": "^2.1.2",