@natlibfi/marc-record-validators-melinda 11.5.5 → 11.6.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 (42) hide show
  1. package/dist/field-505-separators.js +3 -0
  2. package/dist/field-505-separators.js.map +1 -1
  3. package/dist/index.js +7 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/modernize-502.js +117 -0
  6. package/dist/modernize-502.js.map +1 -0
  7. package/dist/modernize-502.spec.js +49 -0
  8. package/dist/modernize-502.spec.js.map +1 -0
  9. package/dist/punctuation2.js +17 -4
  10. package/dist/punctuation2.js.map +1 -1
  11. package/dist/subfieldValueNormalizations.js +47 -8
  12. package/dist/subfieldValueNormalizations.js.map +1 -1
  13. package/package.json +7 -6
  14. package/src/field-505-separators.js +3 -0
  15. package/src/index.js +2 -0
  16. package/src/modernize-502.js +118 -0
  17. package/src/modernize-502.spec.js +48 -0
  18. package/src/punctuation2.js +6 -4
  19. package/src/subfieldValueNormalizations.js +50 -9
  20. package/test-fixtures/field-505-separators/03/expectedResult.json +23 -0
  21. package/test-fixtures/field-505-separators/03/metadata.json +6 -0
  22. package/test-fixtures/field-505-separators/03/record.json +21 -0
  23. package/test-fixtures/modernize-502/01/expectedResult.json +6 -0
  24. package/test-fixtures/modernize-502/01/metadata.json +5 -0
  25. package/test-fixtures/modernize-502/01/record.json +15 -0
  26. package/test-fixtures/modernize-502/02/expectedResult.json +29 -0
  27. package/test-fixtures/modernize-502/02/metadata.json +5 -0
  28. package/test-fixtures/modernize-502/02/record.json +31 -0
  29. package/test-fixtures/normalize-subfield-value/04/expectedResult.json +24 -0
  30. package/test-fixtures/normalize-subfield-value/04/metadata.json +5 -0
  31. package/test-fixtures/normalize-subfield-value/04/record.json +22 -0
  32. package/test-fixtures/normalize-subfield-value/05/expectedResult.json +27 -0
  33. package/test-fixtures/normalize-subfield-value/05/metadata.json +6 -0
  34. package/test-fixtures/normalize-subfield-value/05/record.json +25 -0
  35. package/test-fixtures/punctuation2/01/expectedResult.json +2 -2
  36. package/test-fixtures/punctuation2/100_and_880/expectedResult.json +12 -2
  37. package/test-fixtures/punctuation2/100_and_880/metadata.json +2 -1
  38. package/test-fixtures/punctuation2/100_and_880/record.json +12 -2
  39. package/test-fixtures/punctuation2/97/expectedResult.json +1 -1
  40. package/test-fixtures/punctuation2/98/expectedResult.json +2 -2
  41. package/test-fixtures/sort-relator-terms/f02/expectedResult.json +8 -1
  42. package/test-fixtures/sort-relator-terms/f02/record.json +7 -0
@@ -1 +1 @@
1
- {"version":3,"file":"punctuation2.js","names":["_endingPunctuation","require","_subfield6Utils","_utils","_clone","_interopRequireDefault","e","__esModule","default","descriptionString","_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","needsPuncAfterAlphanumeric","defaultNeedsPuncAfter2","doesNotEndInPunc","blocksPuncRHS","allowsPuncRHS","aToZ","dotIsProbablyPunc","puncIsProbablyPunc","removeColons","removeX00Comma","cleanRHS","cleanX00dCommaOrDot","cleanX00aDot","cleanCorruption","cleanX00eDot","removeCommaBeforeLanguageSubfieldL","removeCommaBeforeTitleSubfieldT","X00RemoveDotAfterBracket","cleanPuncBeforeLanguage","addX00aComma","addX00dComma","addX00aComma2","addX00Dot","addX10iColon","name","context","addX10bDot","addX10eComma","addX10Dot","addColonToRelationshipInformation","addX11Spacecolon","followedBy","addDotBeforeLanguageSubfieldL","addSemicolonBeforeVolumeDesignation","NONE","ADD","REMOVE","REMOVE_AND_ADD","removeCrapFromAllEntryFields","removeX00Whatever","removeX10Whatever","removeX11Whatever","removeX30Whatever","remove490And830Whatever","linkingEntryRemoveWhatever","crappy24X","cleanCrappyPunctuationRules","cleanLegalX00Comma","cleanLegalX00bDot","cleanLegalX00iColon","cleanLegalX00Dot","cleanDotBeforeLanguageSubfieldL","legalEntryField","legalX11SpaceColon","remove","legalX00punc","cleanLegalX10Comma","cleanLegalX10Dot","legalX10punc","cleanLegalSeriesTitle","clean24X","legalX11Punc","cleanValidPunctuationRules","addToAllEntryFields","addX00","addX10","addX11","addX30","add24X","add245","addSeriesTitle","addLinkingEntry","addPairedPunctuationRules","ruleAppliesToSubfieldCode","targetSubfieldCodes","currSubfieldCode","negation","ruleAppliesToField","rule","ind1","ind2","ruleAppliesToCurrentSubfield","value","match","ruleAppliesToNextSubfield","nextSubfield","contextRHS","checkRule","subfield1","subfield2","applyPunctuationRules","ruleArray","tag2","tag","fieldGetUnambiguousTag","candRules","every","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';\nimport {fieldGetUnambiguousTag} from './subfield6Utils';\n//import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\nimport clone from 'clone';\n\n//const debug = createDebugLogger('debug/punctuation2');\n\nconst descriptionString = 'Remove invalid and add valid punctuation to data fields';\nexport default function () {\n return {\n description: descriptionString,\n validate, fix\n };\n\n function fix(record) {\n nvdebug(`${descriptionString}: 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(`${descriptionString}: 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 needsPuncAfterAlphanumeric = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö)$/u;\nconst defaultNeedsPuncAfter2 = /(?:[\\]a-zA-Z0-9)]|ä|å|ö|Å|Ä|Ö)$/u;\nconst doesNotEndInPunc = /[^!?.:;,]$/u; // non-punc for pre-240/700/XXX $, note that '.' comes if preceded by ')'\nconst blocksPuncRHS = /^(?:\\()/u;\nconst allowsPuncRHS = /^(?:[A-Za-z0-9]|å|ä|ö|Å|Ä|Ö)/u;\nconst aToZ = 'abcdefghijklmnopqrstuvwxyz';\n\n\nconst dotIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö|(?:[A-Za-z0-9]|Å|Ä|Ö)(?:[A-Z]|Å|Ä|Ö))\\.$/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': 'abcdenqt', 'followedBy': 'abcdenqtv#', '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};\nconst removeCommaBeforeLanguageSubfieldL = {'followedBy': 'l', 'remove': /,$/u};\nconst removeCommaBeforeTitleSubfieldT = {'followedBy': 't', '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\nconst addX00aComma = {'add': ',', 'code': 'abcqej', 'followedBy': 'cdeg', 'context': doesNotEndInPunc, 'contextRHS': allowsPuncRHS};\nconst addX00dComma = {'name': 'X00$d ending in \"-\" does not get comma', 'add': ',', 'code': 'd', 'followedBy': 'cdeg', 'context': /[^-,.!]$/u, 'contextRHS': allowsPuncRHS};\nconst addX00aComma2 = {'add': ',', 'code': 'abcdej', 'followedBy': 'cdeg', 'context': /(?:[A-Z]|Å|Ä|Ö)\\.$/u, 'contextRHS': allowsPuncRHS};\nconst addX00Dot = {'add': '.', 'code': 'abcdetv', 'followedBy': '#fklptu', 'context': needsPuncAfterAlphanumeric};\n\n\nconst addX10iColon = {name: 'Punctuate relationship information', add: ':', code: 'i', context: defaultNeedsPuncAfter2};\nconst addX10bDot = {'name': 'Add X10 pre-$b dot', 'add': '.', 'code': 'ab', 'followedBy': 'b', 'context': defaultNeedsPuncAfter2};\nconst addX10eComma = {'add': ',', 'code': 'abe', 'followedBy': 'e', 'context': defaultNeedsPuncAfter2};\nconst addX10Dot = {'name': 'Add X10 final dot', 'add': '.', 'code': 'abet', 'followedBy': 'tu#', 'context': needsPuncAfterAlphanumeric};\nconst addColonToRelationshipInformation = {'name': 'Add \\':\\' to 7X0 $i relationship info', 'add': ':', 'code': 'i', 'context': defaultNeedsPuncAfter2};\n\nconst addX11Spacecolon = {name: '611 space colon(y :-)', add: ' :', code: 'nd', followedBy: 'dc', 'context': defaultNeedsPuncAfter2};\n\nconst addDotBeforeLanguageSubfieldL = {'name': 'Add dot before $l', 'add': '.', 'code': 'abepst', 'followedBy': 'l', 'context': doesNotEndInPunc};\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 removeCrapFromAllEntryFields = [removeCommaBeforeLanguageSubfieldL, removeCommaBeforeTitleSubfieldT];\n\nconst removeX00Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, cleanX00dCommaOrDot, cleanRHS, X00RemoveDotAfterBracket, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];\nconst removeX10Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];\nconst removeX11Whatever = [...removeCrapFromAllEntryFields];\nconst removeX30Whatever = removeCrapFromAllEntryFields;\n\nconst remove490And830Whatever = [{'code': 'axyzv', 'followedBy': 'axyzv', 'remove': /(?: *;| *=|,)$/u}];\n\nconst linkingEntryRemoveWhatever = [\n {'code': 'i', 'followedBy': 'at', 'remove': / ?:$/u}, // ':'\n {'code': 'at', 'remove': /\\.$/u},\n {'code': 'abdghiklmnopqrstuwxyz', 'followedBy': 'abdghiklmnopqrstuwxyz', 'remove': /\\. -$/u}\n];\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 crappy24X = [\n {'code': 'abnp', 'followedBy': '!c', 'remove': / \\/$/u},\n {'code': 'abn', 'followedBy': 'c', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'abn', 'followedBy': 'c', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'abc', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'abfghinp', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'n', 'followedBy': 'p', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}, // MELINDA-8817\n {'code': 'p', 'followedBy': 'pc', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}, // MELINDA-8817\n removeCommaBeforeLanguageSubfieldL\n];\n\n\nconst cleanCrappyPunctuationRules = {\n '100': removeX00Whatever,\n '110': removeX10Whatever,\n '111': removeX11Whatever,\n '130': removeX30Whatever,\n '240': crappy24X,\n '245': crappy24X,\n '246': crappy24X,\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 '611': removeX11Whatever,\n '630': removeX30Whatever,\n '700': removeX00Whatever,\n '710': removeX10Whatever,\n '711': removeX11Whatever,\n '730': removeX30Whatever,\n '773': linkingEntryRemoveWhatever,\n '774': linkingEntryRemoveWhatever,\n '776': linkingEntryRemoveWhatever,\n '787': linkingEntryRemoveWhatever,\n '800': removeX00Whatever,\n '810': removeX10Whatever,\n '830': remove490And830Whatever,\n '946': crappy24X\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 cleanDotBeforeLanguageSubfieldL = {'name': 'pre-language-$l dot', 'followedBy': 'l', 'context': /.\\.$/u, 'remove': /\\.$/u};\n\nconst legalEntryField = [cleanDotBeforeLanguageSubfieldL];\n\nconst legalX11SpaceColon = {name: 'legal X11 spacecolony', code: 'nd', followedBy: 'dc', context: / :$/u, remove: / :$/u};\nconst legalX00punc = [cleanLegalX00Comma, cleanLegalX00iColon, cleanLegalX00bDot, cleanLegalX00Dot, ...legalEntryField];\n\nconst cleanLegalX10Comma = {'name': 'X10comma', 'code': 'abe', 'followedBy': 'e', 'context': /.,$/u, 'remove': /,$/u};\nconst cleanLegalX10Dot = {'name': 'X10dot', 'code': 'abt', 'followedBy': 'bst#', 'context': /.\\.$/u, 'remove': /\\.$/u};\n\nconst legalX10punc = [cleanLegalX10Comma, cleanLegalX10Dot, cleanX00eDot, ...legalEntryField];\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 cleanDotBeforeLanguageSubfieldL\n];\n\nconst legalX11Punc = [...legalEntryField, legalX11SpaceColon];\n\nconst cleanValidPunctuationRules = {\n '100': legalX00punc,\n '110': legalX10punc,\n '111': legalX11Punc,\n '130': legalEntryField,\n '240': clean24X,\n '243': clean24X,\n '245': clean24X,\n '246': clean24X,\n '260': [\n {'code': 'abc', 'followedBy': 'a', 'remove': / ;$/u},\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 '600': legalX00punc,\n '610': legalX10punc,\n '611': legalX11Punc,\n '630': legalEntryField,\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 '700': legalX00punc,\n '710': legalX10punc,\n '711': legalX11Punc,\n '730': legalEntryField,\n '800': legalX00punc,\n '810': legalX10punc,\n '811': legalX11Punc,\n '830': [...legalEntryField, ...cleanLegalSeriesTitle],\n '946': clean24X\n};\n\n\n// Overgeneralizes a bit: eg. addColonToRelationshipInformation only applies to 700/710 but as others don't have $i, it's fine.\nconst addToAllEntryFields = [addDotBeforeLanguageSubfieldL, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];\n\n\nconst addX00 = [addX00aComma, addX00aComma2, addX00Dot, addX00dComma, ...addToAllEntryFields];\nconst addX10 = [addX10iColon, addX10bDot, addX10eComma, addX10Dot, ...addToAllEntryFields];\nconst addX11 = [...addToAllEntryFields, addX11Spacecolon];\nconst addX30 = [...addToAllEntryFields];\n\nconst add24X = [\n {'code': 'i', 'followedBy': 'a', 'add': ':', 'context': needsPuncAfterAlphanumeric},\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': '[^:]$'},\n {'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': needsPuncAfterAlphanumeric},\n {'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': '[^/]$'},\n addDotBeforeLanguageSubfieldL\n];\n\nconst add245 = [\n ...add24X,\n // Blah! Also \"$a = $b\" and \"$a ; $b\" can be valid... But ' :' is better than nothing, I guess...\n {'code': 'ab', 'followedBy': 'n', 'add': '.', 'context': needsPuncAfterAlphanumeric},\n {'code': 'n', 'followedBy': 'p', 'add': ',', 'context': defaultNeedsPuncAfter2},\n {'code': 'abnpc', 'followedBy': '#', 'add': '.', 'context': needsPuncAfterAlphanumeric} // Stepping on \"punctuation validator's\" toes\n];\n\nconst addSeriesTitle = [ // 490 and 830\n {'code': 'a', 'followedBy': 'a', 'add': ' =', 'context': defaultNeedsPuncAfter2},\n {'code': 'axyz', 'followedBy': 'xy', 'add': ',', 'context': defaultNeedsPuncAfter2},\n addSemicolonBeforeVolumeDesignation // eg. 490$axyz-$v\n];\n\nconst addLinkingEntry = [ // NB! Music 773 uses different punctuation rules, that are not implement here (can they even be?)\n {'code': 'i', 'followedBy': aToZ, 'add': ':', 'context': defaultNeedsPuncAfter2},\n {'code': 'a', 'followedBy': 't', 'add': '.', 'context': defaultNeedsPuncAfter2},\n {'code': 't', 'followedBy': 'dghoz', 'add': '.', 'context': defaultNeedsPuncAfter2}\n];\n\nconst addPairedPunctuationRules = {\n '100': addX00,\n '110': addX10,\n '111': addX11,\n '130': addX30,\n '240': add24X,\n '243': add24X,\n '245': add245,\n '246': add24X,\n '260': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'ab', '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': needsPuncAfterAlphanumeric, 'ind2': ['0', '1', '2', '3']}\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 '611': addX11,\n '630': addX30,\n '700': addX00,\n '710': addX10,\n '711': addX11,\n '730': addX30,\n '773': addLinkingEntry,\n '787': addLinkingEntry,\n '800': addX00,\n '810': addX10,\n '811': addX11,\n '830': [...addX30, ...addSeriesTitle],\n '946': [{'code': 'i', 'followedBy': 'a', 'add': ':', 'context': defaultNeedsPuncAfter2}]\n};\n\n/*\nfunction debugRule(rule) {\n //nvdebug('');\n nvdebug(`NAME ${rule.name ? rule.name : '<unnamed>'}`);\n nvdebug(`SUBFIELD CODE '${rule.code}' FOLLOWED BY SUBFIELD CODE '${rule.followedBy}'`);\n if ('add' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`ADD '${rule.add}'`);\n }\n if ('remove' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`REMOVE '${rule.remove}'`);\n }\n if ('context' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`CONTEXT '${rule.context.toString()}'`);\n }\n //nvdebug('');\n}\n*/\n\nfunction ruleAppliesToSubfieldCode(targetSubfieldCodes, currSubfieldCode) {\n if (!targetSubfieldCodes) { // We are not interested in what subfield precedes 240$l, ',' is removed anyway\n return true;\n }\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 && !rule.ind1.includes(field.ind1)) {\n return false;\n }\n\n if ('ind2' in rule && !rule.ind2.includes(field.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 //nvdebug(` Apply rule on LHS?`);\n if (!ruleAppliesToSubfieldCode(rule.code, subfield.code)) {\n //nvdebug(` Reject rule!`);\n return false;\n }\n if ('context' in rule) {\n //nvdebug(` Check '${subfield.value}' versus '${rule.context.toString()}'`);\n if (!subfield.value.match(rule.context)) { // njsscan-ignore: regex_injection_dos\n //nvdebug(` Reject rule!`);\n return false;\n }\n }\n //nvdebug(` Apply rule!`);\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(`${rule.name ? rule.name : '<unnamed>'}: ACCEPT ${rule.code} (${subfield1.code}), SF2=${rule.followedBy} (${subfield2 ? subfield2.code : '#'})`, debug);\n return true;\n}\n\n\nfunction applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, operation = NONE) {\n if (operation === NONE || ruleArray === null) { // !fieldIsApplicable(field, ruleArray)) {\n return;\n }\n const tag2 = field.tag === '880' ? fieldGetUnambiguousTag(field) : field.tag;\n if (!tag2) {\n return;\n }\n if (!(`${tag2}` in ruleArray)) {\n return;\n }\n\n //nvdebug(`PUNCTUATE ${field.tag}/${tag2} '${subfieldToString(subfield1)}' XXX '${subfield2 ? subfieldToString(subfield2) : '#'} }`);\n\n //nvdebug(`OP=${operation} ${tag2}: '${subfield1.code}: ${subfield1.value}' ??? '${subfield2 ? subfield2.code : '#'}'`);\n const candRules = ruleArray[tag2];\n candRules.every(rule => { // uses \"every\", not \"forEach\", so that only one rule is applies to the given subfields\n //debugRule(rule);\n if (!checkRule(rule, field, subfield1, subfield2)) {\n return true;\n }\n\n //const originalValue = subfield1.value;\n if (rule.remove && [REMOVE, REMOVE_AND_ADD].includes(operation) && subfield1.value.match(rule.remove)) {\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}'`);\n return false;\n }\n if (rule.add && [ADD, REMOVE_AND_ADD].includes(operation)) {\n subfield1.value += rule.add; // eslint-disable-line functional/immutable-data\n //nvdebug(` ADDED '${rule.add}' TO FORM '${subfield1.value}'`);\n return false;\n }\n\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 return true;\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 // We'll need some magic for field 257 here, do we? (Also Finnish lexicons vs global lexicons in 65X fields)\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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","ignoreList":[]}
1
+ {"version":3,"file":"punctuation2.js","names":["_endingPunctuation","require","_subfield6Utils","_utils","_clone","_interopRequireDefault","e","__esModule","default","descriptionString","_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","needsPuncAfterAlphanumeric","defaultNeedsPuncAfter2","doesNotEndInPunc","blocksPuncRHS","allowsPuncRHS","aToZ","dotIsProbablyPunc","puncIsProbablyPunc","removeColons","removeX00Comma","cleanRHS","cleanX00dCommaOrDot","cleanX00aDot","cleanCorruption","cleanX00eDot","cleanX11jDot","removeCommaBeforeLanguageSubfieldL","removeCommaBeforeTitleSubfieldT","X00RemoveDotAfterBracket","cleanPuncBeforeLanguage","addX00aComma","addX00dComma","addX00aComma2","addX00Dot","addEntryFieldFinalDot","addX10iColon","name","context","addX10bDot","addX10eComma","addX10Dot","addColonToRelationshipInformation","addX11Spacecolon","followedBy","addDotBeforeLanguageSubfieldL","addSemicolonBeforeVolumeDesignation","NONE","ADD","REMOVE","REMOVE_AND_ADD","removeCrapFromAllEntryFields","removeX00Whatever","removeX10Whatever","removeX11Whatever","removeX30Whatever","remove490And830Whatever","linkingEntryRemoveWhatever","crappy24X","cleanCrappyPunctuationRules","cleanLegalX00Comma","cleanLegalX00bDot","cleanLegalX00iColon","cleanLegalX00Dot","cleanDotBeforeLanguageSubfieldL","legalEntryField","legalX11SpaceColon","remove","legalX00punc","cleanLegalX10Comma","cleanLegalX10Dot","legalX10punc","cleanLegalSeriesTitle","clean24X","legalX11Punc","cleanValidPunctuationRules","addToAllEntryFields","addX00","addX10","addX11","addX30","add24X","add245","addSeriesTitle","addLinkingEntry","addPairedPunctuationRules","ruleAppliesToSubfieldCode","targetSubfieldCodes","currSubfieldCode","negation","ruleAppliesToField","rule","ind1","ind2","ruleAppliesToCurrentSubfield","value","match","ruleAppliesToNextSubfield","nextSubfield","contextRHS","checkRule","subfield1","subfield2","applyPunctuationRules","ruleArray","tag2","tag","fieldGetUnambiguousTag","candRules","every","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';\nimport {fieldGetUnambiguousTag} from './subfield6Utils';\n//import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\nimport clone from 'clone';\n\n//const debug = createDebugLogger('debug/punctuation2');\n\nconst descriptionString = 'Remove invalid and add valid punctuation to data fields';\nexport default function () {\n return {\n description: descriptionString,\n validate, fix\n };\n\n function fix(record) {\n nvdebug(`${descriptionString}: 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(`${descriptionString}: 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 needsPuncAfterAlphanumeric = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö)$/u;\nconst defaultNeedsPuncAfter2 = /(?:[\\]a-zA-Z0-9)]|ä|å|ö|Å|Ä|Ö)$/u;\nconst doesNotEndInPunc = /[^!?.:;,]$/u; // non-punc for pre-240/700/XXX $, note that '.' comes if preceded by ')'\nconst blocksPuncRHS = /^(?:\\()/u;\nconst allowsPuncRHS = /^(?:[A-Za-z0-9]|å|ä|ö|Å|Ä|Ö)/u;\nconst aToZ = 'abcdefghijklmnopqrstuvwxyz';\n\n\nconst dotIsProbablyPunc = /(?:[a-z0-9)]|å|ä|ö|(?:[A-Za-z0-9]|Å|Ä|Ö)(?:[A-Z]|Å|Ä|Ö))\\.$/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': 'abcdejnqt', 'followedBy': 'abcdenqtv#', '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};\nconst cleanX11jDot = {'code': 'e', 'followedBy': 'egj#', 'context': /(?:[ai]ja|jä)[.,]$/u, 'remove': /\\.$/u};\nconst removeCommaBeforeLanguageSubfieldL = {'followedBy': 'l', 'remove': /,$/u};\nconst removeCommaBeforeTitleSubfieldT = {'followedBy': 't', '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\nconst addX00aComma = {'add': ',', 'code': 'abcqej', 'followedBy': 'cdeg', 'context': doesNotEndInPunc, 'contextRHS': allowsPuncRHS};\nconst addX00dComma = {'name': 'X00$d ending in \"-\" does not get comma', 'add': ',', 'code': 'd', 'followedBy': 'cdeg', 'context': /[^-,.!]$/u, 'contextRHS': allowsPuncRHS};\nconst addX00aComma2 = {'add': ',', 'code': 'abcdej', 'followedBy': 'cdeg', 'context': /(?:[A-Z]|Å|Ä|Ö)\\.$/u, 'contextRHS': allowsPuncRHS};\nconst addX00Dot = {'add': '.', 'code': 'abcdetv', 'followedBy': 'fklptu', 'context': needsPuncAfterAlphanumeric};\nconst addEntryFieldFinalDot = {'name': 'X00 final dot', 'add': '.', 'code': 'abcdefghijklmnopqrstuvwxyz', 'followedBy': '#', 'context': /[^.)]$/u};\n\n\nconst addX10iColon = {name: 'Punctuate relationship information', add: ':', code: 'i', context: defaultNeedsPuncAfter2};\nconst addX10bDot = {'name': 'Add X10 pre-$b dot', 'add': '.', 'code': 'ab', 'followedBy': 'b', 'context': defaultNeedsPuncAfter2};\nconst addX10eComma = {'add': ',', 'code': 'abe', 'followedBy': 'e', 'context': defaultNeedsPuncAfter2};\nconst addX10Dot = {'name': 'Add X10 final dot', 'add': '.', 'code': 'abet', 'followedBy': 'tu#', 'context': needsPuncAfterAlphanumeric};\nconst addColonToRelationshipInformation = {'name': 'Add \\':\\' to 7X0 $i relationship info', 'add': ':', 'code': 'i', 'context': defaultNeedsPuncAfter2};\n\nconst addX11Spacecolon = {name: '611 space colon(y :-)', add: ' :', code: 'nd', followedBy: 'dc', 'context': defaultNeedsPuncAfter2};\n\nconst addDotBeforeLanguageSubfieldL = {'name': 'Add dot before $l', 'add': '.', 'code': 'abepst', 'followedBy': 'l', 'context': doesNotEndInPunc};\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 removeCrapFromAllEntryFields = [removeCommaBeforeLanguageSubfieldL, removeCommaBeforeTitleSubfieldT];\n\nconst removeX00Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, cleanX00dCommaOrDot, cleanRHS, X00RemoveDotAfterBracket, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];\nconst removeX10Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];\nconst removeX11Whatever = [removeX00Comma, cleanX11jDot, ...removeCrapFromAllEntryFields];\nconst removeX30Whatever = removeCrapFromAllEntryFields;\n\nconst remove490And830Whatever = [{'code': 'axyzv', 'followedBy': 'axyzv', 'remove': /(?: *;| *=|,)$/u}];\n\nconst linkingEntryRemoveWhatever = [\n {'code': 'i', 'followedBy': 'at', 'remove': / ?:$/u}, // ':'\n {'code': 'at', 'remove': /\\.$/u},\n {'code': 'abdghiklmnopqrstuwxyz', 'followedBy': 'abdghiklmnopqrstuwxyz', 'remove': /\\. -$/u}\n];\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 crappy24X = [\n {'code': 'abnp', 'followedBy': '!c', 'remove': / \\/$/u},\n {'code': 'abn', 'followedBy': 'c', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'abn', 'followedBy': 'c', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'abc', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'abfghinp', 'followedBy': '#', 'remove': /\\.$/u, 'context': dotIsProbablyPunc},\n {'code': 'n', 'followedBy': 'p', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}, // MELINDA-8817\n {'code': 'p', 'followedBy': 'pc', 'remove': /\\.$/u, 'context': dotIsProbablyPunc}, // MELINDA-8817\n removeCommaBeforeLanguageSubfieldL\n];\n\n\nconst cleanCrappyPunctuationRules = {\n '100': removeX00Whatever,\n '110': removeX10Whatever,\n '111': removeX11Whatever,\n '130': removeX30Whatever,\n '240': crappy24X,\n '245': crappy24X,\n '246': crappy24X,\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 '611': removeX11Whatever,\n '630': removeX30Whatever,\n '700': removeX00Whatever,\n '710': removeX10Whatever,\n '711': removeX11Whatever,\n '730': removeX30Whatever,\n '773': linkingEntryRemoveWhatever,\n '774': linkingEntryRemoveWhatever,\n '776': linkingEntryRemoveWhatever,\n '787': linkingEntryRemoveWhatever,\n '800': removeX00Whatever,\n '810': removeX10Whatever,\n '830': remove490And830Whatever,\n '946': crappy24X\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 cleanDotBeforeLanguageSubfieldL = {'name': 'pre-language-$l dot', 'followedBy': 'l', 'context': /.\\.$/u, 'remove': /\\.$/u};\n\nconst legalEntryField = [cleanDotBeforeLanguageSubfieldL];\n\nconst legalX11SpaceColon = {name: 'legal X11 spacecolony', code: 'nd', followedBy: 'dc', context: / :$/u, remove: / :$/u};\nconst legalX00punc = [cleanLegalX00Comma, cleanLegalX00iColon, cleanLegalX00bDot, cleanLegalX00Dot, ...legalEntryField];\n\nconst cleanLegalX10Comma = {'name': 'X10comma', 'code': 'abe', 'followedBy': 'e', 'context': /.,$/u, 'remove': /,$/u};\nconst cleanLegalX10Dot = {'name': 'X10dot', 'code': 'abt', 'followedBy': 'bst#', 'context': /.\\.$/u, 'remove': /\\.$/u};\n\nconst legalX10punc = [cleanLegalX10Comma, cleanLegalX10Dot, cleanX00eDot, ...legalEntryField];\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 cleanDotBeforeLanguageSubfieldL\n];\n\nconst legalX11Punc = [...legalEntryField, legalX11SpaceColon];\n\nconst cleanValidPunctuationRules = {\n '100': legalX00punc,\n '110': legalX10punc,\n '111': legalX11Punc,\n '130': legalEntryField,\n '240': clean24X,\n '243': clean24X,\n '245': clean24X,\n '246': clean24X,\n '260': [\n {'code': 'abc', 'followedBy': 'a', 'remove': / ;$/u},\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 '600': legalX00punc,\n '610': legalX10punc,\n '611': legalX11Punc,\n '630': legalEntryField,\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 '700': legalX00punc,\n '710': legalX10punc,\n '711': legalX11Punc,\n '730': legalEntryField,\n '800': legalX00punc,\n '810': legalX10punc,\n '811': legalX11Punc,\n '830': [...legalEntryField, ...cleanLegalSeriesTitle],\n '946': clean24X\n};\n\n\n// Overgeneralizes a bit: eg. addColonToRelationshipInformation only applies to 700/710 but as others don't have $i, it's fine.\nconst addToAllEntryFields = [addDotBeforeLanguageSubfieldL, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation, addEntryFieldFinalDot];\n\n\nconst addX00 = [addX00aComma, addX00aComma2, addX00Dot, addX00dComma, ...addToAllEntryFields];\nconst addX10 = [addX10iColon, addX10bDot, addX10eComma, addX10Dot, ...addToAllEntryFields];\nconst addX11 = [...addToAllEntryFields, addX11Spacecolon];\nconst addX30 = [...addToAllEntryFields];\n\nconst add24X = [\n {'code': 'i', 'followedBy': 'a', 'add': ':', 'context': needsPuncAfterAlphanumeric},\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': '[^:]$'},\n {'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': needsPuncAfterAlphanumeric},\n {'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': '[^/]$'},\n addDotBeforeLanguageSubfieldL\n];\n\nconst add245 = [\n ...add24X,\n // Blah! Also \"$a = $b\" and \"$a ; $b\" can be valid... But ' :' is better than nothing, I guess...\n {'code': 'ab', 'followedBy': 'n', 'add': '.', 'context': needsPuncAfterAlphanumeric},\n {'code': 'n', 'followedBy': 'p', 'add': ',', 'context': defaultNeedsPuncAfter2},\n {'code': 'abnpc', 'followedBy': '#', 'add': '.', 'context': needsPuncAfterAlphanumeric} // Stepping on \"punctuation validator's\" toes\n];\n\nconst addSeriesTitle = [ // 490 and 830\n {'code': 'a', 'followedBy': 'a', 'add': ' =', 'context': defaultNeedsPuncAfter2},\n {'code': 'axyz', 'followedBy': 'xy', 'add': ',', 'context': defaultNeedsPuncAfter2},\n addSemicolonBeforeVolumeDesignation // eg. 490$axyz-$v\n];\n\nconst addLinkingEntry = [ // NB! Music 773 uses different punctuation rules, that are not implement here (can they even be?)\n {'code': 'i', 'followedBy': aToZ, 'add': ':', 'context': defaultNeedsPuncAfter2},\n {'code': 'a', 'followedBy': 't', 'add': '.', 'context': defaultNeedsPuncAfter2},\n {'code': 't', 'followedBy': 'dghoz', 'add': '.', 'context': defaultNeedsPuncAfter2}\n];\n\nconst addPairedPunctuationRules = {\n '100': addX00,\n '110': addX10,\n '111': addX11,\n '130': addX30,\n '240': add24X,\n '243': add24X,\n '245': add245,\n '246': add24X,\n '260': [\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': defaultNeedsPuncAfter2},\n {'code': 'ab', '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': needsPuncAfterAlphanumeric, 'ind2': ['0', '1', '2', '3']}\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 '611': addX11,\n '630': addX30,\n '700': addX00,\n '710': addX10,\n '711': addX11,\n '730': addX30,\n '773': addLinkingEntry,\n '787': addLinkingEntry,\n '800': addX00,\n '810': addX10,\n '811': addX11,\n '830': [...addX30, ...addSeriesTitle],\n '946': [{'code': 'i', 'followedBy': 'a', 'add': ':', 'context': defaultNeedsPuncAfter2}]\n};\n\n/*\nfunction debugRule(rule) {\n //nvdebug('');\n nvdebug(`NAME ${rule.name ? rule.name : '<unnamed>'}`);\n nvdebug(`SUBFIELD CODE '${rule.code}' FOLLOWED BY SUBFIELD CODE '${rule.followedBy}'`);\n if ('add' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`ADD '${rule.add}'`);\n }\n if ('remove' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`REMOVE '${rule.remove}'`);\n }\n if ('context' in rule) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`CONTEXT '${rule.context.toString()}'`);\n }\n //nvdebug('');\n}\n*/\n\nfunction ruleAppliesToSubfieldCode(targetSubfieldCodes, currSubfieldCode) {\n if (!targetSubfieldCodes) { // We are not interested in what subfield precedes 240$l, ',' is removed anyway\n return true;\n }\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 && !rule.ind1.includes(field.ind1)) {\n return false;\n }\n\n if ('ind2' in rule && !rule.ind2.includes(field.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 //nvdebug(` Apply rule on LHS?`);\n if (!ruleAppliesToSubfieldCode(rule.code, subfield.code)) {\n //nvdebug(` Reject rule!`);\n return false;\n }\n if ('context' in rule) {\n //nvdebug(` Check '${subfield.value}' versus '${rule.context.toString()}'`);\n if (!subfield.value.match(rule.context)) { // njsscan-ignore: regex_injection_dos\n //nvdebug(` Reject rule!`);\n return false;\n }\n }\n //nvdebug(` Apply rule!`);\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(`${rule.name ? rule.name : '<unnamed>'}: ACCEPT ${rule.code} (${subfield1.code}), SF2=${rule.followedBy} (${subfield2 ? subfield2.code : '#'})`, debug);\n return true;\n}\n\n\nfunction applyPunctuationRules(field, subfield1, subfield2, ruleArray = null, operation = NONE) {\n if (operation === NONE || ruleArray === null) { // !fieldIsApplicable(field, ruleArray)) {\n return;\n }\n const tag2 = field.tag === '880' ? fieldGetUnambiguousTag(field) : field.tag;\n if (!tag2) {\n return;\n }\n if (!(`${tag2}` in ruleArray)) {\n return;\n }\n\n //nvdebug(`PUNCTUATE ${field.tag}/${tag2} '${subfieldToString(subfield1)}' XXX '${subfield2 ? subfieldToString(subfield2) : '#'} }`);\n\n //nvdebug(`OP=${operation} ${tag2}: '${subfield1.code}: ${subfield1.value}' ??? '${subfield2 ? subfield2.code : '#'}'`);\n const candRules = ruleArray[tag2];\n candRules.every(rule => { // uses \"every\", not \"forEach\", so that only one rule is applies to the given subfields\n //debugRule(rule);\n if (!checkRule(rule, field, subfield1, subfield2)) {\n return true;\n }\n\n //const originalValue = subfield1.value;\n if (rule.remove && [REMOVE, REMOVE_AND_ADD].includes(operation) && subfield1.value.match(rule.remove)) {\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}'`);\n return false;\n }\n if (rule.add && [ADD, REMOVE_AND_ADD].includes(operation)) {\n subfield1.value += rule.add; // eslint-disable-line functional/immutable-data\n //nvdebug(` ADDED '${rule.add}' TO FORM '${subfield1.value}'`);\n return false;\n }\n\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 return true;\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 // We'll need some magic for field 257 here, do we? (Also Finnish lexicons vs global lexicons in 65X fields)\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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","ignoreList":[]}
@@ -11,6 +11,8 @@ var _subfield6Utils = require("./subfield6Utils");
11
11
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
12
  //import createDebugLogger from 'debug';
13
13
 
14
+ // NB! You should probably run punctuation fixes after this validator!
15
+
14
16
  // Author(s): Nicholas Volk
15
17
  function _default() {
16
18
  return {
@@ -19,34 +21,36 @@ function _default() {
19
21
  fix
20
22
  };
21
23
  function fix(record) {
24
+ const catLang = (0, _utils.getCatalogingLanguage)(record, 'fin');
22
25
  const res = {
23
26
  message: [],
24
27
  fix: [],
25
28
  valid: true
26
29
  };
27
30
  record.fields.forEach(field => {
28
- normalizeSubfieldValues(field);
31
+ normalizeSubfieldValues(field, catLang);
29
32
  });
30
33
 
31
34
  // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data
32
35
  return res;
33
36
  }
34
37
  function validate(record) {
38
+ const catLang = (0, _utils.getCatalogingLanguage)(record, 'fin');
35
39
  const res = {
36
40
  message: []
37
41
  };
38
42
  record.fields.forEach(field => {
39
- validateField(field, res);
43
+ validateField(field, res, catLang);
40
44
  });
41
45
  res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
42
46
  return res;
43
47
  }
44
- function validateField(field, res) {
48
+ function validateField(field, res, catLang) {
45
49
  if (!field.subfields) {
46
50
  return;
47
51
  }
48
52
  const orig = (0, _utils.fieldToString)(field);
49
- const normalizedField = normalizeSubfieldValues((0, _clone.default)(field));
53
+ const normalizedField = normalizeSubfieldValues((0, _clone.default)(field), catLang);
50
54
  const mod = (0, _utils.fieldToString)(normalizedField);
51
55
  if (orig !== mod) {
52
56
  // Fail as the input is "broken"/"crap"/sumthing
@@ -75,8 +79,43 @@ function handleInitials(value, subfieldCode, field) {
75
79
  return str.match(/ (?:[A-Z]|Å|Ä|Ö)\.(?:[A-Z]|Å|Ä|Ö)/u);
76
80
  }
77
81
  }
78
- function getNormalizedValue(subfield, field) {
79
- return uppercaseLanguage(handleMovies(handleInitials(subfield.value, subfield.code, field)));
82
+ function getNormalizedValue(subfield, field, catLang) {
83
+ return handleFikt(uppercaseLanguage(handleMovies(handleInitials(subfield.value, subfield.code, field))));
84
+ function handleFikt(value) {
85
+ if (subfield.code !== 'c' || field.tag !== '600') {
86
+ return value;
87
+ }
88
+ return wrapFiktiivinenHahmo(expandFikt(value));
89
+ function wrapFiktiivinenHahmo(value) {
90
+ if (value.includes('(')) {
91
+ // Some kind of parentheses already found -> nothing to do here
92
+ return value;
93
+ }
94
+ if (value.match(/^(?:fiktiivinen hahmo|fiktiv gestalt|fiktiivinen yhteisö)[,.]?$/u)) {
95
+ // Hope that some other module handles punctuation, if needed:
96
+ return `(${value.replace(/[.,]$/u, '')})`;
97
+ }
98
+ return value;
99
+ }
100
+
101
+ // wrap text around parentheses
102
+ function expandFikt(value) {
103
+ if (field.ind1 === '3') {
104
+ // Not handling "fiktiivinen yhteisö" at the moment
105
+ return value;
106
+ }
107
+ if (value.match(/\bfikt\.?(?:$|[,)])/u) && !value.match(/fikt.*fikt/ui)) {
108
+ // NB! Dot '.' in 'fikt.' might also be punctuation as well. Run punctuation2 fixer after this fixer!
109
+ if (catLang === 'fin') {
110
+ return value.replace(/\bfikt\./u, 'fiktiivinen hahmo');
111
+ }
112
+ if (catLang === 'swe') {
113
+ return value.replace(/\bfikt\./u, 'fiktiv gestalt');
114
+ }
115
+ }
116
+ return value;
117
+ }
118
+ }
80
119
  function handleMovies(value) {
81
120
  if (subfield.code === 'a' && ['130', '630', '730'].includes(field.tag)) {
82
121
  // MRA-614: "(elokuva, 2000)" => "(elokuva : 2000)""
@@ -104,12 +143,12 @@ function getNormalizedValue(subfield, field) {
104
143
  return value;
105
144
  }
106
145
  }
107
- function normalizeSubfieldValues(field) {
146
+ function normalizeSubfieldValues(field, catLang) {
108
147
  if (!field.subfields) {
109
148
  return field;
110
149
  }
111
150
  field.subfields.forEach((subfield, index) => {
112
- field.subfields[index].value = getNormalizedValue(subfield, field); // eslint-disable-line functional/immutable-data
151
+ field.subfields[index].value = getNormalizedValue(subfield, field, catLang); // eslint-disable-line functional/immutable-data
113
152
  });
114
153
  return field;
115
154
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subfieldValueNormalizations.js","names":["_clone","_interopRequireDefault","require","_utils","_punctuation","_subfield6Utils","e","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","field","normalizeSubfieldValues","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","handleInitials","value","subfieldCode","ind1","includes","tag","fieldHasSubfield","i","initialsInRow","replace","str","match","getNormalizedValue","subfield","uppercaseLanguage","handleMovies","code","relevantTags","targetTag","tagForUppercasing","newValue","toUpperCase","slice","fieldFixPunctuation","fieldGetUnambiguousTag","index"],"sources":["../src/subfieldValueNormalizations.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldHasSubfield, fieldToString} from './utils';\nimport {fieldFixPunctuation} from './punctuation2';\nimport {fieldGetUnambiguousTag} from './subfield6Utils';\n\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Fix various subfield internal values',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.forEach(field => {\n normalizeSubfieldValues(field);\n });\n\n // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res) {\n if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = normalizeSubfieldValues(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'${orig}' requires subfield internal mods/normalization`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n}\n\n\nfunction handleInitials(value, subfieldCode, field) {\n // MRA-267/273\n /* eslint-disable */\n if (field.ind1 === '1' && subfieldCode === 'a' && ['100', '600', '700', '800'].includes(field.tag) && !fieldHasSubfield(field, '0')) {\n // Fix MRA-267/273 (partial): Handle the most common case(s). (And extend them rules later on if the need arises):\n // No longest initial sequence I've seen is six (in a Sri Lankan name).\n for (var i=0; i < 6 && initialsInRow(value); i++) {\n // NB: Regexp has ','. Everything before it belongs to the surname. Everything after it is free game.\n value = value.replace(/(,.*) ([A-Z]|Å|Ö|Ö)\\.([A-Z]|Å|Ö|Ö)/u, '$1 $2. $3');\n }\n }\n\n return value;\n\n /* eslint-enable */\n function initialsInRow(str) {\n // initial space confirms us that it's an initial\n return str.match(/ (?:[A-Z]|Å|Ä|Ö)\\.(?:[A-Z]|Å|Ä|Ö)/u);\n }\n}\n\nfunction getNormalizedValue(subfield, field) {\n return uppercaseLanguage(handleMovies(handleInitials(subfield.value, subfield.code, field)));\n\n\n function handleMovies(value) {\n if (subfield.code === 'a' && ['130', '630', '730'].includes(field.tag)) {\n // MRA-614: \"(elokuva, 2000)\" => \"(elokuva : 2000)\"\"\n return value.replace(/\\((elokuva), (19[0-9][0-9]|20[0-2][0-9])\\)/u, '($1 : $2)'); // eslint-disable-line prefer-named-capture-group\n }\n return value;\n }\n\n function uppercaseLanguage(value) { // Part of MET-549\n const relevantTags = ['130', '240', '243', '600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'];\n\n if (subfield.code !== 'l') {\n return value;\n }\n const targetTag = tagForUppercasing();\n if (relevantTags.includes(targetTag)) {\n const newValue = `${value[0].toUpperCase()}${value.slice(1)}`;\n if (newValue !== value) {\n fieldFixPunctuation(field); // Rather hackily try to fix prev punc on the fly\n return newValue;\n }\n }\n\n function tagForUppercasing() {\n return field.tag === '880' ? fieldGetUnambiguousTag(field) : field.tag;\n }\n\n return value;\n }\n}\n\nfunction normalizeSubfieldValues(field) {\n if (!field.subfields) {\n return field;\n }\n field.subfields.forEach((subfield, index) => {\n field.subfields[index].value = getNormalizedValue(subfield, field); // eslint-disable-line functional/immutable-data\n });\n return field;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"subfieldValueNormalizations.js","names":["_clone","_interopRequireDefault","require","_utils","_punctuation","_subfield6Utils","e","__esModule","default","_default","description","validate","fix","record","catLang","getCatalogingLanguage","res","message","valid","fields","forEach","field","normalizeSubfieldValues","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","handleInitials","value","subfieldCode","ind1","includes","tag","fieldHasSubfield","i","initialsInRow","replace","str","match","getNormalizedValue","subfield","handleFikt","uppercaseLanguage","handleMovies","code","wrapFiktiivinenHahmo","expandFikt","relevantTags","targetTag","tagForUppercasing","newValue","toUpperCase","slice","fieldFixPunctuation","fieldGetUnambiguousTag","index"],"sources":["../src/subfieldValueNormalizations.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldHasSubfield, fieldToString, getCatalogingLanguage} from './utils';\nimport {fieldFixPunctuation} from './punctuation2';\nimport {fieldGetUnambiguousTag} from './subfield6Utils';\n\n// NB! You should probably run punctuation fixes after this validator!\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Fix various subfield internal values',\n validate, fix\n };\n\n function fix(record) {\n const catLang = getCatalogingLanguage(record, 'fin');\n const res = {message: [], fix: [], valid: true};\n\n record.fields.forEach(field => {\n normalizeSubfieldValues(field, catLang);\n });\n\n // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n const catLang = getCatalogingLanguage(record, 'fin');\n const res = {message: []};\n\n record.fields.forEach(field => {\n validateField(field, res, catLang);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res, catLang) {\n if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = normalizeSubfieldValues(clone(field), catLang);\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'${orig}' requires subfield internal mods/normalization`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n}\n\n\nfunction handleInitials(value, subfieldCode, field) {\n // MRA-267/273\n /* eslint-disable */\n if (field.ind1 === '1' && subfieldCode === 'a' && ['100', '600', '700', '800'].includes(field.tag) && !fieldHasSubfield(field, '0')) {\n // Fix MRA-267/273 (partial): Handle the most common case(s). (And extend them rules later on if the need arises):\n // No longest initial sequence I've seen is six (in a Sri Lankan name).\n for (var i=0; i < 6 && initialsInRow(value); i++) {\n // NB: Regexp has ','. Everything before it belongs to the surname. Everything after it is free game.\n value = value.replace(/(,.*) ([A-Z]|Å|Ö|Ö)\\.([A-Z]|Å|Ö|Ö)/u, '$1 $2. $3');\n }\n }\n\n return value;\n\n /* eslint-enable */\n function initialsInRow(str) {\n // initial space confirms us that it's an initial\n return str.match(/ (?:[A-Z]|Å|Ä|Ö)\\.(?:[A-Z]|Å|Ä|Ö)/u);\n }\n}\n\nfunction getNormalizedValue(subfield, field, catLang) {\n return handleFikt(uppercaseLanguage(handleMovies(handleInitials(subfield.value, subfield.code, field))));\n\n function handleFikt(value) {\n if (subfield.code !== 'c' || field.tag !== '600') {\n return value;\n }\n\n return wrapFiktiivinenHahmo(expandFikt(value));\n\n function wrapFiktiivinenHahmo(value) {\n if (value.includes('(')) { // Some kind of parentheses already found -> nothing to do here\n return value;\n }\n if (value.match(/^(?:fiktiivinen hahmo|fiktiv gestalt|fiktiivinen yhteisö)[,.]?$/u)) {\n // Hope that some other module handles punctuation, if needed:\n return `(${value.replace(/[.,]$/u, '')})`;\n }\n return value;\n }\n\n // wrap text around parentheses\n function expandFikt(value) {\n if (field.ind1 === '3') { // Not handling \"fiktiivinen yhteisö\" at the moment\n return value;\n }\n\n if (value.match(/\\bfikt\\.?(?:$|[,)])/u) && !value.match(/fikt.*fikt/ui)) {\n // NB! Dot '.' in 'fikt.' might also be punctuation as well. Run punctuation2 fixer after this fixer!\n if (catLang === 'fin') {\n return value.replace(/\\bfikt\\./u, 'fiktiivinen hahmo');\n }\n if (catLang === 'swe') {\n return value.replace(/\\bfikt\\./u, 'fiktiv gestalt');\n }\n }\n return value;\n }\n\n }\n\n function handleMovies(value) {\n if (subfield.code === 'a' && ['130', '630', '730'].includes(field.tag)) {\n // MRA-614: \"(elokuva, 2000)\" => \"(elokuva : 2000)\"\"\n return value.replace(/\\((elokuva), (19[0-9][0-9]|20[0-2][0-9])\\)/u, '($1 : $2)'); // eslint-disable-line prefer-named-capture-group\n }\n return value;\n }\n\n\n function uppercaseLanguage(value) { // Part of MET-549\n const relevantTags = ['130', '240', '243', '600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'];\n\n if (subfield.code !== 'l') {\n return value;\n }\n const targetTag = tagForUppercasing();\n if (relevantTags.includes(targetTag)) {\n const newValue = `${value[0].toUpperCase()}${value.slice(1)}`;\n if (newValue !== value) {\n fieldFixPunctuation(field); // Rather hackily try to fix prev punc on the fly\n return newValue;\n }\n }\n\n function tagForUppercasing() {\n return field.tag === '880' ? fieldGetUnambiguousTag(field) : field.tag;\n }\n\n return value;\n }\n}\n\nfunction normalizeSubfieldValues(field, catLang) {\n if (!field.subfields) {\n return field;\n }\n field.subfields.forEach((subfield, index) => {\n field.subfields[index].value = getNormalizedValue(subfield, field, catLang); // eslint-disable-line functional/immutable-data\n });\n return field;\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/marc-record-validators-melinda.git"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "11.5.5",
17
+ "version": "11.6.0",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"
@@ -36,18 +36,19 @@
36
36
  "cover:unit": "nyc --silent npm run test:base",
37
37
  "cover:report": "nyc report"
38
38
  },
39
+ "comment-sfs4900": "Package sfs-4900 npm version is 1.1.0, github 1.1.3.",
39
40
  "dependencies": {
40
41
  "@natlibfi/issn-verify": "^1.0.6",
41
42
  "@natlibfi/marc-record": "^9.1.4",
42
- "@natlibfi/marc-record-serializers": "^10.1.2",
43
+ "@natlibfi/marc-record-serializers": "^10.1.5",
43
44
  "@natlibfi/marc-record-validate": "^8.0.12",
44
45
  "@natlibfi/melinda-commons": "^13.0.19",
45
- "@natlibfi/sru-client": "^6.0.18",
46
46
  "@natlibfi/sfs-4900": "github:NatLibFi/sfs-4900",
47
+ "@natlibfi/sru-client": "^6.0.18",
47
48
  "cld3-asm": "^4.0.0",
48
49
  "clone": "^2.1.2",
49
50
  "debug": "^4.4.0",
50
- "isbn3": "^1.2.8",
51
+ "isbn3": "^1.2.9",
51
52
  "iso9_1995": "^0.0.2",
52
53
  "langs": "^2.0.0",
53
54
  "node-fetch": "^2.7.0",
@@ -58,11 +59,11 @@
58
59
  "@natlibfi/marc-record-validate": "^8.0.12"
59
60
  },
60
61
  "devDependencies": {
61
- "@babel/cli": "^7.26.4",
62
+ "@babel/cli": "^7.27.0",
62
63
  "@babel/core": "^7.26.10",
63
64
  "@babel/preset-env": "^7.26.9",
64
65
  "@babel/register": "^7.25.9",
65
- "@babel/runtime": "^7.26.10",
66
+ "@babel/runtime": "^7.27.0",
66
67
  "@natlibfi/eslint-config-melinda-backend": "^3.0.5",
67
68
  "@natlibfi/fixugen": "^2.0.13",
68
69
  "@natlibfi/fixura": "^3.0.12",
@@ -61,6 +61,9 @@ function field505FixSubfieldTRG(field) {
61
61
  subfieldsThatWillBeModified.forEach(sf => fixSubfieldThatPrecedesT(sf));
62
62
 
63
63
  function fixSubfieldThatPrecedesT(sf) {
64
+ if (!sf.value) {
65
+ return;
66
+ }
64
67
  sf.value = sf.value.replace(/ ;$/u, ' --'); // eslint-disable-line functional/immutable-data
65
68
  }
66
69
  }
package/src/index.js CHANGED
@@ -29,6 +29,7 @@ import ItemLanguage from './item-language';
29
29
  import MergeField500Lisapainokset from './mergeField500Lisapainokset';
30
30
  import MergeFields from './merge-fields/';
31
31
  import MergeRelatorTermFields from './mergeRelatorTermFields';
32
+ import Modernize502 from './modernize-502';
32
33
  import MultipleSubfield0s from './multiple-subfield-0';
33
34
  import NonBreakingSpace from './non-breaking-space';
34
35
  import NormalizeDashes from './normalize-dashes';
@@ -88,6 +89,7 @@ export {
88
89
  ItemLanguage,
89
90
  MergeField500Lisapainokset,
90
91
  MergeRelatorTermFields,
92
+ Modernize502, //
91
93
  MultipleSubfield0s,
92
94
  NonBreakingSpace,
93
95
  NormalizeDashes,