@natlibfi/marc-record-validators-melinda 12.0.6 → 12.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cyrillux.js +11 -11
- package/dist/cyrillux.js.map +2 -2
- package/dist/dataProvenanceUtils.js +19 -0
- package/dist/dataProvenanceUtils.js.map +7 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +2 -2
- package/dist/merge-fields/controlSubfields.js.map +2 -2
- package/dist/merge-fields/counterpartField.js +149 -152
- package/dist/merge-fields/counterpartField.js.map +3 -3
- package/dist/merge-fields/dataProvenance.js +6 -20
- package/dist/merge-fields/dataProvenance.js.map +2 -2
- package/dist/merge-fields/index.js +1 -1
- package/dist/merge-fields/index.js.map +2 -2
- package/dist/merge-fields/mergableIndicator.js +1 -2
- package/dist/merge-fields/mergableIndicator.js.map +2 -2
- package/dist/merge-fields/mergeConfig.js +2 -0
- package/dist/merge-fields/mergeConfig.js.map +2 -2
- package/dist/merge-fields/mergeConstraints.js +35 -32
- package/dist/merge-fields/mergeConstraints.js.map +3 -3
- package/dist/merge-fields/mergeField.js +4 -3
- package/dist/merge-fields/mergeField.js.map +2 -2
- package/dist/merge-fields/mergeOrAddSubfield.js +8 -7
- package/dist/merge-fields/mergeOrAddSubfield.js.map +2 -2
- package/dist/merge-fields/mergeSubfield.js +5 -1
- package/dist/merge-fields/mergeSubfield.js.map +2 -2
- package/dist/merge-fields/worldKnowledge.js +52 -0
- package/dist/merge-fields/worldKnowledge.js.map +2 -2
- package/dist/merge-fields.test.js +2 -2
- package/dist/merge-fields.test.js.map +2 -2
- package/dist/normalize-dashes.js +2 -2
- package/dist/normalize-dashes.js.map +2 -2
- package/dist/normalizeFieldForComparison.js +8 -14
- package/dist/normalizeFieldForComparison.js.map +2 -2
- package/dist/prepublicationUtils.js +1 -1
- package/dist/prepublicationUtils.js.map +2 -2
- package/dist/punctuation2.js +10 -10
- package/dist/punctuation2.js.map +2 -2
- package/dist/removeDuplicateDataFields.js +1 -24
- package/dist/removeDuplicateDataFields.js.map +2 -2
- package/dist/removeInferiorDataFields.js +3 -2
- package/dist/removeInferiorDataFields.js.map +2 -2
- package/dist/sortSubfields.js +19 -19
- package/dist/sortSubfields.js.map +2 -2
- package/dist/subfield6Utils.js +0 -1
- package/dist/subfield6Utils.js.map +2 -2
- package/dist/subfield8Utils.js +0 -5
- package/dist/subfield8Utils.js.map +2 -2
- package/dist/utils.js +29 -3
- package/dist/utils.js.map +2 -2
- package/package.json +4 -4
- package/src/cyrillux.js +11 -11
- package/src/dataProvenanceUtils.js +21 -0
- package/src/index.js +3 -1
- package/src/merge-fields/controlSubfields.js +0 -1
- package/src/merge-fields/counterpartField.js +191 -290
- package/src/merge-fields/dataProvenance.js +8 -25
- package/src/merge-fields/index.js +1 -1
- package/src/merge-fields/mergableIndicator.js +1 -2
- package/src/merge-fields/mergeConfig.js +2 -1
- package/src/merge-fields/mergeConstraints.js +39 -34
- package/src/merge-fields/mergeField.js +4 -7
- package/src/merge-fields/mergeOrAddSubfield.js +8 -7
- package/src/merge-fields/mergeSubfield.js +11 -2
- package/src/merge-fields/worldKnowledge.js +72 -3
- package/src/merge-fields.test.js +2 -2
- package/src/normalize-dashes.js +2 -2
- package/src/normalizeFieldForComparison.js +19 -20
- package/src/prepublicationUtils.js +1 -1
- package/src/punctuation2.js +10 -10
- package/src/removeDuplicateDataFields.js +24 -24
- package/src/removeInferiorDataFields.js +3 -2
- package/src/sortSubfields.js +19 -19
- package/src/subfield6Utils.js +1 -1
- package/src/subfield8Utils.js +5 -5
- package/src/utils.js +39 -12
- package/test-fixtures/cyrillux/f14/expectedResult.json +32 -0
- package/test-fixtures/cyrillux/f14/metadata.json +10 -0
- package/test-fixtures/cyrillux/f14/record.json +14 -0
- package/test-fixtures/merge-fields/f042_01/expectedResult.json +12 -0
- package/test-fixtures/merge-fields/f042_01/metadata.json +6 -0
- package/test-fixtures/merge-fields/f042_01/record.json +13 -0
- package/test-fixtures/merge-fields/f06/expectedResult.json +42 -0
- package/test-fixtures/merge-fields/f06/metadata.json +6 -0
- package/test-fixtures/merge-fields/f06/record.json +41 -0
- package/test-fixtures/merge-fields/f07/expectedResult.json +18 -0
- package/test-fixtures/merge-fields/f07/metadata.json +6 -0
- package/test-fixtures/merge-fields/f07/record.json +18 -0
- package/test-fixtures/merge-fields/f08/expectedResult.json +12 -0
- package/test-fixtures/merge-fields/f08/metadata.json +7 -0
- package/test-fixtures/merge-fields/f08/record.json +10 -0
- package/test-fixtures/merge-fields/f09/expectedResult.json +14 -0
- package/test-fixtures/merge-fields/f09/metadata.json +6 -0
- package/test-fixtures/merge-fields/f09/record.json +14 -0
- package/test-fixtures/merge-fields/f10/expectedResult.json +25 -0
- package/test-fixtures/merge-fields/f10/metadata.json +6 -0
- package/test-fixtures/merge-fields/f10/record.json +25 -0
- package/test-fixtures/merge-fields/f11/expectedResult.json +40 -0
- package/test-fixtures/merge-fields/f11/metadata.json +7 -0
- package/test-fixtures/merge-fields/f11/record.json +50 -0
- package/test-fixtures/merge-fields/f12/expectedResult.json +17 -0
- package/test-fixtures/merge-fields/f12/metadata.json +6 -0
- package/test-fixtures/merge-fields/f12/record.json +25 -0
- package/test-fixtures/merge-fields/f13/expectedResult.json +18 -0
- package/test-fixtures/merge-fields/f13/metadata.json +6 -0
- package/test-fixtures/merge-fields/f13/record.json +28 -0
- package/test-fixtures/merge-fields/f14/expectedResult.json +25 -0
- package/test-fixtures/merge-fields/f14/metadata.json +6 -0
- package/test-fixtures/merge-fields/f14/record.json +25 -0
- package/test-fixtures/merge-fields/f300_01/expectedResult.json +9 -0
- package/test-fixtures/merge-fields/f300_01/metadata.json +6 -0
- package/test-fixtures/merge-fields/f300_01/record.json +8 -0
- package/test-fixtures/merge-fields/f300_02/expectedResult.json +13 -0
- package/test-fixtures/merge-fields/f300_02/metadata.json +6 -0
- package/test-fixtures/merge-fields/f300_02/record.json +16 -0
- package/test-fixtures/merge-fields/f490_01/expectedResult.json +13 -0
- package/test-fixtures/merge-fields/f490_01/metadata.json +6 -0
- package/test-fixtures/merge-fields/f490_01/record.json +16 -0
- package/test-fixtures/remove-inferior-datafields/f17/expectedResult.json +11 -0
- package/test-fixtures/remove-inferior-datafields/f17/metadata.json +5 -0
- package/test-fixtures/remove-inferior-datafields/f17/record.json +15 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/merge-fields/mergeConstraints.js"],
|
|
4
|
-
"sourcesContent": ["import createDebugLogger from 'debug';\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeConstraints');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...\n\n// \"key\" is an unique key that must match (be absent or exist+be identical) in both.\n// \"paired\" refers to a field that must either exist in both or be absent in both (negative XOR). Typically it's not defined.\n// NB: key+paired with identical values is an attempt to prevent copy for (ET) fields, and to force separate fields on (T) fields.\n// NB! If base has eg. no 264, two+ 264 fields can be copied from the source.\n\n// NB! not all X00 fields have, say, $x subfield. However, we can still share them...\n// $h is non-1XX?, $i is 7XX only, $w is 8XX only...\nconst keyX00 = 'abcjloqrtuwx'; // Shared: $abcdefg...\nconst keyX10 = 'abcdfghlnoprstuwx';\nconst keyX11 = 'acdefghlnpqstuwx';\nconst keyX30 = 'adfghklmnoprstvwxyz';\n\nconst mergeConstraints = [\n {'tag': '010', 'required': 'a', 'key': 'a'},\n {'tag': '013', 'required': 'a', 'key': 'a'}, // We have 2 instances in Melinda...\n {'tag': '015', 'required': 'a', 'key': 'a'},\n {'tag': '016', 'required': 'a', 'key': 'a2'},\n {'tag': '017', 'required': 'a', 'key': 'a'},\n {'tag': '018', 'required': 'a', 'key': 'a'},\n {'tag': '020', 'required': '', 'paired': 'a', 'key': 'a'}, // NB! how to handle $z-only cases? 'required-fallback'='z'?\n {'tag': '022', 'required': '', 'paired': 'a', 'key': 'alz'},\n {'tag': '024', 'required': '', 'paired': 'a', 'key': 'ad'},\n {'tag': '025', 'required': 'a', 'key': 'a'},\n {'tag': '026', 'required': 'a', 'key': 'a'},\n {'tag': '027', 'required': 'a', 'key': 'a'}, // on tuolla pari $z:\u00E4\u00E4\n {'tag': '028', 'required': 'a', 'key': 'ab'},\n {'tag': '030', 'required': 'a', 'key': 'a'},\n {'tag': '031', 'required': '', 'key': 'abcegmnopr2'}, // mites t\u00E4mm\u00F6isen k\u00E4yt\u00E4nn\u00F6ss\u00E4 avaimettoman klaarais? TODO: tests\n {'tag': '032', 'required': 'a', 'key': 'ab'},\n {'tag': '033', 'required': 'a', 'key': 'abcp0123'}, // 0,1% are without $a. Ignore them for now.\n {'tag': '034', 'required': 'ab', 'key': 'abcdefghjkmnprstxyz0123'},\n {'tag': '035', 'required': '', 'key': 'az'},\n {'tag': '036', 'required': 'a', 'key': 'a'},\n {'tag': '037', 'required': 'b', 'key': 'ab'},\n {'tag': '039', 'required': 'a'},\n {'tag': '040', 'required': '', 'key': ''},\n {'tag': '041', 'required': '', 'paired': '2', 'key': ''}, // Don't put $2 in 'key'! hasCommonNominator() would get into trouble with it...\n {'tag': '042', 'required': 'a', 'key': ''}, // NB: preprocessor hacks applied\n {'tag': '043', 'required': 'a', 'key': 'abc'},\n {'tag': '044', 'required': '', 'key': 'abc', 'paired': 'abc'},\n {'tag': '045', 'required': '', 'key': 'abc', 'paired': 'abc'}, // (ET) // 045 is problematic either-$a or $b or $c...\n {'tag': '046', 'required': 'a', 'key': 'abcdejklmnop', 'paired': 'abcdejklmnop'},\n {'tag': '047', 'required': 'a', 'key': 'a2'},\n {'tag': '048', 'required': '', 'paired': 'ab', 'key': 'ba'},\n {'tag': '049', 'required': '', 'key': 'abcd'},\n {'tag': '050', 'required': 'a', 'key': 'ab13'},\n {'tag': '051', 'required': 'a', 'key': 'abc'}, // 2021-08-27: only one field in the whole Melinda\n {'tag': '052', 'required': 'a', 'key': 'abd'},\n {'tag': '055', 'required': 'a', 'key': 'ab'},\n {'tag': '060', 'required': 'a', 'key': 'ab'},\n {'tag': '061', 'required': 'a', 'paired': 'b', 'key': 'abc'},\n {'tag': '066', 'required': 'c'},\n {'tag': '070', 'required': 'a', 'key': 'ab'},\n {'tag': '071', 'required': 'a', 'paired': 'abc', 'key': 'abc'}, // N=3\n {'tag': '072', 'required': 'a', 'key': 'ax'},\n {'tag': '074', 'required': '', 'paired': 'a', 'key': 'az'},\n {'tag': '080', 'required': 'a', 'paired': 'bx', 'key': 'abx'},\n {'tag': '082', 'required': 'a', 'paired': 'b', 'key': 'abmq2'},\n {'tag': '083', 'required': 'a', 'paired': 'b', 'key': 'abmqy'},\n {'tag': '084', 'required': 'a', 'paired': 'b2', 'key': 'abq2'},\n {'tag': '085', 'required': '', 'paired': 'abcfrstuvwyz', 'key': 'abcfrstuvwxyz'},\n {'tag': '086', 'required': '', 'paired': 'a', 'key': 'a'},\n {'tag': '088', 'required': '', 'paired': 'a', 'key': 'a'},\n // NB! 100, 110 and 111 may have title parts that are handled elsewhere\n {'tag': '100', 'required': 'a', 'paired': 't', 'key': keyX00},\n {'tag': '110', 'required': 'a', 'paired': 'bt', 'key': keyX10},\n {'tag': '111', 'required': 'a', 'paired': 't', 'key': keyX11},\n // NB! 130 has no name part, key is used for title part\n {'tag': '130', 'required': 'a', 'key': keyX30},\n {'tag': '210', 'required': 'a', 'key': 'ab'},\n {'tag': '222', 'required': 'a', 'key': 'ab'},\n {'tag': '240', 'required': 'a', 'key': 'adfghklmnoprs'},\n {'tag': '242', 'required': 'a', 'key': 'abchnpy'},\n {'tag': '243', 'required': 'a', 'key': 'adfghklmnoprs'},\n {'tag': '245', 'required': 'a', 'key': 'abcghnps', 'paired': 'abnps'},\n {'tag': '246', 'required': 'a', 'key': 'abfnp'},\n {'tag': '247', 'required': 'a', 'key': 'abfnpx'},\n {'tag': '250', 'required': 'a', 'key': 'ab'},\n {'tag': '251', 'required': 'a', 'key': 'a'},\n {'tag': '254', 'required': 'a', 'key': 'a'},\n {'tag': '255', 'required': 'a', 'key': 'abcdefg', 'paired': 'abcdefg'},\n {'tag': '256', 'required': 'a', 'key': 'a'},\n {'tag': '257', 'required': 'a', 'key': 'a'},\n {'tag': '258', 'required': 'a', 'key': 'a'}, // Melinda: N=1\n //{'tag': '260', 'required': '', 'paired': 'abcefg', 'key': 'abcefg'},\n {'tag': '260', 'required': '', 'key': 'abcefg'},\n {'tag': '263', 'required': 'a', 'key': 'a'},\n //{'tag': '264', 'required': '', 'paired': 'abc', 'key': 'abc'}, // NB \"S.l.\" normalizations?\" not implemented\n {'tag': '264', 'required': '', 'key': 'abc'}, // NB \"S.l.\" normalizations?\" not implemented\n // SKIP TAG 270 ON PURPOSE! Melinda's N=43.\n {'tag': '300', 'required': 'a', 'key': 'abcefg'},\n {'tag': '306', 'required': 'a', 'key': 'a'},\n // SKIP TAG 307 ON PURPOSE! N=0\n {'tag': '310', 'required': 'a', 'key': 'ab'},\n {'tag': '321', 'required': 'a', 'key': 'ab'},\n {'tag': '335', 'required': 'a', 'key': 'ab'}, // Melinda N=1 (a test field). M might increase?\n {'tag': '336', 'required': 'b2', 'key': 'ab2'}, // MET-88: don't merge different $a subfields\n {'tag': '337', 'required': 'b2', 'key': 'ab2'}, // MET-88: don't merge different $a subfields\n {'tag': '338', 'required': 'b2', 'key': 'ab2'}, // / MET-88: don't merge different $a subfields\n {'tag': '340', 'required': '', 'paired': 'abcdefghijkmnop', 'key': 'abcdefghijkmnop'},\n {'tag': '341', 'required': '', 'paired': 'abcde', 'key': 'abcde'}, // NEW! Starting to appear!\n {'tag': '342', 'required': '', 'paired': 'abcdefghijklmnopqrstuvw', 'key': 'abcdefghijklmnopqrstuvw'}, // SKIP 342. NOT SEEN!\n {'tag': '343', 'required': '', 'paired': 'abcdefghi', 'key': 'abcdefghi'}, // SKIP 343.\n {'tag': '344', 'required': '', 'paired': 'abcdefgh', 'key': 'abcdefgh'},\n {'tag': '345', 'required': '', 'paired': 'abcd', 'key': 'abcd'},\n {'tag': '346', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '347', 'required': '', 'paired': 'abcdef', 'key': 'abcdef'},\n {'tag': '348', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '348', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '351', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '352', 'required': '', 'paired': 'abcdefgiq', 'key': 'abcdefgiq'},\n {'tag': '355', 'required': '', 'paired': 'abcdefghj', 'key': 'abcdefghj'},\n {'tag': '357', 'required': 'a', 'key': 'abcg'},\n {'tag': '362', 'required': 'a', 'key': 'az'},\n {'tag': '363', 'required': '', 'paired': 'abcdefghijklmuv', 'key': 'abcdefghijklmuv'},\n {'tag': '365', 'required': 'b', 'paired': 'abcdefghijkm', 'key': 'abcdefghijkm'}, // N=0\n {'tag': '366', 'required': '', 'paired': 'abcdefgjkm', 'key': 'abcdefgjkm'},\n {'tag': '370', 'required': '', 'paired': 'cfgistuv', 'key': 'cfgistuv'},\n {'tag': '377', 'required': '', 'paired': 'al', 'key': 'al'},\n {'tag': '380', 'required': 'a', 'key': 'a'},\n {'tag': '381', 'required': 'auv', 'key': 'auv'},\n {'tag': '382', 'required': ''},\n {'tag': '383', 'required': 'abcde', 'key': 'abcde'},\n {'tag': '384', 'required': 'a', 'key': 'a'},\n {'tag': '385', 'required': 'a', 'paired': 'abmn', 'key': 'abmn'},\n {'tag': '386', 'required': 'a', 'paired': 'abmn', 'key': 'abmn'},\n {'tag': '388', 'required': 'a', 'key': 'a'},\n {'tag': '490', 'required': 'a', 'key': 'axvl'},\n {'tag': '500', 'required': 'a', 'key': 'a'},\n {'tag': '501', 'required': 'a', 'key': 'a'},\n {'tag': '502', 'required': 'a', 'key': 'abcdgo'},\n {'tag': '504', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '505', 'required': '', 'paired': 'agrtu', 'key': 'agrtu'},\n {'tag': '506', 'required': 'a', 'paired': '', 'key': 'abcdefgqu'},\n {'tag': '507', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '508', 'required': 'a', 'key': 'a'},\n {'tag': '509', 'required': 'a', 'key': 'acd'},\n {'tag': '510', 'required': 'a', 'key': 'abcx'},\n {'tag': '511', 'required': 'a', 'key': 'a'},\n {'tag': '513', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '514', 'required': '', 'paired': 'abcdefghijkmuz', 'key': 'abcdefghijkmuz'},\n {'tag': '515', 'required': 'a', 'key': 'a'},\n {'tag': '518', 'required': '', 'paired': 'adop', 'key': 'adop'},\n {'tag': '520', 'required': 'a', 'paired': 'abc', 'key': 'abc'},\n {'tag': '521', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '522', 'required': 'a', 'key': 'a'},\n {'tag': '524', 'required': 'a', 'key': 'a'},\n {'tag': '525', 'required': 'a', 'key': 'a'},\n {'tag': '526', 'required': 'a', 'paired': 'abcdi', 'key': 'abcdi'},\n {'tag': '530', 'required': 'a', 'paired': 'abcd', 'key': 'abcd'},\n {'tag': '532', 'required': 'a', 'key': 'a'},\n {'tag': '533', 'required': 'a', 'paired': 'abcdefmn7', 'key': 'abcdefmn7'},\n {'tag': '534', 'required': '', 'paired': 'abcempt', 'key': 'abcempt'},\n {'tag': '535', 'required': '', 'paired': 'abcdg', 'key': 'abcdg'},\n {'tag': '536', 'required': '', 'paired': 'abcdefgh', 'key': 'abcdefgh'},\n {'tag': '538', 'required': 'a', 'paired': 'aiu', 'key': 'aiu'},\n {'tag': '540', 'required': '', 'paired': 'abcdfgqu', 'key': 'abcdfgqu'},\n {'tag': '541', 'required': '', 'paired': 'abcdefhno', 'key': 'abcdefhno'},\n {'tag': '542', 'required': '', 'paired': 'abcdfghijklmopqrsu', 'key': 'abcdfghijklmopqrsu'},\n {'tag': '544', 'required': '', 'paired': 'abcden', 'key': 'abcden'},\n {'tag': '545', 'required': '', 'paired': 'abu', 'key': 'abu'},\n {'tag': '546', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '547', 'required': 'a', 'key': 'a'},\n {'tag': '550', 'required': 'a', 'key': 'a'},\n {'tag': '552', 'required': '', 'paired': 'abcdefghijklmnopuz', 'key': 'abcdefghijklmnopuz'},\n {'tag': '555', 'required': 'a', 'paired': 'abcdu', 'key': 'abcdu'},\n {'tag': '556', 'required': 'a', 'key': 'az'},\n {'tag': '561', 'required': 'a', 'key': 'au'},\n {'tag': '562', 'required': '', 'paired': 'abcde', 'key': 'abcde'},\n {'tag': '563', 'required': 'a', 'key': 'au'},\n {'tag': '565', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '567', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '580', 'required': 'a', 'key': 'a'},\n {'tag': '581', 'required': 'a', 'key': 'a'},\n {'tag': '583', 'required': '', 'paired': 'abcdefhijklnou', 'key': 'abcdefhijklnou'},\n {'tag': '584', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '585', 'required': 'a', 'key': 'a'},\n {'tag': '586', 'required': 'a', 'key': 'a'},\n {'tag': '588', 'required': 'a', 'key': 'a'},\n // NB! Currently we never merge 59X fields (see mergableTags.js). Doublish removals such as MELKEHITYS-3147 are handled by postprocessor.\n {'tag': '590', 'required': ''},\n {'tag': '591', 'required': ''},\n {'tag': '592', 'required': ''},\n {'tag': '593', 'required': ''},\n {'tag': '594', 'required': ''},\n {'tag': '595', 'required': ''},\n {'tag': '596', 'required': ''},\n {'tag': '597', 'required': ''},\n {'tag': '598', 'required': ''},\n {'tag': '599', 'required': ''},\n {'tag': '600', 'required': 'a', 'paired': 'tvxyz', 'key': keyX00},\n {'tag': '610', 'required': 'a', 'paired': 'btvxyz', 'key': keyX10},\n {'tag': '611', 'required': 'a', 'paired': 'tvxyz', 'key': keyX11},\n {'tag': '630', 'required': 'a', 'paired': 'atvxyz', 'key': keyX30},\n // NB! 700, 710 and 711 may have title parts that are handled elsewhere\n {'tag': '647', 'required': 'a', 'paired': 'avxyz', 'key': 'acdgvxyz02'},\n {'tag': '648', 'required': 'a', 'paired': 'avxyz', 'key': 'avxyz02'},\n {'tag': '650', 'required': 'a', 'paired': 'abcdegvxyz', 'key': 'abcdegvxyz20'},\n {'tag': '651', 'required': 'a', 'paired': 'aegvxyz', 'key': 'aegvxyz20'},\n {'tag': '653', 'required': 'a', 'paired': 'a', 'key': 'a'}, // this is interesting as a can be repeated\n {'tag': '654', 'required': '', 'paired': 'abcevxyz'},\n {'tag': '655', 'required': 'a', 'paired': 'abcvxyz', 'key': 'avxyz20'},\n {'tag': '656', 'required': 'a', 'paired': 'akvxyz'}, // N=0\n {'tag': '657', 'required': 'a', 'paired': 'avxyz'}, // N=0\n {'tag': '658', 'required': 'a', 'paired': 'abcd'}, // N=0\n {'tag': '662', 'required': '', 'paired': 'abcdefgh'}, // N=0\n {'tag': '688', 'required': 'a'}, // N=0\n {'tag': '700', 'required': 'a', 'paired': 't', 'key': keyX00}, // h/i/m/o/r/s/x are missing from 100\n {'tag': '710', 'required': 'a', 'paired': 'bt', 'key': keyX10}, // h/j/m/o/r/s/x are missing from 110\n {'tag': '711', 'required': 'a', 'paired': 'cdeflns', 'key': keyX11}, // h/i/s/x are missing from 711\n {'tag': '720', 'required': 'a', 'key': 'a'},\n // NB! 730 has no name part, key is used for title part\n {'tag': '730', 'required': 'a', 'key': keyX30}, // NB: 130->730 magic subfields might not agree...\n {'tag': '740', 'required': 'a', 'key': 'ahnp'},\n {'tag': '751', 'required': 'a', 'key': 'a'}, // N=11, kaikissa pelkk\u00E4 $a\n {'tag': '752', 'required': '', 'key': 'abcdefgh'}, // N=12234\n {'tag': '753', 'required': '', 'key': 'abc'},\n {'tag': '754', 'required': '', 'key': 'acdxz'}, // N=3\n {'tag': '758', 'required': 'a', 'key': 'ai'}, // N=1\n\n {'tag': '760', 'required': 'tw', key: 'twxy'},\n {'tag': '762', 'required': 't', key: 'abcdhmstxy'},\n {'tag': '765', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '767', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '770', 'required': 't', 'paired': 'ruxyz', key: 'abcdhmrstuwxyz'},\n {'tag': '772', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '773', 'required': 'w', key: 'wgq'}, // Kirjav\u00E4litys should not have any component parts. However, this need to be re-thought...\n // Currently we (appently) drop fields that don't contain 773$w...\n {'tag': '774', 'required': '', 'paired': 'nruxyz', 'key': 'npqrstrxyz'},\n {'tag': '775', 'required': '', 'paired': 'ruxyz', 'key': 'abcdefhmstuxyz'},\n {'tag': '776', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmsuwxyz'},\n {'tag': '777', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '780', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '785', 'required': '', 'paired': 'uxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '786', 'required': '', 'paired': 'abcrstuxyz', 'key': 'abcdhijmprstuxyz4'},\n {'tag': '787', 'required': '', 'paired': 'abcdhmstuxyz4'},\n {'tag': '788', 'required': '', 'paired': 'stx', 'key': 'abdestx'},\n {'tag': '800', 'required': 'a', 'paired': 't', 'key': keyX00},\n {'tag': '810', 'required': 'a', 'paired': 'bt', 'key': keyX10},\n {'tag': '811', 'required': 'a', 'paired': 't', 'key': keyX11},\n {'tag': '830', 'required': 'a', 'key': keyX30},\n {'tag': '840', 'required': 'a'},\n {'tag': '841', 'required': 'a'},\n {'tag': '842', 'required': 'a'},\n {'tag': '843', 'required': 'a'},\n {'tag': '844', 'required': 'a'},\n {'tag': '845', 'required': 'a'},\n {'tag': '850', 'required': 'a', 'key': 'a'},\n {'tag': '852', 'required': 'a'}, // HMM... we might want to reconsider this...\n {'tag': '853', 'required': 'a'},\n {'tag': '854', 'required': 'a'},\n {'tag': '855', 'required': 'a'},\n {'tag': '856', 'required': 'u', 'paired': 'u', 'key': 'opuw23'}, // 856 is built around $u...\n {'tag': '863', 'required': 'a'},\n {'tag': '864', 'required': 'a'},\n {'tag': '865', 'required': 'a'},\n {'tag': '866', 'required': 'a'},\n {'tag': '867', 'required': 'a'},\n {'tag': '868', 'required': 'a'},\n {'tag': '876', 'required': 'a'},\n {'tag': '877', 'required': 'a'},\n {'tag': '878', 'required': 'a'},\n {'tag': '880', 'required': '', 'paired': 'a', 'key': 'abcdefghijklmnopqrstuvwxyz'},\n {'tag': '881', 'required': ''},\n {'tag': '882', 'required': ''},\n {'tag': '883', 'required': ''},\n {'tag': '884', 'required': '', 'paired': 'agkq'},\n {'tag': '885', 'required': ''},\n {'tag': '886', 'required': ''},\n {'tag': '887', 'required': ''},\n {'tag': '900', 'required': ''},\n {'tag': '901', 'required': ''},\n {'tag': '910', 'required': ''},\n {'tag': '935', 'required': 'a', 'key': 'az'}, // Fono information at least\n {'tag': '940', 'required': ''},\n {'tag': '946', 'required': 'a', 'key': 'abfnp'}, // Copied from 246. However, final version might contain some elements from field 245 as well\n {'tag': '960', 'required': ''},\n {'tag': '973', 'required': 'w', 'key': 'w'}, // Viola multi-hosts\n {'tag': '995', 'required': ''},\n {'tag': 'CAT', 'required': ''},\n {'tag': 'LOW', 'required': ''},\n {'tag': 'SID', 'required': ''}\n];\n\nfunction constraintToValue(tagsConstraints, constraintName) {\n if (constraintName in tagsConstraints) {\n return tagsConstraints[constraintName];\n }\n return null; // NB! \"\" might mean \"apply to everything\" (eg. 040.key) while null means that it is not applied.\n}\n\nexport function getMergeConstraintsForTag(tag, constraintName) {\n const tagsConstraintsArray = mergeConstraints.filter(entry => tag === entry.tag);\n if (tagsConstraintsArray.length === 0) {\n debugDev(`WARNING\\tNo key found for ${tag}. Returning NULL!`);\n return null;\n }\n // NB! should we support multiple contains for a field? Eg. 505$a vs 505($tg)+\n if (tagsConstraintsArray.length > 1) {\n debugDev(`WARNING\\tMultiple values for '${constraintName}' (N=${tagsConstraintsArray.length}) found in ${tag}. Using first values.`);\n }\n return constraintToValue(tagsConstraintsArray[0], constraintName);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
4
|
+
"sourcesContent": ["import createDebugLogger from 'debug';\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeConstraints');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// \"required\": both fields bust have the subfield and the value must be same.\n// \"paired\": subfield bust either exists (with value match) or not exist in both fields (negative XOR). Sort of an optional version of 'required'\n// \"key\": one or both fields lack the subfield OR both fields have it and theor values match.\n// There are typically NR subfields but the system should support multival repeatable subfields. However, (R) support is considered experimental.\n// NB: key+paired with identical values is an attempt to prevent copy for (ET) fields, and to force separate fields on (T) fields.\n// NB! If base has eg. no 264, two+ 264 fields can be copied from the source.\n\n// NB! not all X00 fields have, say, $x subfield. However, we can still share them...\n// $h is non-1XX?, $i is 7XX only, $w is 8XX only...\nconst keyX00 = 'abcjklnoqrstuwx'; // Shared: $abcdefg...\nconst keyX10 = 'abcdfghklnoprstuwx';\nconst keyX11 = 'acdefghklnpqstuwx';\nconst keyX30 = 'adfghklmnoprstvwxyz';\nconst pairedTitleSubfields = 'iklmnoprst'\n\nconst mergeConstraints = [\n {'tag': '010', 'required': 'a', 'key': 'a'},\n {'tag': '013', 'required': 'a', 'key': 'a'}, // We have 2 instances in Melinda...\n {'tag': '015', 'required': 'a', 'key': 'a'},\n {'tag': '016', 'required': 'a', 'key': 'a2'},\n {'tag': '017', 'required': 'a', 'key': 'a'},\n {'tag': '018', 'required': 'a', 'key': 'a'},\n {'tag': '020', 'required': '', 'paired': 'a', 'key': 'a'}, // NB! how to handle $z-only cases? 'required-fallback'='z'?\n {'tag': '022', 'required': '', 'paired': 'a', 'key': 'alz'},\n {'tag': '024', 'required': '', 'paired': 'a', 'key': 'ad'},\n {'tag': '025', 'required': 'a', 'key': 'a'},\n {'tag': '026', 'required': 'a', 'key': 'a'},\n {'tag': '027', 'required': 'a', 'key': 'a'}, // on tuolla pari $z:\u00E4\u00E4\n {'tag': '028', 'required': 'a', 'key': 'ab'},\n {'tag': '030', 'required': 'a', 'key': 'a'},\n {'tag': '031', 'required': '', 'key': 'abcegmnopr2'}, // mites t\u00E4mm\u00F6isen k\u00E4yt\u00E4nn\u00F6ss\u00E4 avaimettoman klaarais? TODO: tests\n {'tag': '032', 'required': 'a', 'key': 'ab'},\n {'tag': '033', 'required': 'a', 'key': 'abcp0123'}, // 0,1% are without $a. Ignore them for now.\n {'tag': '034', 'required': 'ab', 'key': 'abcdefghjkmnprstxyz0123'},\n {'tag': '035', 'required': '', 'key': 'az'},\n {'tag': '036', 'required': 'a', 'key': 'a'},\n {'tag': '037', 'required': 'b', 'key': 'ab'},\n {'tag': '039', 'required': 'a'},\n {'tag': '040', 'required': '', 'key': ''},\n {'tag': '041', 'required': '', 'paired': '2', 'key': 'ad'}, // Don't put $2 in 'key'! hasCommonNominator() would get into trouble with it...\n {'tag': '042', 'required': '', 'key': ''}, // Contents (supposedly $a subfields) can be anything, and still merge... (042 $a foo + 042 $b bar is perfectly mergeable)\n {'tag': '043', 'required': 'a', 'key': 'abc'},\n {'tag': '044', 'required': '', 'key': 'abc', 'paired': 'abc'},\n {'tag': '045', 'required': '', 'key': 'abc', 'paired': 'abc'}, // (ET) // 045 is problematic either-$a or $b or $c...\n {'tag': '046', 'required': 'a', 'key': 'abcdejklmnop', 'paired': 'abcdejklmnop'},\n {'tag': '047', 'required': 'a', 'key': 'a2'},\n {'tag': '048', 'required': '', 'paired': 'ab', 'key': 'ba'},\n {'tag': '049', 'required': '', 'key': 'abcd'},\n {'tag': '050', 'required': 'a', 'key': 'ab13'},\n {'tag': '051', 'required': 'a', 'key': 'abc'}, // 2021-08-27: only one field in the whole Melinda\n {'tag': '052', 'required': 'a', 'key': 'abd'},\n {'tag': '055', 'required': 'a', 'key': 'ab'},\n {'tag': '060', 'required': 'a', 'key': 'ab'},\n {'tag': '061', 'required': 'a', 'paired': 'b', 'key': 'abc'},\n {'tag': '066', 'required': 'c'},\n {'tag': '070', 'required': 'a', 'key': 'ab'},\n {'tag': '071', 'required': 'a', 'paired': 'abc', 'key': 'abc'}, // N=3\n {'tag': '072', 'required': 'a', 'key': 'ax'},\n {'tag': '074', 'required': '', 'paired': 'a', 'key': 'az'},\n {'tag': '080', 'required': 'a', 'paired': 'bx', 'key': 'abx'},\n {'tag': '082', 'required': 'a', 'paired': 'b', 'key': 'abmq2'},\n {'tag': '083', 'required': 'a', 'paired': 'b', 'key': 'abmqy'},\n {'tag': '084', 'required': 'a', 'paired': 'b2', 'key': 'abq2'},\n {'tag': '085', 'required': '', 'paired': 'abcfrstuvwyz', 'key': 'abcfrstuvwxyz'},\n {'tag': '086', 'required': '', 'paired': 'a', 'key': 'a'},\n {'tag': '088', 'required': '', 'paired': 'a', 'key': 'a'},\n // NB! 100, 110 and 111 may have title parts that are handled elsewhere\n {'tag': '100', 'required': 'a', 'paired': `b${pairedTitleSubfields}`, 'key': keyX00},\n {'tag': '110', 'required': 'a', 'paired': `b${pairedTitleSubfields}`, 'key': keyX10},\n {'tag': '111', 'required': 'a', 'paired': pairedTitleSubfields, 'key': keyX11},\n // NB! 130 has no name part, key is used for title part\n {'tag': '130', 'required': 'a', paired: pairedTitleSubfields, 'key': keyX30},\n {'tag': '210', 'required': 'a', 'key': 'ab'},\n {'tag': '222', 'required': 'a', 'key': 'ab'},\n {'tag': '240', 'required': 'a', 'key': 'adfghklmnoprs'},\n {'tag': '242', 'required': 'a', 'key': 'abchnpy'},\n {'tag': '243', 'required': 'a', 'key': 'adfghklmnoprs'},\n {'tag': '245', 'required': 'a', 'key': 'abcghnps', 'paired': 'abnps'},\n {'tag': '246', 'required': 'a', 'key': 'abfnp'},\n {'tag': '247', 'required': 'a', 'key': 'abfnpx'},\n {'tag': '250', 'required': 'a', 'key': 'ab'},\n {'tag': '251', 'required': 'a', 'key': 'a'},\n {'tag': '254', 'required': 'a', 'key': 'a'},\n {'tag': '255', 'required': 'a', 'key': 'abcdefg', 'paired': 'abcdefg'},\n {'tag': '256', 'required': 'a', 'key': 'a'},\n {'tag': '257', 'required': 'a', 'key': 'a'},\n {'tag': '258', 'required': 'a', 'key': 'a'}, // Melinda: N=1\n //{'tag': '260', 'required': '', 'paired': 'abcefg', 'key': 'abcefg'},\n {'tag': '260', 'required': '', 'key': 'abcefg'},\n {'tag': '263', 'required': 'a', 'key': 'a'},\n //{'tag': '264', 'required': '', 'paired': 'abc', 'key': 'abc'}, // NB \"S.l.\" normalizations?\" not implemented\n {'tag': '264', 'required': '', 'key': 'abc'}, // NB \"S.l.\" normalizations?\" not implemented\n // SKIP TAG 270 ON PURPOSE! Melinda's N=43.\n {'tag': '300', 'required': '', 'key': 'abcefg'},\n {'tag': '306', 'required': 'a', 'key': 'a'},\n // SKIP TAG 307 ON PURPOSE! N=0\n {'tag': '310', 'required': 'a', 'key': 'ab'},\n {'tag': '321', 'required': 'a', 'key': 'ab'},\n {'tag': '335', 'required': 'a', 'key': 'ab'}, // Melinda N=1 (a test field). M might increase?\n {'tag': '336', 'required': 'b2', 'key': 'ab2'}, // MET-88: don't merge different $a subfields\n {'tag': '337', 'required': 'b2', 'key': 'ab2'}, // MET-88: don't merge different $a subfields\n {'tag': '338', 'required': 'b2', 'key': 'ab2'}, // / MET-88: don't merge different $a subfields\n {'tag': '340', 'required': '', 'paired': 'abcdefghijkmnop', 'key': 'abcdefghijkmnop'},\n {'tag': '341', 'required': '', 'paired': 'abcde', 'key': 'abcde'}, // NEW! Starting to appear!\n {'tag': '342', 'required': '', 'paired': 'abcdefghijklmnopqrstuvw', 'key': 'abcdefghijklmnopqrstuvw'}, // SKIP 342. NOT SEEN!\n {'tag': '343', 'required': '', 'paired': 'abcdefghi', 'key': 'abcdefghi'}, // SKIP 343.\n {'tag': '344', 'required': '', 'paired': 'abcdefgh', 'key': 'abcdefgh'},\n {'tag': '345', 'required': '', 'paired': 'abcd', 'key': 'abcd'},\n {'tag': '346', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '347', 'required': '', 'paired': 'abcdef', 'key': 'abcdef'},\n {'tag': '348', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '348', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '351', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '352', 'required': '', 'paired': 'abcdefgiq', 'key': 'abcdefgiq'},\n {'tag': '355', 'required': '', 'paired': 'abcdefghj', 'key': 'abcdefghj'},\n {'tag': '357', 'required': 'a', 'key': 'abcg'},\n {'tag': '362', 'required': 'a', 'key': 'az'},\n {'tag': '363', 'required': '', 'paired': 'abcdefghijklmuv', 'key': 'abcdefghijklmuv'},\n {'tag': '365', 'required': 'b', 'paired': 'abcdefghijkm', 'key': 'abcdefghijkm'}, // N=0\n {'tag': '366', 'required': '', 'paired': 'abcdefgjkm', 'key': 'abcdefgjkm'},\n {'tag': '370', 'required': '', 'paired': 'cfgistuv', 'key': 'cfgistuv'},\n {'tag': '377', 'required': '', 'paired': 'al', 'key': 'al'},\n {'tag': '380', 'required': 'a', 'key': 'a'},\n {'tag': '381', 'required': 'auv', 'key': 'auv'},\n {'tag': '382', 'required': ''},\n {'tag': '383', 'required': 'abcde', 'key': 'abcde'},\n {'tag': '384', 'required': 'a', 'key': 'a'},\n {'tag': '385', 'required': 'a', 'paired': 'abmn', 'key': 'abmn'},\n {'tag': '386', 'required': 'a', 'paired': 'abmn', 'key': 'abmn'},\n {'tag': '388', 'required': 'a', 'key': 'a'},\n {'tag': '490', 'required': '', 'key': 'axvl'},\n {'tag': '500', 'required': 'a', 'key': 'a'},\n {'tag': '501', 'required': 'a', 'key': 'a'},\n {'tag': '502', 'required': 'a', 'key': 'abcdgo'},\n {'tag': '504', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '505', 'required': '', 'paired': 'agrtu', 'key': 'agrtu'},\n {'tag': '506', 'required': 'a', 'paired': '', 'key': 'abcdefgqu'},\n {'tag': '507', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '508', 'required': 'a', 'key': 'a'},\n {'tag': '509', 'required': 'a', 'key': 'acd'},\n {'tag': '510', 'required': 'a', 'key': 'abcx'},\n {'tag': '511', 'required': 'a', 'key': 'a'},\n {'tag': '513', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '514', 'required': '', 'paired': 'abcdefghijkmuz', 'key': 'abcdefghijkmuz'},\n {'tag': '515', 'required': 'a', 'key': 'a'},\n {'tag': '518', 'required': '', 'paired': 'adop', 'key': 'adop'},\n {'tag': '520', 'required': 'a', 'paired': 'abc', 'key': 'abc'},\n {'tag': '521', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '522', 'required': 'a', 'key': 'a'},\n {'tag': '524', 'required': 'a', 'key': 'a'},\n {'tag': '525', 'required': 'a', 'key': 'a'},\n {'tag': '526', 'required': 'a', 'paired': 'abcdi', 'key': 'abcdi'},\n {'tag': '530', 'required': 'a', 'paired': 'abcd', 'key': 'abcd'},\n {'tag': '532', 'required': 'a', 'key': 'a'},\n {'tag': '533', 'required': 'a', 'paired': 'abcdefmn7', 'key': 'abcdefmn7'},\n {'tag': '534', 'required': '', 'paired': 'abcempt', 'key': 'abcempt'},\n {'tag': '535', 'required': '', 'paired': 'abcdg', 'key': 'abcdg'},\n {'tag': '536', 'required': '', 'paired': 'abcdefgh', 'key': 'abcdefgh'},\n {'tag': '538', 'required': 'a', 'paired': 'aiu', 'key': 'aiu'},\n {'tag': '540', 'required': '', 'paired': 'abcdfgqu', 'key': 'abcdfgqu'},\n {'tag': '541', 'required': '', 'paired': 'abcdefhno', 'key': 'abcdefhno'},\n {'tag': '542', 'required': '', 'paired': 'abcdfghijklmopqrsu', 'key': 'abcdfghijklmopqrsu'},\n {'tag': '544', 'required': '', 'paired': 'abcden', 'key': 'abcden'},\n {'tag': '545', 'required': '', 'paired': 'abu', 'key': 'abu'},\n {'tag': '546', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '547', 'required': 'a', 'key': 'a'},\n {'tag': '550', 'required': 'a', 'key': 'a'},\n {'tag': '552', 'required': '', 'paired': 'abcdefghijklmnopuz', 'key': 'abcdefghijklmnopuz'},\n {'tag': '555', 'required': 'a', 'paired': 'abcdu', 'key': 'abcdu'},\n {'tag': '556', 'required': 'a', 'key': 'az'},\n {'tag': '561', 'required': 'a', 'key': 'au'},\n {'tag': '562', 'required': '', 'paired': 'abcde', 'key': 'abcde'},\n {'tag': '563', 'required': 'a', 'key': 'au'},\n {'tag': '565', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '567', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '580', 'required': 'a', 'key': 'a'},\n {'tag': '581', 'required': 'a', 'key': 'a'},\n {'tag': '583', 'required': '', 'paired': 'abcdefhijklnou', 'key': 'abcdefhijklnou'},\n {'tag': '584', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '585', 'required': 'a', 'key': 'a'},\n {'tag': '586', 'required': 'a', 'key': 'a'},\n {'tag': '588', 'required': 'a', 'key': 'a'},\n // NB! Currently we never merge 59X fields (see mergableTags.js). Doublish removals such as MELKEHITYS-3147 are handled by postprocessor.\n {'tag': '590', 'required': ''},\n {'tag': '591', 'required': ''},\n {'tag': '592', 'required': ''},\n {'tag': '593', 'required': ''},\n {'tag': '594', 'required': ''},\n {'tag': '595', 'required': ''},\n {'tag': '596', 'required': ''},\n {'tag': '597', 'required': ''},\n {'tag': '598', 'required': ''},\n {'tag': '599', 'required': ''},\n {'tag': '600', 'required': 'a', 'paired': `b${pairedTitleSubfields}vxyz`, 'key': keyX00},\n {'tag': '610', 'required': 'a', 'paired': `b${pairedTitleSubfields}vxyz`, 'key': keyX10},\n {'tag': '611', 'required': 'a', 'paired': `${pairedTitleSubfields}vxyz`, 'key': keyX11},\n {'tag': '630', 'required': 'a', 'paired': `${pairedTitleSubfields}vxyz`, 'key': keyX30},\n // NB! 700, 710 and 711 may have title parts that are handled elsewhere\n {'tag': '647', 'required': 'a', 'paired': 'avxyz', 'key': 'acdgvxyz02'},\n {'tag': '648', 'required': 'a', 'paired': 'avxyz', 'key': 'avxyz02'},\n {'tag': '650', 'required': 'a', 'paired': 'abcdegvxyz', 'key': 'abcdegvxyz20'},\n {'tag': '651', 'required': 'a', 'paired': 'aegvxyz', 'key': 'aegvxyz20'},\n {'tag': '653', 'required': 'a', 'paired': 'a', 'key': 'a'}, // this is interesting as a can be repeated\n {'tag': '654', 'required': '', 'paired': 'abcevxyz'},\n {'tag': '655', 'required': 'a', 'paired': 'abcvxyz', 'key': 'avxyz20'},\n {'tag': '656', 'required': 'a', 'paired': 'akvxyz'}, // N=0\n {'tag': '657', 'required': 'a', 'paired': 'avxyz'}, // N=0\n {'tag': '658', 'required': 'a', 'paired': 'abcd'}, // N=0\n {'tag': '662', 'required': '', 'paired': 'abcdefgh'}, // N=0\n {'tag': '688', 'required': 'a'}, // N=0\n {'tag': '700', 'required': 'a', 'paired': `b${pairedTitleSubfields}x`, 'key': keyX00}, // h/i/m/o/r/s/x are missing from 100, NB! 's' is repeatable, but we are not merging them here!\n {'tag': '710', 'required': 'a', 'paired': `b${pairedTitleSubfields}x`, 'key': keyX10}, // h/j/m/o/r/s/x are missing from 110\n {'tag': '711', 'required': 'a', 'paired': `cdef${pairedTitleSubfields}x`, 'key': keyX11}, // h/i/s/x are missing from 711\n {'tag': '720', 'required': 'a', 'key': 'a'},\n // NB! 730 has no name part, key is used for title part\n {'tag': '730', 'required': 'a', 'paired': `df${pairedTitleSubfields}x`, 'key': keyX30}, // NB: 130->730 magic subfields might not agree...\n {'tag': '740', 'required': 'a', 'key': 'ahnp'},\n {'tag': '751', 'required': 'a', 'key': 'a'}, // N=11, kaikissa pelkk\u00E4 $a\n {'tag': '752', 'required': '', 'key': 'abcdefgh'}, // N=12234\n {'tag': '753', 'required': '', 'key': 'abc'},\n {'tag': '754', 'required': '', 'key': 'acdxz'}, // N=3\n {'tag': '758', 'required': 'a', 'key': 'ai'}, // N=1\n\n {'tag': '760', 'required': 'tw', key: 'twxy'},\n {'tag': '762', 'required': 't', key: 'abcdhmstxy'},\n {'tag': '765', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '767', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '770', 'required': 't', 'paired': 'ruxyz', key: 'abcdhmrstuwxyz'},\n {'tag': '772', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '773', 'required': 'w', key: 'wgq'}, // Kirjav\u00E4litys should not have any component parts. However, this need to be re-thought...\n // Currently we (appently) drop fields that don't contain 773$w...\n {'tag': '774', 'required': '', 'paired': 'nruxyz', 'key': 'npqrstrxyz'},\n {'tag': '775', 'required': '', 'paired': 'ruxyz', 'key': 'abcdefhmstuxyz'},\n {'tag': '776', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmsuwxyz'},\n {'tag': '777', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '780', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '785', 'required': '', 'paired': 'uxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '786', 'required': '', 'paired': 'abcrstuxyz', 'key': 'abcdhijmprstuxyz4'},\n {'tag': '787', 'required': '', 'paired': 'abcdhmstuxyz4'},\n {'tag': '788', 'required': '', 'paired': 'stx', 'key': 'abdestx'},\n {'tag': '800', 'required': 'a', 'paired': 'bt', 'key': keyX00},\n {'tag': '810', 'required': 'a', 'paired': 'bt', 'key': keyX10},\n {'tag': '811', 'required': 'a', 'paired': 't', 'key': keyX11},\n {'tag': '830', 'required': 'a', 'key': keyX30},\n {'tag': '840', 'required': 'a'},\n {'tag': '841', 'required': 'a'},\n {'tag': '842', 'required': 'a'},\n {'tag': '843', 'required': 'a'},\n {'tag': '844', 'required': 'a'},\n {'tag': '845', 'required': 'a'},\n {'tag': '850', 'required': 'a', 'key': 'a'},\n {'tag': '852', 'required': 'a'}, // HMM... we might want to reconsider this...\n {'tag': '853', 'required': 'a'},\n {'tag': '854', 'required': 'a'},\n {'tag': '855', 'required': 'a'},\n {'tag': '856', 'required': 'u', 'paired': 'u', 'key': 'opuw23'}, // 856 is built around $u...\n {'tag': '863', 'required': 'a'},\n {'tag': '864', 'required': 'a'},\n {'tag': '865', 'required': 'a'},\n {'tag': '866', 'required': 'a'},\n {'tag': '867', 'required': 'a'},\n {'tag': '868', 'required': 'a'},\n {'tag': '876', 'required': 'a'},\n {'tag': '877', 'required': 'a'},\n {'tag': '878', 'required': 'a'},\n {'tag': '880', 'required': '', 'paired': 'a', 'key': 'abcdefghijklmnopqrstuvwxyz'},\n {'tag': '881', 'required': ''},\n {'tag': '882', 'required': ''},\n {'tag': '883', 'required': ''},\n {'tag': '884', 'required': '', 'paired': 'agkq'},\n {'tag': '885', 'required': ''},\n {'tag': '886', 'required': ''},\n {'tag': '887', 'required': ''},\n {'tag': '900', 'required': ''},\n {'tag': '901', 'required': ''},\n {'tag': '910', 'required': ''},\n {'tag': '935', 'required': 'a', 'key': 'az'}, // Fono information at least\n {'tag': '940', 'required': ''},\n {'tag': '946', 'required': 'a', 'key': 'abfnp'}, // Copied from 246. However, final version might contain some elements from field 245 as well\n {'tag': '960', 'required': ''},\n {'tag': '973', 'required': 'w', 'key': 'w'}, // Viola multi-hosts\n {'tag': '995', 'required': ''},\n {'tag': 'CAT', 'required': ''},\n {'tag': 'LOW', 'required': ''},\n {'tag': 'SID', 'required': ''}\n];\n\n\nexport function getMergeConstraintsForTag(tag, constraintName = undefined) {\n const tagsConstraintsArray = mergeConstraints.filter(entry => tag === entry.tag);\n if (tagsConstraintsArray.length === 0) {\n debugDev(`WARNING\\tNo key found for ${tag}!`);\n }\n if (!constraintName) {\n return tagsConstraintsArray;\n }\n // NB! should we support multiple contains for a field? Eg. 505$a vs 505($tg)+\n if (tagsConstraintsArray.length > 1) {\n debugDev(`WARNING\\tMultiple values for '${constraintName}' (N=${tagsConstraintsArray.length}) found in ${tag}. Using first values.`);\n }\n //return constraintToValue(tagsConstraintsArray[0], constraintName);\n return tagsConstraintsArray.map(c => constraintToValue(c, constraintName));\n\n function constraintToValue(tagsConstraints, constraintName) {\n if (constraintName in tagsConstraints) {\n return tagsConstraints[constraintName];\n }\n return null; // NB! \"\" might mean \"apply to everything\" (eg. 040.key) while null means that it is not applied.\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,uBAAuB;AAC9B,MAAM,QAAQ,kBAAkB,+DAA+D;AAE/F,MAAM,WAAW,MAAM,OAAO,KAAK;AAWnC,MAAM,SAAS;AACf,MAAM,SAAS;AACf,MAAM,SAAS;AACf,MAAM,SAAS;AACf,MAAM,uBAAuB;AAE7B,MAAM,mBAAmB;AAAA,EACvB,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,IAAG;AAAA;AAAA,EACxD,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,MAAK;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,KAAI;AAAA,EACzD,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,cAAa;AAAA;AAAA,EACnD,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,WAAU;AAAA;AAAA,EACjD,EAAC,OAAO,OAAO,YAAY,MAAM,OAAO,0BAAyB;AAAA,EACjE,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,KAAI;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,GAAE;AAAA,EACxC,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,KAAI;AAAA;AAAA,EACzD,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,GAAE;AAAA;AAAA,EACxC,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,MAAK;AAAA,EAC5C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,OAAO,UAAU,MAAK;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,OAAO,UAAU,MAAK;AAAA;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,gBAAgB,UAAU,eAAc;AAAA,EAC/E,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,OAAM;AAAA,EAC5C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,OAAM;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,MAAK;AAAA;AAAA,EAC5C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,MAAK;AAAA,EAC5C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,KAAK,OAAO,MAAK;AAAA,EAC3D,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,OAAO,OAAO,MAAK;AAAA;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,KAAI;AAAA,EACzD,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,MAAM,OAAO,MAAK;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,KAAK,OAAO,QAAO;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,KAAK,OAAO,QAAO;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,MAAM,OAAO,OAAM;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,gBAAgB,OAAO,gBAAe;AAAA,EAC/E,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,IAAG;AAAA,EACxD,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,IAAG;AAAA;AAAA,EAExD,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,IAAI,oBAAoB,IAAI,OAAO,OAAM;AAAA,EACnF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,IAAI,oBAAoB,IAAI,OAAO,OAAM;AAAA,EACnF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,sBAAsB,OAAO,OAAM;AAAA;AAAA,EAE7E,EAAC,OAAO,OAAO,YAAY,KAAK,QAAQ,sBAAsB,OAAO,OAAM;AAAA,EAC3E,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,gBAAe;AAAA,EACtD,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,UAAS;AAAA,EAChD,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,gBAAe;AAAA,EACtD,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,YAAY,UAAU,QAAO;AAAA,EACpE,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,QAAO;AAAA,EAC9C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,SAAQ;AAAA,EAC/C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,WAAW,UAAU,UAAS;AAAA,EACrE,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA;AAAA,EAE1C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,SAAQ;AAAA,EAC9C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAE1C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,MAAK;AAAA;AAAA;AAAA,EAE3C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,SAAQ;AAAA,EAC9C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAE1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,MAAM,OAAO,MAAK;AAAA;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,MAAM,OAAO,MAAK;AAAA;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,MAAM,OAAO,MAAK;AAAA;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,mBAAmB,OAAO,kBAAiB;AAAA,EACpF,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,QAAO;AAAA;AAAA,EAChE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,2BAA2B,OAAO,0BAAyB;AAAA;AAAA,EACpG,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,aAAa,OAAO,YAAW;AAAA;AAAA,EACxE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,YAAY,OAAO,WAAU;AAAA,EACtE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,QAAQ,OAAO,OAAM;AAAA,EAC9D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,UAAU,OAAO,SAAQ;AAAA,EAClE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,OAAO,OAAO,MAAK;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,OAAO,OAAO,MAAK;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,aAAa,OAAO,YAAW;AAAA,EACxE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,aAAa,OAAO,YAAW;AAAA,EACxE,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,OAAM;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,mBAAmB,OAAO,kBAAiB;AAAA,EACpF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,gBAAgB,OAAO,eAAc;AAAA;AAAA,EAC/E,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,cAAc,OAAO,aAAY;AAAA,EAC1E,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,YAAY,OAAO,WAAU;AAAA,EACtE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,OAAO,OAAO,MAAK;AAAA,EAC9C,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,SAAS,OAAO,QAAO;AAAA,EAClD,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,QAAQ,OAAO,OAAM;AAAA,EAC/D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,QAAQ,OAAO,OAAM;AAAA,EAC/D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,OAAM;AAAA,EAC5C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,SAAQ;AAAA,EAC/C,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,MAAM,OAAO,KAAI;AAAA,EAC3D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,QAAO;AAAA,EAChE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,IAAI,OAAO,YAAW;AAAA,EAChE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,MAAM,OAAO,KAAI;AAAA,EAC3D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,MAAK;AAAA,EAC5C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,OAAM;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,kBAAkB,OAAO,iBAAgB;AAAA,EAClF,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,QAAQ,OAAO,OAAM;AAAA,EAC9D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,OAAO,OAAO,MAAK;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,MAAM,OAAO,KAAI;AAAA,EAC3D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,SAAS,OAAO,QAAO;AAAA,EACjE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,QAAQ,OAAO,OAAM;AAAA,EAC/D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,aAAa,OAAO,YAAW;AAAA,EACzE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,WAAW,OAAO,UAAS;AAAA,EACpE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,QAAO;AAAA,EAChE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,YAAY,OAAO,WAAU;AAAA,EACtE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,OAAO,OAAO,MAAK;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,YAAY,OAAO,WAAU;AAAA,EACtE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,aAAa,OAAO,YAAW;AAAA,EACxE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,sBAAsB,OAAO,qBAAoB;AAAA,EAC1F,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,UAAU,OAAO,SAAQ;AAAA,EAClE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,OAAO,OAAO,MAAK;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,sBAAsB,OAAO,qBAAoB;AAAA,EAC1F,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,SAAS,OAAO,QAAO;AAAA,EACjE,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,QAAO;AAAA,EAChE,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,OAAO,OAAO,MAAK;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,kBAAkB,OAAO,iBAAgB;AAAA,EAClF,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAE1C,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,IAAI,oBAAoB,QAAQ,OAAO,OAAM;AAAA,EACvF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,IAAI,oBAAoB,QAAQ,OAAO,OAAM;AAAA,EACvF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,GAAG,oBAAoB,QAAQ,OAAO,OAAM;AAAA,EACtF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,GAAG,oBAAoB,QAAQ,OAAO,OAAM;AAAA;AAAA,EAEtF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,SAAS,OAAO,aAAY;AAAA,EACtE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,SAAS,OAAO,UAAS;AAAA,EACnE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,cAAc,OAAO,eAAc;AAAA,EAC7E,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,WAAW,OAAO,YAAW;AAAA,EACvE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,KAAK,OAAO,IAAG;AAAA;AAAA,EACzD,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,WAAU;AAAA,EACnD,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,WAAW,OAAO,UAAS;AAAA,EACrE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,SAAQ;AAAA;AAAA,EAClD,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,QAAO;AAAA;AAAA,EACjD,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,OAAM;AAAA;AAAA,EAChD,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,WAAU;AAAA;AAAA,EACnD,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,IAAI,oBAAoB,KAAK,OAAO,OAAM;AAAA;AAAA,EACpF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,IAAI,oBAAoB,KAAK,OAAO,OAAM;AAAA;AAAA,EACpF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,OAAO,oBAAoB,KAAK,OAAO,OAAM;AAAA;AAAA,EACvF,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAE1C,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,KAAK,oBAAoB,KAAK,OAAO,OAAM;AAAA;AAAA,EACrF,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,OAAM;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,WAAU;AAAA;AAAA,EAChD,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,MAAK;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,QAAO;AAAA;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA;AAAA,EAE3C,EAAC,OAAO,OAAO,YAAY,MAAM,KAAK,OAAM;AAAA,EAC5C,EAAC,OAAO,OAAO,YAAY,KAAK,KAAK,aAAY;AAAA,EACjD,EAAC,OAAO,OAAO,YAAY,KAAK,KAAK,iBAAgB;AAAA,EACrD,EAAC,OAAO,OAAO,YAAY,KAAK,KAAK,iBAAgB;AAAA,EACrD,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,SAAS,KAAK,iBAAgB;AAAA,EACxE,EAAC,OAAO,OAAO,YAAY,KAAK,KAAK,iBAAgB;AAAA,EACrD,EAAC,OAAO,OAAO,YAAY,KAAK,KAAK,MAAK;AAAA;AAAA;AAAA,EAE1C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,UAAU,OAAO,aAAY;AAAA,EACtE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,iBAAgB;AAAA,EACzE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,eAAc;AAAA,EACvE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,eAAc;AAAA,EACvE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,eAAc;AAAA,EACvE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,QAAQ,OAAO,eAAc;AAAA,EACtE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,cAAc,OAAO,oBAAmB;AAAA,EACjF,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,gBAAe;AAAA,EACxD,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,OAAO,OAAO,UAAS;AAAA,EAChE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,MAAM,OAAO,OAAM;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,MAAM,OAAO,OAAM;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,KAAK,OAAO,OAAM;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,OAAM;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,KAAK,OAAO,SAAQ;AAAA;AAAA,EAC9D,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,6BAA4B;AAAA,EACjF,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,OAAM;AAAA,EAC/C,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,QAAO;AAAA;AAAA,EAC9C,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAC/B;AAGO,gBAAS,0BAA0B,KAAK,iBAAiB,QAAW;AACzE,QAAM,uBAAuB,iBAAiB,OAAO,WAAS,QAAQ,MAAM,GAAG;AAC/E,MAAI,qBAAqB,WAAW,GAAG;AACrC,aAAS,4BAA6B,GAAG,GAAG;AAAA,EAC9C;AACA,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAEA,MAAI,qBAAqB,SAAS,GAAG;AACnC,aAAS,gCAAiC,cAAc,QAAQ,qBAAqB,MAAM,cAAc,GAAG,uBAAuB;AAAA,EACrI;AAEA,SAAO,qBAAqB,IAAI,OAAK,kBAAkB,GAAG,cAAc,CAAC;AAEzE,WAAS,kBAAkB,iBAAiBA,iBAAgB;AAC1D,QAAIA,mBAAkB,iBAAiB;AACrC,aAAO,gBAAgBA,eAAc;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AACF;",
|
|
6
|
+
"names": ["constraintName"]
|
|
7
7
|
}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import createDebugLogger from "debug";
|
|
2
2
|
import { fieldToString, fieldsToString, fieldsAreIdentical, nvdebug, hasCopyright, removeCopyright, subfieldToString } from "../utils.js";
|
|
3
3
|
import { fieldGetOccurrenceNumberPairs } from "../subfield6Utils.js";
|
|
4
|
-
import { cloneAndNormalizeFieldForComparison, cloneAndRemovePunctuation
|
|
4
|
+
import { cloneAndNormalizeFieldForComparison, cloneAndRemovePunctuation } from "../normalizeFieldForComparison.js";
|
|
5
5
|
import { mergeOrAddSubfield } from "./mergeOrAddSubfield.js";
|
|
6
6
|
import { mergeIndicators } from "./mergeIndicator.js";
|
|
7
7
|
import { mergableTag } from "./mergableTag.js";
|
|
8
8
|
import { getCounterpart } from "./counterpartField.js";
|
|
9
|
+
import { isEnnakkotietoSubfield } from "../prepublicationUtils.js";
|
|
9
10
|
const debug = createDebugLogger("@natlibfi/melinda-marc-record-merge-reducers:mergeField");
|
|
10
11
|
const debugDev = debug.extend("dev");
|
|
11
12
|
function removeEnnakkotieto(field) {
|
|
12
|
-
const tmp = field.subfields.filter((subfield) => !
|
|
13
|
+
const tmp = field.subfields.filter((subfield) => !isEnnakkotietoSubfield(subfield));
|
|
13
14
|
if (tmp.length > 0) {
|
|
14
15
|
field.subfields = tmp;
|
|
15
16
|
}
|
|
@@ -29,7 +30,7 @@ function mergeField2(baseRecord, baseField, sourceField, config, candFieldPairs8
|
|
|
29
30
|
if (fieldToString(baseField) === fieldToString(sourceField)) {
|
|
30
31
|
return baseRecord;
|
|
31
32
|
}
|
|
32
|
-
if (baseField.subfields?.find((sf) =>
|
|
33
|
+
if (baseField.subfields?.find((sf) => isEnnakkotietoSubfield(sf)) && !sourceField.subfields?.find((sf) => isEnnakkotietoSubfield(sf))) {
|
|
33
34
|
removeEnnakkotieto(baseField);
|
|
34
35
|
baseField.merged = 1;
|
|
35
36
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/merge-fields/mergeField.js"],
|
|
4
|
-
"sourcesContent": ["//import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebugLogger from 'debug';\nimport {fieldToString, fieldsToString, fieldsAreIdentical, nvdebug, hasCopyright, removeCopyright, subfieldToString} from '../utils.js';\nimport {fieldGetOccurrenceNumberPairs} from '../subfield6Utils.js';\nimport {cloneAndNormalizeFieldForComparison, cloneAndRemovePunctuation
|
|
5
|
-
"mappings": "AACA,OAAO,uBAAuB;AAC9B,SAAQ,eAAe,gBAAgB,oBAAoB,SAAS,cAAc,iBAAiB,wBAAuB;AAC1H,SAAQ,qCAAoC;AAC5C,SAAQ,qCAAqC,
|
|
4
|
+
"sourcesContent": ["//import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebugLogger from 'debug';\nimport {fieldToString, fieldsToString, fieldsAreIdentical, nvdebug, hasCopyright, removeCopyright, subfieldToString} from '../utils.js';\nimport {fieldGetOccurrenceNumberPairs} from '../subfield6Utils.js';\nimport {cloneAndNormalizeFieldForComparison, cloneAndRemovePunctuation} from '../normalizeFieldForComparison.js';\nimport {mergeOrAddSubfield} from './mergeOrAddSubfield.js';\nimport {mergeIndicators} from './mergeIndicator.js';\nimport {mergableTag} from './mergableTag.js';\nimport {getCounterpart} from './counterpartField.js';\nimport {isEnnakkotietoSubfield} from '../prepublicationUtils.js';\n//import {default as normalizeEncoding} from '@natlibfi/marc-record-validators-melinda/dist/normalize-utf8-diacritics';\n//import {postprocessRecords} from './mergeOrAddPostprocess.js';\n//import {preprocessBeforeAdd} from './processFilter.js';\n\n//const defaultConfig = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'src', 'reducers', 'config.json'), 'utf8'));\n\n// Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeField');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! Can we do this via config.json?\nfunction removeEnnakkotieto(field) {\n const tmp = field.subfields.filter(subfield => !isEnnakkotietoSubfield(subfield));\n // remove only iff some other subfield remains\n if (tmp.length > 0) {\n field.subfields = tmp;\n }\n}\n\n\nfunction copyrightYearHack(baseRecord, baseField, sourceField) {\n if (baseField.tag !== '264' || sourceField.tag !== '260') {\n return;\n }\n const relevantSubfields = sourceField.subfields.filter(sf => sf.code === 'c' && hasCopyright(sf.value));\n\n relevantSubfields.forEach(sf => {\n // Add new:\n const value = sf.value.replace(/\\.$/u, '');\n baseRecord.insertField({'tag': '264', 'ind1': ' ', 'ind2': '4', 'subfields': [{'code': 'c', value}]});\n // Modify original subfield:\n sf.value = removeCopyright(sf.value);\n });\n}\n\nfunction mergeField2(baseRecord, baseField, sourceField, config, candFieldPairs880 = []) {\n //// Identical fields\n // No need to check every subfield separately.\n // Also no need to postprocess the resulting field.\n if (fieldToString(baseField) === fieldToString(sourceField)) {\n return baseRecord;\n }\n\n // If a base ennakkotieto is merged with real data, remove ennakkotieto subfield:\n // (If our prepub normalizations are ok, this should not be needed.\n // However, it's simple and works well enough, so let's keep it here.)\n if (baseField.subfields?.find(sf => isEnnakkotietoSubfield(sf)) && !sourceField.subfields?.find(sf => isEnnakkotietoSubfield(sf))) {\n removeEnnakkotieto(baseField);\n baseField.merged = 1;\n }\n\n copyrightYearHack(baseRecord, baseField, sourceField);\n\n mergeIndicators(baseField, sourceField, config);\n\n\n // We want to add the incoming subfields without punctuation, and add puctuation later on.\n // (Cloning is harmless, but probably not needed.)\n // NEW: we also drag the normalized version along. It is needed for the merge-or-add decision\n const normalizedSourceField = cloneAndNormalizeFieldForComparison(sourceField); // This is for comparison\n const strippedSourceField = cloneAndRemovePunctuation(sourceField); // This is for adding subfields\n\n //nvdebug(` MERGING SUBFIELDS OF '${fieldToString(sourceField)}' (original)`, debugDev);\n //nvdebug(` MERGING SUBFIELDS OF '${fieldToString(normalizedSourceField)}' (comparison)`, debugDev);\n nvdebug(` MERGING SUBFIELDS OF '${fieldToString(strippedSourceField)}' (merge/add)`, debugDev);\n\n sourceField.subfields.forEach((originalSubfield, index) => {\n //strippedSourceField.subfields.forEach((subfieldForMergeOrAdd, index) => {\n const normalizedSubfield = normalizedSourceField.subfields[index];\n const punctlessSubfield = strippedSourceField.subfields[index];\n const originalBaseValue = fieldToString(baseField);\n nvdebug(` TRYING TO MERGE SUBFIELD '${subfieldToString(originalSubfield)}' TO '${originalBaseValue}'`, debugDev);\n\n const subfieldData = {'tag': sourceField.tag, 'code': originalSubfield.code, 'originalValue': originalSubfield.value, 'normalizedValue': normalizedSubfield.value, 'punctuationlessValue': punctlessSubfield.value};\n\n mergeOrAddSubfield(baseField, subfieldData, candFieldPairs880); // candSubfield);\n const newValue = fieldToString(baseField);\n if (originalBaseValue !== newValue) {\n nvdebug(` SUBFIELD MERGE RESULT: '${newValue}'`, debugDev);\n //debug(` TODO: sort subfields, handle punctuation...`);\n }\n //else { debugDev(` mergeOrAddSubfield() did not add '\u2021${fieldToString(subfieldForMergeOrAdd)}' to '${originalValue}'`); }\n\n });\n}\n\n\nfunction skipMergeField(baseRecord, sourceField, config) {\n if (!mergableTag(sourceField.tag, config)) {\n nvdebug(`skipMergeField(): field '${fieldToString(sourceField)}' listed as skippable!`, debugDev);\n return true;\n }\n\n // Skip duplicate field when merging two records (NB! internal merge merges/removes the duplicate field):\n if (!baseRecord.internalMerge && baseRecord.fields.some(baseField => !baseField.mergeCandidate && fieldsAreIdentical(sourceField, baseField))) {\n nvdebug(`skipMergeField(): field '${fieldToString(sourceField)}' already exists! No merge required!`, debugDev);\n sourceField.deleted = 1;\n return true;\n }\n\n return false;\n}\n\nfunction sourceRecordIsBetter(baseField, sourceField) {\n if (!baseField.subfields) {\n return;\n }\n // MELINDA-8978: prefer Asteri version\n if (isAsteriField(sourceField) && !isAsteriField(baseField)) {\n return 1;\n }\n\n function isAsteriField(field) {\n if (field.subfields.some(sf => sf.code === '0' && sf.value.match(/^\\((?:FI-ASTERI-[NW]|FIN1[13])\\)[0-9]{9}$/u))) {\n return true;\n }\n }\n return false;\n}\n\nfunction swapDataBetweenFields(field1, field2) {\n // NB! Does not support controlfields yet! Add support if the need arises.\n if (field1.subfields) { // If field1 has subfields, then also field2 has them. No need to check the other field here.\n swapNamedData('ind1');\n swapNamedData('ind2');\n swapNamedData('subfields');\n return;\n }\n return;\n\n function swapNamedData(name) {\n const data = field1[name];\n field1[name] = field2[name];\n field2[name] = data;\n }\n\n}\n\nexport function mergeField(baseRecord, sourceRecord, sourceField, config) {\n nvdebug(`SELF: ${fieldToString(sourceField)}`, debugDev);\n\n sourceField.mergeCandidate = true;\n // skip duplicates and special cases:\n if (skipMergeField(baseRecord, sourceField, config)) {\n nvdebug(`mergeField(): don't merge '${fieldToString(sourceField)}'`, debugDev);\n delete sourceField.mergeCandidate;\n return false;\n }\n\n nvdebug(`mergeField(): Try to merge '${fieldToString(sourceField)}'.`, debugDev);\n const counterpartField = getCounterpart(baseRecord, sourceRecord, sourceField, config);\n\n if (counterpartField) {\n if (sourceRecordIsBetter(counterpartField, sourceField)) {\n swapDataBetweenFields(counterpartField, sourceField);\n }\n\n const candFieldPairs880 = sourceField.tag === '880' ? undefined : fieldGetOccurrenceNumberPairs(sourceField, sourceRecord.fields);\n nvdebug(`mergeField(): Got counterpart: '${fieldToString(counterpartField)}'. Thus try merge...`, debugDev);\n nvdebug(`PAIR: ${candFieldPairs880 ? fieldsToString(candFieldPairs880) : 'NADA'}`, debugDev);\n mergeField2(baseRecord, counterpartField, sourceField, config, candFieldPairs880);\n sourceField.deleted = 1;\n delete sourceField.mergeCandidate;\n return true;\n }\n // NB! Counterpartless field is inserted to 7XX even if field.tag says 1XX:\n debugDev(`mergeField(): No mergable counterpart found for '${fieldToString(sourceField)}'.`);\n delete sourceField.mergeCandidate;\n return false;\n}\n\n"],
|
|
5
|
+
"mappings": "AACA,OAAO,uBAAuB;AAC9B,SAAQ,eAAe,gBAAgB,oBAAoB,SAAS,cAAc,iBAAiB,wBAAuB;AAC1H,SAAQ,qCAAoC;AAC5C,SAAQ,qCAAqC,iCAAgC;AAC7E,SAAQ,0BAAyB;AACjC,SAAQ,uBAAsB;AAC9B,SAAQ,mBAAkB;AAC1B,SAAQ,sBAAqB;AAC7B,SAAQ,8BAA6B;AASrC,MAAM,QAAQ,kBAAkB,yDAAyD;AAEzF,MAAM,WAAW,MAAM,OAAO,KAAK;AAGnC,SAAS,mBAAmB,OAAO;AACjC,QAAM,MAAM,MAAM,UAAU,OAAO,cAAY,CAAC,uBAAuB,QAAQ,CAAC;AAEhF,MAAI,IAAI,SAAS,GAAG;AAClB,UAAM,YAAY;AAAA,EACpB;AACF;AAGA,SAAS,kBAAkB,YAAY,WAAW,aAAa;AAC7D,MAAI,UAAU,QAAQ,SAAS,YAAY,QAAQ,OAAO;AACxD;AAAA,EACF;AACA,QAAM,oBAAoB,YAAY,UAAU,OAAO,QAAM,GAAG,SAAS,OAAO,aAAa,GAAG,KAAK,CAAC;AAEtG,oBAAkB,QAAQ,QAAM;AAE9B,UAAM,QAAQ,GAAG,MAAM,QAAQ,QAAQ,EAAE;AACzC,eAAW,YAAY,EAAC,OAAO,OAAO,QAAQ,KAAK,QAAQ,KAAK,aAAa,CAAC,EAAC,QAAQ,KAAK,MAAK,CAAC,EAAC,CAAC;AAEpG,OAAG,QAAQ,gBAAgB,GAAG,KAAK;AAAA,EACrC,CAAC;AACH;AAEA,SAAS,YAAY,YAAY,WAAW,aAAa,QAAQ,oBAAoB,CAAC,GAAG;AAIvF,MAAI,cAAc,SAAS,MAAM,cAAc,WAAW,GAAG;AAC3D,WAAO;AAAA,EACT;AAKA,MAAI,UAAU,WAAW,KAAK,QAAM,uBAAuB,EAAE,CAAC,KAAK,CAAC,YAAY,WAAW,KAAK,QAAM,uBAAuB,EAAE,CAAC,GAAG;AACjI,uBAAmB,SAAS;AAC5B,cAAU,SAAS;AAAA,EACrB;AAEA,oBAAkB,YAAY,WAAW,WAAW;AAEpD,kBAAgB,WAAW,aAAa,MAAM;AAM9C,QAAM,wBAAwB,oCAAoC,WAAW;AAC7E,QAAM,sBAAsB,0BAA0B,WAAW;AAIjE,UAAQ,2BAA2B,cAAc,mBAAmB,CAAC,iBAAiB,QAAQ;AAE9F,cAAY,UAAU,QAAQ,CAAC,kBAAkB,UAAU;AAEzD,UAAM,qBAAqB,sBAAsB,UAAU,KAAK;AAChE,UAAM,oBAAoB,oBAAoB,UAAU,KAAK;AAC7D,UAAM,oBAAoB,cAAc,SAAS;AACjD,YAAQ,+BAA+B,iBAAiB,gBAAgB,CAAC,SAAS,iBAAiB,KAAK,QAAQ;AAEhH,UAAM,eAAe,EAAC,OAAO,YAAY,KAAK,QAAQ,iBAAiB,MAAM,iBAAiB,iBAAiB,OAAO,mBAAmB,mBAAmB,OAAO,wBAAwB,kBAAkB,MAAK;AAElN,uBAAmB,WAAW,cAAc,iBAAiB;AAC7D,UAAM,WAAW,cAAc,SAAS;AACxC,QAAI,sBAAsB,UAAU;AAClC,cAAQ,8BAA8B,QAAQ,KAAK,QAAQ;AAAA,IAE7D;AAAA,EAGF,CAAC;AACH;AAGA,SAAS,eAAe,YAAY,aAAa,QAAQ;AACvD,MAAI,CAAC,YAAY,YAAY,KAAK,MAAM,GAAG;AACzC,YAAQ,4BAA4B,cAAc,WAAW,CAAC,0BAA0B,QAAQ;AAChG,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,WAAW,iBAAiB,WAAW,OAAO,KAAK,eAAa,CAAC,UAAU,kBAAkB,mBAAmB,aAAa,SAAS,CAAC,GAAG;AAC7I,YAAQ,4BAA4B,cAAc,WAAW,CAAC,wCAAwC,QAAQ;AAC9G,gBAAY,UAAU;AACtB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,WAAW,aAAa;AACpD,MAAI,CAAC,UAAU,WAAW;AACxB;AAAA,EACF;AAEA,MAAI,cAAc,WAAW,KAAK,CAAC,cAAc,SAAS,GAAG;AAC3D,WAAO;AAAA,EACT;AAEA,WAAS,cAAc,OAAO;AAC5B,QAAI,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,OAAO,GAAG,MAAM,MAAM,4CAA4C,CAAC,GAAG;AAC/G,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,QAAQ,QAAQ;AAE7C,MAAI,OAAO,WAAW;AACpB,kBAAc,MAAM;AACpB,kBAAc,MAAM;AACpB,kBAAc,WAAW;AACzB;AAAA,EACF;AACA;AAEA,WAAS,cAAc,MAAM;AAC3B,UAAM,OAAO,OAAO,IAAI;AACxB,WAAO,IAAI,IAAI,OAAO,IAAI;AAC1B,WAAO,IAAI,IAAI;AAAA,EACjB;AAEF;AAEO,gBAAS,WAAW,YAAY,cAAc,aAAa,QAAQ;AACxE,UAAQ,SAAS,cAAc,WAAW,CAAC,IAAI,QAAQ;AAEvD,cAAY,iBAAiB;AAE7B,MAAI,eAAe,YAAY,aAAa,MAAM,GAAG;AACnD,YAAQ,8BAA8B,cAAc,WAAW,CAAC,KAAK,QAAQ;AAC7E,WAAO,YAAY;AACnB,WAAO;AAAA,EACT;AAEA,UAAQ,+BAA+B,cAAc,WAAW,CAAC,MAAM,QAAQ;AAC/E,QAAM,mBAAmB,eAAe,YAAY,cAAc,aAAa,MAAM;AAErF,MAAI,kBAAkB;AACpB,QAAI,qBAAqB,kBAAkB,WAAW,GAAG;AACvD,4BAAsB,kBAAkB,WAAW;AAAA,IACrD;AAEA,UAAM,oBAAoB,YAAY,QAAQ,QAAQ,SAAY,8BAA8B,aAAa,aAAa,MAAM;AAChI,YAAQ,mCAAmC,cAAc,gBAAgB,CAAC,wBAAwB,QAAQ;AAC1G,YAAQ,SAAS,oBAAoB,eAAe,iBAAiB,IAAI,MAAM,IAAI,QAAQ;AAC3F,gBAAY,YAAY,kBAAkB,aAAa,QAAQ,iBAAiB;AAChF,gBAAY,UAAU;AACtB,WAAO,YAAY;AACnB,WAAO;AAAA,EACT;AAEA,WAAS,oDAAoD,cAAc,WAAW,CAAC,IAAI;AAC3F,SAAO,YAAY;AACnB,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import createDebugLogger from "debug";
|
|
2
|
-
import { cloneAndNormalizeFieldForComparison
|
|
2
|
+
import { cloneAndNormalizeFieldForComparison } from "../normalizeFieldForComparison.js";
|
|
3
3
|
import { normalizeAs, normalizeControlSubfieldValue } from "../normalize-identifiers.js";
|
|
4
|
-
import { fieldHasSubfield, fieldToString,
|
|
4
|
+
import { fieldHasSubfield, fieldToString, isContentSubfieldCode, nvdebug, subfieldIsRepeatable, subfieldToString } from "../utils.js";
|
|
5
5
|
import { mergeSubfield } from "./mergeSubfield.js";
|
|
6
6
|
import { sortAdjacentSubfields } from "../sortSubfields.js";
|
|
7
7
|
import { valueCarriesMeaning } from "./worldKnowledge.js";
|
|
8
8
|
import { resetSubfield6Tag } from "../subfield6Utils.js";
|
|
9
|
+
import { isEnnakkotietoSubfield } from "../prepublicationUtils.js";
|
|
9
10
|
const debug = createDebugLogger("@natlibfi/melinda-marc-record-merge-reducers:mergeOrAddSubfield");
|
|
10
11
|
const debugDev = debug.extend("dev");
|
|
11
12
|
function catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) {
|
|
@@ -19,9 +20,9 @@ function catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTa
|
|
|
19
20
|
}
|
|
20
21
|
return false;
|
|
21
22
|
}
|
|
22
|
-
function
|
|
23
|
-
if (
|
|
24
|
-
debugDev(`Skip '\
|
|
23
|
+
function dataContainsPrepublicationSubfield(candSubfieldData) {
|
|
24
|
+
if (isEnnakkotietoSubfield({ "code": candSubfieldData.code, "value": candSubfieldData.originalValue })) {
|
|
25
|
+
debugDev(`Skip '\u2021${candSubfieldData.code} ${candSubfieldData.originalValue}'`);
|
|
25
26
|
return true;
|
|
26
27
|
}
|
|
27
28
|
return false;
|
|
@@ -52,7 +53,7 @@ function skipNormalizedComparison(tag, subfieldCode, subfieldValue) {
|
|
|
52
53
|
return false;
|
|
53
54
|
}
|
|
54
55
|
function mergeOrAddSubfieldNotRequired(targetField, candSubfieldData) {
|
|
55
|
-
if (catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) ||
|
|
56
|
+
if (catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) || dataContainsPrepublicationSubfield(candSubfieldData)) {
|
|
56
57
|
return true;
|
|
57
58
|
}
|
|
58
59
|
if (mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData)) {
|
|
@@ -89,7 +90,7 @@ function addSubfield(targetField, candSubfield) {
|
|
|
89
90
|
sortAdjacentSubfields(targetField);
|
|
90
91
|
}
|
|
91
92
|
function setPunctuationFlag(field, addedSubfield) {
|
|
92
|
-
if (
|
|
93
|
+
if (!isContentSubfieldCode(addedSubfield.code, field.tag)) {
|
|
93
94
|
return;
|
|
94
95
|
}
|
|
95
96
|
field.useExternalEndPunctuation = 1;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/merge-fields/mergeOrAddSubfield.js"],
|
|
4
|
-
"sourcesContent": ["import createDebugLogger from 'debug';\nimport {cloneAndNormalizeFieldForComparison
|
|
5
|
-
"mappings": "AAAA,OAAO,uBAAuB;AAC9B,SAAQ,
|
|
4
|
+
"sourcesContent": ["import createDebugLogger from 'debug';\nimport {cloneAndNormalizeFieldForComparison} from '../normalizeFieldForComparison.js';\nimport {normalizeAs, normalizeControlSubfieldValue} from '../normalize-identifiers.js';\nimport {fieldHasSubfield, fieldToString, isContentSubfieldCode, nvdebug, subfieldIsRepeatable, subfieldToString} from '../utils.js';\nimport {mergeSubfield} from './mergeSubfield.js';\nimport {sortAdjacentSubfields} from '../sortSubfields.js';\n\nimport {valueCarriesMeaning} from './worldKnowledge.js';\nimport {resetSubfield6Tag} from '../subfield6Utils.js';\nimport {isEnnakkotietoSubfield} from '../prepublicationUtils.js';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeOrAddSubfield');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nfunction catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) {\n if (targetField.tag !== '040' || candSubfieldData.code !== 'd') {\n return false;\n }\n nvdebug(`${fieldToString(targetField)} vs $d ${candSubfieldData.originalValue}}`, debugDev);\n // Add hard-coded exceptions here\n if (targetField.subfields.some(sf => sf.code === 'a' && sf.value === candSubfieldData.originalValue)) {\n nvdebug('040\u2021d matched 040\u2021a', debugDev);\n return true;\n }\n return false;\n}\n\nfunction dataContainsPrepublicationSubfield(candSubfieldData) {\n if (isEnnakkotietoSubfield({'code': candSubfieldData.code, 'value': candSubfieldData.originalValue})) {\n // Skip just \u2021g subfield or the whole field?\n // We decided to skip just this subfield. We want at least $0 and maybe even more from ennakkotieto.\n debugDev(`Skip '\u2021${candSubfieldData.code} ${candSubfieldData.originalValue}'`);\n return true;\n }\n return false;\n}\n\n\nfunction mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData) {\n\n // Don't bring WHATEVER<KEEP> from source 7XX to base 1XX.\n // Exceptionally we can merge <KEEP>ed 7XX with un-<KEEP>ed 1XX as 1XX should not use <KEEP>s.\n if (targetField.tag.charAt(0) === '1' && candSubfieldData.tag.charAt(0) === '7' && candSubfieldData.code === '9' && candSubfieldData.originalValue.match(/<KEEP>/u)) {\n return true;\n }\n\n // Don't add 264$b 'Kustannuspaikka tuntematon' etc\n if (!valueCarriesMeaning(targetField.tag, candSubfieldData.code, candSubfieldData.normalizedValue)) {\n return true;\n }\n\n\n // Don't add $0 subfields that mean the same even if they look different:\n const alephIdentifierType = normalizeAs(targetField.tag, candSubfieldData.code);\n if (alephIdentifierType !== undefined) {\n const normalizedSubfieldValue = normalizeControlSubfieldValue(candSubfieldData.originalValue, alephIdentifierType);\n if (targetField.subfields.some(sf => normalizeControlSubfieldValue(sf.value) === normalizedSubfieldValue && sf.code === candSubfieldData.code)) {\n return true;\n }\n }\n return false;\n}\n\n\nfunction skipNormalizedComparison(tag, subfieldCode, subfieldValue) {\n if (tag === '020' && subfieldCode === 'a') {\n return true;\n }\n // Hackish: we want 'ntamo' to win 'Ntamo'...\n // If there are other similar excepting put them into an array.\n if (['110', '610', '710', '810'].includes(tag) && subfieldCode === 'a' && subfieldValue.substring(0, 5) === 'ntamo') {\n return true;\n }\n return false;\n}\n\nfunction mergeOrAddSubfieldNotRequired(targetField, candSubfieldData) {\n if (catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) || dataContainsPrepublicationSubfield(candSubfieldData)) {\n return true;\n }\n\n if (mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData)) {\n return true;\n }\n\n const relevantTargetSubfields = targetField.subfields.filter(sf => sf.code === candSubfieldData.code);\n // Target field does not have this subfield yet:\n if (relevantTargetSubfields.length === 0) {\n return false;\n }\n nvdebug(` Look for identical subfields in '${fieldToString(targetField)}' using`, debugDev);\n nvdebug(` ORIG. \u2021${candSubfieldData.code} ${candSubfieldData.originalValue}`, debugDev);\n nvdebug(` NO-PUNC \u2021${candSubfieldData.code} ${candSubfieldData.punctuationlessValue}`, debugDev);\n if (relevantTargetSubfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.originalValue)) {\n return true;\n }\n if (relevantTargetSubfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.punctuationlessValue)) {\n return true;\n }\n\n if (!skipNormalizedComparison(targetField.tag, candSubfieldData.code, candSubfieldData.originalValue)) {\n const normalizedTargetField = cloneAndNormalizeFieldForComparison(targetField);\n nvdebug(` Look for identical normalized subfields in '${fieldToString(normalizedTargetField)}'`, debugDev);\n nvdebug(` NO-PUNC \u2021${candSubfieldData.code} ${candSubfieldData.normalizedValue})`, debugDev);\n\n if (normalizedTargetField.subfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.normalizedValue)) {\n // Subfield with identical normalized value exists. Do nothing.\n // Not ideal 382\u2021n subfields, I guess... Nor 505\u2021trg repetitions... These need to be fixed...\n return true;\n }\n }\n\n return false; // (note that this is a double negation: not required is false)\n}\n\nfunction addSubfield(targetField, candSubfield) {\n nvdebug(` Added subfield '${subfieldToString(candSubfield)}' to field`, debugDev);\n // Add subfield to the end of all subfields. NB! Implement a separate function that does this + subfield reordering somehow...\n targetField.subfields.push(candSubfield);\n\n targetField.merged = 1;\n\n setPunctuationFlag(targetField, candSubfield);\n sortAdjacentSubfields(targetField);\n\n}\n\nfunction setPunctuationFlag(field, addedSubfield) {\n if (!isContentSubfieldCode(addedSubfield.code, field.tag)) { // These are never punctuation related\n return;\n }\n field.useExternalEndPunctuation = 1;\n}\n\n\nfunction resetPaired880(candFieldPair880, targetField, punctlessCandSubfield) {\n // No relevant:\n if (punctlessCandSubfield.code !== '6') {\n return;\n }\n if (targetField.tag === '880') {\n return;\n }\n // NB! $6 comes first:\n if (candFieldPair880 === undefined || !candFieldPair880.subfields || candFieldPair880.subfields[0].code !== '6') {\n return;\n\n }\n nvdebug(`880 contents: ${fieldToString(candFieldPair880)}`, debugDev);\n resetSubfield6Tag(candFieldPair880.subfields[0], targetField.tag);\n}\n\nexport function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = []) {\n\n const candSubfieldAsString = `${candSubfieldData.code} ${candSubfieldData.originalValue}`;\n\n nvdebug(` Q: mergeOrAddSubfield '${candSubfieldAsString}'\\n with field '${fieldToString(targetField)}'?`, debugDev);\n if (mergeOrAddSubfieldNotRequired(targetField, candSubfieldData)) {\n nvdebug(` A: No. No need to merge nor to add the subfield '${candSubfieldAsString}'`, debugDev);\n return;\n }\n\n const candSubfield = {'code': candSubfieldData.code, 'value': candSubfieldData.punctuationlessValue};\n\n // Currently only for X00$d 1984- => 1984-2000 type of changes, where source version is better that what base has.\n // It all other cases the original subfield is kept.\n const original = fieldToString(targetField);\n\n if (mergeSubfield(targetField, candSubfield)) { // We might need the normalizedCandSubfield later on\n mergeSubfieldPostprocessor();\n return;\n }\n\n // Subfield codes missing from the original record can be added by default:\n if (addSubfieldWithPreviouslyUnseenSubfieldCode()) {\n return;\n }\n\n // melindaCustomMergeFields.json tells us whether the subfield is repeatable or not:\n if (subfieldIsRepeatable(targetField.tag, candSubfield.code)) {\n // We don't want to add multiple, say, 260$c\n if (['260', '264'].includes(targetField.tag)) {\n nvdebug(` A: Exceptionally skip repeatable existing subfield '${subfieldToString(candSubfield)}'`, debugDev);\n return;\n }\n nvdebug(` A: Yes. Add repeatable subfield '${subfieldToString(candSubfield)}'`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n addSubfield(targetField, candSubfield);\n return;\n }\n\n nvdebug(` A: No. Non-repeatable subfield '${subfieldToString(candSubfield)}'`, debugDev);\n return;\n\n function mergeSubfieldPostprocessor() {\n if (original !== fieldToString(targetField)) {\n nvdebug(` A: Merge. Subfield '${candSubfieldAsString}' replaces the original subfield.`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n return;\n }\n nvdebug(` A: No. Field ${original} already had the same or a synonymous or a better merge candidate than our subfield '${candSubfieldAsString}'.`, debugDev);\n return;\n }\n\n function addSubfieldWithPreviouslyUnseenSubfieldCode() {\n if (!fieldHasSubfield(targetField, candSubfield.code)) {\n nvdebug(` A: Yes. Add previously unseen subfield '${subfieldToString(candSubfield)}'`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n candFieldPairs880.forEach(pair => resetPaired880(pair, targetField, candSubfield));\n addSubfield(targetField, candSubfield);\n return true;\n }\n return false;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import createDebugLogger from "debug";
|
|
2
2
|
import { partsAgree, subfieldContainsPartData } from "../normalizeSubfieldValueForComparison.js";
|
|
3
|
-
import { valueCarriesMeaning } from "./worldKnowledge.js";
|
|
3
|
+
import { getSynonyms, valueCarriesMeaning } from "./worldKnowledge.js";
|
|
4
4
|
import { nvdebug } from "../utils.js";
|
|
5
5
|
import { tagAndSubfieldCodeReferToIsbn } from "../normalizeFieldForComparison.js";
|
|
6
6
|
import { canContainOptionalQualifier, splitToNameAndQualifier } from "./counterpartField.js";
|
|
@@ -115,6 +115,10 @@ function pairHttpAndHttps(candSubfield, relevantSubfields) {
|
|
|
115
115
|
return bs.includes(a);
|
|
116
116
|
}
|
|
117
117
|
function isSynonym(field, candSubfield, relevantSubfields) {
|
|
118
|
+
const finnishForm = getSynonyms(candSubfield.value, field.tag, candSubfield.code, "fin");
|
|
119
|
+
if (finnishForm && finnishForm === relevantSubfields.some((sf) => finnishForm === getSynonyms(sf.value, field.tag, candSubfield.code, "fin"))) {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
118
122
|
if (candSubfield.code === "q" && ["015", "020", "024", "028"].includes(field.tag)) {
|
|
119
123
|
return coverTypesMatch(candSubfield, relevantSubfields);
|
|
120
124
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/merge-fields/mergeSubfield.js"],
|
|
4
|
-
"sourcesContent": ["import createDebugLogger from 'debug';\nimport {partsAgree, subfieldContainsPartData} from '../normalizeSubfieldValueForComparison.js';\nimport {valueCarriesMeaning} from './worldKnowledge.js';\nimport {nvdebug} from '../utils.js';\nimport {tagAndSubfieldCodeReferToIsbn} from '../normalizeFieldForComparison.js';\nimport {canContainOptionalQualifier, splitToNameAndQualifier} from './counterpartField.js';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeSubfield');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! These are X00 specific. Should we somehow parametrize them?\nconst onlyBirthYear = /^[1-9][0-9]*-[,.]?$/u;\nconst onlyDeathYear = /^-[1-9][0-9]*[,.]?$/u;\nconst birthYearAndDeathYear = /^[1-9][0-9]*-[1-9][0-9]*[,.]?$/u;\n\nfunction getDeathYear(str) {\n return parseInt(str.substring(str.indexOf('-') + 1), 10);\n}\n\nfunction isValidBirthYearAndDeathYear(str) {\n if (!birthYearAndDeathYear.test(str)) {\n return false;\n }\n // We have two years\n const b = parseInt(str, 10);\n const d = getDeathYear(str);\n if (b > d) { // died before birth! Rather unlikely.\n return false;\n }\n if (d - b > 125) { // Over 125 years old. Rather unlikely.\n return false;\n }\n // Possible sanity check: Died after current year?\n return true;\n}\n\nfunction anyYear(str) {\n if (onlyBirthYear.test(str) || onlyDeathYear.test(str) || isValidBirthYearAndDeathYear(str)) {\n return true;\n }\n return false;\n}\n\nfunction replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields) {\n if (birthYearAndDeathYear.test(candSubfield.value)) {\n if (onlyBirthYear.test(relevantSubfields[0].value) && parseInt(relevantSubfields[0].value, 10) === parseInt(candSubfield.value, 10)) {\n relevantSubfields[0].value = candSubfield.value;\n return true;\n }\n\n if (onlyDeathYear.test(relevantSubfields[0].value) && getDeathYear(relevantSubfields[0].value) === getDeathYear(candSubfield.value)) {\n relevantSubfields[0].value = candSubfield.value;\n return true;\n }\n }\n return false;\n}\n\nfunction replaceDatesAssociatedWithName(targetField, candSubfield, relevantSubfields) {\n // Add also the death year, if the original value only contains birth year.\n // This function treats only with X00$d subfields:\n if (candSubfield.code !== 'd' || !(/^[1678]00$/u).test(targetField.tag)) { // njsscan-ignore: regex_dos\n return false;\n }\n\n if (!anyYear(relevantSubfields[0].value) && anyYear(candSubfield.value)) {\n relevantSubfields[0].value = candSubfield.value;\n return true;\n }\n\n if (replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields)) {\n return true;\n }\n return false;\n}\n\n// use array.includes(value) for easy extendability (Swedish, other languages, abbrs, etc.()\nfunction isKierreselka(value) {\n return ['kierreselk\u00E4', 'spiral bound', 'spiral-bound', 'spiralrygg'].includes(value);\n}\n\nfunction isKovakantinen(value) {\n return ['hardback', 'hardcover', 'h\u00E5rda p\u00E4rmar', 'kovakantinen'].includes(value);\n}\n\nfunction isPehmeakantinen(value) {\n return ['mjuka p\u00E4rmar', 'paperback', 'pehme\u00E4kantinen', 'softcover'].includes(value);\n}\n\nfunction isItsenainenJatkoOsa(value) {\n if (value.match(/^Frist\u00E5ende forts\u00E4ttning p\u00E5 verket[^a-z]*$/ui)) {\n return true;\n }\n if (value.match(/^Itsen\u00E4inen jatko-osa teokselle[^a-z]*$/ui)) {\n return true;\n }\n return false;\n}\n\nfunction isSisaltaaTeos(value) {\n if (value.match(/^Inneh\u00E5ller \\(verk\\)[^a-z]*$/ui)) {\n return true;\n }\n if (value.match(/^Sis\u00E4lt\u00E4\u00E4 \\(teos\\)[^a-z]*$/ui)) {\n return true;\n }\n return false;\n}\nfunction relationInformationMatches(candSubfield, relevantSubfields) {\n if (isSisaltaaTeos(candSubfield.value) && relevantSubfields.some(sf => isSisaltaaTeos(sf.value))) {\n return true;\n }\n if (isItsenainenJatkoOsa(candSubfield.value) && relevantSubfields.some(sf => isItsenainenJatkoOsa(sf.value))) {\n return true;\n }\n\n return false;\n}\n\nfunction coverTypesMatch(candSubfield, relevantSubfields) {\n if (isPehmeakantinen(candSubfield.value) && relevantSubfields.some(sf => isPehmeakantinen(sf.value))) {\n return true;\n }\n if (isKovakantinen(candSubfield.value) && relevantSubfields.some(sf => isKovakantinen(sf.value))) {\n return true;\n }\n if (isKierreselka(candSubfield.value) && relevantSubfields.some(sf => isKierreselka(sf.value))) {\n return true;\n }\n return false;\n}\n\nfunction httpToHttps(val) {\n return val.replace(/http:\\/\\//ug, 'https://');\n}\n\nfunction pairHttpAndHttps(candSubfield, relevantSubfields) {\n const a = httpToHttps(candSubfield.value);\n const bs = relevantSubfields.map(sf => httpToHttps(sf.value));\n return bs.includes(a);\n}\n\nfunction isSynonym(field, candSubfield, relevantSubfields) {\n if (candSubfield.code === 'q' && ['015', '020', '024', '028'].includes(field.tag)) {\n return coverTypesMatch(candSubfield, relevantSubfields);\n }\n\n //nvdebug(`Looking for synonyms for '${subfieldToString(candSubfield)}'...`, debugDev);\n\n if (relationInformationMatches(candSubfield, relevantSubfields)) {\n return true;\n }\n\n if (pairHttpAndHttps(candSubfield, relevantSubfields)) {\n return true;\n }\n\n return false;\n}\n\nfunction preferHyphenatedISBN(field, candSubfield, relevantSubfields) {\n if (!tagAndSubfieldCodeReferToIsbn(field.tag, candSubfield.code) || candSubfield.value.includes('-') === -1) {\n return false;\n }\n\n // Must not already exist:\n if (relevantSubfields.some(sf => sf.value === candSubfield.value)) {\n return false;\n }\n\n const hyphenlessSubfields = relevantSubfields.filter(sf => sf.value.includes('-') > -1);\n const pair = hyphenlessSubfields.find(sf => sf.value === candSubfield.value.replace(/-/gu, ''));\n if (!pair) {\n return false;\n }\n pair.value = candSubfield.value;\n return true;\n}\n\nfunction preferHttpsOverHttp(candSubfield, relevantSubfields) {\n if (candSubfield.value.substring(0, 8) !== 'https://') {\n return false;\n }\n\n const httpVersion = `http://${candSubfield.value.substring(8)}`;\n const pair = relevantSubfields.find(sf => sf.value === httpVersion);\n\n if (!pair) {\n return false;\n }\n pair.value = candSubfield.value;\n return true;\n}\n\n\nfunction preferQualifierVersion(field, candSubfield, relevantSubfields) {\n if (!canContainOptionalQualifier(field.tag, candSubfield.code)) { // currently only 300$a and 776$i can prefer source...\n return false;\n }\n\n const [name1, qualifier1] = splitToNameAndQualifier(candSubfield.value);\n const pair = relevantSubfields.find(sf => subfieldQualifierCheck(sf, name1, qualifier1));\n if (!pair) {\n return false;\n }\n // SN: \"Kuvailuohjeiden n\u00E4k\u00F6kulmasta epubille ei pit\u00E4isi koskaan merkit\u00E4 sivum\u00E4\u00E4r\u00E4\u00E4\"\n if (field.tag === '300' && candSubfield.code === 'a' && candSubfield.value.match(/(?:online|verkko)/iu)) {\n return true; // True, but don't prefer the source value\n }\n\n pair.value = candSubfield.value;\n return true;\n\n function subfieldQualifierCheck(subfield, name, qualifier) {\n const [name2, qualifier2] = splitToNameAndQualifier(candSubfield.value);\n if (name !== name2) {\n return false;\n }\n if (!qualifier || !qualifier2 || qualifier === qualifier2) {\n return true;\n }\n return false;\n }\n\n}\n\nfunction preferSourceCorporateName(field, candSubfield, pair) {\n if (candSubfield.code !== 'a' || !['110', '610', '710', '810'].includes(field.tag)) {\n return false;\n }\n nvdebug(`CORP base '${pair.value}' vs '${candSubfield.value}'`, debugDev);\n const prefer = actualPrefenceCheck();\n if (prefer) {\n pair.value = candSubfield.value;\n return true;\n }\n return false;\n\n function actualPrefenceCheck() {\n if (candSubfield.value.match(/^Werner S\u00F6derstr\u00F6m/u) && pair.value.match(/^WSOY/ui)) {\n return true;\n }\n if (candSubfield.value.match(/^ntamo/u) && pair.value.match(/^N(?:tamo|TAMO)/u)) {\n return true;\n }\n // Prefer (qualifier):\n const [sourceName, sourceQualifier] = splitToNameAndQualifier(candSubfield.value);\n const [baseName, baseQualifier] = splitToNameAndQualifier(pair.value);\n if (sourceName === baseName && baseQualifier === undefined && sourceQualifier !== undefined) {\n return true;\n }\n // Not taking prefix and suffix into account here...\n return false;\n }\n\n}\n\nexport function mergeSubfield(targetField, candSubfield) {\n // Replace existing subfield with the incoming field. These replacements are by name rather hacky...\n // Currenty we only select the better X00$d.\n // In future we might do more things here. Examples:\n // - \"FOO\" gets replaced by \"Foo\" in certain fields.\n // - \"Etunimi Sukunimi\" might lose to \"Sukunimi, Etunimi\" in X00 fields.\n // - [put your ideas here]\n // Return true, if replace is done.\n // However, replacing/succeeding requires a sanity check, that the new value is a better one...\n // Thus, typically this function fails...\n\n const relevantSubfields = targetField.subfields.filter(subfield => subfield.code === candSubfield.code);\n\n // There's nothing to replace the incoming subfield with. Thus abort:\n if (relevantSubfields.length === 0) {\n return false;\n }\n\n nvdebug(`Got ${relevantSubfields.length} sf-cand(s) for field ${targetField.tag}\u2021${candSubfield.code}`, debugDev);\n\n\n if (replaceDatesAssociatedWithName(targetField, candSubfield, relevantSubfields) ||\n preferHyphenatedISBN(targetField, candSubfield, relevantSubfields) ||\n preferHttpsOverHttp(candSubfield, relevantSubfields) ||\n preferSourceCorporateName(targetField, candSubfield, relevantSubfields[0]) || // SF is non-repeat\n preferQualifierVersion(targetField, candSubfield, relevantSubfields) ||\n isSynonym(targetField, candSubfield, relevantSubfields)) {\n return true;\n }\n\n // We found a crappy empty subfield: replace that with a meaningful one.\n // 260 $a value \"[S.l]\" is the main type for this.\n const meaninglessSubfields = relevantSubfields.filter(sf => !valueCarriesMeaning(targetField.tag, sf.code, sf.value));\n if (meaninglessSubfields.length > 0) {\n meaninglessSubfields[0].value = candSubfield.value;\n return true;\n }\n\n // Mark 490$v \"osa 1\" vs \"1\" as merged (2nd part of MET-53).\n // NB! Keeps the original value and drops the incoming value. (Just preventing it from going to add-part...)\n // NB! We could improve this and choose the longer value later on.\n if (subfieldContainsPartData(targetField.tag, candSubfield.code)) {\n if (relevantSubfields.some(sf => partsAgree(sf.value, candSubfield.value, targetField.tag, candSubfield.code))) {\n return true;\n }\n }\n return false; // default to failure\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAAO,uBAAuB;AAC9B,SAAQ,YAAY,gCAA+B;AACnD,SAAQ,2BAA0B;
|
|
4
|
+
"sourcesContent": ["import createDebugLogger from 'debug';\nimport {partsAgree, subfieldContainsPartData} from '../normalizeSubfieldValueForComparison.js';\nimport {getSynonyms, valueCarriesMeaning} from './worldKnowledge.js';\nimport {nvdebug} from '../utils.js';\nimport {tagAndSubfieldCodeReferToIsbn} from '../normalizeFieldForComparison.js';\nimport {canContainOptionalQualifier, splitToNameAndQualifier} from './counterpartField.js';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeSubfield');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! These are X00 specific. Should we somehow parametrize them?\nconst onlyBirthYear = /^[1-9][0-9]*-[,.]?$/u;\nconst onlyDeathYear = /^-[1-9][0-9]*[,.]?$/u;\nconst birthYearAndDeathYear = /^[1-9][0-9]*-[1-9][0-9]*[,.]?$/u;\n\nfunction getDeathYear(str) {\n return parseInt(str.substring(str.indexOf('-') + 1), 10);\n}\n\nfunction isValidBirthYearAndDeathYear(str) {\n if (!birthYearAndDeathYear.test(str)) {\n return false;\n }\n // We have two years\n const b = parseInt(str, 10);\n const d = getDeathYear(str);\n if (b > d) { // died before birth! Rather unlikely.\n return false;\n }\n if (d - b > 125) { // Over 125 years old. Rather unlikely.\n return false;\n }\n // Possible sanity check: Died after current year?\n return true;\n}\n\nfunction anyYear(str) {\n if (onlyBirthYear.test(str) || onlyDeathYear.test(str) || isValidBirthYearAndDeathYear(str)) {\n return true;\n }\n return false;\n}\n\nfunction replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields) {\n if (birthYearAndDeathYear.test(candSubfield.value)) {\n if (onlyBirthYear.test(relevantSubfields[0].value) && parseInt(relevantSubfields[0].value, 10) === parseInt(candSubfield.value, 10)) {\n relevantSubfields[0].value = candSubfield.value;\n return true;\n }\n\n if (onlyDeathYear.test(relevantSubfields[0].value) && getDeathYear(relevantSubfields[0].value) === getDeathYear(candSubfield.value)) {\n relevantSubfields[0].value = candSubfield.value;\n return true;\n }\n }\n return false;\n}\n\nfunction replaceDatesAssociatedWithName(targetField, candSubfield, relevantSubfields) {\n // Add also the death year, if the original value only contains birth year.\n // This function treats only with X00$d subfields:\n if (candSubfield.code !== 'd' || !(/^[1678]00$/u).test(targetField.tag)) { // njsscan-ignore: regex_dos\n return false;\n }\n\n if (!anyYear(relevantSubfields[0].value) && anyYear(candSubfield.value)) {\n relevantSubfields[0].value = candSubfield.value;\n return true;\n }\n\n if (replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields)) {\n return true;\n }\n return false;\n}\n\n// use array.includes(value) for easy extendability (Swedish, other languages, abbrs, etc.()\nfunction isKierreselka(value) {\n return ['kierreselk\u00E4', 'spiral bound', 'spiral-bound', 'spiralrygg'].includes(value);\n}\n\nfunction isKovakantinen(value) {\n return ['hardback', 'hardcover', 'h\u00E5rda p\u00E4rmar', 'kovakantinen'].includes(value);\n}\n\nfunction isPehmeakantinen(value) {\n return ['mjuka p\u00E4rmar', 'paperback', 'pehme\u00E4kantinen', 'softcover'].includes(value);\n}\n\nfunction isItsenainenJatkoOsa(value) { // Probably movable to synonyms...\n if (value.match(/^Frist\u00E5ende forts\u00E4ttning p\u00E5 verket[^a-z]*$/ui)) {\n return true;\n }\n if (value.match(/^Itsen\u00E4inen jatko-osa teokselle[^a-z]*$/ui)) {\n return true;\n }\n return false;\n}\n\nfunction isSisaltaaTeos(value) {\n if (value.match(/^Inneh\u00E5ller \\(verk\\)[^a-z]*$/ui)) {\n return true;\n }\n if (value.match(/^Sis\u00E4lt\u00E4\u00E4 \\(teos\\)[^a-z]*$/ui)) {\n return true;\n }\n return false;\n}\nfunction relationInformationMatches(candSubfield, relevantSubfields) {\n if (isSisaltaaTeos(candSubfield.value) && relevantSubfields.some(sf => isSisaltaaTeos(sf.value))) {\n return true;\n }\n if (isItsenainenJatkoOsa(candSubfield.value) && relevantSubfields.some(sf => isItsenainenJatkoOsa(sf.value))) {\n return true;\n }\n\n return false;\n}\n\nfunction coverTypesMatch(candSubfield, relevantSubfields) {\n if (isPehmeakantinen(candSubfield.value) && relevantSubfields.some(sf => isPehmeakantinen(sf.value))) {\n return true;\n }\n if (isKovakantinen(candSubfield.value) && relevantSubfields.some(sf => isKovakantinen(sf.value))) {\n return true;\n }\n if (isKierreselka(candSubfield.value) && relevantSubfields.some(sf => isKierreselka(sf.value))) {\n return true;\n }\n return false;\n}\n\nfunction httpToHttps(val) {\n return val.replace(/http:\\/\\//ug, 'https://');\n}\n\nfunction pairHttpAndHttps(candSubfield, relevantSubfields) {\n const a = httpToHttps(candSubfield.value);\n const bs = relevantSubfields.map(sf => httpToHttps(sf.value));\n return bs.includes(a);\n}\n\nfunction isSynonym(field, candSubfield, relevantSubfields) {\n\n const finnishForm = getSynonyms(candSubfield.value, field.tag, candSubfield.code, 'fin');\n if (finnishForm && finnishForm === relevantSubfields.some(sf => finnishForm === getSynonyms(sf.value, field.tag, candSubfield.code, 'fin'))) {\n // NB! There's currently no intelligence (such as checking cat language from 040$b): the preferred value is the one in base.\n // We might later on create a separate translation validator/fixer...\n return true;\n }\n\n\n if (candSubfield.code === 'q' && ['015', '020', '024', '028'].includes(field.tag)) {\n return coverTypesMatch(candSubfield, relevantSubfields);\n }\n\n //nvdebug(`Looking for synonyms for '${subfieldToString(candSubfield)}'...`, debugDev);\n\n if (relationInformationMatches(candSubfield, relevantSubfields)) {\n return true;\n }\n\n if (pairHttpAndHttps(candSubfield, relevantSubfields)) {\n return true;\n }\n\n return false;\n}\n\nfunction preferHyphenatedISBN(field, candSubfield, relevantSubfields) {\n if (!tagAndSubfieldCodeReferToIsbn(field.tag, candSubfield.code) || candSubfield.value.includes('-') === -1) {\n return false;\n }\n\n // Must not already exist:\n if (relevantSubfields.some(sf => sf.value === candSubfield.value)) {\n return false;\n }\n\n const hyphenlessSubfields = relevantSubfields.filter(sf => sf.value.includes('-') > -1);\n const pair = hyphenlessSubfields.find(sf => sf.value === candSubfield.value.replace(/-/gu, ''));\n if (!pair) {\n return false;\n }\n pair.value = candSubfield.value;\n return true;\n}\n\nfunction preferHttpsOverHttp(candSubfield, relevantSubfields) {\n if (candSubfield.value.substring(0, 8) !== 'https://') {\n return false;\n }\n\n const httpVersion = `http://${candSubfield.value.substring(8)}`;\n const pair = relevantSubfields.find(sf => sf.value === httpVersion);\n\n if (!pair) {\n return false;\n }\n pair.value = candSubfield.value;\n return true;\n}\n\n\nfunction preferQualifierVersion(field, candSubfield, relevantSubfields) {\n if (!canContainOptionalQualifier(field.tag, candSubfield.code)) { // currently only 300$a and 776$i can prefer source...\n return false;\n }\n\n const [name1, qualifier1] = splitToNameAndQualifier(candSubfield.value);\n const pair = relevantSubfields.find(sf => subfieldQualifierCheck(sf, name1, qualifier1));\n if (!pair) {\n return false;\n }\n // SN: \"Kuvailuohjeiden n\u00E4k\u00F6kulmasta epubille ei pit\u00E4isi koskaan merkit\u00E4 sivum\u00E4\u00E4r\u00E4\u00E4\"\n if (field.tag === '300' && candSubfield.code === 'a' && candSubfield.value.match(/(?:online|verkko)/iu)) {\n return true; // True, but don't prefer the source value\n }\n\n pair.value = candSubfield.value;\n return true;\n\n function subfieldQualifierCheck(subfield, name, qualifier) {\n const [name2, qualifier2] = splitToNameAndQualifier(candSubfield.value);\n if (name !== name2) {\n return false;\n }\n if (!qualifier || !qualifier2 || qualifier === qualifier2) {\n return true;\n }\n return false;\n }\n\n}\n\nfunction preferSourceCorporateName(field, candSubfield, pair) {\n if (candSubfield.code !== 'a' || !['110', '610', '710', '810'].includes(field.tag)) {\n return false;\n }\n nvdebug(`CORP base '${pair.value}' vs '${candSubfield.value}'`, debugDev);\n const prefer = actualPrefenceCheck();\n if (prefer) {\n pair.value = candSubfield.value;\n return true;\n }\n return false;\n\n function actualPrefenceCheck() {\n if (candSubfield.value.match(/^Werner S\u00F6derstr\u00F6m/u) && pair.value.match(/^WSOY/ui)) {\n return true;\n }\n if (candSubfield.value.match(/^ntamo/u) && pair.value.match(/^N(?:tamo|TAMO)/u)) {\n return true;\n }\n // Prefer (qualifier):\n const [sourceName, sourceQualifier] = splitToNameAndQualifier(candSubfield.value);\n const [baseName, baseQualifier] = splitToNameAndQualifier(pair.value);\n if (sourceName === baseName && baseQualifier === undefined && sourceQualifier !== undefined) {\n return true;\n }\n // Not taking prefix and suffix into account here...\n return false;\n }\n\n}\n\nexport function mergeSubfield(targetField, candSubfield) {\n // Replace existing subfield with the incoming field. These replacements are by name rather hacky...\n // Currenty we only select the better X00$d.\n // In future we might do more things here. Examples:\n // - \"FOO\" gets replaced by \"Foo\" in certain fields.\n // - \"Etunimi Sukunimi\" might lose to \"Sukunimi, Etunimi\" in X00 fields.\n // - [put your ideas here]\n // Return true, if replace is done.\n // However, replacing/succeeding requires a sanity check, that the new value is a better one...\n // Thus, typically this function fails...\n\n const relevantSubfields = targetField.subfields.filter(subfield => subfield.code === candSubfield.code);\n\n // There's nothing to replace the incoming subfield with. Thus abort:\n if (relevantSubfields.length === 0) {\n return false;\n }\n\n nvdebug(`Got ${relevantSubfields.length} sf-cand(s) for field ${targetField.tag}\u2021${candSubfield.code}`, debugDev);\n\n\n if (replaceDatesAssociatedWithName(targetField, candSubfield, relevantSubfields) ||\n preferHyphenatedISBN(targetField, candSubfield, relevantSubfields) ||\n preferHttpsOverHttp(candSubfield, relevantSubfields) ||\n preferSourceCorporateName(targetField, candSubfield, relevantSubfields[0]) || // SF is non-repeat\n preferQualifierVersion(targetField, candSubfield, relevantSubfields) ||\n isSynonym(targetField, candSubfield, relevantSubfields)) {\n return true;\n }\n\n // We found a crappy empty subfield: replace that with a meaningful one.\n // 260 $a value \"[S.l]\" is the main type for this.\n const meaninglessSubfields = relevantSubfields.filter(sf => !valueCarriesMeaning(targetField.tag, sf.code, sf.value));\n if (meaninglessSubfields.length > 0) {\n meaninglessSubfields[0].value = candSubfield.value;\n return true;\n }\n\n // Mark 490$v \"osa 1\" vs \"1\" as merged (2nd part of MET-53).\n // NB! Keeps the original value and drops the incoming value. (Just preventing it from going to add-part...)\n // NB! We could improve this and choose the longer value later on.\n if (subfieldContainsPartData(targetField.tag, candSubfield.code)) {\n if (relevantSubfields.some(sf => partsAgree(sf.value, candSubfield.value, targetField.tag, candSubfield.code))) {\n return true;\n }\n }\n return false; // default to failure\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|