im_onix 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +39 -0
  3. data/bin/html_codelist_to_yml.rb +46 -0
  4. data/bin/onix3_to_onix2.rb +192 -0
  5. data/bin/onix3_to_onix3.rb +401 -0
  6. data/bin/onix_bench.rb +15 -0
  7. data/bin/onix_pp.rb +216 -0
  8. data/bin/onix_split.rb +72 -0
  9. data/data/codelists/codelist-1.yml +12 -0
  10. data/data/codelists/codelist-10.yml +51 -0
  11. data/data/codelists/codelist-100.yml +8 -0
  12. data/data/codelists/codelist-101.yml +7 -0
  13. data/data/codelists/codelist-102.yml +5 -0
  14. data/data/codelists/codelist-11.yml +13 -0
  15. data/data/codelists/codelist-12.yml +15 -0
  16. data/data/codelists/codelist-121.yml +162 -0
  17. data/data/codelists/codelist-13.yml +10 -0
  18. data/data/codelists/codelist-138.yml +8 -0
  19. data/data/codelists/codelist-139.yml +102 -0
  20. data/data/codelists/codelist-14.yml +6 -0
  21. data/data/codelists/codelist-140.yml +9 -0
  22. data/data/codelists/codelist-141.yml +12 -0
  23. data/data/codelists/codelist-142.yml +14 -0
  24. data/data/codelists/codelist-143.yml +9 -0
  25. data/data/codelists/codelist-144.yml +10 -0
  26. data/data/codelists/codelist-145.yml +9 -0
  27. data/data/codelists/codelist-146.yml +5 -0
  28. data/data/codelists/codelist-147.yml +16 -0
  29. data/data/codelists/codelist-148.yml +6 -0
  30. data/data/codelists/codelist-149.yml +7 -0
  31. data/data/codelists/codelist-15.yml +15 -0
  32. data/data/codelists/codelist-150.yml +128 -0
  33. data/data/codelists/codelist-151.yml +10 -0
  34. data/data/codelists/codelist-152.yml +4 -0
  35. data/data/codelists/codelist-153.yml +19 -0
  36. data/data/codelists/codelist-154.yml +11 -0
  37. data/data/codelists/codelist-155.yml +10 -0
  38. data/data/codelists/codelist-156.yml +6 -0
  39. data/data/codelists/codelist-157.yml +6 -0
  40. data/data/codelists/codelist-158.yml +32 -0
  41. data/data/codelists/codelist-159.yml +8 -0
  42. data/data/codelists/codelist-16.yml +8 -0
  43. data/data/codelists/codelist-160.yml +6 -0
  44. data/data/codelists/codelist-161.yml +5 -0
  45. data/data/codelists/codelist-162.yml +9 -0
  46. data/data/codelists/codelist-163.yml +18 -0
  47. data/data/codelists/codelist-164.yml +7 -0
  48. data/data/codelists/codelist-165.yml +6 -0
  49. data/data/codelists/codelist-166.yml +6 -0
  50. data/data/codelists/codelist-167.yml +7 -0
  51. data/data/codelists/codelist-168.yml +4 -0
  52. data/data/codelists/codelist-169.yml +7 -0
  53. data/data/codelists/codelist-17.yml +95 -0
  54. data/data/codelists/codelist-170.yml +2 -0
  55. data/data/codelists/codelist-171.yml +4 -0
  56. data/data/codelists/codelist-172.yml +3 -0
  57. data/data/codelists/codelist-173.yml +5 -0
  58. data/data/codelists/codelist-174.yml +4 -0
  59. data/data/codelists/codelist-175.yml +217 -0
  60. data/data/codelists/codelist-176.yml +16 -0
  61. data/data/codelists/codelist-177.yml +4 -0
  62. data/data/codelists/codelist-178.yml +30 -0
  63. data/data/codelists/codelist-179.yml +4 -0
  64. data/data/codelists/codelist-18.yml +8 -0
  65. data/data/codelists/codelist-184.yml +10 -0
  66. data/data/codelists/codelist-19.yml +9 -0
  67. data/data/codelists/codelist-196.yml +22 -0
  68. data/data/codelists/codelist-197.yml +7 -0
  69. data/data/codelists/codelist-198.yml +4 -0
  70. data/data/codelists/codelist-2.yml +8 -0
  71. data/data/codelists/codelist-20.yml +2 -0
  72. data/data/codelists/codelist-203.yml +10 -0
  73. data/data/codelists/codelist-204.yml +6 -0
  74. data/data/codelists/codelist-21.yml +36 -0
  75. data/data/codelists/codelist-22.yml +11 -0
  76. data/data/codelists/codelist-23.yml +17 -0
  77. data/data/codelists/codelist-24.yml +13 -0
  78. data/data/codelists/codelist-25.yml +31 -0
  79. data/data/codelists/codelist-26.yml +94 -0
  80. data/data/codelists/codelist-27.yml +101 -0
  81. data/data/codelists/codelist-28.yml +10 -0
  82. data/data/codelists/codelist-29.yml +26 -0
  83. data/data/codelists/codelist-3.yml +13 -0
  84. data/data/codelists/codelist-30.yml +19 -0
  85. data/data/codelists/codelist-31.yml +5 -0
  86. data/data/codelists/codelist-32.yml +5 -0
  87. data/data/codelists/codelist-33.yml +44 -0
  88. data/data/codelists/codelist-34.yml +18 -0
  89. data/data/codelists/codelist-35.yml +8 -0
  90. data/data/codelists/codelist-36.yml +5 -0
  91. data/data/codelists/codelist-37.yml +8 -0
  92. data/data/codelists/codelist-38.yml +42 -0
  93. data/data/codelists/codelist-39.yml +21 -0
  94. data/data/codelists/codelist-40.yml +8 -0
  95. data/data/codelists/codelist-41.yml +8 -0
  96. data/data/codelists/codelist-42.yml +18 -0
  97. data/data/codelists/codelist-43.yml +8 -0
  98. data/data/codelists/codelist-44.yml +22 -0
  99. data/data/codelists/codelist-45.yml +15 -0
  100. data/data/codelists/codelist-46.yml +11 -0
  101. data/data/codelists/codelist-47.yml +6 -0
  102. data/data/codelists/codelist-48.yml +13 -0
  103. data/data/codelists/codelist-49.yml +87 -0
  104. data/data/codelists/codelist-5.yml +20 -0
  105. data/data/codelists/codelist-50.yml +10 -0
  106. data/data/codelists/codelist-51.yml +37 -0
  107. data/data/codelists/codelist-52.yml +3 -0
  108. data/data/codelists/codelist-53.yml +7 -0
  109. data/data/codelists/codelist-54.yml +25 -0
  110. data/data/codelists/codelist-55.yml +21 -0
  111. data/data/codelists/codelist-56.yml +4 -0
  112. data/data/codelists/codelist-57.yml +7 -0
  113. data/data/codelists/codelist-58.yml +27 -0
  114. data/data/codelists/codelist-59.yml +12 -0
  115. data/data/codelists/codelist-6.yml +78 -0
  116. data/data/codelists/codelist-60.yml +4 -0
  117. data/data/codelists/codelist-61.yml +5 -0
  118. data/data/codelists/codelist-62.yml +7 -0
  119. data/data/codelists/codelist-63.yml +2 -0
  120. data/data/codelists/codelist-64.yml +18 -0
  121. data/data/codelists/codelist-65.yml +31 -0
  122. data/data/codelists/codelist-66.yml +6 -0
  123. data/data/codelists/codelist-67.yml +4 -0
  124. data/data/codelists/codelist-68.yml +19 -0
  125. data/data/codelists/codelist-69.yml +6 -0
  126. data/data/codelists/codelist-7.yml +128 -0
  127. data/data/codelists/codelist-70.yml +4 -0
  128. data/data/codelists/codelist-71.yml +13 -0
  129. data/data/codelists/codelist-72.yml +9 -0
  130. data/data/codelists/codelist-73.yml +43 -0
  131. data/data/codelists/codelist-74.yml +491 -0
  132. data/data/codelists/codelist-75.yml +4 -0
  133. data/data/codelists/codelist-76.yml +14 -0
  134. data/data/codelists/codelist-77.yml +21 -0
  135. data/data/codelists/codelist-78.yml +179 -0
  136. data/data/codelists/codelist-79.yml +25 -0
  137. data/data/codelists/codelist-8.yml +9 -0
  138. data/data/codelists/codelist-80.yml +23 -0
  139. data/data/codelists/codelist-81.yml +41 -0
  140. data/data/codelists/codelist-82.yml +19 -0
  141. data/data/codelists/codelist-83.yml +71 -0
  142. data/data/codelists/codelist-84.yml +12 -0
  143. data/data/codelists/codelist-85.yml +25 -0
  144. data/data/codelists/codelist-86.yml +7 -0
  145. data/data/codelists/codelist-87.yml +8 -0
  146. data/data/codelists/codelist-88.yml +2 -0
  147. data/data/codelists/codelist-89.yml +3 -0
  148. data/data/codelists/codelist-9.yml +11 -0
  149. data/data/codelists/codelist-90.yml +13 -0
  150. data/data/codelists/codelist-91.yml +254 -0
  151. data/data/codelists/codelist-92.yml +11 -0
  152. data/data/codelists/codelist-93.yml +15 -0
  153. data/data/codelists/codelist-94.yml +5 -0
  154. data/data/codelists/codelist-95.yml +5 -0
  155. data/data/codelists/codelist-96.yml +193 -0
  156. data/data/codelists/codelist-97.yml +3 -0
  157. data/data/codelists/codelist-98.yml +23 -0
  158. data/data/codelists/codelist-99.yml +26 -0
  159. data/data/onix21/codelists/codelist-1.yml +14 -0
  160. data/data/onix21/codelists/codelist-10.yml +52 -0
  161. data/data/onix21/codelists/codelist-100.yml +8 -0
  162. data/data/onix21/codelists/codelist-101.yml +7 -0
  163. data/data/onix21/codelists/codelist-102.yml +5 -0
  164. data/data/onix21/codelists/codelist-11.yml +13 -0
  165. data/data/onix21/codelists/codelist-12.yml +16 -0
  166. data/data/onix21/codelists/codelist-121.yml +162 -0
  167. data/data/onix21/codelists/codelist-13.yml +11 -0
  168. data/data/onix21/codelists/codelist-138.yml +8 -0
  169. data/data/onix21/codelists/codelist-139.yml +109 -0
  170. data/data/onix21/codelists/codelist-14.yml +6 -0
  171. data/data/onix21/codelists/codelist-140.yml +9 -0
  172. data/data/onix21/codelists/codelist-141.yml +12 -0
  173. data/data/onix21/codelists/codelist-142.yml +14 -0
  174. data/data/onix21/codelists/codelist-143.yml +9 -0
  175. data/data/onix21/codelists/codelist-144.yml +8 -0
  176. data/data/onix21/codelists/codelist-145.yml +10 -0
  177. data/data/onix21/codelists/codelist-146.yml +5 -0
  178. data/data/onix21/codelists/codelist-147.yml +16 -0
  179. data/data/onix21/codelists/codelist-148.yml +6 -0
  180. data/data/onix21/codelists/codelist-149.yml +8 -0
  181. data/data/onix21/codelists/codelist-15.yml +16 -0
  182. data/data/onix21/codelists/codelist-150.yml +133 -0
  183. data/data/onix21/codelists/codelist-151.yml +10 -0
  184. data/data/onix21/codelists/codelist-152.yml +4 -0
  185. data/data/onix21/codelists/codelist-153.yml +22 -0
  186. data/data/onix21/codelists/codelist-154.yml +11 -0
  187. data/data/onix21/codelists/codelist-155.yml +10 -0
  188. data/data/onix21/codelists/codelist-156.yml +6 -0
  189. data/data/onix21/codelists/codelist-157.yml +6 -0
  190. data/data/onix21/codelists/codelist-158.yml +35 -0
  191. data/data/onix21/codelists/codelist-159.yml +8 -0
  192. data/data/onix21/codelists/codelist-16.yml +8 -0
  193. data/data/onix21/codelists/codelist-160.yml +7 -0
  194. data/data/onix21/codelists/codelist-161.yml +5 -0
  195. data/data/onix21/codelists/codelist-162.yml +9 -0
  196. data/data/onix21/codelists/codelist-163.yml +18 -0
  197. data/data/onix21/codelists/codelist-164.yml +7 -0
  198. data/data/onix21/codelists/codelist-165.yml +6 -0
  199. data/data/onix21/codelists/codelist-166.yml +6 -0
  200. data/data/onix21/codelists/codelist-167.yml +11 -0
  201. data/data/onix21/codelists/codelist-168.yml +4 -0
  202. data/data/onix21/codelists/codelist-169.yml +7 -0
  203. data/data/onix21/codelists/codelist-17.yml +98 -0
  204. data/data/onix21/codelists/codelist-170.yml +6 -0
  205. data/data/onix21/codelists/codelist-171.yml +4 -0
  206. data/data/onix21/codelists/codelist-172.yml +3 -0
  207. data/data/onix21/codelists/codelist-173.yml +5 -0
  208. data/data/onix21/codelists/codelist-174.yml +4 -0
  209. data/data/onix21/codelists/codelist-175.yml +230 -0
  210. data/data/onix21/codelists/codelist-176.yml +16 -0
  211. data/data/onix21/codelists/codelist-177.yml +4 -0
  212. data/data/onix21/codelists/codelist-178.yml +30 -0
  213. data/data/onix21/codelists/codelist-179.yml +5 -0
  214. data/data/onix21/codelists/codelist-18.yml +8 -0
  215. data/data/onix21/codelists/codelist-184.yml +10 -0
  216. data/data/onix21/codelists/codelist-19.yml +9 -0
  217. data/data/onix21/codelists/codelist-196.yml +22 -0
  218. data/data/onix21/codelists/codelist-197.yml +7 -0
  219. data/data/onix21/codelists/codelist-198.yml +8 -0
  220. data/data/onix21/codelists/codelist-2.yml +8 -0
  221. data/data/onix21/codelists/codelist-20.yml +2 -0
  222. data/data/onix21/codelists/codelist-203.yml +10 -0
  223. data/data/onix21/codelists/codelist-204.yml +7 -0
  224. data/data/onix21/codelists/codelist-21.yml +36 -0
  225. data/data/onix21/codelists/codelist-215.yml +9 -0
  226. data/data/onix21/codelists/codelist-216.yml +11 -0
  227. data/data/onix21/codelists/codelist-217.yml +3 -0
  228. data/data/onix21/codelists/codelist-218.yml +5 -0
  229. data/data/onix21/codelists/codelist-219.yml +5 -0
  230. data/data/onix21/codelists/codelist-22.yml +11 -0
  231. data/data/onix21/codelists/codelist-220.yml +7 -0
  232. data/data/onix21/codelists/codelist-23.yml +17 -0
  233. data/data/onix21/codelists/codelist-24.yml +14 -0
  234. data/data/onix21/codelists/codelist-25.yml +31 -0
  235. data/data/onix21/codelists/codelist-26.yml +100 -0
  236. data/data/onix21/codelists/codelist-27.yml +107 -0
  237. data/data/onix21/codelists/codelist-28.yml +10 -0
  238. data/data/onix21/codelists/codelist-29.yml +30 -0
  239. data/data/onix21/codelists/codelist-3.yml +13 -0
  240. data/data/onix21/codelists/codelist-30.yml +20 -0
  241. data/data/onix21/codelists/codelist-31.yml +5 -0
  242. data/data/onix21/codelists/codelist-32.yml +10 -0
  243. data/data/onix21/codelists/codelist-33.yml +46 -0
  244. data/data/onix21/codelists/codelist-34.yml +18 -0
  245. data/data/onix21/codelists/codelist-35.yml +8 -0
  246. data/data/onix21/codelists/codelist-36.yml +5 -0
  247. data/data/onix21/codelists/codelist-37.yml +8 -0
  248. data/data/onix21/codelists/codelist-38.yml +42 -0
  249. data/data/onix21/codelists/codelist-39.yml +21 -0
  250. data/data/onix21/codelists/codelist-40.yml +8 -0
  251. data/data/onix21/codelists/codelist-41.yml +9 -0
  252. data/data/onix21/codelists/codelist-42.yml +18 -0
  253. data/data/onix21/codelists/codelist-43.yml +9 -0
  254. data/data/onix21/codelists/codelist-44.yml +27 -0
  255. data/data/onix21/codelists/codelist-45.yml +20 -0
  256. data/data/onix21/codelists/codelist-46.yml +11 -0
  257. data/data/onix21/codelists/codelist-47.yml +6 -0
  258. data/data/onix21/codelists/codelist-48.yml +13 -0
  259. data/data/onix21/codelists/codelist-49.yml +281 -0
  260. data/data/onix21/codelists/codelist-5.yml +20 -0
  261. data/data/onix21/codelists/codelist-50.yml +10 -0
  262. data/data/onix21/codelists/codelist-51.yml +37 -0
  263. data/data/onix21/codelists/codelist-52.yml +3 -0
  264. data/data/onix21/codelists/codelist-53.yml +7 -0
  265. data/data/onix21/codelists/codelist-54.yml +25 -0
  266. data/data/onix21/codelists/codelist-55.yml +21 -0
  267. data/data/onix21/codelists/codelist-56.yml +4 -0
  268. data/data/onix21/codelists/codelist-57.yml +7 -0
  269. data/data/onix21/codelists/codelist-58.yml +27 -0
  270. data/data/onix21/codelists/codelist-59.yml +12 -0
  271. data/data/onix21/codelists/codelist-6.yml +78 -0
  272. data/data/onix21/codelists/codelist-60.yml +4 -0
  273. data/data/onix21/codelists/codelist-61.yml +5 -0
  274. data/data/onix21/codelists/codelist-62.yml +7 -0
  275. data/data/onix21/codelists/codelist-63.yml +2 -0
  276. data/data/onix21/codelists/codelist-64.yml +18 -0
  277. data/data/onix21/codelists/codelist-65.yml +31 -0
  278. data/data/onix21/codelists/codelist-66.yml +6 -0
  279. data/data/onix21/codelists/codelist-67.yml +4 -0
  280. data/data/onix21/codelists/codelist-68.yml +19 -0
  281. data/data/onix21/codelists/codelist-69.yml +6 -0
  282. data/data/onix21/codelists/codelist-7.yml +132 -0
  283. data/data/onix21/codelists/codelist-70.yml +4 -0
  284. data/data/onix21/codelists/codelist-71.yml +14 -0
  285. data/data/onix21/codelists/codelist-72.yml +9 -0
  286. data/data/onix21/codelists/codelist-73.yml +43 -0
  287. data/data/onix21/codelists/codelist-74.yml +492 -0
  288. data/data/onix21/codelists/codelist-75.yml +4 -0
  289. data/data/onix21/codelists/codelist-76.yml +14 -0
  290. data/data/onix21/codelists/codelist-77.yml +21 -0
  291. data/data/onix21/codelists/codelist-78.yml +191 -0
  292. data/data/onix21/codelists/codelist-79.yml +26 -0
  293. data/data/onix21/codelists/codelist-8.yml +9 -0
  294. data/data/onix21/codelists/codelist-80.yml +23 -0
  295. data/data/onix21/codelists/codelist-81.yml +41 -0
  296. data/data/onix21/codelists/codelist-82.yml +19 -0
  297. data/data/onix21/codelists/codelist-83.yml +72 -0
  298. data/data/onix21/codelists/codelist-84.yml +12 -0
  299. data/data/onix21/codelists/codelist-85.yml +25 -0
  300. data/data/onix21/codelists/codelist-86.yml +7 -0
  301. data/data/onix21/codelists/codelist-87.yml +8 -0
  302. data/data/onix21/codelists/codelist-88.yml +2 -0
  303. data/data/onix21/codelists/codelist-89.yml +3 -0
  304. data/data/onix21/codelists/codelist-9.yml +13 -0
  305. data/data/onix21/codelists/codelist-90.yml +13 -0
  306. data/data/onix21/codelists/codelist-91.yml +254 -0
  307. data/data/onix21/codelists/codelist-92.yml +11 -0
  308. data/data/onix21/codelists/codelist-93.yml +15 -0
  309. data/data/onix21/codelists/codelist-94.yml +5 -0
  310. data/data/onix21/codelists/codelist-95.yml +5 -0
  311. data/data/onix21/codelists/codelist-96.yml +194 -0
  312. data/data/onix21/codelists/codelist-97.yml +3 -0
  313. data/data/onix21/codelists/codelist-98.yml +25 -0
  314. data/data/onix21/codelists/codelist-99.yml +26 -0
  315. data/data/onix21/shortnames.yml +431 -0
  316. data/data/shortnames.yml +395 -0
  317. data/lib/im_onix.rb +2 -0
  318. data/lib/onix/code.rb +543 -0
  319. data/lib/onix/collateral_detail.rb +94 -0
  320. data/lib/onix/contributor.rb +87 -0
  321. data/lib/onix/date.rb +183 -0
  322. data/lib/onix/descriptive_detail.rb +552 -0
  323. data/lib/onix/discount_coded.rb +20 -0
  324. data/lib/onix/entity.rb +135 -0
  325. data/lib/onix/error.rb +6 -0
  326. data/lib/onix/helper.rb +66 -0
  327. data/lib/onix/identifier.rb +158 -0
  328. data/lib/onix/onix21.rb +604 -0
  329. data/lib/onix/onix_message.rb +187 -0
  330. data/lib/onix/price.rb +74 -0
  331. data/lib/onix/product.rb +846 -0
  332. data/lib/onix/product_supply.rb +89 -0
  333. data/lib/onix/publishing_detail.rb +86 -0
  334. data/lib/onix/related_material.rb +30 -0
  335. data/lib/onix/related_product.rb +45 -0
  336. data/lib/onix/related_work.rb +24 -0
  337. data/lib/onix/sales_outlet.rb +14 -0
  338. data/lib/onix/sales_restriction.rb +37 -0
  339. data/lib/onix/sales_rights.rb +12 -0
  340. data/lib/onix/subject.rb +35 -0
  341. data/lib/onix/subset.rb +334 -0
  342. data/lib/onix/supporting_resource.rb +192 -0
  343. data/lib/onix/tax.rb +23 -0
  344. data/lib/onix/territory.rb +56 -0
  345. data/lib/onix/website.rb +21 -0
  346. metadata +477 -0
data/lib/onix/date.rb ADDED
@@ -0,0 +1,183 @@
1
+ module ONIX
2
+
3
+ module DateHelper
4
+ attr_accessor :date_format, :date
5
+
6
+ def parse_date(n)
7
+ @date_format=DateFormat.from_code("00")
8
+ date_txt=nil
9
+ @date=nil
10
+ n.elements.each do |t|
11
+ case t
12
+ when tag_match("DateFormat")
13
+ @date_format=DateFormat.parse(t)
14
+ when tag_match("Date")
15
+ date_txt=t.text
16
+ end
17
+
18
+ if t["dateformat"]
19
+ @date_format = DateFormat.from_code(t["dateformat"])
20
+ end
21
+ end
22
+
23
+ code_format=format_from_code(@date_format.code)
24
+ text_format=format_from_string(date_txt)
25
+
26
+ format=code_format
27
+
28
+ if code_format!=text_format
29
+ # puts "EEE date #{n.text} (#{text_format}) do not match code #{@format.code} (#{code_format})"
30
+ format=text_format
31
+ end
32
+
33
+ begin
34
+ if format
35
+ case @date_format.code
36
+ when "00"
37
+ @date=Date.strptime(date_txt, format)
38
+ when "01"
39
+ @date=Date.strptime(date_txt, format)
40
+ when "05"
41
+ @date=Date.strptime(date_txt, format)
42
+ when "14"
43
+ @date=Time.strptime(date_txt, format)
44
+ else
45
+ @date=nil
46
+ end
47
+ end
48
+ rescue
49
+ # invalid date
50
+ end
51
+ end
52
+
53
+ def format_from_code(code)
54
+ case code
55
+ when "00"
56
+ "%Y%m%d"
57
+ when "01"
58
+ "%Y%m"
59
+ when "05"
60
+ "%Y"
61
+ when "14"
62
+ "%Y%m%dT%H%M%S%z"
63
+ else
64
+ nil
65
+ end
66
+ end
67
+
68
+ def format_from_string(str)
69
+ case str
70
+ when /^\d{4}\d{2}\d{2}T\d{2}\d{2}\d{2}/
71
+ "%Y%m%dT%H%M%S%z"
72
+ when /^\d{4}\-\d{2}\-\d{2}$/
73
+ "%Y-%m-%d"
74
+ when /^\d{4}\d{2}\d{2}$/
75
+ "%Y%m%d"
76
+ when /^\d{4}\d{2}$/
77
+ "%Y%m"
78
+ when /^\d{4}$/
79
+ "%Y"
80
+ else
81
+ nil
82
+ end
83
+ end
84
+
85
+ def time
86
+ @date.to_time
87
+ end
88
+ end
89
+
90
+ class MarketDate < SubsetDSL
91
+ include DateHelper
92
+ element "Date", :ignore
93
+ element "DateFormat", :ignore
94
+ element "MarketDateRole", :subset
95
+
96
+ scope :availability, lambda { human_code_match(:market_date_role, ["PublicationDate","EmbargoDate"])}
97
+
98
+ def role
99
+ @market_date_role
100
+ end
101
+
102
+ def parse(n)
103
+ super
104
+ parse_date(n)
105
+ end
106
+ end
107
+
108
+ class PriceDate < SubsetDSL
109
+ include DateHelper
110
+ element "Date", :ignore
111
+ element "DateFormat", :ignore
112
+ element "PriceDateRole", :subset
113
+
114
+ scope :from_date, lambda { human_code_match(:price_date_role, "FromDate")}
115
+ scope :until_date, lambda { human_code_match(:price_date_role, "UntilDate")}
116
+
117
+ def role
118
+ @price_date_role
119
+ end
120
+
121
+ def parse(n)
122
+ super
123
+ parse_date(n)
124
+ end
125
+ end
126
+
127
+ class SupplyDate < SubsetDSL
128
+ include DateHelper
129
+ element "Date", :ignore
130
+ element "DateFormat", :ignore
131
+ element "SupplyDateRole", :subset
132
+
133
+ scope :availability, lambda { human_code_match(:supply_date_role, ["ExpectedAvailabilityDate","EmbargoDate"])}
134
+
135
+ def role
136
+ @supply_date_role
137
+ end
138
+
139
+ def parse(n)
140
+ super
141
+ parse_date(n)
142
+ end
143
+ end
144
+
145
+ class PublishingDate < SubsetDSL
146
+ include DateHelper
147
+ element "Date", :ignore
148
+ element "DateFormat", :ignore
149
+ element "PublishingDateRole", :subset
150
+
151
+ scope :publication, lambda { human_code_match(:publishing_date_role, ["PublicationDate","PublicationDateOfPrintCounterpart"])}
152
+ scope :embargo, lambda { human_code_match(:publishing_date_role, "EmbargoDate")}
153
+ scope :preorder_embargo, lambda { human_code_match(:publishing_date_role, "PreorderEmbargoDate")}
154
+ scope :public_announcement, lambda { human_code_match(:publishing_date_role, "PublicAnnouncementDate")}
155
+
156
+ def role
157
+ @publishing_date_role
158
+ end
159
+
160
+ def parse(n)
161
+ super
162
+ parse_date(n)
163
+ end
164
+ end
165
+
166
+ class ContentDate < SubsetDSL
167
+ include DateHelper
168
+ element "Date", :ignore
169
+ element "DateFormat", :ignore
170
+ element "ContentDateRole", :subset
171
+
172
+ scope :last_updated, lambda { human_code_match(:content_date_role, "LastUpdated")}
173
+
174
+ def role
175
+ @content_date_role
176
+ end
177
+
178
+ def parse(n)
179
+ super
180
+ parse_date(n)
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,552 @@
1
+ require 'onix/identifier'
2
+
3
+ module ONIX
4
+ class TitleElement < SubsetDSL
5
+ element "TitleElementLevel", :subset
6
+ element "TitleText", :text
7
+ element "TitlePrefix", :text
8
+ element "TitleWithoutPrefix", :text
9
+ element "Subtitle", :text
10
+ element "PartNumber", :integer
11
+ element "SequenceNumber", :integer
12
+
13
+ scope :product_level, lambda { human_code_match(:title_element_level, /Product/)}
14
+ scope :collection_level, lambda { human_code_match(:title_element_level, /collection/i)}
15
+
16
+ # shortcuts
17
+ def level
18
+ @title_element_level
19
+ end
20
+
21
+ # :category: High level
22
+ # flatten title string
23
+ def title
24
+ if @title_text
25
+ @title_text
26
+ else
27
+ if @title_without_prefix
28
+ if @title_prefix
29
+ "#{@title_prefix} #{@title_without_prefix}"
30
+ else
31
+ @title_without_prefix
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ class TitleDetail < SubsetDSL
39
+ element "TitleType", :subset
40
+ elements "TitleElement", :subset
41
+
42
+ scope :distinctive_title, lambda { human_code_match(:title_type, /DistinctiveTitle/)}
43
+
44
+ def type
45
+ @title_type
46
+ end
47
+
48
+ # :category: High level
49
+ # flatten title string
50
+ def title
51
+ title_element = @title_elements.product_level #select { |te| te.level.human=~/Product/ }
52
+ if title_element.size > 0
53
+ title_element.first.title
54
+ else
55
+ nil
56
+ end
57
+ end
58
+ end
59
+
60
+ class CollectionSequence < SubsetDSL
61
+ element "CollectionSequenceType", :subset
62
+ element "CollectionSequenceTypeName", :string
63
+ element "CollectionSequenceNumber", :string
64
+
65
+ def type
66
+ @collection_sequence_number
67
+ end
68
+
69
+ def number
70
+ @collection_sequence_number
71
+ end
72
+
73
+ def type_name
74
+ @collection_sequence_type_name
75
+ end
76
+ end
77
+
78
+ class Collection < SubsetDSL
79
+ element "CollectionType", :subset
80
+ elements "CollectionIdentifier", :subset
81
+ elements "TitleDetail", :subset
82
+ elements "CollectionSequence", :subset
83
+
84
+ scope :publisher, lambda { human_code_match(:collection_type, "PublisherCollection")}
85
+
86
+ # shortcuts
87
+ def type
88
+ @collection_type
89
+ end
90
+
91
+ def identifiers
92
+ @collection_identifiers
93
+ end
94
+
95
+ def sequences
96
+ @collection_sequences
97
+ end
98
+
99
+ # :category: High level
100
+ # collection title string
101
+ def title
102
+ if collection_title_element
103
+ collection_title_element.title
104
+ end
105
+ end
106
+
107
+ # :category: High level
108
+ # collection subtitle string
109
+ def subtitle
110
+ if collection_title_element
111
+ collection_title_element.subtitle
112
+ end
113
+ end
114
+
115
+ def collection_title_element
116
+ distinctive_title=@title_details.distinctive_title.first
117
+ #select { |td| td.type.human=~/DistinctiveTitle/}.first
118
+ if distinctive_title
119
+ distinctive_title.title_elements.collection_level.first
120
+ #select { |te| te.level.human=~/CollectionLevel/ or te.level.human=~/Subcollection/ }.first
121
+ end
122
+ end
123
+
124
+ end
125
+
126
+ # product part use full Product to provide file protection and file size
127
+ class ProductPart < SubsetDSL
128
+ include EanMethods
129
+ include ProprietaryIdMethods
130
+
131
+ elements "ProductIdentifier", :subset
132
+ element "ProductForm", :subset
133
+ element "ProductFormDescription", :text
134
+ elements "ProductFormDetail", :subset
135
+ elements "ProductContentType", :subset
136
+ element "NumberOfCopies", :integer
137
+
138
+ # shortcuts
139
+ def identifiers
140
+ @product_identifiers
141
+ end
142
+
143
+ def form
144
+ @product_form
145
+ end
146
+
147
+ def form_details
148
+ @product_form_details
149
+ end
150
+
151
+ def content_types
152
+ @product_content_types
153
+ end
154
+
155
+ # full Product if referenced in ONIXMessage
156
+ def product
157
+ @product
158
+ end
159
+
160
+ def product=v
161
+ @product=v
162
+ end
163
+
164
+ # this ProductPart is part of Product
165
+ def part_of
166
+ @part_of
167
+ end
168
+
169
+ def part_of=v
170
+ @part_of=v
171
+ end
172
+
173
+ # :category: High level
174
+ # digital file format string (Epub,Pdf,AmazonKindle)
175
+ def file_format
176
+ self.file_formats.first.human if self.file_formats.first
177
+ end
178
+
179
+ def file_mimetype
180
+ if self.file_formats.first
181
+ self.file_formats.first.mimetype
182
+ end
183
+ end
184
+
185
+ def file_formats
186
+ @product_form_details.select { |fd| fd.code =~ /^E1.*/ }
187
+ end
188
+
189
+ def reflowable?
190
+ return true if @product_form_details.select { |fd| fd.code == "E200" }.length > 0
191
+ return false if @product_form_details.select { |fd| fd.code == "E201" }.length > 0
192
+ end
193
+
194
+ # :category: High level
195
+ # part file description string
196
+ def file_description
197
+ @product_form_description
198
+ end
199
+
200
+ # :category: High level
201
+ # raw part file description string without HTML
202
+ def raw_file_description
203
+ if @product_form_description
204
+ Helper.strip_html(@product_form_description).gsub(/\s+/, " ").strip
205
+ else
206
+ nil
207
+ end
208
+ end
209
+
210
+ # :category: High level
211
+ # Protection type string (None, Watermarking, DRM, AdobeDRM)
212
+ def protection_type
213
+ if product
214
+ product.protection_type
215
+ else
216
+ if part_of
217
+ part_of.protection_type
218
+ else
219
+ nil
220
+ end
221
+ end
222
+ end
223
+
224
+ # :category: High level
225
+ # List of protections type string (None, Watermarking, DRM, AdobeDRM)
226
+ def protections
227
+ if product
228
+ product.protections
229
+ else
230
+ if part_of
231
+ part_of.protections
232
+ else
233
+ nil
234
+ end
235
+ end
236
+ end
237
+
238
+ # :category: High level
239
+ # digital file filesize in bytes
240
+ def filesize
241
+ if product
242
+ product.filesize
243
+ else
244
+ nil
245
+ end
246
+ end
247
+ end
248
+
249
+ class Extent < SubsetDSL
250
+ element "ExtentType", :subset
251
+ element "ExtentUnit", :subset
252
+ element "ExtentValue", :text
253
+
254
+ scope :filesize, lambda { human_code_match(:extent_type, /Filesize/)}
255
+ scope :page, lambda { human_code_match(:extent_type, /Page/)}
256
+
257
+ # shortcuts
258
+ def type
259
+ @extent_type
260
+ end
261
+
262
+ def unit
263
+ @extent_unit
264
+ end
265
+
266
+ def value
267
+ @extent_value
268
+ end
269
+
270
+ def bytes
271
+ case @extent_unit.human
272
+ when "Bytes"
273
+ @extent_value.to_i
274
+ when "Kbytes"
275
+ (@extent_value.to_f*1024).to_i
276
+ when "Mbytes"
277
+ (@extent_value.to_f*1024*1024).to_i
278
+ else
279
+ nil
280
+ end
281
+ end
282
+
283
+ def pages
284
+ if @extent_unit.human=="Pages"
285
+ @extent_value.to_i
286
+ else
287
+ nil
288
+ end
289
+ end
290
+ end
291
+
292
+ class EpubUsageLimit < SubsetDSL
293
+ element "EpubUsageUnit", :subset
294
+ element "Quantity", :integer
295
+
296
+ def unit
297
+ @epub_usage_unit
298
+ end
299
+ end
300
+
301
+ class EpubUsageConstraint < SubsetDSL
302
+ element "EpubUsageType", :subset
303
+ element "EpubUsageStatus", :subset
304
+ elements "EpubUsageLimit", :subset
305
+
306
+ # shortcuts
307
+ def type
308
+ @epub_usage_type
309
+ end
310
+
311
+ def status
312
+ @epub_usage_status
313
+ end
314
+
315
+ def limits
316
+ @epub_usage_limits
317
+ end
318
+ end
319
+
320
+ class Language < SubsetDSL
321
+ element "LanguageRole", :subset
322
+ element "LanguageCode", :subset
323
+
324
+ scope :of_text, lambda{human_code_match(:language_role, "LanguageOfText")}
325
+
326
+ # shortcuts
327
+ def role
328
+ @language_role
329
+ end
330
+
331
+ def code
332
+ @language_code
333
+ end
334
+ end
335
+
336
+ class ProductFormFeature < SubsetDSL
337
+ element "ProductFormFeatureType", :subset
338
+ element "ProductFormFeatureValue", :text
339
+ elements "ProductFormFeatureDescription", :text
340
+
341
+ # shortcuts
342
+ def type
343
+ @product_form_feature_type
344
+ end
345
+
346
+ def value
347
+ @product_form_feature_value
348
+ end
349
+
350
+ def descriptions
351
+ @product_form_feature_descriptions
352
+ end
353
+ end
354
+
355
+ class DescriptiveDetail < SubsetDSL
356
+ element "ProductComposition", :subset
357
+ element "ProductForm", :subset
358
+ elements "ProductFormDetail", :subset
359
+ elements "ProductFormFeature", :subset
360
+ element "ProductFormDescription", :text
361
+ element "PrimaryContentType", :subset, {:klass=>"ProductContentType"}
362
+ elements "ProductContentType", :subset
363
+ elements "EpubTechnicalProtection", :subset
364
+ elements "EpubUsageConstraint", :subset
365
+ elements "ProductPart", :subset
366
+
367
+ elements "Collection", :subset
368
+ element "NoCollection", :ignore
369
+
370
+ elements "TitleDetail", :subset
371
+
372
+ elements "Contributor", :subset
373
+
374
+ element "EditionType", :subset
375
+ element "EditionNumber", :integer
376
+ element "NoEdition", :ignore
377
+
378
+ elements "Language", :subset
379
+
380
+ elements "Extent", :subset
381
+
382
+ elements "Subject", :subset
383
+
384
+ elements "AudienceCode", :subset
385
+
386
+ # shortcuts
387
+ def form
388
+ @product_form
389
+ end
390
+
391
+ def form_details
392
+ @product_form_details
393
+ end
394
+
395
+ def form_features
396
+ @product_form_features
397
+ end
398
+
399
+ def composition
400
+ @product_composition
401
+ end
402
+
403
+ def parts
404
+ @product_parts
405
+ end
406
+
407
+ def content_types
408
+ @product_content_types
409
+ end
410
+
411
+ # :category: High level
412
+ # product title string
413
+ def title
414
+ product_title_element.title if product_title_element
415
+ end
416
+
417
+ # :category: High level
418
+ # product subtitle string
419
+ def subtitle
420
+ product_title_element.subtitle if product_title_element
421
+ end
422
+
423
+ def product_title_element
424
+ @title_details.distinctive_title.first.title_elements.product_level.first if @title_details.distinctive_title.first
425
+ end
426
+
427
+ def pages_extent
428
+ @extents.page.first
429
+ end
430
+
431
+ def pages
432
+ if pages_extent
433
+ pages_extent.pages
434
+ else
435
+ nil
436
+ end
437
+ end
438
+
439
+ def filesize_extent
440
+ @extents.filesize.first
441
+ end
442
+
443
+ def filesize
444
+ if filesize_extent
445
+ filesize_extent.bytes
446
+ else
447
+ nil
448
+ end
449
+ end
450
+
451
+ def digital?
452
+ if @product_form and @product_form.human=~/Digital/
453
+ true
454
+ else
455
+ false
456
+ end
457
+ end
458
+
459
+ def streaming?
460
+ @product_form.code=="EC"
461
+ end
462
+
463
+ def audio?
464
+ not audio_formats.empty?
465
+ end
466
+
467
+ def audio_format
468
+ self.audio_formats.first.human if self.audio_formats.first
469
+ end
470
+
471
+ def audio_formats
472
+ @product_form_details.select { |fd| fd.code =~ /^A.*/ }
473
+ end
474
+
475
+ def bundle?
476
+ @product_composition.human=="MultipleitemRetailProduct"
477
+ end
478
+
479
+ def file_format
480
+ self.file_formats.first.human if self.file_formats.first
481
+ end
482
+
483
+ def file_mimetype
484
+ if self.file_formats.first
485
+ self.file_formats.first.mimetype
486
+ end
487
+ end
488
+
489
+ def file_formats
490
+ @product_form_details.select { |fd| fd.code =~ /^E1.*/ }
491
+ end
492
+
493
+ def reflowable?
494
+ return true if @product_form_details.select { |fd| fd.code == "E200" }.length > 0
495
+ return false if @product_form_details.select { |fd| fd.code == "E201" }.length > 0
496
+ end
497
+
498
+ def file_description
499
+ @product_form_description
500
+ end
501
+
502
+ def protection_type
503
+ if @epub_technical_protections.length > 0
504
+ if @epub_technical_protections.length == 1
505
+ @epub_technical_protections.first.human
506
+ else
507
+ raise ExpectsOneButHasSeveral, @epub_technical_protections.map(&:human)
508
+ end
509
+ end
510
+ end
511
+
512
+ def protections
513
+ return nil if @epub_technical_protections.length == 0
514
+
515
+ @epub_technical_protections.map(&:human)
516
+ end
517
+
518
+ def language_of_text
519
+ l=@languages.of_text.first
520
+ if l
521
+ l.code
522
+ else
523
+ nil
524
+ end
525
+ end
526
+
527
+ def publisher_collection
528
+ @collections.publisher.first
529
+ end
530
+
531
+ def publisher_collection_title
532
+ if self.publisher_collection
533
+ self.publisher_collection.title
534
+ end
535
+ end
536
+
537
+ def bisac_categories
538
+ @subjects.bisac
539
+ end
540
+
541
+ def clil_categories
542
+ @subjects.clil
543
+ end
544
+
545
+ def keywords
546
+ kws=@subjects.keyword.map { |kw| kw.heading_text }.compact
547
+ kws=kws.flat_map { |kw| kw.split(/;|,|\n/) }.map { |kw| kw.strip }
548
+ kws.reject!{|k| k==""}
549
+ kws
550
+ end
551
+ end
552
+ end