@natlibfi/marc-record-validators-melinda 13.0.2 → 13.0.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/cyrillux-usemarcon-replacement.js +2 -3
- package/dist/cyrillux-usemarcon-replacement.js.map +2 -2
- package/dist/cyrillux.js +4 -5
- package/dist/cyrillux.js.map +2 -2
- package/dist/disambiguateSeriesStatements.js +1 -3
- package/dist/disambiguateSeriesStatements.js.map +2 -2
- package/dist/drop-terms.js +1 -2
- package/dist/drop-terms.js.map +2 -2
- package/dist/field-008-18-34-character-groups.js +1 -2
- package/dist/field-008-18-34-character-groups.js.map +2 -2
- package/dist/field-505-separators.js +1 -2
- package/dist/field-505-separators.js.map +2 -2
- package/dist/field-521-fix.js +1 -2
- package/dist/field-521-fix.js.map +2 -2
- package/dist/fix-33X.js +1 -2
- package/dist/fix-33X.js.map +2 -2
- package/dist/fix-language-codes.js +1 -2
- package/dist/fix-language-codes.js.map +2 -2
- package/dist/fix-sami-041.js +2 -3
- package/dist/fix-sami-041.js.map +2 -2
- package/dist/fixRelatorTerms.js +1 -2
- package/dist/fixRelatorTerms.js.map +2 -2
- package/dist/identical-fields.js +2 -2
- package/dist/identical-fields.js.map +2 -2
- package/dist/mergeRelatorTermFields.js +3 -4
- package/dist/mergeRelatorTermFields.js.map +2 -2
- package/dist/modernize-502.js +1 -2
- package/dist/modernize-502.js.map +2 -2
- package/dist/multiple-subfield-0.js.map +2 -2
- package/dist/normalize-dashes.js +1 -2
- package/dist/normalize-dashes.js.map +2 -2
- package/dist/normalize-identifiers.js +1 -2
- package/dist/normalize-identifiers.js.map +2 -2
- package/dist/normalize-qualifying-information.js +1 -2
- package/dist/normalize-qualifying-information.js.map +2 -2
- package/dist/normalize-utf8-diacritics.js +1 -2
- package/dist/normalize-utf8-diacritics.js.map +2 -2
- package/dist/normalizeFieldForComparison.js +1 -2
- package/dist/normalizeFieldForComparison.js.map +2 -2
- package/dist/punctuation/index.js +3 -8
- package/dist/punctuation/index.js.map +2 -2
- package/dist/punctuation2.js +1 -2
- package/dist/punctuation2.js.map +2 -2
- package/dist/remove-041-zxx.js +1 -2
- package/dist/remove-041-zxx.js.map +2 -2
- package/dist/sanitize-vocabulary-source-codes.js +1 -2
- package/dist/sanitize-vocabulary-source-codes.js.map +2 -2
- package/dist/sortFields.js +1 -2
- package/dist/sortFields.js.map +2 -2
- package/dist/sortRelatorTerms.js +1 -2
- package/dist/sortRelatorTerms.js.map +2 -2
- package/dist/sortSubfields.js +1 -2
- package/dist/sortSubfields.js.map +2 -2
- package/dist/subfieldValueNormalizations.js +1 -2
- package/dist/subfieldValueNormalizations.js.map +2 -2
- package/dist/sync-007-and-300.js +1 -2
- package/dist/sync-007-and-300.js.map +2 -2
- package/dist/sync-language.js +2 -3
- package/dist/sync-language.js.map +2 -2
- package/dist/translate-terms.js +1 -2
- package/dist/translate-terms.js.map +2 -2
- package/package.json +2 -2
- package/src/cyrillux-usemarcon-replacement.js +3 -3
- package/src/cyrillux.js +5 -5
- package/src/disambiguateSeriesStatements.js +2 -3
- package/src/drop-terms.js +2 -2
- package/src/field-008-18-34-character-groups.js +2 -2
- package/src/field-505-separators.js +2 -2
- package/src/field-521-fix.js +2 -2
- package/src/fix-33X.js +2 -2
- package/src/fix-language-codes.js +2 -2
- package/src/fix-sami-041.js +3 -3
- package/src/fixRelatorTerms.js +2 -2
- package/src/identical-fields.js +2 -3
- package/src/mergeRelatorTermFields.js +4 -4
- package/src/modernize-502.js +2 -2
- package/src/multiple-subfield-0.js +0 -1
- package/src/normalize-dashes.js +2 -2
- package/src/normalize-identifiers.js +2 -2
- package/src/normalize-qualifying-information.js +1 -2
- package/src/normalize-utf8-diacritics.js +2 -2
- package/src/normalizeFieldForComparison.js +3 -3
- package/src/punctuation/index.js +4 -9
- package/src/punctuation2.js +2 -2
- package/src/remove-041-zxx.js +2 -2
- package/src/sanitize-vocabulary-source-codes.js +2 -2
- package/src/sortFields.js +2 -2
- package/src/sortRelatorTerms.js +2 -2
- package/src/sortSubfields.js +2 -2
- package/src/subfieldValueNormalizations.js +2 -2
- package/src/sync-007-and-300.js +2 -2
- package/src/sync-language.js +2 -3
- package/src/translate-terms.js +1 -3
- package/dist/sort-tags.js +0 -41
- package/dist/sort-tags.js.map +0 -7
- package/dist/sort-tags.test.js +0 -261
- package/dist/sort-tags.test.js.map +0 -7
- package/src/sort-tags.js +0 -48
- package/src/sort-tags.test.js +0 -265
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/field-505-separators.js"],
|
|
4
|
-
"sourcesContent": ["//import createDebugLogger from 'debug';\nimport
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["//import createDebugLogger from 'debug';\n\nimport {fieldToString} from './utils.js';\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Normalize \" ; \" separators as \" -- \"',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n fix505(field);\n });\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields?.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = fix505(structuredClone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'TODO: ${orig}' => '${mod}'`);\n return;\n }\n return;\n }\n}\n\n\nfunction field505FixSubfieldA(field) {\n const a = field.subfields.filter(sf => sf.code === 'a');\n\n a.forEach(sf => fixSubfieldA(sf));\n\n function fixSubfieldA(a) {\n a.value = a.value.replace(/ ; /ug, ' -- ');\n }\n}\n\nfunction field505FixSubfieldTRG(field) {\n // Modify subfield if next subfield is $t:\n const subfieldsThatWillBeModified = field.subfields.filter((sf, i) => i + 1 < field.subfields.length && field.subfields[i + 1].code === 't');\n\n subfieldsThatWillBeModified.forEach(sf => fixSubfieldThatPrecedesT(sf));\n\n function fixSubfieldThatPrecedesT(sf) {\n if (!sf.value) {\n return;\n }\n sf.value = sf.value.replace(/ ;$/u, ' --');\n }\n}\n\nfunction fix505(field) {\n if (field.tag !== '505' || !field.subfields) {\n return field;\n }\n field505FixSubfieldTRG(field);\n field505FixSubfieldA(field);\n return field;\n}\n"],
|
|
5
|
+
"mappings": "AAEA,SAAQ,qBAAoB;AAG5B,0BAA2B;AAEzB,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IAAU;AAAA,EACZ;AAEA,WAAS,IAAI,QAAQ;AACnB,WAAO,OAAO,QAAQ,WAAS;AAC7B,aAAO,KAAK;AAAA,IACd,CAAC;AAED,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAC9C,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,QAAQ;AACxB,UAAM,MAAM,EAAC,SAAS,CAAC,EAAC;AAExB,WAAO,QAAQ,QAAQ,WAAS;AAC9B,oBAAc,OAAO,GAAG;AAAA,IAC1B,CAAC;AAED,QAAI,QAAQ,EAAE,IAAI,QAAQ,UAAU;AACpC,WAAO;AAAA,EACT;AAEA,WAAS,cAAc,OAAO,KAAK;AACjC,UAAM,OAAO,cAAc,KAAK;AAEhC,UAAM,kBAAkB,OAAO,gBAAgB,KAAK,CAAC;AACrD,UAAM,MAAM,cAAc,eAAe;AACzC,QAAI,SAAS,KAAK;AAChB,UAAI,QAAQ,KAAK,UAAU,IAAI,SAAS,GAAG,GAAG;AAC9C;AAAA,IACF;AACA;AAAA,EACF;AACF;AAGA,SAAS,qBAAqB,OAAO;AACnC,QAAM,IAAI,MAAM,UAAU,OAAO,QAAM,GAAG,SAAS,GAAG;AAEtD,IAAE,QAAQ,QAAM,aAAa,EAAE,CAAC;AAEhC,WAAS,aAAaA,IAAG;AACvB,IAAAA,GAAE,QAAQA,GAAE,MAAM,QAAQ,SAAS,MAAM;AAAA,EAC3C;AACF;AAEA,SAAS,uBAAuB,OAAO;AAErC,QAAM,8BAA8B,MAAM,UAAU,OAAO,CAAC,IAAI,MAAM,IAAI,IAAI,MAAM,UAAU,UAAU,MAAM,UAAU,IAAI,CAAC,EAAE,SAAS,GAAG;AAE3I,8BAA4B,QAAQ,QAAM,yBAAyB,EAAE,CAAC;AAEtE,WAAS,yBAAyB,IAAI;AACpC,QAAI,CAAC,GAAG,OAAO;AACb;AAAA,IACF;AACA,OAAG,QAAQ,GAAG,MAAM,QAAQ,QAAQ,KAAK;AAAA,EAC3C;AACF;AAEA,SAAS,OAAO,OAAO;AACrB,MAAI,MAAM,QAAQ,SAAS,CAAC,MAAM,WAAW;AAC3C,WAAO;AAAA,EACT;AACA,yBAAuB,KAAK;AAC5B,uBAAqB,KAAK;AAC1B,SAAO;AACT;",
|
|
6
6
|
"names": ["a"]
|
|
7
7
|
}
|
package/dist/field-521-fix.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import clone from "clone";
|
|
2
1
|
import { fieldToString } from "./utils.js";
|
|
3
2
|
export default function() {
|
|
4
3
|
return {
|
|
@@ -23,7 +22,7 @@ export default function() {
|
|
|
23
22
|
}
|
|
24
23
|
function validateField(field, res) {
|
|
25
24
|
const orig = fieldToString(field);
|
|
26
|
-
const normalizedField = fix521(
|
|
25
|
+
const normalizedField = fix521(structuredClone(field));
|
|
27
26
|
const mod = fieldToString(normalizedField);
|
|
28
27
|
if (orig !== mod) {
|
|
29
28
|
res.message.push(`'TODO: ${orig}' => '${mod}'`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/field-521-fix.js"],
|
|
4
|
-
"sourcesContent": ["//import createDebugLogger from 'debug';\nimport
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["//import createDebugLogger from 'debug';\n\nimport {fieldToString} from './utils.js';\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Various fixes for field 521',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n fix521(field);\n });\n // Fix always succeeds (even when it really does not):\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n record.fields?.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = fix521(structuredClone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'TODO: ${orig}' => '${mod}'`);\n return;\n }\n return;\n }\n}\n\nfunction fixSubfieldA(a) {\n a.value = a.value.\n // MET-332:\n replace(/^(Ik\u00E4suositus) ([0-9])/u, '$1: $2');\n}\n\nfunction fixSubfieldAInternalPunctuation(field) {\n const a = field.subfields.filter(sf => sf.code === 'a');\n\n a.forEach(sf => fixSubfieldA(sf));\n}\n\nfunction getIndicator1(field) {\n const [a] = field.subfields.filter(sf => sf.code === 'a');\n if (a) {\n if (a.value.match(/^Ik\u00E4suositus/u)) {\n return '1';\n }\n }\n return undefined;\n}\n\nfunction fixIndicator1(field) {\n const value = getIndicator1(field);\n if (value) {\n field.ind1 = value;\n return;\n }\n\n}\n\nfunction fix521(field) {\n if (field.tag !== '521' || !field.subfields) {\n return field;\n }\n fixIndicator1(field);\n fixSubfieldAInternalPunctuation(field);\n return field;\n}\n\n"],
|
|
5
|
+
"mappings": "AAEA,SAAQ,qBAAoB;AAG5B,0BAA2B;AAEzB,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IAAU;AAAA,EACZ;AAEA,WAAS,IAAI,QAAQ;AACnB,WAAO,OAAO,QAAQ,WAAS;AAC7B,aAAO,KAAK;AAAA,IACd,CAAC;AAED,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAC9C,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,QAAQ;AACxB,UAAM,MAAM,EAAC,SAAS,CAAC,EAAC;AASxB,WAAO,QAAQ,QAAQ,WAAS;AAC9B,oBAAc,OAAO,GAAG;AAAA,IAC1B,CAAC;AAED,QAAI,QAAQ,EAAE,IAAI,QAAQ,UAAU;AACpC,WAAO;AAAA,EACT;AAEA,WAAS,cAAc,OAAO,KAAK;AACjC,UAAM,OAAO,cAAc,KAAK;AAEhC,UAAM,kBAAkB,OAAO,gBAAgB,KAAK,CAAC;AACrD,UAAM,MAAM,cAAc,eAAe;AACzC,QAAI,SAAS,KAAK;AAChB,UAAI,QAAQ,KAAK,UAAU,IAAI,SAAS,GAAG,GAAG;AAC9C;AAAA,IACF;AACA;AAAA,EACF;AACF;AAEA,SAAS,aAAa,GAAG;AACvB,IAAE,QAAQ,EAAE,MAEV,QAAQ,2BAA2B,QAAQ;AAC/C;AAEA,SAAS,gCAAgC,OAAO;AAC9C,QAAM,IAAI,MAAM,UAAU,OAAO,QAAM,GAAG,SAAS,GAAG;AAEtD,IAAE,QAAQ,QAAM,aAAa,EAAE,CAAC;AAClC;AAEA,SAAS,cAAc,OAAO;AAC5B,QAAM,CAAC,CAAC,IAAI,MAAM,UAAU,OAAO,QAAM,GAAG,SAAS,GAAG;AACxD,MAAI,GAAG;AACL,QAAI,EAAE,MAAM,MAAM,eAAe,GAAG;AAClC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAO;AAC5B,QAAM,QAAQ,cAAc,KAAK;AACjC,MAAI,OAAO;AACT,UAAM,OAAO;AACb;AAAA,EACF;AAEF;AAEA,SAAS,OAAO,OAAO;AACrB,MAAI,MAAM,QAAQ,SAAS,CAAC,MAAM,WAAW;AAC3C,WAAO;AAAA,EACT;AACA,gBAAc,KAAK;AACnB,kCAAgC,KAAK;AACrC,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/fix-33X.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import createDebugLogger from "debug";
|
|
2
|
-
import clone from "clone";
|
|
3
2
|
import { fieldToString, getCatalogingLanguage, nvdebug } from "./utils.js";
|
|
4
3
|
import { map336CodeToTerm, map337CodeToTerm, map338CodeToTerm } from "./field33XUtils.js";
|
|
5
4
|
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:fix-33X");
|
|
@@ -388,7 +387,7 @@ export default function() {
|
|
|
388
387
|
return { message: [], valid: true };
|
|
389
388
|
}
|
|
390
389
|
const originalStrings = fields.map((f) => fieldToString(f));
|
|
391
|
-
const clonedFields = fields.map((f) =>
|
|
390
|
+
const clonedFields = fields.map((f) => structuredClone(f));
|
|
392
391
|
clonedFields.forEach((f) => fixField(f, catLang));
|
|
393
392
|
const modifiedStrings = clonedFields.map((f) => fieldToString(f));
|
|
394
393
|
const changes = originalStrings.map((str, i) => `'${str}' => '${modifiedStrings[i]}'`);
|
package/dist/fix-33X.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/fix-33X.js"],
|
|
4
|
-
"sourcesContent": ["import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString, getCatalogingLanguage, nvdebug} from './utils.js';\nimport {map336CodeToTerm, map337CodeToTerm, map338CodeToTerm} from './field33XUtils.js';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fix-33X');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst description = 'Fix non-RDA 33X field(s)';\n\nconst map336 = {\n 'Bild (kartografisk ; att vidra)': 'crt',\n 'Bild (kartografisk ; r\u00F6rlig)': 'crm',\n 'Bild (kartografisk)': 'cri',\n 'Bild (r\u00F6rlig ; tredimensionell)': 'tdm',\n 'Bild (r\u00F6rlig ; tv\u00E5dimensionell)': 'tdi',\n 'Bild (still ; att vidra)': 'tci',\n 'Bild (still ; tredimensionell)': 'sti',\n 'Bild (still)': 'sti',\n 'Data': 'cod',\n 'Data (kartografinen)': 'crd',\n 'Dataset': 'cod',\n 'Dataset (kartografisk)': 'crd',\n 'Datorprogram': 'cop',\n 'Esine': 'tdf',\n 'Esine (kartografinen ; kosketeltava)': 'crn',\n 'Esine (kartografinen)': 'crf',\n 'Esine (kartogragrafinen ; kolmiulotteinen)': 'crf',\n 'Esine (kolmiulotteinen)': 'tdf',\n 'Esine (kosketeltava)': 'tcf',\n 'Flera inneh\u00E5llstyper': 'zzz',\n 'F\u00F6remal': 'tdf',\n 'F\u00F6rem\u00E5l (att vidra)': 'tcf',\n 'F\u00F6rem\u00E5l (kartografisk ; att vidra)': 'crn',\n 'F\u00F6rem\u00E5l (kartografisk ; tredimensionell)': 'crn',\n 'F\u00F6rem\u00E5l (tredimensionell)': 'tdf',\n 'Ger\u00E4usche': 'snd',\n 'Kuva': 'sti',\n 'Kuva (kartografinen ; kosketeltava)': 'crt',\n 'Kuva (kartografinen ; liikkuva)': 'crm',\n 'Kuva (kartografinen)': 'cri',\n 'Kuva (liikkuva ; kaksiulotteinen)': 'tdi',\n 'Kuva (liikkuva ; kolmiulotteinen)': 'tdm',\n 'Kuva (still ; kaksiulotteinen)': 'sti',\n 'Kuva (still ; kolmiulotteinen)': 'sti',\n 'Kuva (still ; kosketeltava)': 'tci',\n 'Kuva (still)': 'sti',\n 'Liike (kosketeltava ; notatoitu)': 'tcn',\n 'Liike (notatoitu ; kosketeltava': 'tcn',\n 'Liike (notatoitu)': 'ntv',\n 'Ljud': 'snd',\n 'Musiikki (esitetty)': 'prm',\n 'Musiikki (kosketeltava ; notatoitu)': 'tcm',\n 'Musiikki (notatoitu ; kosketeltava)': 'tcm',\n 'Musiikki (notatoitu)': 'ntm',\n 'Musik (notation ; att vidra)': 'tcm',\n 'Musik (notation)': 'ntm',\n 'Musik (performance)': 'prm',\n 'M\u00E4\u00E4rittelem\u00E4t\u00F6n': 'zzz',\n 'M\u00E4\u00E4rittelem\u00E4t\u00F6n sis\u00E4lt\u00F6tyyppi': 'zzz',\n 'Obest\u00E4md inneh\u00E5llstyp': 'zzz',\n 'Ospecificerad inneh\u00E5llstyp': 'zzz',\n 'Puhe': 'spw',\n 'R\u00F6relse (notation ; att vidra)': 'tcn',\n 'R\u00F6relse (notation)': 'ntv',\n 'Tal': 'spw',\n 'Teksti': 'txt',\n 'Teksti (kosketeltava); Text (att vidra)': 'tct',\n 'Text': 'txt',\n 'Tietokoneohjelma': 'cop',\n 'Useita sis\u00E4lt\u00F6tyyppej\u00E4': 'zzz',\n 'Vild (still ; tv\u00E5dimensionell)': 'sti',\n 'annan': 'xxx',\n 'cartographic dataset': 'crd',\n 'cartographic image': 'cri',\n 'cartographic moving image': 'crm',\n 'cartographic tactile image': 'crt',\n 'cartographic tactile three-dimensional form': 'crn',\n 'cartographic three-dimensional form': 'crf',\n 'cartographic three-dimensional tactile form': 'crn',\n 'computer dataset': 'cod',\n 'computer program': 'cop',\n 'dataset': 'cod',\n 'datorprogram': 'cop',\n 'digitaalinen data': 'cod',\n 'digitalt dataset': 'cod',\n 'esitetty musiikki': 'prm',\n 'framf\u00F6rd musik': 'prm',\n 'gesprochenes Wort': 'spw',\n 'kaksiulotteinen liikkuva kuva': 'tdi',\n 'kartografinen data': 'crd',\n 'kartografinen kolmiulotteinen muoto': 'crf',\n 'kartografinen kuva': 'cri',\n 'kartografinen liikkuva kuva': 'crm',\n 'kartografinen taktiili kolmiulotteinen muoto': 'crn',\n 'kartografinen taktiili kuva': 'crt',\n 'kartografisk bild': 'cri',\n 'kartografisk data': 'crd',\n 'kartografisk r\u00F6rlig bild': 'crm',\n 'kartografisk taktil bild': 'crt',\n 'kartografisk taktil tredimensionell form': 'crn',\n 'kartografisk tredimensionell form': 'crf',\n 'kolmiulotteinen liikkuva kuva': 'tdm',\n 'kolmiulotteinen muoto': 'tdf',\n 'liikenotaatio': 'ntv',\n 'ljud': 'snd',\n 'muu': 'xxx',\n 'm\u00E4\u00E4rittelem\u00E4t\u00F6n': 'zzz',\n 'notated movement': 'ntv',\n 'notated music': 'ntm',\n 'noterad musik': 'ntm',\n 'nuottikirjoitus': 'ntm',\n 'ospecificerad': 'zzz',\n 'other': 'xxx',\n 'performed music': 'prm',\n 'puhe': 'spw',\n 'r\u00F6relsenotation': 'ntv',\n 'sounds': 'snd',\n 'spoken word': 'spw',\n 'still image': 'sti',\n 'stillbild': 'sti',\n 'stillkuva': 'sti',\n 'tactile image': 'tci',\n 'tactile notated movement': 'tcn',\n 'tactile notated music': 'tcm',\n 'tactile text': 'tct',\n 'tactile three-dimensional form': 'tcf',\n 'taktiili kolmiulotteinen muoto': 'tcf',\n 'taktiili kuva': 'tci',\n 'taktiili liikenotaatio': 'tcn',\n 'taktiili nuottikirjoitus': 'tcm',\n 'taktiili teksti': 'tct',\n 'taktil bild': 'tci',\n 'taktil musiknotation': 'tcm',\n 'taktil noterad r\u00F6relse': 'tcn',\n 'taktil text': 'tct',\n 'taktil tredimensionell form': 'tcf',\n 'tal': 'spw',\n 'teksti': 'txt',\n 'text': 'txt',\n 'texte': 'txt',\n 'texte tactile': 'tct',\n 'three-dimensional form': 'tdf',\n 'three-dimensional moving image': 'tdm',\n 'tietokoneohjelma': 'cop',\n 'tredimensionell form': 'tdf',\n 'tredimensionell r\u00F6rlig bild': 'tdm',\n 'tv\u00E5dimensionell r\u00F6rlig bild': 'tdi',\n 'two-dimensional moving image': 'tdi',\n 'unbewegtes Bild': 'sti',\n 'unspecified': 'zzz',\n '\u00C4\u00E4ni': 'snd',\n '\u00E4\u00E4ni': 'snd',\n '\u042D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u0430\u044F \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430': 'cop', // computer program\n '\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 (\u043A\u0430\u0440\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u043E\u0435)': 'cri',\n '\u041C\u0443\u0437\u044B\u043A\u0430 (\u0437\u043D\u0430\u043A\u043E\u0432\u0430\u044F)': 'ntm', // notated music\n '\u041C\u0443\u0437\u044B\u043A\u0430 (\u0438\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0430\u044F)': 'prm', // performed music\n '\u0423\u0441\u0442\u043D\u0430\u044F \u0440\u0435\u0447\u044C': 'spw',\n '\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 (\u043D\u0435\u043F\u043E\u0434\u0432\u0438\u0436\u043D\u043E\u0435)': 'sti',\n '\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 (\u0434\u0432\u0438\u0436\u0443\u0449\u0435\u0435\u0441\u044F)': 'tdi', // 2D moving image\n '\u0422\u0435\u043A\u0441\u0442': 'txt',\n '\u0422\u0435\u043A\u0441\u0442 (\u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u044B\u0439)': 'txt'\n};\n\nconst map337 = {\n 'Computermedien': 'c',\n 'Mikroform': 'h',\n 'annan': 'x',\n 'audio': 's',\n 'computer': 'c',\n 'dator': 'c',\n 'datoranv\u00E4ndbar': 'c',\n 'ei v\u00E4litt\u00E4v\u00E4\u00E4 laitetta': 'n',\n 'elektroninen': 'c',\n 'elektronisk': 'c',\n 'heijastettava': 'g',\n 'ingen medietyp': 'n',\n 'k\u00E4ytett\u00E4viss\u00E4 ilman laitetta': 'n',\n 'microform': 'h',\n 'microscopic': 'p',\n 'mikroform': 'h',\n 'mikromuoto': 'h',\n 'mikroskooppinen': 'p',\n 'mikroskopisch': 'p',\n 'mikroskopisk': 'p',\n 'muu': 'x',\n 'm\u00E4\u00E4rittelem\u00E4t\u00F6n': 'z',\n 'm\u00E4\u00E4rittelem\u00E4t\u00F6n v\u00E4litt\u00E4v\u00E4 laite': 'z',\n 'of\u00F6rmedlad': 'n',\n 'ohne Hilfsmittel zu benutzen': 'n',\n 'omedierad': 'n',\n 'ospecificerad': 'z',\n 'ospecificerad medietyp': 'z',\n 'other': 'x',\n 'projected': 'g',\n 'projektion': 'g',\n 'projicerad': 'g',\n 'projicerbar': 'g',\n 'projizierbar': 'g',\n 'stereografinen': 'e',\n 'stereografisch': 'e',\n 'stereografisk': 'e',\n 'stereographic': 'e',\n 'tietokonek\u00E4ytt\u00F6inen': 'c',\n 'unmediated': 'n',\n 'unspecified': 'z',\n 'useita mediatyyppej\u00E4': 'z',\n 'video': 'v',\n '\u00F6vrig': 'x',\n // Cyrillic (sorted by result):\n '\u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D': 'c',\n '\u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u044B\u0439': 'c',\n '\u043D\u0435\u043F\u043E\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043D\u043D': 'n',\n '\u043D\u0435\u043F\u043E\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439': 'n',\n '\u0430\u0443\u0434\u0438\u043E': 's', // audio\n '\u0432\u0438\u0434\u0435\u043E': 'v'\n};\n\nconst map338 = {\n 'aperture card': 'ha',\n 'ark': 'nb',\n 'arkki': 'nb',\n 'audio belt': 'sb',\n 'audio cartridge': 'sg',\n 'audio cylinder': 'se',\n 'audio disc': 'sd',\n 'audio roll': 'sq',\n 'audio wire reel': 'sw',\n 'audiocassette': 'ss',\n 'audiotape reel': 'st',\n 'bildband': 'gf',\n 'bildbandsmagasin': 'gc',\n 'bl\u00E4dderblock': 'nn',\n 'card': 'no',\n 'computer card': 'ck',\n 'computer cartridge': 'cb',\n 'computer disc': 'cd',\n 'computer disc cartridge': 'ce',\n 'computer tape cartridge': 'ca',\n 'computer tape cassette': 'cf',\n 'computer tape reel': 'ch',\n 'datorbandmagasin': 'ca',\n 'datorbandspole': 'ch',\n 'datorkassett': 'cf',\n 'datorkort': 'ck',\n 'datorminnesmodul': 'cb',\n 'datorskiva': 'cd',\n 'datorskivmagasin': 'ce',\n 'dia': 'gs',\n 'diabild': 'gs',\n 'film cartridge': 'mc',\n 'film cassette': 'mf',\n 'film reel': 'mr',\n 'film roll': 'mo',\n 'filmikasetti': 'mf',\n 'filmikela': 'mr',\n 'filmiliuska': 'gd',\n 'filmirulla': 'mo',\n 'filmisilmukkakasetti': 'mc',\n 'filmkassett': 'mf',\n 'filmljudspole': 'si',\n 'filmmagasin': 'mc',\n 'filmremsa': 'gd',\n 'filmrulle': 'mo',\n 'filmslip': 'gd',\n 'filmspole': 'mr',\n 'filmstrip': 'gf',\n 'filmstrip cartridge': 'gc',\n 'flipchart': 'nn',\n 'f\u00F6nsterkort': 'ha',\n 'f\u00F6rem\u00E5l': 'nr',\n 'ikkunakortti': 'ha',\n 'kort': 'no',\n 'kortti': 'no',\n 'lehti\u00F6taulu': 'nn',\n 'ljudcylinder': 'se',\n 'ljudkassett': 'ss',\n 'ljudmagasin': 'sg',\n 'ljudrulle': 'sq',\n 'ljudskiva': 'sd',\n 'ljudslinga': 'sb',\n 'ljudspole': 'st',\n 'ljudtr\u00E5d': 'sw',\n 'microfiche': 'he',\n 'microfiche cassette': 'hf',\n 'microfilm cartridge': 'hb',\n 'microfilm cassette': 'hc',\n 'microfilm reel': 'hd',\n 'microfilm roll': 'hj',\n 'microfilm slip': 'hh',\n 'microopaque': 'hg',\n 'microscope slide': 'pp',\n 'mikrofiche': 'he',\n 'mikrofiche (ogenomskinlig)': 'hg',\n 'mikrofichekassett': 'hf',\n 'mikrofilmikasetti': 'hc',\n 'mikrofilmikela': 'hd',\n 'mikrofilmiliuska': 'hh',\n 'mikrofilmirulla': 'hj',\n 'mikrofilmisilmukkakasetti': 'hb',\n 'mikrofilmskassett': 'hc',\n 'mikrofilmsmagasin': 'hb',\n 'mikrofilmsremsa': 'hh',\n 'mikrofilmsrulle': 'hj',\n 'mikrofilmsspole': 'hd',\n 'mikrokortti': 'he',\n 'mikrokortti (l\u00E4pin\u00E4kym\u00E4t\u00F6n)': 'hg',\n 'mikrokorttikasetti': 'hf',\n 'mikroskoperingspreparat': 'pp',\n 'muistikortti': 'ck',\n 'm\u00E4\u00E4rittelem\u00E4t\u00F6n': 'zu',\n 'nide': 'nc',\n 'object': 'nr',\n 'objekti': 'nr',\n 'online resource': 'cr',\n 'onlineresurs': 'cr',\n 'ospecificerad': 'zu',\n 'overhead transparency': 'gt',\n 'piirikotelo': 'cb',\n 'piirtoheitinkalvo': 'gt',\n 'preparaattilasi': 'pp',\n 'raina': 'gf',\n 'rainakasetti': 'gc',\n 'roll': 'na',\n 'rulla': 'na',\n 'rulle': 'na',\n 'sheet': 'nb',\n 'slide': 'gs',\n 'sound-track reel': 'si',\n 'stereografinen kortti': 'eh',\n 'stereografinen levy': 'es',\n 'stereografisk skiva': 'es',\n 'stereografiskt kort': 'eh',\n 'stereograph card': 'eh',\n 'stereograph disc': 'es',\n 'tietokasetti': 'cf',\n 'tietolevy': 'cd',\n 'tietolevykotelo': 'ce',\n 'tietonauhakela': 'ch',\n 'tietonauhan silmukkakasetti': 'ca',\n 'transparang': 'gt',\n 'unspecified': 'zu',\n 'verkkoaineisto': 'cr',\n 'video cartridge': 'vc',\n 'videocassette': 'vf',\n 'videodisc': 'vd',\n 'videokasetti': 'vf',\n 'videokassett': 'vf',\n 'videokela': 'vr',\n 'videolevy': 'vd',\n 'videomagasin': 'vc',\n 'videosilmukkakasetti': 'vc',\n 'videoskiva': 'vd',\n 'videospole': 'vr',\n 'videotape reel': 'vr',\n 'volume': 'nc',\n 'volym': 'nc',\n '\u00E4\u00E4nihihna': 'sb',\n '\u00E4\u00E4nikasetti': 'ss',\n '\u00E4\u00E4nikela': 'st',\n '\u00E4\u00E4nilankakela': 'sw',\n '\u00E4\u00E4nilevy': 'sd',\n '\u00E4\u00E4niraitakela': 'si',\n '\u00E4\u00E4nirulla': 'sq',\n '\u00E4\u00E4nisilmukkakasetti': 'sg',\n '\u00E4\u00E4nisylinteri': 'se'\n};\n\n// const multimediaRegexp = /multimedia/ui;\n\n// eslint-disable-next-line max-lines-per-function\nexport default function () {\n\n return {\n description, validate, fix\n };\n\n function fix(record) {\n nvdebug(`FIX ${description}...`, debugDev);\n const catLang = getCatalogingLanguage(record) || 'fin';\n const fields = getRelevantFields(record);\n fields.forEach(f => fixField(f, catLang));\n nvdebug(` GOT ${fields.length}...`, debugDev);\n // FFS: we actually need newFields array here! Videogame, for example, might be\n // 336 ## \u2021a kaksiulotteinen liikkuva kuva \u2021b tdi \u20212 rdacontent\n // 336 ## \u2021a tietokoneohjelma \u2021b cop \u20212 rdacontent\n const res = {message: [], fix: [], valid: true};\n\n return res;\n }\n\n function validate(record) {\n nvdebug(`VALIDATE ${description}...`, debugDev); // NOT READY YET\n const catLang = getCatalogingLanguage(record) || 'fin';\n const fields = getRelevantFields(record);\n if (fields.length === 0) {\n return {message: [], valid: true};\n }\n const originalStrings = fields.map(f => fieldToString(f));\n const clonedFields = fields.map(f => clone(f));\n clonedFields.forEach(f => fixField(f, catLang));\n const modifiedStrings = clonedFields.map(f => fieldToString(f));\n\n const changes = originalStrings.map((str, i) => `'${str}' => '${modifiedStrings[i]}'`);\n\n return {message: changes, valid: false};\n }\n\n\n function getA(field) {\n const as = field.subfields.filter(f => f.code === 'a');\n if (as.length === 1) {\n return as[0];\n }\n return undefined;\n }\n\n\n function mapTermToCode(term, tag) {\n nvdebug(`TERM/${tag}: '${term}'`, debugDev);\n if (tag === '336' && term in map336) {\n return map336[term];\n }\n if (tag === '337' && term in map337) {\n return map337[term];\n }\n if (tag === '338' && term in map338) {\n return map338[term];\n }\n return undefined;\n }\n\n function mapFieldToCode(field) {\n const subfieldA = getA(field);\n if (subfieldA) {\n return mapTermToCode(subfieldA.value, field.tag);\n }\n return undefined;\n }\n\n function getRelevantFields(record) {\n const fields = record.get('33[678]');\n // Currently not handline $3 etc\n return fields.filter(f => f.subfields.length === 1 && mapFieldToCode(f));\n }\n\n function tagToSubfield2(tag) {\n if (tag === '336') {\n return {'code': '2', 'value': 'rdacontent'};\n }\n if (tag === '337') {\n return {'code': '2', 'value': 'rdamedia'};\n }\n if (tag === '338') {\n return {'code': '2', 'value': 'rdacarrier'};\n }\n }\n\n function fixField(field, catalogingLanguage = 'fin') {\n const subfieldA = getA(field);\n if (!subfieldA) {\n return;\n }\n const code = mapTermToCode(subfieldA.value, field.tag);\n if (!code) {\n return;\n }\n const newTerm = codeToTerm(code);\n if (!newTerm) {\n return;\n }\n\n subfieldA.value = newTerm;\n field.subfields.push({'code': 'b', 'value': code});\n field.subfields.push(tagToSubfield2(field.tag));\n\n function codeToTerm(code) {\n if (field.tag === '336') {\n return map336CodeToTerm(code, catalogingLanguage);\n }\n if (field.tag === '337') {\n return map337CodeToTerm(code, catalogingLanguage);\n }\n if (field.tag === '338') {\n return map338CodeToTerm(code, catalogingLanguage);\n }\n return undefined;\n }\n }\n\n}\n\n"],
|
|
5
|
-
"mappings": "AAAA,OAAO,uBAAuB;
|
|
4
|
+
"sourcesContent": ["import createDebugLogger from 'debug';\n\nimport {fieldToString, getCatalogingLanguage, nvdebug} from './utils.js';\nimport {map336CodeToTerm, map337CodeToTerm, map338CodeToTerm} from './field33XUtils.js';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fix-33X');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst description = 'Fix non-RDA 33X field(s)';\n\nconst map336 = {\n 'Bild (kartografisk ; att vidra)': 'crt',\n 'Bild (kartografisk ; r\u00F6rlig)': 'crm',\n 'Bild (kartografisk)': 'cri',\n 'Bild (r\u00F6rlig ; tredimensionell)': 'tdm',\n 'Bild (r\u00F6rlig ; tv\u00E5dimensionell)': 'tdi',\n 'Bild (still ; att vidra)': 'tci',\n 'Bild (still ; tredimensionell)': 'sti',\n 'Bild (still)': 'sti',\n 'Data': 'cod',\n 'Data (kartografinen)': 'crd',\n 'Dataset': 'cod',\n 'Dataset (kartografisk)': 'crd',\n 'Datorprogram': 'cop',\n 'Esine': 'tdf',\n 'Esine (kartografinen ; kosketeltava)': 'crn',\n 'Esine (kartografinen)': 'crf',\n 'Esine (kartogragrafinen ; kolmiulotteinen)': 'crf',\n 'Esine (kolmiulotteinen)': 'tdf',\n 'Esine (kosketeltava)': 'tcf',\n 'Flera inneh\u00E5llstyper': 'zzz',\n 'F\u00F6remal': 'tdf',\n 'F\u00F6rem\u00E5l (att vidra)': 'tcf',\n 'F\u00F6rem\u00E5l (kartografisk ; att vidra)': 'crn',\n 'F\u00F6rem\u00E5l (kartografisk ; tredimensionell)': 'crn',\n 'F\u00F6rem\u00E5l (tredimensionell)': 'tdf',\n 'Ger\u00E4usche': 'snd',\n 'Kuva': 'sti',\n 'Kuva (kartografinen ; kosketeltava)': 'crt',\n 'Kuva (kartografinen ; liikkuva)': 'crm',\n 'Kuva (kartografinen)': 'cri',\n 'Kuva (liikkuva ; kaksiulotteinen)': 'tdi',\n 'Kuva (liikkuva ; kolmiulotteinen)': 'tdm',\n 'Kuva (still ; kaksiulotteinen)': 'sti',\n 'Kuva (still ; kolmiulotteinen)': 'sti',\n 'Kuva (still ; kosketeltava)': 'tci',\n 'Kuva (still)': 'sti',\n 'Liike (kosketeltava ; notatoitu)': 'tcn',\n 'Liike (notatoitu ; kosketeltava': 'tcn',\n 'Liike (notatoitu)': 'ntv',\n 'Ljud': 'snd',\n 'Musiikki (esitetty)': 'prm',\n 'Musiikki (kosketeltava ; notatoitu)': 'tcm',\n 'Musiikki (notatoitu ; kosketeltava)': 'tcm',\n 'Musiikki (notatoitu)': 'ntm',\n 'Musik (notation ; att vidra)': 'tcm',\n 'Musik (notation)': 'ntm',\n 'Musik (performance)': 'prm',\n 'M\u00E4\u00E4rittelem\u00E4t\u00F6n': 'zzz',\n 'M\u00E4\u00E4rittelem\u00E4t\u00F6n sis\u00E4lt\u00F6tyyppi': 'zzz',\n 'Obest\u00E4md inneh\u00E5llstyp': 'zzz',\n 'Ospecificerad inneh\u00E5llstyp': 'zzz',\n 'Puhe': 'spw',\n 'R\u00F6relse (notation ; att vidra)': 'tcn',\n 'R\u00F6relse (notation)': 'ntv',\n 'Tal': 'spw',\n 'Teksti': 'txt',\n 'Teksti (kosketeltava); Text (att vidra)': 'tct',\n 'Text': 'txt',\n 'Tietokoneohjelma': 'cop',\n 'Useita sis\u00E4lt\u00F6tyyppej\u00E4': 'zzz',\n 'Vild (still ; tv\u00E5dimensionell)': 'sti',\n 'annan': 'xxx',\n 'cartographic dataset': 'crd',\n 'cartographic image': 'cri',\n 'cartographic moving image': 'crm',\n 'cartographic tactile image': 'crt',\n 'cartographic tactile three-dimensional form': 'crn',\n 'cartographic three-dimensional form': 'crf',\n 'cartographic three-dimensional tactile form': 'crn',\n 'computer dataset': 'cod',\n 'computer program': 'cop',\n 'dataset': 'cod',\n 'datorprogram': 'cop',\n 'digitaalinen data': 'cod',\n 'digitalt dataset': 'cod',\n 'esitetty musiikki': 'prm',\n 'framf\u00F6rd musik': 'prm',\n 'gesprochenes Wort': 'spw',\n 'kaksiulotteinen liikkuva kuva': 'tdi',\n 'kartografinen data': 'crd',\n 'kartografinen kolmiulotteinen muoto': 'crf',\n 'kartografinen kuva': 'cri',\n 'kartografinen liikkuva kuva': 'crm',\n 'kartografinen taktiili kolmiulotteinen muoto': 'crn',\n 'kartografinen taktiili kuva': 'crt',\n 'kartografisk bild': 'cri',\n 'kartografisk data': 'crd',\n 'kartografisk r\u00F6rlig bild': 'crm',\n 'kartografisk taktil bild': 'crt',\n 'kartografisk taktil tredimensionell form': 'crn',\n 'kartografisk tredimensionell form': 'crf',\n 'kolmiulotteinen liikkuva kuva': 'tdm',\n 'kolmiulotteinen muoto': 'tdf',\n 'liikenotaatio': 'ntv',\n 'ljud': 'snd',\n 'muu': 'xxx',\n 'm\u00E4\u00E4rittelem\u00E4t\u00F6n': 'zzz',\n 'notated movement': 'ntv',\n 'notated music': 'ntm',\n 'noterad musik': 'ntm',\n 'nuottikirjoitus': 'ntm',\n 'ospecificerad': 'zzz',\n 'other': 'xxx',\n 'performed music': 'prm',\n 'puhe': 'spw',\n 'r\u00F6relsenotation': 'ntv',\n 'sounds': 'snd',\n 'spoken word': 'spw',\n 'still image': 'sti',\n 'stillbild': 'sti',\n 'stillkuva': 'sti',\n 'tactile image': 'tci',\n 'tactile notated movement': 'tcn',\n 'tactile notated music': 'tcm',\n 'tactile text': 'tct',\n 'tactile three-dimensional form': 'tcf',\n 'taktiili kolmiulotteinen muoto': 'tcf',\n 'taktiili kuva': 'tci',\n 'taktiili liikenotaatio': 'tcn',\n 'taktiili nuottikirjoitus': 'tcm',\n 'taktiili teksti': 'tct',\n 'taktil bild': 'tci',\n 'taktil musiknotation': 'tcm',\n 'taktil noterad r\u00F6relse': 'tcn',\n 'taktil text': 'tct',\n 'taktil tredimensionell form': 'tcf',\n 'tal': 'spw',\n 'teksti': 'txt',\n 'text': 'txt',\n 'texte': 'txt',\n 'texte tactile': 'tct',\n 'three-dimensional form': 'tdf',\n 'three-dimensional moving image': 'tdm',\n 'tietokoneohjelma': 'cop',\n 'tredimensionell form': 'tdf',\n 'tredimensionell r\u00F6rlig bild': 'tdm',\n 'tv\u00E5dimensionell r\u00F6rlig bild': 'tdi',\n 'two-dimensional moving image': 'tdi',\n 'unbewegtes Bild': 'sti',\n 'unspecified': 'zzz',\n '\u00C4\u00E4ni': 'snd',\n '\u00E4\u00E4ni': 'snd',\n '\u042D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u0430\u044F \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430': 'cop', // computer program\n '\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 (\u043A\u0430\u0440\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u043E\u0435)': 'cri',\n '\u041C\u0443\u0437\u044B\u043A\u0430 (\u0437\u043D\u0430\u043A\u043E\u0432\u0430\u044F)': 'ntm', // notated music\n '\u041C\u0443\u0437\u044B\u043A\u0430 (\u0438\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0430\u044F)': 'prm', // performed music\n '\u0423\u0441\u0442\u043D\u0430\u044F \u0440\u0435\u0447\u044C': 'spw',\n '\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 (\u043D\u0435\u043F\u043E\u0434\u0432\u0438\u0436\u043D\u043E\u0435)': 'sti',\n '\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 (\u0434\u0432\u0438\u0436\u0443\u0449\u0435\u0435\u0441\u044F)': 'tdi', // 2D moving image\n '\u0422\u0435\u043A\u0441\u0442': 'txt',\n '\u0422\u0435\u043A\u0441\u0442 (\u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u044B\u0439)': 'txt'\n};\n\nconst map337 = {\n 'Computermedien': 'c',\n 'Mikroform': 'h',\n 'annan': 'x',\n 'audio': 's',\n 'computer': 'c',\n 'dator': 'c',\n 'datoranv\u00E4ndbar': 'c',\n 'ei v\u00E4litt\u00E4v\u00E4\u00E4 laitetta': 'n',\n 'elektroninen': 'c',\n 'elektronisk': 'c',\n 'heijastettava': 'g',\n 'ingen medietyp': 'n',\n 'k\u00E4ytett\u00E4viss\u00E4 ilman laitetta': 'n',\n 'microform': 'h',\n 'microscopic': 'p',\n 'mikroform': 'h',\n 'mikromuoto': 'h',\n 'mikroskooppinen': 'p',\n 'mikroskopisch': 'p',\n 'mikroskopisk': 'p',\n 'muu': 'x',\n 'm\u00E4\u00E4rittelem\u00E4t\u00F6n': 'z',\n 'm\u00E4\u00E4rittelem\u00E4t\u00F6n v\u00E4litt\u00E4v\u00E4 laite': 'z',\n 'of\u00F6rmedlad': 'n',\n 'ohne Hilfsmittel zu benutzen': 'n',\n 'omedierad': 'n',\n 'ospecificerad': 'z',\n 'ospecificerad medietyp': 'z',\n 'other': 'x',\n 'projected': 'g',\n 'projektion': 'g',\n 'projicerad': 'g',\n 'projicerbar': 'g',\n 'projizierbar': 'g',\n 'stereografinen': 'e',\n 'stereografisch': 'e',\n 'stereografisk': 'e',\n 'stereographic': 'e',\n 'tietokonek\u00E4ytt\u00F6inen': 'c',\n 'unmediated': 'n',\n 'unspecified': 'z',\n 'useita mediatyyppej\u00E4': 'z',\n 'video': 'v',\n '\u00F6vrig': 'x',\n // Cyrillic (sorted by result):\n '\u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D': 'c',\n '\u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u044B\u0439': 'c',\n '\u043D\u0435\u043F\u043E\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043D\u043D': 'n',\n '\u043D\u0435\u043F\u043E\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439': 'n',\n '\u0430\u0443\u0434\u0438\u043E': 's', // audio\n '\u0432\u0438\u0434\u0435\u043E': 'v'\n};\n\nconst map338 = {\n 'aperture card': 'ha',\n 'ark': 'nb',\n 'arkki': 'nb',\n 'audio belt': 'sb',\n 'audio cartridge': 'sg',\n 'audio cylinder': 'se',\n 'audio disc': 'sd',\n 'audio roll': 'sq',\n 'audio wire reel': 'sw',\n 'audiocassette': 'ss',\n 'audiotape reel': 'st',\n 'bildband': 'gf',\n 'bildbandsmagasin': 'gc',\n 'bl\u00E4dderblock': 'nn',\n 'card': 'no',\n 'computer card': 'ck',\n 'computer cartridge': 'cb',\n 'computer disc': 'cd',\n 'computer disc cartridge': 'ce',\n 'computer tape cartridge': 'ca',\n 'computer tape cassette': 'cf',\n 'computer tape reel': 'ch',\n 'datorbandmagasin': 'ca',\n 'datorbandspole': 'ch',\n 'datorkassett': 'cf',\n 'datorkort': 'ck',\n 'datorminnesmodul': 'cb',\n 'datorskiva': 'cd',\n 'datorskivmagasin': 'ce',\n 'dia': 'gs',\n 'diabild': 'gs',\n 'film cartridge': 'mc',\n 'film cassette': 'mf',\n 'film reel': 'mr',\n 'film roll': 'mo',\n 'filmikasetti': 'mf',\n 'filmikela': 'mr',\n 'filmiliuska': 'gd',\n 'filmirulla': 'mo',\n 'filmisilmukkakasetti': 'mc',\n 'filmkassett': 'mf',\n 'filmljudspole': 'si',\n 'filmmagasin': 'mc',\n 'filmremsa': 'gd',\n 'filmrulle': 'mo',\n 'filmslip': 'gd',\n 'filmspole': 'mr',\n 'filmstrip': 'gf',\n 'filmstrip cartridge': 'gc',\n 'flipchart': 'nn',\n 'f\u00F6nsterkort': 'ha',\n 'f\u00F6rem\u00E5l': 'nr',\n 'ikkunakortti': 'ha',\n 'kort': 'no',\n 'kortti': 'no',\n 'lehti\u00F6taulu': 'nn',\n 'ljudcylinder': 'se',\n 'ljudkassett': 'ss',\n 'ljudmagasin': 'sg',\n 'ljudrulle': 'sq',\n 'ljudskiva': 'sd',\n 'ljudslinga': 'sb',\n 'ljudspole': 'st',\n 'ljudtr\u00E5d': 'sw',\n 'microfiche': 'he',\n 'microfiche cassette': 'hf',\n 'microfilm cartridge': 'hb',\n 'microfilm cassette': 'hc',\n 'microfilm reel': 'hd',\n 'microfilm roll': 'hj',\n 'microfilm slip': 'hh',\n 'microopaque': 'hg',\n 'microscope slide': 'pp',\n 'mikrofiche': 'he',\n 'mikrofiche (ogenomskinlig)': 'hg',\n 'mikrofichekassett': 'hf',\n 'mikrofilmikasetti': 'hc',\n 'mikrofilmikela': 'hd',\n 'mikrofilmiliuska': 'hh',\n 'mikrofilmirulla': 'hj',\n 'mikrofilmisilmukkakasetti': 'hb',\n 'mikrofilmskassett': 'hc',\n 'mikrofilmsmagasin': 'hb',\n 'mikrofilmsremsa': 'hh',\n 'mikrofilmsrulle': 'hj',\n 'mikrofilmsspole': 'hd',\n 'mikrokortti': 'he',\n 'mikrokortti (l\u00E4pin\u00E4kym\u00E4t\u00F6n)': 'hg',\n 'mikrokorttikasetti': 'hf',\n 'mikroskoperingspreparat': 'pp',\n 'muistikortti': 'ck',\n 'm\u00E4\u00E4rittelem\u00E4t\u00F6n': 'zu',\n 'nide': 'nc',\n 'object': 'nr',\n 'objekti': 'nr',\n 'online resource': 'cr',\n 'onlineresurs': 'cr',\n 'ospecificerad': 'zu',\n 'overhead transparency': 'gt',\n 'piirikotelo': 'cb',\n 'piirtoheitinkalvo': 'gt',\n 'preparaattilasi': 'pp',\n 'raina': 'gf',\n 'rainakasetti': 'gc',\n 'roll': 'na',\n 'rulla': 'na',\n 'rulle': 'na',\n 'sheet': 'nb',\n 'slide': 'gs',\n 'sound-track reel': 'si',\n 'stereografinen kortti': 'eh',\n 'stereografinen levy': 'es',\n 'stereografisk skiva': 'es',\n 'stereografiskt kort': 'eh',\n 'stereograph card': 'eh',\n 'stereograph disc': 'es',\n 'tietokasetti': 'cf',\n 'tietolevy': 'cd',\n 'tietolevykotelo': 'ce',\n 'tietonauhakela': 'ch',\n 'tietonauhan silmukkakasetti': 'ca',\n 'transparang': 'gt',\n 'unspecified': 'zu',\n 'verkkoaineisto': 'cr',\n 'video cartridge': 'vc',\n 'videocassette': 'vf',\n 'videodisc': 'vd',\n 'videokasetti': 'vf',\n 'videokassett': 'vf',\n 'videokela': 'vr',\n 'videolevy': 'vd',\n 'videomagasin': 'vc',\n 'videosilmukkakasetti': 'vc',\n 'videoskiva': 'vd',\n 'videospole': 'vr',\n 'videotape reel': 'vr',\n 'volume': 'nc',\n 'volym': 'nc',\n '\u00E4\u00E4nihihna': 'sb',\n '\u00E4\u00E4nikasetti': 'ss',\n '\u00E4\u00E4nikela': 'st',\n '\u00E4\u00E4nilankakela': 'sw',\n '\u00E4\u00E4nilevy': 'sd',\n '\u00E4\u00E4niraitakela': 'si',\n '\u00E4\u00E4nirulla': 'sq',\n '\u00E4\u00E4nisilmukkakasetti': 'sg',\n '\u00E4\u00E4nisylinteri': 'se'\n};\n\n// const multimediaRegexp = /multimedia/ui;\n\n// eslint-disable-next-line max-lines-per-function\nexport default function () {\n\n return {\n description, validate, fix\n };\n\n function fix(record) {\n nvdebug(`FIX ${description}...`, debugDev);\n const catLang = getCatalogingLanguage(record) || 'fin';\n const fields = getRelevantFields(record);\n fields.forEach(f => fixField(f, catLang));\n nvdebug(` GOT ${fields.length}...`, debugDev);\n // FFS: we actually need newFields array here! Videogame, for example, might be\n // 336 ## \u2021a kaksiulotteinen liikkuva kuva \u2021b tdi \u20212 rdacontent\n // 336 ## \u2021a tietokoneohjelma \u2021b cop \u20212 rdacontent\n const res = {message: [], fix: [], valid: true};\n\n return res;\n }\n\n function validate(record) {\n nvdebug(`VALIDATE ${description}...`, debugDev); // NOT READY YET\n const catLang = getCatalogingLanguage(record) || 'fin';\n const fields = getRelevantFields(record);\n if (fields.length === 0) {\n return {message: [], valid: true};\n }\n const originalStrings = fields.map(f => fieldToString(f));\n const clonedFields = fields.map(f => structuredClone(f));\n clonedFields.forEach(f => fixField(f, catLang));\n const modifiedStrings = clonedFields.map(f => fieldToString(f));\n\n const changes = originalStrings.map((str, i) => `'${str}' => '${modifiedStrings[i]}'`);\n\n return {message: changes, valid: false};\n }\n\n\n function getA(field) {\n const as = field.subfields.filter(f => f.code === 'a');\n if (as.length === 1) {\n return as[0];\n }\n return undefined;\n }\n\n\n function mapTermToCode(term, tag) {\n nvdebug(`TERM/${tag}: '${term}'`, debugDev);\n if (tag === '336' && term in map336) {\n return map336[term];\n }\n if (tag === '337' && term in map337) {\n return map337[term];\n }\n if (tag === '338' && term in map338) {\n return map338[term];\n }\n return undefined;\n }\n\n function mapFieldToCode(field) {\n const subfieldA = getA(field);\n if (subfieldA) {\n return mapTermToCode(subfieldA.value, field.tag);\n }\n return undefined;\n }\n\n function getRelevantFields(record) {\n const fields = record.get('33[678]');\n // Currently not handline $3 etc\n return fields.filter(f => f.subfields.length === 1 && mapFieldToCode(f));\n }\n\n function tagToSubfield2(tag) {\n if (tag === '336') {\n return {'code': '2', 'value': 'rdacontent'};\n }\n if (tag === '337') {\n return {'code': '2', 'value': 'rdamedia'};\n }\n if (tag === '338') {\n return {'code': '2', 'value': 'rdacarrier'};\n }\n }\n\n function fixField(field, catalogingLanguage = 'fin') {\n const subfieldA = getA(field);\n if (!subfieldA) {\n return;\n }\n const code = mapTermToCode(subfieldA.value, field.tag);\n if (!code) {\n return;\n }\n const newTerm = codeToTerm(code);\n if (!newTerm) {\n return;\n }\n\n subfieldA.value = newTerm;\n field.subfields.push({'code': 'b', 'value': code});\n field.subfields.push(tagToSubfield2(field.tag));\n\n function codeToTerm(code) {\n if (field.tag === '336') {\n return map336CodeToTerm(code, catalogingLanguage);\n }\n if (field.tag === '337') {\n return map337CodeToTerm(code, catalogingLanguage);\n }\n if (field.tag === '338') {\n return map338CodeToTerm(code, catalogingLanguage);\n }\n return undefined;\n }\n }\n\n}\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["code"]
|
|
7
7
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import clone from "clone";
|
|
2
1
|
import { fieldToString, nvdebug } from "./utils.js";
|
|
3
2
|
import createDebugLogger from "debug";
|
|
4
3
|
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:fix-language-codes");
|
|
@@ -43,7 +42,7 @@ export default function() {
|
|
|
43
42
|
return "abdefghijkmnpqrt".includes(subfield.code);
|
|
44
43
|
}
|
|
45
44
|
function validateField041(field, res) {
|
|
46
|
-
const clonedField =
|
|
45
|
+
const clonedField = structuredClone(field);
|
|
47
46
|
fixField041(clonedField);
|
|
48
47
|
const originalString = fieldToString(field);
|
|
49
48
|
const modifiedString = fieldToString(clonedField);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/fix-language-codes.js"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["\nimport {fieldToString, nvdebug} from './utils.js';\nimport createDebugLogger from 'debug';\n\n// Fix language codes in 008/35-37 and 041 (does not sync them)\n//\n// Author(s): Nicholas Volk\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fix-language-codes');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst description = 'Fix language codes';\n\n// eslint-disable-next-line max-lines-per-function\nexport default function () {\n\n return {description, validate, fix};\n\n function fix(record) {\n nvdebug(`FIX ME`, debugDev);\n const res = {message: [], fix: [], valid: true};\n\n const [field008] = record.get('008');\n if (!field008) {\n return res;\n }\n\n fixLanguageField008(field008);\n\n const f041 = record.get('041');\n f041.forEach(f => fixField041(f));\n\n return res;\n }\n\n\n function validate(record) {\n const res = {message: [], valid: true};\n\n validateField008(record, res);\n\n const f041 = record.get('041');\n\n f041.forEach(f => validateField041(f, res));\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField008(record, res) {\n const [field008] = record.get('008');\n\n if (!field008) {\n return;\n }\n\n const originalLanguage = getLanguageFromField008(field008);\n const modifiedLanguage = deprecatedLanguageToCurrentLanguage(originalLanguage);\n if (originalLanguage === modifiedLanguage) {\n return;\n }\n\n res.message.push(`Modify 008/35-37: '${originalLanguage}' => '${modifiedLanguage}'`);\n res.valid = false;\n }\n\n\n function isRelevantField041SubfieldCode(subfield) {\n return 'abdefghijkmnpqrt'.includes(subfield.code);\n }\n\n\n function validateField041(field, res) {\n\n const clonedField = structuredClone(field);\n fixField041(clonedField);\n\n const originalString = fieldToString(field);\n const modifiedString = fieldToString(clonedField);\n\n if (originalString === modifiedString) {\n return;\n }\n const msg = `${originalString} => ${modifiedString}`;\n res.message.push(msg);\n\n }\n\n\n function fixLanguageField008(field008) {\n const originalLanguage = getLanguageFromField008(field008);\n const modifiedLanguage = deprecatedLanguageToCurrentLanguage(originalLanguage);\n if (originalLanguage !== modifiedLanguage && modifiedLanguage.length === 3) {\n field008.value = `${field008.value.substring(0, 35)}${modifiedLanguage}${field008.value.substring(38)}`;\n return;\n }\n }\n\n function fixField041(field) {\n if (field.subfields.some(sf => sf.code === '2')) {\n return;\n }\n\n field.subfields.forEach(sf => fixField041Subfield(sf));\n\n function fixField041Subfield(subfield) {\n if (!isRelevantField041SubfieldCode(subfield)) {\n return;\n }\n subfield.value = deprecatedLanguageToCurrentLanguage(subfield.value);\n }\n }\n\n function getLanguageFromField008(field) {\n return field.value.substring(35, 38); // return 008/35-37\n }\n\n function deprecatedLanguageToCurrentLanguage(language) {\n if (language === 'nno' || language === 'nob') { // Nynorsk ja bokm\u00E5l\n return 'nor'; // Norwegian\n }\n return language;\n }\n\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAQ,eAAe,eAAc;AACrC,OAAO,uBAAuB;AAM9B,MAAM,QAAQ,kBAAkB,6DAA6D;AAE7F,MAAM,WAAW,MAAM,OAAO,KAAK;AAEnC,MAAM,cAAc;AAGpB,0BAA2B;AAEzB,SAAO,EAAC,aAAa,UAAU,IAAG;AAElC,WAAS,IAAI,QAAQ;AACnB,YAAQ,UAAU,QAAQ;AAC1B,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAE9C,UAAM,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK;AACnC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,wBAAoB,QAAQ;AAE5B,UAAM,OAAO,OAAO,IAAI,KAAK;AAC7B,SAAK,QAAQ,OAAK,YAAY,CAAC,CAAC;AAEhC,WAAO;AAAA,EACT;AAGA,WAAS,SAAS,QAAQ;AACxB,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,OAAO,KAAI;AAErC,qBAAiB,QAAQ,GAAG;AAE5B,UAAM,OAAO,OAAO,IAAI,KAAK;AAE7B,SAAK,QAAQ,OAAK,iBAAiB,GAAG,GAAG,CAAC;AAE1C,QAAI,QAAQ,EAAE,IAAI,QAAQ,UAAU;AACpC,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB,QAAQ,KAAK;AACrC,UAAM,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK;AAEnC,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,UAAM,mBAAmB,wBAAwB,QAAQ;AACzD,UAAM,mBAAmB,oCAAoC,gBAAgB;AAC7E,QAAI,qBAAqB,kBAAkB;AACzC;AAAA,IACF;AAEA,QAAI,QAAQ,KAAK,sBAAsB,gBAAgB,SAAS,gBAAgB,GAAG;AACnF,QAAI,QAAQ;AAAA,EACd;AAGA,WAAS,+BAA+B,UAAU;AAChD,WAAO,mBAAmB,SAAS,SAAS,IAAI;AAAA,EAClD;AAGA,WAAS,iBAAiB,OAAO,KAAK;AAEpC,UAAM,cAAc,gBAAgB,KAAK;AACzC,gBAAY,WAAW;AAEvB,UAAM,iBAAiB,cAAc,KAAK;AAC1C,UAAM,iBAAiB,cAAc,WAAW;AAEhD,QAAI,mBAAmB,gBAAgB;AACrC;AAAA,IACF;AACA,UAAM,MAAM,GAAG,cAAc,OAAO,cAAc;AAClD,QAAI,QAAQ,KAAK,GAAG;AAAA,EAEtB;AAGA,WAAS,oBAAoB,UAAU;AACrC,UAAM,mBAAmB,wBAAwB,QAAQ;AACzD,UAAM,mBAAmB,oCAAoC,gBAAgB;AAC7E,QAAI,qBAAqB,oBAAoB,iBAAiB,WAAW,GAAG;AAC1E,eAAS,QAAQ,GAAG,SAAS,MAAM,UAAU,GAAG,EAAE,CAAC,GAAG,gBAAgB,GAAG,SAAS,MAAM,UAAU,EAAE,CAAC;AACrG;AAAA,IACF;AAAA,EACF;AAEA,WAAS,YAAY,OAAO;AAC1B,QAAI,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,GAAG,GAAG;AAC/C;AAAA,IACF;AAEA,UAAM,UAAU,QAAQ,QAAM,oBAAoB,EAAE,CAAC;AAErD,aAAS,oBAAoB,UAAU;AACrC,UAAI,CAAC,+BAA+B,QAAQ,GAAG;AAC7C;AAAA,MACF;AACA,eAAS,QAAQ,oCAAoC,SAAS,KAAK;AAAA,IACrE;AAAA,EACF;AAEA,WAAS,wBAAwB,OAAO;AACtC,WAAO,MAAM,MAAM,UAAU,IAAI,EAAE;AAAA,EACrC;AAEA,WAAS,oCAAoC,UAAU;AACrD,QAAI,aAAa,SAAS,aAAa,OAAO;AAC5C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/fix-sami-041.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import createDebugLogger from "debug";
|
|
2
|
-
import clone from "clone";
|
|
3
2
|
import { fieldToString, nvdebug } from "./utils.js";
|
|
4
3
|
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:fix-sami-041");
|
|
5
4
|
const debugDev = debug.extend("dev");
|
|
@@ -25,7 +24,7 @@ export default function() {
|
|
|
25
24
|
nvdebug(`Start ${validateMode ? "validator" : "fixer"}`, debugDev);
|
|
26
25
|
const relevantSubfieldCodes = getRelevantSubfieldCodes(record);
|
|
27
26
|
nvdebug(` Relevant subfield codes are '${relevantSubfieldCodes.join("', '")}'`, debugDev);
|
|
28
|
-
const relevantFields = record.fields.filter((f) => isRelevantField(f, relevantSubfieldCodes)).map((f) => validateMode ?
|
|
27
|
+
const relevantFields = record.fields.filter((f) => isRelevantField(f, relevantSubfieldCodes)).map((f) => validateMode ? structuredClone(f) : f);
|
|
29
28
|
if (relevantFields.length === 0) {
|
|
30
29
|
nvdebug(` No relevant f041 fields found`, debugDev);
|
|
31
30
|
if (validateMode) {
|
|
@@ -42,7 +41,7 @@ export default function() {
|
|
|
42
41
|
}
|
|
43
42
|
return { message: [], fix: report, valid: true };
|
|
44
43
|
function updateAndReport008() {
|
|
45
|
-
const [f008] = record.get("008").map((f) => validateMode ?
|
|
44
|
+
const [f008] = record.get("008").map((f) => validateMode ? structuredClone(f) : f);
|
|
46
45
|
if (!f008) {
|
|
47
46
|
nvdebug(" WARNING: no f008 found"), debugDev;
|
|
48
47
|
return [];
|
package/dist/fix-sami-041.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/fix-sami-041.js"],
|
|
4
|
-
"sourcesContent": ["// Author(s): Nicholas Volk\n\nimport createDebugLogger from 'debug';\
|
|
5
|
-
"mappings": "AAEA,OAAO,uBAAuB;
|
|
4
|
+
"sourcesContent": ["// Author(s): Nicholas Volk\n\nimport createDebugLogger from 'debug';\n\n\nimport {fieldToString, nvdebug} from './utils.js';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fix-sami-041');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n\n// eslint-disable-next-line max-lines-per-function\nexport default function () {\n /* 'sma': etel\u00E4saame, 'sme': pohjoissaame, 'smj': luulajansaame, 'smn': inarinsaame, 'sms': koltansaame */\n const samiLanguages = ['sma', 'sme', 'smj', 'smn', 'sms'];\n const subfieldCodesUsingSmi = ['a', 'd'];\n\n return {\n description: 'Add corresponding \\'smi\\' subfield before a specific sami language subfields and update 008/35-37, if needed',\n validate, fix\n };\n\n function getRelevantSubfieldCodes(record) { // Maybe this should be an exportable utility function...\n if (record && record.leader && record.leader[6]) {\n nvdebug(` LDR/06 is '${record.leader[6]}'`, debugDev);\n // We should test this properly...\n if (['i', 'j'].includes(record.leader[6])) { // Check type of record: sound recordings use 'd'\n return ['d'];\n }\n return ['a'];\n }\n\n return ['a', 'd']; // B\u00E5de-och\n }\n\n\n function fix(record, validateMode = false) {\n nvdebug(`Start ${validateMode ? 'validator' : 'fixer'}`, debugDev);\n const relevantSubfieldCodes = getRelevantSubfieldCodes(record);\n nvdebug(` Relevant subfield codes are '${relevantSubfieldCodes.join(\"', '\")}'`, debugDev);\n const relevantFields = record.fields.filter(f => isRelevantField(f, relevantSubfieldCodes)).map(f => validateMode ? structuredClone(f) : f); // NV! relevant fields are cloned in validation mode!\n // Nothing to do:\n if (relevantFields.length === 0) {\n nvdebug(` No relevant f041 fields found`, debugDev);\n if (validateMode) {\n return {message: [], valid: true};\n }\n return {message: [], fix: [], valid: true};\n }\n\n const relevantFieldsAsStrings = relevantFields.map(f => fieldToString(f)); // get original values\n\n relevantFields.forEach(f => processField(f, relevantSubfieldCodes));\n const modFieldsAsStrings = relevantFields.map(f => fieldToString(f));\n const report = [...updateAndReport008(), ...createReport(relevantFieldsAsStrings, modFieldsAsStrings)];\n\n if (validateMode) {\n return {'message': report, 'valid': false};\n }\n\n return {message: [], fix: report, valid: true};\n\n function updateAndReport008() { // Update 008/35-37 if necessary + report it\n const [f008] = record.get('008').map(f => validateMode ? structuredClone(f) : f);\n\n if (!f008) {\n nvdebug(' WARNING: no f008 found'), debugDev;\n return [];\n }\n const currLang = f008.value.substr(35, 3);\n if (!samiLanguages.includes(currLang)) { // NB! If original 008/35-37 was not a sami language, we don't change anything!\n nvdebug(` Existing 008/35-37 '${currLang}' is not a sami language. No need to update 008/35-37`, debugDev);\n return [];\n }\n const origValue = f008.value;\n const firstRelevantSubfield = relevantFields[0].subfields.find(sf => relevantSubfieldCodes.includes(sf.code));\n if (firstRelevantSubfield.value !== 'smi') {\n nvdebug(` First relevant subfield is '\\$${firstRelevantSubfield.code} ${firstRelevantSubfield.value}'. No need to update 008/35-37`, debugDev);\n return [];\n }\n f008.value = `${f008.value.substr(0, 35)}smi${f008.value.substr(38)}`;\n nvdebug(` Update 008/35-37: '${currLang}' => 'smi'`, debugDev);\n return createReport([origValue], [f008.value]);\n }\n\n function processField(f) {\n f.subfields = processSubfields(f.subfields, []);\n }\n\n function processSubfields(incomingSubfields, outgoingSubfields = []) {\n const [currSubfield, ...otherSubfields] = incomingSubfields;\n if (!currSubfield) {\n return outgoingSubfields;\n }\n if (!isRelevantSamiSubfield(currSubfield, [...outgoingSubfields, ...otherSubfields])) {\n return processSubfields(otherSubfields, [...outgoingSubfields, currSubfield]);\n }\n\n const smiSubfield = {\n code: currSubfield.code,\n value: 'smi'\n };\n nvdebug(` f041: Add '\\$${currSubfield.code} smi' before '${currSubfield.value}'`, debugDev);\n\n return processSubfields(otherSubfields, [...outgoingSubfields, smiSubfield, currSubfield]);\n }\n\n function isRelevantField(f) {\n if (f.tag !== '041' || !f.subfields || f.subfields.some(sf => sf.code === '2')) {\n return false;\n }\n return f.subfields.some(sf => isRelevantSamiSubfield(sf, f.subfields)); // it's ok to pass sf in f.subfields also\n }\n\n function isRelevantSamiSubfield(sf, otherSubfields) {\n // NB! preceding 'smi' is added to all $a and $d fields, regardless of the LDR/06 value! (However, copying 041$a/d -> 008/35-37 depends on LDR/06)\n if (!subfieldCodesUsingSmi.includes(sf.code) || !samiLanguages.includes(sf.value)) {\n return false;\n }\n if (otherSubfields.some(sf2 => sf2.code === sf.code && sf2.value === 'smi')) { // fail if 'smi' already exists\n return false;\n }\n //debug(` '\\${sf.code} ${sf.value}' requires preceding 'smi'`);\n return true;\n }\n }\n\n function createReport(origArray, modArray) {\n return origArray.map((entry, index) => createEntry(entry, index));\n\n function createEntry(item, index) {\n return `'${item}' => '${modArray[index]}'`;\n }\n }\n\n function validate(record) {\n return fix(record, true);\n }\n\n\n\n\n\n\n}\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/fixRelatorTerms.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import clone from "clone";
|
|
2
1
|
import { fieldFixPunctuation } from "./punctuation2.js";
|
|
3
2
|
import { fieldToString, getCatalogingLanguage, nvdebug, subfieldToString } from "./utils.js";
|
|
4
3
|
import createDebugLogger from "debug";
|
|
@@ -22,7 +21,7 @@ export default function() {
|
|
|
22
21
|
const res = { message: [] };
|
|
23
22
|
const language = getCatalogingLanguage(record);
|
|
24
23
|
record.fields.forEach((field) => {
|
|
25
|
-
const clonedField =
|
|
24
|
+
const clonedField = structuredClone(field);
|
|
26
25
|
fieldFixRelatorTerms(field, language, language);
|
|
27
26
|
const clonedFieldAsString = fieldToString(clonedField);
|
|
28
27
|
const fieldAsString = fieldToString(field);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/fixRelatorTerms.js"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["\nimport {fieldFixPunctuation} from './punctuation2.js';\nimport {fieldToString, getCatalogingLanguage, nvdebug, subfieldToString} from './utils.js';\nimport createDebugLogger from 'debug';\n\n// Currently mainly translates X00$e values, so that we don't have \"$a Name, $e kirjoittaja, $e f\u00F6rfattare.\".\n// Later on we could try and handle $4 stuff here as well.\n\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fixRelatorterms');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport default function () {\n return {\n description: 'Fix $e subfields in field [1678][01]0 and 720',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n const language = getCatalogingLanguage(record);\n\n record.fields.forEach(field => {\n fieldFixRelatorTerms(field, language, language);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const language = getCatalogingLanguage(record);\n\n record.fields.forEach(field => {\n const clonedField = structuredClone(field);\n // Rather hackily/abnormally use language as both fromLanguage and toLanguage.\n // fromLanguage is used to expand \"esitt.\" => \"esitt\u00E4j\u00E4\".\n // toLanguage is used by translations (fixes \"f\u00F6rfattere\" to \"kirjoittaja\", if 040$b is \"fin\")\n fieldFixRelatorTerms(field, language, language);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) {\n res.message.push(`${fieldAsString} => ${clonedFieldAsString}`);\n }\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\n\n/*\nexport default () => (base, source) => {\n recordTranslateRelatorTerms(base);\n recordTranslateRelatorTerms(source);\n recordHandleRelatorTermAbbreviations(base);\n recordHandleRelatorTermAbbreviations(source);\n const result = {base, source};\n return result;\n};\n*/\n\n\n// Partial source: https://marc21.kansalliskirjasto.fi/funktiot_koodit.htm\n// https://wiki.helsinki.fi/display/MARC21svenska/Funktions-+och+relationskoder+-+alfabetiskt+efter+funktion\n// New, better source: https://id.kb.se/find?q=relator&_sort=_sortKeyByLang.en\n\n// NOTE: There are problematic relatorterms that do not diffrentiate between agent+work vs agent+ekspression relation\n// ie. teoksen haastattelija vs haastattelija (ekspressio)\n// current solution ignores them and handles just \"plain\" relator terms\n\n// NB! How to handle German sex-based Verfasser/Verfasserin pairs?\nconst relatorTerms = [\n {'code': 'arr', 'eng': 'arranger', 'fin': 'sovittaja', 'swe': 'arrang\u00F6r av musikalisk komposition'},\n {'code': 'art', 'eng': 'artist', 'fin': 'taiteilija', 'swe': 'konstn\u00E4r'},\n {'code': 'aui', 'eng': 'author of introduction', 'fin': 'esipuheen tekij\u00E4'},\n {'code': 'aut', 'eng': 'author', 'fin': 'kirjoittaja', 'swe': 'f\u00F6rfattare'},\n {'code': 'cmp', 'eng': 'composer', 'fin': 's\u00E4velt\u00E4j\u00E4', 'swe': 'komposit\u00F6r'},\n {'code': 'drt', 'eng': 'director', 'fin': 'ohjaaja', 'swe': 'regiss\u00F6r'},\n {'code': 'edt', 'eng': 'editor', 'fin': 'toimittaja', 'swe': 'redakt\u00F6r'},\n {'code': 'ill', 'eng': 'illustrator', 'fin': 'kuvittaja', 'swe': 'illustrat\u00F6r'},\n {'code': 'ive', 'eng': 'interviewee', 'fin': 'haastateltava', 'swe': 'intervjuobjekt'},\n {'code': 'ivr', 'eng': 'interviewer', 'fin': 'haastattelija', 'swe': 'intervjuare'},\n {'code': 'lyr', 'eng': 'lyricist', 'fin': 'sanoittaja', 'swe': 's\u00E5ngtext'},\n {'code': 'nrt', 'eng': 'narrator', 'fin': 'kertoja', 'swe': 'ber\u00E4ttare'}, // ber\u00E4ttare/inl\u00E4sare\n {'code': 'pbl', 'eng': 'publisher', 'fin': 'julkaisija', 'swe': 'utgivare'},\n {'code': 'pht', 'eng': 'photographer', 'fin': 'valokuvaaja', 'swe': 'fotograf'},\n {'code': 'prf', 'eng': 'performer', 'fin': 'esitt\u00E4j\u00E4', 'swe': 'framf\u00F6rande'},\n {'code': 'pro', 'eng': 'producer', 'fin': 'tuottaja', 'swe': 'producent'},\n {'code': 'trl', 'eng': 'translator', 'fin': 'k\u00E4\u00E4nt\u00E4j\u00E4', 'swe': '\u00F6vers\u00E4ttare'},\n {'code': '__FAKE_VALUE1__', 'fin': 'sarjakuvantekij\u00E4', 'swe': 'serieskapare'}\n];\n\n/*\nfunction recordNormalizeRelatorTerms(record, defaultLanguageCode = undef) {\n const languageCode = defaultLanguageCode ? defaultLanguageCode : getCatalogingLanguage(record);\n if (!languageCode || ['eng', 'fin', 'swe'].includes(languageCode)) {\n return;\n }\n\n}\n*/\n\n\nconst finnishAbbreviations = {\n 'esitt.': 'esitt\u00E4j\u00E4',\n 'k\u00E4\u00E4nt.': 'k\u00E4\u00E4nt\u00E4j\u00E4',\n 'n\u00E4ytt.': 'n\u00E4yttelij\u00E4',\n 'san.': 'sanoittaja',\n 'sov.': 'sovittaja',\n 's\u00E4v.': 's\u00E4velt\u00E4j\u00E4',\n 'toim.': 'toimittaja',\n // Quick and dirty implementation of https://github.com/NatLibFi/USEMARCON-BOOKWHERE-RDA/blob/master/bw_rda_kyril.rul#L651\n // As per M.I./Slavica\n '\u0445\u0443\u0434\u043E\u0436.': 'kuvittaja',\n '\u043F\u0435\u0440.': 'k\u00E4\u00E4nt\u00E4j\u00E4',\n '\u0441\u043E\u0441\u0442.': 'toimittaja', // might also be 'kokoaja'\n '\u0440\u0435\u0434.': 'toimittaja'\n};\n\nfunction subfieldHandleRelatorTermAbbreviation(subfield, language) {\n if (subfield.code !== 'e') {\n return;\n }\n nvdebug(`Relator cand subfield: '${subfieldToString(subfield)}', lang: ${language ? language : 'NULL'}`, debugDev);\n if (!language || language === 'mul') {\n subfieldHandleRelatorTermAbbreviation(subfield, 'fin');\n // Maybe later add Swedish here...\n return;\n }\n const value = subfield.value.replace(/,$/u, '');\n const punc = value === subfield.value ? '' : ',';\n\n const lcValue = value.toLowerCase(); // Check \u00C5, \u00C4, \u00D6...\n\n // NB: Policy: if no language or multi-language: apply all rules! (Not much overlap I hope...)\n if (!language || language === 'fin' || language === 'mul') {\n nvdebug(`Relator try Finnish for '${lcValue}}'...`, debugDev);\n if (lcValue in finnishAbbreviations) {\n const hit = `${finnishAbbreviations[lcValue]}${punc}`;\n nvdebug(`Relator hit: ${hit}`, debugDev);\n // NB! 'esitt.' => 'esitt\u00E4j\u00E4'\n subfield.value = hit;\n return;\n }\n }\n}\n\n\nfunction isRelatorField(field) {\n // Tag list might be incomplete!\n return field.tag.match(/^(?:100|110|600|610|700|710|720|800|810)$/u);\n}\n\nfunction fieldHandleRelatorTermAbbreviations(field, language) {\n if (!isRelatorField(field)) {\n return;\n }\n\n const originalValue = fieldToString(field);\n field.subfields.forEach(sf => subfieldHandleRelatorTermAbbreviation(sf, language));\n const modifiedValue = fieldToString(field);\n if (modifiedValue === originalValue) {\n return;\n }\n // Changes have happened... Try to punctuate.\n // (NB! We need punctuation as a module, if we are to make abbr expansion a marc-record-validators-melinda validator/fixer)\n fieldFixPunctuation(field);\n}\n\nfunction termIsInGivenLanguage(term, language) {\n return relatorTerms.some(row => language in row && row[language] === term);\n}\n\nfunction anyToLanguage(originalTerm) {\n // Sometimes there's no 040$b or 040$b and, say, 040$b and 700$e value don't correlate\n if (termIsInGivenLanguage(originalTerm, 'fin')) {\n return 'fin';\n }\n if (termIsInGivenLanguage(originalTerm, 'swe')) {\n return 'swe';\n }\n if (termIsInGivenLanguage(originalTerm, 'eng')) {\n return 'eng';\n }\n return null;\n}\n\nfunction translateRelatorTerm(originalTerm, defaultFromLanguage, toLanguage) {\n\n // originalTerm is supposed to be normal version (abbrs have been expanded), possibly with punctuation\n const term = originalTerm.replace(/[,.]$/u, '');\n nvdebug(`Try to translate '${term}' from ${defaultFromLanguage} to ${toLanguage}`, debugDev);\n\n // Kind of hacky... If term is in toLanguage, do nothing. defaultFromLanguage (040$b) isn't that reliable.\n if (termIsInGivenLanguage(term, toLanguage)) {\n return originalTerm;\n }\n // defaultFomLanguage (typically 040$b) isn't that reliable:\n const fromLanguage = defaultFromLanguage === null || !termIsInGivenLanguage(term, defaultFromLanguage) ? anyToLanguage(term) : defaultFromLanguage;\n\n const [candRow] = relatorTerms.filter(row => fromLanguage in row && toLanguage in row && row[fromLanguage] === term);\n if (candRow) {\n const punc = term === originalTerm ? '' : originalTerm.slice(-1);\n const translation = `${candRow[toLanguage]}${punc}`;\n nvdebug(`Translate relator term: ${originalTerm} => ${translation}`, debugDev);\n return translation;\n }\n return originalTerm;\n}\n\nfunction subfieldTranslateRelatorTerm(subfield, fromLanguage, toLanguage) {\n if (subfield.code !== 'e') {\n return;\n }\n subfield.value = translateRelatorTerm(subfield.value, fromLanguage, toLanguage);\n}\n\nexport function fieldFixRelatorTerms(field, fromLanguage, toLanguage) {\n // fromLanguage can not be relied upon.\n if (!isRelatorField(field)/* || fromLanguage === toLanguage*/) {\n return;\n }\n fieldHandleRelatorTermAbbreviations(field, fromLanguage);\n\n field.subfields.forEach(sf => subfieldTranslateRelatorTerm(sf, fromLanguage, toLanguage));\n}\n\n\nexport function recordFixRelatorTerms(record, defaultToLanguage = null, defaultFromLanguage = null) { // WAS: translateRecord()\n const fromLanguage = defaultFromLanguage ? defaultFromLanguage : getCatalogingLanguage(record);\n const toLanguage = defaultToLanguage ? defaultToLanguage : getCatalogingLanguage(record);\n\n record.fields.forEach(field => translateField(field, fromLanguage, toLanguage));\n\n function translateField(field, from, to) {\n fieldFixRelatorTerms(field, from, to);\n }\n}\n\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/identical-fields.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { MarcRecord } from "@natlibfi/marc-record";
|
|
2
1
|
export default function() {
|
|
3
2
|
return {
|
|
4
3
|
description: "Handles identical duplicate in record fields",
|
|
@@ -16,7 +15,8 @@ export default function() {
|
|
|
16
15
|
}
|
|
17
16
|
function uniqWith(fields) {
|
|
18
17
|
return fields.reduce((uniq, field) => {
|
|
19
|
-
|
|
18
|
+
const fieldAsString = JSON.stringify(field);
|
|
19
|
+
if (!uniq.some((f) => JSON.stringify(f) === fieldAsString)) {
|
|
20
20
|
uniq.push(field);
|
|
21
21
|
}
|
|
22
22
|
return uniq;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/identical-fields.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * This validator de-duplicates identical fields in a record.\n */\n\
|
|
5
|
-
"mappings": "AAIA,
|
|
4
|
+
"sourcesContent": ["/**\n * This validator de-duplicates identical fields in a record.\n */\n\nexport default function () {\n return {\n description: 'Handles identical duplicate in record fields',\n validate,\n fix\n };\n\n function validate(record) {\n const uniq = uniqWith(record.fields);\n const valid = uniq.length === record.fields.length;\n const messages = record.fields.filter(tag => !uniq.includes(tag))\n .map(obj => `Field ${obj.tag} has duplicates`);\n\n return valid ? {valid, messages: []} : {valid, messages};\n }\n\n function fix(record) {\n record.fields\n .filter(tag => !uniqWith(record.fields).includes(tag))\n .forEach(tag => record.removeField(tag));\n }\n\n function uniqWith(fields) {\n return fields.reduce((uniq, field) => {\n const fieldAsString = JSON.stringify(field);\n if (!uniq.some(f => JSON.stringify(f) === fieldAsString)) {\n uniq.push(field);\n }\n\n return uniq;\n }, []);\n }\n}\n"],
|
|
5
|
+
"mappings": "AAIA,0BAA2B;AACzB,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AAEA,WAAS,SAAS,QAAQ;AACxB,UAAM,OAAO,SAAS,OAAO,MAAM;AACnC,UAAM,QAAQ,KAAK,WAAW,OAAO,OAAO;AAC5C,UAAM,WAAW,OAAO,OAAO,OAAO,SAAO,CAAC,KAAK,SAAS,GAAG,CAAC,EAC7D,IAAI,SAAO,SAAS,IAAI,GAAG,iBAAiB;AAE/C,WAAO,QAAQ,EAAC,OAAO,UAAU,CAAC,EAAC,IAAI,EAAC,OAAO,SAAQ;AAAA,EACzD;AAEA,WAAS,IAAI,QAAQ;AACnB,WAAO,OACJ,OAAO,SAAO,CAAC,SAAS,OAAO,MAAM,EAAE,SAAS,GAAG,CAAC,EACpD,QAAQ,SAAO,OAAO,YAAY,GAAG,CAAC;AAAA,EAC3C;AAEA,WAAS,SAAS,QAAQ;AACxB,WAAO,OAAO,OAAO,CAAC,MAAM,UAAU;AACpC,YAAM,gBAAgB,KAAK,UAAU,KAAK;AAC1C,UAAI,CAAC,KAAK,KAAK,OAAK,KAAK,UAAU,CAAC,MAAM,aAAa,GAAG;AACxD,aAAK,KAAK,KAAK;AAAA,MACjB;AAEA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import clone from "clone";
|
|
2
1
|
import { fieldFixPunctuation, fieldStripPunctuation } from "./punctuation2.js";
|
|
3
2
|
import { fieldToString, nvdebug } from "./utils.js";
|
|
4
3
|
import { sortAdjacentSubfields } from "./sortSubfields.js";
|
|
@@ -24,13 +23,13 @@ export default function() {
|
|
|
24
23
|
return res;
|
|
25
24
|
}
|
|
26
25
|
}
|
|
27
|
-
function
|
|
28
|
-
const clonedField =
|
|
26
|
+
function createNormalizedstructuredClone(field) {
|
|
27
|
+
const clonedField = structuredClone(field);
|
|
29
28
|
fieldStripPunctuation(clonedField);
|
|
30
29
|
return clonedField;
|
|
31
30
|
}
|
|
32
31
|
function createNormalizedCloneWithoutRelatorTerms(field) {
|
|
33
|
-
const clonedField =
|
|
32
|
+
const clonedField = createNormalizedstructuredClone(field);
|
|
34
33
|
clonedField.subfields = clonedField.subfields.filter((sf) => sf.code !== "e");
|
|
35
34
|
return clonedField;
|
|
36
35
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/mergeRelatorTermFields.js"],
|
|
4
|
-
"sourcesContent": ["// Merge author/agent fields\n//\n// Rationale: Same author can appear in one 1XX and multiple 7XX fields having only different $e subfields.\n// These fields can be merged (and $e-subfields can then be sorted)...\n//\n// Author(s): Nicholas Volk\n\n\nimport
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["// Merge author/agent fields\n//\n// Rationale: Same author can appear in one 1XX and multiple 7XX fields having only different $e subfields.\n// These fields can be merged (and $e-subfields can then be sorted)...\n//\n// Author(s): Nicholas Volk\n\n\n\nimport {fieldFixPunctuation, fieldStripPunctuation} from './punctuation2.js';\nimport {fieldToString, nvdebug} from './utils.js';\nimport {sortAdjacentSubfields} from './sortSubfields.js';\nimport {sortAdjacentRelatorTerms, tagToRelatorTermSubfieldCode} from './sortRelatorTerms.js';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:mergeRelatorTermFields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n\nexport default function () {\n\n return {\n description: 'Merge author fields that only differ in $e relator terms',\n validate, fix\n };\n\n function fix(record) {\n const msg = mergeRelatorTermFields(record, true);\n const res = {message: msg, fix: msg, valid: true};\n return res;\n }\n\n function validate(record) {\n const msg = mergeRelatorTermFields(record, false);\n const res = {message: msg};\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\nfunction createNormalizedstructuredClone(field) {\n const clonedField = structuredClone(field);\n // Normalize\n fieldStripPunctuation(clonedField);\n return clonedField;\n}\n\nfunction createNormalizedCloneWithoutRelatorTerms(field) {\n const clonedField = createNormalizedstructuredClone(field);\n // Remove relator terms $e subfi:\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e');\n return clonedField;\n}\n\nfunction getRelatorTermStrings(relatorTermSubfieldCode, field) {\n return field.subfields.filter(sf => sf.code === relatorTermSubfieldCode).map(sf => sf.value);\n\n}\n\nfunction extractAddableRelatorTerms(fromField, toField) {\n const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);\n const normalizedFromFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, fromField);\n if (normalizedFromFieldRelatorTerms.length === 0) {\n return [];\n }\n // Remove values that already exist:\n const normalizedToFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, toField);\n return normalizedFromFieldRelatorTerms.filter(str => !normalizedToFieldRelatorTerms.includes(str));\n}\n\n\nfunction copyRelatorSubfields(fromField, toField) {\n const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);\n const newRelatorTerms = extractAddableRelatorTerms(fromField, toField);\n\n newRelatorTerms.forEach(term => toField.subfields.push({code: relatorTermSubfieldCode, value: term}));\n\n}\n\nfunction mergeRelatorTermFields(record, fix = false) {\n // NV: 111/711, 751 and 752 where so rare that I did not add them here. Can't remember why I skipped 6XX and 8XX...\n let fields = record.get('(?:[17][01]0|720)');\n let result = [];\n const comparisonFieldsAsString = fields.map(f => fieldToString(createNormalizedCloneWithoutRelatorTerms(f)));\n\n nvdebug(`mergeRelatorTermFields(): ${fields.length} cand field(s) found`, debugDev);\n for(let i=0; i < fields.length-1; i++) {\n let currField = fields[i];\n if (currField.deleted) {\n continue;\n }\n nvdebug(`RT: Trying to pair ${comparisonFieldsAsString[i]}/${i}`, debugDev);\n for (let j=i+1; j < fields.length; j++) {\n nvdebug(` Compare with ${comparisonFieldsAsString[j]}/${j}`, debugDev);\n let mergableField = fields[j];\n // Skip 1/7 from 1XX/7XX for similarity check:\n if ( comparisonFieldsAsString[i].substring(1) !== comparisonFieldsAsString[j].substring(1)) {\n nvdebug(\" NOT PAIR\", debugDev);\n continue;\n }\n if (mergableField.deleted) {\n nvdebug(\" DELETED\", debugDev);\n continue;\n }\n const str = `MERGE RELATOR TERM FIELD: ${fieldToString(mergableField)}`;\n nvdebug(str, debugDev);\n\n if(!result.includes(str)) {\n result.push(str)\n }\n\n if (fix) {\n mergableField.deleted = 1;\n copyRelatorSubfields(mergableField, currField);\n fieldFixPunctuation(currField);\n sortAdjacentSubfields(currField); // Put the added $e subfield to proper places.\n sortAdjacentRelatorTerms(currField); // Sort $e subfields with each other\n fieldFixPunctuation(currField);\n\n }\n }\n }\n\n if(!fix) {\n fields.forEach(f => delete f.deleted);\n }\n\n record.fields = record.fields.filter(f => !f.deleted);\n return result;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/modernize-502.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import clone from "clone";
|
|
2
1
|
import { fieldToString } from "./utils.js";
|
|
3
2
|
export default function() {
|
|
4
3
|
return {
|
|
@@ -26,7 +25,7 @@ export default function() {
|
|
|
26
25
|
return;
|
|
27
26
|
}
|
|
28
27
|
const orig = fieldToString(field);
|
|
29
|
-
const normalizedField = normalizeField502(
|
|
28
|
+
const normalizedField = normalizeField502(structuredClone(field));
|
|
30
29
|
const mod = fieldToString(normalizedField);
|
|
31
30
|
if (orig !== mod) {
|
|
32
31
|
res.message.push(`Fix '${orig}' => '${mod}'`);
|