pubid 1.15.19 → 2.0.0.pre.alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.adoc +2041 -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/ccsds/update_codes.yaml +1 -0
  18. data/data/iec/update_codes.yaml +67 -0
  19. data/data/ieee/update_codes.yaml +104 -0
  20. data/data/iso/update_codes.yaml +21 -0
  21. data/data/nist/update_codes.yaml +89 -0
  22. data/data/plateau/update_codes.yaml +6 -0
  23. data/lib/pubid/amca/builder.rb +176 -0
  24. data/lib/pubid/amca/identifier.rb +57 -0
  25. data/lib/pubid/amca/identifiers/base.rb +64 -0
  26. data/lib/pubid/amca/identifiers/interpretation.rb +51 -0
  27. data/lib/pubid/amca/identifiers/publication.rb +47 -0
  28. data/lib/pubid/amca/identifiers/standard.rb +22 -0
  29. data/lib/pubid/amca/identifiers.rb +12 -0
  30. data/lib/pubid/amca/parser.rb +153 -0
  31. data/lib/pubid/amca/scheme.rb +16 -0
  32. data/lib/pubid/amca/single_identifier.rb +33 -0
  33. data/lib/pubid/amca/urn_generator.rb +50 -0
  34. data/lib/pubid/amca.rb +26 -0
  35. data/lib/pubid/ansi/builder.rb +52 -0
  36. data/lib/pubid/ansi/identifier.rb +55 -0
  37. data/lib/pubid/ansi/identifiers/american_national_standard.rb +12 -0
  38. data/lib/pubid/ansi/identifiers/standard.rb +16 -0
  39. data/lib/pubid/ansi/identifiers.rb +11 -0
  40. data/lib/pubid/ansi/parser.rb +91 -0
  41. data/lib/pubid/ansi/scheme.rb +15 -0
  42. data/lib/pubid/ansi/single_identifier.rb +45 -0
  43. data/lib/pubid/ansi/urn_generator.rb +76 -0
  44. data/lib/pubid/ansi.rb +27 -0
  45. data/lib/pubid/api/builder.rb +85 -0
  46. data/lib/pubid/api/components/code.rb +9 -0
  47. data/lib/pubid/api/identifier.rb +68 -0
  48. data/lib/pubid/api/identifiers/base.rb +24 -0
  49. data/lib/pubid/api/identifiers/bulletin.rb +15 -0
  50. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +15 -0
  51. data/lib/pubid/api/identifiers/mpms.rb +44 -0
  52. data/lib/pubid/api/identifiers/publication.rb +15 -0
  53. data/lib/pubid/api/identifiers/recommended_practice.rb +15 -0
  54. data/lib/pubid/api/identifiers/specification.rb +15 -0
  55. data/lib/pubid/api/identifiers/standard.rb +15 -0
  56. data/lib/pubid/api/identifiers/technical_report.rb +15 -0
  57. data/lib/pubid/api/identifiers/typeless_standard.rb +27 -0
  58. data/lib/pubid/api/parser.rb +140 -0
  59. data/lib/pubid/api/scheme.rb +66 -0
  60. data/lib/pubid/api/single_identifier.rb +46 -0
  61. data/lib/pubid/api/urn_generator.rb +41 -0
  62. data/lib/pubid/api.rb +17 -0
  63. data/lib/pubid/ashrae/builder.rb +498 -0
  64. data/lib/pubid/ashrae/identifier.rb +57 -0
  65. data/lib/pubid/ashrae/identifiers/addenda_package.rb +46 -0
  66. data/lib/pubid/ashrae/identifiers/addendum.rb +55 -0
  67. data/lib/pubid/ashrae/identifiers/base.rb +23 -0
  68. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +51 -0
  69. data/lib/pubid/ashrae/identifiers/errata.rb +40 -0
  70. data/lib/pubid/ashrae/identifiers/guideline.rb +38 -0
  71. data/lib/pubid/ashrae/identifiers/interpretation.rb +39 -0
  72. data/lib/pubid/ashrae/identifiers/standard.rb +38 -0
  73. data/lib/pubid/ashrae/identifiers.rb +16 -0
  74. data/lib/pubid/ashrae/parser.rb +724 -0
  75. data/lib/pubid/ashrae/scheme.rb +53 -0
  76. data/lib/pubid/ashrae/single_identifier.rb +23 -0
  77. data/lib/pubid/ashrae/supplement_identifier.rb +23 -0
  78. data/lib/pubid/ashrae/urn_generator.rb +59 -0
  79. data/lib/pubid/ashrae.rb +21 -0
  80. data/lib/pubid/asme/builder.rb +153 -0
  81. data/lib/pubid/asme/components/code.rb +18 -0
  82. data/lib/pubid/asme/identifier.rb +61 -0
  83. data/lib/pubid/asme/identifiers/base.rb +70 -0
  84. data/lib/pubid/asme/identifiers/standard.rb +12 -0
  85. data/lib/pubid/asme/identifiers.rb +10 -0
  86. data/lib/pubid/asme/parser.rb +308 -0
  87. data/lib/pubid/asme/scheme.rb +37 -0
  88. data/lib/pubid/asme/single_identifier.rb +29 -0
  89. data/lib/pubid/asme/urn_generator.rb +133 -0
  90. data/lib/pubid/asme.rb +21 -0
  91. data/lib/pubid/astm/builder.rb +159 -0
  92. data/lib/pubid/astm/components/code.rb +33 -0
  93. data/lib/pubid/astm/identifier.rb +92 -0
  94. data/lib/pubid/astm/identifiers/adjunct.rb +21 -0
  95. data/lib/pubid/astm/identifiers/base.rb +13 -0
  96. data/lib/pubid/astm/identifiers/data_series.rb +25 -0
  97. data/lib/pubid/astm/identifiers/iso_dual_published.rb +74 -0
  98. data/lib/pubid/astm/identifiers/manual.rb +40 -0
  99. data/lib/pubid/astm/identifiers/monograph.rb +25 -0
  100. data/lib/pubid/astm/identifiers/research_report.rb +18 -0
  101. data/lib/pubid/astm/identifiers/standard.rb +52 -0
  102. data/lib/pubid/astm/identifiers/technical_report.rb +23 -0
  103. data/lib/pubid/astm/identifiers/work_in_progress.rb +21 -0
  104. data/lib/pubid/astm/parser.rb +244 -0
  105. data/lib/pubid/astm/scheme.rb +55 -0
  106. data/lib/pubid/astm/single_identifier.rb +25 -0
  107. data/lib/pubid/astm/urn_generator.rb +99 -0
  108. data/lib/pubid/astm.rb +38 -0
  109. data/lib/pubid/bsi/builder.rb +1483 -0
  110. data/lib/pubid/bsi/components/code.rb +11 -0
  111. data/lib/pubid/bsi/components/date.rb +11 -0
  112. data/lib/pubid/bsi/components/publisher.rb +11 -0
  113. data/lib/pubid/bsi/components/type.rb +11 -0
  114. data/lib/pubid/bsi/identifier.rb +87 -0
  115. data/lib/pubid/bsi/identifiers/addendum_document.rb +64 -0
  116. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +95 -0
  117. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +82 -0
  118. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +118 -0
  119. data/lib/pubid/bsi/identifiers/amendment.rb +40 -0
  120. data/lib/pubid/bsi/identifiers/base.rb +11 -0
  121. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +27 -0
  122. data/lib/pubid/bsi/identifiers/british_standard.rb +33 -0
  123. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +114 -0
  124. data/lib/pubid/bsi/identifiers/committee_document.rb +51 -0
  125. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +152 -0
  126. data/lib/pubid/bsi/identifiers/corrigendum.rb +28 -0
  127. data/lib/pubid/bsi/identifiers/detailed_specification.rb +69 -0
  128. data/lib/pubid/bsi/identifiers/disc.rb +56 -0
  129. data/lib/pubid/bsi/identifiers/draft_document.rb +71 -0
  130. data/lib/pubid/bsi/identifiers/electronic_book.rb +52 -0
  131. data/lib/pubid/bsi/identifiers/expert_commentary.rb +47 -0
  132. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +82 -0
  133. data/lib/pubid/bsi/identifiers/flex.rb +61 -0
  134. data/lib/pubid/bsi/identifiers/handbook.rb +39 -0
  135. data/lib/pubid/bsi/identifiers/index.rb +62 -0
  136. data/lib/pubid/bsi/identifiers/method.rb +76 -0
  137. data/lib/pubid/bsi/identifiers/national_annex.rb +73 -0
  138. data/lib/pubid/bsi/identifiers/practice_guide.rb +27 -0
  139. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +79 -0
  140. data/lib/pubid/bsi/identifiers/published_document.rb +79 -0
  141. data/lib/pubid/bsi/identifiers/section.rb +62 -0
  142. data/lib/pubid/bsi/identifiers/set.rb +46 -0
  143. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +40 -0
  144. data/lib/pubid/bsi/identifiers/supplement_document.rb +51 -0
  145. data/lib/pubid/bsi/identifiers/supplementary_index.rb +81 -0
  146. data/lib/pubid/bsi/identifiers/technical_specification.rb +79 -0
  147. data/lib/pubid/bsi/identifiers/test_method.rb +67 -0
  148. data/lib/pubid/bsi/identifiers/value_added_publication.rb +52 -0
  149. data/lib/pubid/bsi/identifiers.rb +52 -0
  150. data/lib/pubid/bsi/model.rb +196 -0
  151. data/lib/pubid/bsi/parser.rb +659 -0
  152. data/lib/pubid/bsi/scheme.rb +243 -0
  153. data/lib/pubid/bsi/single_identifier.rb +129 -0
  154. data/lib/pubid/bsi/urn_generator.rb +84 -0
  155. data/lib/pubid/bsi.rb +32 -0
  156. data/lib/pubid/builder/base.rb +138 -0
  157. data/lib/pubid/bundled_identifier.rb +126 -0
  158. data/lib/pubid/ccsds/builder.rb +56 -0
  159. data/lib/pubid/ccsds/identifier.rb +84 -0
  160. data/lib/pubid/ccsds/identifiers/base.rb +89 -0
  161. data/lib/pubid/ccsds/identifiers/base_BASE_88929.rb +70 -0
  162. data/lib/pubid/ccsds/identifiers/corrigendum.rb +39 -0
  163. data/lib/pubid/ccsds/identifiers.rb +10 -0
  164. data/lib/pubid/ccsds/parser.rb +71 -0
  165. data/lib/pubid/ccsds/scheme.rb +57 -0
  166. data/lib/pubid/ccsds/single_identifier.rb +77 -0
  167. data/lib/pubid/ccsds/supplement_identifier.rb +33 -0
  168. data/lib/pubid/ccsds/urn_generator.rb +115 -0
  169. data/lib/pubid/ccsds.rb +21 -0
  170. data/lib/pubid/cen_cenelec/builder.rb +330 -0
  171. data/lib/pubid/cen_cenelec/identifier.rb +52 -0
  172. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +40 -0
  173. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +29 -0
  174. data/lib/pubid/cen_cenelec/identifiers/base.rb +75 -0
  175. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +28 -0
  176. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +27 -0
  177. data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +28 -0
  178. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +61 -0
  179. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +35 -0
  180. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +41 -0
  181. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +37 -0
  182. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +28 -0
  183. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +22 -0
  184. data/lib/pubid/cen_cenelec/identifiers/guide.rb +27 -0
  185. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +27 -0
  186. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +27 -0
  187. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +35 -0
  188. data/lib/pubid/cen_cenelec/identifiers.rb +32 -0
  189. data/lib/pubid/cen_cenelec/parser.rb +144 -0
  190. data/lib/pubid/cen_cenelec/scheme.rb +164 -0
  191. data/lib/pubid/cen_cenelec/single_identifier.rb +130 -0
  192. data/lib/pubid/cen_cenelec/supplement_identifier.rb +48 -0
  193. data/lib/pubid/cen_cenelec/urn_generator.rb +129 -0
  194. data/lib/pubid/cen_cenelec.rb +21 -0
  195. data/lib/pubid/cie/builder.rb +399 -0
  196. data/lib/pubid/cie/components/code.rb +72 -0
  197. data/lib/pubid/cie/components/language.rb +58 -0
  198. data/lib/pubid/cie/identifier.rb +71 -0
  199. data/lib/pubid/cie/identifiers/bundle.rb +20 -0
  200. data/lib/pubid/cie/identifiers/conference.rb +32 -0
  201. data/lib/pubid/cie/identifiers/corrigendum.rb +40 -0
  202. data/lib/pubid/cie/identifiers/dual_published.rb +41 -0
  203. data/lib/pubid/cie/identifiers/identical.rb +64 -0
  204. data/lib/pubid/cie/identifiers/joint_published.rb +52 -0
  205. data/lib/pubid/cie/identifiers/standard.rb +58 -0
  206. data/lib/pubid/cie/identifiers/supplement.rb +45 -0
  207. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +20 -0
  208. data/lib/pubid/cie/identifiers.rb +17 -0
  209. data/lib/pubid/cie/parser.rb +347 -0
  210. data/lib/pubid/cie/scheme.rb +64 -0
  211. data/lib/pubid/cie/single_identifier.rb +30 -0
  212. data/lib/pubid/cie/supplement_identifier.rb +26 -0
  213. data/lib/pubid/cie/urn_generator.rb +123 -0
  214. data/lib/pubid/cie.rb +28 -0
  215. data/lib/pubid/components/code.rb +33 -0
  216. data/lib/pubid/components/date.rb +49 -0
  217. data/lib/pubid/components/edition.rb +32 -0
  218. data/lib/pubid/components/factory.rb +50 -0
  219. data/lib/pubid/components/language.rb +37 -0
  220. data/lib/pubid/components/locality.rb +10 -0
  221. data/lib/pubid/components/publisher.rb +36 -0
  222. data/lib/pubid/components/stage.rb +54 -0
  223. data/lib/pubid/components/type.rb +58 -0
  224. data/lib/pubid/components/typed_stage.rb +59 -0
  225. data/lib/pubid/components.rb +16 -0
  226. data/lib/pubid/core/pattern_doc_generator.rb +272 -0
  227. data/lib/pubid/core/update_codes.rb +77 -0
  228. data/lib/pubid/core.rb +8 -0
  229. data/lib/pubid/csa/builder.rb +671 -0
  230. data/lib/pubid/csa/components/code.rb +9 -0
  231. data/lib/pubid/csa/components.rb +9 -0
  232. data/lib/pubid/csa/composite_identifier.rb +27 -0
  233. data/lib/pubid/csa/identifier.rb +513 -0
  234. data/lib/pubid/csa/identifiers/base.rb +133 -0
  235. data/lib/pubid/csa/identifiers/bundled.rb +125 -0
  236. data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
  237. data/lib/pubid/csa/identifiers/cec.rb +129 -0
  238. data/lib/pubid/csa/identifiers/combined.rb +130 -0
  239. data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
  240. data/lib/pubid/csa/identifiers/package.rb +65 -0
  241. data/lib/pubid/csa/identifiers/series.rb +127 -0
  242. data/lib/pubid/csa/identifiers/standard.rb +10 -0
  243. data/lib/pubid/csa/identifiers.rb +17 -0
  244. data/lib/pubid/csa/parser.rb +445 -0
  245. data/lib/pubid/csa/scheme.rb +44 -0
  246. data/lib/pubid/csa/single_identifier.rb +30 -0
  247. data/lib/pubid/csa/urn_generator.rb +80 -0
  248. data/lib/pubid/csa/wrapper_identifier.rb +31 -0
  249. data/lib/pubid/csa.rb +25 -0
  250. data/lib/pubid/etsi/builder.rb +133 -0
  251. data/lib/pubid/etsi/components/code.rb +42 -0
  252. data/lib/pubid/etsi/components/version.rb +37 -0
  253. data/lib/pubid/etsi/components.rb +10 -0
  254. data/lib/pubid/etsi/identifier.rb +57 -0
  255. data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
  256. data/lib/pubid/etsi/identifiers/base.rb +38 -0
  257. data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
  258. data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
  259. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
  260. data/lib/pubid/etsi/identifiers.rb +14 -0
  261. data/lib/pubid/etsi/parser.rb +133 -0
  262. data/lib/pubid/etsi/scheme.rb +42 -0
  263. data/lib/pubid/etsi/urn_generator.rb +76 -0
  264. data/lib/pubid/etsi.rb +21 -0
  265. data/lib/pubid/export/auditor.rb +89 -0
  266. data/lib/pubid/export/data_class_exporter.rb +59 -0
  267. data/lib/pubid/export/exporter.rb +74 -0
  268. data/lib/pubid/export/flavor_exporter.rb +402 -0
  269. data/lib/pubid/export/ieee_exporter.rb +78 -0
  270. data/lib/pubid/export/itu_exporter.rb +66 -0
  271. data/lib/pubid/export/nist_exporter.rb +64 -0
  272. data/lib/pubid/export/registry_exporter.rb +90 -0
  273. data/lib/pubid/export/result.rb +97 -0
  274. data/lib/pubid/export/scheme_exporter.rb +70 -0
  275. data/lib/pubid/export.rb +18 -0
  276. data/lib/pubid/format_detector.rb +16 -0
  277. data/lib/pubid/format_registry.rb +42 -0
  278. data/lib/pubid/identifier.rb +242 -0
  279. data/lib/pubid/identifier_metadata.rb +148 -0
  280. data/lib/pubid/identifier_registry.rb +198 -0
  281. data/lib/pubid/idf/builder.rb +82 -0
  282. data/lib/pubid/idf/identifier.rb +129 -0
  283. data/lib/pubid/idf/identifiers/amendment.rb +27 -0
  284. data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
  285. data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
  286. data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
  287. data/lib/pubid/idf/identifiers.rb +13 -0
  288. data/lib/pubid/idf/parser.rb +143 -0
  289. data/lib/pubid/idf/scheme.rb +61 -0
  290. data/lib/pubid/idf/single_identifier.rb +19 -0
  291. data/lib/pubid/idf/supplement_identifier.rb +43 -0
  292. data/lib/pubid/idf/urn_generator.rb +84 -0
  293. data/lib/pubid/idf.rb +25 -0
  294. data/lib/pubid/iec/builder.rb +458 -0
  295. data/lib/pubid/iec/components/code.rb +60 -0
  296. data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
  297. data/lib/pubid/iec/components/publisher.rb +36 -0
  298. data/lib/pubid/iec/components/sheet.rb +32 -0
  299. data/lib/pubid/iec/components/trf_info.rb +38 -0
  300. data/lib/pubid/iec/components/vap_suffix.rb +41 -0
  301. data/lib/pubid/iec/identifier.rb +256 -0
  302. data/lib/pubid/iec/identifiers/amendment.rb +94 -0
  303. data/lib/pubid/iec/identifiers/base.rb +82 -0
  304. data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
  305. data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
  306. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +82 -0
  307. data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
  308. data/lib/pubid/iec/identifiers/fragment_identifier.rb +137 -0
  309. data/lib/pubid/iec/identifiers/guide.rb +104 -0
  310. data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
  311. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
  312. data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
  313. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
  314. data/lib/pubid/iec/identifiers/sheet_identifier.rb +62 -0
  315. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
  316. data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
  317. data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
  318. data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
  319. data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
  320. data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
  321. data/lib/pubid/iec/identifiers/vap_identifier.rb +73 -0
  322. data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
  323. data/lib/pubid/iec/identifiers/working_document.rb +96 -0
  324. data/lib/pubid/iec/parser.rb +417 -0
  325. data/lib/pubid/iec/rendering_style.rb +113 -0
  326. data/lib/pubid/iec/scheme.rb +71 -0
  327. data/lib/pubid/iec/single_identifier.rb +80 -0
  328. data/lib/pubid/iec/supplement_identifier.rb +161 -0
  329. data/lib/pubid/iec/urn_generator.rb +79 -0
  330. data/lib/pubid/iec/urn_parser.rb +90 -0
  331. data/lib/pubid/iec.rb +85 -0
  332. data/lib/pubid/ieee/aiee/builder.rb +71 -0
  333. data/lib/pubid/ieee/aiee/identifier.rb +105 -0
  334. data/lib/pubid/ieee/aiee/parser.rb +130 -0
  335. data/lib/pubid/ieee/aiee.rb +11 -0
  336. data/lib/pubid/ieee/builder.rb +1237 -0
  337. data/lib/pubid/ieee/components/code.rb +102 -0
  338. data/lib/pubid/ieee/components/draft.rb +93 -0
  339. data/lib/pubid/ieee/components/relationship.rb +157 -0
  340. data/lib/pubid/ieee/components/typed_stage.rb +100 -0
  341. data/lib/pubid/ieee/identifier.rb +54 -0
  342. data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
  343. data/lib/pubid/ieee/identifiers/base.rb +591 -0
  344. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
  345. data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
  346. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
  347. data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
  348. data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
  349. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
  350. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
  351. data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
  352. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
  353. data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
  354. data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
  355. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
  356. data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
  357. data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
  358. data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
  359. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
  360. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
  361. data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
  362. data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
  363. data/lib/pubid/ieee/identifiers/standard.rb +41 -0
  364. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
  365. data/lib/pubid/ieee/identifiers.rb +33 -0
  366. data/lib/pubid/ieee/ire/builder.rb +61 -0
  367. data/lib/pubid/ieee/ire/identifier.rb +58 -0
  368. data/lib/pubid/ieee/ire/parser.rb +91 -0
  369. data/lib/pubid/ieee/ire.rb +11 -0
  370. data/lib/pubid/ieee/nesc/builder.rb +101 -0
  371. data/lib/pubid/ieee/nesc/parser.rb +154 -0
  372. data/lib/pubid/ieee/nesc.rb +10 -0
  373. data/lib/pubid/ieee/parser.rb +1226 -0
  374. data/lib/pubid/ieee/scheme.rb +90 -0
  375. data/lib/pubid/ieee/typed_stages.rb +172 -0
  376. data/lib/pubid/ieee/urn_generator.rb +188 -0
  377. data/lib/pubid/ieee.rb +32 -0
  378. data/lib/pubid/ieee_debug.rb +31 -0
  379. data/lib/pubid/iho/builder.rb +37 -0
  380. data/lib/pubid/iho/identifier.rb +61 -0
  381. data/lib/pubid/iho/identifiers/base.rb +41 -0
  382. data/lib/pubid/iho/identifiers/bibliographic.rb +16 -0
  383. data/lib/pubid/iho/identifiers/circular_letter.rb +15 -0
  384. data/lib/pubid/iho/identifiers/miscellaneous.rb +16 -0
  385. data/lib/pubid/iho/identifiers/publication.rb +15 -0
  386. data/lib/pubid/iho/identifiers/standard.rb +15 -0
  387. data/lib/pubid/iho/identifiers.rb +14 -0
  388. data/lib/pubid/iho/parser.rb +68 -0
  389. data/lib/pubid/iho/scheme.rb +29 -0
  390. data/lib/pubid/iho/urn_generator.rb +29 -0
  391. data/lib/pubid/iho.rb +21 -0
  392. data/lib/pubid/iso/builder.rb +309 -0
  393. data/lib/pubid/iso/bundled_identifier.rb +85 -0
  394. data/lib/pubid/iso/combined_identifier.rb +22 -0
  395. data/lib/pubid/iso/components/code.rb +36 -0
  396. data/lib/pubid/iso/components/publisher.rb +60 -0
  397. data/lib/pubid/iso/components.rb +12 -0
  398. data/lib/pubid/iso/format_resolver.rb +45 -0
  399. data/lib/pubid/iso/identifier.rb +330 -0
  400. data/lib/pubid/iso/identifiers/addendum.rb +104 -0
  401. data/lib/pubid/iso/identifiers/amendment.rb +128 -0
  402. data/lib/pubid/iso/identifiers/base.rb +115 -0
  403. data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
  404. data/lib/pubid/iso/identifiers/data.rb +76 -0
  405. data/lib/pubid/iso/identifiers/directives.rb +59 -0
  406. data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
  407. data/lib/pubid/iso/identifiers/extract.rb +30 -0
  408. data/lib/pubid/iso/identifiers/guide.rb +100 -0
  409. data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
  410. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
  411. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +89 -0
  412. data/lib/pubid/iso/identifiers/pas.rb +93 -0
  413. data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
  414. data/lib/pubid/iso/identifiers/supplement.rb +87 -0
  415. data/lib/pubid/iso/identifiers/tc_document.rb +108 -0
  416. data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
  417. data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
  418. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
  419. data/lib/pubid/iso/identifiers.rb +33 -0
  420. data/lib/pubid/iso/parser.rb +512 -0
  421. data/lib/pubid/iso/rendering_style.rb +120 -0
  422. data/lib/pubid/iso/scheme.rb +193 -0
  423. data/lib/pubid/iso/single_identifier.rb +64 -0
  424. data/lib/pubid/iso/supplement_identifier.rb +27 -0
  425. data/lib/pubid/iso/urn_generator.rb +426 -0
  426. data/lib/pubid/iso/urn_parser.rb +437 -0
  427. data/lib/pubid/iso/utilities.rb +86 -0
  428. data/lib/pubid/iso.rb +50 -0
  429. data/lib/pubid/itu/builder.rb +171 -0
  430. data/lib/pubid/itu/components/code.rb +39 -0
  431. data/lib/pubid/itu/components/sector.rb +35 -0
  432. data/lib/pubid/itu/components/series.rb +29 -0
  433. data/lib/pubid/itu/i18n.rb +9 -0
  434. data/lib/pubid/itu/i18n.yaml +30 -0
  435. data/lib/pubid/itu/identifier.rb +118 -0
  436. data/lib/pubid/itu/identifiers/amendment.rb +43 -0
  437. data/lib/pubid/itu/identifiers/annex.rb +74 -0
  438. data/lib/pubid/itu/identifiers/base.rb +154 -0
  439. data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
  440. data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
  441. data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
  442. data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
  443. data/lib/pubid/itu/identifiers/supplement.rb +46 -0
  444. data/lib/pubid/itu/identifiers.rb +16 -0
  445. data/lib/pubid/itu/model.rb +111 -0
  446. data/lib/pubid/itu/parser.rb +225 -0
  447. data/lib/pubid/itu/scheme.rb +174 -0
  448. data/lib/pubid/itu/urn_generator.rb +105 -0
  449. data/lib/pubid/itu.rb +22 -0
  450. data/lib/pubid/jcgm/builder.rb +88 -0
  451. data/lib/pubid/jcgm/components/publisher.rb +20 -0
  452. data/lib/pubid/jcgm/components.rb +9 -0
  453. data/lib/pubid/jcgm/identifier.rb +54 -0
  454. data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
  455. data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
  456. data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
  457. data/lib/pubid/jcgm/identifiers.rb +11 -0
  458. data/lib/pubid/jcgm/parser.rb +84 -0
  459. data/lib/pubid/jcgm/scheme.rb +60 -0
  460. data/lib/pubid/jcgm/single_identifier.rb +48 -0
  461. data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
  462. data/lib/pubid/jcgm/urn_generator.rb +110 -0
  463. data/lib/pubid/jcgm.rb +31 -0
  464. data/lib/pubid/jis/builder.rb +124 -0
  465. data/lib/pubid/jis/components/code.rb +59 -0
  466. data/lib/pubid/jis/components.rb +9 -0
  467. data/lib/pubid/jis/identifier.rb +61 -0
  468. data/lib/pubid/jis/identifiers/amendment.rb +16 -0
  469. data/lib/pubid/jis/identifiers/base.rb +72 -0
  470. data/lib/pubid/jis/identifiers/explanation.rb +22 -0
  471. data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
  472. data/lib/pubid/jis/identifiers/standard.rb +27 -0
  473. data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
  474. data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
  475. data/lib/pubid/jis/identifiers.rb +17 -0
  476. data/lib/pubid/jis/parser.rb +109 -0
  477. data/lib/pubid/jis/scheme.rb +49 -0
  478. data/lib/pubid/jis/single_identifier.rb +37 -0
  479. data/lib/pubid/jis/supplement_identifier.rb +47 -0
  480. data/lib/pubid/jis/urn_generator.rb +25 -0
  481. data/lib/pubid/jis.rb +23 -0
  482. data/lib/pubid/lutaml/no_store_registration.rb +30 -0
  483. data/lib/pubid/nist/builder.rb +2269 -0
  484. data/lib/pubid/nist/components/code.rb +38 -0
  485. data/lib/pubid/nist/components/edition.rb +134 -0
  486. data/lib/pubid/nist/components/issue_number.rb +28 -0
  487. data/lib/pubid/nist/components/part.rb +77 -0
  488. data/lib/pubid/nist/components/publisher.rb +24 -0
  489. data/lib/pubid/nist/components/stage.rb +53 -0
  490. data/lib/pubid/nist/components/supplement.rb +188 -0
  491. data/lib/pubid/nist/components/translation.rb +42 -0
  492. data/lib/pubid/nist/components/update.rb +103 -0
  493. data/lib/pubid/nist/components/version.rb +35 -0
  494. data/lib/pubid/nist/components/volume.rb +32 -0
  495. data/lib/pubid/nist/components.rb +19 -0
  496. data/lib/pubid/nist/configuration.rb +77 -0
  497. data/lib/pubid/nist/identifier.rb +62 -0
  498. data/lib/pubid/nist/identifiers/base.rb +578 -0
  499. data/lib/pubid/nist/identifiers/circular.rb +68 -0
  500. data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
  501. data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
  502. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
  503. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
  504. data/lib/pubid/nist/identifiers/crpl_report.rb +132 -0
  505. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +104 -0
  506. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
  507. data/lib/pubid/nist/identifiers/handbook.rb +50 -0
  508. data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
  509. data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
  510. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
  511. data/lib/pubid/nist/identifiers/monograph.rb +69 -0
  512. data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
  513. data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
  514. data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
  515. data/lib/pubid/nist/identifiers/report.rb +67 -0
  516. data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
  517. data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
  518. data/lib/pubid/nist/identifiers.rb +33 -0
  519. data/lib/pubid/nist/parser.rb +1117 -0
  520. data/lib/pubid/nist/scheme.rb +199 -0
  521. data/lib/pubid/nist/supplement_identifier.rb +67 -0
  522. data/lib/pubid/nist/urn_generator.rb +133 -0
  523. data/lib/pubid/nist.rb +37 -0
  524. data/lib/pubid/oiml/builder.rb +189 -0
  525. data/lib/pubid/oiml/components/code.rb +20 -0
  526. data/lib/pubid/oiml/components.rb +9 -0
  527. data/lib/pubid/oiml/identifier.rb +61 -0
  528. data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
  529. data/lib/pubid/oiml/identifiers/annex.rb +62 -0
  530. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  531. data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
  532. data/lib/pubid/oiml/identifiers/document.rb +13 -0
  533. data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
  534. data/lib/pubid/oiml/identifiers/guide.rb +13 -0
  535. data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
  536. data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
  537. data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
  538. data/lib/pubid/oiml/identifiers.rb +18 -0
  539. data/lib/pubid/oiml/parser.rb +173 -0
  540. data/lib/pubid/oiml/scheme.rb +46 -0
  541. data/lib/pubid/oiml/single_identifier.rb +90 -0
  542. data/lib/pubid/oiml/supplement_identifier.rb +43 -0
  543. data/lib/pubid/oiml/urn_generator.rb +64 -0
  544. data/lib/pubid/oiml.rb +26 -0
  545. data/lib/pubid/parser/common_parse_methods.rb +13 -0
  546. data/lib/pubid/parser/common_parse_rules.rb +56 -0
  547. data/lib/pubid/parser.rb +8 -0
  548. data/lib/pubid/parsers/base.rb +11 -0
  549. data/lib/pubid/parsers/mr_string.rb +93 -0
  550. data/lib/pubid/plateau/builder.rb +50 -0
  551. data/lib/pubid/plateau/identifier.rb +57 -0
  552. data/lib/pubid/plateau/identifiers/annex.rb +16 -0
  553. data/lib/pubid/plateau/identifiers/base.rb +51 -0
  554. data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
  555. data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
  556. data/lib/pubid/plateau/identifiers.rb +12 -0
  557. data/lib/pubid/plateau/parser.rb +63 -0
  558. data/lib/pubid/plateau/scheme.rb +45 -0
  559. data/lib/pubid/plateau/supplement_identifier.rb +72 -0
  560. data/lib/pubid/plateau/urn_generator.rb +29 -0
  561. data/lib/pubid/plateau.rb +26 -0
  562. data/lib/pubid/renderers/base.rb +53 -0
  563. data/lib/pubid/renderers/directives_renderer.rb +61 -0
  564. data/lib/pubid/renderers/guide_renderer.rb +24 -0
  565. data/lib/pubid/renderers/human_readable.rb +70 -0
  566. data/lib/pubid/renderers/iwa_renderer.rb +20 -0
  567. data/lib/pubid/renderers/mr_string.rb +16 -0
  568. data/lib/pubid/renderers/supplement_renderer.rb +36 -0
  569. data/lib/pubid/renderers/urn.rb +11 -0
  570. data/lib/pubid/renderers.rb +14 -0
  571. data/lib/pubid/rendering/base.rb +73 -0
  572. data/lib/pubid/rendering/common.rb +211 -0
  573. data/lib/pubid/rendering/context.rb +159 -0
  574. data/lib/pubid/rendering/date.rb +27 -0
  575. data/lib/pubid/rendering/format.rb +25 -0
  576. data/lib/pubid/rendering/language.rb +21 -0
  577. data/lib/pubid/rendering/numbering.rb +24 -0
  578. data/lib/pubid/rendering/publisher.rb +25 -0
  579. data/lib/pubid/rendering/stage.rb +38 -0
  580. data/lib/pubid/rendering/supplement.rb +46 -0
  581. data/lib/pubid/rendering.rb +16 -0
  582. data/lib/pubid/sae/builder.rb +32 -0
  583. data/lib/pubid/sae/components/code.rb +9 -0
  584. data/lib/pubid/sae/components/date.rb +19 -0
  585. data/lib/pubid/sae/components/type.rb +19 -0
  586. data/lib/pubid/sae/components.rb +11 -0
  587. data/lib/pubid/sae/identifier.rb +37 -0
  588. data/lib/pubid/sae/identifiers/base.rb +42 -0
  589. data/lib/pubid/sae/identifiers.rb +9 -0
  590. data/lib/pubid/sae/parser.rb +55 -0
  591. data/lib/pubid/sae/scheme.rb +47 -0
  592. data/lib/pubid/sae/urn_generator.rb +38 -0
  593. data/lib/pubid/sae.rb +19 -0
  594. data/lib/pubid/scheme.rb +219 -0
  595. data/lib/pubid/urn_generator/base.rb +110 -0
  596. data/lib/pubid/utils/string_normalizer.rb +196 -0
  597. data/lib/pubid/utils.rb +7 -0
  598. data/lib/pubid/version.rb +3 -1
  599. data/lib/pubid.rb +137 -13
  600. data/lib/tasks/docs.rake +37 -0
  601. data/lib/tasks/export.rake +38 -0
  602. data/lib/tasks/website-data.json +7488 -0
  603. metadata +616 -171
  604. data/lib/pubid/registry.rb +0 -30
@@ -0,0 +1,154 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../components/date"
4
+ require_relative "../components/sector"
5
+ require_relative "../components/series"
6
+ require_relative "../components/code"
7
+ require_relative "../i18n"
8
+
9
+ module Pubid
10
+ module Itu
11
+ module Identifiers
12
+ # Base class for all ITU identifiers
13
+ class Base < Pubid::Identifier
14
+ # Long-form ↔ ITU single-letter language code map. The parser produces
15
+ # single-letter codes (E/F/S/R/A/C); API callers (e.g. metanorma-itu)
16
+ # pass long-form (en/fr/es/ru/ar/zh). Storage is normalized to the
17
+ # single-letter form. Languages with no canonical letter (e.g. "de")
18
+ # pass through unchanged and produce no trailing suffix.
19
+ LANGUAGES = {
20
+ "fr" => "F", "es" => "S", "ru" => "R",
21
+ "ar" => "A", "zh" => "C", "en" => "E",
22
+ "F" => "F", "S" => "S", "R" => "R",
23
+ "A" => "A", "C" => "C", "E" => "E"
24
+ }.freeze
25
+
26
+ attribute :sector, Pubid::Itu::Components::Sector
27
+ attribute :series, Pubid::Itu::Components::Series
28
+ attribute :code, Pubid::Itu::Components::Code
29
+ attribute :date, Pubid::Components::Date
30
+ attribute :language, :string
31
+
32
+ def initialize(**kwargs)
33
+ if kwargs[:language]
34
+ kwargs = kwargs.merge(language: normalize_language(kwargs[:language]))
35
+ end
36
+
37
+ super
38
+
39
+ validate_ob_no_sector!
40
+ end
41
+
42
+ # Generate URN for this identifier
43
+ #
44
+ # @return [String] URN representation
45
+
46
+ # Override base_hash to handle ITU-specific attributes
47
+ def base_hash
48
+ hash = super
49
+ # ITU Series has a 'series' attribute, not 'number'
50
+ if hash[:series].is_a?(Hash) && series
51
+ hash[:series] = series.series
52
+ end
53
+ # Add sector (ITU-specific, has a 'sector' attribute)
54
+ hash[:sector] = sector.sector if sector
55
+ hash
56
+ end
57
+
58
+ def publisher
59
+ "ITU"
60
+ end
61
+
62
+ # Render identifier as a string.
63
+ #
64
+ # @param i18n_lang [Symbol, String] language for identifier text
65
+ # translation (e.g. :fr renders "Annex to" as "Annexe au"). Distinct
66
+ # from the identifier's `language` attribute, which is the document's
67
+ # own language and produces the trailing suffix like "-F".
68
+ # @param language [Symbol, String] deprecated alias for i18n_lang.
69
+ # @param format [Symbol] :long for title-style rendering of supported
70
+ # identifiers, otherwise the default short form.
71
+ def to_s(**opts)
72
+ opts = self.class.normalize_to_s_opts(opts)
73
+ render_base(**opts) + render_language_suffix
74
+ end
75
+
76
+ def render_base(**_opts)
77
+ result = "#{publisher}-#{sector}"
78
+
79
+ # Add series and code
80
+ result += if series
81
+ " #{series}.#{code}"
82
+ else
83
+ " #{code}"
84
+ end
85
+
86
+ # Add date if present
87
+ if date
88
+ result += if date.month
89
+ " (#{date.month}/#{date.year})"
90
+ else
91
+ " (#{date.year})"
92
+ end
93
+ end
94
+
95
+ result
96
+ end
97
+
98
+ def render_language_suffix
99
+ return "" unless language
100
+ # Only render canonical single-letter ITU language codes
101
+ # (e.g. "F", "S"). Languages with no mapping (e.g. "de") get
102
+ # no suffix — matches v1 PR #38 render_language behavior.
103
+ return "" unless LANGUAGES.value?(language)
104
+
105
+ "-#{language}"
106
+ end
107
+
108
+ # Translate `language:` opt to `i18n_lang:` opt. v1 PR #38 introduced
109
+ # `i18n_lang:` to disambiguate "rendering language" from the document
110
+ # language attribute; `language:` remains a deprecated alias.
111
+ def self.normalize_to_s_opts(opts)
112
+ opts = opts.dup
113
+ if opts.key?(:language) && !opts.key?(:i18n_lang)
114
+ opts[:i18n_lang] = opts.delete(:language)
115
+ else
116
+ opts.delete(:language)
117
+ end
118
+ opts
119
+ end
120
+
121
+ def ==(other)
122
+ return false unless other.is_a?(Base)
123
+
124
+ sector == other.sector &&
125
+ series == other.series &&
126
+ code == other.code &&
127
+ date == other.date &&
128
+ language == other.language
129
+ end
130
+
131
+ private
132
+
133
+ def normalize_language(value)
134
+ str = value.to_s
135
+ LANGUAGES[str] || str
136
+ end
137
+
138
+ # OB (Operational Bulletin) is a cross-bureau ITU publication and
139
+ # must not have a sector. Direct construction with both raises;
140
+ # the parser silently drops sector for legacy strings like
141
+ # "ITU-T OB.X" (handled in Builder).
142
+ def validate_ob_no_sector!
143
+ return unless series&.series == "OB"
144
+ return if sector.nil?
145
+ return if sector.is_a?(Components::Sector) && (sector.sector.nil? || sector.sector.to_s.empty?)
146
+
147
+ raise ArgumentError,
148
+ "OB (Operational Bulletin) is a cross-bureau ITU publication; " \
149
+ "sector must not be set"
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Pubid
6
+ module Itu
7
+ module Identifiers
8
+ # Combined identifier for dual-series recommendations
9
+ # Format: ITU-T G.780/Y.1351
10
+ # Example: ITU-T G.780/Y.1351 (2004)
11
+ class CombinedIdentifier < Base
12
+ attribute :combined_series, Pubid::Itu::Components::Series
13
+ attribute :combined_code, Pubid::Itu::Components::Code
14
+
15
+ def to_s
16
+ result = "#{publisher}-#{sector}"
17
+
18
+ # Add primary series and code
19
+ result += if series
20
+ " #{series}.#{code}"
21
+ else
22
+ " #{code}"
23
+ end
24
+
25
+ # Add combined series and code
26
+ if combined_series && combined_code
27
+ result += "/#{combined_series}.#{combined_code}"
28
+ end
29
+
30
+ # Add date if present
31
+ if date
32
+ result += if date.month
33
+ " (#{date.month}/#{date.year})"
34
+ else
35
+ " (#{date.year})"
36
+ end
37
+ end
38
+
39
+ # Add language
40
+ result += "-#{language}" if language
41
+
42
+ result
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "supplement"
4
+
5
+ module Pubid
6
+ module Itu
7
+ module Identifiers
8
+ # Corrigendum identifier (Cor.)
9
+ # Pattern: "ITU-T Z.100 (1999) Cor. 1 (10/2001)"
10
+ # Can be corrigendum of annex: "ITU-T G.729 Annex E (1998) Cor. 1 (02/2000)"
11
+ class Corrigendum < Supplement
12
+ def to_s
13
+ result = base ? base.to_s : "#{publisher}-#{sector}"
14
+
15
+ # Add series if no base
16
+ if !base && series
17
+ result += " #{series}"
18
+ end
19
+
20
+ result += " Cor. #{number}"
21
+
22
+ # Add date if present
23
+ if date
24
+ result += if date.month
25
+ " (#{date.month}/#{date.year})"
26
+ else
27
+ " (#{date.year})"
28
+ end
29
+ end
30
+
31
+ result
32
+ end
33
+
34
+ def ==(other)
35
+ return false unless other.is_a?(Corrigendum)
36
+
37
+ base == other.base &&
38
+ number == other.number &&
39
+ date == other.date
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Pubid
6
+ module Itu
7
+ module Identifiers
8
+ # ITU Recommendation
9
+ # Format: ITU-{SECTOR} {SERIES}.{NUMBER}[-PART]
10
+ # Example: ITU-R V.1234-1
11
+ class Recommendation < Base
12
+ # Type-specific rendering handled by Base
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Pubid
6
+ module Itu
7
+ module Identifiers
8
+ # ITU Special Publication — currently models the Operational Bulletin (OB).
9
+ # OB is a cross-bureau publication (no sector) rendered as
10
+ # "ITU OB No. {number}" with optional date.
11
+ #
12
+ # Pattern: "ITU OB No. 1283 (01/2024)"
13
+ class SpecialPublication < Base
14
+ def render_base(**_opts)
15
+ number = code&.number
16
+ result = "#{publisher} #{series} No. #{number}"
17
+
18
+ if date
19
+ result += if date.month
20
+ " (#{date.month.to_s.rjust(2, '0')}/#{date.year})"
21
+ else
22
+ " (#{date.year})"
23
+ end
24
+ end
25
+
26
+ result
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Pubid
6
+ module Itu
7
+ module Identifiers
8
+ # Supplement identifier (Suppl.)
9
+ # Pattern: "ITU-T H Suppl. 1", "ITU-T E.156 Suppl. 2"
10
+ class Supplement < Base
11
+ attribute :base, Base, polymorphic: true
12
+ attribute :number, :string
13
+
14
+ def to_s
15
+ result = base ? base.to_s : "#{publisher}-#{sector}"
16
+
17
+ # Add series if no base
18
+ if !base && series
19
+ result += " #{series}"
20
+ end
21
+
22
+ result += " Suppl. #{number}"
23
+
24
+ # Add date if present
25
+ if date
26
+ result += if date.month
27
+ " (#{date.month}/#{date.year})"
28
+ else
29
+ " (#{date.year})"
30
+ end
31
+ end
32
+
33
+ result
34
+ end
35
+
36
+ def ==(other)
37
+ return false unless other.is_a?(Supplement)
38
+
39
+ base == other.base &&
40
+ number == other.number &&
41
+ date == other.date
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Itu
5
+ module Identifiers
6
+ autoload :Amendment, "#{__dir__}/identifiers/amendment"
7
+ autoload :Annex, "#{__dir__}/identifiers/annex"
8
+ autoload :Base, "#{__dir__}/identifiers/base"
9
+ autoload :CombinedIdentifier, "#{__dir__}/identifiers/combined_identifier"
10
+ autoload :Corrigendum, "#{__dir__}/identifiers/corrigendum"
11
+ autoload :Recommendation, "#{__dir__}/identifiers/recommendation"
12
+ autoload :SpecialPublication, "#{__dir__}/identifiers/special_publication"
13
+ autoload :Supplement, "#{__dir__}/identifiers/supplement"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,111 @@
1
+ require "lutaml/model"
2
+ # frozen_string_literal: true
3
+
4
+ module Pubid
5
+ module Itu
6
+ class Model < Lutaml::Model::Serializable
7
+ attribute :sector, :string
8
+ attribute :series, :string
9
+ attribute :number, :string
10
+ attribute :subseries, :string
11
+ attribute :part, :string
12
+ attribute :supplement, :string
13
+ attribute :amendment, :string
14
+ attribute :annex, :string
15
+ attribute :corrigendum, :string
16
+ attribute :addendum, :string
17
+ attribute :appendix, :string
18
+ attribute :month, :string
19
+ attribute :year, :string
20
+ attribute :second_number, :string
21
+ attribute :range, :string
22
+ attribute :sg_number, :string
23
+
24
+ def to_s
25
+ parts = []
26
+
27
+ # Add publisher and sector
28
+ parts << "ITU-#{sector}" if sector
29
+
30
+ # Add series (handle special cases)
31
+ if series == "OB"
32
+ # Operational Bulletin
33
+ parts << "#{series} No. #{number}"
34
+ elsif series&.start_with?("SG")
35
+ # Study Group Question
36
+ parts << "#{series}.#{number}"
37
+ parts[-1] << "-#{part}" if part
38
+ elsif series == "R" && !number
39
+ # Resolution without number
40
+ parts << "R.#{number}"
41
+ parts[-1] << "-#{part}" if part
42
+ elsif series
43
+ # Regular series
44
+ series_str = series.to_s
45
+ if number
46
+ series_str << ".#{number}"
47
+ series_str << ".#{subseries}" if subseries
48
+ series_str << "-#{part}" if part
49
+ end
50
+ parts << series_str
51
+
52
+ # Add second number for combined standards
53
+ if second_number.is_a?(Hash)
54
+ second_str = "/#{second_number[:series]}.#{second_number[:number]}"
55
+ second_str << ".#{second_number[:subseries]}" if second_number[:subseries]
56
+ second_str << "-#{second_number[:part]}" if second_number[:part]
57
+ parts[-1] << second_str
58
+ end
59
+
60
+ # Add range notation
61
+ if range.is_a?(Hash)
62
+ parts[-1] << "-#{range[:series]}.#{range[:number]}"
63
+ end
64
+ elsif number && !series
65
+ # Handbook or similar (just number)
66
+ parts << number
67
+ parts[-1] << "-#{part}" if part
68
+ end
69
+
70
+ # Add supplement
71
+ if supplement
72
+ parts << "Suppl. #{supplement}"
73
+ end
74
+
75
+ # Add annex
76
+ if annex
77
+ parts << "Annex #{annex}"
78
+ end
79
+
80
+ # Add date
81
+ if month && year
82
+ parts << "(#{month.rjust(2, '0')}/#{year})"
83
+ elsif year
84
+ parts << "(#{year})"
85
+ end
86
+
87
+ # Add amendment
88
+ if amendment
89
+ parts << "Amd #{amendment}"
90
+ end
91
+
92
+ # Add corrigendum
93
+ if corrigendum
94
+ parts << "Cor. #{corrigendum}"
95
+ end
96
+
97
+ # Add addendum
98
+ if addendum
99
+ parts << "Add. #{addendum}"
100
+ end
101
+
102
+ # Add appendix
103
+ if appendix
104
+ parts << "App. #{appendix}"
105
+ end
106
+
107
+ parts.join(" ")
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,225 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parslet"
4
+
5
+ module Pubid
6
+ module Itu
7
+ class Parser < Parslet::Parser
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
17
+ rule(:itu_prefix) { str("ITU") >> (dash | space) }
18
+
19
+ # Sector (R, T, or D)
20
+ rule(:sector) do
21
+ (str("R") | str("T") | str("D")).as(:sector)
22
+ end
23
+
24
+ # Series (BO, V, X, etc.)
25
+ rule(:series) do
26
+ (
27
+ # Study groups: SG1, SG12
28
+ (str("SG") >> digits) |
29
+ # Regular series: BO, V, X, etc.
30
+ letter.repeat(1, 3)
31
+ ).as(:series)
32
+ end
33
+
34
+ # Number
35
+ rule(:number) do
36
+ digits.as(:number)
37
+ end
38
+
39
+ rule(:subseries) do
40
+ dot >> digits.as(:subseries)
41
+ end
42
+
43
+ # Parts
44
+ rule(:part) do
45
+ dash >> digits.as(:part)
46
+ end
47
+
48
+ rule(:parts) { part.repeat(0).as(:parts) }
49
+
50
+ # Code = number + subseries + parts
51
+ rule(:code) do
52
+ number >> subseries.maybe >> parts
53
+ end
54
+
55
+ # Date
56
+ rule(:date_part) do
57
+ space >> str("(") >>
58
+ (digits.as(:month) >> str("/")).maybe >>
59
+ digit.repeat(4, 4).as(:year) >>
60
+ str(")")
61
+ end
62
+
63
+ # Language
64
+ rule(:language) do
65
+ dash >> match["EFASCR"].as(:language)
66
+ end
67
+
68
+ # Combined identifier (Y.1351 part after slash)
69
+ rule(:combined_suffix) do
70
+ str("/") >>
71
+ series.as(:combined_series) >>
72
+ dot >>
73
+ digits.as(:combined_number) >>
74
+ subseries.maybe >>
75
+ parts
76
+ end
77
+
78
+ # Supplement types
79
+ rule(:supplement_type) do
80
+ (
81
+ str("Suppl.") | str("Suppl") |
82
+ str("Amd.") | str("Amd") |
83
+ str("Cor.") | str("Cor")
84
+ ).as(:supplement_type)
85
+ end
86
+
87
+ # Supplement number
88
+ rule(:supplement_number) do
89
+ space >> digits.as(:supplement_number)
90
+ end
91
+
92
+ # Supplement date (separate from base date)
93
+ rule(:supplement_date) do
94
+ space >> str("(") >>
95
+ (digits.as(:supplement_month) >> str("/")).maybe >>
96
+ digit.repeat(4, 4).as(:supplement_year) >>
97
+ str(")")
98
+ end
99
+
100
+ # Base identifier for supplements
101
+ rule(:base_with_series) do
102
+ itu_prefix >>
103
+ sector >>
104
+ space >>
105
+ series >> dot >>
106
+ code >>
107
+ combined_suffix.maybe >>
108
+ date_part.maybe
109
+ end
110
+
111
+ rule(:base_without_series) do
112
+ itu_prefix >>
113
+ sector >>
114
+ space >>
115
+ code >>
116
+ date_part.maybe
117
+ end
118
+
119
+ rule(:base_identifier) do
120
+ base_with_series | base_without_series
121
+ end
122
+
123
+ # Supplement with base identifier (has recommendation number)
124
+ rule(:supplement_with_base) do
125
+ base_identifier.as(:base) >>
126
+ space >>
127
+ supplement_type >>
128
+ supplement_number >>
129
+ supplement_date.maybe >>
130
+ language.maybe
131
+ end
132
+
133
+ # Supplement without base (series-only, like "ITU-T H Suppl. 1")
134
+ rule(:supplement_series_only) do
135
+ itu_prefix >>
136
+ sector >>
137
+ space >>
138
+ series >>
139
+ space >>
140
+ supplement_type >>
141
+ supplement_number >>
142
+ supplement_date.maybe >>
143
+ language.maybe
144
+ end
145
+
146
+ # Complete supplement identifier (try with base first, then series-only)
147
+ rule(:supplement_identifier) do
148
+ supplement_with_base | supplement_series_only
149
+ end
150
+
151
+ # With series: ITU-R BO.600-1
152
+ rule(:with_series) do
153
+ itu_prefix >>
154
+ sector >>
155
+ space >>
156
+ series >> dot >>
157
+ code >>
158
+ combined_suffix.maybe >>
159
+ date_part.maybe >>
160
+ language.maybe
161
+ end
162
+
163
+ # Without series: ITU-R 20-200
164
+ rule(:without_series) do
165
+ itu_prefix >>
166
+ sector >>
167
+ space >>
168
+ code >>
169
+ date_part.maybe >>
170
+ language.maybe
171
+ end
172
+
173
+ # OB (Operational Bulletin) — Special Publication.
174
+ # OB is a cross-bureau ITU publication; sector, when present in legacy
175
+ # strings like "ITU-T OB.1096", is silently dropped by the builder.
176
+ rule(:ob_series) { str("OB").as(:series) }
177
+
178
+ rule(:ob_dot_body) { dot >> number }
179
+ rule(:ob_no_body) { space >> str("No.") >> space >> number }
180
+
181
+ rule(:ob_with_sector) do
182
+ itu_prefix >>
183
+ (sector >> space).maybe >>
184
+ ob_series >>
185
+ (ob_dot_body | ob_no_body) >>
186
+ date_part.maybe >>
187
+ language.maybe
188
+ end
189
+
190
+ # Legacy long form: "ITU-T Operational Bulletin No. 1096".
191
+ # The :_op_bull marker tells the builder to set series=OB.
192
+ rule(:ob_long_form) do
193
+ itu_prefix >>
194
+ (sector >> space).maybe >>
195
+ str("Operational Bulletin").as(:_op_bull) >>
196
+ space >> str("No.") >> space >>
197
+ number >>
198
+ date_part.maybe >>
199
+ language.maybe
200
+ end
201
+
202
+ rule(:special_publication) { ob_with_sector | ob_long_form }
203
+
204
+ # "Annex to ..." — the document IS the annex of a Special Publication
205
+ # (no annex number). The :annex_to wrapping signals to the builder.
206
+ rule(:annex_to_identifier) do
207
+ str("Annex to") >> space >> special_publication.as(:annex_to)
208
+ end
209
+
210
+ rule(:identifier) do
211
+ annex_to_identifier |
212
+ special_publication |
213
+ supplement_identifier |
214
+ with_series |
215
+ without_series
216
+ end
217
+
218
+ rule(:root) { identifier }
219
+
220
+ def self.parse(input)
221
+ new.parse(input)
222
+ end
223
+ end
224
+ end
225
+ end