im_onix 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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