relaton 2.2.0.pre.alpha.1 → 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 (610) 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/registry.rb +4 -4
  188. data/lib/relaton/db.rb +0 -1
  189. data/lib/relaton/doi/crossref.rb +72 -0
  190. data/lib/relaton/doi/parser.rb +827 -0
  191. data/lib/relaton/doi/processor.rb +65 -0
  192. data/lib/relaton/doi/util.rb +8 -0
  193. data/lib/relaton/doi.rb +20 -0
  194. data/lib/relaton/ecma/bibdata.rb +8 -0
  195. data/lib/relaton/ecma/bibitem.rb +8 -0
  196. data/lib/relaton/ecma/bibliography.rb +81 -0
  197. data/lib/relaton/ecma/data_fetcher.rb +103 -0
  198. data/lib/relaton/ecma/data_parser.rb +49 -0
  199. data/lib/relaton/ecma/edition_parser.rb +80 -0
  200. data/lib/relaton/ecma/ext.rb +7 -0
  201. data/lib/relaton/ecma/item.rb +11 -0
  202. data/lib/relaton/ecma/item_data.rb +6 -0
  203. data/lib/relaton/ecma/memento_parser.rb +60 -0
  204. data/lib/relaton/ecma/page_fetcher.rb +27 -0
  205. data/lib/relaton/ecma/parser_common.rb +33 -0
  206. data/lib/relaton/ecma/processor.rb +66 -0
  207. data/lib/relaton/ecma/standard_parser.rb +134 -0
  208. data/lib/relaton/ecma/util.rb +8 -0
  209. data/lib/relaton/ecma.rb +24 -0
  210. data/lib/relaton/etsi/bibdata.rb +10 -0
  211. data/lib/relaton/etsi/bibitem.rb +10 -0
  212. data/lib/relaton/etsi/bibliography.rb +46 -0
  213. data/lib/relaton/etsi/data_fetcher.rb +128 -0
  214. data/lib/relaton/etsi/data_parser.rb +208 -0
  215. data/lib/relaton/etsi/doctype.rb +30 -0
  216. data/lib/relaton/etsi/ext.rb +31 -0
  217. data/lib/relaton/etsi/item.rb +15 -0
  218. data/lib/relaton/etsi/item_data.rb +6 -0
  219. data/lib/relaton/etsi/processor.rb +69 -0
  220. data/lib/relaton/etsi/pubid.rb +37 -0
  221. data/lib/relaton/etsi/status.rb +13 -0
  222. data/lib/relaton/etsi/util.rb +8 -0
  223. data/lib/relaton/etsi.rb +25 -0
  224. data/lib/relaton/gb/bibdata.rb +8 -0
  225. data/lib/relaton/gb/bibitem.rb +8 -0
  226. data/lib/relaton/gb/bibliography.rb +145 -0
  227. data/lib/relaton/gb/ccs.rb +14 -0
  228. data/lib/relaton/gb/committee.rb +13 -0
  229. data/lib/relaton/gb/docidentifier.rb +23 -0
  230. data/lib/relaton/gb/doctype.rb +9 -0
  231. data/lib/relaton/gb/ext.rb +36 -0
  232. data/lib/relaton/gb/gb_scraper.rb +61 -0
  233. data/lib/relaton/gb/gb_type.rb +20 -0
  234. data/lib/relaton/gb/hit.rb +48 -0
  235. data/lib/relaton/gb/hit_collection.rb +19 -0
  236. data/lib/relaton/gb/item.rb +13 -0
  237. data/lib/relaton/gb/item_data.rb +6 -0
  238. data/lib/relaton/gb/processor.rb +46 -0
  239. data/lib/relaton/gb/project_number.rb +38 -0
  240. data/lib/relaton/gb/scraper.rb +204 -0
  241. data/lib/relaton/gb/sec_scraper.rb +92 -0
  242. data/lib/relaton/gb/stage_name.rb +13 -0
  243. data/lib/relaton/gb/structured_identifier.rb +26 -0
  244. data/lib/relaton/gb/t_scraper.rb +126 -0
  245. data/lib/relaton/gb/util.rb +8 -0
  246. data/lib/relaton/gb/yaml/prefixes.yaml +200 -0
  247. data/lib/relaton/gb.rb +33 -0
  248. data/lib/relaton/iana/bibdata.rb +8 -0
  249. data/lib/relaton/iana/bibitem.rb +8 -0
  250. data/lib/relaton/iana/bibliography.rb +47 -0
  251. data/lib/relaton/iana/data_fetcher.rb +71 -0
  252. data/lib/relaton/iana/item.rb +7 -0
  253. data/lib/relaton/iana/item_data.rb +6 -0
  254. data/lib/relaton/iana/parser.rb +146 -0
  255. data/lib/relaton/iana/processor.rb +68 -0
  256. data/lib/relaton/iana/util.rb +8 -0
  257. data/lib/relaton/iana.rb +29 -0
  258. data/lib/relaton/iec/bibliography.rb +283 -0
  259. data/lib/relaton/iec/data_fetcher.rb +216 -0
  260. data/lib/relaton/iec/data_parser.rb +391 -0
  261. data/lib/relaton/iec/hit.rb +26 -0
  262. data/lib/relaton/iec/hit_collection.rb +138 -0
  263. data/lib/relaton/iec/item_data.rb +7 -0
  264. data/lib/relaton/iec/model/bibdata.rb +8 -0
  265. data/lib/relaton/iec/model/bibitem.rb +8 -0
  266. data/lib/relaton/iec/model/docidentifier.rb +131 -0
  267. data/lib/relaton/iec/model/doctype.rb +12 -0
  268. data/lib/relaton/iec/model/ext.rb +53 -0
  269. data/lib/relaton/iec/model/item.rb +20 -0
  270. data/lib/relaton/iec/model/item_base.rb +12 -0
  271. data/lib/relaton/iec/model/relation.rb +7 -0
  272. data/lib/relaton/iec/model/stage_name.rb +13 -0
  273. data/lib/relaton/iec/processor.rb +73 -0
  274. data/lib/relaton/iec/statuses.yml +199 -0
  275. data/lib/relaton/iec/util.rb +8 -0
  276. data/lib/relaton/iec.rb +98 -0
  277. data/lib/relaton/ieee/balloting_group.rb +13 -0
  278. data/lib/relaton/ieee/bibdata.rb +8 -0
  279. data/lib/relaton/ieee/bibitem.rb +8 -0
  280. data/lib/relaton/ieee/bibliography.rb +51 -0
  281. data/lib/relaton/ieee/converter/bibxml/from_rfcxml.rb +10 -0
  282. data/lib/relaton/ieee/converter/bibxml/from_rfcxml_referencegroup.rb +10 -0
  283. data/lib/relaton/ieee/converter/bibxml.rb +20 -0
  284. data/lib/relaton/ieee/data_fetcher.rb +630 -0
  285. data/lib/relaton/ieee/doctype.rb +9 -0
  286. data/lib/relaton/ieee/editorial_group.rb +19 -0
  287. data/lib/relaton/ieee/ext.rb +36 -0
  288. data/lib/relaton/ieee/idams_parser.rb +323 -0
  289. data/lib/relaton/ieee/item.rb +11 -0
  290. data/lib/relaton/ieee/item_data.rb +7 -0
  291. data/lib/relaton/ieee/processor.rb +68 -0
  292. data/lib/relaton/ieee/pub_id.rb +161 -0
  293. data/lib/relaton/ieee/rawbib_id_parser.rb +548 -0
  294. data/lib/relaton/ieee/util.rb +8 -0
  295. data/lib/relaton/ieee.rb +29 -0
  296. data/lib/relaton/ietf/bibdata.rb +8 -0
  297. data/lib/relaton/ietf/bibitem.rb +8 -0
  298. data/lib/relaton/ietf/bibliography.rb +35 -0
  299. data/lib/relaton/ietf/bibxml_parser.rb +232 -0
  300. data/lib/relaton/ietf/data_fetcher.rb +278 -0
  301. data/lib/relaton/ietf/doctype.rb +9 -0
  302. data/lib/relaton/ietf/ext.rb +63 -0
  303. data/lib/relaton/ietf/item.rb +16 -0
  304. data/lib/relaton/ietf/item_base.rb +18 -0
  305. data/lib/relaton/ietf/item_data.rb +6 -0
  306. data/lib/relaton/ietf/processing_instructions.rb +79 -0
  307. data/lib/relaton/ietf/processor.rb +68 -0
  308. data/lib/relaton/ietf/relation.rb +9 -0
  309. data/lib/relaton/ietf/rfc/abstract.rb +19 -0
  310. data/lib/relaton/ietf/rfc/author.rb +21 -0
  311. data/lib/relaton/ietf/rfc/entry.rb +410 -0
  312. data/lib/relaton/ietf/rfc/entry_date.rb +21 -0
  313. data/lib/relaton/ietf/rfc/format.rb +19 -0
  314. data/lib/relaton/ietf/rfc/index.rb +46 -0
  315. data/lib/relaton/ietf/rfc/is_also.rb +21 -0
  316. data/lib/relaton/ietf/rfc/keywords.rb +19 -0
  317. data/lib/relaton/ietf/rfc/rfc_index_namespace.rb +11 -0
  318. data/lib/relaton/ietf/scraper.rb +68 -0
  319. data/lib/relaton/ietf/util.rb +8 -0
  320. data/lib/relaton/ietf/wg_name_resolver.rb +42 -0
  321. data/lib/relaton/ietf.rb +27 -0
  322. data/lib/relaton/iho/bibdata.rb +8 -0
  323. data/lib/relaton/iho/bibitem.rb +8 -0
  324. data/lib/relaton/iho/bibliography.rb +114 -0
  325. data/lib/relaton/iho/comment_period.rb +13 -0
  326. data/lib/relaton/iho/docidentifier.rb +31 -0
  327. data/lib/relaton/iho/doctype.rb +10 -0
  328. data/lib/relaton/iho/ext.rb +20 -0
  329. data/lib/relaton/iho/hash_parser_v1.rb +144 -0
  330. data/lib/relaton/iho/item.rb +20 -0
  331. data/lib/relaton/iho/item_base.rb +18 -0
  332. data/lib/relaton/iho/item_data.rb +6 -0
  333. data/lib/relaton/iho/processor.rb +54 -0
  334. data/lib/relaton/iho/relation.rb +9 -0
  335. data/lib/relaton/iho/structured_identifier.rb +20 -0
  336. data/lib/relaton/iho/util.rb +8 -0
  337. data/lib/relaton/iho.rb +27 -0
  338. data/lib/relaton/index/config.rb +52 -0
  339. data/lib/relaton/index/file_io.rb +305 -0
  340. data/lib/relaton/index/file_storage.rb +61 -0
  341. data/lib/relaton/index/id_number.rb +30 -0
  342. data/lib/relaton/index/pool.rb +41 -0
  343. data/lib/relaton/index/type.rb +159 -0
  344. data/lib/relaton/index/util.rb +18 -0
  345. data/lib/relaton/index.rb +60 -0
  346. data/lib/relaton/isbn/isbn.rb +61 -0
  347. data/lib/relaton/isbn/open_library.rb +43 -0
  348. data/lib/relaton/isbn/parser.rb +88 -0
  349. data/lib/relaton/isbn/processor.rb +48 -0
  350. data/lib/relaton/isbn/util.rb +8 -0
  351. data/lib/relaton/isbn.rb +19 -0
  352. data/lib/relaton/iso/bibliography.rb +407 -0
  353. data/lib/relaton/iso/data_fetcher.rb +338 -0
  354. data/lib/relaton/iso/data_parser.rb +444 -0
  355. data/lib/relaton/iso/hash_parser_v1.rb +177 -0
  356. data/lib/relaton/iso/hit.rb +57 -0
  357. data/lib/relaton/iso/hit_collection.rb +184 -0
  358. data/lib/relaton/iso/item_data.rb +28 -0
  359. data/lib/relaton/iso/model/bibdata.rb +10 -0
  360. data/lib/relaton/iso/model/bibitem.rb +8 -0
  361. data/lib/relaton/iso/model/contributor.rb +6 -0
  362. data/lib/relaton/iso/model/contributor_info.rb +9 -0
  363. data/lib/relaton/iso/model/docidentifier.rb +134 -0
  364. data/lib/relaton/iso/model/doctype.rb +13 -0
  365. data/lib/relaton/iso/model/ext.rb +35 -0
  366. data/lib/relaton/iso/model/item.rb +17 -0
  367. data/lib/relaton/iso/model/item_base.rb +22 -0
  368. data/lib/relaton/iso/model/organization.rb +9 -0
  369. data/lib/relaton/iso/model/project_number.rb +22 -0
  370. data/lib/relaton/iso/model/relation.rb +9 -0
  371. data/lib/relaton/iso/model/stagename.rb +14 -0
  372. data/lib/relaton/iso/model/structured_identifier.rb +31 -0
  373. data/lib/relaton/iso/processor.rb +84 -0
  374. data/lib/relaton/iso/scraper.rb +619 -0
  375. data/lib/relaton/iso/type/pubid.rb +50 -0
  376. data/lib/relaton/iso/util.rb +8 -0
  377. data/lib/relaton/iso.rb +30 -0
  378. data/lib/relaton/itu/bibliography.rb +90 -0
  379. data/lib/relaton/itu/data_fetcher.rb +104 -0
  380. data/lib/relaton/itu/data_parser_r.rb +140 -0
  381. data/lib/relaton/itu/hit.rb +22 -0
  382. data/lib/relaton/itu/hit_collection.rb +127 -0
  383. data/lib/relaton/itu/item_data.rb +6 -0
  384. data/lib/relaton/itu/model/approval_stage.rb +13 -0
  385. data/lib/relaton/itu/model/bibdata.rb +8 -0
  386. data/lib/relaton/itu/model/bibitem.rb +8 -0
  387. data/lib/relaton/itu/model/docidentifier.rb +9 -0
  388. data/lib/relaton/itu/model/doctype.rb +13 -0
  389. data/lib/relaton/itu/model/ext.rb +47 -0
  390. data/lib/relaton/itu/model/item.rb +13 -0
  391. data/lib/relaton/itu/model/meeting.rb +13 -0
  392. data/lib/relaton/itu/model/meeting_date.rb +15 -0
  393. data/lib/relaton/itu/model/question.rb +13 -0
  394. data/lib/relaton/itu/model/recommendation_status.rb +11 -0
  395. data/lib/relaton/itu/model/structured_identifier.rb +19 -0
  396. data/lib/relaton/itu/processor.rb +66 -0
  397. data/lib/relaton/itu/pubid.rb +177 -0
  398. data/lib/relaton/itu/radio_regulations_parser.rb +70 -0
  399. data/lib/relaton/itu/recommendation_parser.rb +161 -0
  400. data/lib/relaton/itu/scraper.rb +193 -0
  401. data/lib/relaton/itu/util.rb +8 -0
  402. data/lib/relaton/itu.rb +33 -0
  403. data/lib/relaton/jis/bibdata.rb +8 -0
  404. data/lib/relaton/jis/bibitem.rb +8 -0
  405. data/lib/relaton/jis/bibliography.rb +75 -0
  406. data/lib/relaton/jis/data_fetcher.rb +181 -0
  407. data/lib/relaton/jis/docidentifier.rb +21 -0
  408. data/lib/relaton/jis/doctype.rb +9 -0
  409. data/lib/relaton/jis/ext.rb +13 -0
  410. data/lib/relaton/jis/hit.rb +93 -0
  411. data/lib/relaton/jis/hit_collection.rb +127 -0
  412. data/lib/relaton/jis/item.rb +22 -0
  413. data/lib/relaton/jis/item_base.rb +26 -0
  414. data/lib/relaton/jis/item_data.rb +8 -0
  415. data/lib/relaton/jis/processor.rb +55 -0
  416. data/lib/relaton/jis/relation.rb +11 -0
  417. data/lib/relaton/jis/scraper.rb +232 -0
  418. data/lib/relaton/jis/structured_identifier.rb +13 -0
  419. data/lib/relaton/jis/util.rb +8 -0
  420. data/lib/relaton/jis.rb +33 -0
  421. data/lib/relaton/logger/channels/gh_issue.rb +78 -0
  422. data/lib/relaton/logger/config.rb +34 -0
  423. data/lib/relaton/logger/formatter_json.rb +8 -0
  424. data/lib/relaton/logger/formatter_string.rb +12 -0
  425. data/lib/relaton/logger/log.rb +64 -0
  426. data/lib/relaton/logger/log_device.rb +27 -0
  427. data/lib/relaton/logger/pool.rb +24 -0
  428. data/lib/relaton/logger.rb +18 -0
  429. data/lib/relaton/nist/bibdata.rb +8 -0
  430. data/lib/relaton/nist/bibitem.rb +8 -0
  431. data/lib/relaton/nist/bibliography.rb +191 -0
  432. data/lib/relaton/nist/comment_period.rb +15 -0
  433. data/lib/relaton/nist/data_fetcher.rb +84 -0
  434. data/lib/relaton/nist/date.rb +7 -0
  435. data/lib/relaton/nist/doctype.rb +7 -0
  436. data/lib/relaton/nist/ext.rb +16 -0
  437. data/lib/relaton/nist/hit.rb +18 -0
  438. data/lib/relaton/nist/hit_collection.rb +362 -0
  439. data/lib/relaton/nist/item.rb +17 -0
  440. data/lib/relaton/nist/item_data.rb +6 -0
  441. data/lib/relaton/nist/mods_parser.rb +276 -0
  442. data/lib/relaton/nist/processor.rb +68 -0
  443. data/lib/relaton/nist/pubs_export.rb +69 -0
  444. data/lib/relaton/nist/relation.rb +7 -0
  445. data/lib/relaton/nist/scraper.rb +290 -0
  446. data/lib/relaton/nist/series.yaml +49 -0
  447. data/lib/relaton/nist/util.rb +8 -0
  448. data/lib/relaton/nist.rb +34 -0
  449. data/lib/relaton/oasis/bibdata.rb +8 -0
  450. data/lib/relaton/oasis/bibitem.rb +8 -0
  451. data/lib/relaton/oasis/bibliography.rb +60 -0
  452. data/lib/relaton/oasis/browser_agent.rb +71 -0
  453. data/lib/relaton/oasis/data_fetcher.rb +94 -0
  454. data/lib/relaton/oasis/data_parser.rb +305 -0
  455. data/lib/relaton/oasis/data_parser_utils.rb +296 -0
  456. data/lib/relaton/oasis/data_part_parser.rb +239 -0
  457. data/lib/relaton/oasis/doctype.rb +7 -0
  458. data/lib/relaton/oasis/ext.rb +19 -0
  459. data/lib/relaton/oasis/item.rb +11 -0
  460. data/lib/relaton/oasis/item_data.rb +6 -0
  461. data/lib/relaton/oasis/processor.rb +68 -0
  462. data/lib/relaton/oasis/util.rb +8 -0
  463. data/lib/relaton/oasis.rb +28 -0
  464. data/lib/relaton/ogc/bibdata.rb +8 -0
  465. data/lib/relaton/ogc/bibitem.rb +8 -0
  466. data/lib/relaton/ogc/bibliography.rb +64 -0
  467. data/lib/relaton/ogc/data_fetcher.rb +110 -0
  468. data/lib/relaton/ogc/docidentifier.rb +6 -0
  469. data/lib/relaton/ogc/doctype.rb +12 -0
  470. data/lib/relaton/ogc/ext.rb +15 -0
  471. data/lib/relaton/ogc/hit.rb +18 -0
  472. data/lib/relaton/ogc/hit_collection.rb +36 -0
  473. data/lib/relaton/ogc/item.rb +13 -0
  474. data/lib/relaton/ogc/item_data.rb +6 -0
  475. data/lib/relaton/ogc/processor.rb +58 -0
  476. data/lib/relaton/ogc/scraper.rb +225 -0
  477. data/lib/relaton/ogc/util.rb +8 -0
  478. data/lib/relaton/ogc.rb +26 -0
  479. data/lib/relaton/oiml/bibdata.rb +8 -0
  480. data/lib/relaton/oiml/bibitem.rb +8 -0
  481. data/lib/relaton/oiml/bibliography.rb +94 -0
  482. data/lib/relaton/oiml/docidentifier.rb +33 -0
  483. data/lib/relaton/oiml/doctype.rb +13 -0
  484. data/lib/relaton/oiml/ext.rb +42 -0
  485. data/lib/relaton/oiml/item.rb +20 -0
  486. data/lib/relaton/oiml/item_base.rb +18 -0
  487. data/lib/relaton/oiml/item_data.rb +6 -0
  488. data/lib/relaton/oiml/processor.rb +54 -0
  489. data/lib/relaton/oiml/relation.rb +9 -0
  490. data/lib/relaton/oiml/util.rb +8 -0
  491. data/lib/relaton/oiml.rb +24 -0
  492. data/lib/relaton/omg/bibdata.rb +8 -0
  493. data/lib/relaton/omg/bibitem.rb +8 -0
  494. data/lib/relaton/omg/bibliography.rb +31 -0
  495. data/lib/relaton/omg/ext.rb +7 -0
  496. data/lib/relaton/omg/item.rb +8 -0
  497. data/lib/relaton/omg/item_data.rb +6 -0
  498. data/lib/relaton/omg/processor.rb +34 -0
  499. data/lib/relaton/omg/scraper.rb +141 -0
  500. data/lib/relaton/omg/util.rb +8 -0
  501. data/lib/relaton/omg.rb +24 -0
  502. data/lib/relaton/plateau/bibdata.rb +8 -0
  503. data/lib/relaton/plateau/bibitem.rb +8 -0
  504. data/lib/relaton/plateau/bibliography.rb +24 -0
  505. data/lib/relaton/plateau/data_fetcher.rb +153 -0
  506. data/lib/relaton/plateau/doctype.rb +7 -0
  507. data/lib/relaton/plateau/ext.rb +23 -0
  508. data/lib/relaton/plateau/handbook_parser.rb +95 -0
  509. data/lib/relaton/plateau/hit.rb +13 -0
  510. data/lib/relaton/plateau/hit_collection.rb +59 -0
  511. data/lib/relaton/plateau/item.rb +12 -0
  512. data/lib/relaton/plateau/item_data.rb +6 -0
  513. data/lib/relaton/plateau/parser.rb +101 -0
  514. data/lib/relaton/plateau/processor.rb +49 -0
  515. data/lib/relaton/plateau/technical_report_parser.rb +91 -0
  516. data/lib/relaton/plateau/util.rb +8 -0
  517. data/lib/relaton/plateau.rb +28 -0
  518. data/lib/relaton/un/bibdata.rb +8 -0
  519. data/lib/relaton/un/bibitem.rb +8 -0
  520. data/lib/relaton/un/bibliography.rb +48 -0
  521. data/lib/relaton/un/doctype.rb +10 -0
  522. data/lib/relaton/un/ext.rb +30 -0
  523. data/lib/relaton/un/hit.rb +56 -0
  524. data/lib/relaton/un/hit_collection.rb +61 -0
  525. data/lib/relaton/un/item.rb +11 -0
  526. data/lib/relaton/un/item_data.rb +6 -0
  527. data/lib/relaton/un/parser.rb +108 -0
  528. data/lib/relaton/un/processor.rb +38 -0
  529. data/lib/relaton/un/session.rb +25 -0
  530. data/lib/relaton/un/token_generator.rb +105 -0
  531. data/lib/relaton/un/util.rb +8 -0
  532. data/lib/relaton/un/wasm/decoder.rb +434 -0
  533. data/lib/relaton/un/wasm/instance.rb +101 -0
  534. data/lib/relaton/un/wasm/interpreter.rb +613 -0
  535. data/lib/relaton/un/wasm/memory.rb +112 -0
  536. data/lib/relaton/un/wasm/module.rb +47 -0
  537. data/lib/relaton/un/wasm.rb +17 -0
  538. data/lib/relaton/un/wasm_v_bg.wasm +0 -0
  539. data/lib/relaton/un.rb +28 -0
  540. data/lib/relaton/version.rb +1 -1
  541. data/lib/relaton/w3c/bibdata.rb +8 -0
  542. data/lib/relaton/w3c/bibitem.rb +8 -0
  543. data/lib/relaton/w3c/bibliography.rb +54 -0
  544. data/lib/relaton/w3c/data_fetcher.rb +309 -0
  545. data/lib/relaton/w3c/data_parser.rb +379 -0
  546. data/lib/relaton/w3c/doctype.rb +7 -0
  547. data/lib/relaton/w3c/ext.rb +11 -0
  548. data/lib/relaton/w3c/item.rb +12 -0
  549. data/lib/relaton/w3c/item_data.rb +6 -0
  550. data/lib/relaton/w3c/processor.rb +49 -0
  551. data/lib/relaton/w3c/pubid.rb +73 -0
  552. data/lib/relaton/w3c/safe_realize.rb +59 -0
  553. data/lib/relaton/w3c/util.rb +8 -0
  554. data/lib/relaton/w3c.rb +25 -0
  555. data/lib/relaton/xsf/bibdata.rb +8 -0
  556. data/lib/relaton/xsf/bibitem.rb +8 -0
  557. data/lib/relaton/xsf/bibliography.rb +24 -0
  558. data/lib/relaton/xsf/data_fetcher.rb +56 -0
  559. data/lib/relaton/xsf/hit.rb +17 -0
  560. data/lib/relaton/xsf/hit_collection.rb +24 -0
  561. data/lib/relaton/xsf/item.rb +7 -0
  562. data/lib/relaton/xsf/item_data.rb +6 -0
  563. data/lib/relaton/xsf/processor.rb +50 -0
  564. data/lib/relaton/xsf/util.rb +9 -0
  565. data/lib/relaton/xsf.rb +30 -0
  566. data/lib/relaton-core.rb +1 -0
  567. data/lib/relaton.rb +43 -0
  568. metadata +673 -170
  569. data/.github/workflows/rake.yml +0 -14
  570. data/.github/workflows/release.yml +0 -24
  571. data/.github/workflows/rubocop.yml +0 -48
  572. data/.gitignore +0 -12
  573. data/.rspec +0 -3
  574. data/CLAUDE.md +0 -78
  575. data/Gemfile +0 -29
  576. data/Rakefile +0 -6
  577. data/docs/CHANGELOG.adoc +0 -16
  578. data/docs/VERSIONING_POLICY.adoc +0 -38
  579. data/docs/navigation.adoc +0 -6
  580. data/lib/relaton/db/version.rb +0 -5
  581. data/relaton.gemspec +0 -72
  582. data/spec/relaton/config_spec.rb +0 -10
  583. data/spec/relaton/db_cache_spec.rb +0 -51
  584. data/spec/relaton/db_spec.rb +0 -567
  585. data/spec/relaton/registry_spec.rb +0 -178
  586. data/spec/relaton/util_spec.rb +0 -3
  587. data/spec/relaton_meta_spec.rb +0 -25
  588. data/spec/relaton_spec.rb +0 -800
  589. data/spec/spec_helper.rb +0 -45
  590. data/spec/support/gb_t_20223_2006.xml +0 -33
  591. data/spec/support/iso_111111119115_1.xml +0 -0
  592. data/spec/support/iso_19115_1.xml +0 -115
  593. data/spec/support/iso_19115_2.xml +0 -95
  594. data/spec/support/rfc_8341.xml +0 -46
  595. data/spec/vcr_cassetes/api_relaton_org.yml +0 -121
  596. data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +0 -140
  597. data/spec/vcr_cassetes/cc_dir_10005_2019.yml +0 -202
  598. data/spec/vcr_cassetes/cipm_meeting_43.yml +0 -1505
  599. data/spec/vcr_cassetes/gb_t_20223_2006.yml +0 -729
  600. data/spec/vcr_cassetes/iso_111111119115_1.yml +0 -12951
  601. data/spec/vcr_cassetes/iso_19115_1.yml +0 -17334
  602. data/spec/vcr_cassetes/iso_19115_1_2.yml +0 -322
  603. data/spec/vcr_cassetes/iso_19115_1_std.yml +0 -17334
  604. data/spec/vcr_cassetes/iso_19115_all_parts.yml +0 -185
  605. data/spec/vcr_cassetes/iso_19133_2005.yml +0 -144
  606. data/spec/vcr_cassetes/iso_combined_applied.yml +0 -318
  607. data/spec/vcr_cassetes/iso_combined_included.yml +0 -318
  608. data/spec/vcr_cassetes/ogc_19_025r1.yml +0 -374
  609. data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +0 -317
  610. data/spec/vcr_cassetes/rfc_8341.yml +0 -1278
@@ -0,0 +1,69 @@
1
+ require "relaton/core/processor"
2
+
3
+ module Relaton
4
+ module Etsi
5
+ class Processor < Relaton::Core::Processor
6
+ attr_reader :idtype
7
+
8
+ def initialize # rubocop:disable Lint/MissingSuper
9
+ @short = :relaton_etsi
10
+ @prefix = "ETSI"
11
+ @defaultprefix = %r{^ETSI\s}
12
+ @idtype = "ETSI"
13
+ @datasets = %w[etsi-csv]
14
+ end
15
+
16
+ # @param code [String]
17
+ # @param date [String, nil] year
18
+ # @param opts [Hash]
19
+ # @return [Relaton::Etsi::Item]
20
+ def get(code, date, opts)
21
+ require_relative "../etsi"
22
+ Bibliography.get(code, date, opts)
23
+ end
24
+
25
+ #
26
+ # Fetch all the documents from https://www.etsi.org
27
+ #
28
+ # @param [String] _source source name
29
+ # @param [Hash] opts
30
+ # @option opts [String] :output directory to output documents
31
+ # @option opts [String] :format output format (xml, yaml, bibxml)
32
+ #
33
+ def fetch_data(_source, opts)
34
+ require_relative "data_fetcher"
35
+ DataFetcher.fetch(**opts)
36
+ end
37
+
38
+ # @param xml [String]
39
+ # @return [Relaton::Etsi::Item]
40
+ def from_xml(xml)
41
+ require_relative "../etsi"
42
+ Item.from_xml xml
43
+ end
44
+
45
+ # @param yaml [String]
46
+ # @return [Relaton::Etsi::Item]
47
+ def from_yaml(yaml)
48
+ require_relative "../etsi"
49
+ Item.from_yaml yaml
50
+ end
51
+
52
+ # Returns hash of XML grammar
53
+ # @return [String]
54
+ def grammar_hash
55
+ require "digest/md5" # not loaded by etsi.rb; needed on the cold path
56
+ require "relaton/version"
57
+ Digest::MD5.hexdigest Relaton::VERSION
58
+ end
59
+
60
+ #
61
+ # Remove index file
62
+ #
63
+ def remove_index_file
64
+ require_relative "../etsi"
65
+ Relaton::Index.find_or_create(:etsi, url: true, file: INDEX_FILE).remove_file
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,37 @@
1
+ module Relaton
2
+ module Etsi
3
+ class PubId
4
+ class Parser
5
+ def initialize(id)
6
+ @strscan = StringScanner.new id
7
+ end
8
+
9
+ def parse
10
+ @strscan.scan(/^ETSI\s+/)
11
+ type = @strscan.scan(/\S+/)
12
+ @strscan.scan(/\s+/)
13
+ docnumber = @strscan.scan_until(/(?=\s(V\d+\.\d+\.\d+)|ed\.\d+)/)
14
+ version = @strscan.scan(/\d+\.\d+\.\d+/) if @strscan.scan(/\sV(?=\d+\.\d+\.\d+)/)
15
+ edition = @strscan.scan(/\d+/) if @strscan.scan(/\sed\.(?=\d+)/)
16
+ date = @strscan.scan(/\d{4}-\d{2}/) if @strscan.scan(/\s\(/)
17
+
18
+ { type: type, docnumber: docnumber, version: version, edition: edition, date: date }
19
+ end
20
+ end
21
+
22
+ attr_accessor :type, :docnumber, :version, :edition, :date
23
+
24
+ def initialize(type:, docnumber:, version:, edition:, date:)
25
+ @type = type
26
+ @docnumber = docnumber
27
+ @version = version
28
+ @edition = edition
29
+ @date = date
30
+ end
31
+
32
+ def self.parse(id)
33
+ new(**Parser.new(id).parse)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,13 @@
1
+ module Relaton
2
+ module Etsi
3
+ class Status < Lutaml::Model::Serializable
4
+ attribute :stage, :string, values: %W[
5
+ EN\sapproval SG\sapproval ES\sapproval Published Withdrawn Historical
6
+ ]
7
+
8
+ xml do
9
+ map_element "stage", to: :stage
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Etsi
3
+ module Util
4
+ extend Relaton::Bib::Util
5
+ PROGNAME = "relaton-etsi".freeze
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "net/http"
4
+ require "mechanize"
5
+ require "relaton/index"
6
+ require_relative "version"
7
+ # require_relative "relaton_etsi/pubid"
8
+ require_relative "etsi/bibitem"
9
+ require_relative "etsi/bibdata"
10
+ require_relative "etsi/util"
11
+ require_relative "etsi/bibliography"
12
+
13
+ module Relaton
14
+ module Etsi
15
+ INDEX_FILE = "index-v1.yaml"
16
+
17
+ # Returns hash of gem versions used to generate data model.
18
+ # @return [String]
19
+ def grammar_hash
20
+ Digest::MD5.hexdigest Relaton::VERSION
21
+ end
22
+
23
+ extend self
24
+ end
25
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Gb
3
+ class Bibdata < Item
4
+ model ItemData
5
+ include Bib::BibdataShared
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Gb
3
+ class Bibitem < Item
4
+ model ItemData
5
+ include Bib::BibitemShared
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,145 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "hit_collection"
4
+
5
+ # GB bib module.
6
+ module Relaton
7
+ module Gb
8
+ # GB entry point class.
9
+ class Bibliography
10
+ class << self
11
+ # rubocop:disable Metrics/MethodLength
12
+ # @param text [Strin] code of standard for search
13
+ # @return [RelatonGb::HitCollection]
14
+ def search(text)
15
+ case text
16
+ when /^(GB|GJ|GS)/
17
+ # Scrape national standards.
18
+ Util.info "Fetching from openstd.samr.gov.cn ...", key: text
19
+ require_relative "gb_scraper"
20
+ GbScraper.scrape_page text
21
+ # when /^ZB/
22
+ # Scrape proffesional.
23
+ # when /^DB/
24
+ # Scrape local standard.
25
+ # when %r{^Q/}
26
+ # Enterprise standard
27
+ when %r{^T/[^\s]{2,6}\s}
28
+ # Scrape social standard.
29
+ Util.info "Fetching from www.ttbz.org.cn ...", key: text
30
+ require_relative "t_scraper"
31
+ TScraper.scrape_page text
32
+ else
33
+ # Scrape sector standard.
34
+ require "relaton/gb/sec_scraper"
35
+ SecScraper.scrape_page text
36
+ end
37
+ end
38
+ # rubocop:enable Metrics/MethodLength
39
+
40
+ # @param code [String] the GB standard Code to look up (e..g "GB/T 20223")
41
+ # @param year [String] the year the standard was published (optional)
42
+ # @param opts [Hash] options; restricted to :all_parts if all-parts reference is required
43
+ # @return [String] Relaton XML serialisation of reference
44
+ def get(code, year = nil, opts = {}) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
45
+ if year.nil?
46
+ /^(?<code1>[^-]+)-(?<year1>[^-]+)$/ =~ code
47
+ unless code1.nil?
48
+ code = code1
49
+ year = year1
50
+ end
51
+ end
52
+
53
+ code += ".1" if opts[:all_parts]
54
+ code, year = code.split("-", 2) if code.include?("-")
55
+ ret = get1(code, year, opts)
56
+ return nil if ret.nil?
57
+
58
+ ret = ret.to_most_recent_reference unless year
59
+ ret = ret.to_all_parts if opts[:all_parts]
60
+ ret
61
+ end
62
+
63
+ private
64
+
65
+ def fetch_ref_err(code, year, missed_years) # rubocop:disable Metrics/MethodLength
66
+ # id = year ? "#{code}:#{year}" : code
67
+ # Util.info "WARNING: No match found on the GB website for `#{id}`. " \
68
+ # "The code must be exactly like it is on the website."
69
+ unless missed_years.empty?
70
+ Util.info "(There was no match for `#{year}`, though there " \
71
+ "were matches found for `#{missed_years.join('`, `')}`.)"
72
+ end
73
+ if /\d-\d/.match? code
74
+ Util.info "The provided document part may not exist, or " \
75
+ "the document may no longer be published in parts."
76
+ else
77
+ Util.info "If you wanted to cite all document parts for the " \
78
+ "reference, use `#{code} (all parts)`.\nIf the document " \
79
+ "is not a standard, use its document type abbreviation " \
80
+ "(TS, TR, PAS, Guide)."
81
+ end
82
+ nil
83
+ end
84
+
85
+ def get1(code, year, _opts)
86
+ # search must include year whenever available
87
+ searchcode = code + (year.nil? ? "" : "-#{year}")
88
+ result = search_filter(searchcode) || return
89
+ ret = results_filter(result, year)
90
+ if ret[:ret]
91
+ Util.info "Found: `#{ret[:ret].docidentifier.first.content}`", key: searchcode
92
+ ret[:ret]
93
+ else
94
+ Util.info "Not found.", key: searchcode
95
+ fetch_ref_err(code, year, ret[:years])
96
+ end
97
+ end
98
+
99
+ def search_filter(code)
100
+ # search filter needs to incorporate year
101
+ docidrx = %r{^[^\s]+\s[\d.-]+}
102
+ result = search(code)
103
+ result.select! do |hit|
104
+ hit.docref && hit.docref.match(docidrx).to_s.include?(code)
105
+ end
106
+ end
107
+
108
+ # Sort through the results from Isobib, fetching them three at a time,
109
+ # and return the first result that matches the code,
110
+ # matches the year (if provided), and which # has a title (amendments do
111
+ # not).
112
+ # Only expects the first page of results to be populated.
113
+ # Does not match corrigenda etc (e.g. ISO 3166-1:2006/Cor 1:2007)
114
+ # If no match, returns any years which caused mismatch, for error
115
+ # reporting
116
+ def results_filter(result, year) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength
117
+ missed_years = []
118
+ result.each_slice(3) do |s| # ISO website only allows 3 connections
119
+ fetch_pages(s, 3).each do |r|
120
+ return { ret: r } if !year
121
+
122
+ r.date.select { |d| d.type == "published" }.each do |d|
123
+ return { ret: r } if year.to_i == d.at.to_date.year
124
+
125
+ missed_years << d.on(:year)
126
+ end
127
+ end
128
+ end
129
+ { years: missed_years }
130
+ end
131
+
132
+ # @param hits [RelatonBib::HitCollection<RelatonBib::Hit>]
133
+ # @param threads [Integer]
134
+ # @return [Array<RelatonBib::GbBibliographicItem>]
135
+ def fetch_pages(hits, threads)
136
+ workers = Core::WorkersPool.new threads
137
+ workers.worker { |w| { i: w[:i], hit: w[:hit].item } }
138
+ hits.each_with_index { |hit, i| workers << { i: i, hit: hit } }
139
+ workers.end
140
+ workers.result.sort_by { |x| x[:i] }.map { |x| x[:hit] }
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,14 @@
1
+ module Relaton
2
+ module Gb
3
+ class CCS < Bib::ICS
4
+ xml { root "ccs" }
5
+
6
+ def text
7
+ val = @text
8
+ return val if val && !val.empty?
9
+
10
+ Cnccs.fetch(code)&.description if code
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module Relaton
2
+ module Gb
3
+ class Committee < Lutaml::Model::Serializable
4
+ attribute :type, :string, values: %w[technical provisional drafting]
5
+ attribute :content, :string
6
+
7
+ xml do
8
+ map_attribute "type", to: :type
9
+ map_content to: :content
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ module Relaton
2
+ module Gb
3
+ class Docidentifier < Bib::Docidentifier
4
+ def content
5
+ @all_parts ? "#{super} (all parts)" : super
6
+ end
7
+
8
+ def to_all_parts!
9
+ remove_part!
10
+ remove_date!
11
+ @all_parts = true
12
+ end
13
+
14
+ def remove_part!
15
+ content.sub!(/\.\d+/, "")
16
+ end
17
+
18
+ def remove_date!
19
+ content.sub!(/-\d{4}$/, "")
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ module Relaton
2
+ module Gb
3
+ class Doctype < Bib::Doctype
4
+ TYPES = %w[standard recommendation].freeze
5
+
6
+ attribute :type, :string, values: TYPES
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,36 @@
1
+ require_relative "doctype"
2
+ require_relative "committee"
3
+ require_relative "structured_identifier"
4
+ require_relative "stage_name"
5
+ require_relative "gb_type"
6
+ require_relative "ccs"
7
+
8
+ module Relaton
9
+ module Gb
10
+ class Ext < Bib::Ext
11
+ attribute :doctype, Doctype
12
+ attribute :subdoctype, :string, values: %w[specification method-of-test vocabulary code-of-practice]
13
+ attribute :structuredidentifier, StructuredIdentifier
14
+ attribute :stagename, StageName
15
+ attribute :gbtype, GbType
16
+ attribute :ccs, CCS, collection: true
17
+ attribute :plannumber, :string
18
+
19
+ xml do
20
+ map_element "stagename", to: :stagename
21
+ map_element "gbtype", to: :gbtype
22
+ map_element "ccs", to: :ccs
23
+ map_element "plannumber", to: :plannumber
24
+ end
25
+
26
+ key_value do
27
+ map_element "stagename", to: :stagename
28
+ map_element "gbtype", to: :gbtype
29
+ map_element "ccs", to: :ccs
30
+ map_element "plannumber", to: :plannumber
31
+ end
32
+
33
+ def get_schema_version = Relaton.schema_versions["relaton-model-gb"]
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,61 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ require "nokogiri"
5
+ require_relative "scraper"
6
+
7
+ module Relaton
8
+ module Gb
9
+ # National standard scraper.
10
+ module GbScraper
11
+ extend Scraper
12
+ SEARCH_URL = "https://openstd.samr.gov.cn/bzgk/gb/std_list"
13
+ DOC_URL = "http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno="
14
+
15
+ class << self
16
+ # @param text [Strin] code of standard for serarch
17
+ # @return [RelatonGb::HitCollection]
18
+ def scrape_page(text) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
19
+ doc = agent.get("#{SEARCH_URL}?p.p2=#{CGI.escape(text)}")
20
+ hits = doc.xpath(
21
+ "//table[contains(@class, 'result_list')]/tbody[2]/tr",
22
+ ).map do |h|
23
+ ref = h.at "./td[2]/a"
24
+ pid = ref[:onclick].match(/[0-9A-F]+/).to_s
25
+ status = h.at("./td[7]").text.strip
26
+ rdate = h.at("./td[8]").text.strip
27
+ Hit.new pid: pid, docref: ref.text, scraper: self,
28
+ release_date: rdate, status: status
29
+ end
30
+ HitCollection.new hits.sort_by(&:release_date).reverse
31
+ rescue Mechanize::Error => e
32
+ raise Relaton::RequestError, e.message
33
+ end
34
+
35
+ def agent
36
+ @agent ||= Mechanize.new
37
+ end
38
+
39
+ # @param hit [RelatonGb::Hit] standard's page id
40
+ # @return [RelatonGb::GbBibliographicItem]
41
+ def scrape_doc(hit)
42
+ src = DOC_URL + hit.pid
43
+ doc = agent.get src
44
+ ItemData.new(**scrapped_data(doc, src, hit))
45
+ rescue Mechanize::Error => e
46
+ raise Relaton::RequestError, e.message
47
+ end
48
+
49
+ # @param doc [Nokogiri::HTML]
50
+ # @param _ref [String]
51
+ # @return [Hash]
52
+ # * :type [String]
53
+ # * :name [String]
54
+ # def get_committee(doc, _ref)
55
+ # name = doc.at("//div[contains(., '归口单位') or contains(., '归口部门')]/following-sibling::div")
56
+ # Committee.new(type: "technical", content: name.text.delete("\r\n\t\t"))
57
+ # end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,20 @@
1
+ module Relaton
2
+ module Gb
3
+ class GbType < Lutaml::Model::Serializable
4
+ attribute :scope, :string, values: %w[national sector professional local enterprise social-group]
5
+ attribute :prefix, :string
6
+ attribute :mandate, :string, values: %w[mandatory recommended guidelines]
7
+ attribute :topic, :string, values: %w[
8
+ basic health-and-safety environment-protection engineering-and-construction
9
+ product method management-techniques other
10
+ ]
11
+
12
+ xml do
13
+ map_element "gbscope", to: :scope
14
+ map_element "gbprefix", to: :prefix
15
+ map_element "gbmandate", to: :mandate
16
+ map_element "gbtopic", to: :topic
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Gb
5
+ # Hit.
6
+ class Hit < Relaton::Core::Hit
7
+ # @return [String]
8
+ attr_reader :pid, :docref
9
+
10
+ # @return [Date, NilClass]
11
+ attr_reader :release_date
12
+
13
+ # @return [String, NilClass]
14
+ attr_reader :status
15
+
16
+ # @return [RelatonGb::GbScraper, RelatonGb::SecScraper, RelatonGb::TScraper]
17
+ attr_reader :scraper
18
+
19
+ # @param pid [String]
20
+ # @param docref [String]
21
+ # @parma scraper [RelatonGb::GbScraper, RelatonGb::SecScraper, RelatonGb::TScraper]
22
+ # @param release_date [String]
23
+ # @status [String, NilClass]
24
+ # @param hit_collection [RelatonGb:HitCollection, NilClass]
25
+ def initialize(pid:, docref:, scraper:, **args)
26
+ @pid = pid
27
+ @docref = docref
28
+ @scraper = scraper
29
+ @release_date = Date.parse args[:release_date] if args[:release_date]
30
+ @status = args[:status]
31
+ @hit_collection = args[:hit_collection]
32
+ end
33
+
34
+ # Parse page.
35
+ # @return [Isobib::IsoBibliographicItem]
36
+ def item
37
+ @item ||= scraper.scrape_doc self
38
+ end
39
+
40
+ # @return [String]
41
+ def inspect
42
+ "<#{self.class}:#{format('%<id>#.14x', id: object_id << 1)} " \
43
+ "@fullIdentifier=\"#{@fetch&.shortref}\" " \
44
+ "@docref=\"#{docref}\">"
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "hit"
4
+
5
+ module Relaton
6
+ module Gb
7
+ # Page of hit collection
8
+ class HitCollection < Relaton::Core::HitCollection
9
+ # @param hits [Array<Hash>]
10
+ # @param hit_pages [Integer]
11
+ # @param scraper [RelatonGb::GbScraper, RelatonGb::SecScraper,
12
+ # RelatonGb::TScraper]
13
+ def initialize(hits = [])
14
+ @array = hits
15
+ @fetched = false
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ require_relative "docidentifier"
2
+ require_relative "ext"
3
+
4
+ module Relaton
5
+ module Gb
6
+ class Item < Bib::Item
7
+ model ItemData
8
+
9
+ attribute :docidentifier, Docidentifier, collection: true, initialize_empty: true
10
+ attribute :ext, Ext
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,6 @@
1
+ module Relaton
2
+ module Gb
3
+ class ItemData < Relaton::Bib::ItemData
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "relaton/core/processor"
4
+
5
+ module Relaton
6
+ module Gb
7
+ class Processor < Relaton::Core::Processor
8
+ def initialize
9
+ @short = :relaton_gb
10
+ @prefix = "CN"
11
+ @defaultprefix = %r{^(GB|GB/T|GB/Z) }
12
+ @idtype = "Chinese Standard"
13
+ end
14
+
15
+ # @param code [String]
16
+ # @param date [String, NilClass] year
17
+ # @param opts [Hash]
18
+ # @return [Relaton::Gb::ItemData, nil]
19
+ def get(code, date, opts)
20
+ require_relative "../gb"
21
+ Bibliography.get(code, date, opts)
22
+ end
23
+
24
+ # @param xml [String]
25
+ # @return [Relaton::Gb::ItemData]
26
+ def from_xml(xml)
27
+ require_relative "../gb"
28
+ Item.from_xml xml
29
+ end
30
+
31
+ # @param yaml [String]
32
+ # @return [Relaton::Gb::ItemData]
33
+ def from_yaml(yaml)
34
+ require_relative "../gb" # defines Item — cache reads hit this cold
35
+ Item.from_yaml yaml
36
+ end
37
+
38
+ # Returns hash of XML grammar
39
+ # @return [String]
40
+ def grammar_hash
41
+ require_relative "../gb"
42
+ @grammar_hash ||= ::Relaton::Gb.grammar_hash
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,38 @@
1
+ module Relaton
2
+ module Gb
3
+ class ProjectNumber < Lutaml::Model::Serializable
4
+ attribute :part, :integer
5
+ attribute :subpart, :integer
6
+ attribute :amendment, :integer
7
+ attribute :corrigendum, :integer
8
+ attribute :origyr, :string
9
+ attribute :content, :string
10
+
11
+ xml do
12
+ root "project-ntnumber"
13
+ map_attribute "part", to: :part
14
+ map_attribute "subpart", to: :subpart
15
+ map_attribute "amendment", to: :amendment
16
+ map_attribute "corrigendum", to: :corrigendum
17
+ map_attribute "origyr", to: :origyr
18
+ map_content to: :content
19
+ end
20
+
21
+ def to_all_parts!
22
+ remove_part!
23
+ remove_date!
24
+ end
25
+
26
+ def remove_part!
27
+ self.part = nil
28
+ self.subpart = nil
29
+ self.amendment = nil
30
+ self.corrigendum = nil
31
+ end
32
+
33
+ def remove_date!
34
+ self.origyr = nil
35
+ end
36
+ end
37
+ end
38
+ end