@natlibfi/marc-record-validators-melinda 10.13.0 → 10.13.1-alpha.2

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.
Files changed (72) hide show
  1. package/.github/workflows/melinda-node-tests.yml +3 -3
  2. package/dist/field-505-separators.js +77 -0
  3. package/dist/field-505-separators.js.map +1 -0
  4. package/dist/field-505-separators.spec.js +51 -0
  5. package/dist/field-505-separators.spec.js.map +1 -0
  6. package/dist/fixRelatorTerms.js +278 -0
  7. package/dist/fixRelatorTerms.js.map +1 -0
  8. package/dist/fixRelatorTerms.spec.js +51 -0
  9. package/dist/fixRelatorTerms.spec.js.map +1 -0
  10. package/dist/index.js +101 -3
  11. package/dist/index.js.map +1 -1
  12. package/dist/normalize-qualifying-information.js +97 -0
  13. package/dist/normalize-qualifying-information.js.map +1 -0
  14. package/dist/normalize-qualifying-information.spec.js +51 -0
  15. package/dist/normalize-qualifying-information.spec.js.map +1 -0
  16. package/dist/normalizeSubfieldValueForComparison.js +12 -3
  17. package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
  18. package/dist/prepublicationUtils.js +8 -26
  19. package/dist/prepublicationUtils.js.map +1 -1
  20. package/dist/punctuation2.js +7 -2
  21. package/dist/punctuation2.js.map +1 -1
  22. package/dist/removeInferiorDataFields.js +69 -10
  23. package/dist/removeInferiorDataFields.js.map +1 -1
  24. package/dist/utils.js +12 -0
  25. package/dist/utils.js.map +1 -1
  26. package/package.json +11 -11
  27. package/src/field-505-separators.js +75 -0
  28. package/src/field-505-separators.spec.js +52 -0
  29. package/src/fixRelatorTerms.js +233 -0
  30. package/src/fixRelatorTerms.spec.js +52 -0
  31. package/src/index.js +33 -4
  32. package/src/normalize-qualifying-information.js +92 -0
  33. package/src/normalize-qualifying-information.spec.js +52 -0
  34. package/src/normalizeSubfieldValueForComparison.js +14 -3
  35. package/src/prepublicationUtils.js +8 -25
  36. package/src/punctuation2.js +3 -2
  37. package/src/removeInferiorDataFields.js +70 -10
  38. package/src/utils.js +12 -0
  39. package/test-fixtures/field-505-separators/01/expectedResult.json +7 -0
  40. package/test-fixtures/field-505-separators/01/metadata.json +7 -0
  41. package/test-fixtures/field-505-separators/01/record.json +25 -0
  42. package/test-fixtures/field-505-separators/02/expectedResult.json +27 -0
  43. package/test-fixtures/field-505-separators/02/metadata.json +7 -0
  44. package/test-fixtures/field-505-separators/02/record.json +25 -0
  45. package/test-fixtures/fix-relator-terms/f01/expectedResult.json +14 -0
  46. package/test-fixtures/fix-relator-terms/f01/metadata.json +6 -0
  47. package/test-fixtures/fix-relator-terms/f01/record.json +13 -0
  48. package/test-fixtures/fix-relator-terms/f01b/expectedResult.json +12 -0
  49. package/test-fixtures/fix-relator-terms/f01b/metadata.json +6 -0
  50. package/test-fixtures/fix-relator-terms/f01b/record.json +11 -0
  51. package/test-fixtures/fix-relator-terms/f02/expectedResult.json +12 -0
  52. package/test-fixtures/fix-relator-terms/f02/metadata.json +6 -0
  53. package/test-fixtures/fix-relator-terms/f02/record.json +11 -0
  54. package/test-fixtures/normalize-qualifying-information/01/expectedResult.json +8 -0
  55. package/test-fixtures/normalize-qualifying-information/01/metadata.json +7 -0
  56. package/test-fixtures/normalize-qualifying-information/01/record.json +25 -0
  57. package/test-fixtures/normalize-qualifying-information/02/expectedResult.json +27 -0
  58. package/test-fixtures/normalize-qualifying-information/02/metadata.json +7 -0
  59. package/test-fixtures/normalize-qualifying-information/02/record.json +25 -0
  60. package/test-fixtures/punctuation2/97/expectedResult.json +6 -1
  61. package/test-fixtures/punctuation2/97/record.json +5 -0
  62. package/test-fixtures/remove-inferior-datafields/f09/expectedResult.json +20 -0
  63. package/test-fixtures/remove-inferior-datafields/f09/metadata.json +6 -0
  64. package/test-fixtures/remove-inferior-datafields/f09/record.json +30 -0
  65. package/test-fixtures/remove-inferior-datafields/f10/expectedResult.json +17 -0
  66. package/test-fixtures/remove-inferior-datafields/f10/metadata.json +6 -0
  67. package/test-fixtures/remove-inferior-datafields/f10/record.json +27 -0
  68. package/test-fixtures/remove-inferior-datafields/f11/expectedResult.json +14 -0
  69. package/test-fixtures/remove-inferior-datafields/f11/metadata.json +6 -0
  70. package/test-fixtures/remove-inferior-datafields/f11/record.json +18 -0
  71. package/test-fixtures/strip-punctuation/98/expectedResult.json +5 -0
  72. package/test-fixtures/strip-punctuation/98/record.json +5 -0
package/dist/index.js CHANGED
@@ -39,6 +39,12 @@ Object.defineProperty(exports, "EndingWhitespace", {
39
39
  return _endingWhitespace.default;
40
40
  }
41
41
  });
42
+ Object.defineProperty(exports, "Field505Separators", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _field505Separators.default;
46
+ }
47
+ });
42
48
  Object.defineProperty(exports, "Field521Fix", {
43
49
  enumerable: true,
44
50
  get: function () {
@@ -63,6 +69,12 @@ Object.defineProperty(exports, "FieldsPresent", {
63
69
  return _fieldsPresent.default;
64
70
  }
65
71
  });
72
+ Object.defineProperty(exports, "FixRelatorTerms", {
73
+ enumerable: true,
74
+ get: function () {
75
+ return _fixRelatorTerms.default;
76
+ }
77
+ });
66
78
  Object.defineProperty(exports, "FixedFields", {
67
79
  enumerable: true,
68
80
  get: function () {
@@ -75,6 +87,12 @@ Object.defineProperty(exports, "IdenticalFields", {
75
87
  return _identicalFields.default;
76
88
  }
77
89
  });
90
+ Object.defineProperty(exports, "IndicatorFixes", {
91
+ enumerable: true,
92
+ get: function () {
93
+ return _indicatorFixes.default;
94
+ }
95
+ });
78
96
  Object.defineProperty(exports, "IsbnIssn", {
79
97
  enumerable: true,
80
98
  get: function () {
@@ -87,12 +105,42 @@ Object.defineProperty(exports, "ItemLanguage", {
87
105
  return _itemLanguage.default;
88
106
  }
89
107
  });
108
+ Object.defineProperty(exports, "MergeField500Lisapainokset", {
109
+ enumerable: true,
110
+ get: function () {
111
+ return _mergeField500Lisapainokset.default;
112
+ }
113
+ });
114
+ Object.defineProperty(exports, "MergeRelatorTermFields", {
115
+ enumerable: true,
116
+ get: function () {
117
+ return _mergeRelatorTermFields.default;
118
+ }
119
+ });
120
+ Object.defineProperty(exports, "MultipleSubfield0s", {
121
+ enumerable: true,
122
+ get: function () {
123
+ return _multipleSubfield.default;
124
+ }
125
+ });
90
126
  Object.defineProperty(exports, "NonBreakingSpace", {
91
127
  enumerable: true,
92
128
  get: function () {
93
129
  return _nonBreakingSpace.default;
94
130
  }
95
131
  });
132
+ Object.defineProperty(exports, "NormalizeIdentifiers", {
133
+ enumerable: true,
134
+ get: function () {
135
+ return _normalizeIdentifiers.default;
136
+ }
137
+ });
138
+ Object.defineProperty(exports, "NormalizeQualifyingInformation", {
139
+ enumerable: true,
140
+ get: function () {
141
+ return _normalizeQualifyingInformation.default;
142
+ }
143
+ });
96
144
  Object.defineProperty(exports, "NormalizeUTF8Diacritics", {
97
145
  enumerable: true,
98
146
  get: function () {
@@ -105,12 +153,30 @@ Object.defineProperty(exports, "Punctuation", {
105
153
  return _punctuation.default;
106
154
  }
107
155
  });
156
+ Object.defineProperty(exports, "Punctuation2", {
157
+ enumerable: true,
158
+ get: function () {
159
+ return _punctuation2.default;
160
+ }
161
+ });
108
162
  Object.defineProperty(exports, "ReindexSubfield6OccurenceNumbers", {
109
163
  enumerable: true,
110
164
  get: function () {
111
165
  return _reindexSubfield6OccurenceNumbers.default;
112
166
  }
113
167
  });
168
+ Object.defineProperty(exports, "RemoveDuplicateDataFields", {
169
+ enumerable: true,
170
+ get: function () {
171
+ return _removeDuplicateDataFields.default;
172
+ }
173
+ });
174
+ Object.defineProperty(exports, "RemoveInferiorDataFields", {
175
+ enumerable: true,
176
+ get: function () {
177
+ return _removeInferiorDataFields.default;
178
+ }
179
+ });
114
180
  Object.defineProperty(exports, "ResolvableExtReferences", {
115
181
  enumerable: true,
116
182
  get: function () {
@@ -129,6 +195,12 @@ Object.defineProperty(exports, "SanitizeVocabularySourceCodes", {
129
195
  return _sanitizeVocabularySourceCodes.default;
130
196
  }
131
197
  });
198
+ Object.defineProperty(exports, "SortRelatorTerms", {
199
+ enumerable: true,
200
+ get: function () {
201
+ return _sortRelatorTerms.default;
202
+ }
203
+ });
132
204
  Object.defineProperty(exports, "SortSubfields", {
133
205
  enumerable: true,
134
206
  get: function () {
@@ -147,6 +219,18 @@ Object.defineProperty(exports, "SubfieldExclusion", {
147
219
  return _subfieldExclusion.default;
148
220
  }
149
221
  });
222
+ Object.defineProperty(exports, "SubfieldValueNormalizations", {
223
+ enumerable: true,
224
+ get: function () {
225
+ return _subfieldValueNormalizations.default;
226
+ }
227
+ });
228
+ Object.defineProperty(exports, "Sync007And300", {
229
+ enumerable: true,
230
+ get: function () {
231
+ return _sync007And.default;
232
+ }
233
+ });
150
234
  Object.defineProperty(exports, "TypeOfDateF008", {
151
235
  enumerable: true,
152
236
  get: function () {
@@ -177,27 +261,41 @@ var _duplicatesInd = _interopRequireDefault(require("./duplicates-ind1"));
177
261
  var _emptyFields = _interopRequireDefault(require("./empty-fields"));
178
262
  var _endingPunctuation = _interopRequireDefault(require("./ending-punctuation"));
179
263
  var _endingWhitespace = _interopRequireDefault(require("./ending-whitespace"));
264
+ var _field505Separators = _interopRequireDefault(require("./field-505-separators"));
180
265
  var _field521Fix = _interopRequireDefault(require("./field-521-fix"));
181
- var _fieldsPresent = _interopRequireDefault(require("./fields-present"));
266
+ var _fieldExclusion = _interopRequireDefault(require("./field-exclusion"));
182
267
  var _fieldStructure = _interopRequireDefault(require("./field-structure"));
268
+ var _fieldsPresent = _interopRequireDefault(require("./fields-present"));
183
269
  var _fixedFields = _interopRequireDefault(require("./fixed-fields"));
184
- var _fieldExclusion = _interopRequireDefault(require("./field-exclusion"));
270
+ var _fixRelatorTerms = _interopRequireDefault(require("./fixRelatorTerms"));
185
271
  var _identicalFields = _interopRequireDefault(require("./identical-fields"));
272
+ var _indicatorFixes = _interopRequireDefault(require("./indicator-fixes"));
186
273
  var _isbnIssn = _interopRequireDefault(require("./isbn-issn"));
187
274
  var _itemLanguage = _interopRequireDefault(require("./item-language"));
275
+ var _mergeField500Lisapainokset = _interopRequireDefault(require("./mergeField500Lisapainokset"));
276
+ var _mergeRelatorTermFields = _interopRequireDefault(require("./mergeRelatorTermFields"));
277
+ var _multipleSubfield = _interopRequireDefault(require("./multiple-subfield-0"));
188
278
  var _nonBreakingSpace = _interopRequireDefault(require("./non-breaking-space"));
279
+ var _normalizeIdentifiers = _interopRequireDefault(require("./normalize-identifiers"));
280
+ var _normalizeQualifyingInformation = _interopRequireDefault(require("./normalize-qualifying-information"));
189
281
  var _normalizeUtf8Diacritics = _interopRequireDefault(require("./normalize-utf8-diacritics"));
190
282
  var _punctuation = _interopRequireDefault(require("./punctuation/"));
283
+ var _punctuation2 = _interopRequireDefault(require("./punctuation2"));
191
284
  var _resolveOrphanedSubfield6s = _interopRequireDefault(require("./resolveOrphanedSubfield6s"));
192
285
  var _reindexSubfield6OccurenceNumbers = _interopRequireDefault(require("./reindexSubfield6OccurenceNumbers"));
286
+ var _removeDuplicateDataFields = _interopRequireDefault(require("./removeDuplicateDataFields"));
287
+ var _removeInferiorDataFields = _interopRequireDefault(require("./removeInferiorDataFields"));
193
288
  var _resolvableExtReferencesMelinda = _interopRequireDefault(require("./resolvable-ext-references-melinda"));
194
289
  var _sanitizeVocabularySourceCodes = _interopRequireDefault(require("./sanitize-vocabulary-source-codes"));
195
- var _updateField = _interopRequireDefault(require("./update-field-540"));
290
+ var _sortRelatorTerms = _interopRequireDefault(require("./sortRelatorTerms"));
196
291
  var _sortSubfields = _interopRequireDefault(require("./sortSubfields"));
197
292
  var _sortTags = _interopRequireDefault(require("./sort-tags"));
293
+ var _subfieldValueNormalizations = _interopRequireDefault(require("./subfieldValueNormalizations"));
198
294
  var _subfieldExclusion = _interopRequireDefault(require("./subfield-exclusion"));
295
+ var _sync007And = _interopRequireDefault(require("./sync-007-and-300"));
199
296
  var _typeOfDate = _interopRequireDefault(require("./typeOfDate-008"));
200
297
  var _unicodeDecomposition = _interopRequireDefault(require("./unicode-decomposition"));
298
+ var _updateField = _interopRequireDefault(require("./update-field-540"));
201
299
  var _urn = _interopRequireDefault(require("./urn"));
202
300
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
203
301
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_accessRights","_interopRequireDefault","require","_doubleCommas","_duplicatesInd","_emptyFields","_endingPunctuation","_endingWhitespace","_field521Fix","_fieldsPresent","_fieldStructure","_fixedFields","_fieldExclusion","_identicalFields","_isbnIssn","_itemLanguage","_nonBreakingSpace","_normalizeUtf8Diacritics","_punctuation","_resolveOrphanedSubfield6s","_reindexSubfield6OccurenceNumbers","_resolvableExtReferencesMelinda","_sanitizeVocabularySourceCodes","_updateField","_sortSubfields","_sortTags","_subfieldExclusion","_typeOfDate","_unicodeDecomposition","_urn","obj","__esModule","default"],"sources":["../src/index.js"],"sourcesContent":["import AccessRights from './access-rights';\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 Field521Fix from './field-521-fix';\nimport FieldsPresent from './fields-present';\nimport FieldStructure from './field-structure';\nimport FixedFields from './fixed-fields';\nimport FieldExclusion from './field-exclusion';\nimport IdenticalFields from './identical-fields';\nimport IsbnIssn from './isbn-issn';\nimport ItemLanguage from './item-language';\nimport NonBreakingSpace from './non-breaking-space';\nimport NormalizeUTF8Diacritics from './normalize-utf8-diacritics';\nimport Punctuation from './punctuation/';\nimport ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s'; // Do this before reindexing!\nimport ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers';\nimport ResolvableExtReferences from './resolvable-ext-references-melinda';\nimport SanitizeVocabularySourceCodes from './sanitize-vocabulary-source-codes';\nimport UpdateField540 from './update-field-540';\nimport SortSubfields from './sortSubfields';\nimport SortTags from './sort-tags';\nimport SubfieldExclusion from './subfield-exclusion';\nimport TypeOfDateF008 from './typeOfDate-008';\nimport UnicodeDecomposition from './unicode-decomposition';\nimport Urn from './urn';\n\nexport {\n AccessRights,\n DoubleCommas,\n DuplicatesInd1,\n EmptyFields,\n EndingPunctuation,\n EndingWhitespace,\n Field521Fix,\n FieldExclusion,\n FieldsPresent,\n FieldStructure,\n FixedFields,\n IdenticalFields,\n IsbnIssn,\n ItemLanguage,\n NonBreakingSpace,\n NormalizeUTF8Diacritics,\n Punctuation,\n ResolveOrphanedSubfield6s,\n ReindexSubfield6OccurenceNumbers,\n ResolvableExtReferences,\n SanitizeVocabularySourceCodes,\n SortSubfields,\n SortTags,\n SubfieldExclusion,\n TypeOfDateF008,\n UnicodeDecomposition,\n UpdateField540,\n Urn\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,cAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,YAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,kBAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,iBAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,YAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,cAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,eAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,YAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,eAAA,GAAAX,sBAAA,CAAAC,OAAA;AACA,IAAAW,gBAAA,GAAAZ,sBAAA,CAAAC,OAAA;AACA,IAAAY,SAAA,GAAAb,sBAAA,CAAAC,OAAA;AACA,IAAAa,aAAA,GAAAd,sBAAA,CAAAC,OAAA;AACA,IAAAc,iBAAA,GAAAf,sBAAA,CAAAC,OAAA;AACA,IAAAe,wBAAA,GAAAhB,sBAAA,CAAAC,OAAA;AACA,IAAAgB,YAAA,GAAAjB,sBAAA,CAAAC,OAAA;AACA,IAAAiB,0BAAA,GAAAlB,sBAAA,CAAAC,OAAA;AACA,IAAAkB,iCAAA,GAAAnB,sBAAA,CAAAC,OAAA;AACA,IAAAmB,+BAAA,GAAApB,sBAAA,CAAAC,OAAA;AACA,IAAAoB,8BAAA,GAAArB,sBAAA,CAAAC,OAAA;AACA,IAAAqB,YAAA,GAAAtB,sBAAA,CAAAC,OAAA;AACA,IAAAsB,cAAA,GAAAvB,sBAAA,CAAAC,OAAA;AACA,IAAAuB,SAAA,GAAAxB,sBAAA,CAAAC,OAAA;AACA,IAAAwB,kBAAA,GAAAzB,sBAAA,CAAAC,OAAA;AACA,IAAAyB,WAAA,GAAA1B,sBAAA,CAAAC,OAAA;AACA,IAAA0B,qBAAA,GAAA3B,sBAAA,CAAAC,OAAA;AACA,IAAA2B,IAAA,GAAA5B,sBAAA,CAAAC,OAAA;AAAwB,SAAAD,uBAAA6B,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA"}
1
+ {"version":3,"file":"index.js","names":["_accessRights","_interopRequireDefault","require","_doubleCommas","_duplicatesInd","_emptyFields","_endingPunctuation","_endingWhitespace","_field505Separators","_field521Fix","_fieldExclusion","_fieldStructure","_fieldsPresent","_fixedFields","_fixRelatorTerms","_identicalFields","_indicatorFixes","_isbnIssn","_itemLanguage","_mergeField500Lisapainokset","_mergeRelatorTermFields","_multipleSubfield","_nonBreakingSpace","_normalizeIdentifiers","_normalizeQualifyingInformation","_normalizeUtf8Diacritics","_punctuation","_punctuation2","_resolveOrphanedSubfield6s","_reindexSubfield6OccurenceNumbers","_removeDuplicateDataFields","_removeInferiorDataFields","_resolvableExtReferencesMelinda","_sanitizeVocabularySourceCodes","_sortRelatorTerms","_sortSubfields","_sortTags","_subfieldValueNormalizations","_subfieldExclusion","_sync007And","_typeOfDate","_unicodeDecomposition","_updateField","_urn","obj","__esModule","default"],"sources":["../src/index.js"],"sourcesContent":["import AccessRights from './access-rights';\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 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 FixedFields from './fixed-fields';\nimport FixRelatorTerms from './fixRelatorTerms';\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 MergeRelatorTermFields from './mergeRelatorTermFields';\nimport MultipleSubfield0s from './multiple-subfield-0';\nimport NonBreakingSpace from './non-breaking-space';\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 ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s'; // Do this before reindexing! (thus not in alphabetical order)\nimport ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers';\nimport RemoveDuplicateDataFields from './removeDuplicateDataFields';\nimport RemoveInferiorDataFields from './removeInferiorDataFields';\nimport ResolvableExtReferences from './resolvable-ext-references-melinda';\nimport SanitizeVocabularySourceCodes from './sanitize-vocabulary-source-codes';\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 TypeOfDateF008 from './typeOfDate-008';\nimport UnicodeDecomposition from './unicode-decomposition';\nimport UpdateField540 from './update-field-540';\nimport Urn from './urn';\n\nexport {\n AccessRights,\n DoubleCommas,\n DuplicatesInd1,\n EmptyFields,\n EndingPunctuation,\n EndingWhitespace,\n Field505Separators,\n Field521Fix,\n FieldExclusion,\n FieldsPresent,\n FieldStructure,\n FixRelatorTerms,\n FixedFields,\n IdenticalFields,\n IndicatorFixes,\n IsbnIssn,\n ItemLanguage,\n MergeField500Lisapainokset,\n MergeRelatorTermFields,\n MultipleSubfield0s,\n NonBreakingSpace,\n NormalizeIdentifiers,\n NormalizeQualifyingInformation,\n NormalizeUTF8Diacritics,\n Punctuation,\n Punctuation2,\n ResolveOrphanedSubfield6s,\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 UnicodeDecomposition,\n UpdateField540,\n Urn\n};\n"],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ var _clone = _interopRequireDefault(require("clone"));
8
+ var _utils = require("./utils");
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ //import createDebugLogger from 'debug';
11
+
12
+ // Author(s): Nicholas Volk
13
+ function _default() {
14
+ return {
15
+ // Fixes MELINDA-8740
16
+ description: 'Normalize qualifying information (020$q, 015$q, 024$q, 028$q)',
17
+ validate,
18
+ fix
19
+ };
20
+ function fix(record) {
21
+ record.fields.forEach(field => {
22
+ normalizeQualifyingInformationField(field);
23
+ });
24
+ const res = {
25
+ message: [],
26
+ fix: [],
27
+ valid: true
28
+ };
29
+ return res;
30
+ }
31
+ function validate(record) {
32
+ const res = {
33
+ message: []
34
+ };
35
+ record.fields?.forEach(field => {
36
+ validateField(field, res);
37
+ });
38
+ res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
39
+ return res;
40
+ }
41
+ function validateField(field, res) {
42
+ const orig = (0, _utils.fieldToString)(field);
43
+ const normalizedField = (0, _clone.default)(field);
44
+ normalizeQualifyingInformationField(normalizedField);
45
+ const mod = (0, _utils.fieldToString)(normalizedField);
46
+ if (orig !== mod) {
47
+ // Fail as the input is "broken"/"crap"/sumthing
48
+ res.message.push(`'TODO: ${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data
49
+ return;
50
+ }
51
+ return;
52
+ }
53
+ }
54
+ function normalizeQualifyingInformationField(field) {
55
+ if (!['015', '020', '024', '028'].includes(field.tag) || !field.subfields) {
56
+ return;
57
+ }
58
+ field.subfields.forEach(sf => fixSubfield(sf));
59
+ return;
60
+ function fixSubfield(sf) {
61
+ if (sf.code !== 'q') {
62
+ return;
63
+ }
64
+ sf.value = normalizeValue(sf.value); // eslint-disable-line functional/immutable-data
65
+ }
66
+
67
+ function normalizeValue(val) {
68
+ // Should we do English as well: "coil bound" and "comb-bound" => "spiral-bound" (as per MTS)?
69
+
70
+ if (val.match(/^(?:hft|häftad)[.,]*$/iu)) {
71
+ // MELINDA-8740
72
+ return 'mjuka pärmar';
73
+ }
74
+ if (val.match(/^inb(?:\.|unden)[.,]*$/iu)) {
75
+ // MELINDA-8740
76
+ return 'hårda pärmar';
77
+ }
78
+ if (val === 'rengaskirja') {
79
+ // https://www.kiwi.fi/display/melinda/Talonmies+tiedottaa+16.12.2021
80
+ return 'kierreselkä';
81
+ }
82
+ if (val === 'ringpärm') {
83
+ // https://www.kiwi.fi/display/melinda/Talonmies+tiedottaa+16.12.2021
84
+ return 'spiralrygg';
85
+ }
86
+ if (val.match(/^nid(?:\.|ottu)[.,]*$/iu)) {
87
+ // MELINDA-8740
88
+ return 'pehmeäkantinen';
89
+ }
90
+ if (val.match(/^sid(?:\.|ottu)[.,]*$/iu)) {
91
+ // MELINDA-8740
92
+ return 'kovakantinen';
93
+ }
94
+ return val;
95
+ }
96
+ }
97
+ //# sourceMappingURL=normalize-qualifying-information.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-qualifying-information.js","names":["_clone","_interopRequireDefault","require","_utils","obj","__esModule","default","_default","description","validate","fix","record","fields","forEach","field","normalizeQualifyingInformationField","res","message","valid","validateField","length","orig","fieldToString","normalizedField","clone","mod","push","includes","tag","subfields","sf","fixSubfield","code","value","normalizeValue","val","match"],"sources":["../src/normalize-qualifying-information.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 // Fixes MELINDA-8740\n description: 'Normalize qualifying information (020$q, 015$q, 024$q, 028$q)',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n normalizeQualifyingInformationField(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 = clone(field);\n normalizeQualifyingInformationField(normalizedField);\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 normalizeQualifyingInformationField(field) {\n if (!['015', '020', '024', '028'].includes(field.tag) || !field.subfields) {\n return;\n }\n\n field.subfields.forEach(sf => fixSubfield(sf));\n return;\n\n function fixSubfield(sf) {\n if (sf.code !== 'q') {\n return;\n }\n sf.value = normalizeValue(sf.value); // eslint-disable-line functional/immutable-data\n }\n\n function normalizeValue(val) {\n // Should we do English as well: \"coil bound\" and \"comb-bound\" => \"spiral-bound\" (as per MTS)?\n\n if (val.match(/^(?:hft|häftad)[.,]*$/iu)) { // MELINDA-8740\n return 'mjuka pärmar';\n }\n\n if (val.match(/^inb(?:\\.|unden)[.,]*$/iu)) { // MELINDA-8740\n return 'hårda pärmar';\n }\n\n if (val === 'rengaskirja') { // https://www.kiwi.fi/display/melinda/Talonmies+tiedottaa+16.12.2021\n return 'kierreselkä';\n }\n\n if (val === 'ringpärm') { // https://www.kiwi.fi/display/melinda/Talonmies+tiedottaa+16.12.2021\n return 'spiralrygg';\n }\n\n if (val.match(/^nid(?:\\.|ottu)[.,]*$/iu)) { // MELINDA-8740\n return 'pehmeäkantinen';\n }\n\n if (val.match(/^sid(?:\\.|ottu)[.,]*$/iu)) { // MELINDA-8740\n return 'kovakantinen';\n }\n return val;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ var _chai = require("chai");
4
+ var _marcRecord = require("@natlibfi/marc-record");
5
+ var _normalizeQualifyingInformation = _interopRequireDefault(require("./normalize-qualifying-information"));
6
+ var _fixura = require("@natlibfi/fixura");
7
+ var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
8
+ var _debug = _interopRequireDefault(require("debug"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ (0, _fixugen.default)({
11
+ callback,
12
+ path: [__dirname, '..', 'test-fixtures', 'normalize-qualifying-information'],
13
+ useMetadataFile: true,
14
+ recurse: false,
15
+ fixura: {
16
+ reader: _fixura.READERS.JSON
17
+ },
18
+ mocha: {
19
+ before: () => testValidatorFactory()
20
+ }
21
+ });
22
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/normalize-qualifying-information:test');
23
+ async function testValidatorFactory() {
24
+ const validator = await (0, _normalizeQualifyingInformation.default)();
25
+ (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
26
+ (0, _chai.expect)(validator.description).to.be.a('string');
27
+ (0, _chai.expect)(validator.validate).to.be.a('function');
28
+ }
29
+ async function callback({
30
+ getFixture,
31
+ enabled = true,
32
+ fix = false
33
+ }) {
34
+ if (enabled === false) {
35
+ debug('TEST SKIPPED!');
36
+ return;
37
+ }
38
+ const validator = await (0, _normalizeQualifyingInformation.default)();
39
+ const record = new _marcRecord.MarcRecord(getFixture('record.json'));
40
+ const expectedResult = getFixture('expectedResult.json');
41
+ // console.log(expectedResult); // eslint-disable-line
42
+
43
+ if (!fix) {
44
+ const result = await validator.validate(record);
45
+ (0, _chai.expect)(result).to.eql(expectedResult);
46
+ return;
47
+ }
48
+ await validator.fix(record);
49
+ (0, _chai.expect)(record).to.eql(expectedResult);
50
+ }
51
+ //# sourceMappingURL=normalize-qualifying-information.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-qualifying-information.spec.js","names":["_chai","require","_marcRecord","_normalizeQualifyingInformation","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/normalize-qualifying-information.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './normalize-qualifying-information';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'normalize-qualifying-information'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/normalize-qualifying-information: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, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\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,+BAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,kCAAkC,CAAC;EAC5EC,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;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,gFAAgF,CAAC;AAEjH,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,uCAAgB,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,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,uCAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC"}
@@ -15,6 +15,7 @@ const debug = (0, _debug.default)('@natlibfi/melinda-marc-record-merge-reducers:
15
15
  //const debugData = debug.extend('data');
16
16
  const debugDev = debug.extend('dev');
17
17
  function subfieldContainsPartData(tag, subfieldCode) {
18
+ // NB! Used by reducers' mergeSubield.js
18
19
  if (subfieldCode === 'v' && ['490', '800', '810', '811', '830'].includes(tag)) {
19
20
  return true;
20
21
  }
@@ -24,8 +25,9 @@ function subfieldContainsPartData(tag, subfieldCode) {
24
25
  return false;
25
26
  }
26
27
  function splitPartData(originalValue) {
28
+ // Remove brackets from number-only:
27
29
  const value = originalValue.replace(/^\[([0-9]+)\][-.,:; ]*$/ui, '$1'); // eslint-disable-line prefer-named-capture-group
28
- const splitPoint = value.lastIndexOf(' ');
30
+ const splitPoint = value.lastIndexOf(' '); // MRA-627: "5, 2017" should be split here. Think of this later on...
29
31
  if (splitPoint === -1) {
30
32
  return [undefined, value];
31
33
  }
@@ -38,8 +40,12 @@ function normalizePartType(originalValue) {
38
40
  return undefined;
39
41
  }
40
42
  const value = originalValue.toLowerCase();
41
- // Return Finnish singular nominative. Best-ish for debug purposes...
42
- if (['osa', 'part', 'teil'].includes(value)) {
43
+
44
+ // Return Finnish singular nominative. Choise of language is arbitrary. This is best-ish for debug purposes...
45
+ if (['n:o', 'no', 'nr', 'nro', 'number', 'numero', 'nummer'].includes(value)) {
46
+ return 'numero';
47
+ }
48
+ if (['band', 'bd', 'häfte', 'nide', 'osa', 'part', 'teil', 'vol', 'vol.', 'volume'].includes(value)) {
43
49
  return 'osa';
44
50
  }
45
51
  if (['p.', 'page', 'pages', 'pp.', 's.', 'sidor', 'sivu', 'sivut'].includes(value)) {
@@ -76,12 +82,15 @@ function splitAndNormalizePartData(value) {
76
82
  return [partType, partNumber];
77
83
  }
78
84
  function partsAgree(value1, value2, tag, subfieldCode) {
85
+ // Note, that parts can not be normalized away, as "2" can agree with "Part 2" and "Raita 2" and "Volume 2"...
86
+ // NB! Used by reducers' mergeSubield.js
79
87
  if (!subfieldContainsPartData(tag, subfieldCode)) {
80
88
  return false;
81
89
  }
82
90
  const [partType1, partNumber1] = splitAndNormalizePartData(value1);
83
91
  const [partType2, partNumber2] = splitAndNormalizePartData(value2);
84
92
  if (partNumber1 !== partNumber2) {
93
+ // MRA-627: This should/could accept 5/1997
85
94
  return false;
86
95
  }
87
96
  if (partType1 === undefined || partType2 === undefined || partType1 === partType2) {
@@ -1 +1 @@
1
- {"version":3,"file":"normalizeSubfieldValueForComparison.js","names":["_utils","require","_debug","_interopRequireDefault","obj","__esModule","default","debug","createDebugLogger","debugDev","extend","subfieldContainsPartData","tag","subfieldCode","includes","splitPartData","originalValue","value","replace","splitPoint","lastIndexOf","undefined","lhs","substr","rhs","normalizePartType","toLowerCase","romanNumbers","normalizePartNumber","arabicValue","nvdebug","splitAndNormalizePartData","partType","partNumber","partsAgree","value1","value2","partType1","partNumber1","partType2","partNumber2","normalizePartData"],"sources":["../src/normalizeSubfieldValueForComparison.js"],"sourcesContent":["import {nvdebug} from './utils';\nimport createDebugLogger from 'debug';\n\n// Normalizes at least 490$v and 773$g which contain information such as \"Raita 5\" vs \"5\", and \"Osa 3\" vs \"Osa III\".\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:normalizePart');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport function subfieldContainsPartData(tag, subfieldCode) {\n if (subfieldCode === 'v' && ['490', '800', '810', '811', '830'].includes(tag)) {\n return true;\n }\n if (tag === '773' && subfieldCode === 'g') {\n return true;\n }\n return false;\n}\n\nfunction splitPartData(originalValue) {\n const value = originalValue.replace(/^\\[([0-9]+)\\][-.,:; ]*$/ui, '$1'); // eslint-disable-line prefer-named-capture-group\n const splitPoint = value.lastIndexOf(' ');\n if (splitPoint === -1) {\n return [undefined, value];\n }\n const lhs = value.substr(0, splitPoint);\n const rhs = value.substr(splitPoint + 1);\n return [lhs, rhs];\n}\n\nfunction normalizePartType(originalValue) {\n if (originalValue === undefined) {\n return undefined;\n }\n const value = originalValue.toLowerCase();\n // Return Finnish singular nominative. Best-ish for debug purposes...\n if (['osa', 'part', 'teil'].includes(value)) {\n return 'osa';\n }\n if (['p.', 'page', 'pages', 'pp.', 's.', 'sidor', 'sivu', 'sivut'].includes(value)) {\n return 'sivu';\n }\n return value;\n}\n\nconst romanNumbers = {'I': '1', 'II': '2', 'III': '3', 'IV': '4', 'V': '5', 'VI': '6', 'X': '10'};\n\nfunction normalizePartNumber(value) {\n // Should we handle all Roman numbers or some range of them?\n // There's probably a library for our purposes..\n if (value in romanNumbers) {\n const arabicValue = romanNumbers[value];\n nvdebug(` MAP ${value} to ${arabicValue}`, debugDev);\n return arabicValue;\n }\n return value.toLowerCase();\n}\n\nfunction splitAndNormalizePartData(value) {\n // This is just a stub. Does not handle eg. \"Levy 2, raita 15\"\n const [lhs, rhs] = splitPartData(value);\n nvdebug(` LHS: '${lhs}'`, debugDev);\n nvdebug(` RHS: '${rhs}'`, debugDev);\n const partType = normalizePartType(lhs);\n const partNumber = normalizePartNumber(rhs);\n return [partType, partNumber];\n}\n\nexport function partsAgree(value1, value2, tag, subfieldCode) {\n if (!subfieldContainsPartData(tag, subfieldCode)) {\n return false;\n }\n const [partType1, partNumber1] = splitAndNormalizePartData(value1);\n const [partType2, partNumber2] = splitAndNormalizePartData(value2);\n if (partNumber1 !== partNumber2) {\n return false;\n }\n if (partType1 === undefined || partType2 === undefined || partType1 === partType2) {\n return true;\n }\n\n return false;\n}\n\nexport function normalizePartData(value, subfieldCode, tag) {\n // This is for normalizing values for equality comparison only!\n if (!subfieldContainsPartData(tag, subfieldCode)) {\n return value;\n }\n\n const [partType, partNumber] = splitAndNormalizePartData(value);\n if (partType === undefined) {\n return partNumber;\n }\n return `${partType} ${partNumber}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"normalizeSubfieldValueForComparison.js","names":["_utils","require","_debug","_interopRequireDefault","obj","__esModule","default","debug","createDebugLogger","debugDev","extend","subfieldContainsPartData","tag","subfieldCode","includes","splitPartData","originalValue","value","replace","splitPoint","lastIndexOf","undefined","lhs","substr","rhs","normalizePartType","toLowerCase","romanNumbers","normalizePartNumber","arabicValue","nvdebug","splitAndNormalizePartData","partType","partNumber","partsAgree","value1","value2","partType1","partNumber1","partType2","partNumber2","normalizePartData"],"sources":["../src/normalizeSubfieldValueForComparison.js"],"sourcesContent":["import {nvdebug} from './utils';\nimport createDebugLogger from 'debug';\n\n// Normalizes at least 490$v and 773$g which contain information such as \"Raita 5\" vs \"5\", and \"Osa 3\" vs \"Osa III\".\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:normalizePart');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport function subfieldContainsPartData(tag, subfieldCode) {\n // NB! Used by reducers' mergeSubield.js\n if (subfieldCode === 'v' && ['490', '800', '810', '811', '830'].includes(tag)) {\n return true;\n }\n if (tag === '773' && subfieldCode === 'g') {\n return true;\n }\n return false;\n}\n\nfunction splitPartData(originalValue) {\n // Remove brackets from number-only:\n const value = originalValue.replace(/^\\[([0-9]+)\\][-.,:; ]*$/ui, '$1'); // eslint-disable-line prefer-named-capture-group\n const splitPoint = value.lastIndexOf(' '); // MRA-627: \"5, 2017\" should be split here. Think of this later on...\n if (splitPoint === -1) {\n return [undefined, value];\n }\n const lhs = value.substr(0, splitPoint);\n const rhs = value.substr(splitPoint + 1);\n return [lhs, rhs];\n}\n\nfunction normalizePartType(originalValue) {\n if (originalValue === undefined) {\n return undefined;\n }\n const value = originalValue.toLowerCase();\n\n // Return Finnish singular nominative. Choise of language is arbitrary. This is best-ish for debug purposes...\n if (['n:o', 'no', 'nr', 'nro', 'number', 'numero', 'nummer'].includes(value)) {\n return 'numero';\n }\n if (['band', 'bd', 'häfte', 'nide', 'osa', 'part', 'teil', 'vol', 'vol.', 'volume'].includes(value)) {\n return 'osa';\n }\n\n if (['p.', 'page', 'pages', 'pp.', 's.', 'sidor', 'sivu', 'sivut'].includes(value)) {\n return 'sivu';\n }\n\n return value;\n}\n\nconst romanNumbers = {'I': '1', 'II': '2', 'III': '3', 'IV': '4', 'V': '5', 'VI': '6', 'X': '10'};\n\nfunction normalizePartNumber(value) {\n // Should we handle all Roman numbers or some range of them?\n // There's probably a library for our purposes..\n if (value in romanNumbers) {\n const arabicValue = romanNumbers[value];\n nvdebug(` MAP ${value} to ${arabicValue}`, debugDev);\n return arabicValue;\n }\n return value.toLowerCase();\n}\n\nfunction splitAndNormalizePartData(value) {\n // This is just a stub. Does not handle eg. \"Levy 2, raita 15\"\n const [lhs, rhs] = splitPartData(value);\n nvdebug(` LHS: '${lhs}'`, debugDev);\n nvdebug(` RHS: '${rhs}'`, debugDev);\n const partType = normalizePartType(lhs);\n const partNumber = normalizePartNumber(rhs);\n return [partType, partNumber];\n}\n\nexport function partsAgree(value1, value2, tag, subfieldCode) {\n // Note, that parts can not be normalized away, as \"2\" can agree with \"Part 2\" and \"Raita 2\" and \"Volume 2\"...\n // NB! Used by reducers' mergeSubield.js\n if (!subfieldContainsPartData(tag, subfieldCode)) {\n return false;\n }\n const [partType1, partNumber1] = splitAndNormalizePartData(value1);\n const [partType2, partNumber2] = splitAndNormalizePartData(value2);\n if (partNumber1 !== partNumber2) {\n // MRA-627: This should/could accept 5/1997\n return false;\n }\n if (partType1 === undefined || partType2 === undefined || partType1 === partType2) {\n return true;\n }\n\n return false;\n}\n\nexport function normalizePartData(value, subfieldCode, tag) {\n // This is for normalizing values for equality comparison only!\n if (!subfieldContainsPartData(tag, subfieldCode)) {\n return value;\n }\n\n const [partType, partNumber] = splitAndNormalizePartData(value);\n if (partType === undefined) {\n return partNumber;\n }\n return `${partType} ${partNumber}`;\n}\n"],"mappings":"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"}
@@ -52,8 +52,12 @@ function fieldRefersToTarkistettuEnnakkotieto(field) {
52
52
  return containsSubstringInSubfieldA(field, 'TARKISTETTU ENNAKKOTIETO');
53
53
  }
54
54
  function fieldRefersToEnnakkotieto(field) {
55
- // NB! This matches also 'TARKISTETTU ENNAKKOTIETO' case!
56
- return containsSubstringInSubfieldA(field, 'ENNAKKOTIETO');
55
+ // NB! This no longer matches 'TARKISTETTU ENNAKKOTIETO' case! Bug or Feature?
56
+ if (containsSubstringInSubfieldA(field, 'ENNAKKOTIETO') && !fieldRefersToTarkistettuEnnakkotieto(field)) {
57
+ return true;
58
+ }
59
+ // MRA-420: "EI VIELÄ ILMESTYNYT" is a Helmet note, that is semantically similar to ENNAKKOTIETO:
60
+ return containsSubstringInSubfieldA(field, 'EI VIELÄ ILMESTYNYT');
57
61
  }
58
62
  function firstFieldHasBetterPrepubEncodingLevel(field1, field2) {
59
63
  if (fieldRefersToKoneellisestiTuotettuTietue(field2)) {
@@ -77,28 +81,6 @@ function firstFieldHasBetterPrepubEncodingLevel(field1, field2) {
77
81
  return false;
78
82
  }
79
83
 
80
- /*
81
- export function firstFieldHasEqualOrBetterPrepubEncodingLevel(field1, field2) {
82
- // Could be optimized...
83
- if (fieldRefersToKoneellisestiTuotettuTietue(field1)) {
84
- return true;
85
- }
86
- if (fieldRefersToKoneellisestiTuotettuTietue(field2)) {
87
- return false;
88
- }
89
- if (fieldRefersToTarkistettuEnnakkotieto(field1)) {
90
- return true;
91
- }
92
- if (fieldRefersToTarkistettuEnnakkotieto(field2)) {
93
- return false;
94
- }
95
- if (fieldRefersToEnnakkotieto(field1)) {
96
- return true;
97
- }
98
- return !fieldRefersToEnnakkotieto(field2);
99
- }
100
- */
101
-
102
84
  /*
103
85
  function hasEnnakkotietoSubfield(field) {
104
86
  return field.subfields.some(sf => ['g', '9'].includes(sf.code) && sf.value.includes('ENNAKKOTIETO'));
@@ -125,7 +107,7 @@ function getRelevant5XXFields(record, f500 = false, f594 = false) {
125
107
 
126
108
  function hasRelevantPrepubData(field) {
127
109
  // Check prepub ($a):
128
- if (!fieldRefersToKoneellisestiTuotettuTietue(field) && !fieldRefersToEnnakkotieto(field)) {
110
+ if (!fieldRefersToKoneellisestiTuotettuTietue(field) && !fieldRefersToTarkistettuEnnakkotieto(field) && !fieldRefersToEnnakkotieto(field)) {
129
111
  return false;
130
112
  }
131
113
  // Check relevance (594$5):
@@ -198,7 +180,7 @@ function deleteAllPrepublicationNotesFromField500InNonPubRecord(record) {
198
180
  return;
199
181
  }
200
182
 
201
- // MET-306: keep "koneellisesti tuotettu tietue" if encodng level is '2':
183
+ // MET-306: keep "koneellisesti tuotettu tietue" if encoding level is '2':
202
184
  const f500 = getRelevant5XXFields(record, true, false).filter(field => encodingLevel === '2' ? !fieldRefersToKoneellisestiTuotettuTietue(field) : true);
203
185
  if (f500.length === 0) {
204
186
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"prepublicationUtils.js","names":["_utils","require","_debug","_interopRequireDefault","obj","__esModule","default","debug","createDebugLogger","debugDev","extend","KONEELLISESTI_TUOTETTU_TIETUE","TARKISTETTU_ENNAKKOTIETO","ENNAKKOTIETO","encodingLevelPreferenceArray","prepublicationLevelIndex","indexOf","prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto","prepublicationLevel","encodingLevelIsBetterThanPrepublication","encodingLevel","index","containsSubstringInSubfieldA","field","substring","subfields","some","sf","code","value","includes","fieldRefersToKoneellisestiTuotettuTietue","fieldRefersToTarkistettuEnnakkotieto","fieldRefersToEnnakkotieto","firstFieldHasBetterPrepubEncodingLevel","field1","field2","getRelevant5XXFields","record","f500","f594","cands","actualGetFields","filtered","filter","hasRelevantPrepubData","tag","every","get","getPrepublicationLevel","fields","f","baseHasEqualOrHigherEncodingLevel","baseEncodingLevel","sourceEncodingLevel","baseIndex","sourceIndex","hasFikkaLOW","fieldHasSubfield","hasNatLibFi042","isFikkaRecord","getEncodingLevel","leader","deleteAllPrepublicationNotesFromField500InNonPubRecord","length","nvdebug","forEach","removeField","removeWorsePrepubField500s","nvdebugFieldArray","nonBest","removeWorsePrepubField594s","fields594","isEnnakkotietoSubfield","subfield","substr","isEnnakkotietoField","isKingOfTheHill","opposingFields","opposingField"],"sources":["../src/prepublicationUtils.js"],"sourcesContent":["import {fieldHasSubfield, nvdebug, nvdebugFieldArray} from './utils';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:prepublicationUtils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst KONEELLISESTI_TUOTETTU_TIETUE = 1; // Best\nconst TARKISTETTU_ENNAKKOTIETO = 2;\nconst ENNAKKOTIETO = 3;\n//const EI_TASOA = 4;\n\nconst encodingLevelPreferenceArray = [' ', '1', '3', '4', '5', '2', '7', 'u', 'z', '8']; // MET-145\nconst prepublicationLevelIndex = encodingLevelPreferenceArray.indexOf('8');\n\nexport function prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto(prepublicationLevel) {\n return prepublicationLevel === KONEELLISESTI_TUOTETTU_TIETUE || prepublicationLevel === TARKISTETTU_ENNAKKOTIETO;\n}\n\n\nexport function encodingLevelIsBetterThanPrepublication(encodingLevel) {\n const index = encodingLevelPreferenceArray.indexOf(encodingLevel);\n return index > -1 && index < prepublicationLevelIndex;\n}\n\n\nfunction containsSubstringInSubfieldA(field, substring) {\n return field.subfields.some(sf => sf.code === 'a' && sf.value.includes(substring));\n}\n\n\n// These three functions below all refer to field 500:\nexport function fieldRefersToKoneellisestiTuotettuTietue(field) {\n return containsSubstringInSubfieldA(field, 'Koneellisesti tuotettu tietue');\n}\n\n\nexport function fieldRefersToTarkistettuEnnakkotieto(field) {\n return containsSubstringInSubfieldA(field, 'TARKISTETTU ENNAKKOTIETO');\n}\n\n\nexport function fieldRefersToEnnakkotieto(field) {\n // NB! This matches also 'TARKISTETTU ENNAKKOTIETO' case!\n return containsSubstringInSubfieldA(field, 'ENNAKKOTIETO');\n}\n\n\nexport function firstFieldHasBetterPrepubEncodingLevel(field1, field2) {\n if (fieldRefersToKoneellisestiTuotettuTietue(field2)) {\n return false;\n }\n if (fieldRefersToKoneellisestiTuotettuTietue(field1)) {\n return true;\n }\n if (fieldRefersToTarkistettuEnnakkotieto(field2)) {\n return false;\n }\n if (fieldRefersToTarkistettuEnnakkotieto(field1)) {\n return true;\n }\n if (fieldRefersToEnnakkotieto(field2)) {\n return false;\n }\n if (fieldRefersToEnnakkotieto(field1)) {\n return true;\n }\n return false;\n}\n\n/*\nexport function firstFieldHasEqualOrBetterPrepubEncodingLevel(field1, field2) {\n // Could be optimized...\n if (fieldRefersToKoneellisestiTuotettuTietue(field1)) {\n return true;\n }\n if (fieldRefersToKoneellisestiTuotettuTietue(field2)) {\n return false;\n }\n if (fieldRefersToTarkistettuEnnakkotieto(field1)) {\n return true;\n }\n if (fieldRefersToTarkistettuEnnakkotieto(field2)) {\n return false;\n }\n if (fieldRefersToEnnakkotieto(field1)) {\n return true;\n }\n return !fieldRefersToEnnakkotieto(field2);\n}\n*/\n\n/*\nfunction hasEnnakkotietoSubfield(field) {\n return field.subfields.some(sf => ['g', '9'].includes(sf.code) && sf.value.includes('ENNAKKOTIETO'));\n}\n*/\n\n/*\nexport function isPrepublicationField6XX(field) {\n if (!field.tag.match(/^6(?:[0-4][0-9]|5[0-5])$/u)) { // Not within 600 ... 655 range\n return false;\n }\n return field.subfields.some(sf => hasEnnakkotietoSubfield(sf));\n}\n*/\n\n\nexport function getRelevant5XXFields(record, f500 = false, f594 = false) {\n const cands = actualGetFields();\n //nvdebugFieldArray(cands, 'gR5XXa: ', debugDev);\n const filtered = cands.filter(field => hasRelevantPrepubData(field));\n //nvdebugFieldArray(filtered, 'gR5XXb: ', debugDev);\n return filtered;\n\n //return actualGetFields().filter(field => hasRelevantPrepubData(field));\n\n function hasRelevantPrepubData(field) {\n // Check prepub ($a):\n if (!fieldRefersToKoneellisestiTuotettuTietue(field) && !fieldRefersToEnnakkotieto(field)) {\n return false;\n }\n // Check relevance (594$5):\n if (field.tag === '500') {\n return field.subfields.every(sf => sf.code !== '5'); //true;\n }\n return field.subfields.some(sf => sf.code === '5' && ['FENNI', 'FIKKA', 'VIOLA'].includes(sf.value));\n }\n\n function actualGetFields() {\n if (f500 && f594) {\n return record.get(/^(?:500|594)$/u);\n }\n if (f500) {\n return record.get(/^500$/u);\n }\n if (f594) {\n return record.get(/^594$/u);\n }\n return [];\n }\n\n}\n\n\n// Very similar to getPrepublicationLevel() in melinda-record-match-validator's getPrepublicationLevel()...\n// We should use that and not have a copy here...\nexport function getPrepublicationLevel(record, f500 = false, f594 = false) {\n // Smaller return value is better\n const fields = getRelevant5XXFields(record, f500, f594);\n\n if (!fields) {\n return null;\n }\n if (fields.some(f => fieldRefersToKoneellisestiTuotettuTietue(f))) {\n return KONEELLISESTI_TUOTETTU_TIETUE;\n }\n\n if (fields.some(f => fieldRefersToTarkistettuEnnakkotieto(f))) {\n return TARKISTETTU_ENNAKKOTIETO;\n }\n\n if (fields.some(f => fieldRefersToEnnakkotieto(f))) {\n return ENNAKKOTIETO;\n }\n\n return null;\n}\n\n\nexport function baseHasEqualOrHigherEncodingLevel(baseEncodingLevel, sourceEncodingLevel) {\n const baseIndex = encodingLevelPreferenceArray.indexOf(baseEncodingLevel);\n const sourceIndex = encodingLevelPreferenceArray.indexOf(sourceEncodingLevel);\n\n if (baseIndex === -1) {\n // Base wins if both are bad:\n return sourceIndex === -1;\n }\n return baseIndex <= sourceIndex;\n}\n\n\nfunction hasFikkaLOW(record) {\n return record.fields.some(field => field.tag === 'LOW' && fieldHasSubfield(field, 'a', 'FIKKA'));\n}\n\n\nfunction hasNatLibFi042(record) {\n return record.fields.some(field => field.tag === '042' && (fieldHasSubfield(field, 'a', 'finb') || fieldHasSubfield(field, 'a', 'finbd')));\n}\n\n\nexport function isFikkaRecord(record) {\n // NB! Does not include Humaniora. Pienpainatteet (not that they'd have duplicates)?\n return hasFikkaLOW(record) && hasNatLibFi042(record);\n}\n\n\nexport function getEncodingLevel(record) {\n return record.leader.substring(17, 18);\n}\n\n\nexport function deleteAllPrepublicationNotesFromField500InNonPubRecord(record) {\n const encodingLevel = getEncodingLevel(record);\n // Skip prepublication (or theoretically even worse) records:\n if (!encodingLevelIsBetterThanPrepublication(encodingLevel)) {\n //if (['2', '8'].includes(encodingLevel)) { // MET-306: added '2' here\n return;\n }\n\n // MET-306: keep \"koneellisesti tuotettu tietue\" if encodng level is '2':\n const f500 = getRelevant5XXFields(record, true, false).filter(field => encodingLevel === '2' ? !fieldRefersToKoneellisestiTuotettuTietue(field) : true);\n if (f500.length === 0) {\n return;\n }\n\n\n nvdebug(`Delete all ${f500.length} instance(s) of field 500`, debugDev);\n f500.forEach(field => record.removeField(field));\n}\n\n\nexport function removeWorsePrepubField500s(record) {\n // Remove lower-level entries:\n const fields = getRelevant5XXFields(record, true, false); // 500=false, 594=true\n nvdebugFieldArray(fields, ' Candidates for non-best 500 b4 filtering: ', debugDev);\n const nonBest = fields.filter(field => fields.some(field2 => firstFieldHasBetterPrepubEncodingLevel(field2, field)));\n nvdebugFieldArray(nonBest, ' Remove non-best 500: ', debugDev);\n nonBest.forEach(field => record.removeField(field));\n}\n\n\nexport function removeWorsePrepubField594s(record) {\n // Remove lower-level entries:\n const fields594 = getRelevant5XXFields(record, false, true); // 500=false, 594=true\n nvdebugFieldArray(fields594, ' Candidates for non-best 594 b4 filtering: ', debugDev);\n const nonBest = fields594.filter(field => fields594.some(field2 => firstFieldHasBetterPrepubEncodingLevel(field2, field)));\n nvdebugFieldArray(nonBest, ' Remove non-best 594: ', debugDev);\n nonBest.forEach(field => record.removeField(field));\n}\n\n\nexport function isEnnakkotietoSubfield(subfield) {\n if (subfield.code !== '9' && subfield.code !== 'g') {\n return false;\n }\n // Length <= 13 allows punctuation, but does not require it:\n if (subfield.value.substr(0, 12) === 'ENNAKKOTIETO' && subfield.value.length <= 13) {\n return true;\n }\n return false;\n}\n\nexport function isEnnakkotietoField(field) {\n return field.subfields.some(sf => isEnnakkotietoSubfield(sf));\n}\n\nexport function isKingOfTheHill(field, opposingFields) {\n // Field is no better than at least one of the opposing fields\n return opposingFields.every(opposingField => firstFieldHasBetterPrepubEncodingLevel(field, opposingField));\n}\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"prepublicationUtils.js","names":["_utils","require","_debug","_interopRequireDefault","obj","__esModule","default","debug","createDebugLogger","debugDev","extend","KONEELLISESTI_TUOTETTU_TIETUE","TARKISTETTU_ENNAKKOTIETO","ENNAKKOTIETO","encodingLevelPreferenceArray","prepublicationLevelIndex","indexOf","prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto","prepublicationLevel","encodingLevelIsBetterThanPrepublication","encodingLevel","index","containsSubstringInSubfieldA","field","substring","subfields","some","sf","code","value","includes","fieldRefersToKoneellisestiTuotettuTietue","fieldRefersToTarkistettuEnnakkotieto","fieldRefersToEnnakkotieto","firstFieldHasBetterPrepubEncodingLevel","field1","field2","getRelevant5XXFields","record","f500","f594","cands","actualGetFields","filtered","filter","hasRelevantPrepubData","tag","every","get","getPrepublicationLevel","fields","f","baseHasEqualOrHigherEncodingLevel","baseEncodingLevel","sourceEncodingLevel","baseIndex","sourceIndex","hasFikkaLOW","fieldHasSubfield","hasNatLibFi042","isFikkaRecord","getEncodingLevel","leader","deleteAllPrepublicationNotesFromField500InNonPubRecord","length","nvdebug","forEach","removeField","removeWorsePrepubField500s","nvdebugFieldArray","nonBest","removeWorsePrepubField594s","fields594","isEnnakkotietoSubfield","subfield","substr","isEnnakkotietoField","isKingOfTheHill","opposingFields","opposingField"],"sources":["../src/prepublicationUtils.js"],"sourcesContent":["import {fieldHasSubfield, nvdebug, nvdebugFieldArray} from './utils';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:prepublicationUtils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst KONEELLISESTI_TUOTETTU_TIETUE = 1; // Best\nconst TARKISTETTU_ENNAKKOTIETO = 2;\nconst ENNAKKOTIETO = 3;\n//const EI_TASOA = 4;\n\nconst encodingLevelPreferenceArray = [' ', '1', '3', '4', '5', '2', '7', 'u', 'z', '8']; // MET-145\nconst prepublicationLevelIndex = encodingLevelPreferenceArray.indexOf('8');\n\nexport function prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto(prepublicationLevel) {\n return prepublicationLevel === KONEELLISESTI_TUOTETTU_TIETUE || prepublicationLevel === TARKISTETTU_ENNAKKOTIETO;\n}\n\n\nexport function encodingLevelIsBetterThanPrepublication(encodingLevel) {\n const index = encodingLevelPreferenceArray.indexOf(encodingLevel);\n return index > -1 && index < prepublicationLevelIndex;\n}\n\n\nfunction containsSubstringInSubfieldA(field, substring) {\n return field.subfields.some(sf => sf.code === 'a' && sf.value.includes(substring));\n}\n\n\n// These three functions below all refer to field 500:\nexport function fieldRefersToKoneellisestiTuotettuTietue(field) {\n return containsSubstringInSubfieldA(field, 'Koneellisesti tuotettu tietue');\n}\n\n\nexport function fieldRefersToTarkistettuEnnakkotieto(field) {\n return containsSubstringInSubfieldA(field, 'TARKISTETTU ENNAKKOTIETO');\n}\n\n\nexport function fieldRefersToEnnakkotieto(field) {\n // NB! This no longer matches 'TARKISTETTU ENNAKKOTIETO' case! Bug or Feature?\n if (containsSubstringInSubfieldA(field, 'ENNAKKOTIETO') && !fieldRefersToTarkistettuEnnakkotieto(field)) {\n return true;\n }\n // MRA-420: \"EI VIELÄ ILMESTYNYT\" is a Helmet note, that is semantically similar to ENNAKKOTIETO:\n return containsSubstringInSubfieldA(field, 'EI VIELÄ ILMESTYNYT');\n}\n\n\nexport function firstFieldHasBetterPrepubEncodingLevel(field1, field2) {\n if (fieldRefersToKoneellisestiTuotettuTietue(field2)) {\n return false;\n }\n if (fieldRefersToKoneellisestiTuotettuTietue(field1)) {\n return true;\n }\n if (fieldRefersToTarkistettuEnnakkotieto(field2)) {\n return false;\n }\n if (fieldRefersToTarkistettuEnnakkotieto(field1)) {\n return true;\n }\n if (fieldRefersToEnnakkotieto(field2)) {\n return false;\n }\n if (fieldRefersToEnnakkotieto(field1)) {\n return true;\n }\n return false;\n}\n\n\n/*\nfunction hasEnnakkotietoSubfield(field) {\n return field.subfields.some(sf => ['g', '9'].includes(sf.code) && sf.value.includes('ENNAKKOTIETO'));\n}\n*/\n\n/*\nexport function isPrepublicationField6XX(field) {\n if (!field.tag.match(/^6(?:[0-4][0-9]|5[0-5])$/u)) { // Not within 600 ... 655 range\n return false;\n }\n return field.subfields.some(sf => hasEnnakkotietoSubfield(sf));\n}\n*/\n\n\nexport function getRelevant5XXFields(record, f500 = false, f594 = false) {\n const cands = actualGetFields();\n //nvdebugFieldArray(cands, 'gR5XXa: ', debugDev);\n const filtered = cands.filter(field => hasRelevantPrepubData(field));\n //nvdebugFieldArray(filtered, 'gR5XXb: ', debugDev);\n return filtered;\n\n //return actualGetFields().filter(field => hasRelevantPrepubData(field));\n\n function hasRelevantPrepubData(field) {\n // Check prepub ($a):\n if (!fieldRefersToKoneellisestiTuotettuTietue(field) && !fieldRefersToTarkistettuEnnakkotieto(field) && !fieldRefersToEnnakkotieto(field)) {\n return false;\n }\n // Check relevance (594$5):\n if (field.tag === '500') {\n return field.subfields.every(sf => sf.code !== '5'); //true;\n }\n return field.subfields.some(sf => sf.code === '5' && ['FENNI', 'FIKKA', 'VIOLA'].includes(sf.value));\n }\n\n function actualGetFields() {\n if (f500 && f594) {\n return record.get(/^(?:500|594)$/u);\n }\n if (f500) {\n return record.get(/^500$/u);\n }\n if (f594) {\n return record.get(/^594$/u);\n }\n return [];\n }\n\n}\n\n\n// Very similar to getPrepublicationLevel() in melinda-record-match-validator's getPrepublicationLevel()...\n// We should use that and not have a copy here...\nexport function getPrepublicationLevel(record, f500 = false, f594 = false) {\n // Smaller return value is better\n const fields = getRelevant5XXFields(record, f500, f594);\n\n if (!fields) {\n return null;\n }\n if (fields.some(f => fieldRefersToKoneellisestiTuotettuTietue(f))) {\n return KONEELLISESTI_TUOTETTU_TIETUE;\n }\n\n if (fields.some(f => fieldRefersToTarkistettuEnnakkotieto(f))) {\n return TARKISTETTU_ENNAKKOTIETO;\n }\n\n if (fields.some(f => fieldRefersToEnnakkotieto(f))) {\n return ENNAKKOTIETO;\n }\n\n return null;\n}\n\n\nexport function baseHasEqualOrHigherEncodingLevel(baseEncodingLevel, sourceEncodingLevel) {\n const baseIndex = encodingLevelPreferenceArray.indexOf(baseEncodingLevel);\n const sourceIndex = encodingLevelPreferenceArray.indexOf(sourceEncodingLevel);\n\n if (baseIndex === -1) {\n // Base wins if both are bad:\n return sourceIndex === -1;\n }\n return baseIndex <= sourceIndex;\n}\n\n\nfunction hasFikkaLOW(record) {\n return record.fields.some(field => field.tag === 'LOW' && fieldHasSubfield(field, 'a', 'FIKKA'));\n}\n\n\nfunction hasNatLibFi042(record) {\n return record.fields.some(field => field.tag === '042' && (fieldHasSubfield(field, 'a', 'finb') || fieldHasSubfield(field, 'a', 'finbd')));\n}\n\n\nexport function isFikkaRecord(record) {\n // NB! Does not include Humaniora. Pienpainatteet (not that they'd have duplicates)?\n return hasFikkaLOW(record) && hasNatLibFi042(record);\n}\n\n\nexport function getEncodingLevel(record) {\n return record.leader.substring(17, 18);\n}\n\n\nexport function deleteAllPrepublicationNotesFromField500InNonPubRecord(record) {\n const encodingLevel = getEncodingLevel(record);\n // Skip prepublication (or theoretically even worse) records:\n if (!encodingLevelIsBetterThanPrepublication(encodingLevel)) {\n //if (['2', '8'].includes(encodingLevel)) { // MET-306: added '2' here\n return;\n }\n\n // MET-306: keep \"koneellisesti tuotettu tietue\" if encoding level is '2':\n const f500 = getRelevant5XXFields(record, true, false).filter(field => encodingLevel === '2' ? !fieldRefersToKoneellisestiTuotettuTietue(field) : true);\n if (f500.length === 0) {\n return;\n }\n\n\n nvdebug(`Delete all ${f500.length} instance(s) of field 500`, debugDev);\n f500.forEach(field => record.removeField(field));\n}\n\n\nexport function removeWorsePrepubField500s(record) {\n // Remove lower-level entries:\n const fields = getRelevant5XXFields(record, true, false); // 500=false, 594=true\n nvdebugFieldArray(fields, ' Candidates for non-best 500 b4 filtering: ', debugDev);\n const nonBest = fields.filter(field => fields.some(field2 => firstFieldHasBetterPrepubEncodingLevel(field2, field)));\n nvdebugFieldArray(nonBest, ' Remove non-best 500: ', debugDev);\n nonBest.forEach(field => record.removeField(field));\n}\n\n\nexport function removeWorsePrepubField594s(record) {\n // Remove lower-level entries:\n const fields594 = getRelevant5XXFields(record, false, true); // 500=false, 594=true\n nvdebugFieldArray(fields594, ' Candidates for non-best 594 b4 filtering: ', debugDev);\n const nonBest = fields594.filter(field => fields594.some(field2 => firstFieldHasBetterPrepubEncodingLevel(field2, field)));\n nvdebugFieldArray(nonBest, ' Remove non-best 594: ', debugDev);\n nonBest.forEach(field => record.removeField(field));\n}\n\n\nexport function isEnnakkotietoSubfield(subfield) {\n if (subfield.code !== '9' && subfield.code !== 'g') {\n return false;\n }\n // Length <= 13 allows punctuation, but does not require it:\n if (subfield.value.substr(0, 12) === 'ENNAKKOTIETO' && subfield.value.length <= 13) {\n return true;\n }\n return false;\n}\n\nexport function isEnnakkotietoField(field) {\n return field.subfields.some(sf => isEnnakkotietoSubfield(sf));\n}\n\nexport function isKingOfTheHill(field, opposingFields) {\n // Field is no better than at least one of the opposing fields\n return opposingFields.every(opposingField => firstFieldHasBetterPrepubEncodingLevel(field, opposingField));\n}\n\n"],"mappings":"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"}