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,264 @@
1
+ require "nokogiri"
2
+
3
+ module Relaton
4
+ module Bib
5
+ # Strips inline markup not in the basicdoc PureTextElement set
6
+ # (plus <p>, <eref>, <xref>, <fn>, <link>) from raw marked-up content
7
+ # strings. Disallowed elements are unwrapped: tags removed, inner text kept.
8
+ #
9
+ # <link> (basicdoc's inline hyperlink) is admitted because it is a valid
10
+ # TextElement child of a biblionote and carries a target URL that must
11
+ # survive the from_xml/to_xml round-trip — dropping it silently loses
12
+ # every URL in amended note.display references (relaton-bib#122).
13
+ #
14
+ # <fn> is admitted beyond strict PureTextElement because bibliographic
15
+ # titles in real Metanorma input routinely carry footnotes (e.g. ISO
16
+ # standards titles with a disclaimer footnote), and downstream
17
+ # consumers — notably relaton-render's own inline-tag allow-list —
18
+ # already accept <fn> as a legitimate child of <title>. Stripping it
19
+ # here would break the round-trip.
20
+ #
21
+ # OPAQUE elements (currently <stem>) are also allowed, but the
22
+ # sanitiser does not descend into them: their contents are out-of-band
23
+ # inline notation (MathML, AsciiMath, LaTeX) rather than basicdoc
24
+ # markup, and must be preserved verbatim. Without the opaque-skip,
25
+ # the recursive walk would unwrap MathML / AsciiMath elements down to
26
+ # bare text nodes — see #116 for the round-trip-loss symptom.
27
+ module Sanitizer
28
+ ALLOWED = %w[
29
+ em strong sub sup tt underline strike smallcap br stem
30
+ p eref xref fn link
31
+ ].freeze
32
+
33
+ # Elements whose children are non-basicdoc inline notation
34
+ # (MathML, AsciiMath, LaTeX, …) and must be preserved verbatim
35
+ # rather than sanitised against ALLOWED.
36
+ OPAQUE = %w[stem].freeze
37
+
38
+ RENAME = {
39
+ "italic" => "em",
40
+ }.freeze
41
+
42
+ TAG_RX = %r{<[a-zA-Z/!?]}
43
+
44
+ # Captures a namespace prefix, on a tag or on an attribute: the
45
+ # "jats" of <jats:p> and </jats:italic>, and the "xlink" of
46
+ # xlink:href.
47
+ NS_PREFIX_RX = %r{(?:</?|\s)([A-Za-z_][\w.-]*):(?=[A-Za-z_])}
48
+
49
+ # Namespace that declares a prefix which the content leaves
50
+ # undeclared. The sanitiser removes it again before it serialises.
51
+ NS_PLACEHOLDER = "urn:x-relaton-undeclared:%s".freeze
52
+
53
+ # Element that carries the placeholder declarations. Its children
54
+ # are the sanitised content, so the element itself never reaches
55
+ # the output.
56
+ NS_WRAPPER = "relaton-sanitizer-root".freeze
57
+
58
+ # Extension that lengthens the wrapper name past a collision, and
59
+ # the pattern that measures how far the content already extends it.
60
+ NS_WRAPPER_SUFFIX = "-x".freeze
61
+ NS_WRAPPER_RX = /#{NS_WRAPPER}(?:#{NS_WRAPPER_SUFFIX})*/
62
+
63
+ # Reserved prefixes. XML declares both, so the content must not.
64
+ NS_RESERVED = %w[xml xmlns].freeze
65
+
66
+ # Serialise without the FORMAT option, so the sanitiser keeps the
67
+ # shape of element-only content instead of adding newlines and
68
+ # indent.
69
+ SAVE_OPTS = Nokogiri::XML::Node::SaveOptions::AS_XML
70
+
71
+ def self.sanitize(content)
72
+ return content unless sanitizable?(content)
73
+
74
+ node = parse(content)
75
+ return content if node.nil?
76
+
77
+ sanitize_children(node)
78
+ node.children.map do |c|
79
+ c.to_xml(encoding: "UTF-8", save_with: SAVE_OPTS)
80
+ end.join
81
+ end
82
+
83
+ #
84
+ # Parse the content into a node whose children are the content.
85
+ #
86
+ # @param [String] content The raw marked-up content.
87
+ #
88
+ # @return [Nokogiri::XML::Node, nil] The node, or nil when the
89
+ # content does not parse.
90
+ #
91
+ def self.parse(content)
92
+ fragment = Nokogiri::XML::DocumentFragment.parse(content)
93
+ return fragment if fragment.errors.empty?
94
+
95
+ parse_with_prefixes(content)
96
+ end
97
+ private_class_method :parse
98
+
99
+ #
100
+ # Parse content that uses undeclared namespace prefixes.
101
+ #
102
+ # An undeclared prefix is always a parse error, so without this the
103
+ # sanitiser gives up on exactly the third-party markup that needs
104
+ # sanitising most. Declare every prefix that the content uses on a
105
+ # wrapper element, parse, then remove the placeholder namespaces
106
+ # from the elements and from the attributes. See metanorma-pdfa#99.
107
+ #
108
+ # An undeclared prefix inside an OPAQUE <stem> goes as well. The
109
+ # sanitiser cannot keep it: an undeclared prefix in the output is
110
+ # the exact failure that this method removes. Only a namespace that
111
+ # the content declares itself survives verbatim.
112
+ #
113
+ # @param [String] content The raw marked-up content.
114
+ #
115
+ # @return [Nokogiri::XML::Element, nil] The wrapper element, or nil
116
+ # when the content uses no prefix or does not parse.
117
+ #
118
+ def self.parse_with_prefixes(content)
119
+ decl = placeholder_declarations(content) or return
120
+ name = wrapper_name(content)
121
+ doc = Nokogiri::XML "<#{name} #{decl}>#{content}</#{name}>"
122
+ return unless doc.errors.empty?
123
+
124
+ drop_placeholder_namespaces doc.root
125
+ end
126
+ private_class_method :parse_with_prefixes
127
+
128
+ #
129
+ # Declare every namespace prefix that the content uses.
130
+ #
131
+ # @param [String] content The raw marked-up content.
132
+ #
133
+ # @return [String, nil] The declarations, or nil when the content
134
+ # uses no prefix.
135
+ #
136
+ def self.placeholder_declarations(content)
137
+ prefixes = content.scan(NS_PREFIX_RX).flatten.uniq - NS_RESERVED
138
+ return if prefixes.empty?
139
+
140
+ prefixes.map do |pfx|
141
+ %(xmlns:#{pfx}="#{format NS_PLACEHOLDER, pfx}")
142
+ end.join(" ")
143
+ end
144
+ private_class_method :placeholder_declarations
145
+
146
+ #
147
+ # Name a wrapper element that the content does not close itself.
148
+ #
149
+ # Content that holds the literal end tag of the wrapper would close
150
+ # it early. The document then has more than one root, the parse
151
+ # fails, and the sanitiser gives up on content that it can handle.
152
+ #
153
+ # Extend past the longest run of the suffix that the content already
154
+ # holds, in ONE scan. Growing the name and re-testing with include?
155
+ # is quadratic: each extension re-scans the whole string, and
156
+ # content shaped like "…-root-x-x-x" forces one pass per two
157
+ # characters (measured at 229 ms for 20k characters). The sanitiser
158
+ # runs on every marked-up assignment, on third-party content.
159
+ #
160
+ # @param [String] content The raw marked-up content.
161
+ #
162
+ # @return [String] A name that the content does not contain.
163
+ #
164
+ def self.wrapper_name(content)
165
+ longest = content.scan(NS_WRAPPER_RX).map(&:size).max
166
+ return NS_WRAPPER unless longest
167
+
168
+ extra = ((longest - NS_WRAPPER.size) / NS_WRAPPER_SUFFIX.size) + 1
169
+ NS_WRAPPER + (NS_WRAPPER_SUFFIX * extra)
170
+ end
171
+ private_class_method :wrapper_name
172
+
173
+ #
174
+ # Remove the placeholder namespaces, and only those.
175
+ #
176
+ # Nokogiri's remove_namespaces! would also strip a namespace that
177
+ # the content declares itself, such as the MathML xmlns inside an
178
+ # OPAQUE <stem>, which must survive verbatim. Match the wrapper's
179
+ # own declarations, so a namespace of the content never matches,
180
+ # whatever its URI.
181
+ #
182
+ # The declarations stay on the wrapper element. Only its children
183
+ # reach the output, so the declarations never leak. Do not
184
+ # serialise the root itself.
185
+ #
186
+ # @param [Nokogiri::XML::Element] root The wrapper element.
187
+ #
188
+ # @return [Nokogiri::XML::Element] The same element.
189
+ #
190
+ def self.drop_placeholder_namespaces(root)
191
+ placeholders = root.namespace_definitions
192
+ root.traverse do |node|
193
+ node.namespace = nil if placeholders.include?(node.namespace)
194
+ next unless node.element?
195
+
196
+ drop_attribute_namespaces node, placeholders
197
+ end
198
+ root
199
+ end
200
+ private_class_method :drop_placeholder_namespaces
201
+
202
+ #
203
+ # Un-prefix the placeholder attributes of one element.
204
+ #
205
+ # Un-prefixing renames the attribute, so it can collide: an element
206
+ # carrying both target and xlink:target would keep two attributes
207
+ # called target, and Nokogiri rejects the result with "Attribute
208
+ # target redefined" -- the unparseable output this whole path
209
+ # exists to prevent. Drop the prefixed one instead.
210
+ #
211
+ # @param [Nokogiri::XML::Element] node The element.
212
+ # @param [Array<Nokogiri::XML::Namespace>] placeholders The
213
+ # wrapper's own declarations.
214
+ #
215
+ # @return [void]
216
+ #
217
+ def self.drop_attribute_namespaces(node, placeholders)
218
+ node.attribute_nodes.each do |attr|
219
+ next unless placeholders.include?(attr.namespace)
220
+
221
+ if plain_attribute?(node, attr.name) then attr.unlink
222
+ else attr.namespace = nil
223
+ end
224
+ end
225
+ end
226
+ private_class_method :drop_attribute_namespaces
227
+
228
+ #
229
+ # Does the element already carry this attribute without a prefix?
230
+ #
231
+ # Nokogiri's Node#attribute matches on the name alone, so it finds
232
+ # the prefixed attribute itself and every un-prefixing would look
233
+ # like a collision. Match on the namespace as well.
234
+ #
235
+ # @param [Nokogiri::XML::Element] node The element.
236
+ # @param [String] name The un-prefixed attribute name.
237
+ #
238
+ # @return [Boolean] Whether the element carries it.
239
+ #
240
+ def self.plain_attribute?(node, name)
241
+ node.attribute_nodes.any? { |a| a.namespace.nil? && a.name == name }
242
+ end
243
+ private_class_method :plain_attribute?
244
+
245
+ def self.sanitizable?(content)
246
+ content.is_a?(::String) && !content.empty? && content.match?(TAG_RX)
247
+ end
248
+ private_class_method :sanitizable?
249
+
250
+ def self.sanitize_children(node)
251
+ node.children.to_a.each do |child|
252
+ next unless child.element?
253
+
254
+ child.name = RENAME[child.name] if RENAME.key?(child.name)
255
+ next if OPAQUE.include?(child.name)
256
+
257
+ sanitize_children(child)
258
+ child.replace(child.children) unless ALLOWED.include?(child.name)
259
+ end
260
+ end
261
+ private_class_method :sanitize_children
262
+ end
263
+ end
264
+ end
@@ -0,0 +1,18 @@
1
+ module Relaton
2
+ module Bib
3
+ module Util
4
+ extend self
5
+
6
+ PROGNAME = "relaton-bib".freeze
7
+
8
+ def method_missing(method_name, msg = nil, prog = nil, **opts, &block)
9
+ prog ||= self::PROGNAME
10
+ Relaton.logger_pool.send method_name, msg, prog, **opts, &block
11
+ end
12
+
13
+ def respond_to_missing?(method_name, include_private = false)
14
+ Relaton.logger_pool.respond_to?(method_name) || super
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,35 @@
1
+ {
2
+ "relaton-models": "v1.5.6",
3
+ "basicdoc-models": "v1.2.5",
4
+ "metanorma-requirements-models": "v1.0.2",
5
+ "relaton-model-ieee": "v1.1.3",
6
+ "relaton-model-iso": "v1.1.2",
7
+ "relaton-model-iec": "v1.1.2",
8
+ "relaton-model-bsi": "v1.1.3",
9
+ "relaton-model-gb": "v1.1.2",
10
+ "relaton-model-mpfa": "v1.0.0",
11
+ "relaton-model-bipm": "v1.1.2",
12
+ "relaton-model-w3c": "v1.0.0",
13
+ "relaton-model-3gpp": "v1.0.4",
14
+ "relaton-model-cc": "v1.1.2",
15
+ "relaton-model-ietf": "v1.1.2",
16
+ "relaton-model-iho": "v1.1.2",
17
+ "relaton-model-itu": "v1.1.3",
18
+ "relaton-model-m3aawg": "v1.0.1",
19
+ "relaton-model-nist": "v1.1.2",
20
+ "relaton-model-ribose": "v1.1.2",
21
+ "relaton-model-ogc": "v1.1.2",
22
+ "relaton-model-cen": "v1.0.1",
23
+ "relaton-model-ecma": "v1.0.0",
24
+ "relaton-model-cie": "v1.0.0",
25
+ "relaton-model-iana": "v1.0.0",
26
+ "relaton-model-omg": "v1.0.0",
27
+ "relaton-model-oasis": "v1.0.4",
28
+ "relaton-model-jis": "v1.0.2",
29
+ "relaton-model-etsi": "v0.1.2",
30
+ "relaton-model-plateau": "v0.1.0",
31
+ "relaton-model-ccsds": "",
32
+ "relaton-model-un": "v1.0.2",
33
+ "metanorma-model": "v2.1.6",
34
+ "date": "2026-04-30T03:49:24Z"
35
+ }
@@ -0,0 +1,46 @@
1
+ require "relaton/logger"
2
+ require "forwardable"
3
+ # require "htmlentities"
4
+ require "bibtex"
5
+ require "iso639"
6
+ require "rfcxml"
7
+ require "relaton/core"
8
+ require_relative "version"
9
+ require_relative "bib/util"
10
+ require_relative "bib/sanitizer"
11
+ require_relative "bib/namespace_helper"
12
+ require_relative "bib/item_data"
13
+ require_relative "bib/model/item"
14
+ require_relative "bib/model/item_base"
15
+ require_relative "bib/model/bibitem_shared"
16
+ require_relative "bib/model/bibdata_shared"
17
+ require_relative "bib/model/bibitem"
18
+ require_relative "bib/model/bibdata"
19
+ require_relative "bib/converter/bibxml"
20
+ require_relative "bib/converter/bibtex"
21
+ require_relative "bib/converter/asciibib"
22
+ require_relative "bib/model/relation"
23
+
24
+ module Relaton
25
+ # class Error < StandardError; end
26
+
27
+ class << self
28
+ #
29
+ # Read schema versions from file
30
+ #
31
+ # @return [Hash{String=>String}] schema versions
32
+ #
33
+ def schema_versions
34
+ @@schema_versions ||= JSON.parse File.read(File.join(__dir__, "bib/versions.json"))
35
+ end
36
+ end
37
+
38
+ module Bib
39
+ def self.grammar_hash
40
+ # gem_path = File.expand_path "..", __dir__
41
+ # grammars_path = File.join gem_path, "grammars", "*"
42
+ # grammars = Dir[grammars_path].sort.map { |gp| File.read gp }.join
43
+ Digest::MD5.hexdigest Relaton::VERSION # grammars
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,231 @@
1
+ require "mechanize"
2
+
3
+ module Relaton::Bipm
4
+ class Bibliography
5
+ GH_ENDPOINT = "https://raw.githubusercontent.com/relaton/relaton-data-bipm/refs/heads/v2/".freeze
6
+
7
+ class << self
8
+ # @param text [String]
9
+ # @return [RelatonBipm::BipmBibliographicItem]
10
+ def search(text, _year = nil, _opts = {}) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
11
+ Util.info "Fetching from Relaton repository ...", key: text
12
+ ref = text.sub(/^BIPM\s/, "")
13
+ item = get_bipm ref
14
+ unless item
15
+ Util.info "Not found.", key: text
16
+ return
17
+ end
18
+
19
+ Util.info "Found: `#{item.docidentifier[0].content}`", key: text
20
+ item
21
+ rescue Mechanize::ResponseCodeError => e
22
+ raise Relaton::RequestError, e.message unless e.response_code == "404"
23
+ end
24
+
25
+ # @return [Mechanize]
26
+ # def magent # rubocop:disable Metrics/MethodLength
27
+ # a = Mechanize.new
28
+ # a.request_headers = {
29
+ # "Accept" => "text/html,application/xhtml+xml,application/xml;q=0.9," \
30
+ # "image/avif,image/webp,image/apng," \
31
+ # "*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
32
+ # "Accept-Encoding" => "gzip, deflate, br",
33
+ # "Accept-Language" => "en-US,en;q=0.9,ru-RU;q=0.8,ru;q=0.7",
34
+ # "Cache-Control" => "max-age=0",
35
+ # "Upgrade-Insecure-Requests" => "1",
36
+ # }
37
+ # a.user_agent_alias = Mechanize::AGENT_ALIASES.map(&:first).shuffle.first
38
+ # # a.user_agent_alias = "Mac Safari"
39
+ # a
40
+ # end
41
+
42
+ #
43
+ # @param reference [String]
44
+ #
45
+ # @return [RelatonBipm::BipmBibliographicItem]
46
+ #
47
+ def get_bipm(reference) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
48
+ pubid = parse_ref reference
49
+ rows = search_index pubid, reference
50
+ return if rows.empty?
51
+
52
+ # Latest edition wins. Metrologia and SI Brochure rows carry no year,
53
+ # so they all score 0; the file path breaks that tie so a repeated
54
+ # lookup returns the same document (the index sort is not stable).
55
+ row = rows.max_by { |r| [r[:id].year.to_i, r[:file]] }
56
+ url = "#{GH_ENDPOINT}#{row[:file]}"
57
+ resp = Mechanize.new.get url
58
+ return unless resp.code == "200"
59
+
60
+ item = Item.from_yaml resp.body
61
+ item.fetched = Date.today.to_s
62
+ item
63
+ end
64
+
65
+ # Look the reference up in the pubid `index-v2`, narrowing the candidate
66
+ # rows before the match runs. `Relaton::Index::Type#search` binary-searches
67
+ # only when given an identifier — the same call shape ISO, OIML and JCGM
68
+ # use. Both sides are now `Pubid::Bipm` objects, so the bespoke `Id`
69
+ # grammar takes no part in a query.
70
+ #
71
+ # Two escapes sit under the narrowing, each covering a case where the
72
+ # query's bsearch key cannot equal its row's:
73
+ #
74
+ # 1. A bare `SI Brochure` names no edition, so it keys to `""` while its
75
+ # row keys to `"9e"`. The rescan finds it.
76
+ # 2. `CCTF Recommendation 2009-02` parses as the literal number
77
+ # `2009-02`, while the row keys on `2`. No row carries that number, so
78
+ # a rescan cannot help — only re-reading the tail as number-plus-year.
79
+ #
80
+ # @param pubid [Pubid::Bipm::Identifier] the parsed reference
81
+ # @param reference [String, nil] the raw reference, for the retry
82
+ # @return [Array<Hash>] the matching index rows
83
+ def search_index(pubid, reference)
84
+ # Reduce the query once, not once per row. `#exclude` copies the
85
+ # identifier, so rebuilding it per candidate dominated the lookup.
86
+ query_stem = stem pubid, pubid
87
+ rows = index.search(pubid) { |r| pubid_match? r[:id], pubid, query_stem }
88
+ rows = index.search { |r| pubid_match? r[:id], pubid, query_stem } if rows.empty?
89
+ return rows unless rows.empty?
90
+
91
+ retry_pubid = year_number_retry reference
92
+ retry_pubid ? search_index(retry_pubid, nil) : rows
93
+ end
94
+
95
+ # Re-read a trailing `YYYY-NN` as number `NN` of year `YYYY`
96
+ # (`CCTF Recommendation 2009-02` → `CCTF Recommendation 2 (2009)`). Tried
97
+ # only after a miss, because `NNNN-NN` is also a real BIPM number
98
+ # (`CIPM 2005-06`), so the literal reading has to be preferred.
99
+ #
100
+ # The re-read string is a machine-derived probe, not the caller's
101
+ # reference, so a probe that does not parse is a miss (nil), never a
102
+ # malformed-reference error -- the same rule as ISO's type/stage probe.
103
+ #
104
+ # @param reference [String, nil]
105
+ # @return [Pubid::Bipm::Identifier, nil]
106
+ def year_number_retry(reference)
107
+ match = reference&.match(/\A(?<stem>.+)\s(?<year>\d{4})-(?<number>\d+)\z/)
108
+ return unless match
109
+
110
+ parse_ref "#{match[:stem]} #{match[:number].sub(/\A0+(?=\d)/, '')} (#{match[:year]})"
111
+ rescue ::Pubid::Errors::ParseError
112
+ nil
113
+ end
114
+
115
+ # Compare a row's identifier with the query. Index rows are stored
116
+ # language- and form-neutral — verified across all committee-document and
117
+ # meeting rows — while a reference may name a language (`(2009, E)`) and
118
+ # always names a form (short `CCTF REC 2` vs long `CCTF Recommendation 2`).
119
+ # The year joins them when the query omits it, mirroring what `Id#==` did
120
+ # with `other_hash.delete(:year) unless hash[:year]`.
121
+ #
122
+ # @param row_id [Pubid::Bipm::Identifier]
123
+ # @param query [Pubid::Bipm::Identifier]
124
+ # @param query_stem [Pubid::Bipm::Identifier, nil] the reduced query, when
125
+ # the caller already built it once for the whole search
126
+ # @return [Boolean]
127
+ def pubid_match?(row_id, query, query_stem = nil)
128
+ # A bare brochure names no edition, so it is a partial reference and
129
+ # cannot equal the `9e v3.01` row. Match any brochure row, which is what
130
+ # the old `{group: "SI", type: "Brochure"}` projection already meant.
131
+ if query.is_a?(::Pubid::Bipm::Identifiers::SiBrochure) && query.edition.nil?
132
+ return row_id.is_a?(::Pubid::Bipm::Identifiers::SiBrochure)
133
+ end
134
+
135
+ return false unless row_id.instance_of?(query.class)
136
+
137
+ # `Id#==` treated a document numbered "1" and a number-less one as the
138
+ # same document when both carried a year, so `CIPM Resolution 1 (1879)`
139
+ # reached `CIPM RES (1879)`. pubid has no such rule and the six
140
+ # ordinal-less declarations are only addressable this way, so keep it.
141
+ if number_collapses?(row_id, query)
142
+ keys = stem_keys(query) + [:number]
143
+ return row_id.exclude(*keys) == query.exclude(*keys)
144
+ end
145
+
146
+ return false unless cheap_reject_passes?(row_id, query)
147
+
148
+ stem(row_id, query) == (query_stem || stem(query, query))
149
+ end
150
+
151
+ # @param row_id [Pubid::Bipm::Identifier]
152
+ # @param query [Pubid::Bipm::Identifier]
153
+ # @return [Boolean] true when one side is number-less, the other is
154
+ # numbered "1", and both carry a year
155
+ def number_collapses?(row_id, query)
156
+ return false unless row_id.year && query.year
157
+
158
+ numbers = [row_id.number.to_s, query.number.to_s]
159
+ numbers.include?("") && numbers.include?("1")
160
+ end
161
+
162
+ # Attributes the stem never removes, so stem equality implies equality on
163
+ # every one of them. Comparing them first cannot change the answer, it
164
+ # only avoids the reduction — and `#exclude` copies the identifier, which
165
+ # is what made an unguarded compare cost roughly 165x a plain attribute
166
+ # read and turned a rescan into seconds.
167
+ CHEAP_KEYS = %i[number group year issue article].freeze
168
+
169
+ # @param row_id [Pubid::Bipm::Identifier]
170
+ # @param query [Pubid::Bipm::Identifier]
171
+ # @return [Boolean] false as soon as one cheap attribute differs
172
+ def cheap_reject_passes?(row_id, query)
173
+ CHEAP_KEYS.all? do |key|
174
+ # `:year` is dropped from the stem when the query has none, so it is
175
+ # only significant when the query supplies one.
176
+ next true if key == :year && query.year.nil?
177
+ next true unless query.respond_to?(key) && row_id.respond_to?(key)
178
+
179
+ row_id.public_send(key).to_s == query.public_send(key).to_s
180
+ end
181
+ end
182
+
183
+ # @param pubid [Pubid::Bipm::Identifier] the identifier to reduce
184
+ # @param query [Pubid::Bipm::Identifier] the query that sets which
185
+ # attributes are significant
186
+ # @return [Pubid::Bipm::Identifier] a copy; the cached row id is untouched
187
+ def stem(pubid, query)
188
+ pubid.exclude(*stem_keys(query))
189
+ end
190
+
191
+ # @param query [Pubid::Bipm::Identifier]
192
+ # @return [Array<Symbol>] the attributes a match must ignore
193
+ def stem_keys(query)
194
+ keys = %i[language form]
195
+ keys << :year if query.year.nil?
196
+ keys
197
+ end
198
+
199
+ # Parse a user reference with `Pubid::Bipm`, which since pubid `a96e9f45`
200
+ # accepts the loose consumer forms this flavor once needed `Id` for
201
+ # (`CCDS Recommendation 2 (2009)`, `CIPM 111e Réunion (2022)`,
202
+ # `CCTF Meeting 14 (1999)`, `SI Brochure Part 1`, …) and normalizes them
203
+ # to BIPM's canonical spelling. An unrecognized reference raises; like
204
+ # ISO and 3GPP we let it propagate -- relaton-cli rescues
205
+ # Pubid::Errors::Error and renders "... is not a recognized standards
206
+ # identifier".
207
+ #
208
+ # @param reference [String]
209
+ # @return [Pubid::Bipm::Identifier]
210
+ # @raise [Pubid::Errors::ParseError]
211
+ def parse_ref(reference)
212
+ ::Pubid::Bipm.parse reference
213
+ end
214
+
215
+ def index
216
+ Relaton::Index.find_or_create(
217
+ :bipm, url: "#{GH_ENDPOINT}#{INDEXFILE}.zip", file: "#{INDEXFILE}.yaml",
218
+ pubid_class: ::Pubid::Bipm::Identifier
219
+ )
220
+ end
221
+
222
+ # @param ref [String] the BIPM standard Code to look up (e..g "BIPM B-11")
223
+ # @param year [String] not used
224
+ # @param opts [Hash] not used
225
+ # @return [RelatonBipm::BipmBibliographicItem]
226
+ def get(ref, year = nil, opts = {})
227
+ search(ref, year, opts)
228
+ end
229
+ end
230
+ end
231
+ end
@@ -0,0 +1,64 @@
1
+ module Relaton
2
+ module Bipm
3
+ module Converter
4
+ module Asciibib
5
+ def self.from_item(item)
6
+ ToAsciibib.new(item).transform
7
+ end
8
+
9
+ class ToAsciibib < Bib::Converter::Asciibib::ToAsciibib
10
+ def transform
11
+ out = super
12
+ return out unless @item.ext
13
+
14
+ out << render_comment_period
15
+ out << render_si_aspect
16
+ out << render_meeting_note
17
+ out
18
+ end
19
+
20
+ private
21
+
22
+ def render_doctype
23
+ return "" unless @item.ext&.doctype
24
+
25
+ "doctype.type:: #{@item.ext.doctype.content}\n"
26
+ end
27
+
28
+ def render_structuredidentifiers
29
+ return "" unless @item.ext&.structuredidentifier
30
+
31
+ si = @item.ext.structuredidentifier
32
+ pref = "structuredidentifier"
33
+ out = "#{pref}.docnumber:: #{si.docnumber}\n"
34
+ out << "#{pref}.part:: #{si.part}\n" if si.part
35
+ out << "#{pref}.appendix:: #{si.appendix}\n" if si.appendix
36
+ out
37
+ end
38
+
39
+ def render_comment_period
40
+ return "" unless @item.ext.comment_period
41
+
42
+ cp = @item.ext.comment_period
43
+ out = ""
44
+ out << "commentperiod.from:: #{cp.from}\n" if cp.from
45
+ out << "commentperiod.to:: #{cp.to}\n" if cp.to
46
+ out
47
+ end
48
+
49
+ def render_si_aspect
50
+ return "" unless @item.ext.si_aspect
51
+
52
+ "si_aspect:: #{@item.ext.si_aspect}\n"
53
+ end
54
+
55
+ def render_meeting_note
56
+ return "" unless @item.ext.meeting_note
57
+
58
+ "meeting_note:: #{@item.ext.meeting_note}\n"
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end