@natlibfi/marc-record-validators-melinda 11.1.1 → 11.2.0

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 (272) hide show
  1. package/dist/addMissingField041.js +93 -0
  2. package/dist/addMissingField041.js.map +1 -0
  3. package/dist/addMissingField041.spec.js +45 -0
  4. package/dist/addMissingField041.spec.js.map +1 -0
  5. package/dist/cyrillux-usemarcon-replacement.js +16 -13
  6. package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
  7. package/dist/punctuation2.js +26 -19
  8. package/dist/punctuation2.js.map +1 -1
  9. package/dist/sortSubfields.js +1 -0
  10. package/dist/sortSubfields.js.map +1 -1
  11. package/package.json +5 -5
  12. package/src/addMissingField041.js +74 -0
  13. package/src/addMissingField041.spec.js +46 -0
  14. package/src/cyrillux-usemarcon-replacement.js +28 -5
  15. package/src/punctuation2.js +19 -20
  16. package/src/sortSubfields.js +1 -0
  17. package/test-fixtures/addMissingField041/f01/expectedResult.json +7 -0
  18. package/test-fixtures/addMissingField041/f01/metadata.json +5 -0
  19. package/test-fixtures/addMissingField041/f01/record.json +6 -0
  20. package/test-fixtures/addMissingField041/f02/expectedResult.json +8 -0
  21. package/test-fixtures/addMissingField041/f02/metadata.json +6 -0
  22. package/test-fixtures/addMissingField041/f02/record.json +6 -0
  23. package/test-fixtures/addMissingField041/f03/expectedResult.json +8 -0
  24. package/test-fixtures/addMissingField041/f03/metadata.json +6 -0
  25. package/test-fixtures/addMissingField041/f03/record.json +7 -0
  26. package/test-fixtures/addMissingField041/f04/expectedResult.json +8 -0
  27. package/test-fixtures/addMissingField041/f04/metadata.json +5 -0
  28. package/test-fixtures/addMissingField041/f04/record.json +6 -0
  29. package/test-fixtures/addMissingField041/v01/expectedResult.json +5 -0
  30. package/test-fixtures/addMissingField041/v01/metadata.json +5 -0
  31. package/test-fixtures/addMissingField041/v01/record.json +6 -0
  32. package/test-fixtures/addMissingField041/v02/expectedResult.json +6 -0
  33. package/test-fixtures/addMissingField041/v02/metadata.json +6 -0
  34. package/test-fixtures/addMissingField041/v02/record.json +6 -0
  35. package/test-fixtures/addMissingField336/01/metadata.json +0 -1
  36. package/test-fixtures/addMissingField336/02/metadata.json +0 -1
  37. package/test-fixtures/addMissingField336/cod/metadata.json +0 -1
  38. package/test-fixtures/addMissingField336/cop/metadata.json +0 -1
  39. package/test-fixtures/addMissingField336/cop2/metadata.json +0 -1
  40. package/test-fixtures/addMissingField336/crf/metadata.json +0 -1
  41. package/test-fixtures/addMissingField336/cri/metadata.json +0 -1
  42. package/test-fixtures/addMissingField336/crt/metadata.json +0 -1
  43. package/test-fixtures/addMissingField336/f01/metadata.json +0 -1
  44. package/test-fixtures/addMissingField336/f02/metadata.json +0 -1
  45. package/test-fixtures/addMissingField336/mixed2txt/metadata.json +0 -1
  46. package/test-fixtures/addMissingField336/mixed2xxx/metadata.json +0 -1
  47. package/test-fixtures/addMissingField336/ntm/metadata.json +0 -1
  48. package/test-fixtures/addMissingField336/snd/metadata.json +0 -1
  49. package/test-fixtures/addMissingField336/spw/metadata.json +0 -1
  50. package/test-fixtures/addMissingField336/spw2/metadata.json +0 -1
  51. package/test-fixtures/addMissingField336/spw_txt/metadata.json +0 -1
  52. package/test-fixtures/addMissingField336/sti/metadata.json +0 -1
  53. package/test-fixtures/addMissingField336/sti_projected/metadata.json +0 -1
  54. package/test-fixtures/addMissingField336/tci/metadata.json +0 -1
  55. package/test-fixtures/addMissingField336/tcm/metadata.json +0 -1
  56. package/test-fixtures/addMissingField336/tdf/metadata.json +0 -1
  57. package/test-fixtures/addMissingField336/tdi/metadata.json +0 -1
  58. package/test-fixtures/addMissingField336/txt/metadata.json +0 -1
  59. package/test-fixtures/addMissingField336/zzz/metadata.json +0 -1
  60. package/test-fixtures/addMissingField337/c1/metadata.json +0 -1
  61. package/test-fixtures/addMissingField337/g1/metadata.json +0 -1
  62. package/test-fixtures/addMissingField337/n1/metadata.json +0 -1
  63. package/test-fixtures/addMissingField337/no_action_required/metadata.json +0 -1
  64. package/test-fixtures/addMissingField337/p1/metadata.json +0 -1
  65. package/test-fixtures/addMissingField337/validate_x1/metadata.json +0 -1
  66. package/test-fixtures/addMissingField338/cb/metadata.json +0 -1
  67. package/test-fixtures/addMissingField338/cd/metadata.json +0 -1
  68. package/test-fixtures/addMissingField338/ck/metadata.json +0 -1
  69. package/test-fixtures/addMissingField338/cr/metadata.json +0 -1
  70. package/test-fixtures/addMissingField338/cr2/metadata.json +0 -1
  71. package/test-fixtures/addMissingField338/cr3/metadata.json +0 -1
  72. package/test-fixtures/addMissingField338/cr4/metadata.json +0 -1
  73. package/test-fixtures/addMissingField338/gc/metadata.json +0 -1
  74. package/test-fixtures/addMissingField338/gd/metadata.json +0 -1
  75. package/test-fixtures/addMissingField338/gf/metadata.json +0 -1
  76. package/test-fixtures/addMissingField338/gs/metadata.json +0 -1
  77. package/test-fixtures/addMissingField338/gt/metadata.json +0 -1
  78. package/test-fixtures/addMissingField338/hd/metadata.json +0 -1
  79. package/test-fixtures/addMissingField338/he/metadata.json +0 -1
  80. package/test-fixtures/addMissingField338/he2/metadata.json +0 -1
  81. package/test-fixtures/addMissingField338/hg/metadata.json +0 -1
  82. package/test-fixtures/addMissingField338/hg2/metadata.json +0 -1
  83. package/test-fixtures/addMissingField338/hj/metadata.json +0 -1
  84. package/test-fixtures/addMissingField338/hj2/metadata.json +0 -1
  85. package/test-fixtures/addMissingField338/mo/metadata.json +0 -1
  86. package/test-fixtures/addMissingField338/nc/metadata.json +0 -1
  87. package/test-fixtures/addMissingField338/nr/metadata.json +0 -1
  88. package/test-fixtures/addMissingField338/sd/metadata.json +0 -1
  89. package/test-fixtures/addMissingField338/sd2/metadata.json +0 -1
  90. package/test-fixtures/addMissingField338/sd3/metadata.json +0 -1
  91. package/test-fixtures/addMissingField338/ss/metadata.json +0 -1
  92. package/test-fixtures/addMissingField338/ss2/metadata.json +0 -1
  93. package/test-fixtures/addMissingField338/vd/metadata.json +0 -1
  94. package/test-fixtures/addMissingField338/vd2/metadata.json +0 -1
  95. package/test-fixtures/addMissingField338/vf/metadata.json +0 -1
  96. package/test-fixtures/addMissingField338/zu/metadata.json +0 -1
  97. package/test-fixtures/cyrillux-usemarcon-replacement/f01/metadata.json +0 -1
  98. package/test-fixtures/cyrillux-usemarcon-replacement/f02/expectedResult.json +3 -0
  99. package/test-fixtures/cyrillux-usemarcon-replacement/f02/metadata.json +0 -1
  100. package/test-fixtures/cyrillux-usemarcon-replacement/f03/expectedResult.json +3 -0
  101. package/test-fixtures/cyrillux-usemarcon-replacement/f03/metadata.json +0 -1
  102. package/test-fixtures/cyrillux-usemarcon-replacement/f04/expectedResult.json +3 -0
  103. package/test-fixtures/cyrillux-usemarcon-replacement/f04/metadata.json +0 -1
  104. package/test-fixtures/cyrillux-usemarcon-replacement/f05/expectedResult.json +3 -0
  105. package/test-fixtures/cyrillux-usemarcon-replacement/f05/metadata.json +1 -1
  106. package/test-fixtures/cyrillux-usemarcon-replacement/f06/expectedResult.json +3 -0
  107. package/test-fixtures/cyrillux-usemarcon-replacement/f06/metadata.json +0 -1
  108. package/test-fixtures/cyrillux-usemarcon-replacement/f07/expectedResult.json +3 -0
  109. package/test-fixtures/cyrillux-usemarcon-replacement/f07/metadata.json +0 -1
  110. package/test-fixtures/cyrillux-usemarcon-replacement/f08/expectedResult.json +3 -0
  111. package/test-fixtures/cyrillux-usemarcon-replacement/f08/metadata.json +0 -1
  112. package/test-fixtures/cyrillux-usemarcon-replacement/f09/expectedResult.json +1 -2
  113. package/test-fixtures/cyrillux-usemarcon-replacement/f09/metadata.json +1 -2
  114. package/test-fixtures/cyrillux-usemarcon-replacement/f09/record.json +1 -1
  115. package/test-fixtures/cyrillux-usemarcon-replacement/f10/expectedResult.json +1 -1
  116. package/test-fixtures/cyrillux-usemarcon-replacement/f10/metadata.json +0 -1
  117. package/test-fixtures/cyrillux-usemarcon-replacement/f10/record.json +1 -1
  118. package/test-fixtures/cyrillux-usemarcon-replacement/f11/expectedResult.json +3 -0
  119. package/test-fixtures/cyrillux-usemarcon-replacement/f11/metadata.json +1 -2
  120. package/test-fixtures/cyrillux-usemarcon-replacement/v01/metadata.json +0 -1
  121. package/test-fixtures/cyrillux-usemarcon-replacement/v02/metadata.json +0 -1
  122. package/test-fixtures/cyrillux-usemarcon-replacement/v02/record.json +1 -1
  123. package/test-fixtures/field-008-18-34-character-groups/01/metadata.json +0 -1
  124. package/test-fixtures/field-008-18-34-character-groups/02/metadata.json +0 -1
  125. package/test-fixtures/field-008-18-34-character-groups/03/metadata.json +0 -1
  126. package/test-fixtures/field-008-18-34-character-groups/04/metadata.json +0 -1
  127. package/test-fixtures/field-008-18-34-character-groups/05/metadata.json +0 -1
  128. package/test-fixtures/field-505-separators/01/metadata.json +0 -1
  129. package/test-fixtures/field-505-separators/02/metadata.json +0 -1
  130. package/test-fixtures/fix-33X/f11/metadata.json +0 -1
  131. package/test-fixtures/fix-33X/v11/metadata.json +0 -1
  132. package/test-fixtures/fix-country-codes/01/metadata.json +0 -1
  133. package/test-fixtures/fix-country-codes/02/metadata.json +0 -1
  134. package/test-fixtures/fix-country-codes/03/metadata.json +0 -1
  135. package/test-fixtures/fix-country-codes/04/metadata.json +0 -1
  136. package/test-fixtures/fix-country-codes/05/metadata.json +0 -1
  137. package/test-fixtures/fix-language-codes/01/metadata.json +0 -1
  138. package/test-fixtures/fix-language-codes/02/metadata.json +0 -1
  139. package/test-fixtures/fix-language-codes/03/metadata.json +0 -1
  140. package/test-fixtures/fix-language-codes/04/metadata.json +0 -1
  141. package/test-fixtures/fix-language-codes/05/metadata.json +0 -1
  142. package/test-fixtures/fix-relator-terms/f01/metadata.json +0 -1
  143. package/test-fixtures/fix-relator-terms/f01b/metadata.json +0 -1
  144. package/test-fixtures/fix-relator-terms/f02/metadata.json +0 -1
  145. package/test-fixtures/fix521/01/metadata.json +0 -1
  146. package/test-fixtures/fix521/02/metadata.json +0 -1
  147. package/test-fixtures/fix521/03/metadata.json +0 -1
  148. package/test-fixtures/indicator-fixes/01/metadata.json +0 -1
  149. package/test-fixtures/indicator-fixes/02/metadata.json +0 -1
  150. package/test-fixtures/indicator-fixes/03/metadata.json +0 -1
  151. package/test-fixtures/indicator-fixes/04/metadata.json +0 -1
  152. package/test-fixtures/indicator-fixes/05/metadata.json +0 -1
  153. package/test-fixtures/indicator-fixes/06/metadata.json +0 -1
  154. package/test-fixtures/indicator-fixes/07/metadata.json +0 -1
  155. package/test-fixtures/normalize-dashes/01/metadata.json +0 -1
  156. package/test-fixtures/normalize-dashes/02/metadata.json +0 -1
  157. package/test-fixtures/normalize-dashes/03/metadata.json +0 -1
  158. package/test-fixtures/normalize-identifiers/01/metadata.json +0 -1
  159. package/test-fixtures/normalize-identifiers/02/metadata.json +0 -1
  160. package/test-fixtures/normalize-identifiers/03/metadata.json +0 -1
  161. package/test-fixtures/normalize-identifiers/04/metadata.json +0 -1
  162. package/test-fixtures/normalize-qualifying-information/01/metadata.json +0 -1
  163. package/test-fixtures/normalize-qualifying-information/02/metadata.json +0 -1
  164. package/test-fixtures/normalize-subfield-value/01/metadata.json +0 -1
  165. package/test-fixtures/normalize-utf8-diacritics/01/metadata.json +0 -1
  166. package/test-fixtures/normalize-utf8-diacritics/02/metadata.json +0 -1
  167. package/test-fixtures/normalize-utf8-diacritics/03/metadata.json +0 -1
  168. package/test-fixtures/normalize-utf8-diacritics/04/metadata.json +0 -1
  169. package/test-fixtures/normalize-utf8-diacritics/05/metadata.json +0 -1
  170. package/test-fixtures/punctuation/03/metadata.json +0 -1
  171. package/test-fixtures/punctuation/04/metadata.json +0 -1
  172. package/test-fixtures/punctuation/05/metadata.json +0 -1
  173. package/test-fixtures/punctuation2/01/metadata.json +0 -1
  174. package/test-fixtures/punctuation2/02/metadata.json +0 -1
  175. package/test-fixtures/punctuation2/04/metadata.json +0 -1
  176. package/test-fixtures/punctuation2/05/metadata.json +0 -1
  177. package/test-fixtures/punctuation2/240/metadata.json +0 -1
  178. package/test-fixtures/punctuation2/260/expectedResult.json +14 -0
  179. package/test-fixtures/punctuation2/260/metadata.json +5 -0
  180. package/test-fixtures/punctuation2/260/record.json +12 -0
  181. package/test-fixtures/punctuation2/710/expectedResult.json +11 -0
  182. package/test-fixtures/punctuation2/710/metadata.json +5 -0
  183. package/test-fixtures/punctuation2/710/record.json +9 -0
  184. package/test-fixtures/punctuation2/800/metadata.json +0 -1
  185. package/test-fixtures/punctuation2/95/metadata.json +0 -1
  186. package/test-fixtures/punctuation2/96/metadata.json +0 -1
  187. package/test-fixtures/punctuation2/97/metadata.json +0 -1
  188. package/test-fixtures/punctuation2/98/metadata.json +0 -1
  189. package/test-fixtures/punctuation2/99/metadata.json +0 -1
  190. package/test-fixtures/reindex-sf6-occurence-numbers/f01/metadata.json +0 -1
  191. package/test-fixtures/reindex-sf6-occurence-numbers/f02/metadata.json +0 -1
  192. package/test-fixtures/reindex-sf6-occurence-numbers/f03/metadata.json +0 -1
  193. package/test-fixtures/reindex-sf6-occurence-numbers/v01/metadata.json +0 -1
  194. package/test-fixtures/reindex-sf6-occurence-numbers/v02/metadata.json +0 -1
  195. package/test-fixtures/reindex-sf6-occurence-numbers/v03/metadata.json +0 -1
  196. package/test-fixtures/remove-duplicate-datafields/f01/metadata.json +0 -1
  197. package/test-fixtures/remove-duplicate-datafields/f03/metadata.json +0 -1
  198. package/test-fixtures/remove-duplicate-datafields/f03b/metadata.json +0 -1
  199. package/test-fixtures/remove-duplicate-datafields/f04/metadata.json +0 -1
  200. package/test-fixtures/remove-duplicate-datafields/f05/metadata.json +0 -1
  201. package/test-fixtures/remove-duplicate-datafields/f06/metadata.json +0 -1
  202. package/test-fixtures/remove-duplicate-datafields/f07/metadata.json +0 -1
  203. package/test-fixtures/remove-duplicate-datafields/f08/metadata.json +0 -1
  204. package/test-fixtures/remove-duplicate-datafields/f09/metadata.json +0 -1
  205. package/test-fixtures/remove-duplicate-datafields/f10/metadata.json +0 -1
  206. package/test-fixtures/remove-duplicate-datafields/f11/metadata.json +0 -1
  207. package/test-fixtures/remove-duplicate-datafields/v01/metadata.json +0 -1
  208. package/test-fixtures/remove-duplicate-datafields/v02/metadata.json +0 -1
  209. package/test-fixtures/remove-duplicate-datafields/v03/metadata.json +0 -1
  210. package/test-fixtures/remove-duplicate-datafields/v04/metadata.json +0 -1
  211. package/test-fixtures/remove-inferior-datafields/f01/metadata.json +0 -1
  212. package/test-fixtures/remove-inferior-datafields/f02a/metadata.json +0 -1
  213. package/test-fixtures/remove-inferior-datafields/f02b/metadata.json +0 -1
  214. package/test-fixtures/remove-inferior-datafields/f03/metadata.json +0 -1
  215. package/test-fixtures/remove-inferior-datafields/f04/metadata.json +0 -1
  216. package/test-fixtures/remove-inferior-datafields/f05/metadata.json +0 -1
  217. package/test-fixtures/remove-inferior-datafields/f06/metadata.json +0 -1
  218. package/test-fixtures/remove-inferior-datafields/f07a/metadata.json +0 -1
  219. package/test-fixtures/remove-inferior-datafields/f07b/metadata.json +0 -1
  220. package/test-fixtures/remove-inferior-datafields/f07c/metadata.json +0 -1
  221. package/test-fixtures/remove-inferior-datafields/f07d/metadata.json +0 -1
  222. package/test-fixtures/remove-inferior-datafields/f07e/metadata.json +0 -1
  223. package/test-fixtures/remove-inferior-datafields/f07f/metadata.json +0 -1
  224. package/test-fixtures/remove-inferior-datafields/f07g/metadata.json +0 -1
  225. package/test-fixtures/remove-inferior-datafields/f07h/metadata.json +0 -1
  226. package/test-fixtures/remove-inferior-datafields/f07i/metadata.json +0 -1
  227. package/test-fixtures/remove-inferior-datafields/f07j/metadata.json +0 -1
  228. package/test-fixtures/remove-inferior-datafields/f08/metadata.json +0 -1
  229. package/test-fixtures/remove-inferior-datafields/f09/metadata.json +0 -1
  230. package/test-fixtures/remove-inferior-datafields/f10/metadata.json +0 -1
  231. package/test-fixtures/remove-inferior-datafields/f11/metadata.json +0 -1
  232. package/test-fixtures/remove-inferior-datafields/f12/metadata.json +0 -1
  233. package/test-fixtures/remove-inferior-datafields/f13/metadata.json +0 -1
  234. package/test-fixtures/remove-inferior-datafields/v01/metadata.json +0 -1
  235. package/test-fixtures/remove-inferior-datafields/v02/metadata.json +0 -1
  236. package/test-fixtures/remove-orphanded-sf6s/f01/metadata.json +0 -1
  237. package/test-fixtures/remove-orphanded-sf6s/f02/metadata.json +0 -1
  238. package/test-fixtures/remove-orphanded-sf6s/v01/metadata.json +0 -1
  239. package/test-fixtures/remove-orphanded-sf6s/v02/metadata.json +0 -1
  240. package/test-fixtures/sanitize-vocabulary-source-codes/f01/metadata.json +0 -1
  241. package/test-fixtures/sanitize-vocabulary-source-codes/f02/metadata.json +0 -1
  242. package/test-fixtures/sanitize-vocabulary-source-codes/f03/metadata.json +0 -1
  243. package/test-fixtures/sanitize-vocabulary-source-codes/v01/metadata.json +0 -1
  244. package/test-fixtures/sanitize-vocabulary-source-codes/v03/metadata.json +0 -1
  245. package/test-fixtures/sort-relator-terms/f01/metadata.json +0 -1
  246. package/test-fixtures/sort-relator-terms/f02/metadata.json +0 -1
  247. package/test-fixtures/sort-relator-terms/v01/metadata.json +0 -1
  248. package/test-fixtures/sort-relator-terms/v02/metadata.json +0 -1
  249. package/test-fixtures/sort-subfields/f01/metadata.json +0 -1
  250. package/test-fixtures/sort-subfields/f02/metadata.json +0 -1
  251. package/test-fixtures/sort-subfields/v01/metadata.json +0 -1
  252. package/test-fixtures/sort-subfields/v02/metadata.json +0 -1
  253. package/test-fixtures/strip-punctuation/01/metadata.json +0 -1
  254. package/test-fixtures/strip-punctuation/02/metadata.json +0 -1
  255. package/test-fixtures/strip-punctuation/04/metadata.json +0 -1
  256. package/test-fixtures/strip-punctuation/05/metadata.json +0 -1
  257. package/test-fixtures/strip-punctuation/240/metadata.json +0 -1
  258. package/test-fixtures/strip-punctuation/96/metadata.json +0 -1
  259. package/test-fixtures/strip-punctuation/97/metadata.json +0 -1
  260. package/test-fixtures/strip-punctuation/98/metadata.json +0 -1
  261. package/test-fixtures/strip-punctuation/99/metadata.json +0 -1
  262. package/test-fixtures/subfield0/f01/metadata.json +0 -1
  263. package/test-fixtures/subfield0/f02/metadata.json +0 -1
  264. package/test-fixtures/subfield0/f03/metadata.json +0 -1
  265. package/test-fixtures/subfield0/v01/metadata.json +0 -1
  266. package/test-fixtures/subfield0/v02/metadata.json +0 -1
  267. package/test-fixtures/sync-007-and-300/f01/metadata.json +0 -1
  268. package/test-fixtures/sync-007-and-300/v01/metadata.json +0 -1
  269. package/test-fixtures/sync-007-and-300/v02/metadata.json +0 -1
  270. package/test-fixtures/sync-007-and-300/v03/metadata.json +0 -1
  271. package/test-fixtures/update-field-540/f01/metadata.json +0 -1
  272. package/test-fixtures/update-field-540/v01/metadata.json +0 -1
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ var _utils = require("./utils");
8
+ //import createDebugLogger from 'debug';
9
+
10
+ const description = 'Add missing 041 field based on 008/35-37';
11
+
12
+ // const multimediaRegexp = /multimedia/ui;
13
+
14
+ function _default() {
15
+ return {
16
+ description,
17
+ validate,
18
+ fix
19
+ };
20
+ function getLanguageCode(record) {
21
+ const [f008] = record.get('008');
22
+ if (f008 && f008.value.length === 40) {
23
+ return f008.value.substring(35, 38);
24
+ }
25
+ return '|||';
26
+ }
27
+ function isRealLanguageCode(languageCode = '|||') {
28
+ (0, _utils.nvdebug)(`Language code 008/35-37: ${languageCode}`);
29
+ if (!languageCode.match(/^[a-z]{3}$/u) || ['mul', 'und', 'zxx'].includes(languageCode)) {
30
+ return false;
31
+ }
32
+ // Assume that value is valid:
33
+ return true;
34
+ }
35
+ function determineSubfieldCode(record) {
36
+ const typeOfRecord = record.getTypeOfRecord(record);
37
+ if (typeOfRecord === 'i' || typeOfRecord === 'j') {
38
+ return 'd';
39
+ }
40
+ return 'a';
41
+ }
42
+ function generateContent(record) {
43
+ const languageCodeFields = record.get('041');
44
+ if (languageCodeFields.length > 0) {
45
+ return null;
46
+ }
47
+ const languageCode = getLanguageCode(record);
48
+ if (!isRealLanguageCode(languageCode)) {
49
+ return null;
50
+ }
51
+ const subfieldCode = determineSubfieldCode(record);
52
+ // NB! Usemarcon-bookwhere had IND1=0...
53
+ return {
54
+ tag: '041',
55
+ ind1: ' ',
56
+ ind2: ' ',
57
+ subfields: [{
58
+ code: subfieldCode,
59
+ value: languageCode
60
+ }]
61
+ };
62
+ }
63
+ function fix(record) {
64
+ (0, _utils.nvdebug)(`FIX ${description}...`);
65
+ const data = generateContent(record);
66
+ const res = {
67
+ message: [],
68
+ fix: [],
69
+ valid: true
70
+ };
71
+ if (data) {
72
+ record.insertField(data);
73
+ return res;
74
+ }
75
+ return res;
76
+ }
77
+ function validate(record) {
78
+ (0, _utils.nvdebug)(`VALIDATE ${description}...`);
79
+ const data = generateContent(record);
80
+ if (!data) {
81
+ return {
82
+ message: [],
83
+ valid: true
84
+ };
85
+ }
86
+ const msg = `${description}: '${(0, _utils.fieldToString)(data)}'`;
87
+ return {
88
+ message: [msg],
89
+ valid: false
90
+ };
91
+ }
92
+ }
93
+ //# sourceMappingURL=addMissingField041.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addMissingField041.js","names":["_utils","require","description","_default","validate","fix","getLanguageCode","record","f008","get","value","length","substring","isRealLanguageCode","languageCode","nvdebug","match","includes","determineSubfieldCode","typeOfRecord","getTypeOfRecord","generateContent","languageCodeFields","subfieldCode","tag","ind1","ind2","subfields","code","data","res","message","valid","insertField","msg","fieldToString"],"sources":["../src/addMissingField041.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\nconst description = 'Add missing 041 field based on 008/35-37';\n\n// const multimediaRegexp = /multimedia/ui;\n\nexport default function () {\n\n return {\n description, validate, fix\n };\n\n function getLanguageCode(record) {\n const [f008] = record.get('008');\n if (f008 && f008.value.length === 40) {\n return f008.value.substring(35, 38);\n }\n return '|||';\n }\n\n function isRealLanguageCode(languageCode = '|||') {\n nvdebug(`Language code 008/35-37: ${languageCode}`);\n if (!languageCode.match(/^[a-z]{3}$/u) || ['mul', 'und', 'zxx'].includes(languageCode)) {\n return false;\n }\n // Assume that value is valid:\n return true;\n }\n\n function determineSubfieldCode(record) {\n const typeOfRecord = record.getTypeOfRecord(record);\n if (typeOfRecord === 'i' || typeOfRecord === 'j') {\n return 'd';\n }\n return 'a';\n }\n\n function generateContent(record) {\n const languageCodeFields = record.get('041');\n if (languageCodeFields.length > 0) {\n return null;\n }\n const languageCode = getLanguageCode(record);\n if (!isRealLanguageCode(languageCode)) {\n return null;\n }\n const subfieldCode = determineSubfieldCode(record);\n // NB! Usemarcon-bookwhere had IND1=0...\n return {tag: '041', ind1: ' ', ind2: ' ', subfields: [{code: subfieldCode, value: languageCode}]};\n }\n\n function fix(record) {\n nvdebug(`FIX ${description}...`);\n const data = generateContent(record);\n const res = {message: [], fix: [], valid: true};\n if (data) {\n record.insertField(data);\n return res;\n }\n return res;\n }\n\n function validate(record) {\n nvdebug(`VALIDATE ${description}...`);\n const data = generateContent(record);\n if (!data) {\n return {message: [], valid: true};\n }\n const msg = `${description}: '${fieldToString(data)}'`;\n return {message: [msg], valid: false};\n }\n}\n\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AADA;;AAGA,MAAMC,WAAW,GAAG,0CAA0C;;AAE9D;;AAEe,SAAAC,SAAA,EAAY;EAEzB,OAAO;IACLD,WAAW;IAAEE,QAAQ;IAAEC;EACzB,CAAC;EAED,SAASC,eAAeA,CAACC,MAAM,EAAE;IAC/B,MAAM,CAACC,IAAI,CAAC,GAAGD,MAAM,CAACE,GAAG,CAAC,KAAK,CAAC;IAChC,IAAID,IAAI,IAAIA,IAAI,CAACE,KAAK,CAACC,MAAM,KAAK,EAAE,EAAE;MACpC,OAAOH,IAAI,CAACE,KAAK,CAACE,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;IACrC;IACA,OAAO,KAAK;EACd;EAEA,SAASC,kBAAkBA,CAACC,YAAY,GAAG,KAAK,EAAE;IAChD,IAAAC,cAAO,EAAE,4BAA2BD,YAAa,EAAC,CAAC;IACnD,IAAI,CAACA,YAAY,CAACE,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACC,QAAQ,CAACH,YAAY,CAAC,EAAE;MACtF,OAAO,KAAK;IACd;IACA;IACA,OAAO,IAAI;EACb;EAEA,SAASI,qBAAqBA,CAACX,MAAM,EAAE;IACrC,MAAMY,YAAY,GAAGZ,MAAM,CAACa,eAAe,CAACb,MAAM,CAAC;IACnD,IAAIY,YAAY,KAAK,GAAG,IAAIA,YAAY,KAAK,GAAG,EAAE;MAChD,OAAO,GAAG;IACZ;IACA,OAAO,GAAG;EACZ;EAEA,SAASE,eAAeA,CAACd,MAAM,EAAE;IAC/B,MAAMe,kBAAkB,GAAGf,MAAM,CAACE,GAAG,CAAC,KAAK,CAAC;IAC5C,IAAIa,kBAAkB,CAACX,MAAM,GAAG,CAAC,EAAE;MACjC,OAAO,IAAI;IACb;IACA,MAAMG,YAAY,GAAGR,eAAe,CAACC,MAAM,CAAC;IAC5C,IAAI,CAACM,kBAAkB,CAACC,YAAY,CAAC,EAAE;MACrC,OAAO,IAAI;IACb;IACA,MAAMS,YAAY,GAAGL,qBAAqB,CAACX,MAAM,CAAC;IAClD;IACA,OAAO;MAACiB,GAAG,EAAE,KAAK;MAAEC,IAAI,EAAE,GAAG;MAAEC,IAAI,EAAE,GAAG;MAAEC,SAAS,EAAE,CAAC;QAACC,IAAI,EAAEL,YAAY;QAAEb,KAAK,EAAEI;MAAY,CAAC;IAAC,CAAC;EACnG;EAEA,SAAST,GAAGA,CAACE,MAAM,EAAE;IACnB,IAAAQ,cAAO,EAAE,OAAMb,WAAY,KAAI,CAAC;IAChC,MAAM2B,IAAI,GAAGR,eAAe,CAACd,MAAM,CAAC;IACpC,MAAMuB,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAE1B,GAAG,EAAE,EAAE;MAAE2B,KAAK,EAAE;IAAI,CAAC;IAC/C,IAAIH,IAAI,EAAE;MACRtB,MAAM,CAAC0B,WAAW,CAACJ,IAAI,CAAC;MACxB,OAAOC,GAAG;IACZ;IACA,OAAOA,GAAG;EACZ;EAEA,SAAS1B,QAAQA,CAACG,MAAM,EAAE;IACxB,IAAAQ,cAAO,EAAE,YAAWb,WAAY,KAAI,CAAC;IACrC,MAAM2B,IAAI,GAAGR,eAAe,CAACd,MAAM,CAAC;IACpC,IAAI,CAACsB,IAAI,EAAE;MACT,OAAO;QAACE,OAAO,EAAE,EAAE;QAAEC,KAAK,EAAE;MAAI,CAAC;IACnC;IACA,MAAME,GAAG,GAAI,GAAEhC,WAAY,MAAK,IAAAiC,oBAAa,EAACN,IAAI,CAAE,GAAE;IACtD,OAAO;MAACE,OAAO,EAAE,CAACG,GAAG,CAAC;MAAEF,KAAK,EAAE;IAAK,CAAC;EACvC;AACF","ignoreList":[]}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ var _chai = require("chai");
4
+ var _marcRecord = require("@natlibfi/marc-record");
5
+ var _addMissingField = _interopRequireDefault(require("./addMissingField041"));
6
+ var _fixura = require("@natlibfi/fixura");
7
+ var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
8
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
+ (0, _fixugen.default)({
10
+ callback,
11
+ path: [__dirname, '..', 'test-fixtures', 'addMissingField041'],
12
+ useMetadataFile: true,
13
+ recurse: false,
14
+ fixura: {
15
+ reader: _fixura.READERS.JSON
16
+ },
17
+ mocha: {
18
+ before: () => testValidatorFactory()
19
+ }
20
+ });
21
+ async function testValidatorFactory() {
22
+ const validator = await (0, _addMissingField.default)();
23
+ (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
24
+ (0, _chai.expect)(validator.description).to.be.a('string');
25
+ (0, _chai.expect)(validator.validate).to.be.a('function');
26
+ (0, _chai.expect)(validator.fix).to.be.a('function');
27
+ }
28
+ async function callback({
29
+ getFixture,
30
+ fix = false
31
+ }) {
32
+ const validator = await (0, _addMissingField.default)();
33
+ const record = new _marcRecord.MarcRecord(getFixture('record.json'));
34
+ const expectedResult = getFixture('expectedResult.json');
35
+ // console.log(expectedResult); // eslint-disable-line
36
+
37
+ if (!fix) {
38
+ const result = await validator.validate(record);
39
+ (0, _chai.expect)(result).to.eql(expectedResult);
40
+ return;
41
+ }
42
+ await validator.fix(record);
43
+ (0, _chai.expect)(record).to.eql(expectedResult);
44
+ }
45
+ //# sourceMappingURL=addMissingField041.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addMissingField041.spec.js","names":["_chai","require","_marcRecord","_addMissingField","_interopRequireDefault","_fixura","_fixugen","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","fix","getFixture","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/addMissingField041.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './addMissingField041';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'addMissingField041'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n expect(validator.fix).to.be.a('function');\n}\n\nasync function callback({getFixture, fix = false}) {\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,gBAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AAA8C,SAAAG,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE9C,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,oBAAoB,CAAC;EAC9DC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AAEF,eAAeA,oBAAoBA,CAAA,EAAG;EACpC,MAAMC,SAAS,GAAG,MAAM,IAAAC,wBAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;EAC9C,IAAAT,YAAM,EAACF,SAAS,CAACa,GAAG,CAAC,CAACV,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAC3C;AAEA,eAAevB,QAAQA,CAAC;EAAC0B,UAAU;EAAED,GAAG,GAAG;AAAK,CAAC,EAAE;EACjD,MAAMb,SAAS,GAAG,MAAM,IAAAC,wBAAgB,EAAC,CAAC;EAC1C,MAAMc,MAAM,GAAG,IAAIC,sBAAU,CAACF,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMG,cAAc,GAAGH,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACD,GAAG,EAAE;IACR,MAAMK,MAAM,GAAG,MAAMlB,SAAS,CAACY,QAAQ,CAACG,MAAM,CAAC;IAC/C,IAAAb,YAAM,EAACgB,MAAM,CAAC,CAACf,EAAE,CAACgB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMjB,SAAS,CAACa,GAAG,CAACE,MAAM,CAAC;EAC3B,IAAAb,YAAM,EAACa,MAAM,CAAC,CAACZ,EAAE,CAACgB,GAAG,CAACF,cAAc,CAAC;AACvC","ignoreList":[]}
@@ -10,9 +10,10 @@ exports.removeOwnershipSubfield5 = removeOwnershipSubfield5;
10
10
  var _clone = _interopRequireDefault(require("clone"));
11
11
  var _marcRecord = require("@natlibfi/marc-record");
12
12
  var _fix33X = _interopRequireDefault(require("./fix-33X"));
13
- var _addMissingField = _interopRequireDefault(require("./addMissingField336"));
14
- var _addMissingField2 = _interopRequireDefault(require("./addMissingField337"));
15
- var _addMissingField3 = _interopRequireDefault(require("./addMissingField338"));
13
+ var _addMissingField = _interopRequireDefault(require("./addMissingField041"));
14
+ var _addMissingField2 = _interopRequireDefault(require("./addMissingField336"));
15
+ var _addMissingField3 = _interopRequireDefault(require("./addMissingField337"));
16
+ var _addMissingField4 = _interopRequireDefault(require("./addMissingField338"));
16
17
  var _fixCountryCodes = _interopRequireDefault(require("./fix-country-codes"));
17
18
  var _fixLanguageCodes = _interopRequireDefault(require("./fix-language-codes"));
18
19
  var _fixRelatorTerms = _interopRequireDefault(require("./fixRelatorTerms"));
@@ -76,12 +77,12 @@ function _default() {
76
77
  const f028 = record.fields.filter(f => f.tag === '028');
77
78
  f028.forEach(f => (0, _sortSubfields.sortAdjacentSubfields)(f));
78
79
  fixField040(record); // All $b values are changed to 'mul'. As a side effect 33X$b=>$a mappings are in Finnish! Ok in this domain!
79
-
80
+ (0, _addMissingField.default)().fix(record);
80
81
  (0, _fixRelatorTerms.default)().fix(record);
81
82
  (0, _fix33X.default)().fix(record); // 33X$a => 33X$a$b$2
82
- (0, _addMissingField.default)().fix(record);
83
83
  (0, _addMissingField2.default)().fix(record);
84
84
  (0, _addMissingField3.default)().fix(record);
85
+ (0, _addMissingField4.default)().fix(record);
85
86
  record.fields.forEach(f => fieldSpecificStuff2(f));
86
87
  function fieldSpecificStuff2(field) {
87
88
  removeSubfieldH(field); // only after 33X creation, as 245$h might be useful
@@ -333,7 +334,7 @@ function translateFieldToFinnish(field) {
333
334
  function expandEnglishAbbreviations(value) {
334
335
  return value.replace(/\bbk\.\b/gui, 'book').replace(/chiefly col\./ui, 'chiefly color').replace(/col\. ill\./ui, 'color illustrations').replace(/diagrs\./ui, 'diagrams').replace(/\bhbk\.\b/gui, 'hardcover').replace(/\bhbk\b/gui, 'hardcover').
335
336
  // expand to MTS-compliant form
336
- replace(/\bill\./gui, 'illustrated').
337
+ replace(/\b1 hr\./gui, '1 hour').replace(/\bhr\./gui, 'hours').replace(/\bill\./gui, 'illustrated').
337
338
  // or illustrations (or Swedish "illustrerad" or...)
338
339
  replace(/\billus\./gui, 'illustrated').
339
340
  // or illustrations
@@ -342,7 +343,7 @@ function expandEnglishAbbreviations(value) {
342
343
  // replace(/\bmin\b/gu, 'minutes').
343
344
  replace(/\bp\.\b/gui, 'pages').replace(/\bp\b/gu, 'pages').replace(/\bpbk\.\b/gui, 'paperback').replace(/\bpbk\b/gui, 'paperback').
344
345
  // expand to MTS-compliant form
345
- replace(/\bports\./gui, 'portraits').replace('sd., col.', 'sound, color').replace(/ *\((?:chiefly col\.|chiefly color|some cols)\)/gui, '').replace(/\b1 hr\./gui, '1 hour');
346
+ replace(/\bpdf\b/gui, 'PDF').replace(/\bports\./gui, 'portraits').replace('sd., col.', 'sound, color').replace(/ *\((?:chiefly col\.|chiefly color|some col[s.])\)/gui, '').replace(/\b1 hr\./gui, '1 hour');
346
347
  }
347
348
  function expandFinnishAbbreviations(value) {
348
349
  return value.replace(/\bcn\. /gu, 'noin ').
@@ -357,14 +358,16 @@ function expandSwedishAbbreviations(value) {
357
358
  // replace(/\bmin\b/gu, 'minuter');
358
359
  }
359
360
  function finnishTranslationsAndMappings(value) {
360
- return value.replace('analog', 'analoginen').replace('approximately', 'noin').replace('audio discs', 'äänilevyä').replace('black and white', 'mustavalkoinen').replace(/\bcharts\b/gui, 'kaavioita').replace('chiefly color illustrations', 'pääosin värikuvitettu').replace('chiefly', 'pääosin').replace('color illustrations', 'värikuvitus').replace(/\bdigital\b/gui, 'digitaalinen').replace(/\belectronic book\b/gui, 'verkkoaineisto').replace(/\bfolded sheet\b/gui, 'taitelehti').replace(/\bhardback\b/gui, 'kovakantinen').replace(/\bhours\b/gui, 'tuntia').replace('illustrated', 'kuvitettu').replace(/illustration\b/gui, 'kuvitus').
361
- // kuvitus/kuvitettu variation is taken from usemarcon-cyrillux...
362
- replace('illustrations', 'kuvitettu').replace(/\binsert\b/gui, 'liite').replace(/\binserts\b/gui, 'liitteitä').replace('leaves of plates', 'kuvalehteä').replace(/\bmap\b/gui, 'kartta').replace(/\bmaps\b/gui, 'karttoja').
361
+ return value.replace('analog', 'analoginen').replace('approximately', 'noin').replace('audio discs', 'äänilevyä').replace('black and white', 'mustavalkoinen').replace(/\bbilaga\b/gui, 'liite').replace(/\bbilagor\b/gui, 'liitettä').replace(/\bcharts\b/gui, 'kaavioita').replace('chiefly color illustrations', 'pääosin värikuvitettu').replace('chiefly', 'pääosin').replace(/\bcirca\b/gui, 'noin').replace(/coil[- ]?bound/gui, 'kierreselkä').replace('color illustrations', 'värikuvitus').replace(/comb[- ]?bound/gui, 'kierreselkä').replace(/\bdigital\b/gui, 'digitaalinen').replace(/\belectronic book\b/gui, 'verkkoaineisto').replace('(flera nummersviter)', '(useita numerointijaksoja)').replace(/\bfolded sheet\b/gui, 'taitelehti').replace(/\bfärgillustratione[nr]\b/gui, 'värikuvitus').replace(/\bhard(?:back|cover)\b/gui, 'kovakantinen').replace(/\bhours\b/gui, 'tuntia').replace(/\bi flera nummersviter/gui, 'useina numerointijaksoina').replace('illustrated', 'kuvitettu').replace(/illustrations?\b/gui, 'kuvitettu').
362
+ // Based on usemacron-bookwhere (NB! usemarcon-cyrillux had kuvitus/kuvitettu)
363
+ replace(/\binbunden\b/gui, 'kovakantinen').
364
+ // swe
365
+ replace(/\binsert\b/gui, 'liite').replace(/\binserts\b/gui, 'liitteitä').replace(/\bin various pagings/gui, 'useina numerointijaksoina').replace('leaves of plates', 'kuvalehteä').replace(/\bljudskiva\b/gui, 'äänilevy').replace(/\bljudskivor\b/gui, 'äänilevyä').replace(/\bmap\b/gui, 'kartta').replace(/\bmaps\b/gui, 'karttoja').
363
366
  // or karttaa?
364
- replace('minutes', 'minuuttia').replace('online resource', 'verkkoaineisto').replace('pages of plates', 'kuvalehteä').replace(/\bpages\b/gui, 'sivua').replace(/\bpaperback\b/gui, 'pehmeäkantinen').
367
+ replace('minutes', 'minuuttia').replace('mjuka pärmar', 'pehmeäkantinen').replace('online resource', 'verkkoaineisto').replace('onlineresurs', 'verkkoaineisto').replace('onumrerade', 'numeroimatonta').replace('pages of plates', 'kuvalehteä').replace(/\bpages\b/gui, 'sivua').replace(/\bpaperback\b/gui, 'pehmeäkantinen').
365
368
  // MTS alt
366
- replace(/\bsoftcover\b/gui, 'pehmeäkantinen').
369
+ replace(/\bSeiten\b/gu, 'sivua').replace(/\bsoftcover\b/gui, 'pehmeäkantinen').
367
370
  // MTS pref
368
- replace('sound, color', 'äänellinen, värillinen').replace('sound cassettes', 'äänikasettia').replace('sound cassette', 'äänikasetti').replace('sound discs', 'äänilevyä').replace('sound disc', 'äänilevy').replace('unnumbered', 'numeroimatonta').replace(/\bverkkojulkaisu\b/gui, 'verkkoaineisto').replace('videodiscs', 'videolevyä').replace('videodisc', 'videolevy').replace(/\b1 hour\b/gui, '1 tunti');
371
+ replace('sound, color', 'äänellinen, värillinen').replace('sound cassettes', 'äänikasettia').replace('sound cassette', 'äänikasetti').replace('sound discs', 'äänilevyä').replace(/sound disc\b/gui, 'äänilevy').replace(/(?:spiral[- ]?bound|spiralrygg)/gui, 'kierreselkä').replace('svartvit', 'mustavalkoinen').replace('unnumbered', 'numeroimatonta').replace('(various pagings)', '(useita numerointijaksoja)').replace(/\bverkkojulkaisu\b/gui, 'verkkoaineisto').replace('videodiscs', 'videolevyä').replace('videodisc', 'videolevy').replace(/\b1 hour\b/gui, '1 tunti');
369
372
  }
370
373
  //# sourceMappingURL=cyrillux-usemarcon-replacement.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cyrillux-usemarcon-replacement.js","names":["_clone","_interopRequireDefault","require","_marcRecord","_fix33X","_addMissingField","_addMissingField2","_addMissingField3","_fixCountryCodes","_fixLanguageCodes","_fixRelatorTerms","_indicatorFixes","_punctuation","_normalizeQualifyingInformation","_sortSubfields","_utils","obj","__esModule","default","description","dropTags","_default","fix","validate","record","nvdebug","realFix","res","message","valid","fixLeader","leader","substring","fields","filter","f","includes","tag","forEach","fieldSpecificStuff","field","removeOwnershipSubfield5","removeFromOldCatalog","translateFieldToFinnish","fixCountryCodes","fixLanguageCodes","fixQualifyingInformation","f028","sortAdjacentSubfields","fixField040","fixRelatorTerms","fix33X","add336","add337","add338","fieldSpecificStuff2","removeSubfieldH","field260To264s","field410To490And810","field440To490And830","fixIndicators","fixPunctuation","originalString","recordToString","clonedRecord","MarcRecord","subfieldValues","modifiedString","f040","subfieldsBE","code","value","length","data","ind1","ind2","subfields","insertField","fixField040Subfields","sf","push","removeFromOldCatalogFromSubfield","subfield","replace","filteredFields","remainingSubfields","field810","clone","field830","createCopyright264Field","getCopyrightYear","string","match","field260To264Normalization","field260To264Normalization2","createCopyright264Value","c","undefined","copyrightYear","copType","returnValue","year","translateSubfieldToFinnish","finnishTranslationsAndMappings","expandFinnishAbbreviations","expandSwedishAbbreviations","expandEnglishAbbreviations"],"sources":["../src/cyrillux-usemarcon-replacement.js"],"sourcesContent":["/*\n* cyrillux-usemarcon-replacement.js -- implement and improve https://github.com/NatLibFi/USEMARCON-Cyrillux/tree/master\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n*/\n\nimport clone from 'clone';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {default as fix33X} from './fix-33X';\nimport {default as add336} from './addMissingField336';\nimport {default as add337} from './addMissingField337';\nimport {default as add338} from './addMissingField338';\nimport {default as fixCountryCodes} from './fix-country-codes';\nimport {default as fixLanguageCodes} from './fix-language-codes';\nimport {default as fixRelatorTerms} from './fixRelatorTerms';\nimport {default as fixIndicators} from './indicator-fixes';\nimport {default as fixPunctuation} from './punctuation2';\nimport {default as fixQualifyingInformation} from './normalize-qualifying-information';\nimport {sortAdjacentSubfields} from './sortSubfields';\n\n\n// import createDebugLogger from 'debug';\nimport {nvdebug, recordToString} from './utils';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');\n\nconst description = 'Replacement for Cyrillux usemarcon rules';\n\n// Extended original list with 541, 561, 562, 583, 584\nconst dropTags = ['001', '003', '010', '012', '014', '015', '016', '019', '025', '029', '032', '035', '036', '037', '038', '042', '049', '051', '061', '068', '071', '074', '079', '090', '091', '092', '094', '095', '096', '097', '099', '249', '261', '262', '350', '400', '411', '541', '561', '562', '574', '575', '577', '578', '583', '584', '589', '590', '591', '592', '593', '594', '595', '596', '597', '598', '599', '653', '698', '741', '742', '744', '761', '790', '841', '842', '843', '844', '845', '850', '852', '853', '854', '855', '858', '859', '863', '864', '865', '866', '867', '868', '876', '877', '878', '882', '886', '887', '888', '890', '899'];\n\nexport default function () {\n return {\n description, fix, validate\n };\n\n function fix(record) {\n nvdebug(`${description}: fix`);\n realFix(record);\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function realFix(record) {\n // Fix leader: standard fixes + update LDR/17 to '4'\n fixLeader(record);\n record.leader = `${record.leader.substring(0, 17)}4${record.leader.substring(18, 24)}`; // eslint-disable-line functional/immutable-data\n\n // Remove unwanted fields:\n record.fields = record.fields.filter(f => !dropTags.includes(f.tag)); // eslint-disable-line functional/immutable-data\n\n record.fields.forEach(f => fieldSpecificStuff(f));\n\n function fieldSpecificStuff(field) {\n removeOwnershipSubfield5(field);\n removeFromOldCatalog(field); // Remove LoC phrase \"[from old catalog]\" from srings\n translateFieldToFinnish(field);\n }\n\n fixCountryCodes().fix(record); // 008/15-17\n fixLanguageCodes().fix(record); // 008/35-37 AND 041 (note that all relevant subfield codes are fixed, not just $a)\n\n fixQualifyingInformation().fix(record); // 015, 020, 024 and 028\n\n // Field 028: use $b$a, not $a$b:\n const f028 = record.fields.filter(f => f.tag === '028');\n f028.forEach(f => sortAdjacentSubfields(f));\n\n fixField040(record); // All $b values are changed to 'mul'. As a side effect 33X$b=>$a mappings are in Finnish! Ok in this domain!\n\n fixRelatorTerms().fix(record);\n\n fix33X().fix(record); // 33X$a => 33X$a$b$2\n add336().fix(record);\n add337().fix(record);\n add338().fix(record);\n\n record.fields.forEach(f => fieldSpecificStuff2(f));\n\n function fieldSpecificStuff2(field) {\n removeSubfieldH(field); // only after 33X creation, as 245$h might be useful\n\n field260To264s(field, record);\n\n // NB! 300 (before or after 33X creation?)\n field410To490And810(field, record);\n field440To490And830(field, record);\n // handle505(field); // not applying them usemarcon-cyrillux rules for field 505 as I can't understand their motivation.\n\n }\n\n // The fixer below implement Cyrillux rules such as 245I1 | 245I1 | If (Exists(@100) Or Exists(@110) Or Exists(@111) Or Exists(@130)) Then '1' Else '0' and plenty of other good stuff:\n fixIndicators().fix(record);\n\n fixPunctuation().fix(record);\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n // Validation is currently done in subparts\n function validate(record) {\n nvdebug(`${description}: validate`);\n const originalString = recordToString(record);\n const clonedRecord = new MarcRecord(record, {subfieldValues: false});\n realFix(clonedRecord);\n const modifiedString = recordToString(clonedRecord);\n\n if (originalString === modifiedString) {\n return {message: [], valid: true};\n }\n\n return {message: ['Record changed'], valid: false}; // Less than descriptive but will do...\n\n }\n}\n\nfunction fixField040(record) {\n const f040 = record.fields.filter(f => f.tag === '040');\n\n const subfieldsBE = [\n {code: 'b', value: 'mul'},\n {code: 'e', value: 'rda'}\n ];\n\n // Add 040 if there isn't one:\n if (f040.length === 0) {\n const data = {tag: '040', ind1: ' ', ind2: ' ', subfields: subfieldsBE};\n\n record.insertField(data);\n return;\n }\n\n f040.forEach(f => fixField040Subfields(f));\n\n function fixField040Subfields(field) {\n field.subfields = field.subfields.filter(sf => !['b', 'e'].includes(sf.code)); // eslint-disable-line functional/immutable-data\n field.subfields.push(subfieldsBE[0]); // eslint-disable-line functional/immutable-data\n field.subfields.push(subfieldsBE[1]); // eslint-disable-line functional/immutable-data\n sortAdjacentSubfields(field); // put $b and $e to their proper places\n }\n\n}\n\nexport function removeFromOldCatalog(field) {\n // See https://catalog.loc.gov/vwebv/ui/en_US/htdocs/help/faqs.html for motivation\n field.subfields?.forEach(sf => removeFromOldCatalogFromSubfield(sf));\n\n function removeFromOldCatalogFromSubfield(subfield) {\n if (!subfield.value.includes('[from old catalog]')) {\n return;\n }\n subfield.value = subfield.value.replace(/ *\\[from old catalog\\]/gui, ''); // eslint-disable-line functional/immutable-data\n }\n}\n\nfunction removeSubfieldH(field) {\n if (!field.subfields || !['245', '246', '247', '740', '760', '762', '765', '767', '770', '772', '773', '774', '775', '776', '777', '780', '785', '786', '787', '788'].includes(field.tag)) {\n return;\n }\n\n const filteredFields = field.subfields.filter(sf => sf.code !== 'h');\n if (filteredFields.length > 0) {\n field.subfields = filteredFields; // eslint-disable-line functional/immutable-data\n return;\n }\n\n}\n\nexport function removeOwnershipSubfield5(field) {\n if (!field.subfields || field.subfields.length === 0) {\n return;\n }\n const remainingSubfields = field.subfields.filter(sf => sf.code !== '5');\n if (remainingSubfields.length === 0) { // sanity check/robustness\n return;\n }\n field.subfields = remainingSubfields; // eslint-disable-line functional/immutable-data\n}\n\nexport function fixLeader(record) {\n record.leader = `${record.leader.substring(0, 9)}a22${record.leader.substring(12, 18)}i${record.leader.substring(19, 20)}4500`; // eslint-disable-line functional/immutable-data\n}\n\nfunction field410To490And810(field, record) { // might be generic... if so, move to utils...\n if (field.tag !== '410') {\n return;\n }\n\n const field810 = clone(field);\n\n field.tag = '490'; // eslint-disable-line functional/immutable-data\n field.ind1 = '1'; // eslint-disable-line functional/immutable-data\n field.ind2 = ' '; // eslint-disable-line functional/immutable-data\n sortAdjacentSubfields(field);\n // 490: Fix punctuation elsewhere. (Note that the current support is lagging...)\n\n\n field810.tag = '810'; // eslint-disable-line functional/immutable-data\n field810.ind2 = ' '; // eslint-disable-line functional/immutable-data\n // 810: Fix punctuation elsewhere. (Note that the current support is lagging...)\n record.insertField(field810);\n}\n\nfunction field440To490And830(field, record) { // might be generic... if so, move to utils...\n if (field.tag !== '440') {\n return;\n }\n\n const field830 = clone(field);\n\n field.tag = '490'; // eslint-disable-line functional/immutable-data\n field.ind1 = '1'; // eslint-disable-line functional/immutable-data\n field.ind2 = ' '; // eslint-disable-line functional/immutable-data\n // 490: Fix punctuation elsewhere. (Note that the current support is lagging...)\n field830.tag = '830'; // eslint-disable-line functional/immutable-data\n // 830: Fix punctuation elsewhere. (Note that the current support is lagging...)\n record.insertField(field830);\n}\n\n\nfunction field260To264s(field, record) { // might be generic... if so, move to utils...\n // As per my quick reading of usemarcon-cyrillux\n if (field.tag !== '260') {\n return;\n }\n\n createCopyright264Field(field);\n\n field.tag = '264'; // eslint-disable-line functional/immutable-data\n field.ind1 = ' '; // eslint-disable-line functional/immutable-data\n field.ind2 = '1'; // eslint-disable-line functional/immutable-data\n\n // NB! Usemarcon does not handle 260$e$f$g => 264$a$b$c, so I'm not botherin with it either... (However, we could check our merge reducer code...)\n\n function getCopyrightYear(string) {\n if (string.match(/^(?:\\[?[Ccp]|[^0-9]*(?:cop|©|℗))[^0-9]*(?:1[789][0-9][0-9]|20[0-2][0-9])[^0-9]*$/u)) {\n return string.replace(/[^0-9]/ug, '');\n }\n return false;\n }\n\n field.subfields?.forEach(sf => field260To264Normalization(sf));\n\n function field260To264Normalization(subfield) {\n subfield.value = field260To264Normalization2(subfield); // eslint-disable-line functional/immutable-data\n }\n\n function createCopyright264Value(field) {\n // Extract/split copyright year to a separate field:\n const [c] = field.subfields.filter(sf => sf.code === 'c');\n if (!c) {\n return undefined;\n }\n const copyrightYear = getCopyrightYear(c.value);\n if (!copyrightYear) {\n return undefined;\n }\n const copType = c.value.match(/(?:^\\[?p|℗)/u) ? '℗' : '©';\n const returnValue = c.value.includes('[') ? `[${copType}${copyrightYear}]` : `${copType}${copyrightYear}`;\n // Moidy the original value:\n c.value = `[${copyrightYear}]`; // eslint-disable-line functional/immutable-data\n return returnValue;\n }\n\n function createCopyright264Field(field) {\n const c = createCopyright264Value(field);\n if (!c) {\n return undefined;\n }\n const data = {'tag': '264', 'ind1': ' ', 'ind2': '4', 'subfields': [{'code': 'c', 'value': c}]};\n record.insertField(data);\n }\n\n function field260To264Normalization2(subfield) {\n if (subfield.code === 'a') {\n return subfield.value.replace(/\\b[Ss]\\. ?l\\./u, 'Kustannuspaikka tuntematon');\n }\n if (subfield.code === 'b') {\n return subfield.value.replace(/\\b[Ss]\\. ?n\\./u, 'kustantaja tuntematon');\n }\n if (subfield.code === 'c') {\n const year = getCopyrightYear(subfield.value);\n if (year) {\n const c = subfield.value.match(/(?:^p|℗)/u) ? 'p' : 'c';\n if (subfield.value.includes('[')) {\n return `${c}[${year}]`;\n }\n return `${c}${year}`;\n }\n return subfield.value.replace(/\\b[Ss]\\. ?a\\./u, 'julkaisuaika tuntematon');\n }\n return subfield.value;\n }\n\n\n}\n\n/*\nfunction handle505(field) {\n if (field.tag !== '505') {\n return;\n }\n // Don't know how/why usemarcon-cyrillux is so sure about ind1...\n field.ind1 = '0'; // eslint-disable-line functional/immutable-data\n // usemarcon-cyrillux drops irrelevant subfields, so we do the same. However, we have included some control subfields in the kept side:\n const keptSubfields = field.subfields.filter(sf => ['a', 'g', 'r', 't', 'u', '6', '8', '9'].includes(sf.code));\n\n if (keptSubfields.some(sf => ['a', 'g', 'r', 't', 'u'].includes(sf.code))) {\n field.subfields = keptSubfields; // eslint-disable-line functional/immutable-data\n return;\n }\n}\n*/\n\nfunction translateFieldToFinnish(field) {\n if (!['020', '300'].includes(field.tag)) {\n return;\n }\n field.subfields?.forEach(sf => translateSubfieldToFinnish(sf));\n\n function translateSubfieldToFinnish(subfield) {\n if (field.tag === '020' && ['a', 'q', 'z'].includes(subfield.code)) {\n subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value)))); // eslint-disable-line functional/immutable-data\n return;\n }\n if (field.tag === '300') {\n subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value)))); // eslint-disable-line functional/immutable-data\n return;\n }\n }\n}\n\nfunction expandEnglishAbbreviations(value) {\n return value.replace(/\\bbk\\.\\b/gui, 'book').\n replace(/chiefly col\\./ui, 'chiefly color').\n replace(/col\\. ill\\./ui, 'color illustrations').\n replace(/diagrs\\./ui, 'diagrams').\n replace(/\\bhbk\\.\\b/gui, 'hardcover').replace(/\\bhbk\\b/gui, 'hardcover'). // expand to MTS-compliant form\n replace(/\\bill\\./gui, 'illustrated'). // or illustrations (or Swedish \"illustrerad\" or...)\n replace(/\\billus\\./gui, 'illustrated'). // or illustrations\n replace(/incl\\./gui, 'includes').\n replace(/fold\\.? maps/gui, 'folded maps').\n // replace(/\\bmin\\./gu, 'minutes').\n // replace(/\\bmin\\b/gu, 'minutes').\n replace(/\\bp\\.\\b/gui, 'pages').replace(/\\bp\\b/gu, 'pages').\n replace(/\\bpbk\\.\\b/gui, 'paperback').replace(/\\bpbk\\b/gui, 'paperback'). // expand to MTS-compliant form\n replace(/\\bports\\./gui, 'portraits').\n replace('sd., col.', 'sound, color').\n replace(/ *\\((?:chiefly col\\.|chiefly color|some cols)\\)/gui, '').\n replace(/\\b1 hr\\./gui, '1 hour');\n}\n\nfunction expandFinnishAbbreviations(value) {\n return value.replace(/\\bcn\\. /gu, 'noin ').\n // replace(/\\bmin\\./gu, 'minuuttia').\n // replace(/\\bmin\\b/gu, 'minuuttia').\n replace(/\\bnid\\./gu, 'nidottu').replace(/\\bnid\\b/gui, 'nidottu').\n replace(/\\bsid\\./gu, 'sidottu').replace(/\\bsid\\b/gui, 'sidottu').\n replace(/\\bverkkojulk\\.\\b/gu, 'verkkojulkaisu').replace(/\\bverkkojulk\\b/gu, 'verkkojulkaisu').\n replace(/^\\(([^)]+)\\)$/u, '$1'); // eslint-disable-line prefer-named-capture-group\n // <- removal of brackets above could use a better location\n}\n\nfunction expandSwedishAbbreviations(value) {\n return value.replace(/\\bca\\. /gu, 'circa ').\n replace(/\\bhft\\./gui, 'häftad').replace(/\\bhft\\b/gui, 'häftad');\n // replace(/\\bmin\\./gu, 'minuter').\n // replace(/\\bmin\\b/gu, 'minuter');\n}\n\nfunction finnishTranslationsAndMappings(value) {\n return value.replace('analog', 'analoginen').\n replace('approximately', 'noin').\n replace('audio discs', 'äänilevyä').\n replace('black and white', 'mustavalkoinen').\n replace(/\\bcharts\\b/gui, 'kaavioita').\n replace('chiefly color illustrations', 'pääosin värikuvitettu').\n replace('chiefly', 'pääosin').\n replace('color illustrations', 'värikuvitus').\n replace(/\\bdigital\\b/gui, 'digitaalinen').\n replace(/\\belectronic book\\b/gui, 'verkkoaineisto').\n replace(/\\bfolded sheet\\b/gui, 'taitelehti').\n replace(/\\bhardback\\b/gui, 'kovakantinen').\n replace(/\\bhours\\b/gui, 'tuntia').\n replace('illustrated', 'kuvitettu').\n replace(/illustration\\b/gui, 'kuvitus'). // kuvitus/kuvitettu variation is taken from usemarcon-cyrillux...\n replace('illustrations', 'kuvitettu').\n replace(/\\binsert\\b/gui, 'liite').\n replace(/\\binserts\\b/gui, 'liitteitä').\n replace('leaves of plates', 'kuvalehteä').\n replace(/\\bmap\\b/gui, 'kartta').\n replace(/\\bmaps\\b/gui, 'karttoja'). // or karttaa?\n replace('minutes', 'minuuttia').\n replace('online resource', 'verkkoaineisto').\n replace('pages of plates', 'kuvalehteä').\n replace(/\\bpages\\b/gui, 'sivua').\n replace(/\\bpaperback\\b/gui, 'pehmeäkantinen'). // MTS alt\n replace(/\\bsoftcover\\b/gui, 'pehmeäkantinen'). // MTS pref\n replace('sound, color', 'äänellinen, värillinen').\n replace('sound cassettes', 'äänikasettia').replace('sound cassette', 'äänikasetti').\n replace('sound discs', 'äänilevyä').replace('sound disc', 'äänilevy').\n replace('unnumbered', 'numeroimatonta').\n replace(/\\bverkkojulkaisu\\b/gui, 'verkkoaineisto').\n replace('videodiscs', 'videolevyä').\n replace('videodisc', 'videolevy').\n replace(/\\b1 hour\\b/gui, '1 tunti');\n\n}\n"],"mappings":";;;;;;;;;AAOA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,gBAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,iBAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,iBAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,gBAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,iBAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,gBAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,eAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,YAAA,GAAAX,sBAAA,CAAAC,OAAA;AACA,IAAAW,+BAAA,GAAAZ,sBAAA,CAAAC,OAAA;AACA,IAAAY,cAAA,GAAAZ,OAAA;AAIA,IAAAa,MAAA,GAAAb,OAAA;AAAgD,SAAAD,uBAAAe,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAvBhD;AACA;AACA;AACA;AACA;AACA;;AAiBA;;AAGA;;AAEA,MAAMG,WAAW,GAAG,0CAA0C;;AAE9D;AACA,MAAMC,QAAQ,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AAE/nB,SAAAC,SAAA,EAAY;EACzB,OAAO;IACLF,WAAW;IAAEG,GAAG;IAAEC;EACpB,CAAC;EAED,SAASD,GAAGA,CAACE,MAAM,EAAE;IACnB,IAAAC,cAAO,EAAE,GAAEN,WAAY,OAAM,CAAC;IAC9BO,OAAO,CAACF,MAAM,CAAC;IACf,MAAMG,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEN,GAAG,EAAE,EAAE;MAAEO,KAAK,EAAE;IAAI,CAAC;IAC/C,OAAOF,GAAG;EACZ;EAEA,SAASD,OAAOA,CAACF,MAAM,EAAE;IACvB;IACAM,SAAS,CAACN,MAAM,CAAC;IACjBA,MAAM,CAACO,MAAM,GAAI,GAAEP,MAAM,CAACO,MAAM,CAACC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAE,IAAGR,MAAM,CAACO,MAAM,CAACC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAE,EAAC,CAAC,CAAC;;IAExF;IACAR,MAAM,CAACS,MAAM,GAAGT,MAAM,CAACS,MAAM,CAACC,MAAM,CAACC,CAAC,IAAI,CAACf,QAAQ,CAACgB,QAAQ,CAACD,CAAC,CAACE,GAAG,CAAC,CAAC,CAAC,CAAC;;IAEtEb,MAAM,CAACS,MAAM,CAACK,OAAO,CAACH,CAAC,IAAII,kBAAkB,CAACJ,CAAC,CAAC,CAAC;IAEjD,SAASI,kBAAkBA,CAACC,KAAK,EAAE;MACjCC,wBAAwB,CAACD,KAAK,CAAC;MAC/BE,oBAAoB,CAACF,KAAK,CAAC,CAAC,CAAC;MAC7BG,uBAAuB,CAACH,KAAK,CAAC;IAChC;IAEA,IAAAI,wBAAe,EAAC,CAAC,CAACtB,GAAG,CAACE,MAAM,CAAC,CAAC,CAAC;IAC/B,IAAAqB,yBAAgB,EAAC,CAAC,CAACvB,GAAG,CAACE,MAAM,CAAC,CAAC,CAAC;;IAEhC,IAAAsB,uCAAwB,EAAC,CAAC,CAACxB,GAAG,CAACE,MAAM,CAAC,CAAC,CAAC;;IAExC;IACA,MAAMuB,IAAI,GAAGvB,MAAM,CAACS,MAAM,CAACC,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACE,GAAG,KAAK,KAAK,CAAC;IACvDU,IAAI,CAACT,OAAO,CAACH,CAAC,IAAI,IAAAa,oCAAqB,EAACb,CAAC,CAAC,CAAC;IAE3Cc,WAAW,CAACzB,MAAM,CAAC,CAAC,CAAC;;IAErB,IAAA0B,wBAAe,EAAC,CAAC,CAAC5B,GAAG,CAACE,MAAM,CAAC;IAE7B,IAAA2B,eAAM,EAAC,CAAC,CAAC7B,GAAG,CAACE,MAAM,CAAC,CAAC,CAAC;IACtB,IAAA4B,wBAAM,EAAC,CAAC,CAAC9B,GAAG,CAACE,MAAM,CAAC;IACpB,IAAA6B,yBAAM,EAAC,CAAC,CAAC/B,GAAG,CAACE,MAAM,CAAC;IACpB,IAAA8B,yBAAM,EAAC,CAAC,CAAChC,GAAG,CAACE,MAAM,CAAC;IAEpBA,MAAM,CAACS,MAAM,CAACK,OAAO,CAACH,CAAC,IAAIoB,mBAAmB,CAACpB,CAAC,CAAC,CAAC;IAElD,SAASoB,mBAAmBA,CAACf,KAAK,EAAE;MAClCgB,eAAe,CAAChB,KAAK,CAAC,CAAC,CAAC;;MAExBiB,cAAc,CAACjB,KAAK,EAAEhB,MAAM,CAAC;;MAE7B;MACAkC,mBAAmB,CAAClB,KAAK,EAAEhB,MAAM,CAAC;MAClCmC,mBAAmB,CAACnB,KAAK,EAAEhB,MAAM,CAAC;MAClC;IAEF;;IAEA;IACA,IAAAoC,uBAAa,EAAC,CAAC,CAACtC,GAAG,CAACE,MAAM,CAAC;IAE3B,IAAAqC,oBAAc,EAAC,CAAC,CAACvC,GAAG,CAACE,MAAM,CAAC;IAE5B,MAAMG,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEN,GAAG,EAAE,EAAE;MAAEO,KAAK,EAAE;IAAI,CAAC;IAC/C,OAAOF,GAAG;EACZ;;EAEA;EACA,SAASJ,QAAQA,CAACC,MAAM,EAAE;IACxB,IAAAC,cAAO,EAAE,GAAEN,WAAY,YAAW,CAAC;IACnC,MAAM2C,cAAc,GAAG,IAAAC,qBAAc,EAACvC,MAAM,CAAC;IAC7C,MAAMwC,YAAY,GAAG,IAAIC,sBAAU,CAACzC,MAAM,EAAE;MAAC0C,cAAc,EAAE;IAAK,CAAC,CAAC;IACpExC,OAAO,CAACsC,YAAY,CAAC;IACrB,MAAMG,cAAc,GAAG,IAAAJ,qBAAc,EAACC,YAAY,CAAC;IAEnD,IAAIF,cAAc,KAAKK,cAAc,EAAE;MACrC,OAAO;QAACvC,OAAO,EAAE,EAAE;QAAEC,KAAK,EAAE;MAAI,CAAC;IACnC;IAEA,OAAO;MAACD,OAAO,EAAE,CAAC,gBAAgB,CAAC;MAAEC,KAAK,EAAE;IAAK,CAAC,CAAC,CAAC;EAEtD;AACF;AAEA,SAASoB,WAAWA,CAACzB,MAAM,EAAE;EAC3B,MAAM4C,IAAI,GAAG5C,MAAM,CAACS,MAAM,CAACC,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACE,GAAG,KAAK,KAAK,CAAC;EAEvD,MAAMgC,WAAW,GAAG,CAClB;IAACC,IAAI,EAAE,GAAG;IAAEC,KAAK,EAAE;EAAK,CAAC,EACzB;IAACD,IAAI,EAAE,GAAG;IAAEC,KAAK,EAAE;EAAK,CAAC,CAC1B;;EAED;EACA,IAAIH,IAAI,CAACI,MAAM,KAAK,CAAC,EAAE;IACrB,MAAMC,IAAI,GAAG;MAACpC,GAAG,EAAE,KAAK;MAAEqC,IAAI,EAAE,GAAG;MAAEC,IAAI,EAAE,GAAG;MAAEC,SAAS,EAAEP;IAAW,CAAC;IAEvE7C,MAAM,CAACqD,WAAW,CAACJ,IAAI,CAAC;IACxB;EACF;EAEAL,IAAI,CAAC9B,OAAO,CAACH,CAAC,IAAI2C,oBAAoB,CAAC3C,CAAC,CAAC,CAAC;EAE1C,SAAS2C,oBAAoBA,CAACtC,KAAK,EAAE;IACnCA,KAAK,CAACoC,SAAS,GAAGpC,KAAK,CAACoC,SAAS,CAAC1C,MAAM,CAAC6C,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC3C,QAAQ,CAAC2C,EAAE,CAACT,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/E9B,KAAK,CAACoC,SAAS,CAACI,IAAI,CAACX,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC7B,KAAK,CAACoC,SAAS,CAACI,IAAI,CAACX,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAArB,oCAAqB,EAACR,KAAK,CAAC,CAAC,CAAC;EAChC;AAEF;AAEO,SAASE,oBAAoBA,CAACF,KAAK,EAAE;EAC1C;EACAA,KAAK,CAACoC,SAAS,EAAEtC,OAAO,CAACyC,EAAE,IAAIE,gCAAgC,CAACF,EAAE,CAAC,CAAC;EAEpE,SAASE,gCAAgCA,CAACC,QAAQ,EAAE;IAClD,IAAI,CAACA,QAAQ,CAACX,KAAK,CAACnC,QAAQ,CAAC,oBAAoB,CAAC,EAAE;MAClD;IACF;IACA8C,QAAQ,CAACX,KAAK,GAAGW,QAAQ,CAACX,KAAK,CAACY,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC,CAAC;EAC5E;AACF;AAEA,SAAS3B,eAAeA,CAAChB,KAAK,EAAE;EAC9B,IAAI,CAACA,KAAK,CAACoC,SAAS,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACxC,QAAQ,CAACI,KAAK,CAACH,GAAG,CAAC,EAAE;IACzL;EACF;EAEA,MAAM+C,cAAc,GAAG5C,KAAK,CAACoC,SAAS,CAAC1C,MAAM,CAAC6C,EAAE,IAAIA,EAAE,CAACT,IAAI,KAAK,GAAG,CAAC;EACpE,IAAIc,cAAc,CAACZ,MAAM,GAAG,CAAC,EAAE;IAC7BhC,KAAK,CAACoC,SAAS,GAAGQ,cAAc,CAAC,CAAC;IAClC;EACF;AAEF;AAEO,SAAS3C,wBAAwBA,CAACD,KAAK,EAAE;EAC9C,IAAI,CAACA,KAAK,CAACoC,SAAS,IAAIpC,KAAK,CAACoC,SAAS,CAACJ,MAAM,KAAK,CAAC,EAAE;IACpD;EACF;EACA,MAAMa,kBAAkB,GAAG7C,KAAK,CAACoC,SAAS,CAAC1C,MAAM,CAAC6C,EAAE,IAAIA,EAAE,CAACT,IAAI,KAAK,GAAG,CAAC;EACxE,IAAIe,kBAAkB,CAACb,MAAM,KAAK,CAAC,EAAE;IAAE;IACrC;EACF;EACAhC,KAAK,CAACoC,SAAS,GAAGS,kBAAkB,CAAC,CAAC;AACxC;AAEO,SAASvD,SAASA,CAACN,MAAM,EAAE;EAChCA,MAAM,CAACO,MAAM,GAAI,GAAEP,MAAM,CAACO,MAAM,CAACC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAE,MAAKR,MAAM,CAACO,MAAM,CAACC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAE,IAAGR,MAAM,CAACO,MAAM,CAACC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAE,MAAK,CAAC,CAAC;AAClI;AAEA,SAAS0B,mBAAmBA,CAAClB,KAAK,EAAEhB,MAAM,EAAE;EAAE;EAC5C,IAAIgB,KAAK,CAACH,GAAG,KAAK,KAAK,EAAE;IACvB;EACF;EAEA,MAAMiD,QAAQ,GAAG,IAAAC,cAAK,EAAC/C,KAAK,CAAC;EAE7BA,KAAK,CAACH,GAAG,GAAG,KAAK,CAAC,CAAC;EACnBG,KAAK,CAACkC,IAAI,GAAG,GAAG,CAAC,CAAC;EAClBlC,KAAK,CAACmC,IAAI,GAAG,GAAG,CAAC,CAAC;EAClB,IAAA3B,oCAAqB,EAACR,KAAK,CAAC;EAC5B;;EAGA8C,QAAQ,CAACjD,GAAG,GAAG,KAAK,CAAC,CAAC;EACtBiD,QAAQ,CAACX,IAAI,GAAG,GAAG,CAAC,CAAC;EACrB;EACAnD,MAAM,CAACqD,WAAW,CAACS,QAAQ,CAAC;AAC9B;AAEA,SAAS3B,mBAAmBA,CAACnB,KAAK,EAAEhB,MAAM,EAAE;EAAE;EAC5C,IAAIgB,KAAK,CAACH,GAAG,KAAK,KAAK,EAAE;IACvB;EACF;EAEA,MAAMmD,QAAQ,GAAG,IAAAD,cAAK,EAAC/C,KAAK,CAAC;EAE7BA,KAAK,CAACH,GAAG,GAAG,KAAK,CAAC,CAAC;EACnBG,KAAK,CAACkC,IAAI,GAAG,GAAG,CAAC,CAAC;EAClBlC,KAAK,CAACmC,IAAI,GAAG,GAAG,CAAC,CAAC;EAClB;EACAa,QAAQ,CAACnD,GAAG,GAAG,KAAK,CAAC,CAAC;EACtB;EACAb,MAAM,CAACqD,WAAW,CAACW,QAAQ,CAAC;AAC9B;AAGA,SAAS/B,cAAcA,CAACjB,KAAK,EAAEhB,MAAM,EAAE;EAAE;EACvC;EACA,IAAIgB,KAAK,CAACH,GAAG,KAAK,KAAK,EAAE;IACvB;EACF;EAEAoD,uBAAuB,CAACjD,KAAK,CAAC;EAE9BA,KAAK,CAACH,GAAG,GAAG,KAAK,CAAC,CAAC;EACnBG,KAAK,CAACkC,IAAI,GAAG,GAAG,CAAC,CAAC;EAClBlC,KAAK,CAACmC,IAAI,GAAG,GAAG,CAAC,CAAC;;EAElB;;EAEA,SAASe,gBAAgBA,CAACC,MAAM,EAAE;IAChC,IAAIA,MAAM,CAACC,KAAK,CAAC,mFAAmF,CAAC,EAAE;MACrG,OAAOD,MAAM,CAACR,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;IACvC;IACA,OAAO,KAAK;EACd;EAEA3C,KAAK,CAACoC,SAAS,EAAEtC,OAAO,CAACyC,EAAE,IAAIc,0BAA0B,CAACd,EAAE,CAAC,CAAC;EAE9D,SAASc,0BAA0BA,CAACX,QAAQ,EAAE;IAC5CA,QAAQ,CAACX,KAAK,GAAGuB,2BAA2B,CAACZ,QAAQ,CAAC,CAAC,CAAC;EAC1D;EAEA,SAASa,uBAAuBA,CAACvD,KAAK,EAAE;IACtC;IACA,MAAM,CAACwD,CAAC,CAAC,GAAGxD,KAAK,CAACoC,SAAS,CAAC1C,MAAM,CAAC6C,EAAE,IAAIA,EAAE,CAACT,IAAI,KAAK,GAAG,CAAC;IACzD,IAAI,CAAC0B,CAAC,EAAE;MACN,OAAOC,SAAS;IAClB;IACA,MAAMC,aAAa,GAAGR,gBAAgB,CAACM,CAAC,CAACzB,KAAK,CAAC;IAC/C,IAAI,CAAC2B,aAAa,EAAE;MAClB,OAAOD,SAAS;IAClB;IACA,MAAME,OAAO,GAAGH,CAAC,CAACzB,KAAK,CAACqB,KAAK,CAAC,cAAc,CAAC,GAAG,GAAG,GAAG,GAAG;IACzD,MAAMQ,WAAW,GAAGJ,CAAC,CAACzB,KAAK,CAACnC,QAAQ,CAAC,GAAG,CAAC,GAAI,IAAG+D,OAAQ,GAAED,aAAc,GAAE,GAAI,GAAEC,OAAQ,GAAED,aAAc,EAAC;IACzG;IACAF,CAAC,CAACzB,KAAK,GAAI,IAAG2B,aAAc,GAAE,CAAC,CAAC;IAChC,OAAOE,WAAW;EACpB;EAEA,SAASX,uBAAuBA,CAACjD,KAAK,EAAE;IACtC,MAAMwD,CAAC,GAAGD,uBAAuB,CAACvD,KAAK,CAAC;IACxC,IAAI,CAACwD,CAAC,EAAE;MACN,OAAOC,SAAS;IAClB;IACA,MAAMxB,IAAI,GAAG;MAAC,KAAK,EAAE,KAAK;MAAE,MAAM,EAAE,GAAG;MAAE,MAAM,EAAE,GAAG;MAAE,WAAW,EAAE,CAAC;QAAC,MAAM,EAAE,GAAG;QAAE,OAAO,EAAEuB;MAAC,CAAC;IAAC,CAAC;IAC/FxE,MAAM,CAACqD,WAAW,CAACJ,IAAI,CAAC;EAC1B;EAEA,SAASqB,2BAA2BA,CAACZ,QAAQ,EAAE;IAC7C,IAAIA,QAAQ,CAACZ,IAAI,KAAK,GAAG,EAAE;MACzB,OAAOY,QAAQ,CAACX,KAAK,CAACY,OAAO,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;IAC/E;IACA,IAAID,QAAQ,CAACZ,IAAI,KAAK,GAAG,EAAE;MACzB,OAAOY,QAAQ,CAACX,KAAK,CAACY,OAAO,CAAC,gBAAgB,EAAE,uBAAuB,CAAC;IAC1E;IACA,IAAID,QAAQ,CAACZ,IAAI,KAAK,GAAG,EAAE;MACzB,MAAM+B,IAAI,GAAGX,gBAAgB,CAACR,QAAQ,CAACX,KAAK,CAAC;MAC7C,IAAI8B,IAAI,EAAE;QACR,MAAML,CAAC,GAAGd,QAAQ,CAACX,KAAK,CAACqB,KAAK,CAAC,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG;QACvD,IAAIV,QAAQ,CAACX,KAAK,CAACnC,QAAQ,CAAC,GAAG,CAAC,EAAE;UAChC,OAAQ,GAAE4D,CAAE,IAAGK,IAAK,GAAE;QACxB;QACA,OAAQ,GAAEL,CAAE,GAAEK,IAAK,EAAC;MACtB;MACA,OAAOnB,QAAQ,CAACX,KAAK,CAACY,OAAO,CAAC,gBAAgB,EAAE,yBAAyB,CAAC;IAC5E;IACA,OAAOD,QAAQ,CAACX,KAAK;EACvB;AAGF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS5B,uBAAuBA,CAACH,KAAK,EAAE;EACtC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAACJ,QAAQ,CAACI,KAAK,CAACH,GAAG,CAAC,EAAE;IACvC;EACF;EACAG,KAAK,CAACoC,SAAS,EAAEtC,OAAO,CAACyC,EAAE,IAAIuB,0BAA0B,CAACvB,EAAE,CAAC,CAAC;EAE9D,SAASuB,0BAA0BA,CAACpB,QAAQ,EAAE;IAC5C,IAAI1C,KAAK,CAACH,GAAG,KAAK,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAACD,QAAQ,CAAC8C,QAAQ,CAACZ,IAAI,CAAC,EAAE;MAClEY,QAAQ,CAACX,KAAK,GAAGgC,8BAA8B,CAACC,0BAA0B,CAACC,0BAA0B,CAACC,0BAA0B,CAACxB,QAAQ,CAACX,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MACrJ;IACF;IACA,IAAI/B,KAAK,CAACH,GAAG,KAAK,KAAK,EAAE;MACvB6C,QAAQ,CAACX,KAAK,GAAGgC,8BAA8B,CAACC,0BAA0B,CAACC,0BAA0B,CAACC,0BAA0B,CAACxB,QAAQ,CAACX,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MACrJ;IACF;EACF;AACF;AAEA,SAASmC,0BAA0BA,CAACnC,KAAK,EAAE;EACzC,OAAOA,KAAK,CAACY,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CACzCA,OAAO,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAC3CA,OAAO,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAC/CA,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CACjCA,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,CAACA,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC;EAAE;EACzEA,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC;EAAE;EACtCA,OAAO,CAAC,cAAc,EAAE,aAAa,CAAC;EAAE;EACxCA,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAChCA,OAAO,CAAC,iBAAiB,EAAE,aAAa,CAAC;EACzC;EACA;EACAA,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAACA,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAC1DA,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,CAACA,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC;EAAE;EACzEA,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,CACpCA,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,CACpCA,OAAO,CAAC,oDAAoD,EAAE,EAAE,CAAC,CACjEA,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC;AACpC;AAEA,SAASqB,0BAA0BA,CAACjC,KAAK,EAAE;EACzC,OAAOA,KAAK,CAACY,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC;EACxC;EACA;EACAA,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAACA,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAChEA,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAACA,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAChEA,OAAO,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAACA,OAAO,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAC7FA,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;EACnC;AACF;AAEA,SAASsB,0BAA0BA,CAAClC,KAAK,EAAE;EACzC,OAAOA,KAAK,CAACY,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CACzCA,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAACA,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;EACjE;EACA;AACF;AAEA,SAASoB,8BAA8BA,CAAChC,KAAK,EAAE;EAC7C,OAAOA,KAAK,CAACY,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAC1CA,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAChCA,OAAO,CAAC,aAAa,EAAE,WAAW,CAAC,CACnCA,OAAO,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAC5CA,OAAO,CAAC,eAAe,EAAE,WAAW,CAAC,CACrCA,OAAO,CAAC,6BAA6B,EAAE,uBAAuB,CAAC,CAC/DA,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAC7BA,OAAO,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAC7CA,OAAO,CAAC,gBAAgB,EAAE,cAAc,CAAC,CACzCA,OAAO,CAAC,wBAAwB,EAAE,gBAAgB,CAAC,CACnDA,OAAO,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAC5CA,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAC1CA,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,CACjCA,OAAO,CAAC,aAAa,EAAE,WAAW,CAAC,CACnCA,OAAO,CAAC,mBAAmB,EAAE,SAAS,CAAC;EAAE;EACzCA,OAAO,CAAC,eAAe,EAAE,WAAW,CAAC,CACrCA,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CACjCA,OAAO,CAAC,gBAAgB,EAAE,WAAW,CAAC,CACtCA,OAAO,CAAC,kBAAkB,EAAE,YAAY,CAAC,CACzCA,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAC/BA,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC;EAAE;EACpCA,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAC/BA,OAAO,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAC5CA,OAAO,CAAC,iBAAiB,EAAE,YAAY,CAAC,CACxCA,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAChCA,OAAO,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;EAAE;EAC/CA,OAAO,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;EAAE;EAC/CA,OAAO,CAAC,cAAc,EAAE,wBAAwB,CAAC,CACjDA,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAACA,OAAO,CAAC,gBAAgB,EAAE,aAAa,CAAC,CACnFA,OAAO,CAAC,aAAa,EAAE,WAAW,CAAC,CAACA,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CACrEA,OAAO,CAAC,YAAY,EAAE,gBAAgB,CAAC,CACvCA,OAAO,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAClDA,OAAO,CAAC,YAAY,EAAE,YAAY,CAAC,CACnCA,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CACjCA,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC;AAEvC","ignoreList":[]}
1
+ {"version":3,"file":"cyrillux-usemarcon-replacement.js","names":["_clone","_interopRequireDefault","require","_marcRecord","_fix33X","_addMissingField","_addMissingField2","_addMissingField3","_addMissingField4","_fixCountryCodes","_fixLanguageCodes","_fixRelatorTerms","_indicatorFixes","_punctuation","_normalizeQualifyingInformation","_sortSubfields","_utils","obj","__esModule","default","description","dropTags","_default","fix","validate","record","nvdebug","realFix","res","message","valid","fixLeader","leader","substring","fields","filter","f","includes","tag","forEach","fieldSpecificStuff","field","removeOwnershipSubfield5","removeFromOldCatalog","translateFieldToFinnish","fixCountryCodes","fixLanguageCodes","fixQualifyingInformation","f028","sortAdjacentSubfields","fixField040","add041","fixRelatorTerms","fix33X","add336","add337","add338","fieldSpecificStuff2","removeSubfieldH","field260To264s","field410To490And810","field440To490And830","fixIndicators","fixPunctuation","originalString","recordToString","clonedRecord","MarcRecord","subfieldValues","modifiedString","f040","subfieldsBE","code","value","length","data","ind1","ind2","subfields","insertField","fixField040Subfields","sf","push","removeFromOldCatalogFromSubfield","subfield","replace","filteredFields","remainingSubfields","field810","clone","field830","createCopyright264Field","getCopyrightYear","string","match","field260To264Normalization","field260To264Normalization2","createCopyright264Value","c","undefined","copyrightYear","copType","returnValue","year","translateSubfieldToFinnish","finnishTranslationsAndMappings","expandFinnishAbbreviations","expandSwedishAbbreviations","expandEnglishAbbreviations"],"sources":["../src/cyrillux-usemarcon-replacement.js"],"sourcesContent":["/*\n* cyrillux-usemarcon-replacement.js -- implement and improve https://github.com/NatLibFi/USEMARCON-Cyrillux/tree/master\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n*/\n\nimport clone from 'clone';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {default as fix33X} from './fix-33X';\nimport {default as add041} from './addMissingField041';\nimport {default as add336} from './addMissingField336';\nimport {default as add337} from './addMissingField337';\nimport {default as add338} from './addMissingField338';\nimport {default as fixCountryCodes} from './fix-country-codes';\nimport {default as fixLanguageCodes} from './fix-language-codes';\nimport {default as fixRelatorTerms} from './fixRelatorTerms';\nimport {default as fixIndicators} from './indicator-fixes';\nimport {default as fixPunctuation} from './punctuation2';\nimport {default as fixQualifyingInformation} from './normalize-qualifying-information';\nimport {sortAdjacentSubfields} from './sortSubfields';\n\n\n// import createDebugLogger from 'debug';\nimport {nvdebug, recordToString} from './utils';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');\n\nconst description = 'Replacement for Cyrillux usemarcon rules';\n\n// Extended original list with 541, 561, 562, 583, 584\nconst dropTags = ['001', '003', '010', '012', '014', '015', '016', '019', '025', '029', '032', '035', '036', '037', '038', '042', '049', '051', '061', '068', '071', '074', '079', '090', '091', '092', '094', '095', '096', '097', '099', '249', '261', '262', '350', '400', '411', '541', '561', '562', '574', '575', '577', '578', '583', '584', '589', '590', '591', '592', '593', '594', '595', '596', '597', '598', '599', '653', '698', '741', '742', '744', '761', '790', '841', '842', '843', '844', '845', '850', '852', '853', '854', '855', '858', '859', '863', '864', '865', '866', '867', '868', '876', '877', '878', '882', '886', '887', '888', '890', '899'];\n\nexport default function () {\n return {\n description, fix, validate\n };\n\n function fix(record) {\n nvdebug(`${description}: fix`);\n realFix(record);\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function realFix(record) {\n // Fix leader: standard fixes + update LDR/17 to '4'\n fixLeader(record);\n record.leader = `${record.leader.substring(0, 17)}4${record.leader.substring(18, 24)}`; // eslint-disable-line functional/immutable-data\n\n // Remove unwanted fields:\n record.fields = record.fields.filter(f => !dropTags.includes(f.tag)); // eslint-disable-line functional/immutable-data\n\n record.fields.forEach(f => fieldSpecificStuff(f));\n\n function fieldSpecificStuff(field) {\n removeOwnershipSubfield5(field);\n removeFromOldCatalog(field); // Remove LoC phrase \"[from old catalog]\" from srings\n translateFieldToFinnish(field);\n }\n\n fixCountryCodes().fix(record); // 008/15-17\n fixLanguageCodes().fix(record); // 008/35-37 AND 041 (note that all relevant subfield codes are fixed, not just $a)\n\n fixQualifyingInformation().fix(record); // 015, 020, 024 and 028\n\n // Field 028: use $b$a, not $a$b:\n const f028 = record.fields.filter(f => f.tag === '028');\n f028.forEach(f => sortAdjacentSubfields(f));\n\n fixField040(record); // All $b values are changed to 'mul'. As a side effect 33X$b=>$a mappings are in Finnish! Ok in this domain!\n add041().fix(record);\n\n fixRelatorTerms().fix(record);\n\n fix33X().fix(record); // 33X$a => 33X$a$b$2\n add336().fix(record);\n add337().fix(record);\n add338().fix(record);\n\n record.fields.forEach(f => fieldSpecificStuff2(f));\n\n function fieldSpecificStuff2(field) {\n removeSubfieldH(field); // only after 33X creation, as 245$h might be useful\n\n field260To264s(field, record);\n\n // NB! 300 (before or after 33X creation?)\n field410To490And810(field, record);\n field440To490And830(field, record);\n // handle505(field); // not applying them usemarcon-cyrillux rules for field 505 as I can't understand their motivation.\n\n }\n\n // The fixer below implement Cyrillux rules such as 245I1 | 245I1 | If (Exists(@100) Or Exists(@110) Or Exists(@111) Or Exists(@130)) Then '1' Else '0' and plenty of other good stuff:\n fixIndicators().fix(record);\n\n fixPunctuation().fix(record);\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n // Validation is currently done in subparts\n function validate(record) {\n nvdebug(`${description}: validate`);\n const originalString = recordToString(record);\n const clonedRecord = new MarcRecord(record, {subfieldValues: false});\n realFix(clonedRecord);\n const modifiedString = recordToString(clonedRecord);\n\n if (originalString === modifiedString) {\n return {message: [], valid: true};\n }\n\n return {message: ['Record changed'], valid: false}; // Less than descriptive but will do...\n\n }\n}\n\nfunction fixField040(record) {\n const f040 = record.fields.filter(f => f.tag === '040');\n\n const subfieldsBE = [\n {code: 'b', value: 'mul'},\n {code: 'e', value: 'rda'}\n ];\n\n // Add 040 if there isn't one:\n if (f040.length === 0) {\n const data = {tag: '040', ind1: ' ', ind2: ' ', subfields: subfieldsBE};\n\n record.insertField(data);\n return;\n }\n\n f040.forEach(f => fixField040Subfields(f));\n\n function fixField040Subfields(field) {\n field.subfields = field.subfields.filter(sf => !['b', 'e'].includes(sf.code)); // eslint-disable-line functional/immutable-data\n field.subfields.push(subfieldsBE[0]); // eslint-disable-line functional/immutable-data\n field.subfields.push(subfieldsBE[1]); // eslint-disable-line functional/immutable-data\n sortAdjacentSubfields(field); // put $b and $e to their proper places\n }\n\n}\n\nexport function removeFromOldCatalog(field) {\n // See https://catalog.loc.gov/vwebv/ui/en_US/htdocs/help/faqs.html for motivation\n field.subfields?.forEach(sf => removeFromOldCatalogFromSubfield(sf));\n\n function removeFromOldCatalogFromSubfield(subfield) {\n if (!subfield.value.includes('[from old catalog]')) {\n return;\n }\n subfield.value = subfield.value.replace(/ *\\[from old catalog\\]/gui, ''); // eslint-disable-line functional/immutable-data\n }\n}\n\nfunction removeSubfieldH(field) {\n if (!field.subfields || !['245', '246', '247', '740', '760', '762', '765', '767', '770', '772', '773', '774', '775', '776', '777', '780', '785', '786', '787', '788'].includes(field.tag)) {\n return;\n }\n\n const filteredFields = field.subfields.filter(sf => sf.code !== 'h');\n if (filteredFields.length > 0) {\n field.subfields = filteredFields; // eslint-disable-line functional/immutable-data\n return;\n }\n\n}\n\nexport function removeOwnershipSubfield5(field) {\n if (!field.subfields || field.subfields.length === 0) {\n return;\n }\n const remainingSubfields = field.subfields.filter(sf => sf.code !== '5');\n if (remainingSubfields.length === 0) { // sanity check/robustness\n return;\n }\n field.subfields = remainingSubfields; // eslint-disable-line functional/immutable-data\n}\n\nexport function fixLeader(record) {\n record.leader = `${record.leader.substring(0, 9)}a22${record.leader.substring(12, 18)}i${record.leader.substring(19, 20)}4500`; // eslint-disable-line functional/immutable-data\n}\n\nfunction field410To490And810(field, record) { // might be generic... if so, move to utils...\n if (field.tag !== '410') {\n return;\n }\n\n const field810 = clone(field);\n\n field.tag = '490'; // eslint-disable-line functional/immutable-data\n field.ind1 = '1'; // eslint-disable-line functional/immutable-data\n field.ind2 = ' '; // eslint-disable-line functional/immutable-data\n sortAdjacentSubfields(field);\n // 490: Fix punctuation elsewhere. (Note that the current support is lagging...)\n\n\n field810.tag = '810'; // eslint-disable-line functional/immutable-data\n field810.ind2 = ' '; // eslint-disable-line functional/immutable-data\n // 810: Fix punctuation elsewhere. (Note that the current support is lagging...)\n record.insertField(field810);\n}\n\nfunction field440To490And830(field, record) { // might be generic... if so, move to utils...\n if (field.tag !== '440') {\n return;\n }\n\n const field830 = clone(field);\n\n field.tag = '490'; // eslint-disable-line functional/immutable-data\n field.ind1 = '1'; // eslint-disable-line functional/immutable-data\n field.ind2 = ' '; // eslint-disable-line functional/immutable-data\n // 490: Fix punctuation elsewhere. (Note that the current support is lagging...)\n field830.tag = '830'; // eslint-disable-line functional/immutable-data\n // 830: Fix punctuation elsewhere. (Note that the current support is lagging...)\n record.insertField(field830);\n}\n\n\nfunction field260To264s(field, record) { // might be generic... if so, move to utils...\n // As per my quick reading of usemarcon-cyrillux\n if (field.tag !== '260') {\n return;\n }\n\n createCopyright264Field(field);\n\n field.tag = '264'; // eslint-disable-line functional/immutable-data\n field.ind1 = ' '; // eslint-disable-line functional/immutable-data\n field.ind2 = '1'; // eslint-disable-line functional/immutable-data\n\n // NB! Usemarcon does not handle 260$e$f$g => 264$a$b$c, so I'm not botherin with it either... (However, we could check our merge reducer code...)\n\n function getCopyrightYear(string) {\n if (string.match(/^(?:\\[?[Ccp]|[^0-9]*(?:cop|©|℗))[^0-9]*(?:1[789][0-9][0-9]|20[0-2][0-9])[^0-9]*$/u)) {\n return string.replace(/[^0-9]/ug, '');\n }\n return false;\n }\n\n field.subfields?.forEach(sf => field260To264Normalization(sf));\n\n function field260To264Normalization(subfield) {\n subfield.value = field260To264Normalization2(subfield); // eslint-disable-line functional/immutable-data\n }\n\n function createCopyright264Value(field) {\n // Extract/split copyright year to a separate field:\n const [c] = field.subfields.filter(sf => sf.code === 'c');\n if (!c) {\n return undefined;\n }\n const copyrightYear = getCopyrightYear(c.value);\n if (!copyrightYear) {\n return undefined;\n }\n const copType = c.value.match(/(?:^\\[?p|℗)/u) ? '℗' : '©';\n const returnValue = c.value.includes('[') ? `[${copType}${copyrightYear}]` : `${copType}${copyrightYear}`;\n // Moidy the original value:\n c.value = `[${copyrightYear}]`; // eslint-disable-line functional/immutable-data\n return returnValue;\n }\n\n function createCopyright264Field(field) {\n const c = createCopyright264Value(field);\n if (!c) {\n return undefined;\n }\n const data = {'tag': '264', 'ind1': ' ', 'ind2': '4', 'subfields': [{'code': 'c', 'value': c}]};\n record.insertField(data);\n }\n\n function field260To264Normalization2(subfield) {\n if (subfield.code === 'a') {\n return subfield.value.replace(/\\b[Ss]\\. ?l\\./u, 'Kustannuspaikka tuntematon');\n }\n if (subfield.code === 'b') {\n return subfield.value.replace(/\\b[Ss]\\. ?n\\./u, 'kustantaja tuntematon');\n }\n if (subfield.code === 'c') {\n const year = getCopyrightYear(subfield.value);\n if (year) {\n const c = subfield.value.match(/(?:^p|℗)/u) ? 'p' : 'c';\n if (subfield.value.includes('[')) {\n return `${c}[${year}]`;\n }\n return `${c}${year}`;\n }\n return subfield.value.replace(/\\b[Ss]\\. ?a\\./u, 'julkaisuaika tuntematon');\n }\n return subfield.value;\n }\n\n\n}\n\n/*\nfunction handle505(field) {\n if (field.tag !== '505') {\n return;\n }\n // Don't know how/why usemarcon-cyrillux is so sure about ind1...\n field.ind1 = '0'; // eslint-disable-line functional/immutable-data\n // usemarcon-cyrillux drops irrelevant subfields, so we do the same. However, we have included some control subfields in the kept side:\n const keptSubfields = field.subfields.filter(sf => ['a', 'g', 'r', 't', 'u', '6', '8', '9'].includes(sf.code));\n\n if (keptSubfields.some(sf => ['a', 'g', 'r', 't', 'u'].includes(sf.code))) {\n field.subfields = keptSubfields; // eslint-disable-line functional/immutable-data\n return;\n }\n}\n*/\n\nfunction translateFieldToFinnish(field) {\n if (!['020', '300'].includes(field.tag)) {\n return;\n }\n field.subfields?.forEach(sf => translateSubfieldToFinnish(sf));\n\n function translateSubfieldToFinnish(subfield) {\n if (field.tag === '020' && ['a', 'q', 'z'].includes(subfield.code)) {\n subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value)))); // eslint-disable-line functional/immutable-data\n return;\n }\n if (field.tag === '300') {\n subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value)))); // eslint-disable-line functional/immutable-data\n return;\n }\n }\n}\n\nfunction expandEnglishAbbreviations(value) {\n return value.replace(/\\bbk\\.\\b/gui, 'book').\n replace(/chiefly col\\./ui, 'chiefly color').\n replace(/col\\. ill\\./ui, 'color illustrations').\n replace(/diagrs\\./ui, 'diagrams').\n replace(/\\bhbk\\.\\b/gui, 'hardcover').replace(/\\bhbk\\b/gui, 'hardcover'). // expand to MTS-compliant form\n replace(/\\b1 hr\\./gui, '1 hour').\n replace(/\\bhr\\./gui, 'hours').\n replace(/\\bill\\./gui, 'illustrated'). // or illustrations (or Swedish \"illustrerad\" or...)\n replace(/\\billus\\./gui, 'illustrated'). // or illustrations\n replace(/incl\\./gui, 'includes').\n replace(/fold\\.? maps/gui, 'folded maps').\n // replace(/\\bmin\\./gu, 'minutes').\n // replace(/\\bmin\\b/gu, 'minutes').\n replace(/\\bp\\.\\b/gui, 'pages').replace(/\\bp\\b/gu, 'pages').\n replace(/\\bpbk\\.\\b/gui, 'paperback').replace(/\\bpbk\\b/gui, 'paperback'). // expand to MTS-compliant form\n replace(/\\bpdf\\b/gui, 'PDF').\n replace(/\\bports\\./gui, 'portraits').\n replace('sd., col.', 'sound, color').\n replace(/ *\\((?:chiefly col\\.|chiefly color|some col[s.])\\)/gui, '').\n replace(/\\b1 hr\\./gui, '1 hour');\n}\n\nfunction expandFinnishAbbreviations(value) {\n return value.replace(/\\bcn\\. /gu, 'noin ').\n // replace(/\\bmin\\./gu, 'minuuttia').\n // replace(/\\bmin\\b/gu, 'minuuttia').\n replace(/\\bnid\\./gu, 'nidottu').replace(/\\bnid\\b/gui, 'nidottu').\n replace(/\\bsid\\./gu, 'sidottu').replace(/\\bsid\\b/gui, 'sidottu').\n replace(/\\bverkkojulk\\.\\b/gu, 'verkkojulkaisu').replace(/\\bverkkojulk\\b/gu, 'verkkojulkaisu').\n replace(/^\\(([^)]+)\\)$/u, '$1'); // eslint-disable-line prefer-named-capture-group\n // <- removal of brackets above could use a better location\n}\n\nfunction expandSwedishAbbreviations(value) {\n return value.replace(/\\bca\\. /gu, 'circa ').\n replace(/\\bhft\\./gui, 'häftad').replace(/\\bhft\\b/gui, 'häftad');\n // replace(/\\bmin\\./gu, 'minuter').\n // replace(/\\bmin\\b/gu, 'minuter');\n}\n\nfunction finnishTranslationsAndMappings(value) {\n return value.replace('analog', 'analoginen').\n replace('approximately', 'noin').\n replace('audio discs', 'äänilevyä').\n replace('black and white', 'mustavalkoinen').\n replace(/\\bbilaga\\b/gui, 'liite').\n replace(/\\bbilagor\\b/gui, 'liitettä').\n replace(/\\bcharts\\b/gui, 'kaavioita').\n replace('chiefly color illustrations', 'pääosin värikuvitettu').\n replace('chiefly', 'pääosin').\n replace(/\\bcirca\\b/gui, 'noin').\n replace(/coil[- ]?bound/gui, 'kierreselkä').\n replace('color illustrations', 'värikuvitus').\n replace(/comb[- ]?bound/gui, 'kierreselkä').\n replace(/\\bdigital\\b/gui, 'digitaalinen').\n replace(/\\belectronic book\\b/gui, 'verkkoaineisto').\n replace('(flera nummersviter)', '(useita numerointijaksoja)').\n replace(/\\bfolded sheet\\b/gui, 'taitelehti').\n replace(/\\bfärgillustratione[nr]\\b/gui, 'värikuvitus').\n replace(/\\bhard(?:back|cover)\\b/gui, 'kovakantinen').\n replace(/\\bhours\\b/gui, 'tuntia').\n replace(/\\bi flera nummersviter/gui, 'useina numerointijaksoina').\n replace('illustrated', 'kuvitettu').\n replace(/illustrations?\\b/gui, 'kuvitettu'). // Based on usemacron-bookwhere (NB! usemarcon-cyrillux had kuvitus/kuvitettu)\n replace(/\\binbunden\\b/gui, 'kovakantinen'). // swe\n replace(/\\binsert\\b/gui, 'liite').\n replace(/\\binserts\\b/gui, 'liitteitä').\n replace(/\\bin various pagings/gui, 'useina numerointijaksoina').\n replace('leaves of plates', 'kuvalehteä').\n replace(/\\bljudskiva\\b/gui, 'äänilevy').\n replace(/\\bljudskivor\\b/gui, 'äänilevyä').\n replace(/\\bmap\\b/gui, 'kartta').\n replace(/\\bmaps\\b/gui, 'karttoja'). // or karttaa?\n replace('minutes', 'minuuttia').\n replace('mjuka pärmar', 'pehmeäkantinen').\n replace('online resource', 'verkkoaineisto').\n replace('onlineresurs', 'verkkoaineisto').\n replace('onumrerade', 'numeroimatonta').\n replace('pages of plates', 'kuvalehteä').\n replace(/\\bpages\\b/gui, 'sivua').\n replace(/\\bpaperback\\b/gui, 'pehmeäkantinen'). // MTS alt\n replace(/\\bSeiten\\b/gu, 'sivua').\n replace(/\\bsoftcover\\b/gui, 'pehmeäkantinen'). // MTS pref\n replace('sound, color', 'äänellinen, värillinen').\n replace('sound cassettes', 'äänikasettia').replace('sound cassette', 'äänikasetti').\n replace('sound discs', 'äänilevyä').replace(/sound disc\\b/gui, 'äänilevy').\n replace(/(?:spiral[- ]?bound|spiralrygg)/gui, 'kierreselkä').\n replace('svartvit', 'mustavalkoinen').\n replace('unnumbered', 'numeroimatonta').\n replace('(various pagings)', '(useita numerointijaksoja)').\n replace(/\\bverkkojulkaisu\\b/gui, 'verkkoaineisto').\n replace('videodiscs', 'videolevyä').\n replace('videodisc', 'videolevy').\n replace(/\\b1 hour\\b/gui, '1 tunti');\n\n}\n"],"mappings":"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","ignoreList":[]}
@@ -90,7 +90,7 @@ function fieldNeedsModification(field, add = true) {
90
90
  /////////////////////////////////////////////////////////////////////////////////////
91
91
 
92
92
  //const stripCrap = / *[-;:,+]+$/u;
93
- const defaultNeedsPuncAfter = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö)$/u;
93
+ const needsPuncAfterAlphanumeric = /(?:[a-z0-9A-Z]|å|ä|ö|Å|Ä|Ö)$/u;
94
94
  const defaultNeedsPuncAfter2 = /(?:[\]a-zA-Z0-9)]|ä|å|ö|Å|Ä|Ö)$/u;
95
95
  const doesNotEndInPunc = /[^!?.:;,]$/u; // non-punc for pre-240/700/XXX $, note that '.' comes if preceded by ')'
96
96
  const blocksPuncRHS = /^(?:\()/u;
@@ -186,29 +186,32 @@ const addX00Dot = {
186
186
  'add': '.',
187
187
  'code': 'abcdetv',
188
188
  'followedBy': '#fklptu',
189
- 'context': defaultNeedsPuncAfter
189
+ 'context': needsPuncAfterAlphanumeric
190
+ };
191
+ const addX10iColon = {
192
+ 'name': 'Punctuate relationship information',
193
+ 'code': 'i',
194
+ 'context': defaultNeedsPuncAfter2
190
195
  };
191
-
192
- //const addX10iaComma = {'name': 'Punctuate relationship information', 'code': 'i', 'followedBy': 'a', 'context': defaultNeedsPuncAfter2};
193
196
  const addX10bDot = {
194
197
  'name': 'Add X10 pre-$b dot',
195
198
  'add': '.',
196
199
  'code': 'ab',
197
200
  'followedBy': 'b',
198
- 'context': defaultNeedsPuncAfter
201
+ 'context': needsPuncAfterAlphanumeric
199
202
  };
200
203
  const addX10eComma = {
201
204
  'add': ',',
202
205
  'code': 'abe',
203
206
  'followedBy': 'e',
204
- 'context': defaultNeedsPuncAfter
207
+ 'context': defaultNeedsPuncAfter2
205
208
  };
206
209
  const addX10Dot = {
207
210
  'name': 'Add X10 final dot',
208
211
  'add': '.',
209
212
  'code': 'abet',
210
213
  'followedBy': 'tu#',
211
- 'context': defaultNeedsPuncAfter
214
+ 'context': needsPuncAfterAlphanumeric
212
215
  };
213
216
  const addColonToRelationshipInformation = {
214
217
  'name': 'Add \':\' to 7X0 $i relationship info',
@@ -460,6 +463,10 @@ const cleanValidPunctuationRules = {
460
463
  '245': clean24X,
461
464
  '246': clean24X,
462
465
  '260': [{
466
+ 'code': 'abc',
467
+ 'followedBy': 'a',
468
+ 'remove': / ;$/u
469
+ }, {
463
470
  'code': 'a',
464
471
  'followedBy': 'b',
465
472
  'remove': / :$/u
@@ -544,29 +551,29 @@ const cleanValidPunctuationRules = {
544
551
  // Overgeneralizes a bit: eg. addColonToRelationshipInformation only applies to 700/710 but as others don't have $i, it's fine.
545
552
  const addToAllEntryFields = [addDotBeforeLanguageSubfieldL, addSemicolonBeforeVolumeDesignation, addColonToRelationshipInformation];
546
553
  const addX00 = [addX00aComma, addX00aComma2, addX00Dot, addX00dComma, ...addToAllEntryFields];
547
- const addX10 = [addX10bDot, addX10eComma, addX10Dot, ...addToAllEntryFields];
554
+ const addX10 = [addX10iColon, addX10bDot, addX10eComma, addX10Dot, ...addToAllEntryFields];
548
555
  const addX11 = [...addToAllEntryFields];
549
556
  const addX30 = [...addToAllEntryFields];
550
557
  const add24X = [{
551
558
  'code': 'i',
552
559
  'followedBy': 'a',
553
560
  'add': ':',
554
- 'context': defaultNeedsPuncAfter
561
+ 'context': needsPuncAfterAlphanumeric
555
562
  }, {
556
563
  'code': 'a',
557
564
  'followedBy': 'b',
558
565
  'add': ' :',
559
- 'context': defaultNeedsPuncAfter
566
+ 'context': needsPuncAfterAlphanumeric
560
567
  }, {
561
568
  'code': 'abk',
562
569
  'followedBy': 'f',
563
570
  'add': ',',
564
- 'context': defaultNeedsPuncAfter
571
+ 'context': needsPuncAfterAlphanumeric
565
572
  }, {
566
573
  'code': 'abfnp',
567
574
  'followedBy': 'c',
568
575
  'add': ' /',
569
- 'context': defaultNeedsPuncAfter
576
+ 'context': needsPuncAfterAlphanumeric
570
577
  }, addDotBeforeLanguageSubfieldL];
571
578
  const add245 = [...add24X,
572
579
  // Blah! Also "$a = $b" and "$a ; $b" can be valid... But ' :' is better than nothing, I guess...
@@ -574,17 +581,17 @@ const add245 = [...add24X,
574
581
  'code': 'ab',
575
582
  'followedBy': 'n',
576
583
  'add': '.',
577
- 'context': defaultNeedsPuncAfter
584
+ 'context': needsPuncAfterAlphanumeric
578
585
  }, {
579
586
  'code': 'n',
580
587
  'followedBy': 'p',
581
588
  'add': ',',
582
- 'context': defaultNeedsPuncAfter
589
+ 'context': defaultNeedsPuncAfter2
583
590
  }, {
584
591
  'code': 'abc',
585
592
  'followedBy': '#',
586
593
  'add': '.',
587
- 'context': defaultNeedsPuncAfter
594
+ 'context': needsPuncAfterAlphanumeric
588
595
  } // Stepping on "punctuation validator's" toes
589
596
  ];
590
597
  const addSeriesTitle = [
@@ -598,7 +605,7 @@ const addSeriesTitle = [
598
605
  'code': 'axyz',
599
606
  'followedBy': 'xy',
600
607
  'add': ',',
601
- 'context': defaultNeedsPuncAfter
608
+ 'context': defaultNeedsPuncAfter2
602
609
  }, addSemicolonBeforeVolumeDesignation // eg. 490$axyz-$v
603
610
  ];
604
611
  const addPairedPunctuationRules = {
@@ -616,7 +623,7 @@ const addPairedPunctuationRules = {
616
623
  'add': ' :',
617
624
  'context': defaultNeedsPuncAfter2
618
625
  }, {
619
- 'code': 'b',
626
+ 'code': 'ab',
620
627
  'followedBy': 'c',
621
628
  'add': ',',
622
629
  'context': defaultNeedsPuncAfter2
@@ -653,7 +660,7 @@ const addPairedPunctuationRules = {
653
660
  'code': 'c',
654
661
  'followedBy': '#',
655
662
  'add': '.',
656
- 'context': defaultNeedsPuncAfter,
663
+ 'context': needsPuncAfterAlphanumeric,
657
664
  'ind2': ['0', '1', '2', '3']
658
665
  }],
659
666
  '300': [{
@@ -701,7 +708,7 @@ const addPairedPunctuationRules = {
701
708
  'code': 'i',
702
709
  'followedBy': 'a',
703
710
  'add': ':',
704
- 'context': defaultNeedsPuncAfter
711
+ 'context': defaultNeedsPuncAfter2
705
712
  }]
706
713
  };
707
714