@natlibfi/marc-record-validators-melinda 11.5.5 → 11.6.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/field-505-separators.js +3 -0
- package/dist/field-505-separators.js.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/modernize-502.js +116 -0
- package/dist/modernize-502.js.map +1 -0
- package/dist/modernize-502.spec.js +49 -0
- package/dist/modernize-502.spec.js.map +1 -0
- package/dist/punctuation2.js +17 -4
- package/dist/punctuation2.js.map +1 -1
- package/dist/subfieldValueNormalizations.js +47 -8
- package/dist/subfieldValueNormalizations.js.map +1 -1
- package/package.json +7 -6
- package/src/field-505-separators.js +3 -0
- package/src/index.js +2 -0
- package/src/modernize-502.js +118 -0
- package/src/modernize-502.spec.js +48 -0
- package/src/punctuation2.js +6 -4
- package/src/subfieldValueNormalizations.js +50 -9
- package/test-fixtures/field-505-separators/03/expectedResult.json +23 -0
- package/test-fixtures/field-505-separators/03/metadata.json +6 -0
- package/test-fixtures/field-505-separators/03/record.json +21 -0
- package/test-fixtures/modernize-502/01/expectedResult.json +6 -0
- package/test-fixtures/modernize-502/01/metadata.json +5 -0
- package/test-fixtures/modernize-502/01/record.json +15 -0
- package/test-fixtures/modernize-502/02/expectedResult.json +29 -0
- package/test-fixtures/modernize-502/02/metadata.json +5 -0
- package/test-fixtures/modernize-502/02/record.json +31 -0
- package/test-fixtures/normalize-subfield-value/04/expectedResult.json +24 -0
- package/test-fixtures/normalize-subfield-value/04/metadata.json +5 -0
- package/test-fixtures/normalize-subfield-value/04/record.json +22 -0
- package/test-fixtures/normalize-subfield-value/05/expectedResult.json +27 -0
- package/test-fixtures/normalize-subfield-value/05/metadata.json +6 -0
- package/test-fixtures/normalize-subfield-value/05/record.json +25 -0
- package/test-fixtures/punctuation2/01/expectedResult.json +2 -2
- package/test-fixtures/punctuation2/100_and_880/expectedResult.json +12 -2
- package/test-fixtures/punctuation2/100_and_880/metadata.json +2 -1
- package/test-fixtures/punctuation2/100_and_880/record.json +12 -2
- package/test-fixtures/punctuation2/97/expectedResult.json +1 -1
- package/test-fixtures/punctuation2/98/expectedResult.json +2 -2
- package/test-fixtures/sort-relator-terms/f02/expectedResult.json +8 -1
- package/test-fixtures/sort-relator-terms/f02/record.json +7 -0
|
@@ -61,6 +61,9 @@ function field505FixSubfieldTRG(field) {
|
|
|
61
61
|
const subfieldsThatWillBeModified = field.subfields.filter((sf, i) => i + 1 < field.subfields.length && field.subfields[i + 1].code === 't');
|
|
62
62
|
subfieldsThatWillBeModified.forEach(sf => fixSubfieldThatPrecedesT(sf));
|
|
63
63
|
function fixSubfieldThatPrecedesT(sf) {
|
|
64
|
+
if (!sf.value) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
64
67
|
sf.value = sf.value.replace(/ ;$/u, ' --'); // eslint-disable-line functional/immutable-data
|
|
65
68
|
}
|
|
66
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-505-separators.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","fields","forEach","field","fix505","res","message","valid","validateField","length","orig","fieldToString","normalizedField","clone","mod","push","field505FixSubfieldA","a","subfields","filter","sf","code","fixSubfieldA","value","replace","field505FixSubfieldTRG","subfieldsThatWillBeModified","i","fixSubfieldThatPrecedesT","tag"],"sources":["../src/field-505-separators.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Normalize \" ; \" separators as \" -- \"',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n fix505(field);\n });\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields?.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = fix505(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'TODO: ${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n}\n\n\nfunction field505FixSubfieldA(field) {\n const a = field.subfields.filter(sf => sf.code === 'a');\n\n a.forEach(sf => fixSubfieldA(sf));\n\n function fixSubfieldA(a) {\n a.value = a.value.replace(/ ; /ug, ' -- '); // eslint-disable-line functional/immutable-data\n }\n}\n\nfunction field505FixSubfieldTRG(field) {\n // Modify subfield if next subfield is $t:\n const subfieldsThatWillBeModified = field.subfields.filter((sf, i) => i + 1 < field.subfields.length && field.subfields[i + 1].code === 't');\n\n subfieldsThatWillBeModified.forEach(sf => fixSubfieldThatPrecedesT(sf));\n\n function fixSubfieldThatPrecedesT(sf) {\n sf.value = sf.value.replace(/ ;$/u, ' --'); // eslint-disable-line functional/immutable-data\n }\n}\n\nfunction fix505(field) {\n if (field.tag !== '505' || !field.subfields) {\n return field;\n }\n field505FixSubfieldTRG(field);\n field505FixSubfieldA(field);\n return field;\n}\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAAsC,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAFtC;;AAIA;AACe,SAAAG,SAAA,EAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,sCAAsC;IACnDC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnBA,MAAM,CAACC,MAAM,CAACC,OAAO,CAACC,KAAK,IAAI;MAC7BC,MAAM,CAACD,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAME,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEP,GAAG,EAAE,EAAE;MAAEQ,KAAK,EAAE;IAAI,CAAC;IAC/C,OAAOF,GAAG;EACZ;EAEA,SAASP,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMK,GAAG,GAAG;MAACC,OAAO,EAAE;IAAE,CAAC;IAEzBN,MAAM,CAACC,MAAM,EAAEC,OAAO,CAACC,KAAK,IAAI;MAC9BK,aAAa,CAACL,KAAK,EAAEE,GAAG,CAAC;IAC3B,CAAC,CAAC;IAEFA,GAAG,CAACE,KAAK,GAAG,EAAEF,GAAG,CAACC,OAAO,CAACG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,OAAOJ,GAAG;EACZ;EAEA,SAASG,aAAaA,CAACL,KAAK,EAAEE,GAAG,EAAE;IACjC,MAAMK,IAAI,GAAG,IAAAC,oBAAa,EAACR,KAAK,CAAC;IAEjC,MAAMS,eAAe,GAAGR,MAAM,CAAC,IAAAS,cAAK,EAACV,KAAK,CAAC,CAAC;IAC5C,MAAMW,GAAG,GAAG,IAAAH,oBAAa,EAACC,eAAe,CAAC;IAC1C,IAAIF,IAAI,KAAKI,GAAG,EAAE;MAAE;MAClBT,GAAG,CAACC,OAAO,CAACS,IAAI,CAAC,UAAUL,IAAI,SAASI,GAAG,GAAG,CAAC,CAAC,CAAC;MACjD;IACF;IACA;EACF;AACF;AAGA,SAASE,oBAAoBA,CAACb,KAAK,EAAE;EACnC,MAAMc,CAAC,GAAGd,KAAK,CAACe,SAAS,CAACC,MAAM,CAACC,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC;EAEvDJ,CAAC,CAACf,OAAO,CAACkB,EAAE,IAAIE,YAAY,CAACF,EAAE,CAAC,CAAC;EAEjC,SAASE,YAAYA,CAACL,CAAC,EAAE;IACvBA,CAAC,CAACM,KAAK,GAAGN,CAAC,CAACM,KAAK,CAACC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;EAC9C;AACF;AAEA,SAASC,sBAAsBA,CAACtB,KAAK,EAAE;EACrC;EACA,MAAMuB,2BAA2B,GAAGvB,KAAK,CAACe,SAAS,CAACC,MAAM,CAAC,CAACC,EAAE,EAAEO,CAAC,KAAKA,CAAC,GAAG,CAAC,GAAGxB,KAAK,CAACe,SAAS,CAACT,MAAM,IAAIN,KAAK,CAACe,SAAS,CAACS,CAAC,GAAG,CAAC,CAAC,CAACN,IAAI,KAAK,GAAG,CAAC;EAE5IK,2BAA2B,CAACxB,OAAO,CAACkB,EAAE,IAAIQ,wBAAwB,CAACR,EAAE,CAAC,CAAC;EAEvE,SAASQ,wBAAwBA,CAACR,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"field-505-separators.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","fields","forEach","field","fix505","res","message","valid","validateField","length","orig","fieldToString","normalizedField","clone","mod","push","field505FixSubfieldA","a","subfields","filter","sf","code","fixSubfieldA","value","replace","field505FixSubfieldTRG","subfieldsThatWillBeModified","i","fixSubfieldThatPrecedesT","tag"],"sources":["../src/field-505-separators.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Normalize \" ; \" separators as \" -- \"',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n fix505(field);\n });\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields?.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = fix505(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'TODO: ${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n}\n\n\nfunction field505FixSubfieldA(field) {\n const a = field.subfields.filter(sf => sf.code === 'a');\n\n a.forEach(sf => fixSubfieldA(sf));\n\n function fixSubfieldA(a) {\n a.value = a.value.replace(/ ; /ug, ' -- '); // eslint-disable-line functional/immutable-data\n }\n}\n\nfunction field505FixSubfieldTRG(field) {\n // Modify subfield if next subfield is $t:\n const subfieldsThatWillBeModified = field.subfields.filter((sf, i) => i + 1 < field.subfields.length && field.subfields[i + 1].code === 't');\n\n subfieldsThatWillBeModified.forEach(sf => fixSubfieldThatPrecedesT(sf));\n\n function fixSubfieldThatPrecedesT(sf) {\n if (!sf.value) {\n return;\n }\n sf.value = sf.value.replace(/ ;$/u, ' --'); // eslint-disable-line functional/immutable-data\n }\n}\n\nfunction fix505(field) {\n if (field.tag !== '505' || !field.subfields) {\n return field;\n }\n field505FixSubfieldTRG(field);\n field505FixSubfieldA(field);\n return field;\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/index.js
CHANGED
|
@@ -189,6 +189,12 @@ Object.defineProperty(exports, "MergeRelatorTermFields", {
|
|
|
189
189
|
return _mergeRelatorTermFields.default;
|
|
190
190
|
}
|
|
191
191
|
});
|
|
192
|
+
Object.defineProperty(exports, "Modernize502", {
|
|
193
|
+
enumerable: true,
|
|
194
|
+
get: function () {
|
|
195
|
+
return _modernize.default;
|
|
196
|
+
}
|
|
197
|
+
});
|
|
192
198
|
Object.defineProperty(exports, "MultipleSubfield0s", {
|
|
193
199
|
enumerable: true,
|
|
194
200
|
get: function () {
|
|
@@ -376,6 +382,7 @@ var _itemLanguage = _interopRequireDefault(require("./item-language"));
|
|
|
376
382
|
var _mergeField500Lisapainokset = _interopRequireDefault(require("./mergeField500Lisapainokset"));
|
|
377
383
|
var _mergeFields = _interopRequireDefault(require("./merge-fields/"));
|
|
378
384
|
var _mergeRelatorTermFields = _interopRequireDefault(require("./mergeRelatorTermFields"));
|
|
385
|
+
var _modernize = _interopRequireDefault(require("./modernize-502"));
|
|
379
386
|
var _multipleSubfield = _interopRequireDefault(require("./multiple-subfield-0"));
|
|
380
387
|
var _nonBreakingSpace = _interopRequireDefault(require("./non-breaking-space"));
|
|
381
388
|
var _normalizeDashes = _interopRequireDefault(require("./normalize-dashes"));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_accessRights","_interopRequireDefault","require","_addMissingField","_addMissingField2","_addMissingField3","_addMissingField4","_cyrillux","_cyrilluxUsemarconReplacement","_disambiguateSeriesStatements","_doubleCommas","_duplicatesInd","_emptyFields","_endingPunctuation","_endingWhitespace","_field0081834CharacterGroups","_field505Separators","_field521Fix","_fieldExclusion","_fieldStructure","_fieldsPresent","_fix33X","_fixCountryCodes","_fixLanguageCodes","_fixRelatorTerms","_fixedFields","_identicalFields","_indicatorFixes","_isbnIssn","_itemLanguage","_mergeField500Lisapainokset","_mergeFields","_mergeRelatorTermFields","_multipleSubfield","_nonBreakingSpace","_normalizeDashes","_normalizeIdentifiers","_normalizeQualifyingInformation","_normalizeUtf8Diacritics","_punctuation","_punctuation2","_reindexSubfield6OccurenceNumbers","_removeDuplicateDataFields","_removeInferiorDataFields","_resolvableExtReferencesMelinda","_resolveOrphanedSubfield6s","_sanitizeVocabularySourceCodes","_sortFields","_sortRelatorTerms","_sortSubfields","_sortTags","_subfieldValueNormalizations","_subfieldExclusion","_sync007And","_translateTerms","_typeOfDate","_unicodeDecomposition","_updateField","_urn","e","__esModule","default"],"sources":["../src/index.js"],"sourcesContent":["import AccessRights from './access-rights';\nimport AddMissingField041 from './addMissingField041';\nimport AddMissingField336 from './addMissingField336';\nimport AddMissingField337 from './addMissingField337';\nimport AddMissingField338 from './addMissingField338';\nimport Cyrillux from './cyrillux';\nimport CyrilluxUsemarconReplacement from './cyrillux-usemarcon-replacement';\nimport DisambiguateSeriesStatements from './disambiguateSeriesStatements';\nimport DoubleCommas from './double-commas';\nimport DuplicatesInd1 from './duplicates-ind1';\nimport EmptyFields from './empty-fields';\nimport EndingPunctuation from './ending-punctuation';\nimport EndingWhitespace from './ending-whitespace';\nimport Field008CharacterGroups from './field-008-18-34-character-groups';\nimport Field505Separators from './field-505-separators';\nimport Field521Fix from './field-521-fix';\nimport FieldExclusion from './field-exclusion';\nimport FieldStructure from './field-structure';\nimport FieldsPresent from './fields-present';\nimport Fix33X from './fix-33X';\nimport FixCountryCodes from './fix-country-codes';\nimport FixLanguageCodes from './fix-language-codes';\nimport FixRelatorTerms from './fixRelatorTerms';\nimport FixedFields from './fixed-fields';\nimport IdenticalFields from './identical-fields';\nimport IndicatorFixes from './indicator-fixes';\nimport IsbnIssn from './isbn-issn';\nimport ItemLanguage from './item-language';\nimport MergeField500Lisapainokset from './mergeField500Lisapainokset';\nimport MergeFields from './merge-fields/';\nimport MergeRelatorTermFields from './mergeRelatorTermFields';\nimport MultipleSubfield0s from './multiple-subfield-0';\nimport NonBreakingSpace from './non-breaking-space';\nimport NormalizeDashes from './normalize-dashes';\nimport NormalizeIdentifiers from './normalize-identifiers';\nimport NormalizeQualifyingInformation from './normalize-qualifying-information';\nimport NormalizeUTF8Diacritics from './normalize-utf8-diacritics';\nimport Punctuation from './punctuation/';\nimport Punctuation2 from './punctuation2';\nimport ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers';\nimport RemoveDuplicateDataFields from './removeDuplicateDataFields';\nimport RemoveInferiorDataFields from './removeInferiorDataFields';\nimport ResolvableExtReferences from './resolvable-ext-references-melinda';\nimport ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s';\nimport SanitizeVocabularySourceCodes from './sanitize-vocabulary-source-codes';\nimport SortFields from './sortFields';\nimport SortRelatorTerms from './sortRelatorTerms';\nimport SortSubfields from './sortSubfields';\nimport SortTags from './sort-tags';\n// import StripPunctuation from './stripPunctuation'; // Can we add this here? Should be used very cautiosly!\nimport SubfieldValueNormalizations from './subfieldValueNormalizations';\nimport SubfieldExclusion from './subfield-exclusion';\nimport Sync007And300 from './sync-007-and-300';\nimport TranslateTerms from './translate-terms';\nimport TypeOfDateF008 from './typeOfDate-008';\nimport UnicodeDecomposition from './unicode-decomposition';\nimport UpdateField540 from './update-field-540';\nimport Urn from './urn';\n\nexport {\n AccessRights,\n AddMissingField041,\n AddMissingField336,\n AddMissingField337,\n AddMissingField338,\n Cyrillux,\n CyrilluxUsemarconReplacement,\n DisambiguateSeriesStatements,\n DoubleCommas,\n DuplicatesInd1,\n EmptyFields,\n EndingPunctuation,\n EndingWhitespace,\n Field008CharacterGroups,\n Field505Separators,\n Field521Fix,\n FieldExclusion,\n FieldsPresent,\n FieldStructure,\n Fix33X,\n FixCountryCodes,\n FixLanguageCodes,\n FixRelatorTerms,\n FixedFields,\n IdenticalFields,\n IndicatorFixes,\n IsbnIssn,\n ItemLanguage,\n MergeField500Lisapainokset,\n MergeRelatorTermFields,\n MultipleSubfield0s,\n NonBreakingSpace,\n NormalizeDashes,\n NormalizeIdentifiers,\n NormalizeQualifyingInformation,\n NormalizeUTF8Diacritics,\n Punctuation,\n Punctuation2,\n ResolveOrphanedSubfield6s, // Do this before reindexing! (thus I'm not sticking with alphabetical order here)\n ReindexSubfield6OccurenceNumbers,\n RemoveDuplicateDataFields,\n RemoveInferiorDataFields,\n ResolvableExtReferences,\n SanitizeVocabularySourceCodes,\n SortRelatorTerms,\n SortSubfields,\n SortTags,\n SubfieldExclusion,\n SubfieldValueNormalizations,\n Sync007And300,\n TypeOfDateF008,\n TranslateTerms,\n UnicodeDecomposition,\n UpdateField540,\n Urn,\n SortFields, // Keep this penultimate\n MergeFields // Run this last *iff* you want to use this at all\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":["_accessRights","_interopRequireDefault","require","_addMissingField","_addMissingField2","_addMissingField3","_addMissingField4","_cyrillux","_cyrilluxUsemarconReplacement","_disambiguateSeriesStatements","_doubleCommas","_duplicatesInd","_emptyFields","_endingPunctuation","_endingWhitespace","_field0081834CharacterGroups","_field505Separators","_field521Fix","_fieldExclusion","_fieldStructure","_fieldsPresent","_fix33X","_fixCountryCodes","_fixLanguageCodes","_fixRelatorTerms","_fixedFields","_identicalFields","_indicatorFixes","_isbnIssn","_itemLanguage","_mergeField500Lisapainokset","_mergeFields","_mergeRelatorTermFields","_modernize","_multipleSubfield","_nonBreakingSpace","_normalizeDashes","_normalizeIdentifiers","_normalizeQualifyingInformation","_normalizeUtf8Diacritics","_punctuation","_punctuation2","_reindexSubfield6OccurenceNumbers","_removeDuplicateDataFields","_removeInferiorDataFields","_resolvableExtReferencesMelinda","_resolveOrphanedSubfield6s","_sanitizeVocabularySourceCodes","_sortFields","_sortRelatorTerms","_sortSubfields","_sortTags","_subfieldValueNormalizations","_subfieldExclusion","_sync007And","_translateTerms","_typeOfDate","_unicodeDecomposition","_updateField","_urn","e","__esModule","default"],"sources":["../src/index.js"],"sourcesContent":["import AccessRights from './access-rights';\nimport AddMissingField041 from './addMissingField041';\nimport AddMissingField336 from './addMissingField336';\nimport AddMissingField337 from './addMissingField337';\nimport AddMissingField338 from './addMissingField338';\nimport Cyrillux from './cyrillux';\nimport CyrilluxUsemarconReplacement from './cyrillux-usemarcon-replacement';\nimport DisambiguateSeriesStatements from './disambiguateSeriesStatements';\nimport DoubleCommas from './double-commas';\nimport DuplicatesInd1 from './duplicates-ind1';\nimport EmptyFields from './empty-fields';\nimport EndingPunctuation from './ending-punctuation';\nimport EndingWhitespace from './ending-whitespace';\nimport Field008CharacterGroups from './field-008-18-34-character-groups';\nimport Field505Separators from './field-505-separators';\nimport Field521Fix from './field-521-fix';\nimport FieldExclusion from './field-exclusion';\nimport FieldStructure from './field-structure';\nimport FieldsPresent from './fields-present';\nimport Fix33X from './fix-33X';\nimport FixCountryCodes from './fix-country-codes';\nimport FixLanguageCodes from './fix-language-codes';\nimport FixRelatorTerms from './fixRelatorTerms';\nimport FixedFields from './fixed-fields';\nimport IdenticalFields from './identical-fields';\nimport IndicatorFixes from './indicator-fixes';\nimport IsbnIssn from './isbn-issn';\nimport ItemLanguage from './item-language';\nimport MergeField500Lisapainokset from './mergeField500Lisapainokset';\nimport MergeFields from './merge-fields/';\nimport MergeRelatorTermFields from './mergeRelatorTermFields';\nimport Modernize502 from './modernize-502';\nimport MultipleSubfield0s from './multiple-subfield-0';\nimport NonBreakingSpace from './non-breaking-space';\nimport NormalizeDashes from './normalize-dashes';\nimport NormalizeIdentifiers from './normalize-identifiers';\nimport NormalizeQualifyingInformation from './normalize-qualifying-information';\nimport NormalizeUTF8Diacritics from './normalize-utf8-diacritics';\nimport Punctuation from './punctuation/';\nimport Punctuation2 from './punctuation2';\nimport ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers';\nimport RemoveDuplicateDataFields from './removeDuplicateDataFields';\nimport RemoveInferiorDataFields from './removeInferiorDataFields';\nimport ResolvableExtReferences from './resolvable-ext-references-melinda';\nimport ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s';\nimport SanitizeVocabularySourceCodes from './sanitize-vocabulary-source-codes';\nimport SortFields from './sortFields';\nimport SortRelatorTerms from './sortRelatorTerms';\nimport SortSubfields from './sortSubfields';\nimport SortTags from './sort-tags';\n// import StripPunctuation from './stripPunctuation'; // Can we add this here? Should be used very cautiosly!\nimport SubfieldValueNormalizations from './subfieldValueNormalizations';\nimport SubfieldExclusion from './subfield-exclusion';\nimport Sync007And300 from './sync-007-and-300';\nimport TranslateTerms from './translate-terms';\nimport TypeOfDateF008 from './typeOfDate-008';\nimport UnicodeDecomposition from './unicode-decomposition';\nimport UpdateField540 from './update-field-540';\nimport Urn from './urn';\n\nexport {\n AccessRights,\n AddMissingField041,\n AddMissingField336,\n AddMissingField337,\n AddMissingField338,\n Cyrillux,\n CyrilluxUsemarconReplacement,\n DisambiguateSeriesStatements,\n DoubleCommas,\n DuplicatesInd1,\n EmptyFields,\n EndingPunctuation,\n EndingWhitespace,\n Field008CharacterGroups,\n Field505Separators,\n Field521Fix,\n FieldExclusion,\n FieldsPresent,\n FieldStructure,\n Fix33X,\n FixCountryCodes,\n FixLanguageCodes,\n FixRelatorTerms,\n FixedFields,\n IdenticalFields,\n IndicatorFixes,\n IsbnIssn,\n ItemLanguage,\n MergeField500Lisapainokset,\n MergeRelatorTermFields,\n Modernize502, //\n MultipleSubfield0s,\n NonBreakingSpace,\n NormalizeDashes,\n NormalizeIdentifiers,\n NormalizeQualifyingInformation,\n NormalizeUTF8Diacritics,\n Punctuation,\n Punctuation2,\n ResolveOrphanedSubfield6s, // Do this before reindexing! (thus I'm not sticking with alphabetical order here)\n ReindexSubfield6OccurenceNumbers,\n RemoveDuplicateDataFields,\n RemoveInferiorDataFields,\n ResolvableExtReferences,\n SanitizeVocabularySourceCodes,\n SortRelatorTerms,\n SortSubfields,\n SortTags,\n SubfieldExclusion,\n SubfieldValueNormalizations,\n Sync007And300,\n TypeOfDateF008,\n TranslateTerms,\n UnicodeDecomposition,\n UpdateField540,\n Urn,\n SortFields, // Keep this penultimate\n MergeFields // Run this last *iff* you want to use this at all\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,iBAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,iBAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,iBAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,SAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,6BAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,6BAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,aAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,cAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,YAAA,GAAAX,sBAAA,CAAAC,OAAA;AACA,IAAAW,kBAAA,GAAAZ,sBAAA,CAAAC,OAAA;AACA,IAAAY,iBAAA,GAAAb,sBAAA,CAAAC,OAAA;AACA,IAAAa,4BAAA,GAAAd,sBAAA,CAAAC,OAAA;AACA,IAAAc,mBAAA,GAAAf,sBAAA,CAAAC,OAAA;AACA,IAAAe,YAAA,GAAAhB,sBAAA,CAAAC,OAAA;AACA,IAAAgB,eAAA,GAAAjB,sBAAA,CAAAC,OAAA;AACA,IAAAiB,eAAA,GAAAlB,sBAAA,CAAAC,OAAA;AACA,IAAAkB,cAAA,GAAAnB,sBAAA,CAAAC,OAAA;AACA,IAAAmB,OAAA,GAAApB,sBAAA,CAAAC,OAAA;AACA,IAAAoB,gBAAA,GAAArB,sBAAA,CAAAC,OAAA;AACA,IAAAqB,iBAAA,GAAAtB,sBAAA,CAAAC,OAAA;AACA,IAAAsB,gBAAA,GAAAvB,sBAAA,CAAAC,OAAA;AACA,IAAAuB,YAAA,GAAAxB,sBAAA,CAAAC,OAAA;AACA,IAAAwB,gBAAA,GAAAzB,sBAAA,CAAAC,OAAA;AACA,IAAAyB,eAAA,GAAA1B,sBAAA,CAAAC,OAAA;AACA,IAAA0B,SAAA,GAAA3B,sBAAA,CAAAC,OAAA;AACA,IAAA2B,aAAA,GAAA5B,sBAAA,CAAAC,OAAA;AACA,IAAA4B,2BAAA,GAAA7B,sBAAA,CAAAC,OAAA;AACA,IAAA6B,YAAA,GAAA9B,sBAAA,CAAAC,OAAA;AACA,IAAA8B,uBAAA,GAAA/B,sBAAA,CAAAC,OAAA;AACA,IAAA+B,UAAA,GAAAhC,sBAAA,CAAAC,OAAA;AACA,IAAAgC,iBAAA,GAAAjC,sBAAA,CAAAC,OAAA;AACA,IAAAiC,iBAAA,GAAAlC,sBAAA,CAAAC,OAAA;AACA,IAAAkC,gBAAA,GAAAnC,sBAAA,CAAAC,OAAA;AACA,IAAAmC,qBAAA,GAAApC,sBAAA,CAAAC,OAAA;AACA,IAAAoC,+BAAA,GAAArC,sBAAA,CAAAC,OAAA;AACA,IAAAqC,wBAAA,GAAAtC,sBAAA,CAAAC,OAAA;AACA,IAAAsC,YAAA,GAAAvC,sBAAA,CAAAC,OAAA;AACA,IAAAuC,aAAA,GAAAxC,sBAAA,CAAAC,OAAA;AACA,IAAAwC,iCAAA,GAAAzC,sBAAA,CAAAC,OAAA;AACA,IAAAyC,0BAAA,GAAA1C,sBAAA,CAAAC,OAAA;AACA,IAAA0C,yBAAA,GAAA3C,sBAAA,CAAAC,OAAA;AACA,IAAA2C,+BAAA,GAAA5C,sBAAA,CAAAC,OAAA;AACA,IAAA4C,0BAAA,GAAA7C,sBAAA,CAAAC,OAAA;AACA,IAAA6C,8BAAA,GAAA9C,sBAAA,CAAAC,OAAA;AACA,IAAA8C,WAAA,GAAA/C,sBAAA,CAAAC,OAAA;AACA,IAAA+C,iBAAA,GAAAhD,sBAAA,CAAAC,OAAA;AACA,IAAAgD,cAAA,GAAAjD,sBAAA,CAAAC,OAAA;AACA,IAAAiD,SAAA,GAAAlD,sBAAA,CAAAC,OAAA;AAEA,IAAAkD,4BAAA,GAAAnD,sBAAA,CAAAC,OAAA;AACA,IAAAmD,kBAAA,GAAApD,sBAAA,CAAAC,OAAA;AACA,IAAAoD,WAAA,GAAArD,sBAAA,CAAAC,OAAA;AACA,IAAAqD,eAAA,GAAAtD,sBAAA,CAAAC,OAAA;AACA,IAAAsD,WAAA,GAAAvD,sBAAA,CAAAC,OAAA;AACA,IAAAuD,qBAAA,GAAAxD,sBAAA,CAAAC,OAAA;AACA,IAAAwD,YAAA,GAAAzD,sBAAA,CAAAC,OAAA;AACA,IAAAyD,IAAA,GAAA1D,sBAAA,CAAAC,OAAA;AAAwB,SAAAD,uBAAA2D,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA","ignoreList":[]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = _default;
|
|
7
|
+
exports.normalizeField502 = normalizeField502;
|
|
8
|
+
var _clone = _interopRequireDefault(require("clone"));
|
|
9
|
+
var _utils = require("./utils");
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
//import createDebugLogger from 'debug';
|
|
12
|
+
|
|
13
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/modernize-502');
|
|
14
|
+
|
|
15
|
+
// Author(s): Nicholas Volk
|
|
16
|
+
function _default() {
|
|
17
|
+
return {
|
|
18
|
+
description: 'Normalizes Finnish national convention 502$a$c$d fields to a 502$a (which is better supported by LoC).',
|
|
19
|
+
validate,
|
|
20
|
+
fix
|
|
21
|
+
};
|
|
22
|
+
function fix(record) {
|
|
23
|
+
const res = {
|
|
24
|
+
message: [],
|
|
25
|
+
fix: [],
|
|
26
|
+
valid: true
|
|
27
|
+
};
|
|
28
|
+
record.fields.forEach(field => {
|
|
29
|
+
normalizeField502(field);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data
|
|
33
|
+
return res;
|
|
34
|
+
}
|
|
35
|
+
function validate(record) {
|
|
36
|
+
const res = {
|
|
37
|
+
message: []
|
|
38
|
+
};
|
|
39
|
+
record.fields.forEach(field => {
|
|
40
|
+
validateField(field, res);
|
|
41
|
+
});
|
|
42
|
+
res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
|
|
43
|
+
return res;
|
|
44
|
+
}
|
|
45
|
+
function validateField(field, res) {
|
|
46
|
+
if (!field.subfields) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const orig = (0, _utils.fieldToString)(field);
|
|
50
|
+
const normalizedField = normalizeField502((0, _clone.default)(field));
|
|
51
|
+
const mod = (0, _utils.fieldToString)(normalizedField);
|
|
52
|
+
if (orig !== mod) {
|
|
53
|
+
// Fail as the input is "broken"/"crap"/sumthing
|
|
54
|
+
res.message.push(`Fix '${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function normalizeField502(field) {
|
|
61
|
+
if (!field.subfields) {
|
|
62
|
+
return field;
|
|
63
|
+
}
|
|
64
|
+
const acd = field.subfields.filter(sf => 'acd'.includes(sf.code));
|
|
65
|
+
const str = acd.map(sf => sf.code).join('');
|
|
66
|
+
// Check that we have relevant subfields and that they are in relevant order (with each other):
|
|
67
|
+
if (!['acd', 'ac', 'ad'].includes(str)) {
|
|
68
|
+
return field;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// "a = acd[0]"" is way more readable than "[a] = acd"...
|
|
72
|
+
const a = acd[0]; // eslint-disable-line prefer-destructuring
|
|
73
|
+
const c = acd[1].code === 'c' ? acd[1] : null;
|
|
74
|
+
const d = acd[acd.length - 1].code === 'd' ? acd[acd.length - 1] : null;
|
|
75
|
+
console.log(JSON.stringify(d)); // eslint-disable-line no-console
|
|
76
|
+
|
|
77
|
+
if (!hasValidA() || !hasValidD()) {
|
|
78
|
+
return field;
|
|
79
|
+
}
|
|
80
|
+
const newValue = `${extractA()}--${extractC()}${extractD()}`;
|
|
81
|
+
a.value = newValue; // eslint-disable-line functional/immutable-data
|
|
82
|
+
field.subfields = field.subfields.filter(sf => !['c', 'd'].includes(sf.code)); // eslint-disable-line functional/immutable-data
|
|
83
|
+
return field;
|
|
84
|
+
function extractA() {
|
|
85
|
+
return a.value.replace(/[ ,:]+$/u, '');
|
|
86
|
+
}
|
|
87
|
+
function extractC() {
|
|
88
|
+
if (!c) {
|
|
89
|
+
return '';
|
|
90
|
+
}
|
|
91
|
+
if (c) {
|
|
92
|
+
// Here we assume that there was correct punctuation between $c and $d...
|
|
93
|
+
return `${c.value}${d ? ' ' : ''}`;
|
|
94
|
+
}
|
|
95
|
+
return c.value;
|
|
96
|
+
}
|
|
97
|
+
function extractD() {
|
|
98
|
+
return d ? d.value : '';
|
|
99
|
+
}
|
|
100
|
+
function hasValidA() {
|
|
101
|
+
// Belongs to https://finto.fi/mts/fi/page/m91
|
|
102
|
+
if (a.value.match(/^(?:AMK-opinnäytetyö|Anbalyysiseminaarityö|Artikkeliväitöskirja|Diplomityö|Erikoistyö|Esseeväitöskirja|Kandidaatintutkielma|Laudaturseminaarityö|Laudaturtyö|Lisensiaatintyö|Lopputyö|Monografiaväitöskirja|Opinnäyte|Opinnäytetyö|Pro gradu -tutkielma|Proseminaarityö|Seminaarityö|Väitöskirja|Ylempi AMK-opinnäytetyö)[, :]*$/u) || a.value.match(/^(?:Analysseminariearbete|Artikelavhandling|Diplomarbete|Doktorsavhandling|Essäavhandling|Högre YH-examensarbete|Kandidatavhandling|Laudaturarbete|Laudaturseminariearbete|Licentiatavhandling|Lärdomsprov|Monografiavhandling|Pro gradu-avhandling|Proseminariearbete|Seminariearbete|Slutarbete|Specialarbete|YH-examesarbete)[:, ]*$/u)) {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
function hasValidD() {
|
|
108
|
+
if (!d) {
|
|
109
|
+
// We can live without $d:
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
// Content makes sense:
|
|
113
|
+
return d.value.match(/^\[?(?:[0-9]{4}|[0-9]{4}-[0-9]{4}|1[89]uu|Vuosien [0-9]{4} ja [0-9]{4} välillä)[\].]{0,2}$/u);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=modernize-502.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modernize-502.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","field","normalizeField502","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","acd","filter","sf","includes","code","str","map","join","a","c","d","console","log","JSON","stringify","hasValidA","hasValidD","newValue","extractA","extractC","extractD","value","replace","match"],"sources":["../src/modernize-502.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/modernize-502');\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Normalizes Finnish national convention 502$a$c$d fields to a 502$a (which is better supported by LoC).',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.forEach(field => {\n normalizeField502(field);\n });\n\n // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res) {\n if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = normalizeField502(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`Fix '${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n}\n\n\nexport function normalizeField502(field) {\n if (!field.subfields) {\n return field;\n }\n const acd = field.subfields.filter(sf => 'acd'.includes(sf.code));\n const str = acd.map(sf => sf.code).join('');\n // Check that we have relevant subfields and that they are in relevant order (with each other):\n if (!['acd', 'ac', 'ad'].includes(str)) {\n return field;\n }\n\n // \"a = acd[0]\"\" is way more readable than \"[a] = acd\"...\n const a = acd[0]; // eslint-disable-line prefer-destructuring\n const c = acd[1].code === 'c' ? acd[1] : null;\n const d = acd[acd.length - 1].code === 'd' ? acd[acd.length - 1] : null;\n\n console.log(JSON.stringify(d)); // eslint-disable-line no-console\n\n if (!hasValidA() || !hasValidD()) {\n return field;\n }\n\n const newValue = `${extractA()}--${extractC()}${extractD()}`;\n a.value = newValue; // eslint-disable-line functional/immutable-data\n field.subfields = field.subfields.filter(sf => !['c', 'd'].includes(sf.code)); // eslint-disable-line functional/immutable-data\n return field;\n\n function extractA() {\n return a.value.replace(/[ ,:]+$/u, '');\n }\n\n function extractC() {\n if (!c) {\n return '';\n }\n if (c) {\n // Here we assume that there was correct punctuation between $c and $d...\n return `${c.value}${d ? ' ' : ''}`;\n }\n return c.value;\n }\n\n function extractD() {\n return d ? d.value : '';\n }\n\n function hasValidA() {\n // Belongs to https://finto.fi/mts/fi/page/m91\n if (a.value.match(/^(?:AMK-opinnäytetyö|Anbalyysiseminaarityö|Artikkeliväitöskirja|Diplomityö|Erikoistyö|Esseeväitöskirja|Kandidaatintutkielma|Laudaturseminaarityö|Laudaturtyö|Lisensiaatintyö|Lopputyö|Monografiaväitöskirja|Opinnäyte|Opinnäytetyö|Pro gradu -tutkielma|Proseminaarityö|Seminaarityö|Väitöskirja|Ylempi AMK-opinnäytetyö)[, :]*$/u) ||\n a.value.match(/^(?:Analysseminariearbete|Artikelavhandling|Diplomarbete|Doktorsavhandling|Essäavhandling|Högre YH-examensarbete|Kandidatavhandling|Laudaturarbete|Laudaturseminariearbete|Licentiatavhandling|Lärdomsprov|Monografiavhandling|Pro gradu-avhandling|Proseminariearbete|Seminariearbete|Slutarbete|Specialarbete|YH-examesarbete)[:, ]*$/u)) {\n return true;\n }\n return false;\n }\n\n\n function hasValidD() {\n if (!d) { // We can live without $d:\n return true;\n }\n // Content makes sense:\n return d.value.match(/^\\[?(?:[0-9]{4}|[0-9]{4}-[0-9]{4}|1[89]uu|Vuosien [0-9]{4} ja [0-9]{4} välillä)[\\].]{0,2}$/u);\n }\n\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _chai = require("chai");
|
|
4
|
+
var _marcRecord = require("@natlibfi/marc-record");
|
|
5
|
+
var _modernize = _interopRequireDefault(require("./modernize-502"));
|
|
6
|
+
var _fixura = require("@natlibfi/fixura");
|
|
7
|
+
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
//import createDebugLogger from 'debug';
|
|
10
|
+
|
|
11
|
+
(0, _fixugen.default)({
|
|
12
|
+
callback,
|
|
13
|
+
path: [__dirname, '..', 'test-fixtures', 'modernize-502'],
|
|
14
|
+
useMetadataFile: true,
|
|
15
|
+
recurse: false,
|
|
16
|
+
fixura: {
|
|
17
|
+
reader: _fixura.READERS.JSON
|
|
18
|
+
},
|
|
19
|
+
mocha: {
|
|
20
|
+
before: () => testValidatorFactory()
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/modernize-502:test');
|
|
25
|
+
|
|
26
|
+
async function testValidatorFactory() {
|
|
27
|
+
const validator = await (0, _modernize.default)();
|
|
28
|
+
(0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
|
|
29
|
+
(0, _chai.expect)(validator.description).to.be.a('string');
|
|
30
|
+
(0, _chai.expect)(validator.validate).to.be.a('function');
|
|
31
|
+
}
|
|
32
|
+
async function callback({
|
|
33
|
+
getFixture,
|
|
34
|
+
fix = false
|
|
35
|
+
}) {
|
|
36
|
+
const validator = await (0, _modernize.default)();
|
|
37
|
+
const record = new _marcRecord.MarcRecord(getFixture('record.json'));
|
|
38
|
+
const expectedResult = getFixture('expectedResult.json');
|
|
39
|
+
// console.log(expectedResult); // eslint-disable-line
|
|
40
|
+
|
|
41
|
+
if (!fix) {
|
|
42
|
+
const result = await validator.validate(record);
|
|
43
|
+
(0, _chai.expect)(result).to.eql(expectedResult);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
await validator.fix(record);
|
|
47
|
+
(0, _chai.expect)(record).to.eql(expectedResult);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=modernize-502.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modernize-502.spec.js","names":["_chai","require","_marcRecord","_modernize","_interopRequireDefault","_fixura","_fixugen","e","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/modernize-502.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './modernize-502';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n//import createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'modernize-502'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/modernize-502:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, fix = false}) {\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AAA8C,SAAAG,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAC9C;;AAEA,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,CAAC;EACzDC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;;AAEF;;AAEA,eAAeA,oBAAoBA,CAAA,EAAG;EACpC,MAAMC,SAAS,GAAG,MAAM,IAAAC,kBAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAevB,QAAQA,CAAC;EAACyB,UAAU;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjD,MAAMd,SAAS,GAAG,MAAM,IAAAC,kBAAgB,EAAC,CAAC;EAC1C,MAAMc,MAAM,GAAG,IAAIC,sBAAU,CAACH,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMI,cAAc,GAAGJ,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACC,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMlB,SAAS,CAACY,QAAQ,CAACG,MAAM,CAAC;IAC/C,IAAAb,YAAM,EAACgB,MAAM,CAAC,CAACf,EAAE,CAACgB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMjB,SAAS,CAACc,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAb,YAAM,EAACa,MAAM,CAAC,CAACZ,EAAE,CAACgB,GAAG,CAACF,cAAc,CAAC;AACvC","ignoreList":[]}
|
package/dist/punctuation2.js
CHANGED
|
@@ -106,7 +106,7 @@ const removeColons = {
|
|
|
106
106
|
'remove': / *[;:]$/u
|
|
107
107
|
};
|
|
108
108
|
const removeX00Comma = {
|
|
109
|
-
'code': '
|
|
109
|
+
'code': 'abcdejnqt',
|
|
110
110
|
'followedBy': 'abcdenqtv#',
|
|
111
111
|
'context': /.,$/u,
|
|
112
112
|
'remove': /,$/u
|
|
@@ -141,6 +141,12 @@ const cleanX00eDot = {
|
|
|
141
141
|
'context': /(?:[ai]ja|jä)[.,]$/u,
|
|
142
142
|
'remove': /\.$/u
|
|
143
143
|
};
|
|
144
|
+
const cleanX11jDot = {
|
|
145
|
+
'code': 'e',
|
|
146
|
+
'followedBy': 'egj#',
|
|
147
|
+
'context': /(?:[ai]ja|jä)[.,]$/u,
|
|
148
|
+
'remove': /\.$/u
|
|
149
|
+
};
|
|
144
150
|
const removeCommaBeforeLanguageSubfieldL = {
|
|
145
151
|
'followedBy': 'l',
|
|
146
152
|
'remove': /,$/u
|
|
@@ -186,9 +192,16 @@ const addX00aComma2 = {
|
|
|
186
192
|
const addX00Dot = {
|
|
187
193
|
'add': '.',
|
|
188
194
|
'code': 'abcdetv',
|
|
189
|
-
'followedBy': '
|
|
195
|
+
'followedBy': 'fklptu',
|
|
190
196
|
'context': needsPuncAfterAlphanumeric
|
|
191
197
|
};
|
|
198
|
+
const addEntryFieldFinalDot = {
|
|
199
|
+
'name': 'X00 final dot',
|
|
200
|
+
'add': '.',
|
|
201
|
+
'code': 'abcdefghijklmnopqrstuvwxyz',
|
|
202
|
+
'followedBy': '#',
|
|
203
|
+
'context': /[^.)]$/u
|
|
204
|
+
};
|
|
192
205
|
const addX10iColon = {
|
|
193
206
|
name: 'Punctuate relationship information',
|
|
194
207
|
add: ':',
|
|
@@ -255,7 +268,7 @@ const REMOVE_AND_ADD = 3;
|
|
|
255
268
|
const removeCrapFromAllEntryFields = [removeCommaBeforeLanguageSubfieldL, removeCommaBeforeTitleSubfieldT];
|
|
256
269
|
const removeX00Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, cleanX00dCommaOrDot, cleanRHS, X00RemoveDotAfterBracket, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];
|
|
257
270
|
const removeX10Whatever = [removeX00Comma, cleanX00aDot, cleanX00eDot, cleanCorruption, removeColons, cleanPuncBeforeLanguage, ...removeCrapFromAllEntryFields];
|
|
258
|
-
const removeX11Whatever = [...removeCrapFromAllEntryFields];
|
|
271
|
+
const removeX11Whatever = [removeX00Comma, cleanX11jDot, ...removeCrapFromAllEntryFields];
|
|
259
272
|
const removeX30Whatever = removeCrapFromAllEntryFields;
|
|
260
273
|
const remove490And830Whatever = [{
|
|
261
274
|
'code': 'axyzv',
|
|
@@ -581,7 +594,7 @@ const cleanValidPunctuationRules = {
|
|
|
581
594
|
};
|
|
582
595
|
|
|
583
596
|
// Overgeneralizes a bit: eg. addColonToRelationshipInformation only applies to 700/710 but as others don't have $i, it's fine.
|
|
584
|
-
const addToAllEntryFields = [addDotBeforeLanguageSubfieldL, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];
|
|
597
|
+
const addToAllEntryFields = [addDotBeforeLanguageSubfieldL, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation, addEntryFieldFinalDot];
|
|
585
598
|
const addX00 = [addX00aComma, addX00aComma2, addX00Dot, addX00dComma, ...addToAllEntryFields];
|
|
586
599
|
const addX10 = [addX10iColon, addX10bDot, addX10eComma, addX10Dot, ...addToAllEntryFields];
|
|
587
600
|
const addX11 = [...addToAllEntryFields, addX11Spacecolon];
|