@natlibfi/marc-record-validators-melinda 11.6.6 → 11.6.7-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/.github/workflows/melinda-node-tests.yml +1 -1
  2. package/dist/access-rights.js +1 -5
  3. package/dist/access-rights.js.map +1 -1
  4. package/dist/addMissingField336.js +1 -1
  5. package/dist/addMissingField336.js.map +1 -1
  6. package/dist/cyrillux-usemarcon-replacement.js +41 -45
  7. package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
  8. package/dist/cyrillux.js +13 -17
  9. package/dist/cyrillux.js.map +1 -1
  10. package/dist/disambiguateSeriesStatements.js +3 -4
  11. package/dist/disambiguateSeriesStatements.js.map +1 -1
  12. package/dist/double-commas.js +2 -1
  13. package/dist/double-commas.js.map +1 -1
  14. package/dist/duplicates-ind1.js +1 -1
  15. package/dist/duplicates-ind1.js.map +1 -1
  16. package/dist/empty-fields.js +0 -4
  17. package/dist/empty-fields.js.map +1 -1
  18. package/dist/ending-punctuation.js +21 -49
  19. package/dist/ending-punctuation.js.map +1 -1
  20. package/dist/ending-whitespace.js +0 -4
  21. package/dist/ending-whitespace.js.map +1 -1
  22. package/dist/field-008-18-34-character-groups.js +4 -5
  23. package/dist/field-008-18-34-character-groups.js.map +1 -1
  24. package/dist/field-505-separators.js +8 -6
  25. package/dist/field-505-separators.js.map +1 -1
  26. package/dist/field-521-fix.js +5 -6
  27. package/dist/field-521-fix.js.map +1 -1
  28. package/dist/field-exclusion.js +5 -12
  29. package/dist/field-exclusion.js.map +1 -1
  30. package/dist/field-exclusion.spec.js +3 -5
  31. package/dist/field-exclusion.spec.js.map +1 -1
  32. package/dist/field-structure.js +2 -5
  33. package/dist/field-structure.js.map +1 -1
  34. package/dist/fields-present.js +1 -1
  35. package/dist/fields-present.js.map +1 -1
  36. package/dist/fields-present.spec.js +1 -1
  37. package/dist/fields-present.spec.js.map +1 -1
  38. package/dist/fix-33X.js +5 -6
  39. package/dist/fix-33X.js.map +1 -1
  40. package/dist/fix-country-codes.js +3 -4
  41. package/dist/fix-country-codes.js.map +1 -1
  42. package/dist/fix-language-codes.js +12 -9
  43. package/dist/fix-language-codes.js.map +1 -1
  44. package/dist/fixRelatorTerms.js +8 -8
  45. package/dist/fixRelatorTerms.js.map +1 -1
  46. package/dist/fixed-fields.js +1 -4
  47. package/dist/fixed-fields.js.map +1 -1
  48. package/dist/identical-fields.js +2 -3
  49. package/dist/identical-fields.js.map +1 -1
  50. package/dist/indicator-fixes.js +14 -15
  51. package/dist/indicator-fixes.js.map +1 -1
  52. package/dist/isbn-issn.js +8 -11
  53. package/dist/isbn-issn.js.map +1 -1
  54. package/dist/item-language.js +5 -12
  55. package/dist/item-language.js.map +1 -1
  56. package/dist/merge-fields/counterpartField.js +6 -8
  57. package/dist/merge-fields/counterpartField.js.map +1 -1
  58. package/dist/merge-fields/index.js +3 -3
  59. package/dist/merge-fields/index.js.map +1 -1
  60. package/dist/merge-fields/mergeConstraints.js +0 -1
  61. package/dist/merge-fields/mergeConstraints.js.map +1 -1
  62. package/dist/merge-fields/mergeField.js +12 -18
  63. package/dist/merge-fields/mergeField.js.map +1 -1
  64. package/dist/merge-fields/mergeIndicator.js +5 -5
  65. package/dist/merge-fields/mergeIndicator.js.map +1 -1
  66. package/dist/merge-fields/mergeOrAddPostprocess.js +6 -9
  67. package/dist/merge-fields/mergeOrAddPostprocess.js.map +1 -1
  68. package/dist/merge-fields/mergeOrAddSubfield.js +6 -8
  69. package/dist/merge-fields/mergeOrAddSubfield.js.map +1 -1
  70. package/dist/merge-fields/mergeSubfield.js +8 -8
  71. package/dist/merge-fields/mergeSubfield.js.map +1 -1
  72. package/dist/merge-fields/removeDuplicateSubfields.js +1 -2
  73. package/dist/merge-fields/removeDuplicateSubfields.js.map +1 -1
  74. package/dist/merge-fields/worldKnowledge.js +1 -1
  75. package/dist/merge-fields/worldKnowledge.js.map +1 -1
  76. package/dist/mergeField500Lisapainokset.js +0 -3
  77. package/dist/mergeField500Lisapainokset.js.map +1 -1
  78. package/dist/mergeRelatorTermFields.js +3 -3
  79. package/dist/mergeRelatorTermFields.js.map +1 -1
  80. package/dist/modernize-502.js +6 -6
  81. package/dist/modernize-502.js.map +1 -1
  82. package/dist/multiple-subfield-0.js +4 -4
  83. package/dist/multiple-subfield-0.js.map +1 -1
  84. package/dist/non-breaking-space.js +0 -4
  85. package/dist/non-breaking-space.js.map +1 -1
  86. package/dist/normalize-dashes.js +5 -4
  87. package/dist/normalize-dashes.js.map +1 -1
  88. package/dist/normalize-identifiers.js +6 -6
  89. package/dist/normalize-identifiers.js.map +1 -1
  90. package/dist/normalize-qualifying-information.js +4 -4
  91. package/dist/normalize-qualifying-information.js.map +1 -1
  92. package/dist/normalize-utf8-diacritics.js +7 -7
  93. package/dist/normalize-utf8-diacritics.js.map +1 -1
  94. package/dist/normalizeFieldForComparison.js +21 -20
  95. package/dist/normalizeFieldForComparison.js.map +1 -1
  96. package/dist/normalizeSubfieldValueForComparison.js +1 -2
  97. package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
  98. package/dist/prepublicationUtils.js +3 -3
  99. package/dist/prepublicationUtils.js.map +1 -1
  100. package/dist/punctuation/index.js +14 -31
  101. package/dist/punctuation/index.js.map +1 -1
  102. package/dist/punctuation2.js +9 -10
  103. package/dist/punctuation2.js.map +1 -1
  104. package/dist/reindexSubfield6OccurenceNumbers.js +8 -9
  105. package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
  106. package/dist/removeDuplicateDataFields.js +18 -20
  107. package/dist/removeDuplicateDataFields.js.map +1 -1
  108. package/dist/removeInferiorDataFields.js +16 -19
  109. package/dist/removeInferiorDataFields.js.map +1 -1
  110. package/dist/resolvable-ext-references-melinda.js +4 -8
  111. package/dist/resolvable-ext-references-melinda.js.map +1 -1
  112. package/dist/resolveOrphanedSubfield6s.js +9 -9
  113. package/dist/resolveOrphanedSubfield6s.js.map +1 -1
  114. package/dist/sanitize-vocabulary-source-codes.js +9 -9
  115. package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
  116. package/dist/sort-tags.js +2 -2
  117. package/dist/sort-tags.js.map +1 -1
  118. package/dist/sortFields.js +4 -9
  119. package/dist/sortFields.js.map +1 -1
  120. package/dist/sortRelatorTerms.js +4 -5
  121. package/dist/sortRelatorTerms.js.map +1 -1
  122. package/dist/sortSubfields.js +5 -6
  123. package/dist/sortSubfields.js.map +1 -1
  124. package/dist/stripPunctuation.js +2 -2
  125. package/dist/stripPunctuation.js.map +1 -1
  126. package/dist/subfield-exclusion.js +4 -11
  127. package/dist/subfield-exclusion.js.map +1 -1
  128. package/dist/subfield6Utils.js +12 -11
  129. package/dist/subfield6Utils.js.map +1 -1
  130. package/dist/subfield8Utils.js +8 -9
  131. package/dist/subfield8Utils.js.map +1 -1
  132. package/dist/subfieldValueNormalizations.js +5 -8
  133. package/dist/subfieldValueNormalizations.js.map +1 -1
  134. package/dist/sync-007-and-300.js +8 -8
  135. package/dist/sync-007-and-300.js.map +1 -1
  136. package/dist/translate-terms.js +5 -6
  137. package/dist/translate-terms.js.map +1 -1
  138. package/dist/typeOfDate-008.js +3 -4
  139. package/dist/typeOfDate-008.js.map +1 -1
  140. package/dist/unicode-decomposition.js +1 -1
  141. package/dist/unicode-decomposition.js.map +1 -1
  142. package/dist/update-field-540.js +5 -6
  143. package/dist/update-field-540.js.map +1 -1
  144. package/dist/urn.js +4 -9
  145. package/dist/urn.js.map +1 -1
  146. package/dist/utils.js +5 -9
  147. package/dist/utils.js.map +1 -1
  148. package/eslint.config.mjs +53 -0
  149. package/package.json +12 -13
  150. package/src/access-rights.js +4 -4
  151. package/src/addMissingField336.js +1 -1
  152. package/src/cyrillux-usemarcon-replacement.js +38 -38
  153. package/src/cyrillux.js +14 -14
  154. package/src/disambiguateSeriesStatements.js +3 -3
  155. package/src/double-commas.js +2 -2
  156. package/src/duplicates-ind1.js +1 -1
  157. package/src/empty-fields.js +4 -4
  158. package/src/ending-punctuation.js +46 -49
  159. package/src/ending-whitespace.js +0 -2
  160. package/src/field-008-18-34-character-groups.js +5 -5
  161. package/src/field-505-separators.js +6 -6
  162. package/src/field-521-fix.js +6 -6
  163. package/src/field-exclusion.js +12 -12
  164. package/src/field-exclusion.spec.js +4 -4
  165. package/src/field-structure.js +5 -5
  166. package/src/fields-present.js +1 -1
  167. package/src/fields-present.spec.js +1 -1
  168. package/src/fix-33X.js +5 -5
  169. package/src/fix-country-codes.js +3 -3
  170. package/src/fix-language-codes.js +10 -9
  171. package/src/fixRelatorTerms.js +8 -8
  172. package/src/fixed-fields.js +3 -3
  173. package/src/identical-fields.js +3 -3
  174. package/src/indicator-fixes.js +15 -15
  175. package/src/isbn-issn.js +11 -11
  176. package/src/item-language.js +10 -10
  177. package/src/merge-fields/counterpartField.js +7 -7
  178. package/src/merge-fields/index.js +3 -3
  179. package/src/merge-fields/mergeConstraints.js +1 -1
  180. package/src/merge-fields/mergeField.js +16 -17
  181. package/src/merge-fields/mergeIndicator.js +5 -5
  182. package/src/merge-fields/mergeOrAddPostprocess.js +9 -9
  183. package/src/merge-fields/mergeOrAddSubfield.js +6 -6
  184. package/src/merge-fields/mergeSubfield.js +8 -8
  185. package/src/merge-fields/removeDuplicateSubfields.js +1 -2
  186. package/src/merge-fields/worldKnowledge.js +1 -1
  187. package/src/mergeField500Lisapainokset.js +0 -2
  188. package/src/mergeRelatorTermFields.js +3 -3
  189. package/src/modernize-502.js +6 -6
  190. package/src/multiple-subfield-0.js +4 -4
  191. package/src/non-breaking-space.js +0 -2
  192. package/src/normalize-dashes.js +4 -4
  193. package/src/normalize-identifiers.js +6 -6
  194. package/src/normalize-qualifying-information.js +4 -4
  195. package/src/normalize-utf8-diacritics.js +7 -7
  196. package/src/normalizeFieldForComparison.js +20 -20
  197. package/src/normalizeSubfieldValueForComparison.js +1 -1
  198. package/src/prepublicationUtils.js +3 -3
  199. package/src/punctuation/index.js +29 -29
  200. package/src/punctuation2.js +10 -10
  201. package/src/reindexSubfield6OccurenceNumbers.js +9 -9
  202. package/src/removeDuplicateDataFields.js +21 -23
  203. package/src/removeInferiorDataFields.js +19 -19
  204. package/src/resolvable-ext-references-melinda.js +8 -8
  205. package/src/resolveOrphanedSubfield6s.js +9 -9
  206. package/src/sanitize-vocabulary-source-codes.js +8 -8
  207. package/src/sort-tags.js +2 -2
  208. package/src/sortFields.js +6 -6
  209. package/src/sortRelatorTerms.js +5 -5
  210. package/src/sortSubfields.js +6 -6
  211. package/src/stripPunctuation.js +2 -2
  212. package/src/subfield-exclusion.js +11 -11
  213. package/src/subfield6Utils.js +11 -11
  214. package/src/subfield8Utils.js +6 -9
  215. package/src/subfieldValueNormalizations.js +5 -7
  216. package/src/sync-007-and-300.js +8 -8
  217. package/src/translate-terms.js +3 -5
  218. package/src/typeOfDate-008.js +3 -3
  219. package/src/unicode-decomposition.js +1 -1
  220. package/src/update-field-540.js +6 -6
  221. package/src/urn.js +8 -6
  222. package/src/utils.js +8 -8
  223. package/.eslintignore +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"mergeOrAddPostprocess.js","names":["_punctuation","require","_removeDuplicateSubfields","_sortSubfields","_sortRelatorTerms","postprocessBaseRecord","base","fields","forEach","field","merged","fieldRemoveDuplicateSubfields","fieldFixPunctuation","sortAdjacentSubfields","sortAdjacentRelatorTerms","useExternalEndPunctuation","added","removeDeletedFields","record","filter","f","deleted","postprocessRecords","source"],"sources":["../../src/merge-fields/mergeOrAddPostprocess.js"],"sourcesContent":["// This field should be renamed, as it is called also from outside megre.\n\n//import {MarcRecord} from '@natlibfi/marc-record';\nimport {fieldFixPunctuation} from '../punctuation2';\nimport {fieldRemoveDuplicateSubfields} from './removeDuplicateSubfields';\nimport {sortAdjacentSubfields} from '../sortSubfields';\nimport {sortAdjacentRelatorTerms} from '../sortRelatorTerms';\n\nfunction postprocessBaseRecord(base) {\n\n base.fields.forEach(field => {\n // NB! Relator terms are now expanded and translated already at preprocess stage!\n\n // remove merge-specific information:\n if (field.merged) { // eslint-disable-line functional/no-conditional-statements\n // Field level ideas about things that could be done here:\n // - Fix indicators?\n // Record level fixes should be implemented as validators/fixers\n // in marc-record-validators-melinda and ust called from here.\n fieldRemoveDuplicateSubfields(field);\n fieldFixPunctuation(field); // NB! This will fix only fields with merged content\n sortAdjacentSubfields(field); // Put the added $e subfield to proper places.\n sortAdjacentRelatorTerms(field); // Sort $e subfields with each other\n fieldFixPunctuation(field);\n\n delete field.merged; // eslint-disable-line functional/immutable-data\n }\n\n if (field.useExternalEndPunctuation) { // eslint-disable-line functional/no-conditional-statements\n delete field.useExternalEndPunctuation; // eslint-disable-line functional/immutable-data\n }\n\n if (field.added) { // eslint-disable-line functional/no-conditional-statements\n delete field.added; // eslint-disable-line functional/immutable-data\n }\n\n /*\n if (field.deleted) { // eslint-disable-line functional/no-conditional-statements\n delete field.deleted; // eslint-disable-line functional/immutable-data\n }\n*/\n\n });\n}\n\n\nfunction removeDeletedFields(record) {\n // remove fields that are marked as deleted:\n record.fields = record.fields.filter(f => !f.deleted); // eslint-disable-line functional/immutable-data\n}\n\n\nexport function postprocessRecords(base, source) {\n postprocessBaseRecord(base);\n removeDeletedFields(source); // So that we may know what was used, and what not.\n}\n"],"mappings":";;;;;;AAGA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,yBAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AANA;;AAEA;;AAMA,SAASI,qBAAqBA,CAACC,IAAI,EAAE;EAEnCA,IAAI,CAACC,MAAM,CAACC,OAAO,CAACC,KAAK,IAAI;IAC3B;;IAEA;IACA,IAAIA,KAAK,CAACC,MAAM,EAAE;MAAE;MAClB;MACA;MACA;MACA;MACA,IAAAC,uDAA6B,EAACF,KAAK,CAAC;MACpC,IAAAG,gCAAmB,EAACH,KAAK,CAAC,CAAC,CAAC;MAC5B,IAAAI,oCAAqB,EAACJ,KAAK,CAAC,CAAC,CAAC;MAC9B,IAAAK,0CAAwB,EAACL,KAAK,CAAC,CAAC,CAAC;MACjC,IAAAG,gCAAmB,EAACH,KAAK,CAAC;MAE1B,OAAOA,KAAK,CAACC,MAAM,CAAC,CAAC;IACvB;IAEA,IAAID,KAAK,CAACM,yBAAyB,EAAE;MAAE;MACrC,OAAON,KAAK,CAACM,yBAAyB,CAAC,CAAC;IAC1C;IAEA,IAAIN,KAAK,CAACO,KAAK,EAAE;MAAE;MACjB,OAAOP,KAAK,CAACO,KAAK,CAAC,CAAC;IACtB;;IAEA;AACJ;AACA;AACA;AACA;EAEE,CAAC,CAAC;AACJ;AAGA,SAASC,mBAAmBA,CAACC,MAAM,EAAE;EACnC;EACAA,MAAM,CAACX,MAAM,GAAGW,MAAM,CAACX,MAAM,CAACY,MAAM,CAACC,CAAC,IAAI,CAACA,CAAC,CAACC,OAAO,CAAC,CAAC,CAAC;AACzD;AAGO,SAASC,kBAAkBA,CAAChB,IAAI,EAAEiB,MAAM,EAAE;EAC/ClB,qBAAqB,CAACC,IAAI,CAAC;EAC3BW,mBAAmB,CAACM,MAAM,CAAC,CAAC,CAAC;AAC/B","ignoreList":[]}
1
+ {"version":3,"file":"mergeOrAddPostprocess.js","names":["_punctuation","require","_removeDuplicateSubfields","_sortSubfields","_sortRelatorTerms","postprocessBaseRecord","base","fields","forEach","field","merged","fieldRemoveDuplicateSubfields","fieldFixPunctuation","sortAdjacentSubfields","sortAdjacentRelatorTerms","useExternalEndPunctuation","added","removeDeletedFields","record","filter","f","deleted","postprocessRecords","source"],"sources":["../../src/merge-fields/mergeOrAddPostprocess.js"],"sourcesContent":["// This field should be renamed, as it is called also from outside megre.\n\n//import {MarcRecord} from '@natlibfi/marc-record';\nimport {fieldFixPunctuation} from '../punctuation2';\nimport {fieldRemoveDuplicateSubfields} from './removeDuplicateSubfields';\nimport {sortAdjacentSubfields} from '../sortSubfields';\nimport {sortAdjacentRelatorTerms} from '../sortRelatorTerms';\n\nfunction postprocessBaseRecord(base) {\n\n base.fields.forEach(field => {\n // NB! Relator terms are now expanded and translated already at preprocess stage!\n\n // remove merge-specific information:\n if (field.merged) {\n // Field level ideas about things that could be done here:\n // - Fix indicators?\n // Record level fixes should be implemented as validators/fixers\n // in marc-record-validators-melinda and ust called from here.\n fieldRemoveDuplicateSubfields(field);\n fieldFixPunctuation(field); // NB! This will fix only fields with merged content\n sortAdjacentSubfields(field); // Put the added $e subfield to proper places.\n sortAdjacentRelatorTerms(field); // Sort $e subfields with each other\n fieldFixPunctuation(field);\n\n delete field.merged;\n }\n\n if (field.useExternalEndPunctuation) {\n delete field.useExternalEndPunctuation;\n }\n\n if (field.added) {\n delete field.added;\n }\n\n /*\n if (field.deleted) {\n delete field.deleted;\n }\n*/\n\n });\n}\n\n\nfunction removeDeletedFields(record) {\n // remove fields that are marked as deleted:\n record.fields = record.fields.filter(f => !f.deleted);\n}\n\n\nexport function postprocessRecords(base, source) {\n postprocessBaseRecord(base);\n removeDeletedFields(source); // So that we may know what was used, and what not.\n}\n"],"mappings":";;;;;;AAGA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,yBAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AANA;;AAEA;;AAMA,SAASI,qBAAqBA,CAACC,IAAI,EAAE;EAEnCA,IAAI,CAACC,MAAM,CAACC,OAAO,CAACC,KAAK,IAAI;IAC3B;;IAEA;IACA,IAAIA,KAAK,CAACC,MAAM,EAAE;MAChB;MACA;MACA;MACA;MACA,IAAAC,uDAA6B,EAACF,KAAK,CAAC;MACpC,IAAAG,gCAAmB,EAACH,KAAK,CAAC,CAAC,CAAC;MAC5B,IAAAI,oCAAqB,EAACJ,KAAK,CAAC,CAAC,CAAC;MAC9B,IAAAK,0CAAwB,EAACL,KAAK,CAAC,CAAC,CAAC;MACjC,IAAAG,gCAAmB,EAACH,KAAK,CAAC;MAE1B,OAAOA,KAAK,CAACC,MAAM;IACrB;IAEA,IAAID,KAAK,CAACM,yBAAyB,EAAE;MACnC,OAAON,KAAK,CAACM,yBAAyB;IACxC;IAEA,IAAIN,KAAK,CAACO,KAAK,EAAE;MACf,OAAOP,KAAK,CAACO,KAAK;IACpB;;IAEA;AACJ;AACA;AACA;AACA;EAEE,CAAC,CAAC;AACJ;AAGA,SAASC,mBAAmBA,CAACC,MAAM,EAAE;EACnC;EACAA,MAAM,CAACX,MAAM,GAAGW,MAAM,CAACX,MAAM,CAACY,MAAM,CAACC,CAAC,IAAI,CAACA,CAAC,CAACC,OAAO,CAAC;AACvD;AAGO,SAASC,kBAAkBA,CAAChB,IAAI,EAAEiB,MAAM,EAAE;EAC/ClB,qBAAqB,CAACC,IAAI,CAAC;EAC3BW,mBAAmB,CAACM,MAAM,CAAC,CAAC,CAAC;AAC/B","ignoreList":[]}
@@ -111,10 +111,8 @@ function mergeOrAddSubfieldNotRequired(targetField, candSubfieldData) {
111
111
  function addSubfield(targetField, candSubfield) {
112
112
  (0, _utils.nvdebug)(` Added subfield '${(0, _utils.subfieldToString)(candSubfield)}' to field`, debugDev);
113
113
  // Add subfield to the end of all subfields. NB! Implement a separate function that does this + subfield reordering somehow...
114
- targetField.subfields.push(candSubfield); // eslint-disable-line functional/immutable-data
115
-
116
- targetField.merged = 1; // eslint-disable-line functional/immutable-data
117
-
114
+ targetField.subfields.push(candSubfield);
115
+ targetField.merged = 1;
118
116
  setPunctuationFlag(targetField, candSubfield);
119
117
  (0, _sortSubfields.sortAdjacentSubfields)(targetField);
120
118
  }
@@ -123,7 +121,7 @@ function setPunctuationFlag(field, addedSubfield) {
123
121
  // These are never punctuation related
124
122
  return;
125
123
  }
126
- field.useExternalEndPunctuation = 1; // eslint-disable-line functional/immutable-data
124
+ field.useExternalEndPunctuation = 1;
127
125
  }
128
126
  function resetPaired880(candFieldPair880, targetField, punctlessCandSubfield) {
129
127
  // No relevant:
@@ -174,7 +172,7 @@ function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = [
174
172
  return;
175
173
  }
176
174
  (0, _utils.nvdebug)(` A: Yes. Add repeatable subfield '${(0, _utils.subfieldToString)(candSubfield)}'`, debugDev);
177
- targetField.merged = 1; // eslint-disable-line functional/immutable-data
175
+ targetField.merged = 1;
178
176
  setPunctuationFlag(targetField, candSubfield);
179
177
  addSubfield(targetField, candSubfield);
180
178
  return;
@@ -184,7 +182,7 @@ function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = [
184
182
  function mergeSubfieldPostprocessor() {
185
183
  if (original !== (0, _utils.fieldToString)(targetField)) {
186
184
  (0, _utils.nvdebug)(` A: Merge. Subfield '${candSubfieldAsString}' replaces the original subfield.`, debugDev);
187
- targetField.merged = 1; // eslint-disable-line functional/immutable-data
185
+ targetField.merged = 1;
188
186
  setPunctuationFlag(targetField, candSubfield);
189
187
  return;
190
188
  }
@@ -194,7 +192,7 @@ function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = [
194
192
  function addSubfieldWithPreviouslyUnseenSubfieldCode() {
195
193
  if (!(0, _utils.fieldHasSubfield)(targetField, candSubfield.code)) {
196
194
  (0, _utils.nvdebug)(` A: Yes. Add previously unseen subfield '${(0, _utils.subfieldToString)(candSubfield)}'`, debugDev);
197
- targetField.merged = 1; // eslint-disable-line functional/immutable-data
195
+ targetField.merged = 1;
198
196
  setPunctuationFlag(targetField, candSubfield);
199
197
  candFieldPairs880.forEach(pair => resetPaired880(pair, targetField, candSubfield));
200
198
  addSubfield(targetField, candSubfield);
@@ -1 +1 @@
1
- {"version":3,"file":"mergeOrAddSubfield.js","names":["_debug","_interopRequireDefault","require","_normalizeFieldForComparison","_normalizeIdentifiers","_utils","_mergeSubfield","_sortSubfields","_worldKnowledge","_subfield6Utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField","targetField","candSubfieldData","tag","code","nvdebug","fieldToString","originalValue","subfields","some","sf","value","ennakkotietoInSubfieldG","isEnnakkotietoSubfieldG","mergeOrAddSubfieldNotRequiredSpecialCases","charAt","match","valueCarriesMeaning","normalizedValue","alephIdentifierType","normalizeAs","undefined","normalizedSubfieldValue","normalizeControlSubfieldValue","skipNormalizedComparison","subfieldCode","subfieldValue","includes","substring","mergeOrAddSubfieldNotRequired","relevantTargetSubfields","filter","length","punctuationlessValue","normalizedTargetField","cloneAndNormalizeFieldForComparison","addSubfield","candSubfield","subfieldToString","push","merged","setPunctuationFlag","sortAdjacentSubfields","field","addedSubfield","isControlSubfieldCode","useExternalEndPunctuation","resetPaired880","candFieldPair880","punctlessCandSubfield","resetSubfield6Tag","mergeOrAddSubfield","candFieldPairs880","candSubfieldAsString","original","mergeSubfield","mergeSubfieldPostprocessor","addSubfieldWithPreviouslyUnseenSubfieldCode","subfieldIsRepeatable","fieldHasSubfield","forEach","pair"],"sources":["../../src/merge-fields/mergeOrAddSubfield.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {cloneAndNormalizeFieldForComparison, isEnnakkotietoSubfieldG} from '../normalizeFieldForComparison.js';\nimport {normalizeAs, normalizeControlSubfieldValue} from '../normalize-identifiers';\nimport {fieldHasSubfield, fieldToString, isControlSubfieldCode, nvdebug, subfieldIsRepeatable, subfieldToString} from '../utils.js';\nimport {mergeSubfield} from './mergeSubfield.js';\nimport {sortAdjacentSubfields} from '../sortSubfields'; //'./sortSubfields.js';\n\nimport {valueCarriesMeaning} from './worldKnowledge.js';\nimport {resetSubfield6Tag} from '../subfield6Utils.js';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeOrAddSubfield');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nfunction catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) {\n if (targetField.tag !== '040' || candSubfieldData.code !== 'd') {\n return false;\n }\n nvdebug(`${fieldToString(targetField)} vs $d ${candSubfieldData.originalValue}}`, debugDev);\n // Add hard-coded exceptions here\n if (targetField.subfields.some(sf => sf.code === 'a' && sf.value === candSubfieldData.originalValue)) {\n nvdebug('040‡d matched 040‡a', debugDev);\n return true;\n }\n return false;\n}\n\nfunction ennakkotietoInSubfieldG(candSubfieldData) {\n if (isEnnakkotietoSubfieldG({'code': candSubfieldData.code, 'value': candSubfieldData.originalValue})) {\n // Skip just ‡g subfield or the whole field?\n // We decided to skip just this subfield. We want at least $0 and maybe even more from ennakkotieto.\n debugDev(`Skip '‡g ${candSubfieldData.originalValue}'`);\n return true;\n }\n return false;\n}\n\n\nfunction mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData) {\n\n // Don't bring WHATEVER<KEEP> from source 7XX to base 1XX.\n // Exceptionally we can merge <KEEP>ed 7XX with un-<KEEP>ed 1XX as 1XX should not use <KEEP>s.\n if (targetField.tag.charAt(0) === '1' && candSubfieldData.tag.charAt(0) === '7' && candSubfieldData.code === '9' && candSubfieldData.originalValue.match(/<KEEP>/u)) {\n return true;\n }\n\n // Don't add 264$b 'Kustannuspaikka tuntematon' etc\n if (!valueCarriesMeaning(targetField.tag, candSubfieldData.code, candSubfieldData.normalizedValue)) {\n return true;\n }\n\n\n // Don't add $0 subfields that mean the same even if they look different:\n const alephIdentifierType = normalizeAs(targetField.tag, candSubfieldData.code);\n if (alephIdentifierType !== undefined) {\n const normalizedSubfieldValue = normalizeControlSubfieldValue(candSubfieldData.originalValue, alephIdentifierType);\n if (targetField.subfields.some(sf => normalizeControlSubfieldValue(sf.value) === normalizedSubfieldValue && sf.code === candSubfieldData.code)) {\n return true;\n }\n }\n return false;\n}\n\n\nfunction skipNormalizedComparison(tag, subfieldCode, subfieldValue) {\n if (tag === '020' && subfieldCode === 'a') {\n return true;\n }\n // Hackish: we want 'ntamo' to win 'Ntamo'...\n // If there are other similar excepting put them into an array.\n if (['110', '610', '710', '810'].includes(tag) && subfieldCode === 'a' && subfieldValue.substring(0, 5) === 'ntamo') {\n return true;\n }\n return false;\n}\n\nfunction mergeOrAddSubfieldNotRequired(targetField, candSubfieldData) {\n if (catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) || ennakkotietoInSubfieldG(candSubfieldData)) {\n return true;\n }\n\n if (mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData)) {\n return true;\n }\n\n const relevantTargetSubfields = targetField.subfields.filter(sf => sf.code === candSubfieldData.code);\n // Target field does not have this subfield yet:\n if (relevantTargetSubfields.length === 0) {\n return false;\n }\n nvdebug(` Look for identical subfields in '${fieldToString(targetField)}' using`, debugDev);\n nvdebug(` ORIG. ‡${candSubfieldData.code} ${candSubfieldData.originalValue}`, debugDev);\n nvdebug(` NO-PUNC ‡${candSubfieldData.code} ${candSubfieldData.punctuationlessValue}`, debugDev);\n if (relevantTargetSubfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.originalValue)) {\n return true;\n }\n if (relevantTargetSubfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.punctuationlessValue)) {\n return true;\n }\n\n if (!skipNormalizedComparison(targetField.tag, candSubfieldData.code, candSubfieldData.originalValue)) {\n const normalizedTargetField = cloneAndNormalizeFieldForComparison(targetField);\n nvdebug(` Look for identical normalized subfields in '${fieldToString(normalizedTargetField)}'`, debugDev);\n nvdebug(` NO-PUNC ‡${candSubfieldData.code} ${candSubfieldData.normalizedValue})`, debugDev);\n\n if (normalizedTargetField.subfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.normalizedValue)) {\n // Subfield with identical normalized value exists. Do nothing.\n // Not ideal 382‡n subfields, I guess... Nor 505‡trg repetitions... These need to be fixed...\n return true;\n }\n }\n\n return false; // (note that this is a double negation: not required is false)\n}\n\nfunction addSubfield(targetField, candSubfield) {\n nvdebug(` Added subfield '${subfieldToString(candSubfield)}' to field`, debugDev);\n // Add subfield to the end of all subfields. NB! Implement a separate function that does this + subfield reordering somehow...\n targetField.subfields.push(candSubfield); // eslint-disable-line functional/immutable-data\n\n targetField.merged = 1; // eslint-disable-line functional/immutable-data\n\n setPunctuationFlag(targetField, candSubfield);\n sortAdjacentSubfields(targetField);\n\n}\n\nfunction setPunctuationFlag(field, addedSubfield) {\n if (isControlSubfieldCode(addedSubfield.code)) { // These are never punctuation related\n return;\n }\n field.useExternalEndPunctuation = 1; // eslint-disable-line functional/immutable-data\n}\n\n\nfunction resetPaired880(candFieldPair880, targetField, punctlessCandSubfield) {\n // No relevant:\n if (punctlessCandSubfield.code !== '6') {\n return;\n }\n if (targetField.tag === '880') {\n return;\n }\n // NB! $6 comes first:\n if (candFieldPair880 === undefined || !candFieldPair880.subfields || candFieldPair880.subfields[0].code !== '6') {\n return;\n\n }\n nvdebug(`880 contents: ${fieldToString(candFieldPair880)}`, debugDev);\n resetSubfield6Tag(candFieldPair880.subfields[0], targetField.tag);\n}\n\nexport function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = []) {\n\n const candSubfieldAsString = `${candSubfieldData.code} ${candSubfieldData.originalValue}`;\n\n nvdebug(` Q: mergeOrAddSubfield '${candSubfieldAsString}'\\n with field '${fieldToString(targetField)}'?`, debugDev);\n if (mergeOrAddSubfieldNotRequired(targetField, candSubfieldData)) {\n nvdebug(` A: No. No need to merge nor to add the subfield '${candSubfieldAsString}'`, debugDev);\n return;\n }\n\n const candSubfield = {'code': candSubfieldData.code, 'value': candSubfieldData.punctuationlessValue};\n\n // Currently only for X00$d 1984- => 1984-2000 type of changes, where source version is better that what base has.\n // It all other cases the original subfield is kept.\n const original = fieldToString(targetField);\n\n if (mergeSubfield(targetField, candSubfield)) { // We might need the normalizedCandSubfield later on\n mergeSubfieldPostprocessor();\n return;\n }\n\n // Subfield codes missing from the original record can be added by default:\n if (addSubfieldWithPreviouslyUnseenSubfieldCode()) {\n return;\n }\n\n // melindaCustomMergeFields.json tells us whether the subfield is repeatable or not:\n if (subfieldIsRepeatable(targetField.tag, candSubfield.code)) {\n // We don't want to add multiple, say, 260$c\n if (['260', '264'].includes(targetField.tag)) {\n nvdebug(` A: Exceptionally skip repeatable existing subfield '${subfieldToString(candSubfield)}'`, debugDev);\n return;\n }\n nvdebug(` A: Yes. Add repeatable subfield '${subfieldToString(candSubfield)}'`, debugDev);\n targetField.merged = 1; // eslint-disable-line functional/immutable-data\n setPunctuationFlag(targetField, candSubfield);\n addSubfield(targetField, candSubfield);\n return;\n }\n\n nvdebug(` A: No. Non-repeatable subfield '${subfieldToString(candSubfield)}'`, debugDev);\n return;\n\n function mergeSubfieldPostprocessor() {\n if (original !== fieldToString(targetField)) {\n nvdebug(` A: Merge. Subfield '${candSubfieldAsString}' replaces the original subfield.`, debugDev);\n targetField.merged = 1; // eslint-disable-line functional/immutable-data\n setPunctuationFlag(targetField, candSubfield);\n return;\n }\n nvdebug(` A: No. Field ${original} already had the same or a synonymous or a better merge candidate than our subfield '${candSubfieldAsString}'.`, debugDev);\n return;\n }\n\n function addSubfieldWithPreviouslyUnseenSubfieldCode() {\n if (!fieldHasSubfield(targetField, candSubfield.code)) {\n nvdebug(` A: Yes. Add previously unseen subfield '${subfieldToString(candSubfield)}'`, debugDev);\n targetField.merged = 1; // eslint-disable-line functional/immutable-data\n setPunctuationFlag(targetField, candSubfield);\n candFieldPairs880.forEach(pair => resetPaired880(pair, targetField, candSubfield));\n addSubfield(targetField, candSubfield);\n return true;\n }\n return false;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mergeOrAddSubfield.js","names":["_debug","_interopRequireDefault","require","_normalizeFieldForComparison","_normalizeIdentifiers","_utils","_mergeSubfield","_sortSubfields","_worldKnowledge","_subfield6Utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField","targetField","candSubfieldData","tag","code","nvdebug","fieldToString","originalValue","subfields","some","sf","value","ennakkotietoInSubfieldG","isEnnakkotietoSubfieldG","mergeOrAddSubfieldNotRequiredSpecialCases","charAt","match","valueCarriesMeaning","normalizedValue","alephIdentifierType","normalizeAs","undefined","normalizedSubfieldValue","normalizeControlSubfieldValue","skipNormalizedComparison","subfieldCode","subfieldValue","includes","substring","mergeOrAddSubfieldNotRequired","relevantTargetSubfields","filter","length","punctuationlessValue","normalizedTargetField","cloneAndNormalizeFieldForComparison","addSubfield","candSubfield","subfieldToString","push","merged","setPunctuationFlag","sortAdjacentSubfields","field","addedSubfield","isControlSubfieldCode","useExternalEndPunctuation","resetPaired880","candFieldPair880","punctlessCandSubfield","resetSubfield6Tag","mergeOrAddSubfield","candFieldPairs880","candSubfieldAsString","original","mergeSubfield","mergeSubfieldPostprocessor","addSubfieldWithPreviouslyUnseenSubfieldCode","subfieldIsRepeatable","fieldHasSubfield","forEach","pair"],"sources":["../../src/merge-fields/mergeOrAddSubfield.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {cloneAndNormalizeFieldForComparison, isEnnakkotietoSubfieldG} from '../normalizeFieldForComparison.js';\nimport {normalizeAs, normalizeControlSubfieldValue} from '../normalize-identifiers';\nimport {fieldHasSubfield, fieldToString, isControlSubfieldCode, nvdebug, subfieldIsRepeatable, subfieldToString} from '../utils.js';\nimport {mergeSubfield} from './mergeSubfield.js';\nimport {sortAdjacentSubfields} from '../sortSubfields'; //'./sortSubfields.js';\n\nimport {valueCarriesMeaning} from './worldKnowledge.js';\nimport {resetSubfield6Tag} from '../subfield6Utils.js';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeOrAddSubfield');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nfunction catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) {\n if (targetField.tag !== '040' || candSubfieldData.code !== 'd') {\n return false;\n }\n nvdebug(`${fieldToString(targetField)} vs $d ${candSubfieldData.originalValue}}`, debugDev);\n // Add hard-coded exceptions here\n if (targetField.subfields.some(sf => sf.code === 'a' && sf.value === candSubfieldData.originalValue)) {\n nvdebug('040‡d matched 040‡a', debugDev);\n return true;\n }\n return false;\n}\n\nfunction ennakkotietoInSubfieldG(candSubfieldData) {\n if (isEnnakkotietoSubfieldG({'code': candSubfieldData.code, 'value': candSubfieldData.originalValue})) {\n // Skip just ‡g subfield or the whole field?\n // We decided to skip just this subfield. We want at least $0 and maybe even more from ennakkotieto.\n debugDev(`Skip '‡g ${candSubfieldData.originalValue}'`);\n return true;\n }\n return false;\n}\n\n\nfunction mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData) {\n\n // Don't bring WHATEVER<KEEP> from source 7XX to base 1XX.\n // Exceptionally we can merge <KEEP>ed 7XX with un-<KEEP>ed 1XX as 1XX should not use <KEEP>s.\n if (targetField.tag.charAt(0) === '1' && candSubfieldData.tag.charAt(0) === '7' && candSubfieldData.code === '9' && candSubfieldData.originalValue.match(/<KEEP>/u)) {\n return true;\n }\n\n // Don't add 264$b 'Kustannuspaikka tuntematon' etc\n if (!valueCarriesMeaning(targetField.tag, candSubfieldData.code, candSubfieldData.normalizedValue)) {\n return true;\n }\n\n\n // Don't add $0 subfields that mean the same even if they look different:\n const alephIdentifierType = normalizeAs(targetField.tag, candSubfieldData.code);\n if (alephIdentifierType !== undefined) {\n const normalizedSubfieldValue = normalizeControlSubfieldValue(candSubfieldData.originalValue, alephIdentifierType);\n if (targetField.subfields.some(sf => normalizeControlSubfieldValue(sf.value) === normalizedSubfieldValue && sf.code === candSubfieldData.code)) {\n return true;\n }\n }\n return false;\n}\n\n\nfunction skipNormalizedComparison(tag, subfieldCode, subfieldValue) {\n if (tag === '020' && subfieldCode === 'a') {\n return true;\n }\n // Hackish: we want 'ntamo' to win 'Ntamo'...\n // If there are other similar excepting put them into an array.\n if (['110', '610', '710', '810'].includes(tag) && subfieldCode === 'a' && subfieldValue.substring(0, 5) === 'ntamo') {\n return true;\n }\n return false;\n}\n\nfunction mergeOrAddSubfieldNotRequired(targetField, candSubfieldData) {\n if (catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) || ennakkotietoInSubfieldG(candSubfieldData)) {\n return true;\n }\n\n if (mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData)) {\n return true;\n }\n\n const relevantTargetSubfields = targetField.subfields.filter(sf => sf.code === candSubfieldData.code);\n // Target field does not have this subfield yet:\n if (relevantTargetSubfields.length === 0) {\n return false;\n }\n nvdebug(` Look for identical subfields in '${fieldToString(targetField)}' using`, debugDev);\n nvdebug(` ORIG. ‡${candSubfieldData.code} ${candSubfieldData.originalValue}`, debugDev);\n nvdebug(` NO-PUNC ‡${candSubfieldData.code} ${candSubfieldData.punctuationlessValue}`, debugDev);\n if (relevantTargetSubfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.originalValue)) {\n return true;\n }\n if (relevantTargetSubfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.punctuationlessValue)) {\n return true;\n }\n\n if (!skipNormalizedComparison(targetField.tag, candSubfieldData.code, candSubfieldData.originalValue)) {\n const normalizedTargetField = cloneAndNormalizeFieldForComparison(targetField);\n nvdebug(` Look for identical normalized subfields in '${fieldToString(normalizedTargetField)}'`, debugDev);\n nvdebug(` NO-PUNC ‡${candSubfieldData.code} ${candSubfieldData.normalizedValue})`, debugDev);\n\n if (normalizedTargetField.subfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.normalizedValue)) {\n // Subfield with identical normalized value exists. Do nothing.\n // Not ideal 382‡n subfields, I guess... Nor 505‡trg repetitions... These need to be fixed...\n return true;\n }\n }\n\n return false; // (note that this is a double negation: not required is false)\n}\n\nfunction addSubfield(targetField, candSubfield) {\n nvdebug(` Added subfield '${subfieldToString(candSubfield)}' to field`, debugDev);\n // Add subfield to the end of all subfields. NB! Implement a separate function that does this + subfield reordering somehow...\n targetField.subfields.push(candSubfield);\n\n targetField.merged = 1;\n\n setPunctuationFlag(targetField, candSubfield);\n sortAdjacentSubfields(targetField);\n\n}\n\nfunction setPunctuationFlag(field, addedSubfield) {\n if (isControlSubfieldCode(addedSubfield.code)) { // These are never punctuation related\n return;\n }\n field.useExternalEndPunctuation = 1;\n}\n\n\nfunction resetPaired880(candFieldPair880, targetField, punctlessCandSubfield) {\n // No relevant:\n if (punctlessCandSubfield.code !== '6') {\n return;\n }\n if (targetField.tag === '880') {\n return;\n }\n // NB! $6 comes first:\n if (candFieldPair880 === undefined || !candFieldPair880.subfields || candFieldPair880.subfields[0].code !== '6') {\n return;\n\n }\n nvdebug(`880 contents: ${fieldToString(candFieldPair880)}`, debugDev);\n resetSubfield6Tag(candFieldPair880.subfields[0], targetField.tag);\n}\n\nexport function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = []) {\n\n const candSubfieldAsString = `${candSubfieldData.code} ${candSubfieldData.originalValue}`;\n\n nvdebug(` Q: mergeOrAddSubfield '${candSubfieldAsString}'\\n with field '${fieldToString(targetField)}'?`, debugDev);\n if (mergeOrAddSubfieldNotRequired(targetField, candSubfieldData)) {\n nvdebug(` A: No. No need to merge nor to add the subfield '${candSubfieldAsString}'`, debugDev);\n return;\n }\n\n const candSubfield = {'code': candSubfieldData.code, 'value': candSubfieldData.punctuationlessValue};\n\n // Currently only for X00$d 1984- => 1984-2000 type of changes, where source version is better that what base has.\n // It all other cases the original subfield is kept.\n const original = fieldToString(targetField);\n\n if (mergeSubfield(targetField, candSubfield)) { // We might need the normalizedCandSubfield later on\n mergeSubfieldPostprocessor();\n return;\n }\n\n // Subfield codes missing from the original record can be added by default:\n if (addSubfieldWithPreviouslyUnseenSubfieldCode()) {\n return;\n }\n\n // melindaCustomMergeFields.json tells us whether the subfield is repeatable or not:\n if (subfieldIsRepeatable(targetField.tag, candSubfield.code)) {\n // We don't want to add multiple, say, 260$c\n if (['260', '264'].includes(targetField.tag)) {\n nvdebug(` A: Exceptionally skip repeatable existing subfield '${subfieldToString(candSubfield)}'`, debugDev);\n return;\n }\n nvdebug(` A: Yes. Add repeatable subfield '${subfieldToString(candSubfield)}'`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n addSubfield(targetField, candSubfield);\n return;\n }\n\n nvdebug(` A: No. Non-repeatable subfield '${subfieldToString(candSubfield)}'`, debugDev);\n return;\n\n function mergeSubfieldPostprocessor() {\n if (original !== fieldToString(targetField)) {\n nvdebug(` A: Merge. Subfield '${candSubfieldAsString}' replaces the original subfield.`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n return;\n }\n nvdebug(` A: No. Field ${original} already had the same or a synonymous or a better merge candidate than our subfield '${candSubfieldAsString}'.`, debugDev);\n return;\n }\n\n function addSubfieldWithPreviouslyUnseenSubfieldCode() {\n if (!fieldHasSubfield(targetField, candSubfield.code)) {\n nvdebug(` A: Yes. Add previously unseen subfield '${subfieldToString(candSubfield)}'`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n candFieldPairs880.forEach(pair => resetPaired880(pair, targetField, candSubfield));\n addSubfield(targetField, candSubfield);\n return true;\n }\n return false;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -49,11 +49,11 @@ function anyYear(str) {
49
49
  function replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields) {
50
50
  if (birthYearAndDeathYear.test(candSubfield.value)) {
51
51
  if (onlyBirthYear.test(relevantSubfields[0].value) && parseInt(relevantSubfields[0].value, 10) === parseInt(candSubfield.value, 10)) {
52
- relevantSubfields[0].value = candSubfield.value; // eslint-disable-line functional/immutable-data
52
+ relevantSubfields[0].value = candSubfield.value;
53
53
  return true;
54
54
  }
55
55
  if (onlyDeathYear.test(relevantSubfields[0].value) && getDeathYear(relevantSubfields[0].value) === getDeathYear(candSubfield.value)) {
56
- relevantSubfields[0].value = candSubfield.value; // eslint-disable-line functional/immutable-data
56
+ relevantSubfields[0].value = candSubfield.value;
57
57
  return true;
58
58
  }
59
59
  }
@@ -67,7 +67,7 @@ function replaceDatesAssociatedWithName(targetField, candSubfield, relevantSubfi
67
67
  return false;
68
68
  }
69
69
  if (!anyYear(relevantSubfields[0].value) && anyYear(candSubfield.value)) {
70
- relevantSubfields[0].value = candSubfield.value; // eslint-disable-line functional/immutable-data
70
+ relevantSubfields[0].value = candSubfield.value;
71
71
  return true;
72
72
  }
73
73
  if (replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields)) {
@@ -162,7 +162,7 @@ function preferHyphenatedISBN(field, candSubfield, relevantSubfields) {
162
162
  if (!pair) {
163
163
  return false;
164
164
  }
165
- pair.value = candSubfield.value; // eslint-disable-line functional/immutable-data
165
+ pair.value = candSubfield.value;
166
166
  return true;
167
167
  }
168
168
  function preferHttpsOverHttp(candSubfield, relevantSubfields) {
@@ -174,7 +174,7 @@ function preferHttpsOverHttp(candSubfield, relevantSubfields) {
174
174
  if (!pair) {
175
175
  return false;
176
176
  }
177
- pair.value = candSubfield.value; // eslint-disable-line functional/immutable-data
177
+ pair.value = candSubfield.value;
178
178
  return true;
179
179
  }
180
180
  function preferQualifierVersion(field, candSubfield, relevantSubfields) {
@@ -191,7 +191,7 @@ function preferQualifierVersion(field, candSubfield, relevantSubfields) {
191
191
  if (field.tag === '300' && candSubfield.code === 'a' && candSubfield.value.match(/(?:online|verkko)/iu)) {
192
192
  return true; // True, but don't prefer the source value
193
193
  }
194
- pair.value = candSubfield.value; // eslint-disable-line functional/immutable-data
194
+ pair.value = candSubfield.value;
195
195
  return true;
196
196
  function subfieldQualifierCheck(subfield, name, qualifier) {
197
197
  const [name2, qualifier2] = (0, _counterpartField.splitToNameAndQualifier)(candSubfield.value);
@@ -211,7 +211,7 @@ function preferSourceCorporateName(field, candSubfield, pair) {
211
211
  (0, _utils.nvdebug)(`CORP base '${pair.value}' vs '${candSubfield.value}'`, debugDev);
212
212
  const prefer = actualPrefenceCheck();
213
213
  if (prefer) {
214
- pair.value = candSubfield.value; // eslint-disable-line functional/immutable-data
214
+ pair.value = candSubfield.value;
215
215
  return true;
216
216
  }
217
217
  return false;
@@ -260,7 +260,7 @@ function mergeSubfield(targetField, candSubfield) {
260
260
  // 260 $a value "[S.l]" is the main type for this.
261
261
  const meaninglessSubfields = relevantSubfields.filter(sf => !(0, _worldKnowledge.valueCarriesMeaning)(targetField.tag, sf.code, sf.value));
262
262
  if (meaninglessSubfields.length > 0) {
263
- meaninglessSubfields[0].value = candSubfield.value; // eslint-disable-line functional/immutable-data
263
+ meaninglessSubfields[0].value = candSubfield.value;
264
264
  return true;
265
265
  }
266
266
 
@@ -1 +1 @@
1
- {"version":3,"file":"mergeSubfield.js","names":["_debug","_interopRequireDefault","require","_normalizeSubfieldValueForComparison","_worldKnowledge","_utils","_normalizeFieldForComparison","_counterpartField","e","__esModule","default","debug","createDebugLogger","debugDev","extend","onlyBirthYear","onlyDeathYear","birthYearAndDeathYear","getDeathYear","str","parseInt","substring","indexOf","isValidBirthYearAndDeathYear","test","b","d","anyYear","replaceEntrysBirthAndDeathYear","targetField","candSubfield","relevantSubfields","value","replaceDatesAssociatedWithName","code","tag","isKierreselka","includes","isKovakantinen","isPehmeakantinen","isItsenainenJatkoOsa","match","isSisaltaaTeos","relationInformationMatches","some","sf","coverTypesMatch","httpToHttps","val","replace","pairHttpAndHttps","a","bs","map","isSynonym","field","preferHyphenatedISBN","tagAndSubfieldCodeReferToIsbn","hyphenlessSubfields","filter","pair","find","preferHttpsOverHttp","httpVersion","preferQualifierVersion","canContainOptionalQualifier","name1","qualifier1","splitToNameAndQualifier","subfieldQualifierCheck","subfield","name","qualifier","name2","qualifier2","preferSourceCorporateName","nvdebug","prefer","actualPrefenceCheck","sourceName","sourceQualifier","baseName","baseQualifier","undefined","mergeSubfield","subfields","length","meaninglessSubfields","valueCarriesMeaning","subfieldContainsPartData","partsAgree"],"sources":["../../src/merge-fields/mergeSubfield.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {partsAgree, subfieldContainsPartData} from '../normalizeSubfieldValueForComparison';\nimport {valueCarriesMeaning} from './worldKnowledge';\nimport {nvdebug} from '../utils';\nimport {tagAndSubfieldCodeReferToIsbn} from '../normalizeFieldForComparison.js';\nimport {canContainOptionalQualifier, splitToNameAndQualifier} from './counterpartField';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeSubfield');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! These are X00 specific. Should we somehow parametrize them?\nconst onlyBirthYear = /^[1-9][0-9]*-[,.]?$/u;\nconst onlyDeathYear = /^-[1-9][0-9]*[,.]?$/u;\nconst birthYearAndDeathYear = /^[1-9][0-9]*-[1-9][0-9]*[,.]?$/u;\n\nfunction getDeathYear(str) {\n return parseInt(str.substring(str.indexOf('-') + 1), 10);\n}\n\nfunction isValidBirthYearAndDeathYear(str) {\n if (!birthYearAndDeathYear.test(str)) {\n return false;\n }\n // We have two years\n const b = parseInt(str, 10);\n const d = getDeathYear(str);\n if (b > d) { // died before birth! Rather unlikely.\n return false;\n }\n if (d - b > 125) { // Over 125 years old. Rather unlikely.\n return false;\n }\n // Possible sanity check: Died after current year?\n return true;\n}\n\nfunction anyYear(str) {\n if (onlyBirthYear.test(str) || onlyDeathYear.test(str) || isValidBirthYearAndDeathYear(str)) {\n return true;\n }\n return false;\n}\n\nfunction replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields) {\n if (birthYearAndDeathYear.test(candSubfield.value)) {\n if (onlyBirthYear.test(relevantSubfields[0].value) && parseInt(relevantSubfields[0].value, 10) === parseInt(candSubfield.value, 10)) {\n relevantSubfields[0].value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n }\n\n if (onlyDeathYear.test(relevantSubfields[0].value) && getDeathYear(relevantSubfields[0].value) === getDeathYear(candSubfield.value)) {\n relevantSubfields[0].value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n }\n }\n return false;\n}\n\nfunction replaceDatesAssociatedWithName(targetField, candSubfield, relevantSubfields) {\n // Add also the death year, if the original value only contains birth year.\n // This function treats only with X00$d subfields:\n if (candSubfield.code !== 'd' || !(/^[1678]00$/u).test(targetField.tag)) { // njsscan-ignore: regex_dos\n return false;\n }\n\n if (!anyYear(relevantSubfields[0].value) && anyYear(candSubfield.value)) {\n relevantSubfields[0].value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n }\n\n if (replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields)) {\n return true;\n }\n return false;\n}\n\n// use array.includes(value) for easy extendability (Swedish, other languages, abbrs, etc.()\nfunction isKierreselka(value) {\n return ['kierreselkä', 'spiral bound', 'spiral-bound', 'spiralrygg'].includes(value);\n}\n\nfunction isKovakantinen(value) {\n return ['hardback', 'hardcover', 'hårda pärmar', 'kovakantinen'].includes(value);\n}\n\nfunction isPehmeakantinen(value) {\n return ['mjuka pärmar', 'paperback', 'pehmeäkantinen', 'softcover'].includes(value);\n}\n\nfunction isItsenainenJatkoOsa(value) {\n if (value.match(/^Fristående fortsättning på verket[^a-z]*$/ui)) {\n return true;\n }\n if (value.match(/^Itsenäinen jatko-osa teokselle[^a-z]*$/ui)) {\n return true;\n }\n return false;\n}\n\nfunction isSisaltaaTeos(value) {\n if (value.match(/^Innehåller \\(verk\\)[^a-z]*$/ui)) {\n return true;\n }\n if (value.match(/^Sisältää \\(teos\\)[^a-z]*$/ui)) {\n return true;\n }\n return false;\n}\nfunction relationInformationMatches(candSubfield, relevantSubfields) {\n if (isSisaltaaTeos(candSubfield.value) && relevantSubfields.some(sf => isSisaltaaTeos(sf.value))) {\n return true;\n }\n if (isItsenainenJatkoOsa(candSubfield.value) && relevantSubfields.some(sf => isItsenainenJatkoOsa(sf.value))) {\n return true;\n }\n\n return false;\n}\n\nfunction coverTypesMatch(candSubfield, relevantSubfields) {\n if (isPehmeakantinen(candSubfield.value) && relevantSubfields.some(sf => isPehmeakantinen(sf.value))) {\n return true;\n }\n if (isKovakantinen(candSubfield.value) && relevantSubfields.some(sf => isKovakantinen(sf.value))) {\n return true;\n }\n if (isKierreselka(candSubfield.value) && relevantSubfields.some(sf => isKierreselka(sf.value))) {\n return true;\n }\n return false;\n}\n\nfunction httpToHttps(val) {\n return val.replace(/http:\\/\\//ug, 'https://');\n}\n\nfunction pairHttpAndHttps(candSubfield, relevantSubfields) {\n const a = httpToHttps(candSubfield.value);\n const bs = relevantSubfields.map(sf => httpToHttps(sf.value));\n return bs.includes(a);\n}\n\nfunction isSynonym(field, candSubfield, relevantSubfields) {\n if (candSubfield.code === 'q' && ['015', '020', '024', '028'].includes(field.tag)) {\n return coverTypesMatch(candSubfield, relevantSubfields);\n }\n\n //nvdebug(`Looking for synonyms for '${subfieldToString(candSubfield)}'...`, debugDev);\n\n if (relationInformationMatches(candSubfield, relevantSubfields)) {\n return true;\n }\n\n if (pairHttpAndHttps(candSubfield, relevantSubfields)) {\n return true;\n }\n\n return false;\n}\n\nfunction preferHyphenatedISBN(field, candSubfield, relevantSubfields) {\n if (!tagAndSubfieldCodeReferToIsbn(field.tag, candSubfield.code) || candSubfield.value.includes('-') === -1) {\n return false;\n }\n\n // Must not already exist:\n if (relevantSubfields.some(sf => sf.value === candSubfield.value)) {\n return false;\n }\n\n const hyphenlessSubfields = relevantSubfields.filter(sf => sf.value.includes('-') > -1);\n const pair = hyphenlessSubfields.find(sf => sf.value === candSubfield.value.replace(/-/gu, ''));\n if (!pair) {\n return false;\n }\n pair.value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n}\n\nfunction preferHttpsOverHttp(candSubfield, relevantSubfields) {\n if (candSubfield.value.substring(0, 8) !== 'https://') {\n return false;\n }\n\n const httpVersion = `http://${candSubfield.value.substring(8)}`;\n const pair = relevantSubfields.find(sf => sf.value === httpVersion);\n\n if (!pair) {\n return false;\n }\n pair.value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n}\n\n\nfunction preferQualifierVersion(field, candSubfield, relevantSubfields) {\n if (!canContainOptionalQualifier(field.tag, candSubfield.code)) { // currently only 300$a and 776$i can prefer source...\n return false;\n }\n\n const [name1, qualifier1] = splitToNameAndQualifier(candSubfield.value);\n const pair = relevantSubfields.find(sf => subfieldQualifierCheck(sf, name1, qualifier1));\n if (!pair) {\n return false;\n }\n // SN: \"Kuvailuohjeiden näkökulmasta epubille ei pitäisi koskaan merkitä sivumäärää\"\n if (field.tag === '300' && candSubfield.code === 'a' && candSubfield.value.match(/(?:online|verkko)/iu)) {\n return true; // True, but don't prefer the source value\n }\n\n pair.value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n\n function subfieldQualifierCheck(subfield, name, qualifier) {\n const [name2, qualifier2] = splitToNameAndQualifier(candSubfield.value);\n if (name !== name2) {\n return false;\n }\n if (!qualifier || !qualifier2 || qualifier === qualifier2) {\n return true;\n }\n return false;\n }\n\n}\n\nfunction preferSourceCorporateName(field, candSubfield, pair) {\n if (candSubfield.code !== 'a' || !['110', '610', '710', '810'].includes(field.tag)) {\n return false;\n }\n nvdebug(`CORP base '${pair.value}' vs '${candSubfield.value}'`, debugDev);\n const prefer = actualPrefenceCheck();\n if (prefer) {\n pair.value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n }\n return false;\n\n function actualPrefenceCheck() {\n if (candSubfield.value.match(/^Werner Söderström/u) && pair.value.match(/^WSOY/ui)) {\n return true;\n }\n if (candSubfield.value.match(/^ntamo/u) && pair.value.match(/^N(?:tamo|TAMO)/u)) {\n return true;\n }\n // Prefer (qualifier):\n const [sourceName, sourceQualifier] = splitToNameAndQualifier(candSubfield.value);\n const [baseName, baseQualifier] = splitToNameAndQualifier(pair.value);\n if (sourceName === baseName && baseQualifier === undefined && sourceQualifier !== undefined) {\n return true;\n }\n // Not taking prefix and suffix into account here...\n return false;\n }\n\n}\n\nexport function mergeSubfield(targetField, candSubfield) {\n // Replace existing subfield with the incoming field. These replacements are by name rather hacky...\n // Currenty we only select the better X00$d.\n // In future we might do more things here. Examples:\n // - \"FOO\" gets replaced by \"Foo\" in certain fields.\n // - \"Etunimi Sukunimi\" might lose to \"Sukunimi, Etunimi\" in X00 fields.\n // - [put your ideas here]\n // Return true, if replace is done.\n // However, replacing/succeeding requires a sanity check, that the new value is a better one...\n // Thus, typically this function fails...\n\n const relevantSubfields = targetField.subfields.filter(subfield => subfield.code === candSubfield.code);\n\n // There's nothing to replace the incoming subfield with. Thus abort:\n if (relevantSubfields.length === 0) {\n return false;\n }\n\n nvdebug(`Got ${relevantSubfields.length} sf-cand(s) for field ${targetField.tag}‡${candSubfield.code}`, debugDev);\n\n\n if (replaceDatesAssociatedWithName(targetField, candSubfield, relevantSubfields) ||\n preferHyphenatedISBN(targetField, candSubfield, relevantSubfields) ||\n preferHttpsOverHttp(candSubfield, relevantSubfields) ||\n preferSourceCorporateName(targetField, candSubfield, relevantSubfields[0]) || // SF is non-repeat\n preferQualifierVersion(targetField, candSubfield, relevantSubfields) ||\n isSynonym(targetField, candSubfield, relevantSubfields)) {\n return true;\n }\n\n // We found a crappy empty subfield: replace that with a meaningful one.\n // 260 $a value \"[S.l]\" is the main type for this.\n const meaninglessSubfields = relevantSubfields.filter(sf => !valueCarriesMeaning(targetField.tag, sf.code, sf.value));\n if (meaninglessSubfields.length > 0) {\n meaninglessSubfields[0].value = candSubfield.value; // eslint-disable-line functional/immutable-data\n return true;\n }\n\n // Mark 490$v \"osa 1\" vs \"1\" as merged (2nd part of MET-53).\n // NB! Keeps the original value and drops the incoming value. (Just preventing it from going to add-part...)\n // NB! We could improve this and choose the longer value later on.\n if (subfieldContainsPartData(targetField.tag, candSubfield.code)) {\n if (relevantSubfields.some(sf => partsAgree(sf.value, candSubfield.value, targetField.tag, candSubfield.code))) {\n return true;\n }\n }\n return false; // default to failure\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mergeSubfield.js","names":["_debug","_interopRequireDefault","require","_normalizeSubfieldValueForComparison","_worldKnowledge","_utils","_normalizeFieldForComparison","_counterpartField","e","__esModule","default","debug","createDebugLogger","debugDev","extend","onlyBirthYear","onlyDeathYear","birthYearAndDeathYear","getDeathYear","str","parseInt","substring","indexOf","isValidBirthYearAndDeathYear","test","b","d","anyYear","replaceEntrysBirthAndDeathYear","targetField","candSubfield","relevantSubfields","value","replaceDatesAssociatedWithName","code","tag","isKierreselka","includes","isKovakantinen","isPehmeakantinen","isItsenainenJatkoOsa","match","isSisaltaaTeos","relationInformationMatches","some","sf","coverTypesMatch","httpToHttps","val","replace","pairHttpAndHttps","a","bs","map","isSynonym","field","preferHyphenatedISBN","tagAndSubfieldCodeReferToIsbn","hyphenlessSubfields","filter","pair","find","preferHttpsOverHttp","httpVersion","preferQualifierVersion","canContainOptionalQualifier","name1","qualifier1","splitToNameAndQualifier","subfieldQualifierCheck","subfield","name","qualifier","name2","qualifier2","preferSourceCorporateName","nvdebug","prefer","actualPrefenceCheck","sourceName","sourceQualifier","baseName","baseQualifier","undefined","mergeSubfield","subfields","length","meaninglessSubfields","valueCarriesMeaning","subfieldContainsPartData","partsAgree"],"sources":["../../src/merge-fields/mergeSubfield.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {partsAgree, subfieldContainsPartData} from '../normalizeSubfieldValueForComparison';\nimport {valueCarriesMeaning} from './worldKnowledge';\nimport {nvdebug} from '../utils';\nimport {tagAndSubfieldCodeReferToIsbn} from '../normalizeFieldForComparison.js';\nimport {canContainOptionalQualifier, splitToNameAndQualifier} from './counterpartField';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeSubfield');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! These are X00 specific. Should we somehow parametrize them?\nconst onlyBirthYear = /^[1-9][0-9]*-[,.]?$/u;\nconst onlyDeathYear = /^-[1-9][0-9]*[,.]?$/u;\nconst birthYearAndDeathYear = /^[1-9][0-9]*-[1-9][0-9]*[,.]?$/u;\n\nfunction getDeathYear(str) {\n return parseInt(str.substring(str.indexOf('-') + 1), 10);\n}\n\nfunction isValidBirthYearAndDeathYear(str) {\n if (!birthYearAndDeathYear.test(str)) {\n return false;\n }\n // We have two years\n const b = parseInt(str, 10);\n const d = getDeathYear(str);\n if (b > d) { // died before birth! Rather unlikely.\n return false;\n }\n if (d - b > 125) { // Over 125 years old. Rather unlikely.\n return false;\n }\n // Possible sanity check: Died after current year?\n return true;\n}\n\nfunction anyYear(str) {\n if (onlyBirthYear.test(str) || onlyDeathYear.test(str) || isValidBirthYearAndDeathYear(str)) {\n return true;\n }\n return false;\n}\n\nfunction replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields) {\n if (birthYearAndDeathYear.test(candSubfield.value)) {\n if (onlyBirthYear.test(relevantSubfields[0].value) && parseInt(relevantSubfields[0].value, 10) === parseInt(candSubfield.value, 10)) {\n relevantSubfields[0].value = candSubfield.value;\n return true;\n }\n\n if (onlyDeathYear.test(relevantSubfields[0].value) && getDeathYear(relevantSubfields[0].value) === getDeathYear(candSubfield.value)) {\n relevantSubfields[0].value = candSubfield.value;\n return true;\n }\n }\n return false;\n}\n\nfunction replaceDatesAssociatedWithName(targetField, candSubfield, relevantSubfields) {\n // Add also the death year, if the original value only contains birth year.\n // This function treats only with X00$d subfields:\n if (candSubfield.code !== 'd' || !(/^[1678]00$/u).test(targetField.tag)) { // njsscan-ignore: regex_dos\n return false;\n }\n\n if (!anyYear(relevantSubfields[0].value) && anyYear(candSubfield.value)) {\n relevantSubfields[0].value = candSubfield.value;\n return true;\n }\n\n if (replaceEntrysBirthAndDeathYear(targetField, candSubfield, relevantSubfields)) {\n return true;\n }\n return false;\n}\n\n// use array.includes(value) for easy extendability (Swedish, other languages, abbrs, etc.()\nfunction isKierreselka(value) {\n return ['kierreselkä', 'spiral bound', 'spiral-bound', 'spiralrygg'].includes(value);\n}\n\nfunction isKovakantinen(value) {\n return ['hardback', 'hardcover', 'hårda pärmar', 'kovakantinen'].includes(value);\n}\n\nfunction isPehmeakantinen(value) {\n return ['mjuka pärmar', 'paperback', 'pehmeäkantinen', 'softcover'].includes(value);\n}\n\nfunction isItsenainenJatkoOsa(value) {\n if (value.match(/^Fristående fortsättning på verket[^a-z]*$/ui)) {\n return true;\n }\n if (value.match(/^Itsenäinen jatko-osa teokselle[^a-z]*$/ui)) {\n return true;\n }\n return false;\n}\n\nfunction isSisaltaaTeos(value) {\n if (value.match(/^Innehåller \\(verk\\)[^a-z]*$/ui)) {\n return true;\n }\n if (value.match(/^Sisältää \\(teos\\)[^a-z]*$/ui)) {\n return true;\n }\n return false;\n}\nfunction relationInformationMatches(candSubfield, relevantSubfields) {\n if (isSisaltaaTeos(candSubfield.value) && relevantSubfields.some(sf => isSisaltaaTeos(sf.value))) {\n return true;\n }\n if (isItsenainenJatkoOsa(candSubfield.value) && relevantSubfields.some(sf => isItsenainenJatkoOsa(sf.value))) {\n return true;\n }\n\n return false;\n}\n\nfunction coverTypesMatch(candSubfield, relevantSubfields) {\n if (isPehmeakantinen(candSubfield.value) && relevantSubfields.some(sf => isPehmeakantinen(sf.value))) {\n return true;\n }\n if (isKovakantinen(candSubfield.value) && relevantSubfields.some(sf => isKovakantinen(sf.value))) {\n return true;\n }\n if (isKierreselka(candSubfield.value) && relevantSubfields.some(sf => isKierreselka(sf.value))) {\n return true;\n }\n return false;\n}\n\nfunction httpToHttps(val) {\n return val.replace(/http:\\/\\//ug, 'https://');\n}\n\nfunction pairHttpAndHttps(candSubfield, relevantSubfields) {\n const a = httpToHttps(candSubfield.value);\n const bs = relevantSubfields.map(sf => httpToHttps(sf.value));\n return bs.includes(a);\n}\n\nfunction isSynonym(field, candSubfield, relevantSubfields) {\n if (candSubfield.code === 'q' && ['015', '020', '024', '028'].includes(field.tag)) {\n return coverTypesMatch(candSubfield, relevantSubfields);\n }\n\n //nvdebug(`Looking for synonyms for '${subfieldToString(candSubfield)}'...`, debugDev);\n\n if (relationInformationMatches(candSubfield, relevantSubfields)) {\n return true;\n }\n\n if (pairHttpAndHttps(candSubfield, relevantSubfields)) {\n return true;\n }\n\n return false;\n}\n\nfunction preferHyphenatedISBN(field, candSubfield, relevantSubfields) {\n if (!tagAndSubfieldCodeReferToIsbn(field.tag, candSubfield.code) || candSubfield.value.includes('-') === -1) {\n return false;\n }\n\n // Must not already exist:\n if (relevantSubfields.some(sf => sf.value === candSubfield.value)) {\n return false;\n }\n\n const hyphenlessSubfields = relevantSubfields.filter(sf => sf.value.includes('-') > -1);\n const pair = hyphenlessSubfields.find(sf => sf.value === candSubfield.value.replace(/-/gu, ''));\n if (!pair) {\n return false;\n }\n pair.value = candSubfield.value;\n return true;\n}\n\nfunction preferHttpsOverHttp(candSubfield, relevantSubfields) {\n if (candSubfield.value.substring(0, 8) !== 'https://') {\n return false;\n }\n\n const httpVersion = `http://${candSubfield.value.substring(8)}`;\n const pair = relevantSubfields.find(sf => sf.value === httpVersion);\n\n if (!pair) {\n return false;\n }\n pair.value = candSubfield.value;\n return true;\n}\n\n\nfunction preferQualifierVersion(field, candSubfield, relevantSubfields) {\n if (!canContainOptionalQualifier(field.tag, candSubfield.code)) { // currently only 300$a and 776$i can prefer source...\n return false;\n }\n\n const [name1, qualifier1] = splitToNameAndQualifier(candSubfield.value);\n const pair = relevantSubfields.find(sf => subfieldQualifierCheck(sf, name1, qualifier1));\n if (!pair) {\n return false;\n }\n // SN: \"Kuvailuohjeiden näkökulmasta epubille ei pitäisi koskaan merkitä sivumäärää\"\n if (field.tag === '300' && candSubfield.code === 'a' && candSubfield.value.match(/(?:online|verkko)/iu)) {\n return true; // True, but don't prefer the source value\n }\n\n pair.value = candSubfield.value;\n return true;\n\n function subfieldQualifierCheck(subfield, name, qualifier) {\n const [name2, qualifier2] = splitToNameAndQualifier(candSubfield.value);\n if (name !== name2) {\n return false;\n }\n if (!qualifier || !qualifier2 || qualifier === qualifier2) {\n return true;\n }\n return false;\n }\n\n}\n\nfunction preferSourceCorporateName(field, candSubfield, pair) {\n if (candSubfield.code !== 'a' || !['110', '610', '710', '810'].includes(field.tag)) {\n return false;\n }\n nvdebug(`CORP base '${pair.value}' vs '${candSubfield.value}'`, debugDev);\n const prefer = actualPrefenceCheck();\n if (prefer) {\n pair.value = candSubfield.value;\n return true;\n }\n return false;\n\n function actualPrefenceCheck() {\n if (candSubfield.value.match(/^Werner Söderström/u) && pair.value.match(/^WSOY/ui)) {\n return true;\n }\n if (candSubfield.value.match(/^ntamo/u) && pair.value.match(/^N(?:tamo|TAMO)/u)) {\n return true;\n }\n // Prefer (qualifier):\n const [sourceName, sourceQualifier] = splitToNameAndQualifier(candSubfield.value);\n const [baseName, baseQualifier] = splitToNameAndQualifier(pair.value);\n if (sourceName === baseName && baseQualifier === undefined && sourceQualifier !== undefined) {\n return true;\n }\n // Not taking prefix and suffix into account here...\n return false;\n }\n\n}\n\nexport function mergeSubfield(targetField, candSubfield) {\n // Replace existing subfield with the incoming field. These replacements are by name rather hacky...\n // Currenty we only select the better X00$d.\n // In future we might do more things here. Examples:\n // - \"FOO\" gets replaced by \"Foo\" in certain fields.\n // - \"Etunimi Sukunimi\" might lose to \"Sukunimi, Etunimi\" in X00 fields.\n // - [put your ideas here]\n // Return true, if replace is done.\n // However, replacing/succeeding requires a sanity check, that the new value is a better one...\n // Thus, typically this function fails...\n\n const relevantSubfields = targetField.subfields.filter(subfield => subfield.code === candSubfield.code);\n\n // There's nothing to replace the incoming subfield with. Thus abort:\n if (relevantSubfields.length === 0) {\n return false;\n }\n\n nvdebug(`Got ${relevantSubfields.length} sf-cand(s) for field ${targetField.tag}‡${candSubfield.code}`, debugDev);\n\n\n if (replaceDatesAssociatedWithName(targetField, candSubfield, relevantSubfields) ||\n preferHyphenatedISBN(targetField, candSubfield, relevantSubfields) ||\n preferHttpsOverHttp(candSubfield, relevantSubfields) ||\n preferSourceCorporateName(targetField, candSubfield, relevantSubfields[0]) || // SF is non-repeat\n preferQualifierVersion(targetField, candSubfield, relevantSubfields) ||\n isSynonym(targetField, candSubfield, relevantSubfields)) {\n return true;\n }\n\n // We found a crappy empty subfield: replace that with a meaningful one.\n // 260 $a value \"[S.l]\" is the main type for this.\n const meaninglessSubfields = relevantSubfields.filter(sf => !valueCarriesMeaning(targetField.tag, sf.code, sf.value));\n if (meaninglessSubfields.length > 0) {\n meaninglessSubfields[0].value = candSubfield.value;\n return true;\n }\n\n // Mark 490$v \"osa 1\" vs \"1\" as merged (2nd part of MET-53).\n // NB! Keeps the original value and drops the incoming value. (Just preventing it from going to add-part...)\n // NB! We could improve this and choose the longer value later on.\n if (subfieldContainsPartData(targetField.tag, candSubfield.code)) {\n if (relevantSubfields.some(sf => partsAgree(sf.value, candSubfield.value, targetField.tag, candSubfield.code))) {\n return true;\n }\n }\n return false; // default to failure\n}\n"],"mappings":"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","ignoreList":[]}
@@ -24,7 +24,7 @@ function fieldRemoveDuplicateSubfields(field) {
24
24
  return;
25
25
  }
26
26
  const strippedField = (0, _normalizeFieldForComparison.cloneAndRemovePunctuation)(field); // make punctuation-less version
27
- /* eslint-disable */
27
+
28
28
  let seen = {};
29
29
  field.subfields = field.subfields.filter((sf, i) => notSeenBefore(sf, i));
30
30
  if (field.collapsed) {
@@ -43,6 +43,5 @@ function fieldRemoveDuplicateSubfields(field) {
43
43
  seen[subfieldAsString] = subfieldAsString;
44
44
  return true;
45
45
  }
46
- /* eslint-enable */
47
46
  }
48
47
  //# sourceMappingURL=removeDuplicateSubfields.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"removeDuplicateSubfields.js","names":["_utils","require","_debug","_interopRequireDefault","_normalizeFieldForComparison","_sortSubfields","_punctuation","e","__esModule","default","debug","createDebugLogger","debugDev","extend","recordRemoveDuplicateSubfieldsFromFields","record","fields","forEach","field","fieldRemoveDuplicateSubfields","subfields","includes","tag","strippedField","cloneAndRemovePunctuation","seen","filter","sf","i","notSeenBefore","collapsed","sortAdjacentSubfields","fieldFixPunctuation","index","subfieldAsString","subfieldToString","nvdebug"],"sources":["../../src/merge-fields/removeDuplicateSubfields.js"],"sourcesContent":["\nimport {nvdebug, subfieldToString} from '../utils.js';\nimport createDebugLogger from 'debug';\nimport {cloneAndRemovePunctuation} from '../normalizeFieldForComparison.js';\nimport {sortAdjacentSubfields} from '../sortSubfields';\nimport {fieldFixPunctuation} from '../punctuation2';\n\n\n// NB This should be moved and converted to a validator/fixer as well...\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:merge-fields:removeDuplicateSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport function recordRemoveDuplicateSubfieldsFromFields(record) {\n record.fields.forEach(field => fieldRemoveDuplicateSubfields(field));\n}\n\nexport function fieldRemoveDuplicateSubfields(field) {\n // Skip bad (382, 505) and risky (264 ...) stuff: 382$n, 505$r, others...\n if (!field.subfields || ['264', '300', '382', '505'].includes(field.tag)) {\n return;\n }\n\n const strippedField = cloneAndRemovePunctuation(field); // make punctuation-less version\n /* eslint-disable */\n let seen = {};\n\n field.subfields = field.subfields.filter((sf, i) => notSeenBefore(sf, i));\n\n if (field.collapsed) {\n sortAdjacentSubfields(field);\n fieldFixPunctuation(field);\n delete field.collapsed;\n }\n\n\n function notSeenBefore(sf, index) {\n const subfieldAsString = subfieldToString(strippedField.subfields[index]); // use normalized form\n if (seen[subfieldAsString]) {\n nvdebug(`Remove field-internal duplicate subfield ${subfieldToString(sf)}`, debugDev);\n field.collapsed = 1; // trigger punctuation reset\n return false;\n }\n //nvdebug(`identical subfield removal: Add ${subfieldAsString} to seen[]`, debugDev);\n seen[subfieldAsString] = subfieldAsString;\n return true;\n }\n /* eslint-enable */\n\n}\n"],"mappings":";;;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,4BAAA,GAAAH,OAAA;AACA,IAAAI,cAAA,GAAAJ,OAAA;AACA,IAAAK,YAAA,GAAAL,OAAA;AAAoD,SAAAE,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGpD;AACA,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,gFAAgF,CAAC;AACjH;AACA,MAAMC,QAAQ,GAAGF,KAAK,CAACG,MAAM,CAAC,KAAK,CAAC;AAE7B,SAASC,wCAAwCA,CAACC,MAAM,EAAE;EAC/DA,MAAM,CAACC,MAAM,CAACC,OAAO,CAACC,KAAK,IAAIC,6BAA6B,CAACD,KAAK,CAAC,CAAC;AACtE;AAEO,SAASC,6BAA6BA,CAACD,KAAK,EAAE;EACnD;EACA,IAAI,CAACA,KAAK,CAACE,SAAS,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACC,QAAQ,CAACH,KAAK,CAACI,GAAG,CAAC,EAAE;IACxE;EACF;EAEA,MAAMC,aAAa,GAAG,IAAAC,sDAAyB,EAACN,KAAK,CAAC,CAAC,CAAC;EACxD;EACA,IAAIO,IAAI,GAAG,CAAC,CAAC;EAEbP,KAAK,CAACE,SAAS,GAAGF,KAAK,CAACE,SAAS,CAACM,MAAM,CAAC,CAACC,EAAE,EAAEC,CAAC,KAAKC,aAAa,CAACF,EAAE,EAAEC,CAAC,CAAC,CAAC;EAEzE,IAAIV,KAAK,CAACY,SAAS,EAAE;IACnB,IAAAC,oCAAqB,EAACb,KAAK,CAAC;IAC5B,IAAAc,gCAAmB,EAACd,KAAK,CAAC;IAC1B,OAAOA,KAAK,CAACY,SAAS;EACxB;EAGA,SAASD,aAAaA,CAACF,EAAE,EAAEM,KAAK,EAAE;IAChC,MAAMC,gBAAgB,GAAG,IAAAC,uBAAgB,EAACZ,aAAa,CAACH,SAAS,CAACa,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAIR,IAAI,CAACS,gBAAgB,CAAC,EAAE;MAC1B,IAAAE,cAAO,EAAC,4CAA4C,IAAAD,uBAAgB,EAACR,EAAE,CAAC,EAAE,EAAEf,QAAQ,CAAC;MACrFM,KAAK,CAACY,SAAS,GAAG,CAAC,CAAC,CAAC;MACrB,OAAO,KAAK;IACd;IACA;IACAL,IAAI,CAACS,gBAAgB,CAAC,GAAGA,gBAAgB;IACzC,OAAO,IAAI;EACb;EACA;AAEF","ignoreList":[]}
1
+ {"version":3,"file":"removeDuplicateSubfields.js","names":["_utils","require","_debug","_interopRequireDefault","_normalizeFieldForComparison","_sortSubfields","_punctuation","e","__esModule","default","debug","createDebugLogger","debugDev","extend","recordRemoveDuplicateSubfieldsFromFields","record","fields","forEach","field","fieldRemoveDuplicateSubfields","subfields","includes","tag","strippedField","cloneAndRemovePunctuation","seen","filter","sf","i","notSeenBefore","collapsed","sortAdjacentSubfields","fieldFixPunctuation","index","subfieldAsString","subfieldToString","nvdebug"],"sources":["../../src/merge-fields/removeDuplicateSubfields.js"],"sourcesContent":["\nimport {nvdebug, subfieldToString} from '../utils.js';\nimport createDebugLogger from 'debug';\nimport {cloneAndRemovePunctuation} from '../normalizeFieldForComparison.js';\nimport {sortAdjacentSubfields} from '../sortSubfields';\nimport {fieldFixPunctuation} from '../punctuation2';\n\n\n// NB This should be moved and converted to a validator/fixer as well...\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:merge-fields:removeDuplicateSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport function recordRemoveDuplicateSubfieldsFromFields(record) {\n record.fields.forEach(field => fieldRemoveDuplicateSubfields(field));\n}\n\nexport function fieldRemoveDuplicateSubfields(field) {\n // Skip bad (382, 505) and risky (264 ...) stuff: 382$n, 505$r, others...\n if (!field.subfields || ['264', '300', '382', '505'].includes(field.tag)) {\n return;\n }\n\n const strippedField = cloneAndRemovePunctuation(field); // make punctuation-less version\n\n let seen = {};\n\n field.subfields = field.subfields.filter((sf, i) => notSeenBefore(sf, i));\n\n if (field.collapsed) {\n sortAdjacentSubfields(field);\n fieldFixPunctuation(field);\n delete field.collapsed;\n }\n\n\n function notSeenBefore(sf, index) {\n const subfieldAsString = subfieldToString(strippedField.subfields[index]); // use normalized form\n if (seen[subfieldAsString]) {\n nvdebug(`Remove field-internal duplicate subfield ${subfieldToString(sf)}`, debugDev);\n field.collapsed = 1; // trigger punctuation reset\n return false;\n }\n //nvdebug(`identical subfield removal: Add ${subfieldAsString} to seen[]`, debugDev);\n seen[subfieldAsString] = subfieldAsString;\n return true;\n }\n\n}\n"],"mappings":";;;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,4BAAA,GAAAH,OAAA;AACA,IAAAI,cAAA,GAAAJ,OAAA;AACA,IAAAK,YAAA,GAAAL,OAAA;AAAoD,SAAAE,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGpD;AACA,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,gFAAgF,CAAC;AACjH;AACA,MAAMC,QAAQ,GAAGF,KAAK,CAACG,MAAM,CAAC,KAAK,CAAC;AAE7B,SAASC,wCAAwCA,CAACC,MAAM,EAAE;EAC/DA,MAAM,CAACC,MAAM,CAACC,OAAO,CAACC,KAAK,IAAIC,6BAA6B,CAACD,KAAK,CAAC,CAAC;AACtE;AAEO,SAASC,6BAA6BA,CAACD,KAAK,EAAE;EACnD;EACA,IAAI,CAACA,KAAK,CAACE,SAAS,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACC,QAAQ,CAACH,KAAK,CAACI,GAAG,CAAC,EAAE;IACxE;EACF;EAEA,MAAMC,aAAa,GAAG,IAAAC,sDAAyB,EAACN,KAAK,CAAC,CAAC,CAAC;;EAExD,IAAIO,IAAI,GAAG,CAAC,CAAC;EAEbP,KAAK,CAACE,SAAS,GAAGF,KAAK,CAACE,SAAS,CAACM,MAAM,CAAC,CAACC,EAAE,EAAEC,CAAC,KAAKC,aAAa,CAACF,EAAE,EAAEC,CAAC,CAAC,CAAC;EAEzE,IAAIV,KAAK,CAACY,SAAS,EAAE;IACnB,IAAAC,oCAAqB,EAACb,KAAK,CAAC;IAC5B,IAAAc,gCAAmB,EAACd,KAAK,CAAC;IAC1B,OAAOA,KAAK,CAACY,SAAS;EACxB;EAGA,SAASD,aAAaA,CAACF,EAAE,EAAEM,KAAK,EAAE;IAChC,MAAMC,gBAAgB,GAAG,IAAAC,uBAAgB,EAACZ,aAAa,CAACH,SAAS,CAACa,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAIR,IAAI,CAACS,gBAAgB,CAAC,EAAE;MAC1B,IAAAE,cAAO,EAAC,4CAA4C,IAAAD,uBAAgB,EAACR,EAAE,CAAC,EAAE,EAAEf,QAAQ,CAAC;MACrFM,KAAK,CAACY,SAAS,GAAG,CAAC,CAAC,CAAC;MACrB,OAAO,KAAK;IACd;IACA;IACAL,IAAI,CAACS,gBAAgB,CAAC,GAAGA,gBAAgB;IACzC,OAAO,IAAI;EACb;AAEF","ignoreList":[]}
@@ -50,7 +50,7 @@ function normalizeForSamenessCheck(tag, subfieldCode, originalValue) {
50
50
  }
51
51
  function normalizePersonalName(originalValue) {
52
52
  // Use more readable "Forename Surname" format in comparisons:
53
- return originalValue.replace(/^([^,]+), ([^,]+)$/u, '$2 $1'); // eslint-disable-line prefer-named-capture-group
53
+ return originalValue.replace(/^([^,]+), ([^,]+)$/u, '$2 $1');
54
54
  }
55
55
  const sallittu506a = ['sallittu kaikenikäisille', 'sallittu', 's']; // downcased, without punctuation
56
56
  function normalize506a(originalValue) {
@@ -1 +1 @@
1
- {"version":3,"file":"worldKnowledge.js","names":["valueCarriesMeaning","tag","subfieldCode","value","match","normalizeForSamenessCheck","originalValue","includes","normalizePersonalName","normalizeEditionStatement","normalize506a","normalizeOriginalVersionNoteIntroductoryPhrase","replace","sallittu506a","introductoryPhrasesMeaning1","nth"],"sources":["../../src/merge-fields/worldKnowledge.js"],"sourcesContent":["//import {nvdebug} from '../utils';\n\nexport function valueCarriesMeaning(tag, subfieldCode, value) {\n // Some data is pretty meaningless and as meaningless is pretty close to nothing, this meaningless data should no prevent merge.\n // The list below is incomples (swedish translations etc)\n if (tag === '260' || tag === '264') {\n // We drop these, instead of normalizing, as KV does not put this information in place...\n if (subfieldCode === 'a') {\n if (value.match(/^[^a-z]*(?:Kustannuspaikka tuntematon|S\\.l)[^a-z]*$/ui)) {\n return false;\n }\n }\n if (subfieldCode === 'b') {\n if (value.match(/^[^a-z]*(?:Kustantaja tuntematon|S\\.n)[^a-z]*$/ui)) {\n return false;\n }\n }\n return true;\n }\n return true;\n}\n\nexport function normalizeForSamenessCheck(tag, subfieldCode, originalValue) {\n // NB! These work only for non-repeatable subfields!\n // Repeatable subfields are currently handled in mergeSubfields.js. Only non-repeatable subfields block field merge,\n // (This split is suboptiomal... Minimum fix: make this disctinction cleaner...)\n if (subfieldCode === 'a' && ['100', '600', '700', '800'].includes(tag)) {\n return normalizePersonalName(originalValue);\n }\n\n // NB! originalValue should already be lowercased, stripped on initial '[' chars and postpunctuation.\n if (tag === '250' && subfieldCode === 'a') {\n return normalizeEditionStatement(originalValue);\n }\n\n // 506 - Restrictions on Access Note (R), $a - Terms governing access (NR)\n if (tag === '506' && subfieldCode === 'a') {\n return normalize506a(originalValue);\n }\n\n if (tag === '534' && subfieldCode === 'p') {\n return normalizeOriginalVersionNoteIntroductoryPhrase(originalValue);\n }\n\n return originalValue;\n}\n\n\nfunction normalizePersonalName(originalValue) {\n // Use more readable \"Forename Surname\" format in comparisons:\n return originalValue.replace(/^([^,]+), ([^,]+)$/u, '$2 $1'); // eslint-disable-line prefer-named-capture-group\n}\n\nconst sallittu506a = ['sallittu kaikenikäisille', 'sallittu', 's']; // downcased, without punctuation\nfunction normalize506a(originalValue) {\n if (sallittu506a.includes(originalValue)) {\n return sallittu506a[0];\n }\n return originalValue;\n}\n\nconst introductoryPhrasesMeaning1 = ['alkuperäinen', 'alkuperäisen julkaisutiedot', 'alun perin julkaistu', 'alunperin julkaistu'];\nfunction normalizeOriginalVersionNoteIntroductoryPhrase(originalValue) {\n // MELKEHITYS-1935-ish:\n if (introductoryPhrasesMeaning1.includes(originalValue)) {\n return introductoryPhrasesMeaning1[0];\n }\n\n return originalValue;\n}\n\nfunction normalizeEditionStatement(originalValue) {\n const value = originalValue;\n\n // As normalization tries to translate things info Finnish, use this for similarity check only!\n if (value.match(/^[1-9][0-9]*(?:\\.|:a|nd|rd|st|th) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n const nth = value.replace(/[^0-9].*$/u, '');\n return `${nth}. painos`;\n }\n\n // Quick and dirty fix for\n if (value.match(/^[1-9][0-9]*(?:\\.|:a|nd|rd|st|th)(?: förnyade|,? rev\\.| uud\\.| uudistettu) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n const nth = value.replace(/[^0-9].*$/u, '');\n return `${nth}. uudistettu painos`;\n }\n\n if (value.match(/^(?:First|Första|Ensimmäinen) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `1. painos`;\n }\n\n if (value.match(/^(?:Andra|Second|Toinen) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `2. painos`;\n }\n\n if (value.match(/^(?:Kolmas|Third|Tredje) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `3. painos`;\n }\n\n if (value.match(/^(?:Fourth|Fjärde|Neljäs) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `4. painos`;\n }\n\n return originalValue;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"worldKnowledge.js","names":["valueCarriesMeaning","tag","subfieldCode","value","match","normalizeForSamenessCheck","originalValue","includes","normalizePersonalName","normalizeEditionStatement","normalize506a","normalizeOriginalVersionNoteIntroductoryPhrase","replace","sallittu506a","introductoryPhrasesMeaning1","nth"],"sources":["../../src/merge-fields/worldKnowledge.js"],"sourcesContent":["//import {nvdebug} from '../utils';\n\nexport function valueCarriesMeaning(tag, subfieldCode, value) {\n // Some data is pretty meaningless and as meaningless is pretty close to nothing, this meaningless data should no prevent merge.\n // The list below is incomples (swedish translations etc)\n if (tag === '260' || tag === '264') {\n // We drop these, instead of normalizing, as KV does not put this information in place...\n if (subfieldCode === 'a') {\n if (value.match(/^[^a-z]*(?:Kustannuspaikka tuntematon|S\\.l)[^a-z]*$/ui)) {\n return false;\n }\n }\n if (subfieldCode === 'b') {\n if (value.match(/^[^a-z]*(?:Kustantaja tuntematon|S\\.n)[^a-z]*$/ui)) {\n return false;\n }\n }\n return true;\n }\n return true;\n}\n\nexport function normalizeForSamenessCheck(tag, subfieldCode, originalValue) {\n // NB! These work only for non-repeatable subfields!\n // Repeatable subfields are currently handled in mergeSubfields.js. Only non-repeatable subfields block field merge,\n // (This split is suboptiomal... Minimum fix: make this disctinction cleaner...)\n if (subfieldCode === 'a' && ['100', '600', '700', '800'].includes(tag)) {\n return normalizePersonalName(originalValue);\n }\n\n // NB! originalValue should already be lowercased, stripped on initial '[' chars and postpunctuation.\n if (tag === '250' && subfieldCode === 'a') {\n return normalizeEditionStatement(originalValue);\n }\n\n // 506 - Restrictions on Access Note (R), $a - Terms governing access (NR)\n if (tag === '506' && subfieldCode === 'a') {\n return normalize506a(originalValue);\n }\n\n if (tag === '534' && subfieldCode === 'p') {\n return normalizeOriginalVersionNoteIntroductoryPhrase(originalValue);\n }\n\n return originalValue;\n}\n\n\nfunction normalizePersonalName(originalValue) {\n // Use more readable \"Forename Surname\" format in comparisons:\n return originalValue.replace(/^([^,]+), ([^,]+)$/u, '$2 $1');\n}\n\nconst sallittu506a = ['sallittu kaikenikäisille', 'sallittu', 's']; // downcased, without punctuation\nfunction normalize506a(originalValue) {\n if (sallittu506a.includes(originalValue)) {\n return sallittu506a[0];\n }\n return originalValue;\n}\n\nconst introductoryPhrasesMeaning1 = ['alkuperäinen', 'alkuperäisen julkaisutiedot', 'alun perin julkaistu', 'alunperin julkaistu'];\nfunction normalizeOriginalVersionNoteIntroductoryPhrase(originalValue) {\n // MELKEHITYS-1935-ish:\n if (introductoryPhrasesMeaning1.includes(originalValue)) {\n return introductoryPhrasesMeaning1[0];\n }\n\n return originalValue;\n}\n\nfunction normalizeEditionStatement(originalValue) {\n const value = originalValue;\n\n // As normalization tries to translate things info Finnish, use this for similarity check only!\n if (value.match(/^[1-9][0-9]*(?:\\.|:a|nd|rd|st|th) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n const nth = value.replace(/[^0-9].*$/u, '');\n return `${nth}. painos`;\n }\n\n // Quick and dirty fix for\n if (value.match(/^[1-9][0-9]*(?:\\.|:a|nd|rd|st|th)(?: förnyade|,? rev\\.| uud\\.| uudistettu) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n const nth = value.replace(/[^0-9].*$/u, '');\n return `${nth}. uudistettu painos`;\n }\n\n if (value.match(/^(?:First|Första|Ensimmäinen) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `1. painos`;\n }\n\n if (value.match(/^(?:Andra|Second|Toinen) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `2. painos`;\n }\n\n if (value.match(/^(?:Kolmas|Third|Tredje) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `3. painos`;\n }\n\n if (value.match(/^(?:Fourth|Fjärde|Neljäs) (?:ed\\.?|edition|p\\.?|painos|uppl\\.?|upplagan)[.\\]]*$/ui)) {\n return `4. painos`;\n }\n\n return originalValue;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -132,8 +132,6 @@ function mergeLisapainokset(record) {
132
132
  if (relevantFields.length < 2) {
133
133
  return;
134
134
  }
135
-
136
- /* eslint-disable */
137
135
  const collapsedArray = extractAllPrintData(relevantFields);
138
136
  if (collapsedArray.length === 0) {
139
137
  return;
@@ -147,6 +145,5 @@ function mergeLisapainokset(record) {
147
145
  return;
148
146
  }
149
147
  });
150
- /* eslint-enable */
151
148
  }
152
149
  //# sourceMappingURL=mergeField500Lisapainokset.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mergeField500Lisapainokset.js","names":["_default","description","validate","fix","record","res","message","valid","mergeLisapainokset","relevantFields","getRelevantFields","length","printData","extractAllPrintData","fields","filter","field","validLisapainosField","tag","subfields","code","value","match","fieldToPrintsString","replace","printPreference","getPrintPreference","findIndex","pp","mergePrintData","value1","value2","index1","print1","year1","split","index2","print2","year2","betterIndex","betterPrint","getBetterPrint","betterYear","getBetterYear","y1","y2","i1","i2","allPrintData","i","j","fieldsPrintData","currPrintData","printIndex","undefined","mergedPrintData","p","collapsedArray","content","join","forEach","index","removeField"],"sources":["../src/mergeField500Lisapainokset.js"],"sourcesContent":["export default function () {\n\n return {\n description: 'Merge 500 $a Lisäpainokset fields',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n mergeLisapainokset(record);\n return res;\n }\n\n function validate(record) {\n const relevantFields = getRelevantFields(record);\n if (relevantFields.length < 2) {\n return {message: [], 'valid': true}; // No action required\n }\n\n const printData = extractAllPrintData(relevantFields);\n if (printData.length === 0) {\n return {message: ['There are issues, but the fixer can not fix them!'], 'valid': false}; // No action required\n }\n\n return {message: [`Fixer can merge ${relevantFields.length} 500 $a Lisäpainokset fields into one`], 'valid': false};\n }\n}\n\n\nfunction getRelevantFields(record) {\n return record.fields.filter(field => validLisapainosField(field));\n}\n\nfunction validLisapainosField(field) {\n // We are only interested in field 500 with a lone $a subfield.\n // Especially $9 FENNI<KEEP> should not be merged!\n if (field.tag !== '500' || field.subfields.length !== 1 || field.subfields[0].code !== 'a') {\n return false;\n }\n return field.subfields[0].value.match(/^(?:Lisäpainokset|Lisäpainos): (?:[1-9][0-9]*\\. (?:p\\.|painos|uppl\\.) [0-9]+\\.)(?: - [1-9][0-9]*\\. (?:p\\.|painos|uppl\\.) \\[?[0-9]+\\]?\\.)*$/u);\n}\n\nfunction fieldToPrintsString(field) {\n // Could this just be something on the lines of s/^\\S+ // ?\n return field.subfields[0].value.replace(/^(?:Lisäpainokset|Lisäpainos): /u, '').replace(/\\.$/u, '');\n}\n\nconst printPreference = ['painos', 'p.', 'upplaga', 'uppl.'];\nfunction getPrintPreference(value) {\n return printPreference.findIndex(pp => pp === value);\n}\n\nfunction mergePrintData(value1, value2) {\n const [index1, print1, year1] = value1.split(' ');\n const [index2, print2, year2] = value2.split(' ');\n\n const betterIndex = index1 ? index1 : index2; // just to cheat eslint...\n\n // merge print1 and print2\n const betterPrint = getBetterPrint(print1, print2);\n if (!betterPrint) {\n return null;\n }\n\n const betterYear = getBetterYear(year1, year2);\n if (!betterYear) {\n return null;\n }\n\n return `${betterIndex} ${betterPrint} ${betterYear}`;\n\n function getBetterYear(y1, y2) {\n if (y1 === y2 || y2 === `[${y1}]`) {\n return y1;\n }\n if (y1 === `[${y2}]`) {\n return y2;\n }\n return null;\n }\n\n function getBetterPrint(print1, print2) {\n if (print1 === print2) {\n return print1;\n }\n\n const i1 = getPrintPreference(print1);\n const i2 = getPrintPreference(print2);\n if (i1 === -1 || i2 === -1) {\n return null;\n }\n if (i1 <= i2) {\n return printPreference[i1];\n }\n return printPreference[i2];\n }\n\n}\n\n\nfunction extractAllPrintData(relevantFields) {\n /* eslint-disable */\n // Gather data about 500 $a Lisäpainokset.*\n let allPrintData = [];\n let i;\n let j;\n for (i=0; i < relevantFields.length; i++) {\n const value = fieldToPrintsString(relevantFields[i]);\n const fieldsPrintData = value.split('. - ');\n for (j=0; j < fieldsPrintData.length; j++) {\n let currPrintData = fieldsPrintData[j];\n // Example value: \"2. p. 2020\"\n const [ printIndex ] = currPrintData.split('.');\n if (allPrintData[printIndex] !== undefined) {\n if (allPrintData[printIndex] !== currPrintData ) {\n const mergedPrintData = mergePrintData(allPrintData[printIndex], currPrintData);\n if (!mergedPrintData) {\n return []; // reason for for-loops: exit function from within nested loops\n }\n currPrintData = mergedPrintData;\n }\n }\n allPrintData[printIndex] = currPrintData;\n }\n };\n return allPrintData.filter(p => p !== undefined);\n}\n\n\nexport function mergeLisapainokset(record) {\n const relevantFields = getRelevantFields(record);\n if (relevantFields.length < 2) {\n return;\n }\n\n /* eslint-disable */\n const collapsedArray = extractAllPrintData(relevantFields);\n if (collapsedArray.length === 0) {\n return;\n }\n\n const content = \"Lisäpainokset: \" + collapsedArray.join('. - ') + \".\";\n\n relevantFields[0].subfields[0].value = content; // Keep the place\n\n relevantFields.forEach((field, index) => {\n if (index > 0) {\n record.removeField(field);\n return;\n }\n });\n /* eslint-enable */\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mergeField500Lisapainokset.js","names":["_default","description","validate","fix","record","res","message","valid","mergeLisapainokset","relevantFields","getRelevantFields","length","printData","extractAllPrintData","fields","filter","field","validLisapainosField","tag","subfields","code","value","match","fieldToPrintsString","replace","printPreference","getPrintPreference","findIndex","pp","mergePrintData","value1","value2","index1","print1","year1","split","index2","print2","year2","betterIndex","betterPrint","getBetterPrint","betterYear","getBetterYear","y1","y2","i1","i2","allPrintData","i","j","fieldsPrintData","currPrintData","printIndex","undefined","mergedPrintData","p","collapsedArray","content","join","forEach","index","removeField"],"sources":["../src/mergeField500Lisapainokset.js"],"sourcesContent":["export default function () {\n\n return {\n description: 'Merge 500 $a Lisäpainokset fields',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n mergeLisapainokset(record);\n return res;\n }\n\n function validate(record) {\n const relevantFields = getRelevantFields(record);\n if (relevantFields.length < 2) {\n return {message: [], 'valid': true}; // No action required\n }\n\n const printData = extractAllPrintData(relevantFields);\n if (printData.length === 0) {\n return {message: ['There are issues, but the fixer can not fix them!'], 'valid': false}; // No action required\n }\n\n return {message: [`Fixer can merge ${relevantFields.length} 500 $a Lisäpainokset fields into one`], 'valid': false};\n }\n}\n\n\nfunction getRelevantFields(record) {\n return record.fields.filter(field => validLisapainosField(field));\n}\n\nfunction validLisapainosField(field) {\n // We are only interested in field 500 with a lone $a subfield.\n // Especially $9 FENNI<KEEP> should not be merged!\n if (field.tag !== '500' || field.subfields.length !== 1 || field.subfields[0].code !== 'a') {\n return false;\n }\n return field.subfields[0].value.match(/^(?:Lisäpainokset|Lisäpainos): (?:[1-9][0-9]*\\. (?:p\\.|painos|uppl\\.) [0-9]+\\.)(?: - [1-9][0-9]*\\. (?:p\\.|painos|uppl\\.) \\[?[0-9]+\\]?\\.)*$/u);\n}\n\nfunction fieldToPrintsString(field) {\n // Could this just be something on the lines of s/^\\S+ // ?\n return field.subfields[0].value.replace(/^(?:Lisäpainokset|Lisäpainos): /u, '').replace(/\\.$/u, '');\n}\n\nconst printPreference = ['painos', 'p.', 'upplaga', 'uppl.'];\nfunction getPrintPreference(value) {\n return printPreference.findIndex(pp => pp === value);\n}\n\nfunction mergePrintData(value1, value2) {\n const [index1, print1, year1] = value1.split(' ');\n const [index2, print2, year2] = value2.split(' ');\n\n const betterIndex = index1 ? index1 : index2; // just to cheat eslint...\n\n // merge print1 and print2\n const betterPrint = getBetterPrint(print1, print2);\n if (!betterPrint) {\n return null;\n }\n\n const betterYear = getBetterYear(year1, year2);\n if (!betterYear) {\n return null;\n }\n\n return `${betterIndex} ${betterPrint} ${betterYear}`;\n\n function getBetterYear(y1, y2) {\n if (y1 === y2 || y2 === `[${y1}]`) {\n return y1;\n }\n if (y1 === `[${y2}]`) {\n return y2;\n }\n return null;\n }\n\n function getBetterPrint(print1, print2) {\n if (print1 === print2) {\n return print1;\n }\n\n const i1 = getPrintPreference(print1);\n const i2 = getPrintPreference(print2);\n if (i1 === -1 || i2 === -1) {\n return null;\n }\n if (i1 <= i2) {\n return printPreference[i1];\n }\n return printPreference[i2];\n }\n\n}\n\n\nfunction extractAllPrintData(relevantFields) {\n /* eslint-disable */\n // Gather data about 500 $a Lisäpainokset.*\n let allPrintData = [];\n let i;\n let j;\n for (i=0; i < relevantFields.length; i++) {\n const value = fieldToPrintsString(relevantFields[i]);\n const fieldsPrintData = value.split('. - ');\n for (j=0; j < fieldsPrintData.length; j++) {\n let currPrintData = fieldsPrintData[j];\n // Example value: \"2. p. 2020\"\n const [ printIndex ] = currPrintData.split('.');\n if (allPrintData[printIndex] !== undefined) {\n if (allPrintData[printIndex] !== currPrintData ) {\n const mergedPrintData = mergePrintData(allPrintData[printIndex], currPrintData);\n if (!mergedPrintData) {\n return []; // reason for for-loops: exit function from within nested loops\n }\n currPrintData = mergedPrintData;\n }\n }\n allPrintData[printIndex] = currPrintData;\n }\n };\n return allPrintData.filter(p => p !== undefined);\n}\n\n\nexport function mergeLisapainokset(record) {\n const relevantFields = getRelevantFields(record);\n if (relevantFields.length < 2) {\n return;\n }\n\n const collapsedArray = extractAllPrintData(relevantFields);\n if (collapsedArray.length === 0) {\n return;\n }\n\n const content = \"Lisäpainokset: \" + collapsedArray.join('. - ') + \".\";\n\n relevantFields[0].subfields[0].value = content; // Keep the place\n\n relevantFields.forEach((field, index) => {\n if (index > 0) {\n record.removeField(field);\n return;\n }\n });\n}\n"],"mappings":"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","ignoreList":[]}
@@ -43,7 +43,7 @@ function _default() {
43
43
  const res = {
44
44
  message: msg
45
45
  };
46
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
46
+ res.valid = !(res.message.length >= 1);
47
47
  return res;
48
48
  }
49
49
  }
@@ -56,7 +56,7 @@ function createNormalizedClone(field) {
56
56
  function createNormalizedCloneWithoutRelatorTerms(field) {
57
57
  const clonedField = createNormalizedClone(field);
58
58
  // Remove relator terms $e subfi:
59
- clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e'); // eslint-disable-line functional/immutable-data
59
+ clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e');
60
60
  return clonedField;
61
61
  }
62
62
  function getRelatorTermStrings(relatorTermSubfieldCode, field) {
@@ -78,7 +78,7 @@ function copyRelatorSubfields(fromField, toField) {
78
78
  newRelatorTerms.forEach(term => toField.subfields.push({
79
79
  code: relatorTermSubfieldCode,
80
80
  value: term
81
- })); // eslint-disable-line functional/immutable-data
81
+ })); // eslint-disable-line array-callback-return
82
82
  }
83
83
  function mergeRelatorTermFields(record, fix = false) {
84
84
  /* eslint-disable */
@@ -1 +1 @@
1
- {"version":3,"file":"mergeRelatorTermFields.js","names":["_clone","_interopRequireDefault","require","_punctuation","_utils","_sortSubfields","_sortRelatorTerms","e","__esModule","default","_default","description","validate","fix","record","msg","mergeRelatorTermFields","res","message","valid","length","createNormalizedClone","field","clonedField","clone","fieldStripPunctuation","createNormalizedCloneWithoutRelatorTerms","subfields","filter","sf","code","getRelatorTermStrings","relatorTermSubfieldCode","map","value","extractAddableRelatorTerms","fromField","toField","tagToRelatorTermSubfieldCode","tag","normalizedFromFieldRelatorTerms","normalizedToFieldRelatorTerms","str","includes","copyRelatorSubfields","newRelatorTerms","forEach","term","push","fields","get","result","comparisonFieldsAsString","f","fieldToString","nvdebug","i","currField","deleted","j","mergableField","substring","fieldFixPunctuation","sortAdjacentSubfields","sortAdjacentRelatorTerms"],"sources":["../src/mergeRelatorTermFields.js"],"sourcesContent":["// Merge author/agent fields\n//\n// Rationale: Same author can appear in one 1XX and multiple 7XX fields having only different $e subfields.\n// These fields can be merged (and $e-subfields can then be sorted)...\n//\n// Author(s): Nicholas Volk\n\n\nimport clone from 'clone';\nimport {fieldFixPunctuation, fieldStripPunctuation} from './punctuation2';\nimport {fieldToString, nvdebug} from './utils';\nimport {sortAdjacentSubfields} from './sortSubfields';\nimport {sortAdjacentRelatorTerms, tagToRelatorTermSubfieldCode} from './sortRelatorTerms';\n//import createDebugLogger from 'debug';\n/*\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:mergeRelatorTermFields');\n//const debugData = debug.extend('data');\n*/\n\nexport default function () {\n\n return {\n description: 'Merge author fields that only differ in $e relator terms',\n validate, fix\n };\n\n function fix(record) {\n const msg = mergeRelatorTermFields(record, true);\n const res = {message: msg, fix: msg, valid: true};\n return res;\n }\n\n function validate(record) {\n const msg = mergeRelatorTermFields(record, false);\n const res = {message: msg};\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nfunction createNormalizedClone(field) {\n const clonedField = clone(field);\n // Normalize\n fieldStripPunctuation(clonedField);\n return clonedField;\n}\n\nfunction createNormalizedCloneWithoutRelatorTerms(field) {\n const clonedField = createNormalizedClone(field);\n // Remove relator terms $e subfi:\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e'); // eslint-disable-line functional/immutable-data\n return clonedField;\n}\n\nfunction getRelatorTermStrings(relatorTermSubfieldCode, field) {\n return field.subfields.filter(sf => sf.code === relatorTermSubfieldCode).map(sf => sf.value);\n\n}\n\nfunction extractAddableRelatorTerms(fromField, toField) {\n const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);\n const normalizedFromFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, fromField);\n if (normalizedFromFieldRelatorTerms.length === 0) {\n return [];\n }\n // Remove values that already exist:\n const normalizedToFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, toField);\n return normalizedFromFieldRelatorTerms.filter(str => !normalizedToFieldRelatorTerms.includes(str));\n}\n\n\nfunction copyRelatorSubfields(fromField, toField) {\n const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);\n const newRelatorTerms = extractAddableRelatorTerms(fromField, toField);\n\n newRelatorTerms.forEach(term => toField.subfields.push({code: relatorTermSubfieldCode, value: term})); // eslint-disable-line functional/immutable-data\n\n}\n\nfunction mergeRelatorTermFields(record, fix = false) {\n /* eslint-disable */\n // NV: 111/711, 751 and 752 where so rare that I did not add them here. Can't remember why I skipped 6XX and 8XX...\n let fields = record.get('(?:[17][01]0|720)'); \n let result = [];\n const comparisonFieldsAsString = fields.map(f => fieldToString(createNormalizedCloneWithoutRelatorTerms(f)));\n\n nvdebug(`mergeRelatorTermFields(): ${fields.length} cand field(s) found`);\n for(let i=0; i < fields.length-1; i++) {\n let currField = fields[i];\n if (currField.deleted) {\n continue;\n }\n nvdebug(`RT: Trying to pair ${comparisonFieldsAsString[i]}/${i}`);\n for (let j=i+1; j < fields.length; j++) {\n nvdebug(` Compare with ${comparisonFieldsAsString[j]}/${j}`);\n let mergableField = fields[j];\n // Skip 1/7 from 1XX/7XX for similarity check:\n if ( comparisonFieldsAsString[i].substring(1) !== comparisonFieldsAsString[j].substring(1)) {\n nvdebug(\" NOT PAIR\");\n continue;\n }\n if (mergableField.deleted) {\n nvdebug(\" DELETED\");\n continue;\n }\n const str = `MERGE RELATOR TERM FIELD: ${fieldToString(mergableField)}`;\n nvdebug(str);\n\n if(!result.includes(str)) {\n result.push(str)\n }\n\n if (fix) {\n mergableField.deleted = 1;\n copyRelatorSubfields(mergableField, currField);\n fieldFixPunctuation(currField);\n sortAdjacentSubfields(currField); // Put the added $e subfield to proper places.\n sortAdjacentRelatorTerms(currField); // Sort $e subfields with each other\n fieldFixPunctuation(currField);\n\n }\n }\n }\n\n if(!fix) {\n fields.forEach(f => delete f.deleted);\n }\n\n record.fields = record.fields.filter(f => !f.deleted);\n /* eslint-enable */\n return result;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mergeRelatorTermFields.js","names":["_clone","_interopRequireDefault","require","_punctuation","_utils","_sortSubfields","_sortRelatorTerms","e","__esModule","default","_default","description","validate","fix","record","msg","mergeRelatorTermFields","res","message","valid","length","createNormalizedClone","field","clonedField","clone","fieldStripPunctuation","createNormalizedCloneWithoutRelatorTerms","subfields","filter","sf","code","getRelatorTermStrings","relatorTermSubfieldCode","map","value","extractAddableRelatorTerms","fromField","toField","tagToRelatorTermSubfieldCode","tag","normalizedFromFieldRelatorTerms","normalizedToFieldRelatorTerms","str","includes","copyRelatorSubfields","newRelatorTerms","forEach","term","push","fields","get","result","comparisonFieldsAsString","f","fieldToString","nvdebug","i","currField","deleted","j","mergableField","substring","fieldFixPunctuation","sortAdjacentSubfields","sortAdjacentRelatorTerms"],"sources":["../src/mergeRelatorTermFields.js"],"sourcesContent":["// Merge author/agent fields\n//\n// Rationale: Same author can appear in one 1XX and multiple 7XX fields having only different $e subfields.\n// These fields can be merged (and $e-subfields can then be sorted)...\n//\n// Author(s): Nicholas Volk\n\n\nimport clone from 'clone';\nimport {fieldFixPunctuation, fieldStripPunctuation} from './punctuation2';\nimport {fieldToString, nvdebug} from './utils';\nimport {sortAdjacentSubfields} from './sortSubfields';\nimport {sortAdjacentRelatorTerms, tagToRelatorTermSubfieldCode} from './sortRelatorTerms';\n//import createDebugLogger from 'debug';\n/*\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:mergeRelatorTermFields');\n//const debugData = debug.extend('data');\n*/\n\nexport default function () {\n\n return {\n description: 'Merge author fields that only differ in $e relator terms',\n validate, fix\n };\n\n function fix(record) {\n const msg = mergeRelatorTermFields(record, true);\n const res = {message: msg, fix: msg, valid: true};\n return res;\n }\n\n function validate(record) {\n const msg = mergeRelatorTermFields(record, false);\n const res = {message: msg};\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\nfunction createNormalizedClone(field) {\n const clonedField = clone(field);\n // Normalize\n fieldStripPunctuation(clonedField);\n return clonedField;\n}\n\nfunction createNormalizedCloneWithoutRelatorTerms(field) {\n const clonedField = createNormalizedClone(field);\n // Remove relator terms $e subfi:\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e');\n return clonedField;\n}\n\nfunction getRelatorTermStrings(relatorTermSubfieldCode, field) {\n return field.subfields.filter(sf => sf.code === relatorTermSubfieldCode).map(sf => sf.value);\n\n}\n\nfunction extractAddableRelatorTerms(fromField, toField) {\n const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);\n const normalizedFromFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, fromField);\n if (normalizedFromFieldRelatorTerms.length === 0) {\n return [];\n }\n // Remove values that already exist:\n const normalizedToFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, toField);\n return normalizedFromFieldRelatorTerms.filter(str => !normalizedToFieldRelatorTerms.includes(str));\n}\n\n\nfunction copyRelatorSubfields(fromField, toField) {\n const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);\n const newRelatorTerms = extractAddableRelatorTerms(fromField, toField);\n\n newRelatorTerms.forEach(term => toField.subfields.push({code: relatorTermSubfieldCode, value: term})); // eslint-disable-line array-callback-return\n\n}\n\nfunction mergeRelatorTermFields(record, fix = false) {\n /* eslint-disable */\n // NV: 111/711, 751 and 752 where so rare that I did not add them here. Can't remember why I skipped 6XX and 8XX...\n let fields = record.get('(?:[17][01]0|720)'); \n let result = [];\n const comparisonFieldsAsString = fields.map(f => fieldToString(createNormalizedCloneWithoutRelatorTerms(f)));\n\n nvdebug(`mergeRelatorTermFields(): ${fields.length} cand field(s) found`);\n for(let i=0; i < fields.length-1; i++) {\n let currField = fields[i];\n if (currField.deleted) {\n continue;\n }\n nvdebug(`RT: Trying to pair ${comparisonFieldsAsString[i]}/${i}`);\n for (let j=i+1; j < fields.length; j++) {\n nvdebug(` Compare with ${comparisonFieldsAsString[j]}/${j}`);\n let mergableField = fields[j];\n // Skip 1/7 from 1XX/7XX for similarity check:\n if ( comparisonFieldsAsString[i].substring(1) !== comparisonFieldsAsString[j].substring(1)) {\n nvdebug(\" NOT PAIR\");\n continue;\n }\n if (mergableField.deleted) {\n nvdebug(\" DELETED\");\n continue;\n }\n const str = `MERGE RELATOR TERM FIELD: ${fieldToString(mergableField)}`;\n nvdebug(str);\n\n if(!result.includes(str)) {\n result.push(str)\n }\n\n if (fix) {\n mergableField.deleted = 1;\n copyRelatorSubfields(mergableField, currField);\n fieldFixPunctuation(currField);\n sortAdjacentSubfields(currField); // Put the added $e subfield to proper places.\n sortAdjacentRelatorTerms(currField); // Sort $e subfields with each other\n fieldFixPunctuation(currField);\n\n }\n }\n }\n\n if(!fix) {\n fields.forEach(f => delete f.deleted);\n }\n\n record.fields = record.fields.filter(f => !f.deleted);\n /* eslint-enable */\n return result;\n}\n"],"mappings":"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","ignoreList":[]}