@natlibfi/marc-record-validators-melinda 11.0.0 → 11.1.0-alpha.1

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