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,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
@@ -0,0 +1,161 @@
1
+ require_relative "identifier"
2
+ require_relative "single_identifier"
3
+ # frozen_string_literal: true
4
+
5
+ module Pubid
6
+ module Iec
7
+ # Identifier that represents a supplement to a base identifier.
8
+ class SupplementIdentifier < SingleIdentifier
9
+ attribute :base_identifier, Identifier, polymorphic: true
10
+
11
+ # Override base_identifier getter to ensure it's always created for standalone supplements
12
+ def base_identifier
13
+ @base_identifier || ensure_base_identifier
14
+ end
15
+
16
+ # Override number getter to trigger swap for standalone supplements
17
+ def number
18
+ # Guard against recursion in ensure_base_identifier
19
+ return @number if @ensuring_base
20
+
21
+ # For standalone supplements, trigger base creation first
22
+ ensure_base_identifier if @synthetic_base.nil? && publisher && part
23
+
24
+ if @synthetic_base
25
+ @supplement_number || @number
26
+ else
27
+ super
28
+ end
29
+ end
30
+
31
+ # Override part getter for standalone supplements (part becomes nil after swap)
32
+ def part
33
+ # For standalone supplements with synthetic base, part is nil (moved to number)
34
+ if @synthetic_base
35
+ nil
36
+ else
37
+ super
38
+ end
39
+ end
40
+
41
+ # Delegate publisher and copublishers to base_identifier if not set
42
+ def publisher
43
+ return @publisher if @ensuring_base
44
+
45
+ @publisher || base_identifier&.publisher
46
+ end
47
+
48
+ def copublishers
49
+ return @copublishers if @ensuring_base
50
+
51
+ @copublishers || base_identifier&.copublishers
52
+ end
53
+
54
+ # Ensure we have a base_identifier for standalone supplements
55
+ # Creates a synthetic base identifier from supplement attributes if needed
56
+ # Returns the base_identifier
57
+ def ensure_base_identifier
58
+ return @base_identifier if @base_identifier
59
+
60
+ # Guard flag to prevent recursion in number getter
61
+ @ensuring_base = true
62
+
63
+ # For standalone supplements like "IEC/FDAM 60038-1"
64
+ # The supplement number is in the `part` attribute, while `number` is the base number
65
+ # We need to create a synthetic base and use part as the supplement number
66
+ return nil unless publisher && (number || part)
67
+
68
+ # Capture original values BEFORE marking as synthetic
69
+ # (otherwise our getters will return swapped values)
70
+ base_number = number
71
+ supplement_number = part
72
+
73
+ # NOW mark that this is a synthetic base (after capturing values)
74
+ @synthetic_base = true
75
+
76
+ # Use SingleIdentifier which has typed_stage attribute
77
+ base = SingleIdentifier.new
78
+ base.publisher = publisher
79
+ base.number = base_number if base_number
80
+ base.part = nil # Base doesn't have part - part is the supplement number
81
+ base.subpart = subpart if subpart
82
+ base.date = date if date
83
+
84
+ # Create typed_stage for the base - use "IS" (International Standard) type
85
+ # not the supplement type
86
+ require_relative "../components/typed_stage"
87
+ base.typed_stage = Pubid::Components::TypedStage.new(
88
+ abbr: ["IS"],
89
+ type_code: :is,
90
+ stage_code: :undated,
91
+ )
92
+
93
+ @base_identifier = base
94
+
95
+ # Store the supplement number for getter override
96
+ # The original number is the base number (moved to base_identifier)
97
+ # The original part is the supplement number (what we want to return)
98
+ @supplement_number = supplement_number
99
+
100
+ @base_identifier
101
+ ensure
102
+ @ensuring_base = false
103
+ end
104
+
105
+ # Check if this supplement has a synthetic base (created for standalone format)
106
+ def synthetic_base?
107
+ @synthetic_base ||= false
108
+ end
109
+
110
+ def to_s(lang: :en, lang_single: false, with_edition: false)
111
+ # Ensure we have a base_identifier for standalone supplements
112
+ ensure_base_identifier
113
+
114
+ # For standalone supplements (synthetic base), use standalone format
115
+ # IEC/FDAM 60038-1, not IEC/IS 60038/FDAM1
116
+ if synthetic_base?
117
+ parts = []
118
+
119
+ # Publisher portion
120
+ if publisher
121
+ parts << publisher.body
122
+ parts << "/#{copublishers.map(&:body).join('/')}" if copublishers&.any?
123
+ end
124
+
125
+ # Supplement type and number with part (use base number)
126
+ abbr = typed_stage.abbr.first
127
+ number_str = base_identifier.number.to_s
128
+ number_str += "-#{number}" if number # supplement number
129
+ number_str += "-#{subpart}" if subpart
130
+ parts << "#{abbr} #{number_str}"
131
+
132
+ result = parts.join("/")
133
+ result += ":#{date.year}" if date
134
+ result += " #{edition}" if edition&.number
135
+ result
136
+ elsif base_identifier
137
+ # Normal supplement with real base identifier
138
+ # Format: "IEC 60050-102:2007/AMD1:2017"
139
+ parts = []
140
+ parts << base_identifier.to_s(lang: lang, lang_single: lang_single,
141
+ with_edition: with_edition)
142
+
143
+ # Supplement notation
144
+ # Use uppercase abbreviation without space: /AMD1, /COR1
145
+ abbr = typed_stage.abbr.first.upcase
146
+ supp_part = "/#{abbr}#{number}"
147
+ supp_part += ":#{date.year}" if date
148
+ parts << supp_part
149
+
150
+ # Add edition if present
151
+ parts << " #{edition}" if edition&.number
152
+
153
+ parts.join
154
+ else
155
+ # Fallback - shouldn't happen
156
+ super
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iec
5
+ # Generates IEC URNs in the legacy positional format used as ground truth
6
+ # by relaton-data-iec:
7
+ #
8
+ # urn:iec:std:{publisher}:{number}[-{part}]:{date}:{type}:{deliverable}:{language}[:{adjuncts}]
9
+ #
10
+ # e.g. +urn:iec:std:iec:60050-102:2007:::+ (type after date; trailing empty
11
+ # type/deliverable/language slots). This is a port of relaton-iec's
12
+ # +Relaton::Iec.code_to_urn+ operating on +identifier.to_s+, which
13
+ # round-trips faithfully. The all-parts series URN is the one exception: it
14
+ # omits the language slot (8 fields), so it has a dedicated branch.
15
+ class UrnGenerator < Pubid::UrnGenerator::Base
16
+ # Deliverable markers occupying the positional deliverable slot.
17
+ DELIVERABLES = /cmv|csv|exv|prv|rlv|ser/.freeze
18
+
19
+ def generate
20
+ return series_urn if identifier.respond_to?(:all_parts) && identifier.all_parts
21
+
22
+ code_to_urn(identifier.to_s, urn_language)
23
+ end
24
+
25
+ private
26
+
27
+ # Hyphen-joined language codes (e.g. "en-fr"), or nil when unset.
28
+ def urn_language
29
+ return nil unless identifier.respond_to?(:languages)
30
+
31
+ langs = identifier.languages
32
+ return nil unless langs&.any?
33
+
34
+ langs.map(&:code).join("-")
35
+ end
36
+
37
+ # The all-parts series URN drops the language slot and carries no part or
38
+ # date: urn:iec:std:iec:80000:::ser.
39
+ def series_urn
40
+ code = identifier.to_s.sub(/\s*\(all parts\)\s*\z/, "")
41
+ m = code.downcase.match(/(?<head>\S+)\s+(?<pnum>[\d-]+)/)
42
+ head = m[:head].split("/").join("-")
43
+ ["urn", "iec", "std", head, m[:pnum], "", "", "ser"].join(":")
44
+ end
45
+
46
+ # Port of Relaton::Iec.code_to_urn.
47
+ def code_to_urn(code, lang = nil)
48
+ rest = code.downcase.sub(%r{
49
+ (?<head>[^\s]+)\s
50
+ (?<type>is|ts|tr|pas|srd|guide|tec|wp)?(?(<type>)\s)
51
+ (?<pnum>[\d-]+)\s?
52
+ (?<_dd>:)?(?(<_dd>)(?<date>[\d-]+)\s?)
53
+ }x, "")
54
+ m = $~
55
+ return unless m && m[:head] && m[:pnum]
56
+
57
+ deliv = DELIVERABLES.match(code.downcase).to_s
58
+ urn = ["urn", "iec", "std", m[:head].split("/").join("-"), m[:pnum],
59
+ m[:date], m[:type], deliv, lang]
60
+ (urn + adjunct_to_urn(rest)).join(":")
61
+ end
62
+
63
+ # Port of Relaton::Iec.ajunct_to_urn — recursively emits amd/cor/ish
64
+ # adjuncts, prefixing "plus" for the "+" (consolidated) relation.
65
+ def adjunct_to_urn(rest)
66
+ r = rest.sub(%r{
67
+ (?<pl>\+|/)(?(<pl>)(?<adjunct>(?:amd|cor|ish))(?<adjnum>\d+)\s?)
68
+ (?<_d2>:)?(?(<_d2>)(?<adjdt>[\d-]+)\s?)
69
+ }x, "")
70
+ m = $~ || {}
71
+ return [] unless m[:adjunct]
72
+
73
+ plus = "plus" if m[:pl] == "+"
74
+ urn = [plus, m[:adjunct], m[:adjnum], m[:adjdt]]
75
+ urn + adjunct_to_urn(r)
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iec
5
+ # Parses IEC URNs in the legacy positional format (relaton-data-iec ground
6
+ # truth):
7
+ #
8
+ # urn:iec:std:{publisher}:{number}[-{part}]:{date}:{type}:{deliverable}:{language}[:{adjuncts}]
9
+ #
10
+ # Examples:
11
+ # - urn:iec:std:iec:60050:2011:::
12
+ # - urn:iec:std:iec:62547:2013:tr:: (type after date)
13
+ # - urn:iec:std:iec:60050-102:2007:::::amd:1:2017
14
+ # - urn:iec:std:iec:60034-16-3:1996:ts::fr (deliverable empty, language fr)
15
+ # - urn:iec:std:iec:80000:::ser (all-parts series)
16
+ #
17
+ # This is a port of relaton-iec's +urn_to_code+: the positional fields are
18
+ # reassembled into a code string which is then run through the text parser
19
+ # (+Identifier.parse+), so there is a single source of truth for building
20
+ # the identifier object.
21
+ class UrnParser
22
+ # Parse IEC URN string
23
+ # @param urn [String] URN string to parse
24
+ # @return [Identifier] parsed identifier
25
+ def self.parse(urn)
26
+ new.parse_urn(urn)
27
+ end
28
+
29
+ # Parse URN string into identifier
30
+ # @param urn [String] URN string
31
+ # @return [Identifier] parsed identifier
32
+ def parse_urn(urn)
33
+ unless urn.start_with?("urn:iec:std:")
34
+ raise Errors::ParseError, "Invalid IEC URN: #{urn}"
35
+ end
36
+
37
+ code, lang, all_parts = urn_to_code(urn)
38
+ raise Errors::ParseError, "Invalid IEC URN: #{urn}" unless code
39
+
40
+ id = Pubid::Iec::Identifier.parse(code)
41
+ id.all_parts = true if all_parts && id.respond_to?(:all_parts=)
42
+ if lang && !lang.empty? && id.respond_to?(:languages=)
43
+ id.languages = [::Pubid::Components::Language.new(code: lang)]
44
+ end
45
+ id
46
+ end
47
+
48
+ private
49
+
50
+ # Port of Relaton::Iec.urn_to_code. Reassembles the positional URN fields
51
+ # into a text code string. Returns [code, language, all_parts].
52
+ def urn_to_code(urn)
53
+ fields = urn.upcase.split(":")
54
+ return if fields.size < 5
55
+
56
+ head, num, date, type, deliv, lang = fields[3, 8]
57
+ all_parts = false
58
+
59
+ code = head.gsub("-", "/")
60
+ code += " #{type}" unless type.nil? || type.empty?
61
+ code += " #{num}"
62
+ code += ":#{date}" unless date.nil? || date.empty?
63
+ code += adjunct_to_code(fields[9..])
64
+
65
+ # "ser" marks an all-parts series rather than a deliverable suffix; it
66
+ # is signalled out-of-band (the code built from a series URN carries no
67
+ # part or date, so to_s renders "IEC NNNN (all parts)").
68
+ if deliv && deliv.casecmp("SER").zero?
69
+ all_parts = true
70
+ elsif deliv && !deliv.empty?
71
+ code += " #{deliv}"
72
+ end
73
+
74
+ [code, lang&.downcase, all_parts]
75
+ end
76
+
77
+ # Port of Relaton::Iec.ajanct_to_code — recursively rebuilds amd/cor/ish
78
+ # adjuncts from (relation, type, number, date) quartets. A "PLUS"
79
+ # relation token (the consolidated "+" marker) yields "+"; otherwise "/".
80
+ def adjunct_to_code(fields)
81
+ return "" if fields.nil? || fields.empty?
82
+
83
+ rel, type, num, date = fields[0..3]
84
+ code = (rel.empty? ? "/" : "+") + type + num
85
+ code += ":#{date}" unless date.nil? || date.empty?
86
+ code + adjunct_to_code(fields[4..])
87
+ end
88
+ end
89
+ end
90
+ end
data/lib/pubid/iec.rb ADDED
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iec
5
+ end
6
+ end
7
+
8
+ # Require scheme first
9
+ require_relative "scheme"
10
+
11
+ # Require all identifier classes
12
+ require_relative "iec/identifiers/international_standard"
13
+ require_relative "iec/identifiers/technical_report"
14
+ require_relative "iec/identifiers/technical_specification"
15
+ require_relative "iec/identifiers/publicly_available_specification"
16
+ require_relative "iec/identifiers/guide"
17
+ require_relative "iec/identifiers/test_report_form"
18
+ require_relative "iec/identifiers/interpretation_sheet"
19
+ require_relative "iec/identifiers/systems_reference_document"
20
+ require_relative "iec/identifiers/working_document"
21
+ require_relative "iec/identifiers/amendment"
22
+ require_relative "iec/identifiers/corrigendum"
23
+
24
+ # Wrapper identifier types
25
+ require_relative "iec/identifiers/vap_identifier"
26
+ require_relative "iec/identifiers/sheet_identifier"
27
+ require_relative "iec/identifiers/consolidated_identifier"
28
+ require_relative "iec/identifiers/fragment_identifier"
29
+
30
+ # Additional document types
31
+ require_relative "iec/identifiers/component_specification"
32
+ require_relative "iec/identifiers/operational_document"
33
+ require_relative "iec/identifiers/societal_technology_trend_report"
34
+ require_relative "iec/identifiers/white_paper"
35
+
36
+ module Pubid
37
+ module Iec
38
+ # Primary document types (not supplements)
39
+ IDENTIFIER_TYPES = [
40
+ Identifiers::InternationalStandard,
41
+ Identifiers::TechnicalReport,
42
+ Identifiers::TechnicalSpecification,
43
+ Identifiers::PubliclyAvailableSpecification,
44
+ Identifiers::Guide,
45
+ Identifiers::TestReportForm,
46
+ Identifiers::InterpretationSheet,
47
+ Identifiers::SystemsReferenceDocument,
48
+ Identifiers::WorkingDocument,
49
+ ].freeze
50
+
51
+ # Supplement types (can appear with / notation)
52
+ SUPPLEMENT_IDENTIFIER_TYPES = [
53
+ Identifiers::Amendment,
54
+ Identifiers::Corrigendum,
55
+ Identifiers::InterpretationSheet, # ISH can act as supplement (/ISH1:1996)
56
+ Identifiers::FragmentIdentifier, # FRAG wraps amendments/corrigenda
57
+ ].freeze
58
+
59
+ # Create the Scheme registry with all identifier types
60
+ Scheme = Pubid::Scheme.new(
61
+ identifiers: IDENTIFIER_TYPES,
62
+ supplement_identifiers: SUPPLEMENT_IDENTIFIER_TYPES,
63
+ )
64
+
65
+ # Main entry point for IEC identifiers
66
+ def self.parse(identifier_string)
67
+ parsed = Parser.new.parse(identifier_string)
68
+ Builder.new(Scheme).build(parsed)
69
+ end
70
+
71
+ # Parse an IEC URN string
72
+ # @param urn [String] the URN string to parse
73
+ # @return [Identifier] the parsed identifier
74
+ # @raise [Errors::ParseError] if URN is invalid
75
+ def self.parse_urn(urn)
76
+ UrnParser.parse(urn)
77
+ end
78
+ end
79
+ end
80
+
81
+ require_relative "iec/urn_parser"
82
+ require_relative "iec/builder"
83
+ require_relative "iec/parser"
84
+
85
+ Pubid::Registry.register(:iec, Pubid::Iec)
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Ieee
5
+ module Aiee
6
+ # Builder for AIEE identifiers
7
+ class Builder
8
+ def build(parsed)
9
+ attributes = {}
10
+
11
+ # Extract and normalize publisher
12
+ # All AIEE variants (AIEE, A.I.E.E., A. I. E. E., IEEE-AIEE) normalize to "AIEE"
13
+ attributes[:publisher] = "AIEE"
14
+
15
+ # Extract and normalize type
16
+ type_str = extract_value(parsed[:type])
17
+ # Normalize compound types like "Standard No." to "No"
18
+ # Also normalize "Standard No" (without dot) to "No"
19
+ attributes[:type] = if type_str&.start_with?("Standard")
20
+ "No"
21
+ else
22
+ type_str
23
+ end
24
+
25
+ # Extract code
26
+ code_str = extract_value(parsed[:number])
27
+ if code_str
28
+ attributes[:code] = Components::Code.parse(code_str)
29
+ end
30
+
31
+ # Extract year (convert to string for consistency)
32
+ year_str = extract_value(parsed[:year])
33
+ attributes[:year] = year_str&.to_s
34
+
35
+ # Extract month
36
+ month_str = extract_value(parsed[:month])
37
+ attributes[:month] = month_str if month_str
38
+
39
+ # Extract separator (for rendering distinction)
40
+ separator_str = extract_value(parsed[:separator])
41
+ attributes[:separator] = separator_str if separator_str
42
+
43
+ # Set original format based on parsed data
44
+ attributes[:original_format] = if separator_str || month_str
45
+ "long"
46
+ else
47
+ "short"
48
+ end
49
+
50
+ # Create identifier
51
+ Identifier.new(**attributes)
52
+ end
53
+
54
+ private
55
+
56
+ def extract_value(value)
57
+ return nil if value.nil?
58
+ return nil if value.is_a?(Array) && value.empty?
59
+
60
+ if value.is_a?(Array)
61
+ joined = value.join
62
+ return joined.length.positive? ? joined : nil
63
+ end
64
+
65
+ str_value = value.to_s.strip
66
+ str_value.length.positive? ? str_value : nil
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end