@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolvable-ext-references-melinda.js","names":["_xml2js","require","_nodeFetch","_interopRequireDefault","e","__esModule","default","_default","endpoint","prefixPattern","fields","RegExp","description","validate","Error","record","validateResult","validateRecord","removedPrefixes","subfields","reduce","prev","current","Object","keys","forEach","key","tag","push","matchingTags","filter","item","values","value","code","obj","test","replace","resolveValidation","length","validateMatchingTags","then","result","valid","messages","tags","resolved","Promise","all","map","getData","every","recID","queryParam","response","fetch","xml","text","resolve","parseString","err","slice","position","parseInt"],"sources":["../src/resolvable-ext-references-melinda.js"],"sourcesContent":["import {parseString} from 'xml2js';\nimport fetch from 'node-fetch';\n\nexport default function ({endpoint, prefixPattern, fields}) {\n if (typeof endpoint === 'string' && prefixPattern instanceof RegExp && typeof fields === 'object') {\n return {\n description: 'Checks if Melinda entity references are resolvable',\n validate\n };\n }\n\n throw new Error('Error in validation parameters');\n\n async function validate(record) {\n const validateResult = await validateRecord(record);\n return validateResult;\n }\n\n function validateRecord(record) {\n const removedPrefixes = [];\n\n // Filter matching field keys from record.fields\n const subfields = record.fields.reduce((prev, current) => {\n Object.keys(fields).forEach(key => {\n if (key === current.tag) {
|
|
1
|
+
{"version":3,"file":"resolvable-ext-references-melinda.js","names":["_xml2js","require","_nodeFetch","_interopRequireDefault","e","__esModule","default","_default","endpoint","prefixPattern","fields","RegExp","description","validate","Error","record","validateResult","validateRecord","removedPrefixes","subfields","reduce","prev","current","Object","keys","forEach","key","tag","push","matchingTags","filter","item","values","value","code","obj","test","replace","resolveValidation","length","validateMatchingTags","then","result","valid","messages","tags","resolved","Promise","all","map","getData","every","recID","queryParam","response","fetch","xml","text","resolve","parseString","err","slice","position","parseInt"],"sources":["../src/resolvable-ext-references-melinda.js"],"sourcesContent":["import {parseString} from 'xml2js';\nimport fetch from 'node-fetch';\n\nexport default function ({endpoint, prefixPattern, fields}) {\n if (typeof endpoint === 'string' && prefixPattern instanceof RegExp && typeof fields === 'object') {\n return {\n description: 'Checks if Melinda entity references are resolvable',\n validate\n };\n }\n\n throw new Error('Error in validation parameters');\n\n async function validate(record) {\n const validateResult = await validateRecord(record);\n return validateResult;\n }\n\n function validateRecord(record) {\n const removedPrefixes = [];\n\n // Filter matching field keys from record.fields\n const subfields = record.fields.reduce((prev, current) => {\n Object.keys(fields).forEach(key => {\n if (key === current.tag) {\n prev.push(current);\n }\n });\n return prev;\n }, []);\n\n // Filter matching objects from subfields\n const matchingTags = [...subfields].reduce((prev, current) => {\n Object.keys(fields).forEach(key => {\n if (key === current.tag) {\n current.subfields.filter(item => {\n if (Object.values(fields[key]).filter(value => value === item.code)[0]) {\n prev.push({tag: current.tag, code: item.code, value: item.value});\n }\n\n return prev;\n });\n }\n });\n return prev;\n }, []);\n\n // Matching prefixPattern is removed from object value field.\n matchingTags.forEach(obj => {\n if (prefixPattern.test(obj.value)) {\n obj.value = obj.value.replace(prefixPattern, '');\n removedPrefixes.push(obj);\n }\n });\n return resolveValidation(removedPrefixes);\n }\n\n function resolveValidation(removedPrefixes) {\n // If matching prefixPatterns found make an API call\n if (removedPrefixes.length > 0) {\n return validateMatchingTags(removedPrefixes).then(result => result);\n }\n\n return {valid: true, messages: []};\n }\n\n async function validateMatchingTags(tags) {\n const resolved = await Promise.all(tags.map(obj => getData(obj.value).then(valid => ({valid, ...obj}))));\n\n if (resolved.every(value => value.valid === true)) {\n return {valid: true, messages: []};\n }\n\n return {valid: false, messages: resolved.map(obj => `Field ${obj.tag}$${obj.code} with value ${obj.value} is not resolvable`)};\n }\n\n async function getData(recID) {\n const queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\n\n const response = await fetch(`${endpoint}${queryParam}${recID}`);\n\n const xml = await response.text();\n\n return new Promise(resolve => {\n parseString(xml, (err, result) => {\n const record = result['zs:searchRetrieveResponse']['zs:records'].slice(-1)?.[0];\n const position = parseInt(record?.['zs:record'].slice(-1)?.[0]['zs:recordPosition'][0], 10);\n resolve(position === 1 && !err);\n });\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -25,12 +25,12 @@ function _default() {
|
|
|
25
25
|
fix: [],
|
|
26
26
|
valid: true
|
|
27
27
|
};
|
|
28
|
-
//message.fix = [];
|
|
28
|
+
//message.fix = [];
|
|
29
29
|
|
|
30
30
|
// This can not really fail...
|
|
31
31
|
recordFixSubfield6OccurrenceNumbers(record);
|
|
32
32
|
|
|
33
|
-
//message.valid = !(message.message.length >= 1);
|
|
33
|
+
//message.valid = !(message.message.length >= 1);
|
|
34
34
|
return res;
|
|
35
35
|
}
|
|
36
36
|
function validate(record) {
|
|
@@ -42,21 +42,21 @@ function _default() {
|
|
|
42
42
|
message: []
|
|
43
43
|
};
|
|
44
44
|
if (orphanedFields.length > 0) {
|
|
45
|
-
|
|
46
|
-
res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`]; // eslint-disable-line functional/immutable-data
|
|
45
|
+
res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`];
|
|
47
46
|
}
|
|
48
|
-
res.valid = res.message.length < 1;
|
|
47
|
+
res.valid = res.message.length < 1;
|
|
49
48
|
return res;
|
|
50
49
|
}
|
|
51
50
|
}
|
|
52
51
|
function recordFixSubfield6OccurrenceNumbers(record) {
|
|
53
52
|
const fieldsContainingSubfield6 = record.fields.filter(field => (0, _utils.fieldHasSubfield)(field, '6'));
|
|
54
53
|
const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);
|
|
55
|
-
orphanedFields.forEach(field => fieldFixOrphanedSubfields(field));
|
|
54
|
+
orphanedFields.forEach(field => fieldFixOrphanedSubfields(field)); // eslint-disable-line array-callback-return
|
|
55
|
+
|
|
56
56
|
function fieldFixOrphanedSubfields(field) {
|
|
57
57
|
// Field 880: orphaned $6 subfields: occurrence number is changed to '00':
|
|
58
58
|
if (field.tag === '880') {
|
|
59
|
-
field.subfields.forEach(sf => field880FixOrphanedSubfield(sf));
|
|
59
|
+
field.subfields.forEach(sf => field880FixOrphanedSubfield(sf)); // eslint-disable-line array-callback-return
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
62
|
// Non-880 fields get their orphaned $6s removed:
|
|
@@ -65,7 +65,7 @@ function recordFixSubfield6OccurrenceNumbers(record) {
|
|
|
65
65
|
record.removeField(field);
|
|
66
66
|
return;
|
|
67
67
|
}
|
|
68
|
-
field.subfields = remainingSubfields;
|
|
68
|
+
field.subfields = remainingSubfields;
|
|
69
69
|
}
|
|
70
70
|
function field880FixOrphanedSubfield(subfield) {
|
|
71
71
|
if (!isOrphanedSubfield(subfield, '880', fieldsContainingSubfield6)) {
|
|
@@ -81,7 +81,7 @@ function findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields)
|
|
|
81
81
|
return undefined;
|
|
82
82
|
}
|
|
83
83
|
(0, _utils.nvdebug)(`LOOKING FOR PAIR: ${myTag} ${(0, _utils.subfieldToString)(subfield6)}`);
|
|
84
|
-
candPairFields.forEach(field => (0, _utils.fieldToString)(field));
|
|
84
|
+
candPairFields.forEach(field => (0, _utils.fieldToString)(field)); // eslint-disable-line array-callback-return
|
|
85
85
|
|
|
86
86
|
// Only valid $6 value that fails to map to another field is iffy...
|
|
87
87
|
const referredTag = subfield6.value.substring(0, 3);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveOrphanedSubfield6s.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","e","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","recordFixSubfield6OccurrenceNumbers","fieldsContainingSubfield6","fields","filter","field","fieldHasSubfield","orphanedFields","getOrphanedFields","length","forEach","fieldFixOrphanedSubfields","tag","subfields","sf","field880FixOrphanedSubfield","remainingSubfields","isOrphanedSubfield","removeField","subfield","subfield6ResetOccurrenceNumber","findPairForSubfield6OccurrenceNumber","subfield6","myTag","candPairFields","isValidSubfield6","undefined","subfieldToString","fieldToString","referredTag","value","substring","occurrenceNumber","subfield6GetOccurrenceNumber","tagAndOccurrenceNumber","relevantFields","fieldHasWantedTagAndOccurrenceNumber","pairCandidateFields","isOrphanedField","candidatePairFields","some"],"sources":["../src/resolveOrphanedSubfield6s.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug, subfieldToString} from './utils';\nimport {fieldHasWantedTagAndOccurrenceNumber, isValidSubfield6, subfield6GetOccurrenceNumber, subfield6ResetOccurrenceNumber} from './subfield6Utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s');\n\nexport default function () {\n return {\n description: 'Remove occurrence-number-orphaned $6 subfields. In field 880, occurrence number becomes 00',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 orphaned occurrence numbers');\n const res = {message: [], fix: [], valid: true};\n //message.fix = []
|
|
1
|
+
{"version":3,"file":"resolveOrphanedSubfield6s.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","e","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","recordFixSubfield6OccurrenceNumbers","fieldsContainingSubfield6","fields","filter","field","fieldHasSubfield","orphanedFields","getOrphanedFields","length","forEach","fieldFixOrphanedSubfields","tag","subfields","sf","field880FixOrphanedSubfield","remainingSubfields","isOrphanedSubfield","removeField","subfield","subfield6ResetOccurrenceNumber","findPairForSubfield6OccurrenceNumber","subfield6","myTag","candPairFields","isValidSubfield6","undefined","subfieldToString","fieldToString","referredTag","value","substring","occurrenceNumber","subfield6GetOccurrenceNumber","tagAndOccurrenceNumber","relevantFields","fieldHasWantedTagAndOccurrenceNumber","pairCandidateFields","isOrphanedField","candidatePairFields","some"],"sources":["../src/resolveOrphanedSubfield6s.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug, subfieldToString} from './utils';\nimport {fieldHasWantedTagAndOccurrenceNumber, isValidSubfield6, subfield6GetOccurrenceNumber, subfield6ResetOccurrenceNumber} from './subfield6Utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s');\n\nexport default function () {\n return {\n description: 'Remove occurrence-number-orphaned $6 subfields. In field 880, occurrence number becomes 00',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 orphaned occurrence numbers');\n const res = {message: [], fix: [], valid: true};\n //message.fix = [];\n\n // This can not really fail...\n recordFixSubfield6OccurrenceNumbers(record);\n\n //message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate SF6 orphaned occurrence numbers', debug);\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n const res = {message: []};\n\n if (orphanedFields.length > 0) {\n res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`];\n }\n res.valid = res.message.length < 1;\n return res;\n }\n}\n\nexport function recordFixSubfield6OccurrenceNumbers(record) {\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n orphanedFields.forEach(field => fieldFixOrphanedSubfields(field)); // eslint-disable-line array-callback-return\n\n function fieldFixOrphanedSubfields(field) {\n // Field 880: orphaned $6 subfields: occurrence number is changed to '00':\n if (field.tag === '880') {\n field.subfields.forEach(sf => field880FixOrphanedSubfield(sf)); // eslint-disable-line array-callback-return\n return;\n }\n // Non-880 fields get their orphaned $6s removed:\n const remainingSubfields = field.subfields.filter(sf => !isOrphanedSubfield(sf, field.tag, fieldsContainingSubfield6));\n if (remainingSubfields.length === 0) {\n record.removeField(field);\n return;\n }\n field.subfields = remainingSubfields;\n }\n\n function field880FixOrphanedSubfield(subfield) {\n if (!isOrphanedSubfield(subfield, '880', fieldsContainingSubfield6)) {\n return;\n }\n // convert occurrence number to 00\n subfield6ResetOccurrenceNumber(subfield, '00');\n }\n}\n\n\nfunction findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields) {\n // We keep the crap!\n if (!isValidSubfield6(subfield6)) {\n return undefined;\n }\n nvdebug(`LOOKING FOR PAIR: ${myTag} ${subfieldToString(subfield6)}`);\n candPairFields.forEach(field => fieldToString(field)); // eslint-disable-line array-callback-return\n\n // Only valid $6 value that fails to map to another field is iffy...\n const referredTag = subfield6.value.substring(0, 3);\n\n const occurrenceNumber = subfield6GetOccurrenceNumber(subfield6);\n if (occurrenceNumber === '00') {\n return undefined;\n }\n const tagAndOccurrenceNumber = `${myTag}-${occurrenceNumber}`;\n nvdebug(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}...`);\n //const relevantFields = fields.filter(field => field.tag === referredTag && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));\n const relevantFields = candPairFields.filter(field => field.tag === referredTag && fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber));\n if (relevantFields.length === 0) {\n return undefined;\n }\n // This should always return just one (not sanity checking this for now):\n return relevantFields[0];\n}\n\nfunction isOrphanedSubfield(subfield, tag, pairCandidateFields) {\n if (!isValidSubfield6(subfield) || subfield6GetOccurrenceNumber(subfield) === '00') {\n return false;\n }\n return !findPairForSubfield6OccurrenceNumber(subfield, tag, pairCandidateFields);\n}\n\n\nfunction isOrphanedField(field, candidatePairFields) {\n return field.subfields.some(sf => isOrphanedSubfield(sf, field.tag, candidatePairFields));\n}\n\nfunction getOrphanedFields(relevantFields) {\n return relevantFields.filter(field => isOrphanedField(field, relevantFields));\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -25,7 +25,7 @@ function _default() {
|
|
|
25
25
|
valid: true
|
|
26
26
|
};
|
|
27
27
|
const relevantFields = getRelevantFields(record);
|
|
28
|
-
relevantFields.forEach(f => fieldSanitizeVocabularySourceCode(f));
|
|
28
|
+
relevantFields.forEach(f => fieldSanitizeVocabularySourceCode(f)); // eslint-disable-line array-callback-return
|
|
29
29
|
return res;
|
|
30
30
|
}
|
|
31
31
|
function validate(record) {
|
|
@@ -33,8 +33,9 @@ function _default() {
|
|
|
33
33
|
message: []
|
|
34
34
|
};
|
|
35
35
|
const relevantFields = getRelevantFields(record);
|
|
36
|
-
relevantFields.forEach(field => validateField(field, res));
|
|
37
|
-
|
|
36
|
+
relevantFields.forEach(field => validateField(field, res)); // eslint-disable-line array-callback-return
|
|
37
|
+
|
|
38
|
+
res.valid = !(res.message.length >= 1);
|
|
38
39
|
return res;
|
|
39
40
|
}
|
|
40
41
|
function getRelevantFields(record) {
|
|
@@ -46,25 +47,25 @@ function _default() {
|
|
|
46
47
|
const mod = (0, _utils.fieldToString)(normalizedField);
|
|
47
48
|
if (orig !== mod) {
|
|
48
49
|
// Fail as the input is "broken"/"crap"/sumthing
|
|
49
|
-
res.message.push(`FIXABLE: '${orig}' => '${mod}'`);
|
|
50
|
+
res.message.push(`FIXABLE: '${orig}' => '${mod}'`);
|
|
50
51
|
return;
|
|
51
52
|
}
|
|
52
53
|
// Handle illegal values here
|
|
53
54
|
if (fieldHasUnfixableVocabularySourceCode(field)) {
|
|
54
|
-
res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`);
|
|
55
|
+
res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`);
|
|
55
56
|
return;
|
|
56
57
|
}
|
|
57
58
|
return;
|
|
58
59
|
}
|
|
59
60
|
function fieldSanitizeVocabularySourceCode(field) {
|
|
60
|
-
field.subfields.forEach(sf => subfieldSanitizeVocabularySourceCode(sf));
|
|
61
|
+
field.subfields.forEach(sf => subfieldSanitizeVocabularySourceCode(sf)); // eslint-disable-line array-callback-return
|
|
61
62
|
return field;
|
|
62
63
|
}
|
|
63
64
|
function subfieldSanitizeVocabularySourceCode(subfield) {
|
|
64
65
|
if (subfield.code !== '2') {
|
|
65
66
|
return;
|
|
66
67
|
}
|
|
67
|
-
subfield.value = stringFixVocabularySourceCode(subfield.value);
|
|
68
|
+
subfield.value = stringFixVocabularySourceCode(subfield.value);
|
|
68
69
|
}
|
|
69
70
|
}
|
|
70
71
|
|
|
@@ -72,8 +73,7 @@ function _default() {
|
|
|
72
73
|
const legalSubfieldCode = ['allars', 'kauno', 'kauno/fin', 'kauno/swe', 'mts', 'mts/fin', 'mts/swe', 'slm', 'slm/fin', 'slm/swe', 'ysa', 'yso', 'yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'];
|
|
73
74
|
function stringFixVocabularySourceCode(value) {
|
|
74
75
|
// Try to remove spaces, change '//' to '/' and remove final '.' and '/':
|
|
75
|
-
const tmp = value.replace(/ /ug, '').replace(/\/+/ug, '/').replace(/(.)[./]$/gu, '$1') //
|
|
76
|
-
.replace(/^yso-(?:aika|paikat)\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...
|
|
76
|
+
const tmp = value.replace(/ /ug, '').replace(/\/+/ug, '/').replace(/(.)[./]$/gu, '$1').replace(/^yso-(?:aika|paikat)\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...
|
|
77
77
|
|
|
78
78
|
// NB! Use the modified value ONLY if the result (tmp variable) is a legal subfield code...
|
|
79
79
|
if (legalSubfieldCode.includes(tmp)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize-vocabulary-source-codes.js","names":["_utils","require","_clone","_interopRequireDefault","e","__esModule","default","_default","description","validate","fix","record","res","message","valid","relevantFields","getRelevantFields","forEach","f","fieldSanitizeVocabularySourceCode","field","validateField","length","fields","filter","subfields","tag","match","orig","fieldToString","normalizedField","clone","mod","push","fieldHasUnfixableVocabularySourceCode","sf","subfieldSanitizeVocabularySourceCode","subfield","code","value","stringFixVocabularySourceCode","legalSubfieldCode","tmp","replace","includes","some","subfieldHasUnfixableVocabularySourceCode","indexOf"],"sources":["../src/sanitize-vocabulary-source-codes.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport clone from 'clone';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);\n\n// Author(s): Nicholas Volk, Joni Ollila\nexport default function () {\n\n return {\n description: 'Validator for sanitizing vocabulary source codes in subfield $2 (MRA-532)',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n const relevantFields = getRelevantFields(record);\n relevantFields.forEach(f => fieldSanitizeVocabularySourceCode(f))
|
|
1
|
+
{"version":3,"file":"sanitize-vocabulary-source-codes.js","names":["_utils","require","_clone","_interopRequireDefault","e","__esModule","default","_default","description","validate","fix","record","res","message","valid","relevantFields","getRelevantFields","forEach","f","fieldSanitizeVocabularySourceCode","field","validateField","length","fields","filter","subfields","tag","match","orig","fieldToString","normalizedField","clone","mod","push","fieldHasUnfixableVocabularySourceCode","sf","subfieldSanitizeVocabularySourceCode","subfield","code","value","stringFixVocabularySourceCode","legalSubfieldCode","tmp","replace","includes","some","subfieldHasUnfixableVocabularySourceCode","indexOf"],"sources":["../src/sanitize-vocabulary-source-codes.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport clone from 'clone';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);\n\n// Author(s): Nicholas Volk, Joni Ollila\nexport default function () {\n\n return {\n description: 'Validator for sanitizing vocabulary source codes in subfield $2 (MRA-532)',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n const relevantFields = getRelevantFields(record);\n relevantFields.forEach(f => fieldSanitizeVocabularySourceCode(f)); // eslint-disable-line array-callback-return\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n const relevantFields = getRelevantFields(record);\n\n relevantFields.forEach(field => validateField(field, res)); // eslint-disable-line array-callback-return\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function getRelevantFields(record) {\n return record.fields.filter(f => f.subfields && f.tag.match(/^(?:6..|257|370|38.)$/u));\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = fieldSanitizeVocabularySourceCode(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`FIXABLE: '${orig}' => '${mod}'`);\n return;\n }\n // Handle illegal values here\n if (fieldHasUnfixableVocabularySourceCode(field)) {\n res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`);\n return;\n }\n return;\n }\n\n\n function fieldSanitizeVocabularySourceCode(field) {\n field.subfields.forEach(sf => subfieldSanitizeVocabularySourceCode(sf)); // eslint-disable-line array-callback-return\n return field;\n }\n\n function subfieldSanitizeVocabularySourceCode(subfield) {\n if (subfield.code !== '2') {\n return;\n }\n subfield.value = stringFixVocabularySourceCode(subfield.value);\n }\n\n}\n\n// Note that language suffix is optional\nconst legalSubfieldCode = ['allars', 'kauno', 'kauno/fin', 'kauno/swe', 'mts', 'mts/fin', 'mts/swe', 'slm', 'slm/fin', 'slm/swe', 'ysa', 'yso', 'yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'];\n\nfunction stringFixVocabularySourceCode(value) {\n // Try to remove spaces, change '//' to '/' and remove final '.' and '/':\n const tmp = value.replace(/ /ug, '')\n .replace(/\\/+/ug, '/')\n .replace(/(.)[./]$/gu, '$1')\n .replace(/^yso-(?:aika|paikat)\\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...\n\n // NB! Use the modified value ONLY if the result (tmp variable) is a legal subfield code...\n if (legalSubfieldCode.includes(tmp)) {\n return tmp;\n }\n\n return value;\n}\n\nfunction fieldHasUnfixableVocabularySourceCode(field) {\n return field.subfields.some(sf => subfieldHasUnfixableVocabularySourceCode(sf));\n}\n\nfunction subfieldHasUnfixableVocabularySourceCode(subfield) {\n if (subfield.code !== '2') {\n return false;\n }\n\n // As we can't fix this here, apply this yso-rule only when validating!\n if (subfield.value.indexOf('yso/') === 0) {\n return !['yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('slm/') === 0) {\n return !['slm/fin', 'slm/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('mts/') === 0) {\n return !['mts/fin', 'mts/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('kauno/') === 0) {\n return !['kauno/fin', 'kauno/swe'].includes(subfield.value);\n }\n\n return false;\n}\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AAA0B,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAF1B;;AAIA;;AAEA;AACe,SAAAG,SAAA,EAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,2EAA2E;IACxFC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEH,GAAG,EAAE,EAAE;MAAEI,KAAK,EAAE;IAAI,CAAC;IAC/C,MAAMC,cAAc,GAAGC,iBAAiB,CAACL,MAAM,CAAC;IAChDI,cAAc,CAACE,OAAO,CAACC,CAAC,IAAIC,iCAAiC,CAACD,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,OAAON,GAAG;EACZ;EAEA,SAASH,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE;IAAE,CAAC;IACzB,MAAME,cAAc,GAAGC,iBAAiB,CAACL,MAAM,CAAC;IAEhDI,cAAc,CAACE,OAAO,CAACG,KAAK,IAAIC,aAAa,CAACD,KAAK,EAAER,GAAG,CAAC,CAAC,CAAC,CAAC;;IAE5DA,GAAG,CAACE,KAAK,GAAG,EAAEF,GAAG,CAACC,OAAO,CAACS,MAAM,IAAI,CAAC,CAAC;IACtC,OAAOV,GAAG;EACZ;EAEA,SAASI,iBAAiBA,CAACL,MAAM,EAAE;IACjC,OAAOA,MAAM,CAACY,MAAM,CAACC,MAAM,CAACN,CAAC,IAAIA,CAAC,CAACO,SAAS,IAAIP,CAAC,CAACQ,GAAG,CAACC,KAAK,CAAC,wBAAwB,CAAC,CAAC;EACxF;EAEA,SAASN,aAAaA,CAACD,KAAK,EAAER,GAAG,EAAE;IACjC,MAAMgB,IAAI,GAAG,IAAAC,oBAAa,EAACT,KAAK,CAAC;IAEjC,MAAMU,eAAe,GAAGX,iCAAiC,CAAC,IAAAY,cAAK,EAACX,KAAK,CAAC,CAAC;IACvE,MAAMY,GAAG,GAAG,IAAAH,oBAAa,EAACC,eAAe,CAAC;IAC1C,IAAIF,IAAI,KAAKI,GAAG,EAAE;MAAE;MAClBpB,GAAG,CAACC,OAAO,CAACoB,IAAI,CAAC,aAAaL,IAAI,SAASI,GAAG,GAAG,CAAC;MAClD;IACF;IACA;IACA,IAAIE,qCAAqC,CAACd,KAAK,CAAC,EAAE;MAChDR,GAAG,CAACC,OAAO,CAACoB,IAAI,CAAC,kCAAkCL,IAAI,GAAG,CAAC;MAC3D;IACF;IACA;EACF;EAGA,SAAST,iCAAiCA,CAACC,KAAK,EAAE;IAChDA,KAAK,CAACK,SAAS,CAACR,OAAO,CAACkB,EAAE,IAAIC,oCAAoC,CAACD,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,OAAOf,KAAK;EACd;EAEA,SAASgB,oCAAoCA,CAACC,QAAQ,EAAE;IACtD,IAAIA,QAAQ,CAACC,IAAI,KAAK,GAAG,EAAE;MACzB;IACF;IACAD,QAAQ,CAACE,KAAK,GAAGC,6BAA6B,CAACH,QAAQ,CAACE,KAAK,CAAC;EAChE;AAEF;;AAEA;AACA,MAAME,iBAAiB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AAE3L,SAASD,6BAA6BA,CAACD,KAAK,EAAE;EAC5C;EACA,MAAMG,GAAG,GAAGH,KAAK,CAACI,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CACjCA,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CACrBA,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAC3BA,OAAO,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC,CAAC;;EAE/C;EACA,IAAIF,iBAAiB,CAACG,QAAQ,CAACF,GAAG,CAAC,EAAE;IACnC,OAAOA,GAAG;EACZ;EAEA,OAAOH,KAAK;AACd;AAEA,SAASL,qCAAqCA,CAACd,KAAK,EAAE;EACpD,OAAOA,KAAK,CAACK,SAAS,CAACoB,IAAI,CAACV,EAAE,IAAIW,wCAAwC,CAACX,EAAE,CAAC,CAAC;AACjF;AAEA,SAASW,wCAAwCA,CAACT,QAAQ,EAAE;EAC1D,IAAIA,QAAQ,CAACC,IAAI,KAAK,GAAG,EAAE;IACzB,OAAO,KAAK;EACd;;EAEA;EACA,IAAID,QAAQ,CAACE,KAAK,CAACQ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IACxC,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAACH,QAAQ,CAACP,QAAQ,CAACE,KAAK,CAAC;EAC/E;EAEA,IAAIF,QAAQ,CAACE,KAAK,CAACQ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IACxC,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAACH,QAAQ,CAACP,QAAQ,CAACE,KAAK,CAAC;EACzD;EAEA,IAAIF,QAAQ,CAACE,KAAK,CAACQ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IACxC,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAACH,QAAQ,CAACP,QAAQ,CAACE,KAAK,CAAC;EACzD;EAEA,IAAIF,QAAQ,CAACE,KAAK,CAACQ,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC1C,OAAO,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAACH,QAAQ,CAACP,QAAQ,CAACE,KAAK,CAAC;EAC7D;EAEA,OAAO,KAAK;AACd","ignoreList":[]}
|
package/dist/sort-tags.js
CHANGED
|
@@ -33,8 +33,8 @@ function sortPatternFields(record, tagPattern) {
|
|
|
33
33
|
const matchingTags = record.fields.map(field => tagPattern.some(pattern => pattern.test(field.tag)) ? field : null).filter(tag => tag);
|
|
34
34
|
const sortedArray = sortFields(record.fields);
|
|
35
35
|
const fixedArray = sortedArray.filter(field => !tagPattern.some(pattern => pattern.test(field.tag)));
|
|
36
|
-
fixedArray.splice(index(sortedArray, tagPattern), 0, ...matchingTags);
|
|
37
|
-
record.fields = fixedArray;
|
|
36
|
+
fixedArray.splice(index(sortedArray, tagPattern), 0, ...matchingTags);
|
|
37
|
+
record.fields = fixedArray;
|
|
38
38
|
}
|
|
39
39
|
function sortFields(fields) {
|
|
40
40
|
return [...fields].sort((a, b) => {
|
package/dist/sort-tags.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sort-tags.js","names":["_marcRecord","require","_default","tagPattern","description","validate","fix","record","sort","MarcRecord","isEqual","fields","valid","messages","sortPatternFields","sortFields","matchingTags","map","field","some","pattern","test","tag","filter","sortedArray","fixedArray","splice","index","a","b","findIndex"],"sources":["../src/sort-tags.js"],"sourcesContent":["import {MarcRecord} from '@natlibfi/marc-record';\n\nexport default function (tagPattern) {\n return {\n description:\n 'Handles field ordering',\n validate,\n fix: async record => ({\n fix: await sort(record, tagPattern)\n })\n };\n\n function validate(record, tagPattern) {\n return MarcRecord.isEqual(record.fields, sort(record.fields, tagPattern)) ? {valid: true, messages: []} : {valid: false, messages: ['Fields are in incorrect order']};\n }\n\n function sort(record, tagPattern) {\n if (tagPattern) {\n return sortPatternFields(record, tagPattern);\n }\n\n return sortFields(record);\n }\n}\n\nfunction sortPatternFields(record, tagPattern) {\n const matchingTags = record.fields.map(field => tagPattern.some(pattern => pattern.test(field.tag)) ? field : null).filter(tag => tag);\n const sortedArray = sortFields(record.fields);\n const fixedArray = sortedArray.filter(field => !tagPattern.some(pattern => pattern.test(field.tag)));\n fixedArray.splice(index(sortedArray, tagPattern), 0, ...matchingTags)
|
|
1
|
+
{"version":3,"file":"sort-tags.js","names":["_marcRecord","require","_default","tagPattern","description","validate","fix","record","sort","MarcRecord","isEqual","fields","valid","messages","sortPatternFields","sortFields","matchingTags","map","field","some","pattern","test","tag","filter","sortedArray","fixedArray","splice","index","a","b","findIndex"],"sources":["../src/sort-tags.js"],"sourcesContent":["import {MarcRecord} from '@natlibfi/marc-record';\n\nexport default function (tagPattern) {\n return {\n description:\n 'Handles field ordering',\n validate,\n fix: async record => ({\n fix: await sort(record, tagPattern)\n })\n };\n\n function validate(record, tagPattern) {\n return MarcRecord.isEqual(record.fields, sort(record.fields, tagPattern)) ? {valid: true, messages: []} : {valid: false, messages: ['Fields are in incorrect order']};\n }\n\n function sort(record, tagPattern) {\n if (tagPattern) {\n return sortPatternFields(record, tagPattern);\n }\n\n return sortFields(record);\n }\n}\n\nfunction sortPatternFields(record, tagPattern) {\n const matchingTags = record.fields.map(field => tagPattern.some(pattern => pattern.test(field.tag)) ? field : null).filter(tag => tag);\n const sortedArray = sortFields(record.fields);\n const fixedArray = sortedArray.filter(field => !tagPattern.some(pattern => pattern.test(field.tag)));\n fixedArray.splice(index(sortedArray, tagPattern), 0, ...matchingTags);\n record.fields = fixedArray;\n}\n\nfunction sortFields(fields) {\n return [...fields].sort((a, b) => {\n if (a.tag > b.tag) {\n return 1;\n }\n if (b.tag > a.tag) {\n return -1;\n }\n return 0;\n });\n}\n\nfunction index(fields, tagPattern) {\n return fields.findIndex(field => tagPattern.some(pattern => pattern.test(field.tag)));\n}\n"],"mappings":";;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAEe,SAAAC,SAAUC,UAAU,EAAE;EACnC,OAAO;IACLC,WAAW,EACT,wBAAwB;IAC1BC,QAAQ;IACRC,GAAG,EAAE,MAAMC,MAAM,KAAK;MACpBD,GAAG,EAAE,MAAME,IAAI,CAACD,MAAM,EAAEJ,UAAU;IACpC,CAAC;EACH,CAAC;EAED,SAASE,QAAQA,CAACE,MAAM,EAAEJ,UAAU,EAAE;IACpC,OAAOM,sBAAU,CAACC,OAAO,CAACH,MAAM,CAACI,MAAM,EAAEH,IAAI,CAACD,MAAM,CAACI,MAAM,EAAER,UAAU,CAAC,CAAC,GAAG;MAACS,KAAK,EAAE,IAAI;MAAEC,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACD,KAAK,EAAE,KAAK;MAAEC,QAAQ,EAAE,CAAC,+BAA+B;IAAC,CAAC;EACvK;EAEA,SAASL,IAAIA,CAACD,MAAM,EAAEJ,UAAU,EAAE;IAChC,IAAIA,UAAU,EAAE;MACd,OAAOW,iBAAiB,CAACP,MAAM,EAAEJ,UAAU,CAAC;IAC9C;IAEA,OAAOY,UAAU,CAACR,MAAM,CAAC;EAC3B;AACF;AAEA,SAASO,iBAAiBA,CAACP,MAAM,EAAEJ,UAAU,EAAE;EAC7C,MAAMa,YAAY,GAAGT,MAAM,CAACI,MAAM,CAACM,GAAG,CAACC,KAAK,IAAIf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,GAAGJ,KAAK,GAAG,IAAI,CAAC,CAACK,MAAM,CAACD,GAAG,IAAIA,GAAG,CAAC;EACtI,MAAME,WAAW,GAAGT,UAAU,CAACR,MAAM,CAACI,MAAM,CAAC;EAC7C,MAAMc,UAAU,GAAGD,WAAW,CAACD,MAAM,CAACL,KAAK,IAAI,CAACf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,CAAC;EACpGG,UAAU,CAACC,MAAM,CAACC,KAAK,CAACH,WAAW,EAAErB,UAAU,CAAC,EAAE,CAAC,EAAE,GAAGa,YAAY,CAAC;EACrET,MAAM,CAACI,MAAM,GAAGc,UAAU;AAC5B;AAEA,SAASV,UAAUA,CAACJ,MAAM,EAAE;EAC1B,OAAO,CAAC,GAAGA,MAAM,CAAC,CAACH,IAAI,CAAC,CAACoB,CAAC,EAAEC,CAAC,KAAK;IAChC,IAAID,CAAC,CAACN,GAAG,GAAGO,CAAC,CAACP,GAAG,EAAE;MACjB,OAAO,CAAC;IACV;IACA,IAAIO,CAAC,CAACP,GAAG,GAAGM,CAAC,CAACN,GAAG,EAAE;MACjB,OAAO,CAAC,CAAC;IACX;IACA,OAAO,CAAC;EACV,CAAC,CAAC;AACJ;AAEA,SAASK,KAAKA,CAAChB,MAAM,EAAER,UAAU,EAAE;EACjC,OAAOQ,MAAM,CAACmB,SAAS,CAACZ,KAAK,IAAIf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,CAAC;AACvF","ignoreList":[]}
|
package/dist/sortFields.js
CHANGED
|
@@ -33,8 +33,7 @@ function _default() {
|
|
|
33
33
|
fix: [],
|
|
34
34
|
valid: true
|
|
35
35
|
};
|
|
36
|
-
record.fields.sort(fieldOrderComparator);
|
|
37
|
-
|
|
36
|
+
record.fields.sort(fieldOrderComparator);
|
|
38
37
|
return res;
|
|
39
38
|
}
|
|
40
39
|
function validate(record) {
|
|
@@ -42,14 +41,12 @@ function _default() {
|
|
|
42
41
|
message: []
|
|
43
42
|
};
|
|
44
43
|
const fields = record.fields.map(f => (0, _clone.default)(f));
|
|
45
|
-
fields.sort(fieldOrderComparator);
|
|
46
|
-
|
|
44
|
+
fields.sort(fieldOrderComparator);
|
|
47
45
|
const relocatedFields = fields.filter((f, i) => (0, _utils.fieldToString)(f) !== (0, _utils.fieldToString)(record.fields[i]));
|
|
48
46
|
if (relocatedFields.length > 0) {
|
|
49
|
-
|
|
50
|
-
res.message.push(`${relocatedFields.length} field(s) in new places`); // eslint-disable-line functional/immutable-data
|
|
47
|
+
res.message.push(`${relocatedFields.length} field(s) in new places`);
|
|
51
48
|
}
|
|
52
|
-
res.valid = !(res.message.length >= 1);
|
|
49
|
+
res.valid = !(res.message.length >= 1);
|
|
53
50
|
return res;
|
|
54
51
|
}
|
|
55
52
|
}
|
|
@@ -239,8 +236,6 @@ function fieldOrderComparator(fieldA, fieldB) {
|
|
|
239
236
|
return (0, _marcFieldSort.fieldOrderComparator)(fieldA, fieldB, sorterFunctions);
|
|
240
237
|
}
|
|
241
238
|
function sortByIndexTerms(fieldA, fieldB) {
|
|
242
|
-
// eslint-disable-line complexity, max-statements
|
|
243
|
-
|
|
244
239
|
const indexTermFields = ['600', '610', '611', '630', '648', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', '662'];
|
|
245
240
|
function scoreInd2(val) {
|
|
246
241
|
const ind2Score = {
|
package/dist/sortFields.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sortFields.js","names":["_clone","_interopRequireDefault","require","_utils","_marcFieldSort","_subfield8Utils","_subfield6Utils","e","__esModule","default","BIG_BAD_NUMBER","_default","description","validate","fix","record","res","message","valid","fields","sort","fieldOrderComparator","map","f","clone","relocatedFields","filter","i","fieldToString","length","push","relatorTermScore","relatorTermScoreBk","relatorTermScoreMu","relatorTermScoreVm","normalizeValue","value","replace","scoreRelatorTermBk","normalizedValue","scoreRelatorTermMu","scoreRelatorTermVm","scoreRelatorTerm","typeOfMaterial","undefined","fieldA","fieldB","sorterFunctions","sortByTag","sortByIndexTerms","sortAlphabetically","sortByRelatorTerm","sortBySubfield6","preferFenniKeep","sortByFieldLinkAndSequenceNumber","globalFieldOrderComparator","indexTermFields","scoreInd2","val","ind2Score","tag","includes","ind2","scoreDictionary","dictionary","dictionarySortIndex","dictionaryA","selectFirstValue","dictionaryB","dictScoreA","dictScoreB","preferKeep","keepOwner","hasKeepA","fieldHasSubfield","hasKeepB","fenniPreference","violaPreference","fieldGetMaxRelatorTermScore","field","subfields","relatorSubfieldCode","sf","code","scores","Math","max","scoreA","scoreB","fieldGetMinLinkAndSequenceNumber","relevantSubfields","isValidSubfield8","parseFloat","min","compareLinkingTags","tagStringA","fieldGetUnambiguousTag","tagStringB","compareOccurrenceNumbers","stringA","fieldGetUnambiguousOccurrenceNumber","stringB","parseInt","linkingTagComparisonResult","subcode","subfield","slice"],"sources":["../src/sortFields.js"],"sourcesContent":["// Taken from project marc-record-js, file marcSortFields.js as this contains more and more Melinda-specific rules.\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString} from './utils';\nimport {sortByTag, sortAlphabetically, fieldOrderComparator as globalFieldOrderComparator} from '@natlibfi/marc-record/dist/marcFieldSort';\nimport {isValidSubfield8} from './subfield8Utils';\nimport {fieldGetUnambiguousOccurrenceNumber, fieldGetUnambiguousTag} from './subfield6Utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortFields');\n//const debugData = debug.extend('data');\n//const debugDev = debug.extend('dev');\n\nconst BIG_BAD_NUMBER = 999999999;\nexport default function () {\n\n return {\n description: 'Sort fields using both generic and Melinda specific rules',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const fields = record.fields.map(f => clone(f));\n fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n\n const relocatedFields = fields.filter((f, i) => fieldToString(f) !== fieldToString(record.fields[i]));\n\n if (relocatedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${relocatedFields.length} field(s) in new places`); // 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\nconst relatorTermScore = { // Here bigger is better\n // NB! This is exportable as field internal $e sorting in marc-record-validators-js uses this.\n // NB! The more abstract, the earlier it appears.\n // Note that terms with same abstraction level might also have order preferences\n // We should 1) check the order of these, and 2) add translations (support Swedish at the very least)\n // work/teos > expression/ekspressio > manifestation/manifestaatin,\n // Work https://finto.fi/mts/fi/page/m1298\n 'säveltäjä': 100, 'composer': 100,\n 'kirjoittaja': 100, 'author': 100,\n 'libretisti': 100,\n 'sarjakuvantekijä': 100, 'soitonoppaan tekijä': 100,\n 'kartantekijä': 99,\n 'taiteilija': 98,\n 'designer': 90,\n 'sanoittaja': 90,\n 'käsikirjoittaja': 90,\n\n 'kuvaaja': 89, 'valokuvaaja': 89,\n 'kokoaja': 86,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'julkaisija': 82,\n 'tuottaja': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79, 'arranger': 79,\n 'toimittaja': 78, 'editor': 78,\n 'kuvittaja': 77,\n 'esipuheen kirjoittaja': 76,\n 'alkusanojen kirjoittaja': 75, 'loppusanojen kirjoittaja': 75,\n\n 'esittäjä': 74,\n 'johtaja': 73, // orkesterinjohtaja\n 'editointi': 71, // for music, editor/toimittaja is another thing\n 'kääntäjä': 70,\n 'lukija': 61, 'kertoja': 61,\n // Manifestation level: https://finto.fi/mts/fi/page/m491\n 'graafinen suunnittelija': 50,\n 'kustantaja': 41\n // Item level: https://finto.fi/mts/fi/page/m1157\n};\n\nconst relatorTermScoreBk = {\n // https://finto.fi/mts/fi/page/m34 100-81\n 'libretisti': 100, 'sarjakuvantekijä': 100,\n 'kirjoittaja': 99, 'author': 99, 'soitonoppaan tekijä': 99,\n 'kuvaaja': 98, 'valokuvaaja': 98,\n 'kokoaja': 86, 'designer': 86,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'säveltäjä': 83, // if 300$e has CD etc\n 'sanoittaja': 82,\n 'julkaisija': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'toimittaja': 78,\n 'kuvittaja': 77,\n 'esipuheen kirjoittaja': 76,\n 'alkusanojen kirjoittaja': 75, 'loppusanojen kirjoittaja': 75,\n 'kääntäjä': 70,\n 'sovittaja': 50,\n // manifestaatio\n 'graafinen suunnittelija': 40,\n // kappale/item\n 'sitoja': 25,\n 'gratulaation kirjoittaja': 24\n};\n\nconst relatorTermScoreMu = {\n 'säveltäjä': 100,\n 'sanoittaja': 99,\n 'soitonoppaan tekijä': 98,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75,\n // manifestaatio\n 'esittäjä (manifestaatio)': 69,\n\n 'graafinen suunnittelija': 50,\n 'valmistaja': 41,\n 'jakaja': 40\n // kappale/item\n\n};\n\nconst relatorTermScoreVm = { // Visual Material\n // Work\n 'ohjaaja': 100,\n 'kirjoittaja': 99, 'author': 99, // Here we assume that film/whatever is based on author's book\n 'käsikirjoittaja': 98, 'designer': 98,\n 'kuvaaja': 89,\n 'säveltäjä': 86, // Volatile. John Williams?\n 'alkuperäisidean luoja': 85,\n 'julkaisija': 82,\n 'tuottaja': 81,\n // Expression\n 'leikkaaja': 80,\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75,\n 'kääntäjä': 70,\n // Manifestation\n 'kaivertaja': 60,\n 'graafinen suunnittelija': 59,\n 'kustantaja': 42,\n 'elokuvan jakelija': 41, 'jakaja': 41\n\n // Item\n};\n\nfunction normalizeValue(value) {\n // Removing last punc char is good enough for our purposes.\n // We don't handle abbreviations here etc.\n // Brackets should not happen either, should they?\n return value.replace(/[.,]$/u, '');\n}\n\nfunction scoreRelatorTermBk(normalizedValue) {\n if (normalizedValue in relatorTermScoreBk) {\n return relatorTermScoreBk[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermMu(normalizedValue) {\n if (normalizedValue in relatorTermScoreMu) {\n return relatorTermScoreMu[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermVm(normalizedValue) {\n if (normalizedValue in relatorTermScoreVm) {\n return relatorTermScoreVm[normalizedValue];\n }\n return 0;\n}\n\nexport function scoreRelatorTerm(value, typeOfMaterial = undefined) {\n // NB! We are currently using type of material only for sorting relator terms, not 7XX fields!!!\n const normalizedValue = normalizeValue(value);\n if (typeOfMaterial === 'BK') { // Books\n return scoreRelatorTermBk(normalizedValue);\n }\n if (typeOfMaterial === 'MU') { // Music (NB: audio books should be BK in this context!)\n return scoreRelatorTermMu(normalizedValue);\n }\n if (typeOfMaterial === 'VM') { // video material\n return scoreRelatorTermVm(normalizedValue);\n }\n if (normalizedValue in relatorTermScore) {\n return relatorTermScore[normalizedValue];\n }\n return 0;\n}\n\nexport function fieldOrderComparator(fieldA, fieldB) {\n\n //const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortBySubfield6, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n //const sorterFunctions = [sortByIndexTerms, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n return globalFieldOrderComparator(fieldA, fieldB, sorterFunctions);\n}\n\nfunction sortByIndexTerms(fieldA, fieldB) { // eslint-disable-line complexity, max-statements\n\n const indexTermFields = ['600', '610', '611', '630', '648', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', '662'];\n\n function scoreInd2(val) {\n const ind2Score = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 8, '5': 5, '6': 6, '7': 7};\n\n if (val in ind2Score) {\n return ind2Score[val];\n }\n return 9;\n }\n\n // ATM this is not needed.\n // You may need this, if you change compare function order in sorterFunctions\n // istanbul ignore next\n if (fieldA.tag !== fieldB.tag) {\n return 0;\n }\n\n if (!indexTermFields.includes(fieldA.tag)) {\n return 0;\n }\n\n // Puts ind2=4 last\n if (scoreInd2(fieldA.ind2) > scoreInd2(fieldB.ind2)) {\n return 1;\n }\n if (scoreInd2(fieldA.ind2) < scoreInd2(fieldB.ind2)) {\n return -1;\n }\n\n function scoreDictionary(dictionary) {\n const dictionarySortIndex = {\n 'yso/fin': 0,\n 'yso/swe': 1,\n 'yso/eng': 2,\n 'slm/fin': 0.1,\n 'slm/swe': 1.1,\n 'kauno/fin': 2.1,\n 'kauno/swe': 2.2,\n 'kaunokki': 4,\n 'bella': 5\n };\n\n if (dictionary in dictionarySortIndex) {\n return dictionarySortIndex[dictionary];\n }\n return BIG_BAD_NUMBER;\n }\n\n const dictionaryA = selectFirstValue(fieldA, '2');\n const dictionaryB = selectFirstValue(fieldB, '2');\n\n const dictScoreA = scoreDictionary(dictionaryA);\n const dictScoreB = scoreDictionary(dictionaryB);\n // Use priority order for listed dictionaries:\n if (dictScoreA > dictScoreB) {\n return 1;\n }\n if (dictScoreA < dictScoreB) {\n return -1;\n }\n // Unlisted dictionaries: sort $2 value alphabetically:\n //if (dictScoreA === BIG_BAD_NUMBER) {\n if (dictionaryA > dictionaryB) {\n return 1;\n }\n if (dictionaryA < dictionaryB) {\n return -1;\n }\n //}\n return 0;\n}\n\n\nfunction preferKeep(fieldA, fieldB, keepOwner = 'FENNI') {\n const hasKeepA = fieldHasSubfield(fieldA, '9', `${keepOwner}<KEEP>`);\n const hasKeepB = fieldHasSubfield(fieldB, '9', `${keepOwner}<KEEP>`);\n\n if (hasKeepA && !hasKeepB) {\n return -1;\n }\n if (!hasKeepA && hasKeepB) {\n return 1;\n }\n\n return 0;\n}\n\n\nfunction preferFenniKeep(fieldA, fieldB) {\n const fenniPreference = preferKeep(fieldA, fieldB, 'FENNI');\n if (fenniPreference !== 0) {\n return fenniPreference;\n }\n const violaPreference = preferKeep(fieldA, fieldB, 'VIOLA');\n if (violaPreference !== 0) {\n return violaPreference;\n }\n return preferKeep(fieldA, fieldB, 'FIKKA');\n}\n\nfunction sortByRelatorTerm(fieldA, fieldB) {\n //if (!['600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'].includes(fieldA.tag)) {\n if (!['700', '710', '711', '730'].includes(fieldA.tag)) {\n return 0;\n }\n\n function fieldGetMaxRelatorTermScore(field) {\n if (!field.subfields) {\n return -2;\n }\n // If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...\n if (fieldHasSubfield(field, 't')) {\n return -2;\n }\n const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';\n const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);\n if (e.length === 0) { // No $e is still better than having a $t\n return -1;\n }\n const scores = e.map(sf => scoreRelatorTerm(sf.value));\n //debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);\n return Math.max(...scores);\n }\n\n const scoreA = fieldGetMaxRelatorTermScore(fieldA);\n const scoreB = fieldGetMaxRelatorTermScore(fieldB);\n\n if (scoreA < scoreB) {\n return 1;\n }\n if (scoreA > scoreB) {\n return -1;\n }\n return 0;\n}\n\n\nfunction fieldGetMinLinkAndSequenceNumber(field) {\n if (!field.subfields) {\n return BIG_BAD_NUMBER;\n }\n const relevantSubfields = field.subfields.filter(sf => isValidSubfield8(sf));\n // If val is something like \"1.2\\x\" parseFloat() would give a syntax erro because of hex-like escape sequnce (at least on Chrome). Thus remove tail:\n const scores = relevantSubfields.map(sf => parseFloat(sf.value.replace(/\\\\.*$/u, '')));\n if (scores.length === 0) {\n return BIG_BAD_NUMBER;\n }\n return Math.min(...scores);\n}\n\nfunction sortByFieldLinkAndSequenceNumber(fieldA, fieldB) { // Sort by subfield $8 that is...\n const scoreA = fieldGetMinLinkAndSequenceNumber(fieldA);\n const scoreB = fieldGetMinLinkAndSequenceNumber(fieldB);\n //debugDev(` sf-8-A-score for '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(` sf-8-B-score for '${fieldToString(fieldB)}: ${scoreB}`);\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return 1;\n }\n if (scoreA === 0) {\n return -1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction sortBySubfield6(fieldA, fieldB) { // Sort by subfield $6, ex-sortByOccurrenceNumber...\n if (fieldA.tag !== '880' || fieldB.tag !== '880') {\n return 0;\n }\n\n function compareLinkingTags() {\n const tagStringA = fieldGetUnambiguousTag(fieldA);\n const tagStringB = fieldGetUnambiguousTag(fieldB);\n if (tagStringA === tagStringB || !tagStringA || !tagStringB) {\n return 0;\n }\n if (tagStringA > tagStringB) {\n return 1;\n }\n return -1;\n }\n\n function compareOccurrenceNumbers() {\n const stringA = fieldGetUnambiguousOccurrenceNumber(fieldA);\n const stringB = fieldGetUnambiguousOccurrenceNumber(fieldB);\n if (stringA === stringB) { // No action required here\n return 0;\n }\n\n // Handle expections: no occurrence number, occurrence number '00':\n if (!stringB || stringB === '00') {\n if (!stringA || stringA === '00') {\n return 0;\n }\n return -1;\n }\n if (!stringA || stringA === '00') {\n return 1;\n }\n\n // NB! We need compare ints as occurrence number can exceed 99 and be a three-digit value!\n const scoreA = parseInt(stringA, 10);\n const scoreB = parseInt(stringB, 10);\n\n if (scoreA > scoreB) { // smaller is better, thus '00' is the best\n return 1;\n }\n return -1;\n }\n\n const linkingTagComparisonResult = compareLinkingTags();\n if (linkingTagComparisonResult !== 0) {\n return linkingTagComparisonResult;\n }\n\n return compareOccurrenceNumbers();\n}\n\n\nfunction selectFirstValue(field, subcode) {\n return field.subfields\n .filter(subfield => subcode === subfield.code)\n .map(subfield => subfield.value)\n .slice(0, 1);\n}\n\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"sortFields.js","names":["_clone","_interopRequireDefault","require","_utils","_marcFieldSort","_subfield8Utils","_subfield6Utils","e","__esModule","default","BIG_BAD_NUMBER","_default","description","validate","fix","record","res","message","valid","fields","sort","fieldOrderComparator","map","f","clone","relocatedFields","filter","i","fieldToString","length","push","relatorTermScore","relatorTermScoreBk","relatorTermScoreMu","relatorTermScoreVm","normalizeValue","value","replace","scoreRelatorTermBk","normalizedValue","scoreRelatorTermMu","scoreRelatorTermVm","scoreRelatorTerm","typeOfMaterial","undefined","fieldA","fieldB","sorterFunctions","sortByTag","sortByIndexTerms","sortAlphabetically","sortByRelatorTerm","sortBySubfield6","preferFenniKeep","sortByFieldLinkAndSequenceNumber","globalFieldOrderComparator","indexTermFields","scoreInd2","val","ind2Score","tag","includes","ind2","scoreDictionary","dictionary","dictionarySortIndex","dictionaryA","selectFirstValue","dictionaryB","dictScoreA","dictScoreB","preferKeep","keepOwner","hasKeepA","fieldHasSubfield","hasKeepB","fenniPreference","violaPreference","fieldGetMaxRelatorTermScore","field","subfields","relatorSubfieldCode","sf","code","scores","Math","max","scoreA","scoreB","fieldGetMinLinkAndSequenceNumber","relevantSubfields","isValidSubfield8","parseFloat","min","compareLinkingTags","tagStringA","fieldGetUnambiguousTag","tagStringB","compareOccurrenceNumbers","stringA","fieldGetUnambiguousOccurrenceNumber","stringB","parseInt","linkingTagComparisonResult","subcode","subfield","slice"],"sources":["../src/sortFields.js"],"sourcesContent":["// Taken from project marc-record-js, file marcSortFields.js as this contains more and more Melinda-specific rules.\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString} from './utils';\nimport {sortByTag, sortAlphabetically, fieldOrderComparator as globalFieldOrderComparator} from '@natlibfi/marc-record/dist/marcFieldSort';\nimport {isValidSubfield8} from './subfield8Utils';\nimport {fieldGetUnambiguousOccurrenceNumber, fieldGetUnambiguousTag} from './subfield6Utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortFields');\n//const debugData = debug.extend('data');\n//const debugDev = debug.extend('dev');\n\nconst BIG_BAD_NUMBER = 999999999;\nexport default function () {\n\n return {\n description: 'Sort fields using both generic and Melinda specific rules',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.sort(fieldOrderComparator);\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const fields = record.fields.map(f => clone(f));\n fields.sort(fieldOrderComparator);\n\n\n const relocatedFields = fields.filter((f, i) => fieldToString(f) !== fieldToString(record.fields[i]));\n\n if (relocatedFields.length > 0) {\n res.message.push(`${relocatedFields.length} field(s) in new places`);\n }\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\n\nconst relatorTermScore = { // Here bigger is better\n // NB! This is exportable as field internal $e sorting in marc-record-validators-js uses this.\n // NB! The more abstract, the earlier it appears.\n // Note that terms with same abstraction level might also have order preferences\n // We should 1) check the order of these, and 2) add translations (support Swedish at the very least)\n // work/teos > expression/ekspressio > manifestation/manifestaatin,\n // Work https://finto.fi/mts/fi/page/m1298\n 'säveltäjä': 100, 'composer': 100,\n 'kirjoittaja': 100, 'author': 100,\n 'libretisti': 100,\n 'sarjakuvantekijä': 100, 'soitonoppaan tekijä': 100,\n 'kartantekijä': 99,\n 'taiteilija': 98,\n 'designer': 90,\n 'sanoittaja': 90,\n 'käsikirjoittaja': 90,\n\n 'kuvaaja': 89, 'valokuvaaja': 89,\n 'kokoaja': 86,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'julkaisija': 82,\n 'tuottaja': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79, 'arranger': 79,\n 'toimittaja': 78, 'editor': 78,\n 'kuvittaja': 77,\n 'esipuheen kirjoittaja': 76,\n 'alkusanojen kirjoittaja': 75, 'loppusanojen kirjoittaja': 75,\n\n 'esittäjä': 74,\n 'johtaja': 73, // orkesterinjohtaja\n 'editointi': 71, // for music, editor/toimittaja is another thing\n 'kääntäjä': 70,\n 'lukija': 61, 'kertoja': 61,\n // Manifestation level: https://finto.fi/mts/fi/page/m491\n 'graafinen suunnittelija': 50,\n 'kustantaja': 41\n // Item level: https://finto.fi/mts/fi/page/m1157\n};\n\nconst relatorTermScoreBk = {\n // https://finto.fi/mts/fi/page/m34 100-81\n 'libretisti': 100, 'sarjakuvantekijä': 100,\n 'kirjoittaja': 99, 'author': 99, 'soitonoppaan tekijä': 99,\n 'kuvaaja': 98, 'valokuvaaja': 98,\n 'kokoaja': 86, 'designer': 86,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'säveltäjä': 83, // if 300$e has CD etc\n 'sanoittaja': 82,\n 'julkaisija': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'toimittaja': 78,\n 'kuvittaja': 77,\n 'esipuheen kirjoittaja': 76,\n 'alkusanojen kirjoittaja': 75, 'loppusanojen kirjoittaja': 75,\n 'kääntäjä': 70,\n 'sovittaja': 50,\n // manifestaatio\n 'graafinen suunnittelija': 40,\n // kappale/item\n 'sitoja': 25,\n 'gratulaation kirjoittaja': 24\n};\n\nconst relatorTermScoreMu = {\n 'säveltäjä': 100,\n 'sanoittaja': 99,\n 'soitonoppaan tekijä': 98,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75,\n // manifestaatio\n 'esittäjä (manifestaatio)': 69,\n\n 'graafinen suunnittelija': 50,\n 'valmistaja': 41,\n 'jakaja': 40\n // kappale/item\n\n};\n\nconst relatorTermScoreVm = { // Visual Material\n // Work\n 'ohjaaja': 100,\n 'kirjoittaja': 99, 'author': 99, // Here we assume that film/whatever is based on author's book\n 'käsikirjoittaja': 98, 'designer': 98,\n 'kuvaaja': 89,\n 'säveltäjä': 86, // Volatile. John Williams?\n 'alkuperäisidean luoja': 85,\n 'julkaisija': 82,\n 'tuottaja': 81,\n // Expression\n 'leikkaaja': 80,\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75,\n 'kääntäjä': 70,\n // Manifestation\n 'kaivertaja': 60,\n 'graafinen suunnittelija': 59,\n 'kustantaja': 42,\n 'elokuvan jakelija': 41, 'jakaja': 41\n\n // Item\n};\n\nfunction normalizeValue(value) {\n // Removing last punc char is good enough for our purposes.\n // We don't handle abbreviations here etc.\n // Brackets should not happen either, should they?\n return value.replace(/[.,]$/u, '');\n}\n\nfunction scoreRelatorTermBk(normalizedValue) {\n if (normalizedValue in relatorTermScoreBk) {\n return relatorTermScoreBk[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermMu(normalizedValue) {\n if (normalizedValue in relatorTermScoreMu) {\n return relatorTermScoreMu[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermVm(normalizedValue) {\n if (normalizedValue in relatorTermScoreVm) {\n return relatorTermScoreVm[normalizedValue];\n }\n return 0;\n}\n\nexport function scoreRelatorTerm(value, typeOfMaterial = undefined) {\n // NB! We are currently using type of material only for sorting relator terms, not 7XX fields!!!\n const normalizedValue = normalizeValue(value);\n if (typeOfMaterial === 'BK') { // Books\n return scoreRelatorTermBk(normalizedValue);\n }\n if (typeOfMaterial === 'MU') { // Music (NB: audio books should be BK in this context!)\n return scoreRelatorTermMu(normalizedValue);\n }\n if (typeOfMaterial === 'VM') { // video material\n return scoreRelatorTermVm(normalizedValue);\n }\n if (normalizedValue in relatorTermScore) {\n return relatorTermScore[normalizedValue];\n }\n return 0;\n}\n\nexport function fieldOrderComparator(fieldA, fieldB) {\n\n //const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortBySubfield6, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n //const sorterFunctions = [sortByIndexTerms, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n return globalFieldOrderComparator(fieldA, fieldB, sorterFunctions);\n}\n\nfunction sortByIndexTerms(fieldA, fieldB) {\n\n const indexTermFields = ['600', '610', '611', '630', '648', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', '662'];\n\n function scoreInd2(val) {\n const ind2Score = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 8, '5': 5, '6': 6, '7': 7};\n\n if (val in ind2Score) {\n return ind2Score[val];\n }\n return 9;\n }\n\n // ATM this is not needed.\n // You may need this, if you change compare function order in sorterFunctions\n // istanbul ignore next\n if (fieldA.tag !== fieldB.tag) {\n return 0;\n }\n\n if (!indexTermFields.includes(fieldA.tag)) {\n return 0;\n }\n\n // Puts ind2=4 last\n if (scoreInd2(fieldA.ind2) > scoreInd2(fieldB.ind2)) {\n return 1;\n }\n if (scoreInd2(fieldA.ind2) < scoreInd2(fieldB.ind2)) {\n return -1;\n }\n\n function scoreDictionary(dictionary) {\n const dictionarySortIndex = {\n 'yso/fin': 0,\n 'yso/swe': 1,\n 'yso/eng': 2,\n 'slm/fin': 0.1,\n 'slm/swe': 1.1,\n 'kauno/fin': 2.1,\n 'kauno/swe': 2.2,\n 'kaunokki': 4,\n 'bella': 5\n };\n\n if (dictionary in dictionarySortIndex) {\n return dictionarySortIndex[dictionary];\n }\n return BIG_BAD_NUMBER;\n }\n\n const dictionaryA = selectFirstValue(fieldA, '2');\n const dictionaryB = selectFirstValue(fieldB, '2');\n\n const dictScoreA = scoreDictionary(dictionaryA);\n const dictScoreB = scoreDictionary(dictionaryB);\n // Use priority order for listed dictionaries:\n if (dictScoreA > dictScoreB) {\n return 1;\n }\n if (dictScoreA < dictScoreB) {\n return -1;\n }\n // Unlisted dictionaries: sort $2 value alphabetically:\n //if (dictScoreA === BIG_BAD_NUMBER) {\n if (dictionaryA > dictionaryB) {\n return 1;\n }\n if (dictionaryA < dictionaryB) {\n return -1;\n }\n //}\n return 0;\n}\n\n\nfunction preferKeep(fieldA, fieldB, keepOwner = 'FENNI') {\n const hasKeepA = fieldHasSubfield(fieldA, '9', `${keepOwner}<KEEP>`);\n const hasKeepB = fieldHasSubfield(fieldB, '9', `${keepOwner}<KEEP>`);\n\n if (hasKeepA && !hasKeepB) {\n return -1;\n }\n if (!hasKeepA && hasKeepB) {\n return 1;\n }\n\n return 0;\n}\n\n\nfunction preferFenniKeep(fieldA, fieldB) {\n const fenniPreference = preferKeep(fieldA, fieldB, 'FENNI');\n if (fenniPreference !== 0) {\n return fenniPreference;\n }\n const violaPreference = preferKeep(fieldA, fieldB, 'VIOLA');\n if (violaPreference !== 0) {\n return violaPreference;\n }\n return preferKeep(fieldA, fieldB, 'FIKKA');\n}\n\nfunction sortByRelatorTerm(fieldA, fieldB) {\n //if (!['600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'].includes(fieldA.tag)) {\n if (!['700', '710', '711', '730'].includes(fieldA.tag)) {\n return 0;\n }\n\n function fieldGetMaxRelatorTermScore(field) {\n if (!field.subfields) {\n return -2;\n }\n // If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...\n if (fieldHasSubfield(field, 't')) {\n return -2;\n }\n const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';\n const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);\n if (e.length === 0) { // No $e is still better than having a $t\n return -1;\n }\n const scores = e.map(sf => scoreRelatorTerm(sf.value));\n //debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);\n return Math.max(...scores);\n }\n\n const scoreA = fieldGetMaxRelatorTermScore(fieldA);\n const scoreB = fieldGetMaxRelatorTermScore(fieldB);\n\n if (scoreA < scoreB) {\n return 1;\n }\n if (scoreA > scoreB) {\n return -1;\n }\n return 0;\n}\n\n\nfunction fieldGetMinLinkAndSequenceNumber(field) {\n if (!field.subfields) {\n return BIG_BAD_NUMBER;\n }\n const relevantSubfields = field.subfields.filter(sf => isValidSubfield8(sf));\n // If val is something like \"1.2\\x\" parseFloat() would give a syntax erro because of hex-like escape sequnce (at least on Chrome). Thus remove tail:\n const scores = relevantSubfields.map(sf => parseFloat(sf.value.replace(/\\\\.*$/u, '')));\n if (scores.length === 0) {\n return BIG_BAD_NUMBER;\n }\n return Math.min(...scores);\n}\n\nfunction sortByFieldLinkAndSequenceNumber(fieldA, fieldB) { // Sort by subfield $8 that is...\n const scoreA = fieldGetMinLinkAndSequenceNumber(fieldA);\n const scoreB = fieldGetMinLinkAndSequenceNumber(fieldB);\n //debugDev(` sf-8-A-score for '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(` sf-8-B-score for '${fieldToString(fieldB)}: ${scoreB}`);\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return 1;\n }\n if (scoreA === 0) {\n return -1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction sortBySubfield6(fieldA, fieldB) { // Sort by subfield $6, ex-sortByOccurrenceNumber...\n if (fieldA.tag !== '880' || fieldB.tag !== '880') {\n return 0;\n }\n\n function compareLinkingTags() {\n const tagStringA = fieldGetUnambiguousTag(fieldA);\n const tagStringB = fieldGetUnambiguousTag(fieldB);\n if (tagStringA === tagStringB || !tagStringA || !tagStringB) {\n return 0;\n }\n if (tagStringA > tagStringB) {\n return 1;\n }\n return -1;\n }\n\n function compareOccurrenceNumbers() {\n const stringA = fieldGetUnambiguousOccurrenceNumber(fieldA);\n const stringB = fieldGetUnambiguousOccurrenceNumber(fieldB);\n if (stringA === stringB) { // No action required here\n return 0;\n }\n\n // Handle expections: no occurrence number, occurrence number '00':\n if (!stringB || stringB === '00') {\n if (!stringA || stringA === '00') {\n return 0;\n }\n return -1;\n }\n if (!stringA || stringA === '00') {\n return 1;\n }\n\n // NB! We need compare ints as occurrence number can exceed 99 and be a three-digit value!\n const scoreA = parseInt(stringA, 10);\n const scoreB = parseInt(stringB, 10);\n\n if (scoreA > scoreB) { // smaller is better, thus '00' is the best\n return 1;\n }\n return -1;\n }\n\n const linkingTagComparisonResult = compareLinkingTags();\n if (linkingTagComparisonResult !== 0) {\n return linkingTagComparisonResult;\n }\n\n return compareOccurrenceNumbers();\n}\n\n\nfunction selectFirstValue(field, subcode) {\n return field.subfields\n .filter(subfield => subcode === subfield.code)\n .map(subfield => subfield.value)\n .slice(0, 1);\n}\n\n"],"mappings":"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","ignoreList":[]}
|
package/dist/sortRelatorTerms.js
CHANGED
|
@@ -50,11 +50,10 @@ function _default() {
|
|
|
50
50
|
const clonedFieldAsString = (0, _utils.fieldToString)(clonedField);
|
|
51
51
|
const fieldAsString = (0, _utils.fieldToString)(field);
|
|
52
52
|
if (fieldAsString !== clonedFieldAsString) {
|
|
53
|
-
|
|
54
|
-
res.message.push(`${fieldAsString} => ${clonedFieldAsString}`); // eslint-disable-line functional/immutable-data
|
|
53
|
+
res.message.push(`${fieldAsString} => ${clonedFieldAsString}`);
|
|
55
54
|
}
|
|
56
55
|
});
|
|
57
|
-
res.valid = !(res.message.length >= 1);
|
|
56
|
+
res.valid = !(res.message.length >= 1);
|
|
58
57
|
return res;
|
|
59
58
|
}
|
|
60
59
|
}
|
|
@@ -103,8 +102,8 @@ function swapRelatorTermSubfields(field, typeOfMaterial = undefined) {
|
|
|
103
102
|
|
|
104
103
|
// Swap:
|
|
105
104
|
const tmp = field.subfields[index - 1];
|
|
106
|
-
field.subfields[index - 1] = field.subfields[index];
|
|
107
|
-
field.subfields[index] = tmp;
|
|
105
|
+
field.subfields[index - 1] = field.subfields[index];
|
|
106
|
+
field.subfields[index] = tmp;
|
|
108
107
|
(0, _punctuation.fieldFixPunctuation)(field);
|
|
109
108
|
return true;
|
|
110
109
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sortRelatorTerms.js","names":["_clone","_interopRequireDefault","require","_utils","_punctuation","_sortFields","e","__esModule","default","WORST_WORK","_default","description","validate","fix","record","res","message","valid","typeOfMaterial","recordToTypeOfMaterial","fields","forEach","field","sortAdjacentRelatorTerms","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","leader","undefined","charAt","getTypeOfMaterial","tagToRelatorTermSubfieldCode","tag","includes","isRelatorTermTag","swapRelatorTermSubfields","subfields","subfieldCode","swapPosition","findIndex","subfield","index","isSwappable","swapRelatorTermPair","tmp","fieldFixPunctuation","sf","code","currScore","scoreRelatorTerm","value","prevSubfield","prevScore"],"sources":["../src/sortRelatorTerms.js"],"sourcesContent":["// Validator/fixer for sorting $e relator term subfields\n//\n// Author(s): Nicholas Volk\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport {fieldFixPunctuation} from './punctuation2';\nimport {scoreRelatorTerm} from './sortFields';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortRelatorTerms');\n//const debugData = debug.extend('data');\n\nconst WORST_WORK = 81;\n\n\nexport default function () {\n\n return {\n description: 'Sort adjacent $e subfields in field [1678][01]0',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n sortAdjacentRelatorTerms(field, typeOfMaterial);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentRelatorTerms(clonedField, typeOfMaterial);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) {
|
|
1
|
+
{"version":3,"file":"sortRelatorTerms.js","names":["_clone","_interopRequireDefault","require","_utils","_punctuation","_sortFields","e","__esModule","default","WORST_WORK","_default","description","validate","fix","record","res","message","valid","typeOfMaterial","recordToTypeOfMaterial","fields","forEach","field","sortAdjacentRelatorTerms","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","leader","undefined","charAt","getTypeOfMaterial","tagToRelatorTermSubfieldCode","tag","includes","isRelatorTermTag","swapRelatorTermSubfields","subfields","subfieldCode","swapPosition","findIndex","subfield","index","isSwappable","swapRelatorTermPair","tmp","fieldFixPunctuation","sf","code","currScore","scoreRelatorTerm","value","prevSubfield","prevScore"],"sources":["../src/sortRelatorTerms.js"],"sourcesContent":["// Validator/fixer for sorting $e relator term subfields\n//\n// Author(s): Nicholas Volk\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport {fieldFixPunctuation} from './punctuation2';\nimport {scoreRelatorTerm} from './sortFields';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortRelatorTerms');\n//const debugData = debug.extend('data');\n\nconst WORST_WORK = 81;\n\n\nexport default function () {\n\n return {\n description: 'Sort adjacent $e subfields in field [1678][01]0',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n sortAdjacentRelatorTerms(field, typeOfMaterial);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentRelatorTerms(clonedField, typeOfMaterial);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) {\n res.message.push(`${fieldAsString} => ${clonedFieldAsString}`);\n }\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\n\nfunction recordToTypeOfMaterial(record) {\n if (!record.leader) {\n return undefined;\n }\n\n if (record.leader.charAt(6) === 'i') { // Audio books should follow rules of a book, I guess...\n return 'BK';\n }\n\n return record.getTypeOfMaterial();\n}\n\nexport function tagToRelatorTermSubfieldCode(tag) {\n if (['100', '110', '600', '610', '700', '710', '720', '751', '752', '800', '810'].includes(tag)) {\n return 'e';\n }\n if (['111', '611', '711', '811'].includes(tag)) {\n return 'j';\n }\n return '?'; // No need to complain. Nothing is found.\n}\n\nfunction isRelatorTermTag(tag) {\n // NV: 111/711, 751 and 752 are very rare\n return ['e', 'j'].includes(tagToRelatorTermSubfieldCode(tag));\n}\n\nfunction swapRelatorTermSubfields(field, typeOfMaterial = undefined) {\n if (!field.subfields) {\n return;\n }\n\n const subfieldCode = tagToRelatorTermSubfieldCode(field.tag);\n\n //console.log(`Processing ${fieldToString(field)}`); // eslint-disable-line no-console\n\n const swapPosition = field.subfields.findIndex((subfield, index) => isSwappable(subfield, index));\n\n if (swapPosition > 0) {\n swapRelatorTermPair(swapPosition);\n swapRelatorTermSubfields(field, typeOfMaterial); // uh, evil recursion...\n return;\n }\n\n //console.log(`END ${fieldToString(field)}`); // eslint-disable-line no-console\n\n function swapRelatorTermPair(index) {\n //console.log(` SWAP`); // eslint-disable-line no-console\n\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = field.subfields[index];\n field.subfields[index] = tmp;\n fieldFixPunctuation(field);\n return true;\n }\n\n function isSwappable(sf, index) {\n // NB! we should fix 'e' to 'e' or 'j'....\n if (index === 0 || sf.code !== subfieldCode) {\n return false;\n }\n const currScore = scoreRelatorTerm(sf.value, typeOfMaterial);\n if (currScore === 0) {\n return false;\n }\n const prevSubfield = field.subfields[index - 1];\n if (prevSubfield.code !== subfieldCode) {\n return false;\n }\n const prevScore = scoreRelatorTerm(prevSubfield.value, typeOfMaterial);\n // console.log(`PREV: ${prevSubfield.value}/${prevScore}, CURR: ${sf.value}/${currScore}`); // eslint-disable-line no-console\n // If this subfield maps to a Work, then subfields can be swapped, even if we don't have a score for the prev subfield!\n if (prevScore === 0 && currScore < WORST_WORK) {\n return false;\n }\n return currScore > prevScore;\n }\n\n}\n\nexport function sortAdjacentRelatorTerms(field, typeOfMaterial = undefined) {\n if (!field.subfields || !isRelatorTermTag(field.tag)) {\n return field;\n }\n swapRelatorTermSubfields(field, typeOfMaterial);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
|
package/dist/sortSubfields.js
CHANGED
|
@@ -55,11 +55,10 @@ function _default(defaultTagPattern) {
|
|
|
55
55
|
const clonedFieldAsString = (0, _utils.fieldToString)(clonedField);
|
|
56
56
|
const fieldAsString = (0, _utils.fieldToString)(field);
|
|
57
57
|
if (fieldAsString !== clonedFieldAsString) {
|
|
58
|
-
|
|
59
|
-
res.message.push(clonedFieldAsString); // eslint-disable-line functional/immutable-data
|
|
58
|
+
res.message.push(clonedFieldAsString);
|
|
60
59
|
}
|
|
61
60
|
});
|
|
62
|
-
res.valid = !(res.message.length >= 1);
|
|
61
|
+
res.valid = !(res.message.length >= 1);
|
|
63
62
|
return res;
|
|
64
63
|
}
|
|
65
64
|
}
|
|
@@ -264,8 +263,8 @@ function swapSubfields(field, sortOrder) {
|
|
|
264
263
|
}
|
|
265
264
|
// Swap:
|
|
266
265
|
const tmp = field.subfields[index - 1];
|
|
267
|
-
field.subfields[index - 1] = sf;
|
|
268
|
-
field.subfields[index] = tmp;
|
|
266
|
+
field.subfields[index - 1] = sf;
|
|
267
|
+
field.subfields[index] = tmp;
|
|
269
268
|
return true;
|
|
270
269
|
});
|
|
271
270
|
if (loopAgain) {
|
|
@@ -296,7 +295,7 @@ function moveSubfield6ToTheFront(field) {
|
|
|
296
295
|
// https://www.loc.gov/marc/bibliographic/ecbdcntf.html says "Subfield $6 is always the first subfield in the field."
|
|
297
296
|
const sf6s = field.subfields.filter(sf => sf.code === '6');
|
|
298
297
|
const others = field.subfields.filter(sf => sf.code !== '6');
|
|
299
|
-
field.subfields = [...sf6s, ...others];
|
|
298
|
+
field.subfields = [...sf6s, ...others];
|
|
300
299
|
}
|
|
301
300
|
function sortAdjacentSubfields(field, externalSortOrder = []) {
|
|
302
301
|
if (!field.subfields) {
|