@natlibfi/marc-record-validators-melinda 11.6.5 → 11.6.7-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/.github/workflows/melinda-node-tests.yml +1 -1
- package/dist/access-rights.js +1 -5
- package/dist/access-rights.js.map +1 -1
- package/dist/addMissingField336.js +1 -1
- package/dist/addMissingField336.js.map +1 -1
- package/dist/cyrillux-usemarcon-replacement.js +41 -45
- package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
- package/dist/cyrillux.js +13 -17
- package/dist/cyrillux.js.map +1 -1
- package/dist/disambiguateSeriesStatements.js +3 -4
- package/dist/disambiguateSeriesStatements.js.map +1 -1
- package/dist/double-commas.js +2 -1
- package/dist/double-commas.js.map +1 -1
- package/dist/duplicates-ind1.js +1 -1
- package/dist/duplicates-ind1.js.map +1 -1
- package/dist/empty-fields.js +0 -4
- package/dist/empty-fields.js.map +1 -1
- package/dist/ending-punctuation.js +21 -49
- package/dist/ending-punctuation.js.map +1 -1
- package/dist/ending-whitespace.js +0 -4
- package/dist/ending-whitespace.js.map +1 -1
- package/dist/field-008-18-34-character-groups.js +4 -5
- package/dist/field-008-18-34-character-groups.js.map +1 -1
- package/dist/field-505-separators.js +8 -6
- package/dist/field-505-separators.js.map +1 -1
- package/dist/field-521-fix.js +5 -6
- package/dist/field-521-fix.js.map +1 -1
- package/dist/field-exclusion.js +5 -12
- package/dist/field-exclusion.js.map +1 -1
- package/dist/field-exclusion.spec.js +3 -5
- package/dist/field-exclusion.spec.js.map +1 -1
- package/dist/field-structure.js +2 -5
- package/dist/field-structure.js.map +1 -1
- package/dist/fields-present.js +1 -1
- package/dist/fields-present.js.map +1 -1
- package/dist/fields-present.spec.js +1 -1
- package/dist/fields-present.spec.js.map +1 -1
- package/dist/fix-33X.js +5 -6
- package/dist/fix-33X.js.map +1 -1
- package/dist/fix-country-codes.js +3 -4
- package/dist/fix-country-codes.js.map +1 -1
- package/dist/fix-language-codes.js +12 -9
- package/dist/fix-language-codes.js.map +1 -1
- package/dist/fixRelatorTerms.js +8 -8
- package/dist/fixRelatorTerms.js.map +1 -1
- package/dist/fixed-fields.js +1 -4
- package/dist/fixed-fields.js.map +1 -1
- package/dist/identical-fields.js +2 -3
- package/dist/identical-fields.js.map +1 -1
- package/dist/indicator-fixes.js +14 -15
- package/dist/indicator-fixes.js.map +1 -1
- package/dist/isbn-issn.js +8 -11
- package/dist/isbn-issn.js.map +1 -1
- package/dist/item-language.js +5 -12
- package/dist/item-language.js.map +1 -1
- package/dist/merge-fields/counterpartField.js +6 -8
- package/dist/merge-fields/counterpartField.js.map +1 -1
- package/dist/merge-fields/index.js +3 -3
- package/dist/merge-fields/index.js.map +1 -1
- package/dist/merge-fields/mergeConstraints.js +0 -1
- package/dist/merge-fields/mergeConstraints.js.map +1 -1
- package/dist/merge-fields/mergeField.js +12 -18
- package/dist/merge-fields/mergeField.js.map +1 -1
- package/dist/merge-fields/mergeIndicator.js +5 -5
- package/dist/merge-fields/mergeIndicator.js.map +1 -1
- package/dist/merge-fields/mergeOrAddPostprocess.js +6 -9
- package/dist/merge-fields/mergeOrAddPostprocess.js.map +1 -1
- package/dist/merge-fields/mergeOrAddSubfield.js +6 -8
- package/dist/merge-fields/mergeOrAddSubfield.js.map +1 -1
- package/dist/merge-fields/mergeSubfield.js +8 -8
- package/dist/merge-fields/mergeSubfield.js.map +1 -1
- package/dist/merge-fields/removeDuplicateSubfields.js +1 -2
- package/dist/merge-fields/removeDuplicateSubfields.js.map +1 -1
- package/dist/merge-fields/worldKnowledge.js +1 -1
- package/dist/merge-fields/worldKnowledge.js.map +1 -1
- package/dist/mergeField500Lisapainokset.js +0 -3
- package/dist/mergeField500Lisapainokset.js.map +1 -1
- package/dist/mergeRelatorTermFields.js +3 -3
- package/dist/mergeRelatorTermFields.js.map +1 -1
- package/dist/modernize-502.js +6 -6
- package/dist/modernize-502.js.map +1 -1
- package/dist/multiple-subfield-0.js +4 -4
- package/dist/multiple-subfield-0.js.map +1 -1
- package/dist/non-breaking-space.js +0 -4
- package/dist/non-breaking-space.js.map +1 -1
- package/dist/normalize-dashes.js +5 -4
- package/dist/normalize-dashes.js.map +1 -1
- package/dist/normalize-identifiers.js +6 -6
- package/dist/normalize-identifiers.js.map +1 -1
- package/dist/normalize-qualifying-information.js +4 -4
- package/dist/normalize-qualifying-information.js.map +1 -1
- package/dist/normalize-utf8-diacritics.js +7 -7
- package/dist/normalize-utf8-diacritics.js.map +1 -1
- package/dist/normalizeFieldForComparison.js +21 -20
- package/dist/normalizeFieldForComparison.js.map +1 -1
- package/dist/normalizeSubfieldValueForComparison.js +1 -2
- package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
- package/dist/prepublicationUtils.js +3 -3
- package/dist/prepublicationUtils.js.map +1 -1
- package/dist/punctuation/index.js +14 -31
- package/dist/punctuation/index.js.map +1 -1
- package/dist/punctuation2.js +9 -10
- package/dist/punctuation2.js.map +1 -1
- package/dist/reindexSubfield6OccurenceNumbers.js +8 -9
- package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
- package/dist/removeDuplicateDataFields.js +18 -20
- package/dist/removeDuplicateDataFields.js.map +1 -1
- package/dist/removeInferiorDataFields.js +16 -19
- package/dist/removeInferiorDataFields.js.map +1 -1
- package/dist/resolvable-ext-references-melinda.js +4 -8
- package/dist/resolvable-ext-references-melinda.js.map +1 -1
- package/dist/resolveOrphanedSubfield6s.js +9 -9
- package/dist/resolveOrphanedSubfield6s.js.map +1 -1
- package/dist/sanitize-vocabulary-source-codes.js +9 -9
- package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
- package/dist/sort-tags.js +2 -2
- package/dist/sort-tags.js.map +1 -1
- package/dist/sortFields.js +4 -9
- package/dist/sortFields.js.map +1 -1
- package/dist/sortRelatorTerms.js +4 -5
- package/dist/sortRelatorTerms.js.map +1 -1
- package/dist/sortSubfields.js +6 -7
- package/dist/sortSubfields.js.map +1 -1
- package/dist/stripPunctuation.js +2 -2
- package/dist/stripPunctuation.js.map +1 -1
- package/dist/subfield-exclusion.js +4 -11
- package/dist/subfield-exclusion.js.map +1 -1
- package/dist/subfield6Utils.js +12 -11
- package/dist/subfield6Utils.js.map +1 -1
- package/dist/subfield8Utils.js +8 -9
- package/dist/subfield8Utils.js.map +1 -1
- package/dist/subfieldValueNormalizations.js +5 -8
- package/dist/subfieldValueNormalizations.js.map +1 -1
- package/dist/sync-007-and-300.js +8 -8
- package/dist/sync-007-and-300.js.map +1 -1
- package/dist/translate-terms.js +5 -6
- package/dist/translate-terms.js.map +1 -1
- package/dist/typeOfDate-008.js +3 -4
- package/dist/typeOfDate-008.js.map +1 -1
- package/dist/unicode-decomposition.js +1 -1
- package/dist/unicode-decomposition.js.map +1 -1
- package/dist/update-field-540.js +5 -6
- package/dist/update-field-540.js.map +1 -1
- package/dist/urn.js +4 -9
- package/dist/urn.js.map +1 -1
- package/dist/utils.js +5 -9
- package/dist/utils.js.map +1 -1
- package/eslint.config.mjs +53 -0
- package/package.json +12 -13
- package/src/access-rights.js +4 -4
- package/src/addMissingField336.js +1 -1
- package/src/cyrillux-usemarcon-replacement.js +38 -38
- package/src/cyrillux.js +14 -14
- package/src/disambiguateSeriesStatements.js +3 -3
- package/src/double-commas.js +2 -2
- package/src/duplicates-ind1.js +1 -1
- package/src/empty-fields.js +4 -4
- package/src/ending-punctuation.js +46 -49
- package/src/ending-whitespace.js +0 -2
- package/src/field-008-18-34-character-groups.js +5 -5
- package/src/field-505-separators.js +6 -6
- package/src/field-521-fix.js +6 -6
- package/src/field-exclusion.js +12 -12
- package/src/field-exclusion.spec.js +4 -4
- package/src/field-structure.js +5 -5
- package/src/fields-present.js +1 -1
- package/src/fields-present.spec.js +1 -1
- package/src/fix-33X.js +5 -5
- package/src/fix-country-codes.js +3 -3
- package/src/fix-language-codes.js +10 -9
- package/src/fixRelatorTerms.js +8 -8
- package/src/fixed-fields.js +3 -3
- package/src/identical-fields.js +3 -3
- package/src/indicator-fixes.js +15 -15
- package/src/isbn-issn.js +11 -11
- package/src/item-language.js +10 -10
- package/src/merge-fields/counterpartField.js +7 -7
- package/src/merge-fields/index.js +3 -3
- package/src/merge-fields/mergeConstraints.js +1 -1
- package/src/merge-fields/mergeField.js +16 -17
- package/src/merge-fields/mergeIndicator.js +5 -5
- package/src/merge-fields/mergeOrAddPostprocess.js +9 -9
- package/src/merge-fields/mergeOrAddSubfield.js +6 -6
- package/src/merge-fields/mergeSubfield.js +8 -8
- package/src/merge-fields/removeDuplicateSubfields.js +1 -2
- package/src/merge-fields/worldKnowledge.js +1 -1
- package/src/mergeField500Lisapainokset.js +0 -2
- package/src/mergeRelatorTermFields.js +3 -3
- package/src/modernize-502.js +6 -6
- package/src/multiple-subfield-0.js +4 -4
- package/src/non-breaking-space.js +0 -2
- package/src/normalize-dashes.js +4 -4
- package/src/normalize-identifiers.js +6 -6
- package/src/normalize-qualifying-information.js +4 -4
- package/src/normalize-utf8-diacritics.js +7 -7
- package/src/normalizeFieldForComparison.js +20 -20
- package/src/normalizeSubfieldValueForComparison.js +1 -1
- package/src/prepublicationUtils.js +3 -3
- package/src/punctuation/index.js +29 -29
- package/src/punctuation2.js +10 -10
- package/src/reindexSubfield6OccurenceNumbers.js +9 -9
- package/src/removeDuplicateDataFields.js +21 -23
- package/src/removeInferiorDataFields.js +19 -19
- package/src/resolvable-ext-references-melinda.js +8 -8
- package/src/resolveOrphanedSubfield6s.js +9 -9
- package/src/sanitize-vocabulary-source-codes.js +8 -8
- package/src/sort-tags.js +2 -2
- package/src/sortFields.js +6 -6
- package/src/sortRelatorTerms.js +5 -5
- package/src/sortSubfields.js +7 -7
- package/src/stripPunctuation.js +2 -2
- package/src/subfield-exclusion.js +11 -11
- package/src/subfield6Utils.js +11 -11
- package/src/subfield8Utils.js +6 -9
- package/src/subfieldValueNormalizations.js +5 -7
- package/src/sync-007-and-300.js +8 -8
- package/src/translate-terms.js +3 -5
- package/src/typeOfDate-008.js +3 -3
- package/src/unicode-decomposition.js +1 -1
- package/src/update-field-540.js +6 -6
- package/src/urn.js +8 -6
- package/src/utils.js +8 -8
- package/.eslintignore +0 -1
|
@@ -36,8 +36,6 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
36
36
|
*
|
|
37
37
|
*/
|
|
38
38
|
|
|
39
|
-
/* eslint-disable complexity, max-params */
|
|
40
|
-
|
|
41
39
|
// Import {validPuncMarks, finnishTerms, confSpec} from './ending-punctuation-conf.js';
|
|
42
40
|
|
|
43
41
|
const debug = (0, _debug.default)('@natlibfi/marc-record-validator-melinda/ending-punctuation');
|
|
@@ -55,8 +53,7 @@ function _default() {
|
|
|
55
53
|
message: []
|
|
56
54
|
};
|
|
57
55
|
if (fix) {
|
|
58
|
-
|
|
59
|
-
message.fix = []; // eslint-disable-line functional/immutable-data
|
|
56
|
+
message.fix = [];
|
|
60
57
|
}
|
|
61
58
|
|
|
62
59
|
// Actual parsing of all fields
|
|
@@ -66,7 +63,7 @@ function _default() {
|
|
|
66
63
|
record.fields.forEach(field => {
|
|
67
64
|
validateField(field, false, fix, message);
|
|
68
65
|
});
|
|
69
|
-
message.valid = !(message.message.length >= 1);
|
|
66
|
+
message.valid = !(message.message.length >= 1);
|
|
70
67
|
return message;
|
|
71
68
|
}
|
|
72
69
|
}
|
|
@@ -88,57 +85,50 @@ function validateField(field, linkedTag, fix, message) {
|
|
|
88
85
|
// Last char should be punc, but its not one of marks nor dot
|
|
89
86
|
if (punc && !(lastPuncMark || lastPuncDot)) {
|
|
90
87
|
// Console.log("1. Invalid punctuation - missing")
|
|
91
|
-
message.message.push(`Field ${tag} has invalid ending punctuation`);
|
|
88
|
+
message.message.push(`Field ${tag} has invalid ending punctuation`);
|
|
92
89
|
if (fix) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
message.fix.push(`Field ${tag} - Added punctuation to $${subfield.code}`); // eslint-disable-line functional/immutable-data
|
|
90
|
+
subfield.value = subfield.value.concat('.');
|
|
91
|
+
message.fix.push(`Field ${tag} - Added punctuation to $${subfield.code}`);
|
|
96
92
|
}
|
|
97
93
|
|
|
98
94
|
// Last char is dot, but previous char is one of punc marks, like 'Question?.'
|
|
99
95
|
} else if (lastPuncDot && subfield.value.length > 1 && puncMarks.includes(subfield.value.charAt(subfield.value.length - 2))) {
|
|
100
96
|
// Console.log("2. Invalid punctuation - duplicate, like '?.'")
|
|
101
|
-
message.message.push(`Field ${tag} has invalid ending punctuation`);
|
|
97
|
+
message.message.push(`Field ${tag} has invalid ending punctuation`);
|
|
102
98
|
if (fix) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
message.fix.push(`Field ${tag} - Removed double punctuation from $${subfield.code}`); // eslint-disable-line functional/immutable-data
|
|
99
|
+
subfield.value = subfield.value.slice(0, -1);
|
|
100
|
+
message.fix.push(`Field ${tag} - Removed double punctuation from $${subfield.code}`);
|
|
106
101
|
}
|
|
107
102
|
|
|
108
103
|
// Last char shouldn't be dot !! This is behind checkEnd boolean, because of dots at end of abbreviations, so this is checked only in special cases !!//
|
|
109
104
|
} else if (checkEnd && !punc && lastPuncDot) {
|
|
110
105
|
// Console.log("3. Invalid punctuation - Shouldn't be dot, is")
|
|
111
|
-
message.message.push(`Field ${tag} has invalid ending punctuation`);
|
|
106
|
+
message.message.push(`Field ${tag} has invalid ending punctuation`);
|
|
112
107
|
if (fix) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
message.fix.push(`Field ${tag} - Removed punctuation from $${subfield.code}`); // eslint-disable-line functional/immutable-data
|
|
108
|
+
subfield.value = subfield.value.slice(0, -1);
|
|
109
|
+
message.fix.push(`Field ${tag} - Removed punctuation from $${subfield.code}`);
|
|
116
110
|
}
|
|
117
111
|
}
|
|
118
112
|
}
|
|
119
113
|
|
|
120
114
|
// Special cases from here on
|
|
121
115
|
function specialCases(res, field, tag) {
|
|
122
|
-
let lastSubField = null;
|
|
116
|
+
let lastSubField = null;
|
|
123
117
|
// Punctuation should be only after specific field
|
|
124
118
|
if (res.special.afterOnly) {
|
|
125
119
|
lastSubField = findLastSubfield(field);
|
|
126
120
|
if (lastSubField) {
|
|
127
121
|
if (typeof res.special.strict === 'undefined') {
|
|
128
|
-
|
|
129
|
-
res.special.strict = true; // eslint-disable-line functional/immutable-data
|
|
122
|
+
res.special.strict = true;
|
|
130
123
|
}
|
|
131
124
|
if (lastSubField.code === res.special.afterOnly) {
|
|
132
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
133
125
|
normalPuncRules(lastSubField, res.punc, tag, res.special.strict, false);
|
|
134
126
|
} else {
|
|
135
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
136
127
|
normalPuncRules(lastSubField, !res.punc, tag, true, false);
|
|
137
128
|
}
|
|
138
129
|
}
|
|
139
130
|
} else if (res.special.noPuncIfField) {
|
|
140
131
|
if (field.subfields.some(subField => subField.code === res.special.noPuncIfField) === false) {
|
|
141
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
142
132
|
lastSubField = findLastSubfield(field);
|
|
143
133
|
normalPuncRules(lastSubField, res.punc, tag, true, false);
|
|
144
134
|
}
|
|
@@ -147,30 +137,24 @@ function validateField(field, linkedTag, fix, message) {
|
|
|
147
137
|
if (lastSubField && lastSubField.code === res.special.puncSubField) {
|
|
148
138
|
// Ind2 match, check second if at punc rules with special punc char override
|
|
149
139
|
if (res.special.ifInd2 && res.special.ifInd2.includes(field.ind2)) {
|
|
150
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
151
140
|
normalPuncRules(lastSubField, res.special.ifBoth, tag, true, res.special.ifLastCharNot);
|
|
152
141
|
|
|
153
142
|
// Matches execption to special rule, noPuncIfInd2 (likely with value 4, that indicates copyright mark)
|
|
154
143
|
} else if (res.special.noPuncIfInd2 && field.ind2 && res.special.noPuncIfInd2.includes(field.ind2)) {
|
|
155
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
156
144
|
normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);
|
|
157
145
|
|
|
158
146
|
// Does not match rules -> shouldn't have punc
|
|
159
147
|
} else {
|
|
160
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
161
148
|
normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);
|
|
162
149
|
}
|
|
163
150
|
}
|
|
164
151
|
} else if (res.special.secondLastIfLast) {
|
|
165
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
166
152
|
field.subfields.forEach(subField => {
|
|
167
153
|
if (isNaN(subField.code) && res.special.secondLastIfLast !== subField.code) {
|
|
168
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
169
154
|
lastSubField = subField;
|
|
170
155
|
} // Not control field
|
|
171
156
|
|
|
172
157
|
if (typeof res.special.last !== 'undefined' && res.special.secondLastIfLast === subField.code) {
|
|
173
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
174
158
|
normalPuncRules(subField, res.special.last, tag, true, false);
|
|
175
159
|
} // Strict because this field should not be abbreviation
|
|
176
160
|
});
|
|
@@ -184,11 +168,9 @@ function validateField(field, linkedTag, fix, message) {
|
|
|
184
168
|
code
|
|
185
169
|
}) => code === res.special.termField);
|
|
186
170
|
if (languageField && languageField.value && _endingPunctuationConf.finnishTerms.some(p => p.test(languageField.value))) {
|
|
187
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
188
171
|
// If (languageField && languageField.value && finnishTerms.indexOf(languageField.value) > -1) {
|
|
189
172
|
normalPuncRules(lastSubField, res.punc, tag, true, false);
|
|
190
173
|
} else {
|
|
191
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
192
174
|
normalPuncRules(lastSubField, res.special.else, tag, false, false); // Strict because of years etc (648, 650)
|
|
193
175
|
}
|
|
194
176
|
}
|
|
@@ -197,24 +179,20 @@ function validateField(field, linkedTag, fix, message) {
|
|
|
197
179
|
lastSubField = null;
|
|
198
180
|
field.subfields.filter(subField => 'value' in subField).forEach(subField => {
|
|
199
181
|
if (isNaN(subField.code) && res.special.lastOf.indexOf(subField.code) > -1) {
|
|
200
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
201
182
|
lastSubField = subField;
|
|
202
183
|
} // Not control field
|
|
203
184
|
|
|
204
185
|
if (res.special.mandatory && res.special.mandatory.indexOf(subField.code) > -1) {
|
|
205
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
206
186
|
normalPuncRules(subField, res.punc, tag, true, false);
|
|
207
187
|
} // Strict because of mandatory
|
|
208
188
|
});
|
|
209
189
|
if (lastSubField) {
|
|
210
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
211
190
|
normalPuncRules(lastSubField, res.punc, tag, false, false);
|
|
212
191
|
}
|
|
213
192
|
|
|
214
193
|
// If field has linked rules (tag: 880), find rules and re-validate
|
|
215
194
|
} else if (res.special.linked) {
|
|
216
|
-
|
|
217
|
-
let linkedTag = null; // eslint-disable-line functional/no-let
|
|
195
|
+
let linkedTag = null;
|
|
218
196
|
try {
|
|
219
197
|
linkedTag = parseInt(field.subfields.find(({
|
|
220
198
|
code
|
|
@@ -226,15 +204,12 @@ function validateField(field, linkedTag, fix, message) {
|
|
|
226
204
|
validateField(field, linkedTag, fix, message);
|
|
227
205
|
}
|
|
228
206
|
}
|
|
229
|
-
let res = null;
|
|
230
|
-
let tag = null;
|
|
231
|
-
let lastSubField = null;
|
|
232
|
-
|
|
207
|
+
let res = null;
|
|
208
|
+
let tag = null;
|
|
209
|
+
let lastSubField = null;
|
|
233
210
|
if (linkedTag) {
|
|
234
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
235
211
|
tag = linkedTag;
|
|
236
212
|
} else {
|
|
237
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
238
213
|
try {
|
|
239
214
|
tag = parseInt(field.tag, 10);
|
|
240
215
|
} catch (err) {
|
|
@@ -254,7 +229,7 @@ function validateField(field, linkedTag, fix, message) {
|
|
|
254
229
|
|
|
255
230
|
// Field does not have subfields; invalid
|
|
256
231
|
if (typeof field.subfields === 'undefined' || field.subfields === null) {
|
|
257
|
-
message.message.push(`Field ${field.tag} has invalid ending punctuation`);
|
|
232
|
+
message.message.push(`Field ${field.tag} has invalid ending punctuation`);
|
|
258
233
|
return;
|
|
259
234
|
}
|
|
260
235
|
|
|
@@ -262,11 +237,9 @@ function validateField(field, linkedTag, fix, message) {
|
|
|
262
237
|
if (typeof res.special === 'undefined' || res.special === null) {
|
|
263
238
|
lastSubField = findLastSubfield(field);
|
|
264
239
|
if (lastSubField) {
|
|
265
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
266
240
|
normalPuncRules(lastSubField, res.punc, field.tag, false, false, fix, message);
|
|
267
241
|
}
|
|
268
242
|
} else {
|
|
269
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
270
243
|
try {
|
|
271
244
|
specialCases(res, field, field.tag);
|
|
272
245
|
} catch (e) {
|
|
@@ -276,13 +249,12 @@ function validateField(field, linkedTag, fix, message) {
|
|
|
276
249
|
}
|
|
277
250
|
function validateSingleField(field, linkedTag, fix) {
|
|
278
251
|
const message = {};
|
|
279
|
-
message.message = [];
|
|
252
|
+
message.message = [];
|
|
280
253
|
if (fix) {
|
|
281
|
-
|
|
282
|
-
message.fix = []; // eslint-disable-line functional/immutable-data
|
|
254
|
+
message.fix = [];
|
|
283
255
|
}
|
|
284
256
|
validateField(field, linkedTag, fix, message);
|
|
285
|
-
message.valid = !(message.message.length >= 1);
|
|
257
|
+
message.valid = !(message.message.length >= 1);
|
|
286
258
|
return message;
|
|
287
259
|
}
|
|
288
260
|
//# sourceMappingURL=ending-punctuation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ending-punctuation.js","names":["_endingPunctuationConf","require","_debug","_interopRequireDefault","e","__esModule","default","debug","createDebugLogger","_default","description","validate","record","validatePunc","fix","message","fields","forEach","field","validateField","valid","length","linkedTag","findLastSubfield","subfields","filter","sf","isNaN","code","slice","shift","normalPuncRules","subfield","punc","tag","checkEnd","overrideValidPuncMarks","puncMarks","validPuncMarks","lastPuncMark","includes","value","lastPuncDot","push","concat","charAt","specialCases","res","lastSubField","special","afterOnly","strict","noPuncIfField","some","subField","ifBoth","puncSubField","ifInd2","ind2","ifLastCharNot","noPuncIfInd2","secondLastIfLast","last","termField","languageField","find","finnishTerms","p","test","else","lastOf","indexOf","mandatory","linked","parseInt","substr","err","Error","stack","Object","values","confSpec","o","rangeFine","rangeStart","rangeEnd","index","console","error","validateSingleField"],"sources":["../src/ending-punctuation.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* MARC record validators used in Melinda\n*\n* Copyright (c) 2014-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of marc-record-validators-melinda\n*\n* marc-record-validators-melinda program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Lesser General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* marc-record-validators-melinda is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Lesser General Public License for more details.\n*\n* You should have received a copy of the GNU Lesser General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\n/* eslint-disable complexity, max-params */\n\n\n// Import {validPuncMarks, finnishTerms, confSpec} from './ending-punctuation-conf.js';\nimport {validPuncMarks, finnishTerms, confSpec} from './ending-punctuation-conf';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/ending-punctuation');\n\nexport default function () {\n return {\n description:\n 'Handles invalid ending punctuation',\n validate: record => validatePunc(record, false), // Record (Object), fix (boolean)\n fix: record => validatePunc(record, true) // Record (Object), fix (boolean)\n\n };\n\n // This is used to validate record against configuration\n function validatePunc(record, fix) {\n const message = {message: []};\n\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n message.fix = []; // eslint-disable-line functional/immutable-data\n }\n\n // Actual parsing of all fields\n if (!record.fields) {\n return false;\n }\n\n record.fields.forEach(field => {\n validateField(field, false, fix, message);\n });\n\n message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return message;\n }\n}\n\n// Field validation with punctuation rules for normal and special cases in subfunction (to reduce complexity to please travisci)\nfunction validateField(field, linkedTag, fix, message) {\n // This is used to find last subfield that should have punctuation\n function findLastSubfield(field) {\n const subfields = field.subfields.filter(sf => isNaN(sf.code) && 'value' in sf);\n return subfields.slice(-1).shift();\n }\n\n // Punctuation rule (Boolean), Check no ending dot strict (Boolean)\n function normalPuncRules(subfield, punc, tag, checkEnd, overrideValidPuncMarks) {\n const puncMarks = overrideValidPuncMarks || validPuncMarks;\n const lastPuncMark = puncMarks.includes(subfield.value.slice(-1)); // If string ends to punctuation char\n const lastPuncDot = '.'.includes(subfield.value.slice(-1)); // If string ends to dot\n\n // Last char should be punc, but its not one of marks nor dot\n if (punc && !(lastPuncMark || lastPuncDot)) {\n // Console.log(\"1. Invalid punctuation - missing\")\n message.message.push(`Field ${tag} has invalid ending punctuation`); // eslint-disable-line functional/immutable-data\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n subfield.value = subfield.value.concat('.'); // eslint-disable-line functional/immutable-data\n message.fix.push(`Field ${tag} - Added punctuation to $${subfield.code}`); // eslint-disable-line functional/immutable-data\n }\n\n // Last char is dot, but previous char is one of punc marks, like 'Question?.'\n } else if (lastPuncDot && subfield.value.length > 1 && puncMarks.includes(subfield.value.charAt(subfield.value.length - 2))) {\n // Console.log(\"2. Invalid punctuation - duplicate, like '?.'\")\n message.message.push(`Field ${tag} has invalid ending punctuation`); // eslint-disable-line functional/immutable-data\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n subfield.value = subfield.value.slice(0, -1); // eslint-disable-line functional/immutable-data\n message.fix.push(`Field ${tag} - Removed double punctuation from $${subfield.code}`); // eslint-disable-line functional/immutable-data\n }\n\n // Last char shouldn't be dot !! This is behind checkEnd boolean, because of dots at end of abbreviations, so this is checked only in special cases !!//\n } else if (checkEnd && (!punc && lastPuncDot)) {\n // Console.log(\"3. Invalid punctuation - Shouldn't be dot, is\")\n message.message.push(`Field ${tag} has invalid ending punctuation`); // eslint-disable-line functional/immutable-data\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n subfield.value = subfield.value.slice(0, -1); // eslint-disable-line functional/immutable-data\n message.fix.push(`Field ${tag} - Removed punctuation from $${subfield.code}`); // eslint-disable-line functional/immutable-data\n }\n }\n }\n\n // Special cases from here on\n function specialCases(res, field, tag) {\n let lastSubField = null; // eslint-disable-line functional/no-let\n // Punctuation should be only after specific field\n if (res.special.afterOnly) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n if (typeof res.special.strict === 'undefined') { // eslint-disable-line functional/no-conditional-statements\n res.special.strict = true; // eslint-disable-line functional/immutable-data\n }\n\n if (lastSubField.code === res.special.afterOnly) { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, res.punc, tag, res.special.strict, false);\n } else { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, !res.punc, tag, true, false);\n }\n }\n } else if (res.special.noPuncIfField) {\n if (field.subfields.some(subField => subField.code === res.special.noPuncIfField) === false) { // eslint-disable-line functional/no-conditional-statements\n lastSubField = findLastSubfield(field);\n normalPuncRules(lastSubField, res.punc, tag, true, false);\n }\n } else if (res.special.ifBoth) {\n lastSubField = findLastSubfield(field);\n if (lastSubField && lastSubField.code === res.special.puncSubField) {\n // Ind2 match, check second if at punc rules with special punc char override\n if (res.special.ifInd2 && res.special.ifInd2.includes(field.ind2)) { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n\n // Matches execption to special rule, noPuncIfInd2 (likely with value 4, that indicates copyright mark)\n } else if (res.special.noPuncIfInd2 && field.ind2 && res.special.noPuncIfInd2.includes(field.ind2)) { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n\n // Does not match rules -> shouldn't have punc\n } else { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n }\n }\n } else if (res.special.secondLastIfLast) { // eslint-disable-line functional/no-conditional-statements\n field.subfields.forEach(subField => {\n if (isNaN(subField.code) && res.special.secondLastIfLast !== subField.code) { // eslint-disable-line functional/no-conditional-statements\n lastSubField = subField;\n } // Not control field\n\n if (typeof res.special.last !== 'undefined' && res.special.secondLastIfLast === subField.code) { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(subField, res.special.last, tag, true, false);\n } // Strict because this field should not be abbreviation\n });\n normalPuncRules(lastSubField, res.punc, tag, false, false);\n\n // Search for Finnish terms\n } else if (res.special.termField) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n const languageField = field.subfields.find(({code}) => code === res.special.termField);\n if (languageField && languageField.value && finnishTerms.some(p => p.test(languageField.value))) { // eslint-disable-line functional/no-conditional-statements\n // If (languageField && languageField.value && finnishTerms.indexOf(languageField.value) > -1) {\n normalPuncRules(lastSubField, res.punc, tag, true, false);\n } else { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, res.special.else, tag, false, false); // Strict because of years etc (648, 650)\n }\n }\n // Search last of array in subfields and check if it has punc\n } else if (res.special.lastOf) {\n lastSubField = null;\n field.subfields.filter(subField => 'value' in subField).forEach(subField => {\n if (isNaN(subField.code) && res.special.lastOf.indexOf(subField.code) > -1) { // eslint-disable-line functional/no-conditional-statements\n lastSubField = subField;\n } // Not control field\n\n if (res.special.mandatory && res.special.mandatory.indexOf(subField.code) > -1) { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(subField, res.punc, tag, true, false);\n } // Strict because of mandatory\n });\n\n if (lastSubField) { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, res.punc, tag, false, false);\n }\n\n // If field has linked rules (tag: 880), find rules and re-validate\n } else if (res.special.linked) { // eslint-disable-line functional/no-conditional-statements\n let linkedTag = null; // eslint-disable-line functional/no-let\n try {\n linkedTag = parseInt(field.subfields.find(({code}) => code === res.special.linked).value.substr(0, 3), 10); // Substring feels stupid, but is used in MarcRecord to extract tag.\n } catch (err) {\n debug(`Got error while parsing tag: ${err instanceof Error ? err.stack : err}`);\n return false;\n }\n\n validateField(field, linkedTag, fix, message);\n }\n }\n\n let res = null; // eslint-disable-line functional/no-let\n let tag = null; // eslint-disable-line functional/no-let\n let lastSubField = null; // eslint-disable-line functional/no-let\n\n if (linkedTag) { // eslint-disable-line functional/no-conditional-statements\n tag = linkedTag;\n } else { // eslint-disable-line functional/no-conditional-statements\n try {\n tag = parseInt(field.tag, 10);\n } catch (err) {\n debug(`Got error while parsing tag: ${err instanceof Error ? err.stack : err}`);\n return false;\n }\n }\n\n // Find configuration object matching tag:\n res = Object.values(confSpec).find(o => {\n const rangeFine = o.rangeStart <= tag && o.rangeEnd >= tag;\n return o.index === tag || rangeFine;\n });\n\n if (!res) {\n return;\n } // Configuration not found, pass field without error\n\n // Field does not have subfields; invalid\n if (typeof field.subfields === 'undefined' || field.subfields === null) {\n message.message.push(`Field ${field.tag} has invalid ending punctuation`); // eslint-disable-line functional/immutable-data\n return;\n }\n\n // Normal rules\n if (typeof res.special === 'undefined' || res.special === null) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, res.punc, field.tag, false, false, fix, message);\n }\n } else { // eslint-disable-line functional/no-conditional-statements\n try {\n specialCases(res, field, field.tag);\n } catch (e) {\n console.error('Catched error from special case: ', e); // eslint-disable-line no-console\n }\n }\n}\n\nexport function validateSingleField(field, linkedTag, fix) {\n const message = {};\n message.message = []; // eslint-disable-line functional/immutable-data\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n message.fix = []; // eslint-disable-line functional/immutable-data\n }\n\n validateField(field, linkedTag, fix, message);\n message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return message;\n}\n\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ending-punctuation.js","names":["_endingPunctuationConf","require","_debug","_interopRequireDefault","e","__esModule","default","debug","createDebugLogger","_default","description","validate","record","validatePunc","fix","message","fields","forEach","field","validateField","valid","length","linkedTag","findLastSubfield","subfields","filter","sf","isNaN","code","slice","shift","normalPuncRules","subfield","punc","tag","checkEnd","overrideValidPuncMarks","puncMarks","validPuncMarks","lastPuncMark","includes","value","lastPuncDot","push","concat","charAt","specialCases","res","lastSubField","special","afterOnly","strict","noPuncIfField","some","subField","ifBoth","puncSubField","ifInd2","ind2","ifLastCharNot","noPuncIfInd2","secondLastIfLast","last","termField","languageField","find","finnishTerms","p","test","else","lastOf","indexOf","mandatory","linked","parseInt","substr","err","Error","stack","Object","values","confSpec","o","rangeFine","rangeStart","rangeEnd","index","console","error","validateSingleField"],"sources":["../src/ending-punctuation.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* MARC record validators used in Melinda\n*\n* Copyright (c) 2014-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of marc-record-validators-melinda\n*\n* marc-record-validators-melinda program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Lesser General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* marc-record-validators-melinda is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Lesser General Public License for more details.\n*\n* You should have received a copy of the GNU Lesser General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\n// Import {validPuncMarks, finnishTerms, confSpec} from './ending-punctuation-conf.js';\nimport {validPuncMarks, finnishTerms, confSpec} from './ending-punctuation-conf';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/ending-punctuation');\n\nexport default function () {\n return {\n description:\n 'Handles invalid ending punctuation',\n validate: record => validatePunc(record, false), // Record (Object), fix (boolean)\n fix: record => validatePunc(record, true) // Record (Object), fix (boolean)\n\n };\n\n // This is used to validate record against configuration\n function validatePunc(record, fix) {\n const message = {message: []};\n\n if (fix) {\n message.fix = [];\n }\n\n // Actual parsing of all fields\n if (!record.fields) {\n return false;\n }\n\n record.fields.forEach(field => {\n validateField(field, false, fix, message);\n });\n\n message.valid = !(message.message.length >= 1);\n return message;\n }\n}\n\n// Field validation with punctuation rules for normal and special cases in subfunction (to reduce complexity to please travisci)\nfunction validateField(field, linkedTag, fix, message) {\n // This is used to find last subfield that should have punctuation\n function findLastSubfield(field) {\n const subfields = field.subfields.filter(sf => isNaN(sf.code) && 'value' in sf);\n return subfields.slice(-1).shift();\n }\n\n // Punctuation rule (Boolean), Check no ending dot strict (Boolean)\n function normalPuncRules(subfield, punc, tag, checkEnd, overrideValidPuncMarks) {\n const puncMarks = overrideValidPuncMarks || validPuncMarks;\n const lastPuncMark = puncMarks.includes(subfield.value.slice(-1)); // If string ends to punctuation char\n const lastPuncDot = '.'.includes(subfield.value.slice(-1)); // If string ends to dot\n\n // Last char should be punc, but its not one of marks nor dot\n if (punc && !(lastPuncMark || lastPuncDot)) {\n // Console.log(\"1. Invalid punctuation - missing\")\n message.message.push(`Field ${tag} has invalid ending punctuation`);\n if (fix) {\n subfield.value = subfield.value.concat('.');\n message.fix.push(`Field ${tag} - Added punctuation to $${subfield.code}`);\n }\n\n // Last char is dot, but previous char is one of punc marks, like 'Question?.'\n } else if (lastPuncDot && subfield.value.length > 1 && puncMarks.includes(subfield.value.charAt(subfield.value.length - 2))) {\n // Console.log(\"2. Invalid punctuation - duplicate, like '?.'\")\n message.message.push(`Field ${tag} has invalid ending punctuation`);\n if (fix) {\n subfield.value = subfield.value.slice(0, -1);\n message.fix.push(`Field ${tag} - Removed double punctuation from $${subfield.code}`);\n }\n\n // Last char shouldn't be dot !! This is behind checkEnd boolean, because of dots at end of abbreviations, so this is checked only in special cases !!//\n } else if (checkEnd && (!punc && lastPuncDot)) {\n // Console.log(\"3. Invalid punctuation - Shouldn't be dot, is\")\n message.message.push(`Field ${tag} has invalid ending punctuation`);\n if (fix) {\n subfield.value = subfield.value.slice(0, -1);\n message.fix.push(`Field ${tag} - Removed punctuation from $${subfield.code}`);\n }\n }\n }\n\n // Special cases from here on\n function specialCases(res, field, tag) {\n let lastSubField = null;\n // Punctuation should be only after specific field\n if (res.special.afterOnly) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n if (typeof res.special.strict === 'undefined') {\n res.special.strict = true;\n }\n\n if (lastSubField.code === res.special.afterOnly) {\n normalPuncRules(lastSubField, res.punc, tag, res.special.strict, false);\n } else {\n normalPuncRules(lastSubField, !res.punc, tag, true, false);\n }\n }\n } else if (res.special.noPuncIfField) {\n if (field.subfields.some(subField => subField.code === res.special.noPuncIfField) === false) {\n lastSubField = findLastSubfield(field);\n normalPuncRules(lastSubField, res.punc, tag, true, false);\n }\n } else if (res.special.ifBoth) {\n lastSubField = findLastSubfield(field);\n if (lastSubField && lastSubField.code === res.special.puncSubField) {\n // Ind2 match, check second if at punc rules with special punc char override\n if (res.special.ifInd2 && res.special.ifInd2.includes(field.ind2)) {\n normalPuncRules(lastSubField, res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n\n // Matches execption to special rule, noPuncIfInd2 (likely with value 4, that indicates copyright mark)\n } else if (res.special.noPuncIfInd2 && field.ind2 && res.special.noPuncIfInd2.includes(field.ind2)) {\n normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n\n // Does not match rules -> shouldn't have punc\n } else {\n normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n }\n }\n } else if (res.special.secondLastIfLast) {\n field.subfields.forEach(subField => {\n if (isNaN(subField.code) && res.special.secondLastIfLast !== subField.code) {\n lastSubField = subField;\n } // Not control field\n\n if (typeof res.special.last !== 'undefined' && res.special.secondLastIfLast === subField.code) {\n normalPuncRules(subField, res.special.last, tag, true, false);\n } // Strict because this field should not be abbreviation\n });\n normalPuncRules(lastSubField, res.punc, tag, false, false);\n\n // Search for Finnish terms\n } else if (res.special.termField) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n const languageField = field.subfields.find(({code}) => code === res.special.termField);\n if (languageField && languageField.value && finnishTerms.some(p => p.test(languageField.value))) {\n // If (languageField && languageField.value && finnishTerms.indexOf(languageField.value) > -1) {\n normalPuncRules(lastSubField, res.punc, tag, true, false);\n } else {\n normalPuncRules(lastSubField, res.special.else, tag, false, false); // Strict because of years etc (648, 650)\n }\n }\n // Search last of array in subfields and check if it has punc\n } else if (res.special.lastOf) {\n lastSubField = null;\n field.subfields.filter(subField => 'value' in subField).forEach(subField => {\n if (isNaN(subField.code) && res.special.lastOf.indexOf(subField.code) > -1) {\n lastSubField = subField;\n } // Not control field\n\n if (res.special.mandatory && res.special.mandatory.indexOf(subField.code) > -1) {\n normalPuncRules(subField, res.punc, tag, true, false);\n } // Strict because of mandatory\n });\n\n if (lastSubField) {\n normalPuncRules(lastSubField, res.punc, tag, false, false);\n }\n\n // If field has linked rules (tag: 880), find rules and re-validate\n } else if (res.special.linked) {\n let linkedTag = null;\n try {\n linkedTag = parseInt(field.subfields.find(({code}) => code === res.special.linked).value.substr(0, 3), 10); // Substring feels stupid, but is used in MarcRecord to extract tag.\n } catch (err) {\n debug(`Got error while parsing tag: ${err instanceof Error ? err.stack : err}`);\n return false;\n }\n\n validateField(field, linkedTag, fix, message);\n }\n }\n\n let res = null;\n let tag = null;\n let lastSubField = null;\n\n if (linkedTag) {\n tag = linkedTag;\n } else {\n try {\n tag = parseInt(field.tag, 10);\n } catch (err) {\n debug(`Got error while parsing tag: ${err instanceof Error ? err.stack : err}`);\n return false;\n }\n }\n\n // Find configuration object matching tag:\n res = Object.values(confSpec).find(o => {\n const rangeFine = o.rangeStart <= tag && o.rangeEnd >= tag;\n return o.index === tag || rangeFine;\n });\n\n if (!res) {\n return;\n } // Configuration not found, pass field without error\n\n // Field does not have subfields; invalid\n if (typeof field.subfields === 'undefined' || field.subfields === null) {\n message.message.push(`Field ${field.tag} has invalid ending punctuation`);\n return;\n }\n\n // Normal rules\n if (typeof res.special === 'undefined' || res.special === null) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n normalPuncRules(lastSubField, res.punc, field.tag, false, false, fix, message);\n }\n } else {\n try {\n specialCases(res, field, field.tag);\n } catch (e) {\n console.error('Catched error from special case: ', e); // eslint-disable-line no-console\n }\n }\n}\n\nexport function validateSingleField(field, linkedTag, fix) {\n const message = {};\n message.message = [];\n if (fix) {\n message.fix = [];\n }\n\n validateField(field, linkedTag, fix, message);\n message.valid = !(message.message.length >= 1);\n return message;\n}\n\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -31,8 +31,6 @@ function _default() {
|
|
|
31
31
|
messages
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
|
-
|
|
35
|
-
/* eslint-disable functional/immutable-data,functional/no-conditional-statements */
|
|
36
34
|
function fix(record) {
|
|
37
35
|
record.fields.forEach(({
|
|
38
36
|
subfields
|
|
@@ -47,8 +45,6 @@ function _default() {
|
|
|
47
45
|
});
|
|
48
46
|
});
|
|
49
47
|
}
|
|
50
|
-
/* eslint-enable functional/immutable-data,functional/no-conditional-statements */
|
|
51
|
-
|
|
52
48
|
function valueEndsWithWhitespace({
|
|
53
49
|
value
|
|
54
50
|
}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ending-whitespace.js","names":["_default","description","validate","fix","record","nonValidFields","fields","filter","subfields","undefined","valueEndsWithWhitespace","length","valid","messages","flatMap","tag","map","sf","code","forEach","subfield","value","trimEnd","test"],"sources":["../src/ending-whitespace.js"],"sourcesContent":["/**\n * Provides interface to validate and fix record fields, which include subfields that end with whitespace character\n * @returns {Object} Object containing interfaces required by marc-record-validators-melinda package\n */\nexport default function () {\n return {\n description: 'Handles subfields that ends with whitespace character',\n validate,\n fix\n };\n\n function validate(record) {\n const nonValidFields = record.fields.filter(({subfields}) => subfields !== undefined && subfields.filter(valueEndsWithWhitespace).length > 0);\n\n const valid = nonValidFields.length === 0;\n const messages = nonValidFields.flatMap(({tag, subfields}) => subfields.map(sf => `Field ${tag} subfield $${sf.code} ends with whitespace`));\n\n return valid ? {valid, messages: []} : {valid, messages};\n }\n\n
|
|
1
|
+
{"version":3,"file":"ending-whitespace.js","names":["_default","description","validate","fix","record","nonValidFields","fields","filter","subfields","undefined","valueEndsWithWhitespace","length","valid","messages","flatMap","tag","map","sf","code","forEach","subfield","value","trimEnd","test"],"sources":["../src/ending-whitespace.js"],"sourcesContent":["/**\n * Provides interface to validate and fix record fields, which include subfields that end with whitespace character\n * @returns {Object} Object containing interfaces required by marc-record-validators-melinda package\n */\nexport default function () {\n return {\n description: 'Handles subfields that ends with whitespace character',\n validate,\n fix\n };\n\n function validate(record) {\n const nonValidFields = record.fields.filter(({subfields}) => subfields !== undefined && subfields.filter(valueEndsWithWhitespace).length > 0);\n\n const valid = nonValidFields.length === 0;\n const messages = nonValidFields.flatMap(({tag, subfields}) => subfields.map(sf => `Field ${tag} subfield $${sf.code} ends with whitespace`));\n\n return valid ? {valid, messages: []} : {valid, messages};\n }\n\n function fix(record) {\n record.fields.forEach(({subfields}) => {\n if (subfields === undefined) {\n return;\n }\n\n subfields.forEach(subfield => {\n if (valueEndsWithWhitespace(subfield)) {\n subfield.value = subfield.value.trimEnd();\n }\n });\n });\n }\n\n function valueEndsWithWhitespace({value}) {\n return (/\\s$/u).test(value);\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACe,SAAAA,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,uDAAuD;IACpEC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMC,cAAc,GAAGD,MAAM,CAACE,MAAM,CAACC,MAAM,CAAC,CAAC;MAACC;IAAS,CAAC,KAAKA,SAAS,KAAKC,SAAS,IAAID,SAAS,CAACD,MAAM,CAACG,uBAAuB,CAAC,CAACC,MAAM,GAAG,CAAC,CAAC;IAE7I,MAAMC,KAAK,GAAGP,cAAc,CAACM,MAAM,KAAK,CAAC;IACzC,MAAME,QAAQ,GAAGR,cAAc,CAACS,OAAO,CAAC,CAAC;MAACC,GAAG;MAAEP;IAAS,CAAC,KAAKA,SAAS,CAACQ,GAAG,CAACC,EAAE,IAAI,SAASF,GAAG,cAAcE,EAAE,CAACC,IAAI,uBAAuB,CAAC,CAAC;IAE5I,OAAON,KAAK,GAAG;MAACA,KAAK;MAAEC,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACD,KAAK;MAAEC;IAAQ,CAAC;EAC1D;EAEA,SAASV,GAAGA,CAACC,MAAM,EAAE;IACnBA,MAAM,CAACE,MAAM,CAACa,OAAO,CAAC,CAAC;MAACX;IAAS,CAAC,KAAK;MACrC,IAAIA,SAAS,KAAKC,SAAS,EAAE;QAC3B;MACF;MAEAD,SAAS,CAACW,OAAO,CAACC,QAAQ,IAAI;QAC5B,IAAIV,uBAAuB,CAACU,QAAQ,CAAC,EAAE;UACrCA,QAAQ,CAACC,KAAK,GAAGD,QAAQ,CAACC,KAAK,CAACC,OAAO,CAAC,CAAC;QAC3C;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EAEA,SAASZ,uBAAuBA,CAAC;IAACW;EAAK,CAAC,EAAE;IACxC,OAAQ,MAAM,CAAEE,IAAI,CAACF,KAAK,CAAC;EAC7B;AACF","ignoreList":[]}
|
|
@@ -40,7 +40,7 @@ function _default() {
|
|
|
40
40
|
record.fields?.forEach(field => {
|
|
41
41
|
validateField(field, res, typeOfMaterial);
|
|
42
42
|
});
|
|
43
|
-
res.valid = !(res.message.length >= 1);
|
|
43
|
+
res.valid = !(res.message.length >= 1);
|
|
44
44
|
return res;
|
|
45
45
|
}
|
|
46
46
|
function validateField(field, res, typeOfMaterial) {
|
|
@@ -53,7 +53,7 @@ function _default() {
|
|
|
53
53
|
const mod = (0, _utils.fieldToString)(normalizedField);
|
|
54
54
|
if (orig !== mod) {
|
|
55
55
|
// Fail as the input is "broken"/"crap"/sumthing
|
|
56
|
-
res.message.push(`TODO: '${orig}' => '${mod}'`);
|
|
56
|
+
res.message.push(`TODO: '${orig}' => '${mod}'`);
|
|
57
57
|
return;
|
|
58
58
|
}
|
|
59
59
|
return;
|
|
@@ -119,7 +119,6 @@ function processCharacterGroup(field, group) {
|
|
|
119
119
|
//console.info(`008/${group.start}-${group.end}: '${originalContent}'`); // eslint-disable-line no-console
|
|
120
120
|
const charArray = content.split('');
|
|
121
121
|
charArray.sort(function (a, b) {
|
|
122
|
-
// eslint-disable-line functional/immutable-data, prefer-arrow-callback
|
|
123
122
|
return scoreChar(a) - scoreChar(b);
|
|
124
123
|
});
|
|
125
124
|
const newContent = charArray.join('');
|
|
@@ -129,7 +128,7 @@ function processCharacterGroup(field, group) {
|
|
|
129
128
|
|
|
130
129
|
//console.info(`'${fieldToString(field)}' =>`); // eslint-disable-line no-console
|
|
131
130
|
|
|
132
|
-
field.value = `${field.value.substring(0, group.start)}${newContent}${field.value.substring(group.end + 1)}`;
|
|
131
|
+
field.value = `${field.value.substring(0, group.start)}${newContent}${field.value.substring(group.end + 1)}`;
|
|
133
132
|
//console.info(`'${fieldToString(field)}'`); // eslint-disable-line no-console
|
|
134
133
|
|
|
135
134
|
function fixBlanks(str) {
|
|
@@ -167,7 +166,7 @@ function justifyAndSortField008CharacterGroups(field, typeOfMaterial) {
|
|
|
167
166
|
//console.info(typeOfMaterial); // eslint-disable-line no-console
|
|
168
167
|
|
|
169
168
|
const relevantCharacterGroups = characterGroups.filter(gr => gr.type === typeOfMaterial);
|
|
170
|
-
relevantCharacterGroups.forEach(group => processCharacterGroup(field, group));
|
|
169
|
+
relevantCharacterGroups.forEach(group => processCharacterGroup(field, group)); // eslint-disable-line array-callback-return
|
|
171
170
|
|
|
172
171
|
//justifyField008CharacterGroups(field, typeOfMaterial); // Oops: also sorts...
|
|
173
172
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-008-18-34-character-groups.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","typeOfMaterial","getTypeOfMaterial","fields","forEach","field","justifyAndSortField008CharacterGroups","res","message","valid","validateField","length","tag","orig","fieldToString","normalizedField","clone","mod","push","characterGroups","type","start","end","sort","name","BIG_BAD_VALUE","processCharacterGroup","group","originalContent","value","substring","content","removeDuplicateValues","fixBlanks","charArray","split","a","b","scoreChar","newContent","join","str","includes","match","replaceAll","c","asciiCode","charCodeAt","subfields","relevantCharacterGroups","filter","gr","arr","reducedStr","i","indexOf","output","repeat"],"sources":["../src/field-008-18-34-character-groups.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n// Author(s): Nicholas Volk\n// NB! CR 008/24 vs 008/25-27 is not supported yet!\n\nexport default function () {\n\n return {\n description: 'Justify left and sort character groups within 008/18-24',\n validate, fix\n };\n\n function fix(record) {\n const typeOfMaterial = record.getTypeOfMaterial();\n record.fields.forEach(field => {\n justifyAndSortField008CharacterGroups(field, typeOfMaterial);\n });\n // Fix always succeeds (even when it really does not):\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const typeOfMaterial = record.getTypeOfMaterial();\n\n record.fields?.forEach(field => {\n validateField(field, res, typeOfMaterial);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res, typeOfMaterial) {\n if (field.tag !== '008') { // Optimize code a bit...\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = justifyAndSortField008CharacterGroups(clone(field), typeOfMaterial);\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`TODO: '${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n}\n\n// Should we add legal values?\nconst characterGroups = [\n {type: 'BK', start: 18, end: 21, sort: true, name: 'illustrations'},\n {type: 'BK', start: 24, end: 27, sort: true, name: 'nature of contents'}, // English doc does not explicitly mention alphabetical sorting... Finnish does.\n {type: 'CR', start: 25, end: 27, sort: true, name: 'nature of contents'}, // NB! 24 vs 25-27 logic needs to be implemented separately\n {type: 'MP', start: 18, end: 21, sort: false, name: 'relief'}, // Order of importance!\n {type: 'MP', start: 33, end: 34, sort: false, name: 'special format of characteristics'}, // Order of importance!\n {type: 'MU', start: 24, end: 29, sort: true, name: 'accompanying material'},\n {type: 'MU', start: 30, end: 31, sort: true, name: 'literary text for sound recordings'}\n];\n\nconst BIG_BAD_VALUE = 999999999;\n\nfunction processCharacterGroup(field, group) {\n const originalContent = field.value.substring(group.start, group.end + 1);\n const content = removeDuplicateValues(fixBlanks(originalContent));\n //console.info(`008/${group.start}-${group.end}: '${originalContent}'`); // eslint-disable-line no-console\n const charArray = content.split('');\n\n charArray.sort(function(a, b) { // eslint-disable-line functional/immutable-data, prefer-arrow-callback\n return scoreChar(a) - scoreChar(b);\n });\n\n const newContent = charArray.join('');\n if (originalContent === newContent) {\n return;\n }\n\n //console.info(`'${fieldToString(field)}' =>`); // eslint-disable-line no-console\n\n field.value = `${field.value.substring(0, group.start)}${newContent}${field.value.substring(group.end + 1)}`; // eslint-disable-line functional/immutable-data\n //console.info(`'${fieldToString(field)}'`); // eslint-disable-line no-console\n\n function fixBlanks(str) {\n if (str.includes('|') && str.match(/[^ |]/u)) {\n return str.replaceAll('|', ' ');\n }\n return str;\n }\n\n function scoreChar(c) {\n if (c === '|' || c === ' ') {\n return BIG_BAD_VALUE; // Max value, these should code last\n }\n if (!group.sort) { // more meaningful comes first: keep the original order\n return 1;\n }\n const asciiCode = c.charCodeAt(0);\n // a-z get values 1-26:\n if (asciiCode >= 97 && asciiCode <= 122) {\n return asciiCode - 96;\n }\n // 0-9 get values 100-109\n if (asciiCode >= 48 && asciiCode <= 57) {\n return asciiCode + 52;\n }\n // Others (=crap) return something between '9' and BIG BAD VALUE\n return asciiCode + 200;\n }\n}\n\nexport function justifyAndSortField008CharacterGroups(field, typeOfMaterial) {\n if (field.tag !== '008' || field.subfields) {\n return field;\n }\n\n //console.info(typeOfMaterial); // eslint-disable-line no-console\n\n const relevantCharacterGroups = characterGroups.filter(gr => gr.type === typeOfMaterial);\n\n relevantCharacterGroups.forEach(group => processCharacterGroup(field, group));\n\n //justifyField008CharacterGroups(field, typeOfMaterial); // Oops: also sorts...\n\n // NB! add value # and | normalizations\n //fixBlanks(field, typeOfMaterial);\n\n return field;\n}\n\nfunction removeDuplicateValues(str) {\n const arr = str.split('');\n // Take only the first instance of a proper value-carrying character\n const reducedStr = arr.filter((c, i) => c === ' ' || c === '|' || arr.indexOf(c) === i).join('');\n //console.info(`I: '${str}'`); // eslint-disable-line no-console\n //console.info(`M: '${reducedStr}'`); // eslint-disable-line no-console\n const output = `${reducedStr}${' '.repeat(str.length - reducedStr.length)}`; // Had some weird trouble with str.padEnd(n)\n //console.info(`M: '${output}'`); // eslint-disable-line no-console\n return output;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"field-008-18-34-character-groups.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","typeOfMaterial","getTypeOfMaterial","fields","forEach","field","justifyAndSortField008CharacterGroups","res","message","valid","validateField","length","tag","orig","fieldToString","normalizedField","clone","mod","push","characterGroups","type","start","end","sort","name","BIG_BAD_VALUE","processCharacterGroup","group","originalContent","value","substring","content","removeDuplicateValues","fixBlanks","charArray","split","a","b","scoreChar","newContent","join","str","includes","match","replaceAll","c","asciiCode","charCodeAt","subfields","relevantCharacterGroups","filter","gr","arr","reducedStr","i","indexOf","output","repeat"],"sources":["../src/field-008-18-34-character-groups.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n// Author(s): Nicholas Volk\n// NB! CR 008/24 vs 008/25-27 is not supported yet!\n\nexport default function () {\n\n return {\n description: 'Justify left and sort character groups within 008/18-24',\n validate, fix\n };\n\n function fix(record) {\n const typeOfMaterial = record.getTypeOfMaterial();\n record.fields.forEach(field => {\n justifyAndSortField008CharacterGroups(field, typeOfMaterial);\n });\n // Fix always succeeds (even when it really does not):\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const typeOfMaterial = record.getTypeOfMaterial();\n\n record.fields?.forEach(field => {\n validateField(field, res, typeOfMaterial);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res, typeOfMaterial) {\n if (field.tag !== '008') { // Optimize code a bit...\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = justifyAndSortField008CharacterGroups(clone(field), typeOfMaterial);\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`TODO: '${orig}' => '${mod}'`);\n return;\n }\n return;\n }\n}\n\n// Should we add legal values?\nconst characterGroups = [\n {type: 'BK', start: 18, end: 21, sort: true, name: 'illustrations'},\n {type: 'BK', start: 24, end: 27, sort: true, name: 'nature of contents'}, // English doc does not explicitly mention alphabetical sorting... Finnish does.\n {type: 'CR', start: 25, end: 27, sort: true, name: 'nature of contents'}, // NB! 24 vs 25-27 logic needs to be implemented separately\n {type: 'MP', start: 18, end: 21, sort: false, name: 'relief'}, // Order of importance!\n {type: 'MP', start: 33, end: 34, sort: false, name: 'special format of characteristics'}, // Order of importance!\n {type: 'MU', start: 24, end: 29, sort: true, name: 'accompanying material'},\n {type: 'MU', start: 30, end: 31, sort: true, name: 'literary text for sound recordings'}\n];\n\nconst BIG_BAD_VALUE = 999999999;\n\nfunction processCharacterGroup(field, group) {\n const originalContent = field.value.substring(group.start, group.end + 1);\n const content = removeDuplicateValues(fixBlanks(originalContent));\n //console.info(`008/${group.start}-${group.end}: '${originalContent}'`); // eslint-disable-line no-console\n const charArray = content.split('');\n\n charArray.sort(function(a, b) {\n return scoreChar(a) - scoreChar(b);\n });\n\n const newContent = charArray.join('');\n if (originalContent === newContent) {\n return;\n }\n\n //console.info(`'${fieldToString(field)}' =>`); // eslint-disable-line no-console\n\n field.value = `${field.value.substring(0, group.start)}${newContent}${field.value.substring(group.end + 1)}`;\n //console.info(`'${fieldToString(field)}'`); // eslint-disable-line no-console\n\n function fixBlanks(str) {\n if (str.includes('|') && str.match(/[^ |]/u)) {\n return str.replaceAll('|', ' ');\n }\n return str;\n }\n\n function scoreChar(c) {\n if (c === '|' || c === ' ') {\n return BIG_BAD_VALUE; // Max value, these should code last\n }\n if (!group.sort) { // more meaningful comes first: keep the original order\n return 1;\n }\n const asciiCode = c.charCodeAt(0);\n // a-z get values 1-26:\n if (asciiCode >= 97 && asciiCode <= 122) {\n return asciiCode - 96;\n }\n // 0-9 get values 100-109\n if (asciiCode >= 48 && asciiCode <= 57) {\n return asciiCode + 52;\n }\n // Others (=crap) return something between '9' and BIG BAD VALUE\n return asciiCode + 200;\n }\n}\n\nexport function justifyAndSortField008CharacterGroups(field, typeOfMaterial) {\n if (field.tag !== '008' || field.subfields) {\n return field;\n }\n\n //console.info(typeOfMaterial); // eslint-disable-line no-console\n\n const relevantCharacterGroups = characterGroups.filter(gr => gr.type === typeOfMaterial);\n\n relevantCharacterGroups.forEach(group => processCharacterGroup(field, group)); // eslint-disable-line array-callback-return\n\n //justifyField008CharacterGroups(field, typeOfMaterial); // Oops: also sorts...\n\n // NB! add value # and | normalizations\n //fixBlanks(field, typeOfMaterial);\n\n return field;\n}\n\nfunction removeDuplicateValues(str) {\n const arr = str.split('');\n // Take only the first instance of a proper value-carrying character\n const reducedStr = arr.filter((c, i) => c === ' ' || c === '|' || arr.indexOf(c) === i).join('');\n //console.info(`I: '${str}'`); // eslint-disable-line no-console\n //console.info(`M: '${reducedStr}'`); // eslint-disable-line no-console\n const output = `${reducedStr}${' '.repeat(str.length - reducedStr.length)}`; // Had some weird trouble with str.padEnd(n)\n //console.info(`M: '${output}'`); // eslint-disable-line no-console\n return output;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -34,7 +34,7 @@ function _default() {
|
|
|
34
34
|
record.fields?.forEach(field => {
|
|
35
35
|
validateField(field, res);
|
|
36
36
|
});
|
|
37
|
-
res.valid = !(res.message.length >= 1);
|
|
37
|
+
res.valid = !(res.message.length >= 1);
|
|
38
38
|
return res;
|
|
39
39
|
}
|
|
40
40
|
function validateField(field, res) {
|
|
@@ -43,7 +43,7 @@ function _default() {
|
|
|
43
43
|
const mod = (0, _utils.fieldToString)(normalizedField);
|
|
44
44
|
if (orig !== mod) {
|
|
45
45
|
// Fail as the input is "broken"/"crap"/sumthing
|
|
46
|
-
res.message.push(`'TODO: ${orig}' => '${mod}'`);
|
|
46
|
+
res.message.push(`'TODO: ${orig}' => '${mod}'`);
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
49
|
return;
|
|
@@ -51,20 +51,22 @@ function _default() {
|
|
|
51
51
|
}
|
|
52
52
|
function field505FixSubfieldA(field) {
|
|
53
53
|
const a = field.subfields.filter(sf => sf.code === 'a');
|
|
54
|
-
a.forEach(sf => fixSubfieldA(sf));
|
|
54
|
+
a.forEach(sf => fixSubfieldA(sf)); // eslint-disable-line array-callback-return
|
|
55
|
+
|
|
55
56
|
function fixSubfieldA(a) {
|
|
56
|
-
a.value = a.value.replace(/ ; /ug, ' -- ');
|
|
57
|
+
a.value = a.value.replace(/ ; /ug, ' -- ');
|
|
57
58
|
}
|
|
58
59
|
}
|
|
59
60
|
function field505FixSubfieldTRG(field) {
|
|
60
61
|
// Modify subfield if next subfield is $t:
|
|
61
62
|
const subfieldsThatWillBeModified = field.subfields.filter((sf, i) => i + 1 < field.subfields.length && field.subfields[i + 1].code === 't');
|
|
62
|
-
subfieldsThatWillBeModified.forEach(sf => fixSubfieldThatPrecedesT(sf));
|
|
63
|
+
subfieldsThatWillBeModified.forEach(sf => fixSubfieldThatPrecedesT(sf)); // eslint-disable-line array-callback-return
|
|
64
|
+
|
|
63
65
|
function fixSubfieldThatPrecedesT(sf) {
|
|
64
66
|
if (!sf.value) {
|
|
65
67
|
return;
|
|
66
68
|
}
|
|
67
|
-
sf.value = sf.value.replace(/ ;$/u, ' --');
|
|
69
|
+
sf.value = sf.value.replace(/ ;$/u, ' --');
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
72
|
function fix505(field) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-505-separators.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","fields","forEach","field","fix505","res","message","valid","validateField","length","orig","fieldToString","normalizedField","clone","mod","push","field505FixSubfieldA","a","subfields","filter","sf","code","fixSubfieldA","value","replace","field505FixSubfieldTRG","subfieldsThatWillBeModified","i","fixSubfieldThatPrecedesT","tag"],"sources":["../src/field-505-separators.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Normalize \" ; \" separators as \" -- \"',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n fix505(field);\n });\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields?.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1)
|
|
1
|
+
{"version":3,"file":"field-505-separators.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","fields","forEach","field","fix505","res","message","valid","validateField","length","orig","fieldToString","normalizedField","clone","mod","push","field505FixSubfieldA","a","subfields","filter","sf","code","fixSubfieldA","value","replace","field505FixSubfieldTRG","subfieldsThatWillBeModified","i","fixSubfieldThatPrecedesT","tag"],"sources":["../src/field-505-separators.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Normalize \" ; \" separators as \" -- \"',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n fix505(field);\n });\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields?.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = fix505(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'TODO: ${orig}' => '${mod}'`);\n return;\n }\n return;\n }\n}\n\n\nfunction field505FixSubfieldA(field) {\n const a = field.subfields.filter(sf => sf.code === 'a');\n\n a.forEach(sf => fixSubfieldA(sf)); // eslint-disable-line array-callback-return\n\n function fixSubfieldA(a) {\n a.value = a.value.replace(/ ; /ug, ' -- ');\n }\n}\n\nfunction field505FixSubfieldTRG(field) {\n // Modify subfield if next subfield is $t:\n const subfieldsThatWillBeModified = field.subfields.filter((sf, i) => i + 1 < field.subfields.length && field.subfields[i + 1].code === 't');\n\n subfieldsThatWillBeModified.forEach(sf => fixSubfieldThatPrecedesT(sf)); // eslint-disable-line array-callback-return\n\n function fixSubfieldThatPrecedesT(sf) {\n if (!sf.value) {\n return;\n }\n sf.value = sf.value.replace(/ ;$/u, ' --');\n }\n}\n\nfunction fix505(field) {\n if (field.tag !== '505' || !field.subfields) {\n return field;\n }\n field505FixSubfieldTRG(field);\n field505FixSubfieldA(field);\n return field;\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/field-521-fix.js
CHANGED
|
@@ -43,7 +43,7 @@ function _default() {
|
|
|
43
43
|
record.fields?.forEach(field => {
|
|
44
44
|
validateField(field, res);
|
|
45
45
|
});
|
|
46
|
-
res.valid = !(res.message.length >= 1);
|
|
46
|
+
res.valid = !(res.message.length >= 1);
|
|
47
47
|
return res;
|
|
48
48
|
}
|
|
49
49
|
function validateField(field, res) {
|
|
@@ -52,7 +52,7 @@ function _default() {
|
|
|
52
52
|
const mod = (0, _utils.fieldToString)(normalizedField);
|
|
53
53
|
if (orig !== mod) {
|
|
54
54
|
// Fail as the input is "broken"/"crap"/sumthing
|
|
55
|
-
res.message.push(`'TODO: ${orig}' => '${mod}'`);
|
|
55
|
+
res.message.push(`'TODO: ${orig}' => '${mod}'`);
|
|
56
56
|
return;
|
|
57
57
|
}
|
|
58
58
|
return;
|
|
@@ -60,13 +60,12 @@ function _default() {
|
|
|
60
60
|
}
|
|
61
61
|
function fixSubfieldA(a) {
|
|
62
62
|
a.value = a.value.
|
|
63
|
-
// eslint-disable-line functional/immutable-data
|
|
64
63
|
// MET-332:
|
|
65
|
-
replace(/^(Ikäsuositus) ([0-9])/u, '$1: $2');
|
|
64
|
+
replace(/^(Ikäsuositus) ([0-9])/u, '$1: $2');
|
|
66
65
|
}
|
|
67
66
|
function fixSubfieldAInternalPunctuation(field) {
|
|
68
67
|
const a = field.subfields.filter(sf => sf.code === 'a');
|
|
69
|
-
a.forEach(sf => fixSubfieldA(sf));
|
|
68
|
+
a.forEach(sf => fixSubfieldA(sf)); // eslint-disable-line array-callback-return
|
|
70
69
|
}
|
|
71
70
|
function getIndicator1(field) {
|
|
72
71
|
const [a] = field.subfields.filter(sf => sf.code === 'a');
|
|
@@ -80,7 +79,7 @@ function getIndicator1(field) {
|
|
|
80
79
|
function fixIndicator1(field) {
|
|
81
80
|
const value = getIndicator1(field);
|
|
82
81
|
if (value) {
|
|
83
|
-
field.ind1 = value;
|
|
82
|
+
field.ind1 = value;
|
|
84
83
|
return;
|
|
85
84
|
}
|
|
86
85
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-521-fix.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","fields","forEach","field","fix521","res","message","valid","validateField","length","orig","fieldToString","normalizedField","clone","mod","push","fixSubfieldA","a","value","replace","fixSubfieldAInternalPunctuation","subfields","filter","sf","code","getIndicator1","match","undefined","fixIndicator1","ind1","tag"],"sources":["../src/field-521-fix.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Various fixes for field 521',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n fix521(field);\n });\n // Fix always succeeds (even when it really does not):\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n record.fields?.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1)
|
|
1
|
+
{"version":3,"file":"field-521-fix.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","fields","forEach","field","fix521","res","message","valid","validateField","length","orig","fieldToString","normalizedField","clone","mod","push","fixSubfieldA","a","value","replace","fixSubfieldAInternalPunctuation","subfields","filter","sf","code","getIndicator1","match","undefined","fixIndicator1","ind1","tag"],"sources":["../src/field-521-fix.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Various fixes for field 521',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n fix521(field);\n });\n // Fix always succeeds (even when it really does not):\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n record.fields?.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = fix521(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'TODO: ${orig}' => '${mod}'`);\n return;\n }\n return;\n }\n}\n\nfunction fixSubfieldA(a) {\n a.value = a.value.\n // MET-332:\n replace(/^(Ikäsuositus) ([0-9])/u, '$1: $2');\n}\n\nfunction fixSubfieldAInternalPunctuation(field) {\n const a = field.subfields.filter(sf => sf.code === 'a');\n\n a.forEach(sf => fixSubfieldA(sf)); // eslint-disable-line array-callback-return\n}\n\nfunction getIndicator1(field) {\n const [a] = field.subfields.filter(sf => sf.code === 'a');\n if (a) {\n if (a.value.match(/^Ikäsuositus/u)) {\n return '1';\n }\n }\n return undefined;\n}\n\nfunction fixIndicator1(field) {\n const value = getIndicator1(field);\n if (value) {\n field.ind1 = value;\n return;\n }\n\n}\n\nfunction fix521(field) {\n if (field.tag !== '521' || !field.subfields) {\n return field;\n }\n fixIndicator1(field);\n fixSubfieldAInternalPunctuation(field);\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
|