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,619 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Iso
5
+ # Scrapper.
6
+ class Scraper # rubocop:disable Metrics/ModuleLength
7
+ DOMAIN = "https://www.iso.org"
8
+
9
+ TYPES = {
10
+ "TS" => "technical-specification",
11
+ "DTS" => "technical-specification",
12
+ "TR" => "technical-report",
13
+ "DTR" => "technical-report",
14
+ "PAS" => "publicly-available-specification",
15
+ # "AWI" => "approvedWorkItem",
16
+ # "CD" => "committeeDraft",
17
+ # "FDIS" => "finalDraftInternationalStandard",
18
+ # "NP" => "newProposal",
19
+ # "DIS" => "draftInternationalStandard",
20
+ # "WD" => "workingDraft",
21
+ # "R" => "recommendation",
22
+ "Guide" => "guide",
23
+ "ISO" => "international-standard",
24
+ "IEC" => "international-standard",
25
+ "IWA" => "international-workshop-agreement",
26
+ }.freeze
27
+
28
+ STGABBR = {
29
+ "00" => "NWIP",
30
+ "10" => "AWI",
31
+ "20" => "WD",
32
+ "30" => "CD",
33
+ "40" => "DIS",
34
+ "50" => "FDIS",
35
+ "60" => { "00" => "PRF", "60" => "FINAL" },
36
+ }.freeze
37
+
38
+ PUBLISHERS = {
39
+ "IEC" => { name: "International Electrotechnical Commission", uri: "www.iec.ch" },
40
+ "ISO" => { name: "International Organization for Standardization", uri: "www.iso.org" },
41
+ "IEEE" => { name: "Institute of Electrical and Electronics Engineers", uri: "www.ieee.org" },
42
+ "SAE" => { name: "SAE International", uri: "www.sae.org" },
43
+ "CIE" => { name: " International Commission on Illumination", uri: "cie.co.at" },
44
+ "ASME" => { name: "American Society of Mechanical Engineers", uri: "www.asme.org" },
45
+ }.freeze
46
+
47
+ # extend self
48
+
49
+ def initialize(lang, errors)
50
+ @lang = lang
51
+ @errors = errors
52
+ end
53
+
54
+ # Parse page.
55
+ # @param path [String] page path
56
+ # @param lang [String, nil] language
57
+ # @param errors [Hash] collection of parsing errors
58
+ # @return [RelatonIsoBib::IsoBibliographicItem]
59
+ def self.parse_page(path, lang: nil, errors: {})
60
+ new(lang, errors).parse(path)
61
+ end
62
+
63
+ def parse(path) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
64
+ @doc, @url = get_page path
65
+ titles, abstract, langs = fetch_titles_abstract
66
+
67
+ contributors = fetch_contributors
68
+ eg_contributor = fetch_editorialgroup_contributor
69
+ contributors << eg_contributor if eg_contributor
70
+
71
+ ItemData.new(
72
+ id: id.gsub(/[^\w]/, ""),
73
+ # fetched: Date.today.to_s,
74
+ type: "standard",
75
+ docidentifier: fetch_relaton_docids,
76
+ docnumber: fetch_docnumber,
77
+ edition: edition,
78
+ language: langs.map { |l| l[:lang] },
79
+ script: langs.map { |l| script(l[:lang]) }.uniq,
80
+ title: titles,
81
+ status: fetch_status,
82
+ ics: fetch_ics,
83
+ date: fetch_dates,
84
+ contributor: contributors,
85
+ abstract: abstract,
86
+ copyright: fetch_copyright,
87
+ source: fetch_source(@url),
88
+ relation: fetch_relations,
89
+ place: [Bib::Place.new(city: "Geneva")],
90
+ structuredidentifier: fetch_structuredidentifier,
91
+ ext: parse_ext,
92
+ )
93
+ end
94
+
95
+ def id
96
+ return @id if defined?(@id)
97
+
98
+ did = @doc.at("//h1/span[1]")
99
+ @errors[:id] &&= did.nil?
100
+ @id = did && did.text.split(" | ").first.strip
101
+ end
102
+
103
+ def pubid # rubocop:disable Metrics/AbcSize
104
+ return @pubid if @pubid
105
+
106
+ @pubid = ::Pubid::Iso::Identifier.parse(id)
107
+ @pubid.root.edition ||= edition.content if @pubid.base_identifier
108
+ @pubid
109
+ rescue StandardError => e
110
+ Util.error "Failed to parse pubid from #{id}: #{e.message}"
111
+ end
112
+
113
+ def urn
114
+ pubid.with_harmonized_stage(stage_code)
115
+ end
116
+
117
+ def edition
118
+ return @edition if defined?(@edition)
119
+
120
+ ed = @doc.at("//div[div[.='Edition']]/text()[last()]")
121
+ @errors[:edition] &&= ed.nil?
122
+ @edition = ed && Bib::Edition.new(content: ed.text.match(/\d+$/).to_s)
123
+ end
124
+
125
+ #
126
+ # Create document ids.
127
+ #
128
+ # @return [Array<RelatonBib::DocumentIdentifier>]
129
+ #
130
+ def fetch_relaton_docids
131
+ [
132
+ Docidentifier.new(content: pubid, type: "ISO", primary: true),
133
+ Docidentifier.new(content: isoref, type: "iso-reference"),
134
+ Docidentifier.new(content: urn, type: "URN"),
135
+ ]
136
+ end
137
+
138
+ #
139
+ # Create ISO reference identifier with English language.
140
+ #
141
+ # @return [String] English reference identifier
142
+ #
143
+ def isoref
144
+ pubid.dup.tap do |id|
145
+ id.languages = [::Pubid::Components::Language.new(code: "en", original_code: "E")]
146
+ end.to_s
147
+ end
148
+
149
+ private
150
+
151
+ # Fetch titles and abstracts.
152
+ # @return [Array<Array>]
153
+ def fetch_titles_abstract # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
154
+ titles = [] # RelatonBib::TypedTitleStringCollection.new
155
+ abstract = []
156
+ langs = languages.each_with_object([]) do |l, s|
157
+ # Don't need to get page for en. We already have it.
158
+ d = l[:path] ? get_page(l[:path])[0] : @doc
159
+ unless d.at("//h5[@class='help-block'][.='недоступно на русском языке']")
160
+ s << l
161
+ titles += fetch_title(d, l[:lang])
162
+
163
+ abstr = parse_abstract(d, l[:lang])
164
+ abstract << abstr if abstr
165
+ end
166
+ end
167
+ [titles, abstract, langs]
168
+ end
169
+
170
+ def parse_abstract(doc, lang)
171
+ abstract_content = doc.xpath(
172
+ "//div[@itemprop='description']/p|//div[@itemprop='description']/ul/li",
173
+ ).map { |a| a.name == "li" ? "- #{a.text}" : a.text }.reject(&:empty?).join("\n")
174
+ @errors[:abstract] &&= abstract_content.empty?
175
+ return if abstract_content.empty?
176
+
177
+ Bib::Abstract.new(content: abstract_content, language: lang, script: script(lang))
178
+ end
179
+
180
+ # Returns available languages.
181
+ # @return [Array<Hash>]
182
+ def languages
183
+ lgs = [{ lang: "en" }]
184
+ @doc.css("li#lang-switcher ul li a").each do |lang_link|
185
+ lang_path = lang_link.attr("href")
186
+ l = lang_path.match(%r{^/(fr)/})
187
+ lgs << { lang: l[1], path: lang_path } if l && (!@lang || l[1] != @lang)
188
+ end
189
+ @errors[:language] &&= lgs.size == 1
190
+ lgs
191
+ end
192
+
193
+ # Get page.
194
+ # @param path [String] page's path
195
+ # @return [Array<Nokogiri::HTML::Document, String>]
196
+ def get_page(path) # rubocop:disable Metrics/MethodLength
197
+ try = 0
198
+ begin
199
+ resp, uri = get_redirection path
200
+ doc = try_if_fail resp, uri
201
+ [doc, uri.to_s]
202
+ rescue SocketError, Timeout::Error, Errno::EINVAL, Errno::ECONNRESET,
203
+ EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
204
+ Net::ProtocolError, Errno::ETIMEDOUT
205
+ try += 1
206
+ raise Relaton::RequestError, "Could not access #{DOMAIN}#{path}" if try > 3
207
+
208
+ sleep 1
209
+ retry
210
+ end
211
+ end
212
+
213
+ #
214
+ # Get the page from the given path. If the page is redirected, get the
215
+ # page from the new path.
216
+ #
217
+ # @param [String] path path to the page
218
+ #
219
+ # @return [Array<Net::HTTPOK, URI>] HTTP response and URI
220
+ # @raise [RelatonBib::RequestError] if the page is not found
221
+ #
222
+ def get_redirection(path) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
223
+ uri = URI(DOMAIN + path)
224
+ try = 0
225
+ begin
226
+ get_response uri
227
+ rescue Errno::EPIPE => e
228
+ try += 1
229
+ retry if check_try try, uri
230
+ raise e
231
+ end
232
+ end
233
+
234
+ def check_try(try, uri)
235
+ if try < 3
236
+ warn "Timeout fetching #{uri}, retrying..."
237
+ sleep 1
238
+ true
239
+ end
240
+ end
241
+
242
+ def get_response(uri, try = 0)
243
+ raise Relaton::RequestError, "#{uri} not found." if try > 3
244
+
245
+ resp = Net::HTTP.get_response(uri)
246
+ case resp.code
247
+ when "200" then [resp, uri]
248
+ when "301" then get_redirection(resp["location"])
249
+ when "404" then raise Relaton::RequestError, "#{uri} not found."
250
+ else
251
+ sleep (2**try)
252
+ get_response uri, try + 1
253
+ end
254
+ end
255
+
256
+ #
257
+ # The iso.org site fails to respond sometimes. This method tries to get
258
+ # the response again.
259
+ #
260
+ # @param [Net::HTTPOK] resp HTTP response
261
+ # @param [URI::HTTPS] uri URI of the page
262
+ #
263
+ # @return [Nokogiri::HTML4::Document] document
264
+ # @raise [Relaton::RequestError] if the page could not be parsed
265
+ #
266
+ def try_if_fail(resp, uri)
267
+ 10.times do
268
+ doc = Nokogiri::HTML(resp.body)
269
+ # stop trying if page has a document id
270
+ return doc if item_ref(doc)
271
+
272
+ resp = Net::HTTP.get_response(uri)
273
+ end
274
+ raise Relaton::RequestError, "Could not parse the page #{uri}"
275
+ end
276
+
277
+ #
278
+ # Generate docnumber.
279
+ #
280
+ # @return [String] docnumber
281
+ #
282
+ def fetch_docnumber
283
+ pubid.to_s.match(/\d+/)&.to_s
284
+ end
285
+
286
+ #
287
+ # Parse structuredidentifier.
288
+ #
289
+ # @return [RelatonBib::StructuredIdentifier] structured identifier
290
+ #
291
+ def fetch_structuredidentifier # rubocop:disable Metrics/MethodLength
292
+ pnum = ProjectNumber.new content: File.basename(@url, ".*")
293
+ StructuredIdentifier.new(project_number: pnum, type: pubid.root.publisher)
294
+ end
295
+
296
+ #
297
+ # Parse ID from the document.
298
+ #
299
+ # @param [Nokogiri::HTML::Document] doc document to parse
300
+ #
301
+ # @return [String, nil] ID
302
+ #
303
+ def item_ref(doc)
304
+ ref = doc.at("//main//section/div/div/div//h1/span[1]")
305
+ @errors[:reference] &&= ref.nil?
306
+ ref&.text&.strip
307
+ end
308
+
309
+ # Fetch status.
310
+ # @return [RelatonBib::DocumentStatus]
311
+ def fetch_status
312
+ stg, sbstg = stage_code.split "."
313
+ stage = Bib::Status::Stage.new content: stg
314
+ substage = Bib::Status::Stage.new content: sbstg if sbstg
315
+ Bib::Status.new(stage: stage, substage: substage)
316
+ end
317
+
318
+ def stage_code
319
+ return @stage_code if defined?(@stage_code)
320
+
321
+ stc = @doc.at("//ul[@class='dropdown-menu']/li[@class='active']/a/span[@class='stage-code']")
322
+ @errors[:stage] &&= stc.nil?
323
+ @stage_code = stc&.text
324
+ end
325
+
326
+ # def stage(stg, substg)
327
+ # abbr = STGABBR[stg].is_a?(Hash) ? STGABBR[stg][substg] : STGABBR[stg]
328
+ # RelatonBib::DocumentStatus::Stage.new value: stg, abbreviation: abbr
329
+ # end
330
+
331
+ # Fetch relations.
332
+ # @return [Array<Hash>]
333
+ def fetch_relations
334
+ types = ["Now", "Now under review"]
335
+ rels = @doc.xpath(
336
+ "//ul[@class='steps']/li", "//div[contains(@class, 'sub-step')]"
337
+ ).reduce([]) do |a, r|
338
+ type, date = relation_type(r.at("h4", "h5").text.strip)
339
+ next a if types.include?(type)
340
+
341
+ a + create_relations(r, type, date)
342
+ end
343
+ @errors[:relation] &&= rels.empty?
344
+ rels
345
+ end
346
+
347
+ #
348
+ # Parse relation type and dates.
349
+ #
350
+ # @param [String] type parsed type
351
+ #
352
+ # @return [Array<String,Array>] type and dates
353
+ #
354
+ def relation_type(type)
355
+ date = []
356
+ t = case type.strip
357
+ when "Previously", "Will be replaced by" then "obsoletes"
358
+ when /Corrigenda|Amendments|Revised by|Now confirmed|replaced by/
359
+ at = @doc.xpath('//span[@class="stage-date"][contains(., "-")]').last
360
+ date << Bib::Date.new(type: "circulated", at: at.text) if at
361
+ "updates"
362
+ else type
363
+ end
364
+ [t, date]
365
+ end
366
+
367
+ #
368
+ # Create relations.
369
+ #
370
+ # @param [Nokogiri::HTML::Element] rel relation element
371
+ # @param [String] type relation type
372
+ # @param [Hash{Symbol=>String}] date relation document date
373
+ # @option date [String] :type date type
374
+ # @option date [String] :on date
375
+ #
376
+ # @return [Array<Hash>] Relations
377
+ #
378
+ def create_relations(rel, type, date)
379
+ rel.css("a").map do |rid|
380
+ docid = Docidentifier.new(type: "ISO", content: rid.text, primary: true)
381
+ bibitem = ItemData.new(docidentifier: [docid], formattedref: Bib::Formattedref.new(content: rid.text), date: date)
382
+ Relation.new type: type, bibitem: bibitem
383
+ end
384
+ end
385
+
386
+ # Fetch titles.
387
+ # @param doc [Nokogiri::HTML::Document]
388
+ # @param lang [String]
389
+ # @return [Array<RelatonBib::TypedTitleString>]
390
+ def fetch_title(doc, lang) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
391
+ types = %w[title-intro title-main title-part]
392
+ ttls = parse_titles(doc)
393
+ title = [] # RelatonBib::TypedTitleStringCollection.new
394
+ ttls.each.with_index do |p, i|
395
+ next unless p
396
+
397
+ title << Bib::Title.new(type: types[i], content: p, language: lang, script: script(lang))
398
+ end.compact
399
+ main = title.map(&:content).join " - "
400
+ title << Bib::Title.new(type: "main", content: main, language: lang, script: script(lang))
401
+ end
402
+
403
+ def parse_titles(doc)
404
+ # head = doc.at "//nav[contains(@class,'heading-condensed')]"
405
+ ttls = doc.xpath("//h1[@class='stdTitle']/span[position()>1]").map(&:text)
406
+ return ttls if @errors[:title] &&= ttls.empty?
407
+
408
+ ttls[0, 1] = ttls[0].split(/\s(?:-|\u2014)\s/) # if ttls.size == 1
409
+ case ttls.size
410
+ when 0, 1 then [nil, ttls.first, nil]
411
+ else intro_or_part ttls
412
+ end
413
+ end
414
+
415
+ # @param ttls [Array<String>]
416
+ # @return [Array<String, nil>]
417
+ def intro_or_part(ttls)
418
+ if /^(Part|Partie) \d+:/.match? ttls[1]
419
+ [nil, ttls[0], ttls[1..].join(" -- ")]
420
+ else
421
+ parts = ttls.slice(2..-1)
422
+ part = parts.join " -- " if parts.any?
423
+ [ttls[0], ttls[1], part]
424
+ end
425
+ end
426
+
427
+ # Return ISO script code.
428
+ # @param lang [String]
429
+ # @return [String]
430
+ def script(lang)
431
+ case lang
432
+ when "en", "fr" then "Latn"
433
+ when "ru" then "Cyrl"
434
+ end
435
+ end
436
+
437
+ # Fetch dates
438
+ # @return [Array<Hash>]
439
+ def fetch_dates # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
440
+ dates = []
441
+ %r{^[^\s]+\s[\d-]+:(?<ref_date_str>\d{4})} =~ id
442
+ pub_date_str = @doc.at("//span[@itemprop='releaseDate']")
443
+ @errors[:date_pub] &&= pub_date_str.nil?
444
+ if ref_date_str
445
+ dates += parse_date_from_id ref_date_str, pub_date_str
446
+ elsif pub_date_str
447
+ dates << Bib::Date.new(type: "published", at: pub_date_str.text)
448
+ end
449
+ corr_data = @doc.at "//span[@itemprop='dateModified']"
450
+ @errors[:date_corr] &&= corr_data.nil?
451
+ dates << Bib::Date.new(type: "corrected", at: corr_data.text) if corr_data
452
+ dates
453
+ end
454
+
455
+ def parse_date_from_id(ref_date_str, pub_date_str) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
456
+ dates = []
457
+ ref_date = ::Date.strptime ref_date_str, "%Y"
458
+ if pub_date_str.nil?
459
+ dates << Bib::Date.new(type: "published", at: ref_date_str)
460
+ else
461
+ pub_date = ::Date.strptime pub_date_str.text, "%Y"
462
+ if pub_date.year > ref_date.year
463
+ dates << Bib::Date.new(type: "published", at: ref_date_str)
464
+ dates << Bib::Date.new(type: "updated", at: pub_date_str.text)
465
+ else
466
+ dates << Bib::Date.new(type: "published", at: pub_date_str.text)
467
+ end
468
+ end
469
+ dates
470
+ end
471
+
472
+ def fetch_contributors # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
473
+ id.sub(/\s.*/, "").split("/").reduce([]) do |mem, abbrev|
474
+ publisher = PUBLISHERS[abbrev]
475
+ next mem unless publisher
476
+
477
+ role = Bib::Contributor::Role.new(type: "publisher")
478
+ publisher[:abbreviation] = abbrev
479
+ name = Bib::TypedLocalizedString.new content: publisher[:name]
480
+ abbrev = Bib::LocalizedString.new content: publisher[:abbreviation] if publisher[:abbreviation]
481
+ uri = Bib::Uri.new(content: publisher[:uri]) if publisher[:uri]
482
+ org = Bib::Organization.new(name: [name], abbreviation: abbrev, uri: [uri])
483
+ mem << Bib::Contributor.new(organization: org, role: [role])
484
+ end
485
+ end
486
+
487
+ # Fetch ICS.
488
+ # @return [Array<Hash>]
489
+ def fetch_ics
490
+ ics = @doc.xpath("//div[contains(., 'ICS')]/following-sibling::span/a").map do |i|
491
+ code = i.text.match(/[\d.]+/).to_s # .split "."
492
+ # { field: code[0], group: code[1], subgroup: code[2] }
493
+ isoics = Isoics.fetch code
494
+ Bib::ICS.new code: code, text: isoics.description
495
+ end
496
+ @errors[:ics] &&= ics.empty?
497
+ ics
498
+ end
499
+
500
+ #
501
+ # Fetch source.
502
+ #
503
+ # @param url [String] document url
504
+ #
505
+ # @return [Array<Hash>]
506
+ #
507
+ def fetch_source(url) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength
508
+ source = [Bib::Uri.new(type: "src", content: url)]
509
+ obp = @doc.at("//a[.='Read sample']")
510
+ @errors[:link_obp] &&= obp.nil?
511
+ source << Bib::Uri.new(type: "obp", content: obp[:href]) if obp
512
+ rss = @doc.at("//a[contains(@href, 'rss')]")
513
+ @errors[:link_rss] &&= rss.nil?
514
+ source << Bib::Uri.new(type: "rss", content: DOMAIN + rss[:href]) if rss
515
+ pub = @doc.at "//p[contains(., 'publicly available')]/a",
516
+ "//p[contains(., 'can be downloaded from the')]/a"
517
+ @errors[:link_pub] &&= pub.nil?
518
+ source << Bib::Uri.new(type: "pub", content: pub[:href]) if pub
519
+ source
520
+ end
521
+
522
+ # Fetch copyright.
523
+ # @return [Array<Hash>]
524
+ def fetch_copyright # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
525
+ ref = item_ref @doc
526
+ owner_name = ref.match(/.*?(?=\s)/).to_s
527
+ from = ref.match(/(?<=:)\d{4}/).to_s
528
+ if from.empty?
529
+ date = @doc.at(
530
+ "//span[@itemprop='releaseDate']",
531
+ "//ul[@id='stages']/li[contains(@class,'active')]/ul/li[@class='active']/a/span[@class='stage-date']",
532
+ )
533
+ from = date.text.match(/\d{4}/).to_s
534
+ end
535
+ name = Bib::TypedLocalizedString.new content: owner_name
536
+ org = Bib::Organization.new name: [name]
537
+ contrib = Bib::ContributionInfo.new organization: org
538
+ [Bib::Copyright.new(owner: [contrib], from: from)]
539
+ end
540
+
541
+ def parse_ext
542
+ Ext.new(
543
+ doctype: fetch_type,
544
+ flavor: "iso",
545
+ ics: fetch_ics,
546
+ structuredidentifier: fetch_structuredidentifier,
547
+ stagename: nil,
548
+ updates_document_type: nil,
549
+ fast_track: nil,
550
+ price_code: nil,
551
+ )
552
+ end
553
+
554
+ # Fetch type.
555
+ # @return [String]
556
+ def fetch_type
557
+ %r{
558
+ ^(?<prefix>ISO|IWA|IEC)
559
+ (?:(?:/CIE|/IEC|/IEEE|/PRF|/NP|/SAE|/HL7|/DGuide)*\s|/)
560
+ (?<type>TS|TR|PAS|AWI|CD|FDIS|NP|DIS|WD|R|DTS|DTR|ISP|PWI|Guide|(?=\d+))
561
+ }x =~ id
562
+ type = TYPES[type] || TYPES[prefix] || "international-standard"
563
+ Doctype.new(content: type)
564
+ end
565
+
566
+ #
567
+ # Fetch editorialgroup as a contributor with subdivision.
568
+ #
569
+ # @return [Relaton::Bib::Contributor, nil]
570
+ #
571
+ def fetch_editorialgroup_contributor # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
572
+ wg = @doc.at(
573
+ "//div[contains(., 'Technical Committe')]" \
574
+ "/following-sibling::span/a",
575
+ )
576
+ @errors[:editorialgroup] &&= wg.nil?
577
+ return unless wg
578
+
579
+ workgroup = wg.text.split "/"
580
+ prefix = workgroup[0]
581
+ type = workgroup[1]&.match(/^[A-Z]+/)&.to_s || "TC"
582
+ tc_name = wg[:title]
583
+
584
+ publisher = PUBLISHERS[prefix]
585
+ name = if publisher
586
+ [Bib::TypedLocalizedString.new(content: publisher[:name])]
587
+ elsif prefix
588
+ [Bib::TypedLocalizedString.new(content: prefix)]
589
+ else
590
+ []
591
+ end
592
+ abbreviation = if prefix
593
+ Bib::LocalizedString.new(content: prefix)
594
+ end
595
+
596
+ subdivision = Bib::Subdivision.new(
597
+ type: "technical-committee",
598
+ subtype: type,
599
+ name: [Bib::TypedLocalizedString.new(content: tc_name)],
600
+ identifier: [Bib::OrganizationType::Identifier.new(
601
+ content: wg.text,
602
+ )],
603
+ )
604
+
605
+ role = Bib::Contributor::Role.new(
606
+ type: "author",
607
+ description: [Bib::LocalizedMarkedUpString.new(content: "committee")],
608
+ )
609
+
610
+ Bib::Contributor.new(
611
+ role: [role],
612
+ organization: Bib::Organization.new(
613
+ name: name, subdivision: [subdivision], abbreviation: abbreviation,
614
+ ),
615
+ )
616
+ end
617
+ end
618
+ end
619
+ end
@@ -0,0 +1,50 @@
1
+ module Relaton
2
+ module Iso
3
+ module Type
4
+ # Lutaml-model attribute type that preserves `Pubid::Iso::Identifier`
5
+ # instances on the way in and stringifies them on the way out.
6
+ #
7
+ # The default `:string` type calls `.to_s` during `cast`, which loses the
8
+ # parsed structure and forces `Docidentifier#content=` to re-parse the
9
+ # human-readable form. That round-trip can render dual-type strings
10
+ # (e.g. `"ISO/IS TR 17"` from a TR pubid with stage 60.60) that the
11
+ # pubid-iso parslet grammar can't capture cleanly, producing
12
+ # `Duplicate subtrees while merging result of ROOT` warnings.
13
+ class Pubid < Lutaml::Model::Type::Value
14
+ def self.cast(value, _options = {})
15
+ return nil if value.nil?
16
+ return value if Lutaml::Model::Utils.uninitialized?(value)
17
+
18
+ value
19
+ end
20
+
21
+ def self.serialize(value)
22
+ return nil if value.nil?
23
+ return value if Lutaml::Model::Utils.uninitialized?(value)
24
+
25
+ value.to_s
26
+ end
27
+
28
+ def to_s
29
+ value.to_s
30
+ end
31
+
32
+ def to_yaml
33
+ value.to_s
34
+ end
35
+
36
+ def to_xml
37
+ value.to_s
38
+ end
39
+
40
+ def to_json(*_args)
41
+ value.to_s
42
+ end
43
+
44
+ def self.default_xsd_type
45
+ "xs:string"
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,8 @@
1
+ module Relaton
2
+ module Iso
3
+ module Util
4
+ extend Relaton::Bib::Util
5
+ PROGNAME = "relaton-iso".freeze
6
+ end
7
+ end
8
+ end