pubid 1.15.21 → 2.0.0.alpha.10

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 (863) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.adoc +2044 -53
  4. data/archived-gems/pubid-ccsds/update_codes.yaml +1 -0
  5. data/archived-gems/pubid-iec/stages.yaml +129 -0
  6. data/archived-gems/pubid-iec/update_codes.yaml +67 -0
  7. data/archived-gems/pubid-ieee/update_codes.yaml +104 -0
  8. data/archived-gems/pubid-iso/stages.yaml +106 -0
  9. data/archived-gems/pubid-iso/update_codes.yaml +4 -0
  10. data/archived-gems/pubid-itu/i18n.yaml +13 -0
  11. data/archived-gems/pubid-itu/series.yaml +42 -0
  12. data/archived-gems/pubid-nist/publishers.yaml +6 -0
  13. data/archived-gems/pubid-nist/series.yaml +121 -0
  14. data/archived-gems/pubid-nist/stages.yaml +16 -0
  15. data/archived-gems/pubid-nist/update_codes.yaml +93 -0
  16. data/archived-gems/pubid-plateau/update_codes.yaml +6 -0
  17. data/data/bipm/update_codes.yaml +9 -0
  18. data/data/ccsds/update_codes.yaml +1 -0
  19. data/data/iec/update_codes.yaml +70 -0
  20. data/data/ieee/update_codes.yaml +210 -0
  21. data/data/iso/update_codes.yaml +21 -0
  22. data/data/nist/series.yaml +155 -0
  23. data/data/nist/update_codes.yaml +122 -0
  24. data/data/plateau/update_codes.yaml +6 -0
  25. data/lib/pubid/adobe/builder.rb +52 -0
  26. data/lib/pubid/adobe/identifier.rb +47 -0
  27. data/lib/pubid/adobe/identifiers/publication.rb +31 -0
  28. data/lib/pubid/adobe/identifiers/tech_note.rb +32 -0
  29. data/lib/pubid/adobe/identifiers.rb +10 -0
  30. data/lib/pubid/adobe/parser.rb +136 -0
  31. data/lib/pubid/adobe/renderer.rb +39 -0
  32. data/lib/pubid/adobe/urn_generator.rb +42 -0
  33. data/lib/pubid/adobe/urn_parser.rb +69 -0
  34. data/lib/pubid/adobe.rb +60 -0
  35. data/lib/pubid/amca/builder.rb +176 -0
  36. data/lib/pubid/amca/identifier.rb +4 -0
  37. data/lib/pubid/amca/identifiers/base.rb +92 -0
  38. data/lib/pubid/amca/identifiers/interpretation.rb +38 -0
  39. data/lib/pubid/amca/identifiers/publication.rb +34 -0
  40. data/lib/pubid/amca/identifiers/standard.rb +20 -0
  41. data/lib/pubid/amca/identifiers.rb +11 -0
  42. data/lib/pubid/amca/parser.rb +153 -0
  43. data/lib/pubid/amca/renderer.rb +82 -0
  44. data/lib/pubid/amca/single_identifier.rb +10 -0
  45. data/lib/pubid/amca/urn_generator.rb +51 -0
  46. data/lib/pubid/amca/urn_parser.rb +28 -0
  47. data/lib/pubid/amca.rb +73 -0
  48. data/lib/pubid/ansi/builder.rb +54 -0
  49. data/lib/pubid/ansi/identifier.rb +31 -0
  50. data/lib/pubid/ansi/identifiers/american_national_standard.rb +13 -0
  51. data/lib/pubid/ansi/identifiers/standard.rb +15 -0
  52. data/lib/pubid/ansi/identifiers.rb +11 -0
  53. data/lib/pubid/ansi/parser.rb +91 -0
  54. data/lib/pubid/ansi/renderer.rb +53 -0
  55. data/lib/pubid/ansi/single_identifier.rb +16 -0
  56. data/lib/pubid/ansi/urn_generator.rb +41 -0
  57. data/lib/pubid/ansi/urn_parser.rb +23 -0
  58. data/lib/pubid/ansi.rb +68 -0
  59. data/lib/pubid/api/builder.rb +58 -0
  60. data/lib/pubid/api/components/code.rb +9 -0
  61. data/lib/pubid/api/identifier.rb +42 -0
  62. data/lib/pubid/api/identifiers/base.rb +12 -0
  63. data/lib/pubid/api/identifiers/bulletin.rb +13 -0
  64. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +13 -0
  65. data/lib/pubid/api/identifiers/mpms.rb +26 -0
  66. data/lib/pubid/api/identifiers/publication.rb +13 -0
  67. data/lib/pubid/api/identifiers/recommended_practice.rb +13 -0
  68. data/lib/pubid/api/identifiers/specification.rb +13 -0
  69. data/lib/pubid/api/identifiers/standard.rb +13 -0
  70. data/lib/pubid/api/identifiers/technical_report.rb +13 -0
  71. data/lib/pubid/api/identifiers/typeless_standard.rb +11 -0
  72. data/lib/pubid/api/identifiers.rb +18 -0
  73. data/lib/pubid/api/parser.rb +140 -0
  74. data/lib/pubid/api/renderer.rb +98 -0
  75. data/lib/pubid/api/single_identifier.rb +24 -0
  76. data/lib/pubid/api/urn_generator.rb +23 -0
  77. data/lib/pubid/api/urn_parser.rb +35 -0
  78. data/lib/pubid/api.rb +68 -0
  79. data/lib/pubid/ashrae/builder.rb +519 -0
  80. data/lib/pubid/ashrae/identifier.rb +8 -0
  81. data/lib/pubid/ashrae/identifiers/addenda_package.rb +42 -0
  82. data/lib/pubid/ashrae/identifiers/addendum.rb +44 -0
  83. data/lib/pubid/ashrae/identifiers/base.rb +119 -0
  84. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +43 -0
  85. data/lib/pubid/ashrae/identifiers/errata.rb +39 -0
  86. data/lib/pubid/ashrae/identifiers/guideline.rb +41 -0
  87. data/lib/pubid/ashrae/identifiers/interpretation.rb +45 -0
  88. data/lib/pubid/ashrae/identifiers/standard.rb +41 -0
  89. data/lib/pubid/ashrae/identifiers.rb +15 -0
  90. data/lib/pubid/ashrae/parser.rb +748 -0
  91. data/lib/pubid/ashrae/renderer.rb +117 -0
  92. data/lib/pubid/ashrae/single_identifier.rb +10 -0
  93. data/lib/pubid/ashrae/supplement_identifier.rb +38 -0
  94. data/lib/pubid/ashrae/urn_generator.rb +57 -0
  95. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  96. data/lib/pubid/ashrae.rb +77 -0
  97. data/lib/pubid/asme/builder.rb +162 -0
  98. data/lib/pubid/asme/components/code.rb +26 -0
  99. data/lib/pubid/asme/identifier.rb +24 -0
  100. data/lib/pubid/asme/identifiers/base.rb +10 -0
  101. data/lib/pubid/asme/identifiers/standard.rb +96 -0
  102. data/lib/pubid/asme/identifiers.rb +10 -0
  103. data/lib/pubid/asme/parser.rb +308 -0
  104. data/lib/pubid/asme/renderer.rb +66 -0
  105. data/lib/pubid/asme/single_identifier.rb +38 -0
  106. data/lib/pubid/asme/urn_generator.rb +133 -0
  107. data/lib/pubid/asme/urn_parser.rb +31 -0
  108. data/lib/pubid/asme.rb +67 -0
  109. data/lib/pubid/astm/builder.rb +166 -0
  110. data/lib/pubid/astm/components/code.rb +42 -0
  111. data/lib/pubid/astm/components.rb +9 -0
  112. data/lib/pubid/astm/identifier.rb +24 -0
  113. data/lib/pubid/astm/identifiers/adjunct.rb +28 -0
  114. data/lib/pubid/astm/identifiers/base.rb +13 -0
  115. data/lib/pubid/astm/identifiers/code_number.rb +81 -0
  116. data/lib/pubid/astm/identifiers/data_series.rb +13 -0
  117. data/lib/pubid/astm/identifiers/iso_dual_published.rb +65 -0
  118. data/lib/pubid/astm/identifiers/manual.rb +23 -0
  119. data/lib/pubid/astm/identifiers/monograph.rb +13 -0
  120. data/lib/pubid/astm/identifiers/research_report.rb +21 -0
  121. data/lib/pubid/astm/identifiers/standard.rb +23 -0
  122. data/lib/pubid/astm/identifiers/technical_report.rb +12 -0
  123. data/lib/pubid/astm/identifiers/work_in_progress.rb +12 -0
  124. data/lib/pubid/astm/identifiers.rb +19 -0
  125. data/lib/pubid/astm/parser.rb +244 -0
  126. data/lib/pubid/astm/renderer.rb +172 -0
  127. data/lib/pubid/astm/single_identifier.rb +47 -0
  128. data/lib/pubid/astm/urn_generator.rb +101 -0
  129. data/lib/pubid/astm/urn_parser.rb +30 -0
  130. data/lib/pubid/astm.rb +55 -0
  131. data/lib/pubid/bipm/builder.rb +163 -0
  132. data/lib/pubid/bipm/identifier.rb +285 -0
  133. data/lib/pubid/bipm/identifiers/committee_document.rb +36 -0
  134. data/lib/pubid/bipm/identifiers/guide.rb +35 -0
  135. data/lib/pubid/bipm/identifiers/meeting.rb +53 -0
  136. data/lib/pubid/bipm/identifiers/mep.rb +33 -0
  137. data/lib/pubid/bipm/identifiers/metrologia_article.rb +48 -0
  138. data/lib/pubid/bipm/identifiers/si_brochure.rb +33 -0
  139. data/lib/pubid/bipm/identifiers.rb +15 -0
  140. data/lib/pubid/bipm/parser.rb +237 -0
  141. data/lib/pubid/bipm/renderer.rb +118 -0
  142. data/lib/pubid/bipm/urn_generator.rb +58 -0
  143. data/lib/pubid/bipm/urn_parser.rb +60 -0
  144. data/lib/pubid/bipm.rb +91 -0
  145. data/lib/pubid/bsi/builder.rb +1495 -0
  146. data/lib/pubid/bsi/components/code.rb +11 -0
  147. data/lib/pubid/bsi/components/date.rb +11 -0
  148. data/lib/pubid/bsi/components/publisher.rb +11 -0
  149. data/lib/pubid/bsi/components/type.rb +11 -0
  150. data/lib/pubid/bsi/identifier.rb +6 -0
  151. data/lib/pubid/bsi/identifiers/addendum_document.rb +30 -0
  152. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +67 -0
  153. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +51 -0
  154. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +65 -0
  155. data/lib/pubid/bsi/identifiers/amendment.rb +48 -0
  156. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +21 -0
  157. data/lib/pubid/bsi/identifiers/british_standard.rb +34 -0
  158. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +40 -0
  159. data/lib/pubid/bsi/identifiers/committee_document.rb +44 -0
  160. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +84 -0
  161. data/lib/pubid/bsi/identifiers/corrigendum.rb +44 -0
  162. data/lib/pubid/bsi/identifiers/detailed_specification.rb +33 -0
  163. data/lib/pubid/bsi/identifiers/disc.rb +27 -0
  164. data/lib/pubid/bsi/identifiers/draft_document.rb +27 -0
  165. data/lib/pubid/bsi/identifiers/electronic_book.rb +16 -0
  166. data/lib/pubid/bsi/identifiers/expert_commentary.rb +36 -0
  167. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +35 -0
  168. data/lib/pubid/bsi/identifiers/flex.rb +30 -0
  169. data/lib/pubid/bsi/identifiers/handbook.rb +23 -0
  170. data/lib/pubid/bsi/identifiers/index.rb +30 -0
  171. data/lib/pubid/bsi/identifiers/method.rb +35 -0
  172. data/lib/pubid/bsi/identifiers/national_annex.rb +48 -0
  173. data/lib/pubid/bsi/identifiers/practice_guide.rb +21 -0
  174. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +27 -0
  175. data/lib/pubid/bsi/identifiers/published_document.rb +27 -0
  176. data/lib/pubid/bsi/identifiers/section.rb +32 -0
  177. data/lib/pubid/bsi/identifiers/set.rb +40 -0
  178. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +40 -0
  179. data/lib/pubid/bsi/identifiers/supplement_document.rb +29 -0
  180. data/lib/pubid/bsi/identifiers/supplementary_index.rb +35 -0
  181. data/lib/pubid/bsi/identifiers/technical_specification.rb +34 -0
  182. data/lib/pubid/bsi/identifiers/test_method.rb +35 -0
  183. data/lib/pubid/bsi/identifiers/value_added_publication.rb +37 -0
  184. data/lib/pubid/bsi/identifiers.rb +51 -0
  185. data/lib/pubid/bsi/model.rb +196 -0
  186. data/lib/pubid/bsi/parser.rb +673 -0
  187. data/lib/pubid/bsi/renderer.rb +1064 -0
  188. data/lib/pubid/bsi/single_identifier.rb +141 -0
  189. data/lib/pubid/bsi/urn_generator.rb +92 -0
  190. data/lib/pubid/bsi/urn_parser.rb +52 -0
  191. data/lib/pubid/bsi.rb +282 -0
  192. data/lib/pubid/builder/base.rb +187 -0
  193. data/lib/pubid/bundled_identifier.rb +134 -0
  194. data/lib/pubid/calconnect/builder.rb +38 -0
  195. data/lib/pubid/calconnect/identifier.rb +121 -0
  196. data/lib/pubid/calconnect/identifiers/standard.rb +29 -0
  197. data/lib/pubid/calconnect/identifiers.rb +9 -0
  198. data/lib/pubid/calconnect/parser.rb +54 -0
  199. data/lib/pubid/calconnect/renderer.rb +36 -0
  200. data/lib/pubid/calconnect/urn_generator.rb +33 -0
  201. data/lib/pubid/calconnect/urn_parser.rb +34 -0
  202. data/lib/pubid/calconnect.rb +82 -0
  203. data/lib/pubid/ccsds/builder.rb +57 -0
  204. data/lib/pubid/ccsds/identifier.rb +76 -0
  205. data/lib/pubid/ccsds/identifiers/base.rb +41 -0
  206. data/lib/pubid/ccsds/identifiers/base_BASE_88929.rb +70 -0
  207. data/lib/pubid/ccsds/identifiers/corrigendum.rb +40 -0
  208. data/lib/pubid/ccsds/identifiers.rb +10 -0
  209. data/lib/pubid/ccsds/parser.rb +73 -0
  210. data/lib/pubid/ccsds/single_identifier.rb +77 -0
  211. data/lib/pubid/ccsds/supplement_identifier.rb +37 -0
  212. data/lib/pubid/ccsds/urn_generator.rb +115 -0
  213. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  214. data/lib/pubid/ccsds.rb +64 -0
  215. data/lib/pubid/cen_cenelec/builder.rb +362 -0
  216. data/lib/pubid/cen_cenelec/identifier.rb +38 -0
  217. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +45 -0
  218. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +19 -0
  219. data/lib/pubid/cen_cenelec/identifiers/base.rb +34 -0
  220. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +29 -0
  221. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +28 -0
  222. data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +28 -0
  223. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +40 -0
  224. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +20 -0
  225. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +99 -0
  226. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +50 -0
  227. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +29 -0
  228. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +18 -0
  229. data/lib/pubid/cen_cenelec/identifiers/guide.rb +27 -0
  230. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +28 -0
  231. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +28 -0
  232. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +36 -0
  233. data/lib/pubid/cen_cenelec/identifiers.rb +32 -0
  234. data/lib/pubid/cen_cenelec/parser.rb +144 -0
  235. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  236. data/lib/pubid/cen_cenelec/single_identifier.rb +49 -0
  237. data/lib/pubid/cen_cenelec/supplement_identifier.rb +47 -0
  238. data/lib/pubid/cen_cenelec/urn_generator.rb +129 -0
  239. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  240. data/lib/pubid/cen_cenelec.rb +208 -0
  241. data/lib/pubid/cie/builder.rb +524 -0
  242. data/lib/pubid/cie/components/language.rb +58 -0
  243. data/lib/pubid/cie/identifier.rb +33 -0
  244. data/lib/pubid/cie/identifiers/bundle.rb +50 -0
  245. data/lib/pubid/cie/identifiers/code_attributes.rb +52 -0
  246. data/lib/pubid/cie/identifiers/conference.rb +37 -0
  247. data/lib/pubid/cie/identifiers/corrigendum.rb +34 -0
  248. data/lib/pubid/cie/identifiers/dual_published.rb +41 -0
  249. data/lib/pubid/cie/identifiers/identical.rb +64 -0
  250. data/lib/pubid/cie/identifiers/joint_published.rb +52 -0
  251. data/lib/pubid/cie/identifiers/proceedings.rb +41 -0
  252. data/lib/pubid/cie/identifiers/standard.rb +93 -0
  253. data/lib/pubid/cie/identifiers/supplement.rb +47 -0
  254. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +24 -0
  255. data/lib/pubid/cie/identifiers.rb +19 -0
  256. data/lib/pubid/cie/parser.rb +396 -0
  257. data/lib/pubid/cie/single_identifier.rb +69 -0
  258. data/lib/pubid/cie/supplement_identifier.rb +39 -0
  259. data/lib/pubid/cie/urn_generator.rb +126 -0
  260. data/lib/pubid/cie/urn_parser.rb +28 -0
  261. data/lib/pubid/cie.rb +83 -0
  262. data/lib/pubid/components/adoption.rb +104 -0
  263. data/lib/pubid/components/code.rb +47 -0
  264. data/lib/pubid/components/date.rb +72 -0
  265. data/lib/pubid/components/edition.rb +35 -0
  266. data/lib/pubid/components/iteration.rb +32 -0
  267. data/lib/pubid/components/language.rb +39 -0
  268. data/lib/pubid/components/locality.rb +19 -0
  269. data/lib/pubid/components/publisher.rb +39 -0
  270. data/lib/pubid/components/relationship.rb +151 -0
  271. data/lib/pubid/components/stage.rb +45 -0
  272. data/lib/pubid/components/supplement.rb +184 -0
  273. data/lib/pubid/components/type.rb +48 -0
  274. data/lib/pubid/components/typed_stage.rb +58 -0
  275. data/lib/pubid/components.rb +19 -0
  276. data/lib/pubid/core/pattern_doc_generator.rb +272 -0
  277. data/lib/pubid/core/update_codes.rb +98 -0
  278. data/lib/pubid/core.rb +8 -0
  279. data/lib/pubid/csa/builder.rb +671 -0
  280. data/lib/pubid/csa/components/code.rb +9 -0
  281. data/lib/pubid/csa/components.rb +9 -0
  282. data/lib/pubid/csa/composite_identifier.rb +38 -0
  283. data/lib/pubid/csa/identifier.rb +570 -0
  284. data/lib/pubid/csa/identifiers/base.rb +10 -0
  285. data/lib/pubid/csa/identifiers/bundled.rb +141 -0
  286. data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
  287. data/lib/pubid/csa/identifiers/cec.rb +66 -0
  288. data/lib/pubid/csa/identifiers/combined.rb +158 -0
  289. data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
  290. data/lib/pubid/csa/identifiers/package.rb +65 -0
  291. data/lib/pubid/csa/identifiers/series.rb +23 -0
  292. data/lib/pubid/csa/identifiers/standard.rb +10 -0
  293. data/lib/pubid/csa/identifiers.rb +17 -0
  294. data/lib/pubid/csa/parser.rb +449 -0
  295. data/lib/pubid/csa/renderer.rb +300 -0
  296. data/lib/pubid/csa/single_identifier.rb +119 -0
  297. data/lib/pubid/csa/urn_generator.rb +87 -0
  298. data/lib/pubid/csa/urn_parser.rb +33 -0
  299. data/lib/pubid/csa/wrapper_identifier.rb +64 -0
  300. data/lib/pubid/csa.rb +80 -0
  301. data/lib/pubid/doi/builder.rb +18 -0
  302. data/lib/pubid/doi/identifier.rb +49 -0
  303. data/lib/pubid/doi/identifiers/resource.rb +30 -0
  304. data/lib/pubid/doi/identifiers.rb +9 -0
  305. data/lib/pubid/doi/parser.rb +52 -0
  306. data/lib/pubid/doi/renderer.rb +13 -0
  307. data/lib/pubid/doi.rb +55 -0
  308. data/lib/pubid/easc/builder.rb +55 -0
  309. data/lib/pubid/easc/identifier.rb +59 -0
  310. data/lib/pubid/easc/identifiers/pmg.rb +20 -0
  311. data/lib/pubid/easc/identifiers/rmg.rb +19 -0
  312. data/lib/pubid/easc/identifiers.rb +10 -0
  313. data/lib/pubid/easc/parser.rb +88 -0
  314. data/lib/pubid/easc/renderer.rb +48 -0
  315. data/lib/pubid/easc/urn_generator.rb +46 -0
  316. data/lib/pubid/easc/urn_parser.rb +57 -0
  317. data/lib/pubid/easc.rb +52 -0
  318. data/lib/pubid/ecma/builder.rb +45 -0
  319. data/lib/pubid/ecma/identifier.rb +147 -0
  320. data/lib/pubid/ecma/identifiers/memento.rb +30 -0
  321. data/lib/pubid/ecma/identifiers/standard.rb +31 -0
  322. data/lib/pubid/ecma/identifiers/technical_report.rb +31 -0
  323. data/lib/pubid/ecma/identifiers.rb +11 -0
  324. data/lib/pubid/ecma/parser.rb +76 -0
  325. data/lib/pubid/ecma/renderer.rb +67 -0
  326. data/lib/pubid/ecma/urn_generator.rb +46 -0
  327. data/lib/pubid/ecma/urn_parser.rb +51 -0
  328. data/lib/pubid/ecma.rb +67 -0
  329. data/lib/pubid/errors.rb +79 -0
  330. data/lib/pubid/etsi/builder.rb +142 -0
  331. data/lib/pubid/etsi/components/code.rb +43 -0
  332. data/lib/pubid/etsi/components/version.rb +32 -0
  333. data/lib/pubid/etsi/components.rb +10 -0
  334. data/lib/pubid/etsi/identifier.rb +4 -0
  335. data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
  336. data/lib/pubid/etsi/identifiers/base.rb +74 -0
  337. data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
  338. data/lib/pubid/etsi/identifiers/etsi_standard.rb +222 -0
  339. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +123 -0
  340. data/lib/pubid/etsi/identifiers.rb +13 -0
  341. data/lib/pubid/etsi/parser.rb +139 -0
  342. data/lib/pubid/etsi/renderer.rb +48 -0
  343. data/lib/pubid/etsi/urn_generator.rb +76 -0
  344. data/lib/pubid/etsi/urn_parser.rb +34 -0
  345. data/lib/pubid/etsi.rb +71 -0
  346. data/lib/pubid/export/auditor.rb +89 -0
  347. data/lib/pubid/export/exporter.rb +33 -0
  348. data/lib/pubid/export/flavor_exporter.rb +250 -0
  349. data/lib/pubid/export/result.rb +97 -0
  350. data/lib/pubid/export.rb +12 -0
  351. data/lib/pubid/format_detector.rb +16 -0
  352. data/lib/pubid/format_registry.rb +42 -0
  353. data/lib/pubid/gb/builder.rb +45 -0
  354. data/lib/pubid/gb/identifier.rb +67 -0
  355. data/lib/pubid/gb/identifiers/standard.rb +34 -0
  356. data/lib/pubid/gb/identifiers.rb +9 -0
  357. data/lib/pubid/gb/parser.rb +63 -0
  358. data/lib/pubid/gb/renderer.rb +35 -0
  359. data/lib/pubid/gb.rb +87 -0
  360. data/lib/pubid/gost/builder.rb +148 -0
  361. data/lib/pubid/gost/identifier.rb +47 -0
  362. data/lib/pubid/gost/identifiers/foreign_reference.rb +25 -0
  363. data/lib/pubid/gost/identifiers/harmonized.rb +39 -0
  364. data/lib/pubid/gost/identifiers/identical_adoption.rb +39 -0
  365. data/lib/pubid/gost/identifiers/interstate_standard.rb +20 -0
  366. data/lib/pubid/gost/identifiers/national_standard.rb +19 -0
  367. data/lib/pubid/gost/identifiers.rb +13 -0
  368. data/lib/pubid/gost/parser.rb +105 -0
  369. data/lib/pubid/gost/renderer.rb +48 -0
  370. data/lib/pubid/gost/urn_generator.rb +46 -0
  371. data/lib/pubid/gost/urn_parser.rb +52 -0
  372. data/lib/pubid/gost.rb +49 -0
  373. data/lib/pubid/iala/builder.rb +102 -0
  374. data/lib/pubid/iala/identifier.rb +90 -0
  375. data/lib/pubid/iala/identifiers/advice.rb +15 -0
  376. data/lib/pubid/iala/identifiers/annex.rb +57 -0
  377. data/lib/pubid/iala/identifiers/general_assembly.rb +19 -0
  378. data/lib/pubid/iala/identifiers/guideline.rb +17 -0
  379. data/lib/pubid/iala/identifiers/letter.rb +16 -0
  380. data/lib/pubid/iala/identifiers/manual.rb +18 -0
  381. data/lib/pubid/iala/identifiers/model_course.rb +17 -0
  382. data/lib/pubid/iala/identifiers/recommendation.rb +17 -0
  383. data/lib/pubid/iala/identifiers/report.rb +16 -0
  384. data/lib/pubid/iala/identifiers/resolution.rb +16 -0
  385. data/lib/pubid/iala/identifiers/standard.rb +17 -0
  386. data/lib/pubid/iala/identifiers.rb +19 -0
  387. data/lib/pubid/iala/parser.rb +138 -0
  388. data/lib/pubid/iala/renderer.rb +36 -0
  389. data/lib/pubid/iala/urn_generator.rb +49 -0
  390. data/lib/pubid/iala/urn_parser.rb +67 -0
  391. data/lib/pubid/iala.rb +71 -0
  392. data/lib/pubid/iana/builder.rb +22 -0
  393. data/lib/pubid/iana/identifier.rb +140 -0
  394. data/lib/pubid/iana/identifiers/registry.rb +69 -0
  395. data/lib/pubid/iana/identifiers.rb +9 -0
  396. data/lib/pubid/iana/parser.rb +38 -0
  397. data/lib/pubid/iana/renderer.rb +32 -0
  398. data/lib/pubid/iana/urn_generator.rb +19 -0
  399. data/lib/pubid/iana/urn_parser.rb +24 -0
  400. data/lib/pubid/iana.rb +69 -0
  401. data/lib/pubid/identifier.rb +1118 -0
  402. data/lib/pubid/identifier_metadata.rb +148 -0
  403. data/lib/pubid/idf/builder.rb +82 -0
  404. data/lib/pubid/idf/identifier.rb +79 -0
  405. data/lib/pubid/idf/identifiers/amendment.rb +28 -0
  406. data/lib/pubid/idf/identifiers/corrigendum.rb +28 -0
  407. data/lib/pubid/idf/identifiers/international_standard.rb +124 -0
  408. data/lib/pubid/idf/identifiers/reviewed_method.rb +101 -0
  409. data/lib/pubid/idf/identifiers.rb +13 -0
  410. data/lib/pubid/idf/parser.rb +144 -0
  411. data/lib/pubid/idf/renderer.rb +84 -0
  412. data/lib/pubid/idf/single_identifier.rb +19 -0
  413. data/lib/pubid/idf/supplement_identifier.rb +35 -0
  414. data/lib/pubid/idf/urn_generator.rb +49 -0
  415. data/lib/pubid/idf/urn_parser.rb +25 -0
  416. data/lib/pubid/idf.rb +89 -0
  417. data/lib/pubid/iec/builder.rb +458 -0
  418. data/lib/pubid/iec/components/code.rb +36 -0
  419. data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
  420. data/lib/pubid/iec/components/publisher.rb +35 -0
  421. data/lib/pubid/iec/components/sheet.rb +32 -0
  422. data/lib/pubid/iec/components/trf_info.rb +38 -0
  423. data/lib/pubid/iec/components/vap_suffix.rb +41 -0
  424. data/lib/pubid/iec/components.rb +14 -0
  425. data/lib/pubid/iec/identifier.rb +341 -0
  426. data/lib/pubid/iec/identifiers/amendment.rb +97 -0
  427. data/lib/pubid/iec/identifiers/base.rb +54 -0
  428. data/lib/pubid/iec/identifiers/component_specification.rb +29 -0
  429. data/lib/pubid/iec/identifiers/conformity_assessment.rb +28 -0
  430. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +85 -0
  431. data/lib/pubid/iec/identifiers/corrigendum.rb +93 -0
  432. data/lib/pubid/iec/identifiers/fragment_identifier.rb +148 -0
  433. data/lib/pubid/iec/identifiers/guide.rb +86 -0
  434. data/lib/pubid/iec/identifiers/international_standard.rb +162 -0
  435. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +103 -0
  436. data/lib/pubid/iec/identifiers/operational_document.rb +29 -0
  437. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +88 -0
  438. data/lib/pubid/iec/identifiers/sheet_identifier.rb +68 -0
  439. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +30 -0
  440. data/lib/pubid/iec/identifiers/systems_reference_document.rb +29 -0
  441. data/lib/pubid/iec/identifiers/technical_group.rb +30 -0
  442. data/lib/pubid/iec/identifiers/technical_report.rb +114 -0
  443. data/lib/pubid/iec/identifiers/technical_specification.rb +114 -0
  444. data/lib/pubid/iec/identifiers/technology_report.rb +28 -0
  445. data/lib/pubid/iec/identifiers/test_report_form.rb +35 -0
  446. data/lib/pubid/iec/identifiers/vap_identifier.rb +76 -0
  447. data/lib/pubid/iec/identifiers/white_paper.rb +29 -0
  448. data/lib/pubid/iec/identifiers/working_document.rb +62 -0
  449. data/lib/pubid/iec/identifiers.rb +31 -0
  450. data/lib/pubid/iec/parser.rb +443 -0
  451. data/lib/pubid/iec/renderer.rb +267 -0
  452. data/lib/pubid/iec/rendering_style.rb +113 -0
  453. data/lib/pubid/iec/single_identifier.rb +72 -0
  454. data/lib/pubid/iec/supplement_identifier.rb +178 -0
  455. data/lib/pubid/iec/urn_generator.rb +245 -0
  456. data/lib/pubid/iec/urn_parser.rb +128 -0
  457. data/lib/pubid/iec.rb +64 -0
  458. data/lib/pubid/ieee/aiee/builder.rb +85 -0
  459. data/lib/pubid/ieee/aiee/identifier.rb +89 -0
  460. data/lib/pubid/ieee/aiee/parser.rb +130 -0
  461. data/lib/pubid/ieee/aiee.rb +11 -0
  462. data/lib/pubid/ieee/builder.rb +1554 -0
  463. data/lib/pubid/ieee/compaction.rb +121 -0
  464. data/lib/pubid/ieee/components/code.rb +110 -0
  465. data/lib/pubid/ieee/components/draft.rb +147 -0
  466. data/lib/pubid/ieee/components/relationship.rb +13 -0
  467. data/lib/pubid/ieee/components/typed_stage.rb +100 -0
  468. data/lib/pubid/ieee/identifier.rb +5 -0
  469. data/lib/pubid/ieee/identifiers/adopted_standard.rb +81 -0
  470. data/lib/pubid/ieee/identifiers/amendment.rb +40 -0
  471. data/lib/pubid/ieee/identifiers/base.rb +384 -0
  472. data/lib/pubid/ieee/identifiers/code_number.rb +82 -0
  473. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +29 -0
  474. data/lib/pubid/ieee/identifiers/corrigendum.rb +40 -0
  475. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +62 -0
  476. data/lib/pubid/ieee/identifiers/dual_identifier.rb +14 -0
  477. data/lib/pubid/ieee/identifiers/dual_published.rb +79 -0
  478. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +115 -0
  479. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +48 -0
  480. data/lib/pubid/ieee/identifiers/joint_development.rb +223 -0
  481. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +85 -0
  482. data/lib/pubid/ieee/identifiers/nesc/base.rb +127 -0
  483. data/lib/pubid/ieee/identifiers/nesc/draft.rb +43 -0
  484. data/lib/pubid/ieee/identifiers/nesc/edition.rb +32 -0
  485. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +43 -0
  486. data/lib/pubid/ieee/identifiers/nesc/redline.rb +35 -0
  487. data/lib/pubid/ieee/identifiers/nesc/standard.rb +41 -0
  488. data/lib/pubid/ieee/identifiers/nesc.rb +16 -0
  489. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +14 -0
  490. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +49 -0
  491. data/lib/pubid/ieee/identifiers/redlined_standard.rb +26 -0
  492. data/lib/pubid/ieee/identifiers/si_standard.rb +38 -0
  493. data/lib/pubid/ieee/identifiers/standard.rb +44 -0
  494. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +42 -0
  495. data/lib/pubid/ieee/identifiers.rb +34 -0
  496. data/lib/pubid/ieee/ire/builder.rb +62 -0
  497. data/lib/pubid/ieee/ire/identifier.rb +73 -0
  498. data/lib/pubid/ieee/ire/parser.rb +91 -0
  499. data/lib/pubid/ieee/ire.rb +11 -0
  500. data/lib/pubid/ieee/nesc/builder.rb +114 -0
  501. data/lib/pubid/ieee/nesc/parser.rb +155 -0
  502. data/lib/pubid/ieee/nesc.rb +10 -0
  503. data/lib/pubid/ieee/parser.rb +1644 -0
  504. data/lib/pubid/ieee/pre_parser.rb +301 -0
  505. data/lib/pubid/ieee/renderer.rb +408 -0
  506. data/lib/pubid/ieee/typed_stages.rb +183 -0
  507. data/lib/pubid/ieee/urn_generator.rb +215 -0
  508. data/lib/pubid/ieee/urn_parser.rb +34 -0
  509. data/lib/pubid/ieee.rb +163 -0
  510. data/lib/pubid/ieee_debug.rb +30 -0
  511. data/lib/pubid/ietf/builder.rb +78 -0
  512. data/lib/pubid/ietf/identifier.rb +5 -0
  513. data/lib/pubid/ietf/identifiers/base.rb +72 -0
  514. data/lib/pubid/ietf/identifiers/bcp.rb +36 -0
  515. data/lib/pubid/ietf/identifiers/fyi.rb +36 -0
  516. data/lib/pubid/ietf/identifiers/internet_draft.rb +45 -0
  517. data/lib/pubid/ietf/identifiers/rfc.rb +27 -0
  518. data/lib/pubid/ietf/identifiers/serialization.rb +51 -0
  519. data/lib/pubid/ietf/identifiers/std.rb +36 -0
  520. data/lib/pubid/ietf/identifiers.rb +14 -0
  521. data/lib/pubid/ietf/parser.rb +61 -0
  522. data/lib/pubid/ietf/renderer.rb +64 -0
  523. data/lib/pubid/ietf/urn_generator.rb +37 -0
  524. data/lib/pubid/ietf/urn_parser.rb +43 -0
  525. data/lib/pubid/ietf.rb +85 -0
  526. data/lib/pubid/iho/builder.rb +37 -0
  527. data/lib/pubid/iho/identifier.rb +7 -0
  528. data/lib/pubid/iho/identifiers/base.rb +75 -0
  529. data/lib/pubid/iho/identifiers/bibliographic.rb +16 -0
  530. data/lib/pubid/iho/identifiers/circular_letter.rb +15 -0
  531. data/lib/pubid/iho/identifiers/miscellaneous.rb +16 -0
  532. data/lib/pubid/iho/identifiers/publication.rb +15 -0
  533. data/lib/pubid/iho/identifiers/standard.rb +15 -0
  534. data/lib/pubid/iho/identifiers.rb +13 -0
  535. data/lib/pubid/iho/parser.rb +68 -0
  536. data/lib/pubid/iho/renderer.rb +30 -0
  537. data/lib/pubid/iho/urn_generator.rb +29 -0
  538. data/lib/pubid/iho/urn_parser.rb +58 -0
  539. data/lib/pubid/iho.rb +77 -0
  540. data/lib/pubid/isbn/builder.rb +44 -0
  541. data/lib/pubid/isbn/check_digit.rb +53 -0
  542. data/lib/pubid/isbn/identifier.rb +81 -0
  543. data/lib/pubid/isbn/identifiers/book.rb +30 -0
  544. data/lib/pubid/isbn/identifiers.rb +9 -0
  545. data/lib/pubid/isbn/parser.rb +45 -0
  546. data/lib/pubid/isbn/renderer.rb +16 -0
  547. data/lib/pubid/isbn.rb +52 -0
  548. data/lib/pubid/iso/builder.rb +316 -0
  549. data/lib/pubid/iso/bundled_identifier.rb +138 -0
  550. data/lib/pubid/iso/combined_identifier.rb +24 -0
  551. data/lib/pubid/iso/components/code.rb +24 -0
  552. data/lib/pubid/iso/components/publisher.rb +62 -0
  553. data/lib/pubid/iso/components.rb +10 -0
  554. data/lib/pubid/iso/format_resolver.rb +45 -0
  555. data/lib/pubid/iso/identifier.rb +318 -0
  556. data/lib/pubid/iso/identifiers/addendum.rb +107 -0
  557. data/lib/pubid/iso/identifiers/amendment.rb +132 -0
  558. data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
  559. data/lib/pubid/iso/identifiers/data.rb +75 -0
  560. data/lib/pubid/iso/identifiers/directives.rb +65 -0
  561. data/lib/pubid/iso/identifiers/directives_supplement.rb +148 -0
  562. data/lib/pubid/iso/identifiers/extract.rb +30 -0
  563. data/lib/pubid/iso/identifiers/guide.rb +99 -0
  564. data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
  565. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
  566. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +95 -0
  567. data/lib/pubid/iso/identifiers/pas.rb +93 -0
  568. data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
  569. data/lib/pubid/iso/identifiers/supplement.rb +95 -0
  570. data/lib/pubid/iso/identifiers/tc_document.rb +137 -0
  571. data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
  572. data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
  573. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
  574. data/lib/pubid/iso/identifiers.rb +32 -0
  575. data/lib/pubid/iso/normalizer.rb +89 -0
  576. data/lib/pubid/iso/parser.rb +534 -0
  577. data/lib/pubid/iso/rendering_style.rb +120 -0
  578. data/lib/pubid/iso/single_identifier.rb +60 -0
  579. data/lib/pubid/iso/supplement_identifier.rb +53 -0
  580. data/lib/pubid/iso/urn_generator.rb +313 -0
  581. data/lib/pubid/iso/urn_parser.rb +442 -0
  582. data/lib/pubid/iso/utilities.rb +86 -0
  583. data/lib/pubid/iso.rb +236 -0
  584. data/lib/pubid/itu/builder.rb +360 -0
  585. data/lib/pubid/itu/components/code.rb +84 -0
  586. data/lib/pubid/itu/components/designation.rb +35 -0
  587. data/lib/pubid/itu/components/sector.rb +46 -0
  588. data/lib/pubid/itu/components/series.rb +25 -0
  589. data/lib/pubid/itu/components.rb +12 -0
  590. data/lib/pubid/itu/i18n.rb +9 -0
  591. data/lib/pubid/itu/i18n.yaml +30 -0
  592. data/lib/pubid/itu/identifier.rb +4 -0
  593. data/lib/pubid/itu/identifiers/addendum.rb +15 -0
  594. data/lib/pubid/itu/identifiers/amendment.rb +19 -0
  595. data/lib/pubid/itu/identifiers/annex.rb +83 -0
  596. data/lib/pubid/itu/identifiers/annex_of_recommendation.rb +87 -0
  597. data/lib/pubid/itu/identifiers/appendix_of_recommendation.rb +92 -0
  598. data/lib/pubid/itu/identifiers/base.rb +482 -0
  599. data/lib/pubid/itu/identifiers/combined_identifier.rb +121 -0
  600. data/lib/pubid/itu/identifiers/corrigendum.rb +35 -0
  601. data/lib/pubid/itu/identifiers/errata.rb +15 -0
  602. data/lib/pubid/itu/identifiers/handbook.rb +38 -0
  603. data/lib/pubid/itu/identifiers/question.rb +63 -0
  604. data/lib/pubid/itu/identifiers/recommendation.rb +15 -0
  605. data/lib/pubid/itu/identifiers/report.rb +39 -0
  606. data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
  607. data/lib/pubid/itu/identifiers/standard_serialization.rb +58 -0
  608. data/lib/pubid/itu/identifiers/supplement.rb +149 -0
  609. data/lib/pubid/itu/identifiers.rb +25 -0
  610. data/lib/pubid/itu/model.rb +111 -0
  611. data/lib/pubid/itu/parser.rb +679 -0
  612. data/lib/pubid/itu/urn_generator.rb +135 -0
  613. data/lib/pubid/itu/urn_parser.rb +31 -0
  614. data/lib/pubid/itu.rb +78 -0
  615. data/lib/pubid/jcgm/builder.rb +106 -0
  616. data/lib/pubid/jcgm/components/publisher.rb +20 -0
  617. data/lib/pubid/jcgm/components.rb +9 -0
  618. data/lib/pubid/jcgm/identifier.rb +21 -0
  619. data/lib/pubid/jcgm/identifiers/amendment.rb +24 -0
  620. data/lib/pubid/jcgm/identifiers/corrigendum.rb +34 -0
  621. data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
  622. data/lib/pubid/jcgm/identifiers/gum_guide.rb +39 -0
  623. data/lib/pubid/jcgm/identifiers/meeting.rb +47 -0
  624. data/lib/pubid/jcgm/identifiers.rb +13 -0
  625. data/lib/pubid/jcgm/parser.rb +151 -0
  626. data/lib/pubid/jcgm/renderer.rb +89 -0
  627. data/lib/pubid/jcgm/single_identifier.rb +118 -0
  628. data/lib/pubid/jcgm/supplement_identifier.rb +51 -0
  629. data/lib/pubid/jcgm/urn_generator.rb +116 -0
  630. data/lib/pubid/jcgm/urn_parser.rb +177 -0
  631. data/lib/pubid/jcgm.rb +86 -0
  632. data/lib/pubid/jis/builder.rb +116 -0
  633. data/lib/pubid/jis/identifier.rb +194 -0
  634. data/lib/pubid/jis/identifiers/amendment.rb +16 -0
  635. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  636. data/lib/pubid/jis/identifiers/explanation.rb +22 -0
  637. data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
  638. data/lib/pubid/jis/identifiers/standard.rb +28 -0
  639. data/lib/pubid/jis/identifiers/technical_report.rb +32 -0
  640. data/lib/pubid/jis/identifiers/technical_specification.rb +32 -0
  641. data/lib/pubid/jis/identifiers.rb +17 -0
  642. data/lib/pubid/jis/parser.rb +135 -0
  643. data/lib/pubid/jis/renderer.rb +69 -0
  644. data/lib/pubid/jis/single_identifier.rb +31 -0
  645. data/lib/pubid/jis/supplement_identifier.rb +50 -0
  646. data/lib/pubid/jis/urn_generator.rb +25 -0
  647. data/lib/pubid/jis/urn_parser.rb +23 -0
  648. data/lib/pubid/jis.rb +69 -0
  649. data/lib/pubid/lutaml/no_store_registration.rb +30 -0
  650. data/lib/pubid/nist/builder.rb +481 -0
  651. data/lib/pubid/nist/caster.rb +1234 -0
  652. data/lib/pubid/nist/circular_supplement_builder.rb +293 -0
  653. data/lib/pubid/nist/components/code.rb +27 -0
  654. data/lib/pubid/nist/components/edition.rb +134 -0
  655. data/lib/pubid/nist/components/issue_number.rb +28 -0
  656. data/lib/pubid/nist/components/part.rb +77 -0
  657. data/lib/pubid/nist/components/stage.rb +53 -0
  658. data/lib/pubid/nist/components/supplement.rb +191 -0
  659. data/lib/pubid/nist/components/translation.rb +42 -0
  660. data/lib/pubid/nist/components/update.rb +103 -0
  661. data/lib/pubid/nist/components/version.rb +35 -0
  662. data/lib/pubid/nist/components/volume.rb +32 -0
  663. data/lib/pubid/nist/components.rb +18 -0
  664. data/lib/pubid/nist/configuration.rb +87 -0
  665. data/lib/pubid/nist/identifier.rb +8 -0
  666. data/lib/pubid/nist/identifiers/base.rb +744 -0
  667. data/lib/pubid/nist/identifiers/circular.rb +80 -0
  668. data/lib/pubid/nist/identifiers/circular_supplement.rb +60 -0
  669. data/lib/pubid/nist/identifiers/commercial_standard.rb +42 -0
  670. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +58 -0
  671. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +69 -0
  672. data/lib/pubid/nist/identifiers/crpl_report.rb +138 -0
  673. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  674. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +95 -0
  675. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +36 -0
  676. data/lib/pubid/nist/identifiers/handbook.rb +58 -0
  677. data/lib/pubid/nist/identifiers/internal_report.rb +64 -0
  678. data/lib/pubid/nist/identifiers/letter_circular.rb +46 -0
  679. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +74 -0
  680. data/lib/pubid/nist/identifiers/monograph.rb +80 -0
  681. data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
  682. data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
  683. data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
  684. data/lib/pubid/nist/identifiers/report.rb +77 -0
  685. data/lib/pubid/nist/identifiers/special_publication.rb +46 -0
  686. data/lib/pubid/nist/identifiers/technical_note.rb +91 -0
  687. data/lib/pubid/nist/identifiers.rb +33 -0
  688. data/lib/pubid/nist/parser.rb +752 -0
  689. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  690. data/lib/pubid/nist/preprocessor.rb +443 -0
  691. data/lib/pubid/nist/renderer.rb +43 -0
  692. data/lib/pubid/nist/router.rb +149 -0
  693. data/lib/pubid/nist/series/base.rb +58 -0
  694. data/lib/pubid/nist/series/crpl.rb +13 -0
  695. data/lib/pubid/nist/series/fips.rb +14 -0
  696. data/lib/pubid/nist/series/ir.rb +57 -0
  697. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  698. data/lib/pubid/nist/series/mono.rb +19 -0
  699. data/lib/pubid/nist/series/ncstar.rb +20 -0
  700. data/lib/pubid/nist/series.rb +49 -0
  701. data/lib/pubid/nist/supplement_identifier.rb +84 -0
  702. data/lib/pubid/nist/urn_generator.rb +133 -0
  703. data/lib/pubid/nist/urn_parser.rb +67 -0
  704. data/lib/pubid/nist.rb +138 -0
  705. data/lib/pubid/oasis/builder.rb +79 -0
  706. data/lib/pubid/oasis/identifier.rb +160 -0
  707. data/lib/pubid/oasis/identifiers/standard.rb +29 -0
  708. data/lib/pubid/oasis/identifiers.rb +9 -0
  709. data/lib/pubid/oasis/parser.rb +34 -0
  710. data/lib/pubid/oasis/renderer.rb +29 -0
  711. data/lib/pubid/oasis/urn_generator.rb +25 -0
  712. data/lib/pubid/oasis/urn_parser.rb +22 -0
  713. data/lib/pubid/oasis.rb +79 -0
  714. data/lib/pubid/ogc/builder.rb +33 -0
  715. data/lib/pubid/ogc/identifier.rb +81 -0
  716. data/lib/pubid/ogc/identifiers/document.rb +26 -0
  717. data/lib/pubid/ogc/identifiers.rb +10 -0
  718. data/lib/pubid/ogc/parser.rb +40 -0
  719. data/lib/pubid/ogc/renderer.rb +33 -0
  720. data/lib/pubid/ogc/urn_generator.rb +14 -0
  721. data/lib/pubid/ogc/urn_parser.rb +22 -0
  722. data/lib/pubid/ogc.rb +71 -0
  723. data/lib/pubid/oiml/builder.rb +270 -0
  724. data/lib/pubid/oiml/components/code.rb +37 -0
  725. data/lib/pubid/oiml/components.rb +9 -0
  726. data/lib/pubid/oiml/identifier.rb +64 -0
  727. data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
  728. data/lib/pubid/oiml/identifiers/annex.rb +29 -0
  729. data/lib/pubid/oiml/identifiers/basic_publication.rb +15 -0
  730. data/lib/pubid/oiml/identifiers/bulletin.rb +137 -0
  731. data/lib/pubid/oiml/identifiers/code_number.rb +90 -0
  732. data/lib/pubid/oiml/identifiers/document.rb +15 -0
  733. data/lib/pubid/oiml/identifiers/errata.rb +15 -0
  734. data/lib/pubid/oiml/identifiers/expert_report.rb +15 -0
  735. data/lib/pubid/oiml/identifiers/guide.rb +15 -0
  736. data/lib/pubid/oiml/identifiers/recommendation.rb +15 -0
  737. data/lib/pubid/oiml/identifiers/seminar_report.rb +15 -0
  738. data/lib/pubid/oiml/identifiers/vocabulary.rb +15 -0
  739. data/lib/pubid/oiml/identifiers.rb +20 -0
  740. data/lib/pubid/oiml/parser.rb +274 -0
  741. data/lib/pubid/oiml/renderer.rb +232 -0
  742. data/lib/pubid/oiml/single_identifier.rb +113 -0
  743. data/lib/pubid/oiml/supplement_identifier.rb +88 -0
  744. data/lib/pubid/oiml/urn_generator.rb +78 -0
  745. data/lib/pubid/oiml/urn_parser.rb +39 -0
  746. data/lib/pubid/oiml.rb +81 -0
  747. data/lib/pubid/omg/builder.rb +19 -0
  748. data/lib/pubid/omg/identifier.rb +47 -0
  749. data/lib/pubid/omg/identifiers/specification.rb +32 -0
  750. data/lib/pubid/omg/identifiers.rb +9 -0
  751. data/lib/pubid/omg/parser.rb +40 -0
  752. data/lib/pubid/omg/renderer.rb +19 -0
  753. data/lib/pubid/omg.rb +51 -0
  754. data/lib/pubid/parser/common_parse_methods.rb +13 -0
  755. data/lib/pubid/parser/common_parse_rules.rb +56 -0
  756. data/lib/pubid/parser/grammar.rb +74 -0
  757. data/lib/pubid/parser.rb +9 -0
  758. data/lib/pubid/parsers/base.rb +11 -0
  759. data/lib/pubid/parsers/mr_string.rb +206 -0
  760. data/lib/pubid/plateau/builder.rb +54 -0
  761. data/lib/pubid/plateau/identifier.rb +4 -0
  762. data/lib/pubid/plateau/identifiers/annex.rb +16 -0
  763. data/lib/pubid/plateau/identifiers/base.rb +55 -0
  764. data/lib/pubid/plateau/identifiers/handbook.rb +28 -0
  765. data/lib/pubid/plateau/identifiers/technical_report.rb +16 -0
  766. data/lib/pubid/plateau/identifiers.rb +11 -0
  767. data/lib/pubid/plateau/parser.rb +73 -0
  768. data/lib/pubid/plateau/renderer.rb +51 -0
  769. data/lib/pubid/plateau/supplement_identifier.rb +68 -0
  770. data/lib/pubid/plateau/urn_generator.rb +29 -0
  771. data/lib/pubid/plateau/urn_parser.rb +43 -0
  772. data/lib/pubid/plateau.rb +82 -0
  773. data/lib/pubid/prefixes_support.rb +51 -0
  774. data/lib/pubid/renderers/annotator.rb +233 -0
  775. data/lib/pubid/renderers/base.rb +66 -0
  776. data/lib/pubid/renderers/directives_renderer.rb +75 -0
  777. data/lib/pubid/renderers/guide_renderer.rb +26 -0
  778. data/lib/pubid/renderers/human_readable.rb +83 -0
  779. data/lib/pubid/renderers/iwa_renderer.rb +20 -0
  780. data/lib/pubid/renderers/mr_string.rb +64 -0
  781. data/lib/pubid/renderers/supplement_renderer.rb +36 -0
  782. data/lib/pubid/renderers/urn.rb +11 -0
  783. data/lib/pubid/renderers.rb +15 -0
  784. data/lib/pubid/rendering/context.rb +168 -0
  785. data/lib/pubid/rendering/date.rb +27 -0
  786. data/lib/pubid/rendering/language.rb +21 -0
  787. data/lib/pubid/rendering/numbering.rb +42 -0
  788. data/lib/pubid/rendering/publisher.rb +25 -0
  789. data/lib/pubid/rendering/stage.rb +38 -0
  790. data/lib/pubid/rendering/supplement.rb +46 -0
  791. data/lib/pubid/rendering.rb +13 -0
  792. data/lib/pubid/sae/builder.rb +32 -0
  793. data/lib/pubid/sae/components/code.rb +9 -0
  794. data/lib/pubid/sae/components/date.rb +27 -0
  795. data/lib/pubid/sae/components/type.rb +23 -0
  796. data/lib/pubid/sae/components.rb +11 -0
  797. data/lib/pubid/sae/identifier.rb +4 -0
  798. data/lib/pubid/sae/identifiers/base.rb +47 -0
  799. data/lib/pubid/sae/identifiers.rb +8 -0
  800. data/lib/pubid/sae/parser.rb +55 -0
  801. data/lib/pubid/sae/renderer.rb +36 -0
  802. data/lib/pubid/sae/urn_generator.rb +30 -0
  803. data/lib/pubid/sae/urn_parser.rb +36 -0
  804. data/lib/pubid/sae.rb +66 -0
  805. data/lib/pubid/tgpp/builder.rb +41 -0
  806. data/lib/pubid/tgpp/identifier.rb +107 -0
  807. data/lib/pubid/tgpp/identifiers/technical_report.rb +32 -0
  808. data/lib/pubid/tgpp/identifiers/technical_specification.rb +33 -0
  809. data/lib/pubid/tgpp/identifiers.rb +11 -0
  810. data/lib/pubid/tgpp/parser.rb +78 -0
  811. data/lib/pubid/tgpp/renderer.rb +52 -0
  812. data/lib/pubid/tgpp/urn_generator.rb +39 -0
  813. data/lib/pubid/tgpp/urn_parser.rb +30 -0
  814. data/lib/pubid/tgpp.rb +83 -0
  815. data/lib/pubid/type_resolver.rb +59 -0
  816. data/lib/pubid/un/builder.rb +42 -0
  817. data/lib/pubid/un/identifier.rb +40 -0
  818. data/lib/pubid/un/identifiers/document.rb +24 -0
  819. data/lib/pubid/un/identifiers.rb +9 -0
  820. data/lib/pubid/un/parser.rb +25 -0
  821. data/lib/pubid/un/renderer.rb +11 -0
  822. data/lib/pubid/un.rb +46 -0
  823. data/lib/pubid/urn_generator/base.rb +110 -0
  824. data/lib/pubid/urn_parser/base.rb +81 -0
  825. data/lib/pubid/urn_parser/errors.rb +16 -0
  826. data/lib/pubid/urn_parser.rb +14 -0
  827. data/lib/pubid/utils/string_normalizer.rb +196 -0
  828. data/lib/pubid/utils.rb +7 -0
  829. data/lib/pubid/version.rb +3 -1
  830. data/lib/pubid/w3c/builder.rb +55 -0
  831. data/lib/pubid/w3c/identifier.rb +130 -0
  832. data/lib/pubid/w3c/identifiers/candidate_recommendation.rb +31 -0
  833. data/lib/pubid/w3c/identifiers/candidate_recommendation_draft.rb +31 -0
  834. data/lib/pubid/w3c/identifiers/draft_note.rb +31 -0
  835. data/lib/pubid/w3c/identifiers/note.rb +30 -0
  836. data/lib/pubid/w3c/identifiers/obsolete_recommendation.rb +31 -0
  837. data/lib/pubid/w3c/identifiers/proposed_edited_recommendation.rb +31 -0
  838. data/lib/pubid/w3c/identifiers/proposed_recommendation.rb +31 -0
  839. data/lib/pubid/w3c/identifiers/recommendation.rb +31 -0
  840. data/lib/pubid/w3c/identifiers/standard.rb +12 -0
  841. data/lib/pubid/w3c/identifiers/superseded_recommendation.rb +31 -0
  842. data/lib/pubid/w3c/identifiers/working_draft.rb +30 -0
  843. data/lib/pubid/w3c/identifiers.rb +25 -0
  844. data/lib/pubid/w3c/parser.rb +43 -0
  845. data/lib/pubid/w3c/renderer.rb +35 -0
  846. data/lib/pubid/w3c/urn_generator.rb +18 -0
  847. data/lib/pubid/w3c/urn_parser.rb +36 -0
  848. data/lib/pubid/w3c.rb +67 -0
  849. data/lib/pubid/xsf/builder.rb +17 -0
  850. data/lib/pubid/xsf/identifier.rb +66 -0
  851. data/lib/pubid/xsf/identifiers/xep.rb +31 -0
  852. data/lib/pubid/xsf/identifiers.rb +9 -0
  853. data/lib/pubid/xsf/parser.rb +25 -0
  854. data/lib/pubid/xsf/renderer.rb +23 -0
  855. data/lib/pubid/xsf/urn_generator.rb +13 -0
  856. data/lib/pubid/xsf/urn_parser.rb +18 -0
  857. data/lib/pubid/xsf.rb +81 -0
  858. data/lib/pubid.rb +551 -13
  859. data/lib/tasks/docs.rake +37 -0
  860. data/lib/tasks/export.rake +39 -0
  861. data/lib/tasks/website-data.json +7546 -0
  862. metadata +875 -171
  863. data/lib/pubid/registry.rb +0 -30
data/lib/pubid/iso.rb ADDED
@@ -0,0 +1,236 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Iso
7
+ extend Pubid::PrefixesSupport
8
+
9
+ # Sole ISO publisher token. Joint / co-publication forms (ISO/IEC, IEC/ISO,
10
+ # ISO/IEC/IEEE) are contributed symmetrically via Pubid::JOINT_PREFIXES.
11
+ PREFIXES = ["ISO"].freeze
12
+
13
+ autoload :Builder, "#{__dir__}/iso/builder"
14
+ autoload :BundledIdentifier, "#{__dir__}/iso/bundled_identifier"
15
+ autoload :CombinedIdentifier, "#{__dir__}/iso/combined_identifier"
16
+ autoload :Components, "#{__dir__}/iso/components"
17
+ autoload :FormatResolver, "#{__dir__}/iso/format_resolver"
18
+ autoload :Identifier, "#{__dir__}/iso/identifier"
19
+ autoload :Identifiers, "#{__dir__}/iso/identifiers"
20
+ autoload :Normalizer, "#{__dir__}/iso/normalizer"
21
+ autoload :Parser, "#{__dir__}/iso/parser"
22
+ autoload :RenderingStyle, "#{__dir__}/iso/rendering_style"
23
+ autoload :SingleIdentifier, "#{__dir__}/iso/single_identifier"
24
+ autoload :SupplementIdentifier, "#{__dir__}/iso/supplement_identifier"
25
+ autoload :UrnGenerator, "#{__dir__}/iso/urn_generator"
26
+ autoload :UrnParser, "#{__dir__}/iso/urn_parser"
27
+ autoload :Utilities, "#{__dir__}/iso/utilities"
28
+
29
+ # Parse an ISO identifier string
30
+ # @param identifier [String] the identifier string to parse
31
+ # @param format [Symbol] :auto, :human, :mr_string, or :urn
32
+ # @return [Identifier] the parsed identifier
33
+ def self.parse(identifier, format: :auto)
34
+ unless identifier.is_a?(String)
35
+ raise Pubid::Errors::InvalidInputError,
36
+ Pubid::INPUT_NOT_A_STRING_MESSAGE
37
+ end
38
+
39
+ if identifier.length > Pubid::MAX_INPUT_LENGTH
40
+ raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
41
+ end
42
+
43
+ format = Pubid::FormatDetector.detect(identifier) if format == :auto
44
+
45
+ case format
46
+ when :urn
47
+ UrnParser.parse(identifier)
48
+ when :mr_string
49
+ Pubid::Parsers::MrString.parse(identifier)
50
+ else
51
+ Normalizer.apply(identifier)
52
+ end
53
+ end
54
+
55
+ # Build an ISO identifier from attributes.
56
+ #
57
+ # This is the public seam: callers in other flavors should never reach
58
+ # into `Pubid::Iso::Identifiers::*` or `Pubid::Iso::Components::*`
59
+ # directly — go through this method so the internal class registry can
60
+ # change without breaking callers.
61
+ #
62
+ # Accepts either raw values (Strings/Integers) or pre-built components.
63
+ # Raw values are wrapped in the appropriate ISO component internally.
64
+ #
65
+ # @param type [Symbol] the type key (e.g. :is, :tr, :ts, :guide)
66
+ # @param publisher [String, Pubid::Iso::Components::Publisher] primary publisher
67
+ # @param copublishers [Array<String>, Array<Pubid::Components::Publisher>]
68
+ # @param number [String, Integer, Pubid::Iso::Components::Code]
69
+ # @param year [String, Integer, Pubid::Components::Date, nil]
70
+ # @param attrs [Hash] additional identifier attributes
71
+ # @return [Pubid::Iso::Identifier]
72
+ def self.build(type:, publisher: nil, copublishers: nil, number: nil,
73
+ year: nil, **attrs)
74
+ klass = locate_type(type) || raise(ArgumentError, "unknown ISO type: #{type.inspect}")
75
+
76
+ copub_list = Array(copublishers)
77
+ attrs[:publisher] = build_publisher(publisher, copub_list) if publisher || copub_list.any?
78
+ attrs[:copublishers] = build_copublishers(copub_list) if copub_list.any?
79
+ attrs[:number] = build_code(number) if number
80
+ attrs[:date] = build_date(year) if year
81
+
82
+ klass.new(attrs)
83
+ end
84
+
85
+ # @!visibility private
86
+ def self.build_publisher(value, copublishers = [])
87
+ return value if value.is_a?(Components::Publisher) && copublishers.empty?
88
+
89
+ copub_strings = copublishers.map { |cp| cp.is_a?(Components::Publisher) ? cp.publisher : cp.to_s }
90
+ Components::Publisher.new(
91
+ publisher: value.is_a?(Components::Publisher) ? value.publisher : value.to_s,
92
+ copublisher: copub_strings,
93
+ )
94
+ end
95
+ private_class_method :build_publisher
96
+
97
+ # @!visibility private
98
+ def self.build_copublishers(list)
99
+ Array(list).map do |cp|
100
+ next cp if cp.is_a?(Components::Publisher)
101
+
102
+ Components::Publisher.new(publisher: cp.to_s)
103
+ end
104
+ end
105
+ private_class_method :build_copublishers
106
+
107
+ # @!visibility private
108
+ def self.build_code(value)
109
+ return value if value.is_a?(Components::Code)
110
+
111
+ Components::Code.new(value: value.to_s)
112
+ end
113
+ private_class_method :build_code
114
+
115
+ # @!visibility private
116
+ def self.build_date(value)
117
+ return value if value.is_a?(::Pubid::Components::Date)
118
+
119
+ ::Pubid::Components::Date.new(year: value.to_s)
120
+ end
121
+ private_class_method :build_date
122
+
123
+ # Parse an ISO URN string
124
+ # @param urn [String] the URN string to parse
125
+ # @return [Identifier] the parsed identifier
126
+ # @raise [Errors::ParseError] if URN is invalid
127
+ def self.parse_urn(urn)
128
+ UrnParser.parse(urn)
129
+ end
130
+
131
+ # Build an ISO identifier from a Parslet parse-tree hash (used by other
132
+ # flavors when parsing joint identifiers, e.g. IEC's `IEC … | ISO …` form).
133
+ #
134
+ # This is the public seam: callers should never reach into
135
+ # `Pubid::Iso::Builder` directly.
136
+ #
137
+ # @param hash [Hash] parse tree for an ISO identifier
138
+ # @return [Pubid::Iso::Identifier]
139
+ def self.build_from_parse(hash)
140
+ builder.build(hash)
141
+ end
142
+
143
+ # Return the named Parslet rule atom from the ISO parser, for embedding in
144
+ # another flavor's grammar (e.g. IEC joint identifiers).
145
+ #
146
+ # This is the public seam: callers should never instantiate
147
+ # `Pubid::Iso::Parser` directly.
148
+ #
149
+ # @param rule_name [Symbol] the parser rule to expose
150
+ # @return [Parslet::Atoms::Base]
151
+ def self.joint_grammar_atom(rule_name)
152
+ parser.public_send(rule_name)
153
+ end
154
+
155
+ # Auto-discover all identifier types from the Identifiers namespace
156
+ # @return [Array<Class>] identifier classes that define a self.type Hash
157
+ def self.identifier_types
158
+ @identifier_types ||= Identifiers.constants
159
+ .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
160
+ .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
161
+ .select { |c| c.type.is_a?(Hash) }
162
+ end
163
+
164
+ # Build typed stage index from identifier types
165
+ # @return [Array<Pubid::Components::TypedStage>] all typed stages
166
+ def self.all_typed_stages
167
+ @all_typed_stages ||= identifier_types.flat_map do |klass|
168
+ if klass.const_defined?(:TYPED_STAGES)
169
+ klass.const_get(:TYPED_STAGES)
170
+ else
171
+ []
172
+ end
173
+ end
174
+ end
175
+
176
+ # Memoized builder instance used by Normalizer / URN parser
177
+ # @return [Pubid::Iso::Builder]
178
+ def self.builder
179
+ @builder ||= Builder.new
180
+ end
181
+
182
+ # Memoized parser instance used by Normalizer
183
+ # @return [Pubid::Iso::Parser]
184
+ def self.parser
185
+ @parser ||= Parser.new
186
+ end
187
+
188
+ # Lookup: type code -> identifier class
189
+ # @param code [String, Symbol] the type key to find
190
+ # @return [Class, nil] the matching identifier class
191
+ def self.locate_type(code)
192
+ identifier_types.find { |t| t.type[:key].to_s == code.to_s }
193
+ end
194
+
195
+ # Lookup: abbreviation -> typed stage
196
+ # @param abbr [String, Symbol] the abbreviation to find
197
+ # @return [Pubid::Components::TypedStage, nil] the matching typed stage
198
+ def self.locate_stage(abbr)
199
+ abbr_str = abbr.to_s.upcase
200
+ all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
201
+ end
202
+
203
+ # Lookup: stage code -> typed stage
204
+ # @param stage_code [String, Symbol]
205
+ # @return [Pubid::Components::TypedStage, nil]
206
+ def self.locate_stage_by_stage_code(stage_code)
207
+ stage_code_sym = stage_code.to_sym
208
+ all_typed_stages.find { |s| s.stage_code.to_sym == stage_code_sym }
209
+ end
210
+
211
+ # Lookup: per-typed-stage code -> typed stage
212
+ # @param code [String, Symbol]
213
+ # @return [Pubid::Components::TypedStage, nil]
214
+ def self.locate_stage_by_code(code)
215
+ code_sym = code.to_sym
216
+ all_typed_stages.find { |s| s.code&.to_sym == code_sym }
217
+ end
218
+
219
+ # Lookup: harmonized stage code -> typed stage
220
+ # @param harmonized_code [String]
221
+ # @return [Pubid::Components::TypedStage, nil]
222
+ def self.locate_stage_by_harmonized_code(harmonized_code)
223
+ harmonized_str = harmonized_code.to_s
224
+ all_typed_stages.find { |s| s.harmonized_stages&.include?(harmonized_str) }
225
+ end
226
+
227
+ # Default typed stage used when no type_with_stage is present
228
+ # (e.g., the bare International Standard published stage)
229
+ # @return [Pubid::Components::TypedStage]
230
+ def self.default_typed_stage
231
+ locate_stage("") || all_typed_stages.first
232
+ end
233
+ end
234
+ end
235
+
236
+ Pubid::Registry.register(:iso, Pubid::Iso)
@@ -0,0 +1,360 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Itu
5
+ class Builder
6
+ def self.build(parsed_data)
7
+ new.build(parsed_data)
8
+ end
9
+
10
+ def build(data)
11
+ # "Annex to ..." identifier — wraps a Special Publication base
12
+ if data[:annex_to]
13
+ return build_annex(data[:annex_to])
14
+ end
15
+
16
+ # Common-text twin ("| ISO/IEC ..." suffix) — extract before building
17
+ # the base ITU identifier, then attach to whichever class the base
18
+ # resolves to.
19
+ twin = parse_common_text_twin(data.delete(:common_text_twin))
20
+
21
+ # Labelled annex of a Recommendation — "ITU-T A.23 Annex A (06/2014)".
22
+ # The annexed document is the :base subtree; :year/:month at this level
23
+ # are the annex's own date, not the base's.
24
+ if data[:annex_number]
25
+ annex = build_annex_of_recommendation(data)
26
+ annex.common_text_twin = twin if twin
27
+ return annex
28
+ end
29
+
30
+ # Labelled appendix of a Recommendation — "ITU-T G.101 App. I
31
+ # (05/2000)". Same shape as the annex above.
32
+ if data[:appendix_number]
33
+ appendix = build_appendix_of_recommendation(data)
34
+ appendix.common_text_twin = twin if twin
35
+ return appendix
36
+ end
37
+
38
+ # Operational Bulletin (Special Publication) — series == "OB" or
39
+ # legacy long form ("Operational Bulletin No. ...").
40
+ # The series_dash guard keeps a series-code "ITU-T OB-1" out of this
41
+ # branch, which would drop the dash and render it "ITU OB No. 1".
42
+ # Belt-and-braces: `series_code_body` already refuses "OB" + dash, so
43
+ # nothing reaches here with both set — the guard documents that coupling
44
+ # so removing the parser's `absent?` fails loudly rather than silently
45
+ # rerouting.
46
+ if (data[:series].to_s == "OB" && data[:series_dash].nil?) ||
47
+ data[:_op_bull]
48
+ sp = build_special_publication(data)
49
+ sp.common_text_twin = twin if twin && sp
50
+ return sp
51
+ end
52
+
53
+ # Check if this is a supplement identifier
54
+ if data[:supplement_type]
55
+ supp = build_supplement(data)
56
+ supp.common_text_twin = twin if twin && supp
57
+ return supp
58
+ end
59
+
60
+ # Handbook — "ITU-R 42.HDB"
61
+ if data[:handbook_marker]
62
+ return build_handbook(data)
63
+ end
64
+
65
+ # Question — numeric ("ITU-R 234-1/7:") or letter-series
66
+ # ("ITU-R P.3/BL/7"). Both carry a :study_group marker.
67
+ if data[:study_group]
68
+ return build_question(data)
69
+ end
70
+
71
+ # Build basic recommendation or combined identifier
72
+ sector = Components::Sector.new(sector: data[:sector].to_s)
73
+ series = Components::Series.new(series: data[:series].to_s) if data[:series]
74
+ code = build_code(data) if data[:number]
75
+ date = build_date(data) if data[:year]
76
+
77
+ # Combined (joint) recommendation — one or more additional
78
+ # "/SERIES.CODE" designations after the primary (e.g. "G.780/Y.1351",
79
+ # "G.780/Y.1351/Z.1362"). The primary stays on the base series/code.
80
+ if data[:combined]
81
+ return Identifiers::CombinedIdentifier.new(
82
+ sector: sector,
83
+ series: series,
84
+ code: code,
85
+ combined: build_designations(data[:combined]),
86
+ date: date,
87
+ version: data[:version]&.to_s,
88
+ # with_series offers these slots on either side of
89
+ # combined_suffixes, so a joint id can carry them too; not
90
+ # forwarding them let "ITU-T H.350/X.1 attachment" compare equal to
91
+ # the un-attached document.
92
+ series_word: !data[:series_word].nil?,
93
+ series_dash: !data[:series_dash].nil?,
94
+ attachment: !data[:attachment].nil?,
95
+ range_end: data[:range_end]&.to_s,
96
+ language: data[:language]&.to_s,
97
+ common_text_twin: twin,
98
+ )
99
+ end
100
+
101
+ # A Report ("Report ITU-R BT.2020-1") is shaped exactly like a
102
+ # Recommendation — only the leading word, captured as :report_marker,
103
+ # tells the two apart, and it has to, because the two series number
104
+ # independently and the same series/number is two real documents.
105
+ klass = data[:report_marker] ? Identifiers::Report : Identifiers::Recommendation
106
+
107
+ klass.new(
108
+ sector: sector,
109
+ series: series,
110
+ code: code,
111
+ date: date,
112
+ version: data[:version]&.to_s,
113
+ series_word: !data[:series_word].nil?,
114
+ series_dash: !data[:series_dash].nil?,
115
+ attachment: !data[:attachment].nil?,
116
+ range_end: data[:range_end]&.to_s,
117
+ language: data[:language]&.to_s,
118
+ common_text_twin: twin,
119
+ )
120
+ end
121
+
122
+ # Parse the common-text twin string ("| ISO/IEC 13818-1:2022") into
123
+ # the appropriate flavor's identifier object. Returns nil if the twin
124
+ # is empty or unparseable.
125
+ def parse_common_text_twin(twin_raw)
126
+ return nil if twin_raw.nil?
127
+
128
+ twin_str = twin_raw.to_s.strip
129
+ # Strip a leading pipe if the parser captured it
130
+ twin_str = twin_str.sub(/\A\s*\|\s*/, "")
131
+ return nil if twin_str.empty?
132
+
133
+ case twin_str
134
+ when /\AISO\/IEC\b/, /\AISO\b/
135
+ Pubid::Iso.parse(twin_str)
136
+ when /\AIEC\b/
137
+ Pubid::Iec.parse(twin_str)
138
+ end
139
+ rescue StandardError
140
+ # If the twin doesn't parse as a known flavor, leave it as nil
141
+ # rather than blowing up the whole parse — the ITU half is still
142
+ # usable on its own.
143
+ nil
144
+ end
145
+
146
+ # Build Special Publication (OB). Sector is silently dropped — OB is a
147
+ # cross-bureau publication and `Identifier` rejects sector+OB
148
+ # in its constructor.
149
+ def build_special_publication(data)
150
+ Identifiers::SpecialPublication.new(
151
+ series: Components::Series.new(series: "OB"),
152
+ code: data[:number] ? build_code(data) : nil,
153
+ date: data[:year] ? build_date(data) : nil,
154
+ language: data[:language]&.to_s,
155
+ )
156
+ end
157
+
158
+ # Build "Annex to ..." identifier. The inner data is the Special
159
+ # Publication; the annex inherits its language.
160
+ def build_annex(inner_data)
161
+ base = build_special_publication(inner_data)
162
+ Identifiers::Annex.new(
163
+ base: base,
164
+ language: inner_data[:language]&.to_s,
165
+ )
166
+ end
167
+
168
+ # Build a labelled annex of a Recommendation. sector/series/code are
169
+ # deliberately NOT copied from the base: they are not serialized on the
170
+ # wrapper, so copies would make a from_hash-rebuilt annex differ from the
171
+ # parsed one.
172
+ def build_annex_of_recommendation(data)
173
+ Identifiers::AnnexOfRecommendation.new(
174
+ base: build(data[:base]),
175
+ number: data[:annex_number].to_s,
176
+ date: data[:year] ? build_date(data) : nil,
177
+ language: data[:language]&.to_s,
178
+ )
179
+ end
180
+
181
+ # Build a labelled appendix of a Recommendation. Like the annex above,
182
+ # sector/series/code are deliberately NOT copied from the base — they are
183
+ # not serialized on the wrapper, so copies would make a from_hash-rebuilt
184
+ # appendix differ from the parsed one.
185
+ def build_appendix_of_recommendation(data)
186
+ Identifiers::AppendixOfRecommendation.new(
187
+ base: build(data[:base]),
188
+ number: data[:appendix_number].to_s,
189
+ material: data[:appendix_material]&.to_s,
190
+ date: data[:year] ? build_date(data) : nil,
191
+ language: data[:language]&.to_s,
192
+ )
193
+ end
194
+
195
+ # Build Handbook ("ITU-R 42.HDB").
196
+ def build_handbook(data)
197
+ Identifiers::Handbook.new(
198
+ sector: Components::Sector.new(sector: data[:sector].to_s),
199
+ code: build_code(data),
200
+ date: data[:year] ? build_date(data) : nil,
201
+ )
202
+ end
203
+
204
+ # Build Question (numeric or letter-series).
205
+ def build_question(data)
206
+ series = if data[:series]
207
+ Components::Series.new(series: data[:series].to_s)
208
+ end
209
+
210
+ Identifiers::Question.new(
211
+ sector: Components::Sector.new(sector: data[:sector].to_s),
212
+ series: series,
213
+ code: build_code(data),
214
+ study_group: data[:study_group].to_s,
215
+ has_bl: !data[:has_bl].nil?,
216
+ bracketed: !data[:bracketed].nil?,
217
+ has_colon: !data[:question_colon].nil?,
218
+ )
219
+ end
220
+
221
+ def build_supplement(data)
222
+ # Build the base identifier first
223
+ base = build(data[:base]) if data[:base]
224
+
225
+ # Determine supplement type
226
+ supplement_type = data[:supplement_type].to_s.gsub(".", "")
227
+ klass = case supplement_type
228
+ when "Amd"
229
+ Identifiers::Amendment
230
+ when "Add"
231
+ Identifiers::Addendum
232
+ when "Cor"
233
+ Identifiers::Corrigendum
234
+ when "Err"
235
+ Identifiers::Errata
236
+ when "Suppl"
237
+ Identifiers::Supplement
238
+ else
239
+ # Previously fell through to a nil class and died with
240
+ # "undefined method 'new' for nil" one frame later. Any token
241
+ # added to Parser#supplement_type without a class here should
242
+ # say so.
243
+ raise ArgumentError,
244
+ "Unknown ITU supplement type: " \
245
+ "#{data[:supplement_type].inspect}"
246
+ end
247
+
248
+ # Build supplement date (separate from base date)
249
+ supplement_date = if data[:supplement_year]
250
+ Pubid::Components::Date.new(
251
+ year: data[:supplement_year].to_s,
252
+ month: data[:supplement_month]&.to_s,
253
+ )
254
+ end
255
+
256
+ # Sector/series are copied from the base when it has them; the fallback
257
+ # to this level's own tokens is guarded because an annex base keeps
258
+ # sector/series/code on *its* base, leaving all three nil here while the
259
+ # supplement level carries no sector token of its own.
260
+ # An annex base keeps sector/series/code on *its* base, so reach through
261
+ # it via #root; otherwise a supplement of an annex would carry none of
262
+ # them and its MR string would collapse to a bare "itu.<date>".
263
+ base_identity = base&.sector ? base : base&.root
264
+ sector = base_identity&.sector ||
265
+ (Components::Sector.new(sector: data[:sector].to_s) if data[:sector])
266
+ series = base_identity&.series ||
267
+ (Components::Series.new(series: data[:series].to_s) if data[:series])
268
+
269
+ attrs = {
270
+ sector: sector,
271
+ series: series,
272
+ code: base_identity&.code,
273
+ base: base,
274
+ number: data[:supplement_number].to_s,
275
+ # The marker is the captured space, so its ABSENCE is the flag.
276
+ number_glued: data[:supplement_space].nil?,
277
+ slash_joined: !data[:supplement_slash].nil?,
278
+ date: supplement_date,
279
+ language: data[:language]&.to_s,
280
+ }
281
+ # The "series" word rides on the supplement for the base-less,
282
+ # series-only form; with a base it is the base's, and renders from
283
+ # there. It is copied up anyway (like sector/series/code above) so the
284
+ # supplement's own MR slug stays distinct — `render_supplement` and the
285
+ # base-nil-guarded key_value/== only consult it when base is nil, so
286
+ # the copy is render- and serialization-neutral.
287
+ attrs[:series_word] = if base
288
+ !!base_identity&.series_word
289
+ else
290
+ !data[:series_word].nil?
291
+ end
292
+ attrs[:technical] = true if data[:technical] &&
293
+ klass == Identifiers::Corrigendum
294
+
295
+ klass.new(**attrs)
296
+ end
297
+
298
+ private
299
+
300
+ # Build the additional designations of a combined recommendation from the
301
+ # repeated parse subtrees (each `{ designation: { series:, number:, … } }`).
302
+ def build_designations(combined_data)
303
+ Array(combined_data).map do |element|
304
+ d = element[:designation] || element
305
+ Components::Designation.new(
306
+ series: Components::Series.new(series: d[:series].to_s),
307
+ code: Components::Code.new(
308
+ number: d[:number].to_s,
309
+ series_suffix: d[:series_suffix]&.to_s,
310
+ series_suffix_spaced: !d[:series_suffix_spaced].nil?,
311
+ subseries: d[:subseries]&.to_s,
312
+ parts: extract_parts(d[:parts]),
313
+ qualifier: d[:qualifier]&.to_s,
314
+ qualifier_glued: !d[:qualifier].nil? && d[:qualifier_spaced].nil?,
315
+ ),
316
+ )
317
+ end
318
+ end
319
+
320
+ def build_code(data)
321
+ Components::Code.new(
322
+ imp_marker: data[:imp_marker]&.to_s,
323
+ number: data[:number].to_s,
324
+ series_suffix: data[:series_suffix]&.to_s,
325
+ # The marker is the captured separating space, so its presence is
326
+ # the flag for the edition word and its ABSENCE is the flag for the
327
+ # qualifier letter (whose majority spelling is spaced).
328
+ series_suffix_spaced: !data[:series_suffix_spaced].nil?,
329
+ subseries: data[:subseries]&.to_s,
330
+ parts: extract_parts(data[:parts]),
331
+ qualifier: data[:qualifier]&.to_s,
332
+ qualifier_glued: !data[:qualifier].nil? &&
333
+ data[:qualifier_spaced].nil?,
334
+ )
335
+ end
336
+
337
+ def build_date(data)
338
+ Pubid::Components::Date.new(
339
+ year: data[:year].to_s,
340
+ month: data[:month]&.to_s,
341
+ )
342
+ end
343
+
344
+ def extract_parts(parts_data)
345
+ return [] unless parts_data
346
+
347
+ parts = []
348
+ if parts_data.is_a?(Array)
349
+ parts_data.each do |part_hash|
350
+ parts << part_hash[:part].to_s if part_hash[:part]
351
+ end
352
+ elsif parts_data.is_a?(Hash) && parts_data[:part]
353
+ parts << parts_data[:part].to_s
354
+ end
355
+
356
+ parts
357
+ end
358
+ end
359
+ end
360
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Itu
7
+ module Components
8
+ # ITU Code component
9
+ # Format: [Imp]NUMBER[SUFFIX][.SUBSERIES][-PART]
10
+ # Examples: 1234, 1234.5, 1234-1, 1234.5-2, 50bis, 8bis, Imp712, ImpOSI
11
+ #
12
+ # The optional "Imp" marker identifies an Implementers' Guide for the
13
+ # series (e.g. G.Imp712, X.ImpOSI); the NUMBER that follows may be
14
+ # digits or a short letter string.
15
+ #
16
+ # SUFFIX is the edition marker "bis" / "ter" / "quater" attached
17
+ # directly to the number (e.g. X.50bis, V.8bis).
18
+ #
19
+ # Stays independent of Pubid::Components::Code because ITU uses
20
+ # +subseries+ (dot-separated, flavor-specific) and +parts+
21
+ # (dash-separated).
22
+ class Code < Lutaml::Model::Serializable
23
+ attribute :imp_marker, :string
24
+ attribute :number, :string
25
+ attribute :series_suffix, :string
26
+ # ITU prints the edition word both glued ("X.50bis") and space-
27
+ # separated ("E.250 bis"). The word itself is stored without the space,
28
+ # so `series_suffix` stays a clean, whitespace-free value to compare and
29
+ # index on; the spacing is this rendering-only flag. Named for the
30
+ # rarer-in-code form so the `false` default stays out of `to_hash`.
31
+ attribute :series_suffix_spaced, :boolean, default: -> { false }
32
+ attribute :subseries, :string
33
+ attribute :parts, :string, collection: true, default: []
34
+ # A single trailing letter distinguishing variants of one
35
+ # Recommendation: "D.200 R" (old D-series tariff recommendations),
36
+ # "Q.2931 B", "R.38 A", the glued "D.502R" and the lowercase
37
+ # "I.256.2a". Spaced is the majority spelling, so the glued one is the
38
+ # flag.
39
+ attribute :qualifier, :string
40
+ attribute :qualifier_glued, :boolean, default: -> { false }
41
+
42
+ # Segment order mirrors the grammar exactly — a GLUED suffix is
43
+ # captured inside `standard_code` (the edition word before the
44
+ # subseries, the qualifier after the parts), while a SPACED one is
45
+ # captured afterwards by `code_suffixes`. Rendering the edition word
46
+ # unconditionally first would print "Q.11a bis" back as "Q.11 bisa".
47
+ def to_s
48
+ result = "#{imp_marker}#{number}"
49
+ result += series_suffix.to_s if series_suffix && !series_suffix_spaced
50
+ result += ".#{subseries}" if subseries
51
+ result += parts.map { |p| "-#{p}" }.join if parts&.any?
52
+ result += qualifier.to_s if qualifier && qualifier_glued
53
+ result += " #{series_suffix}" if series_suffix && series_suffix_spaced
54
+ result += " #{qualifier}" if qualifier && !qualifier_glued
55
+ result
56
+ end
57
+
58
+ # Space-free rendering for URN and MR use: the print form may separate
59
+ # the edition word or the qualifier letter with a space ("E.250 bis",
60
+ # "D.200 R"), which is not admissible inside a URN segment. Removing
61
+ # the space keeps "D.200" and "D.200 R" on distinct URNs, which
62
+ # dropping the suffix would not.
63
+ def compact_s
64
+ to_s.delete(" ")
65
+ end
66
+
67
+ def render(context: nil)
68
+ to_s
69
+ end
70
+
71
+ def ==(other)
72
+ return false unless other.is_a?(Code)
73
+
74
+ imp_marker == other.imp_marker &&
75
+ number == other.number &&
76
+ series_suffix == other.series_suffix &&
77
+ subseries == other.subseries &&
78
+ parts == other.parts &&
79
+ qualifier == other.qualifier
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end