relaton 2.2.0.pre.alpha.1 → 3.0.0.pre.alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (702) hide show
  1. checksums.yaml +4 -4
  2. data/{docs/README.adoc → README.adoc} +165 -38
  3. data/bin/console +0 -1
  4. data/lib/relaton/3gpp/bibdata.rb +9 -0
  5. data/lib/relaton/3gpp/bibitem.rb +9 -0
  6. data/lib/relaton/3gpp/bibliography.rb +123 -0
  7. data/lib/relaton/3gpp/data_fetcher.rb +303 -0
  8. data/lib/relaton/3gpp/docidentifier.rb +114 -0
  9. data/lib/relaton/3gpp/doctype.rb +9 -0
  10. data/lib/relaton/3gpp/ext.rb +31 -0
  11. data/lib/relaton/3gpp/item.rb +18 -0
  12. data/lib/relaton/3gpp/item_data.rb +15 -0
  13. data/lib/relaton/3gpp/parser.rb +400 -0
  14. data/lib/relaton/3gpp/processor.rb +71 -0
  15. data/lib/relaton/3gpp/release.rb +34 -0
  16. data/lib/relaton/3gpp/util.rb +8 -0
  17. data/lib/relaton/3gpp.rb +29 -0
  18. data/lib/relaton/adobe/bibdata.rb +8 -0
  19. data/lib/relaton/adobe/bibitem.rb +8 -0
  20. data/lib/relaton/adobe/bibliography.rb +92 -0
  21. data/lib/relaton/adobe/docidentifier.rb +49 -0
  22. data/lib/relaton/adobe/doctype.rb +14 -0
  23. data/lib/relaton/adobe/ext.rb +32 -0
  24. data/lib/relaton/adobe/item.rb +15 -0
  25. data/lib/relaton/adobe/item_base.rb +18 -0
  26. data/lib/relaton/adobe/item_data.rb +6 -0
  27. data/lib/relaton/adobe/processor.rb +45 -0
  28. data/lib/relaton/adobe/util.rb +8 -0
  29. data/lib/relaton/adobe.rb +37 -0
  30. data/lib/relaton/bib/converter/asciibib/to_asciibib.rb +663 -0
  31. data/lib/relaton/bib/converter/asciibib.rb +13 -0
  32. data/lib/relaton/bib/converter/bibtex/from_bibtex.rb +245 -0
  33. data/lib/relaton/bib/converter/bibtex/to_bibtex.rb +341 -0
  34. data/lib/relaton/bib/converter/bibtex.rb +23 -0
  35. data/lib/relaton/bib/converter/bibxml/from_rfcxml.rb +386 -0
  36. data/lib/relaton/bib/converter/bibxml/from_rfcxml_referencegroup.rb +71 -0
  37. data/lib/relaton/bib/converter/bibxml/to_rfcxml.rb +308 -0
  38. data/lib/relaton/bib/converter/bibxml/to_rfcxml_referencegroup.rb +52 -0
  39. data/lib/relaton/bib/converter/bibxml.rb +51 -0
  40. data/lib/relaton/bib/hash_parser_v1.rb +767 -0
  41. data/lib/relaton/bib/item_data.rb +229 -0
  42. data/lib/relaton/bib/model/abstract.rb +16 -0
  43. data/lib/relaton/bib/model/address.rb +22 -0
  44. data/lib/relaton/bib/model/affiliation.rb +16 -0
  45. data/lib/relaton/bib/model/bibdata.rb +11 -0
  46. data/lib/relaton/bib/model/bibdata_shared.rb +12 -0
  47. data/lib/relaton/bib/model/bibitem.rb +11 -0
  48. data/lib/relaton/bib/model/bibitem_shared.rb +12 -0
  49. data/lib/relaton/bib/model/contact.rb +18 -0
  50. data/lib/relaton/bib/model/contribution_info.rb +15 -0
  51. data/lib/relaton/bib/model/contributor.rb +29 -0
  52. data/lib/relaton/bib/model/copyright.rb +27 -0
  53. data/lib/relaton/bib/model/date.rb +31 -0
  54. data/lib/relaton/bib/model/depiction.rb +16 -0
  55. data/lib/relaton/bib/model/docidentifier.rb +49 -0
  56. data/lib/relaton/bib/model/doctype.rb +14 -0
  57. data/lib/relaton/bib/model/edition.rb +14 -0
  58. data/lib/relaton/bib/model/ext.rb +39 -0
  59. data/lib/relaton/bib/model/extent.rb +16 -0
  60. data/lib/relaton/bib/model/formattedref.rb +43 -0
  61. data/lib/relaton/bib/model/full_name_type.rb +64 -0
  62. data/lib/relaton/bib/model/fullname.rb +11 -0
  63. data/lib/relaton/bib/model/ics.rb +49 -0
  64. data/lib/relaton/bib/model/image.rb +28 -0
  65. data/lib/relaton/bib/model/item.rb +96 -0
  66. data/lib/relaton/bib/model/item_base.rb +20 -0
  67. data/lib/relaton/bib/model/item_shared.rb +88 -0
  68. data/lib/relaton/bib/model/keyword.rb +30 -0
  69. data/lib/relaton/bib/model/locality.rb +18 -0
  70. data/lib/relaton/bib/model/locality_stack.rb +14 -0
  71. data/lib/relaton/bib/model/localized_string.rb +48 -0
  72. data/lib/relaton/bib/model/localized_string_attrs.rb +24 -0
  73. data/lib/relaton/bib/model/logo.rb +14 -0
  74. data/lib/relaton/bib/model/medium.rb +22 -0
  75. data/lib/relaton/bib/model/note.rb +16 -0
  76. data/lib/relaton/bib/model/organization.rb +13 -0
  77. data/lib/relaton/bib/model/organization_type.rb +42 -0
  78. data/lib/relaton/bib/model/person.rb +36 -0
  79. data/lib/relaton/bib/model/phone.rb +14 -0
  80. data/lib/relaton/bib/model/place.rb +33 -0
  81. data/lib/relaton/bib/model/price.rb +14 -0
  82. data/lib/relaton/bib/model/relation.rb +43 -0
  83. data/lib/relaton/bib/model/series.rb +34 -0
  84. data/lib/relaton/bib/model/size.rb +23 -0
  85. data/lib/relaton/bib/model/source_locality_stack.rb +14 -0
  86. data/lib/relaton/bib/model/status.rb +27 -0
  87. data/lib/relaton/bib/model/structured_identifier.rb +49 -0
  88. data/lib/relaton/bib/model/subdivision.rb +16 -0
  89. data/lib/relaton/bib/model/title.rb +56 -0
  90. data/lib/relaton/bib/model/type/plain_date.rb +16 -0
  91. data/lib/relaton/bib/model/type/string_date.rb +48 -0
  92. data/lib/relaton/bib/model/uri.rb +18 -0
  93. data/lib/relaton/bib/model/validity.rb +16 -0
  94. data/lib/relaton/bib/model/version.rb +43 -0
  95. data/lib/relaton/bib/namespace_helper.rb +21 -0
  96. data/lib/relaton/bib/sanitizer.rb +264 -0
  97. data/lib/relaton/bib/util.rb +18 -0
  98. data/lib/relaton/bib/versions.json +35 -0
  99. data/lib/relaton/bib.rb +46 -0
  100. data/lib/relaton/bipm/bibliography.rb +231 -0
  101. data/lib/relaton/bipm/converter/asciibib.rb +64 -0
  102. data/lib/relaton/bipm/data_fetcher.rb +81 -0
  103. data/lib/relaton/bipm/data_outcomes_parser.rb +656 -0
  104. data/lib/relaton/bipm/id_parser.rb +278 -0
  105. data/lib/relaton/bipm/item_data.rb +47 -0
  106. data/lib/relaton/bipm/model/bibdata.rb +9 -0
  107. data/lib/relaton/bipm/model/bibitem.rb +9 -0
  108. data/lib/relaton/bipm/model/comment_period.rb +13 -0
  109. data/lib/relaton/bipm/model/doctype.rb +12 -0
  110. data/lib/relaton/bipm/model/ext.rb +38 -0
  111. data/lib/relaton/bipm/model/item.rb +11 -0
  112. data/lib/relaton/bipm/model/structured_identifier.rb +36 -0
  113. data/lib/relaton/bipm/processor.rb +69 -0
  114. data/lib/relaton/bipm/rawdata_bipm_metrologia/affiliations.rb +111 -0
  115. data/lib/relaton/bipm/rawdata_bipm_metrologia/fetcher.rb +172 -0
  116. data/lib/relaton/bipm/rawdata_bipm_metrologia/niso_jats_parser.rb +353 -0
  117. data/lib/relaton/bipm/si_brochure_parser.rb +188 -0
  118. data/lib/relaton/bipm/util.rb +8 -0
  119. data/lib/relaton/bipm.rb +38 -0
  120. data/lib/relaton/bsi/bibliography.rb +196 -0
  121. data/lib/relaton/bsi/hit.rb +28 -0
  122. data/lib/relaton/bsi/hit_collection.rb +113 -0
  123. data/lib/relaton/bsi/item_data.rb +13 -0
  124. data/lib/relaton/bsi/model/bibdata.rb +8 -0
  125. data/lib/relaton/bsi/model/bibitem.rb +8 -0
  126. data/lib/relaton/bsi/model/docidentifier.rb +107 -0
  127. data/lib/relaton/bsi/model/doctype.rb +14 -0
  128. data/lib/relaton/bsi/model/ext.rb +17 -0
  129. data/lib/relaton/bsi/model/item.rb +17 -0
  130. data/lib/relaton/bsi/model/item_base.rb +22 -0
  131. data/lib/relaton/bsi/model/relation.rb +9 -0
  132. data/lib/relaton/bsi/processor.rb +43 -0
  133. data/lib/relaton/bsi/schema.json +24882 -0
  134. data/lib/relaton/bsi/scraper.rb +288 -0
  135. data/lib/relaton/bsi/util.rb +8 -0
  136. data/lib/relaton/bsi.rb +25 -0
  137. data/lib/relaton/calconnect/bibliography.rb +93 -0
  138. data/lib/relaton/calconnect/data_fetcher.rb +174 -0
  139. data/lib/relaton/calconnect/docidentifier.rb +80 -0
  140. data/lib/relaton/calconnect/hit.rb +14 -0
  141. data/lib/relaton/calconnect/hit_collection.rb +92 -0
  142. data/lib/relaton/calconnect/item_data.rb +12 -0
  143. data/lib/relaton/calconnect/model/bibdata.rb +8 -0
  144. data/lib/relaton/calconnect/model/bibitem.rb +8 -0
  145. data/lib/relaton/calconnect/model/doctype.rb +11 -0
  146. data/lib/relaton/calconnect/model/ext.rb +11 -0
  147. data/lib/relaton/calconnect/model/item.rb +20 -0
  148. data/lib/relaton/calconnect/processor.rb +72 -0
  149. data/lib/relaton/calconnect/scraper.rb +87 -0
  150. data/lib/relaton/calconnect/util.rb +8 -0
  151. data/lib/relaton/calconnect.rb +36 -0
  152. data/lib/relaton/ccsds/bibliography.rb +63 -0
  153. data/lib/relaton/ccsds/data/fetcher.rb +252 -0
  154. data/lib/relaton/ccsds/data/iso_references.rb +30 -0
  155. data/lib/relaton/ccsds/data/parser.rb +194 -0
  156. data/lib/relaton/ccsds/hit.rb +24 -0
  157. data/lib/relaton/ccsds/hit_collection.rb +47 -0
  158. data/lib/relaton/ccsds/item_data.rb +9 -0
  159. data/lib/relaton/ccsds/model/bibdata.rb +8 -0
  160. data/lib/relaton/ccsds/model/bibitem.rb +8 -0
  161. data/lib/relaton/ccsds/model/docidentifier.rb +121 -0
  162. data/lib/relaton/ccsds/model/doctype.rb +9 -0
  163. data/lib/relaton/ccsds/model/ext.rb +19 -0
  164. data/lib/relaton/ccsds/model/item.rb +15 -0
  165. data/lib/relaton/ccsds/processor.rb +68 -0
  166. data/lib/relaton/ccsds/util.rb +10 -0
  167. data/lib/relaton/ccsds.rb +33 -0
  168. data/lib/relaton/cen/bibliography.rb +149 -0
  169. data/lib/relaton/cen/committees.yaml +66 -0
  170. data/lib/relaton/cen/hit.rb +31 -0
  171. data/lib/relaton/cen/hit_collection.rb +116 -0
  172. data/lib/relaton/cen/item_data.rb +7 -0
  173. data/lib/relaton/cen/model/bibdata.rb +8 -0
  174. data/lib/relaton/cen/model/bibitem.rb +8 -0
  175. data/lib/relaton/cen/model/docidentifier.rb +100 -0
  176. data/lib/relaton/cen/model/ext.rb +11 -0
  177. data/lib/relaton/cen/model/item.rb +14 -0
  178. data/lib/relaton/cen/model/structured_identifier.rb +9 -0
  179. data/lib/relaton/cen/processor.rb +45 -0
  180. data/lib/relaton/cen/scraper.rb +218 -0
  181. data/lib/relaton/cen/util.rb +8 -0
  182. data/lib/relaton/cen.rb +30 -0
  183. data/lib/relaton/cie/bibdata.rb +8 -0
  184. data/lib/relaton/cie/bibitem.rb +8 -0
  185. data/lib/relaton/cie/bibliography.rb +31 -0
  186. data/lib/relaton/cie/data_fetcher.rb +540 -0
  187. data/lib/relaton/cie/ext.rb +7 -0
  188. data/lib/relaton/cie/item.rb +11 -0
  189. data/lib/relaton/cie/item_data.rb +6 -0
  190. data/lib/relaton/cie/processor.rb +68 -0
  191. data/lib/relaton/cie/scrapper.rb +52 -0
  192. data/lib/relaton/cie/util.rb +8 -0
  193. data/lib/relaton/cie.rb +29 -0
  194. data/lib/relaton/core/array_wrapper.rb +20 -0
  195. data/lib/relaton/core/data_fetcher.rb +244 -0
  196. data/lib/relaton/core/date_parser.rb +42 -0
  197. data/lib/relaton/core/governor.rb +320 -0
  198. data/lib/relaton/core/hash_keys_sybolizer.rb +19 -0
  199. data/lib/relaton/core/hit.rb +49 -0
  200. data/lib/relaton/core/hit_collection.rb +118 -0
  201. data/lib/relaton/core/pacer.rb +134 -0
  202. data/lib/relaton/core/processor.rb +67 -0
  203. data/lib/relaton/core/request_error.rb +14 -0
  204. data/lib/relaton/core/workers_pool.rb +45 -0
  205. data/lib/relaton/core.rb +12 -0
  206. data/lib/relaton/db/registry.rb +44 -4
  207. data/lib/relaton/db.rb +0 -1
  208. data/lib/relaton/doi/crossref.rb +89 -0
  209. data/lib/relaton/doi/parser.rb +921 -0
  210. data/lib/relaton/doi/processor.rb +65 -0
  211. data/lib/relaton/doi/util.rb +8 -0
  212. data/lib/relaton/doi.rb +20 -0
  213. data/lib/relaton/easc/bibdata.rb +8 -0
  214. data/lib/relaton/easc/bibitem.rb +8 -0
  215. data/lib/relaton/easc/bibliography.rb +95 -0
  216. data/lib/relaton/easc/docidentifier.rb +100 -0
  217. data/lib/relaton/easc/doctype.rb +14 -0
  218. data/lib/relaton/easc/ext.rb +44 -0
  219. data/lib/relaton/easc/item.rb +13 -0
  220. data/lib/relaton/easc/item_base.rb +18 -0
  221. data/lib/relaton/easc/item_data.rb +6 -0
  222. data/lib/relaton/easc/processor.rb +46 -0
  223. data/lib/relaton/easc/util.rb +8 -0
  224. data/lib/relaton/easc.rb +35 -0
  225. data/lib/relaton/ecma/bibdata.rb +8 -0
  226. data/lib/relaton/ecma/bibitem.rb +8 -0
  227. data/lib/relaton/ecma/bibliography.rb +149 -0
  228. data/lib/relaton/ecma/data_fetcher.rb +162 -0
  229. data/lib/relaton/ecma/data_parser.rb +49 -0
  230. data/lib/relaton/ecma/docidentifier.rb +124 -0
  231. data/lib/relaton/ecma/edition_parser.rb +80 -0
  232. data/lib/relaton/ecma/ext.rb +7 -0
  233. data/lib/relaton/ecma/item.rb +13 -0
  234. data/lib/relaton/ecma/item_data.rb +6 -0
  235. data/lib/relaton/ecma/memento_parser.rb +60 -0
  236. data/lib/relaton/ecma/page_fetcher.rb +39 -0
  237. data/lib/relaton/ecma/parser_common.rb +33 -0
  238. data/lib/relaton/ecma/processor.rb +69 -0
  239. data/lib/relaton/ecma/standard_parser.rb +134 -0
  240. data/lib/relaton/ecma/util.rb +8 -0
  241. data/lib/relaton/ecma.rb +33 -0
  242. data/lib/relaton/etsi/bibdata.rb +10 -0
  243. data/lib/relaton/etsi/bibitem.rb +10 -0
  244. data/lib/relaton/etsi/bibliography.rb +111 -0
  245. data/lib/relaton/etsi/data_fetcher.rb +167 -0
  246. data/lib/relaton/etsi/data_parser.rb +208 -0
  247. data/lib/relaton/etsi/doctype.rb +30 -0
  248. data/lib/relaton/etsi/ext.rb +31 -0
  249. data/lib/relaton/etsi/item.rb +15 -0
  250. data/lib/relaton/etsi/item_data.rb +6 -0
  251. data/lib/relaton/etsi/processor.rb +71 -0
  252. data/lib/relaton/etsi/pubid.rb +37 -0
  253. data/lib/relaton/etsi/status.rb +13 -0
  254. data/lib/relaton/etsi/util.rb +8 -0
  255. data/lib/relaton/etsi.rb +26 -0
  256. data/lib/relaton/gb/bibdata.rb +8 -0
  257. data/lib/relaton/gb/bibitem.rb +8 -0
  258. data/lib/relaton/gb/bibliography.rb +171 -0
  259. data/lib/relaton/gb/ccs.rb +14 -0
  260. data/lib/relaton/gb/committee.rb +13 -0
  261. data/lib/relaton/gb/docidentifier.rb +72 -0
  262. data/lib/relaton/gb/doctype.rb +9 -0
  263. data/lib/relaton/gb/ext.rb +36 -0
  264. data/lib/relaton/gb/gb_scraper.rb +61 -0
  265. data/lib/relaton/gb/gb_type.rb +20 -0
  266. data/lib/relaton/gb/hit.rb +48 -0
  267. data/lib/relaton/gb/hit_collection.rb +19 -0
  268. data/lib/relaton/gb/item.rb +13 -0
  269. data/lib/relaton/gb/item_data.rb +6 -0
  270. data/lib/relaton/gb/processor.rb +49 -0
  271. data/lib/relaton/gb/project_number.rb +38 -0
  272. data/lib/relaton/gb/scraper.rb +221 -0
  273. data/lib/relaton/gb/sec_scraper.rb +92 -0
  274. data/lib/relaton/gb/stage_name.rb +13 -0
  275. data/lib/relaton/gb/structured_identifier.rb +26 -0
  276. data/lib/relaton/gb/t_scraper.rb +126 -0
  277. data/lib/relaton/gb/util.rb +8 -0
  278. data/lib/relaton/gb/yaml/prefixes.yaml +200 -0
  279. data/lib/relaton/gb.rb +33 -0
  280. data/lib/relaton/gost/bibdata.rb +8 -0
  281. data/lib/relaton/gost/bibitem.rb +8 -0
  282. data/lib/relaton/gost/bibliography.rb +107 -0
  283. data/lib/relaton/gost/docidentifier.rb +80 -0
  284. data/lib/relaton/gost/doctype.rb +16 -0
  285. data/lib/relaton/gost/ext.rb +46 -0
  286. data/lib/relaton/gost/item.rb +15 -0
  287. data/lib/relaton/gost/item_base.rb +18 -0
  288. data/lib/relaton/gost/item_data.rb +6 -0
  289. data/lib/relaton/gost/processor.rb +49 -0
  290. data/lib/relaton/gost/util.rb +8 -0
  291. data/lib/relaton/gost.rb +36 -0
  292. data/lib/relaton/iala/bibdata.rb +8 -0
  293. data/lib/relaton/iala/bibitem.rb +8 -0
  294. data/lib/relaton/iala/bibliography.rb +146 -0
  295. data/lib/relaton/iala/docidentifier.rb +89 -0
  296. data/lib/relaton/iala/doctype.rb +18 -0
  297. data/lib/relaton/iala/ext.rb +32 -0
  298. data/lib/relaton/iala/item.rb +21 -0
  299. data/lib/relaton/iala/item_base.rb +18 -0
  300. data/lib/relaton/iala/item_data.rb +6 -0
  301. data/lib/relaton/iala/processor.rb +43 -0
  302. data/lib/relaton/iala/relation.rb +7 -0
  303. data/lib/relaton/iala/util.rb +8 -0
  304. data/lib/relaton/iala.rb +35 -0
  305. data/lib/relaton/iana/bibdata.rb +8 -0
  306. data/lib/relaton/iana/bibitem.rb +8 -0
  307. data/lib/relaton/iana/bibliography.rb +100 -0
  308. data/lib/relaton/iana/data_fetcher.rb +101 -0
  309. data/lib/relaton/iana/item.rb +7 -0
  310. data/lib/relaton/iana/item_data.rb +6 -0
  311. data/lib/relaton/iana/parser.rb +146 -0
  312. data/lib/relaton/iana/processor.rb +70 -0
  313. data/lib/relaton/iana/util.rb +8 -0
  314. data/lib/relaton/iana.rb +40 -0
  315. data/lib/relaton/iec/bibliography.rb +283 -0
  316. data/lib/relaton/iec/data_fetcher.rb +222 -0
  317. data/lib/relaton/iec/data_parser.rb +391 -0
  318. data/lib/relaton/iec/hit.rb +26 -0
  319. data/lib/relaton/iec/hit_collection.rb +138 -0
  320. data/lib/relaton/iec/item_data.rb +7 -0
  321. data/lib/relaton/iec/model/bibdata.rb +8 -0
  322. data/lib/relaton/iec/model/bibitem.rb +8 -0
  323. data/lib/relaton/iec/model/docidentifier.rb +135 -0
  324. data/lib/relaton/iec/model/doctype.rb +12 -0
  325. data/lib/relaton/iec/model/ext.rb +53 -0
  326. data/lib/relaton/iec/model/item.rb +20 -0
  327. data/lib/relaton/iec/model/item_base.rb +12 -0
  328. data/lib/relaton/iec/model/relation.rb +7 -0
  329. data/lib/relaton/iec/model/stage_name.rb +13 -0
  330. data/lib/relaton/iec/processor.rb +74 -0
  331. data/lib/relaton/iec/statuses.yml +199 -0
  332. data/lib/relaton/iec/util.rb +8 -0
  333. data/lib/relaton/iec.rb +98 -0
  334. data/lib/relaton/ieee/balloting_group.rb +13 -0
  335. data/lib/relaton/ieee/bibdata.rb +8 -0
  336. data/lib/relaton/ieee/bibitem.rb +8 -0
  337. data/lib/relaton/ieee/bibliography.rb +73 -0
  338. data/lib/relaton/ieee/converter/bibxml/from_rfcxml.rb +10 -0
  339. data/lib/relaton/ieee/converter/bibxml/from_rfcxml_referencegroup.rb +10 -0
  340. data/lib/relaton/ieee/converter/bibxml.rb +20 -0
  341. data/lib/relaton/ieee/data_fetcher.rb +771 -0
  342. data/lib/relaton/ieee/doctype.rb +9 -0
  343. data/lib/relaton/ieee/editorial_group.rb +19 -0
  344. data/lib/relaton/ieee/ext.rb +36 -0
  345. data/lib/relaton/ieee/idams_parser.rb +330 -0
  346. data/lib/relaton/ieee/item.rb +11 -0
  347. data/lib/relaton/ieee/item_data.rb +7 -0
  348. data/lib/relaton/ieee/processor.rb +71 -0
  349. data/lib/relaton/ieee/rawbib_id_parser.rb +753 -0
  350. data/lib/relaton/ieee/util.rb +8 -0
  351. data/lib/relaton/ieee.rb +30 -0
  352. data/lib/relaton/ietf/bibdata.rb +8 -0
  353. data/lib/relaton/ietf/bibitem.rb +8 -0
  354. data/lib/relaton/ietf/bibliography.rb +35 -0
  355. data/lib/relaton/ietf/bibxml_parser.rb +232 -0
  356. data/lib/relaton/ietf/data_fetcher.rb +561 -0
  357. data/lib/relaton/ietf/doctype.rb +9 -0
  358. data/lib/relaton/ietf/ext.rb +63 -0
  359. data/lib/relaton/ietf/item.rb +16 -0
  360. data/lib/relaton/ietf/item_base.rb +18 -0
  361. data/lib/relaton/ietf/item_data.rb +6 -0
  362. data/lib/relaton/ietf/processing_instructions.rb +79 -0
  363. data/lib/relaton/ietf/processor.rb +72 -0
  364. data/lib/relaton/ietf/relation.rb +9 -0
  365. data/lib/relaton/ietf/rfc/abstract.rb +19 -0
  366. data/lib/relaton/ietf/rfc/author.rb +21 -0
  367. data/lib/relaton/ietf/rfc/entry.rb +446 -0
  368. data/lib/relaton/ietf/rfc/entry_date.rb +21 -0
  369. data/lib/relaton/ietf/rfc/format.rb +19 -0
  370. data/lib/relaton/ietf/rfc/index.rb +46 -0
  371. data/lib/relaton/ietf/rfc/is_also.rb +21 -0
  372. data/lib/relaton/ietf/rfc/keywords.rb +19 -0
  373. data/lib/relaton/ietf/rfc/rfc_index_namespace.rb +11 -0
  374. data/lib/relaton/ietf/scraper.rb +101 -0
  375. data/lib/relaton/ietf/util.rb +8 -0
  376. data/lib/relaton/ietf/wg_name_resolver.rb +42 -0
  377. data/lib/relaton/ietf.rb +30 -0
  378. data/lib/relaton/iho/bibdata.rb +8 -0
  379. data/lib/relaton/iho/bibitem.rb +8 -0
  380. data/lib/relaton/iho/bibliography.rb +114 -0
  381. data/lib/relaton/iho/comment_period.rb +13 -0
  382. data/lib/relaton/iho/docidentifier.rb +31 -0
  383. data/lib/relaton/iho/doctype.rb +10 -0
  384. data/lib/relaton/iho/ext.rb +20 -0
  385. data/lib/relaton/iho/hash_parser_v1.rb +144 -0
  386. data/lib/relaton/iho/item.rb +20 -0
  387. data/lib/relaton/iho/item_base.rb +18 -0
  388. data/lib/relaton/iho/item_data.rb +6 -0
  389. data/lib/relaton/iho/processor.rb +54 -0
  390. data/lib/relaton/iho/relation.rb +9 -0
  391. data/lib/relaton/iho/structured_identifier.rb +20 -0
  392. data/lib/relaton/iho/util.rb +8 -0
  393. data/lib/relaton/iho.rb +27 -0
  394. data/lib/relaton/index/config.rb +52 -0
  395. data/lib/relaton/index/file_io.rb +305 -0
  396. data/lib/relaton/index/file_storage.rb +66 -0
  397. data/lib/relaton/index/pool.rb +46 -0
  398. data/lib/relaton/index/shard_source.rb +201 -0
  399. data/lib/relaton/index/type.rb +210 -0
  400. data/lib/relaton/index/util.rb +18 -0
  401. data/lib/relaton/index.rb +61 -0
  402. data/lib/relaton/isbn/isbn.rb +61 -0
  403. data/lib/relaton/isbn/open_library.rb +43 -0
  404. data/lib/relaton/isbn/parser.rb +88 -0
  405. data/lib/relaton/isbn/processor.rb +48 -0
  406. data/lib/relaton/isbn/util.rb +8 -0
  407. data/lib/relaton/isbn.rb +19 -0
  408. data/lib/relaton/iso/bibliography.rb +412 -0
  409. data/lib/relaton/iso/data_fetcher.rb +338 -0
  410. data/lib/relaton/iso/data_parser.rb +458 -0
  411. data/lib/relaton/iso/hash_parser_v1.rb +177 -0
  412. data/lib/relaton/iso/hit.rb +57 -0
  413. data/lib/relaton/iso/hit_collection.rb +196 -0
  414. data/lib/relaton/iso/item_data.rb +50 -0
  415. data/lib/relaton/iso/model/bibdata.rb +10 -0
  416. data/lib/relaton/iso/model/bibitem.rb +8 -0
  417. data/lib/relaton/iso/model/contributor.rb +6 -0
  418. data/lib/relaton/iso/model/contributor_info.rb +9 -0
  419. data/lib/relaton/iso/model/docidentifier.rb +146 -0
  420. data/lib/relaton/iso/model/doctype.rb +13 -0
  421. data/lib/relaton/iso/model/ext.rb +35 -0
  422. data/lib/relaton/iso/model/item.rb +17 -0
  423. data/lib/relaton/iso/model/item_base.rb +22 -0
  424. data/lib/relaton/iso/model/organization.rb +9 -0
  425. data/lib/relaton/iso/model/project_number.rb +22 -0
  426. data/lib/relaton/iso/model/relation.rb +9 -0
  427. data/lib/relaton/iso/model/stagename.rb +14 -0
  428. data/lib/relaton/iso/model/structured_identifier.rb +31 -0
  429. data/lib/relaton/iso/processor.rb +85 -0
  430. data/lib/relaton/iso/scraper.rb +635 -0
  431. data/lib/relaton/iso/type/pubid.rb +50 -0
  432. data/lib/relaton/iso/util.rb +8 -0
  433. data/lib/relaton/iso.rb +30 -0
  434. data/lib/relaton/itu/bibliography.rb +95 -0
  435. data/lib/relaton/itu/data_crawler_r.rb +664 -0
  436. data/lib/relaton/itu/data_fetcher.rb +550 -0
  437. data/lib/relaton/itu/data_merge_r.rb +149 -0
  438. data/lib/relaton/itu/data_parser_r.rb +214 -0
  439. data/lib/relaton/itu/data_parser_t.rb +228 -0
  440. data/lib/relaton/itu/family_cache.rb +177 -0
  441. data/lib/relaton/itu/governor.rb +56 -0
  442. data/lib/relaton/itu/hit.rb +28 -0
  443. data/lib/relaton/itu/hit_collection.rb +299 -0
  444. data/lib/relaton/itu/item_data.rb +6 -0
  445. data/lib/relaton/itu/model/approval_stage.rb +13 -0
  446. data/lib/relaton/itu/model/bibdata.rb +8 -0
  447. data/lib/relaton/itu/model/bibitem.rb +8 -0
  448. data/lib/relaton/itu/model/docidentifier.rb +75 -0
  449. data/lib/relaton/itu/model/doctype.rb +13 -0
  450. data/lib/relaton/itu/model/ext.rb +47 -0
  451. data/lib/relaton/itu/model/item.rb +13 -0
  452. data/lib/relaton/itu/model/meeting.rb +13 -0
  453. data/lib/relaton/itu/model/meeting_date.rb +15 -0
  454. data/lib/relaton/itu/model/question.rb +13 -0
  455. data/lib/relaton/itu/model/recommendation_status.rb +11 -0
  456. data/lib/relaton/itu/model/structured_identifier.rb +38 -0
  457. data/lib/relaton/itu/processor.rb +72 -0
  458. data/lib/relaton/itu/pubid.rb +199 -0
  459. data/lib/relaton/itu/radio_regulations_parser.rb +70 -0
  460. data/lib/relaton/itu/recommendation_fields.rb +334 -0
  461. data/lib/relaton/itu/recommendation_parser.rb +30 -0
  462. data/lib/relaton/itu/scraper.rb +203 -0
  463. data/lib/relaton/itu/util.rb +8 -0
  464. data/lib/relaton/itu.rb +34 -0
  465. data/lib/relaton/jcgm/bibdata.rb +8 -0
  466. data/lib/relaton/jcgm/bibitem.rb +8 -0
  467. data/lib/relaton/jcgm/bibliography.rb +97 -0
  468. data/lib/relaton/jcgm/data_fetcher.rb +81 -0
  469. data/lib/relaton/jcgm/docidentifier.rb +102 -0
  470. data/lib/relaton/jcgm/doctype.rb +12 -0
  471. data/lib/relaton/jcgm/ext.rb +23 -0
  472. data/lib/relaton/jcgm/item.rb +20 -0
  473. data/lib/relaton/jcgm/item_base.rb +18 -0
  474. data/lib/relaton/jcgm/item_data.rb +6 -0
  475. data/lib/relaton/jcgm/meetings_parser.rb +175 -0
  476. data/lib/relaton/jcgm/processor.rb +71 -0
  477. data/lib/relaton/jcgm/relation.rb +9 -0
  478. data/lib/relaton/jcgm/structured_identifier.rb +40 -0
  479. data/lib/relaton/jcgm/util.rb +8 -0
  480. data/lib/relaton/jcgm.rb +24 -0
  481. data/lib/relaton/jis/bibdata.rb +8 -0
  482. data/lib/relaton/jis/bibitem.rb +8 -0
  483. data/lib/relaton/jis/bibliography.rb +73 -0
  484. data/lib/relaton/jis/data_fetcher.rb +183 -0
  485. data/lib/relaton/jis/docidentifier.rb +120 -0
  486. data/lib/relaton/jis/doctype.rb +9 -0
  487. data/lib/relaton/jis/ext.rb +13 -0
  488. data/lib/relaton/jis/hit.rb +88 -0
  489. data/lib/relaton/jis/hit_collection.rb +128 -0
  490. data/lib/relaton/jis/item.rb +22 -0
  491. data/lib/relaton/jis/item_base.rb +26 -0
  492. data/lib/relaton/jis/item_data.rb +8 -0
  493. data/lib/relaton/jis/processor.rb +55 -0
  494. data/lib/relaton/jis/relation.rb +11 -0
  495. data/lib/relaton/jis/scraper.rb +232 -0
  496. data/lib/relaton/jis/structured_identifier.rb +13 -0
  497. data/lib/relaton/jis/util.rb +8 -0
  498. data/lib/relaton/jis.rb +32 -0
  499. data/lib/relaton/logger/channels/gh_issue.rb +143 -0
  500. data/lib/relaton/logger/config.rb +34 -0
  501. data/lib/relaton/logger/formatter_json.rb +8 -0
  502. data/lib/relaton/logger/formatter_string.rb +12 -0
  503. data/lib/relaton/logger/log.rb +64 -0
  504. data/lib/relaton/logger/log_device.rb +27 -0
  505. data/lib/relaton/logger/pool.rb +24 -0
  506. data/lib/relaton/logger.rb +18 -0
  507. data/lib/relaton/nist/bibdata.rb +8 -0
  508. data/lib/relaton/nist/bibitem.rb +8 -0
  509. data/lib/relaton/nist/bibliography.rb +191 -0
  510. data/lib/relaton/nist/comment_period.rb +15 -0
  511. data/lib/relaton/nist/data_fetcher.rb +134 -0
  512. data/lib/relaton/nist/date.rb +7 -0
  513. data/lib/relaton/nist/docidentifier.rb +165 -0
  514. data/lib/relaton/nist/doctype.rb +7 -0
  515. data/lib/relaton/nist/ext.rb +16 -0
  516. data/lib/relaton/nist/hit.rb +18 -0
  517. data/lib/relaton/nist/hit_collection.rb +362 -0
  518. data/lib/relaton/nist/item.rb +19 -0
  519. data/lib/relaton/nist/item_base.rb +16 -0
  520. data/lib/relaton/nist/item_data.rb +6 -0
  521. data/lib/relaton/nist/mods_parser.rb +302 -0
  522. data/lib/relaton/nist/processor.rb +69 -0
  523. data/lib/relaton/nist/pubs_export.rb +69 -0
  524. data/lib/relaton/nist/relation.rb +10 -0
  525. data/lib/relaton/nist/scraper.rb +293 -0
  526. data/lib/relaton/nist/series.yaml +49 -0
  527. data/lib/relaton/nist/util.rb +8 -0
  528. data/lib/relaton/nist.rb +34 -0
  529. data/lib/relaton/oasis/bibdata.rb +8 -0
  530. data/lib/relaton/oasis/bibitem.rb +8 -0
  531. data/lib/relaton/oasis/bibliography.rb +201 -0
  532. data/lib/relaton/oasis/browser_agent.rb +71 -0
  533. data/lib/relaton/oasis/data_fetcher.rb +130 -0
  534. data/lib/relaton/oasis/data_parser.rb +305 -0
  535. data/lib/relaton/oasis/data_parser_utils.rb +330 -0
  536. data/lib/relaton/oasis/data_part_parser.rb +239 -0
  537. data/lib/relaton/oasis/docidentifier.rb +54 -0
  538. data/lib/relaton/oasis/doctype.rb +7 -0
  539. data/lib/relaton/oasis/ext.rb +19 -0
  540. data/lib/relaton/oasis/item.rb +14 -0
  541. data/lib/relaton/oasis/item_data.rb +6 -0
  542. data/lib/relaton/oasis/processor.rb +74 -0
  543. data/lib/relaton/oasis/util.rb +8 -0
  544. data/lib/relaton/oasis.rb +41 -0
  545. data/lib/relaton/ogc/bibdata.rb +8 -0
  546. data/lib/relaton/ogc/bibitem.rb +8 -0
  547. data/lib/relaton/ogc/bibliography.rb +64 -0
  548. data/lib/relaton/ogc/data_fetcher.rb +131 -0
  549. data/lib/relaton/ogc/docidentifier.rb +111 -0
  550. data/lib/relaton/ogc/doctype.rb +12 -0
  551. data/lib/relaton/ogc/ext.rb +15 -0
  552. data/lib/relaton/ogc/hit.rb +18 -0
  553. data/lib/relaton/ogc/hit_collection.rb +111 -0
  554. data/lib/relaton/ogc/item.rb +13 -0
  555. data/lib/relaton/ogc/item_data.rb +6 -0
  556. data/lib/relaton/ogc/processor.rb +59 -0
  557. data/lib/relaton/ogc/scraper.rb +225 -0
  558. data/lib/relaton/ogc/util.rb +8 -0
  559. data/lib/relaton/ogc.rb +30 -0
  560. data/lib/relaton/oiml/bibdata.rb +8 -0
  561. data/lib/relaton/oiml/bibitem.rb +8 -0
  562. data/lib/relaton/oiml/bibliography.rb +169 -0
  563. data/lib/relaton/oiml/docidentifier.rb +48 -0
  564. data/lib/relaton/oiml/doctype.rb +13 -0
  565. data/lib/relaton/oiml/ext.rb +42 -0
  566. data/lib/relaton/oiml/item.rb +20 -0
  567. data/lib/relaton/oiml/item_base.rb +18 -0
  568. data/lib/relaton/oiml/item_data.rb +6 -0
  569. data/lib/relaton/oiml/processor.rb +54 -0
  570. data/lib/relaton/oiml/relation.rb +9 -0
  571. data/lib/relaton/oiml/util.rb +8 -0
  572. data/lib/relaton/oiml.rb +24 -0
  573. data/lib/relaton/omg/bibdata.rb +8 -0
  574. data/lib/relaton/omg/bibitem.rb +8 -0
  575. data/lib/relaton/omg/bibliography.rb +31 -0
  576. data/lib/relaton/omg/docidentifier.rb +67 -0
  577. data/lib/relaton/omg/ext.rb +7 -0
  578. data/lib/relaton/omg/item.rb +9 -0
  579. data/lib/relaton/omg/item_data.rb +6 -0
  580. data/lib/relaton/omg/processor.rb +35 -0
  581. data/lib/relaton/omg/scraper.rb +186 -0
  582. data/lib/relaton/omg/util.rb +8 -0
  583. data/lib/relaton/omg.rb +25 -0
  584. data/lib/relaton/plateau/bibdata.rb +8 -0
  585. data/lib/relaton/plateau/bibitem.rb +8 -0
  586. data/lib/relaton/plateau/bibliography.rb +31 -0
  587. data/lib/relaton/plateau/data_fetcher.rb +176 -0
  588. data/lib/relaton/plateau/doctype.rb +7 -0
  589. data/lib/relaton/plateau/ext.rb +23 -0
  590. data/lib/relaton/plateau/handbook_parser.rb +102 -0
  591. data/lib/relaton/plateau/hit.rb +21 -0
  592. data/lib/relaton/plateau/hit_collection.rb +79 -0
  593. data/lib/relaton/plateau/item.rb +12 -0
  594. data/lib/relaton/plateau/item_data.rb +6 -0
  595. data/lib/relaton/plateau/parser.rb +101 -0
  596. data/lib/relaton/plateau/processor.rb +51 -0
  597. data/lib/relaton/plateau/technical_report_parser.rb +98 -0
  598. data/lib/relaton/plateau/util.rb +8 -0
  599. data/lib/relaton/plateau.rb +29 -0
  600. data/lib/relaton/sdo/config.rb +34 -0
  601. data/lib/relaton/sdo/fetcher.rb +52 -0
  602. data/lib/relaton/sdo/logo.rb +95 -0
  603. data/lib/relaton/sdo/name.rb +26 -0
  604. data/lib/relaton/sdo/organization.rb +71 -0
  605. data/lib/relaton/sdo/store.rb +49 -0
  606. data/lib/relaton/sdo.rb +29 -0
  607. data/lib/relaton/un/bibdata.rb +8 -0
  608. data/lib/relaton/un/bibitem.rb +8 -0
  609. data/lib/relaton/un/bibliography.rb +48 -0
  610. data/lib/relaton/un/doctype.rb +10 -0
  611. data/lib/relaton/un/ext.rb +30 -0
  612. data/lib/relaton/un/hit.rb +56 -0
  613. data/lib/relaton/un/hit_collection.rb +61 -0
  614. data/lib/relaton/un/item.rb +11 -0
  615. data/lib/relaton/un/item_data.rb +6 -0
  616. data/lib/relaton/un/parser.rb +108 -0
  617. data/lib/relaton/un/processor.rb +38 -0
  618. data/lib/relaton/un/session.rb +25 -0
  619. data/lib/relaton/un/token_generator.rb +105 -0
  620. data/lib/relaton/un/util.rb +8 -0
  621. data/lib/relaton/un/wasm/decoder.rb +434 -0
  622. data/lib/relaton/un/wasm/instance.rb +101 -0
  623. data/lib/relaton/un/wasm/interpreter.rb +613 -0
  624. data/lib/relaton/un/wasm/memory.rb +112 -0
  625. data/lib/relaton/un/wasm/module.rb +47 -0
  626. data/lib/relaton/un/wasm.rb +17 -0
  627. data/lib/relaton/un/wasm_v_bg.wasm +0 -0
  628. data/lib/relaton/un.rb +28 -0
  629. data/lib/relaton/version.rb +1 -1
  630. data/lib/relaton/w3c/bibdata.rb +8 -0
  631. data/lib/relaton/w3c/bibitem.rb +8 -0
  632. data/lib/relaton/w3c/bibliography.rb +174 -0
  633. data/lib/relaton/w3c/data_fetcher.rb +487 -0
  634. data/lib/relaton/w3c/data_parser.rb +379 -0
  635. data/lib/relaton/w3c/docidentifier.rb +48 -0
  636. data/lib/relaton/w3c/doctype.rb +7 -0
  637. data/lib/relaton/w3c/ext.rb +11 -0
  638. data/lib/relaton/w3c/governor.rb +32 -0
  639. data/lib/relaton/w3c/item.rb +15 -0
  640. data/lib/relaton/w3c/item_data.rb +6 -0
  641. data/lib/relaton/w3c/processor.rb +49 -0
  642. data/lib/relaton/w3c/pubid.rb +85 -0
  643. data/lib/relaton/w3c/safe_realize.rb +148 -0
  644. data/lib/relaton/w3c/util.rb +8 -0
  645. data/lib/relaton/w3c.rb +36 -0
  646. data/lib/relaton/xsf/bibdata.rb +8 -0
  647. data/lib/relaton/xsf/bibitem.rb +8 -0
  648. data/lib/relaton/xsf/bibliography.rb +84 -0
  649. data/lib/relaton/xsf/data_fetcher.rb +106 -0
  650. data/lib/relaton/xsf/docidentifier.rb +46 -0
  651. data/lib/relaton/xsf/hit.rb +17 -0
  652. data/lib/relaton/xsf/hit_collection.rb +52 -0
  653. data/lib/relaton/xsf/item.rb +13 -0
  654. data/lib/relaton/xsf/item_data.rb +6 -0
  655. data/lib/relaton/xsf/processor.rb +51 -0
  656. data/lib/relaton/xsf/util.rb +9 -0
  657. data/lib/relaton/xsf.rb +34 -0
  658. data/lib/relaton-core.rb +1 -0
  659. data/lib/relaton.rb +85 -0
  660. metadata +775 -161
  661. data/.github/workflows/rake.yml +0 -14
  662. data/.github/workflows/release.yml +0 -24
  663. data/.github/workflows/rubocop.yml +0 -48
  664. data/.gitignore +0 -12
  665. data/.rspec +0 -3
  666. data/CLAUDE.md +0 -78
  667. data/Gemfile +0 -29
  668. data/Rakefile +0 -6
  669. data/docs/CHANGELOG.adoc +0 -16
  670. data/docs/VERSIONING_POLICY.adoc +0 -38
  671. data/docs/navigation.adoc +0 -6
  672. data/lib/relaton/db/version.rb +0 -5
  673. data/relaton.gemspec +0 -72
  674. data/spec/relaton/config_spec.rb +0 -10
  675. data/spec/relaton/db_cache_spec.rb +0 -51
  676. data/spec/relaton/db_spec.rb +0 -567
  677. data/spec/relaton/registry_spec.rb +0 -178
  678. data/spec/relaton/util_spec.rb +0 -3
  679. data/spec/relaton_meta_spec.rb +0 -25
  680. data/spec/relaton_spec.rb +0 -800
  681. data/spec/spec_helper.rb +0 -45
  682. data/spec/support/gb_t_20223_2006.xml +0 -33
  683. data/spec/support/iso_111111119115_1.xml +0 -0
  684. data/spec/support/iso_19115_1.xml +0 -115
  685. data/spec/support/iso_19115_2.xml +0 -95
  686. data/spec/support/rfc_8341.xml +0 -46
  687. data/spec/vcr_cassetes/api_relaton_org.yml +0 -121
  688. data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +0 -140
  689. data/spec/vcr_cassetes/cc_dir_10005_2019.yml +0 -202
  690. data/spec/vcr_cassetes/cipm_meeting_43.yml +0 -1505
  691. data/spec/vcr_cassetes/gb_t_20223_2006.yml +0 -729
  692. data/spec/vcr_cassetes/iso_111111119115_1.yml +0 -12951
  693. data/spec/vcr_cassetes/iso_19115_1.yml +0 -17334
  694. data/spec/vcr_cassetes/iso_19115_1_2.yml +0 -322
  695. data/spec/vcr_cassetes/iso_19115_1_std.yml +0 -17334
  696. data/spec/vcr_cassetes/iso_19115_all_parts.yml +0 -185
  697. data/spec/vcr_cassetes/iso_19133_2005.yml +0 -144
  698. data/spec/vcr_cassetes/iso_combined_applied.yml +0 -318
  699. data/spec/vcr_cassetes/iso_combined_included.yml +0 -318
  700. data/spec/vcr_cassetes/ogc_19_025r1.yml +0 -374
  701. data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +0 -317
  702. data/spec/vcr_cassetes/rfc_8341.yml +0 -1278
@@ -0,0 +1,188 @@
1
+ require "nokogiri"
2
+
3
+ module Relaton::Bipm
4
+ class SiBrochureParser
5
+ #
6
+ # Create new parser
7
+ #
8
+ # @param [Relaton::Bipm::DataFetcher] data_fetcher data fetcher
9
+ #
10
+ def initialize(data_fetcher)
11
+ @data_fetcher = WeakRef.new data_fetcher
12
+ end
13
+
14
+ #
15
+ # Parse documents from SI brochure dataset and write thems to YAML files
16
+ #
17
+ # @param [Relaton::Bipm::DataFetcher] data_fetcher data fetcher
18
+ #
19
+ def self.parse(data_fetcher)
20
+ new(data_fetcher).parse
21
+ end
22
+
23
+ #
24
+ # Parse SI brochure and write them to YAML files
25
+ #
26
+ def parse # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
27
+ # metanorma site generate writes per-document outputs into a subdirectory
28
+ # named after the source path (e.g. _site/documents/si-brochure/3.01/
29
+ # si-brochure-en.rxl). The legacy top-level *.rxl glob is kept for
30
+ # backwards compatibility with any older flow that flattened outputs.
31
+ si_brochure_rxls.each do |f|
32
+ puts "Parsing #{f}"
33
+ xml = File.read(f, encoding: "UTF-8")
34
+ xml = xml.force_encoding("UTF-8") if xml.encoding != Encoding::UTF_8
35
+ item1 = Bibdata.from_xml(xml)
36
+ # Workaround for relaton-bib Version#content bug: whitespace between
37
+ # legacy <revision-date>/<draft> children gets captured as @content,
38
+ # blocking the legacy-fold path. Clear it so the getter recomputes.
39
+ item1.version.each do |v|
40
+ c = v.instance_variable_get(:@content)
41
+ next unless c.is_a?(Array) || (c.is_a?(String) && c.strip.empty?)
42
+ v.instance_variable_set(:@content, nil)
43
+ end
44
+ @data_fetcher.errors[:si_brochure_title] &&= item1.title.empty?
45
+ @data_fetcher.errors[:si_brochure_docidentifier] &&= item1.docidentifier.empty?
46
+ unless has_committee_contributor?(item1)
47
+ contribs = extract_editorialgroup(xml)
48
+ contribs.each { |c| item1.contributor << c }
49
+ end
50
+ fix_si_brochure_id item1
51
+ basename = File.join @data_fetcher.output, File.basename(f).sub(/(?:-(?:en|fr))?\.rxl$/, "")
52
+ outfile = "#{basename}.#{@data_fetcher.ext}"
53
+ # Index by the primary docidentifier content ("BIPM SI Brochure 9e
54
+ # v3.01 (2019/2024, E)"), which `Pubid::Bipm` parses — unlike the bare
55
+ # `docnumber` ("SI Brochure 9e …", no "BIPM" prefix), which it rejects.
56
+ key = primary_id(item1) || item1.docnumber || basename
57
+ @data_fetcher.add_to_index key, outfile
58
+ item =
59
+ if File.exist? outfile
60
+ warn_duplicate = false
61
+ item2 = Item.from_yaml File.read(outfile, encoding: "UTF-8")
62
+ fix_si_brochure_id item2
63
+ hash1 = YAML.safe_load item1.to_yaml
64
+ hash2 = YAML.safe_load item2.to_yaml
65
+ Item.from_yaml deep_merge(hash1, hash2).to_yaml
66
+ else
67
+ warn_duplicate = true
68
+ item1
69
+ end
70
+ @data_fetcher.write_file outfile, item, warn_duplicate: warn_duplicate
71
+ puts "Saved to #{outfile}"
72
+ end
73
+ end
74
+
75
+ #
76
+ # @return [Array<String>] paths to SI Brochure RXL files. Looks at the
77
+ # legacy flat layout first, then the metanorma-cli subdirectory layout
78
+ # (`<source_path_without_'sources'>/<doc>.rxl`) used by current
79
+ # `metanorma site generate` output.
80
+ #
81
+ def si_brochure_rxls
82
+ flat = Dir["bipm-si-brochure/_site/documents/*.rxl"]
83
+ return flat if flat.any?
84
+
85
+ Dir["bipm-si-brochure/_site/documents/**/si-brochure-{en,fr}.rxl"]
86
+ end
87
+
88
+ #
89
+ # Update ID of SI brochure
90
+ #
91
+ # @param [ItemData] item bibliographic item
92
+ #
93
+ # @return [void]
94
+ #
95
+ def fix_si_brochure_id(item)
96
+ # isbn = hash["docid"].detect { |id| id["type"] == "ISBN" }
97
+ # num = isbn && isbn["id"] == "978-92-822-2272-0" ? "SI Brochure" : "SI Brochure, Appendix 4"
98
+
99
+ update_id item
100
+
101
+ prid = primary_id item
102
+ if item.docnumber
103
+ item.docnumber.sub!(/^Brochure(?:\sConcise|\sFAQ)?$/i, prid.sub(/^BIPM\s/, ""))
104
+ else
105
+ item.docnumber = prid.sub(/^BIPM\s/, "")
106
+ end
107
+ item.id = prid.gsub(/[,\s-]/, "")
108
+ end
109
+
110
+ def update_id(item)
111
+ item.docidentifier.each do |id|
112
+ next unless id.type == "BIPM" && id.content&.match?(/BIPM Brochure/i)
113
+
114
+ id.primary = true
115
+ id.content.sub!(/(?<=^BIPM\s)(Brochure)/i, "SI \\1")
116
+ end
117
+ end
118
+
119
+ def primary_id(item)
120
+ item.docidentifier.detect do |id|
121
+ id.primary && (id.language == "en" || id.language.nil?)
122
+ end.content
123
+ end
124
+
125
+ def has_committee_contributor?(item)
126
+ item.contributor.any? do |c|
127
+ c.role.any? { |r| r.description.any? { |d| d.content == "committee" } }
128
+ end
129
+ end
130
+
131
+ def extract_editorialgroup(xml)
132
+ doc = Nokogiri::XML(xml)
133
+ doc.xpath("//editorialgroup/committee").map do |committee|
134
+ acronym = committee["acronym"]
135
+ names = committee.xpath("variant").map do |v|
136
+ Relaton::Bib::TypedLocalizedString.new(
137
+ content: v.text, language: v["language"], script: v["script"],
138
+ )
139
+ end
140
+ subdiv = Relaton::Bib::Subdivision.new(
141
+ type: "committee", name: names,
142
+ abbreviation: Relaton::Bib::LocalizedString.new(content: acronym),
143
+ )
144
+ bipm_name = [Relaton::Bib::TypedLocalizedString.new(content: acronym)]
145
+ org = Relaton::Bib::Organization.new(name: bipm_name, subdivision: [subdiv])
146
+ desc = Relaton::Bib::LocalizedMarkedUpString.new(content: "committee")
147
+ role = Relaton::Bib::Contributor::Role.new(type: "author", description: [desc])
148
+ Relaton::Bib::Contributor.new(organization: org, role: [role])
149
+ end
150
+ end
151
+
152
+ #
153
+ # Deep merge two hashes
154
+ #
155
+ # @param [Hash] hash1
156
+ # @param [Hash] hash2
157
+ #
158
+ # @return [Hash] Merged hash
159
+ #
160
+ def deep_merge(hash1, hash2) # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
161
+ hash1.merge(hash2) do |_, oldval, newval|
162
+ if oldval.is_a?(Hash) && newval.is_a?(Hash)
163
+ deep_merge(oldval, newval)
164
+ elsif oldval.is_a?(Array) && newval.is_a?(Array)
165
+ (oldval + newval).uniq { |i| downcase_all i }
166
+ else
167
+ newval || oldval
168
+ end
169
+ end
170
+ end
171
+
172
+ #
173
+ # Downcase all values in hash or array
174
+ #
175
+ # @param [Array, Hash, String] content hash, array or string
176
+ #
177
+ # @return [Array, Hash, String] hash, array or string with downcased values
178
+ #
179
+ def downcase_all(content)
180
+ case content
181
+ when Hash then content.transform_values { |v| downcase_all v }
182
+ when Array then content.map { |v| downcase_all v }
183
+ when String then content.downcase
184
+ else content
185
+ end
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Bipm
3
+ module Util
4
+ extend Bib::Util
5
+ PROGNAME = "relaton-bipm".freeze
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,38 @@
1
+ require "zip"
2
+ require "fileutils"
3
+ require "parslet"
4
+ require "relaton/bib"
5
+ require "relaton/index"
6
+ require "relaton/core"
7
+ require "pubid"
8
+ require_relative "version"
9
+ require_relative "bipm/util"
10
+ require_relative "bipm/id_parser"
11
+ require_relative "bipm/item_data"
12
+ require_relative "bipm/model/item"
13
+ require_relative "bipm/model/bibitem"
14
+ require_relative "bipm/model/bibdata"
15
+ require_relative "bipm/bibliography"
16
+
17
+ module Relaton
18
+ module Bipm
19
+ class Error < StandardError; end
20
+
21
+ # The runtime index is the pubid-backed `index-v2` (`_type: pubid:bipm:*`).
22
+ # The legacy bespoke `{group,type,number,year}` `index-v1` is still published
23
+ # by `relaton-data-bipm`'s crawler (using the retained `Relaton::Bipm::Id`),
24
+ # but this flavor no longer reads or writes it.
25
+ INDEXFILE = "index-v2".freeze
26
+
27
+ # Returns hash of gems versions used to generate the data model.
28
+ # @return [String]
29
+ def grammar_hash
30
+ # gem_path = File.expand_path "..", __dir__
31
+ # grammars_path = File.join gem_path, "grammars", "*"
32
+ # grammars = Dir[grammars_path].sort.map { |gp| File.read gp }.join
33
+ Digest::MD5.hexdigest Relaton::VERSION # grammars
34
+ end
35
+
36
+ extend self
37
+ end
38
+ end
@@ -0,0 +1,196 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton::Bsi
4
+ # Class methods for search ISO standards.
5
+ class Bibliography
6
+ # pubid identifier types referenced when navigating the parsed object graph.
7
+ Ids = ::Pubid::Bsi::Identifiers
8
+
9
+ class << self
10
+ # @param text [String]
11
+ # @return [Relaton::Bsi::HitCollection]
12
+ def search(text, year = nil)
13
+ code = text.sub(/^BSI\s/, "").sub(/ExComm|Expert commentary/, "Ex")
14
+ HitCollection.search(code, year)
15
+ rescue SocketError, Timeout::Error, Errno::EINVAL, Errno::ECONNRESET,
16
+ EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
17
+ Net::ProtocolError, Algolia::AlgoliaUnreachableHostError => e
18
+ raise Relaton::RequestError, e.message
19
+ end
20
+
21
+ #
22
+ # @param code [String] the BSI standard Code to look up
23
+ # @param year [String] the year the standard was published (optional)
24
+ # @param opts [Hash] options
25
+ # @option opts [Boolean] :all_parts if all-parts reference is required
26
+ # @option opts [Boolean] :no_year if last published document is required
27
+ #
28
+ # @return [String] Relaton XML serialisation of reference
29
+ def get(code, year = nil, opts = {})
30
+ year ||= publication_year(code)
31
+ ret = bib_get(code, year, opts)
32
+ return nil if ret.nil?
33
+
34
+ ret = ret.to_most_recent_reference unless year || opts[:keep_year]
35
+ ret
36
+ end
37
+
38
+ # Parse a BSI reference with pubid. An unrecognized reference raises;
39
+ # like ISO and 3GPP we let it propagate -- relaton-cli rescues
40
+ # Pubid::Errors::Error and renders "... is not a recognized standards
41
+ # identifier". A catalogue hit code is a different case: `Hit#pubid`
42
+ # rescues, because one odd Algolia row must not abort the search.
43
+ # @param [String] code document identifier
44
+ # @return [Pubid::Bsi::Identifier]
45
+ # @raise [Pubid::Errors::ParseError]
46
+ def parse(code)
47
+ ::Pubid::Bsi::Identifier.parse(code)
48
+ end
49
+
50
+ # Publication year of a reference's base document.
51
+ # @param [String] code document identifier
52
+ # @return [String, nil]
53
+ def publication_year(code)
54
+ year_of parse(code)
55
+ end
56
+
57
+ # Whether a query and a candidate hit denote the same BSI document, at the
58
+ # fuzziness the hit filter asks for. Built entirely on pubid: `base_document`
59
+ # peels supplements/wrappers, `matches?` compares ignoring the publication
60
+ # date, and the `Amendment`/`Corrigendum` `#supplement_type`, `#number` and
61
+ # `#year` supply the amendment type, number and year.
62
+ #
63
+ # @param query [Pubid::Bsi::Identifier]
64
+ # @param hit [Pubid::Bsi::Identifier]
65
+ # @param skip_rest [Boolean] ignore the free-text suffix (ExComm / Flex version)
66
+ # @param drop_amd [Boolean] reduce the hit to its base document before
67
+ # matching, so a query for the base document matches a catalogue entry
68
+ # that only exists in amended form (the returned id is de-amended too)
69
+ # @return [Boolean]
70
+ def same_reference?(query, hit, skip_rest: false, drop_amd: false)
71
+ hit = hit.base_document if drop_amd
72
+
73
+ base_match?(query, hit) &&
74
+ same_supplement?(supplement_of(query), supplement_of(hit)) &&
75
+ (skip_rest || rest_marker(query) == rest_marker(hit))
76
+ end
77
+
78
+ private
79
+
80
+ # The year of the dated document at the root of a reference. pubid holds
81
+ # an adopted standard (`BS EN ISO 8848:2021`) in `base`, so its
82
+ # `base_document.year` is nil; `#root` reaches the dated document for
83
+ # every form, on the pubid before that change and after it.
84
+ # @param id [Pubid::Bsi::Identifier, nil]
85
+ # @return [String, nil]
86
+ def year_of(id)
87
+ id&.root&.year&.to_s
88
+ end
89
+
90
+ # Same base document, ignoring the publication date. `:month` is excluded
91
+ # alongside `:date` because Flex identifiers store the month separately, so
92
+ # `exclude(:date)` alone leaves them unequal.
93
+ def base_match?(query, hit)
94
+ query.base_document.matches?(hit.base_document, ignore: %i[date month])
95
+ end
96
+
97
+ # The `Amendment`/`Corrigendum` supplement of a reference, if any — peeling
98
+ # an Expert-commentary wrapper first. Both supplements expose
99
+ # `#supplement_type`, `#number` and `#year`.
100
+ def supplement_of(id)
101
+ while id.is_a?(Ids::ExpertCommentary)
102
+ inner = id.base
103
+ break if inner.nil? || inner.equal?(id)
104
+
105
+ id = inner
106
+ end
107
+ return nil unless id.respond_to?(:identifiers) && id.identifiers
108
+
109
+ id.identifiers.find { |i| i.respond_to?(:supplement_type) }
110
+ end
111
+
112
+ # Same supplement, with the amendment year treated as optional when the
113
+ # query omits it (a query for "…+A2" matches a hit for "…+A2:2020").
114
+ def same_supplement?(query_supp, hit_supp)
115
+ return hit_supp.nil? if query_supp.nil?
116
+ return false if hit_supp.nil?
117
+
118
+ query_supp.supplement_type == hit_supp.supplement_type &&
119
+ supplement_number(query_supp) == supplement_number(hit_supp) &&
120
+ (supplement_year(query_supp).nil? ||
121
+ supplement_year(query_supp) == supplement_year(hit_supp))
122
+ end
123
+
124
+ # The number and the year of a supplement. pubid removes the
125
+ # `#supplement_number` / `#supplement_year` aliases and stores the values
126
+ # in `#number` / `#year`. An older pubid still answers the aliases and
127
+ # leaves `#number` / `#year` nil, so the alias wins while it exists.
128
+ # TODO: read `#number` / `#year` directly once pubid `main` has no alias.
129
+ def supplement_number(supp)
130
+ supp.respond_to?(:supplement_number) ? supp.supplement_number : supp.number
131
+ end
132
+
133
+ def supplement_year(supp)
134
+ supp.respond_to?(:supplement_year) ? supp.supplement_year : supp.year
135
+ end
136
+
137
+ # Canonical marker for the free-text suffix pubid parses into a typed
138
+ # wrapper (so an `ExComm` query matches an `Expert Commentary` hit).
139
+ def rest_marker(id)
140
+ return :expert_commentary if id.is_a?(Ids::ExpertCommentary)
141
+ return :"flex_#{id.edition}" if id.is_a?(Ids::Flex) && id.edition
142
+
143
+ nil
144
+ end
145
+
146
+ def fetch_ref_err(_code, year, missed_years)
147
+ unless missed_years.empty?
148
+ Util.info "There was no match for `#{year}`, though there " \
149
+ "were matches found for `#{missed_years.join('`, `')}`."
150
+ end
151
+ nil
152
+ end
153
+
154
+ #
155
+ # Search for a BSI standard.
156
+ #
157
+ # @param [String] code the BSI standard Code to look up
158
+ #
159
+ # @return [Relaton::Bsi::HitCollection] a collection of hits
160
+ #
161
+ def search_filter(code)
162
+ query = parse(code)
163
+ Util.info "Fetching from shop.bsigroup.com ...", key: code
164
+ search(code).filter_hits!(query)
165
+ end
166
+
167
+ # Sort through the results, and return the first result that matches the
168
+ # code and matches the year (if provided), and which has a title.
169
+ # If no match, returns any years which caused mismatch, for error reporting.
170
+ def results_filter(result, year)
171
+ missed_years = []
172
+ result.each do |r|
173
+ # The hit's own parse: a kept hit always parsed, and its base
174
+ # document's year is the same after a `drop_amd` rewrite.
175
+ pyear = year_of r.pubid
176
+ return { ret: r.item } if (!year || year == pyear) && r.item
177
+
178
+ missed_years << pyear
179
+ end
180
+ { years: missed_years }
181
+ end
182
+
183
+ def bib_get(code, year, _opts)
184
+ result = search_filter(code) || return
185
+ ret = results_filter(result, year)
186
+ if ret[:ret]
187
+ Util.info "Found: `#{ret[:ret].docidentifier.first&.content}`", key: code
188
+ ret[:ret]
189
+ else
190
+ Util.info "Not found", key: code
191
+ fetch_ref_err(code, year, ret[:years])
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton::Bsi
4
+ # Hit.
5
+ class Hit < Relaton::Core::Hit
6
+ attr_writer :fetch
7
+
8
+ # Parse page.
9
+ # @return [Relaton::Bsi::ItemData]
10
+ def item
11
+ @item ||= Scraper.parse_page self
12
+ end
13
+
14
+ # The hit's reference parsed with pubid, memoized so the (up to three) hit
15
+ # filter passes don't re-parse it. `nil` when pubid can't parse the code:
16
+ # the Algolia catalogue carries codes like `BS 381C SET:1996 (R2002)`, and
17
+ # one such row must not abort the search. (A malformed *query* raises; see
18
+ # `Bibliography.parse`.)
19
+ # @return [Pubid::Bsi::Identifier, nil]
20
+ def pubid
21
+ return @pubid if defined?(@pubid)
22
+
23
+ @pubid = Bibliography.parse(hit[:code])
24
+ rescue StandardError
25
+ @pubid = nil
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "algolia"
4
+ require_relative "hit"
5
+
6
+ module Relaton::Bsi
7
+ # Page of hit collection.
8
+ class HitCollection < Relaton::Core::HitCollection
9
+ DOMAIN = "https://shop.bsigroup.com"
10
+
11
+ #
12
+ # Initialize a new HitCollection object and perform search.
13
+ #
14
+ # @param ref [String] reference
15
+ # @param year [String] year
16
+ #
17
+ # @return [Relaton::Bsi::HitCollection] hit collection
18
+ #
19
+ def self.search(ref, year = nil)
20
+ new(ref, year).search
21
+ end
22
+
23
+ #
24
+ # Perform search.
25
+ # @return [self] hit collection
26
+ def search
27
+ resp = algolia_index.search ref # , facetFilters: "product_type:standard"
28
+ @array = create_hits resp[:hits]
29
+ self
30
+ end
31
+
32
+ #
33
+ # Algolia index.
34
+ #
35
+ # @return [Algolia::Search::Index] Algolia index
36
+ #
37
+
38
+ def algolia_index
39
+ @algolia_index ||= begin
40
+ config = Algolia::Search::Config.new(
41
+ application_id: "575YE157G9",
42
+ api_key: "a057b4e74099445df2eddb7940828a10",
43
+ )
44
+ client = Algolia::Search::Client.new config, logger: ::Logger.new($stderr)
45
+ client.init_index "shopify_products"
46
+ end
47
+ end
48
+
49
+ #
50
+ # Filter the search results for a BSI standard.
51
+ #
52
+ # @param [Pubid::Bsi::Identifier] query the parsed query reference
53
+ #
54
+ # @return [self] filtered search results
55
+ #
56
+ def filter_hits!(query)
57
+ hits = filter query
58
+ hits = filter query, skip_rest: true if hits.empty?
59
+ hits = filter query, drop_amd: true if hits.empty?
60
+ @array = hits
61
+ self
62
+ end
63
+
64
+ private
65
+
66
+ #
67
+ # Create hits from search results.
68
+ #
69
+ # @param hits [Array<Hash>] search results
70
+ #
71
+ # @return [Array<Relaton::Bsi::Hit>] hits
72
+ #
73
+ def create_hits(hits) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
74
+ hits.each_with_object([]) do |h, obj|
75
+ next unless h[:meta][:global][:publishedDate]
76
+
77
+ code = h[:meta][:global][:primaryDesignator]
78
+ code = code.is_a?(Array) ? code.first : code
79
+ code.sub!(/\s?(?:LOOSELEAF|\(A5 LAMINATED\)|-\s?TC$)/, "")
80
+ obj << Hit.new(
81
+ {
82
+ code: code,
83
+ title: h[:title],
84
+ url: h[:handle],
85
+ date: h[:meta][:global][:publishedDate],
86
+ publisher: h[:meta][:global][:publisher],
87
+ status: h[:meta][:global][:status],
88
+ ics: h[:meta][:global][:icsCodesAlgoliaStringArray],
89
+ doctype: h[:product_type],
90
+ }, self
91
+ )
92
+ end.sort_by { |h| h.hit[:date] }.reverse
93
+ end
94
+
95
+ #
96
+ # Select hits that match the query reference.
97
+ #
98
+ # @param [Pubid::Bsi::Identifier] query the parsed query reference
99
+ # @param [Boolean] drop_amd match base documents only (ignore supplements)
100
+ # @param [Boolean] skip_rest ignore the free-text suffix (ExComm / Flex version)
101
+ #
102
+ def filter(query, drop_amd: false, skip_rest: false)
103
+ @array.select do |i|
104
+ hit = i.pubid or next false
105
+ match = Bibliography.same_reference?(query, hit, skip_rest: skip_rest, drop_amd: drop_amd)
106
+ # When matching base documents only, drop the amendment from the hit's
107
+ # rendered id too, so the returned reference is the base document.
108
+ i.hit[:code] = hit.base_document.to_s if drop_amd && match
109
+ match
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,13 @@
1
+ module Relaton
2
+ module Bsi
3
+ class ItemData < Iso::ItemData
4
+ def create_id(without_date: false)
5
+ docid = docidentifier.find(&:primary) || docidentifier.first
6
+ return unless docid
7
+
8
+ id_content = without_date ? docid.content.sub(/:\d{4}$/, "") : docid.content
9
+ self.id = id_content.gsub(/\W+/, "")
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Bsi
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 Bsi
3
+ class Bibitem < Item
4
+ model ItemData
5
+ include Bib::BibitemShared
6
+ end
7
+ end
8
+ end