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
@@ -0,0 +1,679 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parslet"
4
+
5
+ module Pubid
6
+ module Itu
7
+ class Parser < ::Pubid::Parser::Grammar
8
+ # Basic elements
9
+ rule(:digit) { match["0-9"] }
10
+ rule(:digits) { digit.repeat(1) }
11
+ rule(:letter) { match["A-Z"] }
12
+ rule(:space) { str(" ") }
13
+ rule(:dash) { str("-") }
14
+ rule(:dot) { str(".") }
15
+
16
+ # ITU prefix — accepts an optional leading "Recommendation " long-form
17
+ # prefix that appears in ITU's own citation style (e.g. the twin-text
18
+ # and common-text forms in issues #233 / #234).
19
+ rule(:itu_prefix) do
20
+ (str("Recommendation ") >> str("ITU") >> (dash | space)) |
21
+ (str("ITU") >> (dash | space))
22
+ end
23
+
24
+ # Sector (R, T, or D)
25
+ rule(:sector) do
26
+ (str("R") | str("T") | str("D")).as(:sector)
27
+ end
28
+
29
+ # Series (BO, V, X, etc.)
30
+ rule(:series) do
31
+ (
32
+ # Study groups: SG1, SG12
33
+ (str("SG") >> digits) |
34
+ # Regular series: BO, V, X, etc.
35
+ letter.repeat(1, 3)
36
+ ).as(:series)
37
+ end
38
+
39
+ # A numeric series GROUP rather than a single document — "E-100",
40
+ # "E100-300", "G-100", "Q-500". Deliberately capped at ONE leading
41
+ # letter: two or more letters before the dash is a series-code DOCUMENT
42
+ # (EMC-5, MES-2, IMPL-8, SEC-QKD), handled by series_code_body, and the
43
+ # two must never shadow each other. That split is a corpus regularity,
44
+ # not an ITU rule — see the boundary spec.
45
+ rule(:series_group) do
46
+ (letter >> digits.maybe >> dash >> digits).as(:series)
47
+ end
48
+
49
+ # The literal word "series" — "ITU-T E-300 series Suppl. 1",
50
+ # "ITU-T E.1100 series Suppl. 1". It is NOT part of the series token (it
51
+ # also follows a dotted code, where folding it in would corrupt the value
52
+ # every index row is keyed on), so it is carried as its own marker.
53
+ rule(:series_word) { space >> str("series").as(:series_word) }
54
+
55
+ # Number
56
+ rule(:number) do
57
+ digits.as(:number)
58
+ end
59
+
60
+ rule(:subseries) do
61
+ dot >> digits.as(:subseries)
62
+ end
63
+
64
+ # Edition words. "bis" = 2nd edition, "ter" = 3rd, "quater" = 4th.
65
+ # "quarter" is a real misspelling in ITU's own data, kept verbatim so the
66
+ # two records it appears on stay distinct from their "quater" siblings.
67
+ rule(:series_suffix_word) do
68
+ str("bis") | str("ter") | str("quater") | str("quarter")
69
+ end
70
+
71
+ # Edition suffix attached directly to the recommendation number.
72
+ # Example: X.50bis, V.8bis, V.31bis.
73
+ rule(:series_suffix) { series_suffix_word.as(:series_suffix) }
74
+
75
+ # The same word separated by a space — "ITU-T E.250 bis (12/1972)",
76
+ # "ITU-T V.25 ter". The captured space IS the marker: its presence sets
77
+ # Code#series_suffix_spaced, so the glued form above still round-trips
78
+ # byte-exactly (locked by recommendation_spec.rb's issue-#231 block).
79
+ rule(:series_suffix_spaced) do
80
+ space.as(:series_suffix_spaced) >> series_suffix_word.as(:series_suffix)
81
+ end
82
+
83
+ # A single trailing letter distinguishing variants of one Recommendation:
84
+ # "ITU-T D.200 R", "ITU-T Q.2931 B", "ITU-T R.38 A", the glued
85
+ # "ITU-T D.502R" and the lowercase "ITU-T I.256.2a".
86
+ #
87
+ # TWO guards make this safe, and both are load-bearing:
88
+ # * the A-R cap keeps it clear of the "S" of " Suppl." and the "V" of a
89
+ # bare version marker (" V2");
90
+ # * the trailing absent? forbids any further letter/digit, so " Amd."
91
+ # (A then "m"), " Add.", " Annex A" (A then "n"), " App." , " Cor."
92
+ # (C then "o") and " Err." (E then "r") can never be mistaken for a
93
+ # qualifier.
94
+ # It cannot collide with `language` (dash-attached, "-F") nor with
95
+ # date_part/version_part, which both need "(" after the space.
96
+ rule(:qualifier_letter) do
97
+ (match["A-R"] | match["a-r"]).as(:qualifier) >>
98
+ match["A-Za-z0-9"].absent?
99
+ end
100
+
101
+ rule(:qualifier_glued) { qualifier_letter }
102
+ rule(:qualifier_spaced) do
103
+ space.as(:qualifier_spaced) >> qualifier_letter
104
+ end
105
+
106
+ # Print-form suffixes that may trail a code with a separating space. They
107
+ # cannot live inside `code` itself, because the space would then also be
108
+ # offered to " Suppl." / " Annex" and would have to backtrack out of a
109
+ # rule the wrappers depend on. Spliced after `code` and BEFORE
110
+ # combined_suffixes, since the corpus attaches the primary designation's
111
+ # suffix before the "/" ("ITU-T D.301 R/F.66").
112
+ rule(:code_suffixes) do
113
+ series_suffix_spaced.maybe >> qualifier_spaced.maybe
114
+ end
115
+
116
+ # "ITU-T H.350 attachment (08/2003)" — the machine-readable attachment
117
+ # published alongside a Recommendation, a distinct record in ITU's
118
+ # catalogue. A bare marker word: the flag alone reconstructs it.
119
+ rule(:attachment) { space >> str("attachment").as(:attachment) }
120
+
121
+ # A range of Recommendations published as one document —
122
+ # "ITU-T Q.120-Q.139 (11/1988)". No conflict with `parts`, which requires
123
+ # digits after the dash and so cannot match "-Q.139".
124
+ rule(:range_end) do
125
+ dash >> (letter.repeat(1, 3) >> dot >> digits).as(:range_end)
126
+ end
127
+
128
+ # Parts
129
+ rule(:part) do
130
+ dash >> digits.as(:part)
131
+ end
132
+
133
+ rule(:parts) { part.repeat(0).as(:parts) }
134
+
135
+ # Code = imp-prefixed code (Implementers' Guide) or standard code.
136
+ # The imp_code alternative is tried first because the standard code's
137
+ # number rule requires digits, which "Imp712" / "ImpOSI" would not
138
+ # satisfy.
139
+ rule(:code) do
140
+ imp_code | standard_code
141
+ end
142
+
143
+ # The glued qualifier sits last, after parts, so "BO.600-1" still parses
144
+ # and "D.502R" / "I.256.2a" newly do.
145
+ rule(:standard_code) do
146
+ number >> series_suffix.maybe >> subseries.maybe >> parts >>
147
+ qualifier_glued.maybe
148
+ end
149
+
150
+ # Implementers' Guide code: "Imp" prefix followed by digits or a
151
+ # short letter string. Examples: Imp712 (G.Imp712), ImpOSI (X.ImpOSI).
152
+ rule(:imp_code) do
153
+ str("Imp").as(:imp_marker) >>
154
+ (digits | letter.repeat(1, 3)).as(:number) >>
155
+ subseries.maybe >>
156
+ parts
157
+ end
158
+
159
+ # Date
160
+ rule(:date_part) do
161
+ space >> str("(") >>
162
+ (digits.as(:month) >> str("/")).maybe >>
163
+ digit.repeat(4, 4).as(:year) >>
164
+ str(")")
165
+ end
166
+
167
+ # Version marker — "(V14)" in "ITU-T H.264 (V14) (08/2021)". Always sits
168
+ # between the code and the publication date, so it is spliced in before
169
+ # `date_part.maybe` in every document rule. `date_part` requires digits
170
+ # after "(", so it fails cleanly on "(V…)" and the two never compete.
171
+ # ITU emits four spellings of the same marker: the canonical
172
+ # parenthesised "(V14)" plus the bare "V2", "v10" and "v.1". All land in
173
+ # the same `version` attribute and re-render canonically as " (V##)" —
174
+ # the one deliberate non-byte-exact normalisation in this grammar.
175
+ #
176
+ # The bare branch requires digits immediately after V/v so it cannot fire
177
+ # on a stray word, and it is unreachable by the qualifier_letter rule
178
+ # below, whose A-R cap deliberately excludes "V".
179
+ rule(:version_part) do
180
+ space >>
181
+ (
182
+ (str("(V") >> digits.as(:version) >> str(")")) |
183
+ ((str("V") | str("v")) >> dot.maybe >> digits.as(:version))
184
+ )
185
+ end
186
+
187
+ # Language
188
+ rule(:language) do
189
+ dash >> match["EFASCR"].as(:language)
190
+ end
191
+
192
+ # Combined (joint) recommendation — one additional "/SERIES.CODE"
193
+ # designation, e.g. the "/Y.1351" of "G.780/Y.1351". Repeatable, so
194
+ # triple-joint forms ("G.780/Y.1351/Z.1362") are captured as a list.
195
+ # Each designation is a self-contained subtree under :designation; the
196
+ # repeated list is collected under :combined.
197
+ # A designation may carry the same print-form suffixes as the primary
198
+ # code — "ITU-T D.300 R/E.282 R" (both halves qualified),
199
+ # "ITU-T D.81/F.80 bis" and "ITU-T E.211/Q.11 quater" (only the last).
200
+ # The suffix is stored on the designation it printed against; no attempt
201
+ # is made to decide whether it semantically qualifies the joint document.
202
+ #
203
+ # These slots sit INSIDE the .as(:designation) subtree, so they consume
204
+ # " bis" before the outer code_suffixes (which precedes combined_suffixes)
205
+ # can see it — that is what makes "trails the last designation" work
206
+ # without ambiguity.
207
+ rule(:combined_designation) do
208
+ str("/") >>
209
+ (
210
+ series >> dot >> digits.as(:number) >>
211
+ subseries.maybe >> parts >>
212
+ qualifier_glued.maybe >>
213
+ series_suffix_spaced.maybe >>
214
+ qualifier_spaced.maybe
215
+ ).as(:designation)
216
+ end
217
+
218
+ rule(:combined_suffixes) do
219
+ combined_designation.repeat(1).as(:combined)
220
+ end
221
+
222
+ # The "Technical" qualifier of a Corrigendum — "ITU-T H.222.0 (1995)
223
+ # Technical Cor. 1 (02/1998)". It is captured as its OWN marker key
224
+ # rather than folded into the supplement_type alternation, so the type
225
+ # token stays the plain "Cor." that Builder#build_supplement's case maps.
226
+ # It is bound to the Cor. branch alone, NOT to the head of
227
+ # supplement_type: only a corrigendum is ever printed "Technical", and
228
+ # only Corrigendum carries the flag. Offered before any token, the
229
+ # marker would be accepted on "Technical Err. 1" / "Technical Amd. 1"
230
+ # and then silently dropped by the builder, collapsing those onto a
231
+ # different document's identifier.
232
+ rule(:technical_marker) do
233
+ str("Technical").as(:technical) >> space
234
+ end
235
+
236
+ # Supplement types. The Cor. branch is its own alternative so the
237
+ # optional "Technical" can precede it without landing inside the
238
+ # .as(:supplement_type) capture — the builder maps that token by string
239
+ # equality. It goes last, which is free: no other branch can match a
240
+ # leading "Technical" or "Cor".
241
+ rule(:supplement_type) do
242
+ (
243
+ str("Suppl.") | str("Suppl") |
244
+ str("Amd.") | str("Amd") |
245
+ str("Add.") | str("Add") |
246
+ str("Err.") | str("Err")
247
+ ).as(:supplement_type) |
248
+ (technical_marker.maybe >>
249
+ (str("Cor.") | str("Cor")).as(:supplement_type))
250
+ end
251
+
252
+ # Supplement number. ITU omits the space before the ordinal on some
253
+ # listings ("ITU-T E Suppl.1", "ITU-T D.211 Suppl.1") and the ordinal is
254
+ # itself dotted on the M/O series ("ITU-T M Suppl. 1.1"). The absent
255
+ # space is captured as a marker so `to_s` reproduces it; the dotted
256
+ # ordinal lands whole in the :string `number` and cannot run into a
257
+ # following date, because (dot >> digits) stops at the space before "(".
258
+ rule(:supplement_number) do
259
+ space.as(:supplement_space).maybe >>
260
+ (digits >> (dot >> digits).repeat(0)).as(:supplement_number)
261
+ end
262
+
263
+ # Supplement date (separate from base date)
264
+ rule(:supplement_date) do
265
+ space >> str("(") >>
266
+ (digits.as(:supplement_month) >> str("/")).maybe >>
267
+ digit.repeat(4, 4).as(:supplement_year) >>
268
+ str(")")
269
+ end
270
+
271
+ # Base identifier for supplements
272
+ rule(:base_with_series) do
273
+ itu_prefix >>
274
+ sector >>
275
+ space >>
276
+ series >> dot >>
277
+ code >>
278
+ range_end.maybe >>
279
+ code_suffixes >>
280
+ combined_suffixes.maybe >>
281
+ series_word.maybe >>
282
+ attachment.maybe >>
283
+ version_part.maybe >>
284
+ date_part.maybe
285
+ end
286
+
287
+ rule(:base_without_series) do
288
+ itu_prefix >>
289
+ sector >>
290
+ space >>
291
+ code >>
292
+ code_suffixes >>
293
+ attachment.maybe >>
294
+ version_part.maybe >>
295
+ date_part.maybe
296
+ end
297
+
298
+ # A series-code document — "EMC-5", "MES-2", "QOS-2", "IMPL-8",
299
+ # "SEC-QKD": a multi-letter mnemonic series dash-joined to a numeric or
300
+ # alphabetic document code. TWO letters minimum is the discriminator
301
+ # against series_group ("E-100", "G-100"), which has exactly one.
302
+ #
303
+ # This rule carries its own letter repeat, so the 1..3 cap on `series`
304
+ # (which stops the series token eating a following word) is untouched
305
+ # and "IMPL" still parses. It is deliberately a flat two-token shape
306
+ # (series + dash + alphanumeric number) rather than an optional middle
307
+ # segment: a greedy `letter.repeat(2)` would take "SEC", an optional
308
+ # "-QKD" would follow, and the required dash would then fail at
309
+ # end-of-input with no backtracking into the satisfied `.maybe`.
310
+ #
311
+ # The number stays in `code.number`, so `root.number` — the field
312
+ # relaton-index bsearches on — is "5" for EMC-5 and "QKD" for SEC-QKD
313
+ # rather than nil.
314
+ # The OB guard keeps "ITU-T OB-1" a clean parse failure. Without it the
315
+ # string reaches Builder#build's Recommendation fallback, whose
316
+ # validate_ob_no_sector! raises an ArgumentError that escapes
317
+ # Identifier.parse's Parslet::ParseFailed rescue — turning a rejected
318
+ # input into a crash for callers. It guards "OB" + dash specifically, so
319
+ # a genuine two-letter mnemonic starting "OB" would still parse.
320
+ rule(:series_code_body) do
321
+ (str("OB") >> dash).absent? >>
322
+ letter.repeat(2).as(:series) >> dash.as(:series_dash) >>
323
+ (digits | letter.repeat(1)).as(:number) >> parts
324
+ end
325
+
326
+ rule(:base_series_code) do
327
+ itu_prefix >>
328
+ sector >>
329
+ space >>
330
+ series_code_body >>
331
+ version_part.maybe >>
332
+ date_part.maybe
333
+ end
334
+
335
+ rule(:series_code_identifier) { base_series_code >> language.maybe }
336
+
337
+ # ITU-R Report — "Report ITU-R BT.2020-1 (2000)". Reports number
338
+ # independently of Recommendations, so the leading word is the ONLY thing
339
+ # distinguishing two real, different documents that share a
340
+ # series/number/edition. It is captured (unlike the decorative
341
+ # "Recommendation " of `itu_prefix`) so it reaches the built object.
342
+ rule(:report_word) { str("Report").as(:report_marker) }
343
+
344
+ # One body for both the with- and without-series shapes: `(series >> dot)`
345
+ # backtracks as a unit, so a numeric code ("Report ITU-R 2205") simply
346
+ # skips it.
347
+ #
348
+ # Deliberately NO combined_suffixes: a joint "Report X/Y" would reach
349
+ # Builder#build's `combined` branch, which builds a CombinedIdentifier and
350
+ # would silently drop the marker — a clean parse failure is better than a
351
+ # Report that comes back as a Recommendation. The OB guard mirrors
352
+ # series_code_body's: an Operational Bulletin is cross-bureau, and
353
+ # "Report ITU-T OB.1" would otherwise route to SpecialPublication (marker
354
+ # dropped) or hit validate_ob_no_sector!, whose ArgumentError escapes
355
+ # Identifier.parse's Parslet::ParseFailed rescue.
356
+ rule(:report_body) do
357
+ (str("OB") >> dot).absent? >>
358
+ (series >> dot).maybe >>
359
+ code >>
360
+ range_end.maybe >>
361
+ code_suffixes >>
362
+ series_word.maybe >>
363
+ attachment.maybe >>
364
+ version_part.maybe >>
365
+ date_part.maybe
366
+ end
367
+
368
+ # Both spellings ITU and downstream bibliographies use. `to_s` renders
369
+ # the leading (ITU's own) form for either.
370
+ rule(:base_report) do
371
+ (report_word >> space >> itu_prefix >> sector >> space >> report_body) |
372
+ (itu_prefix >> sector >> space >> report_word >> space >> report_body)
373
+ end
374
+
375
+ # Slot in `rule(:identifier)`: AFTER supplement/annex/appendix (all of
376
+ # which reach a Report through `base` and match the longer wrapped form
377
+ # "Report ITU-R BT.2020-1 Suppl. 1"), and BEFORE with_series, which would
378
+ # match the infix spelling's "ITU-R" prefix and then fail on the
379
+ # unconsumed " Report ...".
380
+ rule(:report_identifier) { base_report >> language.maybe }
381
+
382
+ # base_series_code goes LAST: it cannot shadow base_with_series (which
383
+ # needs series >> dot — "EMC" then "." fails on "-", and the greedy
384
+ # "IMP" of "IMPL" then fails on "L") nor base_without_series (whose code
385
+ # needs digits or "Imp"), so the last slot is both safe and the smallest
386
+ # blast radius.
387
+ # base_report goes FIRST and is order-free: `itu_prefix` admits only
388
+ # "Recommendation " or "ITU", and `letter` is [A-Z], so neither `series`
389
+ # (of base_with_series) nor `series_code_body` can consume the "Report"
390
+ # token of either spelling. Its presence is what lets a supplement, annex
391
+ # or appendix wrap a Report.
392
+ rule(:base) do
393
+ base_report | base_with_series | base_without_series | base_series_code
394
+ end
395
+
396
+ # Annex label — one series letter, optionally a number ("F3") and/or a
397
+ # "+" ("C+", ITU-T G.729 Annex C+).
398
+ rule(:annex_label) do
399
+ letter >> digits.maybe >> str("+").maybe
400
+ end
401
+
402
+ # A labelled annex of a Recommendation — "ITU-T A.23 Annex A (06/2014)".
403
+ # The annexed document is wrapped in :base so its own date (the leading
404
+ # "(2002)" of "ITU-T X.692 (2002) Annex E (03/2002)") lands one level down
405
+ # and cannot collide with the annex's date — Parslet silently keeps only
406
+ # the last of two same-named keys in one flattened hash.
407
+ rule(:annex_body) do
408
+ base.as(:base) >>
409
+ space >> str("Annex") >> space >>
410
+ annex_label.as(:annex_number) >>
411
+ date_part.maybe
412
+ end
413
+
414
+ rule(:annex_identifier) { annex_body >> language.maybe }
415
+
416
+ # Appendix label — a Roman numeral ("I", "II", "IV", "VI").
417
+ rule(:roman) { match["IVX"].repeat(1) }
418
+
419
+ # A labelled appendix of a Recommendation — "ITU-T G.101 App. I
420
+ # (05/2000)", "ITU-T O.9 App.I (1998)". Structurally identical to
421
+ # annex_body, and for the same reason: the appendixed document is wrapped
422
+ # in :base so its own date (the leading "(1988)" of "ITU-T G.722 (1988)
423
+ # App. IV (11/2006)") lands one level down and cannot collide with the
424
+ # appendix's — Parslet silently keeps only the last of two same-named
425
+ # keys in one flattened hash. The space after "App." is optional in ITU's
426
+ # listings; rendering normalises it back to the spaced spelling.
427
+ rule(:appendix_body) do
428
+ base.as(:base) >>
429
+ space >> str("App.") >> space.maybe >>
430
+ roman.as(:appendix_number) >>
431
+ appendix_material.maybe >>
432
+ date_part.maybe
433
+ end
434
+
435
+ # The companion artefact of an appendix, published as its own record —
436
+ # "ITU-T G.726 App. II test vectors (03/1991)",
437
+ # "ITU-T G.728 App. I Software (07/1995)". A closed set of two literals,
438
+ # not free text, so it cannot swallow an unrelated tail.
439
+ rule(:appendix_material) do
440
+ space >> (str("test vectors") | str("Software")).as(:appendix_material)
441
+ end
442
+
443
+ rule(:appendix_identifier) { appendix_body >> language.maybe }
444
+
445
+ # Supplement with base identifier (has recommendation number).
446
+ # The base may itself be an annex ("... Annex B (1996) Cor. 3 (03/2001)");
447
+ # annex_body is tried first because it is the longer match. When it fails
448
+ # (an ordinary supplement, where " Suppl." follows the code instead of
449
+ # " Annex") the alternation falls through to the plain base.
450
+ rule(:supplement_with_base) do
451
+ (annex_body.as(:base) | appendix_body.as(:base) | base.as(:base)) >>
452
+ space >>
453
+ supplement_type >>
454
+ supplement_number >>
455
+ supplement_date.maybe >>
456
+ language.maybe
457
+ end
458
+
459
+ # A supplement whose base is itself a supplement — e.g. Errata on an
460
+ # Amendment ("G.9701 (2014) Amd. 3 Err. 1 (12/2017)") or Errata on a
461
+ # Corrigendum. The parse tree nests base-inside-base so the builder
462
+ # produces a Supplement whose base is another Supplement.
463
+ # The inner supplement may itself be the base-less, series-only form —
464
+ # "ITU-T G Suppl. 39 (2006) Err. 1 (08/2006)". supplement_with_base is
465
+ # tried first, being the longer match.
466
+ rule(:chained_supplement) do
467
+ (supplement_with_base | supplement_series_only).as(:base) >>
468
+ space >>
469
+ supplement_type >>
470
+ supplement_number >>
471
+ supplement_date.maybe >>
472
+ language.maybe
473
+ end
474
+
475
+ # Supplement without base (series-only, like "ITU-T H Suppl. 1")
476
+ # series_group is tried FIRST: `series` is a greedy, non-backtracking
477
+ # letter.repeat(1,3), so it would match the "E" of "E-100" and then fail
478
+ # on the required space, with no retry at a shorter length.
479
+ rule(:supplement_series_only) do
480
+ itu_prefix >>
481
+ sector >>
482
+ space >>
483
+ (series_group | series) >>
484
+ series_word.maybe >>
485
+ space >>
486
+ supplement_type >>
487
+ supplement_number >>
488
+ supplement_date.maybe >>
489
+ language.maybe
490
+ end
491
+
492
+ # A supplement joined to its predecessor by "/" rather than a space —
493
+ # "ITU-T X.680 (1994) Amd. 1/Technical Cor. 1 (12/1997)": one Technical
494
+ # Corrigendum issued against Amendment 1, sharing the trailing date.
495
+ # Modelled exactly like chained_supplement (base-inside-base) with a
496
+ # :supplement_slash marker so `to_s` reproduces the "/".
497
+ rule(:slash_chained_supplement) do
498
+ supplement_with_base.as(:base) >>
499
+ str("/").as(:supplement_slash) >>
500
+ supplement_type >>
501
+ supplement_number >>
502
+ supplement_date.maybe >>
503
+ language.maybe
504
+ end
505
+
506
+ # Complete supplement identifier. Both chained forms must precede
507
+ # supplement_with_base: it alone matches "ITU-T X.680 (1994) Amd. 1" and
508
+ # would leave "/Technical Cor. 1 (12/1997)" unconsumed, which fails the
509
+ # whole parse — PEG ordered choice never re-enters the alternation once
510
+ # an alternative succeeds. Space- and slash-joined are disjoint at that
511
+ # position, so their relative order is free.
512
+ rule(:supplement_identifier) do
513
+ chained_supplement | slash_chained_supplement |
514
+ supplement_with_base | supplement_series_only
515
+ end
516
+
517
+ # With series: ITU-R BO.600-1
518
+ rule(:with_series) do
519
+ itu_prefix >>
520
+ sector >>
521
+ space >>
522
+ series >> dot >>
523
+ code >>
524
+ range_end.maybe >>
525
+ code_suffixes >>
526
+ combined_suffixes.maybe >>
527
+ series_word.maybe >>
528
+ attachment.maybe >>
529
+ version_part.maybe >>
530
+ date_part.maybe >>
531
+ language.maybe
532
+ end
533
+
534
+ # Without series: ITU-R 20-200
535
+ rule(:without_series) do
536
+ itu_prefix >>
537
+ sector >>
538
+ space >>
539
+ code >>
540
+ code_suffixes >>
541
+ attachment.maybe >>
542
+ version_part.maybe >>
543
+ date_part.maybe >>
544
+ language.maybe
545
+ end
546
+
547
+ # OB (Operational Bulletin) — Special Publication.
548
+ # OB is a cross-bureau ITU publication; sector, when present in legacy
549
+ # strings like "ITU-T OB.1096", is silently dropped by the builder.
550
+ rule(:ob_series) { str("OB").as(:series) }
551
+
552
+ rule(:ob_dot_body) { dot >> number }
553
+ rule(:ob_no_body) { space >> str("No.") >> space >> number }
554
+
555
+ rule(:ob_with_sector) do
556
+ itu_prefix >>
557
+ (sector >> space).maybe >>
558
+ ob_series >>
559
+ (ob_dot_body | ob_no_body) >>
560
+ date_part.maybe >>
561
+ language.maybe
562
+ end
563
+
564
+ # Legacy long form: "ITU-T Operational Bulletin No. 1096".
565
+ # The :_op_bull marker tells the builder to set series=OB.
566
+ rule(:ob_long_form) do
567
+ itu_prefix >>
568
+ (sector >> space).maybe >>
569
+ str("Operational Bulletin").as(:_op_bull) >>
570
+ space >> str("No.") >> space >>
571
+ number >>
572
+ date_part.maybe >>
573
+ language.maybe
574
+ end
575
+
576
+ rule(:special_publication) { ob_with_sector | ob_long_form }
577
+
578
+ # "Annex to ..." — the document IS the annex of a Special Publication
579
+ # (no annex number). The :annex_to wrapping signals to the builder.
580
+ rule(:annex_to_identifier) do
581
+ str("Annex to") >> space >> special_publication.as(:annex_to)
582
+ end
583
+
584
+ # Handbook — "ITU-R 42.HDB". The ".HDB" literal marks a Handbook; it does
585
+ # NOT route through subseries (which is digits-only). The :handbook_marker
586
+ # key tells the builder to build Identifiers::Handbook.
587
+ rule(:handbook) do
588
+ itu_prefix >>
589
+ sector >>
590
+ space >>
591
+ number >>
592
+ dot >> str("HDB").as(:handbook_marker) >>
593
+ date_part.maybe
594
+ end
595
+
596
+ # Numeric Question — "ITU-R 234-1/7:", "ITU-R 237/3:".
597
+ # number(-part)/study-group, always with a trailing ":".
598
+ rule(:numeric_question) do
599
+ itu_prefix >>
600
+ sector >>
601
+ space >>
602
+ number >>
603
+ parts >>
604
+ str("/") >> digits.as(:study_group) >>
605
+ str(":").as(:question_colon).maybe
606
+ end
607
+
608
+ # One "number(/BL)?/study-group" body of a letter-series Question, shared
609
+ # by the bracketed and bare forms.
610
+ rule(:question_tail) do
611
+ number >>
612
+ str("/BL").as(:has_bl).maybe >>
613
+ str("/") >> digits.as(:study_group)
614
+ end
615
+
616
+ # Letter-series Question — "ITU-R P.3/BL/7", "ITU-R SM.1/30",
617
+ # "ITU-R S.[4/BL/2]:". series.number(/BL)?/study-group, optionally
618
+ # bracketed and/or with a trailing ":".
619
+ rule(:letter_question) do
620
+ itu_prefix >>
621
+ sector >>
622
+ space >>
623
+ series >> dot >>
624
+ (
625
+ (str("[").as(:bracketed) >> question_tail >> str("]")) |
626
+ question_tail
627
+ ) >>
628
+ str(":").as(:question_colon).maybe
629
+ end
630
+
631
+ # Common-text suffix: "| ISO/IEC ..." or "| ISO ..." — the same
632
+ # document published jointly by ITU and ISO/IEC. Captured as a raw
633
+ # string; the builder parses it with the appropriate flavor.
634
+ rule(:common_text_twin) do
635
+ (space >> str("|") >> space >> match("[^|]").repeat(1)).as(:common_text_twin)
636
+ end
637
+
638
+ rule(:identifier) do
639
+ annex_to_identifier |
640
+ special_publication |
641
+ supplement_identifier |
642
+ # Both neighbours are load-bearing (PEG ordered choice never re-enters
643
+ # the alternation once an alternative succeeds): AFTER
644
+ # supplement_identifier, which matches the longer "<annex> Cor. 3"
645
+ # form, and BEFORE with_series, which would match the "ITU-T A.23"
646
+ # prefix of "ITU-T A.23 Annex A" and then fail on the unconsumed tail.
647
+ annex_identifier |
648
+ # Same slot reasoning as annex_identifier: AFTER supplement_identifier
649
+ # (an appendix can carry a trailing Amd./Err.) and BEFORE with_series
650
+ # (which would match the "ITU-T G.101" prefix and then fail on the
651
+ # unconsumed " App. I").
652
+ appendix_identifier |
653
+ # Slot reasoning at the rule itself.
654
+ report_identifier |
655
+ handbook |
656
+ numeric_question |
657
+ letter_question |
658
+ with_series |
659
+ # Unreachable earlier: special_publication needs the literal "OB",
660
+ # handbook/numeric_question need leading digits, and letter_question
661
+ # needs series >> dot. Before without_series, whose code needs digits.
662
+ series_code_identifier |
663
+ without_series
664
+ end
665
+
666
+ # Common-text form: an ITU identifier followed by "| ISO/IEC ...".
667
+ # Tried last so it doesn't shadow the simpler single-identifier forms.
668
+ rule(:common_text_identifier) do
669
+ identifier >> common_text_twin
670
+ end
671
+
672
+ rule(:root) { common_text_identifier | identifier }
673
+
674
+ def self.parse(input)
675
+ new.parse(input)
676
+ end
677
+ end
678
+ end
679
+ end