@natlibfi/marc-record-validators-melinda 10.13.0 → 10.13.1-alpha.2

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 (72) hide show
  1. package/.github/workflows/melinda-node-tests.yml +3 -3
  2. package/dist/field-505-separators.js +77 -0
  3. package/dist/field-505-separators.js.map +1 -0
  4. package/dist/field-505-separators.spec.js +51 -0
  5. package/dist/field-505-separators.spec.js.map +1 -0
  6. package/dist/fixRelatorTerms.js +278 -0
  7. package/dist/fixRelatorTerms.js.map +1 -0
  8. package/dist/fixRelatorTerms.spec.js +51 -0
  9. package/dist/fixRelatorTerms.spec.js.map +1 -0
  10. package/dist/index.js +101 -3
  11. package/dist/index.js.map +1 -1
  12. package/dist/normalize-qualifying-information.js +97 -0
  13. package/dist/normalize-qualifying-information.js.map +1 -0
  14. package/dist/normalize-qualifying-information.spec.js +51 -0
  15. package/dist/normalize-qualifying-information.spec.js.map +1 -0
  16. package/dist/normalizeSubfieldValueForComparison.js +12 -3
  17. package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
  18. package/dist/prepublicationUtils.js +8 -26
  19. package/dist/prepublicationUtils.js.map +1 -1
  20. package/dist/punctuation2.js +7 -2
  21. package/dist/punctuation2.js.map +1 -1
  22. package/dist/removeInferiorDataFields.js +69 -10
  23. package/dist/removeInferiorDataFields.js.map +1 -1
  24. package/dist/utils.js +12 -0
  25. package/dist/utils.js.map +1 -1
  26. package/package.json +11 -11
  27. package/src/field-505-separators.js +75 -0
  28. package/src/field-505-separators.spec.js +52 -0
  29. package/src/fixRelatorTerms.js +233 -0
  30. package/src/fixRelatorTerms.spec.js +52 -0
  31. package/src/index.js +33 -4
  32. package/src/normalize-qualifying-information.js +92 -0
  33. package/src/normalize-qualifying-information.spec.js +52 -0
  34. package/src/normalizeSubfieldValueForComparison.js +14 -3
  35. package/src/prepublicationUtils.js +8 -25
  36. package/src/punctuation2.js +3 -2
  37. package/src/removeInferiorDataFields.js +70 -10
  38. package/src/utils.js +12 -0
  39. package/test-fixtures/field-505-separators/01/expectedResult.json +7 -0
  40. package/test-fixtures/field-505-separators/01/metadata.json +7 -0
  41. package/test-fixtures/field-505-separators/01/record.json +25 -0
  42. package/test-fixtures/field-505-separators/02/expectedResult.json +27 -0
  43. package/test-fixtures/field-505-separators/02/metadata.json +7 -0
  44. package/test-fixtures/field-505-separators/02/record.json +25 -0
  45. package/test-fixtures/fix-relator-terms/f01/expectedResult.json +14 -0
  46. package/test-fixtures/fix-relator-terms/f01/metadata.json +6 -0
  47. package/test-fixtures/fix-relator-terms/f01/record.json +13 -0
  48. package/test-fixtures/fix-relator-terms/f01b/expectedResult.json +12 -0
  49. package/test-fixtures/fix-relator-terms/f01b/metadata.json +6 -0
  50. package/test-fixtures/fix-relator-terms/f01b/record.json +11 -0
  51. package/test-fixtures/fix-relator-terms/f02/expectedResult.json +12 -0
  52. package/test-fixtures/fix-relator-terms/f02/metadata.json +6 -0
  53. package/test-fixtures/fix-relator-terms/f02/record.json +11 -0
  54. package/test-fixtures/normalize-qualifying-information/01/expectedResult.json +8 -0
  55. package/test-fixtures/normalize-qualifying-information/01/metadata.json +7 -0
  56. package/test-fixtures/normalize-qualifying-information/01/record.json +25 -0
  57. package/test-fixtures/normalize-qualifying-information/02/expectedResult.json +27 -0
  58. package/test-fixtures/normalize-qualifying-information/02/metadata.json +7 -0
  59. package/test-fixtures/normalize-qualifying-information/02/record.json +25 -0
  60. package/test-fixtures/punctuation2/97/expectedResult.json +6 -1
  61. package/test-fixtures/punctuation2/97/record.json +5 -0
  62. package/test-fixtures/remove-inferior-datafields/f09/expectedResult.json +20 -0
  63. package/test-fixtures/remove-inferior-datafields/f09/metadata.json +6 -0
  64. package/test-fixtures/remove-inferior-datafields/f09/record.json +30 -0
  65. package/test-fixtures/remove-inferior-datafields/f10/expectedResult.json +17 -0
  66. package/test-fixtures/remove-inferior-datafields/f10/metadata.json +6 -0
  67. package/test-fixtures/remove-inferior-datafields/f10/record.json +27 -0
  68. package/test-fixtures/remove-inferior-datafields/f11/expectedResult.json +14 -0
  69. package/test-fixtures/remove-inferior-datafields/f11/metadata.json +6 -0
  70. package/test-fixtures/remove-inferior-datafields/f11/record.json +18 -0
  71. package/test-fixtures/strip-punctuation/98/expectedResult.json +5 -0
  72. package/test-fixtures/strip-punctuation/98/record.json +5 -0
@@ -201,7 +201,7 @@ const addColonToRelationshipInformation = {
201
201
  'name': 'Add \':\' to 7X0 $i relationship info',
202
202
  'add': ':',
203
203
  'code': 'i',
204
- 'context': /[a-z)åäö]$/u
204
+ 'context': defaultNeedsPuncAfter2
205
205
  };
206
206
 
207
207
  // 490:
@@ -311,6 +311,11 @@ const cleanLegalX00bDot = {
311
311
  context: /^[IVXLCDM]+\.$/u,
312
312
  'remove': /\.$/u
313
313
  };
314
+ const cleanLegalX00iColon = {
315
+ 'code': 'i',
316
+ 'followedBy': 'a',
317
+ 'remove': / *:$/u
318
+ }; // NB! context is not needed
314
319
  const cleanLegalX00Dot = {
315
320
  'code': 'abcdetvl',
316
321
  'followedBy': 'tu#',
@@ -324,7 +329,7 @@ const cleanLanguageComma = {
324
329
  'context': /.,$/u,
325
330
  'remove': /,$/u
326
331
  };
327
- const legalX00punc = [cleanLegalX00Comma, cleanLegalX00bDot, cleanLegalX00Dot, cleanLanguageComma];
332
+ const legalX00punc = [cleanLegalX00Comma, cleanLegalX00iColon, cleanLegalX00bDot, cleanLegalX00Dot, cleanLanguageComma];
328
333
  const cleanLegalX10Comma = {
329
334
  'name': 'X10comma',
330
335
  'code': 'abe',
@@ -1 +1 @@
1
- {"version":3,"file":"punctuation2.js","names":["_endingPunctuation","require","_utils","_clone","_interopRequireDefault","obj","__esModule","default","_default","description","validate","fix","record","nvdebug","res","message","valid","fields","forEach","f","fieldFixPunctuation","fieldsNeedingModification","filter","fieldNeedsModification","values","map","fieldToString","newValues","fieldGetFixedString","messages","val","i","length","isControlSubfield","subfield","includes","code","getNextRelevantSubfield","field","currSubfieldIndex","subfields","find","index","add","cloneField","clone","operation","subfieldFixPunctuation","subfieldStripPunctuation","sf","originalFieldAsString","modifiedFieldAsString","commaNeedsPuncAfter","defaultNeedsPuncAfter","defaultNeedsPuncAfter2","blocksPuncRHS","allowsPuncRHS","dotIsProbablyPunc","puncIsProbablyPunc","removeColons","removeX00Comma","cleanRHS","cleanX00dCommaOrDot","cleanX00aDot","cleanCorruption","cleanX00eDot","X00RemoveDotAfterBracket","cleanPuncBeforeLanguage","addX00aComma","addX00aComma2","addX00aDot","addX10bDot","addX10eComma","addX10Dot","addLanguageComma","addColonToRelationshipInformation","addSemicolonBeforeVolumeDesignation","NONE","ADD","REMOVE","REMOVE_AND_ADD","removeX00Whatever","removeX10Whatever","remove490And830Whatever","linkingEntryWhatever","crappy246","cleanCrappyPunctuationRules","cleanLegalX00Comma","cleanLegalX00bDot","context","cleanLegalX00Dot","cleanLanguageComma","legalX00punc","cleanLegalX10Comma","cleanLegalX10Dot","legalX10punc","cleanLegalSeriesTitle","clean24X","cleanValidPunctuationRules","addX00","addX10","add245","add246","addSeriesTitle","addPairedPunctuationRules","ruleAppliesToSubfieldCode","targetSubfieldCodes","currSubfieldCode","negation","ruleAppliesToField","rule","ind1","ind2","ruleAppliesToCurrentSubfield","value","match","ruleAppliesToNextSubfield","nextSubfield","followedBy","contextRHS","checkRule","subfield1","subfield2","applyPunctuationRules","ruleArray","tag","activeRules","originalValue","remove","replace","fieldStripPunctuation","useExternalEndPunctuation","validateSingleField"],"sources":["../src/punctuation2.js"],"sourcesContent":["/*\n* punctuation.js -- try and fix a marc field punctuation\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n* NOTE #1: https://www.kiwi.fi/display/kumea/Loppupisteohje is implemented via another validator/fixer (ending-punctuation).\n* This file has some support but it's now yet thorough. (And mmight never be.)\n* NOTE #2: Validator/fixer punctuation does similar stuff, but focuses on X00 fields.\n* NOTE #3: As of 2023-06-05 control subfields ($0...$9) are obsolete. Don't use them in rules.\n* (They are jumped over when looking for next (non-controlfield subfield)\n*/\nimport {validateSingleField} from './ending-punctuation';\n// import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\nimport clone from 'clone';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');\n\nexport default function () {\n return {\n description: 'Add punctuation to data fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Add punctuation to data fields: fixer');\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fieldFixPunctuation(f));\n return res;\n }\n\n function validate(record) {\n nvdebug('Add punctuation to data fields: validate');\n\n const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, true));\n\n\n const values = fieldsNeedingModification.map(f => fieldToString(f));\n const newValues = fieldsNeedingModification.map(f => fieldGetFixedString(f, true));\n\n const messages = values.map((val, i) => `'${val}' => '${newValues[i]}'`);\n\n const res = {message: messages};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nfunction isControlSubfield(subfield) {\n return ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].includes(subfield.code);\n}\n\nfunction getNextRelevantSubfield(field, currSubfieldIndex) {\n return field.subfields.find((subfield, index) => index > currSubfieldIndex && !isControlSubfield(subfield));\n}\n\nexport function fieldGetFixedString(field, add = true) {\n const cloneField = clone(field);\n const operation = add ? subfieldFixPunctuation : subfieldStripPunctuation;\n cloneField.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n operation(cloneField, sf, getNextRelevantSubfield(cloneField, i));\n });\n return fieldToString(cloneField);\n}\n\nexport function fieldNeedsModification(field, add = true) {\n if (!field.subfields) {\n return false;\n }\n\n const originalFieldAsString = fieldToString(field);\n const modifiedFieldAsString = fieldGetFixedString(field, add);\n\n return modifiedFieldAsString !== originalFieldAsString;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////\n// <= Above code is written for the validator logic <= //\n// => Everything below was originally transferred from reducers' punctuation.js => //\n/////////////////////////////////////////////////////////////////////////////////////\n\n\n//const stripCrap = / *[-;:,+]+$/u;\nconst commaNeedsPuncAfter = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö|\\))$/u;\nconst defaultNeedsPuncAfter = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö)$/u;\nconst defaultNeedsPuncAfter2 = /(?:[\\]a-zA-Z0-9)]|ä|å|ö|Å|Ä|Ö)$/u;\nconst blocksPuncRHS = /^(?:\\()/u;\nconst allowsPuncRHS = /^(?:[A-Za-z0-9]|å|ä|ö|Å|Ä|Ö)/u;\n\nconst dotIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö)\\.$/u;\nconst puncIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö) ?[.,:;]$/u;\n// NB! 65X: Finnish terms don't use punctuation, but international ones do. Neither one is currently (2021-11-08) coded here.\n\n// Will unfortunately trigger \"Sukunimi, Th.\" type:\nconst removeColons = {'code': 'abcdefghijklmnopqrstuvwxyz', 'remove': / *[;:]$/u};\nconst removeX00Comma = {'code': 'abcqde', 'followedBy': 'abcqde#', 'context': /.,$/u, 'remove': /,$/u};\nconst cleanRHS = {'code': 'abcd', 'followedBy': 'bcde', 'context': /(?:(?:[a-z0-9]|å|ä|ö)\\.|,)$/u, 'contextRHS': blocksPuncRHS, 'remove': /[.,]$/u};\nconst cleanX00dCommaOrDot = {'code': 'd', 'followedBy': 'et#', 'context': /[0-9]-[,.]$/u, 'remove': /[,.]$/u};\nconst cleanX00aDot = {'code': 'abcde', 'followedBy': 'cdegj', 'context': dotIsProbablyPunc, 'remove': /\\.$/u};\nconst cleanCorruption = {'code': 'abcdefghijklmnopqrstuvwxyz', 'remove': / \\.$/u};\n// These $e dot removals are tricky: before removing the comma, we should know that it ain't an abbreviation such as \"esitt.\"...\nconst cleanX00eDot = {'code': 'e', 'followedBy': 'egj#', 'context': /(?:[ai]ja|jä)[.,]$/u, 'remove': /\\.$/u};\n\nconst X00RemoveDotAfterBracket = {'code': 'cq', 'context': /\\)\\.$/u, 'remove': /\\.$/u};\n// 390, 800, 810, 830...\nconst cleanPuncBeforeLanguage = {'code': 'atvxyz', 'followedBy': 'l', 'context': puncIsProbablyPunc, 'remove': / *[.,:;]$/u};\n\n\nconst addX00aComma = {'add': ',', 'code': 'abcqdej', 'followedBy': 'cdeg', 'context': commaNeedsPuncAfter, 'contextRHS': allowsPuncRHS};\nconst addX00aComma2 = {'add': ',', 'code': 'abcdej', 'followedBy': 'cdeg', 'context': /(?:[A-Z]|Å|Ä|Ö)\\.$/u, 'contextRHS': allowsPuncRHS};\nconst addX00aDot = {'add': '.', 'code': 'abcde', 'followedBy': '#tu', 'context': defaultNeedsPuncAfter};\n\nconst addX10bDot = {'name': 'Add X10 pre-$b dot', 'add': '.', 'code': 'ab', 'followedBy': 'b', 'context': defaultNeedsPuncAfter};\nconst addX10eComma = {'add': ',', 'code': 'abe', 'followedBy': 'e', 'context': defaultNeedsPuncAfter};\nconst addX10Dot = {'name': 'Add X10 final dot', 'add': '.', 'code': 'abe', 'followedBy': '#', 'context': defaultNeedsPuncAfter};\nconst addLanguageComma = {'name': 'Add comma before 810$l', 'add': ',', 'code': 'tv', 'followedBy': 'l', 'context': defaultNeedsPuncAfter2};\nconst addColonToRelationshipInformation = {'name': 'Add \\':\\' to 7X0 $i relationship info', 'add': ':', 'code': 'i', 'context': /[a-z)åäö]$/u};\n\n// 490:\nconst addSemicolonBeforeVolumeDesignation = {'name': 'Add \" ;\" before $v', 'add': ' ;', 'code': 'atxyz', 'followedBy': 'v', 'context': /[^;]$/u};\n\nconst NONE = 0;\nconst ADD = 2;\nconst REMOVE = 1;\nconst REMOVE_AND_ADD = 3;\n\n// Crappy punctuation consists of various crap that is somewhat common.\n// We strip crap for merge decisions. We are not trying to actively remove crap here.\n\nconst removeX00Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, cleanX00dCommaOrDot, cleanRHS, X00RemoveDotAfterBracket, removeColons, cleanPuncBeforeLanguage];\nconst removeX10Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, removeColons, cleanPuncBeforeLanguage];\n\nconst remove490And830Whatever = [{'code': 'axyzv', 'followedBy': 'axyzv', 'remove': /(?: *;| *=|,)$/u}];\n\nconst linkingEntryWhatever = [{'code': 'abdghiklmnopqrstuwxyz', 'followedBy': 'abdghiklmnopqrstuwxyz', 'remove': /\\. -$/u}];\n\n\n// '!' means negation, thus '!b' means any other subfield but 'b'.\n// 'followedBy': '#' means that current subfield is the last subfield.\n// NB! Note that control subfields are ignored in punctuation rules.\n// NB #2! Control field ignorance causes issues with field 257: https://wiki.helsinki.fi/display/rdasovellusohje/Loppupisteohje\n// Might need to work on that at some point. NOT a top priority though.\n// NB #3! Final punctuation creation is/should be handled by endind-punctuation.js validator!\n\nconst crappy246 = [{'code': 'abfghinp', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}];\n\nconst cleanCrappyPunctuationRules = {\n '100': removeX00Whatever,\n '110': removeX10Whatever,\n '245': [\n {'code': 'ab', 'followedBy': '!c', 'remove': / \\/$/u},\n {'code': 'abc', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}\n ],\n '246': crappy246,\n '300': [\n {'code': 'a', 'followedBy': '!b', 'remove': / *:$/u},\n {'code': 'a', 'followedBy': 'b', 'remove': /:$/u, 'context': /[^ ]:$/u},\n {'code': 'ab', 'followedBy': '!c', 'remove': / *;$/u},\n {'code': 'ab', 'followedBy': 'c', 'remove': /;$/u, 'context': /[^ ];$/u},\n {'code': 'abc', 'followedBy': '!e', 'remove': / *\\+$/u} // Removes both valid (with one space) and invalid (spaceless et al) puncs\n\n ],\n\n '490': remove490And830Whatever,\n '600': removeX00Whatever,\n '610': removeX10Whatever,\n '700': removeX00Whatever,\n '710': removeX10Whatever,\n '773': linkingEntryWhatever,\n '774': linkingEntryWhatever,\n '776': linkingEntryWhatever,\n '800': removeX00Whatever,\n '810': removeX10Whatever,\n '830': remove490And830Whatever,\n '946': crappy246\n};\n\nconst cleanLegalX00Comma = {'code': 'abcde', 'followedBy': 'cdegj', 'context': /.,$/u, 'remove': /,$/u};\n// Accept upper case letters in X00$b, since they are probably Roman numerals.\nconst cleanLegalX00bDot = {'code': 'b', 'followedBy': 't#', context: /^[IVXLCDM]+\\.$/u, 'remove': /\\.$/u};\nconst cleanLegalX00Dot = {'code': 'abcdetvl', 'followedBy': 'tu#', 'context': /(?:[a-z0-9)]|å|ä|ö)\\.$/u, 'remove': /\\.$/u};\nconst cleanLanguageComma = {'name': 'language comma', 'code': 'tv', 'followedBy': 'l', 'context': /.,$/u, 'remove': /,$/u};\n\n\nconst legalX00punc = [cleanLegalX00Comma, cleanLegalX00bDot, cleanLegalX00Dot, cleanLanguageComma];\n\nconst cleanLegalX10Comma = {'name': 'X10comma', 'code': 'abe', 'followedBy': 'e', 'context': /.,$/u, 'remove': /,$/u};\nconst cleanLegalX10Dot = {'name': 'X10dot', 'code': 'ab', 'followedBy': 'b#', 'context': /.\\.$/u, 'remove': /\\.$/u};\n\nconst legalX10punc = [cleanLegalX10Comma, cleanLegalX10Dot, cleanX00eDot, cleanLanguageComma];\n\nconst cleanLegalSeriesTitle = [ // 490 and 830\n {'code': 'a', 'followedBy': 'a', 'remove': / =$/u},\n {'code': 'axyz', 'followedBy': 'xyz', 'remove': /,$/u, 'context': /.,$/u},\n {'code': 'axyz', 'followedBy': 'v', 'remove': / *;$/u}\n];\n\nconst clean24X = [\n {'name': 'I:A', 'code': 'i', 'followedBy': 'a', 'remove': / *:$/u},\n {'name': 'A:B', 'code': 'a', 'followedBy': 'b', 'remove': / [:;=]$/u},\n {'name': 'AB:K', 'code': 'ab', 'followedBy': 'k', 'remove': / :$/u},\n {'name': 'ABK:F', 'code': 'abk', 'followedBy': 'f', 'remove': /,$/u},\n {'name': 'ABFNP:C', 'code': 'abfnp', 'followedBy': 'c', 'remove': / \\/$/u},\n {'name': 'ABN:N', 'code': 'abn', 'followedBy': 'n', 'remove': /\\.$/u},\n {'name': 'ABNP:#', 'code': 'abnp', 'followedBy': '#', 'remove': /\\.$/u},\n {'name': 'N:P', 'code': 'n', 'followedBy': 'p', 'remove': /,$/u}\n];\n\nconst cleanValidPunctuationRules = {\n '100': legalX00punc,\n '110': legalX10punc,\n '600': legalX00punc,\n '610': legalX10punc,\n '700': legalX00punc,\n '710': legalX10punc,\n '800': legalX00punc,\n '810': legalX10punc,\n '245': clean24X,\n '246': clean24X,\n '260': [\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'b', 'followedBy': 'c', 'remove': /,$/u},\n {'code': 'c', 'followedBy': '#', 'remove': /\\.$/u},\n {'code': 'd', 'followedBy': 'e', 'remove': / :$/u},\n {'code': 'e', 'followedBy': 'f', 'remove': /,$/u},\n {'code': 'f', 'followedBy': '#', 'remove': /\\.$/u} // Probably ')' but should it be removed?\n ],\n '264': [\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'b', 'followedBy': 'c', 'remove': /,$/u},\n {'code': 'c', 'followedBy': '#', 'remove': /\\.$/u}\n ],\n '300': [\n // NB! Remove crap as well, thus the '*' in / *:$/\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'ab', 'followedBy': 'c', 'remove': / ;$/u},\n {'code': 'abc', 'followedBy': 'e', 'remove': / \\+$/u}\n ],\n '490': cleanLegalSeriesTitle,\n '534': [{'code': 'p', 'followedBy': 'c', 'remove': /:$/u}],\n // Experimental, MET366-ish (end punc in internationally valid, but we don't use it here in Finland):\n '648': [{'code': 'a', 'content': /^[0-9]+\\.$/u, 'ind2': ['4'], 'remove': /\\.$/u}],\n '830': cleanLegalSeriesTitle,\n '946': clean24X\n\n};\n\n// addColonToRelationshipInformation only applies to 700/710 but as others don't have $i, it's fine\nconst addX00 = [addX00aComma, addX00aComma2, addX00aDot, addLanguageComma, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];\nconst addX10 = [addX10bDot, addX10eComma, addX10Dot, addLanguageComma, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];\n\nconst add245 = [\n // Blah! Also \"$a = $b\" and \"$a ; $b\" can be valid... But ' :' is better than nothing, I guess...\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter},\n {'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': defaultNeedsPuncAfter},\n {'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': defaultNeedsPuncAfter},\n {'code': 'abc', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter} // Stepping on punctuation/ toes\n];\n\nconst add246 = [\n {'code': 'i', 'followedBy': 'a', 'add': ':', 'context': defaultNeedsPuncAfter},\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter},\n {'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': defaultNeedsPuncAfter},\n {'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': defaultNeedsPuncAfter}\n];\n\n\nconst addSeriesTitle = [ // 490 and 830\n {'code': 'a', 'followedBy': 'a', 'add': ' =', 'context': defaultNeedsPuncAfter2},\n {'code': 'axyz', 'followedBy': 'xy', 'add': ',', 'context': defaultNeedsPuncAfter},\n addSemicolonBeforeVolumeDesignation // eg. 490$axyz-$v\n];\n\nconst addPairedPunctuationRules = {\n '100': addX00,\n '110': addX10,\n '245': add245,\n '246': add246,\n '260': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'b', 'followedBy': 'c', 'add': ',', 'context': defaultNeedsPuncAfter2},\n {'code': 'abc', 'followedBy': 'a', 'add': ' ;', 'context': defaultNeedsPuncAfter2},\n {'code': 'e', 'followedBy': 'f', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'f', 'followedBy': 'g', 'add': ',', 'context': defaultNeedsPuncAfter2}\n ],\n '264': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'b', 'followedBy': 'c', 'add': ',', 'context': defaultNeedsPuncAfter2},\n // NB! The $c rule messes dotless exception \"264 #4 $c p1983\" up\n // We'll need to add a hacky postprocessor for this? Add 'hasInd1': '0123' etc?\n {'code': 'c', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter2}\n ],\n '300': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'ab', 'followedBy': 'c', 'add': ' ;', 'context': defaultNeedsPuncAfter2},\n {'code': 'abc', 'followedBy': 'e', 'add': ' +', 'context': defaultNeedsPuncAfter2}\n ],\n '490': addSeriesTitle,\n '506': [{'code': 'a', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter2}],\n '534': [{'code': 'p', 'followedBy': 'c', 'add': ':', 'context': defaultNeedsPuncAfter2}],\n '600': addX00,\n '610': addX10,\n '700': addX00,\n '710': addX10,\n '800': addX00,\n '810': addX10,\n '830': addSeriesTitle,\n '946': [{'code': 'i', 'followedBy': 'a', 'add': ':', 'context': defaultNeedsPuncAfter}]\n};\n\n\nfunction ruleAppliesToSubfieldCode(targetSubfieldCodes, currSubfieldCode) {\n const negation = targetSubfieldCodes.includes('!');\n if (negation) {\n return !targetSubfieldCodes.includes(currSubfieldCode);\n }\n return targetSubfieldCodes.includes(currSubfieldCode);\n}\n\n\nfunction ruleAppliesToField(rule, field) {\n if ('ind1' in rule && field.ind1.includes(rule.ind1)) {\n return false;\n }\n\n if ('ind2' in rule && field.ind2.includes(rule.ind2)) {\n return false;\n }\n\n // If we want to check, say, $2, it should be implemented here!\n\n return true;\n}\n\n\nfunction ruleAppliesToCurrentSubfield(rule, subfield) {\n if (!ruleAppliesToSubfieldCode(rule.code, subfield.code)) {\n return false;\n }\n if ('context' in rule && !subfield.value.match(rule.context)) { // njsscan-ignore: regex_injection_dos\n return false;\n }\n return true;\n}\n\nfunction ruleAppliesToNextSubfield(rule, nextSubfield) {\n if (!('followedBy' in rule)) { // Return true, if we are not interested in the next subfield\n return true;\n }\n // The '#' existence check applies only to the RHS field. LHS always exists.\n if (!nextSubfield) {\n const negation = rule.followedBy.includes('!');\n if (negation) {\n return !rule.followedBy.includes('#');\n }\n return rule.followedBy.includes('#');\n }\n\n if (!ruleAppliesToSubfieldCode(rule.followedBy, nextSubfield.code)) {\n return false;\n }\n if ('contextRHS' in rule && !nextSubfield.value.match(rule.contextRHS)) { // njsscan-ignore: regex_injection_dos\n return false;\n }\n return true;\n}\n\nfunction checkRule(rule, field, subfield1, subfield2) {\n if (!ruleAppliesToField(rule, field)) {\n nvdebug(`FAIL ON WHOLE FIELD: '${fieldToString(field)}`);\n return false;\n }\n //const name = rule.name || 'UNNAMED';\n if (!ruleAppliesToCurrentSubfield(rule, subfield1)) {\n //nvdebug(`${name}: FAIL ON LHS SUBFIELD: '$${subfield1.code} ${subfield1.value}', SF=${rule.code}`, debug);\n return false;\n }\n\n // NB! This is not a perfect solution. We might have $e$0$e where $e$0 punctuation should actually be based on $e$e rules\n if (!ruleAppliesToNextSubfield(rule, subfield2)) {\n //const msg = subfield2 ? `${name}: FAIL ON RHS SUBFIELD '${subfield2.code}' not in [${rule.followedBy}]` : `${name}: FAIL ON RHS FIELD`;\n //nvdebug(msg, debug);\n return false;\n }\n\n //nvdebug(`${name}: ACCEPT ${rule.code}/${subfield1.code}, SF2=${rule.followedBy}/${subfield2 ? subfield2.code : '#'}`, debug);\n return true;\n}\n\nfunction applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, operation = NONE) {\n\n /*\n if (ruleArray === null || operation === NONE) {\n debug(`applyPunctuation(): No rules to apply!`);\n return;\n }\n*/\n if (!(`${field.tag}` in ruleArray) || ruleArray === null || operation === NONE) {\n\n /*\n if (!['020', '650'].includes(tag) || !isControlSubfieldCode(subfield1.code)) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`No punctuation rules found for ${tag} (looking for: ‡${subfield1.code})`, debug);\n\n }\n */\n return;\n }\n\n //nvdebug(`OP=${operation} ${tag}: '${subfield1.code}: ${subfield1.value}' ??? '${subfield2 ? subfield2.code : '#'}'`, debug);\n const activeRules = ruleArray[field.tag].filter(rule => checkRule(rule, field, subfield1, subfield2));\n\n activeRules.forEach(rule => {\n const originalValue = subfield1.value;\n if (rule.remove && [REMOVE, REMOVE_AND_ADD].includes(operation) && subfield1.value.match(rule.remove)) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(` PUNC REMOVAL TO BE PERFORMED FOR $${subfield1.code} '${subfield1.value}'`, debug);\n subfield1.value = subfield1.value.replace(rule.remove, ''); // eslint-disable-line functional/immutable-data\n //nvdebug(` PUNC REMOVAL PERFORMED FOR '${subfield1.value}'`, debug);\n }\n if (rule.add && [ADD, REMOVE_AND_ADD].includes(operation)) { // eslint-disable-line functional/no-conditional-statements\n subfield1.value += rule.add; // eslint-disable-line functional/immutable-data\n //nvdebug(` ADDED '${rule.add}' TO '${subfield1.value}'`, debug);\n }\n if (subfield1.value !== originalValue) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(` PROCESS PUNC: '‡${subfield1.code} ${originalValue}' => '‡${subfield1.code} ${subfield1.value}'`, debug); // eslint-disable-line functional/immutable-data\n }\n });\n}\n\nfunction subfieldFixPunctuation(field, subfield1, subfield2) {\n applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);\n applyPunctuationRules(field, subfield1, subfield2, addPairedPunctuationRules, ADD);\n}\n\nfunction subfieldStripPunctuation(field, subfield1, subfield2) {\n //nvdebug(`FSP1: '${subfield1.value}'`);\n applyPunctuationRules(field, subfield1, subfield2, cleanValidPunctuationRules, REMOVE);\n //nvdebug(`FSP2: '${subfield1.value}'`);\n applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);\n //nvdebug(`FSP3: '${subfield1.value}'`);\n\n}\n\nexport function fieldStripPunctuation(field) {\n if (!field.subfields) {\n return field;\n }\n\n field.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n subfieldStripPunctuation(field, sf, getNextRelevantSubfield(field, i));\n\n });\n return field;\n}\n\nexport function fieldFixPunctuation(field) {\n if (!field.subfields) {\n return field;\n }\n nvdebug(`################### fieldFixPunctuation() TEST ${fieldToString(field)}`);\n\n field.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n subfieldFixPunctuation(field, sf, getNextRelevantSubfield(field, i));\n });\n\n // Use shared code for final punctuation (sadly this does not fix intermediate punc):\n if (field.useExternalEndPunctuation) { // eslint-disable-line functional/no-conditional-statements\n // addFinalPunctuation(field); // local version. use shared code instead.\n validateSingleField(field, false, true); // NB! Don't use field.tag as second argument! It's a string, not an int. 3rd arg must be true (=fix)\n }\n return field;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"punctuation2.js","names":["_endingPunctuation","require","_utils","_clone","_interopRequireDefault","obj","__esModule","default","_default","description","validate","fix","record","nvdebug","res","message","valid","fields","forEach","f","fieldFixPunctuation","fieldsNeedingModification","filter","fieldNeedsModification","values","map","fieldToString","newValues","fieldGetFixedString","messages","val","i","length","isControlSubfield","subfield","includes","code","getNextRelevantSubfield","field","currSubfieldIndex","subfields","find","index","add","cloneField","clone","operation","subfieldFixPunctuation","subfieldStripPunctuation","sf","originalFieldAsString","modifiedFieldAsString","commaNeedsPuncAfter","defaultNeedsPuncAfter","defaultNeedsPuncAfter2","blocksPuncRHS","allowsPuncRHS","dotIsProbablyPunc","puncIsProbablyPunc","removeColons","removeX00Comma","cleanRHS","cleanX00dCommaOrDot","cleanX00aDot","cleanCorruption","cleanX00eDot","X00RemoveDotAfterBracket","cleanPuncBeforeLanguage","addX00aComma","addX00aComma2","addX00aDot","addX10bDot","addX10eComma","addX10Dot","addLanguageComma","addColonToRelationshipInformation","addSemicolonBeforeVolumeDesignation","NONE","ADD","REMOVE","REMOVE_AND_ADD","removeX00Whatever","removeX10Whatever","remove490And830Whatever","linkingEntryWhatever","crappy246","cleanCrappyPunctuationRules","cleanLegalX00Comma","cleanLegalX00bDot","context","cleanLegalX00iColon","cleanLegalX00Dot","cleanLanguageComma","legalX00punc","cleanLegalX10Comma","cleanLegalX10Dot","legalX10punc","cleanLegalSeriesTitle","clean24X","cleanValidPunctuationRules","addX00","addX10","add245","add246","addSeriesTitle","addPairedPunctuationRules","ruleAppliesToSubfieldCode","targetSubfieldCodes","currSubfieldCode","negation","ruleAppliesToField","rule","ind1","ind2","ruleAppliesToCurrentSubfield","value","match","ruleAppliesToNextSubfield","nextSubfield","followedBy","contextRHS","checkRule","subfield1","subfield2","applyPunctuationRules","ruleArray","tag","activeRules","originalValue","remove","replace","fieldStripPunctuation","useExternalEndPunctuation","validateSingleField"],"sources":["../src/punctuation2.js"],"sourcesContent":["/*\n* punctuation.js -- try and fix a marc field punctuation\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n* NOTE #1: https://www.kiwi.fi/display/kumea/Loppupisteohje is implemented via another validator/fixer (ending-punctuation).\n* This file has some support but it's now yet thorough. (And mmight never be.)\n* NOTE #2: Validator/fixer punctuation does similar stuff, but focuses on X00 fields.\n* NOTE #3: As of 2023-06-05 control subfields ($0...$9) are obsolete. Don't use them in rules.\n* (They are jumped over when looking for next (non-controlfield subfield)\n*/\nimport {validateSingleField} from './ending-punctuation';\n// import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\nimport clone from 'clone';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');\n\nexport default function () {\n return {\n description: 'Add punctuation to data fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Add punctuation to data fields: fixer');\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fieldFixPunctuation(f));\n return res;\n }\n\n function validate(record) {\n nvdebug('Add punctuation to data fields: validate');\n\n const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, true));\n\n\n const values = fieldsNeedingModification.map(f => fieldToString(f));\n const newValues = fieldsNeedingModification.map(f => fieldGetFixedString(f, true));\n\n const messages = values.map((val, i) => `'${val}' => '${newValues[i]}'`);\n\n const res = {message: messages};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nfunction isControlSubfield(subfield) {\n return ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].includes(subfield.code);\n}\n\nfunction getNextRelevantSubfield(field, currSubfieldIndex) {\n return field.subfields.find((subfield, index) => index > currSubfieldIndex && !isControlSubfield(subfield));\n}\n\nexport function fieldGetFixedString(field, add = true) {\n const cloneField = clone(field);\n const operation = add ? subfieldFixPunctuation : subfieldStripPunctuation;\n cloneField.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n operation(cloneField, sf, getNextRelevantSubfield(cloneField, i));\n });\n return fieldToString(cloneField);\n}\n\nexport function fieldNeedsModification(field, add = true) {\n if (!field.subfields) {\n return false;\n }\n\n const originalFieldAsString = fieldToString(field);\n const modifiedFieldAsString = fieldGetFixedString(field, add);\n\n return modifiedFieldAsString !== originalFieldAsString;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////\n// <= Above code is written for the validator logic <= //\n// => Everything below was originally transferred from reducers' punctuation.js => //\n/////////////////////////////////////////////////////////////////////////////////////\n\n\n//const stripCrap = / *[-;:,+]+$/u;\nconst commaNeedsPuncAfter = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö|\\))$/u;\nconst defaultNeedsPuncAfter = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö)$/u;\nconst defaultNeedsPuncAfter2 = /(?:[\\]a-zA-Z0-9)]|ä|å|ö|Å|Ä|Ö)$/u;\nconst blocksPuncRHS = /^(?:\\()/u;\nconst allowsPuncRHS = /^(?:[A-Za-z0-9]|å|ä|ö|Å|Ä|Ö)/u;\n\nconst dotIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö)\\.$/u;\nconst puncIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö) ?[.,:;]$/u;\n// NB! 65X: Finnish terms don't use punctuation, but international ones do. Neither one is currently (2021-11-08) coded here.\n\n// Will unfortunately trigger \"Sukunimi, Th.\" type:\nconst removeColons = {'code': 'abcdefghijklmnopqrstuvwxyz', 'remove': / *[;:]$/u};\nconst removeX00Comma = {'code': 'abcqde', 'followedBy': 'abcqde#', 'context': /.,$/u, 'remove': /,$/u};\nconst cleanRHS = {'code': 'abcd', 'followedBy': 'bcde', 'context': /(?:(?:[a-z0-9]|å|ä|ö)\\.|,)$/u, 'contextRHS': blocksPuncRHS, 'remove': /[.,]$/u};\nconst cleanX00dCommaOrDot = {'code': 'd', 'followedBy': 'et#', 'context': /[0-9]-[,.]$/u, 'remove': /[,.]$/u};\nconst cleanX00aDot = {'code': 'abcde', 'followedBy': 'cdegj', 'context': dotIsProbablyPunc, 'remove': /\\.$/u};\nconst cleanCorruption = {'code': 'abcdefghijklmnopqrstuvwxyz', 'remove': / \\.$/u};\n// These $e dot removals are tricky: before removing the comma, we should know that it ain't an abbreviation such as \"esitt.\"...\nconst cleanX00eDot = {'code': 'e', 'followedBy': 'egj#', 'context': /(?:[ai]ja|jä)[.,]$/u, 'remove': /\\.$/u};\n\nconst X00RemoveDotAfterBracket = {'code': 'cq', 'context': /\\)\\.$/u, 'remove': /\\.$/u};\n// 390, 800, 810, 830...\nconst cleanPuncBeforeLanguage = {'code': 'atvxyz', 'followedBy': 'l', 'context': puncIsProbablyPunc, 'remove': / *[.,:;]$/u};\n\n\nconst addX00aComma = {'add': ',', 'code': 'abcqdej', 'followedBy': 'cdeg', 'context': commaNeedsPuncAfter, 'contextRHS': allowsPuncRHS};\nconst addX00aComma2 = {'add': ',', 'code': 'abcdej', 'followedBy': 'cdeg', 'context': /(?:[A-Z]|Å|Ä|Ö)\\.$/u, 'contextRHS': allowsPuncRHS};\nconst addX00aDot = {'add': '.', 'code': 'abcde', 'followedBy': '#tu', 'context': defaultNeedsPuncAfter};\n\nconst addX10bDot = {'name': 'Add X10 pre-$b dot', 'add': '.', 'code': 'ab', 'followedBy': 'b', 'context': defaultNeedsPuncAfter};\nconst addX10eComma = {'add': ',', 'code': 'abe', 'followedBy': 'e', 'context': defaultNeedsPuncAfter};\nconst addX10Dot = {'name': 'Add X10 final dot', 'add': '.', 'code': 'abe', 'followedBy': '#', 'context': defaultNeedsPuncAfter};\nconst addLanguageComma = {'name': 'Add comma before 810$l', 'add': ',', 'code': 'tv', 'followedBy': 'l', 'context': defaultNeedsPuncAfter2};\nconst addColonToRelationshipInformation = {'name': 'Add \\':\\' to 7X0 $i relationship info', 'add': ':', 'code': 'i', 'context': defaultNeedsPuncAfter2};\n\n// 490:\nconst addSemicolonBeforeVolumeDesignation = {'name': 'Add \" ;\" before $v', 'add': ' ;', 'code': 'atxyz', 'followedBy': 'v', 'context': /[^;]$/u};\n\nconst NONE = 0;\nconst ADD = 2;\nconst REMOVE = 1;\nconst REMOVE_AND_ADD = 3;\n\n// Crappy punctuation consists of various crap that is somewhat common.\n// We strip crap for merge decisions. We are not trying to actively remove crap here.\n\nconst removeX00Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, cleanX00dCommaOrDot, cleanRHS, X00RemoveDotAfterBracket, removeColons, cleanPuncBeforeLanguage];\nconst removeX10Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, removeColons, cleanPuncBeforeLanguage];\n\nconst remove490And830Whatever = [{'code': 'axyzv', 'followedBy': 'axyzv', 'remove': /(?: *;| *=|,)$/u}];\n\nconst linkingEntryWhatever = [{'code': 'abdghiklmnopqrstuwxyz', 'followedBy': 'abdghiklmnopqrstuwxyz', 'remove': /\\. -$/u}];\n\n\n// '!' means negation, thus '!b' means any other subfield but 'b'.\n// 'followedBy': '#' means that current subfield is the last subfield.\n// NB! Note that control subfields are ignored in punctuation rules.\n// NB #2! Control field ignorance causes issues with field 257: https://wiki.helsinki.fi/display/rdasovellusohje/Loppupisteohje\n// Might need to work on that at some point. NOT a top priority though.\n// NB #3! Final punctuation creation is/should be handled by endind-punctuation.js validator!\n\nconst crappy246 = [{'code': 'abfghinp', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}];\n\nconst cleanCrappyPunctuationRules = {\n '100': removeX00Whatever,\n '110': removeX10Whatever,\n '245': [\n {'code': 'ab', 'followedBy': '!c', 'remove': / \\/$/u},\n {'code': 'abc', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}\n ],\n '246': crappy246,\n '300': [\n {'code': 'a', 'followedBy': '!b', 'remove': / *:$/u},\n {'code': 'a', 'followedBy': 'b', 'remove': /:$/u, 'context': /[^ ]:$/u},\n {'code': 'ab', 'followedBy': '!c', 'remove': / *;$/u},\n {'code': 'ab', 'followedBy': 'c', 'remove': /;$/u, 'context': /[^ ];$/u},\n {'code': 'abc', 'followedBy': '!e', 'remove': / *\\+$/u} // Removes both valid (with one space) and invalid (spaceless et al) puncs\n\n ],\n\n '490': remove490And830Whatever,\n '600': removeX00Whatever,\n '610': removeX10Whatever,\n '700': removeX00Whatever,\n '710': removeX10Whatever,\n '773': linkingEntryWhatever,\n '774': linkingEntryWhatever,\n '776': linkingEntryWhatever,\n '800': removeX00Whatever,\n '810': removeX10Whatever,\n '830': remove490And830Whatever,\n '946': crappy246\n};\n\nconst cleanLegalX00Comma = {'code': 'abcde', 'followedBy': 'cdegj', 'context': /.,$/u, 'remove': /,$/u};\n// Accept upper case letters in X00$b, since they are probably Roman numerals.\nconst cleanLegalX00bDot = {'code': 'b', 'followedBy': 't#', context: /^[IVXLCDM]+\\.$/u, 'remove': /\\.$/u};\nconst cleanLegalX00iColon = {'code': 'i', 'followedBy': 'a', 'remove': / *:$/u}; // NB! context is not needed\nconst cleanLegalX00Dot = {'code': 'abcdetvl', 'followedBy': 'tu#', 'context': /(?:[a-z0-9)]|å|ä|ö)\\.$/u, 'remove': /\\.$/u};\nconst cleanLanguageComma = {'name': 'language comma', 'code': 'tv', 'followedBy': 'l', 'context': /.,$/u, 'remove': /,$/u};\n\n\nconst legalX00punc = [cleanLegalX00Comma, cleanLegalX00iColon, cleanLegalX00bDot, cleanLegalX00Dot, cleanLanguageComma];\n\nconst cleanLegalX10Comma = {'name': 'X10comma', 'code': 'abe', 'followedBy': 'e', 'context': /.,$/u, 'remove': /,$/u};\nconst cleanLegalX10Dot = {'name': 'X10dot', 'code': 'ab', 'followedBy': 'b#', 'context': /.\\.$/u, 'remove': /\\.$/u};\n\nconst legalX10punc = [cleanLegalX10Comma, cleanLegalX10Dot, cleanX00eDot, cleanLanguageComma];\n\nconst cleanLegalSeriesTitle = [ // 490 and 830\n {'code': 'a', 'followedBy': 'a', 'remove': / =$/u},\n {'code': 'axyz', 'followedBy': 'xyz', 'remove': /,$/u, 'context': /.,$/u},\n {'code': 'axyz', 'followedBy': 'v', 'remove': / *;$/u}\n];\n\nconst clean24X = [\n {'name': 'I:A', 'code': 'i', 'followedBy': 'a', 'remove': / *:$/u},\n {'name': 'A:B', 'code': 'a', 'followedBy': 'b', 'remove': / [:;=]$/u},\n {'name': 'AB:K', 'code': 'ab', 'followedBy': 'k', 'remove': / :$/u},\n {'name': 'ABK:F', 'code': 'abk', 'followedBy': 'f', 'remove': /,$/u},\n {'name': 'ABFNP:C', 'code': 'abfnp', 'followedBy': 'c', 'remove': / \\/$/u},\n {'name': 'ABN:N', 'code': 'abn', 'followedBy': 'n', 'remove': /\\.$/u},\n {'name': 'ABNP:#', 'code': 'abnp', 'followedBy': '#', 'remove': /\\.$/u},\n {'name': 'N:P', 'code': 'n', 'followedBy': 'p', 'remove': /,$/u}\n];\n\nconst cleanValidPunctuationRules = {\n '100': legalX00punc,\n '110': legalX10punc,\n '600': legalX00punc,\n '610': legalX10punc,\n '700': legalX00punc,\n '710': legalX10punc,\n '800': legalX00punc,\n '810': legalX10punc,\n '245': clean24X,\n '246': clean24X,\n '260': [\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'b', 'followedBy': 'c', 'remove': /,$/u},\n {'code': 'c', 'followedBy': '#', 'remove': /\\.$/u},\n {'code': 'd', 'followedBy': 'e', 'remove': / :$/u},\n {'code': 'e', 'followedBy': 'f', 'remove': /,$/u},\n {'code': 'f', 'followedBy': '#', 'remove': /\\.$/u} // Probably ')' but should it be removed?\n ],\n '264': [\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'b', 'followedBy': 'c', 'remove': /,$/u},\n {'code': 'c', 'followedBy': '#', 'remove': /\\.$/u}\n ],\n '300': [\n // NB! Remove crap as well, thus the '*' in / *:$/\n {'code': 'a', 'followedBy': 'b', 'remove': / :$/u},\n {'code': 'ab', 'followedBy': 'c', 'remove': / ;$/u},\n {'code': 'abc', 'followedBy': 'e', 'remove': / \\+$/u}\n ],\n '490': cleanLegalSeriesTitle,\n '534': [{'code': 'p', 'followedBy': 'c', 'remove': /:$/u}],\n // Experimental, MET366-ish (end punc in internationally valid, but we don't use it here in Finland):\n '648': [{'code': 'a', 'content': /^[0-9]+\\.$/u, 'ind2': ['4'], 'remove': /\\.$/u}],\n '830': cleanLegalSeriesTitle,\n '946': clean24X\n\n};\n\n// addColonToRelationshipInformation only applies to 700/710 but as others don't have $i, it's fine\nconst addX00 = [addX00aComma, addX00aComma2, addX00aDot, addLanguageComma, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];\nconst addX10 = [addX10bDot, addX10eComma, addX10Dot, addLanguageComma, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];\n\nconst add245 = [\n // Blah! Also \"$a = $b\" and \"$a ; $b\" can be valid... But ' :' is better than nothing, I guess...\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter},\n {'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': defaultNeedsPuncAfter},\n {'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': defaultNeedsPuncAfter},\n {'code': 'abc', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter} // Stepping on punctuation/ toes\n];\n\nconst add246 = [\n {'code': 'i', 'followedBy': 'a', 'add': ':', 'context': defaultNeedsPuncAfter},\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter},\n {'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': defaultNeedsPuncAfter},\n {'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': defaultNeedsPuncAfter}\n];\n\n\nconst addSeriesTitle = [ // 490 and 830\n {'code': 'a', 'followedBy': 'a', 'add': ' =', 'context': defaultNeedsPuncAfter2},\n {'code': 'axyz', 'followedBy': 'xy', 'add': ',', 'context': defaultNeedsPuncAfter},\n addSemicolonBeforeVolumeDesignation // eg. 490$axyz-$v\n];\n\nconst addPairedPunctuationRules = {\n '100': addX00,\n '110': addX10,\n '245': add245,\n '246': add246,\n '260': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'b', 'followedBy': 'c', 'add': ',', 'context': defaultNeedsPuncAfter2},\n {'code': 'abc', 'followedBy': 'a', 'add': ' ;', 'context': defaultNeedsPuncAfter2},\n {'code': 'e', 'followedBy': 'f', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'f', 'followedBy': 'g', 'add': ',', 'context': defaultNeedsPuncAfter2}\n ],\n '264': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'b', 'followedBy': 'c', 'add': ',', 'context': defaultNeedsPuncAfter2},\n // NB! The $c rule messes dotless exception \"264 #4 $c p1983\" up\n // We'll need to add a hacky postprocessor for this? Add 'hasInd1': '0123' etc?\n {'code': 'c', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter2}\n ],\n '300': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'ab', 'followedBy': 'c', 'add': ' ;', 'context': defaultNeedsPuncAfter2},\n {'code': 'abc', 'followedBy': 'e', 'add': ' +', 'context': defaultNeedsPuncAfter2}\n ],\n '490': addSeriesTitle,\n '506': [{'code': 'a', 'followedBy': '#', 'add': '.', 'context': defaultNeedsPuncAfter2}],\n '534': [{'code': 'p', 'followedBy': 'c', 'add': ':', 'context': defaultNeedsPuncAfter2}],\n '600': addX00,\n '610': addX10,\n '700': addX00,\n '710': addX10,\n '800': addX00,\n '810': addX10,\n '830': addSeriesTitle,\n '946': [{'code': 'i', 'followedBy': 'a', 'add': ':', 'context': defaultNeedsPuncAfter}]\n};\n\n\nfunction ruleAppliesToSubfieldCode(targetSubfieldCodes, currSubfieldCode) {\n const negation = targetSubfieldCodes.includes('!');\n if (negation) {\n return !targetSubfieldCodes.includes(currSubfieldCode);\n }\n return targetSubfieldCodes.includes(currSubfieldCode);\n}\n\n\nfunction ruleAppliesToField(rule, field) {\n if ('ind1' in rule && field.ind1.includes(rule.ind1)) {\n return false;\n }\n\n if ('ind2' in rule && field.ind2.includes(rule.ind2)) {\n return false;\n }\n\n // If we want to check, say, $2, it should be implemented here!\n\n return true;\n}\n\n\nfunction ruleAppliesToCurrentSubfield(rule, subfield) {\n if (!ruleAppliesToSubfieldCode(rule.code, subfield.code)) {\n return false;\n }\n if ('context' in rule && !subfield.value.match(rule.context)) { // njsscan-ignore: regex_injection_dos\n return false;\n }\n return true;\n}\n\nfunction ruleAppliesToNextSubfield(rule, nextSubfield) {\n if (!('followedBy' in rule)) { // Return true, if we are not interested in the next subfield\n return true;\n }\n // The '#' existence check applies only to the RHS field. LHS always exists.\n if (!nextSubfield) {\n const negation = rule.followedBy.includes('!');\n if (negation) {\n return !rule.followedBy.includes('#');\n }\n return rule.followedBy.includes('#');\n }\n\n if (!ruleAppliesToSubfieldCode(rule.followedBy, nextSubfield.code)) {\n return false;\n }\n if ('contextRHS' in rule && !nextSubfield.value.match(rule.contextRHS)) { // njsscan-ignore: regex_injection_dos\n return false;\n }\n return true;\n}\n\nfunction checkRule(rule, field, subfield1, subfield2) {\n if (!ruleAppliesToField(rule, field)) {\n nvdebug(`FAIL ON WHOLE FIELD: '${fieldToString(field)}`);\n return false;\n }\n //const name = rule.name || 'UNNAMED';\n if (!ruleAppliesToCurrentSubfield(rule, subfield1)) {\n //nvdebug(`${name}: FAIL ON LHS SUBFIELD: '$${subfield1.code} ${subfield1.value}', SF=${rule.code}`, debug);\n return false;\n }\n\n // NB! This is not a perfect solution. We might have $e$0$e where $e$0 punctuation should actually be based on $e$e rules\n if (!ruleAppliesToNextSubfield(rule, subfield2)) {\n //const msg = subfield2 ? `${name}: FAIL ON RHS SUBFIELD '${subfield2.code}' not in [${rule.followedBy}]` : `${name}: FAIL ON RHS FIELD`;\n //nvdebug(msg, debug);\n return false;\n }\n\n //nvdebug(`${name}: ACCEPT ${rule.code}/${subfield1.code}, SF2=${rule.followedBy}/${subfield2 ? subfield2.code : '#'}`, debug);\n return true;\n}\n\nfunction applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, operation = NONE) {\n\n /*\n if (ruleArray === null || operation === NONE) {\n debug(`applyPunctuation(): No rules to apply!`);\n return;\n }\n*/\n if (!(`${field.tag}` in ruleArray) || ruleArray === null || operation === NONE) {\n\n /*\n if (!['020', '650'].includes(tag) || !isControlSubfieldCode(subfield1.code)) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`No punctuation rules found for ${tag} (looking for: ‡${subfield1.code})`, debug);\n\n }\n */\n return;\n }\n\n //nvdebug(`OP=${operation} ${tag}: '${subfield1.code}: ${subfield1.value}' ??? '${subfield2 ? subfield2.code : '#'}'`, debug);\n const activeRules = ruleArray[field.tag].filter(rule => checkRule(rule, field, subfield1, subfield2));\n\n activeRules.forEach(rule => {\n const originalValue = subfield1.value;\n if (rule.remove && [REMOVE, REMOVE_AND_ADD].includes(operation) && subfield1.value.match(rule.remove)) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(` PUNC REMOVAL TO BE PERFORMED FOR $${subfield1.code} '${subfield1.value}'`, debug);\n subfield1.value = subfield1.value.replace(rule.remove, ''); // eslint-disable-line functional/immutable-data\n //nvdebug(` PUNC REMOVAL PERFORMED FOR '${subfield1.value}'`, debug);\n }\n if (rule.add && [ADD, REMOVE_AND_ADD].includes(operation)) { // eslint-disable-line functional/no-conditional-statements\n subfield1.value += rule.add; // eslint-disable-line functional/immutable-data\n //nvdebug(` ADDED '${rule.add}' TO '${subfield1.value}'`, debug);\n }\n if (subfield1.value !== originalValue) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(` PROCESS PUNC: '‡${subfield1.code} ${originalValue}' => '‡${subfield1.code} ${subfield1.value}'`, debug); // eslint-disable-line functional/immutable-data\n }\n });\n}\n\nfunction subfieldFixPunctuation(field, subfield1, subfield2) {\n applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);\n applyPunctuationRules(field, subfield1, subfield2, addPairedPunctuationRules, ADD);\n}\n\nfunction subfieldStripPunctuation(field, subfield1, subfield2) {\n //nvdebug(`FSP1: '${subfield1.value}'`);\n applyPunctuationRules(field, subfield1, subfield2, cleanValidPunctuationRules, REMOVE);\n //nvdebug(`FSP2: '${subfield1.value}'`);\n applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);\n //nvdebug(`FSP3: '${subfield1.value}'`);\n\n}\n\nexport function fieldStripPunctuation(field) {\n if (!field.subfields) {\n return field;\n }\n\n field.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n subfieldStripPunctuation(field, sf, getNextRelevantSubfield(field, i));\n\n });\n return field;\n}\n\nexport function fieldFixPunctuation(field) {\n if (!field.subfields) {\n return field;\n }\n nvdebug(`################### fieldFixPunctuation() TEST ${fieldToString(field)}`);\n\n field.subfields.forEach((sf, i) => {\n // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!\n // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)\n subfieldFixPunctuation(field, sf, getNextRelevantSubfield(field, i));\n });\n\n // Use shared code for final punctuation (sadly this does not fix intermediate punc):\n if (field.useExternalEndPunctuation) { // eslint-disable-line functional/no-conditional-statements\n // addFinalPunctuation(field); // local version. use shared code instead.\n validateSingleField(field, false, true); // NB! Don't use field.tag as second argument! It's a string, not an int. 3rd arg must be true (=fix)\n }\n return field;\n}\n"],"mappings":"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"}
@@ -172,6 +172,55 @@ function removeInferiorChains(record, fix = true) {
172
172
  /* eslint-enable */
173
173
  return deletedStringsArray;
174
174
  }
175
+ function deriveIndividualDeletables490(fieldAsString) {
176
+ if (!fieldAsString.match(/^490/u)) {
177
+ return [];
178
+ }
179
+
180
+ /* eslint-disable */
181
+ let deletable490s = [];
182
+
183
+ // $6-less version (keep this first)
184
+ let tmp = fieldAsString.replace(/ ‡6 [^‡]+ ‡/u, ' ‡');
185
+ if (tmp !== fieldAsString) {
186
+ fieldAsString = tmp; // NB! Carry on with $6-less version!
187
+ deletable490s.push(tmp);
188
+ }
189
+
190
+ // Without final $v or $x:
191
+ tmp = fieldAsString.replace(/ *[;,] ‡[vx] [^‡]+$/u, '');
192
+ if (tmp !== fieldAsString) {
193
+ deletable490s.push(tmp);
194
+ }
195
+
196
+ // Add intermedia $x-less version
197
+ tmp = fieldAsString.replace(/, ‡x [^‡]+(, ‡x| ; ‡v)/u, '$1');
198
+ // Add final $v/$x-less version
199
+ if (tmp !== fieldAsString) {
200
+ deletable490s.push(tmp);
201
+ }
202
+
203
+ // Add $xv-less version
204
+ tmp = fieldAsString.replace(/, ‡x [^‡]+ ‡v [^‡]+$/u, '');
205
+ if (tmp !== fieldAsString) {
206
+ deletable490s.push(tmp);
207
+ }
208
+
209
+ // MRA-433-ish (non-chain): 490 ind1=1 vs ind1=0: remove latter
210
+ if (fieldAsString.match(/^490 1/)) {
211
+ // TODO: $x-less and $v-less versions...
212
+ tmp = `490 0${fieldAsString.substring(5)}`;
213
+ deletable490s.push(tmp);
214
+ const arr = deriveIndividualDeletables490(tmp);
215
+ arr.forEach(val => deletable490s.push(val));
216
+ }
217
+ (0, _utils.nvdebug)(`${deletable490s.length} derivation(s) for ${fieldAsString}`);
218
+ if (deletable490s.length > 0) {
219
+ (0, _utils.nvdebug)(deletable490s.join('\n'));
220
+ }
221
+ /* eslint-enable */
222
+ return deletable490s;
223
+ }
175
224
  function deriveIndividualDeletables(record) {
176
225
  /* eslint-disable */
177
226
  let deletableStringsArray = [];
@@ -179,7 +228,7 @@ function deriveIndividualDeletables(record) {
179
228
  record.fields.forEach(field => fieldDeriveIndividualDeletables(field));
180
229
  function fieldDeriveIndividualDeletables(field) {
181
230
  const fieldAsString = (0, _utils.fieldToString)(field);
182
- (0, _utils.nvdebug)(`Derivations for ${fieldAsString}`);
231
+
183
232
  // Proof-of-concept rule:
184
233
  let tmp = fieldAsString;
185
234
  if (field.tag.match(/^[1678]00$/u)) {
@@ -188,21 +237,38 @@ function deriveIndividualDeletables(record) {
188
237
  deletableStringsArray.push(tmp);
189
238
  }
190
239
  }
240
+ if (field.tag === '505') {
241
+ // MRA-413-ish
242
+ if (fieldAsString.match(/^.0.*-- ‡t/u)) {
243
+ tmp = fieldAsString;
244
+ tmp = tmp.replace(/ -- ‡t /gu, ' -- ');
245
+ tmp = tmp.replace(/ ‡[rg] /gu, ' ');
246
+ tmp = tmp.replace(/ ‡t /u, ' ‡a '); // first $t, not
247
+ tmp = tmp.replace(/^505 (.)0/u, '505 $1#');
248
+ if (tmp !== fieldAsString) {
249
+ deletableStringsArray.push(tmp);
250
+ }
251
+ //nvdebug(`505 ORIGINAL: '${fieldAsString}'`)
252
+ //nvdebug(`505 DERIVATE: '${tmp}'`)
253
+ }
254
+ }
191
255
 
192
256
  // MET-381: remove occurence number TAG-00, if TAG-NN existists
193
257
  if (field.tag === '880') {
194
258
  tmp = fieldAsString;
195
259
  if (tmp.match(/ ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/)) {
196
260
  tmp = tmp.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/, '$1-00');
197
- (0, _utils.nvdebug)(`MET-381: ADD TO DELETABLES: ${tmp}`);
261
+ (0, _utils.nvdebug)(`MET-381: ADD TO DELETABLES: '${tmp}'`);
198
262
  deletableStringsArray.push(tmp);
199
263
  if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\/[^ ]+ /)) {
200
264
  tmp = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/, '$1');
201
- (0, _utils.nvdebug)(`MET-381: ADD TO DELETABLES: ${tmp}`);
265
+ (0, _utils.nvdebug)(`MET-381: ADD TO DELETABLES: '${tmp}'`);
202
266
  deletableStringsArray.push(tmp);
203
267
  }
204
268
  }
205
269
  }
270
+ const d490 = deriveIndividualDeletables490(fieldAsString);
271
+ d490.forEach(str => deletableStringsArray.push(str));
206
272
 
207
273
  // Remove keepless versions:
208
274
  tmp = fieldAsString;
@@ -210,14 +276,7 @@ function deriveIndividualDeletables(record) {
210
276
  tmp = tmp.replace(/ ‡9 [A-Z]+<KEEP>/u, '');
211
277
  deletableStringsArray.push(tmp);
212
278
  }
213
-
214
- // MRA-433-ish (non-chain): 490 ind1=1 vs ind1=0: remove latter
215
- if (fieldAsString.match(/^490 1/)) {
216
- tmp = fieldAsString.replace(/^490 1/u, '490 0');
217
- deletableStringsArray.push(tmp);
218
- }
219
279
  }
220
-
221
280
  /* eslint-enable */
222
281
  return deletableStringsArray; // we should do uniq!
223
282
  }
@@ -1 +1 @@
1
- {"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","_subfield8Utils","_prepublicationUtils","_normalizeFieldForComparison","obj","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeInferiorDatafields","duplicates","length","deriveInferiorChains","fields","deletableStringsObject","forEach","field","fieldDeriveChainDeletables","chain","fieldToChain","chainAsString","fieldsToNormalizedString","tmp","match","replace","isRelevantChain6","fieldHasValidSubfield6","fieldHasValidSubfield8","some","f","subfields","filter","sf","code","tmpInferiorId","result","removeInferiorChains","deletableChainsAsKeys","nChains","Object","keys","deletedStringsArray","innerRemoveInferiorChain","chainContains1XX","tag","substring","sevenToOne","includes","pairs","fieldGetOccurrenceNumberPairs","pairedField","fieldSevenToOneOccurrenceNumber","sameField","triggeringField","triggeringChain","deletedString","fieldsToString","push","currField","removeField","deriveIndividualDeletables","deletableStringsArray","finishedRecord","encodingLevelIsBetterThanPrepublication","getEncodingLevel","fieldDeriveIndividualDeletables","fieldAsString","fieldToString","fieldToNormalizedString","normalizedField","cloneAndNormalizeFieldForComparison","deriveIndividualNormalizedDeletables","deletableNormalizedStringsArray","recordIsFinished","fieldDeriveIndividualNormalizedDeletables","fieldAsNormalizedString","removeIndividualInferiorDatafields","deletableFieldsAsStrings","deletableFieldsAsNormalizedStrings","hits","isDeletableField","deletedFieldsAsStrings","map","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 {fieldsToString, fieldToString, nvdebug} from './utils';\nimport {fieldHasValidSubfield8} from './subfield8Utils';\nimport {encodingLevelIsBetterThanPrepublication, getEncodingLevel} from './prepublicationUtils';\nimport {cloneAndNormalizeFieldForComparison} from './normalizeFieldForComparison';\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 /* eslint-disable */\n let deletableStringsObject = {};\n\n nvdebug(`WP1: GOT ${fields.length} field(s) for potential deletable chain derivation`);\n fields.forEach(field => fieldDeriveChainDeletables(field));\n\n function fieldDeriveChainDeletables(field) {\n const chain = fieldToChain(field, record);\n if (chain.length === 0) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n\n //nvdebug(`666: ${chainAsString}`);\n\n // Fix MRA-476 (part 1): one $6 value can be worse than the other\n let tmp = chainAsString;\n while (tmp.match(/ ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+)\\/[^ ]+/u)) {\n tmp = tmp.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\\/[^ ]+/u, '$1');\n //nvdebug(`FFS: ${tmp}`);\n deletableStringsObject[tmp] = field;\n }\n\n // Remove keepless versions:\n tmp = chainAsString;\n while (tmp.match(/ ‡9 [A-Z]+<KEEP>/)) {\n tmp = tmp.replace(/ ‡9 [A-Z]+<KEEP>/, '');\n deletableStringsObject[tmp] = field;\n //nvdebug(`FFS: ${tmp}`);\n }\n\n // MRA-433: 490 ind1=1 vs ind1=0: remove latter (luckily no 2nd indicator etc)\n if (chainAsString.match(/^490 1 .*\\t880 1 ‡/) ) {\n // change ind1s to '0' to get the deletable chain:\n tmp = chainAsString.replace(/^490 1/u, '490 0').replace(/\\t880 1/ug, \"\\t880 0\");\n deletableStringsObject[tmp] = field;\n }\n\n }\n\n\n /* eslint-enable */\n return deletableStringsObject;\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 // Chainwise non-initial fields are not relevant as chains is handled through the initial/head field\n /* eslint-disable */\n field.tmpInferiorId = 666;\n const result = chain[0].tmpInferiorId === 666 ? true : false;\n delete field.tmpInferiorId;\n /* eslint-enable */\n return result;\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\n /* eslint-disable */\n\n let deletedStringsArray = [];\n fields.forEach(f => innerRemoveInferiorChain(f));\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 function innerRemoveInferiorChain(field) {\n const chain = fieldToChain(field, record);\n if (chain.length === 0 || !sameField(field, chain[0])) {\n return;\n }\n\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n if (chainAsString in deletableChainsAsKeys) {\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)) {\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 deletedStringsArray.push(message);\n if (fix) {\n nvdebug(`INFERIOR $6 CHAIN REMOVAL: ${message}}`, debug);\n chain.forEach(currField => record.removeField(currField));\n }\n }\n }\n\n /* eslint-enable */\n return deletedStringsArray;\n}\n\nfunction deriveIndividualDeletables(record) {\n /* eslint-disable */\n let deletableStringsArray = [];\n\n const finishedRecord = encodingLevelIsBetterThanPrepublication(getEncodingLevel(record));\n\n record.fields.forEach(field => fieldDeriveIndividualDeletables(field));\n\n function fieldDeriveIndividualDeletables(field) {\n const fieldAsString = fieldToString(field);\n\n nvdebug(`Derivations for ${fieldAsString}`);\n // Proof-of-concept rule:\n let tmp = fieldAsString;\n if (field.tag.match(/^[1678]00$/u)) {\n while (tmp.match(/, ‡e [^‡]+\\.$/)) {\n tmp = tmp.replace(/, ‡e [^‡]+\\.$/, '.');\n deletableStringsArray.push(tmp);\n }\n }\n\n // MET-381: remove occurence number TAG-00, if TAG-NN existists\n if (field.tag === '880') {\n tmp = fieldAsString;\n if (tmp.match(/ ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/)) {\n tmp = tmp.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/, '$1-00');\n nvdebug(`MET-381: ADD TO DELETABLES: ${tmp}`);\n deletableStringsArray.push(tmp);\n if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\\/[^ ]+ /)) {\n tmp = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/, '$1');\n nvdebug(`MET-381: ADD TO DELETABLES: ${tmp}`);\n deletableStringsArray.push(tmp);\n }\n }\n }\n\n\n\n // Remove keepless versions:\n tmp = fieldAsString;\n while (tmp.match(/ ‡9 [A-Z]+<KEEP>/)) {\n tmp = tmp.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n deletableStringsArray.push(tmp);\n }\n\n // MRA-433-ish (non-chain): 490 ind1=1 vs ind1=0: remove latter\n if (fieldAsString.match(/^490 1/) ) {\n tmp = fieldAsString.replace(/^490 1/u, '490 0');\n deletableStringsArray.push(tmp);\n }\n }\n\n /* eslint-enable */\n return deletableStringsArray; // we should do uniq!\n\n}\n\nfunction fieldToNormalizedString(field) {\n const normalizedField = cloneAndNormalizeFieldForComparison(field);\n return fieldToString(normalizedField);\n}\n\nfunction deriveIndividualNormalizedDeletables(record) {\n /* eslint-disable */\n let deletableNormalizedStringsArray = [];\n\n const recordIsFinished = encodingLevelIsBetterThanPrepublication(getEncodingLevel(record));\n\n record.fields.forEach(field => fieldDeriveIndividualNormalizedDeletables(field));\n\n function fieldDeriveIndividualNormalizedDeletables(field) {\n const fieldAsNormalizedString = fieldToNormalizedString(field);\n let tmp = fieldAsNormalizedString;\n\n // MET-461:\n if (recordIsFinished && ['245', '246'].includes(field.tag) && fieldAsNormalizedString.match(/ ‡a /u)) {\n tmp = fieldAsNormalizedString;\n tmp = tmp.replace(/^(...) ../u, '946 ##'); // Ind\n tmp = tmp.replace(\" ‡a \", \" ‡i nimeke onixissa ‡a \"); // NB! This is added in the normalized lower-cased form!\n tmp = tmp.replace(/(?: \\/)? ‡c[^‡]+$/u, ''); // Can $c be non-last?\n deletableNormalizedStringsArray.push(tmp);\n deletableNormalizedStringsArray.push(`${tmp} ‡5 MELINDA`); // MET-461 comment. NB! $5 is never normalized\n }\n }\n\n /* eslint-enable */\n return deletableNormalizedStringsArray; // we should do uniq!\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)}`);\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 ')}`);\n nvdebug(`REMOVABLES 6:\\n ${removables6.join('\\n ')}`);\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;AAAkF,SAAAD,uBAAAQ,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAElF;;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,IAAIU,sBAAsB,GAAG,CAAC,CAAC;EAE/B,IAAAT,cAAO,EAAE,YAAWQ,MAAM,CAACF,MAAO,oDAAmD,CAAC;EACtFE,MAAM,CAACE,OAAO,CAACC,KAAK,IAAIC,0BAA0B,CAACD,KAAK,CAAC,CAAC;EAE1D,SAASC,0BAA0BA,CAACD,KAAK,EAAE;IACzC,MAAME,KAAK,GAAG,IAAAC,uCAAY,EAACH,KAAK,EAAEZ,MAAM,CAAC;IACzC,IAAIc,KAAK,CAACP,MAAM,KAAK,CAAC,EAAE;MACtB;IACF;IACA,MAAMS,aAAa,GAAG,IAAAC,wCAAwB,EAACH,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;;IAEpE;;IAEA;IACA,IAAII,GAAG,GAAGF,aAAa;IACvB,OAAOE,GAAG,CAACC,KAAK,CAAC,4CAA4C,CAAC,EAAE;MAC9DD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,8CAA8C,EAAE,IAAI,CAAC;MACvE;MACAV,sBAAsB,CAACQ,GAAG,CAAC,GAAGN,KAAK;IACrC;;IAEA;IACAM,GAAG,GAAGF,aAAa;IACnB,OAAOE,GAAG,CAACC,KAAK,CAAC,kBAAkB,CAAC,EAAE;MACpCD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;MACzCV,sBAAsB,CAACQ,GAAG,CAAC,GAAGN,KAAK;MACnC;IACF;;IAEA;IACA,IAAII,aAAa,CAACG,KAAK,CAAC,qBAAqB,CAAC,EAAG;MAC/C;MACAD,GAAG,GAAGF,aAAa,CAACI,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAACA,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC;MAC/EV,sBAAsB,CAACQ,GAAG,CAAC,GAAGN,KAAK;IACrC;EAEF;;EAGA;EACA,OAAOF,sBAAsB;AAC/B;AAEA,SAASW,gBAAgBA,CAACT,KAAK,EAAEZ,MAAM,EAAE;EACvC;EACA,IAAI,CAAC,IAAAsB,sCAAsB,EAACV,KAAK,CAAC,IAAI,CAAC,IAAAW,sCAAsB,EAACX,KAAK,CAAC,EAAE;IACpE,OAAO,KAAK;EACd;EACA;EACA,MAAME,KAAK,GAAG,IAAAC,uCAAY,EAACH,KAAK,EAAEZ,MAAM,CAAC;EACzC,IAAIc,KAAK,CAACP,MAAM,GAAG,CAAC,EAAE;IACpB,OAAO,KAAK;EACd;EACA;EACA,IAAIO,KAAK,CAACU,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,SAAS,CAACC,MAAM,CAACC,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC,CAACtB,MAAM,GAAG,CAAC,CAAC,EAAE;IACzE,OAAO,KAAK;EACd;;EAEA;EACA;EACAK,KAAK,CAACkB,aAAa,GAAG,GAAG;EACzB,MAAMC,MAAM,GAAGjB,KAAK,CAAC,CAAC,CAAC,CAACgB,aAAa,KAAK,GAAG,GAAG,IAAI,GAAG,KAAK;EAC5D,OAAOlB,KAAK,CAACkB,aAAa;EAC1B;EACA,OAAOC,MAAM;AACf;AAEO,SAASC,oBAAoBA,CAAChC,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EACvD,MAAMU,MAAM,GAAGT,MAAM,CAACS,MAAM,CAACkB,MAAM,CAACF,CAAC,IAAIJ,gBAAgB,CAACI,CAAC,EAAEzB,MAAM,CAAC,CAAC;EACrE;;EAEA,MAAMiC,qBAAqB,GAAGzB,oBAAoB,CAACC,MAAM,EAAET,MAAM,CAAC;EAClE,MAAMkC,OAAO,GAAGC,MAAM,CAACC,IAAI,CAACH,qBAAqB,CAAC,CAAC1B,MAAM;EACzD;EACA,IAAI2B,OAAO,KAAK,CAAC,EAAE;IACjB,OAAO,EAAE;EACX;EAEA,IAAAjC,cAAO,EAAE,8BAA6BQ,MAAM,CAACF,MAAO,sCAAqC2B,OAAQ,eAAc,CAAC;;EAGhH;;EAEA,IAAIG,mBAAmB,GAAG,EAAE;EAC5B5B,MAAM,CAACE,OAAO,CAACc,CAAC,IAAIa,wBAAwB,CAACb,CAAC,CAAC,CAAC;EAEhD,SAASc,gBAAgBA,CAACzB,KAAK,EAAE;IAC/B,OAAOA,KAAK,CAACU,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACe,GAAG,CAACC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC;EACvD;EAEA,SAASC,UAAUA,CAAC9B,KAAK,EAAEE,KAAK,EAAE;IAAE;IAClC;IACA,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC6B,QAAQ,CAAC/B,KAAK,CAAC4B,GAAG,CAAC,EAAE;MACrD;IACF;IACA;IACA,MAAMI,KAAK,GAAG,IAAAC,6CAA6B,EAACjC,KAAK,EAAEE,KAAK,CAAC;IACzDF,KAAK,CAAC4B,GAAG,GAAI,IAAG5B,KAAK,CAAC4B,GAAG,CAACC,SAAS,CAAC,CAAC,CAAE,EAAC,CAAC,CAAC;IAC1C;IACAG,KAAK,CAACjC,OAAO,CAACmC,WAAW,IAAI,IAAAC,+CAA+B,EAACD,WAAW,CAAC,CAAC;EAC5E;EAEA,SAASR,wBAAwBA,CAAC1B,KAAK,EAAE;IACvC,MAAME,KAAK,GAAG,IAAAC,uCAAY,EAACH,KAAK,EAAEZ,MAAM,CAAC;IACzC,IAAIc,KAAK,CAACP,MAAM,KAAK,CAAC,IAAI,CAAC,IAAAyC,oCAAS,EAACpC,KAAK,EAAEE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;MACrD;IACF;IAEA,MAAME,aAAa,GAAG,IAAAC,wCAAwB,EAACH,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IACpE,IAAIE,aAAa,IAAIiB,qBAAqB,EAAE;MAC1C,MAAMgB,eAAe,GAAGhB,qBAAqB,CAACjB,aAAa,CAAC;MAC5D,MAAMkC,eAAe,GAAG,IAAAnC,uCAAY,EAACkC,eAAe,EAAEjD,MAAM,CAAC;;MAE7D;MACA,IAAGuC,gBAAgB,CAACzB,KAAK,CAAC,EAAE;QAC1BoC,eAAe,CAACvC,OAAO,CAACc,CAAC,IAAIiB,UAAU,CAACjB,CAAC,EAAEyB,eAAe,CAAC,CAAC;MAC9D;MACA;MACA,MAAMC,aAAa,GAAG,IAAAC,qBAAc,EAACtC,KAAK,CAAC;MAC3C,MAAMX,OAAO,GAAI,SAAQgD,aAAc,eAAc,IAAAC,qBAAc,EAACF,eAAe,CAAE,GAAE;MACvFb,mBAAmB,CAACgB,IAAI,CAAClD,OAAO,CAAC;MACjC,IAAIJ,GAAG,EAAE;QACP,IAAAE,cAAO,EAAE,8BAA6BE,OAAQ,GAAE,EAAET,KAAK,CAAC;QACxDoB,KAAK,CAACH,OAAO,CAAC2C,SAAS,IAAItD,MAAM,CAACuD,WAAW,CAACD,SAAS,CAAC,CAAC;MAC3D;IACF;EACF;;EAEA;EACA,OAAOjB,mBAAmB;AAC5B;AAEA,SAASmB,0BAA0BA,CAACxD,MAAM,EAAE;EAC1C;EACA,IAAIyD,qBAAqB,GAAG,EAAE;EAE9B,MAAMC,cAAc,GAAG,IAAAC,4DAAuC,EAAC,IAAAC,qCAAgB,EAAC5D,MAAM,CAAC,CAAC;EAExFA,MAAM,CAACS,MAAM,CAACE,OAAO,CAACC,KAAK,IAAIiD,+BAA+B,CAACjD,KAAK,CAAC,CAAC;EAEtE,SAASiD,+BAA+BA,CAACjD,KAAK,EAAE;IAC9C,MAAMkD,aAAa,GAAG,IAAAC,oBAAa,EAACnD,KAAK,CAAC;IAE1C,IAAAX,cAAO,EAAE,mBAAkB6D,aAAc,EAAC,CAAC;IAC3C;IACA,IAAI5C,GAAG,GAAG4C,aAAa;IACvB,IAAIlD,KAAK,CAAC4B,GAAG,CAACrB,KAAK,CAAC,aAAa,CAAC,EAAE;MAClC,OAAOD,GAAG,CAACC,KAAK,CAAC,eAAe,CAAC,EAAE;QACjCD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;QACvCqC,qBAAqB,CAACJ,IAAI,CAACnC,GAAG,CAAC;MACjC;IACF;;IAEA;IACA,IAAIN,KAAK,CAAC4B,GAAG,KAAK,KAAK,EAAE;MACvBtB,GAAG,GAAG4C,aAAa;MACnB,IAAI5C,GAAG,CAACC,KAAK,CAAC,2CAA2C,CAAC,EAAE;QAC1DD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,8BAA8B,EAAE,OAAO,CAAC;QAC1D,IAAAnB,cAAO,EAAE,+BAA8BiB,GAAI,EAAC,CAAC;QAC7CuC,qBAAqB,CAACJ,IAAI,CAACnC,GAAG,CAAC;QAC/B,IAAIA,GAAG,CAACC,KAAK,CAAC,gCAAgC,CAAC,EAAE;UAC/CD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,+BAA+B,EAAE,IAAI,CAAC;UACxD,IAAAnB,cAAO,EAAE,+BAA8BiB,GAAI,EAAC,CAAC;UAC7CuC,qBAAqB,CAACJ,IAAI,CAACnC,GAAG,CAAC;QACjC;MACF;IACF;;IAIA;IACAA,GAAG,GAAG4C,aAAa;IACnB,OAAO5C,GAAG,CAACC,KAAK,CAAC,kBAAkB,CAAC,EAAE;MACpCD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;MAC1CqC,qBAAqB,CAACJ,IAAI,CAACnC,GAAG,CAAC;IACjC;;IAEA;IACA,IAAI4C,aAAa,CAAC3C,KAAK,CAAC,QAAQ,CAAC,EAAG;MAClCD,GAAG,GAAG4C,aAAa,CAAC1C,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;MAC/CqC,qBAAqB,CAACJ,IAAI,CAACnC,GAAG,CAAC;IACjC;EACF;;EAEA;EACA,OAAOuC,qBAAqB,CAAC,CAAC;AAEhC;;AAEA,SAASO,uBAAuBA,CAACpD,KAAK,EAAE;EACtC,MAAMqD,eAAe,GAAG,IAAAC,gEAAmC,EAACtD,KAAK,CAAC;EAClE,OAAO,IAAAmD,oBAAa,EAACE,eAAe,CAAC;AACvC;AAEA,SAASE,oCAAoCA,CAACnE,MAAM,EAAE;EACpD;EACA,IAAIoE,+BAA+B,GAAG,EAAE;EAExC,MAAMC,gBAAgB,GAAG,IAAAV,4DAAuC,EAAC,IAAAC,qCAAgB,EAAC5D,MAAM,CAAC,CAAC;EAE1FA,MAAM,CAACS,MAAM,CAACE,OAAO,CAACC,KAAK,IAAI0D,yCAAyC,CAAC1D,KAAK,CAAC,CAAC;EAEhF,SAAS0D,yCAAyCA,CAAC1D,KAAK,EAAE;IACxD,MAAM2D,uBAAuB,GAAGP,uBAAuB,CAACpD,KAAK,CAAC;IAC9D,IAAIM,GAAG,GAAGqD,uBAAuB;;IAEjC;IACA,IAAIF,gBAAgB,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC1B,QAAQ,CAAC/B,KAAK,CAAC4B,GAAG,CAAC,IAAI+B,uBAAuB,CAACpD,KAAK,CAAC,OAAO,CAAC,EAAE;MACpGD,GAAG,GAAGqD,uBAAuB;MAC7BrD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;MAC3CF,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAAC;MACtDF,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,CAAC;MAC7CgD,+BAA+B,CAACf,IAAI,CAACnC,GAAG,CAAC;MACzCkD,+BAA+B,CAACf,IAAI,CAAE,GAAEnC,GAAI,aAAY,CAAC,CAAC,CAAC;IAC7D;EACF;;EAEA;EACA,OAAOkD,+BAA+B,CAAC,CAAC;AAE1C;;AAEO,SAASI,kCAAkCA,CAACxE,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EAAE;EACvE,MAAM0E,wBAAwB,GAAGjB,0BAA0B,CAACxD,MAAM,CAAC;EACnE,MAAM0E,kCAAkC,GAAGP,oCAAoC,CAACnE,MAAM,CAAC;;EAEvF;EACA;;EAEA,MAAM2E,IAAI,GAAG3E,MAAM,CAACS,MAAM,CAACkB,MAAM,CAACf,KAAK,IAAIgE,gBAAgB,CAAChE,KAAK,CAAC,CAAC;EAEnE,MAAMiE,sBAAsB,GAAGF,IAAI,CAACG,GAAG,CAACrD,CAAC,IAAI,IAAAsC,oBAAa,EAACtC,CAAC,CAAC,CAAC;EAE9D,IAAI1B,GAAG,EAAE;IAAE;IACT4E,IAAI,CAAChE,OAAO,CAACC,KAAK,IAAI;MACpB,IAAAX,cAAO,EAAE,0BAAyB,IAAA8D,oBAAa,EAACnD,KAAK,CAAE,EAAC,CAAC;MACzDZ,MAAM,CAACuD,WAAW,CAAC3C,KAAK,CAAC;IAC3B,CAAC,CAAC;EACJ;EAEA,OAAOiE,sBAAsB;EAE7B,SAASD,gBAAgBA,CAAChE,KAAK,EAAE;IAC/B,MAAMkD,aAAa,GAAG,IAAAC,oBAAa,EAACnD,KAAK,CAAC;IAC1C,IAAI6D,wBAAwB,CAAC9B,QAAQ,CAACmB,aAAa,CAAC,EAAE;MACpD,OAAO,IAAI;IACb;IACA,MAAMS,uBAAuB,GAAGP,uBAAuB,CAACpD,KAAK,CAAC;IAC9D,IAAI8D,kCAAkC,CAAC/B,QAAQ,CAAC4B,uBAAuB,CAAC,EAAE;MACxE,OAAO,IAAI;IACb;IAEA,OAAO,KAAK;EACd;AACF;AAGO,SAASlE,wBAAwBA,CAACL,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EAC3D,MAAMgF,UAAU,GAAGP,kCAAkC,CAACxE,MAAM,EAAED,GAAG,CAAC,CAAC,CAAC;EACpE;EACA,MAAMiF,WAAW,GAAGhD,oBAAoB,CAAChC,MAAM,EAAED,GAAG,CAAC,CAAC,CAAC;EACvD;;EAEA,IAAAE,cAAO,EAAE,kBAAiB8E,UAAU,CAACE,IAAI,CAAC,MAAM,CAAE,EAAC,CAAC;EACpD,IAAAhF,cAAO,EAAE,oBAAmB+E,WAAW,CAACC,IAAI,CAAC,MAAM,CAAE,EAAC,CAAC;EAEvD,MAAMC,aAAa,GAAGH,UAAU,CAACI,MAAM,CAACH,WAAW,CAAC,CAAC,CAAC;;EAEtD,OAAOE,aAAa;AACtB"}
1
+ {"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","_subfield8Utils","_prepublicationUtils","_normalizeFieldForComparison","obj","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeInferiorDatafields","duplicates","length","deriveInferiorChains","fields","deletableStringsObject","forEach","field","fieldDeriveChainDeletables","chain","fieldToChain","chainAsString","fieldsToNormalizedString","tmp","match","replace","isRelevantChain6","fieldHasValidSubfield6","fieldHasValidSubfield8","some","f","subfields","filter","sf","code","tmpInferiorId","result","removeInferiorChains","deletableChainsAsKeys","nChains","Object","keys","deletedStringsArray","innerRemoveInferiorChain","chainContains1XX","tag","substring","sevenToOne","includes","pairs","fieldGetOccurrenceNumberPairs","pairedField","fieldSevenToOneOccurrenceNumber","sameField","triggeringField","triggeringChain","deletedString","fieldsToString","push","currField","removeField","deriveIndividualDeletables490","fieldAsString","deletable490s","arr","val","join","deriveIndividualDeletables","deletableStringsArray","finishedRecord","encodingLevelIsBetterThanPrepublication","getEncodingLevel","fieldDeriveIndividualDeletables","fieldToString","d490","str","fieldToNormalizedString","normalizedField","cloneAndNormalizeFieldForComparison","deriveIndividualNormalizedDeletables","deletableNormalizedStringsArray","recordIsFinished","fieldDeriveIndividualNormalizedDeletables","fieldAsNormalizedString","removeIndividualInferiorDatafields","deletableFieldsAsStrings","deletableFieldsAsNormalizedStrings","hits","isDeletableField","deletedFieldsAsStrings","map","removables","removables6","removablesAll","concat"],"sources":["../src/removeInferiorDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToChain, sameField} from './removeDuplicateDataFields';\nimport {fieldGetOccurrenceNumberPairs, fieldHasValidSubfield6, fieldSevenToOneOccurrenceNumber, fieldsToNormalizedString} from './subfield6Utils';\nimport {fieldsToString, fieldToString, nvdebug} from './utils';\nimport {fieldHasValidSubfield8} from './subfield8Utils';\nimport {encodingLevelIsBetterThanPrepublication, getEncodingLevel} from './prepublicationUtils';\nimport {cloneAndNormalizeFieldForComparison} from './normalizeFieldForComparison';\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 /* eslint-disable */\n let deletableStringsObject = {};\n\n nvdebug(`WP1: GOT ${fields.length} field(s) for potential deletable chain derivation`);\n fields.forEach(field => fieldDeriveChainDeletables(field));\n\n function fieldDeriveChainDeletables(field) {\n const chain = fieldToChain(field, record);\n if (chain.length === 0) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n\n //nvdebug(`666: ${chainAsString}`);\n\n // Fix MRA-476 (part 1): one $6 value can be worse than the other\n let tmp = chainAsString;\n while (tmp.match(/ ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+)\\/[^ ]+/u)) {\n tmp = tmp.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\\/[^ ]+/u, '$1');\n //nvdebug(`FFS: ${tmp}`);\n deletableStringsObject[tmp] = field;\n }\n\n // Remove keepless versions:\n tmp = chainAsString;\n while (tmp.match(/ ‡9 [A-Z]+<KEEP>/)) {\n tmp = tmp.replace(/ ‡9 [A-Z]+<KEEP>/, '');\n deletableStringsObject[tmp] = field;\n //nvdebug(`FFS: ${tmp}`);\n }\n\n // MRA-433: 490 ind1=1 vs ind1=0: remove latter (luckily no 2nd indicator etc)\n if (chainAsString.match(/^490 1 .*\\t880 1 ‡/) ) {\n // change ind1s to '0' to get the deletable chain:\n tmp = chainAsString.replace(/^490 1/u, '490 0').replace(/\\t880 1/ug, \"\\t880 0\");\n deletableStringsObject[tmp] = field;\n }\n\n }\n\n\n /* eslint-enable */\n return deletableStringsObject;\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 // Chainwise non-initial fields are not relevant as chains is handled through the initial/head field\n /* eslint-disable */\n field.tmpInferiorId = 666;\n const result = chain[0].tmpInferiorId === 666 ? true : false;\n delete field.tmpInferiorId;\n /* eslint-enable */\n return result;\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\n /* eslint-disable */\n\n let deletedStringsArray = [];\n fields.forEach(f => innerRemoveInferiorChain(f));\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 function innerRemoveInferiorChain(field) {\n const chain = fieldToChain(field, record);\n if (chain.length === 0 || !sameField(field, chain[0])) {\n return;\n }\n\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n if (chainAsString in deletableChainsAsKeys) {\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)) {\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 deletedStringsArray.push(message);\n if (fix) {\n nvdebug(`INFERIOR $6 CHAIN REMOVAL: ${message}}`, debug);\n chain.forEach(currField => record.removeField(currField));\n }\n }\n }\n\n /* eslint-enable */\n return deletedStringsArray;\n}\n\nfunction deriveIndividualDeletables490(fieldAsString) {\n if (!fieldAsString.match(/^490/u)) {\n return [];\n }\n\n /* eslint-disable */\n let deletable490s = [];\n\n // $6-less version (keep this first)\n let tmp = fieldAsString.replace(/ ‡6 [^‡]+ ‡/u, ' ‡');\n if ( tmp !== fieldAsString) {\n fieldAsString = tmp; // NB! Carry on with $6-less version!\n deletable490s.push(tmp);\n }\n\n // Without final $v or $x:\n tmp = fieldAsString.replace(/ *[;,] ‡[vx] [^‡]+$/u, '');\n if ( tmp !== fieldAsString) {\n deletable490s.push(tmp);\n }\n\n // Add intermedia $x-less version\n tmp = fieldAsString.replace(/, ‡x [^‡]+(, ‡x| ; ‡v)/u, '$1');\n // Add final $v/$x-less version\n if ( tmp !== fieldAsString) {\n deletable490s.push(tmp);\n }\n\n // Add $xv-less version\n tmp = fieldAsString.replace(/, ‡x [^‡]+ ‡v [^‡]+$/u, '');\n if ( tmp !== fieldAsString) {\n deletable490s.push(tmp);\n }\n\n // MRA-433-ish (non-chain): 490 ind1=1 vs ind1=0: remove latter\n if (fieldAsString.match(/^490 1/) ) {\n // TODO: $x-less and $v-less versions...\n tmp = `490 0${fieldAsString.substring(5)}`;\n deletable490s.push(tmp);\n const arr = deriveIndividualDeletables490(tmp);\n arr.forEach(val => deletable490s.push(val));\n }\n\n nvdebug(`${deletable490s.length} derivation(s) for ${fieldAsString}`);\n if (deletable490s.length > 0) {\n nvdebug(deletable490s.join('\\n'));\n }\n /* eslint-enable */\n return deletable490s;\n}\n\nfunction deriveIndividualDeletables(record) {\n /* eslint-disable */\n let deletableStringsArray = [];\n\n const finishedRecord = encodingLevelIsBetterThanPrepublication(getEncodingLevel(record));\n\n record.fields.forEach(field => fieldDeriveIndividualDeletables(field));\n\n function fieldDeriveIndividualDeletables(field) {\n const fieldAsString = fieldToString(field);\n\n // Proof-of-concept rule:\n let tmp = fieldAsString;\n if (field.tag.match(/^[1678]00$/u)) {\n while (tmp.match(/, ‡e [^‡]+\\.$/)) {\n tmp = tmp.replace(/, ‡e [^‡]+\\.$/, '.');\n deletableStringsArray.push(tmp);\n }\n }\n\n if (field.tag === '505') { // MRA-413-ish\n if (fieldAsString.match(/^.0.*-- ‡t/u)) {\n tmp = fieldAsString;\n tmp = tmp.replace(/ -- ‡t /gu, ' -- ');\n tmp = tmp.replace(/ ‡[rg] /gu, ' ');\n tmp = tmp.replace(/ ‡t /u, ' ‡a '); // first $t, not\n tmp = tmp.replace(/^505 (.)0/u, '505 $1#');\n if (tmp !== fieldAsString) {\n deletableStringsArray.push(tmp);\n }\n //nvdebug(`505 ORIGINAL: '${fieldAsString}'`)\n //nvdebug(`505 DERIVATE: '${tmp}'`)\n }\n }\n\n // MET-381: remove occurence number TAG-00, if TAG-NN existists\n if (field.tag === '880') {\n tmp = fieldAsString;\n if (tmp.match(/ ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/)) {\n tmp = tmp.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/, '$1-00');\n nvdebug(`MET-381: ADD TO DELETABLES: '${tmp}'`);\n deletableStringsArray.push(tmp);\n if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\\/[^ ]+ /)) {\n tmp = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/, '$1');\n nvdebug(`MET-381: ADD TO DELETABLES: '${tmp}'`);\n deletableStringsArray.push(tmp);\n }\n }\n }\n\n const d490 = deriveIndividualDeletables490(fieldAsString);\n d490.forEach(str => deletableStringsArray.push(str));\n\n // Remove keepless versions:\n tmp = fieldAsString;\n while (tmp.match(/ ‡9 [A-Z]+<KEEP>/)) {\n tmp = tmp.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n deletableStringsArray.push(tmp);\n }\n\n }\n /* eslint-enable */\n return deletableStringsArray; // we should do uniq!\n\n}\n\nfunction fieldToNormalizedString(field) {\n const normalizedField = cloneAndNormalizeFieldForComparison(field);\n return fieldToString(normalizedField);\n}\n\nfunction deriveIndividualNormalizedDeletables(record) {\n /* eslint-disable */\n let deletableNormalizedStringsArray = [];\n\n const recordIsFinished = encodingLevelIsBetterThanPrepublication(getEncodingLevel(record));\n\n record.fields.forEach(field => fieldDeriveIndividualNormalizedDeletables(field));\n\n function fieldDeriveIndividualNormalizedDeletables(field) {\n const fieldAsNormalizedString = fieldToNormalizedString(field);\n let tmp = fieldAsNormalizedString;\n\n // MET-461:\n if (recordIsFinished && ['245', '246'].includes(field.tag) && fieldAsNormalizedString.match(/ ‡a /u)) {\n tmp = fieldAsNormalizedString;\n tmp = tmp.replace(/^(...) ../u, '946 ##'); // Ind\n tmp = tmp.replace(\" ‡a \", \" ‡i nimeke onixissa ‡a \"); // NB! This is added in the normalized lower-cased form!\n tmp = tmp.replace(/(?: \\/)? ‡c[^‡]+$/u, ''); // Can $c be non-last?\n deletableNormalizedStringsArray.push(tmp);\n deletableNormalizedStringsArray.push(`${tmp} ‡5 MELINDA`); // MET-461 comment. NB! $5 is never normalized\n }\n }\n\n /* eslint-enable */\n return deletableNormalizedStringsArray; // we should do uniq!\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)}`);\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 ')}`);\n nvdebug(`REMOVABLES 6:\\n ${removables6.join('\\n ')}`);\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;AAAkF,SAAAD,uBAAAQ,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAElF;;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,IAAIU,sBAAsB,GAAG,CAAC,CAAC;EAE/B,IAAAT,cAAO,EAAE,YAAWQ,MAAM,CAACF,MAAO,oDAAmD,CAAC;EACtFE,MAAM,CAACE,OAAO,CAACC,KAAK,IAAIC,0BAA0B,CAACD,KAAK,CAAC,CAAC;EAE1D,SAASC,0BAA0BA,CAACD,KAAK,EAAE;IACzC,MAAME,KAAK,GAAG,IAAAC,uCAAY,EAACH,KAAK,EAAEZ,MAAM,CAAC;IACzC,IAAIc,KAAK,CAACP,MAAM,KAAK,CAAC,EAAE;MACtB;IACF;IACA,MAAMS,aAAa,GAAG,IAAAC,wCAAwB,EAACH,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;;IAEpE;;IAEA;IACA,IAAII,GAAG,GAAGF,aAAa;IACvB,OAAOE,GAAG,CAACC,KAAK,CAAC,4CAA4C,CAAC,EAAE;MAC9DD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,8CAA8C,EAAE,IAAI,CAAC;MACvE;MACAV,sBAAsB,CAACQ,GAAG,CAAC,GAAGN,KAAK;IACrC;;IAEA;IACAM,GAAG,GAAGF,aAAa;IACnB,OAAOE,GAAG,CAACC,KAAK,CAAC,kBAAkB,CAAC,EAAE;MACpCD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;MACzCV,sBAAsB,CAACQ,GAAG,CAAC,GAAGN,KAAK;MACnC;IACF;;IAEA;IACA,IAAII,aAAa,CAACG,KAAK,CAAC,qBAAqB,CAAC,EAAG;MAC/C;MACAD,GAAG,GAAGF,aAAa,CAACI,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAACA,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC;MAC/EV,sBAAsB,CAACQ,GAAG,CAAC,GAAGN,KAAK;IACrC;EAEF;;EAGA;EACA,OAAOF,sBAAsB;AAC/B;AAEA,SAASW,gBAAgBA,CAACT,KAAK,EAAEZ,MAAM,EAAE;EACvC;EACA,IAAI,CAAC,IAAAsB,sCAAsB,EAACV,KAAK,CAAC,IAAI,CAAC,IAAAW,sCAAsB,EAACX,KAAK,CAAC,EAAE;IACpE,OAAO,KAAK;EACd;EACA;EACA,MAAME,KAAK,GAAG,IAAAC,uCAAY,EAACH,KAAK,EAAEZ,MAAM,CAAC;EACzC,IAAIc,KAAK,CAACP,MAAM,GAAG,CAAC,EAAE;IACpB,OAAO,KAAK;EACd;EACA;EACA,IAAIO,KAAK,CAACU,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,SAAS,CAACC,MAAM,CAACC,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC,CAACtB,MAAM,GAAG,CAAC,CAAC,EAAE;IACzE,OAAO,KAAK;EACd;;EAEA;EACA;EACAK,KAAK,CAACkB,aAAa,GAAG,GAAG;EACzB,MAAMC,MAAM,GAAGjB,KAAK,CAAC,CAAC,CAAC,CAACgB,aAAa,KAAK,GAAG,GAAG,IAAI,GAAG,KAAK;EAC5D,OAAOlB,KAAK,CAACkB,aAAa;EAC1B;EACA,OAAOC,MAAM;AACf;AAEO,SAASC,oBAAoBA,CAAChC,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EACvD,MAAMU,MAAM,GAAGT,MAAM,CAACS,MAAM,CAACkB,MAAM,CAACF,CAAC,IAAIJ,gBAAgB,CAACI,CAAC,EAAEzB,MAAM,CAAC,CAAC;EACrE;;EAEA,MAAMiC,qBAAqB,GAAGzB,oBAAoB,CAACC,MAAM,EAAET,MAAM,CAAC;EAClE,MAAMkC,OAAO,GAAGC,MAAM,CAACC,IAAI,CAACH,qBAAqB,CAAC,CAAC1B,MAAM;EACzD;EACA,IAAI2B,OAAO,KAAK,CAAC,EAAE;IACjB,OAAO,EAAE;EACX;EAEA,IAAAjC,cAAO,EAAE,8BAA6BQ,MAAM,CAACF,MAAO,sCAAqC2B,OAAQ,eAAc,CAAC;;EAGhH;;EAEA,IAAIG,mBAAmB,GAAG,EAAE;EAC5B5B,MAAM,CAACE,OAAO,CAACc,CAAC,IAAIa,wBAAwB,CAACb,CAAC,CAAC,CAAC;EAEhD,SAASc,gBAAgBA,CAACzB,KAAK,EAAE;IAC/B,OAAOA,KAAK,CAACU,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACe,GAAG,CAACC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC;EACvD;EAEA,SAASC,UAAUA,CAAC9B,KAAK,EAAEE,KAAK,EAAE;IAAE;IAClC;IACA,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC6B,QAAQ,CAAC/B,KAAK,CAAC4B,GAAG,CAAC,EAAE;MACrD;IACF;IACA;IACA,MAAMI,KAAK,GAAG,IAAAC,6CAA6B,EAACjC,KAAK,EAAEE,KAAK,CAAC;IACzDF,KAAK,CAAC4B,GAAG,GAAI,IAAG5B,KAAK,CAAC4B,GAAG,CAACC,SAAS,CAAC,CAAC,CAAE,EAAC,CAAC,CAAC;IAC1C;IACAG,KAAK,CAACjC,OAAO,CAACmC,WAAW,IAAI,IAAAC,+CAA+B,EAACD,WAAW,CAAC,CAAC;EAC5E;EAEA,SAASR,wBAAwBA,CAAC1B,KAAK,EAAE;IACvC,MAAME,KAAK,GAAG,IAAAC,uCAAY,EAACH,KAAK,EAAEZ,MAAM,CAAC;IACzC,IAAIc,KAAK,CAACP,MAAM,KAAK,CAAC,IAAI,CAAC,IAAAyC,oCAAS,EAACpC,KAAK,EAAEE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;MACrD;IACF;IAEA,MAAME,aAAa,GAAG,IAAAC,wCAAwB,EAACH,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IACpE,IAAIE,aAAa,IAAIiB,qBAAqB,EAAE;MAC1C,MAAMgB,eAAe,GAAGhB,qBAAqB,CAACjB,aAAa,CAAC;MAC5D,MAAMkC,eAAe,GAAG,IAAAnC,uCAAY,EAACkC,eAAe,EAAEjD,MAAM,CAAC;;MAE7D;MACA,IAAGuC,gBAAgB,CAACzB,KAAK,CAAC,EAAE;QAC1BoC,eAAe,CAACvC,OAAO,CAACc,CAAC,IAAIiB,UAAU,CAACjB,CAAC,EAAEyB,eAAe,CAAC,CAAC;MAC9D;MACA;MACA,MAAMC,aAAa,GAAG,IAAAC,qBAAc,EAACtC,KAAK,CAAC;MAC3C,MAAMX,OAAO,GAAI,SAAQgD,aAAc,eAAc,IAAAC,qBAAc,EAACF,eAAe,CAAE,GAAE;MACvFb,mBAAmB,CAACgB,IAAI,CAAClD,OAAO,CAAC;MACjC,IAAIJ,GAAG,EAAE;QACP,IAAAE,cAAO,EAAE,8BAA6BE,OAAQ,GAAE,EAAET,KAAK,CAAC;QACxDoB,KAAK,CAACH,OAAO,CAAC2C,SAAS,IAAItD,MAAM,CAACuD,WAAW,CAACD,SAAS,CAAC,CAAC;MAC3D;IACF;EACF;;EAEA;EACA,OAAOjB,mBAAmB;AAC5B;AAEA,SAASmB,6BAA6BA,CAACC,aAAa,EAAE;EACpD,IAAI,CAACA,aAAa,CAACtC,KAAK,CAAC,OAAO,CAAC,EAAE;IACjC,OAAO,EAAE;EACX;;EAEA;EACA,IAAIuC,aAAa,GAAG,EAAE;;EAEtB;EACA,IAAIxC,GAAG,GAAGuC,aAAa,CAACrC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;EACrD,IAAKF,GAAG,KAAKuC,aAAa,EAAE;IAC1BA,aAAa,GAAGvC,GAAG,CAAC,CAAC;IACrBwC,aAAa,CAACL,IAAI,CAACnC,GAAG,CAAC;EACzB;;EAEA;EACAA,GAAG,GAAGuC,aAAa,CAACrC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC;EACvD,IAAKF,GAAG,KAAKuC,aAAa,EAAE;IAC1BC,aAAa,CAACL,IAAI,CAACnC,GAAG,CAAC;EACzB;;EAEA;EACAA,GAAG,GAAGuC,aAAa,CAACrC,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC;EAC5D;EACA,IAAKF,GAAG,KAAKuC,aAAa,EAAE;IAC1BC,aAAa,CAACL,IAAI,CAACnC,GAAG,CAAC;EACzB;;EAEA;EACAA,GAAG,GAAGuC,aAAa,CAACrC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC;EACxD,IAAKF,GAAG,KAAKuC,aAAa,EAAE;IAC1BC,aAAa,CAACL,IAAI,CAACnC,GAAG,CAAC;EACzB;;EAEA;EACA,IAAIuC,aAAa,CAACtC,KAAK,CAAC,QAAQ,CAAC,EAAG;IAClC;IACAD,GAAG,GAAI,QAAOuC,aAAa,CAAChB,SAAS,CAAC,CAAC,CAAE,EAAC;IAC1CiB,aAAa,CAACL,IAAI,CAACnC,GAAG,CAAC;IACvB,MAAMyC,GAAG,GAAGH,6BAA6B,CAACtC,GAAG,CAAC;IAC9CyC,GAAG,CAAChD,OAAO,CAACiD,GAAG,IAAIF,aAAa,CAACL,IAAI,CAACO,GAAG,CAAC,CAAC;EAC7C;EAEA,IAAA3D,cAAO,EAAE,GAAEyD,aAAa,CAACnD,MAAO,sBAAqBkD,aAAc,EAAC,CAAC;EACrE,IAAIC,aAAa,CAACnD,MAAM,GAAG,CAAC,EAAE;IAC5B,IAAAN,cAAO,EAACyD,aAAa,CAACG,IAAI,CAAC,IAAI,CAAC,CAAC;EACnC;EACC;EACD,OAAOH,aAAa;AACtB;AAEA,SAASI,0BAA0BA,CAAC9D,MAAM,EAAE;EAC1C;EACA,IAAI+D,qBAAqB,GAAG,EAAE;EAE9B,MAAMC,cAAc,GAAG,IAAAC,4DAAuC,EAAC,IAAAC,qCAAgB,EAAClE,MAAM,CAAC,CAAC;EAExFA,MAAM,CAACS,MAAM,CAACE,OAAO,CAACC,KAAK,IAAIuD,+BAA+B,CAACvD,KAAK,CAAC,CAAC;EAEtE,SAASuD,+BAA+BA,CAACvD,KAAK,EAAE;IAC9C,MAAM6C,aAAa,GAAG,IAAAW,oBAAa,EAACxD,KAAK,CAAC;;IAE1C;IACA,IAAIM,GAAG,GAAGuC,aAAa;IACvB,IAAI7C,KAAK,CAAC4B,GAAG,CAACrB,KAAK,CAAC,aAAa,CAAC,EAAE;MAClC,OAAOD,GAAG,CAACC,KAAK,CAAC,eAAe,CAAC,EAAE;QACjCD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;QACvC2C,qBAAqB,CAACV,IAAI,CAACnC,GAAG,CAAC;MACjC;IACF;IAEA,IAAIN,KAAK,CAAC4B,GAAG,KAAK,KAAK,EAAE;MAAE;MACzB,IAAIiB,aAAa,CAACtC,KAAK,CAAC,aAAa,CAAC,EAAE;QACtCD,GAAG,GAAGuC,aAAa;QACnBvC,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC;QACtCF,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC;QACnCF,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACpCF,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC;QAC1C,IAAIF,GAAG,KAAKuC,aAAa,EAAE;UACzBM,qBAAqB,CAACV,IAAI,CAACnC,GAAG,CAAC;QACjC;QACA;QACA;MACF;IACF;;IAEA;IACA,IAAIN,KAAK,CAAC4B,GAAG,KAAK,KAAK,EAAE;MACvBtB,GAAG,GAAGuC,aAAa;MACnB,IAAIvC,GAAG,CAACC,KAAK,CAAC,2CAA2C,CAAC,EAAE;QAC1DD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,8BAA8B,EAAE,OAAO,CAAC;QAC1D,IAAAnB,cAAO,EAAE,gCAA+BiB,GAAI,GAAE,CAAC;QAC/C6C,qBAAqB,CAACV,IAAI,CAACnC,GAAG,CAAC;QAC/B,IAAIA,GAAG,CAACC,KAAK,CAAC,gCAAgC,CAAC,EAAE;UAC/CD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,+BAA+B,EAAE,IAAI,CAAC;UACxD,IAAAnB,cAAO,EAAE,gCAA+BiB,GAAI,GAAE,CAAC;UAC/C6C,qBAAqB,CAACV,IAAI,CAACnC,GAAG,CAAC;QACjC;MACF;IACF;IAEA,MAAMmD,IAAI,GAAGb,6BAA6B,CAACC,aAAa,CAAC;IACzDY,IAAI,CAAC1D,OAAO,CAAC2D,GAAG,IAAIP,qBAAqB,CAACV,IAAI,CAACiB,GAAG,CAAC,CAAC;;IAEpD;IACApD,GAAG,GAAGuC,aAAa;IACnB,OAAOvC,GAAG,CAACC,KAAK,CAAC,kBAAkB,CAAC,EAAE;MACpCD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;MAC1C2C,qBAAqB,CAACV,IAAI,CAACnC,GAAG,CAAC;IACjC;EAEF;EACA;EACA,OAAO6C,qBAAqB,CAAC,CAAC;AAEhC;;AAEA,SAASQ,uBAAuBA,CAAC3D,KAAK,EAAE;EACtC,MAAM4D,eAAe,GAAG,IAAAC,gEAAmC,EAAC7D,KAAK,CAAC;EAClE,OAAO,IAAAwD,oBAAa,EAACI,eAAe,CAAC;AACvC;AAEA,SAASE,oCAAoCA,CAAC1E,MAAM,EAAE;EACpD;EACA,IAAI2E,+BAA+B,GAAG,EAAE;EAExC,MAAMC,gBAAgB,GAAG,IAAAX,4DAAuC,EAAC,IAAAC,qCAAgB,EAAClE,MAAM,CAAC,CAAC;EAE1FA,MAAM,CAACS,MAAM,CAACE,OAAO,CAACC,KAAK,IAAIiE,yCAAyC,CAACjE,KAAK,CAAC,CAAC;EAEhF,SAASiE,yCAAyCA,CAACjE,KAAK,EAAE;IACxD,MAAMkE,uBAAuB,GAAGP,uBAAuB,CAAC3D,KAAK,CAAC;IAC9D,IAAIM,GAAG,GAAG4D,uBAAuB;;IAEjC;IACA,IAAIF,gBAAgB,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAACjC,QAAQ,CAAC/B,KAAK,CAAC4B,GAAG,CAAC,IAAIsC,uBAAuB,CAAC3D,KAAK,CAAC,OAAO,CAAC,EAAE;MACpGD,GAAG,GAAG4D,uBAAuB;MAC7B5D,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;MAC3CF,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAAC;MACtDF,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,CAAC;MAC7CuD,+BAA+B,CAACtB,IAAI,CAACnC,GAAG,CAAC;MACzCyD,+BAA+B,CAACtB,IAAI,CAAE,GAAEnC,GAAI,aAAY,CAAC,CAAC,CAAC;IAC7D;EACF;;EAEA;EACA,OAAOyD,+BAA+B,CAAC,CAAC;AAE1C;;AAEO,SAASI,kCAAkCA,CAAC/E,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EAAE;EACvE,MAAMiF,wBAAwB,GAAGlB,0BAA0B,CAAC9D,MAAM,CAAC;EACnE,MAAMiF,kCAAkC,GAAGP,oCAAoC,CAAC1E,MAAM,CAAC;;EAEvF;EACA;;EAEA,MAAMkF,IAAI,GAAGlF,MAAM,CAACS,MAAM,CAACkB,MAAM,CAACf,KAAK,IAAIuE,gBAAgB,CAACvE,KAAK,CAAC,CAAC;EAEnE,MAAMwE,sBAAsB,GAAGF,IAAI,CAACG,GAAG,CAAC5D,CAAC,IAAI,IAAA2C,oBAAa,EAAC3C,CAAC,CAAC,CAAC;EAE9D,IAAI1B,GAAG,EAAE;IAAE;IACTmF,IAAI,CAACvE,OAAO,CAACC,KAAK,IAAI;MACpB,IAAAX,cAAO,EAAE,0BAAyB,IAAAmE,oBAAa,EAACxD,KAAK,CAAE,EAAC,CAAC;MACzDZ,MAAM,CAACuD,WAAW,CAAC3C,KAAK,CAAC;IAC3B,CAAC,CAAC;EACJ;EAEA,OAAOwE,sBAAsB;EAE7B,SAASD,gBAAgBA,CAACvE,KAAK,EAAE;IAC/B,MAAM6C,aAAa,GAAG,IAAAW,oBAAa,EAACxD,KAAK,CAAC;IAC1C,IAAIoE,wBAAwB,CAACrC,QAAQ,CAACc,aAAa,CAAC,EAAE;MACpD,OAAO,IAAI;IACb;IACA,MAAMqB,uBAAuB,GAAGP,uBAAuB,CAAC3D,KAAK,CAAC;IAC9D,IAAIqE,kCAAkC,CAACtC,QAAQ,CAACmC,uBAAuB,CAAC,EAAE;MACxE,OAAO,IAAI;IACb;IAEA,OAAO,KAAK;EACd;AACF;AAGO,SAASzE,wBAAwBA,CAACL,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EAC3D,MAAMuF,UAAU,GAAGP,kCAAkC,CAAC/E,MAAM,EAAED,GAAG,CAAC,CAAC,CAAC;EACpE;EACA,MAAMwF,WAAW,GAAGvD,oBAAoB,CAAChC,MAAM,EAAED,GAAG,CAAC,CAAC,CAAC;EACvD;;EAEA,IAAAE,cAAO,EAAE,kBAAiBqF,UAAU,CAACzB,IAAI,CAAC,MAAM,CAAE,EAAC,CAAC;EACpD,IAAA5D,cAAO,EAAE,oBAAmBsF,WAAW,CAAC1B,IAAI,CAAC,MAAM,CAAE,EAAC,CAAC;EAEvD,MAAM2B,aAAa,GAAGF,UAAU,CAACG,MAAM,CAACF,WAAW,CAAC,CAAC,CAAC;;EAEtD,OAAOC,aAAa;AACtB"}
package/dist/utils.js CHANGED
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.fieldHasSubfield = fieldHasSubfield;
7
7
  exports.fieldToString = fieldToString;
8
8
  exports.fieldsToString = fieldsToString;
9
+ exports.getCatalogingLanguage = getCatalogingLanguage;
9
10
  exports.isControlSubfieldCode = isControlSubfieldCode;
10
11
  exports.isElectronicMaterial = isElectronicMaterial;
11
12
  exports.nvdebug = nvdebug;
@@ -66,4 +67,15 @@ function isControlSubfieldCode(subfieldCode) {
66
67
  }
67
68
  return false;
68
69
  }
70
+ function getCatalogingLanguage(record) {
71
+ const [field040] = record.get(/^040$/u);
72
+ if (!field040) {
73
+ return null;
74
+ }
75
+ const [b] = field040.subfields.filter(sf => sf.code === 'b');
76
+ if (!b) {
77
+ return null;
78
+ }
79
+ return b.value;
80
+ }
69
81
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["isElectronicMaterial","record","f337s","get","some","field","mediaTypeIsC","subfields","sub","code","value","sourceIsRdamedia","nvdebug","message","func","undefined","fieldHasSubfield","subfieldCode","subfieldValue","sf","subfieldToString","normalizeIndicatorValue","val","fieldToString","f","tag","ind1","ind2","formatSubfields","map","join","fieldsToString","fields","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes"],"sources":["../src/utils.js"],"sourcesContent":["export function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.some(field => {\n const mediaTypeIsC = field.subfields.some(sub => sub.code === 'b' && sub.value === 'c');\n const sourceIsRdamedia = field.subfields.some(sub => sub.code === '2' && sub.value === 'rdamedia');\n return mediaTypeIsC && sourceIsRdamedia;\n });\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) { // eslint-disable-line functional/no-conditional-statements\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n"],"mappings":";;;;;;;;;;;;;AAAO,SAASA,oBAAoBA,CAACC,MAAM,EAAE;EAC3C,MAAMC,KAAK,GAAGD,MAAM,CAACE,GAAG,CAAC,KAAK,CAAC;EAE/B,OAAOD,KAAK,CAACE,IAAI,CAACC,KAAK,IAAI;IACzB,MAAMC,YAAY,GAAGD,KAAK,CAACE,SAAS,CAACH,IAAI,CAACI,GAAG,IAAIA,GAAG,CAACC,IAAI,KAAK,GAAG,IAAID,GAAG,CAACE,KAAK,KAAK,GAAG,CAAC;IACvF,MAAMC,gBAAgB,GAAGN,KAAK,CAACE,SAAS,CAACH,IAAI,CAACI,GAAG,IAAIA,GAAG,CAACC,IAAI,KAAK,GAAG,IAAID,GAAG,CAACE,KAAK,KAAK,UAAU,CAAC;IAClG,OAAOJ,YAAY,IAAIK,gBAAgB;EACzC,CAAC,CAAC;AACJ;AAEO,SAASC,OAAOA,CAACC,OAAO,EAAEC,IAAI,GAAGC,SAAS,EAAE;EACjD,IAAID,IAAI,EAAE;IAAE;IACVA,IAAI,CAACD,OAAO,CAAC;EACf;EACA;AACF;;AAEO,SAASG,gBAAgBA,CAACX,KAAK,EAAEY,YAAY,EAAEC,aAAa,GAAG,IAAI,EAAE;EAC1E,IAAI,CAACb,KAAK,CAACE,SAAS,EAAE;IACpB,OAAO,KAAK;EACd;EACA,IAAIW,aAAa,KAAK,IAAI,EAAE;IAC1B,OAAOb,KAAK,CAACE,SAAS,CAACH,IAAI,CAACe,EAAE,IAAIA,EAAE,CAACV,IAAI,KAAKQ,YAAY,CAAC;EAC7D;EACA,OAAOZ,KAAK,CAACE,SAAS,CAACH,IAAI,CAACe,EAAE,IAAIA,EAAE,CAACV,IAAI,KAAKQ,YAAY,IAAIC,aAAa,KAAKC,EAAE,CAACT,KAAK,CAAC;AAC3F;AAEO,SAASU,gBAAgBA,CAACD,EAAE,EAAE;EACnC,OAAQ,IAAGA,EAAE,CAACV,IAAK,IAAGU,EAAE,CAACT,KAAM,EAAC;AAClC;AAEA,SAASW,uBAAuBA,CAACC,GAAG,EAAE;EACpC,IAAIA,GAAG,KAAK,GAAG,EAAE;IACf,OAAO,GAAG;EACZ;EACA,OAAOA,GAAG;AACZ;AAEO,SAASC,aAAaA,CAACC,CAAC,EAAE;EAC/B,IAAI,WAAW,IAAIA,CAAC,EAAE;IACpB,OAAQ,GAAEA,CAAC,CAACC,GAAI,IAAGJ,uBAAuB,CAACG,CAAC,CAACE,IAAI,CAAE,GAAEL,uBAAuB,CAACG,CAAC,CAACG,IAAI,CAAE,GAAEC,eAAe,CAACJ,CAAC,CAAE,EAAC;EAC7G;EACA,OAAQ,GAAEA,CAAC,CAACC,GAAI,OAAMD,CAAC,CAACd,KAAM,EAAC;EAE/B,SAASkB,eAAeA,CAACvB,KAAK,EAAE;IAC9B,OAAOA,KAAK,CAACE,SAAS,CAACsB,GAAG,CAACV,EAAE,IAAK,IAAGC,gBAAgB,CAACD,EAAE,CAAE,EAAC,CAAC,CAACW,IAAI,CAAC,EAAE,CAAC;EACvE;AACF;AAEO,SAASC,cAAcA,CAACC,MAAM,EAAE;EACrC,OAAOA,MAAM,CAACH,GAAG,CAACL,CAAC,IAAID,aAAa,CAACC,CAAC,CAAC,CAAC,CAACM,IAAI,CAAC,mBAAmB,CAAC;AACpE;AAEO,SAASG,iBAAiBA,CAACD,MAAM,EAAEE,MAAM,GAAG,IAAI,EAAEpB,IAAI,GAAGC,SAAS,EAAE;EACzEiB,MAAM,CAACG,OAAO,CAAC9B,KAAK,IAAIO,OAAO,CAAE,GAAEsB,MAAO,GAAEX,aAAa,CAAClB,KAAK,CAAE,EAAC,EAAES,IAAI,CAAC,CAAC;AAC5E;AAEO,SAASsB,qBAAqBA,CAACnB,YAAY,EAAE;EAClD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAACoB,QAAQ,CAACpB,YAAY,CAAC,EAAE;IAClF,OAAO,IAAI;EACb;EACA,OAAO,KAAK;AACd"}
1
+ {"version":3,"file":"utils.js","names":["isElectronicMaterial","record","f337s","get","some","field","mediaTypeIsC","subfields","sub","code","value","sourceIsRdamedia","nvdebug","message","func","undefined","fieldHasSubfield","subfieldCode","subfieldValue","sf","subfieldToString","normalizeIndicatorValue","val","fieldToString","f","tag","ind1","ind2","formatSubfields","map","join","fieldsToString","fields","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","field040","b","filter"],"sources":["../src/utils.js"],"sourcesContent":["export function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.some(field => {\n const mediaTypeIsC = field.subfields.some(sub => sub.code === 'b' && sub.value === 'c');\n const sourceIsRdamedia = field.subfields.some(sub => sub.code === '2' && sub.value === 'rdamedia');\n return mediaTypeIsC && sourceIsRdamedia;\n });\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) { // eslint-disable-line functional/no-conditional-statements\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return null;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return null;\n }\n return b.value;\n}\n"],"mappings":"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"}