@natlibfi/marc-record-validators-melinda 11.6.6 → 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 +5 -6
- 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 +6 -6
- 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
|
@@ -51,11 +51,11 @@ function _default() {
|
|
|
51
51
|
};
|
|
52
52
|
|
|
53
53
|
/*
|
|
54
|
-
if (orphanedFields.length > 0) {
|
|
55
|
-
res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`];
|
|
54
|
+
if (orphanedFields.length > 0) {
|
|
55
|
+
res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`];
|
|
56
56
|
}
|
|
57
57
|
*/
|
|
58
|
-
res.valid = res.message.length < 1;
|
|
58
|
+
res.valid = res.message.length < 1;
|
|
59
59
|
return res;
|
|
60
60
|
}
|
|
61
61
|
}
|
|
@@ -69,7 +69,7 @@ function numberOfLinkageSubfields(field) {
|
|
|
69
69
|
*/
|
|
70
70
|
|
|
71
71
|
function removeLinkNotes(record) {
|
|
72
|
-
record.fields.forEach(f => delete f.linkNote); // eslint-disable-line
|
|
72
|
+
record.fields.forEach(f => delete f.linkNote); // eslint-disable-line array-callback-return
|
|
73
73
|
}
|
|
74
74
|
function newGetAllLinkedFields(field, record, useSixes = true, useEights = true) {
|
|
75
75
|
removeLinkNotes(record); // should be clear, but let's play safe
|
|
@@ -113,19 +113,18 @@ function recordRemoveFieldOrSubfield8(record, field, currLinkingNumber) {
|
|
|
113
113
|
return;
|
|
114
114
|
}
|
|
115
115
|
const subfields = field.subfields.filter(sf => (0, _subfield8Utils.getSubfield8LinkingNumber)(sf) === currLinkingNumber);
|
|
116
|
-
subfields.forEach(sf => record.removeSubfield(sf, field));
|
|
116
|
+
subfields.forEach(sf => record.removeSubfield(sf, field)); // eslint-disable-line array-callback-return
|
|
117
117
|
}
|
|
118
118
|
function newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix) {
|
|
119
119
|
const eights = field.subfields.filter(sf => sf.code === '8');
|
|
120
120
|
if (eights.length < 2) {
|
|
121
|
-
field.deleted = 1;
|
|
121
|
+
field.deleted = 1;
|
|
122
122
|
return;
|
|
123
123
|
}
|
|
124
124
|
const subfields = field.subfields.filter(sf => (0, _subfield8Utils.getSubfield8LinkingNumber)(sf) === currLinkingNumber);
|
|
125
125
|
subfields.forEach(sf => {
|
|
126
|
-
field.modified = 1;
|
|
126
|
+
field.modified = 1;
|
|
127
127
|
if (fix) {
|
|
128
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
129
128
|
record.removeSubfield(sf, field);
|
|
130
129
|
}
|
|
131
130
|
});
|
|
@@ -217,7 +216,8 @@ function markIdenticalSubfield6Chains(chain, record) {
|
|
|
217
216
|
const normalizeTag = chain.some(field => field.tag.substring(0, 1) === '1'); // 1XX can delete 7XX as well!
|
|
218
217
|
const chainAsString = (0, _subfield6Utils.fieldsToNormalizedString)(chain, 0, normalizeOccurrenceNumber, normalizeTag);
|
|
219
218
|
(0, _utils.nvdebug)(`markIdenticalSubfield6Chains: ${chainAsString}`);
|
|
220
|
-
record.fields.forEach(f => compareWithChain(f));
|
|
219
|
+
record.fields.forEach(f => compareWithChain(f)); // eslint-disable-line array-callback-return
|
|
220
|
+
|
|
221
221
|
function compareWithChain(f) {
|
|
222
222
|
(0, _utils.nvdebug)(`FIELD2CHAIN ${(0, _utils.fieldToString)(f)}`);
|
|
223
223
|
const otherChain = fieldToChain(f, record);
|
|
@@ -231,7 +231,7 @@ function markIdenticalSubfield6Chains(chain, record) {
|
|
|
231
231
|
if (chainAsString === otherChainAsString) {
|
|
232
232
|
otherChain.forEach(f => {
|
|
233
233
|
(0, _utils.nvdebug)(` mark ${(0, _utils.fieldToString)(f)} as deleted ($6-chain)...`);
|
|
234
|
-
f.deleted = 1;
|
|
234
|
+
f.deleted = 1;
|
|
235
235
|
});
|
|
236
236
|
return;
|
|
237
237
|
}
|
|
@@ -249,7 +249,7 @@ function markIdenticalLoneFieldsAsDeletable(field, record) {
|
|
|
249
249
|
// Mark fields as deleted:
|
|
250
250
|
identicalLoneFields.forEach(f => {
|
|
251
251
|
(0, _utils.nvdebug)(` mark ${(0, _utils.fieldToString)(f)} as deleted (lone field)...`);
|
|
252
|
-
f.deleted = 1;
|
|
252
|
+
f.deleted = 1;
|
|
253
253
|
});
|
|
254
254
|
}
|
|
255
255
|
function acceptFieldsWithSubfield6(fieldsWithSubfield6) {
|
|
@@ -294,11 +294,9 @@ function acceptFieldsWithSubfield8(fieldsWithSubfield8, requireSingleTag = false
|
|
|
294
294
|
}
|
|
295
295
|
}
|
|
296
296
|
function sameField(field1, field2) {
|
|
297
|
-
/* eslint-disable */
|
|
298
297
|
field1.tmpMyId = 666;
|
|
299
298
|
const result = field2.tmpMyId === 666 ? true : false;
|
|
300
299
|
delete field1.tmpMyId;
|
|
301
|
-
/* eslint-enable */
|
|
302
300
|
return result;
|
|
303
301
|
}
|
|
304
302
|
function isChainHead(field, chain) {
|
|
@@ -378,21 +376,21 @@ function removeDuplicateDatafields(record, fix = true) {
|
|
|
378
376
|
// Sometimes only $8 subfield (vs the whole field) is removed. Thus they are handled separately:
|
|
379
377
|
handleDuplicateSubfield8Chains(record, fix);
|
|
380
378
|
const dataFields = record.fields.filter(f => f.subfields !== undefined);
|
|
381
|
-
dataFields.forEach(f => fieldHandleDuplicateDatafields(f, record));
|
|
379
|
+
dataFields.forEach(f => fieldHandleDuplicateDatafields(f, record)); // eslint-disable-line array-callback-return
|
|
380
|
+
|
|
382
381
|
const deletableFields = dataFields.filter(f => f.deleted);
|
|
383
382
|
const modifiedFields = dataFields.filter(f => f.modified && !f.deleted);
|
|
384
383
|
const result = deletableFields.map(f => `DEL: ${(0, _utils.fieldToString)(f)}`);
|
|
385
384
|
if (modifiedFields.length) {
|
|
386
|
-
// eslint-disable-line
|
|
387
|
-
modifiedFields.
|
|
388
|
-
result.push(modifiedFields.map(f => `MOD: ${(0, _utils.fieldToString)(f)}`)); // eslint-disable-line functional/immutable-data
|
|
385
|
+
modifiedFields.forEach(f => delete f.modified); // eslint-disable-line array-callback-return
|
|
386
|
+
result.push(modifiedFields.map(f => `MOD: ${(0, _utils.fieldToString)(f)}`));
|
|
389
387
|
}
|
|
390
388
|
if (fix) {
|
|
391
|
-
deletableFields.forEach(f => record.removeField(f));
|
|
389
|
+
deletableFields.forEach(f => record.removeField(f)); // eslint-disable-line array-callback-return
|
|
392
390
|
return result;
|
|
393
391
|
}
|
|
394
|
-
deletableFields.forEach(f => delete f.deleted); // eslint-disable-line
|
|
395
|
-
deletableFields.forEach(f => delete f.modified); // eslint-disable-line
|
|
392
|
+
deletableFields.forEach(f => delete f.deleted); // eslint-disable-line array-callback-return
|
|
393
|
+
deletableFields.forEach(f => delete f.modified); // eslint-disable-line array-callback-return
|
|
396
394
|
|
|
397
395
|
return result;
|
|
398
396
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"removeDuplicateDataFields.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","_subfield8Utils","e","__esModule","default","LINK_ROOT","LINKED_AND_PROCESSED","LINKED_NOT_PROCESSED","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeDuplicateDatafields","duplicates","length","removeLinkNotes","fields","forEach","f","linkNote","newGetAllLinkedFields","field","useSixes","useEights","currField","undefined","related6s","get6s","linkField","related8s","add8s","find","linkedFields","filter","recordRemoveFieldOrSubfield8","currLinkingNumber","eights","subfields","sf","code","removeField","getSubfield8LinkingNumber","removeSubfield","newRecordRemoveFieldOrSubfield8","deleted","modified","removeDuplicateSubfield8Chains","seen","removables","seenLinkingNumbers","recordGetAllSubfield8LinkingNumbers","join","recordGetFieldsWithSubfield8LinkingNumber","normalizeOccurrenceNumber","linkedFieldsAsString","fieldsToNormalizedString","includes","push","fieldsToString","handleDuplicateSubfield8Chains","markIdenticalSubfield6Chains","chain","normalizeTag","some","tag","substring","chainAsString","compareWithChain","fieldToString","otherChain","fieldToChain","sameField","otherChainAsString","markIdenticalLoneFieldsAsDeletable","fieldAsString","fieldToNormalizedString","identicalLoneFields","acceptFieldsWithSubfield6","fieldsWithSubfield6","non880","occurrenceNumbers","fieldsGetOccurrenceNumbers","isSingleTagLinkingNumber","linkingNumber","relevantFields","fieldHasLinkingNumber","acceptFieldsWithSubfield8","fieldsWithSubfield8","requireSingleTag","linkingNumbers","fieldsGetAllSubfield8LinkingNumbers","anomaly8","f880","field1","field2","tmpMyId","result","isChainHead","fieldHasValidSubfield6","fieldHasValidSubfield8","fieldHandleDuplicateDatafields","dataFields","deletableFields","modifiedFields","map"],"sources":["../src/removeDuplicateDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldsToString, fieldToString, nvdebug} from './utils';\nimport {fieldHasValidSubfield6, fieldsGetOccurrenceNumbers, fieldsToNormalizedString, fieldToNormalizedString, get6s} from './subfield6Utils';\nimport {add8s, fieldHasLinkingNumber, fieldHasValidSubfield8, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, recordGetAllSubfield8LinkingNumbers, recordGetFieldsWithSubfield8LinkingNumber} from './subfield8Utils';\n\nconst LINK_ROOT = 4;\nconst LINKED_AND_PROCESSED = 2;\nconst LINKED_NOT_PROCESSED = 1;\n\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeDuplicateDataFields');\n\nexport default function () {\n return {\n description: 'Remove duplicate data fields. Certain exceptions apply, mainly too complited chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Remove duplicate data fields');\n const res = {message: [], fix: [], valid: true};\n removeDuplicateDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: duplicate data fields cause (t)error', debug);\n\n const duplicates = removeDuplicateDatafields(record, false);\n\n //const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n const res = {message: duplicates};\n\n /*\n if (orphanedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`]; // eslint-disable-line functional/immutable-data\n }\n */\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\n/*\nfunction numberOfLinkageSubfields(field) {\n nvdebug(`N of Linkage Subs(${fieldToString(field)})`);\n const subfields = field.subfields.filter(sf => sf.code === '6' || sf.code === '8');\n return subfields.length;\n}\n*/\n\nfunction removeLinkNotes(record) {\n record.fields.forEach(f => delete f.linkNote); // eslint-disable-line functional/immutable-data\n}\n\n\nfunction newGetAllLinkedFields(field, record, useSixes = true, useEights = true) {\n removeLinkNotes(record); // should be clear, but let's play safe\n\n /* eslint-disable */\n field.linkNote = LINK_ROOT;\n\n let currField = field;\n\n // Loop until all linked fields have been processed:\n while (currField !== undefined) {\n if (useSixes) {\n const related6s = get6s(currField, record.fields)\n related6s.forEach(f => linkField(f));\n }\n if (useEights) {\n const related8s = add8s([currField], record);\n related8s.forEach(f => linkField(f));\n }\n if (currField.linkNote !== LINK_ROOT) {\n currField.linkNote = LINKED_AND_PROCESSED;\n }\n currField = record.fields.find(f => f.linkNote === LINKED_NOT_PROCESSED);\n }\n\n // Collect relevant fields:\n const linkedFields = record.fields.filter(f => f.linkNote);\n\n removeLinkNotes(record);\n\n return linkedFields;\n\n function linkField(f) {\n if (!f.linkNote) {\n f.linkNote = LINKED_NOT_PROCESSED;\n }\n }\n\n\n /* eslint-enable */\n}\n\n\nfunction recordRemoveFieldOrSubfield8(record, field, currLinkingNumber) {\n const eights = field.subfields.filter(sf => sf.code === '8');\n if (eights.length < 2) {\n record.removeField(field);\n return;\n }\n const subfields = field.subfields.filter(sf => getSubfield8LinkingNumber(sf) === currLinkingNumber);\n subfields.forEach(sf => record.removeSubfield(sf, field));\n}\n\nfunction newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix) {\n const eights = field.subfields.filter(sf => sf.code === '8');\n if (eights.length < 2) {\n field.deleted = 1; // eslint-disable-line functional/immutable-data\n return;\n }\n const subfields = field.subfields.filter(sf => getSubfield8LinkingNumber(sf) === currLinkingNumber);\n subfields.forEach(sf => {\n field.modified = 1; // eslint-disable-line functional/immutable-data\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n record.removeSubfield(sf, field);\n }\n });\n}\n\n\nexport function removeDuplicateSubfield8Chains(record, fix = true) {\n\n // Seen $8 subsfields in various fields:\n // 161 700\n // 17 710\n // 11 110\n // 8 730\n // 1 100\n // Given these stats, there's no need to check for 1XX-vs-7XX removals\n\n /* eslint-disable */\n let seen = {};\n\n let removables = []; // for validation\n\n nvdebug(\"CHAIN-8\");\n const seenLinkingNumbers = recordGetAllSubfield8LinkingNumbers(record);\n if (seenLinkingNumbers.length === 0) {\n return removables;\n }\n\n nvdebug(`seen linking numbers ($8): ${seenLinkingNumbers.join(', ')}`, debug);\n\n seenLinkingNumbers.forEach(currLinkingNumber => {\n const linkedFields = recordGetFieldsWithSubfield8LinkingNumber(record, currLinkingNumber) //getFieldsWithSubfield8Index(base, baseIndex);\n // As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true\n const normalizeOccurrenceNumber = true;\n const linkedFieldsAsString = fieldsToNormalizedString(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);\n nvdebug(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);\n nvdebug(`${linkedFieldsAsString}`, debug);\n\n if (linkedFieldsAsString in seen) {\n if (!removables.includes(linkedFieldsAsString)) {\n removables.push(linkedFieldsAsString);\n }\n\n if (fix) {\n nvdebug(`$8 CHAIN FIX: REMOVE $8 GROUP: ${fieldsToString(linkedFields)}`, debug);\n linkedFields.forEach(field => recordRemoveFieldOrSubfield8(record, field, currLinkingNumber));\n return;\n }\n\n nvdebug(`$8 VALIDATION: DUPLICATE DETECTED ${linkedFieldsAsString}`, debug);\n return;\n }\n nvdebug(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);\n seen[linkedFieldsAsString] = 1;\n return;\n });\n\n /* eslint-enable */\n return removables;\n}\n\n\nexport function handleDuplicateSubfield8Chains(record, fix) {\n\n // Seen $8 subsfields in various fields:\n // 161 700\n // 17 710\n // 11 110\n // 8 730\n // 1 100\n // Given these stats, there's no need to check for 1XX-vs-7XX removals\n\n /* eslint-disable */\n let seen = {};\n\n nvdebug(\"CHAIN-8\");\n const seenLinkingNumbers = recordGetAllSubfield8LinkingNumbers(record);\n if (seenLinkingNumbers.length === 0) {\n return;\n }\n\n nvdebug(`seen linking numbers ($8): ${seenLinkingNumbers.join(', ')}`, debug);\n\n seenLinkingNumbers.forEach(currLinkingNumber => {\n const linkedFields = recordGetFieldsWithSubfield8LinkingNumber(record, currLinkingNumber) //getFieldsWithSubfield8Index(base, baseIndex);\n // As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true\n const normalizeOccurrenceNumber = false; //true;\n const linkedFieldsAsString = fieldsToNormalizedString(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);\n nvdebug(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);\n nvdebug(`${linkedFieldsAsString}`, debug);\n\n if (linkedFieldsAsString in seen) {\n nvdebug(`$8 CHAIN FIX: REMOVE $8 GROUP: ${fieldsToString(linkedFields)}`, debug);\n linkedFields.forEach(field => newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix));\n return;\n }\n nvdebug(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);\n seen[linkedFieldsAsString] = 1;\n return;\n });\n\n /* eslint-enable */\n\n}\n\nfunction markIdenticalSubfield6Chains(chain, record) {\n const normalizeOccurrenceNumber = true;\n const normalizeTag = chain.some(field => field.tag.substring(0, 1) === '1'); // 1XX can delete 7XX as well!\n const chainAsString = fieldsToNormalizedString(chain, 0, normalizeOccurrenceNumber, normalizeTag);\n\n nvdebug(`markIdenticalSubfield6Chains: ${chainAsString}`);\n record.fields.forEach(f => compareWithChain(f));\n\n\n function compareWithChain(f) {\n nvdebug(`FIELD2CHAIN ${fieldToString(f)}`);\n const otherChain = fieldToChain(f, record);\n // Not a lone field or chain (head) or ... or is-same-chain\n if (otherChain.length === 0 || sameField(chain[0], otherChain[0])) {\n return;\n }\n const otherChainAsString = fieldsToNormalizedString(otherChain, 0, normalizeOccurrenceNumber, normalizeTag);\n\n // Mark other chain as deleted:\n if (chainAsString === otherChainAsString) {\n otherChain.forEach(f => {\n nvdebug(` mark ${fieldToString(f)} as deleted ($6-chain)...`);\n f.deleted = 1; // eslint-disable-line functional/immutable-data\n });\n return;\n }\n }\n\n}\n\nfunction markIdenticalLoneFieldsAsDeletable(field, record) {\n if (field.deleted) {\n return;\n }\n // targetLinkingNumber = 0, normalizedOccurenceNumber = false, normalizeTag = true)\n const normalizeTag = field.tag.substring(0, 1) === '1'; // 1XX can delete 7XX as well!\n const fieldAsString = fieldToNormalizedString(field, 0, false, normalizeTag);\n\n const identicalLoneFields = record.fields.filter(f => !sameField(f, field) && fieldToNormalizedString(f, 0, false, normalizeTag) === fieldAsString);\n\n // Mark fields as deleted:\n identicalLoneFields.forEach(f => {\n nvdebug(` mark ${fieldToString(f)} as deleted (lone field)...`);\n f.deleted = 1; // eslint-disable-line functional/immutable-data\n });\n\n}\n\nfunction acceptFieldsWithSubfield6(fieldsWithSubfield6) {\n // There can be only one non-880 field:\n const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');\n if (non880.length > 1) {\n return false;\n }\n\n const occurrenceNumbers = fieldsGetOccurrenceNumbers(fieldsWithSubfield6);\n // Chain can contain only single occurrence number:\n if (occurrenceNumbers.length > 1) {\n return false;\n }\n\n return true;\n}\n\n\nfunction isSingleTagLinkingNumber(linkingNumber, fields, tag) {\n const relevantFields = fields.filter(f => fieldHasLinkingNumber(f, linkingNumber));\n if (relevantFields.some(f => f.tag !== tag)) {\n return false;\n }\n return true;\n}\n\nfunction acceptFieldsWithSubfield8(fieldsWithSubfield8, requireSingleTag = false) {\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fieldsWithSubfield8);\n if (linkingNumbers.some(linkingNumber => anomaly8(linkingNumber))) {\n return false;\n }\n return true;\n\n // If linking number\n function anomaly8(linkingNumber) {\n nvdebug(` Looking for anomalies in linkin number ${linkingNumber}`);\n const relevantFields = fieldsWithSubfield8.filter(f => fieldHasLinkingNumber(f, linkingNumber));\n if (requireSingleTag) {\n return !isSingleTagLinkingNumber(linkingNumber, relevantFields, relevantFields[0].tag);\n }\n\n const f880 = relevantFields.filter(f => f.tag === '880');\n if (f880.length === 0 || f880.length === relevantFields.length) {\n return false;\n }\n return true;\n }\n}\n\n\nexport function sameField(field1, field2) {\n /* eslint-disable */\n field1.tmpMyId = 666;\n const result = field2.tmpMyId === 666 ? true : false;\n delete field1.tmpMyId;\n /* eslint-enable */\n return result;\n}\n\nexport function isChainHead(field, chain) {\n return sameField(field, chain[0]);\n}\n\nexport function fieldToChain(field, record) {\n if (field.deleted || !field.subfields) {\n return [];\n }\n const chain = newGetAllLinkedFields(field, record, true, true);\n\n nvdebug(` Chain contains ${chain.length} field(s)`);\n if (!isChainHead(field, chain)) { // newGetAllLinkedFields() marks relevant record.fields!\n return [];\n }\n\n const fieldsWithSubfield6 = chain.filter(f => fieldHasValidSubfield6(f));\n // Hack: multiple $6 fields, but either all are non-880 or all are 880: treat field as a single entry\n if (fieldsWithSubfield6.length > 0) {\n const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');\n if (non880.length === 0 || non880.length === fieldsWithSubfield6.length) {\n return [field];\n }\n if (non880.length !== 1) {\n return [field];\n }\n }\n\n if (!acceptFieldsWithSubfield6(fieldsWithSubfield6)) { // Check tag subfield $6s are legal(ish)\n return [];\n }\n const fieldsWithSubfield8 = chain.filter(f => fieldHasValidSubfield8(f));\n if (!acceptFieldsWithSubfield8(fieldsWithSubfield8, false)) {\n return [];\n }\n\n //nvdebug(`Proceed with ${fieldsToString(chain)}`);\n\n\n return chain;\n}\n\n\nfunction fieldHandleDuplicateDatafields(field, record) {\n const chain = fieldToChain(field, record);\n nvdebug(` TRY TO HANDLE DUPLICATES OF '${fieldsToString(chain)}'`);\n\n if (chain.length === 0) {\n return;\n }\n\n const fieldsWithSubfield6 = chain.filter(f => fieldHasValidSubfield6(f));\n const fieldsWithSubfield8 = chain.filter(f => fieldHasValidSubfield8(f));\n\n // Lone fields:\n if (chain.length === 1) {\n markIdenticalLoneFieldsAsDeletable(chain[0], record);\n return;\n }\n if (fieldsWithSubfield6.length === 0) {\n\n if (fieldsWithSubfield8.length === 0) { // chain.length === 1?\n nvdebug(` Trying to find duplicates of single field '${fieldToString(chain[0])}'`);\n markIdenticalLoneFieldsAsDeletable(chain[0], record);\n return;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fieldsWithSubfield8);\n if (linkingNumbers.length < 2) {\n markIdenticalSubfield6Chains(chain, record);\n return;\n }\n }\n\n if (fieldsWithSubfield6.length > 0 && acceptFieldsWithSubfield8(fieldsWithSubfield8, true)) { // Checks that non-880 tags are all same\n // Chain is removable\n markIdenticalSubfield6Chains(chain, record);\n return;\n }\n\n\n nvdebug(` NO HANDLER FOUND FOR '${fieldsToString(chain)}'`);\n nvdebug(` N8s: ${fieldsWithSubfield6.length}`);\n\n}\n\n\nexport function removeDuplicateDatafields(record, fix = true) {\n // Sometimes only $8 subfield (vs the whole field) is removed. Thus they are handled separately:\n handleDuplicateSubfield8Chains(record, fix);\n\n const dataFields = record.fields.filter(f => f.subfields !== undefined);\n\n dataFields.forEach(f => fieldHandleDuplicateDatafields(f, record));\n\n const deletableFields = dataFields.filter(f => f.deleted);\n const modifiedFields = dataFields.filter(f => f.modified && !f.deleted);\n\n const result = deletableFields.map(f => `DEL: ${fieldToString(f)}`);\n if (modifiedFields.length) { // eslint-disable-line functional/no-conditional-statements\n modifiedFields.forEach(f => delete f.modified); // eslint-disable-line functional/immutable-data\n result.push(modifiedFields.map(f => `MOD: ${fieldToString(f)}`)); // eslint-disable-line functional/immutable-data\n }\n\n if (fix) {\n deletableFields.forEach(f => record.removeField(f));\n return result;\n }\n\n deletableFields.forEach(f => delete f.deleted); // eslint-disable-line functional/immutable-data\n deletableFields.forEach(f => delete f.modified); // eslint-disable-line functional/immutable-data\n\n\n return result;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"removeDuplicateDataFields.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","_subfield8Utils","e","__esModule","default","LINK_ROOT","LINKED_AND_PROCESSED","LINKED_NOT_PROCESSED","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeDuplicateDatafields","duplicates","length","removeLinkNotes","fields","forEach","f","linkNote","newGetAllLinkedFields","field","useSixes","useEights","currField","undefined","related6s","get6s","linkField","related8s","add8s","find","linkedFields","filter","recordRemoveFieldOrSubfield8","currLinkingNumber","eights","subfields","sf","code","removeField","getSubfield8LinkingNumber","removeSubfield","newRecordRemoveFieldOrSubfield8","deleted","modified","removeDuplicateSubfield8Chains","seen","removables","seenLinkingNumbers","recordGetAllSubfield8LinkingNumbers","join","recordGetFieldsWithSubfield8LinkingNumber","normalizeOccurrenceNumber","linkedFieldsAsString","fieldsToNormalizedString","includes","push","fieldsToString","handleDuplicateSubfield8Chains","markIdenticalSubfield6Chains","chain","normalizeTag","some","tag","substring","chainAsString","compareWithChain","fieldToString","otherChain","fieldToChain","sameField","otherChainAsString","markIdenticalLoneFieldsAsDeletable","fieldAsString","fieldToNormalizedString","identicalLoneFields","acceptFieldsWithSubfield6","fieldsWithSubfield6","non880","occurrenceNumbers","fieldsGetOccurrenceNumbers","isSingleTagLinkingNumber","linkingNumber","relevantFields","fieldHasLinkingNumber","acceptFieldsWithSubfield8","fieldsWithSubfield8","requireSingleTag","linkingNumbers","fieldsGetAllSubfield8LinkingNumbers","anomaly8","f880","field1","field2","tmpMyId","result","isChainHead","fieldHasValidSubfield6","fieldHasValidSubfield8","fieldHandleDuplicateDatafields","dataFields","deletableFields","modifiedFields","map"],"sources":["../src/removeDuplicateDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldsToString, fieldToString, nvdebug} from './utils';\nimport {fieldHasValidSubfield6, fieldsGetOccurrenceNumbers, fieldsToNormalizedString, fieldToNormalizedString, get6s} from './subfield6Utils';\nimport {add8s, fieldHasLinkingNumber, fieldHasValidSubfield8, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, recordGetAllSubfield8LinkingNumbers, recordGetFieldsWithSubfield8LinkingNumber} from './subfield8Utils';\n\nconst LINK_ROOT = 4;\nconst LINKED_AND_PROCESSED = 2;\nconst LINKED_NOT_PROCESSED = 1;\n\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeDuplicateDataFields');\n\nexport default function () {\n return {\n description: 'Remove duplicate data fields. Certain exceptions apply, mainly too complited chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Remove duplicate data fields');\n const res = {message: [], fix: [], valid: true};\n removeDuplicateDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: duplicate data fields cause (t)error', debug);\n\n const duplicates = removeDuplicateDatafields(record, false);\n\n //const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n const res = {message: duplicates};\n\n /*\n if (orphanedFields.length > 0) {\n res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`];\n }\n */\n res.valid = res.message.length < 1;\n return res;\n }\n}\n\n\n/*\nfunction numberOfLinkageSubfields(field) {\n nvdebug(`N of Linkage Subs(${fieldToString(field)})`);\n const subfields = field.subfields.filter(sf => sf.code === '6' || sf.code === '8');\n return subfields.length;\n}\n*/\n\nfunction removeLinkNotes(record) {\n record.fields.forEach(f => delete f.linkNote); // eslint-disable-line array-callback-return\n}\n\n\nfunction newGetAllLinkedFields(field, record, useSixes = true, useEights = true) {\n removeLinkNotes(record); // should be clear, but let's play safe\n\n /* eslint-disable */\n field.linkNote = LINK_ROOT;\n\n let currField = field;\n\n // Loop until all linked fields have been processed:\n while (currField !== undefined) {\n if (useSixes) {\n const related6s = get6s(currField, record.fields)\n related6s.forEach(f => linkField(f));\n }\n if (useEights) {\n const related8s = add8s([currField], record);\n related8s.forEach(f => linkField(f));\n }\n if (currField.linkNote !== LINK_ROOT) {\n currField.linkNote = LINKED_AND_PROCESSED;\n }\n currField = record.fields.find(f => f.linkNote === LINKED_NOT_PROCESSED);\n }\n\n // Collect relevant fields:\n const linkedFields = record.fields.filter(f => f.linkNote);\n\n removeLinkNotes(record);\n\n return linkedFields;\n\n function linkField(f) {\n if (!f.linkNote) {\n f.linkNote = LINKED_NOT_PROCESSED;\n }\n }\n\n\n /* eslint-enable */\n}\n\n\nfunction recordRemoveFieldOrSubfield8(record, field, currLinkingNumber) {\n const eights = field.subfields.filter(sf => sf.code === '8');\n if (eights.length < 2) {\n record.removeField(field);\n return;\n }\n const subfields = field.subfields.filter(sf => getSubfield8LinkingNumber(sf) === currLinkingNumber);\n subfields.forEach(sf => record.removeSubfield(sf, field)); // eslint-disable-line array-callback-return\n}\n\nfunction newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix) {\n const eights = field.subfields.filter(sf => sf.code === '8');\n if (eights.length < 2) {\n field.deleted = 1;\n return;\n }\n const subfields = field.subfields.filter(sf => getSubfield8LinkingNumber(sf) === currLinkingNumber);\n subfields.forEach(sf => {\n field.modified = 1;\n if (fix) {\n record.removeSubfield(sf, field);\n }\n });\n}\n\n\nexport function removeDuplicateSubfield8Chains(record, fix = true) {\n\n // Seen $8 subsfields in various fields:\n // 161 700\n // 17 710\n // 11 110\n // 8 730\n // 1 100\n // Given these stats, there's no need to check for 1XX-vs-7XX removals\n\n /* eslint-disable */\n let seen = {};\n\n let removables = []; // for validation\n\n nvdebug(\"CHAIN-8\");\n const seenLinkingNumbers = recordGetAllSubfield8LinkingNumbers(record);\n if (seenLinkingNumbers.length === 0) {\n return removables;\n }\n\n nvdebug(`seen linking numbers ($8): ${seenLinkingNumbers.join(', ')}`, debug);\n\n seenLinkingNumbers.forEach(currLinkingNumber => {\n const linkedFields = recordGetFieldsWithSubfield8LinkingNumber(record, currLinkingNumber) //getFieldsWithSubfield8Index(base, baseIndex);\n // As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true\n const normalizeOccurrenceNumber = true;\n const linkedFieldsAsString = fieldsToNormalizedString(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);\n nvdebug(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);\n nvdebug(`${linkedFieldsAsString}`, debug);\n\n if (linkedFieldsAsString in seen) {\n if (!removables.includes(linkedFieldsAsString)) {\n removables.push(linkedFieldsAsString);\n }\n\n if (fix) {\n nvdebug(`$8 CHAIN FIX: REMOVE $8 GROUP: ${fieldsToString(linkedFields)}`, debug);\n linkedFields.forEach(field => recordRemoveFieldOrSubfield8(record, field, currLinkingNumber));\n return;\n }\n\n nvdebug(`$8 VALIDATION: DUPLICATE DETECTED ${linkedFieldsAsString}`, debug);\n return;\n }\n nvdebug(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);\n seen[linkedFieldsAsString] = 1;\n return;\n });\n\n /* eslint-enable */\n return removables;\n}\n\n\nexport function handleDuplicateSubfield8Chains(record, fix) {\n\n // Seen $8 subsfields in various fields:\n // 161 700\n // 17 710\n // 11 110\n // 8 730\n // 1 100\n // Given these stats, there's no need to check for 1XX-vs-7XX removals\n\n /* eslint-disable */\n let seen = {};\n\n nvdebug(\"CHAIN-8\");\n const seenLinkingNumbers = recordGetAllSubfield8LinkingNumbers(record);\n if (seenLinkingNumbers.length === 0) {\n return;\n }\n\n nvdebug(`seen linking numbers ($8): ${seenLinkingNumbers.join(', ')}`, debug);\n\n seenLinkingNumbers.forEach(currLinkingNumber => {\n const linkedFields = recordGetFieldsWithSubfield8LinkingNumber(record, currLinkingNumber) //getFieldsWithSubfield8Index(base, baseIndex);\n // As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true\n const normalizeOccurrenceNumber = false; //true;\n const linkedFieldsAsString = fieldsToNormalizedString(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);\n nvdebug(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);\n nvdebug(`${linkedFieldsAsString}`, debug);\n\n if (linkedFieldsAsString in seen) {\n nvdebug(`$8 CHAIN FIX: REMOVE $8 GROUP: ${fieldsToString(linkedFields)}`, debug);\n linkedFields.forEach(field => newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix));\n return;\n }\n nvdebug(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);\n seen[linkedFieldsAsString] = 1;\n return;\n });\n\n /* eslint-enable */\n\n}\n\nfunction markIdenticalSubfield6Chains(chain, record) {\n const normalizeOccurrenceNumber = true;\n const normalizeTag = chain.some(field => field.tag.substring(0, 1) === '1'); // 1XX can delete 7XX as well!\n const chainAsString = fieldsToNormalizedString(chain, 0, normalizeOccurrenceNumber, normalizeTag);\n\n nvdebug(`markIdenticalSubfield6Chains: ${chainAsString}`);\n record.fields.forEach(f => compareWithChain(f)); // eslint-disable-line array-callback-return\n\n\n function compareWithChain(f) {\n nvdebug(`FIELD2CHAIN ${fieldToString(f)}`);\n const otherChain = fieldToChain(f, record);\n // Not a lone field or chain (head) or ... or is-same-chain\n if (otherChain.length === 0 || sameField(chain[0], otherChain[0])) {\n return;\n }\n const otherChainAsString = fieldsToNormalizedString(otherChain, 0, normalizeOccurrenceNumber, normalizeTag);\n\n // Mark other chain as deleted:\n if (chainAsString === otherChainAsString) {\n otherChain.forEach(f => {\n nvdebug(` mark ${fieldToString(f)} as deleted ($6-chain)...`);\n f.deleted = 1;\n });\n return;\n }\n }\n\n}\n\nfunction markIdenticalLoneFieldsAsDeletable(field, record) {\n if (field.deleted) {\n return;\n }\n // targetLinkingNumber = 0, normalizedOccurenceNumber = false, normalizeTag = true)\n const normalizeTag = field.tag.substring(0, 1) === '1'; // 1XX can delete 7XX as well!\n const fieldAsString = fieldToNormalizedString(field, 0, false, normalizeTag);\n\n const identicalLoneFields = record.fields.filter(f => !sameField(f, field) && fieldToNormalizedString(f, 0, false, normalizeTag) === fieldAsString);\n\n // Mark fields as deleted:\n identicalLoneFields.forEach(f => {\n nvdebug(` mark ${fieldToString(f)} as deleted (lone field)...`);\n f.deleted = 1;\n });\n\n}\n\nfunction acceptFieldsWithSubfield6(fieldsWithSubfield6) {\n // There can be only one non-880 field:\n const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');\n if (non880.length > 1) {\n return false;\n }\n\n const occurrenceNumbers = fieldsGetOccurrenceNumbers(fieldsWithSubfield6);\n // Chain can contain only single occurrence number:\n if (occurrenceNumbers.length > 1) {\n return false;\n }\n\n return true;\n}\n\n\nfunction isSingleTagLinkingNumber(linkingNumber, fields, tag) {\n const relevantFields = fields.filter(f => fieldHasLinkingNumber(f, linkingNumber));\n if (relevantFields.some(f => f.tag !== tag)) {\n return false;\n }\n return true;\n}\n\nfunction acceptFieldsWithSubfield8(fieldsWithSubfield8, requireSingleTag = false) {\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fieldsWithSubfield8);\n if (linkingNumbers.some(linkingNumber => anomaly8(linkingNumber))) {\n return false;\n }\n return true;\n\n // If linking number\n function anomaly8(linkingNumber) {\n nvdebug(` Looking for anomalies in linkin number ${linkingNumber}`);\n const relevantFields = fieldsWithSubfield8.filter(f => fieldHasLinkingNumber(f, linkingNumber));\n if (requireSingleTag) {\n return !isSingleTagLinkingNumber(linkingNumber, relevantFields, relevantFields[0].tag);\n }\n\n const f880 = relevantFields.filter(f => f.tag === '880');\n if (f880.length === 0 || f880.length === relevantFields.length) {\n return false;\n }\n return true;\n }\n}\n\n\nexport function sameField(field1, field2) {\n field1.tmpMyId = 666;\n const result = field2.tmpMyId === 666 ? true : false;\n delete field1.tmpMyId;\n return result;\n}\n\nexport function isChainHead(field, chain) {\n return sameField(field, chain[0]);\n}\n\nexport function fieldToChain(field, record) {\n if (field.deleted || !field.subfields) {\n return [];\n }\n const chain = newGetAllLinkedFields(field, record, true, true);\n\n nvdebug(` Chain contains ${chain.length} field(s)`);\n if (!isChainHead(field, chain)) { // newGetAllLinkedFields() marks relevant record.fields!\n return [];\n }\n\n const fieldsWithSubfield6 = chain.filter(f => fieldHasValidSubfield6(f));\n // Hack: multiple $6 fields, but either all are non-880 or all are 880: treat field as a single entry\n if (fieldsWithSubfield6.length > 0) {\n const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');\n if (non880.length === 0 || non880.length === fieldsWithSubfield6.length) {\n return [field];\n }\n if (non880.length !== 1) {\n return [field];\n }\n }\n\n if (!acceptFieldsWithSubfield6(fieldsWithSubfield6)) { // Check tag subfield $6s are legal(ish)\n return [];\n }\n const fieldsWithSubfield8 = chain.filter(f => fieldHasValidSubfield8(f));\n if (!acceptFieldsWithSubfield8(fieldsWithSubfield8, false)) {\n return [];\n }\n\n //nvdebug(`Proceed with ${fieldsToString(chain)}`);\n\n\n return chain;\n}\n\n\nfunction fieldHandleDuplicateDatafields(field, record) {\n const chain = fieldToChain(field, record);\n nvdebug(` TRY TO HANDLE DUPLICATES OF '${fieldsToString(chain)}'`);\n\n if (chain.length === 0) {\n return;\n }\n\n const fieldsWithSubfield6 = chain.filter(f => fieldHasValidSubfield6(f));\n const fieldsWithSubfield8 = chain.filter(f => fieldHasValidSubfield8(f));\n\n // Lone fields:\n if (chain.length === 1) {\n markIdenticalLoneFieldsAsDeletable(chain[0], record);\n return;\n }\n if (fieldsWithSubfield6.length === 0) {\n\n if (fieldsWithSubfield8.length === 0) { // chain.length === 1?\n nvdebug(` Trying to find duplicates of single field '${fieldToString(chain[0])}'`);\n markIdenticalLoneFieldsAsDeletable(chain[0], record);\n return;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fieldsWithSubfield8);\n if (linkingNumbers.length < 2) {\n markIdenticalSubfield6Chains(chain, record);\n return;\n }\n }\n\n if (fieldsWithSubfield6.length > 0 && acceptFieldsWithSubfield8(fieldsWithSubfield8, true)) { // Checks that non-880 tags are all same\n // Chain is removable\n markIdenticalSubfield6Chains(chain, record);\n return;\n }\n\n\n nvdebug(` NO HANDLER FOUND FOR '${fieldsToString(chain)}'`);\n nvdebug(` N8s: ${fieldsWithSubfield6.length}`);\n\n}\n\n\nexport function removeDuplicateDatafields(record, fix = true) {\n // Sometimes only $8 subfield (vs the whole field) is removed. Thus they are handled separately:\n handleDuplicateSubfield8Chains(record, fix);\n\n const dataFields = record.fields.filter(f => f.subfields !== undefined);\n\n dataFields.forEach(f => fieldHandleDuplicateDatafields(f, record)); // eslint-disable-line array-callback-return\n\n const deletableFields = dataFields.filter(f => f.deleted);\n const modifiedFields = dataFields.filter(f => f.modified && !f.deleted);\n\n const result = deletableFields.map(f => `DEL: ${fieldToString(f)}`);\n if (modifiedFields.length) {\n modifiedFields.forEach(f => delete f.modified); // eslint-disable-line array-callback-return\n result.push(modifiedFields.map(f => `MOD: ${fieldToString(f)}`));\n }\n\n if (fix) {\n deletableFields.forEach(f => record.removeField(f)); // eslint-disable-line array-callback-return\n return result;\n }\n\n deletableFields.forEach(f => delete f.deleted); // eslint-disable-line array-callback-return\n deletableFields.forEach(f => delete f.modified); // eslint-disable-line array-callback-return\n\n\n return result;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -46,14 +46,15 @@ function _default() {
|
|
|
46
46
|
const res = {
|
|
47
47
|
message: duplicates
|
|
48
48
|
};
|
|
49
|
-
res.valid = res.message.length < 1;
|
|
49
|
+
res.valid = res.message.length < 1;
|
|
50
50
|
return res;
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
function deriveInferiorChains(fields, record) {
|
|
54
54
|
//nvdebug(`======= GOT ${fields.length} FIELDS TO CHAINIFY`);
|
|
55
55
|
const hash = {};
|
|
56
|
-
fields.forEach(f => fieldToChainToDeletables(f));
|
|
56
|
+
fields.forEach(f => fieldToChainToDeletables(f)); // eslint-disable-line array-callback-return
|
|
57
|
+
|
|
57
58
|
return hash;
|
|
58
59
|
|
|
59
60
|
//nvdebug(`WP1: GOT ${todoList.length} CHAINS`);
|
|
@@ -71,8 +72,7 @@ function deriveInferiorChains(fields, record) {
|
|
|
71
72
|
//nvdebug(`GOT ${arr.length} DELETABLES FOR ${chainAsString}`);
|
|
72
73
|
arr.forEach(val => {
|
|
73
74
|
if (!(val in hash)) {
|
|
74
|
-
|
|
75
|
-
hash[val] = field; // eslint-disable-line functional/immutable-data
|
|
75
|
+
hash[val] = field;
|
|
76
76
|
}
|
|
77
77
|
});
|
|
78
78
|
}
|
|
@@ -83,7 +83,7 @@ function deriveInferiorChains(fields, record) {
|
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
// Fix MRA-476 (part 1): one $6 value can be worse than the other
|
|
86
|
-
const withoutScriptIdentificationCode = chainAsString.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\/[^ ]+/u, '$1');
|
|
86
|
+
const withoutScriptIdentificationCode = chainAsString.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\/[^ ]+/u, '$1');
|
|
87
87
|
|
|
88
88
|
// Remove keepless versions:
|
|
89
89
|
const keepless = chainAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');
|
|
@@ -147,16 +147,14 @@ function removeInferiorChains(record, fix = true) {
|
|
|
147
147
|
|
|
148
148
|
// If the inferior (deletable) chain is 1XX-based, convert the triggering better chain from 7XX to 1XX:
|
|
149
149
|
if (chainContains1XX(chain)) {
|
|
150
|
-
// eslint-disable-line
|
|
151
|
-
triggeringChain.forEach(f => sevenToOne(f, triggeringChain));
|
|
150
|
+
triggeringChain.forEach(f => sevenToOne(f, triggeringChain)); // eslint-disable-line array-callback-return
|
|
152
151
|
}
|
|
153
152
|
//nvdebug(`iRIS6C: ${chainAsString}`);
|
|
154
153
|
const deletedString = (0, _utils.fieldsToString)(chain);
|
|
155
154
|
const message = `DEL: '${deletedString}' REASON: '${(0, _utils.fieldsToString)(triggeringChain)}'`;
|
|
156
155
|
if (fix) {
|
|
157
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
158
156
|
//nvdebug(`INFERIOR $6 CHAIN REMOVAL: ${message}}`, debug);
|
|
159
|
-
chain.forEach(field => record.removeField(field));
|
|
157
|
+
chain.forEach(field => record.removeField(field)); // eslint-disable-line array-callback-return
|
|
160
158
|
}
|
|
161
159
|
return innerRemoveInferiorChains(remainingFields, [...deletedStringsArray, message]);
|
|
162
160
|
}
|
|
@@ -171,16 +169,16 @@ function removeInferiorChains(record, fix = true) {
|
|
|
171
169
|
}
|
|
172
170
|
// Retag field 7XX as 1XX and fix corresponding occurrence numbers as well:
|
|
173
171
|
const pairs = (0, _subfield6Utils.fieldGetOccurrenceNumberPairs)(field, chain);
|
|
174
|
-
field.tag = `1${field.tag.substring(1)}`;
|
|
172
|
+
field.tag = `1${field.tag.substring(1)}`;
|
|
175
173
|
// There should always be one pair, but I'm not sanity-checking this
|
|
176
|
-
pairs.forEach(pairedField => (0, _subfield6Utils.fieldSevenToOneOccurrenceNumber)(pairedField));
|
|
174
|
+
pairs.forEach(pairedField => (0, _subfield6Utils.fieldSevenToOneOccurrenceNumber)(pairedField)); // eslint-disable-line array-callback-return
|
|
177
175
|
}
|
|
178
176
|
}
|
|
179
177
|
function getIdentifierlessAndKeeplessSubsets(fieldAsString) {
|
|
180
178
|
// The rules below are not perfect (in complex cases they don't catch all permutations), but good enough:
|
|
181
179
|
// Remove identifier(s) (MELKEHITYS-2383-ish):
|
|
182
180
|
|
|
183
|
-
const identifierlessString = fieldAsString.replace(/ ‡[01] [^‡]+($| ‡)/u, '$1');
|
|
181
|
+
const identifierlessString = fieldAsString.replace(/ ‡[01] [^‡]+($| ‡)/u, '$1');
|
|
184
182
|
const keeplessString = fieldAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');
|
|
185
183
|
return [identifierlessString, keeplessString].filter(val => val !== fieldAsString);
|
|
186
184
|
}
|
|
@@ -200,7 +198,7 @@ function deriveIndividualDeletables490(todoList, deletables = []) {
|
|
|
200
198
|
// Without final $v or $x:
|
|
201
199
|
const withoutFinalVOrX = fieldAsString.replace(/ *[;,] ‡[vx] [^‡]+$/u, '');
|
|
202
200
|
// Add intermediate $x-less version
|
|
203
|
-
const xless = fieldAsString.replace(/, ‡x [^‡]+(, ‡x| ; ‡v)/u, '$1');
|
|
201
|
+
const xless = fieldAsString.replace(/, ‡x [^‡]+(, ‡x| ; ‡v)/u, '$1');
|
|
204
202
|
|
|
205
203
|
// Add $xv-less version (handled by recursion?)
|
|
206
204
|
const xvless = fieldAsString.replace(/, ‡x [^‡]+ ‡v [^‡]+$/u, '');
|
|
@@ -210,7 +208,7 @@ function deriveIndividualDeletables490(todoList, deletables = []) {
|
|
|
210
208
|
const arr = [sixless, withoutFinalVOrX, xless, xvless, modifiedInd2].filter(val => val !== fieldAsString);
|
|
211
209
|
|
|
212
210
|
/*
|
|
213
|
-
if (arr.length) {
|
|
211
|
+
if (arr.length) {
|
|
214
212
|
nvdebug(`${arr.length} derivation(s) for ${fieldAsString}`);
|
|
215
213
|
nvdebug(arr.join('\n'));
|
|
216
214
|
}
|
|
@@ -245,7 +243,7 @@ function deriveIndividualDeletables(record) {
|
|
|
245
243
|
}
|
|
246
244
|
const accentless = getAccentlessVersion(currString);
|
|
247
245
|
const d490 = deriveIndividualDeletables490([currString]);
|
|
248
|
-
const subsets = getIdentifierlessAndKeeplessSubsets(currString);
|
|
246
|
+
const subsets = getIdentifierlessAndKeeplessSubsets(currString);
|
|
249
247
|
const moreToDo = [...accentless, ...d490, ...subsets];
|
|
250
248
|
if (currString.match(/^[1678]00/u)) {
|
|
251
249
|
// Proof-of-concept rule. Should be improved eventually...
|
|
@@ -286,7 +284,7 @@ function deriveIndividualDeletables(record) {
|
|
|
286
284
|
replace(/ ‡t /u, ' ‡a ').
|
|
287
285
|
// change first $t to $a
|
|
288
286
|
// ind2: '1' => '#':
|
|
289
|
-
replace(/^505 (.)0/u, '505 $1#');
|
|
287
|
+
replace(/^505 (.)0/u, '505 $1#');
|
|
290
288
|
if (tmp !== currString) {
|
|
291
289
|
return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);
|
|
292
290
|
}
|
|
@@ -304,11 +302,11 @@ function deriveIndividualDeletables(record) {
|
|
|
304
302
|
|
|
305
303
|
// MET-381: remove occurence number TAG-00, if TAG-NN existists
|
|
306
304
|
if (currString.match(/^880.* ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/u)) {
|
|
307
|
-
const tmp = currString.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/u, '$1-00');
|
|
305
|
+
const tmp = currString.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/u, '$1-00');
|
|
308
306
|
//nvdebug(`MET-381: ADD TO DELETABLES: '${tmp}'`);
|
|
309
307
|
//deletableStringsArray.push(tmp);
|
|
310
308
|
if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\/[^ ]+ /u)) {
|
|
311
|
-
const tmp2 = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/u, '$1');
|
|
309
|
+
const tmp2 = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/u, '$1');
|
|
312
310
|
//nvdebug(`MET-381: ADD TO DELETABLES: '${tmp2}'`);
|
|
313
311
|
return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp, tmp2]);
|
|
314
312
|
}
|
|
@@ -389,7 +387,6 @@ function removeIndividualInferiorDatafields(record, fix = true) {
|
|
|
389
387
|
const hits = record.fields.filter(field => isDeletableField(field));
|
|
390
388
|
const deletedFieldsAsStrings = hits.map(f => (0, _utils.fieldToString)(f));
|
|
391
389
|
if (fix) {
|
|
392
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
393
390
|
hits.forEach(field => {
|
|
394
391
|
//nvdebug(`Remove inferior field: ${fieldToString(field)}`, debug);
|
|
395
392
|
record.removeField(field);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","_subfield8Utils","_prepublicationUtils","_normalizeFieldForComparison","_normalizeUtf8Diacritics","e","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeInferiorDatafields","duplicates","length","deriveInferiorChains","fields","hash","forEach","f","fieldToChainToDeletables","field","chain","fieldToChain","chainAsString","fieldsToNormalizedString","arr","deriveChainDeletables","val","todoList","deletables","stillToDo","undefined","withoutScriptIdentificationCode","replace","keepless","linked490Ind1","filter","isRelevantChain6","fieldHasValidSubfield6","fieldHasValidSubfield8","some","subfields","sf","code","sameField","removeInferiorChains","deletableChainsAsKeys","nChains","Object","keys","innerRemoveInferiorChains","deletedStringsArray","currField","remainingFields","triggeringField","triggeringChain","chainContains1XX","sevenToOne","deletedString","fieldsToString","removeField","tag","substring","includes","pairs","fieldGetOccurrenceNumberPairs","pairedField","fieldSevenToOneOccurrenceNumber","getIdentifierlessAndKeeplessSubsets","fieldAsString","identifierlessString","keeplessString","deriveIndividualDeletables490","match","sixless","withoutFinalVOrX","xless","xvless","modifiedInd2","deriveIndividualDeletables","map","fieldToString","deletableStringsArray","processTodoList","inferiorTerms","getInferiorTerms","uniqArray","inputFields","result","flatMap","fieldToInferiorFields","aArray","value","thingsToDo","currString","accentless","getAccentlessVersion","d490","subsets","moreToDo","tmp","tmp1","tmp2","getPrepublicationTerms","newDeletables","string","precomposeFinnishLetters","String","fixComposition","fieldToNormalizedString","normalizedField","cloneAndNormalizeFieldForComparison","deriveIndividualNormalizedDeletables","encodingLevel","getEncodingLevel","recordIsFinished","encodingLevelIsBetterThanPrepublication","met495","fieldRefersToKoneellisestiTuotettuTietue","relevantFields","fieldHasSubfield","deriveDeletable946s","results","fieldAsNormalizedString","candArray","removeIndividualInferiorDatafields","deletableFieldsAsStrings","deletableFieldsAsNormalizedStrings","hits","isDeletableField","deletedFieldsAsStrings","removables","removables6","join","removablesAll","concat"],"sources":["../src/removeInferiorDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToChain, sameField} from './removeDuplicateDataFields';\nimport {fieldGetOccurrenceNumberPairs, fieldHasValidSubfield6, fieldSevenToOneOccurrenceNumber, fieldsToNormalizedString} from './subfield6Utils';\nimport {fieldHasSubfield, fieldsToString, fieldToString, nvdebug, uniqArray} from './utils';\nimport {fieldHasValidSubfield8} from './subfield8Utils';\nimport {encodingLevelIsBetterThanPrepublication, fieldRefersToKoneellisestiTuotettuTietue, getEncodingLevel} from './prepublicationUtils';\nimport {cloneAndNormalizeFieldForComparison} from './normalizeFieldForComparison';\nimport {fixComposition, precomposeFinnishLetters} from './normalize-utf8-diacritics';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\n// NB! This validator handles only full fields, and does not support subfield $8 removal.\n// Also, having multiple $8 subfields in same fields is not supported.\n// If this functionality is needed, see removeDuplicateDatafields.js for examples of subfield-only stuff.\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeInferiorDataFields');\n\nexport default function () {\n return {\n description: 'Remove subset data fields. Certain exceptions apply, mainly too complicated for chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix record: remove inferior (eg. subset) data fields', debug);\n const res = {message: [], fix: [], valid: true};\n removeInferiorDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: remove inferior (eg. subset) data fields', debug);\n\n const duplicates = removeInferiorDatafields(record, false);\n\n const res = {message: duplicates};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction deriveInferiorChains(fields, record) {\n //nvdebug(`======= GOT ${fields.length} FIELDS TO CHAINIFY`);\n const hash = {};\n\n fields.forEach(f => fieldToChainToDeletables(f));\n\n return hash;\n\n //nvdebug(`WP1: GOT ${todoList.length} CHAINS`);\n\n\n // here we map deletableStringObject[str] => field. The idea is to help debugging. We don't actually need the field object...\n //return deriveChainDeletables(todoList);\n\n function fieldToChainToDeletables(field) {\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n const arr = deriveChainDeletables([chainAsString]);\n //nvdebug(`GOT ${arr.length} DELETABLES FOR ${chainAsString}`);\n arr.forEach(val => {\n if (!(val in hash)) { // eslint-disable-line functional/no-conditional-statements\n hash[val] = field; // eslint-disable-line functional/immutable-data\n }\n });\n }\n\n function deriveChainDeletables(todoList, deletables = []) {\n const [chainAsString, ...stillToDo] = todoList;\n if (chainAsString === undefined) {\n return deletables;\n }\n\n // Fix MRA-476 (part 1): one $6 value can be worse than the other\n const withoutScriptIdentificationCode = chainAsString.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\\/[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group\n\n // Remove keepless versions:\n const keepless = chainAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n // MRA-433: 490 ind1=1 vs ind1=0: remove latter (luckily no 2nd indicator etc)\n const linked490Ind1 = chainAsString.replace(/^490 1/u, '490 0').replace(/\\t880 1/ug, '\\t880 0');\n const arr = [withoutScriptIdentificationCode, keepless, linked490Ind1].filter(val => val !== chainAsString);\n if (arr.length > 0) {\n return deriveChainDeletables([...stillToDo, ...arr], [...deletables, ...arr]);\n }\n\n return deriveChainDeletables(stillToDo, deletables);\n }\n\n}\n\nfunction isRelevantChain6(field, record) {\n //Can't be a chain:\n if (!fieldHasValidSubfield6(field) && !fieldHasValidSubfield8(field)) {\n return false;\n }\n // Too short to be a chain:\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return false;\n }\n // No field can contains no more than one subfield $6\n if (chain.some(f => f.subfields.filter(sf => sf.code === '6').length > 1)) {\n return false;\n }\n\n // Check whether our field is the head of a chain:\n return sameField(field, chain[0]);\n}\n\nexport function removeInferiorChains(record, fix = true) {\n const fields = record.fields.filter(f => isRelevantChain6(f, record));\n //nvdebug(`WP2.0: GOT ${fields.length} chain(s)`);\n\n const deletableChainsAsKeys = deriveInferiorChains(fields, record);\n const nChains = Object.keys(deletableChainsAsKeys).length;\n //nvdebug(`WP2: GOT ${nChains} chain(s)`);\n if (nChains === 0) {\n return [];\n }\n\n //nvdebug(`removeInferiorChains() has ${fields.length} fields-in-chain(s), and a list of ${nChains} deletable(s)`);\n\n return innerRemoveInferiorChains(fields);\n\n function innerRemoveInferiorChains(fields, deletedStringsArray = []) {\n const [currField, ...remainingFields] = fields;\n\n if (currField === undefined) {\n return deletedStringsArray;\n }\n\n const chain = fieldToChain(currField, record);\n if (chain.length === 0 || !sameField(currField, chain[0])) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n if (!(chainAsString in deletableChainsAsKeys)) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const triggeringField = deletableChainsAsKeys[chainAsString];\n const triggeringChain = fieldToChain(triggeringField, record);\n\n // If the inferior (deletable) chain is 1XX-based, convert the triggering better chain from 7XX to 1XX:\n if (chainContains1XX(chain)) { // eslint-disable-line functional/no-conditional-statements\n triggeringChain.forEach(f => sevenToOne(f, triggeringChain));\n }\n //nvdebug(`iRIS6C: ${chainAsString}`);\n const deletedString = fieldsToString(chain);\n const message = `DEL: '${deletedString}' REASON: '${fieldsToString(triggeringChain)}'`;\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(`INFERIOR $6 CHAIN REMOVAL: ${message}}`, debug);\n chain.forEach(field => record.removeField(field));\n }\n return innerRemoveInferiorChains(remainingFields, [...deletedStringsArray, message]);\n }\n\n function chainContains1XX(chain) {\n return chain.some(f => f.tag.substring(0, 1) === '1');\n }\n\n function sevenToOne(field, chain) { // Change 7XX field to 1XX field. Also handle the corresponding 880$6 7XX-NN subfields\n // NB! This function should be called only if the original 1XX gets deleted!\n if (!['700', '710', '711', '730'].includes(field.tag)) {\n return;\n }\n // Retag field 7XX as 1XX and fix corresponding occurrence numbers as well:\n const pairs = fieldGetOccurrenceNumberPairs(field, chain);\n field.tag = `1${field.tag.substring(1)}`; // eslint-disable-line functional/immutable-data\n // There should always be one pair, but I'm not sanity-checking this\n pairs.forEach(pairedField => fieldSevenToOneOccurrenceNumber(pairedField));\n }\n\n}\n\n\nfunction getIdentifierlessAndKeeplessSubsets(fieldAsString) {\n // The rules below are not perfect (in complex cases they don't catch all permutations), but good enough:\n // Remove identifier(s) (MELKEHITYS-2383-ish):\n\n const identifierlessString = fieldAsString.replace(/ ‡[01] [^‡]+($| ‡)/u, '$1'); // eslint-disable-line prefer-named-capture-group\n const keeplessString = fieldAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n return [identifierlessString, keeplessString].filter(val => val !== fieldAsString);\n}\n\nfunction deriveIndividualDeletables490(todoList, deletables = []) {\n const [fieldAsString, ...stillToDo] = todoList;\n if (fieldAsString === undefined) {\n return deletables;\n }\n //nvdebug(`PROCESS ${fieldAsString}`);\n if (!fieldAsString.match(/^490/u)) {\n return deriveIndividualDeletables490(stillToDo, deletables);\n }\n\n // $6-less version (keep this first)\n const sixless = fieldAsString.replace(/ ‡6 [^‡]+ ‡/u, ' ‡');\n\n // Without final $v or $x:\n const withoutFinalVOrX = fieldAsString.replace(/ *[;,] ‡[vx] [^‡]+$/u, '');\n // Add intermediate $x-less version\n const xless = fieldAsString.replace(/, ‡x [^‡]+(, ‡x| ; ‡v)/u, '$1'); // eslint-disable-line prefer-named-capture-group\n\n // Add $xv-less version (handled by recursion?)\n const xvless = fieldAsString.replace(/, ‡x [^‡]+ ‡v [^‡]+$/u, '');\n\n // MRA-433-ish (non-chain): 490 ind1=1 vs ind1=0: remove latter\n const modifiedInd2 = fieldAsString.match(/^490 1/u) ? `490 0${fieldAsString.substring(5)}` : fieldAsString;\n\n const arr = [sixless, withoutFinalVOrX, xless, xvless, modifiedInd2].filter(val => val !== fieldAsString);\n\n /*\n if (arr.length) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`${arr.length} derivation(s) for ${fieldAsString}`);\n nvdebug(arr.join('\\n'));\n }\n */\n return arr;\n}\n\nfunction deriveIndividualDeletables(record) {\n const todoList = record.fields.map(f => fieldToString(f));\n //const finishedRecord = encodingLevelIsBetterThanPrepublication(getEncodingLevel(record));\n\n const deletableStringsArray = processTodoList(todoList);\n\n const inferiorTerms = getInferiorTerms(record);\n\n return uniqArray([...deletableStringsArray, ...inferiorTerms]);\n\n function getInferiorTerms(record) {\n const inputFields = record.fields.filter(f => ['648', '650', '651'].includes(f.tag) && f.subfields);\n const result = inputFields.flatMap(f => fieldToInferiorFields(f));\n\n // console.log(result.join('\\n')); // eslint-disable-line no-console\n return result;\n }\n\n function fieldToInferiorFields(field) {\n const aArray = field.subfields.filter(sf => sf.code === 'a');\n if (field.tag === '650') {\n return aArray.flatMap(sf => [`653 ## ‡a ${sf.value}`, `653 #0 ‡a ${sf.value}`]);\n }\n return aArray.map(sf => `653 ## ‡a ${sf.value}`);\n }\n\n function processTodoList(thingsToDo, deletables = []) {\n const [currString, ...stillToDo] = thingsToDo;\n\n if (currString === undefined) {\n return deletables;\n }\n\n const accentless = getAccentlessVersion(currString);\n const d490 = deriveIndividualDeletables490([currString]);\n const subsets = getIdentifierlessAndKeeplessSubsets(currString); // eslint-disable-line no-param-reassign\n const moreToDo = [...accentless, ...d490, ...subsets];\n\n\n if (currString.match(/^[1678]00/u)) {\n // Proof-of-concept rule. Should be improved eventually...\n if (currString.match(/, ‡e [^‡]+\\.$/u)) {\n const tmp = currString.replace(/, ‡e [^‡]+\\.$/u, '.');\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Lisäpainokset: Lisäpainos /u)) { // MET-569\n const tmp1 = currString.replace(' Lisäpainos ', ' [Lisäpainos] ');\n const tmp2 = currString.replace(' Lisäpainos ', ' ');\n if (tmp1 !== currString && tmp2 !== currString) {\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp1, tmp2]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Lisäpainokset: \\[Lisäpainos\\] /u)) { // MET-569\n const tmp = currString.replace(' [Lisäpainos] ', ' ');\n if (tmp !== currString) {\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Ei vastaanotettu\\.$/u)) { // MELKEHITYS-3147\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, '500 ## ‡a EI VASTAANOTETTU.']);\n }\n if (currString.match(/^500 ## ‡a Ei ilmesty\\.$/u)) { // MELKEHITYS-3147\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, '500 ## ‡a EI ILMESTY.']);\n }\n\n if (currString.match(/^505 .0.*-- ‡t/u)) { // MRA-413-ish\n const tmp = currString.replace(/ -- ‡t /gu, ' -- '). // remove non-initial $t subfields\n replace(/ ‡[rg] /gu, ' '). // remove $r and $g subfields\n replace(/ ‡t /u, ' ‡a '). // change first $t to $a\n // ind2: '1' => '#':\n replace(/^505 (.)0/u, '505 $1#'); // eslint-disable-line prefer-named-capture-group\n if (tmp !== currString) {\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n //nvdebug(`505 ORIGINAL: '${fieldAsString}'`)\n //nvdebug(`505 DERIVATE: '${tmp}'`)\n }\n\n if (currString.match(/^594 ## ‡a Ei vastaanotettu ‡5 FENNI$/u)) { // MELKEHITYS-3147\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, '594 ## ‡a EI VASTAANOTETTU ‡5 FENNI']);\n }\n if (currString.match(/^594 ## ‡a Ei ilmesty ‡5 FENNI$/u)) { // MELKEHITYS-3147\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, '594 ## ‡a EI ILMESTY ‡5 FENNI']);\n }\n\n // MET-381: remove occurence number TAG-00, if TAG-NN existists\n if (currString.match(/^880.* ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/u)) {\n const tmp = currString.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/u, '$1-00'); // eslint-disable-line prefer-named-capture-group\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp}'`);\n //deletableStringsArray.push(tmp);\n if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\\/[^ ]+ /u)) {\n const tmp2 = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp2}'`);\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp, tmp2]);\n }\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n\n // MET-575 (merge: applies in postprocessing)\n const inferiorTerms = getPrepublicationTerms(currString);\n\n const newDeletables = [...deletables, ...subsets, ...accentless, ...d490, ...inferiorTerms];\n\n if (subsets.length) {\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n function getAccentlessVersion(string) { // MET-527\n //nvdebug(`START: '${string}`);\n // This is a sanity check: if precomposition does something, there's something wrong, and we don't want to proceed..\n if (string !== precomposeFinnishLetters(string)) {\n return [];\n }\n const accentless = String(fixComposition(string)).replace(/\\p{Diacritic}/gu, '');\n //nvdebug(`FROM '${string}'\\n TO '${accentless}'`);\n if (accentless === string) { // Don't self-destruct\n return [];\n }\n return [accentless];\n }\n\n function getPrepublicationTerms(fieldAsString) {\n if (fieldAsString.match(/^653./u)) {\n // MET-528 (extented by MET-575)\n return [`${fieldAsString} ‡g ENNAKKOTIETO`, `${fieldAsString} ‡g Ennakkotieto`, `${fieldAsString} ‡g ennakkotieto`, `${fieldAsString} ‡g ENNAKKOTIETO.`, `${fieldAsString} ‡g Ennakkotieto.`, `${fieldAsString} ‡g ennakkotieto.`];\n }\n\n return [];\n }\n\n}\n\nfunction fieldToNormalizedString(field) {\n const normalizedField = cloneAndNormalizeFieldForComparison(field);\n return fieldToString(normalizedField);\n}\n\nfunction deriveIndividualNormalizedDeletables(record) { // MET-461:\n const encodingLevel = getEncodingLevel(record);\n const recordIsFinished = encodingLevelIsBetterThanPrepublication(encodingLevel);\n const met495 = encodingLevel === '2' && record.fields.some(f => f.tag === '500' && fieldRefersToKoneellisestiTuotettuTietue(f));\n if (!recordIsFinished || met495) {\n return [];\n }\n const relevantFields = record.fields.filter(f => ['245', '246'].includes(f.tag) && fieldHasSubfield(f, 'a'));\n\n return deriveDeletable946s(relevantFields);\n\n function deriveDeletable946s(fields, results = []) {\n const [currField, ...remainingFields] = fields;\n if (currField === undefined) {\n return results;\n }\n\n const fieldAsNormalizedString = fieldToNormalizedString(currField);\n const tmp = fieldAsNormalizedString.replace(/^(?:...) ../u, '946 ##'). // <= Change tag to 946 and indicators to '##'\n replace(' ‡a ', ' ‡i nimeke onixissa ‡a '). // Add $i before $a. NB! This is added in the normalized lower-cased form!\n replace(/(?: \\/)? ‡c[^‡]+$/u, ''); // Remove $c. (Can $c be non-last?)\n const candArray = [tmp, `${tmp} ‡5 MELINDA`].filter(val => val !== fieldAsNormalizedString);\n if (candArray.length) {\n return deriveDeletable946s(remainingFields, [...results, ...candArray]);\n }\n return deriveDeletable946s(remainingFields, results);\n }\n}\n\nexport function removeIndividualInferiorDatafields(record, fix = true) { // No $6 nor $8 in field\n const deletableFieldsAsStrings = deriveIndividualDeletables(record);\n const deletableFieldsAsNormalizedStrings = deriveIndividualNormalizedDeletables(record);\n\n // nvdebug(`Deletables:\\n ${deletableFieldsAsStrings.join('\\n ')}`);\n // nvdebug(`Normalized deletables:\\n ${deletableFieldsAsNormalizedStrings.join('\\n ')}`);\n\n const hits = record.fields.filter(field => isDeletableField(field));\n\n const deletedFieldsAsStrings = hits.map(f => fieldToString(f));\n\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n hits.forEach(field => {\n //nvdebug(`Remove inferior field: ${fieldToString(field)}`, debug);\n record.removeField(field);\n });\n }\n\n return deletedFieldsAsStrings;\n\n function isDeletableField(field) {\n const fieldAsString = fieldToString(field);\n if (deletableFieldsAsStrings.includes(fieldAsString)) {\n return true;\n }\n const fieldAsNormalizedString = fieldToNormalizedString(field);\n if (deletableFieldsAsNormalizedStrings.includes(fieldAsNormalizedString)) {\n return true;\n }\n\n return false;\n }\n}\n\n\nexport function removeInferiorDatafields(record, fix = true) {\n const removables = removeIndividualInferiorDatafields(record, fix); // Lone fields\n //const removables8 = removeDuplicateSubfield8Chains(record, fix); // Lone subfield $8 chains\n const removables6 = removeInferiorChains(record, fix); // Lone subfield $6 chains\n // HOW TO HANDLE $6+$8 combos? Skipping is relatively OK.\n\n nvdebug(`REMOVABLES:\\n ${removables.join('\\n ')}`, debug);\n nvdebug(`REMOVABLES 6:\\n ${removables6.join('\\n ')}`, debug);\n\n const removablesAll = removables.concat(removables6); //.concat(removables8);\n\n return removablesAll;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","_subfield8Utils","_prepublicationUtils","_normalizeFieldForComparison","_normalizeUtf8Diacritics","e","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeInferiorDatafields","duplicates","length","deriveInferiorChains","fields","hash","forEach","f","fieldToChainToDeletables","field","chain","fieldToChain","chainAsString","fieldsToNormalizedString","arr","deriveChainDeletables","val","todoList","deletables","stillToDo","undefined","withoutScriptIdentificationCode","replace","keepless","linked490Ind1","filter","isRelevantChain6","fieldHasValidSubfield6","fieldHasValidSubfield8","some","subfields","sf","code","sameField","removeInferiorChains","deletableChainsAsKeys","nChains","Object","keys","innerRemoveInferiorChains","deletedStringsArray","currField","remainingFields","triggeringField","triggeringChain","chainContains1XX","sevenToOne","deletedString","fieldsToString","removeField","tag","substring","includes","pairs","fieldGetOccurrenceNumberPairs","pairedField","fieldSevenToOneOccurrenceNumber","getIdentifierlessAndKeeplessSubsets","fieldAsString","identifierlessString","keeplessString","deriveIndividualDeletables490","match","sixless","withoutFinalVOrX","xless","xvless","modifiedInd2","deriveIndividualDeletables","map","fieldToString","deletableStringsArray","processTodoList","inferiorTerms","getInferiorTerms","uniqArray","inputFields","result","flatMap","fieldToInferiorFields","aArray","value","thingsToDo","currString","accentless","getAccentlessVersion","d490","subsets","moreToDo","tmp","tmp1","tmp2","getPrepublicationTerms","newDeletables","string","precomposeFinnishLetters","String","fixComposition","fieldToNormalizedString","normalizedField","cloneAndNormalizeFieldForComparison","deriveIndividualNormalizedDeletables","encodingLevel","getEncodingLevel","recordIsFinished","encodingLevelIsBetterThanPrepublication","met495","fieldRefersToKoneellisestiTuotettuTietue","relevantFields","fieldHasSubfield","deriveDeletable946s","results","fieldAsNormalizedString","candArray","removeIndividualInferiorDatafields","deletableFieldsAsStrings","deletableFieldsAsNormalizedStrings","hits","isDeletableField","deletedFieldsAsStrings","removables","removables6","join","removablesAll","concat"],"sources":["../src/removeInferiorDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToChain, sameField} from './removeDuplicateDataFields';\nimport {fieldGetOccurrenceNumberPairs, fieldHasValidSubfield6, fieldSevenToOneOccurrenceNumber, fieldsToNormalizedString} from './subfield6Utils';\nimport {fieldHasSubfield, fieldsToString, fieldToString, nvdebug, uniqArray} from './utils';\nimport {fieldHasValidSubfield8} from './subfield8Utils';\nimport {encodingLevelIsBetterThanPrepublication, fieldRefersToKoneellisestiTuotettuTietue, getEncodingLevel} from './prepublicationUtils';\nimport {cloneAndNormalizeFieldForComparison} from './normalizeFieldForComparison';\nimport {fixComposition, precomposeFinnishLetters} from './normalize-utf8-diacritics';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\n// NB! This validator handles only full fields, and does not support subfield $8 removal.\n// Also, having multiple $8 subfields in same fields is not supported.\n// If this functionality is needed, see removeDuplicateDatafields.js for examples of subfield-only stuff.\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeInferiorDataFields');\n\nexport default function () {\n return {\n description: 'Remove subset data fields. Certain exceptions apply, mainly too complicated for chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix record: remove inferior (eg. subset) data fields', debug);\n const res = {message: [], fix: [], valid: true};\n removeInferiorDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: remove inferior (eg. subset) data fields', debug);\n\n const duplicates = removeInferiorDatafields(record, false);\n\n const res = {message: duplicates};\n\n res.valid = res.message.length < 1;\n return res;\n }\n}\n\n\nfunction deriveInferiorChains(fields, record) {\n //nvdebug(`======= GOT ${fields.length} FIELDS TO CHAINIFY`);\n const hash = {};\n\n fields.forEach(f => fieldToChainToDeletables(f)); // eslint-disable-line array-callback-return\n\n return hash;\n\n //nvdebug(`WP1: GOT ${todoList.length} CHAINS`);\n\n\n // here we map deletableStringObject[str] => field. The idea is to help debugging. We don't actually need the field object...\n //return deriveChainDeletables(todoList);\n\n function fieldToChainToDeletables(field) {\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n const arr = deriveChainDeletables([chainAsString]);\n //nvdebug(`GOT ${arr.length} DELETABLES FOR ${chainAsString}`);\n arr.forEach(val => {\n if (!(val in hash)) {\n hash[val] = field;\n }\n });\n }\n\n function deriveChainDeletables(todoList, deletables = []) {\n const [chainAsString, ...stillToDo] = todoList;\n if (chainAsString === undefined) {\n return deletables;\n }\n\n // Fix MRA-476 (part 1): one $6 value can be worse than the other\n const withoutScriptIdentificationCode = chainAsString.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\\/[^ ]+/u, '$1');\n\n // Remove keepless versions:\n const keepless = chainAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n // MRA-433: 490 ind1=1 vs ind1=0: remove latter (luckily no 2nd indicator etc)\n const linked490Ind1 = chainAsString.replace(/^490 1/u, '490 0').replace(/\\t880 1/ug, '\\t880 0');\n const arr = [withoutScriptIdentificationCode, keepless, linked490Ind1].filter(val => val !== chainAsString);\n if (arr.length > 0) {\n return deriveChainDeletables([...stillToDo, ...arr], [...deletables, ...arr]);\n }\n\n return deriveChainDeletables(stillToDo, deletables);\n }\n\n}\n\nfunction isRelevantChain6(field, record) {\n //Can't be a chain:\n if (!fieldHasValidSubfield6(field) && !fieldHasValidSubfield8(field)) {\n return false;\n }\n // Too short to be a chain:\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return false;\n }\n // No field can contains no more than one subfield $6\n if (chain.some(f => f.subfields.filter(sf => sf.code === '6').length > 1)) {\n return false;\n }\n\n // Check whether our field is the head of a chain:\n return sameField(field, chain[0]);\n}\n\nexport function removeInferiorChains(record, fix = true) {\n const fields = record.fields.filter(f => isRelevantChain6(f, record));\n //nvdebug(`WP2.0: GOT ${fields.length} chain(s)`);\n\n const deletableChainsAsKeys = deriveInferiorChains(fields, record);\n const nChains = Object.keys(deletableChainsAsKeys).length;\n //nvdebug(`WP2: GOT ${nChains} chain(s)`);\n if (nChains === 0) {\n return [];\n }\n\n //nvdebug(`removeInferiorChains() has ${fields.length} fields-in-chain(s), and a list of ${nChains} deletable(s)`);\n\n return innerRemoveInferiorChains(fields);\n\n function innerRemoveInferiorChains(fields, deletedStringsArray = []) {\n const [currField, ...remainingFields] = fields;\n\n if (currField === undefined) {\n return deletedStringsArray;\n }\n\n const chain = fieldToChain(currField, record);\n if (chain.length === 0 || !sameField(currField, chain[0])) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n if (!(chainAsString in deletableChainsAsKeys)) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const triggeringField = deletableChainsAsKeys[chainAsString];\n const triggeringChain = fieldToChain(triggeringField, record);\n\n // If the inferior (deletable) chain is 1XX-based, convert the triggering better chain from 7XX to 1XX:\n if (chainContains1XX(chain)) {\n triggeringChain.forEach(f => sevenToOne(f, triggeringChain)); // eslint-disable-line array-callback-return\n }\n //nvdebug(`iRIS6C: ${chainAsString}`);\n const deletedString = fieldsToString(chain);\n const message = `DEL: '${deletedString}' REASON: '${fieldsToString(triggeringChain)}'`;\n if (fix) {\n //nvdebug(`INFERIOR $6 CHAIN REMOVAL: ${message}}`, debug);\n chain.forEach(field => record.removeField(field)); // eslint-disable-line array-callback-return\n }\n return innerRemoveInferiorChains(remainingFields, [...deletedStringsArray, message]);\n }\n\n function chainContains1XX(chain) {\n return chain.some(f => f.tag.substring(0, 1) === '1');\n }\n\n function sevenToOne(field, chain) { // Change 7XX field to 1XX field. Also handle the corresponding 880$6 7XX-NN subfields\n // NB! This function should be called only if the original 1XX gets deleted!\n if (!['700', '710', '711', '730'].includes(field.tag)) {\n return;\n }\n // Retag field 7XX as 1XX and fix corresponding occurrence numbers as well:\n const pairs = fieldGetOccurrenceNumberPairs(field, chain);\n field.tag = `1${field.tag.substring(1)}`;\n // There should always be one pair, but I'm not sanity-checking this\n pairs.forEach(pairedField => fieldSevenToOneOccurrenceNumber(pairedField)); // eslint-disable-line array-callback-return\n }\n\n}\n\n\nfunction getIdentifierlessAndKeeplessSubsets(fieldAsString) {\n // The rules below are not perfect (in complex cases they don't catch all permutations), but good enough:\n // Remove identifier(s) (MELKEHITYS-2383-ish):\n\n const identifierlessString = fieldAsString.replace(/ ‡[01] [^‡]+($| ‡)/u, '$1');\n const keeplessString = fieldAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n return [identifierlessString, keeplessString].filter(val => val !== fieldAsString);\n}\n\nfunction deriveIndividualDeletables490(todoList, deletables = []) {\n const [fieldAsString, ...stillToDo] = todoList;\n if (fieldAsString === undefined) {\n return deletables;\n }\n //nvdebug(`PROCESS ${fieldAsString}`);\n if (!fieldAsString.match(/^490/u)) {\n return deriveIndividualDeletables490(stillToDo, deletables);\n }\n\n // $6-less version (keep this first)\n const sixless = fieldAsString.replace(/ ‡6 [^‡]+ ‡/u, ' ‡');\n\n // Without final $v or $x:\n const withoutFinalVOrX = fieldAsString.replace(/ *[;,] ‡[vx] [^‡]+$/u, '');\n // Add intermediate $x-less version\n const xless = fieldAsString.replace(/, ‡x [^‡]+(, ‡x| ; ‡v)/u, '$1');\n\n // Add $xv-less version (handled by recursion?)\n const xvless = fieldAsString.replace(/, ‡x [^‡]+ ‡v [^‡]+$/u, '');\n\n // MRA-433-ish (non-chain): 490 ind1=1 vs ind1=0: remove latter\n const modifiedInd2 = fieldAsString.match(/^490 1/u) ? `490 0${fieldAsString.substring(5)}` : fieldAsString;\n\n const arr = [sixless, withoutFinalVOrX, xless, xvless, modifiedInd2].filter(val => val !== fieldAsString);\n\n /*\n if (arr.length) {\n nvdebug(`${arr.length} derivation(s) for ${fieldAsString}`);\n nvdebug(arr.join('\\n'));\n }\n */\n return arr;\n}\n\nfunction deriveIndividualDeletables(record) {\n const todoList = record.fields.map(f => fieldToString(f));\n //const finishedRecord = encodingLevelIsBetterThanPrepublication(getEncodingLevel(record));\n\n const deletableStringsArray = processTodoList(todoList);\n\n const inferiorTerms = getInferiorTerms(record);\n\n return uniqArray([...deletableStringsArray, ...inferiorTerms]);\n\n function getInferiorTerms(record) {\n const inputFields = record.fields.filter(f => ['648', '650', '651'].includes(f.tag) && f.subfields);\n const result = inputFields.flatMap(f => fieldToInferiorFields(f));\n\n // console.log(result.join('\\n')); // eslint-disable-line no-console\n return result;\n }\n\n function fieldToInferiorFields(field) {\n const aArray = field.subfields.filter(sf => sf.code === 'a');\n if (field.tag === '650') {\n return aArray.flatMap(sf => [`653 ## ‡a ${sf.value}`, `653 #0 ‡a ${sf.value}`]);\n }\n return aArray.map(sf => `653 ## ‡a ${sf.value}`);\n }\n\n function processTodoList(thingsToDo, deletables = []) {\n const [currString, ...stillToDo] = thingsToDo;\n\n if (currString === undefined) {\n return deletables;\n }\n\n const accentless = getAccentlessVersion(currString);\n const d490 = deriveIndividualDeletables490([currString]);\n const subsets = getIdentifierlessAndKeeplessSubsets(currString);\n const moreToDo = [...accentless, ...d490, ...subsets];\n\n\n if (currString.match(/^[1678]00/u)) {\n // Proof-of-concept rule. Should be improved eventually...\n if (currString.match(/, ‡e [^‡]+\\.$/u)) {\n const tmp = currString.replace(/, ‡e [^‡]+\\.$/u, '.');\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Lisäpainokset: Lisäpainos /u)) { // MET-569\n const tmp1 = currString.replace(' Lisäpainos ', ' [Lisäpainos] ');\n const tmp2 = currString.replace(' Lisäpainos ', ' ');\n if (tmp1 !== currString && tmp2 !== currString) {\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp1, tmp2]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Lisäpainokset: \\[Lisäpainos\\] /u)) { // MET-569\n const tmp = currString.replace(' [Lisäpainos] ', ' ');\n if (tmp !== currString) {\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n }\n\n if (currString.match(/^500 ## ‡a Ei vastaanotettu\\.$/u)) { // MELKEHITYS-3147\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, '500 ## ‡a EI VASTAANOTETTU.']);\n }\n if (currString.match(/^500 ## ‡a Ei ilmesty\\.$/u)) { // MELKEHITYS-3147\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, '500 ## ‡a EI ILMESTY.']);\n }\n\n if (currString.match(/^505 .0.*-- ‡t/u)) { // MRA-413-ish\n const tmp = currString.replace(/ -- ‡t /gu, ' -- '). // remove non-initial $t subfields\n replace(/ ‡[rg] /gu, ' '). // remove $r and $g subfields\n replace(/ ‡t /u, ' ‡a '). // change first $t to $a\n // ind2: '1' => '#':\n replace(/^505 (.)0/u, '505 $1#');\n if (tmp !== currString) {\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n //nvdebug(`505 ORIGINAL: '${fieldAsString}'`)\n //nvdebug(`505 DERIVATE: '${tmp}'`)\n }\n\n if (currString.match(/^594 ## ‡a Ei vastaanotettu ‡5 FENNI$/u)) { // MELKEHITYS-3147\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, '594 ## ‡a EI VASTAANOTETTU ‡5 FENNI']);\n }\n if (currString.match(/^594 ## ‡a Ei ilmesty ‡5 FENNI$/u)) { // MELKEHITYS-3147\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, '594 ## ‡a EI ILMESTY ‡5 FENNI']);\n }\n\n // MET-381: remove occurence number TAG-00, if TAG-NN existists\n if (currString.match(/^880.* ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/u)) {\n const tmp = currString.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/u, '$1-00');\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp}'`);\n //deletableStringsArray.push(tmp);\n if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\\/[^ ]+ /u)) {\n const tmp2 = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/u, '$1');\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp2}'`);\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp, tmp2]);\n }\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n\n // MET-575 (merge: applies in postprocessing)\n const inferiorTerms = getPrepublicationTerms(currString);\n\n const newDeletables = [...deletables, ...subsets, ...accentless, ...d490, ...inferiorTerms];\n\n if (subsets.length) {\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n function getAccentlessVersion(string) { // MET-527\n //nvdebug(`START: '${string}`);\n // This is a sanity check: if precomposition does something, there's something wrong, and we don't want to proceed..\n if (string !== precomposeFinnishLetters(string)) {\n return [];\n }\n const accentless = String(fixComposition(string)).replace(/\\p{Diacritic}/gu, '');\n //nvdebug(`FROM '${string}'\\n TO '${accentless}'`);\n if (accentless === string) { // Don't self-destruct\n return [];\n }\n return [accentless];\n }\n\n function getPrepublicationTerms(fieldAsString) {\n if (fieldAsString.match(/^653./u)) {\n // MET-528 (extented by MET-575)\n return [`${fieldAsString} ‡g ENNAKKOTIETO`, `${fieldAsString} ‡g Ennakkotieto`, `${fieldAsString} ‡g ennakkotieto`, `${fieldAsString} ‡g ENNAKKOTIETO.`, `${fieldAsString} ‡g Ennakkotieto.`, `${fieldAsString} ‡g ennakkotieto.`];\n }\n\n return [];\n }\n\n}\n\nfunction fieldToNormalizedString(field) {\n const normalizedField = cloneAndNormalizeFieldForComparison(field);\n return fieldToString(normalizedField);\n}\n\nfunction deriveIndividualNormalizedDeletables(record) { // MET-461:\n const encodingLevel = getEncodingLevel(record);\n const recordIsFinished = encodingLevelIsBetterThanPrepublication(encodingLevel);\n const met495 = encodingLevel === '2' && record.fields.some(f => f.tag === '500' && fieldRefersToKoneellisestiTuotettuTietue(f));\n if (!recordIsFinished || met495) {\n return [];\n }\n const relevantFields = record.fields.filter(f => ['245', '246'].includes(f.tag) && fieldHasSubfield(f, 'a'));\n\n return deriveDeletable946s(relevantFields);\n\n function deriveDeletable946s(fields, results = []) {\n const [currField, ...remainingFields] = fields;\n if (currField === undefined) {\n return results;\n }\n\n const fieldAsNormalizedString = fieldToNormalizedString(currField);\n const tmp = fieldAsNormalizedString.replace(/^(?:...) ../u, '946 ##'). // <= Change tag to 946 and indicators to '##'\n replace(' ‡a ', ' ‡i nimeke onixissa ‡a '). // Add $i before $a. NB! This is added in the normalized lower-cased form!\n replace(/(?: \\/)? ‡c[^‡]+$/u, ''); // Remove $c. (Can $c be non-last?)\n const candArray = [tmp, `${tmp} ‡5 MELINDA`].filter(val => val !== fieldAsNormalizedString);\n if (candArray.length) {\n return deriveDeletable946s(remainingFields, [...results, ...candArray]);\n }\n return deriveDeletable946s(remainingFields, results);\n }\n}\n\nexport function removeIndividualInferiorDatafields(record, fix = true) { // No $6 nor $8 in field\n const deletableFieldsAsStrings = deriveIndividualDeletables(record);\n const deletableFieldsAsNormalizedStrings = deriveIndividualNormalizedDeletables(record);\n\n // nvdebug(`Deletables:\\n ${deletableFieldsAsStrings.join('\\n ')}`);\n // nvdebug(`Normalized deletables:\\n ${deletableFieldsAsNormalizedStrings.join('\\n ')}`);\n\n const hits = record.fields.filter(field => isDeletableField(field));\n\n const deletedFieldsAsStrings = hits.map(f => fieldToString(f));\n\n if (fix) {\n hits.forEach(field => {\n //nvdebug(`Remove inferior field: ${fieldToString(field)}`, debug);\n record.removeField(field);\n });\n }\n\n return deletedFieldsAsStrings;\n\n function isDeletableField(field) {\n const fieldAsString = fieldToString(field);\n if (deletableFieldsAsStrings.includes(fieldAsString)) {\n return true;\n }\n const fieldAsNormalizedString = fieldToNormalizedString(field);\n if (deletableFieldsAsNormalizedStrings.includes(fieldAsNormalizedString)) {\n return true;\n }\n\n return false;\n }\n}\n\n\nexport function removeInferiorDatafields(record, fix = true) {\n const removables = removeIndividualInferiorDatafields(record, fix); // Lone fields\n //const removables8 = removeDuplicateSubfield8Chains(record, fix); // Lone subfield $8 chains\n const removables6 = removeInferiorChains(record, fix); // Lone subfield $6 chains\n // HOW TO HANDLE $6+$8 combos? Skipping is relatively OK.\n\n nvdebug(`REMOVABLES:\\n ${removables.join('\\n ')}`, debug);\n nvdebug(`REMOVABLES 6:\\n ${removables6.join('\\n ')}`, debug);\n\n const removablesAll = removables.concat(removables6); //.concat(removables8);\n\n return removablesAll;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -30,8 +30,7 @@ function _default({
|
|
|
30
30
|
const subfields = record.fields.reduce((prev, current) => {
|
|
31
31
|
Object.keys(fields).forEach(key => {
|
|
32
32
|
if (key === current.tag) {
|
|
33
|
-
|
|
34
|
-
prev.push(current); // eslint-disable-line functional/immutable-data
|
|
33
|
+
prev.push(current);
|
|
35
34
|
}
|
|
36
35
|
});
|
|
37
36
|
return prev;
|
|
@@ -41,15 +40,13 @@ function _default({
|
|
|
41
40
|
const matchingTags = [...subfields].reduce((prev, current) => {
|
|
42
41
|
Object.keys(fields).forEach(key => {
|
|
43
42
|
if (key === current.tag) {
|
|
44
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
45
43
|
current.subfields.filter(item => {
|
|
46
44
|
if (Object.values(fields[key]).filter(value => value === item.code)[0]) {
|
|
47
|
-
// eslint-disable-line functional/no-conditional-statements
|
|
48
45
|
prev.push({
|
|
49
46
|
tag: current.tag,
|
|
50
47
|
code: item.code,
|
|
51
48
|
value: item.value
|
|
52
|
-
});
|
|
49
|
+
});
|
|
53
50
|
}
|
|
54
51
|
return prev;
|
|
55
52
|
});
|
|
@@ -61,9 +58,8 @@ function _default({
|
|
|
61
58
|
// Matching prefixPattern is removed from object value field.
|
|
62
59
|
matchingTags.forEach(obj => {
|
|
63
60
|
if (prefixPattern.test(obj.value)) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
removedPrefixes.push(obj); // eslint-disable-line functional/immutable-data
|
|
61
|
+
obj.value = obj.value.replace(prefixPattern, '');
|
|
62
|
+
removedPrefixes.push(obj);
|
|
67
63
|
}
|
|
68
64
|
});
|
|
69
65
|
return resolveValidation(removedPrefixes);
|