relaton 2.1.0 → 3.0.0.pre.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 (625) hide show
  1. checksums.yaml +4 -4
  2. data/{docs/README.adoc → README.adoc} +109 -38
  3. data/lib/relaton/3gpp/bibdata.rb +9 -0
  4. data/lib/relaton/3gpp/bibitem.rb +9 -0
  5. data/lib/relaton/3gpp/bibliography.rb +48 -0
  6. data/lib/relaton/3gpp/data_fetcher.rb +255 -0
  7. data/lib/relaton/3gpp/doctype.rb +9 -0
  8. data/lib/relaton/3gpp/ext.rb +31 -0
  9. data/lib/relaton/3gpp/item.rb +12 -0
  10. data/lib/relaton/3gpp/item_data.rb +15 -0
  11. data/lib/relaton/3gpp/parser.rb +400 -0
  12. data/lib/relaton/3gpp/processor.rb +68 -0
  13. data/lib/relaton/3gpp/release.rb +34 -0
  14. data/lib/relaton/3gpp/util.rb +8 -0
  15. data/lib/relaton/3gpp.rb +25 -0
  16. data/lib/relaton/bib/converter/asciibib/to_asciibib.rb +663 -0
  17. data/lib/relaton/bib/converter/asciibib.rb +13 -0
  18. data/lib/relaton/bib/converter/bibtex/from_bibtex.rb +245 -0
  19. data/lib/relaton/bib/converter/bibtex/to_bibtex.rb +341 -0
  20. data/lib/relaton/bib/converter/bibtex.rb +23 -0
  21. data/lib/relaton/bib/converter/bibxml/from_rfcxml.rb +386 -0
  22. data/lib/relaton/bib/converter/bibxml/from_rfcxml_referencegroup.rb +71 -0
  23. data/lib/relaton/bib/converter/bibxml/to_rfcxml.rb +308 -0
  24. data/lib/relaton/bib/converter/bibxml/to_rfcxml_referencegroup.rb +52 -0
  25. data/lib/relaton/bib/converter/bibxml.rb +51 -0
  26. data/lib/relaton/bib/hash_parser_v1.rb +767 -0
  27. data/lib/relaton/bib/item_data.rb +229 -0
  28. data/lib/relaton/bib/model/abstract.rb +16 -0
  29. data/lib/relaton/bib/model/address.rb +22 -0
  30. data/lib/relaton/bib/model/affiliation.rb +16 -0
  31. data/lib/relaton/bib/model/bibdata.rb +11 -0
  32. data/lib/relaton/bib/model/bibdata_shared.rb +12 -0
  33. data/lib/relaton/bib/model/bibitem.rb +11 -0
  34. data/lib/relaton/bib/model/bibitem_shared.rb +12 -0
  35. data/lib/relaton/bib/model/contact.rb +18 -0
  36. data/lib/relaton/bib/model/contribution_info.rb +15 -0
  37. data/lib/relaton/bib/model/contributor.rb +29 -0
  38. data/lib/relaton/bib/model/copyright.rb +27 -0
  39. data/lib/relaton/bib/model/date.rb +31 -0
  40. data/lib/relaton/bib/model/depiction.rb +16 -0
  41. data/lib/relaton/bib/model/docidentifier.rb +34 -0
  42. data/lib/relaton/bib/model/doctype.rb +14 -0
  43. data/lib/relaton/bib/model/edition.rb +14 -0
  44. data/lib/relaton/bib/model/ext.rb +39 -0
  45. data/lib/relaton/bib/model/extent.rb +16 -0
  46. data/lib/relaton/bib/model/formattedref.rb +43 -0
  47. data/lib/relaton/bib/model/full_name_type.rb +64 -0
  48. data/lib/relaton/bib/model/fullname.rb +11 -0
  49. data/lib/relaton/bib/model/ics.rb +49 -0
  50. data/lib/relaton/bib/model/image.rb +28 -0
  51. data/lib/relaton/bib/model/item.rb +96 -0
  52. data/lib/relaton/bib/model/item_base.rb +20 -0
  53. data/lib/relaton/bib/model/item_shared.rb +88 -0
  54. data/lib/relaton/bib/model/keyword.rb +30 -0
  55. data/lib/relaton/bib/model/locality.rb +18 -0
  56. data/lib/relaton/bib/model/locality_stack.rb +14 -0
  57. data/lib/relaton/bib/model/localized_string.rb +48 -0
  58. data/lib/relaton/bib/model/localized_string_attrs.rb +24 -0
  59. data/lib/relaton/bib/model/logo.rb +14 -0
  60. data/lib/relaton/bib/model/medium.rb +22 -0
  61. data/lib/relaton/bib/model/note.rb +16 -0
  62. data/lib/relaton/bib/model/organization.rb +13 -0
  63. data/lib/relaton/bib/model/organization_type.rb +42 -0
  64. data/lib/relaton/bib/model/person.rb +36 -0
  65. data/lib/relaton/bib/model/phone.rb +14 -0
  66. data/lib/relaton/bib/model/place.rb +33 -0
  67. data/lib/relaton/bib/model/price.rb +14 -0
  68. data/lib/relaton/bib/model/relation.rb +43 -0
  69. data/lib/relaton/bib/model/series.rb +34 -0
  70. data/lib/relaton/bib/model/size.rb +23 -0
  71. data/lib/relaton/bib/model/source_locality_stack.rb +14 -0
  72. data/lib/relaton/bib/model/status.rb +27 -0
  73. data/lib/relaton/bib/model/structured_identifier.rb +48 -0
  74. data/lib/relaton/bib/model/subdivision.rb +16 -0
  75. data/lib/relaton/bib/model/title.rb +56 -0
  76. data/lib/relaton/bib/model/type/plain_date.rb +16 -0
  77. data/lib/relaton/bib/model/type/string_date.rb +48 -0
  78. data/lib/relaton/bib/model/uri.rb +18 -0
  79. data/lib/relaton/bib/model/validity.rb +16 -0
  80. data/lib/relaton/bib/model/version.rb +43 -0
  81. data/lib/relaton/bib/namespace_helper.rb +21 -0
  82. data/lib/relaton/bib/sanitizer.rb +68 -0
  83. data/lib/relaton/bib/util.rb +18 -0
  84. data/lib/relaton/bib/versions.json +35 -0
  85. data/lib/relaton/bib.rb +48 -0
  86. data/lib/relaton/bipm/bibliography.rb +82 -0
  87. data/lib/relaton/bipm/converter/asciibib.rb +64 -0
  88. data/lib/relaton/bipm/data_fetcher.rb +57 -0
  89. data/lib/relaton/bipm/data_outcomes_parser.rb +657 -0
  90. data/lib/relaton/bipm/id_parser.rb +277 -0
  91. data/lib/relaton/bipm/item_data.rb +47 -0
  92. data/lib/relaton/bipm/model/bibdata.rb +9 -0
  93. data/lib/relaton/bipm/model/bibitem.rb +9 -0
  94. data/lib/relaton/bipm/model/comment_period.rb +13 -0
  95. data/lib/relaton/bipm/model/doctype.rb +12 -0
  96. data/lib/relaton/bipm/model/ext.rb +38 -0
  97. data/lib/relaton/bipm/model/item.rb +11 -0
  98. data/lib/relaton/bipm/model/structured_identifier.rb +15 -0
  99. data/lib/relaton/bipm/processor.rb +69 -0
  100. data/lib/relaton/bipm/rawdata_bipm_metrologia/affiliations.rb +111 -0
  101. data/lib/relaton/bipm/rawdata_bipm_metrologia/fetcher.rb +174 -0
  102. data/lib/relaton/bipm/rawdata_bipm_metrologia/niso_jats_parser.rb +353 -0
  103. data/lib/relaton/bipm/si_brochure_parser.rb +186 -0
  104. data/lib/relaton/bipm/util.rb +8 -0
  105. data/lib/relaton/bipm.rb +32 -0
  106. data/lib/relaton/bsi/bibliography.rb +124 -0
  107. data/lib/relaton/bsi/hit.rb +14 -0
  108. data/lib/relaton/bsi/hit_collection.rb +114 -0
  109. data/lib/relaton/bsi/item_data.rb +13 -0
  110. data/lib/relaton/bsi/model/bibdata.rb +8 -0
  111. data/lib/relaton/bsi/model/bibitem.rb +8 -0
  112. data/lib/relaton/bsi/model/docidentifier.rb +9 -0
  113. data/lib/relaton/bsi/model/doctype.rb +14 -0
  114. data/lib/relaton/bsi/model/ext.rb +17 -0
  115. data/lib/relaton/bsi/model/item.rb +17 -0
  116. data/lib/relaton/bsi/model/item_base.rb +22 -0
  117. data/lib/relaton/bsi/model/relation.rb +9 -0
  118. data/lib/relaton/bsi/processor.rb +42 -0
  119. data/lib/relaton/bsi/schema.json +24882 -0
  120. data/lib/relaton/bsi/scraper.rb +288 -0
  121. data/lib/relaton/bsi/util.rb +8 -0
  122. data/lib/relaton/bsi.rb +25 -0
  123. data/lib/relaton/calconnect/bibliography.rb +95 -0
  124. data/lib/relaton/calconnect/data_fetcher.rb +106 -0
  125. data/lib/relaton/calconnect/hit.rb +14 -0
  126. data/lib/relaton/calconnect/hit_collection.rb +84 -0
  127. data/lib/relaton/calconnect/item_data.rb +12 -0
  128. data/lib/relaton/calconnect/model/bibdata.rb +8 -0
  129. data/lib/relaton/calconnect/model/bibitem.rb +8 -0
  130. data/lib/relaton/calconnect/model/doctype.rb +11 -0
  131. data/lib/relaton/calconnect/model/ext.rb +11 -0
  132. data/lib/relaton/calconnect/model/item.rb +13 -0
  133. data/lib/relaton/calconnect/processor.rb +66 -0
  134. data/lib/relaton/calconnect/scraper.rb +87 -0
  135. data/lib/relaton/calconnect/util.rb +8 -0
  136. data/lib/relaton/calconnect.rb +26 -0
  137. data/lib/relaton/ccsds/bibliography.rb +63 -0
  138. data/lib/relaton/ccsds/data/fetcher.rb +247 -0
  139. data/lib/relaton/ccsds/data/iso_references.rb +30 -0
  140. data/lib/relaton/ccsds/data/parser.rb +194 -0
  141. data/lib/relaton/ccsds/hit.rb +24 -0
  142. data/lib/relaton/ccsds/hit_collection.rb +42 -0
  143. data/lib/relaton/ccsds/item_data.rb +9 -0
  144. data/lib/relaton/ccsds/model/bibdata.rb +8 -0
  145. data/lib/relaton/ccsds/model/bibitem.rb +8 -0
  146. data/lib/relaton/ccsds/model/doctype.rb +9 -0
  147. data/lib/relaton/ccsds/model/ext.rb +19 -0
  148. data/lib/relaton/ccsds/model/item.rb +13 -0
  149. data/lib/relaton/ccsds/processor.rb +68 -0
  150. data/lib/relaton/ccsds/util.rb +10 -0
  151. data/lib/relaton/ccsds.rb +33 -0
  152. data/lib/relaton/cen/bibliography.rb +121 -0
  153. data/lib/relaton/cen/committees.yaml +66 -0
  154. data/lib/relaton/cen/hit.rb +16 -0
  155. data/lib/relaton/cen/hit_collection.rb +68 -0
  156. data/lib/relaton/cen/item_data.rb +7 -0
  157. data/lib/relaton/cen/model/bibdata.rb +8 -0
  158. data/lib/relaton/cen/model/bibitem.rb +8 -0
  159. data/lib/relaton/cen/model/docidentifier.rb +9 -0
  160. data/lib/relaton/cen/model/ext.rb +11 -0
  161. data/lib/relaton/cen/model/item.rb +14 -0
  162. data/lib/relaton/cen/model/structured_identifier.rb +9 -0
  163. data/lib/relaton/cen/processor.rb +40 -0
  164. data/lib/relaton/cen/scraper.rb +210 -0
  165. data/lib/relaton/cen/util.rb +8 -0
  166. data/lib/relaton/cen.rb +29 -0
  167. data/lib/relaton/cie/bibdata.rb +8 -0
  168. data/lib/relaton/cie/bibitem.rb +8 -0
  169. data/lib/relaton/cie/bibliography.rb +31 -0
  170. data/lib/relaton/cie/data_fetcher.rb +355 -0
  171. data/lib/relaton/cie/ext.rb +7 -0
  172. data/lib/relaton/cie/item.rb +11 -0
  173. data/lib/relaton/cie/item_data.rb +6 -0
  174. data/lib/relaton/cie/processor.rb +66 -0
  175. data/lib/relaton/cie/scrapper.rb +39 -0
  176. data/lib/relaton/cie/util.rb +8 -0
  177. data/lib/relaton/cie.rb +28 -0
  178. data/lib/relaton/core/array_wrapper.rb +20 -0
  179. data/lib/relaton/core/data_fetcher.rb +97 -0
  180. data/lib/relaton/core/date_parser.rb +42 -0
  181. data/lib/relaton/core/hash_keys_sybolizer.rb +19 -0
  182. data/lib/relaton/core/hit.rb +49 -0
  183. data/lib/relaton/core/hit_collection.rb +118 -0
  184. data/lib/relaton/core/processor.rb +48 -0
  185. data/lib/relaton/core/workers_pool.rb +45 -0
  186. data/lib/relaton/core.rb +9 -0
  187. data/lib/relaton/db/cache.rb +232 -0
  188. data/lib/relaton/db/config.rb +24 -0
  189. data/lib/relaton/db/registry.rb +119 -0
  190. data/lib/relaton/db/util.rb +9 -0
  191. data/lib/relaton/db/workers_pool.rb +22 -0
  192. data/lib/relaton/db.rb +20 -206
  193. data/lib/relaton/doi/crossref.rb +72 -0
  194. data/lib/relaton/doi/parser.rb +827 -0
  195. data/lib/relaton/doi/processor.rb +65 -0
  196. data/lib/relaton/doi/util.rb +8 -0
  197. data/lib/relaton/doi.rb +20 -0
  198. data/lib/relaton/ecma/bibdata.rb +8 -0
  199. data/lib/relaton/ecma/bibitem.rb +8 -0
  200. data/lib/relaton/ecma/bibliography.rb +81 -0
  201. data/lib/relaton/ecma/data_fetcher.rb +103 -0
  202. data/lib/relaton/ecma/data_parser.rb +49 -0
  203. data/lib/relaton/ecma/edition_parser.rb +80 -0
  204. data/lib/relaton/ecma/ext.rb +7 -0
  205. data/lib/relaton/ecma/item.rb +11 -0
  206. data/lib/relaton/ecma/item_data.rb +6 -0
  207. data/lib/relaton/ecma/memento_parser.rb +60 -0
  208. data/lib/relaton/ecma/page_fetcher.rb +27 -0
  209. data/lib/relaton/ecma/parser_common.rb +33 -0
  210. data/lib/relaton/ecma/processor.rb +66 -0
  211. data/lib/relaton/ecma/standard_parser.rb +134 -0
  212. data/lib/relaton/ecma/util.rb +8 -0
  213. data/lib/relaton/ecma.rb +24 -0
  214. data/lib/relaton/etsi/bibdata.rb +10 -0
  215. data/lib/relaton/etsi/bibitem.rb +10 -0
  216. data/lib/relaton/etsi/bibliography.rb +46 -0
  217. data/lib/relaton/etsi/data_fetcher.rb +128 -0
  218. data/lib/relaton/etsi/data_parser.rb +208 -0
  219. data/lib/relaton/etsi/doctype.rb +30 -0
  220. data/lib/relaton/etsi/ext.rb +31 -0
  221. data/lib/relaton/etsi/item.rb +15 -0
  222. data/lib/relaton/etsi/item_data.rb +6 -0
  223. data/lib/relaton/etsi/processor.rb +69 -0
  224. data/lib/relaton/etsi/pubid.rb +37 -0
  225. data/lib/relaton/etsi/status.rb +13 -0
  226. data/lib/relaton/etsi/util.rb +8 -0
  227. data/lib/relaton/etsi.rb +25 -0
  228. data/lib/relaton/gb/bibdata.rb +8 -0
  229. data/lib/relaton/gb/bibitem.rb +8 -0
  230. data/lib/relaton/gb/bibliography.rb +145 -0
  231. data/lib/relaton/gb/ccs.rb +14 -0
  232. data/lib/relaton/gb/committee.rb +13 -0
  233. data/lib/relaton/gb/docidentifier.rb +23 -0
  234. data/lib/relaton/gb/doctype.rb +9 -0
  235. data/lib/relaton/gb/ext.rb +36 -0
  236. data/lib/relaton/gb/gb_scraper.rb +61 -0
  237. data/lib/relaton/gb/gb_type.rb +20 -0
  238. data/lib/relaton/gb/hit.rb +48 -0
  239. data/lib/relaton/gb/hit_collection.rb +19 -0
  240. data/lib/relaton/gb/item.rb +13 -0
  241. data/lib/relaton/gb/item_data.rb +6 -0
  242. data/lib/relaton/gb/processor.rb +46 -0
  243. data/lib/relaton/gb/project_number.rb +38 -0
  244. data/lib/relaton/gb/scraper.rb +204 -0
  245. data/lib/relaton/gb/sec_scraper.rb +92 -0
  246. data/lib/relaton/gb/stage_name.rb +13 -0
  247. data/lib/relaton/gb/structured_identifier.rb +26 -0
  248. data/lib/relaton/gb/t_scraper.rb +126 -0
  249. data/lib/relaton/gb/util.rb +8 -0
  250. data/lib/relaton/gb/yaml/prefixes.yaml +200 -0
  251. data/lib/relaton/gb.rb +33 -0
  252. data/lib/relaton/iana/bibdata.rb +8 -0
  253. data/lib/relaton/iana/bibitem.rb +8 -0
  254. data/lib/relaton/iana/bibliography.rb +47 -0
  255. data/lib/relaton/iana/data_fetcher.rb +71 -0
  256. data/lib/relaton/iana/item.rb +7 -0
  257. data/lib/relaton/iana/item_data.rb +6 -0
  258. data/lib/relaton/iana/parser.rb +146 -0
  259. data/lib/relaton/iana/processor.rb +68 -0
  260. data/lib/relaton/iana/util.rb +8 -0
  261. data/lib/relaton/iana.rb +29 -0
  262. data/lib/relaton/iec/bibliography.rb +283 -0
  263. data/lib/relaton/iec/data_fetcher.rb +216 -0
  264. data/lib/relaton/iec/data_parser.rb +391 -0
  265. data/lib/relaton/iec/hit.rb +26 -0
  266. data/lib/relaton/iec/hit_collection.rb +138 -0
  267. data/lib/relaton/iec/item_data.rb +7 -0
  268. data/lib/relaton/iec/model/bibdata.rb +8 -0
  269. data/lib/relaton/iec/model/bibitem.rb +8 -0
  270. data/lib/relaton/iec/model/docidentifier.rb +131 -0
  271. data/lib/relaton/iec/model/doctype.rb +12 -0
  272. data/lib/relaton/iec/model/ext.rb +53 -0
  273. data/lib/relaton/iec/model/item.rb +20 -0
  274. data/lib/relaton/iec/model/item_base.rb +12 -0
  275. data/lib/relaton/iec/model/relation.rb +7 -0
  276. data/lib/relaton/iec/model/stage_name.rb +13 -0
  277. data/lib/relaton/iec/processor.rb +73 -0
  278. data/lib/relaton/iec/statuses.yml +199 -0
  279. data/lib/relaton/iec/util.rb +8 -0
  280. data/lib/relaton/iec.rb +98 -0
  281. data/lib/relaton/ieee/balloting_group.rb +13 -0
  282. data/lib/relaton/ieee/bibdata.rb +8 -0
  283. data/lib/relaton/ieee/bibitem.rb +8 -0
  284. data/lib/relaton/ieee/bibliography.rb +51 -0
  285. data/lib/relaton/ieee/converter/bibxml/from_rfcxml.rb +10 -0
  286. data/lib/relaton/ieee/converter/bibxml/from_rfcxml_referencegroup.rb +10 -0
  287. data/lib/relaton/ieee/converter/bibxml.rb +20 -0
  288. data/lib/relaton/ieee/data_fetcher.rb +630 -0
  289. data/lib/relaton/ieee/doctype.rb +9 -0
  290. data/lib/relaton/ieee/editorial_group.rb +19 -0
  291. data/lib/relaton/ieee/ext.rb +36 -0
  292. data/lib/relaton/ieee/idams_parser.rb +323 -0
  293. data/lib/relaton/ieee/item.rb +11 -0
  294. data/lib/relaton/ieee/item_data.rb +7 -0
  295. data/lib/relaton/ieee/processor.rb +68 -0
  296. data/lib/relaton/ieee/pub_id.rb +161 -0
  297. data/lib/relaton/ieee/rawbib_id_parser.rb +548 -0
  298. data/lib/relaton/ieee/util.rb +8 -0
  299. data/lib/relaton/ieee.rb +29 -0
  300. data/lib/relaton/ietf/bibdata.rb +8 -0
  301. data/lib/relaton/ietf/bibitem.rb +8 -0
  302. data/lib/relaton/ietf/bibliography.rb +35 -0
  303. data/lib/relaton/ietf/bibxml_parser.rb +232 -0
  304. data/lib/relaton/ietf/data_fetcher.rb +278 -0
  305. data/lib/relaton/ietf/doctype.rb +9 -0
  306. data/lib/relaton/ietf/ext.rb +63 -0
  307. data/lib/relaton/ietf/item.rb +16 -0
  308. data/lib/relaton/ietf/item_base.rb +18 -0
  309. data/lib/relaton/ietf/item_data.rb +6 -0
  310. data/lib/relaton/ietf/processing_instructions.rb +79 -0
  311. data/lib/relaton/ietf/processor.rb +68 -0
  312. data/lib/relaton/ietf/relation.rb +9 -0
  313. data/lib/relaton/ietf/rfc/abstract.rb +19 -0
  314. data/lib/relaton/ietf/rfc/author.rb +21 -0
  315. data/lib/relaton/ietf/rfc/entry.rb +410 -0
  316. data/lib/relaton/ietf/rfc/entry_date.rb +21 -0
  317. data/lib/relaton/ietf/rfc/format.rb +19 -0
  318. data/lib/relaton/ietf/rfc/index.rb +46 -0
  319. data/lib/relaton/ietf/rfc/is_also.rb +21 -0
  320. data/lib/relaton/ietf/rfc/keywords.rb +19 -0
  321. data/lib/relaton/ietf/rfc/rfc_index_namespace.rb +11 -0
  322. data/lib/relaton/ietf/scraper.rb +68 -0
  323. data/lib/relaton/ietf/util.rb +8 -0
  324. data/lib/relaton/ietf/wg_name_resolver.rb +42 -0
  325. data/lib/relaton/ietf.rb +27 -0
  326. data/lib/relaton/iho/bibdata.rb +8 -0
  327. data/lib/relaton/iho/bibitem.rb +8 -0
  328. data/lib/relaton/iho/bibliography.rb +114 -0
  329. data/lib/relaton/iho/comment_period.rb +13 -0
  330. data/lib/relaton/iho/docidentifier.rb +31 -0
  331. data/lib/relaton/iho/doctype.rb +10 -0
  332. data/lib/relaton/iho/ext.rb +20 -0
  333. data/lib/relaton/iho/hash_parser_v1.rb +144 -0
  334. data/lib/relaton/iho/item.rb +20 -0
  335. data/lib/relaton/iho/item_base.rb +18 -0
  336. data/lib/relaton/iho/item_data.rb +6 -0
  337. data/lib/relaton/iho/processor.rb +54 -0
  338. data/lib/relaton/iho/relation.rb +9 -0
  339. data/lib/relaton/iho/structured_identifier.rb +20 -0
  340. data/lib/relaton/iho/util.rb +8 -0
  341. data/lib/relaton/iho.rb +27 -0
  342. data/lib/relaton/index/config.rb +52 -0
  343. data/lib/relaton/index/file_io.rb +305 -0
  344. data/lib/relaton/index/file_storage.rb +61 -0
  345. data/lib/relaton/index/id_number.rb +30 -0
  346. data/lib/relaton/index/pool.rb +41 -0
  347. data/lib/relaton/index/type.rb +159 -0
  348. data/lib/relaton/index/util.rb +18 -0
  349. data/lib/relaton/index.rb +60 -0
  350. data/lib/relaton/isbn/isbn.rb +61 -0
  351. data/lib/relaton/isbn/open_library.rb +43 -0
  352. data/lib/relaton/isbn/parser.rb +88 -0
  353. data/lib/relaton/isbn/processor.rb +48 -0
  354. data/lib/relaton/isbn/util.rb +8 -0
  355. data/lib/relaton/isbn.rb +19 -0
  356. data/lib/relaton/iso/bibliography.rb +407 -0
  357. data/lib/relaton/iso/data_fetcher.rb +338 -0
  358. data/lib/relaton/iso/data_parser.rb +444 -0
  359. data/lib/relaton/iso/hash_parser_v1.rb +177 -0
  360. data/lib/relaton/iso/hit.rb +57 -0
  361. data/lib/relaton/iso/hit_collection.rb +184 -0
  362. data/lib/relaton/iso/item_data.rb +28 -0
  363. data/lib/relaton/iso/model/bibdata.rb +10 -0
  364. data/lib/relaton/iso/model/bibitem.rb +8 -0
  365. data/lib/relaton/iso/model/contributor.rb +6 -0
  366. data/lib/relaton/iso/model/contributor_info.rb +9 -0
  367. data/lib/relaton/iso/model/docidentifier.rb +134 -0
  368. data/lib/relaton/iso/model/doctype.rb +13 -0
  369. data/lib/relaton/iso/model/ext.rb +35 -0
  370. data/lib/relaton/iso/model/item.rb +17 -0
  371. data/lib/relaton/iso/model/item_base.rb +22 -0
  372. data/lib/relaton/iso/model/organization.rb +9 -0
  373. data/lib/relaton/iso/model/project_number.rb +22 -0
  374. data/lib/relaton/iso/model/relation.rb +9 -0
  375. data/lib/relaton/iso/model/stagename.rb +14 -0
  376. data/lib/relaton/iso/model/structured_identifier.rb +31 -0
  377. data/lib/relaton/iso/processor.rb +84 -0
  378. data/lib/relaton/iso/scraper.rb +619 -0
  379. data/lib/relaton/iso/type/pubid.rb +50 -0
  380. data/lib/relaton/iso/util.rb +8 -0
  381. data/lib/relaton/iso.rb +30 -0
  382. data/lib/relaton/itu/bibliography.rb +90 -0
  383. data/lib/relaton/itu/data_fetcher.rb +104 -0
  384. data/lib/relaton/itu/data_parser_r.rb +140 -0
  385. data/lib/relaton/itu/hit.rb +22 -0
  386. data/lib/relaton/itu/hit_collection.rb +127 -0
  387. data/lib/relaton/itu/item_data.rb +6 -0
  388. data/lib/relaton/itu/model/approval_stage.rb +13 -0
  389. data/lib/relaton/itu/model/bibdata.rb +8 -0
  390. data/lib/relaton/itu/model/bibitem.rb +8 -0
  391. data/lib/relaton/itu/model/docidentifier.rb +9 -0
  392. data/lib/relaton/itu/model/doctype.rb +13 -0
  393. data/lib/relaton/itu/model/ext.rb +47 -0
  394. data/lib/relaton/itu/model/item.rb +13 -0
  395. data/lib/relaton/itu/model/meeting.rb +13 -0
  396. data/lib/relaton/itu/model/meeting_date.rb +15 -0
  397. data/lib/relaton/itu/model/question.rb +13 -0
  398. data/lib/relaton/itu/model/recommendation_status.rb +11 -0
  399. data/lib/relaton/itu/model/structured_identifier.rb +19 -0
  400. data/lib/relaton/itu/processor.rb +66 -0
  401. data/lib/relaton/itu/pubid.rb +177 -0
  402. data/lib/relaton/itu/radio_regulations_parser.rb +70 -0
  403. data/lib/relaton/itu/recommendation_parser.rb +161 -0
  404. data/lib/relaton/itu/scraper.rb +193 -0
  405. data/lib/relaton/itu/util.rb +8 -0
  406. data/lib/relaton/itu.rb +33 -0
  407. data/lib/relaton/jis/bibdata.rb +8 -0
  408. data/lib/relaton/jis/bibitem.rb +8 -0
  409. data/lib/relaton/jis/bibliography.rb +75 -0
  410. data/lib/relaton/jis/data_fetcher.rb +181 -0
  411. data/lib/relaton/jis/docidentifier.rb +21 -0
  412. data/lib/relaton/jis/doctype.rb +9 -0
  413. data/lib/relaton/jis/ext.rb +13 -0
  414. data/lib/relaton/jis/hit.rb +93 -0
  415. data/lib/relaton/jis/hit_collection.rb +127 -0
  416. data/lib/relaton/jis/item.rb +22 -0
  417. data/lib/relaton/jis/item_base.rb +26 -0
  418. data/lib/relaton/jis/item_data.rb +8 -0
  419. data/lib/relaton/jis/processor.rb +55 -0
  420. data/lib/relaton/jis/relation.rb +11 -0
  421. data/lib/relaton/jis/scraper.rb +232 -0
  422. data/lib/relaton/jis/structured_identifier.rb +13 -0
  423. data/lib/relaton/jis/util.rb +8 -0
  424. data/lib/relaton/jis.rb +33 -0
  425. data/lib/relaton/logger/channels/gh_issue.rb +78 -0
  426. data/lib/relaton/logger/config.rb +34 -0
  427. data/lib/relaton/logger/formatter_json.rb +8 -0
  428. data/lib/relaton/logger/formatter_string.rb +12 -0
  429. data/lib/relaton/logger/log.rb +64 -0
  430. data/lib/relaton/logger/log_device.rb +27 -0
  431. data/lib/relaton/logger/pool.rb +24 -0
  432. data/lib/relaton/logger.rb +18 -0
  433. data/lib/relaton/nist/bibdata.rb +8 -0
  434. data/lib/relaton/nist/bibitem.rb +8 -0
  435. data/lib/relaton/nist/bibliography.rb +191 -0
  436. data/lib/relaton/nist/comment_period.rb +15 -0
  437. data/lib/relaton/nist/data_fetcher.rb +84 -0
  438. data/lib/relaton/nist/date.rb +7 -0
  439. data/lib/relaton/nist/doctype.rb +7 -0
  440. data/lib/relaton/nist/ext.rb +16 -0
  441. data/lib/relaton/nist/hit.rb +18 -0
  442. data/lib/relaton/nist/hit_collection.rb +362 -0
  443. data/lib/relaton/nist/item.rb +17 -0
  444. data/lib/relaton/nist/item_data.rb +6 -0
  445. data/lib/relaton/nist/mods_parser.rb +276 -0
  446. data/lib/relaton/nist/processor.rb +68 -0
  447. data/lib/relaton/nist/pubs_export.rb +69 -0
  448. data/lib/relaton/nist/relation.rb +7 -0
  449. data/lib/relaton/nist/scraper.rb +290 -0
  450. data/lib/relaton/nist/series.yaml +49 -0
  451. data/lib/relaton/nist/util.rb +8 -0
  452. data/lib/relaton/nist.rb +34 -0
  453. data/lib/relaton/oasis/bibdata.rb +8 -0
  454. data/lib/relaton/oasis/bibitem.rb +8 -0
  455. data/lib/relaton/oasis/bibliography.rb +60 -0
  456. data/lib/relaton/oasis/browser_agent.rb +71 -0
  457. data/lib/relaton/oasis/data_fetcher.rb +94 -0
  458. data/lib/relaton/oasis/data_parser.rb +305 -0
  459. data/lib/relaton/oasis/data_parser_utils.rb +296 -0
  460. data/lib/relaton/oasis/data_part_parser.rb +239 -0
  461. data/lib/relaton/oasis/doctype.rb +7 -0
  462. data/lib/relaton/oasis/ext.rb +19 -0
  463. data/lib/relaton/oasis/item.rb +11 -0
  464. data/lib/relaton/oasis/item_data.rb +6 -0
  465. data/lib/relaton/oasis/processor.rb +68 -0
  466. data/lib/relaton/oasis/util.rb +8 -0
  467. data/lib/relaton/oasis.rb +28 -0
  468. data/lib/relaton/ogc/bibdata.rb +8 -0
  469. data/lib/relaton/ogc/bibitem.rb +8 -0
  470. data/lib/relaton/ogc/bibliography.rb +64 -0
  471. data/lib/relaton/ogc/data_fetcher.rb +110 -0
  472. data/lib/relaton/ogc/docidentifier.rb +6 -0
  473. data/lib/relaton/ogc/doctype.rb +12 -0
  474. data/lib/relaton/ogc/ext.rb +15 -0
  475. data/lib/relaton/ogc/hit.rb +18 -0
  476. data/lib/relaton/ogc/hit_collection.rb +36 -0
  477. data/lib/relaton/ogc/item.rb +13 -0
  478. data/lib/relaton/ogc/item_data.rb +6 -0
  479. data/lib/relaton/ogc/processor.rb +58 -0
  480. data/lib/relaton/ogc/scraper.rb +225 -0
  481. data/lib/relaton/ogc/util.rb +8 -0
  482. data/lib/relaton/ogc.rb +26 -0
  483. data/lib/relaton/oiml/bibdata.rb +8 -0
  484. data/lib/relaton/oiml/bibitem.rb +8 -0
  485. data/lib/relaton/oiml/bibliography.rb +94 -0
  486. data/lib/relaton/oiml/docidentifier.rb +33 -0
  487. data/lib/relaton/oiml/doctype.rb +13 -0
  488. data/lib/relaton/oiml/ext.rb +42 -0
  489. data/lib/relaton/oiml/item.rb +20 -0
  490. data/lib/relaton/oiml/item_base.rb +18 -0
  491. data/lib/relaton/oiml/item_data.rb +6 -0
  492. data/lib/relaton/oiml/processor.rb +54 -0
  493. data/lib/relaton/oiml/relation.rb +9 -0
  494. data/lib/relaton/oiml/util.rb +8 -0
  495. data/lib/relaton/oiml.rb +24 -0
  496. data/lib/relaton/omg/bibdata.rb +8 -0
  497. data/lib/relaton/omg/bibitem.rb +8 -0
  498. data/lib/relaton/omg/bibliography.rb +31 -0
  499. data/lib/relaton/omg/ext.rb +7 -0
  500. data/lib/relaton/omg/item.rb +8 -0
  501. data/lib/relaton/omg/item_data.rb +6 -0
  502. data/lib/relaton/omg/processor.rb +34 -0
  503. data/lib/relaton/omg/scraper.rb +141 -0
  504. data/lib/relaton/omg/util.rb +8 -0
  505. data/lib/relaton/omg.rb +24 -0
  506. data/lib/relaton/plateau/bibdata.rb +8 -0
  507. data/lib/relaton/plateau/bibitem.rb +8 -0
  508. data/lib/relaton/plateau/bibliography.rb +24 -0
  509. data/lib/relaton/plateau/data_fetcher.rb +153 -0
  510. data/lib/relaton/plateau/doctype.rb +7 -0
  511. data/lib/relaton/plateau/ext.rb +23 -0
  512. data/lib/relaton/plateau/handbook_parser.rb +95 -0
  513. data/lib/relaton/plateau/hit.rb +13 -0
  514. data/lib/relaton/plateau/hit_collection.rb +59 -0
  515. data/lib/relaton/plateau/item.rb +12 -0
  516. data/lib/relaton/plateau/item_data.rb +6 -0
  517. data/lib/relaton/plateau/parser.rb +101 -0
  518. data/lib/relaton/plateau/processor.rb +49 -0
  519. data/lib/relaton/plateau/technical_report_parser.rb +91 -0
  520. data/lib/relaton/plateau/util.rb +8 -0
  521. data/lib/relaton/plateau.rb +28 -0
  522. data/lib/relaton/un/bibdata.rb +8 -0
  523. data/lib/relaton/un/bibitem.rb +8 -0
  524. data/lib/relaton/un/bibliography.rb +48 -0
  525. data/lib/relaton/un/doctype.rb +10 -0
  526. data/lib/relaton/un/ext.rb +30 -0
  527. data/lib/relaton/un/hit.rb +56 -0
  528. data/lib/relaton/un/hit_collection.rb +61 -0
  529. data/lib/relaton/un/item.rb +11 -0
  530. data/lib/relaton/un/item_data.rb +6 -0
  531. data/lib/relaton/un/parser.rb +108 -0
  532. data/lib/relaton/un/processor.rb +38 -0
  533. data/lib/relaton/un/session.rb +25 -0
  534. data/lib/relaton/un/token_generator.rb +105 -0
  535. data/lib/relaton/un/util.rb +8 -0
  536. data/lib/relaton/un/wasm/decoder.rb +434 -0
  537. data/lib/relaton/un/wasm/instance.rb +101 -0
  538. data/lib/relaton/un/wasm/interpreter.rb +613 -0
  539. data/lib/relaton/un/wasm/memory.rb +112 -0
  540. data/lib/relaton/un/wasm/module.rb +47 -0
  541. data/lib/relaton/un/wasm.rb +17 -0
  542. data/lib/relaton/un/wasm_v_bg.wasm +0 -0
  543. data/lib/relaton/un.rb +28 -0
  544. data/lib/relaton/version.rb +1 -1
  545. data/lib/relaton/w3c/bibdata.rb +8 -0
  546. data/lib/relaton/w3c/bibitem.rb +8 -0
  547. data/lib/relaton/w3c/bibliography.rb +54 -0
  548. data/lib/relaton/w3c/data_fetcher.rb +309 -0
  549. data/lib/relaton/w3c/data_parser.rb +379 -0
  550. data/lib/relaton/w3c/doctype.rb +7 -0
  551. data/lib/relaton/w3c/ext.rb +11 -0
  552. data/lib/relaton/w3c/item.rb +12 -0
  553. data/lib/relaton/w3c/item_data.rb +6 -0
  554. data/lib/relaton/w3c/processor.rb +49 -0
  555. data/lib/relaton/w3c/pubid.rb +73 -0
  556. data/lib/relaton/w3c/safe_realize.rb +59 -0
  557. data/lib/relaton/w3c/util.rb +8 -0
  558. data/lib/relaton/w3c.rb +25 -0
  559. data/lib/relaton/xsf/bibdata.rb +8 -0
  560. data/lib/relaton/xsf/bibitem.rb +8 -0
  561. data/lib/relaton/xsf/bibliography.rb +24 -0
  562. data/lib/relaton/xsf/data_fetcher.rb +56 -0
  563. data/lib/relaton/xsf/hit.rb +17 -0
  564. data/lib/relaton/xsf/hit_collection.rb +24 -0
  565. data/lib/relaton/xsf/item.rb +7 -0
  566. data/lib/relaton/xsf/item_data.rb +6 -0
  567. data/lib/relaton/xsf/processor.rb +50 -0
  568. data/lib/relaton/xsf/util.rb +9 -0
  569. data/lib/relaton/xsf.rb +30 -0
  570. data/lib/relaton-core.rb +1 -0
  571. data/lib/relaton.rb +44 -9
  572. metadata +708 -150
  573. data/.github/workflows/rake.yml +0 -14
  574. data/.github/workflows/release.yml +0 -24
  575. data/.github/workflows/rubocop.yml +0 -48
  576. data/.gitignore +0 -12
  577. data/.rspec +0 -3
  578. data/.rubocop.yml +0 -12
  579. data/CLAUDE.md +0 -70
  580. data/Gemfile +0 -21
  581. data/Rakefile +0 -6
  582. data/docs/CHANGELOG.adoc +0 -16
  583. data/docs/VERSIONING_POLICY.adoc +0 -38
  584. data/docs/navigation.adoc +0 -6
  585. data/lib/relaton/config.rb +0 -24
  586. data/lib/relaton/db_cache.rb +0 -230
  587. data/lib/relaton/registry.rb +0 -118
  588. data/lib/relaton/util.rb +0 -7
  589. data/lib/relaton/workers_pool.rb +0 -21
  590. data/relaton.gemspec +0 -61
  591. data/spec/relaton/config_spec.rb +0 -10
  592. data/spec/relaton/db_cache_spec.rb +0 -51
  593. data/spec/relaton/db_spec.rb +0 -556
  594. data/spec/relaton/registry_spec.rb +0 -178
  595. data/spec/relaton/util_spec.rb +0 -3
  596. data/spec/relaton_spec.rb +0 -725
  597. data/spec/spec_helper.rb +0 -45
  598. data/spec/support/gb_t_20223_2006.xml +0 -33
  599. data/spec/support/iso_111111119115_1.xml +0 -0
  600. data/spec/support/iso_19115_1.xml +0 -115
  601. data/spec/support/iso_19115_2.xml +0 -95
  602. data/spec/support/rfc_8341.xml +0 -46
  603. data/spec/vcr_cassetes/3gpp_tr_00_01u_umts_3_0_0.yml +0 -12720
  604. data/spec/vcr_cassetes/api_relaton_org.yml +0 -121
  605. data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +0 -143
  606. data/spec/vcr_cassetes/cc_dir_10005_2019.yml +0 -199
  607. data/spec/vcr_cassetes/cie_001_1980.yml +0 -401
  608. data/spec/vcr_cassetes/cipm_meeting_43.yml +0 -1513
  609. data/spec/vcr_cassetes/doi_10_6028_nist_ir_8245.yml +0 -86
  610. data/spec/vcr_cassetes/ecma_6.yml +0 -112
  611. data/spec/vcr_cassetes/en_10160_1999.yml +0 -13624
  612. data/spec/vcr_cassetes/gb_t_20223_2006.yml +0 -733
  613. data/spec/vcr_cassetes/ieee_528_2019.yml +0 -2786
  614. data/spec/vcr_cassetes/iso_111111119115_1.yml +0 -12951
  615. data/spec/vcr_cassetes/iso_19115_1.yml +0 -13177
  616. data/spec/vcr_cassetes/iso_19115_1_2.yml +0 -369
  617. data/spec/vcr_cassetes/iso_19115_1_std.yml +0 -13177
  618. data/spec/vcr_cassetes/iso_19115_all_parts.yml +0 -229
  619. data/spec/vcr_cassetes/iso_19133_2005.yml +0 -148
  620. data/spec/vcr_cassetes/iso_combined_applied.yml +0 -364
  621. data/spec/vcr_cassetes/iso_combined_included.yml +0 -364
  622. data/spec/vcr_cassetes/iso_dis.yml +0 -157
  623. data/spec/vcr_cassetes/ogc_19_025r1.yml +0 -371
  624. data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +0 -317
  625. data/spec/vcr_cassetes/rfc_8341.yml +0 -1272
@@ -0,0 +1,174 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../id_parser"
4
+ require_relative "niso_jats_parser"
5
+
6
+ module Relaton::Bipm
7
+ module RawdataBipmMetrologia
8
+ class Fetcher
9
+ DIR = "rawdata-bipm-metrologia/data/*content/0026-1394"
10
+
11
+ # @param data_fetcher [Relaton::Bipm::DataFetcher]
12
+ def self.fetch(data_fetcher)
13
+ new(data_fetcher).fetch
14
+ end
15
+
16
+ # @param data_fetcher [Relaton::Bipm::DataFetcher]
17
+ def initialize(data_fetcher)
18
+ @data_fetcher = WeakRef.new data_fetcher
19
+ end
20
+
21
+ #
22
+ # Fetch documents from rawdata-bipm-metrologia and save to files
23
+ #
24
+ def fetch
25
+ fetch_metrologia
26
+ fetch_volumes
27
+ fetch_issues
28
+ fetch_articles
29
+ end
30
+
31
+ #
32
+ # Fetch articles from rawdata-bipm-metrologia and save to files
33
+ #
34
+ def fetch_articles # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
35
+ # aff = Affiliations.parse DIR
36
+ Dir["#{DIR}/**/*.xml"].sort_by { |p| archive_date(p) }.each do |path|
37
+ item = NisoJatsParser.parse path, @data_fetcher.errors
38
+ file = "#{item.docidentifier.first.content.downcase.tr(' ', '-')}.#{@data_fetcher.ext}"
39
+ out_path = File.join(@data_fetcher.output, file)
40
+ key = Relaton::Bipm::Id.new.parse(item.docidentifier.first.content).to_hash
41
+ @data_fetcher.index.add_or_update key, out_path
42
+ @data_fetcher.write_file out_path, item
43
+ end
44
+ end
45
+
46
+ #
47
+ # Fetch volumes from rawdata-bipm-metrologia and save to files
48
+ #
49
+ def fetch_volumes
50
+ Dir["#{DIR}/*"].map { |path| path.split("/").last }.uniq.each do |volume|
51
+ fetch_metrologia volume
52
+ end
53
+ end
54
+
55
+ #
56
+ # Fetch issues from rawdata-bipm-metrologia and save to files
57
+ #
58
+ def fetch_issues
59
+ Dir["#{DIR}/*/*"].each do |path|
60
+ volume, issue = path.split("/").last(2)
61
+ fetch_metrologia volume, issue
62
+ end
63
+ end
64
+
65
+ #
66
+ # Fetch metrologia root document from rawdata-bipm-metrologia and save to a file
67
+ #
68
+ # @overload set(volume, issue)
69
+ # @param [String] volume volume number
70
+ # @param [String] issue issue number
71
+ # @overload set(volume)
72
+ # @param [String] volume volume number
73
+ #
74
+ def fetch_metrologia(*args) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
75
+ id = identifier(*args)
76
+ item = ItemData.new(
77
+ type: "article", formattedref: Relaton::Bib::Formattedref.new(content: id), docidentifier: docidentifier(id),
78
+ language: ["en"], script: ["Latn"], relation: relation(*args),
79
+ source: typed_uri(*args)
80
+ )
81
+ file = "#{id.downcase.gsub(' ', '-')}.#{@data_fetcher.ext}"
82
+ path = File.join(@data_fetcher.output, file)
83
+ @data_fetcher.index.add_or_update Id.new.parse(id).to_hash, path
84
+ @data_fetcher.write_file path, item
85
+ end
86
+
87
+ #
88
+ # Create docidentifier
89
+ #
90
+ # @param [String] id document identifier
91
+ #
92
+ # @return [Array<Relaton::Bib::Docidentifier>] docidentifier
93
+ #
94
+ def docidentifier(id)
95
+ [Relaton::Bib::Docidentifier.new(content: id, type: "BIPM", primary: true)]
96
+ end
97
+
98
+ #
99
+ # Create identifier
100
+ #
101
+ # @overload set(volume, issue, article)
102
+ # @param [String] volume volume number
103
+ # @param [String] issue issue number
104
+ # @param [String] article article number
105
+ # @overload set(volume, issue)
106
+ # @param [String] volume volume number
107
+ # @param [String] issue issue number
108
+ # @overload set(volume)
109
+ # @param [String] volume volume number
110
+ #
111
+ # @return [String] document identifier
112
+ #
113
+ def identifier(*args)
114
+ ["Metrologia", *id_parts(*args)].join(" ")
115
+ end
116
+
117
+ def id_parts(*args)
118
+ args.map { |p| p.match(/[^_]+$/).to_s }
119
+ end
120
+
121
+ #
122
+ # Fetch relations
123
+ #
124
+ # @see #fetch_metrologia
125
+ #
126
+ # @return [Array<Relaton::Bib::Relation>] relations
127
+ #
128
+ def relation(*args)
129
+ dir = [DIR, *args].join("/")
130
+ ids = Set.new
131
+ Dir["#{dir}/*"].each do |path|
132
+ part = path.split("/").last
133
+ ids << identifier(*args, part)
134
+ end
135
+ ids.map { |id| Relaton::Bib::Relation.new(type: "partOf", bibitem: rel_bibitem(id)) }
136
+ end
137
+
138
+ #
139
+ # Create relation bibitem
140
+ #
141
+ # @param [String] id document identifier
142
+ #
143
+ # @return [Relaton::Bipm::Item] bibitem
144
+ #
145
+ def rel_bibitem(id)
146
+ Relaton::Bib::ItemData.new(formattedref: Relaton::Bib::Formattedref.new(content: id), docidentifier: docidentifier(id))
147
+ end
148
+
149
+ def typed_uri(*args)
150
+ [Relaton::Bib::Uri.new(type: "src", content: link(*args))]
151
+ end
152
+
153
+ #
154
+ # Extract archive date from path for sorting
155
+ #
156
+ # @param [String] path file path
157
+ #
158
+ # @return [String] date string for sorting
159
+ #
160
+ def archive_date(path)
161
+ path[%r{/data/(\d{4}-\d{2}-\d{2}T[\d_]+)_content/}, 1].to_s
162
+ end
163
+
164
+ def link(*args)
165
+ params = id_parts(*args).join("/")
166
+ case args.size
167
+ when 0 then "https://iopscience.iop.org/journal/0026-1394"
168
+ when 1 then "https://iopscience.iop.org/volume/0026-1394/#{params}"
169
+ when 2 then "https://iopscience.iop.org/issue/0026-1394/#{params}"
170
+ end
171
+ end
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,353 @@
1
+ require "niso-jats"
2
+
3
+ module Relaton::Bipm
4
+ module RawdataBipmMetrologia
5
+ class NisoJatsParser
6
+ ATTRS = %i[docidentifier title contributor date copyright abstract relation series
7
+ extent type source ext].freeze
8
+
9
+ # JATS inline phrasing children handled by #serialize_mixed_content
10
+ INLINE_TYPES = %i[italic bold fixed_case monospace overline roman
11
+ sans_serif sc strike underline sub sup].freeze
12
+ private_constant :INLINE_TYPES
13
+
14
+ # @param [Niso::Jats::Article] doc document
15
+ # @param [String] journal journal
16
+ # @param [String] volume volume
17
+ # @param [String] article article
18
+ # @param [Hash] errors errors hash
19
+ def initialize(doc, journal, volume, article, errors = {})
20
+ @doc = doc
21
+ @journal = journal
22
+ @volume = volume
23
+ @article = article
24
+ @errors = errors
25
+ end
26
+
27
+ # @param [String] path path to XML file
28
+ # @param [Hash] errors errors hash
29
+ #
30
+ # @return [Relaton::Bipm::ItemData] document
31
+ def self.parse(path, errors = {})
32
+ doc = Niso::Jats::Article.from_xml(File.read(path, encoding: "UTF-8"))
33
+ journal, volume, article = path.split("/")[-2].split("_")[1..]
34
+ new(doc, journal, volume, article, errors).parse
35
+ end
36
+
37
+ # @return [Relaton::Bipm::ItemData] document
38
+ def parse
39
+ attrs = ATTRS.to_h { |a| [a, send("parse_#{a}")] }
40
+ ItemData.new(**attrs)
41
+ end
42
+
43
+ # @return [Array<Relaton::Bib::Docidentifier>] array of document identifiers
44
+ def parse_docidentifier
45
+ ids = [create_docidentifier(pubid, "BIPM", true)]
46
+ ids << create_docidentifier(@doc.doi, "doi") if @doc.doi
47
+ @errors[:article_docidentifier] &&= ids.empty?
48
+ ids
49
+ end
50
+
51
+ # @return [String] primary BIPM publication identifier
52
+ def pubid
53
+ @pubid ||= "#{@doc.journal_title} #{volume_issue_article}"
54
+ end
55
+
56
+ # @return [String] volume issue page
57
+ def volume_issue_article
58
+ [@journal, @volume, @article].compact.join(" ")
59
+ end
60
+
61
+ # @return [Array<Relaton::Bib::Title>] array of title strings
62
+ def parse_title
63
+ title = @doc.front.article_meta.title_group.article_title
64
+ result = [Relaton::Bib::Title.new(
65
+ content: serialize_mixed_content(title), language: title.lang, script: "Latn",
66
+ )]
67
+ @errors[:article_title] &&= result.empty?
68
+ result
69
+ end
70
+
71
+ # @return [Array<Relaton::Bib::Contributor>] array of contributors
72
+ def parse_contributor
73
+ result = @doc.contributors.map do |contrib|
74
+ role = Relaton::Bib::Contributor::Role.new(type: contrib.contrib_type)
75
+ attrs = { person: create_person(contrib), organization: create_organization(contrib), role: [role] }
76
+ Relaton::Bib::Contributor.new(**attrs)
77
+ end
78
+ @errors[:article_contributor] &&= result.empty?
79
+ result
80
+ end
81
+
82
+ # @return [Array<Relaton::Bib::Date>] array of dates
83
+ def parse_date
84
+ on = @doc.pub_dates.min
85
+ @errors[:article_date] &&= on.nil?
86
+ return [] unless on
87
+
88
+ [Relaton::Bib::Date.new(type: "published", at: on)]
89
+ end
90
+
91
+ # @return [Array<Relaton::Bib::Copyright>] array of copyright associations
92
+ def parse_copyright
93
+ permissions = @doc.front.article_meta.permissions
94
+ return [] unless permissions
95
+
96
+ from = permissions.copyright_year.first
97
+ return [] unless from
98
+
99
+ owner = permissions.copyright_statement.inject([]) do |acc, cs|
100
+ acc + Array(cs.content).join.split(" & ").map do |c|
101
+ /(?<name>[A-Za-z]+(?:\s[A-Za-z]+)*)/ =~ c
102
+ org_name = Relaton::Bib::TypedLocalizedString.new(content: name, language: "en", script: "Latn")
103
+ org = Relaton::Bib::Organization.new name: [org_name]
104
+ Relaton::Bib::ContributionInfo.new(organization: org)
105
+ end
106
+ end
107
+ result = [Relaton::Bib::Copyright.new(owner: owner, from: from.content)]
108
+ @errors[:article_copyright] &&= result.empty?
109
+ result
110
+ end
111
+
112
+ # @return [Array<Relaton::Bib::Abstract>] array of abstracts
113
+ def parse_abstract
114
+ abstracts = @doc.front.article_meta.abstract
115
+ return [] unless abstracts
116
+
117
+ result = abstracts.filter_map do |a|
118
+ content_parts = []
119
+ content_parts << Array(a.title.content).join if a.title
120
+ a.p&.each do |paragraph|
121
+ content_parts << "<p>#{extract_paragraph_text(paragraph)}</p>"
122
+ end
123
+ next if content_parts.empty?
124
+
125
+ Relaton::Bib::Abstract.new(
126
+ content: content_parts.join, language: a.lang, script: "Latn",
127
+ )
128
+ end
129
+ @errors[:article_abstract] &&= result.empty?
130
+ result
131
+ end
132
+
133
+ def extract_paragraph_text(paragraph)
134
+ serialize_mixed_content(paragraph)
135
+ end
136
+
137
+ # Reconstruct the marked-up string of a niso-jats mixed_content element
138
+ # (Title, Paragraph, …) by walking element_order in document order.
139
+ # Text nodes are emitted verbatim; recognised inline children are
140
+ # wrapped in their original XML tag so JATS markup like <italic> and
141
+ # <sub> survives into the relaton-bib payload instead of being
142
+ # flattened (paragraphs) or serialised as a stringified Array (titles).
143
+ def serialize_mixed_content(element)
144
+ return "" unless element.respond_to?(:element_order) && element.element_order
145
+
146
+ pools = INLINE_TYPES.to_h { |t| [t, element.send(t).to_a.dup] }
147
+ cursor = Hash.new(0)
148
+ out = []
149
+ element.element_order.each do |el|
150
+ case el.type
151
+ when "Text"
152
+ out << el.text_content
153
+ when "Element"
154
+ attr = el.name.tr("-", "_").to_sym
155
+ next unless pools.key?(attr)
156
+
157
+ inst = pools[attr][cursor[attr]]
158
+ cursor[attr] += 1
159
+ next unless inst.respond_to?(:content)
160
+
161
+ inner = inst.content
162
+ inner = inner.join if inner.is_a?(Array)
163
+ out << "<#{el.name}>#{inner}</#{el.name}>"
164
+ end
165
+ end
166
+ out.join
167
+ end
168
+
169
+ # @return [Array<Relaton::Bib::Relation>] array of document relations
170
+ def parse_relation
171
+ pub_dates = @doc.front.article_meta.pub_date
172
+ rels = if pub_dates
173
+ pub_dates.sort_by { |pd| pd.pub_type == "ppub" ? 0 : 1 }.map do |pd|
174
+ type = pd.pub_type == "epub" ? "epub" : "ppub"
175
+ Relaton::Bib::Relation.new(type: "hasManifestation", bibitem: bibitem(pd, type))
176
+ end
177
+ else
178
+ []
179
+ end
180
+ @errors[:article_relation] &&= rels.empty?
181
+ rels
182
+ end
183
+
184
+ # @return [Array<Relaton::Bib::Series>] array of series
185
+ def parse_series
186
+ title = Relaton::Bib::Title.new(content: @doc.journal_title, language: "en", script: "Latn")
187
+ [Relaton::Bib::Series.new(title: [title])]
188
+ end
189
+
190
+ # @return [Array<Relaton::Bib::Extent>] array of extents
191
+ def parse_extent
192
+ locality = @doc.locality.map { |e| Relaton::Bib::Locality.new(type: e[0], reference_from: e[1], reference_to: e[2]) }
193
+ @errors[:article_extent] &&= locality.empty?
194
+ return [] if locality.empty?
195
+
196
+ [Relaton::Bib::Extent.new(locality: locality)]
197
+ end
198
+
199
+ def parse_type = "article"
200
+
201
+ def parse_source
202
+ result = @doc.doi_links.map { |link| Relaton::Bib::Uri.new(**link) }
203
+ @errors[:article_source] &&= result.empty?
204
+ result
205
+ end
206
+
207
+ def parse_ext = Ext.new(doctype: parse_doctype)
208
+
209
+ def parse_doctype = Doctype.new(content: "article")
210
+
211
+ private
212
+
213
+ # @param [String] id document id
214
+ # @param [String] type id type
215
+ # @param [Boolean, nil] primary is primary id
216
+ #
217
+ # @return [Relaton::Bib::Docidentifier] document identifier
218
+ def create_docidentifier(id, type, primary = nil)
219
+ Relaton::Bib::Docidentifier.new content: id, type: type, primary: primary
220
+ end
221
+
222
+ def create_person(contrib)
223
+ return unless contrib.name&.any?
224
+
225
+ @errors[:article_contributor_person] &&= false
226
+ fullname = fullname(contrib.name[0])
227
+ Relaton::Bib::Person.new name: fullname, affiliation: affiliation(contrib)
228
+ end
229
+
230
+ def create_organization(contrib)
231
+ return unless contrib.collab&.any?
232
+
233
+ @errors[:article_contributor_organization] &&= false
234
+ name = Relaton::Bib::TypedLocalizedString.new(content: contrib.collab.flat_map { |c| Array(c.content) }.join)
235
+ Relaton::Bib::Organization.new name: [name]
236
+ end
237
+
238
+ # @param [Niso::Jats::Name] name name element
239
+ #
240
+ # @return [Relaton::Bib::FullName] full name
241
+ def fullname(name)
242
+ cname = [name.given_names, name.surname].compact.map(&:content).join(" ")
243
+ @errors[:article_fullname] &&= cname.empty?
244
+ return if cname.empty?
245
+
246
+ completename = Relaton::Bib::LocalizedString.new content: cname, language: "en", script: "Latn"
247
+ Relaton::Bib::FullName.new completename: completename
248
+ end
249
+
250
+ # @param [Niso::Jats::Contrib] contrib contributor element
251
+ #
252
+ # @return [Array<Relaton::Bib::Affiliation>] array of affiliations
253
+ def affiliation(contrib)
254
+ aff = contrib.aff_xrefs.filter_map do |xref|
255
+ a = @doc.affiliation(xref.rid)
256
+ parse_affiliation(a[0]) if a.any?
257
+ end
258
+ @errors[:article_affiliation] &&= aff.empty?
259
+ aff
260
+ end
261
+
262
+ def parse_affiliation(aff) # rubocop:disable Metrics/MethodLength
263
+ div, addr = division_address(aff)
264
+ return if addr.include?("Permanent address:") || addr == "Germany" ||
265
+ addr.start_with?("Guest") || addr.start_with?("Deceased") ||
266
+ addr.include?("Author to whom any correspondence should be addressed")
267
+
268
+ args = {}
269
+ institutions = aff.institution || []
270
+ if institutions.any?
271
+ name = Array(institutions[0].content).join
272
+ return if name == "1005 Southover Lane"
273
+
274
+ args[:subdivision] = parse_division(div) if div
275
+ args[:address] = parse_address(aff, addr)
276
+ else
277
+ name = div
278
+ end
279
+ args[:name] = [Relaton::Bib::TypedLocalizedString.new(content: name)]
280
+ org = Relaton::Bib::Organization.new(**args)
281
+ Relaton::Bib::Affiliation.new(organization: org)
282
+ end
283
+
284
+ def division_address(aff)
285
+ div_addr = aff.content.map do |c|
286
+ CGI.unescapeHTML(c.strip.gsub(/^\W*|\W*$/, ""))
287
+ end.reject(&:empty?)
288
+
289
+ institutions = aff.institution || []
290
+ if div_addr.size > 1 && institutions.any?
291
+ # Multiple text nodes around institution: first ones are division, last is address
292
+ div = div_addr[0..-2].join(", ")
293
+ addr = div_addr[-1]
294
+ elsif institutions.any?
295
+ # Single text node with institution: no division text, it's all address
296
+ div = nil
297
+ addr = div_addr[0] || ""
298
+ else
299
+ # No institution: the whole text is the organization name; no address split
300
+ joined = div_addr.join(", ")
301
+ div = joined.empty? ? nil : joined
302
+ addr = ""
303
+ end
304
+ [div, addr]
305
+ end
306
+
307
+ def parse_division(div)
308
+ @errors[:article_affiliation_division] &&= div.empty?
309
+ return [] if div.empty?
310
+
311
+ name = Relaton::Bib::TypedLocalizedString.new(content: div, language: "en", script: "Latn")
312
+ [Relaton::Bib::Subdivision.new(name: [name])]
313
+ end
314
+
315
+ def parse_address(_aff, addr)
316
+ address = []
317
+ address << addr unless addr.empty?
318
+ # niso-jats parses country into aff.country but we fold it into the formatted address
319
+ @errors[:article_affiliation_address] &&= address.empty?
320
+ return [] if address.empty?
321
+
322
+ [Relaton::Bib::Address.new(formatted_address: address.join(", "))]
323
+ end
324
+
325
+ # @param [Niso::Jats::PubDate] pd pub date object
326
+ # @param [String] type date type
327
+ #
328
+ # @return [Relaton::Bipm::ItemData] bibitem
329
+ def bibitem(pd, type)
330
+ dt = Relaton::Bib::Date.new(type: type, at: format_pub_date(pd))
331
+ carrier = type == "epub" ? "online" : "print"
332
+ medium = Relaton::Bib::Medium.new carrier: carrier
333
+ fref = Relaton::Bib::Formattedref.new(content: pubid)
334
+ docid = [create_docidentifier(pubid, "BIPM", true)]
335
+ ItemData.new(formattedref: fref, docidentifier: docid, date: [dt], medium: medium)
336
+ end
337
+
338
+ def format_pub_date(pd)
339
+ year = pd.year&.content
340
+ return nil unless year&.match?(/\A\d{1,4}\z/)
341
+
342
+ parts = [year.rjust(4, "0")]
343
+ month = pd.month&.content
344
+ if month&.match?(/\A\d{1,2}\z/)
345
+ parts << month.rjust(2, "0")
346
+ day = pd.day&.content
347
+ parts << day.rjust(2, "0") if day&.match?(/\A\d{1,2}\z/)
348
+ end
349
+ parts.join("-")
350
+ end
351
+ end
352
+ end
353
+ end