@natlibfi/marc-record-validators-melinda 10.8.1 → 10.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/punctuation2.js +37 -19
  2. package/dist/punctuation2.js.map +1 -1
  3. package/dist/removeInferiorDataFields.js +5 -0
  4. package/dist/removeInferiorDataFields.js.map +1 -1
  5. package/dist/stripPunctuation.js +49 -0
  6. package/dist/stripPunctuation.js.map +1 -0
  7. package/dist/stripPunctuation.spec.js +51 -0
  8. package/dist/stripPunctuation.spec.js.map +1 -0
  9. package/dist/subfield6Utils.js +2 -0
  10. package/dist/subfield6Utils.js.map +1 -1
  11. package/package.json +1 -1
  12. package/src/punctuation2.js +28 -16
  13. package/src/removeInferiorDataFields.js +5 -0
  14. package/src/stripPunctuation.js +42 -0
  15. package/src/stripPunctuation.spec.js +52 -0
  16. package/src/subfield6Utils.js +2 -1
  17. package/test-fixtures/punctuation2/04/expectedResult.json +2 -2
  18. package/test-fixtures/remove-inferior-datafields/f03/metadata.json +1 -1
  19. package/test-fixtures/remove-inferior-datafields/f03/record.json +4 -0
  20. package/test-fixtures/strip-punctuation/01/expectedResult.json +12 -0
  21. package/test-fixtures/strip-punctuation/01/metadata.json +6 -0
  22. package/test-fixtures/strip-punctuation/01/record.json +37 -0
  23. package/test-fixtures/strip-punctuation/02/expectedResult.json +4 -0
  24. package/test-fixtures/strip-punctuation/02/metadata.json +6 -0
  25. package/test-fixtures/strip-punctuation/02/record.json +14 -0
  26. package/test-fixtures/strip-punctuation/04/expectedResult.json +6 -0
  27. package/test-fixtures/strip-punctuation/04/metadata.json +6 -0
  28. package/test-fixtures/strip-punctuation/04/record.json +22 -0
  29. package/test-fixtures/strip-punctuation/05/expectedResult.json +6 -0
  30. package/test-fixtures/strip-punctuation/05/metadata.json +6 -0
  31. package/test-fixtures/strip-punctuation/05/record.json +12 -0
  32. package/test-fixtures/strip-punctuation/98/expectedResult.json +44 -0
  33. package/test-fixtures/strip-punctuation/98/metadata.json +6 -0
  34. package/test-fixtures/strip-punctuation/98/record.json +45 -0
  35. package/test-fixtures/strip-punctuation/99/expectedResult.json +16 -0
  36. package/test-fixtures/strip-punctuation/99/metadata.json +6 -0
  37. package/test-fixtures/strip-punctuation/99/record.json +16 -0
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = _default;
7
7
  exports.fieldFixPunctuation = fieldFixPunctuation;
8
+ exports.fieldGetFixedString = fieldGetFixedString;
9
+ exports.fieldNeedsModification = fieldNeedsModification;
8
10
  exports.fieldStripPunctuation = fieldStripPunctuation;
9
11
  var _endingPunctuation = require("./ending-punctuation");
10
12
  var _utils = require("./utils");
@@ -15,7 +17,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
15
17
  *
16
18
  * Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>
17
19
  *
18
- * NOTE #1: https://www.kiwi.fi/display/kumea/Loppupisteohje is implemented via another validator/fixer.(ending-punctuation)
20
+ * NOTE #1: https://www.kiwi.fi/display/kumea/Loppupisteohje is implemented via another validator/fixer (ending-punctuation).
21
+ * This file has some support but it's now yet thorough. (And mmight never be.)
19
22
  * NOTE #2: Validator/fixer punctuation does similar stuff, but focuses on X00 fields.
20
23
  * NOTE #3: As of 2023-06-05 control subfields ($0...$9) are obsolete. Don't use them in rules.
21
24
  * (They are jumped over when looking for next (non-controlfield subfield)
@@ -43,9 +46,9 @@ function _default() {
43
46
  }
44
47
  function validate(record) {
45
48
  (0, _utils.nvdebug)('Add punctuation to data fields: validate');
46
- const fieldsNeedingModification = record.fields.filter(f => fieldNeedsPunctuation(f));
49
+ const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, true));
47
50
  const values = fieldsNeedingModification.map(f => (0, _utils.fieldToString)(f));
48
- const newValues = fieldsNeedingModification.map(f => fieldGetFixedString(f));
51
+ const newValues = fieldsNeedingModification.map(f => fieldGetFixedString(f, true));
49
52
  const messages = values.map((val, i) => `'${val}' => '${newValues[i]}'`);
50
53
  const res = {
51
54
  message: messages
@@ -60,21 +63,22 @@ function isControlSubfield(subfield) {
60
63
  function getNextRelevantSubfield(field, currSubfieldIndex) {
61
64
  return field.subfields.find((subfield, index) => index > currSubfieldIndex && !isControlSubfield(subfield));
62
65
  }
63
- function fieldGetFixedString(field) {
66
+ function fieldGetFixedString(field, add = true) {
64
67
  const cloneField = (0, _clone.default)(field);
68
+ const operation = add ? subfieldFixPunctuation : subfieldStripPunctuation;
65
69
  cloneField.subfields.forEach((sf, i) => {
66
70
  // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!
67
71
  // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)
68
- subfieldFixPunctuation(cloneField, sf, getNextRelevantSubfield(cloneField, i));
72
+ operation(cloneField, sf, getNextRelevantSubfield(cloneField, i));
69
73
  });
70
74
  return (0, _utils.fieldToString)(cloneField);
71
75
  }
72
- function fieldNeedsPunctuation(field) {
76
+ function fieldNeedsModification(field, add = true) {
73
77
  if (!field.subfields) {
74
78
  return false;
75
79
  }
76
80
  const originalFieldAsString = (0, _utils.fieldToString)(field);
77
- const modifiedFieldAsString = fieldGetFixedString(field);
81
+ const modifiedFieldAsString = fieldGetFixedString(field, add);
78
82
  return modifiedFieldAsString !== originalFieldAsString;
79
83
  }
80
84
 
@@ -231,6 +235,11 @@ const cleanCrappyPunctuationRules = {
231
235
  'code': 'ab',
232
236
  'followedBy': '!c',
233
237
  'remove': / \/$/u
238
+ }, {
239
+ 'code': 'abc',
240
+ 'followedBy': '#',
241
+ 'remove': /\.$/u,
242
+ 'context': dotIsProbablyPunc
234
243
  }],
235
244
  '300': [{
236
245
  'code': 'a',
@@ -254,12 +263,9 @@ const cleanCrappyPunctuationRules = {
254
263
  'code': 'abc',
255
264
  'followedBy': '!e',
256
265
  'remove': / *\+$/u
257
- }, {
258
- 'code': 'abc',
259
- 'followedBy': '!e',
260
- 'remove': / *\+$/u,
261
- 'context': /[^ ]\+$/u
262
- }],
266
+ } // Removes both valid (with one space) and invalid (spaceless et al) puncs
267
+ ],
268
+
263
269
  '490': [{
264
270
  'code': 'a',
265
271
  'followedBy': 'xy',
@@ -459,7 +465,14 @@ const addPairedPunctuationRules = {
459
465
  'followedBy': 'c',
460
466
  'add': ' /',
461
467
  'context': defaultNeedsPuncAfter
462
- }],
468
+ }, {
469
+ 'code': 'abc',
470
+ 'followedBy': '#',
471
+ 'add': '.',
472
+ 'context': defaultNeedsPuncAfter
473
+ } // Stepping on punctuation/ toes
474
+ ],
475
+
463
476
  '260': [{
464
477
  'code': 'a',
465
478
  'followedBy': 'b',
@@ -672,16 +685,21 @@ function subfieldFixPunctuation(field, subfield1, subfield2) {
672
685
  applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);
673
686
  applyPunctuationRules(field, subfield1, subfield2, addPairedPunctuationRules, ADD);
674
687
  }
688
+ function subfieldStripPunctuation(field, subfield1, subfield2) {
689
+ (0, _utils.nvdebug)(`FSP1: '${subfield1.value}'`);
690
+ applyPunctuationRules(field, subfield1, subfield2, cleanValidPunctuationRules, REMOVE);
691
+ (0, _utils.nvdebug)(`FSP2: '${subfield1.value}'`);
692
+ applyPunctuationRules(field, subfield1, subfield2, cleanCrappyPunctuationRules, REMOVE);
693
+ (0, _utils.nvdebug)(`FSP3: '${subfield1.value}'`);
694
+ }
675
695
  function fieldStripPunctuation(field) {
676
696
  if (!field.subfields) {
677
697
  return field;
678
698
  }
679
699
  field.subfields.forEach((sf, i) => {
680
- (0, _utils.nvdebug)(`FSP1: '${sf.value}'`);
681
- applyPunctuationRules(field, sf, i + 1 < field.subfields.length ? field.subfields[i + 1] : null, cleanValidPunctuationRules, REMOVE);
682
- (0, _utils.nvdebug)(`FSP2: '${sf.value}'`);
683
- applyPunctuationRules(field, sf, i + 1 < field.subfields.length ? field.subfields[i + 1] : null, cleanCrappyPunctuationRules, REMOVE);
684
- (0, _utils.nvdebug)(`FSP3: '${sf.value}'`);
700
+ // NB! instead of next subfield, we should actually get next *non-control-subfield*!!!
701
+ // (In plain English: We should skip $0 - $9 at least, maybe $w as well...)
702
+ subfieldStripPunctuation(field, sf, getNextRelevantSubfield(field, i));
685
703
  });
686
704
  return field;
687
705
  }
@@ -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","fieldNeedsPunctuation","values","map","fieldToString","newValues","fieldGetFixedString","messages","val","i","length","isControlSubfield","subfield","includes","code","getNextRelevantSubfield","field","currSubfieldIndex","subfields","find","index","cloneField","clone","sf","subfieldFixPunctuation","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","cleanCrappyPunctuationRules","cleanLegalX00Comma","cleanLegalX00bDot","context","cleanLegalX00Dot","cleanLanguageComma","legalX00punc","cleanLegalX10Comma","cleanLegalX10Dot","legalX10punc","cleanValidPunctuationRules","addX00","addX10","addPairedPunctuationRules","ruleAppliesToSubfieldCode","targetSubfieldCodes","currSubfieldCode","negation","ruleAppliesToField","rule","ind1","ind2","ruleAppliesToCurrentSubfield","value","match","ruleAppliesToNextSubfield","nextSubfield","followedBy","contextRHS","checkRule","subfield1","subfield2","applyPunctuationRules","ruleArray","operation","tag","activeRules","originalValue","remove","replace","add","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* 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 => fieldNeedsPunctuation(f));\n\n\n const values = fieldsNeedingModification.map(f => fieldToString(f));\n const newValues = fieldsNeedingModification.map(f => fieldGetFixedString(f));\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\nfunction fieldGetFixedString(field) {\n const cloneField = clone(field);\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 subfieldFixPunctuation(cloneField, sf, getNextRelevantSubfield(cloneField, i));\n });\n return fieldToString(cloneField);\n}\n\nfunction fieldNeedsPunctuation(field) {\n if (!field.subfields) {\n return false;\n }\n\n const originalFieldAsString = fieldToString(field);\n const modifiedFieldAsString = fieldGetFixedString(field);\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': 'atxy', '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 cleanCrappyPunctuationRules = {\n '100': removeX00Whatever,\n '110': removeX10Whatever,\n '600': removeX00Whatever,\n '610': removeX10Whatever,\n '700': removeX00Whatever,\n '710': removeX10Whatever,\n '800': removeX00Whatever,\n '810': removeX10Whatever,\n '245': [{'code': 'ab', 'followedBy': '!c', 'remove': / \\/$/u}],\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},\n {'code': 'abc', 'followedBy': '!e', 'remove': / *\\+$/u, 'context': /[^ ]\\+$/u}\n\n ],\n '490': [{'code': 'a', 'followedBy': 'xy', 'remove': / ;$/u}],\n '773': [{'code': 'abdghiklmnopqrstuwxyz', 'followedBy': 'abdghiklmnopqrstuwxyz', 'remove': /\\. -$/u}]\n\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 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': [\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 ],\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 shouldit 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': [\n {'code': 'axy', 'followedBy': 'xy', 'remove': /,$/u},\n {'code': 'axy', 'followedBy': 'v', 'remove': / *;$/u}\n ],\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\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];\nconst addPairedPunctuationRules = {\n '100': addX00,\n '110': addX10,\n '245': [\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 ],\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': [\n {'code': 'axy', 'followedBy': 'xy', 'add': ',', 'context': defaultNeedsPuncAfter},\n addSemicolonBeforeVolumeDesignation\n //{'code': 'axy', 'followedBy': 'v', 'add': ' ;', 'context': defaultNeedsPuncAfter}\n ],\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': [\n {'code': 'axy', 'followedBy': 'xy', 'add': ',', 'context': defaultNeedsPuncAfter},\n addSemicolonBeforeVolumeDesignation\n //{'code': 'axy', 'followedBy': 'v', 'add': ' ;', 'context': defaultNeedsPuncAfter}\n ]\n\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\n\nexport function fieldStripPunctuation(field) {\n if (!field.subfields) {\n return field;\n }\n\n field.subfields.forEach((sf, i) => {\n nvdebug(`FSP1: '${sf.value}'`);\n applyPunctuationRules(field, sf, i + 1 < field.subfields.length ? field.subfields[i + 1] : null, cleanValidPunctuationRules, REMOVE);\n nvdebug(`FSP2: '${sf.value}'`);\n applyPunctuationRules(field, sf, i + 1 < field.subfields.length ? field.subfields[i + 1] : null, cleanCrappyPunctuationRules, REMOVE);\n nvdebug(`FSP3: '${sf.value}'`);\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","cleanCrappyPunctuationRules","cleanLegalX00Comma","cleanLegalX00bDot","context","cleanLegalX00Dot","cleanLanguageComma","legalX00punc","cleanLegalX10Comma","cleanLegalX10Dot","legalX10punc","cleanValidPunctuationRules","addX00","addX10","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': 'atxy', '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 cleanCrappyPunctuationRules = {\n '100': removeX00Whatever,\n '110': removeX10Whatever,\n '600': removeX00Whatever,\n '610': removeX10Whatever,\n '700': removeX00Whatever,\n '710': removeX10Whatever,\n '800': removeX00Whatever,\n '810': removeX10Whatever,\n '245': [\n {'code': 'ab', 'followedBy': '!c', 'remove': / \\/$/u},\n {'code': 'abc', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}\n ],\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 '490': [{'code': 'a', 'followedBy': 'xy', 'remove': / ;$/u}],\n '773': [{'code': 'abdghiklmnopqrstuwxyz', 'followedBy': 'abdghiklmnopqrstuwxyz', 'remove': /\\. -$/u}]\n\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 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': [\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 ],\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 shouldit 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': [\n {'code': 'axy', 'followedBy': 'xy', 'remove': /,$/u},\n {'code': 'axy', 'followedBy': 'v', 'remove': / *;$/u}\n ],\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\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];\nconst addPairedPunctuationRules = {\n '100': addX00,\n '110': addX10,\n '245': [\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 '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': [\n {'code': 'axy', 'followedBy': 'xy', 'add': ',', 'context': defaultNeedsPuncAfter},\n addSemicolonBeforeVolumeDesignation\n //{'code': 'axy', 'followedBy': 'v', 'add': ' ;', 'context': defaultNeedsPuncAfter}\n ],\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': [\n {'code': 'axy', 'followedBy': 'xy', 'add': ',', 'context': defaultNeedsPuncAfter},\n addSemicolonBeforeVolumeDesignation\n //{'code': 'axy', 'followedBy': 'v', 'add': ' ;', 'context': defaultNeedsPuncAfter}\n ]\n\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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"}
@@ -193,6 +193,11 @@ function deriveIndividualDeletables(record) {
193
193
  tmp = tmp.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/, '$1-00');
194
194
  (0, _utils.nvdebug)(`MET-381: ADD TO DELETABLES: ${tmp}`);
195
195
  deletableStringsArray.push(tmp);
196
+ if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\/[^ ]+ /)) {
197
+ tmp = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/, '$1');
198
+ (0, _utils.nvdebug)(`MET-381: ADD TO DELETABLES: ${tmp}`);
199
+ deletableStringsArray.push(tmp);
200
+ }
196
201
  }
197
202
  }
198
203
 
@@ -1 +1 @@
1
- {"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","_subfield8Utils","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","fieldDeriveIndividualDeletables","fieldAsString","fieldToString","removeIndividualInferiorDatafields","deletableFieldsAsStrings","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';\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 complited chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix record: remove 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 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\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) {\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 // Better to keep inferior 1XX (vs better 7XX) than to delete 1XX!\n if(chain.some(f => f.tag.substring(0, 1) === '1')) {\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 // 1XX may be converted to XXX. However, it should not be removed.\n // Better to keep inferior 1XX (vs better 7XX) than to delete 1XX!\n if(chainContains1XX(chain)) {\n if (chainContains1XX(triggeringChain)) {\n // This should *never* happen, but keep this as a sanity check\n return;\n }\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 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 // 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 }\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>/, '');\n deletableStringsArray.push(tmp);\n }\n }\n /* eslint-enable */\n return deletableStringsArray; // we should do uniq!\n\n}\n\n\nexport function removeIndividualInferiorDatafields(record, fix = true) { // No $6 nor $8 in field\n const deletableFieldsAsStrings = deriveIndividualDeletables(record);\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 return deletableFieldsAsStrings.includes(fieldAsString);\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?\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":"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"}
1
+ {"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","_subfield8Utils","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","fieldDeriveIndividualDeletables","fieldAsString","fieldToString","removeIndividualInferiorDatafields","deletableFieldsAsStrings","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';\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 complited chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix record: remove 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 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\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) {\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 // Better to keep inferior 1XX (vs better 7XX) than to delete 1XX!\n if(chain.some(f => f.tag.substring(0, 1) === '1')) {\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 // 1XX may be converted to XXX. However, it should not be removed.\n // Better to keep inferior 1XX (vs better 7XX) than to delete 1XX!\n if(chainContains1XX(chain)) {\n if (chainContains1XX(triggeringChain)) {\n // This should *never* happen, but keep this as a sanity check\n return;\n }\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 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 // 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>/, '');\n deletableStringsArray.push(tmp);\n }\n }\n /* eslint-enable */\n return deletableStringsArray; // we should do uniq!\n\n}\n\n\nexport function removeIndividualInferiorDatafields(record, fix = true) { // No $6 nor $8 in field\n const deletableFieldsAsStrings = deriveIndividualDeletables(record);\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 return deletableFieldsAsStrings.includes(fieldAsString);\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?\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":"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"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ var _punctuation = require("./punctuation2");
8
+ var _utils = require("./utils");
9
+ /*
10
+ * stripPunctuation.js -- try and remove a marc field punctuation (based on and reverse of punctuation2.js)
11
+ *
12
+ * Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>
13
+ *
14
+ */
15
+
16
+ // import createDebugLogger from 'debug';
17
+
18
+ // const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');
19
+
20
+ function _default() {
21
+ return {
22
+ description: 'Strip punctuation to data fields',
23
+ validate,
24
+ fix
25
+ };
26
+ function fix(record) {
27
+ (0, _utils.nvdebug)('Strip punctuation to data fields: fixer');
28
+ const res = {
29
+ message: [],
30
+ fix: [],
31
+ valid: true
32
+ };
33
+ record.fields.forEach(f => (0, _punctuation.fieldStripPunctuation)(f));
34
+ return res;
35
+ }
36
+ function validate(record) {
37
+ (0, _utils.nvdebug)('Strip punctuation to data fields: validate');
38
+ const fieldsNeedingModification = record.fields.filter(f => (0, _punctuation.fieldNeedsModification)(f, false));
39
+ const values = fieldsNeedingModification.map(f => (0, _utils.fieldToString)(f));
40
+ const newValues = fieldsNeedingModification.map(f => (0, _punctuation.fieldGetFixedString)(f, false));
41
+ const messages = values.map((val, i) => `'${val}' => '${newValues[i]}'`);
42
+ const res = {
43
+ message: messages
44
+ };
45
+ res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data
46
+ return res;
47
+ }
48
+ }
49
+ //# sourceMappingURL=stripPunctuation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripPunctuation.js","names":["_punctuation","require","_utils","_default","description","validate","fix","record","nvdebug","res","message","valid","fields","forEach","f","fieldStripPunctuation","fieldsNeedingModification","filter","fieldNeedsModification","values","map","fieldToString","newValues","fieldGetFixedString","messages","val","i","length"],"sources":["../src/stripPunctuation.js"],"sourcesContent":["/*\n* stripPunctuation.js -- try and remove a marc field punctuation (based on and reverse of punctuation2.js)\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n*/\n\nimport {fieldGetFixedString, fieldNeedsModification, fieldStripPunctuation} from './punctuation2';\n// import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');\n\nexport default function () {\n return {\n description: 'Strip punctuation to data fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Strip punctuation to data fields: fixer');\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fieldStripPunctuation(f));\n return res;\n }\n\n function validate(record) {\n nvdebug('Strip punctuation to data fields: validate');\n\n const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, false));\n\n const values = fieldsNeedingModification.map(f => fieldToString(f));\n const newValues = fieldsNeedingModification.map(f => fieldGetFixedString(f, false));\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"],"mappings":";;;;;;AAOA,IAAAA,YAAA,GAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AATA;AACA;AACA;AACA;AACA;AACA;;AAGA;;AAGA;;AAEe,SAAAE,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,kCAAkC;IAC/CC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,IAAAC,cAAO,EAAC,yCAAyC,CAAC;IAClD,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEJ,GAAG,EAAE,EAAE;MAAEK,KAAK,EAAE;IAAI,CAAC;IAC/CJ,MAAM,CAACK,MAAM,CAACC,OAAO,CAACC,CAAC,IAAI,IAAAC,kCAAqB,EAACD,CAAC,CAAC,CAAC;IACpD,OAAOL,GAAG;EACZ;EAEA,SAASJ,QAAQA,CAACE,MAAM,EAAE;IACxB,IAAAC,cAAO,EAAC,4CAA4C,CAAC;IAErD,MAAMQ,yBAAyB,GAAGT,MAAM,CAACK,MAAM,CAACK,MAAM,CAACH,CAAC,IAAI,IAAAI,mCAAsB,EAACJ,CAAC,EAAE,KAAK,CAAC,CAAC;IAE7F,MAAMK,MAAM,GAAGH,yBAAyB,CAACI,GAAG,CAACN,CAAC,IAAI,IAAAO,oBAAa,EAACP,CAAC,CAAC,CAAC;IACnE,MAAMQ,SAAS,GAAGN,yBAAyB,CAACI,GAAG,CAACN,CAAC,IAAI,IAAAS,gCAAmB,EAACT,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnF,MAAMU,QAAQ,GAAGL,MAAM,CAACC,GAAG,CAAC,CAACK,GAAG,EAAEC,CAAC,KAAM,IAAGD,GAAI,SAAQH,SAAS,CAACI,CAAC,CAAE,GAAE,CAAC;IAExE,MAAMjB,GAAG,GAAG;MAACC,OAAO,EAAEc;IAAQ,CAAC;IAE/Bf,GAAG,CAACE,KAAK,GAAGF,GAAG,CAACC,OAAO,CAACiB,MAAM,GAAG,CAAC,CAAC,CAAC;IACpC,OAAOlB,GAAG;EACZ;AACF"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ var _chai = require("chai");
4
+ var _marcRecord = require("@natlibfi/marc-record");
5
+ var _stripPunctuation = _interopRequireDefault(require("./stripPunctuation"));
6
+ var _fixura = require("@natlibfi/fixura");
7
+ var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
8
+ var _debug = _interopRequireDefault(require("debug"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ (0, _fixugen.default)({
11
+ callback,
12
+ path: [__dirname, '..', 'test-fixtures', 'strip-punctuation'],
13
+ useMetadataFile: true,
14
+ recurse: false,
15
+ fixura: {
16
+ reader: _fixura.READERS.JSON
17
+ },
18
+ mocha: {
19
+ before: () => testValidatorFactory()
20
+ }
21
+ });
22
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/stripPunctuation:test');
23
+ async function testValidatorFactory() {
24
+ const validator = await (0, _stripPunctuation.default)();
25
+ (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
26
+ (0, _chai.expect)(validator.description).to.be.a('string');
27
+ (0, _chai.expect)(validator.validate).to.be.a('function');
28
+ }
29
+ async function callback({
30
+ getFixture,
31
+ enabled = true,
32
+ fix = false
33
+ }) {
34
+ if (enabled === false) {
35
+ debug('TEST SKIPPED!');
36
+ return;
37
+ }
38
+ const validator = await (0, _stripPunctuation.default)();
39
+ const record = new _marcRecord.MarcRecord(getFixture('record.json'));
40
+ const expectedResult = getFixture('expectedResult.json');
41
+ // console.log(expectedResult); // eslint-disable-line
42
+
43
+ if (!fix) {
44
+ const result = await validator.validate(record);
45
+ (0, _chai.expect)(result).to.eql(expectedResult);
46
+ return;
47
+ }
48
+ await validator.fix(record);
49
+ (0, _chai.expect)(record).to.eql(expectedResult);
50
+ }
51
+ //# sourceMappingURL=stripPunctuation.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripPunctuation.spec.js","names":["_chai","require","_marcRecord","_stripPunctuation","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/stripPunctuation.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './stripPunctuation';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'strip-punctuation'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/stripPunctuation:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,iBAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,mBAAmB,CAAC;EAC7DC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,gEAAgE,CAAC;AAEjG,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,yBAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,yBAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC"}
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.fieldGetMaxSubfield6OccurrenceNumberAsInteger = fieldGetMaxSubfield6OccurrenceNumberAsInteger;
6
7
  exports.fieldGetOccurrenceNumberPairs = fieldGetOccurrenceNumberPairs;
7
8
  exports.fieldGetOccurrenceNumbers = fieldGetOccurrenceNumbers;
8
9
  exports.fieldGetUnambiguousOccurrenceNumber = fieldGetUnambiguousOccurrenceNumber;
@@ -130,6 +131,7 @@ function intToOccurrenceNumberString(i) {
130
131
  return i < 10 ? `0${i}` : `${i}`;
131
132
  }
132
133
  function fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {
134
+ // used by reducer!
133
135
  //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`);
134
136
  const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];
135
137
  if (sf6s.length === 0) {