@natlibfi/marc-record-validators-melinda 12.0.7 → 12.0.8
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 +6 -3
- package/dist/addMissingField041.js.map +2 -2
- package/dist/addMissingField336.js +7 -4
- package/dist/addMissingField336.js.map +2 -2
- package/dist/addMissingField337.js +6 -3
- package/dist/addMissingField337.js.map +2 -2
- package/dist/addMissingField338.js +8 -5
- package/dist/addMissingField338.js.map +2 -2
- package/dist/cyrillux-usemarcon-replacement.js +5 -2
- package/dist/cyrillux-usemarcon-replacement.js.map +2 -2
- package/dist/cyrillux.js +10 -7
- package/dist/cyrillux.js.map +2 -2
- package/dist/disambiguateSeriesStatements.js +2 -1
- package/dist/disambiguateSeriesStatements.js.map +2 -2
- package/dist/drop-terms.js +5 -4
- package/dist/drop-terms.js.map +2 -2
- package/dist/fix-33X.js +7 -4
- package/dist/fix-33X.js.map +2 -2
- package/dist/fix-country-codes.js +5 -0
- package/dist/fix-country-codes.js.map +2 -2
- package/dist/fix-language-codes.js +5 -1
- package/dist/fix-language-codes.js.map +2 -2
- package/dist/fix-sami-041.js +11 -10
- package/dist/fix-sami-041.js.map +2 -2
- package/dist/indicator-fixes.js +5 -1
- package/dist/indicator-fixes.js.map +2 -2
- package/dist/merge-fields/counterpartField.js +6 -6
- package/dist/merge-fields/counterpartField.js.map +2 -2
- package/dist/merge-fields/mergableIndicator.js +0 -3
- package/dist/merge-fields/mergableIndicator.js.map +2 -2
- package/dist/merge-fields/worldKnowledge.js.map +2 -2
- package/dist/mergeRelatorTermFields.js +9 -6
- package/dist/mergeRelatorTermFields.js.map +2 -2
- package/dist/normalize-dashes.js +7 -4
- package/dist/normalize-dashes.js.map +2 -2
- package/dist/normalize-identifiers.js.map +2 -2
- package/dist/normalize-utf8-diacritics.js.map +2 -2
- package/dist/normalizeFieldForComparison.js.map +1 -1
- package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
- package/dist/punctuation2.js +5 -2
- package/dist/punctuation2.js.map +2 -2
- package/dist/reindexSubfield6OccurenceNumbers.js +11 -10
- package/dist/reindexSubfield6OccurenceNumbers.js.map +2 -2
- package/dist/removeDuplicateDataFields.js +3 -2
- package/dist/removeDuplicateDataFields.js.map +2 -2
- package/dist/removeInferiorDataFields.js.map +2 -2
- package/dist/resolveOrphanedSubfield6s.js +3 -2
- package/dist/resolveOrphanedSubfield6s.js.map +2 -2
- package/dist/sortSubfields.js +1 -1
- package/dist/sortSubfields.js.map +2 -2
- package/dist/stripPunctuation.js +4 -3
- package/dist/stripPunctuation.js.map +2 -2
- package/dist/subfield6Utils.js +4 -1
- package/dist/subfield6Utils.js.map +2 -2
- package/dist/subfield8Utils.js.map +2 -2
- package/dist/translate-terms.js +4 -3
- package/dist/translate-terms.js.map +2 -2
- package/dist/typeOfDate-008.js +3 -1
- package/dist/typeOfDate-008.js.map +2 -2
- package/dist/update-field-540.js.map +2 -2
- package/dist/urn.js +13 -12
- package/dist/urn.js.map +2 -2
- package/package.json +7 -7
- package/src/addMissingField041.js +8 -4
- package/src/addMissingField336.js +10 -5
- package/src/addMissingField337.js +9 -5
- package/src/addMissingField338.js +11 -6
- package/src/cyrillux-usemarcon-replacement.js +9 -5
- package/src/cyrillux.js +18 -12
- package/src/disambiguateSeriesStatements.js +4 -1
- package/src/drop-terms.js +8 -6
- package/src/fix-33X.js +10 -6
- package/src/fix-country-codes.js +7 -3
- package/src/fix-language-codes.js +8 -4
- package/src/fix-sami-041.js +13 -11
- package/src/indicator-fixes.js +10 -7
- package/src/merge-fields/counterpartField.js +10 -10
- package/src/merge-fields/mergableIndicator.js +3 -3
- package/src/merge-fields/worldKnowledge.js +11 -6
- package/src/mergeRelatorTermFields.js +12 -11
- package/src/normalize-dashes.js +11 -5
- package/src/normalize-identifiers.js +12 -19
- package/src/normalize-utf8-diacritics.js +6 -3
- package/src/normalizeFieldForComparison.js +2 -2
- package/src/normalizeSubfieldValueForComparison.js +2 -2
- package/src/punctuation2.js +34 -30
- package/src/reindexSubfield6OccurenceNumbers.js +13 -11
- package/src/removeDuplicateDataFields.js +29 -27
- package/src/removeInferiorDataFields.js +28 -24
- package/src/resolveOrphanedSubfield6s.js +6 -4
- package/src/sortSubfields.js +5 -5
- package/src/stripPunctuation.js +5 -3
- package/src/subfield6Utils.js +33 -35
- package/src/subfield8Utils.js +10 -7
- package/src/translate-terms.js +13 -9
- package/src/typeOfDate-008.js +4 -1
- package/src/update-field-540.js +7 -5
- package/src/urn.js +17 -13
- package/test-fixtures/drop-terms/02/metadata.json +1 -1
- package/test-fixtures/drop-terms/03/metadata.json +1 -1
- package/test-fixtures/drop-terms/04/metadata.json +1 -1
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
import createDebugLogger from 'debug';
|
|
2
2
|
import {fieldToString, getCatalogingLanguage, nvdebug} from './utils.js';
|
|
3
3
|
import {getFormOfItem, map336CodeToTerm} from './field33XUtils.js';
|
|
4
4
|
|
|
5
|
+
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:addMissingField336');
|
|
6
|
+
//const debugData = debug.extend('data');
|
|
7
|
+
const debugDev = debug.extend('dev');
|
|
8
|
+
|
|
5
9
|
const description = 'Add missing 336 field(s)';
|
|
6
10
|
|
|
7
11
|
// const multimediaRegexp = /multimedia/ui;
|
|
8
12
|
|
|
13
|
+
// eslint-disable-next-line max-lines-per-function
|
|
9
14
|
export default function () {
|
|
10
15
|
|
|
11
16
|
return {
|
|
@@ -13,9 +18,9 @@ export default function () {
|
|
|
13
18
|
};
|
|
14
19
|
|
|
15
20
|
function fix(record) {
|
|
16
|
-
nvdebug(`FIX ${description}
|
|
21
|
+
nvdebug(`FIX ${description}...`, debugDev);
|
|
17
22
|
const newFields = getMissing336s(record);
|
|
18
|
-
nvdebug(` GOT ${newFields.length}
|
|
23
|
+
nvdebug(` GOT ${newFields.length}...`, debugDev);
|
|
19
24
|
// FFS: we actually need newFields array here! Videogame, for example, might be
|
|
20
25
|
// 336 ## ‡a kaksiulotteinen liikkuva kuva ‡b tdi ‡2 rdacontent
|
|
21
26
|
// 336 ## ‡a tietokoneohjelma ‡b cop ‡2 rdacontent
|
|
@@ -28,7 +33,7 @@ export default function () {
|
|
|
28
33
|
}
|
|
29
34
|
|
|
30
35
|
function validate(record) {
|
|
31
|
-
nvdebug(`VALIDATE ${description}
|
|
36
|
+
nvdebug(`VALIDATE ${description}...`, debugDev);
|
|
32
37
|
const newFields = getMissing336s(record);
|
|
33
38
|
if (newFields.length === 0) {
|
|
34
39
|
return {message: [], valid: true};
|
|
@@ -251,7 +256,7 @@ export default function () {
|
|
|
251
256
|
}
|
|
252
257
|
|
|
253
258
|
const bees = guessMissing336Bs(record); // bees = b-subfields
|
|
254
|
-
nvdebug(` WE HAVE ${bees.length} BEES: ${bees.join(', ')}
|
|
259
|
+
nvdebug(` WE HAVE ${bees.length} BEES: ${bees.join(', ')}`, debugDev);
|
|
255
260
|
|
|
256
261
|
|
|
257
262
|
return bees.map(b => codeToField(b, getCatalogingLanguage(record, 'fin')));
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import createDebugLogger from 'debug';
|
|
2
2
|
import {fieldToString, getCatalogingLanguage, nvdebug} from './utils.js';
|
|
3
3
|
import {getFormOfItem, map337CodeToTerm} from './field33XUtils.js';
|
|
4
4
|
|
|
5
|
+
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:addMissingField337');
|
|
6
|
+
//const debugData = debug.extend('data');
|
|
7
|
+
const debugDev = debug.extend('dev');
|
|
8
|
+
|
|
5
9
|
const description = 'Add missing 337 field(s)';
|
|
6
10
|
|
|
7
11
|
// Based on https://github.com/NatLibFi/USEMARCON-Cyrillux/blob/master/008-23-337a.tbl . Extended!
|
|
@@ -27,7 +31,7 @@ export default function () {
|
|
|
27
31
|
};
|
|
28
32
|
|
|
29
33
|
function fix(record) {
|
|
30
|
-
nvdebug(`FIX ${description}
|
|
34
|
+
nvdebug(`FIX ${description}...`, debugDev);
|
|
31
35
|
const newField = getMissing337(record);
|
|
32
36
|
const res = {message: [], fix: [], valid: true};
|
|
33
37
|
if (newField) {
|
|
@@ -39,7 +43,7 @@ export default function () {
|
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
function validate(record) {
|
|
42
|
-
nvdebug(`VALIDATE ${description}
|
|
46
|
+
nvdebug(`VALIDATE ${description}....`, debugDev);
|
|
43
47
|
const newField = getMissing337(record);
|
|
44
48
|
if (!newField) {
|
|
45
49
|
return {message: [], valid: true};
|
|
@@ -101,7 +105,7 @@ export default function () {
|
|
|
101
105
|
function getMissing337(record) {
|
|
102
106
|
const [f337] = record.get('337');
|
|
103
107
|
if (f337) {
|
|
104
|
-
// nvdebug(fieldToString(f337));
|
|
108
|
+
// nvdebug(fieldToString(f337), debugDev);
|
|
105
109
|
return undefined;
|
|
106
110
|
}
|
|
107
111
|
|
|
@@ -122,7 +126,7 @@ export default function () {
|
|
|
122
126
|
}
|
|
123
127
|
|
|
124
128
|
function mapFormOfItemToField337B(formOfItem) {
|
|
125
|
-
nvdebug(`mapping ${formOfItem} to 337$b
|
|
129
|
+
nvdebug(`mapping ${formOfItem} to 337$b`, debugDev);
|
|
126
130
|
|
|
127
131
|
const [result] = mappings337B.filter(row => row.formOfItem === formOfItem);
|
|
128
132
|
if (result) {
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
import createDebugLogger from 'debug';
|
|
2
2
|
import {fieldHasSubfield, fieldToString, getCatalogingLanguage, nvdebug} from './utils.js';
|
|
3
3
|
import {getFormOfItem, map338CodeToTerm} from './field33XUtils.js';
|
|
4
4
|
|
|
5
|
+
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:addMissingField338');
|
|
6
|
+
//const debugData = debug.extend('data');
|
|
7
|
+
const debugDev = debug.extend('dev');
|
|
8
|
+
|
|
5
9
|
// Based mostly on USEMARCON-RDA. However, many things have been rethought, modernized etc.
|
|
6
10
|
const description = 'Add missing 338 field(s)';
|
|
7
11
|
|
|
12
|
+
// eslint-disable-next-line max-lines-per-function
|
|
8
13
|
export default function () {
|
|
9
14
|
|
|
10
15
|
return {
|
|
@@ -12,7 +17,7 @@ export default function () {
|
|
|
12
17
|
};
|
|
13
18
|
|
|
14
19
|
function fix(record) {
|
|
15
|
-
nvdebug(`FIX ${description}
|
|
20
|
+
nvdebug(`FIX ${description}...`, debugDev);
|
|
16
21
|
const newField = getMissing338(record);
|
|
17
22
|
const res = {message: [], fix: [], valid: true};
|
|
18
23
|
|
|
@@ -25,7 +30,7 @@ export default function () {
|
|
|
25
30
|
}
|
|
26
31
|
|
|
27
32
|
function validate(record) {
|
|
28
|
-
nvdebug(`VALIDATE ${description}
|
|
33
|
+
nvdebug(`VALIDATE ${description}...`, debugDev);
|
|
29
34
|
const newField = getMissing338(record);
|
|
30
35
|
if (!newField) {
|
|
31
36
|
return {message: [], valid: true};
|
|
@@ -57,7 +62,7 @@ export default function () {
|
|
|
57
62
|
if (!extent) {
|
|
58
63
|
return undefined;
|
|
59
64
|
}
|
|
60
|
-
nvdebug(`AUDIO EXTENT: '${extent}
|
|
65
|
+
nvdebug(`AUDIO EXTENT: '${extent}`, debugDev);
|
|
61
66
|
if (extent.match(/^(?:audio discs?|[^ ]*ljudskiva|[^ ]*ljudskivor|LP-levy|LP-levyä|LP-skiva|LP-skivor|[^ ]*äänilevy)$/iu)) {
|
|
62
67
|
return 'sd';
|
|
63
68
|
}
|
|
@@ -173,7 +178,7 @@ export default function () {
|
|
|
173
178
|
}
|
|
174
179
|
|
|
175
180
|
function extentToCarrierType(record) {
|
|
176
|
-
nvdebug(`EXTENT2CARRIERTYPE
|
|
181
|
+
nvdebug(`EXTENT2CARRIERTYPE`, debugDev);
|
|
177
182
|
return extentToAudioCarrierType(record) ||
|
|
178
183
|
extentToComputerCarrierType(record) ||
|
|
179
184
|
extentToMicroformCarrierType(record) ||
|
|
@@ -288,7 +293,7 @@ export default function () {
|
|
|
288
293
|
}
|
|
289
294
|
|
|
290
295
|
function audioToField338(record) {
|
|
291
|
-
nvdebug('AUDIO-TO-338');
|
|
296
|
+
nvdebug('AUDIO-TO-338', debugDev);
|
|
292
297
|
const typeOfRecord = record.getTypeOfRecord(record);
|
|
293
298
|
if (typeOfRecord !== 'i' && typeOfRecord !== 'j') {
|
|
294
299
|
return undefined;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/* eslint-disable max-lines */
|
|
2
|
+
|
|
1
3
|
/*
|
|
2
4
|
* cyrillux-usemarcon-replacement.js -- implement and improve https://github.com/NatLibFi/USEMARCON-Cyrillux/tree/master
|
|
3
5
|
*
|
|
@@ -6,6 +8,7 @@
|
|
|
6
8
|
*/
|
|
7
9
|
|
|
8
10
|
import clone from 'clone';
|
|
11
|
+
import createDebugLogger from 'debug';
|
|
9
12
|
import {MarcRecord} from '@natlibfi/marc-record';
|
|
10
13
|
import {default as fix33X} from './fix-33X.js';
|
|
11
14
|
import {default as add041} from './addMissingField041.js';
|
|
@@ -19,11 +22,11 @@ import {default as fixIndicators} from './indicator-fixes.js';
|
|
|
19
22
|
import {default as fixPunctuation} from './punctuation2.js';
|
|
20
23
|
import {default as fixQualifyingInformation} from './normalize-qualifying-information.js';
|
|
21
24
|
import {sortAdjacentSubfields} from './sortSubfields.js';
|
|
22
|
-
|
|
23
|
-
// import createDebugLogger from 'debug';
|
|
24
25
|
import {fieldHasSubfield, nvdebug, recordRemoveValuelessSubfields, recordToString, removeSubfield} from './utils.js';
|
|
25
26
|
|
|
26
|
-
|
|
27
|
+
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/cyrillux-usermarcon-replacement');
|
|
28
|
+
//const debugData = debug.extend('data');
|
|
29
|
+
const debugDev = debug.extend('dev');
|
|
27
30
|
|
|
28
31
|
const description = 'Replacement for Cyrillux usemarcon rules';
|
|
29
32
|
|
|
@@ -32,13 +35,14 @@ const description = 'Replacement for Cyrillux usemarcon rules';
|
|
|
32
35
|
const dropTags = ['001', '003', '010', '012', '014', '015', '016', '017', '019', '025', '029', '032', '035', '036', '037', '038', '042', '044', '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', '751', '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'];
|
|
33
36
|
|
|
34
37
|
|
|
38
|
+
// eslint-disable-next-line max-lines-per-function
|
|
35
39
|
export default function () {
|
|
36
40
|
return {
|
|
37
41
|
description, fix, validate
|
|
38
42
|
};
|
|
39
43
|
|
|
40
44
|
function fix(record) {
|
|
41
|
-
nvdebug(`${description}: fix
|
|
45
|
+
nvdebug(`${description}: fix`, debugDev);
|
|
42
46
|
realFix(record);
|
|
43
47
|
const res = {message: [], fix: [], valid: true};
|
|
44
48
|
return res;
|
|
@@ -156,7 +160,7 @@ export default function () {
|
|
|
156
160
|
|
|
157
161
|
// Validation is currently done in subparts
|
|
158
162
|
function validate(record) {
|
|
159
|
-
nvdebug(`${description}: validate
|
|
163
|
+
nvdebug(`${description}: validate`, debugDev);
|
|
160
164
|
const originalString = recordToString(record);
|
|
161
165
|
const clonedRecord = new MarcRecord(record, {subfieldValues: false});
|
|
162
166
|
realFix(clonedRecord);
|
package/src/cyrillux.js
CHANGED
|
@@ -9,11 +9,17 @@ import {default as sortFields} from './sortFields.js';
|
|
|
9
9
|
import {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers.js';
|
|
10
10
|
import {fieldStripPunctuation} from './punctuation2.js';
|
|
11
11
|
import {getLanguageCode} from './addMissingField041.js';
|
|
12
|
+
import createDebugLogger from 'debug';
|
|
13
|
+
|
|
14
|
+
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/cyrillux');
|
|
15
|
+
//const debugData = debug.extend('data');
|
|
16
|
+
const debugDev = debug.extend('dev');
|
|
12
17
|
|
|
13
18
|
const iso9Trans = 'ISO9 <TRANS>';
|
|
14
19
|
const cyrillicTrans = 'CYRILLIC <TRANS>';
|
|
15
20
|
const sfs4900Trans = 'SFS4900 <TRANS>';
|
|
16
21
|
|
|
22
|
+
// eslint-disable-next-line max-lines-per-function
|
|
17
23
|
export default function (config = {}) {
|
|
18
24
|
// console.log(`CONFIG=${JSON.stringify(config)}`); // eslint-disable-line no-console
|
|
19
25
|
|
|
@@ -135,7 +141,7 @@ export default function (config = {}) {
|
|
|
135
141
|
// Discussion: We should probably also skip others like 05X-08X, 648, 650, 651, and 655, but this needs thinking...
|
|
136
142
|
// Also I'd like to convert do CYRILLIC->ISO-9 in field 300 (and others?) without 880 mappings... (<- not implemented)
|
|
137
143
|
|
|
138
|
-
// nvdebug(`fieldCanBeTransliterated('${fieldToString(field)}') in
|
|
144
|
+
// nvdebug(`fieldCanBeTransliterated('${fieldToString(field)}') in...`, debugDev);
|
|
139
145
|
if (!tagCanBeTransliterated(field.tag)) {
|
|
140
146
|
return false;
|
|
141
147
|
}
|
|
@@ -175,10 +181,10 @@ export default function (config = {}) {
|
|
|
175
181
|
}
|
|
176
182
|
const conversionResult = sfs4900.convertToLatin(subfield.value, inputLang);
|
|
177
183
|
|
|
178
|
-
|
|
184
|
+
nvdebug(`${JSON.stringify(conversionResult)}`, debugDev);
|
|
179
185
|
const result = conversionResult.result;
|
|
180
|
-
|
|
181
|
-
//
|
|
186
|
+
nvdebug(`${JSON.stringify(result)}`, debugDev);
|
|
187
|
+
//nvdebug(`VAL: ${subfield.value} => ${value} using ${lang}`, debugDev);
|
|
182
188
|
return {code: subfield.code, value: result};
|
|
183
189
|
}
|
|
184
190
|
|
|
@@ -256,7 +262,7 @@ export default function (config = {}) {
|
|
|
256
262
|
if (!config.retainCyrillic) {
|
|
257
263
|
return undefined;
|
|
258
264
|
}
|
|
259
|
-
nvdebug(`Derive CYR 880 from ${fieldToString(field)}
|
|
265
|
+
nvdebug(`Derive CYR 880 from ${fieldToString(field)}`, debugDev);
|
|
260
266
|
const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);
|
|
261
267
|
const newSubfield9 = fieldHasSubfield(field, '9', cyrillicTrans) ? [] : [{code: '9', value: cyrillicTrans}];
|
|
262
268
|
const subfields = [
|
|
@@ -266,7 +272,7 @@ export default function (config = {}) {
|
|
|
266
272
|
];
|
|
267
273
|
|
|
268
274
|
const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};
|
|
269
|
-
nvdebug(` New CYR 880 ${fieldToString(newField)}
|
|
275
|
+
nvdebug(` New CYR 880 ${fieldToString(newField)}`, debugDev);
|
|
270
276
|
return newField;
|
|
271
277
|
}
|
|
272
278
|
|
|
@@ -317,8 +323,8 @@ export default function (config = {}) {
|
|
|
317
323
|
|
|
318
324
|
// Paired field: $9 CYRILLIC <TRANS> is the only legal <TRANS>
|
|
319
325
|
const [pairedField] = existingPairedFields;
|
|
320
|
-
nvdebug(`LOOKING FOR SFS4900 PAIR: ${fieldToString(field)}
|
|
321
|
-
nvdebug(` HAVING PAIRED FIELD: ${fieldToString(pairedField)}
|
|
326
|
+
nvdebug(`LOOKING FOR SFS4900 PAIR: ${fieldToString(field)}`, debugDev);
|
|
327
|
+
nvdebug(` HAVING PAIRED FIELD: ${fieldToString(pairedField)}`, debugDev);
|
|
322
328
|
if (!fieldContainsCyrillicCharacters(pairedField)) {
|
|
323
329
|
return false;
|
|
324
330
|
}
|
|
@@ -332,7 +338,7 @@ export default function (config = {}) {
|
|
|
332
338
|
const languageCode = getLanguageCode(record);
|
|
333
339
|
const field2 = fieldToString(createFieldForSfs4900Comparison(mapFieldToSfs4900(pairedField, occurrenceNumberAsString, languageCode), field.tag));
|
|
334
340
|
const field1 = fieldToString(createFieldForSfs4900Comparison(field, field.tag));
|
|
335
|
-
nvdebug(`COMPARE CONTENTS:\n '${field1}' vs\n '${field2}': ${field1 === field2 ? 'OK' : 'FAIL'}
|
|
341
|
+
nvdebug(`COMPARE CONTENTS:\n '${field1}' vs\n '${field2}': ${field1 === field2 ? 'OK' : 'FAIL'}`, debugDev);
|
|
336
342
|
return field1 === field2;
|
|
337
343
|
}
|
|
338
344
|
|
|
@@ -377,17 +383,17 @@ export default function (config = {}) {
|
|
|
377
383
|
return [originalField];
|
|
378
384
|
}
|
|
379
385
|
|
|
380
|
-
// nvdebug(`PROCESSING: ${fieldToString(originalField)}
|
|
386
|
+
// nvdebug(`PROCESSING: ${fieldToString(originalField)}`, debugDev);
|
|
381
387
|
|
|
382
388
|
const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);
|
|
383
389
|
const newOccurrenceNumberAsString = intToOccurrenceNumberString(newOccurrenceNumberAsInt);
|
|
384
390
|
const languageCode = getLanguageCode(record);
|
|
385
391
|
|
|
386
|
-
// nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'
|
|
392
|
+
// nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`, debugDev);
|
|
387
393
|
|
|
388
394
|
const existingPairedFields = fieldGetOccurrenceNumberPairs(originalField, record.get('880'));
|
|
389
395
|
|
|
390
|
-
// nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}
|
|
396
|
+
// nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`, debugDev);
|
|
391
397
|
|
|
392
398
|
const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9
|
|
393
399
|
const newCyrillicField = retainCyrillic(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC
|
|
@@ -9,6 +9,8 @@ import {fieldFixPunctuation} from './punctuation2.js';
|
|
|
9
9
|
//const {default: createNatlibfiSruClient} = natlibfiSruClient;
|
|
10
10
|
|
|
11
11
|
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:disambiguateSeriesStatements');
|
|
12
|
+
//const debugData = debug.extend('data');
|
|
13
|
+
const debugDev = debug.extend('dev');
|
|
12
14
|
|
|
13
15
|
const ELECTRONIC = 1;
|
|
14
16
|
const PRINTED = 2;
|
|
@@ -16,6 +18,7 @@ const NEITHER_OR_UNKNOWN = 0;
|
|
|
16
18
|
const SRU_API_URL = 'https://sru.api.melinda.kansalliskirjasto.fi/bib';
|
|
17
19
|
|
|
18
20
|
// Author(s): Nicholas Volk
|
|
21
|
+
// eslint-disable-next-line max-lines-per-function
|
|
19
22
|
export default function () {
|
|
20
23
|
const sruClient = createSruClient(SRU_API_URL);
|
|
21
24
|
|
|
@@ -79,7 +82,7 @@ export default function () {
|
|
|
79
82
|
}
|
|
80
83
|
|
|
81
84
|
const deletableStrings = deletableXs.map(sf => subfieldToString(sf));
|
|
82
|
-
nvdebug(`Field has removable ISSNS: '${deletableStrings.join(', ')}`,
|
|
85
|
+
nvdebug(`Field has removable ISSNS: '${deletableStrings.join(', ')}`, debugDev);
|
|
83
86
|
|
|
84
87
|
// fixer:
|
|
85
88
|
if (reallyFix) {
|
package/src/drop-terms.js
CHANGED
|
@@ -6,7 +6,8 @@ import {fieldToString, nvdebug} from './utils.js';
|
|
|
6
6
|
import {getLexiconAndLanguage, getTermData, isLabel, isValidSubfield0} from './translate-terms.js';
|
|
7
7
|
|
|
8
8
|
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:drop-terms');
|
|
9
|
-
|
|
9
|
+
//const debugData = debug.extend('data');
|
|
10
|
+
const debugDev = debug.extend('dev');
|
|
10
11
|
|
|
11
12
|
const defaultConfig = {
|
|
12
13
|
'constraints': [
|
|
@@ -25,6 +26,7 @@ const defaultConfig = {
|
|
|
25
26
|
'remove 0-less': true
|
|
26
27
|
};
|
|
27
28
|
|
|
29
|
+
// eslint-disable-next-line max-lines-per-function
|
|
28
30
|
export default function (config = defaultConfig) {
|
|
29
31
|
|
|
30
32
|
return {
|
|
@@ -112,7 +114,7 @@ export default function (config = defaultConfig) {
|
|
|
112
114
|
}
|
|
113
115
|
|
|
114
116
|
async function isRemovableField(field) {
|
|
115
|
-
// nvdebug(`FOO===== ${fieldToString(field)}
|
|
117
|
+
// nvdebug(`FOO===== ${fieldToString(field)}`, debugDev);
|
|
116
118
|
|
|
117
119
|
|
|
118
120
|
// $0-less field:
|
|
@@ -132,15 +134,15 @@ export default function (config = defaultConfig) {
|
|
|
132
134
|
|
|
133
135
|
// $a is the pref label. All is fine!
|
|
134
136
|
if (isLabel(data.prefLabel, subfieldA.value, lexData.lang)) {
|
|
135
|
-
|
|
137
|
+
nvdebug(`altLabel found: ${subfieldA.value}`, debugDev);
|
|
136
138
|
return false;
|
|
137
139
|
}
|
|
138
140
|
if (isLabel(data.altLabel, subfieldA.value, lexData.lang)) {
|
|
139
|
-
|
|
141
|
+
nvdebug(`altLabel found: ${subfieldA.value}`, debugDev);
|
|
140
142
|
// Oddly enough this could remove altLabel but keep totally invalid labels...
|
|
141
143
|
return config['remove altLabel'];
|
|
142
144
|
}
|
|
143
|
-
|
|
145
|
+
nvdebug(`a-2-0 mismatch: ${fieldToString(field)}`, debugDev);
|
|
144
146
|
}
|
|
145
147
|
}
|
|
146
148
|
|
|
@@ -148,7 +150,7 @@ export default function (config = defaultConfig) {
|
|
|
148
150
|
if (config['keep invalid label']) {
|
|
149
151
|
// We keep the label $a. However, we can get rid of $0 if we want to (semantic reasons)
|
|
150
152
|
if (!config['keep invalid url']) {
|
|
151
|
-
nvdebug(`=============== 0-removal
|
|
153
|
+
nvdebug(`=============== 0-removal`, debugDev);
|
|
152
154
|
field.subfields = field.subfields.filter(sf => sf.code !== '0');
|
|
153
155
|
}
|
|
154
156
|
return false;
|
package/src/fix-33X.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
import createDebugLogger from 'debug';
|
|
2
2
|
import clone from 'clone';
|
|
3
3
|
import {fieldToString, getCatalogingLanguage, nvdebug} from './utils.js';
|
|
4
4
|
import {map336CodeToTerm, map337CodeToTerm, map338CodeToTerm} from './field33XUtils.js';
|
|
5
5
|
|
|
6
|
-
const
|
|
6
|
+
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fix-33X');
|
|
7
|
+
//const debugData = debug.extend('data');
|
|
8
|
+
const debugDev = debug.extend('dev');
|
|
7
9
|
|
|
10
|
+
const description = 'Fix non-RDA 33X field(s)';
|
|
8
11
|
|
|
9
12
|
const map336 = {
|
|
10
13
|
'Bild (kartografisk ; att vidra)': 'crt',
|
|
@@ -366,6 +369,7 @@ const map338 = {
|
|
|
366
369
|
|
|
367
370
|
// const multimediaRegexp = /multimedia/ui;
|
|
368
371
|
|
|
372
|
+
// eslint-disable-next-line max-lines-per-function
|
|
369
373
|
export default function () {
|
|
370
374
|
|
|
371
375
|
return {
|
|
@@ -373,11 +377,11 @@ export default function () {
|
|
|
373
377
|
};
|
|
374
378
|
|
|
375
379
|
function fix(record) {
|
|
376
|
-
nvdebug(`FIX ${description}
|
|
380
|
+
nvdebug(`FIX ${description}...`, debugDev);
|
|
377
381
|
const catLang = getCatalogingLanguage(record) || 'fin';
|
|
378
382
|
const fields = getRelevantFields(record);
|
|
379
383
|
fields.forEach(f => fixField(f, catLang));
|
|
380
|
-
nvdebug(` GOT ${fields.length}
|
|
384
|
+
nvdebug(` GOT ${fields.length}...`, debugDev);
|
|
381
385
|
// FFS: we actually need newFields array here! Videogame, for example, might be
|
|
382
386
|
// 336 ## ‡a kaksiulotteinen liikkuva kuva ‡b tdi ‡2 rdacontent
|
|
383
387
|
// 336 ## ‡a tietokoneohjelma ‡b cop ‡2 rdacontent
|
|
@@ -387,7 +391,7 @@ export default function () {
|
|
|
387
391
|
}
|
|
388
392
|
|
|
389
393
|
function validate(record) {
|
|
390
|
-
nvdebug(`VALIDATE ${description}
|
|
394
|
+
nvdebug(`VALIDATE ${description}...`, debugDev); // NOT READY YET
|
|
391
395
|
const catLang = getCatalogingLanguage(record) || 'fin';
|
|
392
396
|
const fields = getRelevantFields(record);
|
|
393
397
|
if (fields.length === 0) {
|
|
@@ -414,7 +418,7 @@ export default function () {
|
|
|
414
418
|
|
|
415
419
|
|
|
416
420
|
function mapTermToCode(term, tag) {
|
|
417
|
-
nvdebug(`TERM/${tag}: '${term}'
|
|
421
|
+
nvdebug(`TERM/${tag}: '${term}'`, debugDev);
|
|
418
422
|
if (tag === '336' && term in map336) {
|
|
419
423
|
return map336[term];
|
|
420
424
|
}
|
package/src/fix-country-codes.js
CHANGED
|
@@ -4,8 +4,12 @@
|
|
|
4
4
|
//
|
|
5
5
|
// Author(s): Nicholas Volk
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
import createDebugLogger from 'debug';
|
|
8
|
+
import {nvdebug} from './utils.js';
|
|
9
|
+
|
|
10
|
+
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fix-country-codes');
|
|
11
|
+
//const debugData = debug.extend('data');
|
|
12
|
+
const debugDev = debug.extend('dev');
|
|
9
13
|
|
|
10
14
|
|
|
11
15
|
export default function () {
|
|
@@ -16,7 +20,7 @@ export default function () {
|
|
|
16
20
|
};
|
|
17
21
|
|
|
18
22
|
function fix(record) {
|
|
19
|
-
|
|
23
|
+
nvdebug(`FIX ME:`, debugDev);
|
|
20
24
|
const res = {message: [], fix: [], valid: true};
|
|
21
25
|
|
|
22
26
|
const [field008] = record.get('008');
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import clone from 'clone';
|
|
2
|
-
import {fieldToString} from './utils.js';
|
|
2
|
+
import {fieldToString, nvdebug} from './utils.js';
|
|
3
|
+
import createDebugLogger from 'debug';
|
|
4
|
+
|
|
3
5
|
// Fix language codes in 008/35-37 and 041 (does not sync them)
|
|
4
6
|
//
|
|
5
7
|
// Author(s): Nicholas Volk
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
//
|
|
9
|
+
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fix-language-codes');
|
|
10
|
+
//const debugData = debug.extend('data');
|
|
11
|
+
const debugDev = debug.extend('dev');
|
|
9
12
|
|
|
10
13
|
const description = 'Fix language codes';
|
|
11
14
|
|
|
15
|
+
// eslint-disable-next-line max-lines-per-function
|
|
12
16
|
export default function () {
|
|
13
17
|
|
|
14
18
|
return {description, validate, fix};
|
|
15
19
|
|
|
16
20
|
function fix(record) {
|
|
17
|
-
|
|
21
|
+
nvdebug(`FIX ME`, debugDev);
|
|
18
22
|
const res = {message: [], fix: [], valid: true};
|
|
19
23
|
|
|
20
24
|
const [field008] = record.get('008');
|
package/src/fix-sami-041.js
CHANGED
|
@@ -3,12 +3,14 @@
|
|
|
3
3
|
import createDebugLogger from 'debug';
|
|
4
4
|
import clone from 'clone';
|
|
5
5
|
|
|
6
|
-
import {fieldToString} from './utils.js';
|
|
6
|
+
import {fieldToString, nvdebug} from './utils.js';
|
|
7
7
|
|
|
8
8
|
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fix-sami-041');
|
|
9
|
+
//const debugData = debug.extend('data');
|
|
10
|
+
const debugDev = debug.extend('dev');
|
|
9
11
|
|
|
10
12
|
|
|
11
|
-
|
|
13
|
+
// eslint-disable-next-line max-lines-per-function
|
|
12
14
|
export default function () {
|
|
13
15
|
/* 'sma': eteläsaame, 'sme': pohjoissaame, 'smj': luulajansaame, 'smn': inarinsaame, 'sms': koltansaame */
|
|
14
16
|
const samiLanguages = ['sma', 'sme', 'smj', 'smn', 'sms'];
|
|
@@ -21,7 +23,7 @@ export default function () {
|
|
|
21
23
|
|
|
22
24
|
function getRelevantSubfieldCodes(record) { // Maybe this should be an exportable utility function...
|
|
23
25
|
if (record && record.leader && record.leader[6]) {
|
|
24
|
-
|
|
26
|
+
nvdebug(` LDR/06 is '${record.leader[6]}'`, debugDev);
|
|
25
27
|
// We should test this properly...
|
|
26
28
|
if (['i', 'j'].includes(record.leader[6])) { // Check type of record: sound recordings use 'd'
|
|
27
29
|
return ['d'];
|
|
@@ -34,13 +36,13 @@ export default function () {
|
|
|
34
36
|
|
|
35
37
|
|
|
36
38
|
function fix(record, validateMode = false) {
|
|
37
|
-
|
|
39
|
+
nvdebug(`Start ${validateMode ? 'validator' : 'fixer'}`, debugDev);
|
|
38
40
|
const relevantSubfieldCodes = getRelevantSubfieldCodes(record);
|
|
39
|
-
|
|
41
|
+
nvdebug(` Relevant subfield codes are '${relevantSubfieldCodes.join("', '")}'`, debugDev);
|
|
40
42
|
const relevantFields = record.fields.filter(f => isRelevantField(f, relevantSubfieldCodes)).map(f => validateMode ? clone(f) : f); // NV! relevant fields are cloned in validation mode!
|
|
41
43
|
// Nothing to do:
|
|
42
44
|
if (relevantFields.length === 0) {
|
|
43
|
-
|
|
45
|
+
nvdebug(` No relevant f041 fields found`, debugDev);
|
|
44
46
|
if (validateMode) {
|
|
45
47
|
return {message: [], valid: true};
|
|
46
48
|
}
|
|
@@ -63,22 +65,22 @@ export default function () {
|
|
|
63
65
|
const [f008] = record.get('008').map(f => validateMode ? clone(f) : f);
|
|
64
66
|
|
|
65
67
|
if (!f008) {
|
|
66
|
-
|
|
68
|
+
nvdebug(' WARNING: no f008 found'), debugDev;
|
|
67
69
|
return [];
|
|
68
70
|
}
|
|
69
71
|
const currLang = f008.value.substr(35, 3);
|
|
70
72
|
if (!samiLanguages.includes(currLang)) { // NB! If original 008/35-37 was not a sami language, we don't change anything!
|
|
71
|
-
|
|
73
|
+
nvdebug(` Existing 008/35-37 '${currLang}' is not a sami language. No need to update 008/35-37`, debugDev);
|
|
72
74
|
return [];
|
|
73
75
|
}
|
|
74
76
|
const origValue = f008.value;
|
|
75
77
|
const firstRelevantSubfield = relevantFields[0].subfields.find(sf => relevantSubfieldCodes.includes(sf.code));
|
|
76
78
|
if (firstRelevantSubfield.value !== 'smi') {
|
|
77
|
-
|
|
79
|
+
nvdebug(` First relevant subfield is '\$${firstRelevantSubfield.code} ${firstRelevantSubfield.value}'. No need to update 008/35-37`, debugDev);
|
|
78
80
|
return [];
|
|
79
81
|
}
|
|
80
82
|
f008.value = `${f008.value.substr(0, 35)}smi${f008.value.substr(38)}`;
|
|
81
|
-
|
|
83
|
+
nvdebug(` Update 008/35-37: '${currLang}' => 'smi'`, debugDev);
|
|
82
84
|
return createReport([origValue], [f008.value]);
|
|
83
85
|
}
|
|
84
86
|
|
|
@@ -99,7 +101,7 @@ export default function () {
|
|
|
99
101
|
code: currSubfield.code,
|
|
100
102
|
value: 'smi'
|
|
101
103
|
};
|
|
102
|
-
|
|
104
|
+
nvdebug(` f041: Add '\$${currSubfield.code} smi' before '${currSubfield.value}'`, debugDev);
|
|
103
105
|
|
|
104
106
|
return processSubfields(otherSubfields, [...outgoingSubfields, smiSubfield, currSubfield]);
|
|
105
107
|
}
|
package/src/indicator-fixes.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
// Relocated from melinda-marc-record-merge-reducers (and renamed)
|
|
2
|
-
//import createDebugLogger from 'debug';
|
|
3
|
-
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:normalizeIdentifiers');
|
|
4
2
|
|
|
5
|
-
import
|
|
3
|
+
import createDebugLogger from 'debug';
|
|
4
|
+
import {fieldToString, nvdebug} from './utils.js';
|
|
6
5
|
|
|
7
6
|
|
|
7
|
+
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:indicator-fixes');
|
|
8
|
+
const debugData = debug.extend('data');
|
|
9
|
+
//const debugDev = debug.extend('dev');
|
|
10
|
+
|
|
8
11
|
export default function () {
|
|
9
12
|
|
|
10
13
|
return {
|
|
@@ -31,7 +34,7 @@ export default function () {
|
|
|
31
34
|
|
|
32
35
|
|
|
33
36
|
function validateRecord(record, res) {
|
|
34
|
-
|
|
37
|
+
nvdebug(record, debugData);
|
|
35
38
|
const clonedFields = JSON.parse(JSON.stringify(record.fields));
|
|
36
39
|
recordNormalizeIndicators(record);
|
|
37
40
|
|
|
@@ -41,11 +44,11 @@ export default function () {
|
|
|
41
44
|
const origFieldAsString = fieldToString(clonedFields[index]);
|
|
42
45
|
//const clonedFieldAsString = fieldToString(field);
|
|
43
46
|
if (clonedFields[index].ind1 !== field.ind1) {
|
|
44
|
-
//nvdebug(`FIX IND1: '${clonedFields[index].ind1}' => '${field.ind1}': ${clonedFieldAsString}
|
|
47
|
+
//nvdebug(`FIX IND1: '${clonedFields[index].ind1}' => '${field.ind1}': ${clonedFieldAsString}`, debugDev);
|
|
45
48
|
res.message.push(`Expected IND1 for '${origFieldAsString}' is '${field.ind1}'`);
|
|
46
49
|
}
|
|
47
50
|
if (clonedFields[index].ind2 !== field.ind2) {
|
|
48
|
-
//nvdebug(`FIX IND2: '${clonedFields[index].ind2}' => '${field.ind2}': ${clonedFieldAsString}
|
|
51
|
+
//nvdebug(`FIX IND2: '${clonedFields[index].ind2}' => '${field.ind2}': ${clonedFieldAsString}`, debugDev);
|
|
49
52
|
res.message.push(`Expected IND2 for '${origFieldAsString}' is '${field.ind2}'`);
|
|
50
53
|
}
|
|
51
54
|
}
|
|
@@ -79,7 +82,7 @@ function valueBeginsWithDeterminer(value, cands) {
|
|
|
79
82
|
function determineNonFilingIndicatorValue(field, languages = undefined) {
|
|
80
83
|
const subfieldA = field.subfields.find(sf => sf.code === 'a');
|
|
81
84
|
if (!subfieldA) {
|
|
82
|
-
// nvdebug(' Subfield $a miss!');
|
|
85
|
+
// nvdebug(' Subfield $a miss!', debugDev);
|
|
83
86
|
return;
|
|
84
87
|
}
|
|
85
88
|
|