@natlibfi/marc-record-validators-melinda 11.1.1 → 11.2.0-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/addMissingField041.js +93 -0
- package/dist/addMissingField041.js.map +1 -0
- package/dist/addMissingField041.spec.js +45 -0
- package/dist/addMissingField041.spec.js.map +1 -0
- package/dist/cyrillux-usemarcon-replacement.js +16 -13
- package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
- package/dist/punctuation2.js +26 -19
- package/dist/punctuation2.js.map +1 -1
- package/dist/sortSubfields.js +1 -0
- package/dist/sortSubfields.js.map +1 -1
- package/package.json +5 -5
- package/src/addMissingField041.js +74 -0
- package/src/addMissingField041.spec.js +46 -0
- package/src/cyrillux-usemarcon-replacement.js +28 -5
- package/src/punctuation2.js +19 -20
- package/src/sortSubfields.js +1 -0
- package/test-fixtures/addMissingField041/f01/expectedResult.json +7 -0
- package/test-fixtures/addMissingField041/f01/metadata.json +5 -0
- package/test-fixtures/addMissingField041/f01/record.json +6 -0
- package/test-fixtures/addMissingField041/f02/expectedResult.json +8 -0
- package/test-fixtures/addMissingField041/f02/metadata.json +6 -0
- package/test-fixtures/addMissingField041/f02/record.json +6 -0
- package/test-fixtures/addMissingField041/f03/expectedResult.json +8 -0
- package/test-fixtures/addMissingField041/f03/metadata.json +6 -0
- package/test-fixtures/addMissingField041/f03/record.json +7 -0
- package/test-fixtures/addMissingField041/f04/expectedResult.json +8 -0
- package/test-fixtures/addMissingField041/f04/metadata.json +5 -0
- package/test-fixtures/addMissingField041/f04/record.json +6 -0
- package/test-fixtures/addMissingField041/v01/expectedResult.json +5 -0
- package/test-fixtures/addMissingField041/v01/metadata.json +5 -0
- package/test-fixtures/addMissingField041/v01/record.json +6 -0
- package/test-fixtures/addMissingField041/v02/expectedResult.json +6 -0
- package/test-fixtures/addMissingField041/v02/metadata.json +6 -0
- package/test-fixtures/addMissingField041/v02/record.json +6 -0
- package/test-fixtures/addMissingField336/01/metadata.json +0 -1
- package/test-fixtures/addMissingField336/02/metadata.json +0 -1
- package/test-fixtures/addMissingField336/cod/metadata.json +0 -1
- package/test-fixtures/addMissingField336/cop/metadata.json +0 -1
- package/test-fixtures/addMissingField336/cop2/metadata.json +0 -1
- package/test-fixtures/addMissingField336/crf/metadata.json +0 -1
- package/test-fixtures/addMissingField336/cri/metadata.json +0 -1
- package/test-fixtures/addMissingField336/crt/metadata.json +0 -1
- package/test-fixtures/addMissingField336/f01/metadata.json +0 -1
- package/test-fixtures/addMissingField336/f02/metadata.json +0 -1
- package/test-fixtures/addMissingField336/mixed2txt/metadata.json +0 -1
- package/test-fixtures/addMissingField336/mixed2xxx/metadata.json +0 -1
- package/test-fixtures/addMissingField336/ntm/metadata.json +0 -1
- package/test-fixtures/addMissingField336/snd/metadata.json +0 -1
- package/test-fixtures/addMissingField336/spw/metadata.json +0 -1
- package/test-fixtures/addMissingField336/spw2/metadata.json +0 -1
- package/test-fixtures/addMissingField336/spw_txt/metadata.json +0 -1
- package/test-fixtures/addMissingField336/sti/metadata.json +0 -1
- package/test-fixtures/addMissingField336/sti_projected/metadata.json +0 -1
- package/test-fixtures/addMissingField336/tci/metadata.json +0 -1
- package/test-fixtures/addMissingField336/tcm/metadata.json +0 -1
- package/test-fixtures/addMissingField336/tdf/metadata.json +0 -1
- package/test-fixtures/addMissingField336/tdi/metadata.json +0 -1
- package/test-fixtures/addMissingField336/txt/metadata.json +0 -1
- package/test-fixtures/addMissingField336/zzz/metadata.json +0 -1
- package/test-fixtures/addMissingField337/c1/metadata.json +0 -1
- package/test-fixtures/addMissingField337/g1/metadata.json +0 -1
- package/test-fixtures/addMissingField337/n1/metadata.json +0 -1
- package/test-fixtures/addMissingField337/no_action_required/metadata.json +0 -1
- package/test-fixtures/addMissingField337/p1/metadata.json +0 -1
- package/test-fixtures/addMissingField337/validate_x1/metadata.json +0 -1
- package/test-fixtures/addMissingField338/cb/metadata.json +0 -1
- package/test-fixtures/addMissingField338/cd/metadata.json +0 -1
- package/test-fixtures/addMissingField338/ck/metadata.json +0 -1
- package/test-fixtures/addMissingField338/cr/metadata.json +0 -1
- package/test-fixtures/addMissingField338/cr2/metadata.json +0 -1
- package/test-fixtures/addMissingField338/cr3/metadata.json +0 -1
- package/test-fixtures/addMissingField338/cr4/metadata.json +0 -1
- package/test-fixtures/addMissingField338/gc/metadata.json +0 -1
- package/test-fixtures/addMissingField338/gd/metadata.json +0 -1
- package/test-fixtures/addMissingField338/gf/metadata.json +0 -1
- package/test-fixtures/addMissingField338/gs/metadata.json +0 -1
- package/test-fixtures/addMissingField338/gt/metadata.json +0 -1
- package/test-fixtures/addMissingField338/hd/metadata.json +0 -1
- package/test-fixtures/addMissingField338/he/metadata.json +0 -1
- package/test-fixtures/addMissingField338/he2/metadata.json +0 -1
- package/test-fixtures/addMissingField338/hg/metadata.json +0 -1
- package/test-fixtures/addMissingField338/hg2/metadata.json +0 -1
- package/test-fixtures/addMissingField338/hj/metadata.json +0 -1
- package/test-fixtures/addMissingField338/hj2/metadata.json +0 -1
- package/test-fixtures/addMissingField338/mo/metadata.json +0 -1
- package/test-fixtures/addMissingField338/nc/metadata.json +0 -1
- package/test-fixtures/addMissingField338/nr/metadata.json +0 -1
- package/test-fixtures/addMissingField338/sd/metadata.json +0 -1
- package/test-fixtures/addMissingField338/sd2/metadata.json +0 -1
- package/test-fixtures/addMissingField338/sd3/metadata.json +0 -1
- package/test-fixtures/addMissingField338/ss/metadata.json +0 -1
- package/test-fixtures/addMissingField338/ss2/metadata.json +0 -1
- package/test-fixtures/addMissingField338/vd/metadata.json +0 -1
- package/test-fixtures/addMissingField338/vd2/metadata.json +0 -1
- package/test-fixtures/addMissingField338/vf/metadata.json +0 -1
- package/test-fixtures/addMissingField338/zu/metadata.json +0 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/f01/metadata.json +0 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/f02/expectedResult.json +3 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f02/metadata.json +0 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/f03/expectedResult.json +3 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f03/metadata.json +0 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/f04/expectedResult.json +3 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f04/metadata.json +0 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/f05/expectedResult.json +3 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f05/metadata.json +1 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/f06/expectedResult.json +3 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f06/metadata.json +0 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/f07/expectedResult.json +3 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f07/metadata.json +0 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/f08/expectedResult.json +3 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f08/metadata.json +0 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/f09/expectedResult.json +1 -2
- package/test-fixtures/cyrillux-usemarcon-replacement/f09/metadata.json +1 -2
- package/test-fixtures/cyrillux-usemarcon-replacement/f09/record.json +1 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/f10/expectedResult.json +1 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/f10/metadata.json +0 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/f10/record.json +1 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/f11/expectedResult.json +3 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f11/metadata.json +1 -2
- package/test-fixtures/cyrillux-usemarcon-replacement/v01/metadata.json +0 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/v02/metadata.json +0 -1
- package/test-fixtures/cyrillux-usemarcon-replacement/v02/record.json +1 -1
- package/test-fixtures/field-008-18-34-character-groups/01/metadata.json +0 -1
- package/test-fixtures/field-008-18-34-character-groups/02/metadata.json +0 -1
- package/test-fixtures/field-008-18-34-character-groups/03/metadata.json +0 -1
- package/test-fixtures/field-008-18-34-character-groups/04/metadata.json +0 -1
- package/test-fixtures/field-008-18-34-character-groups/05/metadata.json +0 -1
- package/test-fixtures/field-505-separators/01/metadata.json +0 -1
- package/test-fixtures/field-505-separators/02/metadata.json +0 -1
- package/test-fixtures/fix-33X/f11/metadata.json +0 -1
- package/test-fixtures/fix-33X/v11/metadata.json +0 -1
- package/test-fixtures/fix-country-codes/01/metadata.json +0 -1
- package/test-fixtures/fix-country-codes/02/metadata.json +0 -1
- package/test-fixtures/fix-country-codes/03/metadata.json +0 -1
- package/test-fixtures/fix-country-codes/04/metadata.json +0 -1
- package/test-fixtures/fix-country-codes/05/metadata.json +0 -1
- package/test-fixtures/fix-language-codes/01/metadata.json +0 -1
- package/test-fixtures/fix-language-codes/02/metadata.json +0 -1
- package/test-fixtures/fix-language-codes/03/metadata.json +0 -1
- package/test-fixtures/fix-language-codes/04/metadata.json +0 -1
- package/test-fixtures/fix-language-codes/05/metadata.json +0 -1
- package/test-fixtures/fix-relator-terms/f01/metadata.json +0 -1
- package/test-fixtures/fix-relator-terms/f01b/metadata.json +0 -1
- package/test-fixtures/fix-relator-terms/f02/metadata.json +0 -1
- package/test-fixtures/fix521/01/metadata.json +0 -1
- package/test-fixtures/fix521/02/metadata.json +0 -1
- package/test-fixtures/fix521/03/metadata.json +0 -1
- package/test-fixtures/indicator-fixes/01/metadata.json +0 -1
- package/test-fixtures/indicator-fixes/02/metadata.json +0 -1
- package/test-fixtures/indicator-fixes/03/metadata.json +0 -1
- package/test-fixtures/indicator-fixes/04/metadata.json +0 -1
- package/test-fixtures/indicator-fixes/05/metadata.json +0 -1
- package/test-fixtures/indicator-fixes/06/metadata.json +0 -1
- package/test-fixtures/indicator-fixes/07/metadata.json +0 -1
- package/test-fixtures/normalize-dashes/01/metadata.json +0 -1
- package/test-fixtures/normalize-dashes/02/metadata.json +0 -1
- package/test-fixtures/normalize-dashes/03/metadata.json +0 -1
- package/test-fixtures/normalize-identifiers/01/metadata.json +0 -1
- package/test-fixtures/normalize-identifiers/02/metadata.json +0 -1
- package/test-fixtures/normalize-identifiers/03/metadata.json +0 -1
- package/test-fixtures/normalize-identifiers/04/metadata.json +0 -1
- package/test-fixtures/normalize-qualifying-information/01/metadata.json +0 -1
- package/test-fixtures/normalize-qualifying-information/02/metadata.json +0 -1
- package/test-fixtures/normalize-subfield-value/01/metadata.json +0 -1
- package/test-fixtures/normalize-utf8-diacritics/01/metadata.json +0 -1
- package/test-fixtures/normalize-utf8-diacritics/02/metadata.json +0 -1
- package/test-fixtures/normalize-utf8-diacritics/03/metadata.json +0 -1
- package/test-fixtures/normalize-utf8-diacritics/04/metadata.json +0 -1
- package/test-fixtures/normalize-utf8-diacritics/05/metadata.json +0 -1
- package/test-fixtures/punctuation/03/metadata.json +0 -1
- package/test-fixtures/punctuation/04/metadata.json +0 -1
- package/test-fixtures/punctuation/05/metadata.json +0 -1
- package/test-fixtures/punctuation2/01/metadata.json +0 -1
- package/test-fixtures/punctuation2/02/metadata.json +0 -1
- package/test-fixtures/punctuation2/04/metadata.json +0 -1
- package/test-fixtures/punctuation2/05/metadata.json +0 -1
- package/test-fixtures/punctuation2/240/metadata.json +0 -1
- package/test-fixtures/punctuation2/260/expectedResult.json +14 -0
- package/test-fixtures/punctuation2/260/metadata.json +5 -0
- package/test-fixtures/punctuation2/260/record.json +12 -0
- package/test-fixtures/punctuation2/710/expectedResult.json +11 -0
- package/test-fixtures/punctuation2/710/metadata.json +5 -0
- package/test-fixtures/punctuation2/710/record.json +9 -0
- package/test-fixtures/punctuation2/800/metadata.json +0 -1
- package/test-fixtures/punctuation2/95/metadata.json +0 -1
- package/test-fixtures/punctuation2/96/metadata.json +0 -1
- package/test-fixtures/punctuation2/97/metadata.json +0 -1
- package/test-fixtures/punctuation2/98/metadata.json +0 -1
- package/test-fixtures/punctuation2/99/metadata.json +0 -1
- package/test-fixtures/reindex-sf6-occurence-numbers/f01/metadata.json +0 -1
- package/test-fixtures/reindex-sf6-occurence-numbers/f02/metadata.json +0 -1
- package/test-fixtures/reindex-sf6-occurence-numbers/f03/metadata.json +0 -1
- package/test-fixtures/reindex-sf6-occurence-numbers/v01/metadata.json +0 -1
- package/test-fixtures/reindex-sf6-occurence-numbers/v02/metadata.json +0 -1
- package/test-fixtures/reindex-sf6-occurence-numbers/v03/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/f01/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/f03/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/f03b/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/f04/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/f05/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/f06/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/f07/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/f08/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/f09/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/f10/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/f11/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/v01/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/v02/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/v03/metadata.json +0 -1
- package/test-fixtures/remove-duplicate-datafields/v04/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f01/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f02a/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f02b/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f03/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f04/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f05/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f06/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f07a/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f07b/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f07c/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f07d/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f07e/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f07f/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f07g/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f07h/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f07i/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f07j/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f08/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f09/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f10/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f11/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f12/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/f13/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/v01/metadata.json +0 -1
- package/test-fixtures/remove-inferior-datafields/v02/metadata.json +0 -1
- package/test-fixtures/remove-orphanded-sf6s/f01/metadata.json +0 -1
- package/test-fixtures/remove-orphanded-sf6s/f02/metadata.json +0 -1
- package/test-fixtures/remove-orphanded-sf6s/v01/metadata.json +0 -1
- package/test-fixtures/remove-orphanded-sf6s/v02/metadata.json +0 -1
- package/test-fixtures/sanitize-vocabulary-source-codes/f01/metadata.json +0 -1
- package/test-fixtures/sanitize-vocabulary-source-codes/f02/metadata.json +0 -1
- package/test-fixtures/sanitize-vocabulary-source-codes/f03/metadata.json +0 -1
- package/test-fixtures/sanitize-vocabulary-source-codes/v01/metadata.json +0 -1
- package/test-fixtures/sanitize-vocabulary-source-codes/v03/metadata.json +0 -1
- package/test-fixtures/sort-relator-terms/f01/metadata.json +0 -1
- package/test-fixtures/sort-relator-terms/f02/metadata.json +0 -1
- package/test-fixtures/sort-relator-terms/v01/metadata.json +0 -1
- package/test-fixtures/sort-relator-terms/v02/metadata.json +0 -1
- package/test-fixtures/sort-subfields/f01/metadata.json +0 -1
- package/test-fixtures/sort-subfields/f02/metadata.json +0 -1
- package/test-fixtures/sort-subfields/v01/metadata.json +0 -1
- package/test-fixtures/sort-subfields/v02/metadata.json +0 -1
- package/test-fixtures/strip-punctuation/01/metadata.json +0 -1
- package/test-fixtures/strip-punctuation/02/metadata.json +0 -1
- package/test-fixtures/strip-punctuation/04/metadata.json +0 -1
- package/test-fixtures/strip-punctuation/05/metadata.json +0 -1
- package/test-fixtures/strip-punctuation/240/metadata.json +0 -1
- package/test-fixtures/strip-punctuation/96/metadata.json +0 -1
- package/test-fixtures/strip-punctuation/97/metadata.json +0 -1
- package/test-fixtures/strip-punctuation/98/metadata.json +0 -1
- package/test-fixtures/strip-punctuation/99/metadata.json +0 -1
- package/test-fixtures/subfield0/f01/metadata.json +0 -1
- package/test-fixtures/subfield0/f02/metadata.json +0 -1
- package/test-fixtures/subfield0/f03/metadata.json +0 -1
- package/test-fixtures/subfield0/v01/metadata.json +0 -1
- package/test-fixtures/subfield0/v02/metadata.json +0 -1
- package/test-fixtures/sync-007-and-300/f01/metadata.json +0 -1
- package/test-fixtures/sync-007-and-300/v01/metadata.json +0 -1
- package/test-fixtures/sync-007-and-300/v02/metadata.json +0 -1
- package/test-fixtures/sync-007-and-300/v03/metadata.json +0 -1
- package/test-fixtures/update-field-540/f01/metadata.json +0 -1
- package/test-fixtures/update-field-540/v01/metadata.json +0 -1
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = _default;
|
|
7
|
+
var _utils = require("./utils");
|
|
8
|
+
//import createDebugLogger from 'debug';
|
|
9
|
+
|
|
10
|
+
const description = 'Add missing 041 field based on 008/35-37';
|
|
11
|
+
|
|
12
|
+
// const multimediaRegexp = /multimedia/ui;
|
|
13
|
+
|
|
14
|
+
function _default() {
|
|
15
|
+
return {
|
|
16
|
+
description,
|
|
17
|
+
validate,
|
|
18
|
+
fix
|
|
19
|
+
};
|
|
20
|
+
function getLanguageCode(record) {
|
|
21
|
+
const [f008] = record.get('008');
|
|
22
|
+
if (f008 && f008.value.length === 40) {
|
|
23
|
+
return f008.value.substring(35, 38);
|
|
24
|
+
}
|
|
25
|
+
return '|||';
|
|
26
|
+
}
|
|
27
|
+
function isRealLanguageCode(languageCode = '|||') {
|
|
28
|
+
(0, _utils.nvdebug)(`Language code 008/35-37: ${languageCode}`);
|
|
29
|
+
if (!languageCode.match(/^[a-z]{3}$/u) || ['mul', 'und', 'zxx'].includes(languageCode)) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
// Assume that value is valid:
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
function determineSubfieldCode(record) {
|
|
36
|
+
const typeOfRecord = record.getTypeOfRecord(record);
|
|
37
|
+
if (typeOfRecord === 'i' || typeOfRecord === 'j') {
|
|
38
|
+
return 'd';
|
|
39
|
+
}
|
|
40
|
+
return 'a';
|
|
41
|
+
}
|
|
42
|
+
function generateContent(record) {
|
|
43
|
+
const languageCodeFields = record.get('041');
|
|
44
|
+
if (languageCodeFields.length > 0) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const languageCode = getLanguageCode(record);
|
|
48
|
+
if (!isRealLanguageCode(languageCode)) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const subfieldCode = determineSubfieldCode(record);
|
|
52
|
+
// NB! Usemarcon-bookwhere had IND1=0...
|
|
53
|
+
return {
|
|
54
|
+
tag: '041',
|
|
55
|
+
ind1: ' ',
|
|
56
|
+
ind2: ' ',
|
|
57
|
+
subfields: [{
|
|
58
|
+
code: subfieldCode,
|
|
59
|
+
value: languageCode
|
|
60
|
+
}]
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function fix(record) {
|
|
64
|
+
(0, _utils.nvdebug)(`FIX ${description}...`);
|
|
65
|
+
const data = generateContent(record);
|
|
66
|
+
const res = {
|
|
67
|
+
message: [],
|
|
68
|
+
fix: [],
|
|
69
|
+
valid: true
|
|
70
|
+
};
|
|
71
|
+
if (data) {
|
|
72
|
+
record.insertField(data);
|
|
73
|
+
return res;
|
|
74
|
+
}
|
|
75
|
+
return res;
|
|
76
|
+
}
|
|
77
|
+
function validate(record) {
|
|
78
|
+
(0, _utils.nvdebug)(`VALIDATE ${description}...`);
|
|
79
|
+
const data = generateContent(record);
|
|
80
|
+
if (!data) {
|
|
81
|
+
return {
|
|
82
|
+
message: [],
|
|
83
|
+
valid: true
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const msg = `${description}: '${(0, _utils.fieldToString)(data)}'`;
|
|
87
|
+
return {
|
|
88
|
+
message: [msg],
|
|
89
|
+
valid: false
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=addMissingField041.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addMissingField041.js","names":["_utils","require","description","_default","validate","fix","getLanguageCode","record","f008","get","value","length","substring","isRealLanguageCode","languageCode","nvdebug","match","includes","determineSubfieldCode","typeOfRecord","getTypeOfRecord","generateContent","languageCodeFields","subfieldCode","tag","ind1","ind2","subfields","code","data","res","message","valid","insertField","msg","fieldToString"],"sources":["../src/addMissingField041.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\nconst description = 'Add missing 041 field based on 008/35-37';\n\n// const multimediaRegexp = /multimedia/ui;\n\nexport default function () {\n\n return {\n description, validate, fix\n };\n\n function getLanguageCode(record) {\n const [f008] = record.get('008');\n if (f008 && f008.value.length === 40) {\n return f008.value.substring(35, 38);\n }\n return '|||';\n }\n\n function isRealLanguageCode(languageCode = '|||') {\n nvdebug(`Language code 008/35-37: ${languageCode}`);\n if (!languageCode.match(/^[a-z]{3}$/u) || ['mul', 'und', 'zxx'].includes(languageCode)) {\n return false;\n }\n // Assume that value is valid:\n return true;\n }\n\n function determineSubfieldCode(record) {\n const typeOfRecord = record.getTypeOfRecord(record);\n if (typeOfRecord === 'i' || typeOfRecord === 'j') {\n return 'd';\n }\n return 'a';\n }\n\n function generateContent(record) {\n const languageCodeFields = record.get('041');\n if (languageCodeFields.length > 0) {\n return null;\n }\n const languageCode = getLanguageCode(record);\n if (!isRealLanguageCode(languageCode)) {\n return null;\n }\n const subfieldCode = determineSubfieldCode(record);\n // NB! Usemarcon-bookwhere had IND1=0...\n return {tag: '041', ind1: ' ', ind2: ' ', subfields: [{code: subfieldCode, value: languageCode}]};\n }\n\n function fix(record) {\n nvdebug(`FIX ${description}...`);\n const data = generateContent(record);\n const res = {message: [], fix: [], valid: true};\n if (data) {\n record.insertField(data);\n return res;\n }\n return res;\n }\n\n function validate(record) {\n nvdebug(`VALIDATE ${description}...`);\n const data = generateContent(record);\n if (!data) {\n return {message: [], valid: true};\n }\n const msg = `${description}: '${fieldToString(data)}'`;\n return {message: [msg], valid: false};\n }\n}\n\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AADA;;AAGA,MAAMC,WAAW,GAAG,0CAA0C;;AAE9D;;AAEe,SAAAC,SAAA,EAAY;EAEzB,OAAO;IACLD,WAAW;IAAEE,QAAQ;IAAEC;EACzB,CAAC;EAED,SAASC,eAAeA,CAACC,MAAM,EAAE;IAC/B,MAAM,CAACC,IAAI,CAAC,GAAGD,MAAM,CAACE,GAAG,CAAC,KAAK,CAAC;IAChC,IAAID,IAAI,IAAIA,IAAI,CAACE,KAAK,CAACC,MAAM,KAAK,EAAE,EAAE;MACpC,OAAOH,IAAI,CAACE,KAAK,CAACE,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;IACrC;IACA,OAAO,KAAK;EACd;EAEA,SAASC,kBAAkBA,CAACC,YAAY,GAAG,KAAK,EAAE;IAChD,IAAAC,cAAO,EAAE,4BAA2BD,YAAa,EAAC,CAAC;IACnD,IAAI,CAACA,YAAY,CAACE,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACC,QAAQ,CAACH,YAAY,CAAC,EAAE;MACtF,OAAO,KAAK;IACd;IACA;IACA,OAAO,IAAI;EACb;EAEA,SAASI,qBAAqBA,CAACX,MAAM,EAAE;IACrC,MAAMY,YAAY,GAAGZ,MAAM,CAACa,eAAe,CAACb,MAAM,CAAC;IACnD,IAAIY,YAAY,KAAK,GAAG,IAAIA,YAAY,KAAK,GAAG,EAAE;MAChD,OAAO,GAAG;IACZ;IACA,OAAO,GAAG;EACZ;EAEA,SAASE,eAAeA,CAACd,MAAM,EAAE;IAC/B,MAAMe,kBAAkB,GAAGf,MAAM,CAACE,GAAG,CAAC,KAAK,CAAC;IAC5C,IAAIa,kBAAkB,CAACX,MAAM,GAAG,CAAC,EAAE;MACjC,OAAO,IAAI;IACb;IACA,MAAMG,YAAY,GAAGR,eAAe,CAACC,MAAM,CAAC;IAC5C,IAAI,CAACM,kBAAkB,CAACC,YAAY,CAAC,EAAE;MACrC,OAAO,IAAI;IACb;IACA,MAAMS,YAAY,GAAGL,qBAAqB,CAACX,MAAM,CAAC;IAClD;IACA,OAAO;MAACiB,GAAG,EAAE,KAAK;MAAEC,IAAI,EAAE,GAAG;MAAEC,IAAI,EAAE,GAAG;MAAEC,SAAS,EAAE,CAAC;QAACC,IAAI,EAAEL,YAAY;QAAEb,KAAK,EAAEI;MAAY,CAAC;IAAC,CAAC;EACnG;EAEA,SAAST,GAAGA,CAACE,MAAM,EAAE;IACnB,IAAAQ,cAAO,EAAE,OAAMb,WAAY,KAAI,CAAC;IAChC,MAAM2B,IAAI,GAAGR,eAAe,CAACd,MAAM,CAAC;IACpC,MAAMuB,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAE1B,GAAG,EAAE,EAAE;MAAE2B,KAAK,EAAE;IAAI,CAAC;IAC/C,IAAIH,IAAI,EAAE;MACRtB,MAAM,CAAC0B,WAAW,CAACJ,IAAI,CAAC;MACxB,OAAOC,GAAG;IACZ;IACA,OAAOA,GAAG;EACZ;EAEA,SAAS1B,QAAQA,CAACG,MAAM,EAAE;IACxB,IAAAQ,cAAO,EAAE,YAAWb,WAAY,KAAI,CAAC;IACrC,MAAM2B,IAAI,GAAGR,eAAe,CAACd,MAAM,CAAC;IACpC,IAAI,CAACsB,IAAI,EAAE;MACT,OAAO;QAACE,OAAO,EAAE,EAAE;QAAEC,KAAK,EAAE;MAAI,CAAC;IACnC;IACA,MAAME,GAAG,GAAI,GAAEhC,WAAY,MAAK,IAAAiC,oBAAa,EAACN,IAAI,CAAE,GAAE;IACtD,OAAO;MAACE,OAAO,EAAE,CAACG,GAAG,CAAC;MAAEF,KAAK,EAAE;IAAK,CAAC;EACvC;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _chai = require("chai");
|
|
4
|
+
var _marcRecord = require("@natlibfi/marc-record");
|
|
5
|
+
var _addMissingField = _interopRequireDefault(require("./addMissingField041"));
|
|
6
|
+
var _fixura = require("@natlibfi/fixura");
|
|
7
|
+
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
8
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
|
+
(0, _fixugen.default)({
|
|
10
|
+
callback,
|
|
11
|
+
path: [__dirname, '..', 'test-fixtures', 'addMissingField041'],
|
|
12
|
+
useMetadataFile: true,
|
|
13
|
+
recurse: false,
|
|
14
|
+
fixura: {
|
|
15
|
+
reader: _fixura.READERS.JSON
|
|
16
|
+
},
|
|
17
|
+
mocha: {
|
|
18
|
+
before: () => testValidatorFactory()
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
async function testValidatorFactory() {
|
|
22
|
+
const validator = await (0, _addMissingField.default)();
|
|
23
|
+
(0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
|
|
24
|
+
(0, _chai.expect)(validator.description).to.be.a('string');
|
|
25
|
+
(0, _chai.expect)(validator.validate).to.be.a('function');
|
|
26
|
+
(0, _chai.expect)(validator.fix).to.be.a('function');
|
|
27
|
+
}
|
|
28
|
+
async function callback({
|
|
29
|
+
getFixture,
|
|
30
|
+
fix = false
|
|
31
|
+
}) {
|
|
32
|
+
const validator = await (0, _addMissingField.default)();
|
|
33
|
+
const record = new _marcRecord.MarcRecord(getFixture('record.json'));
|
|
34
|
+
const expectedResult = getFixture('expectedResult.json');
|
|
35
|
+
// console.log(expectedResult); // eslint-disable-line
|
|
36
|
+
|
|
37
|
+
if (!fix) {
|
|
38
|
+
const result = await validator.validate(record);
|
|
39
|
+
(0, _chai.expect)(result).to.eql(expectedResult);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
await validator.fix(record);
|
|
43
|
+
(0, _chai.expect)(record).to.eql(expectedResult);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=addMissingField041.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addMissingField041.spec.js","names":["_chai","require","_marcRecord","_addMissingField","_interopRequireDefault","_fixura","_fixugen","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","fix","getFixture","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/addMissingField041.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './addMissingField041';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'addMissingField041'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n expect(validator.fix).to.be.a('function');\n}\n\nasync function callback({getFixture, fix = false}) {\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,gBAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AAA8C,SAAAG,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE9C,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,oBAAoB,CAAC;EAC9DC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AAEF,eAAeA,oBAAoBA,CAAA,EAAG;EACpC,MAAMC,SAAS,GAAG,MAAM,IAAAC,wBAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;EAC9C,IAAAT,YAAM,EAACF,SAAS,CAACa,GAAG,CAAC,CAACV,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAC3C;AAEA,eAAevB,QAAQA,CAAC;EAAC0B,UAAU;EAAED,GAAG,GAAG;AAAK,CAAC,EAAE;EACjD,MAAMb,SAAS,GAAG,MAAM,IAAAC,wBAAgB,EAAC,CAAC;EAC1C,MAAMc,MAAM,GAAG,IAAIC,sBAAU,CAACF,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMG,cAAc,GAAGH,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACD,GAAG,EAAE;IACR,MAAMK,MAAM,GAAG,MAAMlB,SAAS,CAACY,QAAQ,CAACG,MAAM,CAAC;IAC/C,IAAAb,YAAM,EAACgB,MAAM,CAAC,CAACf,EAAE,CAACgB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMjB,SAAS,CAACa,GAAG,CAACE,MAAM,CAAC;EAC3B,IAAAb,YAAM,EAACa,MAAM,CAAC,CAACZ,EAAE,CAACgB,GAAG,CAACF,cAAc,CAAC;AACvC","ignoreList":[]}
|
|
@@ -10,9 +10,10 @@ exports.removeOwnershipSubfield5 = removeOwnershipSubfield5;
|
|
|
10
10
|
var _clone = _interopRequireDefault(require("clone"));
|
|
11
11
|
var _marcRecord = require("@natlibfi/marc-record");
|
|
12
12
|
var _fix33X = _interopRequireDefault(require("./fix-33X"));
|
|
13
|
-
var _addMissingField = _interopRequireDefault(require("./
|
|
14
|
-
var _addMissingField2 = _interopRequireDefault(require("./
|
|
15
|
-
var _addMissingField3 = _interopRequireDefault(require("./
|
|
13
|
+
var _addMissingField = _interopRequireDefault(require("./addMissingField041"));
|
|
14
|
+
var _addMissingField2 = _interopRequireDefault(require("./addMissingField336"));
|
|
15
|
+
var _addMissingField3 = _interopRequireDefault(require("./addMissingField337"));
|
|
16
|
+
var _addMissingField4 = _interopRequireDefault(require("./addMissingField338"));
|
|
16
17
|
var _fixCountryCodes = _interopRequireDefault(require("./fix-country-codes"));
|
|
17
18
|
var _fixLanguageCodes = _interopRequireDefault(require("./fix-language-codes"));
|
|
18
19
|
var _fixRelatorTerms = _interopRequireDefault(require("./fixRelatorTerms"));
|
|
@@ -76,12 +77,12 @@ function _default() {
|
|
|
76
77
|
const f028 = record.fields.filter(f => f.tag === '028');
|
|
77
78
|
f028.forEach(f => (0, _sortSubfields.sortAdjacentSubfields)(f));
|
|
78
79
|
fixField040(record); // All $b values are changed to 'mul'. As a side effect 33X$b=>$a mappings are in Finnish! Ok in this domain!
|
|
79
|
-
|
|
80
|
+
(0, _addMissingField.default)().fix(record);
|
|
80
81
|
(0, _fixRelatorTerms.default)().fix(record);
|
|
81
82
|
(0, _fix33X.default)().fix(record); // 33X$a => 33X$a$b$2
|
|
82
|
-
(0, _addMissingField.default)().fix(record);
|
|
83
83
|
(0, _addMissingField2.default)().fix(record);
|
|
84
84
|
(0, _addMissingField3.default)().fix(record);
|
|
85
|
+
(0, _addMissingField4.default)().fix(record);
|
|
85
86
|
record.fields.forEach(f => fieldSpecificStuff2(f));
|
|
86
87
|
function fieldSpecificStuff2(field) {
|
|
87
88
|
removeSubfieldH(field); // only after 33X creation, as 245$h might be useful
|
|
@@ -333,7 +334,7 @@ function translateFieldToFinnish(field) {
|
|
|
333
334
|
function expandEnglishAbbreviations(value) {
|
|
334
335
|
return value.replace(/\bbk\.\b/gui, 'book').replace(/chiefly col\./ui, 'chiefly color').replace(/col\. ill\./ui, 'color illustrations').replace(/diagrs\./ui, 'diagrams').replace(/\bhbk\.\b/gui, 'hardcover').replace(/\bhbk\b/gui, 'hardcover').
|
|
335
336
|
// expand to MTS-compliant form
|
|
336
|
-
replace(/\bill\./gui, 'illustrated').
|
|
337
|
+
replace(/\b1 hr\./gui, '1 hour').replace(/\bhr\./gui, 'hours').replace(/\bill\./gui, 'illustrated').
|
|
337
338
|
// or illustrations (or Swedish "illustrerad" or...)
|
|
338
339
|
replace(/\billus\./gui, 'illustrated').
|
|
339
340
|
// or illustrations
|
|
@@ -342,7 +343,7 @@ function expandEnglishAbbreviations(value) {
|
|
|
342
343
|
// replace(/\bmin\b/gu, 'minutes').
|
|
343
344
|
replace(/\bp\.\b/gui, 'pages').replace(/\bp\b/gu, 'pages').replace(/\bpbk\.\b/gui, 'paperback').replace(/\bpbk\b/gui, 'paperback').
|
|
344
345
|
// expand to MTS-compliant form
|
|
345
|
-
replace(/\bports\./gui, 'portraits').replace('sd., col.', 'sound, color').replace(/ *\((?:chiefly col\.|chiefly color|some
|
|
346
|
+
replace(/\bpdf\b/gui, 'PDF').replace(/\bports\./gui, 'portraits').replace('sd., col.', 'sound, color').replace(/ *\((?:chiefly col\.|chiefly color|some col[s.])\)/gui, '').replace(/\b1 hr\./gui, '1 hour');
|
|
346
347
|
}
|
|
347
348
|
function expandFinnishAbbreviations(value) {
|
|
348
349
|
return value.replace(/\bcn\. /gu, 'noin ').
|
|
@@ -357,14 +358,16 @@ function expandSwedishAbbreviations(value) {
|
|
|
357
358
|
// replace(/\bmin\b/gu, 'minuter');
|
|
358
359
|
}
|
|
359
360
|
function finnishTranslationsAndMappings(value) {
|
|
360
|
-
return value.replace('analog', 'analoginen').replace('approximately', 'noin').replace('audio discs', 'äänilevyä').replace('black and white', 'mustavalkoinen').replace(/\bcharts\b/gui, 'kaavioita').replace('chiefly color illustrations', 'pääosin värikuvitettu').replace('chiefly', 'pääosin').replace('color illustrations', 'värikuvitus').replace(/\bdigital\b/gui, 'digitaalinen').replace(/\belectronic book\b/gui, 'verkkoaineisto').replace(/\bfolded sheet\b/gui, 'taitelehti').replace(/\
|
|
361
|
-
//
|
|
362
|
-
replace(
|
|
361
|
+
return value.replace('analog', 'analoginen').replace('approximately', 'noin').replace('audio discs', 'äänilevyä').replace('black and white', 'mustavalkoinen').replace(/\bbilaga\b/gui, 'liite').replace(/\bbilagor\b/gui, 'liitettä').replace(/\bcharts\b/gui, 'kaavioita').replace('chiefly color illustrations', 'pääosin värikuvitettu').replace('chiefly', 'pääosin').replace(/\bcirca\b/gui, 'noin').replace(/coil[- ]?bound/gui, 'kierreselkä').replace('color illustrations', 'värikuvitus').replace(/comb[- ]?bound/gui, 'kierreselkä').replace(/\bdigital\b/gui, 'digitaalinen').replace(/\belectronic book\b/gui, 'verkkoaineisto').replace('(flera nummersviter)', '(useita numerointijaksoja)').replace(/\bfolded sheet\b/gui, 'taitelehti').replace(/\bfärgillustratione[nr]\b/gui, 'värikuvitus').replace(/\bhard(?:back|cover)\b/gui, 'kovakantinen').replace(/\bhours\b/gui, 'tuntia').replace(/\bi flera nummersviter/gui, 'useina numerointijaksoina').replace('illustrated', 'kuvitettu').replace(/illustrations?\b/gui, 'kuvitettu').
|
|
362
|
+
// Based on usemacron-bookwhere (NB! usemarcon-cyrillux had kuvitus/kuvitettu)
|
|
363
|
+
replace(/\binbunden\b/gui, 'kovakantinen').
|
|
364
|
+
// swe
|
|
365
|
+
replace(/\binsert\b/gui, 'liite').replace(/\binserts\b/gui, 'liitteitä').replace(/\bin various pagings/gui, 'useina numerointijaksoina').replace('leaves of plates', 'kuvalehteä').replace(/\bljudskiva\b/gui, 'äänilevy').replace(/\bljudskivor\b/gui, 'äänilevyä').replace(/\bmap\b/gui, 'kartta').replace(/\bmaps\b/gui, 'karttoja').
|
|
363
366
|
// or karttaa?
|
|
364
|
-
replace('minutes', 'minuuttia').replace('online resource', 'verkkoaineisto').replace('pages of plates', 'kuvalehteä').replace(/\bpages\b/gui, 'sivua').replace(/\bpaperback\b/gui, 'pehmeäkantinen').
|
|
367
|
+
replace('minutes', 'minuuttia').replace('mjuka pärmar', 'pehmeäkantinen').replace('online resource', 'verkkoaineisto').replace('onlineresurs', 'verkkoaineisto').replace('onumrerade', 'numeroimatonta').replace('pages of plates', 'kuvalehteä').replace(/\bpages\b/gui, 'sivua').replace(/\bpaperback\b/gui, 'pehmeäkantinen').
|
|
365
368
|
// MTS alt
|
|
366
|
-
replace(/\bsoftcover\b/gui, 'pehmeäkantinen').
|
|
369
|
+
replace(/\bSeiten\b/gu, 'sivua').replace(/\bsoftcover\b/gui, 'pehmeäkantinen').
|
|
367
370
|
// MTS pref
|
|
368
|
-
replace('sound, color', 'äänellinen, värillinen').replace('sound cassettes', 'äänikasettia').replace('sound cassette', 'äänikasetti').replace('sound discs', 'äänilevyä').replace(
|
|
371
|
+
replace('sound, color', 'äänellinen, värillinen').replace('sound cassettes', 'äänikasettia').replace('sound cassette', 'äänikasetti').replace('sound discs', 'äänilevyä').replace(/sound disc\b/gui, 'äänilevy').replace(/(?:spiral[- ]?bound|spiralrygg)/gui, 'kierreselkä').replace('svartvit', 'mustavalkoinen').replace('unnumbered', 'numeroimatonta').replace('(various pagings)', '(useita numerointijaksoja)').replace(/\bverkkojulkaisu\b/gui, 'verkkoaineisto').replace('videodiscs', 'videolevyä').replace('videodisc', 'videolevy').replace(/\b1 hour\b/gui, '1 tunti');
|
|
369
372
|
}
|
|
370
373
|
//# sourceMappingURL=cyrillux-usemarcon-replacement.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cyrillux-usemarcon-replacement.js","names":["_clone","_interopRequireDefault","require","_marcRecord","_fix33X","_addMissingField","_addMissingField2","_addMissingField3","_fixCountryCodes","_fixLanguageCodes","_fixRelatorTerms","_indicatorFixes","_punctuation","_normalizeQualifyingInformation","_sortSubfields","_utils","obj","__esModule","default","description","dropTags","_default","fix","validate","record","nvdebug","realFix","res","message","valid","fixLeader","leader","substring","fields","filter","f","includes","tag","forEach","fieldSpecificStuff","field","removeOwnershipSubfield5","removeFromOldCatalog","translateFieldToFinnish","fixCountryCodes","fixLanguageCodes","fixQualifyingInformation","f028","sortAdjacentSubfields","fixField040","fixRelatorTerms","fix33X","add336","add337","add338","fieldSpecificStuff2","removeSubfieldH","field260To264s","field410To490And810","field440To490And830","fixIndicators","fixPunctuation","originalString","recordToString","clonedRecord","MarcRecord","subfieldValues","modifiedString","f040","subfieldsBE","code","value","length","data","ind1","ind2","subfields","insertField","fixField040Subfields","sf","push","removeFromOldCatalogFromSubfield","subfield","replace","filteredFields","remainingSubfields","field810","clone","field830","createCopyright264Field","getCopyrightYear","string","match","field260To264Normalization","field260To264Normalization2","createCopyright264Value","c","undefined","copyrightYear","copType","returnValue","year","translateSubfieldToFinnish","finnishTranslationsAndMappings","expandFinnishAbbreviations","expandSwedishAbbreviations","expandEnglishAbbreviations"],"sources":["../src/cyrillux-usemarcon-replacement.js"],"sourcesContent":["/*\n* cyrillux-usemarcon-replacement.js -- implement and improve https://github.com/NatLibFi/USEMARCON-Cyrillux/tree/master\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n*/\n\nimport clone from 'clone';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {default as fix33X} from './fix-33X';\nimport {default as add336} from './addMissingField336';\nimport {default as add337} from './addMissingField337';\nimport {default as add338} from './addMissingField338';\nimport {default as fixCountryCodes} from './fix-country-codes';\nimport {default as fixLanguageCodes} from './fix-language-codes';\nimport {default as fixRelatorTerms} from './fixRelatorTerms';\nimport {default as fixIndicators} from './indicator-fixes';\nimport {default as fixPunctuation} from './punctuation2';\nimport {default as fixQualifyingInformation} from './normalize-qualifying-information';\nimport {sortAdjacentSubfields} from './sortSubfields';\n\n\n// import createDebugLogger from 'debug';\nimport {nvdebug, recordToString} from './utils';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');\n\nconst description = 'Replacement for Cyrillux usemarcon rules';\n\n// Extended original list with 541, 561, 562, 583, 584\nconst dropTags = ['001', '003', '010', '012', '014', '015', '016', '019', '025', '029', '032', '035', '036', '037', '038', '042', '049', '051', '061', '068', '071', '074', '079', '090', '091', '092', '094', '095', '096', '097', '099', '249', '261', '262', '350', '400', '411', '541', '561', '562', '574', '575', '577', '578', '583', '584', '589', '590', '591', '592', '593', '594', '595', '596', '597', '598', '599', '653', '698', '741', '742', '744', '761', '790', '841', '842', '843', '844', '845', '850', '852', '853', '854', '855', '858', '859', '863', '864', '865', '866', '867', '868', '876', '877', '878', '882', '886', '887', '888', '890', '899'];\n\nexport default function () {\n return {\n description, fix, validate\n };\n\n function fix(record) {\n nvdebug(`${description}: fix`);\n realFix(record);\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function realFix(record) {\n // Fix leader: standard fixes + update LDR/17 to '4'\n fixLeader(record);\n record.leader = `${record.leader.substring(0, 17)}4${record.leader.substring(18, 24)}`; // eslint-disable-line functional/immutable-data\n\n // Remove unwanted fields:\n record.fields = record.fields.filter(f => !dropTags.includes(f.tag)); // eslint-disable-line functional/immutable-data\n\n record.fields.forEach(f => fieldSpecificStuff(f));\n\n function fieldSpecificStuff(field) {\n removeOwnershipSubfield5(field);\n removeFromOldCatalog(field); // Remove LoC phrase \"[from old catalog]\" from srings\n translateFieldToFinnish(field);\n }\n\n fixCountryCodes().fix(record); // 008/15-17\n fixLanguageCodes().fix(record); // 008/35-37 AND 041 (note that all relevant subfield codes are fixed, not just $a)\n\n fixQualifyingInformation().fix(record); // 015, 020, 024 and 028\n\n // Field 028: use $b$a, not $a$b:\n const f028 = record.fields.filter(f => f.tag === '028');\n f028.forEach(f => sortAdjacentSubfields(f));\n\n fixField040(record); // All $b values are changed to 'mul'. As a side effect 33X$b=>$a mappings are in Finnish! Ok in this domain!\n\n fixRelatorTerms().fix(record);\n\n fix33X().fix(record); // 33X$a => 33X$a$b$2\n add336().fix(record);\n add337().fix(record);\n add338().fix(record);\n\n record.fields.forEach(f => fieldSpecificStuff2(f));\n\n function fieldSpecificStuff2(field) {\n removeSubfieldH(field); // only after 33X creation, as 245$h might be useful\n\n field260To264s(field, record);\n\n // NB! 300 (before or after 33X creation?)\n field410To490And810(field, record);\n field440To490And830(field, record);\n // handle505(field); // not applying them usemarcon-cyrillux rules for field 505 as I can't understand their motivation.\n\n }\n\n // The fixer below implement Cyrillux rules such as 245I1 | 245I1 | If (Exists(@100) Or Exists(@110) Or Exists(@111) Or Exists(@130)) Then '1' Else '0' and plenty of other good stuff:\n fixIndicators().fix(record);\n\n fixPunctuation().fix(record);\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n // Validation is currently done in subparts\n function validate(record) {\n nvdebug(`${description}: validate`);\n const originalString = recordToString(record);\n const clonedRecord = new MarcRecord(record, {subfieldValues: false});\n realFix(clonedRecord);\n const modifiedString = recordToString(clonedRecord);\n\n if (originalString === modifiedString) {\n return {message: [], valid: true};\n }\n\n return {message: ['Record changed'], valid: false}; // Less than descriptive but will do...\n\n }\n}\n\nfunction fixField040(record) {\n const f040 = record.fields.filter(f => f.tag === '040');\n\n const subfieldsBE = [\n {code: 'b', value: 'mul'},\n {code: 'e', value: 'rda'}\n ];\n\n // Add 040 if there isn't one:\n if (f040.length === 0) {\n const data = {tag: '040', ind1: ' ', ind2: ' ', subfields: subfieldsBE};\n\n record.insertField(data);\n return;\n }\n\n f040.forEach(f => fixField040Subfields(f));\n\n function fixField040Subfields(field) {\n field.subfields = field.subfields.filter(sf => !['b', 'e'].includes(sf.code)); // eslint-disable-line functional/immutable-data\n field.subfields.push(subfieldsBE[0]); // eslint-disable-line functional/immutable-data\n field.subfields.push(subfieldsBE[1]); // eslint-disable-line functional/immutable-data\n sortAdjacentSubfields(field); // put $b and $e to their proper places\n }\n\n}\n\nexport function removeFromOldCatalog(field) {\n // See https://catalog.loc.gov/vwebv/ui/en_US/htdocs/help/faqs.html for motivation\n field.subfields?.forEach(sf => removeFromOldCatalogFromSubfield(sf));\n\n function removeFromOldCatalogFromSubfield(subfield) {\n if (!subfield.value.includes('[from old catalog]')) {\n return;\n }\n subfield.value = subfield.value.replace(/ *\\[from old catalog\\]/gui, ''); // eslint-disable-line functional/immutable-data\n }\n}\n\nfunction removeSubfieldH(field) {\n if (!field.subfields || !['245', '246', '247', '740', '760', '762', '765', '767', '770', '772', '773', '774', '775', '776', '777', '780', '785', '786', '787', '788'].includes(field.tag)) {\n return;\n }\n\n const filteredFields = field.subfields.filter(sf => sf.code !== 'h');\n if (filteredFields.length > 0) {\n field.subfields = filteredFields; // eslint-disable-line functional/immutable-data\n return;\n }\n\n}\n\nexport function removeOwnershipSubfield5(field) {\n if (!field.subfields || field.subfields.length === 0) {\n return;\n }\n const remainingSubfields = field.subfields.filter(sf => sf.code !== '5');\n if (remainingSubfields.length === 0) { // sanity check/robustness\n return;\n }\n field.subfields = remainingSubfields; // eslint-disable-line functional/immutable-data\n}\n\nexport function fixLeader(record) {\n record.leader = `${record.leader.substring(0, 9)}a22${record.leader.substring(12, 18)}i${record.leader.substring(19, 20)}4500`; // eslint-disable-line functional/immutable-data\n}\n\nfunction field410To490And810(field, record) { // might be generic... if so, move to utils...\n if (field.tag !== '410') {\n return;\n }\n\n const field810 = clone(field);\n\n field.tag = '490'; // eslint-disable-line functional/immutable-data\n field.ind1 = '1'; // eslint-disable-line functional/immutable-data\n field.ind2 = ' '; // eslint-disable-line functional/immutable-data\n sortAdjacentSubfields(field);\n // 490: Fix punctuation elsewhere. (Note that the current support is lagging...)\n\n\n field810.tag = '810'; // eslint-disable-line functional/immutable-data\n field810.ind2 = ' '; // eslint-disable-line functional/immutable-data\n // 810: Fix punctuation elsewhere. (Note that the current support is lagging...)\n record.insertField(field810);\n}\n\nfunction field440To490And830(field, record) { // might be generic... if so, move to utils...\n if (field.tag !== '440') {\n return;\n }\n\n const field830 = clone(field);\n\n field.tag = '490'; // eslint-disable-line functional/immutable-data\n field.ind1 = '1'; // eslint-disable-line functional/immutable-data\n field.ind2 = ' '; // eslint-disable-line functional/immutable-data\n // 490: Fix punctuation elsewhere. (Note that the current support is lagging...)\n field830.tag = '830'; // eslint-disable-line functional/immutable-data\n // 830: Fix punctuation elsewhere. (Note that the current support is lagging...)\n record.insertField(field830);\n}\n\n\nfunction field260To264s(field, record) { // might be generic... if so, move to utils...\n // As per my quick reading of usemarcon-cyrillux\n if (field.tag !== '260') {\n return;\n }\n\n createCopyright264Field(field);\n\n field.tag = '264'; // eslint-disable-line functional/immutable-data\n field.ind1 = ' '; // eslint-disable-line functional/immutable-data\n field.ind2 = '1'; // eslint-disable-line functional/immutable-data\n\n // NB! Usemarcon does not handle 260$e$f$g => 264$a$b$c, so I'm not botherin with it either... (However, we could check our merge reducer code...)\n\n function getCopyrightYear(string) {\n if (string.match(/^(?:\\[?[Ccp]|[^0-9]*(?:cop|©|℗))[^0-9]*(?:1[789][0-9][0-9]|20[0-2][0-9])[^0-9]*$/u)) {\n return string.replace(/[^0-9]/ug, '');\n }\n return false;\n }\n\n field.subfields?.forEach(sf => field260To264Normalization(sf));\n\n function field260To264Normalization(subfield) {\n subfield.value = field260To264Normalization2(subfield); // eslint-disable-line functional/immutable-data\n }\n\n function createCopyright264Value(field) {\n // Extract/split copyright year to a separate field:\n const [c] = field.subfields.filter(sf => sf.code === 'c');\n if (!c) {\n return undefined;\n }\n const copyrightYear = getCopyrightYear(c.value);\n if (!copyrightYear) {\n return undefined;\n }\n const copType = c.value.match(/(?:^\\[?p|℗)/u) ? '℗' : '©';\n const returnValue = c.value.includes('[') ? `[${copType}${copyrightYear}]` : `${copType}${copyrightYear}`;\n // Moidy the original value:\n c.value = `[${copyrightYear}]`; // eslint-disable-line functional/immutable-data\n return returnValue;\n }\n\n function createCopyright264Field(field) {\n const c = createCopyright264Value(field);\n if (!c) {\n return undefined;\n }\n const data = {'tag': '264', 'ind1': ' ', 'ind2': '4', 'subfields': [{'code': 'c', 'value': c}]};\n record.insertField(data);\n }\n\n function field260To264Normalization2(subfield) {\n if (subfield.code === 'a') {\n return subfield.value.replace(/\\b[Ss]\\. ?l\\./u, 'Kustannuspaikka tuntematon');\n }\n if (subfield.code === 'b') {\n return subfield.value.replace(/\\b[Ss]\\. ?n\\./u, 'kustantaja tuntematon');\n }\n if (subfield.code === 'c') {\n const year = getCopyrightYear(subfield.value);\n if (year) {\n const c = subfield.value.match(/(?:^p|℗)/u) ? 'p' : 'c';\n if (subfield.value.includes('[')) {\n return `${c}[${year}]`;\n }\n return `${c}${year}`;\n }\n return subfield.value.replace(/\\b[Ss]\\. ?a\\./u, 'julkaisuaika tuntematon');\n }\n return subfield.value;\n }\n\n\n}\n\n/*\nfunction handle505(field) {\n if (field.tag !== '505') {\n return;\n }\n // Don't know how/why usemarcon-cyrillux is so sure about ind1...\n field.ind1 = '0'; // eslint-disable-line functional/immutable-data\n // usemarcon-cyrillux drops irrelevant subfields, so we do the same. However, we have included some control subfields in the kept side:\n const keptSubfields = field.subfields.filter(sf => ['a', 'g', 'r', 't', 'u', '6', '8', '9'].includes(sf.code));\n\n if (keptSubfields.some(sf => ['a', 'g', 'r', 't', 'u'].includes(sf.code))) {\n field.subfields = keptSubfields; // eslint-disable-line functional/immutable-data\n return;\n }\n}\n*/\n\nfunction translateFieldToFinnish(field) {\n if (!['020', '300'].includes(field.tag)) {\n return;\n }\n field.subfields?.forEach(sf => translateSubfieldToFinnish(sf));\n\n function translateSubfieldToFinnish(subfield) {\n if (field.tag === '020' && ['a', 'q', 'z'].includes(subfield.code)) {\n subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value)))); // eslint-disable-line functional/immutable-data\n return;\n }\n if (field.tag === '300') {\n subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value)))); // eslint-disable-line functional/immutable-data\n return;\n }\n }\n}\n\nfunction expandEnglishAbbreviations(value) {\n return value.replace(/\\bbk\\.\\b/gui, 'book').\n replace(/chiefly col\\./ui, 'chiefly color').\n replace(/col\\. ill\\./ui, 'color illustrations').\n replace(/diagrs\\./ui, 'diagrams').\n replace(/\\bhbk\\.\\b/gui, 'hardcover').replace(/\\bhbk\\b/gui, 'hardcover'). // expand to MTS-compliant form\n replace(/\\bill\\./gui, 'illustrated'). // or illustrations (or Swedish \"illustrerad\" or...)\n replace(/\\billus\\./gui, 'illustrated'). // or illustrations\n replace(/incl\\./gui, 'includes').\n replace(/fold\\.? maps/gui, 'folded maps').\n // replace(/\\bmin\\./gu, 'minutes').\n // replace(/\\bmin\\b/gu, 'minutes').\n replace(/\\bp\\.\\b/gui, 'pages').replace(/\\bp\\b/gu, 'pages').\n replace(/\\bpbk\\.\\b/gui, 'paperback').replace(/\\bpbk\\b/gui, 'paperback'). // expand to MTS-compliant form\n replace(/\\bports\\./gui, 'portraits').\n replace('sd., col.', 'sound, color').\n replace(/ *\\((?:chiefly col\\.|chiefly color|some cols)\\)/gui, '').\n replace(/\\b1 hr\\./gui, '1 hour');\n}\n\nfunction expandFinnishAbbreviations(value) {\n return value.replace(/\\bcn\\. /gu, 'noin ').\n // replace(/\\bmin\\./gu, 'minuuttia').\n // replace(/\\bmin\\b/gu, 'minuuttia').\n replace(/\\bnid\\./gu, 'nidottu').replace(/\\bnid\\b/gui, 'nidottu').\n replace(/\\bsid\\./gu, 'sidottu').replace(/\\bsid\\b/gui, 'sidottu').\n replace(/\\bverkkojulk\\.\\b/gu, 'verkkojulkaisu').replace(/\\bverkkojulk\\b/gu, 'verkkojulkaisu').\n replace(/^\\(([^)]+)\\)$/u, '$1'); // eslint-disable-line prefer-named-capture-group\n // <- removal of brackets above could use a better location\n}\n\nfunction expandSwedishAbbreviations(value) {\n return value.replace(/\\bca\\. /gu, 'circa ').\n replace(/\\bhft\\./gui, 'häftad').replace(/\\bhft\\b/gui, 'häftad');\n // replace(/\\bmin\\./gu, 'minuter').\n // replace(/\\bmin\\b/gu, 'minuter');\n}\n\nfunction finnishTranslationsAndMappings(value) {\n return value.replace('analog', 'analoginen').\n replace('approximately', 'noin').\n replace('audio discs', 'äänilevyä').\n replace('black and white', 'mustavalkoinen').\n replace(/\\bcharts\\b/gui, 'kaavioita').\n replace('chiefly color illustrations', 'pääosin värikuvitettu').\n replace('chiefly', 'pääosin').\n replace('color illustrations', 'värikuvitus').\n replace(/\\bdigital\\b/gui, 'digitaalinen').\n replace(/\\belectronic book\\b/gui, 'verkkoaineisto').\n replace(/\\bfolded sheet\\b/gui, 'taitelehti').\n replace(/\\bhardback\\b/gui, 'kovakantinen').\n replace(/\\bhours\\b/gui, 'tuntia').\n replace('illustrated', 'kuvitettu').\n replace(/illustration\\b/gui, 'kuvitus'). // kuvitus/kuvitettu variation is taken from usemarcon-cyrillux...\n replace('illustrations', 'kuvitettu').\n replace(/\\binsert\\b/gui, 'liite').\n replace(/\\binserts\\b/gui, 'liitteitä').\n replace('leaves of plates', 'kuvalehteä').\n replace(/\\bmap\\b/gui, 'kartta').\n replace(/\\bmaps\\b/gui, 'karttoja'). // or karttaa?\n replace('minutes', 'minuuttia').\n replace('online resource', 'verkkoaineisto').\n replace('pages of plates', 'kuvalehteä').\n replace(/\\bpages\\b/gui, 'sivua').\n replace(/\\bpaperback\\b/gui, 'pehmeäkantinen'). // MTS alt\n replace(/\\bsoftcover\\b/gui, 'pehmeäkantinen'). // MTS pref\n replace('sound, color', 'äänellinen, värillinen').\n replace('sound cassettes', 'äänikasettia').replace('sound cassette', 'äänikasetti').\n replace('sound discs', 'äänilevyä').replace('sound disc', 'äänilevy').\n replace('unnumbered', 'numeroimatonta').\n replace(/\\bverkkojulkaisu\\b/gui, 'verkkoaineisto').\n replace('videodiscs', 'videolevyä').\n replace('videodisc', 'videolevy').\n replace(/\\b1 hour\\b/gui, '1 tunti');\n\n}\n"],"mappings":";;;;;;;;;AAOA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,gBAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,iBAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,iBAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,gBAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,iBAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,gBAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,eAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,YAAA,GAAAX,sBAAA,CAAAC,OAAA;AACA,IAAAW,+BAAA,GAAAZ,sBAAA,CAAAC,OAAA;AACA,IAAAY,cAAA,GAAAZ,OAAA;AAIA,IAAAa,MAAA,GAAAb,OAAA;AAAgD,SAAAD,uBAAAe,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAvBhD;AACA;AACA;AACA;AACA;AACA;;AAiBA;;AAGA;;AAEA,MAAMG,WAAW,GAAG,0CAA0C;;AAE9D;AACA,MAAMC,QAAQ,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AAE/nB,SAAAC,SAAA,EAAY;EACzB,OAAO;IACLF,WAAW;IAAEG,GAAG;IAAEC;EACpB,CAAC;EAED,SAASD,GAAGA,CAACE,MAAM,EAAE;IACnB,IAAAC,cAAO,EAAE,GAAEN,WAAY,OAAM,CAAC;IAC9BO,OAAO,CAACF,MAAM,CAAC;IACf,MAAMG,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEN,GAAG,EAAE,EAAE;MAAEO,KAAK,EAAE;IAAI,CAAC;IAC/C,OAAOF,GAAG;EACZ;EAEA,SAASD,OAAOA,CAACF,MAAM,EAAE;IACvB;IACAM,SAAS,CAACN,MAAM,CAAC;IACjBA,MAAM,CAACO,MAAM,GAAI,GAAEP,MAAM,CAACO,MAAM,CAACC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAE,IAAGR,MAAM,CAACO,MAAM,CAACC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAE,EAAC,CAAC,CAAC;;IAExF;IACAR,MAAM,CAACS,MAAM,GAAGT,MAAM,CAACS,MAAM,CAACC,MAAM,CAACC,CAAC,IAAI,CAACf,QAAQ,CAACgB,QAAQ,CAACD,CAAC,CAACE,GAAG,CAAC,CAAC,CAAC,CAAC;;IAEtEb,MAAM,CAACS,MAAM,CAACK,OAAO,CAACH,CAAC,IAAII,kBAAkB,CAACJ,CAAC,CAAC,CAAC;IAEjD,SAASI,kBAAkBA,CAACC,KAAK,EAAE;MACjCC,wBAAwB,CAACD,KAAK,CAAC;MAC/BE,oBAAoB,CAACF,KAAK,CAAC,CAAC,CAAC;MAC7BG,uBAAuB,CAACH,KAAK,CAAC;IAChC;IAEA,IAAAI,wBAAe,EAAC,CAAC,CAACtB,GAAG,CAACE,MAAM,CAAC,CAAC,CAAC;IAC/B,IAAAqB,yBAAgB,EAAC,CAAC,CAACvB,GAAG,CAACE,MAAM,CAAC,CAAC,CAAC;;IAEhC,IAAAsB,uCAAwB,EAAC,CAAC,CAACxB,GAAG,CAACE,MAAM,CAAC,CAAC,CAAC;;IAExC;IACA,MAAMuB,IAAI,GAAGvB,MAAM,CAACS,MAAM,CAACC,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACE,GAAG,KAAK,KAAK,CAAC;IACvDU,IAAI,CAACT,OAAO,CAACH,CAAC,IAAI,IAAAa,oCAAqB,EAACb,CAAC,CAAC,CAAC;IAE3Cc,WAAW,CAACzB,MAAM,CAAC,CAAC,CAAC;;IAErB,IAAA0B,wBAAe,EAAC,CAAC,CAAC5B,GAAG,CAACE,MAAM,CAAC;IAE7B,IAAA2B,eAAM,EAAC,CAAC,CAAC7B,GAAG,CAACE,MAAM,CAAC,CAAC,CAAC;IACtB,IAAA4B,wBAAM,EAAC,CAAC,CAAC9B,GAAG,CAACE,MAAM,CAAC;IACpB,IAAA6B,yBAAM,EAAC,CAAC,CAAC/B,GAAG,CAACE,MAAM,CAAC;IACpB,IAAA8B,yBAAM,EAAC,CAAC,CAAChC,GAAG,CAACE,MAAM,CAAC;IAEpBA,MAAM,CAACS,MAAM,CAACK,OAAO,CAACH,CAAC,IAAIoB,mBAAmB,CAACpB,CAAC,CAAC,CAAC;IAElD,SAASoB,mBAAmBA,CAACf,KAAK,EAAE;MAClCgB,eAAe,CAAChB,KAAK,CAAC,CAAC,CAAC;;MAExBiB,cAAc,CAACjB,KAAK,EAAEhB,MAAM,CAAC;;MAE7B;MACAkC,mBAAmB,CAAClB,KAAK,EAAEhB,MAAM,CAAC;MAClCmC,mBAAmB,CAACnB,KAAK,EAAEhB,MAAM,CAAC;MAClC;IAEF;;IAEA;IACA,IAAAoC,uBAAa,EAAC,CAAC,CAACtC,GAAG,CAACE,MAAM,CAAC;IAE3B,IAAAqC,oBAAc,EAAC,CAAC,CAACvC,GAAG,CAACE,MAAM,CAAC;IAE5B,MAAMG,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEN,GAAG,EAAE,EAAE;MAAEO,KAAK,EAAE;IAAI,CAAC;IAC/C,OAAOF,GAAG;EACZ;;EAEA;EACA,SAASJ,QAAQA,CAACC,MAAM,EAAE;IACxB,IAAAC,cAAO,EAAE,GAAEN,WAAY,YAAW,CAAC;IACnC,MAAM2C,cAAc,GAAG,IAAAC,qBAAc,EAACvC,MAAM,CAAC;IAC7C,MAAMwC,YAAY,GAAG,IAAIC,sBAAU,CAACzC,MAAM,EAAE;MAAC0C,cAAc,EAAE;IAAK,CAAC,CAAC;IACpExC,OAAO,CAACsC,YAAY,CAAC;IACrB,MAAMG,cAAc,GAAG,IAAAJ,qBAAc,EAACC,YAAY,CAAC;IAEnD,IAAIF,cAAc,KAAKK,cAAc,EAAE;MACrC,OAAO;QAACvC,OAAO,EAAE,EAAE;QAAEC,KAAK,EAAE;MAAI,CAAC;IACnC;IAEA,OAAO;MAACD,OAAO,EAAE,CAAC,gBAAgB,CAAC;MAAEC,KAAK,EAAE;IAAK,CAAC,CAAC,CAAC;EAEtD;AACF;AAEA,SAASoB,WAAWA,CAACzB,MAAM,EAAE;EAC3B,MAAM4C,IAAI,GAAG5C,MAAM,CAACS,MAAM,CAACC,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACE,GAAG,KAAK,KAAK,CAAC;EAEvD,MAAMgC,WAAW,GAAG,CAClB;IAACC,IAAI,EAAE,GAAG;IAAEC,KAAK,EAAE;EAAK,CAAC,EACzB;IAACD,IAAI,EAAE,GAAG;IAAEC,KAAK,EAAE;EAAK,CAAC,CAC1B;;EAED;EACA,IAAIH,IAAI,CAACI,MAAM,KAAK,CAAC,EAAE;IACrB,MAAMC,IAAI,GAAG;MAACpC,GAAG,EAAE,KAAK;MAAEqC,IAAI,EAAE,GAAG;MAAEC,IAAI,EAAE,GAAG;MAAEC,SAAS,EAAEP;IAAW,CAAC;IAEvE7C,MAAM,CAACqD,WAAW,CAACJ,IAAI,CAAC;IACxB;EACF;EAEAL,IAAI,CAAC9B,OAAO,CAACH,CAAC,IAAI2C,oBAAoB,CAAC3C,CAAC,CAAC,CAAC;EAE1C,SAAS2C,oBAAoBA,CAACtC,KAAK,EAAE;IACnCA,KAAK,CAACoC,SAAS,GAAGpC,KAAK,CAACoC,SAAS,CAAC1C,MAAM,CAAC6C,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC3C,QAAQ,CAAC2C,EAAE,CAACT,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/E9B,KAAK,CAACoC,SAAS,CAACI,IAAI,CAACX,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC7B,KAAK,CAACoC,SAAS,CAACI,IAAI,CAACX,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAArB,oCAAqB,EAACR,KAAK,CAAC,CAAC,CAAC;EAChC;AAEF;AAEO,SAASE,oBAAoBA,CAACF,KAAK,EAAE;EAC1C;EACAA,KAAK,CAACoC,SAAS,EAAEtC,OAAO,CAACyC,EAAE,IAAIE,gCAAgC,CAACF,EAAE,CAAC,CAAC;EAEpE,SAASE,gCAAgCA,CAACC,QAAQ,EAAE;IAClD,IAAI,CAACA,QAAQ,CAACX,KAAK,CAACnC,QAAQ,CAAC,oBAAoB,CAAC,EAAE;MAClD;IACF;IACA8C,QAAQ,CAACX,KAAK,GAAGW,QAAQ,CAACX,KAAK,CAACY,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC,CAAC;EAC5E;AACF;AAEA,SAAS3B,eAAeA,CAAChB,KAAK,EAAE;EAC9B,IAAI,CAACA,KAAK,CAACoC,SAAS,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACxC,QAAQ,CAACI,KAAK,CAACH,GAAG,CAAC,EAAE;IACzL;EACF;EAEA,MAAM+C,cAAc,GAAG5C,KAAK,CAACoC,SAAS,CAAC1C,MAAM,CAAC6C,EAAE,IAAIA,EAAE,CAACT,IAAI,KAAK,GAAG,CAAC;EACpE,IAAIc,cAAc,CAACZ,MAAM,GAAG,CAAC,EAAE;IAC7BhC,KAAK,CAACoC,SAAS,GAAGQ,cAAc,CAAC,CAAC;IAClC;EACF;AAEF;AAEO,SAAS3C,wBAAwBA,CAACD,KAAK,EAAE;EAC9C,IAAI,CAACA,KAAK,CAACoC,SAAS,IAAIpC,KAAK,CAACoC,SAAS,CAACJ,MAAM,KAAK,CAAC,EAAE;IACpD;EACF;EACA,MAAMa,kBAAkB,GAAG7C,KAAK,CAACoC,SAAS,CAAC1C,MAAM,CAAC6C,EAAE,IAAIA,EAAE,CAACT,IAAI,KAAK,GAAG,CAAC;EACxE,IAAIe,kBAAkB,CAACb,MAAM,KAAK,CAAC,EAAE;IAAE;IACrC;EACF;EACAhC,KAAK,CAACoC,SAAS,GAAGS,kBAAkB,CAAC,CAAC;AACxC;AAEO,SAASvD,SAASA,CAACN,MAAM,EAAE;EAChCA,MAAM,CAACO,MAAM,GAAI,GAAEP,MAAM,CAACO,MAAM,CAACC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAE,MAAKR,MAAM,CAACO,MAAM,CAACC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAE,IAAGR,MAAM,CAACO,MAAM,CAACC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAE,MAAK,CAAC,CAAC;AAClI;AAEA,SAAS0B,mBAAmBA,CAAClB,KAAK,EAAEhB,MAAM,EAAE;EAAE;EAC5C,IAAIgB,KAAK,CAACH,GAAG,KAAK,KAAK,EAAE;IACvB;EACF;EAEA,MAAMiD,QAAQ,GAAG,IAAAC,cAAK,EAAC/C,KAAK,CAAC;EAE7BA,KAAK,CAACH,GAAG,GAAG,KAAK,CAAC,CAAC;EACnBG,KAAK,CAACkC,IAAI,GAAG,GAAG,CAAC,CAAC;EAClBlC,KAAK,CAACmC,IAAI,GAAG,GAAG,CAAC,CAAC;EAClB,IAAA3B,oCAAqB,EAACR,KAAK,CAAC;EAC5B;;EAGA8C,QAAQ,CAACjD,GAAG,GAAG,KAAK,CAAC,CAAC;EACtBiD,QAAQ,CAACX,IAAI,GAAG,GAAG,CAAC,CAAC;EACrB;EACAnD,MAAM,CAACqD,WAAW,CAACS,QAAQ,CAAC;AAC9B;AAEA,SAAS3B,mBAAmBA,CAACnB,KAAK,EAAEhB,MAAM,EAAE;EAAE;EAC5C,IAAIgB,KAAK,CAACH,GAAG,KAAK,KAAK,EAAE;IACvB;EACF;EAEA,MAAMmD,QAAQ,GAAG,IAAAD,cAAK,EAAC/C,KAAK,CAAC;EAE7BA,KAAK,CAACH,GAAG,GAAG,KAAK,CAAC,CAAC;EACnBG,KAAK,CAACkC,IAAI,GAAG,GAAG,CAAC,CAAC;EAClBlC,KAAK,CAACmC,IAAI,GAAG,GAAG,CAAC,CAAC;EAClB;EACAa,QAAQ,CAACnD,GAAG,GAAG,KAAK,CAAC,CAAC;EACtB;EACAb,MAAM,CAACqD,WAAW,CAACW,QAAQ,CAAC;AAC9B;AAGA,SAAS/B,cAAcA,CAACjB,KAAK,EAAEhB,MAAM,EAAE;EAAE;EACvC;EACA,IAAIgB,KAAK,CAACH,GAAG,KAAK,KAAK,EAAE;IACvB;EACF;EAEAoD,uBAAuB,CAACjD,KAAK,CAAC;EAE9BA,KAAK,CAACH,GAAG,GAAG,KAAK,CAAC,CAAC;EACnBG,KAAK,CAACkC,IAAI,GAAG,GAAG,CAAC,CAAC;EAClBlC,KAAK,CAACmC,IAAI,GAAG,GAAG,CAAC,CAAC;;EAElB;;EAEA,SAASe,gBAAgBA,CAACC,MAAM,EAAE;IAChC,IAAIA,MAAM,CAACC,KAAK,CAAC,mFAAmF,CAAC,EAAE;MACrG,OAAOD,MAAM,CAACR,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;IACvC;IACA,OAAO,KAAK;EACd;EAEA3C,KAAK,CAACoC,SAAS,EAAEtC,OAAO,CAACyC,EAAE,IAAIc,0BAA0B,CAACd,EAAE,CAAC,CAAC;EAE9D,SAASc,0BAA0BA,CAACX,QAAQ,EAAE;IAC5CA,QAAQ,CAACX,KAAK,GAAGuB,2BAA2B,CAACZ,QAAQ,CAAC,CAAC,CAAC;EAC1D;EAEA,SAASa,uBAAuBA,CAACvD,KAAK,EAAE;IACtC;IACA,MAAM,CAACwD,CAAC,CAAC,GAAGxD,KAAK,CAACoC,SAAS,CAAC1C,MAAM,CAAC6C,EAAE,IAAIA,EAAE,CAACT,IAAI,KAAK,GAAG,CAAC;IACzD,IAAI,CAAC0B,CAAC,EAAE;MACN,OAAOC,SAAS;IAClB;IACA,MAAMC,aAAa,GAAGR,gBAAgB,CAACM,CAAC,CAACzB,KAAK,CAAC;IAC/C,IAAI,CAAC2B,aAAa,EAAE;MAClB,OAAOD,SAAS;IAClB;IACA,MAAME,OAAO,GAAGH,CAAC,CAACzB,KAAK,CAACqB,KAAK,CAAC,cAAc,CAAC,GAAG,GAAG,GAAG,GAAG;IACzD,MAAMQ,WAAW,GAAGJ,CAAC,CAACzB,KAAK,CAACnC,QAAQ,CAAC,GAAG,CAAC,GAAI,IAAG+D,OAAQ,GAAED,aAAc,GAAE,GAAI,GAAEC,OAAQ,GAAED,aAAc,EAAC;IACzG;IACAF,CAAC,CAACzB,KAAK,GAAI,IAAG2B,aAAc,GAAE,CAAC,CAAC;IAChC,OAAOE,WAAW;EACpB;EAEA,SAASX,uBAAuBA,CAACjD,KAAK,EAAE;IACtC,MAAMwD,CAAC,GAAGD,uBAAuB,CAACvD,KAAK,CAAC;IACxC,IAAI,CAACwD,CAAC,EAAE;MACN,OAAOC,SAAS;IAClB;IACA,MAAMxB,IAAI,GAAG;MAAC,KAAK,EAAE,KAAK;MAAE,MAAM,EAAE,GAAG;MAAE,MAAM,EAAE,GAAG;MAAE,WAAW,EAAE,CAAC;QAAC,MAAM,EAAE,GAAG;QAAE,OAAO,EAAEuB;MAAC,CAAC;IAAC,CAAC;IAC/FxE,MAAM,CAACqD,WAAW,CAACJ,IAAI,CAAC;EAC1B;EAEA,SAASqB,2BAA2BA,CAACZ,QAAQ,EAAE;IAC7C,IAAIA,QAAQ,CAACZ,IAAI,KAAK,GAAG,EAAE;MACzB,OAAOY,QAAQ,CAACX,KAAK,CAACY,OAAO,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;IAC/E;IACA,IAAID,QAAQ,CAACZ,IAAI,KAAK,GAAG,EAAE;MACzB,OAAOY,QAAQ,CAACX,KAAK,CAACY,OAAO,CAAC,gBAAgB,EAAE,uBAAuB,CAAC;IAC1E;IACA,IAAID,QAAQ,CAACZ,IAAI,KAAK,GAAG,EAAE;MACzB,MAAM+B,IAAI,GAAGX,gBAAgB,CAACR,QAAQ,CAACX,KAAK,CAAC;MAC7C,IAAI8B,IAAI,EAAE;QACR,MAAML,CAAC,GAAGd,QAAQ,CAACX,KAAK,CAACqB,KAAK,CAAC,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG;QACvD,IAAIV,QAAQ,CAACX,KAAK,CAACnC,QAAQ,CAAC,GAAG,CAAC,EAAE;UAChC,OAAQ,GAAE4D,CAAE,IAAGK,IAAK,GAAE;QACxB;QACA,OAAQ,GAAEL,CAAE,GAAEK,IAAK,EAAC;MACtB;MACA,OAAOnB,QAAQ,CAACX,KAAK,CAACY,OAAO,CAAC,gBAAgB,EAAE,yBAAyB,CAAC;IAC5E;IACA,OAAOD,QAAQ,CAACX,KAAK;EACvB;AAGF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS5B,uBAAuBA,CAACH,KAAK,EAAE;EACtC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAACJ,QAAQ,CAACI,KAAK,CAACH,GAAG,CAAC,EAAE;IACvC;EACF;EACAG,KAAK,CAACoC,SAAS,EAAEtC,OAAO,CAACyC,EAAE,IAAIuB,0BAA0B,CAACvB,EAAE,CAAC,CAAC;EAE9D,SAASuB,0BAA0BA,CAACpB,QAAQ,EAAE;IAC5C,IAAI1C,KAAK,CAACH,GAAG,KAAK,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAACD,QAAQ,CAAC8C,QAAQ,CAACZ,IAAI,CAAC,EAAE;MAClEY,QAAQ,CAACX,KAAK,GAAGgC,8BAA8B,CAACC,0BAA0B,CAACC,0BAA0B,CAACC,0BAA0B,CAACxB,QAAQ,CAACX,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MACrJ;IACF;IACA,IAAI/B,KAAK,CAACH,GAAG,KAAK,KAAK,EAAE;MACvB6C,QAAQ,CAACX,KAAK,GAAGgC,8BAA8B,CAACC,0BAA0B,CAACC,0BAA0B,CAACC,0BAA0B,CAACxB,QAAQ,CAACX,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MACrJ;IACF;EACF;AACF;AAEA,SAASmC,0BAA0BA,CAACnC,KAAK,EAAE;EACzC,OAAOA,KAAK,CAACY,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CACzCA,OAAO,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAC3CA,OAAO,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAC/CA,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CACjCA,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,CAACA,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC;EAAE;EACzEA,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC;EAAE;EACtCA,OAAO,CAAC,cAAc,EAAE,aAAa,CAAC;EAAE;EACxCA,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAChCA,OAAO,CAAC,iBAAiB,EAAE,aAAa,CAAC;EACzC;EACA;EACAA,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAACA,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAC1DA,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,CAACA,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC;EAAE;EACzEA,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,CACpCA,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,CACpCA,OAAO,CAAC,oDAAoD,EAAE,EAAE,CAAC,CACjEA,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC;AACpC;AAEA,SAASqB,0BAA0BA,CAACjC,KAAK,EAAE;EACzC,OAAOA,KAAK,CAACY,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC;EACxC;EACA;EACAA,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAACA,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAChEA,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAACA,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAChEA,OAAO,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAACA,OAAO,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAC7FA,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;EACnC;AACF;AAEA,SAASsB,0BAA0BA,CAAClC,KAAK,EAAE;EACzC,OAAOA,KAAK,CAACY,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CACzCA,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAACA,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;EACjE;EACA;AACF;AAEA,SAASoB,8BAA8BA,CAAChC,KAAK,EAAE;EAC7C,OAAOA,KAAK,CAACY,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAC1CA,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAChCA,OAAO,CAAC,aAAa,EAAE,WAAW,CAAC,CACnCA,OAAO,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAC5CA,OAAO,CAAC,eAAe,EAAE,WAAW,CAAC,CACrCA,OAAO,CAAC,6BAA6B,EAAE,uBAAuB,CAAC,CAC/DA,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAC7BA,OAAO,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAC7CA,OAAO,CAAC,gBAAgB,EAAE,cAAc,CAAC,CACzCA,OAAO,CAAC,wBAAwB,EAAE,gBAAgB,CAAC,CACnDA,OAAO,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAC5CA,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAC1CA,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,CACjCA,OAAO,CAAC,aAAa,EAAE,WAAW,CAAC,CACnCA,OAAO,CAAC,mBAAmB,EAAE,SAAS,CAAC;EAAE;EACzCA,OAAO,CAAC,eAAe,EAAE,WAAW,CAAC,CACrCA,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CACjCA,OAAO,CAAC,gBAAgB,EAAE,WAAW,CAAC,CACtCA,OAAO,CAAC,kBAAkB,EAAE,YAAY,CAAC,CACzCA,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAC/BA,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC;EAAE;EACpCA,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAC/BA,OAAO,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAC5CA,OAAO,CAAC,iBAAiB,EAAE,YAAY,CAAC,CACxCA,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAChCA,OAAO,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;EAAE;EAC/CA,OAAO,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;EAAE;EAC/CA,OAAO,CAAC,cAAc,EAAE,wBAAwB,CAAC,CACjDA,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAACA,OAAO,CAAC,gBAAgB,EAAE,aAAa,CAAC,CACnFA,OAAO,CAAC,aAAa,EAAE,WAAW,CAAC,CAACA,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CACrEA,OAAO,CAAC,YAAY,EAAE,gBAAgB,CAAC,CACvCA,OAAO,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAClDA,OAAO,CAAC,YAAY,EAAE,YAAY,CAAC,CACnCA,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CACjCA,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC;AAEvC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"cyrillux-usemarcon-replacement.js","names":["_clone","_interopRequireDefault","require","_marcRecord","_fix33X","_addMissingField","_addMissingField2","_addMissingField3","_addMissingField4","_fixCountryCodes","_fixLanguageCodes","_fixRelatorTerms","_indicatorFixes","_punctuation","_normalizeQualifyingInformation","_sortSubfields","_utils","obj","__esModule","default","description","dropTags","_default","fix","validate","record","nvdebug","realFix","res","message","valid","fixLeader","leader","substring","fields","filter","f","includes","tag","forEach","fieldSpecificStuff","field","removeOwnershipSubfield5","removeFromOldCatalog","translateFieldToFinnish","fixCountryCodes","fixLanguageCodes","fixQualifyingInformation","f028","sortAdjacentSubfields","fixField040","add041","fixRelatorTerms","fix33X","add336","add337","add338","fieldSpecificStuff2","removeSubfieldH","field260To264s","field410To490And810","field440To490And830","fixIndicators","fixPunctuation","originalString","recordToString","clonedRecord","MarcRecord","subfieldValues","modifiedString","f040","subfieldsBE","code","value","length","data","ind1","ind2","subfields","insertField","fixField040Subfields","sf","push","removeFromOldCatalogFromSubfield","subfield","replace","filteredFields","remainingSubfields","field810","clone","field830","createCopyright264Field","getCopyrightYear","string","match","field260To264Normalization","field260To264Normalization2","createCopyright264Value","c","undefined","copyrightYear","copType","returnValue","year","translateSubfieldToFinnish","finnishTranslationsAndMappings","expandFinnishAbbreviations","expandSwedishAbbreviations","expandEnglishAbbreviations"],"sources":["../src/cyrillux-usemarcon-replacement.js"],"sourcesContent":["/*\n* cyrillux-usemarcon-replacement.js -- implement and improve https://github.com/NatLibFi/USEMARCON-Cyrillux/tree/master\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n*/\n\nimport clone from 'clone';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {default as fix33X} from './fix-33X';\nimport {default as add041} from './addMissingField041';\nimport {default as add336} from './addMissingField336';\nimport {default as add337} from './addMissingField337';\nimport {default as add338} from './addMissingField338';\nimport {default as fixCountryCodes} from './fix-country-codes';\nimport {default as fixLanguageCodes} from './fix-language-codes';\nimport {default as fixRelatorTerms} from './fixRelatorTerms';\nimport {default as fixIndicators} from './indicator-fixes';\nimport {default as fixPunctuation} from './punctuation2';\nimport {default as fixQualifyingInformation} from './normalize-qualifying-information';\nimport {sortAdjacentSubfields} from './sortSubfields';\n\n\n// import createDebugLogger from 'debug';\nimport {nvdebug, recordToString} from './utils';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');\n\nconst description = 'Replacement for Cyrillux usemarcon rules';\n\n// Extended original list with 541, 561, 562, 583, 584\nconst dropTags = ['001', '003', '010', '012', '014', '015', '016', '019', '025', '029', '032', '035', '036', '037', '038', '042', '049', '051', '061', '068', '071', '074', '079', '090', '091', '092', '094', '095', '096', '097', '099', '249', '261', '262', '350', '400', '411', '541', '561', '562', '574', '575', '577', '578', '583', '584', '589', '590', '591', '592', '593', '594', '595', '596', '597', '598', '599', '653', '698', '741', '742', '744', '761', '790', '841', '842', '843', '844', '845', '850', '852', '853', '854', '855', '858', '859', '863', '864', '865', '866', '867', '868', '876', '877', '878', '882', '886', '887', '888', '890', '899'];\n\nexport default function () {\n return {\n description, fix, validate\n };\n\n function fix(record) {\n nvdebug(`${description}: fix`);\n realFix(record);\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function realFix(record) {\n // Fix leader: standard fixes + update LDR/17 to '4'\n fixLeader(record);\n record.leader = `${record.leader.substring(0, 17)}4${record.leader.substring(18, 24)}`; // eslint-disable-line functional/immutable-data\n\n // Remove unwanted fields:\n record.fields = record.fields.filter(f => !dropTags.includes(f.tag)); // eslint-disable-line functional/immutable-data\n\n record.fields.forEach(f => fieldSpecificStuff(f));\n\n function fieldSpecificStuff(field) {\n removeOwnershipSubfield5(field);\n removeFromOldCatalog(field); // Remove LoC phrase \"[from old catalog]\" from srings\n translateFieldToFinnish(field);\n }\n\n fixCountryCodes().fix(record); // 008/15-17\n fixLanguageCodes().fix(record); // 008/35-37 AND 041 (note that all relevant subfield codes are fixed, not just $a)\n\n fixQualifyingInformation().fix(record); // 015, 020, 024 and 028\n\n // Field 028: use $b$a, not $a$b:\n const f028 = record.fields.filter(f => f.tag === '028');\n f028.forEach(f => sortAdjacentSubfields(f));\n\n fixField040(record); // All $b values are changed to 'mul'. As a side effect 33X$b=>$a mappings are in Finnish! Ok in this domain!\n add041().fix(record);\n\n fixRelatorTerms().fix(record);\n\n fix33X().fix(record); // 33X$a => 33X$a$b$2\n add336().fix(record);\n add337().fix(record);\n add338().fix(record);\n\n record.fields.forEach(f => fieldSpecificStuff2(f));\n\n function fieldSpecificStuff2(field) {\n removeSubfieldH(field); // only after 33X creation, as 245$h might be useful\n\n field260To264s(field, record);\n\n // NB! 300 (before or after 33X creation?)\n field410To490And810(field, record);\n field440To490And830(field, record);\n // handle505(field); // not applying them usemarcon-cyrillux rules for field 505 as I can't understand their motivation.\n\n }\n\n // The fixer below implement Cyrillux rules such as 245I1 | 245I1 | If (Exists(@100) Or Exists(@110) Or Exists(@111) Or Exists(@130)) Then '1' Else '0' and plenty of other good stuff:\n fixIndicators().fix(record);\n\n fixPunctuation().fix(record);\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n // Validation is currently done in subparts\n function validate(record) {\n nvdebug(`${description}: validate`);\n const originalString = recordToString(record);\n const clonedRecord = new MarcRecord(record, {subfieldValues: false});\n realFix(clonedRecord);\n const modifiedString = recordToString(clonedRecord);\n\n if (originalString === modifiedString) {\n return {message: [], valid: true};\n }\n\n return {message: ['Record changed'], valid: false}; // Less than descriptive but will do...\n\n }\n}\n\nfunction fixField040(record) {\n const f040 = record.fields.filter(f => f.tag === '040');\n\n const subfieldsBE = [\n {code: 'b', value: 'mul'},\n {code: 'e', value: 'rda'}\n ];\n\n // Add 040 if there isn't one:\n if (f040.length === 0) {\n const data = {tag: '040', ind1: ' ', ind2: ' ', subfields: subfieldsBE};\n\n record.insertField(data);\n return;\n }\n\n f040.forEach(f => fixField040Subfields(f));\n\n function fixField040Subfields(field) {\n field.subfields = field.subfields.filter(sf => !['b', 'e'].includes(sf.code)); // eslint-disable-line functional/immutable-data\n field.subfields.push(subfieldsBE[0]); // eslint-disable-line functional/immutable-data\n field.subfields.push(subfieldsBE[1]); // eslint-disable-line functional/immutable-data\n sortAdjacentSubfields(field); // put $b and $e to their proper places\n }\n\n}\n\nexport function removeFromOldCatalog(field) {\n // See https://catalog.loc.gov/vwebv/ui/en_US/htdocs/help/faqs.html for motivation\n field.subfields?.forEach(sf => removeFromOldCatalogFromSubfield(sf));\n\n function removeFromOldCatalogFromSubfield(subfield) {\n if (!subfield.value.includes('[from old catalog]')) {\n return;\n }\n subfield.value = subfield.value.replace(/ *\\[from old catalog\\]/gui, ''); // eslint-disable-line functional/immutable-data\n }\n}\n\nfunction removeSubfieldH(field) {\n if (!field.subfields || !['245', '246', '247', '740', '760', '762', '765', '767', '770', '772', '773', '774', '775', '776', '777', '780', '785', '786', '787', '788'].includes(field.tag)) {\n return;\n }\n\n const filteredFields = field.subfields.filter(sf => sf.code !== 'h');\n if (filteredFields.length > 0) {\n field.subfields = filteredFields; // eslint-disable-line functional/immutable-data\n return;\n }\n\n}\n\nexport function removeOwnershipSubfield5(field) {\n if (!field.subfields || field.subfields.length === 0) {\n return;\n }\n const remainingSubfields = field.subfields.filter(sf => sf.code !== '5');\n if (remainingSubfields.length === 0) { // sanity check/robustness\n return;\n }\n field.subfields = remainingSubfields; // eslint-disable-line functional/immutable-data\n}\n\nexport function fixLeader(record) {\n record.leader = `${record.leader.substring(0, 9)}a22${record.leader.substring(12, 18)}i${record.leader.substring(19, 20)}4500`; // eslint-disable-line functional/immutable-data\n}\n\nfunction field410To490And810(field, record) { // might be generic... if so, move to utils...\n if (field.tag !== '410') {\n return;\n }\n\n const field810 = clone(field);\n\n field.tag = '490'; // eslint-disable-line functional/immutable-data\n field.ind1 = '1'; // eslint-disable-line functional/immutable-data\n field.ind2 = ' '; // eslint-disable-line functional/immutable-data\n sortAdjacentSubfields(field);\n // 490: Fix punctuation elsewhere. (Note that the current support is lagging...)\n\n\n field810.tag = '810'; // eslint-disable-line functional/immutable-data\n field810.ind2 = ' '; // eslint-disable-line functional/immutable-data\n // 810: Fix punctuation elsewhere. (Note that the current support is lagging...)\n record.insertField(field810);\n}\n\nfunction field440To490And830(field, record) { // might be generic... if so, move to utils...\n if (field.tag !== '440') {\n return;\n }\n\n const field830 = clone(field);\n\n field.tag = '490'; // eslint-disable-line functional/immutable-data\n field.ind1 = '1'; // eslint-disable-line functional/immutable-data\n field.ind2 = ' '; // eslint-disable-line functional/immutable-data\n // 490: Fix punctuation elsewhere. (Note that the current support is lagging...)\n field830.tag = '830'; // eslint-disable-line functional/immutable-data\n // 830: Fix punctuation elsewhere. (Note that the current support is lagging...)\n record.insertField(field830);\n}\n\n\nfunction field260To264s(field, record) { // might be generic... if so, move to utils...\n // As per my quick reading of usemarcon-cyrillux\n if (field.tag !== '260') {\n return;\n }\n\n createCopyright264Field(field);\n\n field.tag = '264'; // eslint-disable-line functional/immutable-data\n field.ind1 = ' '; // eslint-disable-line functional/immutable-data\n field.ind2 = '1'; // eslint-disable-line functional/immutable-data\n\n // NB! Usemarcon does not handle 260$e$f$g => 264$a$b$c, so I'm not botherin with it either... (However, we could check our merge reducer code...)\n\n function getCopyrightYear(string) {\n if (string.match(/^(?:\\[?[Ccp]|[^0-9]*(?:cop|©|℗))[^0-9]*(?:1[789][0-9][0-9]|20[0-2][0-9])[^0-9]*$/u)) {\n return string.replace(/[^0-9]/ug, '');\n }\n return false;\n }\n\n field.subfields?.forEach(sf => field260To264Normalization(sf));\n\n function field260To264Normalization(subfield) {\n subfield.value = field260To264Normalization2(subfield); // eslint-disable-line functional/immutable-data\n }\n\n function createCopyright264Value(field) {\n // Extract/split copyright year to a separate field:\n const [c] = field.subfields.filter(sf => sf.code === 'c');\n if (!c) {\n return undefined;\n }\n const copyrightYear = getCopyrightYear(c.value);\n if (!copyrightYear) {\n return undefined;\n }\n const copType = c.value.match(/(?:^\\[?p|℗)/u) ? '℗' : '©';\n const returnValue = c.value.includes('[') ? `[${copType}${copyrightYear}]` : `${copType}${copyrightYear}`;\n // Moidy the original value:\n c.value = `[${copyrightYear}]`; // eslint-disable-line functional/immutable-data\n return returnValue;\n }\n\n function createCopyright264Field(field) {\n const c = createCopyright264Value(field);\n if (!c) {\n return undefined;\n }\n const data = {'tag': '264', 'ind1': ' ', 'ind2': '4', 'subfields': [{'code': 'c', 'value': c}]};\n record.insertField(data);\n }\n\n function field260To264Normalization2(subfield) {\n if (subfield.code === 'a') {\n return subfield.value.replace(/\\b[Ss]\\. ?l\\./u, 'Kustannuspaikka tuntematon');\n }\n if (subfield.code === 'b') {\n return subfield.value.replace(/\\b[Ss]\\. ?n\\./u, 'kustantaja tuntematon');\n }\n if (subfield.code === 'c') {\n const year = getCopyrightYear(subfield.value);\n if (year) {\n const c = subfield.value.match(/(?:^p|℗)/u) ? 'p' : 'c';\n if (subfield.value.includes('[')) {\n return `${c}[${year}]`;\n }\n return `${c}${year}`;\n }\n return subfield.value.replace(/\\b[Ss]\\. ?a\\./u, 'julkaisuaika tuntematon');\n }\n return subfield.value;\n }\n\n\n}\n\n/*\nfunction handle505(field) {\n if (field.tag !== '505') {\n return;\n }\n // Don't know how/why usemarcon-cyrillux is so sure about ind1...\n field.ind1 = '0'; // eslint-disable-line functional/immutable-data\n // usemarcon-cyrillux drops irrelevant subfields, so we do the same. However, we have included some control subfields in the kept side:\n const keptSubfields = field.subfields.filter(sf => ['a', 'g', 'r', 't', 'u', '6', '8', '9'].includes(sf.code));\n\n if (keptSubfields.some(sf => ['a', 'g', 'r', 't', 'u'].includes(sf.code))) {\n field.subfields = keptSubfields; // eslint-disable-line functional/immutable-data\n return;\n }\n}\n*/\n\nfunction translateFieldToFinnish(field) {\n if (!['020', '300'].includes(field.tag)) {\n return;\n }\n field.subfields?.forEach(sf => translateSubfieldToFinnish(sf));\n\n function translateSubfieldToFinnish(subfield) {\n if (field.tag === '020' && ['a', 'q', 'z'].includes(subfield.code)) {\n subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value)))); // eslint-disable-line functional/immutable-data\n return;\n }\n if (field.tag === '300') {\n subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value)))); // eslint-disable-line functional/immutable-data\n return;\n }\n }\n}\n\nfunction expandEnglishAbbreviations(value) {\n return value.replace(/\\bbk\\.\\b/gui, 'book').\n replace(/chiefly col\\./ui, 'chiefly color').\n replace(/col\\. ill\\./ui, 'color illustrations').\n replace(/diagrs\\./ui, 'diagrams').\n replace(/\\bhbk\\.\\b/gui, 'hardcover').replace(/\\bhbk\\b/gui, 'hardcover'). // expand to MTS-compliant form\n replace(/\\b1 hr\\./gui, '1 hour').\n replace(/\\bhr\\./gui, 'hours').\n replace(/\\bill\\./gui, 'illustrated'). // or illustrations (or Swedish \"illustrerad\" or...)\n replace(/\\billus\\./gui, 'illustrated'). // or illustrations\n replace(/incl\\./gui, 'includes').\n replace(/fold\\.? maps/gui, 'folded maps').\n // replace(/\\bmin\\./gu, 'minutes').\n // replace(/\\bmin\\b/gu, 'minutes').\n replace(/\\bp\\.\\b/gui, 'pages').replace(/\\bp\\b/gu, 'pages').\n replace(/\\bpbk\\.\\b/gui, 'paperback').replace(/\\bpbk\\b/gui, 'paperback'). // expand to MTS-compliant form\n replace(/\\bpdf\\b/gui, 'PDF').\n replace(/\\bports\\./gui, 'portraits').\n replace('sd., col.', 'sound, color').\n replace(/ *\\((?:chiefly col\\.|chiefly color|some col[s.])\\)/gui, '').\n replace(/\\b1 hr\\./gui, '1 hour');\n}\n\nfunction expandFinnishAbbreviations(value) {\n return value.replace(/\\bcn\\. /gu, 'noin ').\n // replace(/\\bmin\\./gu, 'minuuttia').\n // replace(/\\bmin\\b/gu, 'minuuttia').\n replace(/\\bnid\\./gu, 'nidottu').replace(/\\bnid\\b/gui, 'nidottu').\n replace(/\\bsid\\./gu, 'sidottu').replace(/\\bsid\\b/gui, 'sidottu').\n replace(/\\bverkkojulk\\.\\b/gu, 'verkkojulkaisu').replace(/\\bverkkojulk\\b/gu, 'verkkojulkaisu').\n replace(/^\\(([^)]+)\\)$/u, '$1'); // eslint-disable-line prefer-named-capture-group\n // <- removal of brackets above could use a better location\n}\n\nfunction expandSwedishAbbreviations(value) {\n return value.replace(/\\bca\\. /gu, 'circa ').\n replace(/\\bhft\\./gui, 'häftad').replace(/\\bhft\\b/gui, 'häftad');\n // replace(/\\bmin\\./gu, 'minuter').\n // replace(/\\bmin\\b/gu, 'minuter');\n}\n\nfunction finnishTranslationsAndMappings(value) {\n return value.replace('analog', 'analoginen').\n replace('approximately', 'noin').\n replace('audio discs', 'äänilevyä').\n replace('black and white', 'mustavalkoinen').\n replace(/\\bbilaga\\b/gui, 'liite').\n replace(/\\bbilagor\\b/gui, 'liitettä').\n replace(/\\bcharts\\b/gui, 'kaavioita').\n replace('chiefly color illustrations', 'pääosin värikuvitettu').\n replace('chiefly', 'pääosin').\n replace(/\\bcirca\\b/gui, 'noin').\n replace(/coil[- ]?bound/gui, 'kierreselkä').\n replace('color illustrations', 'värikuvitus').\n replace(/comb[- ]?bound/gui, 'kierreselkä').\n replace(/\\bdigital\\b/gui, 'digitaalinen').\n replace(/\\belectronic book\\b/gui, 'verkkoaineisto').\n replace('(flera nummersviter)', '(useita numerointijaksoja)').\n replace(/\\bfolded sheet\\b/gui, 'taitelehti').\n replace(/\\bfärgillustratione[nr]\\b/gui, 'värikuvitus').\n replace(/\\bhard(?:back|cover)\\b/gui, 'kovakantinen').\n replace(/\\bhours\\b/gui, 'tuntia').\n replace(/\\bi flera nummersviter/gui, 'useina numerointijaksoina').\n replace('illustrated', 'kuvitettu').\n replace(/illustrations?\\b/gui, 'kuvitettu'). // Based on usemacron-bookwhere (NB! usemarcon-cyrillux had kuvitus/kuvitettu)\n replace(/\\binbunden\\b/gui, 'kovakantinen'). // swe\n replace(/\\binsert\\b/gui, 'liite').\n replace(/\\binserts\\b/gui, 'liitteitä').\n replace(/\\bin various pagings/gui, 'useina numerointijaksoina').\n replace('leaves of plates', 'kuvalehteä').\n replace(/\\bljudskiva\\b/gui, 'äänilevy').\n replace(/\\bljudskivor\\b/gui, 'äänilevyä').\n replace(/\\bmap\\b/gui, 'kartta').\n replace(/\\bmaps\\b/gui, 'karttoja'). // or karttaa?\n replace('minutes', 'minuuttia').\n replace('mjuka pärmar', 'pehmeäkantinen').\n replace('online resource', 'verkkoaineisto').\n replace('onlineresurs', 'verkkoaineisto').\n replace('onumrerade', 'numeroimatonta').\n replace('pages of plates', 'kuvalehteä').\n replace(/\\bpages\\b/gui, 'sivua').\n replace(/\\bpaperback\\b/gui, 'pehmeäkantinen'). // MTS alt\n replace(/\\bSeiten\\b/gu, 'sivua').\n replace(/\\bsoftcover\\b/gui, 'pehmeäkantinen'). // MTS pref\n replace('sound, color', 'äänellinen, värillinen').\n replace('sound cassettes', 'äänikasettia').replace('sound cassette', 'äänikasetti').\n replace('sound discs', 'äänilevyä').replace(/sound disc\\b/gui, 'äänilevy').\n replace(/(?:spiral[- ]?bound|spiralrygg)/gui, 'kierreselkä').\n replace('svartvit', 'mustavalkoinen').\n replace('unnumbered', 'numeroimatonta').\n replace('(various pagings)', '(useita numerointijaksoja)').\n replace(/\\bverkkojulkaisu\\b/gui, 'verkkoaineisto').\n replace('videodiscs', 'videolevyä').\n replace('videodisc', 'videolevy').\n replace(/\\b1 hour\\b/gui, '1 tunti');\n\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/punctuation2.js
CHANGED
|
@@ -90,7 +90,7 @@ function fieldNeedsModification(field, add = true) {
|
|
|
90
90
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
91
91
|
|
|
92
92
|
//const stripCrap = / *[-;:,+]+$/u;
|
|
93
|
-
const
|
|
93
|
+
const needsPuncAfterAlphanumeric = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö)$/u;
|
|
94
94
|
const defaultNeedsPuncAfter2 = /(?:[\]a-zA-Z0-9)]|ä|å|ö|Å|Ä|Ö)$/u;
|
|
95
95
|
const doesNotEndInPunc = /[^!?.:;,]$/u; // non-punc for pre-240/700/XXX $, note that '.' comes if preceded by ')'
|
|
96
96
|
const blocksPuncRHS = /^(?:\()/u;
|
|
@@ -186,29 +186,32 @@ const addX00Dot = {
|
|
|
186
186
|
'add': '.',
|
|
187
187
|
'code': 'abcdetv',
|
|
188
188
|
'followedBy': '#fklptu',
|
|
189
|
-
'context':
|
|
189
|
+
'context': needsPuncAfterAlphanumeric
|
|
190
|
+
};
|
|
191
|
+
const addX10iColon = {
|
|
192
|
+
'name': 'Punctuate relationship information',
|
|
193
|
+
'code': 'i',
|
|
194
|
+
'context': defaultNeedsPuncAfter2
|
|
190
195
|
};
|
|
191
|
-
|
|
192
|
-
//const addX10iaComma = {'name': 'Punctuate relationship information', 'code': 'i', 'followedBy': 'a', 'context': defaultNeedsPuncAfter2};
|
|
193
196
|
const addX10bDot = {
|
|
194
197
|
'name': 'Add X10 pre-$b dot',
|
|
195
198
|
'add': '.',
|
|
196
199
|
'code': 'ab',
|
|
197
200
|
'followedBy': 'b',
|
|
198
|
-
'context':
|
|
201
|
+
'context': needsPuncAfterAlphanumeric
|
|
199
202
|
};
|
|
200
203
|
const addX10eComma = {
|
|
201
204
|
'add': ',',
|
|
202
205
|
'code': 'abe',
|
|
203
206
|
'followedBy': 'e',
|
|
204
|
-
'context':
|
|
207
|
+
'context': defaultNeedsPuncAfter2
|
|
205
208
|
};
|
|
206
209
|
const addX10Dot = {
|
|
207
210
|
'name': 'Add X10 final dot',
|
|
208
211
|
'add': '.',
|
|
209
212
|
'code': 'abet',
|
|
210
213
|
'followedBy': 'tu#',
|
|
211
|
-
'context':
|
|
214
|
+
'context': needsPuncAfterAlphanumeric
|
|
212
215
|
};
|
|
213
216
|
const addColonToRelationshipInformation = {
|
|
214
217
|
'name': 'Add \':\' to 7X0 $i relationship info',
|
|
@@ -460,6 +463,10 @@ const cleanValidPunctuationRules = {
|
|
|
460
463
|
'245': clean24X,
|
|
461
464
|
'246': clean24X,
|
|
462
465
|
'260': [{
|
|
466
|
+
'code': 'abc',
|
|
467
|
+
'followedBy': 'a',
|
|
468
|
+
'remove': / ;$/u
|
|
469
|
+
}, {
|
|
463
470
|
'code': 'a',
|
|
464
471
|
'followedBy': 'b',
|
|
465
472
|
'remove': / :$/u
|
|
@@ -544,29 +551,29 @@ const cleanValidPunctuationRules = {
|
|
|
544
551
|
// Overgeneralizes a bit: eg. addColonToRelationshipInformation only applies to 700/710 but as others don't have $i, it's fine.
|
|
545
552
|
const addToAllEntryFields = [addDotBeforeLanguageSubfieldL, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];
|
|
546
553
|
const addX00 = [addX00aComma, addX00aComma2, addX00Dot, addX00dComma, ...addToAllEntryFields];
|
|
547
|
-
const addX10 = [addX10bDot, addX10eComma, addX10Dot, ...addToAllEntryFields];
|
|
554
|
+
const addX10 = [addX10iColon, addX10bDot, addX10eComma, addX10Dot, ...addToAllEntryFields];
|
|
548
555
|
const addX11 = [...addToAllEntryFields];
|
|
549
556
|
const addX30 = [...addToAllEntryFields];
|
|
550
557
|
const add24X = [{
|
|
551
558
|
'code': 'i',
|
|
552
559
|
'followedBy': 'a',
|
|
553
560
|
'add': ':',
|
|
554
|
-
'context':
|
|
561
|
+
'context': needsPuncAfterAlphanumeric
|
|
555
562
|
}, {
|
|
556
563
|
'code': 'a',
|
|
557
564
|
'followedBy': 'b',
|
|
558
565
|
'add': ' :',
|
|
559
|
-
'context':
|
|
566
|
+
'context': needsPuncAfterAlphanumeric
|
|
560
567
|
}, {
|
|
561
568
|
'code': 'abk',
|
|
562
569
|
'followedBy': 'f',
|
|
563
570
|
'add': ',',
|
|
564
|
-
'context':
|
|
571
|
+
'context': needsPuncAfterAlphanumeric
|
|
565
572
|
}, {
|
|
566
573
|
'code': 'abfnp',
|
|
567
574
|
'followedBy': 'c',
|
|
568
575
|
'add': ' /',
|
|
569
|
-
'context':
|
|
576
|
+
'context': needsPuncAfterAlphanumeric
|
|
570
577
|
}, addDotBeforeLanguageSubfieldL];
|
|
571
578
|
const add245 = [...add24X,
|
|
572
579
|
// Blah! Also "$a = $b" and "$a ; $b" can be valid... But ' :' is better than nothing, I guess...
|
|
@@ -574,17 +581,17 @@ const add245 = [...add24X,
|
|
|
574
581
|
'code': 'ab',
|
|
575
582
|
'followedBy': 'n',
|
|
576
583
|
'add': '.',
|
|
577
|
-
'context':
|
|
584
|
+
'context': needsPuncAfterAlphanumeric
|
|
578
585
|
}, {
|
|
579
586
|
'code': 'n',
|
|
580
587
|
'followedBy': 'p',
|
|
581
588
|
'add': ',',
|
|
582
|
-
'context':
|
|
589
|
+
'context': defaultNeedsPuncAfter2
|
|
583
590
|
}, {
|
|
584
591
|
'code': 'abc',
|
|
585
592
|
'followedBy': '#',
|
|
586
593
|
'add': '.',
|
|
587
|
-
'context':
|
|
594
|
+
'context': needsPuncAfterAlphanumeric
|
|
588
595
|
} // Stepping on "punctuation validator's" toes
|
|
589
596
|
];
|
|
590
597
|
const addSeriesTitle = [
|
|
@@ -598,7 +605,7 @@ const addSeriesTitle = [
|
|
|
598
605
|
'code': 'axyz',
|
|
599
606
|
'followedBy': 'xy',
|
|
600
607
|
'add': ',',
|
|
601
|
-
'context':
|
|
608
|
+
'context': defaultNeedsPuncAfter2
|
|
602
609
|
}, addSemicolonBeforeVolumeDesignation // eg. 490$axyz-$v
|
|
603
610
|
];
|
|
604
611
|
const addPairedPunctuationRules = {
|
|
@@ -616,7 +623,7 @@ const addPairedPunctuationRules = {
|
|
|
616
623
|
'add': ' :',
|
|
617
624
|
'context': defaultNeedsPuncAfter2
|
|
618
625
|
}, {
|
|
619
|
-
'code': '
|
|
626
|
+
'code': 'ab',
|
|
620
627
|
'followedBy': 'c',
|
|
621
628
|
'add': ',',
|
|
622
629
|
'context': defaultNeedsPuncAfter2
|
|
@@ -653,7 +660,7 @@ const addPairedPunctuationRules = {
|
|
|
653
660
|
'code': 'c',
|
|
654
661
|
'followedBy': '#',
|
|
655
662
|
'add': '.',
|
|
656
|
-
'context':
|
|
663
|
+
'context': needsPuncAfterAlphanumeric,
|
|
657
664
|
'ind2': ['0', '1', '2', '3']
|
|
658
665
|
}],
|
|
659
666
|
'300': [{
|
|
@@ -701,7 +708,7 @@ const addPairedPunctuationRules = {
|
|
|
701
708
|
'code': 'i',
|
|
702
709
|
'followedBy': 'a',
|
|
703
710
|
'add': ':',
|
|
704
|
-
'context':
|
|
711
|
+
'context': defaultNeedsPuncAfter2
|
|
705
712
|
}]
|
|
706
713
|
};
|
|
707
714
|
|