@natlibfi/marc-record-validators-melinda 11.4.2 → 11.4.3-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/punctuation2.js +26 -10
- package/dist/punctuation2.js.map +1 -1
- package/dist/sortSubfields.js +6 -5
- package/dist/sortSubfields.js.map +1 -1
- package/package.json +3 -3
- package/src/punctuation2.js +13 -8
- package/src/sortSubfields.js +6 -5
- package/test-fixtures/field-008-18-34-character-groups/02/expectedResult.json +1 -1
- package/test-fixtures/field-008-18-34-character-groups/02/record.json +1 -1
- package/test-fixtures/punctuation2/610/expectedResult.json +11 -0
- package/test-fixtures/punctuation2/610/metadata.json +5 -0
- package/test-fixtures/punctuation2/610/record.json +10 -0
- package/test-fixtures/punctuation2/611/expectedResult.json +13 -0
- package/test-fixtures/punctuation2/611/metadata.json +5 -0
- package/test-fixtures/punctuation2/611/record.json +12 -0
- package/test-fixtures/strip-punctuation/610/expectedResult.json +11 -0
- package/test-fixtures/strip-punctuation/610/metadata.json +5 -0
- package/test-fixtures/strip-punctuation/610/record.json +10 -0
- package/test-fixtures/strip-punctuation/611/expectedResult.json +13 -0
- package/test-fixtures/strip-punctuation/611/metadata.json +5 -0
- package/test-fixtures/strip-punctuation/611/record.json +12 -0
package/dist/punctuation2.js
CHANGED
|
@@ -190,16 +190,17 @@ const addX00Dot = {
|
|
|
190
190
|
'context': needsPuncAfterAlphanumeric
|
|
191
191
|
};
|
|
192
192
|
const addX10iColon = {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
'
|
|
193
|
+
name: 'Punctuate relationship information',
|
|
194
|
+
add: ':',
|
|
195
|
+
code: 'i',
|
|
196
|
+
context: defaultNeedsPuncAfter2
|
|
196
197
|
};
|
|
197
198
|
const addX10bDot = {
|
|
198
199
|
'name': 'Add X10 pre-$b dot',
|
|
199
200
|
'add': '.',
|
|
200
201
|
'code': 'ab',
|
|
201
202
|
'followedBy': 'b',
|
|
202
|
-
'context':
|
|
203
|
+
'context': defaultNeedsPuncAfter2
|
|
203
204
|
};
|
|
204
205
|
const addX10eComma = {
|
|
205
206
|
'add': ',',
|
|
@@ -220,6 +221,13 @@ const addColonToRelationshipInformation = {
|
|
|
220
221
|
'code': 'i',
|
|
221
222
|
'context': defaultNeedsPuncAfter2
|
|
222
223
|
};
|
|
224
|
+
const addX11Spacecolon = {
|
|
225
|
+
name: '611 space colon(y :-)',
|
|
226
|
+
add: ' :',
|
|
227
|
+
code: 'nd',
|
|
228
|
+
followedBy: 'dc',
|
|
229
|
+
'context': defaultNeedsPuncAfter2
|
|
230
|
+
};
|
|
223
231
|
const addDotBeforeLanguageSubfieldL = {
|
|
224
232
|
'name': 'Add dot before $l',
|
|
225
233
|
'add': '.',
|
|
@@ -247,7 +255,7 @@ const REMOVE_AND_ADD = 3;
|
|
|
247
255
|
const removeCrapFromAllEntryFields = [removeCommaBeforeLanguageSubfieldL, removeCommaBeforeTitleSubfieldT];
|
|
248
256
|
const removeX00Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, cleanX00dCommaOrDot, cleanRHS, X00RemoveDotAfterBracket, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];
|
|
249
257
|
const removeX10Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];
|
|
250
|
-
const removeX11Whatever = removeCrapFromAllEntryFields;
|
|
258
|
+
const removeX11Whatever = [...removeCrapFromAllEntryFields];
|
|
251
259
|
const removeX30Whatever = removeCrapFromAllEntryFields;
|
|
252
260
|
const remove490And830Whatever = [{
|
|
253
261
|
'code': 'axyzv',
|
|
@@ -391,6 +399,13 @@ const cleanDotBeforeLanguageSubfieldL = {
|
|
|
391
399
|
'remove': /\.$/u
|
|
392
400
|
};
|
|
393
401
|
const legalEntryField = [cleanDotBeforeLanguageSubfieldL];
|
|
402
|
+
const legalX11SpaceColon = {
|
|
403
|
+
name: 'legal X11 spacecolony',
|
|
404
|
+
code: 'nd',
|
|
405
|
+
followedBy: 'dc',
|
|
406
|
+
context: / :$/u,
|
|
407
|
+
remove: / :$/u
|
|
408
|
+
};
|
|
394
409
|
const legalX00punc = [cleanLegalX00Comma, cleanLegalX00iColon, cleanLegalX00bDot, cleanLegalX00Dot, ...legalEntryField];
|
|
395
410
|
const cleanLegalX10Comma = {
|
|
396
411
|
'name': 'X10comma',
|
|
@@ -464,10 +479,11 @@ const clean24X = [{
|
|
|
464
479
|
'followedBy': 'p',
|
|
465
480
|
'remove': /,$/u
|
|
466
481
|
}, cleanDotBeforeLanguageSubfieldL];
|
|
482
|
+
const legalX11Punc = [...legalEntryField, legalX11SpaceColon];
|
|
467
483
|
const cleanValidPunctuationRules = {
|
|
468
484
|
'100': legalX00punc,
|
|
469
485
|
'110': legalX10punc,
|
|
470
|
-
'111':
|
|
486
|
+
'111': legalX11Punc,
|
|
471
487
|
'130': legalEntryField,
|
|
472
488
|
'240': clean24X,
|
|
473
489
|
'243': clean24X,
|
|
@@ -539,7 +555,7 @@ const cleanValidPunctuationRules = {
|
|
|
539
555
|
}],
|
|
540
556
|
'600': legalX00punc,
|
|
541
557
|
'610': legalX10punc,
|
|
542
|
-
'611':
|
|
558
|
+
'611': legalX11Punc,
|
|
543
559
|
'630': legalEntryField,
|
|
544
560
|
// Experimental, MET366-ish (end punc in internationally valid, but we don't use it here in Finland):
|
|
545
561
|
'648': [{
|
|
@@ -550,11 +566,11 @@ const cleanValidPunctuationRules = {
|
|
|
550
566
|
}],
|
|
551
567
|
'700': legalX00punc,
|
|
552
568
|
'710': legalX10punc,
|
|
553
|
-
'711':
|
|
569
|
+
'711': legalX11Punc,
|
|
554
570
|
'730': legalEntryField,
|
|
555
571
|
'800': legalX00punc,
|
|
556
572
|
'810': legalX10punc,
|
|
557
|
-
'811':
|
|
573
|
+
'811': legalX11Punc,
|
|
558
574
|
'830': [...legalEntryField, ...cleanLegalSeriesTitle],
|
|
559
575
|
'946': clean24X
|
|
560
576
|
};
|
|
@@ -563,7 +579,7 @@ const cleanValidPunctuationRules = {
|
|
|
563
579
|
const addToAllEntryFields = [addDotBeforeLanguageSubfieldL, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];
|
|
564
580
|
const addX00 = [addX00aComma, addX00aComma2, addX00Dot, addX00dComma, ...addToAllEntryFields];
|
|
565
581
|
const addX10 = [addX10iColon, addX10bDot, addX10eComma, addX10Dot, ...addToAllEntryFields];
|
|
566
|
-
const addX11 = [...addToAllEntryFields];
|
|
582
|
+
const addX11 = [...addToAllEntryFields, addX11Spacecolon];
|
|
567
583
|
const addX30 = [...addToAllEntryFields];
|
|
568
584
|
const add24X = [{
|
|
569
585
|
'code': 'i',
|
package/dist/punctuation2.js.map
CHANGED
|
@@ -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","addX10bDot","addX10eComma","addX10Dot","addColonToRelationshipInformation","addDotBeforeLanguageSubfieldL","addSemicolonBeforeVolumeDesignation","NONE","ADD","REMOVE","REMOVE_AND_ADD","removeCrapFromAllEntryFields","removeX00Whatever","removeX10Whatever","removeX11Whatever","removeX30Whatever","remove490And830Whatever","linkingEntryRemoveWhatever","crappy24X","cleanCrappyPunctuationRules","cleanLegalX00Comma","cleanLegalX00bDot","context","cleanLegalX00iColon","cleanLegalX00Dot","cleanDotBeforeLanguageSubfieldL","legalEntryField","legalX00punc","cleanLegalX10Comma","cleanLegalX10Dot","legalX10punc","cleanLegalSeriesTitle","clean24X","cleanValidPunctuationRules","addToAllEntryFields","addX00","addX10","addX11","addX30","add24X","add245","addSeriesTitle","addLinkingEntry","addPairedPunctuationRules","ruleAppliesToSubfieldCode","targetSubfieldCodes","currSubfieldCode","negation","ruleAppliesToField","rule","ind1","ind2","ruleAppliesToCurrentSubfield","value","match","ruleAppliesToNextSubfield","nextSubfield","followedBy","contextRHS","checkRule","subfield1","subfield2","applyPunctuationRules","ruleArray","tag2","tag","fieldGetUnambiguousTag","candRules","every","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';\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', 'code': 'i', 'context': defaultNeedsPuncAfter2};\nconst addX10bDot = {'name': 'Add X10 pre-$b dot', 'add': '.', 'code': 'ab', 'followedBy': 'b', 'context': needsPuncAfterAlphanumeric};\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 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': '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 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 cleanValidPunctuationRules = {\n '100': legalX00punc,\n '110': legalX10punc,\n '111': legalEntryField,\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': legalEntryField,\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': legalEntryField,\n '730': legalEntryField,\n '800': legalX00punc,\n '810': legalX10punc,\n '811': legalEntryField,\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];\nconst addX30 = [...addToAllEntryFields];\n\nconst add24X = [\n {'code': 'i', 'followedBy': 'a', 'add': ':', 'context': needsPuncAfterAlphanumeric},\n {'code': 'a', 'followedBy': 'b', 'add': ' :', 'context': needsPuncAfterAlphanumeric},\n {'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': needsPuncAfterAlphanumeric},\n {'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': needsPuncAfterAlphanumeric},\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': 'abc', '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","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': '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': needsPuncAfterAlphanumeric},\n {'code': 'abk', 'followedBy': 'f', 'add': ',', 'context': needsPuncAfterAlphanumeric},\n {'code': 'abfnp', 'followedBy': 'c', 'add': ' /', 'context': needsPuncAfterAlphanumeric},\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': 'abc', '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":[]}
|
package/dist/sortSubfields.js
CHANGED
|
@@ -67,7 +67,8 @@ function _default(tagPattern) {
|
|
|
67
67
|
// X00, X10, X11 and X130 could also for their own sets...
|
|
68
68
|
// (ouch! sometimes $c comes after $d...): LoC: 100 0# ‡a Black Foot, ‡c Chief, ‡d d. 1877 ‡c (Spirit)
|
|
69
69
|
const sortOrderForX00 = ['6', 'i', 'a', 'b', 'c', 'q', 'd', 'e', 't', 'u', 'l', 'f', 'x', 'y', 'z', '0', '5', '9']; // skip $g. Can't remember why, though...
|
|
70
|
-
const sortOrderForX10 = ['6', 'i', 'a', 'b', 't', 'n', 'e', 'v', 'w', 'x', 'y', 'z', '0', '5', '9']; // somewhat iffy
|
|
70
|
+
const sortOrderForX10 = ['6', 'i', 'a', 'b', 't', 'n', 'c', 'e', 'v', 'w', 'x', 'y', 'z', '0', '5', '9']; // somewhat iffy
|
|
71
|
+
const sortOrderForX11 = ['6', 'a', 'n', 'd', 'c', 'e', 'g', 'j', '0', '5', '9'];
|
|
71
72
|
const sortOrderFor7XX = ['8', '6', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w'];
|
|
72
73
|
const sortOrderFor246 = ['i', 'a', 'b', 'n', 'p', 'f', '5', '9']; // Used by field 946 as well
|
|
73
74
|
|
|
@@ -100,7 +101,7 @@ const subfieldSortOrder = [{
|
|
|
100
101
|
'sortOrder': sortOrderForX10
|
|
101
102
|
}, {
|
|
102
103
|
'tag': '111',
|
|
103
|
-
'sortOrder':
|
|
104
|
+
'sortOrder': sortOrderForX11
|
|
104
105
|
}, {
|
|
105
106
|
'tag': '130',
|
|
106
107
|
'sortOrder': ['a', 'n', 'p', 'k', 'l']
|
|
@@ -142,7 +143,7 @@ const subfieldSortOrder = [{
|
|
|
142
143
|
'sortOrder': sortOrderForX10
|
|
143
144
|
}, {
|
|
144
145
|
'tag': '611',
|
|
145
|
-
'sortOrder':
|
|
146
|
+
'sortOrder': sortOrderForX11
|
|
146
147
|
}, {
|
|
147
148
|
'tag': '650',
|
|
148
149
|
'sortOrder': ['a', 'x', 'y', 'z']
|
|
@@ -154,7 +155,7 @@ const subfieldSortOrder = [{
|
|
|
154
155
|
'sortOrder': sortOrderForX10
|
|
155
156
|
}, {
|
|
156
157
|
'tag': '711',
|
|
157
|
-
'sortOrder':
|
|
158
|
+
'sortOrder': sortOrderForX11
|
|
158
159
|
}, {
|
|
159
160
|
'tag': '760',
|
|
160
161
|
'sortOrder': sortOrderFor7XX
|
|
@@ -211,7 +212,7 @@ const subfieldSortOrder = [{
|
|
|
211
212
|
'sortOrder': sortOrderForX10
|
|
212
213
|
}, {
|
|
213
214
|
'tag': '811',
|
|
214
|
-
'sortOrder':
|
|
215
|
+
'sortOrder': sortOrderForX11
|
|
215
216
|
}, {
|
|
216
217
|
'tag': '830',
|
|
217
218
|
'sortOrder': ['a', 'n', 'x', 'v']
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sortSubfields.js","names":["_clone","_interopRequireDefault","require","_debug","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","defaultSortOrderStringFinns","defaultSortOrderStringOthers","defaultSortOrderFinns","split","defaultSortOrderOthers","_default","tagPattern","description","validate","fix","getRelevantFields","record","datafields","fields","filter","f","subfields","regexp","RegExp","test","tag","res","message","valid","relevantFields","forEach","field","sortAdjacentSubfields","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","sortOrderForX00","sortOrderForX10","sortOrderFor7XX","sortOrderFor246","subfieldSortOrder","getSubfieldSortOrder","entry","currEntry","sortOrder","nvdebug","swapSubfields","loopAgain","some","sf","index","currPos","getPosition","prevPos","tmp","subfield","indexOf","code","includes","value","twoBeforeZero","sf2","externalSortOrder","finnishWay","controlSubfieldOrder","sortOrderForField","defaultSortOrder","subfieldOrder"],"sources":["../src/sortSubfields.js"],"sourcesContent":["// Author(s): Nicholas Volk\n\nimport clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst defaultSortOrderStringFinns = '8673abcdefghijklmnopqrstuvwxyz420159'; // NB! We Finns like $2 before $0 in 6XX...\nconst defaultSortOrderStringOthers = '8673abcdefghijklmnopqrstuvwxyz402159';\n\nconst defaultSortOrderFinns = defaultSortOrderStringFinns.split('');\nconst defaultSortOrderOthers = defaultSortOrderStringOthers.split('');\n\n\nexport default function (tagPattern) {\n\n return {\n description: 'Swap adjacent subfields',\n validate, fix\n };\n\n function getRelevantFields(record, tagPattern) {\n const datafields = record.fields.filter(f => f.subfields);\n if (!tagPattern) {\n return datafields;\n }\n\n const regexp = new RegExp(tagPattern, 'u');\n return datafields.filter(f => regexp.test(f.tag));\n }\n\n function fix(record, tagPattern) {\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n sortAdjacentSubfields(field);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentSubfields(clonedField);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(clonedFieldAsString); // eslint-disable-line functional/immutable-data\n }\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\n// X00, X10, X11 and X130 could also for their own sets...\n// (ouch! sometimes $c comes after $d...): LoC: 100 0# ‡a Black Foot, ‡c Chief, ‡d d. 1877 ‡c (Spirit)\nconst sortOrderForX00 = ['6', 'i', 'a', 'b', 'c', 'q', 'd', 'e', 't', 'u', 'l', 'f', 'x', 'y', 'z', '0', '5', '9']; // skip $g. Can't remember why, though...\nconst sortOrderForX10 = ['6', 'i', 'a', 'b', 't', 'n', 'e', 'v', 'w', 'x', 'y', 'z', '0', '5', '9']; // somewhat iffy\nconst sortOrderFor7XX = ['8', '6', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w'];\nconst sortOrderFor246 = ['i', 'a', 'b', 'n', 'p', 'f', '5', '9']; // Used by field 946 as well\n\n// List *only* exceptional order here. Otherwise default order is used.\nconst subfieldSortOrder = [\n {'tag': '017', 'sortOrder': ['i', 'a', 'b', 'd']},\n {'tag': '028', 'sortOrder': ['b', 'a', 'q']}, // National convention\n //{'tag': '031', 'sortOrder': ['a', 'b', 'c', 'm', 'e', 'd']}, // utter guesswork\n {'tag': '040', 'sortOrder': ['8', '6', 'a', 'b', 'e', 'c', 'd', 'x']},\n {'tag': '041', 'sortOrder': ['8', '6', 'a', 'd', 'j', 'p', 'h', 'e', 'g', 'm']}, // guesswork\n {'tag': '048', 'sortOrder': ['8', '6', 'b', 'a']},\n {'tag': '100', 'sortOrder': sortOrderForX00},\n {'tag': '110', 'sortOrder': sortOrderForX10},\n {'tag': '111', 'sortOrder': ['a', 'n', 'd', 'c', 'e', 'g', 'j']},\n {'tag': '130', 'sortOrder': ['a', 'n', 'p', 'k', 'l']},\n {'tag': '240', 'sortOrder': ['a', 'm', 'n', 'p', 's', 'l', '2', '0', '1', '5', '9']},\n {'tag': '245', 'sortOrder': ['6', 'a', 'b', 'n', 'p', 'k', 'f', 'c']},\n {'tag': '246', 'sortOrder': sortOrderFor246},\n {'tag': '382', 'sortOrder': ['a']},\n {'tag': '385', 'sortOrder': ['8', 'm', 'n', 'a', '2', '0']},\n {'tag': '386', 'sortOrder': ['8', 'm', 'n', 'a']},\n {'tag': '490', 'sortOrder': ['a', 'x', 'y', 'v', 'l']},\n {'tag': '505', 'sortOrder': ['a']},\n {'tag': '526', 'sortOrder': ['i', 'a', 'b', 'x', 'z']},\n {'tag': '540', 'sortOrder': ['a', 'b', 'c', 'd', 'f', '2', 'u']},\n {'tag': '600', 'sortOrder': sortOrderForX00},\n {'tag': '610', 'sortOrder': sortOrderForX10},\n {'tag': '611', 'sortOrder': ['a', 'n', 'd', 'c', 'e', 'g', 'j']},\n {'tag': '650', 'sortOrder': ['a', 'x', 'y', 'z']},\n {'tag': '700', 'sortOrder': sortOrderForX00},\n {'tag': '710', 'sortOrder': sortOrderForX10},\n {'tag': '711', 'sortOrder': ['a', 'n', 'd', 'c', 'e', 'g', 'j']},\n {'tag': '760', 'sortOrder': sortOrderFor7XX},\n {'tag': '762', 'sortOrder': sortOrderFor7XX},\n {'tag': '765', 'sortOrder': sortOrderFor7XX},\n {'tag': '767', 'sortOrder': sortOrderFor7XX},\n {'tag': '770', 'sortOrder': sortOrderFor7XX},\n {'tag': '772', 'sortOrder': sortOrderFor7XX},\n {'tag': '773', 'sortOrder': sortOrderFor7XX},\n {'tag': '774', 'sortOrder': sortOrderFor7XX},\n {'tag': '775', 'sortOrder': sortOrderFor7XX},\n {'tag': '776', 'sortOrder': sortOrderFor7XX},\n {'tag': '777', 'sortOrder': sortOrderFor7XX},\n {'tag': '780', 'sortOrder': sortOrderFor7XX},\n {'tag': '785', 'sortOrder': sortOrderFor7XX},\n {'tag': '786', 'sortOrder': sortOrderFor7XX},\n {'tag': '787', 'sortOrder': sortOrderFor7XX},\n {'tag': '788', 'sortOrder': sortOrderFor7XX},\n {'tag': '800', 'sortOrder': sortOrderForX00},\n {'tag': '810', 'sortOrder': sortOrderForX10},\n {'tag': '811', 'sortOrder': ['a', 'n', 'd', 'c', 'e', 'g', 'j']},\n {'tag': '830', 'sortOrder': ['a', 'n', 'x', 'v']}, // INCOMPLETE, SAME AS 490? APPARENTLY NOT...\n {'tag': '856', 'sortOrder': ['3', 'u', 'q', 'x', 'y', 'z', '5']}, // incomplete, LoC examples are inconclusive\n {'tag': '880', 'sortOrder': ['6', 'a']},\n {'tag': '946', 'sortOrder': sortOrderFor246},\n {'tag': 'LOW', 'sortOrder': ['a', 'b', 'c', 'l', 'h']},\n {'tag': 'SID', 'sortOrder': ['c', 'b']} // Hack, so that default order is not used\n];\n\nfunction getSubfieldSortOrder(field) {\n const entry = subfieldSortOrder.filter(currEntry => field.tag === currEntry.tag);\n if (entry.length > 0 && 'sortOrder' in entry[0]) {\n debugDev(`sort order for ${field.tag}: ${entry[0].sortOrder}`);\n return entry[0].sortOrder;\n }\n nvdebug(`WARNING!\\tNo subfield order found for ${field.tag}.`);\n return [];\n}\n\n\nfunction swapSubfields(field, sortOrder) {\n if (!field.subfields) {\n return;\n }\n\n const loopAgain = field.subfields.some((sf, index) => {\n if (index === 0) {\n return false;\n }\n const currPos = getPosition(sf, sortOrder);\n const prevPos = getPosition(field.subfields[index - 1], sortOrder);\n if (currPos === -1 || prevPos === -1 || currPos >= prevPos) {\n return false;\n }\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = sf; // eslint-disable-line functional/immutable-data\n field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data\n return true;\n });\n\n if (loopAgain) {\n return swapSubfields(field, sortOrder);\n }\n\n return;\n\n function getPosition(subfield, sortOrder) {\n // Magic exception that *always* comes first, used by Aleph in linking overlong fields\n if (sortOrder.indexOf('9') > -1 && subfield.code === '9' && ['^', '^^'].includes(subfield.value)) {\n return -0.5; // normal \"best value\" is 0, and \"worst value\" is N\n }\n return sortOrder.indexOf(subfield.code);\n }\n}\n\n\nfunction twoBeforeZero(field) {\n const sf2 = field.subfields.filter(sf => sf.code === '2');\n if (sf2.length !== 1) {\n return true; // both true and false are ok here\n }\n // MRA-465: gcipplatform (field 753)\n // rdasco (344), creatorbio (353), gbd (668), lsch (eg. 385)\n if (['creatorbio', 'gbd', 'gcipplatform', 'lscsh', 'rdasco'].includes(sf2[0].value)) {\n return false;\n }\n return true;\n}\n\nexport function sortAdjacentSubfields(field, externalSortOrder = []) {\n if (!field.subfields) {\n return field;\n }\n // Features:\n // - Swap only sort adjacent pairs.\n // - No sorting over unlisted subfield codes. Thus a given subfield can not shift to wrong side of 700$t...\n\n // Implement: 880 field should use values from $6...\n\n // Should we support multiple sort orders per field?\n\n // Try to handle control subfield order. This is not 100% fool proof. Control subfields are pretty stable, though.\n // However, there are exceptions (eg. $9 ^^ comes first and $2 $0 is a Finnish convention...)\n\n const finnishWay = twoBeforeZero(field);\n const controlSubfieldOrder = finnishWay ? ['8', '6', '7', '3', 'a', '4', '2', '0', '1', '5', '9'] : ['8', '6', '7', '3', 'a', '4', '0', '2', '1', '5', '9'];\n swapSubfields(field, controlSubfieldOrder);\n\n const sortOrderForField = externalSortOrder.length > 0 ? externalSortOrder : getSubfieldSortOrder(field);\n //nvdebug(`INTERMEDIATE SUBFIELD ORDER FOR ${field.tag}: ${sortOrderForField.join(', ')}`);\n\n const defaultSortOrder = finnishWay ? defaultSortOrderFinns : defaultSortOrderOthers; // $2 vs $0\n const subfieldOrder = sortOrderForField.length > 0 ? sortOrderForField : defaultSortOrder;\n //nvdebug(`FINAL SUBFIELD ORDER (FINNISH=${finnishWay}) FOR ${field.tag}: ${subfieldOrder.join(', ')}`);\n //if (sortOrder === null) { return field; } //// Currently always sort..\n //nvdebug(`IN: ${fieldToString(field)}`);\n swapSubfields(field, subfieldOrder);\n //nvdebug(`OUT: ${fieldToString(field)}`);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"sortSubfields.js","names":["_clone","_interopRequireDefault","require","_debug","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","defaultSortOrderStringFinns","defaultSortOrderStringOthers","defaultSortOrderFinns","split","defaultSortOrderOthers","_default","tagPattern","description","validate","fix","getRelevantFields","record","datafields","fields","filter","f","subfields","regexp","RegExp","test","tag","res","message","valid","relevantFields","forEach","field","sortAdjacentSubfields","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","sortOrderForX00","sortOrderForX10","sortOrderForX11","sortOrderFor7XX","sortOrderFor246","subfieldSortOrder","getSubfieldSortOrder","entry","currEntry","sortOrder","nvdebug","swapSubfields","loopAgain","some","sf","index","currPos","getPosition","prevPos","tmp","subfield","indexOf","code","includes","value","twoBeforeZero","sf2","externalSortOrder","finnishWay","controlSubfieldOrder","sortOrderForField","defaultSortOrder","subfieldOrder"],"sources":["../src/sortSubfields.js"],"sourcesContent":["// Author(s): Nicholas Volk\n\nimport clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst defaultSortOrderStringFinns = '8673abcdefghijklmnopqrstuvwxyz420159'; // NB! We Finns like $2 before $0 in 6XX...\nconst defaultSortOrderStringOthers = '8673abcdefghijklmnopqrstuvwxyz402159';\n\nconst defaultSortOrderFinns = defaultSortOrderStringFinns.split('');\nconst defaultSortOrderOthers = defaultSortOrderStringOthers.split('');\n\n\nexport default function (tagPattern) {\n\n return {\n description: 'Swap adjacent subfields',\n validate, fix\n };\n\n function getRelevantFields(record, tagPattern) {\n const datafields = record.fields.filter(f => f.subfields);\n if (!tagPattern) {\n return datafields;\n }\n\n const regexp = new RegExp(tagPattern, 'u');\n return datafields.filter(f => regexp.test(f.tag));\n }\n\n function fix(record, tagPattern) {\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n sortAdjacentSubfields(field);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentSubfields(clonedField);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(clonedFieldAsString); // eslint-disable-line functional/immutable-data\n }\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\n// X00, X10, X11 and X130 could also for their own sets...\n// (ouch! sometimes $c comes after $d...): LoC: 100 0# ‡a Black Foot, ‡c Chief, ‡d d. 1877 ‡c (Spirit)\nconst sortOrderForX00 = ['6', 'i', 'a', 'b', 'c', 'q', 'd', 'e', 't', 'u', 'l', 'f', 'x', 'y', 'z', '0', '5', '9']; // skip $g. Can't remember why, though...\nconst sortOrderForX10 = ['6', 'i', 'a', 'b', 't', 'n', 'c', 'e', 'v', 'w', 'x', 'y', 'z', '0', '5', '9']; // somewhat iffy\nconst sortOrderForX11 = ['6', 'a', 'n', 'd', 'c', 'e', 'g', 'j', '0', '5', '9'];\nconst sortOrderFor7XX = ['8', '6', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w'];\nconst sortOrderFor246 = ['i', 'a', 'b', 'n', 'p', 'f', '5', '9']; // Used by field 946 as well\n\n// List *only* exceptional order here. Otherwise default order is used.\nconst subfieldSortOrder = [\n {'tag': '017', 'sortOrder': ['i', 'a', 'b', 'd']},\n {'tag': '028', 'sortOrder': ['b', 'a', 'q']}, // National convention\n //{'tag': '031', 'sortOrder': ['a', 'b', 'c', 'm', 'e', 'd']}, // utter guesswork\n {'tag': '040', 'sortOrder': ['8', '6', 'a', 'b', 'e', 'c', 'd', 'x']},\n {'tag': '041', 'sortOrder': ['8', '6', 'a', 'd', 'j', 'p', 'h', 'e', 'g', 'm']}, // guesswork\n {'tag': '048', 'sortOrder': ['8', '6', 'b', 'a']},\n {'tag': '100', 'sortOrder': sortOrderForX00},\n {'tag': '110', 'sortOrder': sortOrderForX10},\n {'tag': '111', 'sortOrder': sortOrderForX11},\n {'tag': '130', 'sortOrder': ['a', 'n', 'p', 'k', 'l']},\n {'tag': '240', 'sortOrder': ['a', 'm', 'n', 'p', 's', 'l', '2', '0', '1', '5', '9']},\n {'tag': '245', 'sortOrder': ['6', 'a', 'b', 'n', 'p', 'k', 'f', 'c']},\n {'tag': '246', 'sortOrder': sortOrderFor246},\n {'tag': '382', 'sortOrder': ['a']},\n {'tag': '385', 'sortOrder': ['8', 'm', 'n', 'a', '2', '0']},\n {'tag': '386', 'sortOrder': ['8', 'm', 'n', 'a']},\n {'tag': '490', 'sortOrder': ['a', 'x', 'y', 'v', 'l']},\n {'tag': '505', 'sortOrder': ['a']},\n {'tag': '526', 'sortOrder': ['i', 'a', 'b', 'x', 'z']},\n {'tag': '540', 'sortOrder': ['a', 'b', 'c', 'd', 'f', '2', 'u']},\n {'tag': '600', 'sortOrder': sortOrderForX00},\n {'tag': '610', 'sortOrder': sortOrderForX10},\n {'tag': '611', 'sortOrder': sortOrderForX11},\n {'tag': '650', 'sortOrder': ['a', 'x', 'y', 'z']},\n {'tag': '700', 'sortOrder': sortOrderForX00},\n {'tag': '710', 'sortOrder': sortOrderForX10},\n {'tag': '711', 'sortOrder': sortOrderForX11},\n {'tag': '760', 'sortOrder': sortOrderFor7XX},\n {'tag': '762', 'sortOrder': sortOrderFor7XX},\n {'tag': '765', 'sortOrder': sortOrderFor7XX},\n {'tag': '767', 'sortOrder': sortOrderFor7XX},\n {'tag': '770', 'sortOrder': sortOrderFor7XX},\n {'tag': '772', 'sortOrder': sortOrderFor7XX},\n {'tag': '773', 'sortOrder': sortOrderFor7XX},\n {'tag': '774', 'sortOrder': sortOrderFor7XX},\n {'tag': '775', 'sortOrder': sortOrderFor7XX},\n {'tag': '776', 'sortOrder': sortOrderFor7XX},\n {'tag': '777', 'sortOrder': sortOrderFor7XX},\n {'tag': '780', 'sortOrder': sortOrderFor7XX},\n {'tag': '785', 'sortOrder': sortOrderFor7XX},\n {'tag': '786', 'sortOrder': sortOrderFor7XX},\n {'tag': '787', 'sortOrder': sortOrderFor7XX},\n {'tag': '788', 'sortOrder': sortOrderFor7XX},\n {'tag': '800', 'sortOrder': sortOrderForX00},\n {'tag': '810', 'sortOrder': sortOrderForX10},\n {'tag': '811', 'sortOrder': sortOrderForX11},\n {'tag': '830', 'sortOrder': ['a', 'n', 'x', 'v']}, // INCOMPLETE, SAME AS 490? APPARENTLY NOT...\n {'tag': '856', 'sortOrder': ['3', 'u', 'q', 'x', 'y', 'z', '5']}, // incomplete, LoC examples are inconclusive\n {'tag': '880', 'sortOrder': ['6', 'a']},\n {'tag': '946', 'sortOrder': sortOrderFor246},\n {'tag': 'LOW', 'sortOrder': ['a', 'b', 'c', 'l', 'h']},\n {'tag': 'SID', 'sortOrder': ['c', 'b']} // Hack, so that default order is not used\n];\n\nfunction getSubfieldSortOrder(field) {\n const entry = subfieldSortOrder.filter(currEntry => field.tag === currEntry.tag);\n if (entry.length > 0 && 'sortOrder' in entry[0]) {\n debugDev(`sort order for ${field.tag}: ${entry[0].sortOrder}`);\n return entry[0].sortOrder;\n }\n nvdebug(`WARNING!\\tNo subfield order found for ${field.tag}.`);\n return [];\n}\n\n\nfunction swapSubfields(field, sortOrder) {\n if (!field.subfields) {\n return;\n }\n\n const loopAgain = field.subfields.some((sf, index) => {\n if (index === 0) {\n return false;\n }\n const currPos = getPosition(sf, sortOrder);\n const prevPos = getPosition(field.subfields[index - 1], sortOrder);\n if (currPos === -1 || prevPos === -1 || currPos >= prevPos) {\n return false;\n }\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = sf; // eslint-disable-line functional/immutable-data\n field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data\n return true;\n });\n\n if (loopAgain) {\n return swapSubfields(field, sortOrder);\n }\n\n return;\n\n function getPosition(subfield, sortOrder) {\n // Magic exception that *always* comes first, used by Aleph in linking overlong fields\n if (sortOrder.indexOf('9') > -1 && subfield.code === '9' && ['^', '^^'].includes(subfield.value)) {\n return -0.5; // normal \"best value\" is 0, and \"worst value\" is N\n }\n return sortOrder.indexOf(subfield.code);\n }\n}\n\n\nfunction twoBeforeZero(field) {\n const sf2 = field.subfields.filter(sf => sf.code === '2');\n if (sf2.length !== 1) {\n return true; // both true and false are ok here\n }\n // MRA-465: gcipplatform (field 753)\n // rdasco (344), creatorbio (353), gbd (668), lsch (eg. 385)\n if (['creatorbio', 'gbd', 'gcipplatform', 'lscsh', 'rdasco'].includes(sf2[0].value)) {\n return false;\n }\n return true;\n}\n\nexport function sortAdjacentSubfields(field, externalSortOrder = []) {\n if (!field.subfields) {\n return field;\n }\n // Features:\n // - Swap only sort adjacent pairs.\n // - No sorting over unlisted subfield codes. Thus a given subfield can not shift to wrong side of 700$t...\n\n // Implement: 880 field should use values from $6...\n\n // Should we support multiple sort orders per field?\n\n // Try to handle control subfield order. This is not 100% fool proof. Control subfields are pretty stable, though.\n // However, there are exceptions (eg. $9 ^^ comes first and $2 $0 is a Finnish convention...)\n\n const finnishWay = twoBeforeZero(field);\n const controlSubfieldOrder = finnishWay ? ['8', '6', '7', '3', 'a', '4', '2', '0', '1', '5', '9'] : ['8', '6', '7', '3', 'a', '4', '0', '2', '1', '5', '9'];\n swapSubfields(field, controlSubfieldOrder);\n\n const sortOrderForField = externalSortOrder.length > 0 ? externalSortOrder : getSubfieldSortOrder(field);\n //nvdebug(`INTERMEDIATE SUBFIELD ORDER FOR ${field.tag}: ${sortOrderForField.join(', ')}`);\n\n const defaultSortOrder = finnishWay ? defaultSortOrderFinns : defaultSortOrderOthers; // $2 vs $0\n const subfieldOrder = sortOrderForField.length > 0 ? sortOrderForField : defaultSortOrder;\n //nvdebug(`FINAL SUBFIELD ORDER (FINNISH=${finnishWay}) FOR ${field.tag}: ${subfieldOrder.join(', ')}`);\n //if (sortOrder === null) { return field; } //// Currently always sort..\n //nvdebug(`IN: ${fieldToString(field)}`);\n swapSubfields(field, subfieldOrder);\n //nvdebug(`OUT: ${fieldToString(field)}`);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"url": "git@github.com:natlibfi/marc-record-validators-melinda.git"
|
|
15
15
|
},
|
|
16
16
|
"license": "MIT",
|
|
17
|
-
"version": "11.4.
|
|
17
|
+
"version": "11.4.3-alpha.1",
|
|
18
18
|
"main": "./dist/index.js",
|
|
19
19
|
"publishConfig": {
|
|
20
20
|
"access": "public"
|
|
@@ -40,9 +40,9 @@
|
|
|
40
40
|
"@babel/register": "^7.25.9",
|
|
41
41
|
"@natlibfi/issn-verify": "^1.0.4",
|
|
42
42
|
"@natlibfi/marc-record": "^9.1.1",
|
|
43
|
-
"@natlibfi/marc-record-validate": "^8.0.
|
|
43
|
+
"@natlibfi/marc-record-validate": "^8.0.12",
|
|
44
44
|
"@natlibfi/sfs-4900": "^1.1.0",
|
|
45
|
-
"cld3-asm": "^
|
|
45
|
+
"cld3-asm": "^4.0.0",
|
|
46
46
|
"clone": "^2.1.2",
|
|
47
47
|
"debug": "^4.3.7",
|
|
48
48
|
"iso9_1995": "^0.0.2",
|
package/src/punctuation2.js
CHANGED
|
@@ -120,12 +120,14 @@ const addX00aComma2 = {'add': ',', 'code': 'abcdej', 'followedBy': 'cdeg', 'cont
|
|
|
120
120
|
const addX00Dot = {'add': '.', 'code': 'abcdetv', 'followedBy': '#fklptu', 'context': needsPuncAfterAlphanumeric};
|
|
121
121
|
|
|
122
122
|
|
|
123
|
-
const addX10iColon = {
|
|
124
|
-
const addX10bDot = {'name': 'Add X10 pre-$b dot', 'add': '.', 'code': 'ab', 'followedBy': 'b', 'context':
|
|
123
|
+
const addX10iColon = {name: 'Punctuate relationship information', add: ':', code: 'i', context: defaultNeedsPuncAfter2};
|
|
124
|
+
const addX10bDot = {'name': 'Add X10 pre-$b dot', 'add': '.', 'code': 'ab', 'followedBy': 'b', 'context': defaultNeedsPuncAfter2};
|
|
125
125
|
const addX10eComma = {'add': ',', 'code': 'abe', 'followedBy': 'e', 'context': defaultNeedsPuncAfter2};
|
|
126
126
|
const addX10Dot = {'name': 'Add X10 final dot', 'add': '.', 'code': 'abet', 'followedBy': 'tu#', 'context': needsPuncAfterAlphanumeric};
|
|
127
127
|
const addColonToRelationshipInformation = {'name': 'Add \':\' to 7X0 $i relationship info', 'add': ':', 'code': 'i', 'context': defaultNeedsPuncAfter2};
|
|
128
128
|
|
|
129
|
+
const addX11Spacecolon = {name: '611 space colon(y :-)', add: ' :', code: 'nd', followedBy: 'dc', 'context': defaultNeedsPuncAfter2};
|
|
130
|
+
|
|
129
131
|
const addDotBeforeLanguageSubfieldL = {'name': 'Add dot before $l', 'add': '.', 'code': 'abepst', 'followedBy': 'l', 'context': doesNotEndInPunc};
|
|
130
132
|
|
|
131
133
|
// 490:
|
|
@@ -143,7 +145,7 @@ const removeCrapFromAllEntryFields = [removeCommaBeforeLanguageSubfieldL, remove
|
|
|
143
145
|
|
|
144
146
|
const removeX00Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, cleanX00dCommaOrDot, cleanRHS, X00RemoveDotAfterBracket, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];
|
|
145
147
|
const removeX10Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];
|
|
146
|
-
const removeX11Whatever = removeCrapFromAllEntryFields;
|
|
148
|
+
const removeX11Whatever = [...removeCrapFromAllEntryFields];
|
|
147
149
|
const removeX30Whatever = removeCrapFromAllEntryFields;
|
|
148
150
|
|
|
149
151
|
const remove490And830Whatever = [{'code': 'axyzv', 'followedBy': 'axyzv', 'remove': /(?: *;| *=|,)$/u}];
|
|
@@ -218,6 +220,7 @@ const cleanDotBeforeLanguageSubfieldL = {'name': 'pre-language-$l dot', 'followe
|
|
|
218
220
|
|
|
219
221
|
const legalEntryField = [cleanDotBeforeLanguageSubfieldL];
|
|
220
222
|
|
|
223
|
+
const legalX11SpaceColon = {name: 'legal X11 spacecolony', code: 'nd', followedBy: 'dc', context: / :$/u, remove: / :$/u};
|
|
221
224
|
const legalX00punc = [cleanLegalX00Comma, cleanLegalX00iColon, cleanLegalX00bDot, cleanLegalX00Dot, ...legalEntryField];
|
|
222
225
|
|
|
223
226
|
const cleanLegalX10Comma = {'name': 'X10comma', 'code': 'abe', 'followedBy': 'e', 'context': /.,$/u, 'remove': /,$/u};
|
|
@@ -243,10 +246,12 @@ const clean24X = [
|
|
|
243
246
|
cleanDotBeforeLanguageSubfieldL
|
|
244
247
|
];
|
|
245
248
|
|
|
249
|
+
const legalX11Punc = [...legalEntryField, legalX11SpaceColon];
|
|
250
|
+
|
|
246
251
|
const cleanValidPunctuationRules = {
|
|
247
252
|
'100': legalX00punc,
|
|
248
253
|
'110': legalX10punc,
|
|
249
|
-
'111':
|
|
254
|
+
'111': legalX11Punc,
|
|
250
255
|
'130': legalEntryField,
|
|
251
256
|
'240': clean24X,
|
|
252
257
|
'243': clean24X,
|
|
@@ -276,17 +281,17 @@ const cleanValidPunctuationRules = {
|
|
|
276
281
|
'534': [{'code': 'p', 'followedBy': 'c', 'remove': /:$/u}],
|
|
277
282
|
'600': legalX00punc,
|
|
278
283
|
'610': legalX10punc,
|
|
279
|
-
'611':
|
|
284
|
+
'611': legalX11Punc,
|
|
280
285
|
'630': legalEntryField,
|
|
281
286
|
// Experimental, MET366-ish (end punc in internationally valid, but we don't use it here in Finland):
|
|
282
287
|
'648': [{'code': 'a', 'content': /^[0-9]+\.$/u, 'ind2': ['4'], 'remove': /\.$/u}],
|
|
283
288
|
'700': legalX00punc,
|
|
284
289
|
'710': legalX10punc,
|
|
285
|
-
'711':
|
|
290
|
+
'711': legalX11Punc,
|
|
286
291
|
'730': legalEntryField,
|
|
287
292
|
'800': legalX00punc,
|
|
288
293
|
'810': legalX10punc,
|
|
289
|
-
'811':
|
|
294
|
+
'811': legalX11Punc,
|
|
290
295
|
'830': [...legalEntryField, ...cleanLegalSeriesTitle],
|
|
291
296
|
'946': clean24X
|
|
292
297
|
};
|
|
@@ -298,7 +303,7 @@ const addToAllEntryFields = [addDotBeforeLanguageSubfieldL, addSemicolonBeforeVo
|
|
|
298
303
|
|
|
299
304
|
const addX00 = [addX00aComma, addX00aComma2, addX00Dot, addX00dComma, ...addToAllEntryFields];
|
|
300
305
|
const addX10 = [addX10iColon, addX10bDot, addX10eComma, addX10Dot, ...addToAllEntryFields];
|
|
301
|
-
const addX11 = [...addToAllEntryFields];
|
|
306
|
+
const addX11 = [...addToAllEntryFields, addX11Spacecolon];
|
|
302
307
|
const addX30 = [...addToAllEntryFields];
|
|
303
308
|
|
|
304
309
|
const add24X = [
|
package/src/sortSubfields.js
CHANGED
|
@@ -68,7 +68,8 @@ export default function (tagPattern) {
|
|
|
68
68
|
// X00, X10, X11 and X130 could also for their own sets...
|
|
69
69
|
// (ouch! sometimes $c comes after $d...): LoC: 100 0# ‡a Black Foot, ‡c Chief, ‡d d. 1877 ‡c (Spirit)
|
|
70
70
|
const sortOrderForX00 = ['6', 'i', 'a', 'b', 'c', 'q', 'd', 'e', 't', 'u', 'l', 'f', 'x', 'y', 'z', '0', '5', '9']; // skip $g. Can't remember why, though...
|
|
71
|
-
const sortOrderForX10 = ['6', 'i', 'a', 'b', 't', 'n', 'e', 'v', 'w', 'x', 'y', 'z', '0', '5', '9']; // somewhat iffy
|
|
71
|
+
const sortOrderForX10 = ['6', 'i', 'a', 'b', 't', 'n', 'c', 'e', 'v', 'w', 'x', 'y', 'z', '0', '5', '9']; // somewhat iffy
|
|
72
|
+
const sortOrderForX11 = ['6', 'a', 'n', 'd', 'c', 'e', 'g', 'j', '0', '5', '9'];
|
|
72
73
|
const sortOrderFor7XX = ['8', '6', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w'];
|
|
73
74
|
const sortOrderFor246 = ['i', 'a', 'b', 'n', 'p', 'f', '5', '9']; // Used by field 946 as well
|
|
74
75
|
|
|
@@ -82,7 +83,7 @@ const subfieldSortOrder = [
|
|
|
82
83
|
{'tag': '048', 'sortOrder': ['8', '6', 'b', 'a']},
|
|
83
84
|
{'tag': '100', 'sortOrder': sortOrderForX00},
|
|
84
85
|
{'tag': '110', 'sortOrder': sortOrderForX10},
|
|
85
|
-
{'tag': '111', 'sortOrder':
|
|
86
|
+
{'tag': '111', 'sortOrder': sortOrderForX11},
|
|
86
87
|
{'tag': '130', 'sortOrder': ['a', 'n', 'p', 'k', 'l']},
|
|
87
88
|
{'tag': '240', 'sortOrder': ['a', 'm', 'n', 'p', 's', 'l', '2', '0', '1', '5', '9']},
|
|
88
89
|
{'tag': '245', 'sortOrder': ['6', 'a', 'b', 'n', 'p', 'k', 'f', 'c']},
|
|
@@ -96,11 +97,11 @@ const subfieldSortOrder = [
|
|
|
96
97
|
{'tag': '540', 'sortOrder': ['a', 'b', 'c', 'd', 'f', '2', 'u']},
|
|
97
98
|
{'tag': '600', 'sortOrder': sortOrderForX00},
|
|
98
99
|
{'tag': '610', 'sortOrder': sortOrderForX10},
|
|
99
|
-
{'tag': '611', 'sortOrder':
|
|
100
|
+
{'tag': '611', 'sortOrder': sortOrderForX11},
|
|
100
101
|
{'tag': '650', 'sortOrder': ['a', 'x', 'y', 'z']},
|
|
101
102
|
{'tag': '700', 'sortOrder': sortOrderForX00},
|
|
102
103
|
{'tag': '710', 'sortOrder': sortOrderForX10},
|
|
103
|
-
{'tag': '711', 'sortOrder':
|
|
104
|
+
{'tag': '711', 'sortOrder': sortOrderForX11},
|
|
104
105
|
{'tag': '760', 'sortOrder': sortOrderFor7XX},
|
|
105
106
|
{'tag': '762', 'sortOrder': sortOrderFor7XX},
|
|
106
107
|
{'tag': '765', 'sortOrder': sortOrderFor7XX},
|
|
@@ -119,7 +120,7 @@ const subfieldSortOrder = [
|
|
|
119
120
|
{'tag': '788', 'sortOrder': sortOrderFor7XX},
|
|
120
121
|
{'tag': '800', 'sortOrder': sortOrderForX00},
|
|
121
122
|
{'tag': '810', 'sortOrder': sortOrderForX10},
|
|
122
|
-
{'tag': '811', 'sortOrder':
|
|
123
|
+
{'tag': '811', 'sortOrder': sortOrderForX11},
|
|
123
124
|
{'tag': '830', 'sortOrder': ['a', 'n', 'x', 'v']}, // INCOMPLETE, SAME AS 490? APPARENTLY NOT...
|
|
124
125
|
{'tag': '856', 'sortOrder': ['3', 'u', 'q', 'x', 'y', 'z', '5']}, // incomplete, LoC examples are inconclusive
|
|
125
126
|
{'tag': '880', 'sortOrder': ['6', 'a']},
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_validationOptions": {},
|
|
3
|
+
"fields": [
|
|
4
|
+
{ "tag": "005", "value": "20220202020202.0" },
|
|
5
|
+
{ "tag": "610", "ind1": "4", "ind2": "2", "subfields": [
|
|
6
|
+
{ "code": "a", "value": "Nimi (yhtiö)." },
|
|
7
|
+
{ "code": "b", "value": "alanimi." }
|
|
8
|
+
]}
|
|
9
|
+
],
|
|
10
|
+
"leader": ""
|
|
11
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_validationOptions": {},
|
|
3
|
+
"fields": [
|
|
4
|
+
{ "tag": "005", "value": "20220202020202.0" },
|
|
5
|
+
{ "tag": "611", "ind1": "2", "ind2": "4", "subfields": [
|
|
6
|
+
{ "code": "a", "value": "Actes du colloque" },
|
|
7
|
+
{ "code": "n", "value": "(3 :" },
|
|
8
|
+
{ "code": "d", "value": "2002 :" },
|
|
9
|
+
{ "code": "c", "value": "Genova)" }
|
|
10
|
+
]}
|
|
11
|
+
],
|
|
12
|
+
"leader": ""
|
|
13
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fields": [
|
|
3
|
+
{ "tag": "005", "value": "20220202020202.0" },
|
|
4
|
+
{ "tag": "611", "ind1": "2", "ind2": "4", "subfields": [
|
|
5
|
+
{ "code": "a", "value": "Actes du colloque" },
|
|
6
|
+
{ "code": "n", "value": "(3" },
|
|
7
|
+
{ "code": "d", "value": "2002" },
|
|
8
|
+
{ "code": "c", "value": "Genova)" }
|
|
9
|
+
]}
|
|
10
|
+
],
|
|
11
|
+
"leader": ""
|
|
12
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_validationOptions": {},
|
|
3
|
+
"fields": [
|
|
4
|
+
{ "tag": "005", "value": "20220202020202.0" },
|
|
5
|
+
{ "tag": "610", "ind1": "4", "ind2": "2", "subfields": [
|
|
6
|
+
{ "code": "a", "value": "Nimi (yhtiö)" },
|
|
7
|
+
{ "code": "b", "value": "alanimi" }
|
|
8
|
+
]}
|
|
9
|
+
],
|
|
10
|
+
"leader": ""
|
|
11
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_validationOptions": {},
|
|
3
|
+
"fields": [
|
|
4
|
+
{ "tag": "005", "value": "20220202020202.0" },
|
|
5
|
+
{ "tag": "611", "ind1": "2", "ind2": "4", "subfields": [
|
|
6
|
+
{ "code": "a", "value": "Actes du colloque" },
|
|
7
|
+
{ "code": "n", "value": "(3" },
|
|
8
|
+
{ "code": "d", "value": "2002" },
|
|
9
|
+
{ "code": "c", "value": "Genova)" }
|
|
10
|
+
]}
|
|
11
|
+
],
|
|
12
|
+
"leader": ""
|
|
13
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fields": [
|
|
3
|
+
{ "tag": "005", "value": "20220202020202.0" },
|
|
4
|
+
{ "tag": "611", "ind1": "2", "ind2": "4", "subfields": [
|
|
5
|
+
{ "code": "a", "value": "Actes du colloque" },
|
|
6
|
+
{ "code": "n", "value": "(3 :" },
|
|
7
|
+
{ "code": "d", "value": "2002 :" },
|
|
8
|
+
{ "code": "c", "value": "Genova)" }
|
|
9
|
+
]}
|
|
10
|
+
],
|
|
11
|
+
"leader": ""
|
|
12
|
+
}
|