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,308 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parslet"
4
+
5
+ module Pubid
6
+ module Asme
7
+ class Parser < Parslet::Parser
8
+ # Basic building blocks
9
+ rule(:space) { str(" ") }
10
+ # Regular dash, en-dash, em-dash
11
+ rule(:dash) do
12
+ str("-") | str("–") | str("—")
13
+ end
14
+ rule(:slash) { str("/") }
15
+ rule(:dot) { str(".") }
16
+ rule(:digit) { match("[0-9]") }
17
+ rule(:digits) { digit.repeat(1) }
18
+ rule(:letter) { match("[A-Z]") }
19
+ rule(:letters) { letter.repeat(1) }
20
+ rule(:underscore) { str("_") }
21
+
22
+ # Roman numerals (longest first for proper matching - added X)
23
+ rule(:roman_numeral) do
24
+ str("XIII") | str("XII") | str("XI") | str("VIII") |
25
+ str("VII") | str("VI") | str("IV") | str("IX") | str("X") |
26
+ str("III") | str("II") | str("V") | str("I")
27
+ end
28
+
29
+ # BPVC special letter codes
30
+ rule(:bpvc_letter_code) do
31
+ str("NCA") | str("NCD") | str("SSC") | str("BPV") | str("NUC") |
32
+ str("NB") | str("NC") | str("ND") | str("NE") | str("NF") | str("NG") |
33
+ letter # Single letter for A, B, C, D, M
34
+ end
35
+
36
+ # BPVC complete subdivision
37
+ rule(:bpvc_subdivision) do
38
+ str("BPVC") >>
39
+ (
40
+ # Special: COMPLETE CODE BIND
41
+ (space >> str("COMPLETE CODE BIND")).as(:special) |
42
+ # Dash notation: BPVC-CC-BPV
43
+ (dash >> str("CC") >> dash >> bpvc_letter_code.as(:case_code)) |
44
+ # Standard dotted notation
45
+ (
46
+ dot >>
47
+ (
48
+ # SSC with complex subdivision: BPVC.SSC.XI.II.V.IX
49
+ (str("SSC") >> (dot >> roman_numeral).repeat(1).as(:ssc_sections)).as(:ssc_code) |
50
+ # CC = Case Code: BPVC.CC.BPV or BPVC.CC.NC.XI
51
+ (str("CC") >> dot >> bpvc_letter_code.as(:case_code) >>
52
+ (dot >> (roman_numeral | bpvc_letter_code)).maybe.as(:case_sub)) |
53
+ # Standard roman numeral subdivision: BPVC.I or BPVC.III.1.NB
54
+ (roman_numeral.as(:section) >>
55
+ (dot >> (digits | bpvc_letter_code).as(:subsection)).maybe >>
56
+ (dot >> bpvc_letter_code.as(:sub_subsection)).maybe >>
57
+ # Language suffix with underscore: _ES
58
+ (underscore >> letters.as(:lang_suffix)).maybe)
59
+ )
60
+ ).as(:subdivision)
61
+ ).as(:bpvc_code)
62
+ end
63
+
64
+ # Multi-character designator codes (updated with EA)
65
+ rule(:multi_char_code) do
66
+ str("PVHO") | str("PASE") | str("PTC") | str("PTB") | str("PDS") | str("PCC") |
67
+ str("V&V") | str("V V") | # Both ampersand and space variants
68
+ str("VVUQ") | # Additional V&V variant
69
+ str("TDP") | str("RTP") | str("RT") |
70
+ str("RA-S") | # New: RA-S with dash
71
+ str("RA") |
72
+ str("QME") | str("QAI") | str("QEI") |
73
+ str("NUM") | str("NQA") | str("NML") |
74
+ str("OM") |
75
+ str("HST") | str("HRT") |
76
+ str("FFS") |
77
+ str("TES") |
78
+ str("TR") | # Keep TR separate for space-separated pattern
79
+ str("STS") | # New: STS-1
80
+ str("CSD") | str("CA") |
81
+ str("BTH") | str("BPE") |
82
+ str("ANDE") | str("AED") |
83
+ str("AG") |
84
+ str("NM") | # New: NM.1, NM.2, NM.3
85
+ str("EA") # New: EA-3
86
+ end
87
+
88
+ # Publisher patterns
89
+ rule(:asme_publisher) { str("ASME") }
90
+ rule(:csa_publisher) { str("CSA") }
91
+ rule(:api_publisher) { str("API") }
92
+ rule(:iso_publisher) { str("ISO") }
93
+ rule(:ans_publisher) { str("ANS") }
94
+
95
+ # Joint publisher patterns
96
+ rule(:iso_asme_publisher) do
97
+ str("ISO/ASME").as(:joint_publisher) >> space
98
+ end
99
+
100
+ rule(:asme_ans_publisher) do
101
+ str("ASME/ANS").as(:joint_publisher) >> space
102
+ end
103
+
104
+ rule(:csa_asme_publisher) do
105
+ csa_publisher.as(:first_publisher) >> space >>
106
+ match("[A-Z0-9.]").repeat(1).as(:first_code) >>
107
+ slash >> asme_publisher.as(:second_publisher) >> space
108
+ end
109
+
110
+ rule(:api_asme_publisher) do
111
+ api_publisher.as(:first_publisher) >> space >>
112
+ match("[0-9-]").repeat(1).as(:first_code) >>
113
+ slash >> asme_publisher.as(:second_publisher) >> space
114
+ end
115
+
116
+ # Standard ASME publisher
117
+ rule(:publisher) { asme_publisher >> space }
118
+
119
+ # Designator (longest match first!)
120
+ rule(:designator) do
121
+ (
122
+ bpvc_subdivision | # Try BPVC patterns first
123
+ multi_char_code | # Multi-char codes BEFORE letters
124
+ str("ISO") |
125
+ str("CSA") |
126
+ str("API") |
127
+ str("ANS") |
128
+ letters # Fallback for single-letter
129
+ ).as(:designator)
130
+ end
131
+
132
+ # Number part - can start with dot (NM.1), be dotted (16.5), OR dash-separated (BTH-1)
133
+ rule(:number_part) do
134
+ (
135
+ # Starting with dot (for NM.1, VVUQ 20.1, etc.)
136
+ (dot >> match("[0-9A-Z]").repeat(1) >>
137
+ (dot >> match("[0-9A-Z]").repeat(1)).repeat) |
138
+ # Dash-separated first (for BTH-1, CA-1 patterns)
139
+ (dash >> match("[0-9A-Z]").repeat(1) >>
140
+ (dot >> match("[0-9A-Z]").repeat(1)).repeat) |
141
+ # Regular dotted numbers
142
+ (match("[0-9A-Z]").repeat(1) >>
143
+ (dot >> match("[0-9A-Z]").repeat(1)).repeat)
144
+ ).as(:number)
145
+ end
146
+
147
+ # PTC special: space-separated number with optional suffix
148
+ rule(:ptc_number) do
149
+ space >>
150
+ (
151
+ match("[0-9]").repeat(1) >>
152
+ (dot >> match("[0-9]").repeat(1)).repeat
153
+ ).as(:number) >>
154
+ # Optional space + suffix (like "TW" or "PM")
155
+ (space >> letters.as(:ptc_suffix)).maybe
156
+ end
157
+
158
+ # TR special: space-separated number (like "ASME TR A17.1-8.4-2013")
159
+ rule(:tr_number) do
160
+ space >>
161
+ (
162
+ match("[A-Z0-9]").repeat(1) >>
163
+ (dot >> match("[0-9A-Z]").repeat(1)).repeat >>
164
+ # Allow dash for patterns like A17.1-8.4
165
+ (dash >> match("[0-9]").repeat(1) >>
166
+ (dot >> match("[0-9]").repeat(1)).repeat).maybe
167
+ ).as(:number)
168
+ end
169
+
170
+ # Number with optional preceding space (for V V 10, V&V 10, VVUQ 20.1, etc.)
171
+ rule(:spaced_number_part) do
172
+ space.maybe >> number_part
173
+ end
174
+
175
+ # Year (4-digit)
176
+ rule(:year_4digit) { digit.repeat(4, 4).as(:year) }
177
+
178
+ # Draft year patterns: 20XX, 202X
179
+ rule(:draft_year) do
180
+ (str("20XX") | str("202X") | (str("20") >> digit >> str("X"))).as(:draft_year)
181
+ end
182
+
183
+ # Reaffirmation notation
184
+ rule(:reaffirmation) do
185
+ space >> str("(R") >> year_4digit.as(:reaffirmation) >> str(")")
186
+ end
187
+
188
+ # CSA dual-published number (for ASME/CSA format)
189
+ rule(:csa_portion) do
190
+ slash >> str("CSA") >> space >>
191
+ (letter >> match("[0-9.]").repeat(1)).as(:csa_number)
192
+ end
193
+
194
+ # Parenthetical revision note after year - different from [Draft ...] notation
195
+ rule(:parenthetical_revision) do
196
+ space >> str("(") >>
197
+ (str("Proposed revision of") | str("Revision of")) >>
198
+ space >> match("[^)]").repeat(1).as(:ref_standard) >>
199
+ str(")")
200
+ end
201
+
202
+ # Revision note [Draft Proposed Revision of ...]
203
+ rule(:revision_note) do
204
+ space >> str("[") >> match("[^\\]]").repeat(1).as(:revision_note) >> str("]")
205
+ end
206
+
207
+ # Language notation - support both before and after year
208
+ rule(:language) do
209
+ space >> str("(") >> letters.as(:language) >> str(")")
210
+ end
211
+
212
+ # Handbook keyword
213
+ rule(:handbook_keyword) do
214
+ (space >> str("Handbook")).as(:handbook)
215
+ end
216
+
217
+ # Standard identifier components
218
+ rule(:standard_components) do
219
+ publisher >>
220
+ designator >>
221
+ number_part.maybe >>
222
+ (csa_portion | handbook_keyword).maybe >>
223
+ # Language can come before or after year
224
+ language.maybe >>
225
+ (
226
+ dash >> (draft_year | year_4digit)
227
+ ).maybe >>
228
+ language.maybe >>
229
+ reaffirmation.maybe >>
230
+ revision_note.maybe
231
+ end
232
+
233
+ # Joint published identifier - CSA first
234
+ rule(:csa_asme_identifier) do
235
+ csa_asme_publisher >>
236
+ designator >>
237
+ number_part.maybe >>
238
+ (dash >> (draft_year | year_4digit)).maybe >>
239
+ language.maybe >>
240
+ reaffirmation.maybe
241
+ end
242
+
243
+ # Joint published identifier - API first
244
+ rule(:api_asme_identifier) do
245
+ api_asme_publisher >>
246
+ designator >>
247
+ number_part.maybe >>
248
+ (dash >> (draft_year | year_4digit)).maybe >>
249
+ language.maybe >>
250
+ reaffirmation.maybe
251
+ end
252
+
253
+ # Joint published identifier - ISO/ASME
254
+ rule(:iso_asme_identifier) do
255
+ iso_asme_publisher >>
256
+ number_part >>
257
+ (dash >> (draft_year | year_4digit)).maybe >>
258
+ language.maybe >>
259
+ reaffirmation.maybe
260
+ end
261
+
262
+ # Joint published identifier - ASME/ANS
263
+ rule(:asme_ans_identifier) do
264
+ asme_ans_publisher >>
265
+ designator >>
266
+ number_part.maybe >>
267
+ (dash >> (draft_year | year_4digit)).maybe >>
268
+ language.maybe >>
269
+ reaffirmation.maybe
270
+ end
271
+
272
+ # Standard ASME identifier
273
+ rule(:standard) do
274
+ publisher >>
275
+ (
276
+ # Special case for PTC with space-separated number
277
+ (str("PTC").as(:designator) >> ptc_number >>
278
+ (dash >> (draft_year | year_4digit)).maybe) |
279
+ # Special case for TR with space-separated number
280
+ (str("TR").as(:designator) >> tr_number >>
281
+ (dash >> (draft_year | year_4digit)).maybe) |
282
+ # Regular pattern with designator + optional spaced number
283
+ (designator >> spaced_number_part.maybe >>
284
+ # CSA portion can be followed by handbook keyword
285
+ ((csa_portion >> handbook_keyword.maybe) | handbook_keyword).maybe >>
286
+ # Language can come before or after year
287
+ language.maybe >>
288
+ (dash >> (draft_year | year_4digit)).maybe >>
289
+ language.maybe)
290
+ ) >>
291
+ # Parenthetical revision note (after year)
292
+ parenthetical_revision.maybe >>
293
+ reaffirmation.maybe >>
294
+ revision_note.maybe
295
+ end
296
+
297
+ rule(:identifier) do
298
+ csa_asme_identifier |
299
+ api_asme_identifier |
300
+ iso_asme_identifier |
301
+ asme_ans_identifier |
302
+ standard
303
+ end
304
+
305
+ root(:identifier)
306
+ end
307
+ end
308
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Asme
5
+ class Scheme < Pubid::Scheme
6
+ class << self
7
+ def identifiers
8
+ @identifiers ||= [
9
+ Identifiers::Standard,
10
+ ].freeze
11
+ end
12
+
13
+ def supplement_identifiers
14
+ @supplement_identifiers ||= [].freeze
15
+ end
16
+
17
+ def typed_stages
18
+ @typed_stages ||= [].freeze
19
+ end
20
+
21
+ def supplement_typed_stages
22
+ @supplement_typed_stages ||= [].freeze
23
+ end
24
+
25
+ def locate_typed_stage_by_abbr(_abbr)
26
+ raise ArgumentError,
27
+ "ASME identifiers do not use typed stages"
28
+ end
29
+
30
+ def locate_identifier_klass_by_type_code(_type_code)
31
+ raise ArgumentError,
32
+ "ASME identifiers do not use type codes"
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Asme
5
+ class SingleIdentifier < Pubid::Identifier
6
+ # Generate URN for this identifier
7
+ #
8
+ # @return [String] URN representation
9
+
10
+ attribute :publisher, :string
11
+ attribute :code, Components::Code
12
+ attribute :year, :string
13
+ attribute :reaffirmation, :string # R2020
14
+ attribute :language, :string # (SPANISH)
15
+ attribute :csa_number, :string # CSA dual-published number
16
+ attribute :draft_year, :string # 20XX or 202X for drafts
17
+ attribute :revision_note, :string # [Draft Proposed Revision of ...]
18
+ attribute :parenthetical_revision, :string # (Revision of ASME ...)
19
+ attribute :handbook, :boolean, default: -> { false } # Handbook flag
20
+ attribute :ptc_suffix, :string # PTC suffix like "TW" or "PM"
21
+
22
+ # Joint published attributes
23
+ attribute :joint_publisher, :string # ISO/ASME or ASME/ANS
24
+ attribute :first_publisher, :string # CSA or API (when first)
25
+ attribute :first_code, :string # Code from first publisher
26
+ attribute :second_publisher, :string # ASME (when second)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,133 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Asme
5
+ class UrnGenerator < Pubid::UrnGenerator::Base
6
+ def generate
7
+ parts = ["urn", "asme"]
8
+
9
+ special_type = special_identifier_type_component
10
+ parts << special_type if special_type
11
+
12
+ parts << publisher_component
13
+
14
+ if identifier.code
15
+ parts << identifier.code.to_s
16
+ end
17
+
18
+ part = maybe(:part)
19
+ if part
20
+ p = part.to_s
21
+ parts[-1] = "#{parts[-1]}-#{p}"
22
+ end
23
+
24
+ subpart = maybe(:subpart)
25
+ if subpart
26
+ sp = subpart.to_s
27
+ parts[-1] = "#{parts[-1]}-#{sp}"
28
+ end
29
+
30
+ if identifier.draft_year
31
+ parts << identifier.draft_year.to_s
32
+ elsif identifier.year
33
+ parts << identifier.year.to_s
34
+ end
35
+
36
+ edition = maybe(:edition)
37
+ if edition
38
+ e = edition.number || edition.to_s
39
+ parts << "ed.#{e}"
40
+ end
41
+
42
+ if special_type != "ptc" && identifier.ptc_suffix
43
+ parts << "ptc-suffix.#{identifier.ptc_suffix}"
44
+ end
45
+
46
+ if special_type != "csa" && identifier.csa_number
47
+ parts << "csa.#{identifier.csa_number}"
48
+ end
49
+
50
+ if identifier.first_publisher
51
+ parts << "pub1.#{identifier.first_publisher.to_s.downcase}"
52
+ end
53
+
54
+ if identifier.first_code
55
+ parts << "code1.#{identifier.first_code}"
56
+ end
57
+
58
+ if identifier.second_publisher
59
+ parts << "pub2.#{identifier.second_publisher.to_s.downcase}"
60
+ end
61
+
62
+ if identifier.joint_publisher
63
+ parts << "joint.#{identifier.joint_publisher.to_s.downcase}"
64
+ end
65
+
66
+ if identifier.language
67
+ parts << identifier.language.to_s.downcase
68
+ end
69
+
70
+ if identifier.reaffirmation
71
+ parts << "reaff.#{identifier.reaffirmation}"
72
+ end
73
+
74
+ if identifier.revision_note
75
+ parts << "revnote.#{identifier.revision_note}"
76
+ end
77
+
78
+ if identifier.parenthetical_revision
79
+ parts << "prev.#{identifier.parenthetical_revision}"
80
+ end
81
+
82
+ languages = maybe(:languages)
83
+ if languages&.any?
84
+ lang_codes = languages.map(&:code).join(",")
85
+ parts << lang_codes
86
+ end
87
+
88
+ parts.join(":")
89
+ end
90
+
91
+ private
92
+
93
+ def special_identifier_type_component
94
+ if identifier.handbook
95
+ return "handbook"
96
+ end
97
+
98
+ if identifier.ptc_suffix
99
+ return "ptc"
100
+ end
101
+
102
+ if identifier.csa_number
103
+ return "csa"
104
+ end
105
+
106
+ class_name = identifier.class.name.to_s
107
+ case class_name
108
+ when /PTC/
109
+ "ptc"
110
+ when /Handbook/
111
+ "handbook"
112
+ end
113
+ end
114
+
115
+ def publisher_component
116
+ pub = "asme"
117
+
118
+ if identifier.publisher
119
+ p = identifier.publisher.to_s
120
+ pub = p.to_s.downcase
121
+ end
122
+
123
+ copubs = maybe(:copublishers)
124
+ if copubs&.any?
125
+ cp = copubs.map(&:to_s)
126
+ pub = "#{pub}-#{cp.join('-').downcase}"
127
+ end
128
+
129
+ pub
130
+ end
131
+ end
132
+ end
133
+ end
data/lib/pubid/asme.rb ADDED
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Asme
5
+ autoload :Builder, "#{__dir__}/asme/builder"
6
+ autoload :Components, "#{__dir__}/asme/components/code"
7
+ autoload :Identifier, "#{__dir__}/asme/identifier"
8
+ autoload :Identifiers, "#{__dir__}/asme/identifiers"
9
+ autoload :Parser, "#{__dir__}/asme/parser"
10
+ autoload :Scheme, "#{__dir__}/asme/scheme"
11
+ autoload :SingleIdentifier, "#{__dir__}/asme/single_identifier"
12
+ autoload :UrnGenerator, "#{__dir__}/asme/urn_generator"
13
+
14
+ def self.parse(str)
15
+ Identifier.parse(str)
16
+ end
17
+ end
18
+ end
19
+
20
+ # Register Uasme flavor with the registry
21
+ Pubid::Registry.register(:asme, Pubid::Asme)
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Astm
5
+ class Builder
6
+ def build(parsed_hash)
7
+ # Determine identifier class based on type
8
+ identifier_class = determine_identifier_class(parsed_hash)
9
+ identifier = identifier_class.new
10
+
11
+ # Build code component if present
12
+ if parsed_hash[:letter] || parsed_hash[:number]
13
+ identifier.code = build_code(parsed_hash)
14
+ end
15
+
16
+ # Set publisher
17
+ # Special case: handle "ISO/ASTMTR" type - split into publisher "ISO/ASTM" and type "TR"
18
+ if parsed_hash[:type]&.to_s == "ISO/ASTMTR"
19
+ identifier.publisher = "ISO/ASTM"
20
+ else
21
+ identifier.publisher = parsed_hash[:publisher].to_s if parsed_hash[:publisher]
22
+ identifier.publisher ||= "ASTM"
23
+ end
24
+
25
+ # Set year (convert 2-digit to 4-digit)
26
+ if parsed_hash[:year]
27
+ identifier.year = convert_year(parsed_hash[:year].to_s)
28
+ end
29
+
30
+ # Set format suffix with dash prefix
31
+ if parsed_hash[:format_suffix]
32
+ identifier.format_suffix = "-#{parsed_hash[:format_suffix]}"
33
+ end
34
+
35
+ # Type-specific attributes
36
+ build_type_specific_attributes(identifier, parsed_hash)
37
+
38
+ identifier
39
+ end
40
+
41
+ private
42
+
43
+ def determine_identifier_class(parsed_hash)
44
+ type = parsed_hash[:type]&.to_s
45
+
46
+ # Check for ISO/ASTM dual-published standards (5xxxx series)
47
+ # These are digit-only identifiers starting with "5"
48
+ # No explicit type, check if it's a digit-only number
49
+ if (type.nil? || type.empty?) && parsed_hash[:number] && !parsed_hash[:letter]
50
+ number_str = parsed_hash[:number].to_s
51
+ # If starts with "5", likely ISO/ASTM dual-published
52
+ if number_str.start_with?("5")
53
+ return Identifiers::IsoDualPublished
54
+ end
55
+
56
+ # Other digit-only numbers are still Standard
57
+ return Identifiers::Standard
58
+ end
59
+
60
+ case type
61
+ when "RR"
62
+ Identifiers::ResearchReport
63
+ when "MNL"
64
+ Identifiers::Manual
65
+ when "MONO"
66
+ Identifiers::Monograph
67
+ when "DS"
68
+ Identifiers::DataSeries
69
+ when "WK"
70
+ Identifiers::WorkInProgress
71
+ when "ADJ"
72
+ Identifiers::Adjunct
73
+ when "TR"
74
+ Identifiers::TechnicalReport
75
+ when "ISO/ASTMTR" # Handle ISO/ASTM Technical Report
76
+ Identifiers::TechnicalReport
77
+ else
78
+ # Default to Standard (A-G prefix)
79
+ Identifiers::Standard
80
+ end
81
+ end
82
+
83
+ def build_code(parsed_hash)
84
+ code = Components::Code.new
85
+ # Special case: for "TR" type with "ISO/ASTM" publisher, don't set letter
86
+ # as the "TR" is part of the type/identifier format, not the code letter
87
+ if parsed_hash[:letter] && !(parsed_hash[:type]&.to_s == "TR" && parsed_hash[:publisher]&.to_s&.start_with?("ISO/ASTM"))
88
+ code.letter = parsed_hash[:letter].to_s
89
+ end
90
+ code.number = parsed_hash[:number].to_s if parsed_hash[:number]
91
+ code.suffix = parsed_hash[:suffix].to_s if parsed_hash[:suffix]
92
+ code.subseries = parsed_hash[:subseries].to_s if parsed_hash[:subseries]
93
+ code.dual_m = true if parsed_hash[:dual_m]
94
+ code
95
+ end
96
+
97
+ def build_type_specific_attributes(identifier, parsed_hash)
98
+ # Research Report
99
+ if identifier.is_a?(Identifiers::ResearchReport) && parsed_hash[:committee]
100
+ identifier.committee = parsed_hash[:committee].to_s
101
+ end
102
+
103
+ # Manual
104
+ if identifier.is_a?(Identifiers::Manual)
105
+ identifier.edition = parsed_hash[:edition].to_s if parsed_hash[:edition]
106
+ identifier.supplement = true if parsed_hash[:supplement]
107
+ identifier.tp_designation = parsed_hash[:tp_designation].to_s if parsed_hash[:tp_designation]
108
+ end
109
+
110
+ # Monograph
111
+ if identifier.is_a?(Identifiers::Monograph) && parsed_hash[:edition]
112
+ identifier.edition = parsed_hash[:edition].to_s
113
+ end
114
+
115
+ # Data Series
116
+ if identifier.is_a?(Identifiers::DataSeries) && parsed_hash[:hol_suffix]
117
+ identifier.hol_suffix = true
118
+ end
119
+
120
+ # Adjunct
121
+ if identifier.is_a?(Identifiers::Adjunct)
122
+ identifier.designation = parsed_hash[:designation].to_s if parsed_hash[:designation]
123
+ identifier.ea_suffix = true if parsed_hash[:ea_suffix]
124
+ identifier.dvd_suffix = true if parsed_hash[:dvd_suffix]
125
+ end
126
+
127
+ # Standard-specific
128
+ if identifier.is_a?(Identifiers::Standard)
129
+ identifier.sub_year = parsed_hash[:sub_year].to_s if parsed_hash[:sub_year]
130
+ identifier.reapproval = parsed_hash[:reapproval].to_s if parsed_hash[:reapproval]
131
+ # Handle edition - can be from :edition_number (e1) or :edition (1ST)
132
+ # The parsed hash can have nested structure: {:edition=>{:edition_number=>"1"}} or {:edition=>"1ST"}
133
+ edition_data = parsed_hash[:edition]
134
+ if edition_data
135
+ if edition_data.is_a?(Hash)
136
+ # e-notation: {:edition_number=>"1"}
137
+ identifier.edition = edition_data[:edition_number].to_s if edition_data[:edition_number]
138
+ else
139
+ # Ordinal notation: "1ST"
140
+ identifier.edition = edition_data.to_s
141
+ end
142
+ end
143
+ end
144
+ end
145
+
146
+ def convert_year(year_str)
147
+ return year_str if year_str.length == 4
148
+
149
+ # 2-digit year conversion
150
+ year_int = year_str.to_i
151
+ if year_int <= 24
152
+ "20#{year_str}"
153
+ else
154
+ "19#{year_str}"
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end