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,591 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ module Components
6
+ # Forward declare component classes
7
+ end
8
+
9
+ module Identifiers
10
+ # Base class for all IEEE identifiers
11
+ class Base < Pubid::Identifier
12
+ # Generate URN for this identifier
13
+ #
14
+ # @return [String] URN representation
15
+
16
+ attribute :publisher, :string, default: -> { "IEEE" }
17
+ attribute :copublisher, :string, collection: true # IEC, ISO, ANSI, etc.
18
+ attribute :code, :string # Will store code as object in initialize
19
+ attribute :year, :string
20
+ attribute :type, :string, default: -> { "Std" } # Std, Draft Std
21
+ attribute :draft_status, :string # Unapproved, Approved, Active Unapproved
22
+ attribute :draft, :string # Will store draft as object
23
+ attribute :edition, :string # Edition 1.0
24
+ attribute :month, :string
25
+ attribute :day, :string
26
+ attribute :redline, :boolean, default: -> { false }
27
+ attribute :amendments, Base, collection: true # Amendment identifiers
28
+ attribute :corrigenda, Base, collection: true # Corrigendum identifiers
29
+ attribute :revision_of, Base # Revision relationships
30
+ attribute :incorporates, Base, collection: true # Incorporated documents
31
+ attribute :supersedes, Base, collection: true # Superseded documents
32
+ attribute :supplement_to, Base # For supplements
33
+ attribute :iso_identifier, :string # For IEC/IEEE formats
34
+ attribute :parenthetical_content, :string # Raw parenthetical content
35
+ attribute :note, :string # Parenthetical notes
36
+ attribute :adoption, :string # Adoption notes
37
+ attribute :amendment_to, :string # Amendment to relationships
38
+ attribute :edition_month, :string # Month part from Edition YYYY-MM
39
+ attribute :space_before_draft, :boolean, default: -> {
40
+ false
41
+ } # Track space before /D
42
+ attribute :typed_stage, Components::TypedStage # TYPED_STAGE integration
43
+ attribute :relationships, Components::Relationship, collection: true # Relationship metadata
44
+ attribute :nickname, :string # Book nickname (e.g., "[The Orange Book]")
45
+ attribute :interpretation, :boolean, default: -> {
46
+ false
47
+ } # /INT notation
48
+ attribute :conf_number, :string # Conformance document number
49
+ attribute :conf_year, :string # Conformance document year
50
+ attribute :ashrae_number, :string # ASHRAE Guideline number
51
+ attribute :ashrae_year, :string # ASHRAE Guideline year
52
+ attribute :crossref, :string # IEEE cross-reference (e.g., /C62.22.1-1996)
53
+ attribute :reaffirmed, :string # Reaffirmed year (e.g., "2010" for (R2010))
54
+
55
+ # Store actual component objects
56
+ attr_accessor :code_obj, :draft_obj
57
+
58
+ def initialize(**args)
59
+ super()
60
+
61
+ # Handle typed_stage if provided
62
+ if args[:typed_stage]
63
+ self.typed_stage = args[:typed_stage]
64
+ end
65
+
66
+ # Handle code as component object
67
+ if args[:code].is_a?(String)
68
+ self.code_obj = Components::Code.parse(args[:code])
69
+ self.code = args[:code]
70
+ elsif args[:code]
71
+ self.code_obj = args[:code]
72
+ self.code = args[:code].to_s
73
+ end
74
+
75
+ # Handle draft as component object
76
+ if args[:draft_obj]
77
+ self.draft_obj = args[:draft_obj]
78
+ self.draft = args[:draft_obj].to_s
79
+ elsif args[:draft]
80
+ # If draft is passed as string, try to create Draft object
81
+ if args[:draft].is_a?(String)
82
+ # Try to parse the string to extract version/revision
83
+ if args[:draft] =~ /^D(\d+)(?:\.(\d+))?/
84
+ version = $1
85
+ revision = $2
86
+ self.draft_obj = Components::Draft.new(version: version,
87
+ revision: revision)
88
+ else
89
+ # Simple case - treat as version
90
+ self.draft_obj = Components::Draft.new(version: args[:draft])
91
+ end
92
+ self.draft = draft_obj.to_s
93
+ else
94
+ self.draft_obj = args[:draft]
95
+ self.draft = args[:draft].to_s
96
+ end
97
+ end
98
+
99
+ # Set other attributes
100
+ attrs = self.class.attributes
101
+ args.each do |key, value|
102
+ next if %i[code draft draft_obj typed_stage].include?(key)
103
+
104
+ setter = :"#{key}="
105
+ public_send(setter, value) if attrs.key?(key)
106
+ end
107
+ end
108
+
109
+ # Override accessors to return component objects
110
+ def code
111
+ code_obj
112
+ end
113
+
114
+ def draft
115
+ draft_obj
116
+ end
117
+
118
+ # Expose numeric month from draft if available
119
+ def draft_month
120
+ return nil unless draft_obj.is_a?(Components::Draft)
121
+
122
+ draft_obj.numeric_month
123
+ end
124
+
125
+ # Parse IEEE identifier string
126
+ def self.parse(input)
127
+ # Preprocessing: Convert comma-separated dual standards to "and" format
128
+ # This must happen BEFORE the "and" check below
129
+ # Pattern: "IEEE Std 960-1989, Std 1177-1989" -> "IEEE Std 960-1989 and IEEE Std 1177-1989"
130
+ input = input.gsub(/(\d{4}),\s+Std\s/, '\1 and IEEE Std ')
131
+
132
+ # Check for AIEE identifiers (but NOT those with parentheses which have relationships/adoptions)
133
+ # AIEE has its own parser/builder for simple identifiers
134
+ # AIEE inputs with parentheses are handled by IEEE parser for relationship/adoption parsing
135
+ if input.start_with?("AIEE ") && !input.include?("(")
136
+ return Aiee::Identifier.parse(input)
137
+ end
138
+
139
+ # Check for IEC/IEEE copublished patterns first (before other checks)
140
+ if input.start_with?("IEC/IEEE ")
141
+ return parse_single(input)
142
+ end
143
+
144
+ # Check for semicolon-separated dual identifiers (IEC-first patterns)
145
+ # Pattern: "IEC 61523-3 First edition 2004-09; IEEE 1497"
146
+ if input.include?("; ")
147
+ parts = input.split("; ")
148
+ if parts.length == 2
149
+ # Try to parse both parts
150
+ begin
151
+ first = parse_single(parts[0].strip)
152
+ second = parse_single(parts[1].strip)
153
+
154
+ return Identifiers::DualPublished.new(
155
+ first_identifier: first,
156
+ second_identifier: second,
157
+ )
158
+ rescue Parslet::ParseFailed
159
+ # If parsing fails, continue with normal flow
160
+ end
161
+ end
162
+ end
163
+
164
+ # PREPROCESS: Handle (R####) (Revision of...) pattern
165
+ # Convert to single parenthetical: (Reaffirmed ####, Revision of...)
166
+ # This allows parser to capture both in one parenthetical
167
+ if input =~ /\(R(\d{4})\)\s*\(Revision of ([^)]+)\)/
168
+ year = $1
169
+ $2
170
+ # Replace the two parentheticals with reaffirmed info extracted
171
+ # Parse normally but capture year first
172
+ input_modified = input.sub(
173
+ /\(R(\d{4})\)\s*\(Revision of ([^)]+)\)/, "(Revision of \\2)"
174
+ )
175
+
176
+ # Parse the modified input
177
+ result = parse_single(input_modified)
178
+ # Add reaffirmed attribute
179
+ if result.class.attributes.key?(:reaffirmed)
180
+ result.reaffirmed = year
181
+ end
182
+ return result
183
+ end
184
+
185
+ # PREPROCESS: Handle (Reaffirmed ####) (Revision of...) pattern (full word format)
186
+ # Pattern: "ANSI/IEEE Std 101-1987 (Reaffirmed 2010) (Revision of IEEE Std 101-1972)"
187
+ if input =~ /\(Reaffirmed\s+(\d{4})\)\s*\(Revision of ([^)]+)\)/
188
+ year = $1
189
+ $2
190
+ # Replace the two parentheticals
191
+ input_modified = input.sub(
192
+ /\(Reaffirmed\s+(\d{4})\)\s*\(Revision of ([^)]+)\)/, "(Revision of \\2)"
193
+ )
194
+
195
+ # Parse the modified input
196
+ result = parse_single(input_modified)
197
+ # Add reaffirmed attribute
198
+ if result.class.attributes.key?(:reaffirmed)
199
+ result.reaffirmed = year
200
+ end
201
+ return result
202
+ end
203
+
204
+ # NEW Session 174: Check for IRE dual published pattern
205
+ # Pattern after preprocessing: "IEEE Std 218-1956 (R1980) (56 IRE 28.S2)"
206
+ # First parenthetical: (Rxxx) reaffirmed
207
+ # Second parenthetical: IRE identifier
208
+ if /\(R\d{4}\)\s*\((\d+\s+IRE[^)]+)\)/.match?(input)
209
+ main_part = input.split(" (R").first.strip # Get "IEEE Std 218-1956"
210
+ reaffirmed_year = input.match(/\(R(\d{4})\)/)[1]
211
+ ire_part = input.match(/\((\d+\s+IRE[^)]+)\)/)[1]
212
+
213
+ begin
214
+ # Parse main identifier
215
+ ieee_id = parse_single(main_part)
216
+ # Add reaffirmed year
217
+ ieee_id.reaffirmed = reaffirmed_year if ieee_id.class.attributes.key?(:reaffirmed)
218
+
219
+ # Parse IRE identifier
220
+ ire_id = parse_single(ire_part)
221
+
222
+ return Identifiers::DualPublished.new(
223
+ first_identifier: ieee_id,
224
+ second_identifier: ire_id,
225
+ )
226
+ rescue Parslet::ParseFailed
227
+ # If parsing fails, fall through to regular processing
228
+ end
229
+ end
230
+
231
+ # Check for space-separated dual identifiers (e.g., "IEC 62014-5 IEEE Std 1734-2011")
232
+ # This must be checked before " and " pattern
233
+ # Look for pattern where a second publisher appears after the first complete identifier
234
+ # Publishers: IEEE, AIEE, ANSI, ASA, IEC, ISO, ASTM, NACE, NSF, ASHRAE, NCTA, AESC
235
+ publishers = %w[IEEE AIEE ANSI ASA IEC ISO ASTM NACE NSF ASHRAE NCTA
236
+ AESC]
237
+
238
+ # Find all positions where publishers appear (but NOT inside parentheses)
239
+ # Publishers inside parentheses are part of relationship clauses, not dual published patterns
240
+ publisher_positions = []
241
+ publishers.each do |pub|
242
+ # Look for publisher at word boundaries (preceded by space or start of string)
243
+ regex = /(?:^|\s)(#{Regexp.escape(pub)})(?:\s|\/)/
244
+ input.scan(regex) do
245
+ match_pos = Regexp.last_match.begin(1)
246
+
247
+ # Check if this publisher is inside parentheses (relationship clause)
248
+ # Count parens before this position
249
+ before_match = input[0...match_pos]
250
+ paren_count = before_match.count("(") - before_match.count(")")
251
+
252
+ # Skip publishers inside parentheses - they're part of relationship clauses
253
+ next if paren_count.positive?
254
+
255
+ publisher_positions << { pos: match_pos, publisher: pub }
256
+ end
257
+ end
258
+
259
+ # If we have 2 or more publishers at distinct positions (not co-publishers with /)
260
+ if publisher_positions.length >= 2
261
+ # Sort by position
262
+ publisher_positions.sort_by! { |p| p[:pos] }
263
+
264
+ # Check if they're not part of a co-published pattern (Publisher1/Publisher2)
265
+ # by ensuring there's no slash between them
266
+ first_pub = publisher_positions[0]
267
+ second_pub = publisher_positions[1]
268
+
269
+ # Get the substring between the two publishers
270
+ between = input[first_pub[:pos]..(second_pub[:pos] - 1)]
271
+
272
+ # If there's no slash and no " and ", this might be space-separated dual
273
+ if !between.include?("/") && !between.include?(" and ")
274
+ # Try to split at the second publisher position
275
+ # Back up to find the space before the second publisher
276
+ split_pos = second_pub[:pos]
277
+ while split_pos.positive? && input[split_pos - 1] == " "
278
+ split_pos -= 1
279
+ end
280
+
281
+ first_part = input[0...split_pos].strip
282
+ second_part = input[split_pos..].strip
283
+
284
+ # Try to parse both parts
285
+ begin
286
+ first = parse_single(first_part)
287
+ second = parse_single(second_part)
288
+
289
+ # Only treat as dual if both parse successfully
290
+ return Identifiers::DualPublished.new(
291
+ first_identifier: first,
292
+ second_identifier: second,
293
+ )
294
+ rescue Parslet::ParseFailed
295
+ # If parsing fails, continue with normal flow
296
+ end
297
+ end
298
+ end
299
+
300
+ # Check for dual published patterns with " and "
301
+ if input.include?(" and ")
302
+ # DON'T split if " and " is inside parentheses (likely a relationship clause)
303
+ # Check if parentheses are balanced and " and " is inside them
304
+ paren_count = 0
305
+ and_outside_parens = false
306
+ and_position = nil
307
+
308
+ input.each_char.with_index do |char, i|
309
+ paren_count += 1 if char == "("
310
+ paren_count -= 1 if char == ")"
311
+
312
+ # Check if " and " starts at this position and we're outside parens
313
+ if paren_count.zero? && input[i..(i + 4)] == " and "
314
+ and_outside_parens = true
315
+ and_position = i
316
+ break
317
+ end
318
+ end
319
+
320
+ # Only split if " and " is outside parentheses
321
+ if and_outside_parens && and_position
322
+ # Split at the found position only (not at all " and " occurrences)
323
+ first_part = input[0...and_position].strip
324
+ second_part = input[(and_position + 5)..].strip
325
+
326
+ # Parse each part separately
327
+ first = parse_single(first_part)
328
+ second = parse_single(second_part)
329
+
330
+ return Identifiers::DualPublished.new(
331
+ first_identifier: first,
332
+ second_identifier: second,
333
+ )
334
+ end
335
+ end
336
+
337
+ # NEW Session 171: Check for dual published patterns with " & " (ampersand)
338
+ if input.include?(" & ")
339
+ # DON'T split if " & " is inside parentheses
340
+ paren_count = 0
341
+ ampersand_outside_parens = false
342
+
343
+ input.each_char.with_index do |char, i|
344
+ paren_count += 1 if char == "("
345
+ paren_count -= 1 if char == ")"
346
+
347
+ # Check if " & " starts at this position and we're outside parens
348
+ if paren_count.zero? && input[i..(i + 2)] == " & "
349
+ ampersand_outside_parens = true
350
+ break
351
+ end
352
+ end
353
+
354
+ # Only split if " & " is outside parentheses
355
+ if ampersand_outside_parens
356
+ parts = input.split(" & ")
357
+ if parts.length == 2
358
+ # Parse each part separately
359
+ first = parse_single(parts[0].strip)
360
+ second = parse_single(parts[1].strip)
361
+
362
+ return Identifiers::DualPublished.new(
363
+ first_identifier: first,
364
+ second_identifier: second,
365
+ )
366
+ end
367
+ end
368
+ end
369
+
370
+ # Special case: AIEE identifiers with ASA parenthetical references
371
+ # Pattern: "AIEE No 18-1934 (ASA C55 1934)"
372
+ if input.match?(/^AIEE\s+/) && input.include?("(") && input.include?("ASA")
373
+ main_part = input.split("(").first.strip
374
+ adoption_match = input.match(/\((ASA[^)]+)\)/)
375
+
376
+ if adoption_match
377
+ adoption_part = adoption_match.captures.first
378
+ # Parse the main AIEE identifier
379
+ begin
380
+ aiee_id = parse_single(main_part)
381
+ # Parse the ASA identifier
382
+ asa_id = parse_single(adoption_part)
383
+
384
+ return Identifiers::AdoptedStandard.new(
385
+ ieee_identifier: aiee_id,
386
+ adopted_identifier: asa_id,
387
+ )
388
+ rescue Parslet::ParseFailed
389
+ # If parsing fails, fall through to regular processing
390
+ end
391
+ end
392
+ end
393
+
394
+ # Check for adopted standards (parenthetical adoptions)
395
+ # Only consider it an adoption if the parenthetical content looks like an identifier
396
+ if input.include?("(") && input.include?(")") && !input.start_with?("IEC/IEEE ")
397
+ # Extract the part before parentheses and the adoption part
398
+ main_part = input.split("(").first.strip
399
+ adoption_match = input.match(/\(([^)]+)\)/)
400
+ adoption_part = adoption_match&.captures&.first
401
+
402
+ # Check if adoption_part looks like an identifier (contains publisher or type keywords)
403
+ # BUT exclude revision/amendment/supersedes notes
404
+ # AND exclude Pattern 4 relationship types
405
+ if main_part && adoption_part &&
406
+ !adoption_part.match?(/^\s*(Revision|Revison|Amendment|Corrigendum|Corrigenda|incorporates|Incorporating|Incorporates|Adoption|Supplement|Draft Amendment|DRAFT Amendment|Draft Revision|Reaffirmation|Redesignation|redesignated as|Supersedes|Supercedes|Includes|Previously designated as|Notebooks|Standard Newspaper)/i) &&
407
+ (adoption_part.match?(/\b(ANSI|ISO|IEC|IEEE|AIEE|IRE|ASA|ASTM|CSA|ASME|NACE|NSF|ASHRAE|NCTA|AESC)\s/) ||
408
+ adoption_part.match?(/^\s*(ANSI|ISO|IEC|IEEE|AIEE|IRE|ASA|ASTM|CSA|ASME|NACE|NSF|ASHRAE|NCTA|AESC)\b/) ||
409
+ adoption_part.match?(/\bStd\s+\d+/))
410
+ # Parse the main IEEE identifier
411
+ ieee_id = parse_single(main_part)
412
+
413
+ # Parse comma-separated adopted identifiers
414
+ adopted_parts = adoption_part.split(",").map(&:strip)
415
+ adopted_ids = adopted_parts.map do |part|
416
+ if part.strip.start_with?("IEC")
417
+ # Use IEC parser for IEC adoptions
418
+ # Preprocess to convert "Edition X.Y" to IEC format
419
+ # Pattern: "IEC 60255-24 Edition 2.0 2013-04" → "IEC 60255-24:2013-04 ED2.0"
420
+ iec_part = part.dup
421
+ # Replace " Edition X.Y YYYY-MM" (or similar) with ":YYYY-MM EDX.Y"
422
+ iec_part.gsub!(/\s+Edition\s+([0-9.]+)\s+([0-9-]+)/,
423
+ ':\2 ED\1')
424
+ # Replace " Edition X.Y" at end (no date)
425
+ iec_part.gsub!(/\s+Edition\s+([0-9.]+)\s*$/, ' ED\1')
426
+ Pubid::Iec.parse(iec_part)
427
+ elsif part.strip.start_with?("ANSI")
428
+ # Use ANSI parser for ANSI adoptions
429
+ Pubid::Ansi.parse(part)
430
+ else
431
+ # Use IEEE parser for other adoptions
432
+ parse_single(part)
433
+ end
434
+ end
435
+
436
+ return Identifiers::AdoptedStandard.new(
437
+ ieee_identifier: ieee_id,
438
+ adopted_identifiers: adopted_ids,
439
+ )
440
+ end
441
+ # If it doesn't look like an identifier, let the parser handle it as additional_parameters
442
+ end
443
+
444
+ # Fall back to single identifier parsing
445
+ parse_single(input)
446
+ end
447
+
448
+ # Parse a single IEEE identifier
449
+ def self.parse_single(input)
450
+ # Apply legacy update_codes normalization first, before Parser's extensive preprocessing
451
+ normalized = Core::UpdateCodes.apply(input, :ieee)
452
+ parsed = Parser.parse(normalized) # Use class method for preprocessing
453
+ builder = Builder.new(Base)
454
+ # Pass the original input string to builder for context
455
+ builder.original_input = input
456
+ builder.build(parsed)
457
+ end
458
+
459
+ def to_s
460
+ parts = []
461
+
462
+ # Publisher(s) - handle copublisher array properly
463
+ if copublisher && !copublisher.empty?
464
+ # Copublisher is an array, join all publishers with single slash
465
+ parts << [publisher, *copublisher].join("/")
466
+ else
467
+ parts << publisher
468
+ end
469
+
470
+ # Draft status
471
+ parts << draft_status if draft_status
472
+
473
+ # Type - only render for IEEE/AIEE publishers, and only for non-projects
474
+ # Must come BEFORE code
475
+ should_render_type = publisher&.match?(/^(IEEE|AIEE)/)
476
+
477
+ if should_render_type && !typed_stage&.project_status && type && !type.to_s.strip.empty? && type != "P"
478
+ # Non-project with explicit type (Std, No, etc.)
479
+ type_str = type.dup
480
+ # Remove P prefix if somehow present
481
+ type_str = type_str.sub(/^P/, "") if type_str.start_with?("P")
482
+ parts << type_str unless type_str.strip.empty?
483
+ end
484
+
485
+ # Code - with P prefix for projects (concatenated, not separated)
486
+ if code_obj
487
+ result = code_obj.to_s
488
+
489
+ # Prepend P if this is a project AND code doesn't already have P
490
+ if typed_stage&.project_status && should_render_type && !result.start_with?("P")
491
+ result = "P#{result}"
492
+ end
493
+
494
+ # Only attach year to code if there's no edition, no month, and no draft
495
+ result += "-#{year}" if year && !draft_obj && !edition && !month
496
+
497
+ # Append draft to code - with or without space based on original format
498
+ if draft_obj
499
+ result += space_before_draft ? " #{draft_obj}" : draft_obj.to_s
500
+ end
501
+
502
+ # Append interpretation notation (/INT)
503
+ result += "/INT" if interpretation
504
+
505
+ # Append conformance notation (/ConformanceNN-YYYY)
506
+ if conf_number
507
+ result += "/Conformance#{conf_number}"
508
+ result += "-#{conf_year}" if conf_year
509
+ end
510
+
511
+ # Append ASHRAE joint publication (/ASHRAE Guideline NN-YYYY)
512
+ if ashrae_number
513
+ result += "/ASHRAE Guideline #{ashrae_number}"
514
+ result += "-#{ashrae_year}" if ashrae_year
515
+ end
516
+
517
+ # Append IEEE cross-reference (/C62.22.1-1996)
518
+ result += crossref if crossref
519
+
520
+ parts << result
521
+ elsif should_render_type && typed_stage&.project_status
522
+ # No code but is a project - add standalone P
523
+ parts << "P"
524
+ end
525
+
526
+ # Edition - with year if present (IEC style)
527
+ if edition
528
+ edition_str = "Edition #{edition}"
529
+ if year
530
+ edition_str += " #{year}"
531
+ edition_str += "-#{edition_month}" if edition_month
532
+ end
533
+ parts << edition_str
534
+ end
535
+
536
+ # Build the main identifier (without month yet)
537
+ result = parts.join(" ")
538
+
539
+ # Month/Day - append directly to avoid extra space before comma
540
+ if month
541
+ # Format: ", Month Day, Year" or ", Month, Year"
542
+ result += ", #{month}"
543
+ result += " #{day}" if day
544
+ if year && !edition
545
+ # Add comma after month if year follows
546
+ result += ", #{year}"
547
+ end
548
+ end
549
+
550
+ # Add parenthetical content if present
551
+ # Handle multiple parenthetical clauses (reaffirmed + relationships/revision)
552
+ parentheticals = []
553
+
554
+ reaff = reaffirmed
555
+ if reaff && !reaff.to_s.strip.empty?
556
+ parentheticals << "(R#{reaff})"
557
+ end
558
+
559
+ # Then add relationships/revision/amendment as second parenthetical
560
+ if parenthetical_content
561
+ parentheticals << "(#{parenthetical_content})"
562
+ elsif relationships && !relationships.empty?
563
+ # Render relationships (multiple separated by /)
564
+ relationship_str = relationships.join(" / ")
565
+ parentheticals << "(#{relationship_str})"
566
+ elsif revision_of
567
+ parentheticals << "(Revision of IEEE Std #{revision_of})"
568
+ elsif amendment_to
569
+ parentheticals << "(Amendment to IEEE Std #{amendment_to})"
570
+ elsif adoption
571
+ parentheticals << "(Adoption of #{adoption})"
572
+ elsif note && !note.to_s.strip.empty?
573
+ # Only add note if it doesn't duplicate other content
574
+ parentheticals << "(#{note})"
575
+ end
576
+
577
+ # Append all parentheticals with space separation
578
+ result += " #{parentheticals.join(' ')}" unless parentheticals.empty?
579
+
580
+ # Book nickname - outside parentheses in square brackets
581
+ result += " [#{nickname}]" if nickname && !nickname.to_s.strip.empty?
582
+
583
+ # Redline suffix
584
+ result += " - Redline" if redline
585
+
586
+ result
587
+ end
588
+ end
589
+ end
590
+ end
591
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ module Identifiers
6
+ # Conformance identifier for IEEE standards
7
+ # Represents conformance test documents
8
+ # Example: IEEE Std 802.16/Conformance01-2003
9
+ class ConformanceIdentifier < SupplementIdentifier
10
+ attribute :conf_number, :string
11
+ attribute :conf_year, :string
12
+
13
+ # TYPED_STAGES for conformance
14
+ # Conformance uses "Conformance" abbreviation
15
+ TYPED_STAGES = [
16
+ Components::TypedStage.new(
17
+ abbr: ["Conformance"],
18
+ type_code: "conformance",
19
+ stage_code: "published",
20
+ ),
21
+ ].freeze
22
+
23
+ def to_s
24
+ return base_identifier.to_s unless base_identifier
25
+
26
+ # Format: BASE/ConformanceNN-YEAR
27
+ result = base_identifier.to_s
28
+ result += "/Conformance#{conf_number}" if conf_number
29
+ result += "-#{conf_year}" if conf_year
30
+ result
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ module Identifiers
6
+ # Corrigendum identifier for IEEE standards
7
+ # Represents corrections to published standards
8
+ # Example: IEEE Std 535-2013/Cor. 1-2017
9
+ class Corrigendum < SupplementIdentifier
10
+ attribute :cor_number, :string
11
+ attribute :cor_year, :string
12
+
13
+ # TYPED_STAGES for corrigendum
14
+ # Corrigendum uses "Cor" abbreviation
15
+ TYPED_STAGES = [
16
+ Components::TypedStage.new(
17
+ abbr: ["Cor"],
18
+ type_code: "corrigendum",
19
+ stage_code: "published",
20
+ ),
21
+ ].freeze
22
+
23
+ def to_s
24
+ return super unless base_identifier
25
+
26
+ # Format: BASE/Cor NUMBER-YEAR or BASE/Cor. NUMBER-YEAR
27
+ result = base_identifier.to_s
28
+ result += "/Cor"
29
+ result += ". " if cor_number # Add period and space for formal format
30
+ result += cor_number if cor_number
31
+ result += "-#{cor_year}" if cor_year
32
+ result
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end