@natlibfi/marc-record-validators-melinda 11.0.0-alpha.1 → 11.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addMissingField336.js +272 -0
- package/dist/addMissingField336.js.map +1 -0
- package/dist/addMissingField336.spec.js +45 -0
- package/dist/addMissingField336.spec.js.map +1 -0
- package/dist/addMissingField337.js +177 -0
- package/dist/addMissingField337.js.map +1 -0
- package/dist/addMissingField337.spec.js +43 -0
- package/dist/addMissingField337.spec.js.map +1 -0
- package/dist/addMissingField338.js +424 -0
- package/dist/addMissingField338.js.map +1 -0
- package/dist/addMissingField338.spec.js +45 -0
- package/dist/addMissingField338.spec.js.map +1 -0
- package/dist/cyrillux-usemarcon-replacement.js +370 -0
- package/dist/cyrillux-usemarcon-replacement.js.map +1 -0
- package/dist/cyrillux-usemarcon-replacement.spec.js +45 -0
- package/dist/cyrillux-usemarcon-replacement.spec.js.map +1 -0
- package/dist/field33XUtils.js +529 -0
- package/dist/field33XUtils.js.map +1 -0
- package/dist/fix-33X.js +484 -0
- package/dist/fix-33X.js.map +1 -0
- package/dist/fix-33X.spec.js +45 -0
- package/dist/fix-33X.spec.js.map +1 -0
- package/dist/fix-language-codes.js +109 -0
- package/dist/fix-language-codes.js.map +1 -0
- package/dist/fix-language-codes.spec.js +44 -0
- package/dist/fix-language-codes.spec.js.map +1 -0
- package/dist/fixRelatorTerms.js +1 -1
- package/dist/fixRelatorTerms.js.map +1 -1
- package/dist/punctuation2.js +4 -3
- package/dist/punctuation2.js.map +1 -1
- package/dist/resolvable-ext-references-melinda.spec.js +1 -1
- package/dist/resolvable-ext-references-melinda.spec.js.map +1 -1
- package/dist/sanitize-vocabulary-source-codes.js +7 -10
- package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
- package/dist/utils.js +13 -8
- package/dist/utils.js.map +1 -1
- package/package.json +7 -7
- package/src/addMissingField336.js +260 -0
- package/src/addMissingField336.spec.js +46 -0
- package/src/addMissingField337.js +132 -0
- package/src/addMissingField337.spec.js +45 -0
- package/src/addMissingField338.js +446 -0
- package/src/addMissingField338.spec.js +46 -0
- package/src/cyrillux-usemarcon-replacement.js +410 -0
- package/src/cyrillux-usemarcon-replacement.spec.js +47 -0
- package/src/field33XUtils.js +156 -0
- package/src/fix-33X.js +473 -0
- package/src/fix-33X.spec.js +46 -0
- package/src/fix-language-codes.js +121 -0
- package/src/fix-language-codes.spec.js +45 -0
- package/src/fixRelatorTerms.js +1 -1
- package/src/punctuation2.js +3 -3
- package/src/sanitize-vocabulary-source-codes.js +9 -11
- package/src/utils.js +13 -8
- package/test-fixtures/addMissingField336/01/expectedResult.json +6 -0
- package/test-fixtures/addMissingField336/01/metadata.json +7 -0
- package/test-fixtures/addMissingField336/01/record.json +8 -0
- package/test-fixtures/addMissingField336/02/expectedResult.json +4 -0
- package/test-fixtures/addMissingField336/02/metadata.json +7 -0
- package/test-fixtures/addMissingField336/02/record.json +13 -0
- package/test-fixtures/addMissingField336/cod/expectedResult.json +12 -0
- package/test-fixtures/addMissingField336/cod/metadata.json +6 -0
- package/test-fixtures/addMissingField336/cod/record.json +6 -0
- package/test-fixtures/addMissingField336/cop/expectedResult.json +12 -0
- package/test-fixtures/addMissingField336/cop/metadata.json +6 -0
- package/test-fixtures/addMissingField336/cop/record.json +6 -0
- package/test-fixtures/addMissingField336/cop2/expectedResult.json +13 -0
- package/test-fixtures/addMissingField336/cop2/metadata.json +6 -0
- package/test-fixtures/addMissingField336/cop2/record.json +7 -0
- package/test-fixtures/addMissingField336/crf/expectedResult.json +12 -0
- package/test-fixtures/addMissingField336/crf/metadata.json +6 -0
- package/test-fixtures/addMissingField336/crf/record.json +6 -0
- package/test-fixtures/addMissingField336/cri/expectedResult.json +12 -0
- package/test-fixtures/addMissingField336/cri/metadata.json +6 -0
- package/test-fixtures/addMissingField336/cri/record.json +6 -0
- package/test-fixtures/addMissingField336/crt/expectedResult.json +13 -0
- package/test-fixtures/addMissingField336/crt/metadata.json +6 -0
- package/test-fixtures/addMissingField336/crt/record.json +7 -0
- package/test-fixtures/addMissingField336/f01/expectedResult.json +17 -0
- package/test-fixtures/addMissingField336/f01/metadata.json +6 -0
- package/test-fixtures/addMissingField336/f01/record.json +11 -0
- package/test-fixtures/addMissingField336/f02/expectedResult.json +15 -0
- package/test-fixtures/addMissingField336/f02/metadata.json +6 -0
- package/test-fixtures/addMissingField336/f02/record.json +9 -0
- package/test-fixtures/addMissingField336/mixed2txt/expectedResult.json +12 -0
- package/test-fixtures/addMissingField336/mixed2txt/metadata.json +6 -0
- package/test-fixtures/addMissingField336/mixed2txt/record.json +6 -0
- package/test-fixtures/addMissingField336/mixed2xxx/expectedResult.json +12 -0
- package/test-fixtures/addMissingField336/mixed2xxx/metadata.json +6 -0
- package/test-fixtures/addMissingField336/mixed2xxx/record.json +6 -0
- package/test-fixtures/addMissingField336/ntm/expectedResult.json +12 -0
- package/test-fixtures/addMissingField336/ntm/metadata.json +6 -0
- package/test-fixtures/addMissingField336/ntm/record.json +6 -0
- package/test-fixtures/addMissingField336/snd/expectedResult.json +12 -0
- package/test-fixtures/addMissingField336/snd/metadata.json +6 -0
- package/test-fixtures/addMissingField336/snd/record.json +6 -0
- package/test-fixtures/addMissingField336/spw/expectedResult.json +12 -0
- package/test-fixtures/addMissingField336/spw/metadata.json +6 -0
- package/test-fixtures/addMissingField336/spw/record.json +6 -0
- package/test-fixtures/addMissingField336/spw2/expectedResult.json +13 -0
- package/test-fixtures/addMissingField336/spw2/metadata.json +6 -0
- package/test-fixtures/addMissingField336/spw2/record.json +7 -0
- package/test-fixtures/addMissingField336/spw_txt/expectedResult.json +18 -0
- package/test-fixtures/addMissingField336/spw_txt/metadata.json +6 -0
- package/test-fixtures/addMissingField336/spw_txt/record.json +7 -0
- package/test-fixtures/addMissingField336/sti/expectedResult.json +12 -0
- package/test-fixtures/addMissingField336/sti/metadata.json +6 -0
- package/test-fixtures/addMissingField336/sti/record.json +6 -0
- package/test-fixtures/addMissingField336/sti_projected/expectedResult.json +13 -0
- package/test-fixtures/addMissingField336/sti_projected/metadata.json +6 -0
- package/test-fixtures/addMissingField336/sti_projected/record.json +7 -0
- package/test-fixtures/addMissingField336/tci/expectedResult.json +12 -0
- package/test-fixtures/addMissingField336/tci/metadata.json +6 -0
- package/test-fixtures/addMissingField336/tci/record.json +6 -0
- package/test-fixtures/addMissingField336/tcm/expectedResult.json +12 -0
- package/test-fixtures/addMissingField336/tcm/metadata.json +6 -0
- package/test-fixtures/addMissingField336/tcm/record.json +6 -0
- package/test-fixtures/addMissingField336/tdf/expectedResult.json +12 -0
- package/test-fixtures/addMissingField336/tdf/metadata.json +6 -0
- package/test-fixtures/addMissingField336/tdf/record.json +6 -0
- package/test-fixtures/addMissingField336/tdi/expectedResult.json +13 -0
- package/test-fixtures/addMissingField336/tdi/metadata.json +6 -0
- package/test-fixtures/addMissingField336/tdi/record.json +7 -0
- package/test-fixtures/addMissingField336/txt/expectedResult.json +12 -0
- package/test-fixtures/addMissingField336/txt/metadata.json +6 -0
- package/test-fixtures/addMissingField336/txt/record.json +6 -0
- package/test-fixtures/addMissingField336/zzz/expectedResult.json +13 -0
- package/test-fixtures/addMissingField336/zzz/metadata.json +6 -0
- package/test-fixtures/addMissingField336/zzz/record.json +7 -0
- package/test-fixtures/addMissingField337/c1/expectedResult.json +12 -0
- package/test-fixtures/addMissingField337/c1/metadata.json +6 -0
- package/test-fixtures/addMissingField337/c1/record.json +7 -0
- package/test-fixtures/addMissingField337/g1/expectedResult.json +13 -0
- package/test-fixtures/addMissingField337/g1/metadata.json +6 -0
- package/test-fixtures/addMissingField337/g1/record.json +7 -0
- package/test-fixtures/addMissingField337/n1/expectedResult.json +12 -0
- package/test-fixtures/addMissingField337/n1/metadata.json +6 -0
- package/test-fixtures/addMissingField337/n1/record.json +6 -0
- package/test-fixtures/addMissingField337/no_action_required/expectedResult.json +12 -0
- package/test-fixtures/addMissingField337/no_action_required/metadata.json +7 -0
- package/test-fixtures/addMissingField337/no_action_required/record.json +11 -0
- package/test-fixtures/addMissingField337/p1/expectedResult.json +12 -0
- package/test-fixtures/addMissingField337/p1/metadata.json +6 -0
- package/test-fixtures/addMissingField337/p1/record.json +6 -0
- package/test-fixtures/addMissingField337/validate_x1/expectedResult.json +6 -0
- package/test-fixtures/addMissingField337/validate_x1/metadata.json +6 -0
- package/test-fixtures/addMissingField337/validate_x1/record.json +6 -0
- package/test-fixtures/addMissingField338/cb/expectedResult.json +14 -0
- package/test-fixtures/addMissingField338/cb/metadata.json +6 -0
- package/test-fixtures/addMissingField338/cb/record.json +8 -0
- package/test-fixtures/addMissingField338/cd/expectedResult.json +14 -0
- package/test-fixtures/addMissingField338/cd/metadata.json +6 -0
- package/test-fixtures/addMissingField338/cd/record.json +8 -0
- package/test-fixtures/addMissingField338/ck/expectedResult.json +14 -0
- package/test-fixtures/addMissingField338/ck/metadata.json +6 -0
- package/test-fixtures/addMissingField338/ck/record.json +8 -0
- package/test-fixtures/addMissingField338/cr/expectedResult.json +15 -0
- package/test-fixtures/addMissingField338/cr/metadata.json +6 -0
- package/test-fixtures/addMissingField338/cr/record.json +9 -0
- package/test-fixtures/addMissingField338/cr2/expectedResult.json +14 -0
- package/test-fixtures/addMissingField338/cr2/metadata.json +6 -0
- package/test-fixtures/addMissingField338/cr2/record.json +8 -0
- package/test-fixtures/addMissingField338/cr3/expectedResult.json +18 -0
- package/test-fixtures/addMissingField338/cr3/metadata.json +6 -0
- package/test-fixtures/addMissingField338/cr3/record.json +12 -0
- package/test-fixtures/addMissingField338/cr4/expectedResult.json +15 -0
- package/test-fixtures/addMissingField338/cr4/metadata.json +6 -0
- package/test-fixtures/addMissingField338/cr4/record.json +9 -0
- package/test-fixtures/addMissingField338/gc/expectedResult.json +12 -0
- package/test-fixtures/addMissingField338/gc/metadata.json +6 -0
- package/test-fixtures/addMissingField338/gc/record.json +7 -0
- package/test-fixtures/addMissingField338/gd/expectedResult.json +13 -0
- package/test-fixtures/addMissingField338/gd/metadata.json +6 -0
- package/test-fixtures/addMissingField338/gd/record.json +8 -0
- package/test-fixtures/addMissingField338/gf/expectedResult.json +13 -0
- package/test-fixtures/addMissingField338/gf/metadata.json +6 -0
- package/test-fixtures/addMissingField338/gf/record.json +8 -0
- package/test-fixtures/addMissingField338/gs/expectedResult.json +15 -0
- package/test-fixtures/addMissingField338/gs/metadata.json +6 -0
- package/test-fixtures/addMissingField338/gs/record.json +9 -0
- package/test-fixtures/addMissingField338/gt/expectedResult.json +15 -0
- package/test-fixtures/addMissingField338/gt/metadata.json +6 -0
- package/test-fixtures/addMissingField338/gt/record.json +9 -0
- package/test-fixtures/addMissingField338/hd/expectedResult.json +16 -0
- package/test-fixtures/addMissingField338/hd/metadata.json +6 -0
- package/test-fixtures/addMissingField338/hd/record.json +10 -0
- package/test-fixtures/addMissingField338/he/expectedResult.json +15 -0
- package/test-fixtures/addMissingField338/he/metadata.json +6 -0
- package/test-fixtures/addMissingField338/he/record.json +9 -0
- package/test-fixtures/addMissingField338/he2/expectedResult.json +12 -0
- package/test-fixtures/addMissingField338/he2/metadata.json +6 -0
- package/test-fixtures/addMissingField338/he2/record.json +6 -0
- package/test-fixtures/addMissingField338/hg/expectedResult.json +15 -0
- package/test-fixtures/addMissingField338/hg/metadata.json +7 -0
- package/test-fixtures/addMissingField338/hg/record.json +9 -0
- package/test-fixtures/addMissingField338/hg2/expectedResult.json +15 -0
- package/test-fixtures/addMissingField338/hg2/metadata.json +6 -0
- package/test-fixtures/addMissingField338/hg2/record.json +9 -0
- package/test-fixtures/addMissingField338/hj/expectedResult.json +15 -0
- package/test-fixtures/addMissingField338/hj/metadata.json +6 -0
- package/test-fixtures/addMissingField338/hj/record.json +9 -0
- package/test-fixtures/addMissingField338/hj2/expectedResult.json +15 -0
- package/test-fixtures/addMissingField338/hj2/metadata.json +6 -0
- package/test-fixtures/addMissingField338/hj2/record.json +9 -0
- package/test-fixtures/addMissingField338/mo/expectedResult.json +15 -0
- package/test-fixtures/addMissingField338/mo/metadata.json +6 -0
- package/test-fixtures/addMissingField338/mo/record.json +9 -0
- package/test-fixtures/addMissingField338/nc/expectedResult.json +19 -0
- package/test-fixtures/addMissingField338/nc/metadata.json +6 -0
- package/test-fixtures/addMissingField338/nc/record.json +13 -0
- package/test-fixtures/addMissingField338/nr/expectedResult.json +12 -0
- package/test-fixtures/addMissingField338/nr/metadata.json +7 -0
- package/test-fixtures/addMissingField338/nr/record.json +6 -0
- package/test-fixtures/addMissingField338/sd/expectedResult.json +14 -0
- package/test-fixtures/addMissingField338/sd/metadata.json +6 -0
- package/test-fixtures/addMissingField338/sd/record.json +8 -0
- package/test-fixtures/addMissingField338/sd2/expectedResult.json +14 -0
- package/test-fixtures/addMissingField338/sd2/metadata.json +6 -0
- package/test-fixtures/addMissingField338/sd2/record.json +8 -0
- package/test-fixtures/addMissingField338/sd3/expectedResult.json +14 -0
- package/test-fixtures/addMissingField338/sd3/metadata.json +6 -0
- package/test-fixtures/addMissingField338/sd3/record.json +8 -0
- package/test-fixtures/addMissingField338/ss/expectedResult.json +14 -0
- package/test-fixtures/addMissingField338/ss/metadata.json +6 -0
- package/test-fixtures/addMissingField338/ss/record.json +8 -0
- package/test-fixtures/addMissingField338/ss2/expectedResult.json +14 -0
- package/test-fixtures/addMissingField338/ss2/metadata.json +6 -0
- package/test-fixtures/addMissingField338/ss2/record.json +8 -0
- package/test-fixtures/addMissingField338/vd/expectedResult.json +15 -0
- package/test-fixtures/addMissingField338/vd/metadata.json +6 -0
- package/test-fixtures/addMissingField338/vd/record.json +9 -0
- package/test-fixtures/addMissingField338/vd2/expectedResult.json +13 -0
- package/test-fixtures/addMissingField338/vd2/metadata.json +6 -0
- package/test-fixtures/addMissingField338/vd2/record.json +8 -0
- package/test-fixtures/addMissingField338/vf/expectedResult.json +15 -0
- package/test-fixtures/addMissingField338/vf/metadata.json +6 -0
- package/test-fixtures/addMissingField338/vf/record.json +9 -0
- package/test-fixtures/addMissingField338/zu/expectedResult.json +14 -0
- package/test-fixtures/addMissingField338/zu/metadata.json +6 -0
- package/test-fixtures/addMissingField338/zu/record.json +8 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f01/expectedResult.json +32 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f01/metadata.json +7 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f01/record.json +20 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f02/expectedResult.json +29 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f02/metadata.json +7 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f02/record.json +9 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f03/expectedResult.json +34 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f03/metadata.json +7 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f03/record.json +12 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f04/expectedResult.json +26 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f04/metadata.json +8 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f04/record.json +6 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f05/expectedResult.json +27 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f05/metadata.json +7 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f05/record.json +8 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f06/expectedResult.json +27 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f06/metadata.json +7 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f06/record.json +8 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f07/expectedResult.json +25 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f07/metadata.json +7 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f07/record.json +8 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f08/expectedResult.json +34 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f08/metadata.json +6 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f08/record.json +33 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f09/expectedResult.json +35 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f09/metadata.json +6 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f09/record.json +35 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f10/expectedResult.json +41 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f10/metadata.json +7 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f10/record.json +33 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f11/expectedResult.json +32 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f11/metadata.json +6 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/f11/record.json +22 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/v01/expectedResult.json +7 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/v01/metadata.json +6 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/v01/record.json +20 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/v02/expectedResult.json +5 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/v02/metadata.json +6 -0
- package/test-fixtures/cyrillux-usemarcon-replacement/v02/record.json +29 -0
- package/test-fixtures/fix-33X/f11/expectedResult.json +29 -0
- package/test-fixtures/fix-33X/f11/metadata.json +6 -0
- package/test-fixtures/fix-33X/f11/record.json +22 -0
- package/test-fixtures/fix-33X/v11/expectedResult.json +9 -0
- package/test-fixtures/fix-33X/v11/metadata.json +6 -0
- package/test-fixtures/fix-33X/v11/record.json +22 -0
- package/test-fixtures/fix-language-codes/01/expectedResult.json +5 -0
- package/test-fixtures/fix-language-codes/01/metadata.json +6 -0
- package/test-fixtures/fix-language-codes/01/record.json +7 -0
- package/test-fixtures/fix-language-codes/02/expectedResult.json +7 -0
- package/test-fixtures/fix-language-codes/02/metadata.json +6 -0
- package/test-fixtures/fix-language-codes/02/record.json +10 -0
- package/test-fixtures/fix-language-codes/03/expectedResult.json +10 -0
- package/test-fixtures/fix-language-codes/03/metadata.json +6 -0
- package/test-fixtures/fix-language-codes/03/record.json +8 -0
- package/test-fixtures/fix-language-codes/04/expectedResult.json +9 -0
- package/test-fixtures/fix-language-codes/04/metadata.json +7 -0
- package/test-fixtures/fix-language-codes/04/record.json +7 -0
- package/test-fixtures/fix-language-codes/05/expectedResult.json +8 -0
- package/test-fixtures/fix-language-codes/05/metadata.json +6 -0
- package/test-fixtures/fix-language-codes/05/record.json +5 -0
- package/test-fixtures/punctuation2/95/expectedResult.json +22 -0
- package/test-fixtures/punctuation2/95/metadata.json +6 -0
- package/test-fixtures/punctuation2/95/record.json +20 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +143 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f03/metadata.json +9 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f03/record.json +145 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v03/expectedResult.json +5 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v03/metadata.json +6 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v03/record.json +145 -0
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* cyrillux-usemarcon-replacement.js -- implement and improve https://github.com/NatLibFi/USEMARCON-Cyrillux/tree/master
|
|
3
|
+
*
|
|
4
|
+
* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>
|
|
5
|
+
*
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import clone from 'clone';
|
|
9
|
+
import {MarcRecord} from '@natlibfi/marc-record';
|
|
10
|
+
import {default as fix33X} from './fix-33X';
|
|
11
|
+
import {default as add336} from './addMissingField336';
|
|
12
|
+
import {default as add337} from './addMissingField337';
|
|
13
|
+
import {default as add338} from './addMissingField338';
|
|
14
|
+
import {default as fixCountryCodes} from './fix-country-codes';
|
|
15
|
+
import {default as fixLanguageCodes} from './fix-language-codes';
|
|
16
|
+
import {default as fixRelatorTerms} from './fixRelatorTerms';
|
|
17
|
+
import {default as fixIndicators} from './indicator-fixes';
|
|
18
|
+
import {default as fixPunctuation} from './punctuation2';
|
|
19
|
+
import {default as fixQualifyingInformation} from './normalize-qualifying-information';
|
|
20
|
+
import {sortAdjacentSubfields} from './sortSubfields';
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
// import createDebugLogger from 'debug';
|
|
24
|
+
import {nvdebug, recordToString} from './utils';
|
|
25
|
+
|
|
26
|
+
// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');
|
|
27
|
+
|
|
28
|
+
const description = 'Replacement for Cyrillux usemarcon rules';
|
|
29
|
+
|
|
30
|
+
// Extended original list with 541, 561, 562, 583, 584
|
|
31
|
+
const dropTags = ['001', '003', '010', '012', '014', '015', '016', '019', '025', '029', '032', '035', '036', '037', '038', '042', '049', '051', '061', '068', '071', '074', '079', '090', '091', '092', '094', '095', '096', '097', '099', '249', '261', '262', '350', '400', '411', '541', '561', '562', '574', '575', '577', '578', '583', '584', '589', '590', '591', '592', '593', '594', '595', '596', '597', '598', '599', '653', '698', '741', '742', '744', '761', '790', '841', '842', '843', '844', '845', '850', '852', '853', '854', '855', '858', '859', '863', '864', '865', '866', '867', '868', '876', '877', '878', '882', '886', '887', '888', '890', '899'];
|
|
32
|
+
|
|
33
|
+
export default function () {
|
|
34
|
+
return {
|
|
35
|
+
description, fix, validate
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
function fix(record) {
|
|
39
|
+
nvdebug(`${description}: fix`);
|
|
40
|
+
realFix(record);
|
|
41
|
+
const res = {message: [], fix: [], valid: true};
|
|
42
|
+
return res;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function realFix(record) {
|
|
46
|
+
// Fix leader: standard fixes + update LDR/17 to '4'
|
|
47
|
+
fixLeader(record);
|
|
48
|
+
record.leader = `${record.leader.substring(0, 17)}4${record.leader.substring(18, 24)}`; // eslint-disable-line functional/immutable-data
|
|
49
|
+
|
|
50
|
+
// Remove unwanted fields:
|
|
51
|
+
record.fields = record.fields.filter(f => !dropTags.includes(f.tag)); // eslint-disable-line functional/immutable-data
|
|
52
|
+
|
|
53
|
+
record.fields.forEach(f => fieldSpecificStuff(f));
|
|
54
|
+
|
|
55
|
+
function fieldSpecificStuff(field) {
|
|
56
|
+
removeOwnershipSubfield5(field);
|
|
57
|
+
removeFromOldCatalog(field); // Remove LoC phrase "[from old catalog]" from srings
|
|
58
|
+
translateFieldToFinnish(field);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
fixCountryCodes().fix(record); // 008/15-17
|
|
62
|
+
fixLanguageCodes().fix(record); // 008/35-37 AND 041 (note that all relevant subfield codes are fixed, not just $a)
|
|
63
|
+
|
|
64
|
+
fixQualifyingInformation().fix(record); // 015, 020, 024 and 028
|
|
65
|
+
|
|
66
|
+
// Field 028: use $b$a, not $a$b:
|
|
67
|
+
const f028 = record.fields.filter(f => f.tag === '028');
|
|
68
|
+
f028.forEach(f => sortAdjacentSubfields(f));
|
|
69
|
+
|
|
70
|
+
fixField040(record); // All $b values are changed to 'mul'. As a side effect 33X$b=>$a mappings are in Finnish! Ok in this domain!
|
|
71
|
+
|
|
72
|
+
fixRelatorTerms().fix(record);
|
|
73
|
+
|
|
74
|
+
fix33X().fix(record); // 33X$a => 33X$a$b$2
|
|
75
|
+
add336().fix(record);
|
|
76
|
+
add337().fix(record);
|
|
77
|
+
add338().fix(record);
|
|
78
|
+
|
|
79
|
+
record.fields.forEach(f => fieldSpecificStuff2(f));
|
|
80
|
+
|
|
81
|
+
function fieldSpecificStuff2(field) {
|
|
82
|
+
removeSubfieldH(field); // only after 33X creation, as 245$h might be useful
|
|
83
|
+
|
|
84
|
+
field260To264s(field, record);
|
|
85
|
+
|
|
86
|
+
// NB! 300 (before or after 33X creation?)
|
|
87
|
+
field410To490And810(field, record);
|
|
88
|
+
field440To490And830(field, record);
|
|
89
|
+
// handle505(field); // not applying them usemarcon-cyrillux rules for field 505 as I can't understand their motivation.
|
|
90
|
+
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// The fixer below implement Cyrillux rules such as 245I1 | 245I1 | If (Exists(@100) Or Exists(@110) Or Exists(@111) Or Exists(@130)) Then '1' Else '0' and plenty of other good stuff:
|
|
94
|
+
fixIndicators().fix(record);
|
|
95
|
+
|
|
96
|
+
fixPunctuation().fix(record);
|
|
97
|
+
|
|
98
|
+
const res = {message: [], fix: [], valid: true};
|
|
99
|
+
return res;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Validation is currently done in subparts
|
|
103
|
+
function validate(record) {
|
|
104
|
+
nvdebug(`${description}: validate`);
|
|
105
|
+
const originalString = recordToString(record);
|
|
106
|
+
const clonedRecord = new MarcRecord(record, {subfieldValues: false});
|
|
107
|
+
realFix(clonedRecord);
|
|
108
|
+
const modifiedString = recordToString(clonedRecord);
|
|
109
|
+
|
|
110
|
+
if (originalString === modifiedString) {
|
|
111
|
+
return {message: [], valid: true};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return {message: ['Record changed'], valid: false}; // Less than descriptive but will do...
|
|
115
|
+
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function fixField040(record) {
|
|
120
|
+
const f040 = record.fields.filter(f => f.tag === '040');
|
|
121
|
+
|
|
122
|
+
const subfieldsBE = [
|
|
123
|
+
{code: 'b', value: 'mul'},
|
|
124
|
+
{code: 'e', value: 'rda'}
|
|
125
|
+
];
|
|
126
|
+
|
|
127
|
+
// Add 040 if there isn't one:
|
|
128
|
+
if (f040.length === 0) {
|
|
129
|
+
const data = {tag: '040', ind1: ' ', ind2: ' ', subfields: subfieldsBE};
|
|
130
|
+
|
|
131
|
+
record.insertField(data);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
f040.forEach(f => fixField040Subfields(f));
|
|
136
|
+
|
|
137
|
+
function fixField040Subfields(field) {
|
|
138
|
+
field.subfields = field.subfields.filter(sf => !['b', 'e'].includes(sf.code)); // eslint-disable-line functional/immutable-data
|
|
139
|
+
field.subfields.push(subfieldsBE[0]); // eslint-disable-line functional/immutable-data
|
|
140
|
+
field.subfields.push(subfieldsBE[1]); // eslint-disable-line functional/immutable-data
|
|
141
|
+
sortAdjacentSubfields(field); // put $b and $e to their proper places
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function removeFromOldCatalog(field) {
|
|
147
|
+
// See https://catalog.loc.gov/vwebv/ui/en_US/htdocs/help/faqs.html for motivation
|
|
148
|
+
field.subfields?.forEach(sf => removeFromOldCatalogFromSubfield(sf));
|
|
149
|
+
|
|
150
|
+
function removeFromOldCatalogFromSubfield(subfield) {
|
|
151
|
+
if (!subfield.value.includes('[from old catalog]')) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
subfield.value = subfield.value.replace(/ *\[from old catalog\]/gui, ''); // eslint-disable-line functional/immutable-data
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function removeSubfieldH(field) {
|
|
159
|
+
if (!field.subfields || !['245', '246', '247', '740', '760', '762', '765', '767', '770', '772', '773', '774', '775', '776', '777', '780', '785', '786', '787', '788'].includes(field.tag)) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const filteredFields = field.subfields.filter(sf => sf.code !== 'h');
|
|
164
|
+
if (filteredFields.length > 0) {
|
|
165
|
+
field.subfields = filteredFields; // eslint-disable-line functional/immutable-data
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export function removeOwnershipSubfield5(field) {
|
|
172
|
+
if (!field.subfields || field.subfields.length === 0) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const remainingSubfields = field.subfields.filter(sf => sf.code !== '5');
|
|
176
|
+
if (remainingSubfields.length === 0) { // sanity check/robustness
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
field.subfields = remainingSubfields; // eslint-disable-line functional/immutable-data
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export function fixLeader(record) {
|
|
183
|
+
record.leader = `${record.leader.substring(0, 9)}a22${record.leader.substring(12, 18)}i${record.leader.substring(19, 20)}4500`; // eslint-disable-line functional/immutable-data
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function field410To490And810(field, record) { // might be generic... if so, move to utils...
|
|
187
|
+
if (field.tag !== '410') {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const field810 = clone(field);
|
|
192
|
+
|
|
193
|
+
field.tag = '490'; // eslint-disable-line functional/immutable-data
|
|
194
|
+
field.ind1 = '1'; // eslint-disable-line functional/immutable-data
|
|
195
|
+
field.ind2 = ' '; // eslint-disable-line functional/immutable-data
|
|
196
|
+
sortAdjacentSubfields(field);
|
|
197
|
+
// 490: Fix punctuation elsewhere. (Note that the current support is lagging...)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
field810.tag = '810'; // eslint-disable-line functional/immutable-data
|
|
201
|
+
field810.ind2 = ' '; // eslint-disable-line functional/immutable-data
|
|
202
|
+
// 810: Fix punctuation elsewhere. (Note that the current support is lagging...)
|
|
203
|
+
record.insertField(field810);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function field440To490And830(field, record) { // might be generic... if so, move to utils...
|
|
207
|
+
if (field.tag !== '440') {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const field830 = clone(field);
|
|
212
|
+
|
|
213
|
+
field.tag = '490'; // eslint-disable-line functional/immutable-data
|
|
214
|
+
field.ind1 = '1'; // eslint-disable-line functional/immutable-data
|
|
215
|
+
field.ind2 = ' '; // eslint-disable-line functional/immutable-data
|
|
216
|
+
// 490: Fix punctuation elsewhere. (Note that the current support is lagging...)
|
|
217
|
+
field830.tag = '830'; // eslint-disable-line functional/immutable-data
|
|
218
|
+
// 830: Fix punctuation elsewhere. (Note that the current support is lagging...)
|
|
219
|
+
record.insertField(field830);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
function field260To264s(field, record) { // might be generic... if so, move to utils...
|
|
224
|
+
// As per my quick reading of usemarcon-cyrillux
|
|
225
|
+
if (field.tag !== '260') {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
createCopyright264Field(field);
|
|
230
|
+
|
|
231
|
+
field.tag = '264'; // eslint-disable-line functional/immutable-data
|
|
232
|
+
field.ind1 = ' '; // eslint-disable-line functional/immutable-data
|
|
233
|
+
field.ind2 = '1'; // eslint-disable-line functional/immutable-data
|
|
234
|
+
|
|
235
|
+
// NB! Usemarcon does not handle 260$e$f$g => 264$a$b$c, so I'm not botherin with it either... (However, we could check our merge reducer code...)
|
|
236
|
+
|
|
237
|
+
function getCopyrightYear(string) {
|
|
238
|
+
if (string.match(/^(?:\[?[Ccp]|[^0-9]*(?:cop|©|℗))[^0-9]*(?:1[789][0-9][0-9]|20[0-2][0-9])[^0-9]*$/u)) {
|
|
239
|
+
return string.replace(/[^0-9]/ug, '');
|
|
240
|
+
}
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
field.subfields?.forEach(sf => field260To264Normalization(sf));
|
|
245
|
+
|
|
246
|
+
function field260To264Normalization(subfield) {
|
|
247
|
+
subfield.value = field260To264Normalization2(subfield); // eslint-disable-line functional/immutable-data
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function createCopyright264Value(field) {
|
|
251
|
+
// Extract/split copyright year to a separate field:
|
|
252
|
+
const [c] = field.subfields.filter(sf => sf.code === 'c');
|
|
253
|
+
if (!c) {
|
|
254
|
+
return undefined;
|
|
255
|
+
}
|
|
256
|
+
const copyrightYear = getCopyrightYear(c.value);
|
|
257
|
+
if (!copyrightYear) {
|
|
258
|
+
return undefined;
|
|
259
|
+
}
|
|
260
|
+
const copType = c.value.match(/(?:^\[?p|℗)/u) ? '℗' : '©';
|
|
261
|
+
const returnValue = c.value.includes('[') ? `[${copType}${copyrightYear}]` : `${copType}${copyrightYear}`;
|
|
262
|
+
// Moidy the original value:
|
|
263
|
+
c.value = `[${copyrightYear}]`; // eslint-disable-line functional/immutable-data
|
|
264
|
+
return returnValue;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function createCopyright264Field(field) {
|
|
268
|
+
const c = createCopyright264Value(field);
|
|
269
|
+
if (!c) {
|
|
270
|
+
return undefined;
|
|
271
|
+
}
|
|
272
|
+
const data = {'tag': '264', 'ind1': ' ', 'ind2': '4', 'subfields': [{'code': 'c', 'value': c}]};
|
|
273
|
+
record.insertField(data);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function field260To264Normalization2(subfield) {
|
|
277
|
+
if (subfield.code === 'a') {
|
|
278
|
+
return subfield.value.replace(/\b[Ss]\. ?l\./u, 'Kustannuspaikka tuntematon');
|
|
279
|
+
}
|
|
280
|
+
if (subfield.code === 'b') {
|
|
281
|
+
return subfield.value.replace(/\b[Ss]\. ?n\./u, 'kustantaja tuntematon');
|
|
282
|
+
}
|
|
283
|
+
if (subfield.code === 'c') {
|
|
284
|
+
const year = getCopyrightYear(subfield.value);
|
|
285
|
+
if (year) {
|
|
286
|
+
const c = subfield.value.match(/(?:^p|℗)/u) ? 'p' : 'c';
|
|
287
|
+
if (subfield.value.includes('[')) {
|
|
288
|
+
return `${c}[${year}]`;
|
|
289
|
+
}
|
|
290
|
+
return `${c}${year}`;
|
|
291
|
+
}
|
|
292
|
+
return subfield.value.replace(/\b[Ss]\. ?a\./u, 'julkaisuaika tuntematon');
|
|
293
|
+
}
|
|
294
|
+
return subfield.value;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/*
|
|
301
|
+
function handle505(field) {
|
|
302
|
+
if (field.tag !== '505') {
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
// Don't know how/why usemarcon-cyrillux is so sure about ind1...
|
|
306
|
+
field.ind1 = '0'; // eslint-disable-line functional/immutable-data
|
|
307
|
+
// usemarcon-cyrillux drops irrelevant subfields, so we do the same. However, we have included some control subfields in the kept side:
|
|
308
|
+
const keptSubfields = field.subfields.filter(sf => ['a', 'g', 'r', 't', 'u', '6', '8', '9'].includes(sf.code));
|
|
309
|
+
|
|
310
|
+
if (keptSubfields.some(sf => ['a', 'g', 'r', 't', 'u'].includes(sf.code))) {
|
|
311
|
+
field.subfields = keptSubfields; // eslint-disable-line functional/immutable-data
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
*/
|
|
316
|
+
|
|
317
|
+
function translateFieldToFinnish(field) {
|
|
318
|
+
if (!['020', '300'].includes(field.tag)) {
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
field.subfields?.forEach(sf => translateSubfieldToFinnish(sf));
|
|
322
|
+
|
|
323
|
+
function translateSubfieldToFinnish(subfield) {
|
|
324
|
+
if (field.tag === '020' && ['a', 'q', 'z'].includes(subfield.code)) {
|
|
325
|
+
subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value)))); // eslint-disable-line functional/immutable-data
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
if (field.tag === '300') {
|
|
329
|
+
subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value)))); // eslint-disable-line functional/immutable-data
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function expandEnglishAbbreviations(value) {
|
|
336
|
+
return value.replace(/\bbk\.\b/gui, 'book').
|
|
337
|
+
replace(/chiefly col\./ui, 'chiefly color').
|
|
338
|
+
replace(/col\. ill\./ui, 'color illustrations').
|
|
339
|
+
replace(/diagrs\./ui, 'diagrams').
|
|
340
|
+
replace(/\bhbk\.\b/gui, 'hardcover').replace(/\bhbk\b/gui, 'hardcover'). // expand to MTS-compliant form
|
|
341
|
+
replace(/\bill\./gui, 'illustrated'). // or illustrations (or Swedish "illustrerad" or...)
|
|
342
|
+
replace(/\billus\./gui, 'illustrated'). // or illustrations
|
|
343
|
+
replace(/incl\./gui, 'includes').
|
|
344
|
+
replace(/fold\.? maps/gui, 'folded maps').
|
|
345
|
+
// replace(/\bmin\./gu, 'minutes').
|
|
346
|
+
// replace(/\bmin\b/gu, 'minutes').
|
|
347
|
+
replace(/\bp\.\b/gui, 'pages').replace(/\bp\b/gu, 'pages').
|
|
348
|
+
replace(/\bpbk\.\b/gui, 'paperback').replace(/\bpbk\b/gui, 'paperback'). // expand to MTS-compliant form
|
|
349
|
+
replace(/\bports\./gui, 'portraits').
|
|
350
|
+
replace('sd., col.', 'sound, color').
|
|
351
|
+
replace(/ *\((?:chiefly col\.|chiefly color|some cols)\)/gui, '').
|
|
352
|
+
replace(/\b1 hr\./gui, '1 hour');
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function expandFinnishAbbreviations(value) {
|
|
356
|
+
return value.replace(/\bcn\. /gu, 'noin ').
|
|
357
|
+
// replace(/\bmin\./gu, 'minuuttia').
|
|
358
|
+
// replace(/\bmin\b/gu, 'minuuttia').
|
|
359
|
+
replace(/\bnid\./gu, 'nidottu').replace(/\bnid\b/gui, 'nidottu').
|
|
360
|
+
replace(/\bsid\./gu, 'sidottu').replace(/\bsid\b/gui, 'sidottu').
|
|
361
|
+
replace(/\bverkkojulk\.\b/gu, 'verkkojulkaisu').replace(/\bverkkojulk\b/gu, 'verkkojulkaisu').
|
|
362
|
+
replace(/^\(([^)]+)\)$/u, '$1'); // eslint-disable-line prefer-named-capture-group
|
|
363
|
+
// <- removal of brackets above could use a better location
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
function expandSwedishAbbreviations(value) {
|
|
367
|
+
return value.replace(/\bca\. /gu, 'circa ').
|
|
368
|
+
replace(/\bhft\./gui, 'häftad').replace(/\bhft\b/gui, 'häftad');
|
|
369
|
+
// replace(/\bmin\./gu, 'minuter').
|
|
370
|
+
// replace(/\bmin\b/gu, 'minuter');
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
function finnishTranslationsAndMappings(value) {
|
|
374
|
+
return value.replace('analog', 'analoginen').
|
|
375
|
+
replace('approximately', 'noin').
|
|
376
|
+
replace('audio discs', 'äänilevyä').
|
|
377
|
+
replace('black and white', 'mustavalkoinen').
|
|
378
|
+
replace(/\bcharts\b/gui, 'kaavioita').
|
|
379
|
+
replace('chiefly color illustrations', 'pääosin värikuvitettu').
|
|
380
|
+
replace('chiefly', 'pääosin').
|
|
381
|
+
replace('color illustrations', 'värikuvitus').
|
|
382
|
+
replace(/\bdigital\b/gui, 'digitaalinen').
|
|
383
|
+
replace(/\belectronic book\b/gui, 'verkkoaineisto').
|
|
384
|
+
replace(/\bfolded sheet\b/gui, 'taitelehti').
|
|
385
|
+
replace(/\bhardback\b/gui, 'kovakantinen').
|
|
386
|
+
replace(/\bhours\b/gui, 'tuntia').
|
|
387
|
+
replace('illustrated', 'kuvitettu').
|
|
388
|
+
replace(/illustration\b/gui, 'kuvitus'). // kuvitus/kuvitettu variation is taken from usemarcon-cyrillux...
|
|
389
|
+
replace('illustrations', 'kuvitettu').
|
|
390
|
+
replace(/\binsert\b/gui, 'liite').
|
|
391
|
+
replace(/\binserts\b/gui, 'liitteitä').
|
|
392
|
+
replace('leaves of plates', 'kuvalehteä').
|
|
393
|
+
replace(/\bmap\b/gui, 'kartta').
|
|
394
|
+
replace(/\bmaps\b/gui, 'karttoja'). // or karttaa?
|
|
395
|
+
replace('minutes', 'minuuttia').
|
|
396
|
+
replace('online resource', 'verkkoaineisto').
|
|
397
|
+
replace('pages of plates', 'kuvalehteä').
|
|
398
|
+
replace(/\bpages\b/gui, 'sivua').
|
|
399
|
+
replace(/\bpaperback\b/gui, 'pehmeäkantinen'). // MTS alt
|
|
400
|
+
replace(/\bsoftcover\b/gui, 'pehmeäkantinen'). // MTS pref
|
|
401
|
+
replace('sound, color', 'äänellinen, värillinen').
|
|
402
|
+
replace('sound cassettes', 'äänikasettia').replace('sound cassette', 'äänikasetti').
|
|
403
|
+
replace('sound discs', 'äänilevyä').replace('sound disc', 'äänilevy').
|
|
404
|
+
replace('unnumbered', 'numeroimatonta').
|
|
405
|
+
replace(/\bverkkojulkaisu\b/gui, 'verkkoaineisto').
|
|
406
|
+
replace('videodiscs', 'videolevyä').
|
|
407
|
+
replace('videodisc', 'videolevy').
|
|
408
|
+
replace(/\b1 hour\b/gui, '1 tunti');
|
|
409
|
+
|
|
410
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import {expect} from 'chai';
|
|
2
|
+
import {MarcRecord} from '@natlibfi/marc-record';
|
|
3
|
+
import validatorFactory from './cyrillux-usemarcon-replacement';
|
|
4
|
+
import {READERS} from '@natlibfi/fixura';
|
|
5
|
+
import generateTests from '@natlibfi/fixugen';
|
|
6
|
+
|
|
7
|
+
generateTests({
|
|
8
|
+
callback,
|
|
9
|
+
path: [__dirname, '..', 'test-fixtures', 'cyrillux-usemarcon-replacement'],
|
|
10
|
+
useMetadataFile: true,
|
|
11
|
+
recurse: false,
|
|
12
|
+
fixura: {
|
|
13
|
+
reader: READERS.JSON
|
|
14
|
+
},
|
|
15
|
+
mocha: {
|
|
16
|
+
before: () => testValidatorFactory()
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
async function testValidatorFactory() {
|
|
22
|
+
const validator = await validatorFactory();
|
|
23
|
+
|
|
24
|
+
expect(validator)
|
|
25
|
+
.to.be.an('object')
|
|
26
|
+
.that.has.any.keys('description', 'validate');
|
|
27
|
+
|
|
28
|
+
expect(validator.description).to.be.a('string');
|
|
29
|
+
expect(validator.validate).to.be.a('function');
|
|
30
|
+
expect(validator.fix).to.be.a('function');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function callback({getFixture, fix = false}) {
|
|
34
|
+
const validator = await validatorFactory();
|
|
35
|
+
const record = new MarcRecord(getFixture('record.json'));
|
|
36
|
+
const expectedResult = getFixture('expectedResult.json');
|
|
37
|
+
// console.log(expectedResult); // eslint-disable-line
|
|
38
|
+
|
|
39
|
+
if (!fix) {
|
|
40
|
+
const result = await validator.validate(record);
|
|
41
|
+
expect(result).to.eql(expectedResult);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
await validator.fix(record);
|
|
46
|
+
expect(record).to.eql(expectedResult);
|
|
47
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
|
|
2
|
+
export const field336Mappings = [
|
|
3
|
+
{'code': 'crd', 'fin': 'kartografinen data', 'swe': 'kartografisk data', 'eng': 'cartographic dataset'},
|
|
4
|
+
{'code': 'cri', 'fin': 'kartografinen kuva', 'swe': 'kartografisk bild', 'eng': 'cartographic image'},
|
|
5
|
+
{'code': 'crm', 'fin': 'kartografinen liikkuva kuva', 'swe': 'kartografisk rörlig bild', 'eng': 'cartographic moving image'},
|
|
6
|
+
{'code': 'crt', 'fin': 'kartografinen taktiili kuva', 'swe': 'kartografisk taktil bild', 'eng': 'cartographic tactile image'},
|
|
7
|
+
{'code': 'crn', 'fin': 'kartografinen taktiili kolmiulotteinen muoto', 'swe': 'kartografisk taktil tredimensionell form', 'eng': 'cartographic tactile three-dimensional form'},
|
|
8
|
+
{'code': 'crf', 'fin': 'kartografinen kolmiulotteinen muoto', 'swe': 'kartografisk tredimensionell form', 'eng': 'cartographic three-dimensional form'},
|
|
9
|
+
{'code': 'cod', 'fin': 'digitaalinen data', 'swe': 'digitalt dataset', 'eng': 'computer dataset'},
|
|
10
|
+
{'code': 'cop', 'fin': 'tietokoneohjelma', 'swe': 'datorprogram', 'eng': 'computer program'},
|
|
11
|
+
{'code': 'ntv', 'fin': 'liikenotaatio', 'swe': 'rörelsenotation', 'eng': 'notated movement'},
|
|
12
|
+
{'code': 'ntm', 'fin': 'nuottikirjoitus', 'swe': 'noterad musik', 'eng': 'notated music'},
|
|
13
|
+
{'code': 'prm', 'fin': 'esitetty musiikki', 'swe': 'framförd musik', 'eng': 'performed music'},
|
|
14
|
+
{'code': 'snd', 'fin': 'ääni', 'swe': 'ljud', 'eng': 'sounds', 'ger': 'Geräusche'},
|
|
15
|
+
{'code': 'spw', 'fin': 'puhe', 'swe': 'tal', 'eng': 'spoken word', 'ger': 'gesprochenes Wort'},
|
|
16
|
+
{'code': 'sti', 'fin': 'stillkuva', 'swe': 'stillbild', 'eng': 'still image', 'ger': 'unbewegtes Bild'},
|
|
17
|
+
{'code': 'tci', 'fin': 'taktiili kuva', 'swe': 'taktil bild', 'eng': 'tactile image'},
|
|
18
|
+
{'code': 'tcm', 'fin': 'taktiili nuottikirjoitus', 'swe': 'taktil musiknotation', 'eng': 'tactile notated music'},
|
|
19
|
+
{'code': 'tcn', 'fin': 'taktiili liikenotaatio', 'swe': 'taktil noterad rörelse', 'eng': 'tactile notated movement'},
|
|
20
|
+
{'code': 'tct', 'fin': 'taktiili teksti', 'swe': 'taktil text', 'eng': 'tactile text', 'fre': 'texte tactile'},
|
|
21
|
+
{'code': 'tcf', 'fin': 'taktiili kolmiulotteinen muoto', 'swe': 'taktil tredimensionell form', 'eng': 'tactile three-dimensional form'},
|
|
22
|
+
{'code': 'txt', 'fin': 'teksti', 'swe': 'text', 'eng': 'text', 'ger': 'Text', 'fre': 'texte'},
|
|
23
|
+
{'code': 'tdf', 'fin': 'kolmiulotteinen muoto', 'swe': 'tredimensionell form', 'eng': 'three-dimensional form'},
|
|
24
|
+
{'code': 'tdm', 'fin': 'kolmiulotteinen liikkuva kuva', 'swe': 'tredimensionell rörlig bild', 'eng': 'three-dimensional moving image'},
|
|
25
|
+
{'code': 'tdi', 'fin': 'kaksiulotteinen liikkuva kuva', 'swe': 'tvådimensionell rörlig bild', 'eng': 'two-dimensional moving image'},
|
|
26
|
+
{'code': 'xxx', 'fin': 'muu', 'swe': 'annan', 'eng': 'other'},
|
|
27
|
+
{'code': 'zzz', 'fin': 'määrittelemätön', 'swe': 'ospecificerad', 'eng': 'unspecified'}
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
export const field337Mappings = [
|
|
31
|
+
{'code': 's', 'fin': 'audio', 'swe': 'audio', 'eng': 'audio'},
|
|
32
|
+
{'code': 'c', 'fin': 'tietokonekäyttöinen', 'swe': 'dator', 'eng': 'computer'},
|
|
33
|
+
{'code': 'h', 'fin': 'mikromuoto', 'swe': 'mikroform', 'eng': 'microform'},
|
|
34
|
+
{'code': 'p', 'fin': 'mikroskooppinen', 'swe': 'mikroskopisk', 'eng': 'microscopic'},
|
|
35
|
+
{'code': 'g', 'fin': 'heijastettava', 'swe': 'projicerad', 'eng': 'projected'},
|
|
36
|
+
{'code': 'e', 'fin': 'stereografinen', 'swe': 'stereografisk', 'eng': 'stereographic'},
|
|
37
|
+
{'code': 'n', 'fin': 'käytettävissä ilman laitetta', 'swe': 'omedierad', 'eng': 'unmediated'},
|
|
38
|
+
{'code': 'v', 'fin': 'video', 'swe': 'video', 'eng': 'video'},
|
|
39
|
+
{'code': 'x', 'fin': 'muu', 'swe': 'annan', 'eng': 'other'},
|
|
40
|
+
{'code': 'z', 'fin': 'määrittelemätön', 'swe': 'ospecificerad', 'eng': 'unspecified'}
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
export const field338Mappings = [
|
|
44
|
+
{'code': 'ca', 'fin': 'tietonauhan silmukkakasetti', 'swe': 'datorbandmagasin', 'eng': 'computer tape cartridge'},
|
|
45
|
+
{'code': 'cb', 'fin': 'piirikotelo', 'swe': 'datorminnesmodul', 'eng': 'computer cartridge'},
|
|
46
|
+
{'code': 'cd', 'fin': 'tietolevy', 'swe': 'datorskiva', 'eng': 'computer disc'},
|
|
47
|
+
{'code': 'ce', 'fin': 'tietolevykotelo', 'swe': 'datorskivmagasin', 'eng': 'computer disc cartridge'},
|
|
48
|
+
{'code': 'cf', 'fin': 'tietokasetti', 'swe': 'datorkassett', 'eng': 'computer tape cassette'},
|
|
49
|
+
{'code': 'ch', 'fin': 'tietonauhakela', 'swe': 'datorbandspole', 'eng': 'computer tape reel'},
|
|
50
|
+
{'code': 'ck', 'fin': 'muistikortti', 'swe': 'datorkort', 'eng': 'computer card'},
|
|
51
|
+
{'code': 'cr', 'fin': 'verkkoaineisto', 'swe': 'onlineresurs', 'eng': 'online resource'},
|
|
52
|
+
{'code': 'cz', 'fin': 'muu', 'swe': 'annan', 'eng': 'other'},
|
|
53
|
+
{'code': 'eh', 'fin': 'stereografinen kortti', 'swe': 'stereografiskt kort', 'eng': 'stereograph card'},
|
|
54
|
+
{'code': 'es', 'fin': 'stereografinen levy', 'swe': 'stereografisk skiva', 'eng': 'stereograph disc'},
|
|
55
|
+
{'code': 'ez', 'fin': 'muu', 'swe': 'annan', 'eng': 'other'},
|
|
56
|
+
{'code': 'gc', 'fin': 'rainakasetti', 'swe': 'bildbandsmagasin', 'eng': 'filmstrip cartridge'},
|
|
57
|
+
{'code': 'gd', 'fin': 'filmiliuska', 'swe': 'filmremsa', 'eng': 'filmslip'},
|
|
58
|
+
{'code': 'gf', 'fin': 'raina', 'swe': 'bildband', 'eng': 'filmstrip'},
|
|
59
|
+
{'code': 'gs', 'fin': 'dia', 'swe': 'diabild', 'eng': 'slide'},
|
|
60
|
+
{'code': 'gt', 'fin': 'piirtoheitinkalvo', 'swe': 'transparang', 'eng': 'overhead transparency'},
|
|
61
|
+
{'code': 'ha', 'fin': 'ikkunakortti', 'swe': 'fönsterkort', 'eng': 'aperture card'},
|
|
62
|
+
{'code': 'hb', 'fin': 'mikrofilmisilmukkakasetti', 'swe': 'mikrofilmsmagasin', 'eng': 'microfilm cartridge'},
|
|
63
|
+
{'code': 'hc', 'fin': 'mikrofilmikasetti', 'swe': 'mikrofilmskassett', 'eng': 'microfilm cassette'},
|
|
64
|
+
{'code': 'hd', 'fin': 'mikrofilmikela', 'swe': 'mikrofilmsspole', 'eng': 'microfilm reel'},
|
|
65
|
+
{'code': 'he', 'fin': 'mikrokortti', 'swe': 'mikrofiche', 'eng': 'microfiche'},
|
|
66
|
+
{'code': 'hf', 'fin': 'mikrokorttikasetti', 'swe': 'mikrofichekassett', 'eng': 'microfiche cassette'},
|
|
67
|
+
{'code': 'hg', 'fin': 'mikrokortti (läpinäkymätön)', 'swe': 'mikrofiche (ogenomskinlig)', 'eng': 'microopaque'},
|
|
68
|
+
{'code': 'hh', 'fin': 'mikrofilmiliuska', 'swe': 'mikrofilmsremsa', 'eng': 'microfilm slip'},
|
|
69
|
+
{'code': 'hj', 'fin': 'mikrofilmirulla', 'swe': 'mikrofilmsrulle', 'eng': 'microfilm roll'},
|
|
70
|
+
{'code': 'hz', 'fin': 'muu', 'swe': 'annan', 'eng': 'other'},
|
|
71
|
+
{'code': 'mc', 'fin': 'filmisilmukkakasetti', 'swe': 'filmmagasin', 'eng': 'film cartridge'},
|
|
72
|
+
{'code': 'mf', 'fin': 'filmikasetti', 'swe': 'filmkassett', 'eng': 'film cassette'},
|
|
73
|
+
{'code': 'mo', 'fin': 'filmirulla', 'swe': 'filmrulle', 'eng': 'film roll'},
|
|
74
|
+
{'code': 'mr', 'fin': 'filmikela', 'swe': 'filmspole', 'eng': 'film reel'},
|
|
75
|
+
{'code': 'mz', 'fin': 'muu', 'swe': 'annan', 'eng': 'other'},
|
|
76
|
+
{'code': 'na', 'fin': 'rulla', 'swe': 'rulle', 'eng': 'roll'},
|
|
77
|
+
{'code': 'nb', 'fin': 'arkki', 'swe': 'ark', 'eng': 'sheet'},
|
|
78
|
+
{'code': 'nc', 'fin': 'nide', 'swe': 'volym', 'eng': 'volume'},
|
|
79
|
+
{'code': 'nn', 'fin': 'lehtiötaulu', 'swe': 'blädderblock', 'eng': 'flipchart'},
|
|
80
|
+
{'code': 'no', 'fin': 'kortti', 'swe': 'kort', 'eng': 'card'},
|
|
81
|
+
{'code': 'nr', 'fin': 'objekti', 'swe': 'föremål', 'eng': 'object'},
|
|
82
|
+
{'code': 'nz', 'fin': 'muu', 'swe': 'annan', 'eng': 'other'},
|
|
83
|
+
{'code': 'pp', 'fin': 'preparaattilasi', 'swe': 'mikroskoperingspreparat', 'eng': 'microscope slide'},
|
|
84
|
+
{'code': 'pz', 'fin': 'muu', 'swe': 'annan', 'eng': 'other'},
|
|
85
|
+
{'code': 'sb', 'fin': 'äänihihna', 'swe': 'ljudslinga', 'eng': 'audio belt'},
|
|
86
|
+
{'code': 'sd', 'fin': 'äänilevy', 'swe': 'ljudskiva', 'eng': 'audio disc'},
|
|
87
|
+
{'code': 'se', 'fin': 'äänisylinteri', 'swe': 'ljudcylinder', 'eng': 'audio cylinder'},
|
|
88
|
+
{'code': 'sg', 'fin': 'äänisilmukkakasetti', 'swe': 'ljudmagasin', 'eng': 'audio cartridge'},
|
|
89
|
+
{'code': 'si', 'fin': 'ääniraitakela', 'swe': 'filmljudspole', 'eng': 'sound-track reel'},
|
|
90
|
+
{'code': 'sq', 'fin': 'äänirulla', 'swe': 'ljudrulle', 'eng': 'audio roll'},
|
|
91
|
+
{'code': 'ss', 'fin': 'äänikasetti', 'swe': 'ljudkassett', 'eng': 'audiocassette'},
|
|
92
|
+
{'code': 'st', 'fin': 'äänikela', 'swe': 'ljudspole', 'eng': 'audiotape reel'},
|
|
93
|
+
{'code': 'sw', 'fin': 'äänilankakela', 'swe': 'ljudtråd', 'eng': 'audio wire reel'},
|
|
94
|
+
{'code': 'sz', 'fin': 'muu', 'swe': 'annan', 'eng': 'other'},
|
|
95
|
+
{'code': 'vc', 'fin': 'videosilmukkakasetti', 'swe': 'videomagasin', 'eng': 'video cartridge'},
|
|
96
|
+
{'code': 'vd', 'fin': 'videolevy', 'swe': 'videoskiva', 'eng': 'videodisc'},
|
|
97
|
+
{'code': 'vf', 'fin': 'videokasetti', 'swe': 'videokassett', 'eng': 'videocassette'},
|
|
98
|
+
{'code': 'vr', 'fin': 'videokela', 'swe': 'videospole', 'eng': 'videotape reel'},
|
|
99
|
+
{'code': 'vz', 'fin': 'muu', 'swe': 'annan', 'eng': 'other'},
|
|
100
|
+
{'code': 'zu', 'fin': 'määrittelemätön', 'swe': 'ospecificerad', 'eng': 'unspecified'}
|
|
101
|
+
];
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
function map33XCodeToTerm(mapping, catLang = 'fin') {
|
|
105
|
+
if (!mapping) {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
if (catLang in mapping) {
|
|
109
|
+
return mapping[catLang];
|
|
110
|
+
}
|
|
111
|
+
if ('fin' in mapping) {
|
|
112
|
+
return mapping.fin; // Default to Finnish (which should be complete, knock-knock)
|
|
113
|
+
}
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function map336CodeToTerm(code, catLang = 'fin') {
|
|
118
|
+
const [mapping] = field336Mappings.filter(m => m.code === code);
|
|
119
|
+
return map33XCodeToTerm(mapping, catLang);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function map337CodeToTerm(code, catLang = 'fin') {
|
|
123
|
+
const [mapping] = field337Mappings.filter(m => m.code === code);
|
|
124
|
+
return map33XCodeToTerm(mapping, catLang);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function map338CodeToTerm(code, catLang = 'fin') {
|
|
128
|
+
const [mapping] = field338Mappings.filter(m => m.code === code);
|
|
129
|
+
return map33XCodeToTerm(mapping, catLang);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function getFormOfItem(record) {
|
|
133
|
+
const [f008Value] = record.get('008').map(field => field.value);
|
|
134
|
+
if (f008Value && f008Value.length === 40) {
|
|
135
|
+
const pos = getFormOfItemPosition(record);
|
|
136
|
+
return f008Value[pos];
|
|
137
|
+
}
|
|
138
|
+
return '|';
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export function getFormOfItemPosition(record) {
|
|
142
|
+
if (record.isMP() || record.isVM()) {
|
|
143
|
+
return 29;
|
|
144
|
+
}
|
|
145
|
+
return 23;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function getTitleMedium(record) {
|
|
149
|
+
// Get 245$h. Very old and deprecated practise...
|
|
150
|
+
const [f245] = record.get('245');
|
|
151
|
+
if (!f245) {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
const [h] = f245.subfields.filter(sf => sf.code === 'h');
|
|
155
|
+
return h ? h.value : undefined;
|
|
156
|
+
}
|