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,39 @@
1
+ require_relative "base"
2
+ require_relative "../../components/typed_stage"
3
+
4
+ module Pubid
5
+ module Iec
6
+ module Identifiers
7
+ # White Paper identifier class
8
+ # Single Responsibility: Represents IEC White Paper documents
9
+ class WhitePaper < Base
10
+ # White Papers have full phrase as type abbreviation
11
+ TYPED_STAGES = [
12
+ Pubid::Components::TypedStage.new(
13
+ code: :wp,
14
+ stage_code: :published,
15
+ type_code: :wp,
16
+ abbr: ["White Paper"],
17
+ name: "White Paper",
18
+ harmonized_stages: %w[60.00 60.60],
19
+ ),
20
+ ].freeze
21
+
22
+ def self.type
23
+ { key: :wp, title: "White Paper", short: "White Paper" }
24
+ end
25
+
26
+ # Override publisher_portion to add White Paper
27
+ def publisher_portion
28
+ result = publisher.to_s
29
+
30
+ if typed_stage && typed_stage.abbreviation == "White Paper"
31
+ result += " White Paper"
32
+ end
33
+
34
+ result
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,96 @@
1
+ require_relative "base"
2
+ # frozen_string_literal: true
3
+ require_relative "../../components/stage"
4
+
5
+ module Pubid
6
+ module Iec
7
+ module Identifiers
8
+ # Working Document identifier class
9
+ # Single Responsibility: Represents IEC Working Documents with TC attribution
10
+ # Also handles Working Programmes with PWI/PNW stage-first format
11
+ # Formats:
12
+ # Working Programme: "PWI TR 100-36 ED1"
13
+ # Working Document: "100/3705(F)/FDIS"
14
+ class WorkingDocument < Base
15
+ attribute :technical_committee, :string, default: -> {}
16
+ attribute :wd_number, :string, default: -> {}
17
+ attribute :wd_language, :string, default: -> {}
18
+ attribute :wd_stage, :string, default: -> {}
19
+ attribute :wp_stage, :string, default: -> {}
20
+ attribute :wp_type, :string, default: -> {}
21
+
22
+ # Working documents have no TYPED_STAGES - they use PROJECT_STAGES only
23
+ TYPED_STAGES = [].freeze
24
+
25
+ # Working document stages
26
+ PROJECT_STAGES = {}.freeze
27
+
28
+ def self.type
29
+ { key: :wd, title: "Working Document", short: "WD" }
30
+ end
31
+
32
+ # Return stage object for PWI/PNW stage
33
+ def stage
34
+ return nil unless wp_stage
35
+
36
+ # Map PWI/PNW to stage codes
37
+ stage_map = {
38
+ "PWI" => "pwi",
39
+ "PNW" => "pnw",
40
+ }
41
+ stage_code = stage_map[wp_stage]
42
+ return nil unless stage_code
43
+
44
+ @stage ||= ::Pubid::Components::Stage.new(stage_code: stage_code)
45
+ end
46
+
47
+ def to_s(_format = :short)
48
+ # Working Programme format: "PWI TR 100-36 ED1" or "IEC/PWI 60038"
49
+ if wp_stage
50
+ parts = []
51
+ # Include publisher if present (for IEC/PWI format)
52
+ if publisher
53
+ parts << publisher.body
54
+ if copublishers&.any?
55
+ parts << "/#{copublishers.map(&:body).join('/')}"
56
+ end
57
+ parts << "/"
58
+ end
59
+ parts << wp_stage
60
+ # Only add wp_type if it exists and is not empty/whitespace
61
+ if wp_type && !wp_type.strip.empty?
62
+ parts << " #{wp_type.strip}"
63
+ end
64
+
65
+ # Render full number with parts
66
+ if number
67
+ num_str = number.to_s
68
+ num_str += "-#{part}" if part && part.to_s != ""
69
+ num_str += "-#{subpart}" if subpart && subpart.to_s != ""
70
+ parts << " #{num_str}"
71
+ end
72
+
73
+ parts << " #{edition}" if edition&.number
74
+ return parts.join
75
+ end
76
+
77
+ # Working Document format: "100/3705(F)/FDIS"
78
+ parts = []
79
+
80
+ parts << technical_committee if technical_committee
81
+
82
+ # Number with optional language
83
+ if wd_number
84
+ num_part = wd_number.to_s
85
+ num_part += "(#{wd_language})" if wd_language
86
+ parts << num_part
87
+ end
88
+
89
+ parts << wd_stage if wd_stage
90
+
91
+ parts.join("/")
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,417 @@
1
+ require "parslet"
2
+ # frozen_string_literal: true
3
+ require_relative "../parser/common_parse_rules"
4
+ require_relative "../parser/common_parse_methods"
5
+ require_relative "identifier"
6
+ require_relative "supplement_identifier"
7
+
8
+ module Pubid
9
+ module Iec
10
+ class Parser < Parslet::Parser
11
+ include ::Pubid::Parser::CommonParseRules
12
+ include ::Pubid::Parser::CommonParseMethods
13
+
14
+ DASH_CHARS = ["-", "‑", "‐"].freeze
15
+
16
+ # We need to sort by length to match longest first because that's how Parslet works
17
+ TYPED_STAGES = Pubid::Iec::Scheme.typed_stages
18
+ .map(&:abbr).flatten.sort_by(&:length).reverse
19
+ TYPED_STAGES_SUPPLEMENTS = Pubid::Iec::Scheme.supplement_typed_stages
20
+ .map(&:abbr).flatten.sort_by(&:length).reverse
21
+
22
+ root :identifier
23
+
24
+ rule(:identifier) do
25
+ working_programme_with_publisher |
26
+ working_programme |
27
+ working_document |
28
+ sheet_supplement_identifier |
29
+ sheet_identifier |
30
+ supplement_supplement_identifier |
31
+ standalone_supplement |
32
+ supplement_identifier |
33
+ joint_identifier |
34
+ identifier_copublishers
35
+ end
36
+
37
+ # Working Programme format: [PWI|PNW] [TR] number edition
38
+ # Examples: "PWI TR 100-36 ED1", "PWI 100-44 ED1", "PNW 65-915 ED1"
39
+ # TC-style names: "PWI TR SYCSMARTENERGY-1", "PWI SyCLVDC-1 ED1"
40
+ rule(:working_programme) do
41
+ (str("PWI") | str("PNW")).as(:wp_stage) >>
42
+ space >>
43
+ (
44
+ (str("TR") >> space) |
45
+ (str("TS") >> space) |
46
+ (str("SRD") >> space)
47
+ ).maybe.as(:wp_type) >>
48
+ wp_number >>
49
+ (space >> edition).maybe
50
+ end
51
+
52
+ # Working Programme with publisher prefix: IEC/PWI [TR] number edition
53
+ # Examples: "IEC/PWI 60038", "ISO/IEC/PWI TR 100-36 ED1"
54
+ rule(:working_programme_with_publisher) do
55
+ prefix_with_copublishers >> str("/") >>
56
+ (str("PWI") | str("PNW")).as(:wp_stage) >>
57
+ space >>
58
+ (
59
+ (str("TR") >> space) |
60
+ (str("TS") >> space) |
61
+ (str("SRD") >> space)
62
+ ).maybe.as(:wp_type) >>
63
+ wp_number >>
64
+ (space >> edition).maybe
65
+ end
66
+
67
+ # Working programme numbers can be digits or TC names
68
+ rule(:wp_number) do
69
+ # TC-style: SYCSMARTENERGY-1, SyCLVDC-125
70
+ (match("[A-Za-z]").repeat(1) >> match('[A-Za-z\d]').repeat >> (dash >> match('\d').repeat(1)).maybe).as(:number_with_part) |
71
+ # Regular numeric: 100-36
72
+ number_with_part
73
+ end
74
+
75
+ # Working Document format: TC/number/stage
76
+ # TC can be: slashes (CIS/D), hyphens (JTC1-SC41), simple (100, 86B, ACEA, SyCSmartEnergy)
77
+ # Examples: "CIS/D/468A/CC", "JTC1-SC41/251/FDIS", "100/3705(F)/FDIS", "86B/4347A/CC"
78
+ rule(:working_document) do
79
+ # TC patterns: digits (100), letters (ACEA), letters/letters (CIS/D), or complex (JTC1-SC41)
80
+ (
81
+ # Try specific patterns first
82
+ (str("JTC1-SC") >> match('\d').repeat(1)) | # JTC1-SC41
83
+ (match("[A-Z]").repeat(1) >> str("/") >> match("[A-Z]").repeat(1)) | # CIS/D
84
+ match('[A-Za-z\d]').repeat(1) # Simple: 100, 86B, ACEA, SyCSmartEnergy
85
+ ).as(:technical_committee) >>
86
+ str("/") >>
87
+ match('[A-Za-z\d]').repeat(1).as(:wd_number) >>
88
+ (str("(") >> match("[A-Z]").as(:wd_language) >> str(")")).maybe >>
89
+ (str("/") >> match("[A-Z]").repeat(1).as(:wd_stage)).maybe
90
+ end
91
+
92
+ # IEC 60038:2009
93
+ # ISO/IEC 17025:2017
94
+ # CISPR 11:2015 (special IEC publisher)
95
+ # IECQ 080000:2017 (special IEC publisher)
96
+ # IECEE (IEC System for Conformity Assessment)
97
+ # IECEx (IEC System for Certification to Standards)
98
+ # IEC CA (IEC Conformity Assessment)
99
+ # IECQ CS (IECQ Component Specifications)
100
+ # IECQ OD (IECQ Operational Documents)
101
+ rule(:prefix_sole_publisher) do
102
+ (
103
+ str("IECQ OD") |
104
+ str("IECQ CS") |
105
+ str("IEC CAB") |
106
+ str("IEC CA") |
107
+ str("IECRE") |
108
+ str("CISPR") |
109
+ str("IECEE") |
110
+ str("IECEx") |
111
+ str("IECQ") |
112
+ str("IEC") |
113
+ str("ISO")
114
+ ).as(:publisher)
115
+ end
116
+
117
+ # ISO/IEC or IEC
118
+ rule(:prefix_with_copublishers) do
119
+ prefix_sole_publisher >> space? >> copublishers.maybe
120
+ end
121
+
122
+ ORGANIZATIONS = %w[
123
+ IEC ISO IEEE CIW SAE CIE ASME ASTM OECD HL7 CEI UNDP
124
+ ].freeze
125
+ rule(:copublishers) do
126
+ (str("/") >> space? >> array_to_str(ORGANIZATIONS).as(:copublisher)).repeat.as(:copublishers)
127
+ end
128
+
129
+ rule(:number_with_part) do
130
+ (number >> part_and_subpart.maybe).as(:number_with_part)
131
+ end
132
+
133
+ # For TRF with organization prefix: "CISPR 14-1G" where CISPR is part of the number
134
+ rule(:trf_org_number) do
135
+ (str("CISPR") >> space).as(:trf_org) >> number_with_part
136
+ end
137
+
138
+ rule(:number) do
139
+ # ISO/IEC Directives: "DIR", "DIR 1", "DIR 1 IEC SUP", "DIR 2 IEC", "DIR IEC SUP"
140
+ # Captured as a flat number (no part/subpart) so it round-trips to the input
141
+ # and class-matches the IEC index. Must come before the IECEE [A-Z]{2,4} branch,
142
+ # which would otherwise match "DIR" alone and leave the trailing tokens unconsumed.
143
+ (str("DIR") >> (space >> match('[A-Z\d]').repeat(1)).repeat) |
144
+ # Special case for VIM publication
145
+ str("VIM") |
146
+ # Special case for SYMBOL publication
147
+ str("SYMBOL") |
148
+ # IECEx TRF version notation: 62784v1a_ds, 62784v1A
149
+ (match('\d').repeat(1,
150
+ 6) >> str("v") >> match('\d').repeat(1) >> match("[a-zA-Z]").repeat >> (str("_") >> match("[a-zA-Z]").repeat).maybe) |
151
+ # IECEE letter-based numbers: AD-001, GD-2053, OD-1000, CAB-G01, 01-S
152
+ # Pattern: 2-4 letter prefix followed by optional dash and number
153
+ # The suffix uses [A-Z\d] but not space to properly separate from edition
154
+ (match("[A-Z]").repeat(2, 4) >> (
155
+ dash >> match('\d').repeat(1)
156
+ ).maybe >> match('[A-Z\d]').repeat) |
157
+ # Can be 5-6 digits for TRF: 60065, 610091
158
+ # Can have letter suffix: 60065N, 610091A
159
+ # Can have letter + underscore + letters: 61215F_SE
160
+ (match('\d').repeat(1, 6) >> (
161
+ match("[a-zA-Z]") >> (str("_") >> match("[a-zA-Z]").repeat).maybe
162
+ ).maybe)
163
+ end
164
+
165
+ rule(:date) do
166
+ # :2005-02 or optional for DB without date
167
+ (str(":") | dash) >>
168
+ (year_digits >>
169
+ (dash >> month_digits).maybe >>
170
+ (dash >> day_digits).maybe
171
+ ).as(:date)
172
+ end
173
+
174
+ rule(:part_and_subpart) do
175
+ # Parts can have:
176
+ # - Dashes: 60038-1
177
+ # - Complex: 29110-5-1-1
178
+ # - TRF ampersand: 60086-1&2A
179
+ # - TRF underscore: 60127-2-IA_I, 61215F_SE
180
+ # - TRF lowercase: 60127-2-iD_I
181
+ # - TRF commas: 60309-1,2G or 60335-1-14,15G
182
+
183
+ # the "space?" needed to handle potential spaces
184
+ (dash | str(",")) >> space? >>
185
+ # matches a part with special TRF characters including commas
186
+ match('[\w&_,]').repeat >>
187
+ # matches subparts
188
+ ((dash | str(",")) >> match('[\w&_,]').repeat).repeat.maybe
189
+ end
190
+
191
+ rule(:all_parts) do
192
+ str("(all parts)").as(:all_parts)
193
+ end
194
+
195
+ rule(:type_with_stage) do
196
+ # "DTR"
197
+ # "TS"
198
+ # "Guide"
199
+ # Also includes supplement stages like "CDCor" for standalone draft corrigenda
200
+ array_to_str(TYPED_STAGES + TYPED_STAGES_SUPPLEMENTS).as(:type_with_stage) >>
201
+ (match('\d').as(:stage_iteration) >> space).maybe
202
+ end
203
+
204
+ rule(:language) do
205
+ # IEC 60038:2009(en,fr)
206
+ # IEC 60038:2009(E/F)
207
+ str("(") >>
208
+ (
209
+ # parse 2-char language codes: ru,en,fr,de,ar,es
210
+ (match["a-z"].repeat(1) >> str(",").maybe) |
211
+ # parse single language codes: R/E/F
212
+ (match["EFARDS"] >> str("/").maybe)
213
+ ).repeat.as(:languages) >>
214
+ str(")")
215
+ end
216
+
217
+ EDITION_STRINGS = %w[Edition Ed. ED Ed].freeze
218
+ rule(:edition) do
219
+ # We ignore the case where there is "Ed" but no number
220
+ # Handle decimal editions like ED1.2
221
+ array_to_str(EDITION_STRINGS) >> space? >>
222
+ (digits >> (str(".") >> digits).maybe).maybe.as(:edition)
223
+ end
224
+
225
+ rule(:stage_iteration) do
226
+ # "IEC 11243.1"
227
+ str(".") >> match('\d').as(:stage_iteration)
228
+ end
229
+
230
+ # Sheet notation: /1:1994 (sheet 1 from year 1994)
231
+ # IEC 60695-2-1/1:1994
232
+ rule(:sheet_notation) do
233
+ str("/") >>
234
+ match('\d').repeat(1).as(:sheet_number) >>
235
+ str(":") >>
236
+ year_digits.as(:sheet_year)
237
+ end
238
+
239
+ # Sheet notation without year: /1 (sheet 1 without year)
240
+ # IEC 60695-2-1/1
241
+ rule(:sheet_notation_no_year) do
242
+ str("/") >>
243
+ match('\d').repeat(1).as(:sheet_number)
244
+ end
245
+
246
+ # Fragment notation: /FRAG2 or /FRAGC1 (fragment of amendment/corrigendum)
247
+ # IEC 60050-191/AMD2/FRAG2
248
+ # IEC 60050-191/COR1/FRAGC1
249
+ rule(:fragment_notation) do
250
+ str("/") >>
251
+ (str("FRAGC") | str("FRAG")).as(:fragment_type) >>
252
+ match('\d').repeat(1).as(:fragment_number)
253
+ end
254
+
255
+ # Sheet identifier: base identifier followed by /N:YEAR
256
+ # IEC 60695-2-1/1:1994 (sheet 1 from year 1994)
257
+ # IEC 60695-2-1/1 (sheet 1 without year)
258
+ rule(:sheet_identifier) do
259
+ identifier_copublishers_no_third.as(:base_identifier) >>
260
+ (sheet_notation | sheet_notation_no_year)
261
+ end
262
+
263
+ # Sheet identifier followed by supplement: base/sheet/supplement
264
+ # IEC 60695-2-1/1:1994/COR1:1995
265
+ rule(:sheet_supplement_identifier) do
266
+ identifier_copublishers_no_third.as(:base_identifier) >>
267
+ sheet_notation >>
268
+ str("/") >> supplement_type_with_stage >>
269
+ space? >> second_part >> third_part
270
+ end
271
+
272
+ # VAP suffix for consolidated/version types
273
+ # CSV = Consolidated version (with Supplements)
274
+ # CMV = Commented Version
275
+ # RLV = Redline Version (shows changes)
276
+ # SER = Serial version
277
+ # EXV = Example version
278
+ # PAC = Package
279
+ # PRV = Preview version
280
+ rule(:vap_suffix) do
281
+ space >> (
282
+ str("CSV") |
283
+ str("CMV") |
284
+ str("RLV") |
285
+ str("SER") |
286
+ str("EXV") |
287
+ str("PAC") |
288
+ str("PRV")
289
+ ).as(:vap_suffix)
290
+ end
291
+
292
+ # Database suffix: " DB"
293
+ # IEC 60617:2012 DB
294
+ rule(:database_suffix) do
295
+ space >> str("DB").as(:database)
296
+ end
297
+
298
+ # Consolidated amendments: +AMD1:2016+AMD2:2019
299
+ # Also supports without dates: +AMD1+AMD2
300
+ # Creates ConsolidatedIdentifier with array of amendments
301
+ rule(:consolidated_supplement) do
302
+ str("+") >>
303
+ (str("AMD") | str("COR")).as(:supplement_type) >>
304
+ match('\d').repeat(1).as(:supplement_number) >>
305
+ (str(":") >> year_digits.as(:supplement_year)).maybe
306
+ end
307
+
308
+ rule(:consolidated_supplements) do
309
+ consolidated_supplement.repeat(1).as(:consolidated_supplements)
310
+ end
311
+
312
+ rule(:second_part) do
313
+ # Try TRF organization number first, fallback to regular number
314
+ (trf_org_number | number_with_part) >>
315
+ stage_iteration.maybe >>
316
+ (space? >> date).maybe >>
317
+ consolidated_supplements.maybe >>
318
+ (vap_suffix | database_suffix).maybe
319
+ end
320
+
321
+ rule(:third_part_edition) do
322
+ space? >> edition.maybe
323
+ end
324
+
325
+ rule(:third_part) do
326
+ # End of the identifier, we can have language, edition, fragment, or all parts
327
+ third_part_edition >> language.maybe >> fragment_notation.maybe >> all_parts.maybe
328
+ end
329
+
330
+ # prefix sole or copublishers with type and stage
331
+ # IEC/TR 60038
332
+ # ISO/IEC TS 20594-1
333
+ # IEC/FDIS 60038
334
+ rule(:identifier_copublishers) do
335
+ identifier_copublishers_no_third >> third_part
336
+ end
337
+
338
+ rule(:guide_prefix) do
339
+ str("Guide") | str("GUIDE")
340
+ end
341
+
342
+ rule(:identifier_copublishers_no_third) do
343
+ # Guide IEC 51:1999
344
+ (guide_prefix.as(:type_with_stage_fr) >> space).maybe >>
345
+ prefix_with_copublishers.maybe >> space? >> str("/").maybe >>
346
+ type_with_stage.maybe >>
347
+ space.maybe >>
348
+ second_part >> third_part_edition
349
+ end
350
+
351
+ # For joint identifiers (ISO/IEC)
352
+ # ISO/IEC 17025:2017 handles copublisher in copublishers rule
353
+ # We handle this in identifier_copublishers already
354
+ rule(:joint_identifier) do
355
+ identifier_copublishers_no_third.as(:base_identifier) >>
356
+ space? >> str("|") >> space? >>
357
+ scope { iso_identifier }.as(:joint_identifier)
358
+ end
359
+
360
+ rule(:iso_identifier) do
361
+ Iso::Parser.new.identifier
362
+ end
363
+
364
+ rule(:supplement_type_with_stage) do
365
+ # "DAM"
366
+ # "Amd"
367
+ # "FRAG" (fragments of amendments)
368
+ # "FRAGC" (fragments of corrigenda)
369
+ (array_to_str(TYPED_STAGES_SUPPLEMENTS) | str("FRAGC") | str("FRAG")).as(:type_with_stage)
370
+ end
371
+
372
+ # Standalone draft supplement (no base identifier)
373
+ # IEC/FDAM 60038-1
374
+ # IEC/FDCOR 12345
375
+ rule(:standalone_supplement) do
376
+ prefix_with_copublishers >> str("/") >>
377
+ supplement_type_with_stage >>
378
+ space >> second_part >> third_part
379
+ end
380
+
381
+ # IEC 60038:2009/Amd 1:2011
382
+ rule(:supplement_identifier_no_third) do
383
+ identifier_copublishers_no_third.as(:base_identifier) >>
384
+ str("/") >> supplement_type_with_stage >>
385
+ space? >> second_part
386
+ end
387
+
388
+ rule(:supplement_identifier) do
389
+ supplement_identifier_no_third >> third_part
390
+ end
391
+
392
+ # IEC 60038:2009/Amd 1:2011/Cor 1:2012
393
+ rule(:supplement_supplement_identifier) do
394
+ supplement_identifier_no_third.as(:base_identifier) >>
395
+ str("/") >> supplement_type_with_stage >>
396
+ space? >> second_part >> third_part
397
+ end
398
+
399
+ rule(:dash) do
400
+ DASH_CHARS.map { |char| str(char) }.reduce(:|)
401
+ end
402
+
403
+ IEV_SHORTHAND = /\AIEV(?=\z|[\s-])/
404
+
405
+ # Preprocess input to normalize tab-separated editions and other formats
406
+ def parse(input)
407
+ # Normalize tab-separated editions: "IECEE AD-001\tED1.6" -> "IECEE AD-001 ED1.6"
408
+ normalized = input.gsub("\t", " ")
409
+ # Normalize comma-separated editions: "IEC CAB-G01:2025-02, Ed. 2.1" -> "IEC CAB-G01:2025-02 Ed. 2.1"
410
+ normalized = normalized.gsub(/,\s+Ed\./, " Ed.")
411
+ # Expand IEV shorthand: "IEV" / "IEV-351" -> "IEC 60050" / "IEC 60050-351"
412
+ normalized = normalized.sub(IEV_SHORTHAND, "IEC 60050")
413
+ super(normalized)
414
+ end
415
+ end
416
+ end
417
+ end
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iec
5
+ # Base class for rendering styles using Strategy pattern
6
+ # Each identifier stores its own rendering_style which knows how to render it
7
+ class RenderingStyle
8
+ attr_reader :with_language_code, :stage_format_long, :with_date
9
+
10
+ def initialize(with_language_code:, stage_format_long:, with_date:)
11
+ @with_language_code = with_language_code
12
+ @stage_format_long = stage_format_long
13
+ @with_date = with_date
14
+ end
15
+
16
+ # Render the identifier according to this style
17
+ def render(identifier, with_edition: false)
18
+ parts = []
19
+
20
+ # Publisher portion
21
+ parts << identifier.publisher_portion(
22
+ lang: :en,
23
+ stage_format_long: stage_format_long,
24
+ )
25
+
26
+ # Number portion
27
+ parts << identifier.number_portion(
28
+ lang_single: single_char_language?,
29
+ with_date: with_date,
30
+ )
31
+
32
+ # Edition portion (if requested)
33
+ if with_edition && identifier.edition && (identifier.edition.number || identifier.edition.original_text)
34
+ parts << identifier.edition_portion(lang: :en)
35
+ end
36
+
37
+ result = parts.compact.join(" ")
38
+
39
+ # Language portion (if applicable)
40
+ if identifier.languages&.any? && with_language_code != :none
41
+ result << identifier.language_portion(lang_single: single_char_language?)
42
+ end
43
+
44
+ result
45
+ end
46
+
47
+ def single_char_language?
48
+ with_language_code == :single
49
+ end
50
+
51
+ def self.from_format(format)
52
+ case format
53
+ when :ref_num_short
54
+ RefNumShort.new
55
+ when :ref_num_long
56
+ RefNumLong.new
57
+ when :ref_dated
58
+ RefDated.new
59
+ when :ref_dated_long
60
+ RefDatedLong.new
61
+ when :ref_undated
62
+ RefUndated.new
63
+ when :ref_undated_long
64
+ RefUndatedLong.new
65
+ else
66
+ RefDatedLong.new # Default
67
+ end
68
+ end
69
+ end
70
+
71
+ # Instance reference number: 1-letter language code + short form + dated
72
+ class RefNumShort < RenderingStyle
73
+ def initialize
74
+ super(with_language_code: :single, stage_format_long: false, with_date: true)
75
+ end
76
+ end
77
+
78
+ # Instance reference number long: 2-letter language code + long form + dated
79
+ class RefNumLong < RenderingStyle
80
+ def initialize
81
+ super(with_language_code: :iso, stage_format_long: true, with_date: true)
82
+ end
83
+ end
84
+
85
+ # Reference dated: no language code + short form + dated
86
+ class RefDated < RenderingStyle
87
+ def initialize
88
+ super(with_language_code: :none, stage_format_long: false, with_date: true)
89
+ end
90
+ end
91
+
92
+ # Reference dated long: no language code + long form + dated
93
+ class RefDatedLong < RenderingStyle
94
+ def initialize
95
+ super(with_language_code: :none, stage_format_long: true, with_date: true)
96
+ end
97
+ end
98
+
99
+ # Reference undated: no language code + short form + undated
100
+ class RefUndated < RenderingStyle
101
+ def initialize
102
+ super(with_language_code: :none, stage_format_long: false, with_date: false)
103
+ end
104
+ end
105
+
106
+ # Reference undated long: no language code + long form + undated
107
+ class RefUndatedLong < RenderingStyle
108
+ def initialize
109
+ super(with_language_code: :none, stage_format_long: true, with_date: false)
110
+ end
111
+ end
112
+ end
113
+ end