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,399 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Cie
5
+ # Builder transforms parsed data into CIE identifier objects
6
+ # Single Responsibility: Object construction from parse tree
7
+ class Builder
8
+ def initialize
9
+ # Builder doesn't need scheme for CIE (simpler than ISO/IEC)
10
+ end
11
+
12
+ # Build identifier from parsed hash
13
+ def build(parsed_hash, original_string: nil)
14
+ # Determine identifier class based on parsed content
15
+ identifier_class = determine_class(parsed_hash)
16
+
17
+ # Extract attributes with style detection
18
+ attributes = extract_attributes(parsed_hash)
19
+
20
+ # For Bundle identifier, store original string
21
+ if parsed_hash[:bundle_items] && original_string
22
+ attributes[:identifiers_string] = original_string
23
+ end
24
+
25
+ # Construct identifier
26
+ identifier_class.new(**attributes)
27
+ end
28
+
29
+ private
30
+
31
+ # Determine which identifier class to use
32
+ def determine_class(parsed_hash)
33
+ # Tutorial Bundle (special text format)
34
+ if parsed_hash[:bundle_number] && !parsed_hash[:first_number]
35
+ return Cie::Identifiers::TutorialBundle
36
+ end
37
+
38
+ # Bundle (comma-separated)
39
+ if parsed_hash[:bundle_items]
40
+ return Cie::Identifiers::Bundle
41
+ end
42
+
43
+ # Corrigendum (/CorN)
44
+ if parsed_hash[:cor_number]
45
+ return Cie::Identifiers::Corrigendum
46
+ end
47
+
48
+ # Supplement (-SPN)
49
+ if parsed_hash[:supplement_number] && !parsed_hash[:cor_number]
50
+ return Cie::Identifiers::Supplement
51
+ end
52
+
53
+ # Conference (x-prefix)
54
+ if parsed_hash[:conference]
55
+ return Cie::Identifiers::Conference
56
+ end
57
+
58
+ # Dual published with IEC
59
+ if parsed_hash[:iec_identifier]
60
+ return Cie::Identifiers::DualPublished
61
+ end
62
+
63
+ # Identical with ISO
64
+ if parsed_hash[:iso_reference]
65
+ return Cie::Identifiers::Identical
66
+ end
67
+
68
+ # Joint with copublisher (ISO, IEC, or ISO/CIE)
69
+ if parsed_hash[:copublisher]
70
+ return Cie::Identifiers::JointPublished
71
+ end
72
+
73
+ # Standard (default)
74
+ Cie::Identifiers::Standard
75
+ end
76
+
77
+ # Extract attributes from parsed hash
78
+ def extract_attributes(parsed_hash)
79
+ attributes = {}
80
+
81
+ # Extract year and date separator from wrapped date format
82
+ year_value = nil
83
+ date_sep = nil
84
+
85
+ # Handle the new wrapped formats from parser
86
+ if parsed_hash[:date_then_lang]
87
+ # date_then_lang: { current_date: { year: ... } } or { legacy_date: { year: ... } }, language: ...
88
+ date_data = parsed_hash[:date_then_lang]
89
+ if date_data[:current_date]
90
+ year_value = extract_value(date_data[:current_date][:year])
91
+ date_sep = "colon"
92
+ elsif date_data[:legacy_date]
93
+ year_value = extract_value(date_data[:legacy_date][:year])
94
+ date_sep = "dash"
95
+ end
96
+ # Extract language from date_then_lang if present
97
+ if date_data[:language_paren_year]
98
+ lang_data = date_data[:language_paren_year]
99
+ lang_code = extract_value(lang_data[:lang_code])
100
+ trans_year = extract_value(lang_data[:trans_year])
101
+ lang_format = "paren_year"
102
+ if lang_code
103
+ lang_attrs = { code: lang_code, format: lang_format }
104
+ lang_attrs[:translation_year] = trans_year if trans_year
105
+ attributes[:language] = Components::Language.new(**lang_attrs)
106
+ end
107
+ elsif date_data[:language_paren]
108
+ lang_data = date_data[:language_paren]
109
+ lang_code = extract_value(lang_data[:lang_code])
110
+ lang_format = "paren"
111
+ if lang_code
112
+ lang_attrs = { code: lang_code, format: lang_format }
113
+ attributes[:language] = Components::Language.new(**lang_attrs)
114
+ end
115
+ elsif date_data[:language_slash]
116
+ lang_data = date_data[:language_slash]
117
+ lang_code = extract_value(lang_data[:lang_code])
118
+ lang_format = "slash"
119
+ if lang_code
120
+ lang_attrs = { code: lang_code, format: lang_format }
121
+ attributes[:language] = Components::Language.new(**lang_attrs)
122
+ end
123
+ end
124
+ elsif parsed_hash[:lang_before]
125
+ # lang_before: { language: ..., current_date/legacy_date: ... }
126
+ lang_data = parsed_hash[:lang_before]
127
+ if lang_data[:language_paren]
128
+ lang_info = lang_data[:language_paren]
129
+ lang_code = extract_value(lang_info[:lang_code])
130
+ lang_format = "paren"
131
+ if lang_code
132
+ lang_attrs = { code: lang_code, format: lang_format }
133
+ attributes[:language] = Components::Language.new(**lang_attrs)
134
+ end
135
+ elsif lang_data[:language_slash]
136
+ lang_info = lang_data[:language_slash]
137
+ lang_code = extract_value(lang_info[:lang_code])
138
+ lang_format = "slash"
139
+ if lang_code
140
+ lang_attrs = { code: lang_code, format: lang_format }
141
+ attributes[:language] = Components::Language.new(**lang_attrs)
142
+ end
143
+ end
144
+ # Extract date from lang_before
145
+ if lang_data[:current_date]
146
+ year_value = extract_value(lang_data[:current_date][:year])
147
+ date_sep = "colon"
148
+ elsif lang_data[:legacy_date]
149
+ year_value = extract_value(lang_data[:legacy_date][:year])
150
+ date_sep = "dash"
151
+ end
152
+ elsif parsed_hash[:current_date]
153
+ year_value = extract_value(parsed_hash[:current_date][:year])
154
+ date_sep = "colon"
155
+ elsif parsed_hash[:legacy_date]
156
+ year_value = extract_value(parsed_hash[:legacy_date][:year])
157
+ date_sep = "dash"
158
+ elsif parsed_hash[:year]
159
+ # Direct year (for joint patterns or legacy_code_with_year)
160
+ year_value = extract_value(parsed_hash[:year])
161
+
162
+ # For joint patterns, infer separator based on copublisher
163
+ if parsed_hash[:copublisher]
164
+ copub = extract_value(parsed_hash[:copublisher])
165
+ # IEC uses dash, ISO uses colon (by convention for modern docs)
166
+ date_sep = copub == "IEC" ? "dash" : "colon"
167
+ elsif parsed_hash[:trailing_lang]
168
+ # If trailing_lang exists, this came from legacy_code_with_year
169
+ # which uses dash as the year separator (parsed as NUMBER-YEAR)
170
+ date_sep = "dash"
171
+ else
172
+ # Default: infer from year value (pre-2001 = dash, post-2001 = colon)
173
+ year_int = year_value.to_i
174
+ date_sep = year_int <= 2001 ? "dash" : "colon"
175
+ end
176
+ elsif parsed_hash[:slash_year]
177
+ # Slash-year format (legacy): /1998
178
+ year_value = extract_value(parsed_hash[:slash_year])
179
+ date_sep = "slash" # Special format for identical identifiers
180
+ end
181
+
182
+ # Detect style from date separator
183
+ style = if date_sep == "colon"
184
+ "current"
185
+ else
186
+ (date_sep == "dash" ? "legacy" : detect_style_fallback(parsed_hash))
187
+ end
188
+ attributes[:style] = style
189
+
190
+ # Set year and separator if present
191
+ attributes[:year] = year_value if year_value
192
+ attributes[:date_separator] = date_sep if date_sep
193
+
194
+ # Extract code
195
+ if parsed_hash[:number]
196
+ code_attrs = { number: extract_value(parsed_hash[:number]),
197
+ style: style }
198
+ if parsed_hash[:part]
199
+ code_attrs[:part] =
200
+ extract_value(parsed_hash[:part])
201
+ end
202
+ if parsed_hash[:iteration]
203
+ code_attrs[:iteration] =
204
+ extract_value(parsed_hash[:iteration])
205
+ end
206
+
207
+ # Detect part separator from parser markers
208
+ if parsed_hash[:slash_sep]
209
+ code_attrs[:part_separator] = "slash"
210
+ elsif parsed_hash[:dash_sep]
211
+ code_attrs[:part_separator] = "dash"
212
+ end
213
+
214
+ attributes[:code] = Components::Code.new(**code_attrs)
215
+ end
216
+
217
+ # Conference number (separate from regular code)
218
+ if parsed_hash[:conf_number]
219
+ attributes[:conference_number] =
220
+ extract_value(parsed_hash[:conf_number])
221
+ end
222
+
223
+ # Extract language (direct lang_code for slash_colon format)
224
+ lang_code = nil
225
+ lang_format = nil
226
+ trans_year = nil
227
+
228
+ if parsed_hash[:language_paren_year]
229
+ lang_data = parsed_hash[:language_paren_year]
230
+ lang_code = extract_value(lang_data[:lang_code])
231
+ trans_year = extract_value(lang_data[:trans_year])
232
+ lang_format = "paren_year"
233
+ elsif parsed_hash[:language_paren]
234
+ lang_data = parsed_hash[:language_paren]
235
+ lang_code = extract_value(lang_data[:lang_code])
236
+ lang_format = "paren"
237
+ elsif parsed_hash[:language_slash]
238
+ lang_data = parsed_hash[:language_slash]
239
+ lang_code = extract_value(lang_data[:lang_code])
240
+ lang_format = "slash"
241
+ elsif parsed_hash[:lang_code]
242
+ # Direct lang_code from identical_with_iso or standard_with_language_year patterns
243
+ # Format: /E:2001 (with colon)
244
+ lang_code = extract_value(parsed_hash[:lang_code])
245
+ # Check if colon was present in the pattern
246
+ if parsed_hash[:lang_colon]
247
+ lang_format = "slash_colon" # /E:YYYY format
248
+ else
249
+ # This shouldn't happen with preprocessing, but default to slash
250
+ lang_format = "slash"
251
+ end
252
+ end
253
+
254
+ if lang_code
255
+ lang_attrs = { code: lang_code, format: lang_format }
256
+ lang_attrs[:translation_year] = trans_year if trans_year
257
+ attributes[:language] = Components::Language.new(**lang_attrs)
258
+ end
259
+
260
+ # Extract S prefix flag
261
+ attributes[:s_prefix] = parsed_hash[:s_prefix] ? true : false
262
+
263
+ # Extract stage
264
+ if parsed_hash[:stage]
265
+ attributes[:stage] =
266
+ extract_value(parsed_hash[:stage])
267
+ end
268
+
269
+ # Extract doc type
270
+ if parsed_hash[:doc_type]
271
+ attributes[:doc_type] =
272
+ extract_value(parsed_hash[:doc_type])
273
+ end
274
+
275
+ # Extract copublisher info
276
+ if parsed_hash[:copublisher]
277
+ attributes[:copublisher] = extract_value(parsed_hash[:copublisher])
278
+ end
279
+
280
+ # Extract ISO reference (for identical identifiers)
281
+ if parsed_hash[:iso_reference]
282
+ attributes[:iso_reference] =
283
+ extract_value(parsed_hash[:iso_reference])
284
+ end
285
+
286
+ # Extract IEC identifier (for dual published)
287
+ if parsed_hash[:iec_identifier]
288
+ attributes[:iec_identifier] =
289
+ extract_value(parsed_hash[:iec_identifier])
290
+ end
291
+
292
+ # Extract supplement data
293
+ if parsed_hash[:supplement_number]
294
+ attributes[:supplement_number] =
295
+ extract_value(parsed_hash[:supplement_number])
296
+ if parsed_hash[:supplement_part]
297
+ attributes[:supplement_part] =
298
+ extract_value(parsed_hash[:supplement_part])
299
+ end
300
+ if parsed_hash[:base_number]
301
+ attributes[:base_number] =
302
+ extract_value(parsed_hash[:base_number])
303
+ end
304
+ end
305
+
306
+ # Extract corrigendum data
307
+ if parsed_hash[:cor_number]
308
+ attributes[:cor_number] = extract_value(parsed_hash[:cor_number])
309
+ attributes[:cor_year] = extract_value(parsed_hash[:cor_year])
310
+ attributes[:base_number] = extract_value(parsed_hash[:base_number])
311
+ attributes[:base_year] = extract_value(parsed_hash[:base_year])
312
+ if parsed_hash[:base_supplement]
313
+ attributes[:base_supplement] =
314
+ extract_value(parsed_hash[:base_supplement])
315
+ end
316
+ if parsed_hash[:base_supplement_part]
317
+ attributes[:base_supplement_part] =
318
+ extract_value(parsed_hash[:base_supplement_part])
319
+ end
320
+ end
321
+
322
+ # Extract amendment (on conference)
323
+ if parsed_hash[:amd_number]
324
+ attributes[:amendment_number] =
325
+ extract_value(parsed_hash[:amd_number])
326
+ end
327
+
328
+ # Extract bundle data
329
+ if parsed_hash[:bundle_number]
330
+ attributes[:bundle_number] =
331
+ extract_value(parsed_hash[:bundle_number])
332
+ end
333
+
334
+ # Extract trailing language from legacy_code_with_year
335
+ if parsed_hash[:trailing_lang].is_a?(Hash)
336
+ lang_data = parsed_hash[:trailing_lang]
337
+ # trailing_lang contains language_paren_year hash
338
+ if lang_data[:language_paren_year]
339
+ lang_info = lang_data[:language_paren_year]
340
+ lang_code = extract_value(lang_info[:lang_code])
341
+ trans_year = extract_value(lang_info[:trans_year])
342
+ if lang_code
343
+ lang_attrs = { code: lang_code, format: "paren_year" }
344
+ lang_attrs[:translation_year] = trans_year if trans_year
345
+ attributes[:language] = Components::Language.new(**lang_attrs)
346
+ end
347
+ end
348
+ end
349
+
350
+ attributes
351
+ end
352
+
353
+ # Detect style from date separator
354
+ def detect_style(parsed_hash)
355
+ # Check for current_date or legacy_date wrapper
356
+ if parsed_hash[:current_date]
357
+ return "current"
358
+ elsif parsed_hash[:legacy_date]
359
+ return "legacy"
360
+ end
361
+
362
+ # Fallback
363
+ detect_style_fallback(parsed_hash)
364
+ end
365
+
366
+ # Fallback style detection based on year
367
+ def detect_style_fallback(parsed_hash)
368
+ # Fallback: year-based heuristic
369
+ if parsed_hash[:year]
370
+ year = extract_value(parsed_hash[:year]).to_i
371
+ return year <= 2001 ? "legacy" : "current"
372
+ elsif parsed_hash[:current_date] && parsed_hash[:current_date][:year]
373
+ year = extract_value(parsed_hash[:current_date][:year]).to_i
374
+ return year <= 2001 ? "legacy" : "current"
375
+ elsif parsed_hash[:legacy_date] && parsed_hash[:legacy_date][:year]
376
+ year = extract_value(parsed_hash[:legacy_date][:year]).to_i
377
+ return year <= 2001 ? "legacy" : "current"
378
+ end
379
+
380
+ # Default to current
381
+ "current"
382
+ end
383
+
384
+ # Extract value from parsed element
385
+ def extract_value(value)
386
+ return nil if value.nil?
387
+ return nil if value.is_a?(Array) && value.empty?
388
+
389
+ if value.is_a?(Array)
390
+ joined = value.join
391
+ return joined.length.positive? ? joined : nil
392
+ end
393
+
394
+ str_value = value.to_s.strip
395
+ str_value.length.positive? ? str_value : nil
396
+ end
397
+ end
398
+ end
399
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Cie
7
+ module Components
8
+ # Code component for CIE identifiers
9
+ # Handles number-part-iteration with style awareness
10
+ class Code < Lutaml::Model::Serializable
11
+ attribute :number, :string # "013", "170", "198"
12
+ attribute :part, :string # "1", "2", "3"
13
+ attribute :iteration, :string # "1" in "006.1"
14
+ attribute :style, :string # "legacy" or "current"
15
+ attribute :part_separator, :string # "slash" or "dash" (preserves original)
16
+
17
+ def to_s
18
+ result = number
19
+
20
+ # Handle part AND iteration together (e.g., "19/2.1")
21
+ if part && iteration
22
+ # Use slash for part, then dot for iteration
23
+ result += "/#{part}.#{iteration}"
24
+ # Handle iteration only (e.g., "006.1", "13.3")
25
+ elsif iteration
26
+ result += ".#{iteration}"
27
+ # Handle part only (separator depends on part_separator or style)
28
+ elsif part
29
+ # Use part_separator if explicitly set (preserves original)
30
+ # Otherwise fall back to style-based separator
31
+ separator = case part_separator
32
+ when "slash"
33
+ "/"
34
+ when "dash"
35
+ "-"
36
+ else
37
+ # Legacy: slash "/" (e.g., "170/1")
38
+ # Current: dash "-" (e.g., "170-1")
39
+ style == "legacy" ? "/" : "-"
40
+ end
41
+ result += "#{separator}#{part}"
42
+ end
43
+
44
+ result
45
+ end
46
+
47
+ # Parse code string with style detection
48
+ def self.parse(code_str, style: :current)
49
+ return nil if code_str.nil? || code_str.strip.empty?
50
+
51
+ # Detect iteration format (dot separator)
52
+ if code_str.include?(".")
53
+ parts = code_str.split(".")
54
+ new(number: parts[0], iteration: parts[1], style: style)
55
+ # Detect part with separator
56
+ elsif code_str.include?("/")
57
+ parts = code_str.split("/")
58
+ new(number: parts[0], part: parts[1], style: "legacy",
59
+ part_separator: "slash")
60
+ elsif code_str.include?("-")
61
+ parts = code_str.split("-", 2) # Limit to 2 parts
62
+ new(number: parts[0], part: parts[1], style: "current",
63
+ part_separator: "dash")
64
+ # Simple number
65
+ else
66
+ new(number: code_str, style: style)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Cie
7
+ module Components
8
+ # Language component for CIE identifiers
9
+ # Handles three distinct language formats:
10
+ # 1. Slash-prefix: /E, /F, /G (legacy, no year)
11
+ # 2. Slash with colon and year: /E:2001 (slash_colon)
12
+ # 3. Parenthetical: (DE), (ES), (en)
13
+ # 4. Translation year: (RU-2021)
14
+ class Language < Lutaml::Model::Serializable
15
+ attribute :code, :string # "E", "DE", "RU", "en"
16
+ attribute :format, :string # "slash", "slash_colon", "paren", "paren_year"
17
+ attribute :translation_year, :string # "2021" in "(RU-2021)"
18
+
19
+ def to_s
20
+ case format
21
+ when "slash"
22
+ "/#{code}" # /E, /F, /G (no year)
23
+ when "slash_colon"
24
+ "/#{code}" # /E (colon and year handled by Identical)
25
+ when "paren"
26
+ "(#{code})" # (DE), (ES), (en)
27
+ when "paren_year"
28
+ " (#{code}-#{translation_year})" # (RU-2021)
29
+ else
30
+ "(#{code})" # Default to paren
31
+ end
32
+ end
33
+
34
+ # Parse language string with format detection
35
+ def self.parse(lang_str)
36
+ return nil if lang_str.nil? || lang_str.strip.empty?
37
+
38
+ # Detect slash format
39
+ if lang_str.start_with?("/")
40
+ new(code: lang_str[1..], format: "slash")
41
+ # Detect paren with year
42
+ elsif lang_str.match?(/\(([A-Z]{2})-(\d{4})\)/)
43
+ match = lang_str.match(/\(([A-Z]{2})-(\d{4})\)/)
44
+ new(code: match[1], translation_year: match[2],
45
+ format: "paren_year")
46
+ # Detect simple paren
47
+ elsif lang_str.match?(/\(([A-Za-z]{2,3})\)/)
48
+ match = lang_str.match(/\(([A-Za-z]{2,3})\)/)
49
+ new(code: match[1], format: "paren")
50
+ else
51
+ # Default: treat as code
52
+ new(code: lang_str, format: "paren")
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Cie
5
+ # Base Identifier class for CIE
6
+ # Provides parse() entry point
7
+ class Identifier < Lutaml::Model::Serializable
8
+ attribute :style, :string # "legacy" or "current"
9
+
10
+ # Parse CIE identifier string
11
+ def self.parse(input)
12
+ parsed = Parser.parse(input)
13
+ builder = Builder.new
14
+ builder.build(parsed, original_string: input)
15
+ end
16
+
17
+ # Factory that builds a CIE identifier from a hash of primitives.
18
+ # Dispatch on `:type` to a SingleIdentifier subclass; default is
19
+ # {Identifiers::Standard}.
20
+ TYPE_KEY_TO_KLASS = {
21
+ standard: "Standard",
22
+ conference: "Conference",
23
+ bundle: "Bundle",
24
+ joint_published: "JointPublished",
25
+ dual_published: "DualPublished",
26
+ identical: "Identical",
27
+ tutorial_bundle: "TutorialBundle",
28
+ }.freeze
29
+
30
+ def self.create(type: nil, **opts)
31
+ klass = resolve_create_class(type)
32
+ klass.new(**coerce_create_attrs(opts, klass: klass))
33
+ end
34
+
35
+ def self.resolve_create_class(type)
36
+ return Identifiers::Standard if type.nil?
37
+
38
+ klass_name = TYPE_KEY_TO_KLASS[type.to_sym]
39
+ raise ArgumentError, "Unknown CIE type: #{type.inspect}" unless klass_name
40
+
41
+ Identifiers.const_get(klass_name)
42
+ end
43
+
44
+ def self.coerce_create_attrs(opts, klass:)
45
+ attrs = {}
46
+ attrs[:year] = opts[:year].to_s if opts[:year]
47
+ attrs[:date_separator] = opts[:date_separator].to_s if opts[:date_separator]
48
+
49
+ if (v = opts[:code] || opts[:number])
50
+ attrs[:code] = Pubid::Cie::Components::Code.new(
51
+ number: v.to_s,
52
+ part: opts[:part]&.to_s,
53
+ iteration: opts[:iteration]&.to_s,
54
+ style: opts[:style]&.to_s,
55
+ part_separator: opts[:part_separator]&.to_s,
56
+ )
57
+ end
58
+
59
+ # Standard-only attributes
60
+ if klass.attributes.key?(:s_prefix) && opts.key?(:s_prefix)
61
+ attrs[:s_prefix] = opts[:s_prefix]
62
+ end
63
+ if klass.attributes.key?(:stage) && opts[:stage]
64
+ attrs[:stage] = opts[:stage].to_s
65
+ end
66
+ attrs
67
+ end
68
+ private_class_method :resolve_create_class, :coerce_create_attrs
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Cie
7
+ module Identifiers
8
+ # Bundle identifier for CIE
9
+ # Handles comma-separated supplement lists
10
+ # Example: CIE 198-SP1.1:2011,198-SP1.2:2011,198-SP1.3:2011,198-SP1.4:2011
11
+ class Bundle < SingleIdentifier
12
+ attribute :identifiers_string, :string # Store as string for now
13
+
14
+ def to_s
15
+ identifiers_string || ""
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Cie
7
+ module Identifiers
8
+ # Conference identifier for CIE
9
+ # Handles x-prefix conference proceedings
10
+ # Example: CIE x038:2013, CIE x038:2013 Amendment 1
11
+ class Conference < SingleIdentifier
12
+ attribute :conference_number, :string
13
+ attribute :amendment_number, :string
14
+
15
+ def to_s
16
+ result = "CIE x#{conference_number}"
17
+
18
+ # Date with separator
19
+ if year
20
+ separator = date_separator == "colon" ? ":" : "-"
21
+ result += "#{separator}#{year}"
22
+ end
23
+
24
+ # Amendment if present
25
+ result += " Amendment #{amendment_number}" if amendment_number
26
+
27
+ result
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Cie
7
+ module Identifiers
8
+ # Corrigendum identifier for CIE
9
+ # Handles /CorN notation with recursive base parsing
10
+ # Examples: CIE 232:2019/Cor1:2020, CIE 198-SP1.4:2011/Cor1:2013
11
+ class Corrigendum < SupplementIdentifier
12
+ attribute :base_number, :string
13
+ attribute :base_year, :string
14
+ attribute :base_supplement, :string # If base is a supplement
15
+ attribute :base_supplement_part, :string # Part of supplement
16
+ attribute :cor_number, :string
17
+ attribute :cor_year, :string
18
+
19
+ def to_s
20
+ # Build base identifier string
21
+ result = "CIE #{base_number}"
22
+
23
+ # Add supplement notation if base is a supplement
24
+ if base_supplement
25
+ result += "-SP#{base_supplement}"
26
+ result += ".#{base_supplement_part}" if base_supplement_part
27
+ end
28
+
29
+ # Add base year with colon
30
+ result += ":#{base_year}" if base_year
31
+
32
+ # Add corrigendum with slash and colon
33
+ result += "/Cor#{cor_number}:#{cor_year}"
34
+
35
+ result
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end