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,635 @@
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
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
+ primary = Docidentifier.new(content: pubid, type: "ISO", primary: true)
132
+ [
133
+ primary,
134
+ undated_docid(primary),
135
+ Docidentifier.new(content: isoref, type: "iso-reference"),
136
+ Docidentifier.new(content: urn, type: "URN"),
137
+ ].compact
138
+ end
139
+
140
+ #
141
+ # Create the undated reference docid (e.g. `ISO 123` from `ISO 123:2001`).
142
+ # Returns nil for an already-undated identifier so it does not duplicate
143
+ # the primary.
144
+ #
145
+ # @return [Relaton::Iso::Docidentifier, nil]
146
+ #
147
+ def undated_docid(primary)
148
+ undated = Docidentifier.new(content: pubid, type: "iso-undated")
149
+ undated unless undated.to_s == primary.to_s
150
+ rescue StandardError
151
+ nil
152
+ end
153
+
154
+ #
155
+ # Create ISO reference identifier with English language.
156
+ #
157
+ # @return [String] English reference identifier
158
+ #
159
+ def isoref
160
+ pubid.dup.tap do |id|
161
+ id.languages = [::Pubid::Components::Language.new(code: "en", original_code: "E")]
162
+ end.to_s
163
+ end
164
+
165
+ private
166
+
167
+ # Fetch titles and abstracts.
168
+ # @return [Array<Array>]
169
+ def fetch_titles_abstract # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
170
+ titles = [] # RelatonBib::TypedTitleStringCollection.new
171
+ abstract = []
172
+ langs = languages.each_with_object([]) do |l, s|
173
+ # Don't need to get page for en. We already have it.
174
+ d = l[:path] ? get_page(l[:path])[0] : @doc
175
+ unless d.at("//h5[@class='help-block'][.='недоступно на русском языке']")
176
+ s << l
177
+ titles += fetch_title(d, l[:lang])
178
+
179
+ abstr = parse_abstract(d, l[:lang])
180
+ abstract << abstr if abstr
181
+ end
182
+ end
183
+ [titles, abstract, langs]
184
+ end
185
+
186
+ def parse_abstract(doc, lang)
187
+ abstract_content = doc.xpath(
188
+ "//div[@itemprop='description']/p|//div[@itemprop='description']/ul/li",
189
+ ).map { |a| a.name == "li" ? "- #{a.text}" : a.text }.reject(&:empty?).join("\n")
190
+ @errors[:abstract] &&= abstract_content.empty?
191
+ return if abstract_content.empty?
192
+
193
+ Bib::Abstract.new(content: abstract_content, language: lang, script: script(lang))
194
+ end
195
+
196
+ # Returns available languages.
197
+ # @return [Array<Hash>]
198
+ def languages
199
+ lgs = [{ lang: "en" }]
200
+ @doc.css("li#lang-switcher ul li a").each do |lang_link|
201
+ lang_path = lang_link.attr("href")
202
+ l = lang_path.match(%r{^/(fr)/})
203
+ lgs << { lang: l[1], path: lang_path } if l && (!@lang || l[1] != @lang)
204
+ end
205
+ @errors[:language] &&= lgs.size == 1
206
+ lgs
207
+ end
208
+
209
+ # Get page.
210
+ # @param path [String] page's path
211
+ # @return [Array<Nokogiri::HTML::Document, String>]
212
+ def get_page(path) # rubocop:disable Metrics/MethodLength
213
+ try = 0
214
+ begin
215
+ resp, uri = get_redirection path
216
+ doc = try_if_fail resp, uri
217
+ [doc, uri.to_s]
218
+ rescue SocketError, Timeout::Error, Errno::EINVAL, Errno::ECONNRESET,
219
+ EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
220
+ Net::ProtocolError, Errno::ETIMEDOUT
221
+ try += 1
222
+ raise Relaton::RequestError, "Could not access #{DOMAIN}#{path}" if try > 3
223
+
224
+ sleep 1
225
+ retry
226
+ end
227
+ end
228
+
229
+ #
230
+ # Get the page from the given path. If the page is redirected, get the
231
+ # page from the new path.
232
+ #
233
+ # @param [String] path path to the page
234
+ #
235
+ # @return [Array<Net::HTTPOK, URI>] HTTP response and URI
236
+ # @raise [RelatonBib::RequestError] if the page is not found
237
+ #
238
+ def get_redirection(path) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
239
+ uri = URI(DOMAIN + path)
240
+ try = 0
241
+ begin
242
+ get_response uri
243
+ rescue Errno::EPIPE => e
244
+ try += 1
245
+ retry if check_try try, uri
246
+ raise e
247
+ end
248
+ end
249
+
250
+ def check_try(try, uri)
251
+ if try < 3
252
+ warn "Timeout fetching #{uri}, retrying..."
253
+ sleep 1
254
+ true
255
+ end
256
+ end
257
+
258
+ def get_response(uri, try = 0)
259
+ raise Relaton::RequestError, "#{uri} not found." if try > 3
260
+
261
+ resp = Net::HTTP.get_response(uri)
262
+ case resp.code
263
+ when "200" then [resp, uri]
264
+ when "301" then get_redirection(resp["location"])
265
+ when "404" then raise Relaton::RequestError, "#{uri} not found."
266
+ else
267
+ sleep (2**try)
268
+ get_response uri, try + 1
269
+ end
270
+ end
271
+
272
+ #
273
+ # The iso.org site fails to respond sometimes. This method tries to get
274
+ # the response again.
275
+ #
276
+ # @param [Net::HTTPOK] resp HTTP response
277
+ # @param [URI::HTTPS] uri URI of the page
278
+ #
279
+ # @return [Nokogiri::HTML4::Document] document
280
+ # @raise [Relaton::RequestError] if the page could not be parsed
281
+ #
282
+ def try_if_fail(resp, uri)
283
+ 10.times do
284
+ doc = Nokogiri::HTML(resp.body)
285
+ # stop trying if page has a document id
286
+ return doc if item_ref(doc)
287
+
288
+ resp = Net::HTTP.get_response(uri)
289
+ end
290
+ raise Relaton::RequestError, "Could not parse the page #{uri}"
291
+ end
292
+
293
+ #
294
+ # Generate docnumber.
295
+ #
296
+ # @return [String] docnumber
297
+ #
298
+ def fetch_docnumber
299
+ pubid.to_s.match(/\d+/)&.to_s
300
+ end
301
+
302
+ #
303
+ # Parse structuredidentifier.
304
+ #
305
+ # @return [RelatonBib::StructuredIdentifier] structured identifier
306
+ #
307
+ def fetch_structuredidentifier # rubocop:disable Metrics/MethodLength
308
+ pnum = ProjectNumber.new content: File.basename(@url, ".*")
309
+ StructuredIdentifier.new(project_number: pnum, type: pubid.root.publisher)
310
+ end
311
+
312
+ #
313
+ # Parse ID from the document.
314
+ #
315
+ # @param [Nokogiri::HTML::Document] doc document to parse
316
+ #
317
+ # @return [String, nil] ID
318
+ #
319
+ def item_ref(doc)
320
+ ref = doc.at("//main//section/div/div/div//h1/span[1]")
321
+ @errors[:reference] &&= ref.nil?
322
+ ref&.text&.strip
323
+ end
324
+
325
+ # Fetch status.
326
+ # @return [RelatonBib::DocumentStatus]
327
+ def fetch_status
328
+ stg, sbstg = stage_code.split "."
329
+ stage = Bib::Status::Stage.new content: stg
330
+ substage = Bib::Status::Stage.new content: sbstg if sbstg
331
+ Bib::Status.new(stage: stage, substage: substage)
332
+ end
333
+
334
+ def stage_code
335
+ return @stage_code if defined?(@stage_code)
336
+
337
+ stc = @doc.at("//ul[@class='dropdown-menu']/li[@class='active']/a/span[@class='stage-code']")
338
+ @errors[:stage] &&= stc.nil?
339
+ @stage_code = stc&.text
340
+ end
341
+
342
+ # def stage(stg, substg)
343
+ # abbr = STGABBR[stg].is_a?(Hash) ? STGABBR[stg][substg] : STGABBR[stg]
344
+ # RelatonBib::DocumentStatus::Stage.new value: stg, abbreviation: abbr
345
+ # end
346
+
347
+ # Fetch relations.
348
+ # @return [Array<Hash>]
349
+ def fetch_relations
350
+ types = ["Now", "Now under review"]
351
+ rels = @doc.xpath(
352
+ "//ul[@class='steps']/li", "//div[contains(@class, 'sub-step')]"
353
+ ).reduce([]) do |a, r|
354
+ type, date = relation_type(r.at("h4", "h5").text.strip)
355
+ next a if types.include?(type)
356
+
357
+ a + create_relations(r, type, date)
358
+ end
359
+ @errors[:relation] &&= rels.empty?
360
+ rels
361
+ end
362
+
363
+ #
364
+ # Parse relation type and dates.
365
+ #
366
+ # @param [String] type parsed type
367
+ #
368
+ # @return [Array<String,Array>] type and dates
369
+ #
370
+ def relation_type(type)
371
+ date = []
372
+ t = case type.strip
373
+ when "Previously", "Will be replaced by" then "obsoletes"
374
+ when /Corrigenda|Amendments|Revised by|Now confirmed|replaced by/
375
+ at = @doc.xpath('//span[@class="stage-date"][contains(., "-")]').last
376
+ date << Bib::Date.new(type: "circulated", at: at.text) if at
377
+ "updates"
378
+ else type
379
+ end
380
+ [t, date]
381
+ end
382
+
383
+ #
384
+ # Create relations.
385
+ #
386
+ # @param [Nokogiri::HTML::Element] rel relation element
387
+ # @param [String] type relation type
388
+ # @param [Hash{Symbol=>String}] date relation document date
389
+ # @option date [String] :type date type
390
+ # @option date [String] :on date
391
+ #
392
+ # @return [Array<Hash>] Relations
393
+ #
394
+ def create_relations(rel, type, date)
395
+ rel.css("a").map do |rid|
396
+ docid = Docidentifier.new(type: "ISO", content: rid.text, primary: true)
397
+ bibitem = ItemData.new(docidentifier: [docid], formattedref: Bib::Formattedref.new(content: rid.text), date: date)
398
+ Relation.new type: type, bibitem: bibitem
399
+ end
400
+ end
401
+
402
+ # Fetch titles.
403
+ # @param doc [Nokogiri::HTML::Document]
404
+ # @param lang [String]
405
+ # @return [Array<RelatonBib::TypedTitleString>]
406
+ def fetch_title(doc, lang) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
407
+ types = %w[title-intro title-main title-part]
408
+ ttls = parse_titles(doc)
409
+ title = [] # RelatonBib::TypedTitleStringCollection.new
410
+ ttls.each.with_index do |p, i|
411
+ next unless p
412
+
413
+ title << Bib::Title.new(type: types[i], content: p, language: lang, script: script(lang))
414
+ end.compact
415
+ main = title.map(&:content).join " - "
416
+ title << Bib::Title.new(type: "main", content: main, language: lang, script: script(lang))
417
+ end
418
+
419
+ def parse_titles(doc)
420
+ # head = doc.at "//nav[contains(@class,'heading-condensed')]"
421
+ ttls = doc.xpath("//h1[@class='stdTitle']/span[position()>1]").map(&:text)
422
+ return ttls if @errors[:title] &&= ttls.empty?
423
+
424
+ ttls[0, 1] = ttls[0].split(/\s(?:-|\u2014)\s/) # if ttls.size == 1
425
+ case ttls.size
426
+ when 0, 1 then [nil, ttls.first, nil]
427
+ else intro_or_part ttls
428
+ end
429
+ end
430
+
431
+ # @param ttls [Array<String>]
432
+ # @return [Array<String, nil>]
433
+ def intro_or_part(ttls)
434
+ if /^(Part|Partie) \d+:/.match? ttls[1]
435
+ [nil, ttls[0], ttls[1..].join(" -- ")]
436
+ else
437
+ parts = ttls.slice(2..-1)
438
+ part = parts.join " -- " if parts.any?
439
+ [ttls[0], ttls[1], part]
440
+ end
441
+ end
442
+
443
+ # Return ISO script code.
444
+ # @param lang [String]
445
+ # @return [String]
446
+ def script(lang)
447
+ case lang
448
+ when "en", "fr" then "Latn"
449
+ when "ru" then "Cyrl"
450
+ end
451
+ end
452
+
453
+ # Fetch dates
454
+ # @return [Array<Hash>]
455
+ def fetch_dates # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
456
+ dates = []
457
+ %r{^[^\s]+\s[\d-]+:(?<ref_date_str>\d{4})} =~ id
458
+ pub_date_str = @doc.at("//span[@itemprop='releaseDate']")
459
+ @errors[:date_pub] &&= pub_date_str.nil?
460
+ if ref_date_str
461
+ dates += parse_date_from_id ref_date_str, pub_date_str
462
+ elsif pub_date_str
463
+ dates << Bib::Date.new(type: "published", at: pub_date_str.text)
464
+ end
465
+ corr_data = @doc.at "//span[@itemprop='dateModified']"
466
+ @errors[:date_corr] &&= corr_data.nil?
467
+ dates << Bib::Date.new(type: "corrected", at: corr_data.text) if corr_data
468
+ dates
469
+ end
470
+
471
+ def parse_date_from_id(ref_date_str, pub_date_str) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
472
+ dates = []
473
+ ref_date = ::Date.strptime ref_date_str, "%Y"
474
+ if pub_date_str.nil?
475
+ dates << Bib::Date.new(type: "published", at: ref_date_str)
476
+ else
477
+ pub_date = ::Date.strptime pub_date_str.text, "%Y"
478
+ if pub_date.year > ref_date.year
479
+ dates << Bib::Date.new(type: "published", at: ref_date_str)
480
+ dates << Bib::Date.new(type: "updated", at: pub_date_str.text)
481
+ else
482
+ dates << Bib::Date.new(type: "published", at: pub_date_str.text)
483
+ end
484
+ end
485
+ dates
486
+ end
487
+
488
+ def fetch_contributors # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
489
+ id.sub(/\s.*/, "").split("/").reduce([]) do |mem, abbrev|
490
+ publisher = PUBLISHERS[abbrev]
491
+ next mem unless publisher
492
+
493
+ role = Bib::Contributor::Role.new(type: "publisher")
494
+ publisher[:abbreviation] = abbrev
495
+ name = Bib::TypedLocalizedString.new content: publisher[:name]
496
+ abbrev = Bib::LocalizedString.new content: publisher[:abbreviation] if publisher[:abbreviation]
497
+ uri = Bib::Uri.new(content: publisher[:uri]) if publisher[:uri]
498
+ org = Bib::Organization.new(name: [name], abbreviation: abbrev, uri: [uri])
499
+ mem << Bib::Contributor.new(organization: org, role: [role])
500
+ end
501
+ end
502
+
503
+ # Fetch ICS.
504
+ # @return [Array<Hash>]
505
+ def fetch_ics
506
+ ics = @doc.xpath("//div[contains(., 'ICS')]/following-sibling::span/a").map do |i|
507
+ code = i.text.match(/[\d.]+/).to_s # .split "."
508
+ # { field: code[0], group: code[1], subgroup: code[2] }
509
+ isoics = Isoics.fetch code
510
+ Bib::ICS.new code: code, text: isoics.description
511
+ end
512
+ @errors[:ics] &&= ics.empty?
513
+ ics
514
+ end
515
+
516
+ #
517
+ # Fetch source.
518
+ #
519
+ # @param url [String] document url
520
+ #
521
+ # @return [Array<Hash>]
522
+ #
523
+ def fetch_source(url) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength
524
+ source = [Bib::Uri.new(type: "src", content: url)]
525
+ obp = @doc.at("//a[.='Read sample']")
526
+ @errors[:link_obp] &&= obp.nil?
527
+ source << Bib::Uri.new(type: "obp", content: obp[:href]) if obp
528
+ rss = @doc.at("//a[contains(@href, 'rss')]")
529
+ @errors[:link_rss] &&= rss.nil?
530
+ source << Bib::Uri.new(type: "rss", content: DOMAIN + rss[:href]) if rss
531
+ pub = @doc.at "//p[contains(., 'publicly available')]/a",
532
+ "//p[contains(., 'can be downloaded from the')]/a"
533
+ @errors[:link_pub] &&= pub.nil?
534
+ source << Bib::Uri.new(type: "pub", content: pub[:href]) if pub
535
+ source
536
+ end
537
+
538
+ # Fetch copyright.
539
+ # @return [Array<Hash>]
540
+ def fetch_copyright # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
541
+ ref = item_ref @doc
542
+ owner_name = ref.match(/.*?(?=\s)/).to_s
543
+ from = ref.match(/(?<=:)\d{4}/).to_s
544
+ if from.empty?
545
+ date = @doc.at(
546
+ "//span[@itemprop='releaseDate']",
547
+ "//ul[@id='stages']/li[contains(@class,'active')]/ul/li[@class='active']/a/span[@class='stage-date']",
548
+ )
549
+ from = date.text.match(/\d{4}/).to_s
550
+ end
551
+ name = Bib::TypedLocalizedString.new content: owner_name
552
+ org = Bib::Organization.new name: [name]
553
+ contrib = Bib::ContributionInfo.new organization: org
554
+ [Bib::Copyright.new(owner: [contrib], from: from)]
555
+ end
556
+
557
+ def parse_ext
558
+ Ext.new(
559
+ doctype: fetch_type,
560
+ flavor: "iso",
561
+ ics: fetch_ics,
562
+ structuredidentifier: fetch_structuredidentifier,
563
+ stagename: nil,
564
+ updates_document_type: nil,
565
+ fast_track: nil,
566
+ price_code: nil,
567
+ )
568
+ end
569
+
570
+ # Fetch type.
571
+ # @return [String]
572
+ def fetch_type
573
+ %r{
574
+ ^(?<prefix>ISO|IWA|IEC)
575
+ (?:(?:/CIE|/IEC|/IEEE|/PRF|/NP|/SAE|/HL7|/DGuide)*\s|/)
576
+ (?<type>TS|TR|PAS|AWI|CD|FDIS|NP|DIS|WD|R|DTS|DTR|ISP|PWI|Guide|(?=\d+))
577
+ }x =~ id
578
+ type = TYPES[type] || TYPES[prefix] || "international-standard"
579
+ Doctype.new(content: type)
580
+ end
581
+
582
+ #
583
+ # Fetch editorialgroup as a contributor with subdivision.
584
+ #
585
+ # @return [Relaton::Bib::Contributor, nil]
586
+ #
587
+ def fetch_editorialgroup_contributor # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
588
+ wg = @doc.at(
589
+ "//div[contains(., 'Technical Committe')]" \
590
+ "/following-sibling::span/a",
591
+ )
592
+ @errors[:editorialgroup] &&= wg.nil?
593
+ return unless wg
594
+
595
+ workgroup = wg.text.split "/"
596
+ prefix = workgroup[0]
597
+ type = workgroup[1]&.match(/^[A-Z]+/)&.to_s || "TC"
598
+ tc_name = wg[:title]
599
+
600
+ publisher = PUBLISHERS[prefix]
601
+ name = if publisher
602
+ [Bib::TypedLocalizedString.new(content: publisher[:name])]
603
+ elsif prefix
604
+ [Bib::TypedLocalizedString.new(content: prefix)]
605
+ else
606
+ []
607
+ end
608
+ abbreviation = if prefix
609
+ Bib::LocalizedString.new(content: prefix)
610
+ end
611
+
612
+ subdivision = Bib::Subdivision.new(
613
+ type: "technical-committee",
614
+ subtype: type,
615
+ name: [Bib::TypedLocalizedString.new(content: tc_name)],
616
+ identifier: [Bib::OrganizationType::Identifier.new(
617
+ content: wg.text,
618
+ )],
619
+ )
620
+
621
+ role = Bib::Contributor::Role.new(
622
+ type: "author",
623
+ description: [Bib::LocalizedMarkedUpString.new(content: "committee")],
624
+ )
625
+
626
+ Bib::Contributor.new(
627
+ role: [role],
628
+ organization: Bib::Organization.new(
629
+ name: name, subdivision: [subdivision], abbreviation: abbreviation,
630
+ ),
631
+ )
632
+ end
633
+ end
634
+ end
635
+ 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