pubid 1.15.17 → 2.0.0.pre.alpha.1

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 (601) 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 +87 -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 +18 -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 +13 -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 +21 -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 +18 -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 +15 -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 +15 -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 +27 -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 +16 -0
  160. data/lib/pubid/ccsds/identifiers/base.rb +78 -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 +74 -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 +15 -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 +18 -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/language.rb +37 -0
  219. data/lib/pubid/components/locality.rb +10 -0
  220. data/lib/pubid/components/publisher.rb +36 -0
  221. data/lib/pubid/components/stage.rb +54 -0
  222. data/lib/pubid/components/type.rb +58 -0
  223. data/lib/pubid/components/typed_stage.rb +55 -0
  224. data/lib/pubid/components.rb +15 -0
  225. data/lib/pubid/core/pattern_doc_generator.rb +272 -0
  226. data/lib/pubid/core/update_codes.rb +77 -0
  227. data/lib/pubid/core.rb +8 -0
  228. data/lib/pubid/csa/builder.rb +671 -0
  229. data/lib/pubid/csa/components/code.rb +9 -0
  230. data/lib/pubid/csa/components.rb +9 -0
  231. data/lib/pubid/csa/composite_identifier.rb +27 -0
  232. data/lib/pubid/csa/identifier.rb +457 -0
  233. data/lib/pubid/csa/identifiers/base.rb +133 -0
  234. data/lib/pubid/csa/identifiers/bundled.rb +125 -0
  235. data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
  236. data/lib/pubid/csa/identifiers/cec.rb +129 -0
  237. data/lib/pubid/csa/identifiers/combined.rb +130 -0
  238. data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
  239. data/lib/pubid/csa/identifiers/package.rb +65 -0
  240. data/lib/pubid/csa/identifiers/series.rb +127 -0
  241. data/lib/pubid/csa/identifiers/standard.rb +10 -0
  242. data/lib/pubid/csa/identifiers.rb +17 -0
  243. data/lib/pubid/csa/parser.rb +445 -0
  244. data/lib/pubid/csa/scheme.rb +44 -0
  245. data/lib/pubid/csa/single_identifier.rb +30 -0
  246. data/lib/pubid/csa/urn_generator.rb +80 -0
  247. data/lib/pubid/csa/wrapper_identifier.rb +31 -0
  248. data/lib/pubid/csa.rb +25 -0
  249. data/lib/pubid/etsi/builder.rb +133 -0
  250. data/lib/pubid/etsi/components/code.rb +42 -0
  251. data/lib/pubid/etsi/components/version.rb +37 -0
  252. data/lib/pubid/etsi/components.rb +10 -0
  253. data/lib/pubid/etsi/identifier.rb +14 -0
  254. data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
  255. data/lib/pubid/etsi/identifiers/base.rb +38 -0
  256. data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
  257. data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
  258. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
  259. data/lib/pubid/etsi/identifiers.rb +14 -0
  260. data/lib/pubid/etsi/parser.rb +133 -0
  261. data/lib/pubid/etsi/scheme.rb +42 -0
  262. data/lib/pubid/etsi/urn_generator.rb +76 -0
  263. data/lib/pubid/etsi.rb +21 -0
  264. data/lib/pubid/export/auditor.rb +89 -0
  265. data/lib/pubid/export/data_class_exporter.rb +59 -0
  266. data/lib/pubid/export/exporter.rb +74 -0
  267. data/lib/pubid/export/flavor_exporter.rb +402 -0
  268. data/lib/pubid/export/ieee_exporter.rb +78 -0
  269. data/lib/pubid/export/itu_exporter.rb +66 -0
  270. data/lib/pubid/export/nist_exporter.rb +64 -0
  271. data/lib/pubid/export/registry_exporter.rb +90 -0
  272. data/lib/pubid/export/result.rb +97 -0
  273. data/lib/pubid/export/scheme_exporter.rb +70 -0
  274. data/lib/pubid/export.rb +18 -0
  275. data/lib/pubid/format_detector.rb +16 -0
  276. data/lib/pubid/format_registry.rb +42 -0
  277. data/lib/pubid/identifier.rb +235 -0
  278. data/lib/pubid/identifier_metadata.rb +148 -0
  279. data/lib/pubid/identifier_registry.rb +198 -0
  280. data/lib/pubid/idf/builder.rb +82 -0
  281. data/lib/pubid/idf/identifier.rb +69 -0
  282. data/lib/pubid/idf/identifiers/amendment.rb +27 -0
  283. data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
  284. data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
  285. data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
  286. data/lib/pubid/idf/identifiers.rb +13 -0
  287. data/lib/pubid/idf/parser.rb +143 -0
  288. data/lib/pubid/idf/scheme.rb +61 -0
  289. data/lib/pubid/idf/single_identifier.rb +19 -0
  290. data/lib/pubid/idf/supplement_identifier.rb +43 -0
  291. data/lib/pubid/idf/urn_generator.rb +84 -0
  292. data/lib/pubid/idf.rb +25 -0
  293. data/lib/pubid/iec/builder.rb +457 -0
  294. data/lib/pubid/iec/components/code.rb +59 -0
  295. data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
  296. data/lib/pubid/iec/components/publisher.rb +35 -0
  297. data/lib/pubid/iec/components/sheet.rb +32 -0
  298. data/lib/pubid/iec/components/trf_info.rb +38 -0
  299. data/lib/pubid/iec/components/vap_suffix.rb +41 -0
  300. data/lib/pubid/iec/identifier.rb +21 -0
  301. data/lib/pubid/iec/identifiers/amendment.rb +94 -0
  302. data/lib/pubid/iec/identifiers/base.rb +78 -0
  303. data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
  304. data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
  305. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +86 -0
  306. data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
  307. data/lib/pubid/iec/identifiers/fragment_identifier.rb +141 -0
  308. data/lib/pubid/iec/identifiers/guide.rb +104 -0
  309. data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
  310. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
  311. data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
  312. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
  313. data/lib/pubid/iec/identifiers/sheet_identifier.rb +66 -0
  314. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
  315. data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
  316. data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
  317. data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
  318. data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
  319. data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
  320. data/lib/pubid/iec/identifiers/vap_identifier.rb +77 -0
  321. data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
  322. data/lib/pubid/iec/identifiers/working_document.rb +96 -0
  323. data/lib/pubid/iec/parser.rb +412 -0
  324. data/lib/pubid/iec/rendering_style.rb +113 -0
  325. data/lib/pubid/iec/scheme.rb +71 -0
  326. data/lib/pubid/iec/single_identifier.rb +80 -0
  327. data/lib/pubid/iec/supplement_identifier.rb +161 -0
  328. data/lib/pubid/iec/urn_generator.rb +193 -0
  329. data/lib/pubid/iec/urn_parser.rb +289 -0
  330. data/lib/pubid/iec.rb +85 -0
  331. data/lib/pubid/ieee/aiee/builder.rb +71 -0
  332. data/lib/pubid/ieee/aiee/identifier.rb +105 -0
  333. data/lib/pubid/ieee/aiee/parser.rb +130 -0
  334. data/lib/pubid/ieee/aiee.rb +11 -0
  335. data/lib/pubid/ieee/builder.rb +1237 -0
  336. data/lib/pubid/ieee/components/code.rb +102 -0
  337. data/lib/pubid/ieee/components/draft.rb +93 -0
  338. data/lib/pubid/ieee/components/relationship.rb +157 -0
  339. data/lib/pubid/ieee/components/typed_stage.rb +100 -0
  340. data/lib/pubid/ieee/identifier.rb +13 -0
  341. data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
  342. data/lib/pubid/ieee/identifiers/base.rb +591 -0
  343. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
  344. data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
  345. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
  346. data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
  347. data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
  348. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
  349. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
  350. data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
  351. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
  352. data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
  353. data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
  354. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
  355. data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
  356. data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
  357. data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
  358. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
  359. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
  360. data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
  361. data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
  362. data/lib/pubid/ieee/identifiers/standard.rb +41 -0
  363. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
  364. data/lib/pubid/ieee/identifiers.rb +33 -0
  365. data/lib/pubid/ieee/ire/builder.rb +61 -0
  366. data/lib/pubid/ieee/ire/identifier.rb +58 -0
  367. data/lib/pubid/ieee/ire/parser.rb +91 -0
  368. data/lib/pubid/ieee/ire.rb +11 -0
  369. data/lib/pubid/ieee/nesc/builder.rb +101 -0
  370. data/lib/pubid/ieee/nesc/parser.rb +154 -0
  371. data/lib/pubid/ieee/nesc.rb +10 -0
  372. data/lib/pubid/ieee/parser.rb +1226 -0
  373. data/lib/pubid/ieee/scheme.rb +90 -0
  374. data/lib/pubid/ieee/typed_stages.rb +172 -0
  375. data/lib/pubid/ieee/urn_generator.rb +188 -0
  376. data/lib/pubid/ieee.rb +32 -0
  377. data/lib/pubid/ieee_debug.rb +31 -0
  378. data/lib/pubid/iho/builder.rb +37 -0
  379. data/lib/pubid/iho/identifier.rb +19 -0
  380. data/lib/pubid/iho/identifiers/base.rb +41 -0
  381. data/lib/pubid/iho/identifiers/bibliographic.rb +20 -0
  382. data/lib/pubid/iho/identifiers/circular_letter.rb +19 -0
  383. data/lib/pubid/iho/identifiers/miscellaneous.rb +20 -0
  384. data/lib/pubid/iho/identifiers/publication.rb +19 -0
  385. data/lib/pubid/iho/identifiers/standard.rb +19 -0
  386. data/lib/pubid/iho/identifiers.rb +14 -0
  387. data/lib/pubid/iho/parser.rb +68 -0
  388. data/lib/pubid/iho/scheme.rb +29 -0
  389. data/lib/pubid/iho/urn_generator.rb +29 -0
  390. data/lib/pubid/iho.rb +21 -0
  391. data/lib/pubid/iso/builder.rb +305 -0
  392. data/lib/pubid/iso/bundled_identifier.rb +85 -0
  393. data/lib/pubid/iso/combined_identifier.rb +22 -0
  394. data/lib/pubid/iso/components/code.rb +36 -0
  395. data/lib/pubid/iso/components/publisher.rb +60 -0
  396. data/lib/pubid/iso/components.rb +12 -0
  397. data/lib/pubid/iso/format_resolver.rb +45 -0
  398. data/lib/pubid/iso/identifier.rb +69 -0
  399. data/lib/pubid/iso/identifiers/addendum.rb +104 -0
  400. data/lib/pubid/iso/identifiers/amendment.rb +128 -0
  401. data/lib/pubid/iso/identifiers/base.rb +115 -0
  402. data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
  403. data/lib/pubid/iso/identifiers/data.rb +76 -0
  404. data/lib/pubid/iso/identifiers/directives.rb +59 -0
  405. data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
  406. data/lib/pubid/iso/identifiers/extract.rb +30 -0
  407. data/lib/pubid/iso/identifiers/guide.rb +100 -0
  408. data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
  409. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
  410. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +89 -0
  411. data/lib/pubid/iso/identifiers/pas.rb +93 -0
  412. data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
  413. data/lib/pubid/iso/identifiers/supplement.rb +87 -0
  414. data/lib/pubid/iso/identifiers/tc_document.rb +108 -0
  415. data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
  416. data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
  417. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
  418. data/lib/pubid/iso/identifiers.rb +33 -0
  419. data/lib/pubid/iso/parser.rb +510 -0
  420. data/lib/pubid/iso/rendering_style.rb +120 -0
  421. data/lib/pubid/iso/scheme.rb +187 -0
  422. data/lib/pubid/iso/single_identifier.rb +61 -0
  423. data/lib/pubid/iso/supplement_identifier.rb +27 -0
  424. data/lib/pubid/iso/urn_generator.rb +412 -0
  425. data/lib/pubid/iso/urn_parser.rb +423 -0
  426. data/lib/pubid/iso/utilities.rb +86 -0
  427. data/lib/pubid/iso.rb +50 -0
  428. data/lib/pubid/itu/builder.rb +171 -0
  429. data/lib/pubid/itu/components/code.rb +39 -0
  430. data/lib/pubid/itu/components/sector.rb +35 -0
  431. data/lib/pubid/itu/components/series.rb +29 -0
  432. data/lib/pubid/itu/i18n.rb +9 -0
  433. data/lib/pubid/itu/i18n.yaml +30 -0
  434. data/lib/pubid/itu/identifier.rb +53 -0
  435. data/lib/pubid/itu/identifiers/amendment.rb +43 -0
  436. data/lib/pubid/itu/identifiers/annex.rb +74 -0
  437. data/lib/pubid/itu/identifiers/base.rb +154 -0
  438. data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
  439. data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
  440. data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
  441. data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
  442. data/lib/pubid/itu/identifiers/supplement.rb +46 -0
  443. data/lib/pubid/itu/identifiers.rb +16 -0
  444. data/lib/pubid/itu/model.rb +111 -0
  445. data/lib/pubid/itu/parser.rb +225 -0
  446. data/lib/pubid/itu/scheme.rb +174 -0
  447. data/lib/pubid/itu/urn_generator.rb +105 -0
  448. data/lib/pubid/itu.rb +22 -0
  449. data/lib/pubid/jcgm/builder.rb +88 -0
  450. data/lib/pubid/jcgm/components/publisher.rb +20 -0
  451. data/lib/pubid/jcgm/components.rb +9 -0
  452. data/lib/pubid/jcgm/identifier.rb +11 -0
  453. data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
  454. data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
  455. data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
  456. data/lib/pubid/jcgm/identifiers.rb +11 -0
  457. data/lib/pubid/jcgm/parser.rb +84 -0
  458. data/lib/pubid/jcgm/scheme.rb +60 -0
  459. data/lib/pubid/jcgm/single_identifier.rb +48 -0
  460. data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
  461. data/lib/pubid/jcgm/urn_generator.rb +110 -0
  462. data/lib/pubid/jcgm.rb +31 -0
  463. data/lib/pubid/jis/builder.rb +124 -0
  464. data/lib/pubid/jis/components/code.rb +59 -0
  465. data/lib/pubid/jis/components.rb +9 -0
  466. data/lib/pubid/jis/identifier.rb +18 -0
  467. data/lib/pubid/jis/identifiers/amendment.rb +16 -0
  468. data/lib/pubid/jis/identifiers/base.rb +72 -0
  469. data/lib/pubid/jis/identifiers/explanation.rb +22 -0
  470. data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
  471. data/lib/pubid/jis/identifiers/standard.rb +27 -0
  472. data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
  473. data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
  474. data/lib/pubid/jis/identifiers.rb +17 -0
  475. data/lib/pubid/jis/parser.rb +109 -0
  476. data/lib/pubid/jis/scheme.rb +49 -0
  477. data/lib/pubid/jis/single_identifier.rb +37 -0
  478. data/lib/pubid/jis/supplement_identifier.rb +47 -0
  479. data/lib/pubid/jis/urn_generator.rb +25 -0
  480. data/lib/pubid/jis.rb +23 -0
  481. data/lib/pubid/lutaml/no_store_registration.rb +30 -0
  482. data/lib/pubid/nist/builder.rb +2100 -0
  483. data/lib/pubid/nist/components/code.rb +38 -0
  484. data/lib/pubid/nist/components/edition.rb +118 -0
  485. data/lib/pubid/nist/components/issue_number.rb +28 -0
  486. data/lib/pubid/nist/components/part.rb +77 -0
  487. data/lib/pubid/nist/components/publisher.rb +24 -0
  488. data/lib/pubid/nist/components/stage.rb +53 -0
  489. data/lib/pubid/nist/components/supplement.rb +121 -0
  490. data/lib/pubid/nist/components/translation.rb +42 -0
  491. data/lib/pubid/nist/components/update.rb +103 -0
  492. data/lib/pubid/nist/components/version.rb +35 -0
  493. data/lib/pubid/nist/components/volume.rb +32 -0
  494. data/lib/pubid/nist/components.rb +19 -0
  495. data/lib/pubid/nist/configuration.rb +77 -0
  496. data/lib/pubid/nist/identifiers/base.rb +499 -0
  497. data/lib/pubid/nist/identifiers/circular.rb +68 -0
  498. data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
  499. data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
  500. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
  501. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
  502. data/lib/pubid/nist/identifiers/crpl_report.rb +135 -0
  503. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +94 -0
  504. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
  505. data/lib/pubid/nist/identifiers/handbook.rb +50 -0
  506. data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
  507. data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
  508. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
  509. data/lib/pubid/nist/identifiers/monograph.rb +69 -0
  510. data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
  511. data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
  512. data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
  513. data/lib/pubid/nist/identifiers/report.rb +68 -0
  514. data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
  515. data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
  516. data/lib/pubid/nist/identifiers.rb +33 -0
  517. data/lib/pubid/nist/parser.rb +1084 -0
  518. data/lib/pubid/nist/scheme.rb +199 -0
  519. data/lib/pubid/nist/supplement_identifier.rb +83 -0
  520. data/lib/pubid/nist/urn_generator.rb +127 -0
  521. data/lib/pubid/nist.rb +36 -0
  522. data/lib/pubid/oiml/builder.rb +189 -0
  523. data/lib/pubid/oiml/components/code.rb +20 -0
  524. data/lib/pubid/oiml/components.rb +9 -0
  525. data/lib/pubid/oiml/identifier.rb +11 -0
  526. data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
  527. data/lib/pubid/oiml/identifiers/annex.rb +62 -0
  528. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  529. data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
  530. data/lib/pubid/oiml/identifiers/document.rb +13 -0
  531. data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
  532. data/lib/pubid/oiml/identifiers/guide.rb +13 -0
  533. data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
  534. data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
  535. data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
  536. data/lib/pubid/oiml/identifiers.rb +18 -0
  537. data/lib/pubid/oiml/parser.rb +173 -0
  538. data/lib/pubid/oiml/scheme.rb +46 -0
  539. data/lib/pubid/oiml/single_identifier.rb +90 -0
  540. data/lib/pubid/oiml/supplement_identifier.rb +43 -0
  541. data/lib/pubid/oiml/urn_generator.rb +64 -0
  542. data/lib/pubid/oiml.rb +26 -0
  543. data/lib/pubid/parser/common_parse_methods.rb +13 -0
  544. data/lib/pubid/parser/common_parse_rules.rb +56 -0
  545. data/lib/pubid/parser.rb +8 -0
  546. data/lib/pubid/parsers/base.rb +11 -0
  547. data/lib/pubid/parsers/mr_string.rb +93 -0
  548. data/lib/pubid/plateau/builder.rb +50 -0
  549. data/lib/pubid/plateau/identifiers/annex.rb +16 -0
  550. data/lib/pubid/plateau/identifiers/base.rb +51 -0
  551. data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
  552. data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
  553. data/lib/pubid/plateau/identifiers.rb +12 -0
  554. data/lib/pubid/plateau/parser.rb +63 -0
  555. data/lib/pubid/plateau/scheme.rb +45 -0
  556. data/lib/pubid/plateau/supplement_identifier.rb +72 -0
  557. data/lib/pubid/plateau/urn_generator.rb +29 -0
  558. data/lib/pubid/plateau.rb +25 -0
  559. data/lib/pubid/renderers/base.rb +19 -0
  560. data/lib/pubid/renderers/directives_renderer.rb +62 -0
  561. data/lib/pubid/renderers/guide_renderer.rb +20 -0
  562. data/lib/pubid/renderers/human_readable.rb +58 -0
  563. data/lib/pubid/renderers/iwa_renderer.rb +16 -0
  564. data/lib/pubid/renderers/mr_string.rb +16 -0
  565. data/lib/pubid/renderers/supplement_renderer.rb +33 -0
  566. data/lib/pubid/renderers/urn.rb +11 -0
  567. data/lib/pubid/renderers.rb +14 -0
  568. data/lib/pubid/rendering/base.rb +73 -0
  569. data/lib/pubid/rendering/common.rb +211 -0
  570. data/lib/pubid/rendering/context.rb +156 -0
  571. data/lib/pubid/rendering/date.rb +27 -0
  572. data/lib/pubid/rendering/format.rb +25 -0
  573. data/lib/pubid/rendering/language.rb +21 -0
  574. data/lib/pubid/rendering/numbering.rb +24 -0
  575. data/lib/pubid/rendering/publisher.rb +25 -0
  576. data/lib/pubid/rendering/stage.rb +38 -0
  577. data/lib/pubid/rendering/supplement.rb +46 -0
  578. data/lib/pubid/rendering.rb +16 -0
  579. data/lib/pubid/sae/builder.rb +32 -0
  580. data/lib/pubid/sae/components/code.rb +9 -0
  581. data/lib/pubid/sae/components/date.rb +19 -0
  582. data/lib/pubid/sae/components/type.rb +19 -0
  583. data/lib/pubid/sae/components.rb +11 -0
  584. data/lib/pubid/sae/identifier.rb +14 -0
  585. data/lib/pubid/sae/identifiers/base.rb +42 -0
  586. data/lib/pubid/sae/identifiers.rb +9 -0
  587. data/lib/pubid/sae/parser.rb +55 -0
  588. data/lib/pubid/sae/scheme.rb +47 -0
  589. data/lib/pubid/sae/urn_generator.rb +38 -0
  590. data/lib/pubid/sae.rb +19 -0
  591. data/lib/pubid/scheme.rb +207 -0
  592. data/lib/pubid/urn_generator/base.rb +110 -0
  593. data/lib/pubid/utils/string_normalizer.rb +196 -0
  594. data/lib/pubid/utils.rb +7 -0
  595. data/lib/pubid/version.rb +3 -1
  596. data/lib/pubid.rb +137 -13
  597. data/lib/tasks/docs.rake +37 -0
  598. data/lib/tasks/export.rake +38 -0
  599. data/lib/tasks/website-data.json +7488 -0
  600. metadata +613 -171
  601. data/lib/pubid/registry.rb +0 -30
@@ -0,0 +1,412 @@
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
+ # Special case for VIM publication
140
+ str("VIM") |
141
+ # Special case for SYMBOL publication
142
+ str("SYMBOL") |
143
+ # IECEx TRF version notation: 62784v1a_ds, 62784v1A
144
+ (match('\d').repeat(1,
145
+ 6) >> str("v") >> match('\d').repeat(1) >> match("[a-zA-Z]").repeat >> (str("_") >> match("[a-zA-Z]").repeat).maybe) |
146
+ # IECEE letter-based numbers: AD-001, GD-2053, OD-1000, CAB-G01, 01-S
147
+ # Pattern: 2-4 letter prefix followed by optional dash and number
148
+ # The suffix uses [A-Z\d] but not space to properly separate from edition
149
+ (match("[A-Z]").repeat(2, 4) >> (
150
+ dash >> match('\d').repeat(1)
151
+ ).maybe >> match('[A-Z\d]').repeat) |
152
+ # Can be 5-6 digits for TRF: 60065, 610091
153
+ # Can have letter suffix: 60065N, 610091A
154
+ # Can have letter + underscore + letters: 61215F_SE
155
+ (match('\d').repeat(1, 6) >> (
156
+ match("[a-zA-Z]") >> (str("_") >> match("[a-zA-Z]").repeat).maybe
157
+ ).maybe)
158
+ end
159
+
160
+ rule(:date) do
161
+ # :2005-02 or optional for DB without date
162
+ (str(":") | dash) >>
163
+ (year_digits >>
164
+ (dash >> month_digits).maybe >>
165
+ (dash >> day_digits).maybe
166
+ ).as(:date)
167
+ end
168
+
169
+ rule(:part_and_subpart) do
170
+ # Parts can have:
171
+ # - Dashes: 60038-1
172
+ # - Complex: 29110-5-1-1
173
+ # - TRF ampersand: 60086-1&2A
174
+ # - TRF underscore: 60127-2-IA_I, 61215F_SE
175
+ # - TRF lowercase: 60127-2-iD_I
176
+ # - TRF commas: 60309-1,2G or 60335-1-14,15G
177
+
178
+ # the "space?" needed to handle potential spaces
179
+ (dash | str(",")) >> space? >>
180
+ # matches a part with special TRF characters including commas
181
+ match('[\w&_,]').repeat >>
182
+ # matches subparts
183
+ ((dash | str(",")) >> match('[\w&_,]').repeat).repeat.maybe
184
+ end
185
+
186
+ rule(:all_parts) do
187
+ str("(all parts)").as(:all_parts)
188
+ end
189
+
190
+ rule(:type_with_stage) do
191
+ # "DTR"
192
+ # "TS"
193
+ # "Guide"
194
+ # Also includes supplement stages like "CDCor" for standalone draft corrigenda
195
+ array_to_str(TYPED_STAGES + TYPED_STAGES_SUPPLEMENTS).as(:type_with_stage) >>
196
+ (match('\d').as(:stage_iteration) >> space).maybe
197
+ end
198
+
199
+ rule(:language) do
200
+ # IEC 60038:2009(en,fr)
201
+ # IEC 60038:2009(E/F)
202
+ str("(") >>
203
+ (
204
+ # parse 2-char language codes: ru,en,fr,de,ar,es
205
+ (match["a-z"].repeat(1) >> str(",").maybe) |
206
+ # parse single language codes: R/E/F
207
+ (match["EFARDS"] >> str("/").maybe)
208
+ ).repeat.as(:languages) >>
209
+ str(")")
210
+ end
211
+
212
+ EDITION_STRINGS = %w[Edition Ed. ED Ed].freeze
213
+ rule(:edition) do
214
+ # We ignore the case where there is "Ed" but no number
215
+ # Handle decimal editions like ED1.2
216
+ array_to_str(EDITION_STRINGS) >> space? >>
217
+ (digits >> (str(".") >> digits).maybe).maybe.as(:edition)
218
+ end
219
+
220
+ rule(:stage_iteration) do
221
+ # "IEC 11243.1"
222
+ str(".") >> match('\d').as(:stage_iteration)
223
+ end
224
+
225
+ # Sheet notation: /1:1994 (sheet 1 from year 1994)
226
+ # IEC 60695-2-1/1:1994
227
+ rule(:sheet_notation) do
228
+ str("/") >>
229
+ match('\d').repeat(1).as(:sheet_number) >>
230
+ str(":") >>
231
+ year_digits.as(:sheet_year)
232
+ end
233
+
234
+ # Sheet notation without year: /1 (sheet 1 without year)
235
+ # IEC 60695-2-1/1
236
+ rule(:sheet_notation_no_year) do
237
+ str("/") >>
238
+ match('\d').repeat(1).as(:sheet_number)
239
+ end
240
+
241
+ # Fragment notation: /FRAG2 or /FRAGC1 (fragment of amendment/corrigendum)
242
+ # IEC 60050-191/AMD2/FRAG2
243
+ # IEC 60050-191/COR1/FRAGC1
244
+ rule(:fragment_notation) do
245
+ str("/") >>
246
+ (str("FRAGC") | str("FRAG")).as(:fragment_type) >>
247
+ match('\d').repeat(1).as(:fragment_number)
248
+ end
249
+
250
+ # Sheet identifier: base identifier followed by /N:YEAR
251
+ # IEC 60695-2-1/1:1994 (sheet 1 from year 1994)
252
+ # IEC 60695-2-1/1 (sheet 1 without year)
253
+ rule(:sheet_identifier) do
254
+ identifier_copublishers_no_third.as(:base_identifier) >>
255
+ (sheet_notation | sheet_notation_no_year)
256
+ end
257
+
258
+ # Sheet identifier followed by supplement: base/sheet/supplement
259
+ # IEC 60695-2-1/1:1994/COR1:1995
260
+ rule(:sheet_supplement_identifier) do
261
+ identifier_copublishers_no_third.as(:base_identifier) >>
262
+ sheet_notation >>
263
+ str("/") >> supplement_type_with_stage >>
264
+ space? >> second_part >> third_part
265
+ end
266
+
267
+ # VAP suffix for consolidated/version types
268
+ # CSV = Consolidated version (with Supplements)
269
+ # CMV = Commented Version
270
+ # RLV = Redline Version (shows changes)
271
+ # SER = Serial version
272
+ # EXV = Example version
273
+ # PAC = Package
274
+ # PRV = Preview version
275
+ rule(:vap_suffix) do
276
+ space >> (
277
+ str("CSV") |
278
+ str("CMV") |
279
+ str("RLV") |
280
+ str("SER") |
281
+ str("EXV") |
282
+ str("PAC") |
283
+ str("PRV")
284
+ ).as(:vap_suffix)
285
+ end
286
+
287
+ # Database suffix: " DB"
288
+ # IEC 60617:2012 DB
289
+ rule(:database_suffix) do
290
+ space >> str("DB").as(:database)
291
+ end
292
+
293
+ # Consolidated amendments: +AMD1:2016+AMD2:2019
294
+ # Also supports without dates: +AMD1+AMD2
295
+ # Creates ConsolidatedIdentifier with array of amendments
296
+ rule(:consolidated_supplement) do
297
+ str("+") >>
298
+ (str("AMD") | str("COR")).as(:supplement_type) >>
299
+ match('\d').repeat(1).as(:supplement_number) >>
300
+ (str(":") >> year_digits.as(:supplement_year)).maybe
301
+ end
302
+
303
+ rule(:consolidated_supplements) do
304
+ consolidated_supplement.repeat(1).as(:consolidated_supplements)
305
+ end
306
+
307
+ rule(:second_part) do
308
+ # Try TRF organization number first, fallback to regular number
309
+ (trf_org_number | number_with_part) >>
310
+ stage_iteration.maybe >>
311
+ (space? >> date).maybe >>
312
+ consolidated_supplements.maybe >>
313
+ (vap_suffix | database_suffix).maybe
314
+ end
315
+
316
+ rule(:third_part_edition) do
317
+ space? >> edition.maybe
318
+ end
319
+
320
+ rule(:third_part) do
321
+ # End of the identifier, we can have language, edition, fragment, or all parts
322
+ third_part_edition >> language.maybe >> fragment_notation.maybe >> all_parts.maybe
323
+ end
324
+
325
+ # prefix sole or copublishers with type and stage
326
+ # IEC/TR 60038
327
+ # ISO/IEC TS 20594-1
328
+ # IEC/FDIS 60038
329
+ rule(:identifier_copublishers) do
330
+ identifier_copublishers_no_third >> third_part
331
+ end
332
+
333
+ rule(:guide_prefix) do
334
+ str("Guide") | str("GUIDE")
335
+ end
336
+
337
+ rule(:identifier_copublishers_no_third) do
338
+ # Guide IEC 51:1999
339
+ (guide_prefix.as(:type_with_stage_fr) >> space).maybe >>
340
+ prefix_with_copublishers.maybe >> space? >> str("/").maybe >>
341
+ type_with_stage.maybe >>
342
+ space.maybe >>
343
+ second_part >> third_part_edition
344
+ end
345
+
346
+ # For joint identifiers (ISO/IEC)
347
+ # ISO/IEC 17025:2017 handles copublisher in copublishers rule
348
+ # We handle this in identifier_copublishers already
349
+ rule(:joint_identifier) do
350
+ identifier_copublishers_no_third.as(:base_identifier) >>
351
+ space? >> str("|") >> space? >>
352
+ scope { iso_identifier }.as(:joint_identifier)
353
+ end
354
+
355
+ rule(:iso_identifier) do
356
+ Iso::Parser.new.identifier
357
+ end
358
+
359
+ rule(:supplement_type_with_stage) do
360
+ # "DAM"
361
+ # "Amd"
362
+ # "FRAG" (fragments of amendments)
363
+ # "FRAGC" (fragments of corrigenda)
364
+ (array_to_str(TYPED_STAGES_SUPPLEMENTS) | str("FRAGC") | str("FRAG")).as(:type_with_stage)
365
+ end
366
+
367
+ # Standalone draft supplement (no base identifier)
368
+ # IEC/FDAM 60038-1
369
+ # IEC/FDCOR 12345
370
+ rule(:standalone_supplement) do
371
+ prefix_with_copublishers >> str("/") >>
372
+ supplement_type_with_stage >>
373
+ space >> second_part >> third_part
374
+ end
375
+
376
+ # IEC 60038:2009/Amd 1:2011
377
+ rule(:supplement_identifier_no_third) do
378
+ identifier_copublishers_no_third.as(:base_identifier) >>
379
+ str("/") >> supplement_type_with_stage >>
380
+ space? >> second_part
381
+ end
382
+
383
+ rule(:supplement_identifier) do
384
+ supplement_identifier_no_third >> third_part
385
+ end
386
+
387
+ # IEC 60038:2009/Amd 1:2011/Cor 1:2012
388
+ rule(:supplement_supplement_identifier) do
389
+ supplement_identifier_no_third.as(:base_identifier) >>
390
+ str("/") >> supplement_type_with_stage >>
391
+ space? >> second_part >> third_part
392
+ end
393
+
394
+ rule(:dash) do
395
+ DASH_CHARS.map { |char| str(char) }.reduce(:|)
396
+ end
397
+
398
+ IEV_SHORTHAND = /\AIEV(?=\z|[\s-])/
399
+
400
+ # Preprocess input to normalize tab-separated editions and other formats
401
+ def parse(input)
402
+ # Normalize tab-separated editions: "IECEE AD-001\tED1.6" -> "IECEE AD-001 ED1.6"
403
+ normalized = input.gsub("\t", " ")
404
+ # Normalize comma-separated editions: "IEC CAB-G01:2025-02, Ed. 2.1" -> "IEC CAB-G01:2025-02 Ed. 2.1"
405
+ normalized = normalized.gsub(/,\s+Ed\./, " Ed.")
406
+ # Expand IEV shorthand: "IEV" / "IEV-351" -> "IEC 60050" / "IEC 60050-351"
407
+ normalized = normalized.sub(IEV_SHORTHAND, "IEC 60050")
408
+ super(normalized)
409
+ end
410
+ end
411
+ end
412
+ 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
@@ -0,0 +1,71 @@
1
+ require_relative "identifiers/international_standard"
2
+ # frozen_string_literal: true
3
+ require_relative "identifiers/technical_specification"
4
+ require_relative "identifiers/technical_report"
5
+ require_relative "identifiers/publicly_available_specification"
6
+ require_relative "identifiers/guide"
7
+ require_relative "identifiers/amendment"
8
+ require_relative "identifiers/corrigendum"
9
+ require_relative "identifiers/fragment_identifier"
10
+
11
+ module Pubid
12
+ module Iec
13
+ class Scheme < Pubid::Scheme
14
+ class << self
15
+ def identifiers
16
+ [
17
+ Identifiers::InternationalStandard,
18
+ Identifiers::TechnicalSpecification,
19
+ Identifiers::TechnicalReport,
20
+ Identifiers::PubliclyAvailableSpecification,
21
+ Identifiers::Guide,
22
+ ]
23
+ end
24
+
25
+ def supplement_identifiers
26
+ [
27
+ Identifiers::Amendment,
28
+ Identifiers::Corrigendum,
29
+ Identifiers::FragmentIdentifier,
30
+ ]
31
+ end
32
+
33
+ def typed_stages
34
+ identifiers.flat_map { |klass| klass::TYPED_STAGES }
35
+ end
36
+
37
+ def supplement_typed_stages
38
+ supplement_identifiers.flat_map { |klass| klass::TYPED_STAGES }
39
+ end
40
+
41
+ def locate_typed_stage_by_abbr(abbr)
42
+ abbr = "" if abbr.nil?
43
+
44
+ typed_stage = (typed_stages + supplement_typed_stages).detect do |ts|
45
+ ts.abbr.include?(abbr)
46
+ end
47
+
48
+ unless typed_stage
49
+ raise ArgumentError,
50
+ "Unknown type abbreviation: '#{abbr}'"
51
+ end
52
+
53
+ typed_stage
54
+ end
55
+
56
+ def locate_identifier_klass_by_type_code(type_code)
57
+ identifier_klass = (identifiers + supplement_identifiers).detect do |klass|
58
+ klass.type[:key].to_s == type_code.to_s
59
+ end
60
+
61
+ unless identifier_klass
62
+ raise ArgumentError,
63
+ "Unknown type code: #{type_code}"
64
+ end
65
+
66
+ identifier_klass
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,80 @@
1
+ require_relative "identifier"
2
+ # frozen_string_literal: true
3
+ require_relative "../components/typed_stage"
4
+ require_relative "urn_generator"
5
+
6
+ module Pubid
7
+ module Iec
8
+ class SingleIdentifier < Identifier
9
+ attribute :typed_stage, Components::TypedStage
10
+
11
+ # Generate URN for this identifier
12
+ #
13
+ # @return [String] URN representation
14
+
15
+ def to_s(lang: :en, lang_single: false, with_edition: false)
16
+ [].tap do |parts|
17
+ parts << publisher_portion(lang: lang)
18
+ parts << number_portion(lang_single: lang_single)
19
+ parts << edition_portion(lang: lang) if with_edition
20
+ end.compact.join(" ").tap do |s|
21
+ s << language_portion(lang_single: lang_single) if languages&.any?
22
+ end
23
+ end
24
+
25
+ def publisher_portion(lang: :en)
26
+ # IEC identifiers can have copublishers (e.g., IEC/IEEE, ISO/IEC)
27
+
28
+ # Build publisher string
29
+ pub_string = if copublishers&.any?
30
+ # Has copublishers: "IEC/IEEE" or "ISO/IEC"
31
+ ([publisher] + copublishers).map(&:body).join("/")
32
+ else
33
+ # No copublishers: just "IEC"
34
+ publisher.body
35
+ end
36
+
37
+ # Add type abbreviation if present
38
+ if typed_stage && !typed_stage.abbreviation.empty?
39
+ abbr = typed_stage.abbreviation
40
+ # For copublishers or empty abbr, use space; otherwise use slash
41
+ pub_string += if copublishers&.any? || abbr == ""
42
+ (abbr == "" ? "" : " #{abbr}")
43
+ else
44
+ "/#{abbr}"
45
+ end
46
+ end
47
+
48
+ pub_string
49
+ end
50
+
51
+ def number_portion(lang_single: false)
52
+ [
53
+ (number ? number.to_s : ""),
54
+ (part ? "-#{part}" : ""),
55
+ (subpart ? "-#{subpart}" : ""),
56
+ (stage_iteration ? ".#{stage_iteration}" : ""),
57
+ (date ? ":#{date.year}" : ""),
58
+ ].join
59
+ end
60
+
61
+ def language_portion(lang_single: false)
62
+ return "" unless languages&.any?
63
+
64
+ [
65
+ "(",
66
+ languages.map do |lang|
67
+ lang.to_s(lang_single: lang_single)
68
+ end.join(lang_single ? "/" : ","),
69
+ ")",
70
+ ].join
71
+ end
72
+
73
+ def edition_portion(lang: :en)
74
+ return nil unless edition&.number
75
+
76
+ "ED#{edition.number}"
77
+ end
78
+ end
79
+ end
80
+ end