pubid 1.15.17 → 2.0.0.pre.alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.adoc +2041 -53
  4. data/archived-gems/pubid-ccsds/update_codes.yaml +1 -0
  5. data/archived-gems/pubid-iec/stages.yaml +129 -0
  6. data/archived-gems/pubid-iec/update_codes.yaml +67 -0
  7. data/archived-gems/pubid-ieee/update_codes.yaml +104 -0
  8. data/archived-gems/pubid-iso/stages.yaml +106 -0
  9. data/archived-gems/pubid-iso/update_codes.yaml +4 -0
  10. data/archived-gems/pubid-itu/i18n.yaml +13 -0
  11. data/archived-gems/pubid-itu/series.yaml +42 -0
  12. data/archived-gems/pubid-nist/publishers.yaml +6 -0
  13. data/archived-gems/pubid-nist/series.yaml +121 -0
  14. data/archived-gems/pubid-nist/stages.yaml +16 -0
  15. data/archived-gems/pubid-nist/update_codes.yaml +93 -0
  16. data/archived-gems/pubid-plateau/update_codes.yaml +6 -0
  17. data/data/ccsds/update_codes.yaml +1 -0
  18. data/data/iec/update_codes.yaml +67 -0
  19. data/data/ieee/update_codes.yaml +104 -0
  20. data/data/iso/update_codes.yaml +21 -0
  21. data/data/nist/update_codes.yaml +87 -0
  22. data/data/plateau/update_codes.yaml +6 -0
  23. data/lib/pubid/amca/builder.rb +176 -0
  24. data/lib/pubid/amca/identifier.rb +18 -0
  25. data/lib/pubid/amca/identifiers/base.rb +64 -0
  26. data/lib/pubid/amca/identifiers/interpretation.rb +51 -0
  27. data/lib/pubid/amca/identifiers/publication.rb +47 -0
  28. data/lib/pubid/amca/identifiers/standard.rb +22 -0
  29. data/lib/pubid/amca/identifiers.rb +12 -0
  30. data/lib/pubid/amca/parser.rb +153 -0
  31. data/lib/pubid/amca/scheme.rb +16 -0
  32. data/lib/pubid/amca/single_identifier.rb +33 -0
  33. data/lib/pubid/amca/urn_generator.rb +50 -0
  34. data/lib/pubid/amca.rb +26 -0
  35. data/lib/pubid/ansi/builder.rb +52 -0
  36. data/lib/pubid/ansi/identifier.rb +13 -0
  37. data/lib/pubid/ansi/identifiers/american_national_standard.rb +12 -0
  38. data/lib/pubid/ansi/identifiers/standard.rb +16 -0
  39. data/lib/pubid/ansi/identifiers.rb +11 -0
  40. data/lib/pubid/ansi/parser.rb +91 -0
  41. data/lib/pubid/ansi/scheme.rb +15 -0
  42. data/lib/pubid/ansi/single_identifier.rb +45 -0
  43. data/lib/pubid/ansi/urn_generator.rb +76 -0
  44. data/lib/pubid/ansi.rb +27 -0
  45. data/lib/pubid/api/builder.rb +85 -0
  46. data/lib/pubid/api/components/code.rb +9 -0
  47. data/lib/pubid/api/identifier.rb +21 -0
  48. data/lib/pubid/api/identifiers/base.rb +24 -0
  49. data/lib/pubid/api/identifiers/bulletin.rb +15 -0
  50. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +15 -0
  51. data/lib/pubid/api/identifiers/mpms.rb +44 -0
  52. data/lib/pubid/api/identifiers/publication.rb +15 -0
  53. data/lib/pubid/api/identifiers/recommended_practice.rb +15 -0
  54. data/lib/pubid/api/identifiers/specification.rb +15 -0
  55. data/lib/pubid/api/identifiers/standard.rb +15 -0
  56. data/lib/pubid/api/identifiers/technical_report.rb +15 -0
  57. data/lib/pubid/api/identifiers/typeless_standard.rb +27 -0
  58. data/lib/pubid/api/parser.rb +140 -0
  59. data/lib/pubid/api/scheme.rb +66 -0
  60. data/lib/pubid/api/single_identifier.rb +46 -0
  61. data/lib/pubid/api/urn_generator.rb +41 -0
  62. data/lib/pubid/api.rb +17 -0
  63. data/lib/pubid/ashrae/builder.rb +498 -0
  64. data/lib/pubid/ashrae/identifier.rb +18 -0
  65. data/lib/pubid/ashrae/identifiers/addenda_package.rb +46 -0
  66. data/lib/pubid/ashrae/identifiers/addendum.rb +55 -0
  67. data/lib/pubid/ashrae/identifiers/base.rb +23 -0
  68. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +51 -0
  69. data/lib/pubid/ashrae/identifiers/errata.rb +40 -0
  70. data/lib/pubid/ashrae/identifiers/guideline.rb +38 -0
  71. data/lib/pubid/ashrae/identifiers/interpretation.rb +39 -0
  72. data/lib/pubid/ashrae/identifiers/standard.rb +38 -0
  73. data/lib/pubid/ashrae/identifiers.rb +16 -0
  74. data/lib/pubid/ashrae/parser.rb +724 -0
  75. data/lib/pubid/ashrae/scheme.rb +53 -0
  76. data/lib/pubid/ashrae/single_identifier.rb +23 -0
  77. data/lib/pubid/ashrae/supplement_identifier.rb +23 -0
  78. data/lib/pubid/ashrae/urn_generator.rb +59 -0
  79. data/lib/pubid/ashrae.rb +21 -0
  80. data/lib/pubid/asme/builder.rb +153 -0
  81. data/lib/pubid/asme/components/code.rb +18 -0
  82. data/lib/pubid/asme/identifier.rb +15 -0
  83. data/lib/pubid/asme/identifiers/base.rb +70 -0
  84. data/lib/pubid/asme/identifiers/standard.rb +12 -0
  85. data/lib/pubid/asme/identifiers.rb +10 -0
  86. data/lib/pubid/asme/parser.rb +308 -0
  87. data/lib/pubid/asme/scheme.rb +37 -0
  88. data/lib/pubid/asme/single_identifier.rb +29 -0
  89. data/lib/pubid/asme/urn_generator.rb +133 -0
  90. data/lib/pubid/asme.rb +21 -0
  91. data/lib/pubid/astm/builder.rb +159 -0
  92. data/lib/pubid/astm/components/code.rb +33 -0
  93. data/lib/pubid/astm/identifier.rb +15 -0
  94. data/lib/pubid/astm/identifiers/adjunct.rb +21 -0
  95. data/lib/pubid/astm/identifiers/base.rb +13 -0
  96. data/lib/pubid/astm/identifiers/data_series.rb +25 -0
  97. data/lib/pubid/astm/identifiers/iso_dual_published.rb +74 -0
  98. data/lib/pubid/astm/identifiers/manual.rb +40 -0
  99. data/lib/pubid/astm/identifiers/monograph.rb +25 -0
  100. data/lib/pubid/astm/identifiers/research_report.rb +18 -0
  101. data/lib/pubid/astm/identifiers/standard.rb +52 -0
  102. data/lib/pubid/astm/identifiers/technical_report.rb +23 -0
  103. data/lib/pubid/astm/identifiers/work_in_progress.rb +21 -0
  104. data/lib/pubid/astm/parser.rb +244 -0
  105. data/lib/pubid/astm/scheme.rb +55 -0
  106. data/lib/pubid/astm/single_identifier.rb +25 -0
  107. data/lib/pubid/astm/urn_generator.rb +99 -0
  108. data/lib/pubid/astm.rb +38 -0
  109. data/lib/pubid/bsi/builder.rb +1483 -0
  110. data/lib/pubid/bsi/components/code.rb +11 -0
  111. data/lib/pubid/bsi/components/date.rb +11 -0
  112. data/lib/pubid/bsi/components/publisher.rb +11 -0
  113. data/lib/pubid/bsi/components/type.rb +11 -0
  114. data/lib/pubid/bsi/identifier.rb +27 -0
  115. data/lib/pubid/bsi/identifiers/addendum_document.rb +64 -0
  116. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +95 -0
  117. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +82 -0
  118. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +118 -0
  119. data/lib/pubid/bsi/identifiers/amendment.rb +40 -0
  120. data/lib/pubid/bsi/identifiers/base.rb +11 -0
  121. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +27 -0
  122. data/lib/pubid/bsi/identifiers/british_standard.rb +33 -0
  123. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +114 -0
  124. data/lib/pubid/bsi/identifiers/committee_document.rb +51 -0
  125. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +152 -0
  126. data/lib/pubid/bsi/identifiers/corrigendum.rb +28 -0
  127. data/lib/pubid/bsi/identifiers/detailed_specification.rb +69 -0
  128. data/lib/pubid/bsi/identifiers/disc.rb +56 -0
  129. data/lib/pubid/bsi/identifiers/draft_document.rb +71 -0
  130. data/lib/pubid/bsi/identifiers/electronic_book.rb +52 -0
  131. data/lib/pubid/bsi/identifiers/expert_commentary.rb +47 -0
  132. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +82 -0
  133. data/lib/pubid/bsi/identifiers/flex.rb +61 -0
  134. data/lib/pubid/bsi/identifiers/handbook.rb +39 -0
  135. data/lib/pubid/bsi/identifiers/index.rb +62 -0
  136. data/lib/pubid/bsi/identifiers/method.rb +76 -0
  137. data/lib/pubid/bsi/identifiers/national_annex.rb +73 -0
  138. data/lib/pubid/bsi/identifiers/practice_guide.rb +27 -0
  139. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +79 -0
  140. data/lib/pubid/bsi/identifiers/published_document.rb +79 -0
  141. data/lib/pubid/bsi/identifiers/section.rb +62 -0
  142. data/lib/pubid/bsi/identifiers/set.rb +46 -0
  143. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +40 -0
  144. data/lib/pubid/bsi/identifiers/supplement_document.rb +51 -0
  145. data/lib/pubid/bsi/identifiers/supplementary_index.rb +81 -0
  146. data/lib/pubid/bsi/identifiers/technical_specification.rb +79 -0
  147. data/lib/pubid/bsi/identifiers/test_method.rb +67 -0
  148. data/lib/pubid/bsi/identifiers/value_added_publication.rb +52 -0
  149. data/lib/pubid/bsi/identifiers.rb +52 -0
  150. data/lib/pubid/bsi/model.rb +196 -0
  151. data/lib/pubid/bsi/parser.rb +659 -0
  152. data/lib/pubid/bsi/scheme.rb +243 -0
  153. data/lib/pubid/bsi/single_identifier.rb +129 -0
  154. data/lib/pubid/bsi/urn_generator.rb +84 -0
  155. data/lib/pubid/bsi.rb +32 -0
  156. data/lib/pubid/builder/base.rb +138 -0
  157. data/lib/pubid/bundled_identifier.rb +126 -0
  158. data/lib/pubid/ccsds/builder.rb +56 -0
  159. data/lib/pubid/ccsds/identifier.rb +16 -0
  160. data/lib/pubid/ccsds/identifiers/base.rb +78 -0
  161. data/lib/pubid/ccsds/identifiers/base_BASE_88929.rb +70 -0
  162. data/lib/pubid/ccsds/identifiers/corrigendum.rb +39 -0
  163. data/lib/pubid/ccsds/identifiers.rb +10 -0
  164. data/lib/pubid/ccsds/parser.rb +71 -0
  165. data/lib/pubid/ccsds/scheme.rb +57 -0
  166. data/lib/pubid/ccsds/single_identifier.rb +74 -0
  167. data/lib/pubid/ccsds/supplement_identifier.rb +33 -0
  168. data/lib/pubid/ccsds/urn_generator.rb +115 -0
  169. data/lib/pubid/ccsds.rb +21 -0
  170. data/lib/pubid/cen_cenelec/builder.rb +330 -0
  171. data/lib/pubid/cen_cenelec/identifier.rb +15 -0
  172. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +40 -0
  173. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +29 -0
  174. data/lib/pubid/cen_cenelec/identifiers/base.rb +75 -0
  175. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +28 -0
  176. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +27 -0
  177. data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +28 -0
  178. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +61 -0
  179. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +35 -0
  180. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +41 -0
  181. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +37 -0
  182. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +28 -0
  183. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +22 -0
  184. data/lib/pubid/cen_cenelec/identifiers/guide.rb +27 -0
  185. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +27 -0
  186. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +27 -0
  187. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +35 -0
  188. data/lib/pubid/cen_cenelec/identifiers.rb +32 -0
  189. data/lib/pubid/cen_cenelec/parser.rb +144 -0
  190. data/lib/pubid/cen_cenelec/scheme.rb +164 -0
  191. data/lib/pubid/cen_cenelec/single_identifier.rb +130 -0
  192. data/lib/pubid/cen_cenelec/supplement_identifier.rb +48 -0
  193. data/lib/pubid/cen_cenelec/urn_generator.rb +129 -0
  194. data/lib/pubid/cen_cenelec.rb +21 -0
  195. data/lib/pubid/cie/builder.rb +399 -0
  196. data/lib/pubid/cie/components/code.rb +72 -0
  197. data/lib/pubid/cie/components/language.rb +58 -0
  198. data/lib/pubid/cie/identifier.rb +18 -0
  199. data/lib/pubid/cie/identifiers/bundle.rb +20 -0
  200. data/lib/pubid/cie/identifiers/conference.rb +32 -0
  201. data/lib/pubid/cie/identifiers/corrigendum.rb +40 -0
  202. data/lib/pubid/cie/identifiers/dual_published.rb +41 -0
  203. data/lib/pubid/cie/identifiers/identical.rb +64 -0
  204. data/lib/pubid/cie/identifiers/joint_published.rb +52 -0
  205. data/lib/pubid/cie/identifiers/standard.rb +58 -0
  206. data/lib/pubid/cie/identifiers/supplement.rb +45 -0
  207. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +20 -0
  208. data/lib/pubid/cie/identifiers.rb +17 -0
  209. data/lib/pubid/cie/parser.rb +347 -0
  210. data/lib/pubid/cie/scheme.rb +64 -0
  211. data/lib/pubid/cie/single_identifier.rb +30 -0
  212. data/lib/pubid/cie/supplement_identifier.rb +26 -0
  213. data/lib/pubid/cie/urn_generator.rb +123 -0
  214. data/lib/pubid/cie.rb +28 -0
  215. data/lib/pubid/components/code.rb +33 -0
  216. data/lib/pubid/components/date.rb +49 -0
  217. data/lib/pubid/components/edition.rb +32 -0
  218. data/lib/pubid/components/language.rb +37 -0
  219. data/lib/pubid/components/locality.rb +10 -0
  220. data/lib/pubid/components/publisher.rb +36 -0
  221. data/lib/pubid/components/stage.rb +54 -0
  222. data/lib/pubid/components/type.rb +58 -0
  223. data/lib/pubid/components/typed_stage.rb +55 -0
  224. data/lib/pubid/components.rb +15 -0
  225. data/lib/pubid/core/pattern_doc_generator.rb +272 -0
  226. data/lib/pubid/core/update_codes.rb +77 -0
  227. data/lib/pubid/core.rb +8 -0
  228. data/lib/pubid/csa/builder.rb +671 -0
  229. data/lib/pubid/csa/components/code.rb +9 -0
  230. data/lib/pubid/csa/components.rb +9 -0
  231. data/lib/pubid/csa/composite_identifier.rb +27 -0
  232. data/lib/pubid/csa/identifier.rb +457 -0
  233. data/lib/pubid/csa/identifiers/base.rb +133 -0
  234. data/lib/pubid/csa/identifiers/bundled.rb +125 -0
  235. data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
  236. data/lib/pubid/csa/identifiers/cec.rb +129 -0
  237. data/lib/pubid/csa/identifiers/combined.rb +130 -0
  238. data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
  239. data/lib/pubid/csa/identifiers/package.rb +65 -0
  240. data/lib/pubid/csa/identifiers/series.rb +127 -0
  241. data/lib/pubid/csa/identifiers/standard.rb +10 -0
  242. data/lib/pubid/csa/identifiers.rb +17 -0
  243. data/lib/pubid/csa/parser.rb +445 -0
  244. data/lib/pubid/csa/scheme.rb +44 -0
  245. data/lib/pubid/csa/single_identifier.rb +30 -0
  246. data/lib/pubid/csa/urn_generator.rb +80 -0
  247. data/lib/pubid/csa/wrapper_identifier.rb +31 -0
  248. data/lib/pubid/csa.rb +25 -0
  249. data/lib/pubid/etsi/builder.rb +133 -0
  250. data/lib/pubid/etsi/components/code.rb +42 -0
  251. data/lib/pubid/etsi/components/version.rb +37 -0
  252. data/lib/pubid/etsi/components.rb +10 -0
  253. data/lib/pubid/etsi/identifier.rb +14 -0
  254. data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
  255. data/lib/pubid/etsi/identifiers/base.rb +38 -0
  256. data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
  257. data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
  258. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
  259. data/lib/pubid/etsi/identifiers.rb +14 -0
  260. data/lib/pubid/etsi/parser.rb +133 -0
  261. data/lib/pubid/etsi/scheme.rb +42 -0
  262. data/lib/pubid/etsi/urn_generator.rb +76 -0
  263. data/lib/pubid/etsi.rb +21 -0
  264. data/lib/pubid/export/auditor.rb +89 -0
  265. data/lib/pubid/export/data_class_exporter.rb +59 -0
  266. data/lib/pubid/export/exporter.rb +74 -0
  267. data/lib/pubid/export/flavor_exporter.rb +402 -0
  268. data/lib/pubid/export/ieee_exporter.rb +78 -0
  269. data/lib/pubid/export/itu_exporter.rb +66 -0
  270. data/lib/pubid/export/nist_exporter.rb +64 -0
  271. data/lib/pubid/export/registry_exporter.rb +90 -0
  272. data/lib/pubid/export/result.rb +97 -0
  273. data/lib/pubid/export/scheme_exporter.rb +70 -0
  274. data/lib/pubid/export.rb +18 -0
  275. data/lib/pubid/format_detector.rb +16 -0
  276. data/lib/pubid/format_registry.rb +42 -0
  277. data/lib/pubid/identifier.rb +235 -0
  278. data/lib/pubid/identifier_metadata.rb +148 -0
  279. data/lib/pubid/identifier_registry.rb +198 -0
  280. data/lib/pubid/idf/builder.rb +82 -0
  281. data/lib/pubid/idf/identifier.rb +69 -0
  282. data/lib/pubid/idf/identifiers/amendment.rb +27 -0
  283. data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
  284. data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
  285. data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
  286. data/lib/pubid/idf/identifiers.rb +13 -0
  287. data/lib/pubid/idf/parser.rb +143 -0
  288. data/lib/pubid/idf/scheme.rb +61 -0
  289. data/lib/pubid/idf/single_identifier.rb +19 -0
  290. data/lib/pubid/idf/supplement_identifier.rb +43 -0
  291. data/lib/pubid/idf/urn_generator.rb +84 -0
  292. data/lib/pubid/idf.rb +25 -0
  293. data/lib/pubid/iec/builder.rb +457 -0
  294. data/lib/pubid/iec/components/code.rb +59 -0
  295. data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
  296. data/lib/pubid/iec/components/publisher.rb +35 -0
  297. data/lib/pubid/iec/components/sheet.rb +32 -0
  298. data/lib/pubid/iec/components/trf_info.rb +38 -0
  299. data/lib/pubid/iec/components/vap_suffix.rb +41 -0
  300. data/lib/pubid/iec/identifier.rb +21 -0
  301. data/lib/pubid/iec/identifiers/amendment.rb +94 -0
  302. data/lib/pubid/iec/identifiers/base.rb +78 -0
  303. data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
  304. data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
  305. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +86 -0
  306. data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
  307. data/lib/pubid/iec/identifiers/fragment_identifier.rb +141 -0
  308. data/lib/pubid/iec/identifiers/guide.rb +104 -0
  309. data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
  310. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
  311. data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
  312. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
  313. data/lib/pubid/iec/identifiers/sheet_identifier.rb +66 -0
  314. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
  315. data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
  316. data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
  317. data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
  318. data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
  319. data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
  320. data/lib/pubid/iec/identifiers/vap_identifier.rb +77 -0
  321. data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
  322. data/lib/pubid/iec/identifiers/working_document.rb +96 -0
  323. data/lib/pubid/iec/parser.rb +412 -0
  324. data/lib/pubid/iec/rendering_style.rb +113 -0
  325. data/lib/pubid/iec/scheme.rb +71 -0
  326. data/lib/pubid/iec/single_identifier.rb +80 -0
  327. data/lib/pubid/iec/supplement_identifier.rb +161 -0
  328. data/lib/pubid/iec/urn_generator.rb +193 -0
  329. data/lib/pubid/iec/urn_parser.rb +289 -0
  330. data/lib/pubid/iec.rb +85 -0
  331. data/lib/pubid/ieee/aiee/builder.rb +71 -0
  332. data/lib/pubid/ieee/aiee/identifier.rb +105 -0
  333. data/lib/pubid/ieee/aiee/parser.rb +130 -0
  334. data/lib/pubid/ieee/aiee.rb +11 -0
  335. data/lib/pubid/ieee/builder.rb +1237 -0
  336. data/lib/pubid/ieee/components/code.rb +102 -0
  337. data/lib/pubid/ieee/components/draft.rb +93 -0
  338. data/lib/pubid/ieee/components/relationship.rb +157 -0
  339. data/lib/pubid/ieee/components/typed_stage.rb +100 -0
  340. data/lib/pubid/ieee/identifier.rb +13 -0
  341. data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
  342. data/lib/pubid/ieee/identifiers/base.rb +591 -0
  343. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
  344. data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
  345. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
  346. data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
  347. data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
  348. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
  349. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
  350. data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
  351. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
  352. data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
  353. data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
  354. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
  355. data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
  356. data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
  357. data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
  358. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
  359. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
  360. data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
  361. data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
  362. data/lib/pubid/ieee/identifiers/standard.rb +41 -0
  363. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
  364. data/lib/pubid/ieee/identifiers.rb +33 -0
  365. data/lib/pubid/ieee/ire/builder.rb +61 -0
  366. data/lib/pubid/ieee/ire/identifier.rb +58 -0
  367. data/lib/pubid/ieee/ire/parser.rb +91 -0
  368. data/lib/pubid/ieee/ire.rb +11 -0
  369. data/lib/pubid/ieee/nesc/builder.rb +101 -0
  370. data/lib/pubid/ieee/nesc/parser.rb +154 -0
  371. data/lib/pubid/ieee/nesc.rb +10 -0
  372. data/lib/pubid/ieee/parser.rb +1226 -0
  373. data/lib/pubid/ieee/scheme.rb +90 -0
  374. data/lib/pubid/ieee/typed_stages.rb +172 -0
  375. data/lib/pubid/ieee/urn_generator.rb +188 -0
  376. data/lib/pubid/ieee.rb +32 -0
  377. data/lib/pubid/ieee_debug.rb +31 -0
  378. data/lib/pubid/iho/builder.rb +37 -0
  379. data/lib/pubid/iho/identifier.rb +19 -0
  380. data/lib/pubid/iho/identifiers/base.rb +41 -0
  381. data/lib/pubid/iho/identifiers/bibliographic.rb +20 -0
  382. data/lib/pubid/iho/identifiers/circular_letter.rb +19 -0
  383. data/lib/pubid/iho/identifiers/miscellaneous.rb +20 -0
  384. data/lib/pubid/iho/identifiers/publication.rb +19 -0
  385. data/lib/pubid/iho/identifiers/standard.rb +19 -0
  386. data/lib/pubid/iho/identifiers.rb +14 -0
  387. data/lib/pubid/iho/parser.rb +68 -0
  388. data/lib/pubid/iho/scheme.rb +29 -0
  389. data/lib/pubid/iho/urn_generator.rb +29 -0
  390. data/lib/pubid/iho.rb +21 -0
  391. data/lib/pubid/iso/builder.rb +305 -0
  392. data/lib/pubid/iso/bundled_identifier.rb +85 -0
  393. data/lib/pubid/iso/combined_identifier.rb +22 -0
  394. data/lib/pubid/iso/components/code.rb +36 -0
  395. data/lib/pubid/iso/components/publisher.rb +60 -0
  396. data/lib/pubid/iso/components.rb +12 -0
  397. data/lib/pubid/iso/format_resolver.rb +45 -0
  398. data/lib/pubid/iso/identifier.rb +69 -0
  399. data/lib/pubid/iso/identifiers/addendum.rb +104 -0
  400. data/lib/pubid/iso/identifiers/amendment.rb +128 -0
  401. data/lib/pubid/iso/identifiers/base.rb +115 -0
  402. data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
  403. data/lib/pubid/iso/identifiers/data.rb +76 -0
  404. data/lib/pubid/iso/identifiers/directives.rb +59 -0
  405. data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
  406. data/lib/pubid/iso/identifiers/extract.rb +30 -0
  407. data/lib/pubid/iso/identifiers/guide.rb +100 -0
  408. data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
  409. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
  410. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +89 -0
  411. data/lib/pubid/iso/identifiers/pas.rb +93 -0
  412. data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
  413. data/lib/pubid/iso/identifiers/supplement.rb +87 -0
  414. data/lib/pubid/iso/identifiers/tc_document.rb +108 -0
  415. data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
  416. data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
  417. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
  418. data/lib/pubid/iso/identifiers.rb +33 -0
  419. data/lib/pubid/iso/parser.rb +510 -0
  420. data/lib/pubid/iso/rendering_style.rb +120 -0
  421. data/lib/pubid/iso/scheme.rb +187 -0
  422. data/lib/pubid/iso/single_identifier.rb +61 -0
  423. data/lib/pubid/iso/supplement_identifier.rb +27 -0
  424. data/lib/pubid/iso/urn_generator.rb +412 -0
  425. data/lib/pubid/iso/urn_parser.rb +423 -0
  426. data/lib/pubid/iso/utilities.rb +86 -0
  427. data/lib/pubid/iso.rb +50 -0
  428. data/lib/pubid/itu/builder.rb +171 -0
  429. data/lib/pubid/itu/components/code.rb +39 -0
  430. data/lib/pubid/itu/components/sector.rb +35 -0
  431. data/lib/pubid/itu/components/series.rb +29 -0
  432. data/lib/pubid/itu/i18n.rb +9 -0
  433. data/lib/pubid/itu/i18n.yaml +30 -0
  434. data/lib/pubid/itu/identifier.rb +53 -0
  435. data/lib/pubid/itu/identifiers/amendment.rb +43 -0
  436. data/lib/pubid/itu/identifiers/annex.rb +74 -0
  437. data/lib/pubid/itu/identifiers/base.rb +154 -0
  438. data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
  439. data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
  440. data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
  441. data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
  442. data/lib/pubid/itu/identifiers/supplement.rb +46 -0
  443. data/lib/pubid/itu/identifiers.rb +16 -0
  444. data/lib/pubid/itu/model.rb +111 -0
  445. data/lib/pubid/itu/parser.rb +225 -0
  446. data/lib/pubid/itu/scheme.rb +174 -0
  447. data/lib/pubid/itu/urn_generator.rb +105 -0
  448. data/lib/pubid/itu.rb +22 -0
  449. data/lib/pubid/jcgm/builder.rb +88 -0
  450. data/lib/pubid/jcgm/components/publisher.rb +20 -0
  451. data/lib/pubid/jcgm/components.rb +9 -0
  452. data/lib/pubid/jcgm/identifier.rb +11 -0
  453. data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
  454. data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
  455. data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
  456. data/lib/pubid/jcgm/identifiers.rb +11 -0
  457. data/lib/pubid/jcgm/parser.rb +84 -0
  458. data/lib/pubid/jcgm/scheme.rb +60 -0
  459. data/lib/pubid/jcgm/single_identifier.rb +48 -0
  460. data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
  461. data/lib/pubid/jcgm/urn_generator.rb +110 -0
  462. data/lib/pubid/jcgm.rb +31 -0
  463. data/lib/pubid/jis/builder.rb +124 -0
  464. data/lib/pubid/jis/components/code.rb +59 -0
  465. data/lib/pubid/jis/components.rb +9 -0
  466. data/lib/pubid/jis/identifier.rb +18 -0
  467. data/lib/pubid/jis/identifiers/amendment.rb +16 -0
  468. data/lib/pubid/jis/identifiers/base.rb +72 -0
  469. data/lib/pubid/jis/identifiers/explanation.rb +22 -0
  470. data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
  471. data/lib/pubid/jis/identifiers/standard.rb +27 -0
  472. data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
  473. data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
  474. data/lib/pubid/jis/identifiers.rb +17 -0
  475. data/lib/pubid/jis/parser.rb +109 -0
  476. data/lib/pubid/jis/scheme.rb +49 -0
  477. data/lib/pubid/jis/single_identifier.rb +37 -0
  478. data/lib/pubid/jis/supplement_identifier.rb +47 -0
  479. data/lib/pubid/jis/urn_generator.rb +25 -0
  480. data/lib/pubid/jis.rb +23 -0
  481. data/lib/pubid/lutaml/no_store_registration.rb +30 -0
  482. data/lib/pubid/nist/builder.rb +2100 -0
  483. data/lib/pubid/nist/components/code.rb +38 -0
  484. data/lib/pubid/nist/components/edition.rb +118 -0
  485. data/lib/pubid/nist/components/issue_number.rb +28 -0
  486. data/lib/pubid/nist/components/part.rb +77 -0
  487. data/lib/pubid/nist/components/publisher.rb +24 -0
  488. data/lib/pubid/nist/components/stage.rb +53 -0
  489. data/lib/pubid/nist/components/supplement.rb +121 -0
  490. data/lib/pubid/nist/components/translation.rb +42 -0
  491. data/lib/pubid/nist/components/update.rb +103 -0
  492. data/lib/pubid/nist/components/version.rb +35 -0
  493. data/lib/pubid/nist/components/volume.rb +32 -0
  494. data/lib/pubid/nist/components.rb +19 -0
  495. data/lib/pubid/nist/configuration.rb +77 -0
  496. data/lib/pubid/nist/identifiers/base.rb +499 -0
  497. data/lib/pubid/nist/identifiers/circular.rb +68 -0
  498. data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
  499. data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
  500. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
  501. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
  502. data/lib/pubid/nist/identifiers/crpl_report.rb +135 -0
  503. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +94 -0
  504. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
  505. data/lib/pubid/nist/identifiers/handbook.rb +50 -0
  506. data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
  507. data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
  508. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
  509. data/lib/pubid/nist/identifiers/monograph.rb +69 -0
  510. data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
  511. data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
  512. data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
  513. data/lib/pubid/nist/identifiers/report.rb +68 -0
  514. data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
  515. data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
  516. data/lib/pubid/nist/identifiers.rb +33 -0
  517. data/lib/pubid/nist/parser.rb +1084 -0
  518. data/lib/pubid/nist/scheme.rb +199 -0
  519. data/lib/pubid/nist/supplement_identifier.rb +83 -0
  520. data/lib/pubid/nist/urn_generator.rb +127 -0
  521. data/lib/pubid/nist.rb +36 -0
  522. data/lib/pubid/oiml/builder.rb +189 -0
  523. data/lib/pubid/oiml/components/code.rb +20 -0
  524. data/lib/pubid/oiml/components.rb +9 -0
  525. data/lib/pubid/oiml/identifier.rb +11 -0
  526. data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
  527. data/lib/pubid/oiml/identifiers/annex.rb +62 -0
  528. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  529. data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
  530. data/lib/pubid/oiml/identifiers/document.rb +13 -0
  531. data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
  532. data/lib/pubid/oiml/identifiers/guide.rb +13 -0
  533. data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
  534. data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
  535. data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
  536. data/lib/pubid/oiml/identifiers.rb +18 -0
  537. data/lib/pubid/oiml/parser.rb +173 -0
  538. data/lib/pubid/oiml/scheme.rb +46 -0
  539. data/lib/pubid/oiml/single_identifier.rb +90 -0
  540. data/lib/pubid/oiml/supplement_identifier.rb +43 -0
  541. data/lib/pubid/oiml/urn_generator.rb +64 -0
  542. data/lib/pubid/oiml.rb +26 -0
  543. data/lib/pubid/parser/common_parse_methods.rb +13 -0
  544. data/lib/pubid/parser/common_parse_rules.rb +56 -0
  545. data/lib/pubid/parser.rb +8 -0
  546. data/lib/pubid/parsers/base.rb +11 -0
  547. data/lib/pubid/parsers/mr_string.rb +93 -0
  548. data/lib/pubid/plateau/builder.rb +50 -0
  549. data/lib/pubid/plateau/identifiers/annex.rb +16 -0
  550. data/lib/pubid/plateau/identifiers/base.rb +51 -0
  551. data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
  552. data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
  553. data/lib/pubid/plateau/identifiers.rb +12 -0
  554. data/lib/pubid/plateau/parser.rb +63 -0
  555. data/lib/pubid/plateau/scheme.rb +45 -0
  556. data/lib/pubid/plateau/supplement_identifier.rb +72 -0
  557. data/lib/pubid/plateau/urn_generator.rb +29 -0
  558. data/lib/pubid/plateau.rb +25 -0
  559. data/lib/pubid/renderers/base.rb +19 -0
  560. data/lib/pubid/renderers/directives_renderer.rb +62 -0
  561. data/lib/pubid/renderers/guide_renderer.rb +20 -0
  562. data/lib/pubid/renderers/human_readable.rb +58 -0
  563. data/lib/pubid/renderers/iwa_renderer.rb +16 -0
  564. data/lib/pubid/renderers/mr_string.rb +16 -0
  565. data/lib/pubid/renderers/supplement_renderer.rb +33 -0
  566. data/lib/pubid/renderers/urn.rb +11 -0
  567. data/lib/pubid/renderers.rb +14 -0
  568. data/lib/pubid/rendering/base.rb +73 -0
  569. data/lib/pubid/rendering/common.rb +211 -0
  570. data/lib/pubid/rendering/context.rb +156 -0
  571. data/lib/pubid/rendering/date.rb +27 -0
  572. data/lib/pubid/rendering/format.rb +25 -0
  573. data/lib/pubid/rendering/language.rb +21 -0
  574. data/lib/pubid/rendering/numbering.rb +24 -0
  575. data/lib/pubid/rendering/publisher.rb +25 -0
  576. data/lib/pubid/rendering/stage.rb +38 -0
  577. data/lib/pubid/rendering/supplement.rb +46 -0
  578. data/lib/pubid/rendering.rb +16 -0
  579. data/lib/pubid/sae/builder.rb +32 -0
  580. data/lib/pubid/sae/components/code.rb +9 -0
  581. data/lib/pubid/sae/components/date.rb +19 -0
  582. data/lib/pubid/sae/components/type.rb +19 -0
  583. data/lib/pubid/sae/components.rb +11 -0
  584. data/lib/pubid/sae/identifier.rb +14 -0
  585. data/lib/pubid/sae/identifiers/base.rb +42 -0
  586. data/lib/pubid/sae/identifiers.rb +9 -0
  587. data/lib/pubid/sae/parser.rb +55 -0
  588. data/lib/pubid/sae/scheme.rb +47 -0
  589. data/lib/pubid/sae/urn_generator.rb +38 -0
  590. data/lib/pubid/sae.rb +19 -0
  591. data/lib/pubid/scheme.rb +207 -0
  592. data/lib/pubid/urn_generator/base.rb +110 -0
  593. data/lib/pubid/utils/string_normalizer.rb +196 -0
  594. data/lib/pubid/utils.rb +7 -0
  595. data/lib/pubid/version.rb +3 -1
  596. data/lib/pubid.rb +137 -13
  597. data/lib/tasks/docs.rake +37 -0
  598. data/lib/tasks/export.rake +38 -0
  599. data/lib/tasks/website-data.json +7488 -0
  600. metadata +613 -171
  601. data/lib/pubid/registry.rb +0 -30
@@ -0,0 +1,510 @@
1
+ require "parslet"
2
+ # frozen_string_literal: true
3
+
4
+ module Pubid
5
+ module Iso
6
+ class Parser < Parslet::Parser
7
+ include ::Pubid::Parser::CommonParseRules
8
+ include ::Pubid::Parser::CommonParseMethods
9
+
10
+ DASH_CHARS = ["-", "‑", "‐"].freeze
11
+
12
+ # We need to sort by length to match longest first because that's how Parslet works
13
+ TYPED_STAGES = Pubid::Iso::Scheme.typed_stages
14
+ .map(&:abbr).flatten.sort_by(&:length).reverse
15
+ TYPED_STAGES_SUPPLEMENTS = Pubid::Iso::Scheme.supplement_typed_stages
16
+ .map(&:abbr).flatten.sort_by(&:length).reverse
17
+
18
+ root :identifier
19
+
20
+ # TC documents must come first since they start with "ISO/"
21
+ # and we need to distinguish them from regular ISO/IEC identifiers
22
+ rule(:identifier) do
23
+ nsb_iso_identifier |
24
+ tc_document |
25
+ directives_identifiers |
26
+ jcgm_identifier |
27
+ iso_r_supplement_identifier |
28
+ iso_r_identifier |
29
+ supplement_supplement_supplement_identifier |
30
+ supplement_supplement_identifier |
31
+ supplement_identifier |
32
+ joint_identifier |
33
+ identifier_copublishers
34
+ end
35
+
36
+ # JCGM identifiers (Joint Committee for Guides in Metrology)
37
+ # JCGM 200:2008(F)
38
+ rule(:jcgm_identifier) do
39
+ str("JCGM").as(:publisher) >> space >>
40
+ second_part >> third_part
41
+ end
42
+
43
+ # TC Document: ISO/TC 184/SC 4/WG 3 N 123
44
+ # ISO/TC 184 N 100
45
+ # ISO/JTC 1 N 456
46
+ # ISO/TC 184/SC 4 N 789 (TC and SC only, no WG)
47
+ rule(:tc_document) do
48
+ prefix_sole_publisher >> str("/") >> tc_type >> space >> tc_number.as(:tc_number) >>
49
+ tc_subcommittee_part.maybe >>
50
+ space >> str("N") >> space? >> digits.as(:number) >>
51
+ (str(":") >> year_digits.as(:year)).maybe
52
+ end
53
+
54
+ rule(:tc_subcommittee_part) do
55
+ # Full path: TC/SC 4/WG 3
56
+ (str("/") >> sc_type >> space >> digits.as(:sc_number) >> str("/") >>
57
+ wg_type >> space >> digits.as(:wg_number)) |
58
+ # TC and SC only: TC/SC 4 N 789
59
+ (str("/") >> sc_type >> space >> digits.as(:sc_number))
60
+ end
61
+
62
+ rule(:tc_type) do
63
+ array_to_str(Identifiers::TcDocument::TC_TYPES).as(:tc_type)
64
+ end
65
+
66
+ rule(:sc_type) do
67
+ str("SC").as(:sc_type)
68
+ end
69
+
70
+ rule(:wg_type) do
71
+ array_to_str(Identifiers::TcDocument::WG_TYPES).as(:wg_type)
72
+ end
73
+
74
+ rule(:tc_number) do
75
+ digits
76
+ end
77
+
78
+ # ISO/R 947:1969 (legacy Recommendation without supplement)
79
+ rule(:iso_r_identifier) do
80
+ str("ISO/R").as(:iso_r_prefix) >> space >>
81
+ iso_r_second_part >> third_part
82
+ end
83
+
84
+ # ISO/R 947:1969/Add 1:1969 (legacy Recommendation with supplement)
85
+ # Also handles: ISO/R 91-1970 — Addendum 1 (dash for year, em-dash + word)
86
+ rule(:iso_r_supplement_identifier) do
87
+ (
88
+ str("ISO/R").as(:iso_r_prefix) >> space >> iso_r_second_part
89
+ ).as(:base_identifier) >>
90
+ iso_r_supplement_separator >>
91
+ supplement_type_with_stage >>
92
+ space? >> second_part >> third_part
93
+ end
94
+
95
+ # ISO/R supplements can use "/" or em-dash "—" or " - " as separator
96
+ rule(:iso_r_supplement_separator) do
97
+ str("/") | (space? >> str("—") >> space?) | (space >> str("-") >> space)
98
+ end
99
+
100
+ # Special second_part for ISO/R that treats dash as date separator only
101
+ rule(:iso_r_second_part) do
102
+ number.as(:number_with_part) >>
103
+ stage_iteration.maybe >>
104
+ space? >> date.maybe
105
+ end
106
+
107
+ # ISO 8601-1:2019
108
+ # ISO/R 947:1969 (legacy Recommendation format)
109
+ rule(:prefix_sole_publisher) do
110
+ (str("ISO") | str("IEC")).as(:publisher)
111
+ end
112
+
113
+ # ISO/SAE PAS 22736:2021
114
+ # ISO/R 947:1969 (legacy Recommendation - special handling)
115
+ rule(:prefix_with_copublishers) do
116
+ # Try ISO/R first (must be followed by space + number to avoid confusion with copublishers)
117
+ (str("ISO/R").as(:iso_r_prefix) >> space) |
118
+ # Otherwise normal publisher with optional copublishers
119
+ (prefix_sole_publisher >> space? >> copublishers.maybe)
120
+ end
121
+
122
+ ORGANIZATIONS = %w[
123
+ ISO IEC IEEE CIW SAE CIE ASME ASTM OECD ISO HL7 CEI UNDP
124
+ ].freeze
125
+ rule(:copublishers) do
126
+ (str("/") >> space? >> array_to_str(ORGANIZATIONS).as(:copublisher)).repeat.as(:copublishers)
127
+ end
128
+
129
+ rule(:number_with_part) do
130
+ (number >> part_and_subpart.maybe).as(:number_with_part)
131
+ end
132
+
133
+ rule(:number) do
134
+ match('\d').repeat(1, 5)
135
+ end
136
+
137
+ rule(:date) do
138
+ # :2005-02
139
+ (str(":") | dash) >>
140
+ (year_digits >>
141
+ (dash >> month_digits).maybe >>
142
+ (dash >> day_digits).maybe
143
+ ).as(:date).maybe
144
+ end
145
+
146
+ rule(:part_and_subpart) do
147
+ # Modern parts
148
+ # ISO 105-A01:1989
149
+ # ISO/IEC/IEEE 8802-1AB
150
+ # ISO/IEC TR 29110-5-1-1
151
+
152
+ # Legacy parts
153
+ # ISO 31/0-1974
154
+ # ISO 105/F (also known as ISO 105-F)
155
+ # ISO 5843/6 (also known as ISO 5843-6)
156
+
157
+ # Modern parts can have subparts using dash
158
+ # the "space?" needed to handle "ISO/TS 10303- 1751:2014"
159
+ (
160
+ dash >> space? >>
161
+ # matches a part
162
+ match('\w').repeat(1) >>
163
+ # matches a subpart, e.g. "A01" or "1-2" (yes we treat {5}-{1-1} as part and subpart)
164
+ (dash >> match('\w').repeat(1)).repeat.maybe
165
+ ) |
166
+ # Legacy parts do not have subparts
167
+ # the "/" to handle old style parts: "ISO 5843/6"
168
+ # Guard: don't match supplement type names (Amd, Cor, Sup, etc.)
169
+ (
170
+ str("/") >> space? >>
171
+ supplement_type_with_stage.absent? >>
172
+ # matches a part
173
+ match('\w').repeat(1)
174
+ )
175
+ end
176
+
177
+ rule(:all_parts) do
178
+ str("(all parts)").as(:all_parts)
179
+ end
180
+
181
+ rule(:type_with_stage) do
182
+ # "DTR"
183
+ # "PRF PAS"
184
+ # "PRF"
185
+ # "PAS"
186
+ array_to_str(TYPED_STAGES).as(:type_with_stage) >>
187
+ (match('\d').as(:stage_iteration) >> space).maybe
188
+ end
189
+
190
+ rule(:language) do
191
+ # ISO 8601-1:2019(en,fr)
192
+ # ISO 8601-1:2019(E/F)
193
+ str("(") >>
194
+ (
195
+ # parse 2-char language codes: ru,en,fr,de,ar,es
196
+ (match["a-z"].repeat(1) >> str(",").maybe) |
197
+ # parse single language codes: R/E/F or R,E,F
198
+ (match["EFARDS"] >> (str("/") | str(",")).maybe)
199
+ ).repeat.as(:languages) >>
200
+ str(")")
201
+ end
202
+
203
+ EDITION_STRINGS = %w[Edition Ed. ED Ed].freeze
204
+ rule(:edition) do
205
+ # Capture the entire edition text for exact reproduction
206
+ (array_to_str(EDITION_STRINGS) >> space? >> digits.maybe).as(:edition)
207
+ end
208
+
209
+ rule(:stage_iteration) do
210
+ # "ISO 11243.1"
211
+ str(".") >> match('\d').as(:stage_iteration)
212
+ end
213
+
214
+ # Modern identifiers use ':' as year identifier, e.g. "ISO 8601-1:2019"
215
+ # Legacy identifiers use '-' as year identifier, e.g. "ISO 31/0-1974"
216
+ rule(:second_part) do
217
+ number_with_part >>
218
+ stage_iteration.maybe >>
219
+ space? >> date.maybe
220
+ end
221
+
222
+ rule(:third_part_edition) do
223
+ space? >> edition.maybe
224
+ end
225
+
226
+ rule(:third_part) do
227
+ # End of the identifier, we can have language, edition, or all parts
228
+ third_part_edition >> language.maybe >> space? >> all_parts.maybe
229
+ end
230
+
231
+ # prefix sole or copublishers with type and stage
232
+ # ISO/WD TR 23642
233
+ # ISO/NP TS 20594-1
234
+ # ISO/PRF PAS 22596
235
+ # ISO/ASTM DTR 52905
236
+ # ISO/IEC WD TS 25025
237
+ #
238
+ ## SUPPORTED ABERRATION: ISO TR 16401-2
239
+ ## SUPPORTED ABERRATION: ISO/IEC/TS 24192-1
240
+ rule(:identifier_copublishers) do
241
+ identifier_copublishers_no_third >> third_part
242
+ end
243
+
244
+ # TODO: Support parsing Russian style identifiers
245
+ rule(:guide_prefix) do
246
+ str("Guide") | str("GUIDE") # | str("Руководство") | str("Руководства")
247
+ end
248
+
249
+ rule(:identifier_copublishers_no_third) do
250
+ # Guide ISO/CEI 51:1999
251
+ (guide_prefix.as(:type_with_stage_fr) >> space).maybe >>
252
+ # maybe prefix_with_copublishers to handle IWA
253
+ prefix_with_copublishers.maybe >> space? >> str("/").maybe >>
254
+ type_with_stage.maybe >>
255
+ space.maybe >>
256
+ second_part >> third_part_edition
257
+ end
258
+
259
+ # For joint identifiers, we do not treat it as a supplementary identifier
260
+ # (hence not a base_identifier)
261
+ # ISO only supports IDF in joint identifiers
262
+ # ISO 5537|IDF 26
263
+ # ISO 17678|IDF 202:2010
264
+ # ISO/TS 4985:2023 | IDF/RM 255
265
+ # ISO 4214:2022 | IDF 254:2022
266
+ rule(:joint_identifier) do
267
+ identifier_copublishers_no_third.as(:base_identifier) >>
268
+ space? >> str("|") >> space? >>
269
+ scope { idf_identifier }.as(:joint_identifier)
270
+ end
271
+
272
+ rule(:idf_identifier) do
273
+ Idf::Parser.new.identifier
274
+ end
275
+
276
+ # NSB ISO identifiers - National Body prefixed ISO identifiers
277
+ # FprISO 105-A03
278
+ # FprISO/IEC 17029
279
+ # WD/ISO 10360-2
280
+ # WD/ISO 10360-5:2000
281
+ rule(:nsb_iso_identifier) do
282
+ # FprISO, FprISO/IEC - stage prefix directly attached to publisher
283
+ (str("Fpr").as(:nsb_stage) >>
284
+ prefix_sole_publisher >> space? >> copublishers.maybe >>
285
+ space.maybe >>
286
+ type_with_stage.maybe >>
287
+ space.maybe >>
288
+ second_part >> third_part) |
289
+ # WD/ISO - stage prefix with slash before publisher
290
+ (str("WD").as(:nsb_stage) >> str("/") >>
291
+ prefix_sole_publisher >> space? >> copublishers.maybe >>
292
+ space.maybe >>
293
+ type_with_stage.maybe >>
294
+ space.maybe >>
295
+ second_part >> third_part)
296
+ end
297
+
298
+ # TODO: Do something with NSB ISO identifiers like "FprISO", "WD/ISO"
299
+ # Guide ISO/CEI 51:1999
300
+ # FprISO 105-A03
301
+ # FprISO/IEC 17029
302
+ # WD/ISO 10360-5:2000
303
+ # ISO 4918:2016+A1:2018
304
+ # rule(:nsb_iso_identifier) do
305
+ # str("Fpr").as(:stage).maybe >>
306
+ # # Withdrawn e.g: WD/ISO 10360-5:2000
307
+ # str("WD/").maybe >>
308
+ # # for French and Russian PubIDs starting with Guide type
309
+ # (guide_prefix.as(:type) >> space).maybe >>
310
+ # (stage.as(:stage) >> space).maybe >>
311
+ # (typed_stage.as(:stage) >> space).maybe >>
312
+ # (originator >> (space | str("/"))).maybe >>
313
+ # (tc_document_body | std_document_body | (dir_document_body >>
314
+ # (str(" + ") >> (originator >> space >> dir_document_body).as(:dir_joint_document)).maybe))
315
+ # end
316
+
317
+ rule(:supplement_type_with_stage) do
318
+ # "DAM"
319
+ # "NP Amd"
320
+ array_to_str(TYPED_STAGES_SUPPLEMENTS).as(:type_with_stage)
321
+ end
322
+
323
+ # ISO 8601-1:2019/Amd 2:2024
324
+ # ISO/IEC 10646-1:1993/pDCOR.2 (legacy dot-prefixed format)
325
+ rule(:supplement_identifier_no_third) do
326
+ identifier_copublishers_no_third.as(:base_identifier) >>
327
+ str("/") >> supplement_type_with_stage >>
328
+ ((space? >> second_part) | (str(".") >> digits.as(:number)) | (space? >> date))
329
+ end
330
+
331
+ rule(:supplement_identifier) do
332
+ supplement_identifier_no_third >> third_part
333
+ end
334
+
335
+ # ISO/IEC 13818-1:2015/Amd 3:2016/Cor 1:2017
336
+ # ISO/IEC 19794-7:2014/Amd 1:2015/CD Cor 1
337
+ # ISO/IEC 10646-1:1993/pDCOR.2 (legacy dot-prefixed format)
338
+ rule(:supplement_supplement_identifier) do
339
+ supplement_identifier_no_third.as(:base_identifier) >>
340
+ str("/") >> supplement_type_with_stage >>
341
+ ((space? >> second_part >> third_part) | (str(".") >> digits.as(:number) >> third_part))
342
+ end
343
+
344
+ # ISO 12345:2020/Amd 1:2021/Cor 1:2022/Amd 2:2023 (three-level supplement)
345
+ rule(:supplement_supplement_supplement_identifier) do
346
+ supplement_supplement_identifier.as(:base_identifier) >>
347
+ str("/") >> supplement_type_with_stage >>
348
+ ((space? >> second_part >> third_part) | (str(".") >> digits.as(:number) >> third_part))
349
+ end
350
+
351
+ # ISO/IEC DIR
352
+ # ISO/IEC DIR 1
353
+ # ISO/IEC DIR 2:2022
354
+ rule(:directives_identifier) do
355
+ directives_identifier_no_third >> third_part.maybe >> space? >> date.maybe
356
+ end
357
+
358
+ # ISO/IEC JTC 1 DIR (JTC 1 Directives)
359
+ rule(:directives_publisher_subgroup) do
360
+ str("JTC 1").as(:subgroup)
361
+ end
362
+
363
+ # Special number_with_part rule for Directives to handle variants
364
+ # We treat the variant as `part` of the number_with_part
365
+ rule(:directives_number_with_part) do
366
+ (number >> directives_part_and_subpart.maybe).as(:number_with_part)
367
+ end
368
+
369
+ # ISO/IEC DIR 1 IEC (IEC version of the ISO/IEC DIR 1)
370
+ # ISO/IEC DIR 2 ISO:2022 (ISO version of the ISO/IEC DIR 2)
371
+ # But NOT: ISO/IEC DIR 1 ISO SUP:2022 (ISO is supplement publisher)
372
+ # "1 IEC"
373
+ # "2 ISO"
374
+ rule(:directives_part_and_subpart) do
375
+ # Only match ISO/IEC if NOT followed by "/" (dual publisher) or supplement keywords
376
+ space >> (str("ISO") | str("IEC")) >> str("/").absent? >> (space >> str("SUP")).absent?
377
+ end
378
+
379
+ DIRECTIVES_TYPED_STAGES = Identifiers::Directives::TYPED_STAGES.map(&:abbr).flatten.sort_by(&:length).reverse
380
+ rule(:directives_identifier_no_third) do
381
+ prefix_with_copublishers >> space >>
382
+ (directives_publisher_subgroup >> space).maybe >>
383
+ array_to_str(DIRECTIVES_TYPED_STAGES).as(:type_with_stage) >>
384
+ (
385
+ (space >> directives_number_with_part).maybe >>
386
+ (str(":") >> date).maybe
387
+ ).maybe
388
+ end
389
+
390
+ rule(:directives_supplement_identifier) do
391
+ directives_identifier_no_third.as(:base_identifier) >> space? >> directives_supplement_part
392
+ end
393
+
394
+ DIRECTIVES_SUPPLEMENTS_TYPED_STAGES = Identifiers::DirectivesSupplement::TYPED_STAGES.map(&:abbr).flatten.sort_by(&:length).reverse
395
+
396
+ rule(:directives_supplement_part_no_third) do
397
+ # ISO/IEC DIR 1 ISO SUP
398
+ # ISO/IEC DIR 2 ISO SUP:2022
399
+ # ISO/IEC DIR JTC 1 SUP:2021
400
+ # ISO/IEC Directives, Part 1 -- Consolidated ISO Supplement
401
+ (space? >> str("--") >> space? >> str("Consolidated") >> space).maybe >>
402
+ (str("ISO/IEC") | str("ISO") | str("IEC") | str("JTC 1")).as(:publisher) >>
403
+ (space >> array_to_str(DIRECTIVES_SUPPLEMENTS_TYPED_STAGES).as(:type_with_stage)) >>
404
+ date.maybe
405
+ end
406
+
407
+ rule(:directives_supplement_part) do
408
+ directives_supplement_part_no_third >> third_part.maybe
409
+ end
410
+
411
+ # ISO/IEC DIR 1 + IEC SUP:2016-05
412
+ # ISO/IEC DIR 1:2022 + IEC SUP:2022
413
+ rule(:directives_bundled_identifier) do
414
+ (
415
+ directives_identifier_no_third >>
416
+ (third_part >> space?).maybe >>
417
+ (date >> space?).maybe
418
+ ).as(:base_document) >>
419
+ (
420
+ str("+ ") >>
421
+ directives_supplement_part_no_third.as(:supplement)
422
+ ).repeat(1).as(:supplements)
423
+ end
424
+
425
+ rule(:directives_identifiers) do
426
+ directives_bundled_identifier |
427
+ directives_supplement_identifier |
428
+ directives_identifier
429
+ end
430
+
431
+ rule(:dash) do
432
+ DASH_CHARS.map { |char| str(char) }.reduce(:|)
433
+ end
434
+
435
+ # rule(:tctype) do
436
+ # # tc-types
437
+ # array_to_str(TCTYPES)
438
+ # end
439
+
440
+ # rule(:sctype) do
441
+ # str("SC")
442
+ # end
443
+
444
+ # rule(:wgtype) do
445
+ # array_to_str(WGTYPES)
446
+ # end
447
+
448
+ # rule(:roman_numerals) do
449
+ # str("CD").absent? >> array_to_str(%w[I V X L C D M]).repeat(1).as(:roman_numerals)
450
+ # end
451
+
452
+ # rule(:part_matcher) do
453
+ # year_digits.absent? >>
454
+ # supplements.absent? >>
455
+ # staged_addenda.absent? >> ((roman_numerals >> digits.absent?) | match['[\dA-Z]'].repeat(1)).as(:part)
456
+ # end
457
+
458
+ # rule(:supplement) do
459
+ # ((str("/") | space).maybe >>
460
+ # (((stage.as(:typed_stage) >> space).maybe >> supplements.as(:type)) |
461
+ # staged_supplement.as(:typed_stage)) >>
462
+ # (space | str(".")).repeat(1).maybe >>
463
+ # digits.as(:number).maybe >>
464
+ # (str(".") >> digits.as(:iteration)).maybe >>
465
+ # ((str(":") | dash) >> digits.as(:year)).maybe).repeat(1).as(:supplements)
466
+ # end
467
+
468
+ # # Parse technical committee documents
469
+ # rule(:tc_document_body) do
470
+ # (tctype.as(:tctype) >> str("/").maybe).repeat >> space >> digits.as(:tcnumber) >>
471
+ # (str("/") >> (
472
+ # ((sctype.as(:sctype) >> space >> digits.as(:scnumber) >> str("/")).maybe >>
473
+ # wgtype.as(:wgtype) >> space >> digits.as(:wgnumber)) |
474
+ # (sctype.as(:sctype) >> (space | str("/") >> wgtype.as(:wgtype) >> space) >> digits.as(:scnumber))
475
+ # )).maybe >>
476
+ # space >> str("N") >> space? >> digits.as(:number)
477
+ # end
478
+
479
+ # rule(:dir_supplement_edition) do
480
+ # space >> (str("Edition") | str("Ed")) >> space >> digits.as(:edition)
481
+ # end
482
+
483
+ # rule(:dir_document_body) do
484
+ # ((str("DIR") | str("Directives Part") | str("Directives, Part") | str("Directives,")).as(:type) >> space).maybe >>
485
+ # (str("JTC").as(:dirtype) >> space).maybe >>
486
+ # (digits.as(:number) >> (str(":") >> year).maybe).maybe >>
487
+ # (space >> str("DIR").as(:jtc_dir) >> (str(":") >> year).maybe).maybe >>
488
+ # (str(" -- Consolidated").maybe >> (str("").as(:mark) >> space? >>
489
+ # (organization.as(:publisher) >> space?).maybe >>
490
+ # array_to_str(DIR_SUPPLEMENTS) >> (str(":") >> (year >> (dash >> month_digits.as(:month)).maybe)).maybe >>
491
+ # dir_supplement_edition.maybe).repeat(1).as(:supplements)).maybe >>
492
+ # # parse identifiers with publisher at the end, e.g. "ISO/IEC DIR 2 ISO"
493
+ # (space >> organization.as(:publisher) >> (str(":") >> year).maybe).as(:edition).maybe
494
+ # end
495
+
496
+ # rule(:identifier) do
497
+ # str("Fpr").as(:stage).maybe >>
498
+ # # Withdrawn e.g: WD/ISO 10360-5:2000
499
+ # str("WD/").maybe >>
500
+ # # for French and Russian PubIDs starting with Guide type
501
+ # (guide_prefix.as(:type) >> space).maybe >>
502
+ # (stage.as(:stage) >> space).maybe >>
503
+ # (typed_stage.as(:stage) >> space).maybe >>
504
+ # (originator >> (space | str("/"))).maybe >>
505
+ # (tc_document_body | std_document_body | (dir_document_body >>
506
+ # (str(" + ") >> (originator >> space >> dir_document_body).as(:dir_joint_document)).maybe))
507
+ # end
508
+ end
509
+ end
510
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iso
5
+ # Base class for rendering styles using Strategy pattern
6
+ # Each identifier stores its own rendering_style which knows how to render it
7
+ class RenderingStyle
8
+ attr_reader :with_language_code, :stage_format_long, :with_date
9
+
10
+ def initialize(with_language_code:, stage_format_long:, with_date:)
11
+ @with_language_code = with_language_code
12
+ @stage_format_long = stage_format_long
13
+ @with_date = with_date
14
+ end
15
+
16
+ # Render the identifier according to this style
17
+ # Subclasses should override if needed
18
+ def render(identifier, with_edition: false)
19
+ parts = []
20
+
21
+ # Publisher portion
22
+ parts << identifier.publisher_portion(
23
+ lang: :en,
24
+ stage_format_long: stage_format_long,
25
+ )
26
+
27
+ # Number portion
28
+ parts << identifier.number_portion(
29
+ lang_single: single_char_language?,
30
+ with_date: with_date,
31
+ )
32
+
33
+ # Edition portion (if requested)
34
+ if with_edition && identifier.edition && (identifier.edition.number || identifier.edition.original_text)
35
+ parts << identifier.edition_portion(lang: :en)
36
+ end
37
+
38
+ result = parts.compact.join(" ")
39
+
40
+ # Language portion (if applicable)
41
+ # CRITICAL: with_edition=true should ALWAYS use multi-char language codes (en, fr, ru, etc.)
42
+ # even if the original parsed format was single-char (E, F, R, etc.)
43
+ if identifier.languages&.any? && with_language_code != :none
44
+ use_single_char = with_edition ? false : single_char_language?
45
+ result << identifier.language_portion(lang_single: use_single_char)
46
+ end
47
+
48
+ # All parts notation (if applicable)
49
+ result << " (all parts)" if identifier.class.attributes.key?(:all_parts) && identifier.all_parts
50
+
51
+ result
52
+ end
53
+
54
+ def single_char_language?
55
+ with_language_code == :single
56
+ end
57
+
58
+ def self.from_format(format)
59
+ case format
60
+ when :ref_num_short
61
+ RefNumShort.new
62
+ when :ref_num_long
63
+ RefNumLong.new
64
+ when :ref_dated
65
+ RefDated.new
66
+ when :ref_dated_long
67
+ RefDatedLong.new
68
+ when :ref_undated
69
+ RefUndated.new
70
+ when :ref_undated_long
71
+ RefUndatedLong.new
72
+ else
73
+ RefDatedLong.new # Default
74
+ end
75
+ end
76
+ end
77
+
78
+ # Instance reference number: 1-letter language code + short form + dated
79
+ class RefNumShort < RenderingStyle
80
+ def initialize
81
+ super(with_language_code: :single, stage_format_long: false, with_date: true)
82
+ end
83
+ end
84
+
85
+ # Instance reference number long: 2-letter language code + long form + dated
86
+ class RefNumLong < RenderingStyle
87
+ def initialize
88
+ super(with_language_code: :iso, stage_format_long: true, with_date: true)
89
+ end
90
+ end
91
+
92
+ # Reference dated: no language code + short form + dated
93
+ class RefDated < RenderingStyle
94
+ def initialize
95
+ super(with_language_code: :none, stage_format_long: false, with_date: true)
96
+ end
97
+ end
98
+
99
+ # Reference dated long: no language code + short form + dated
100
+ class RefDatedLong < RenderingStyle
101
+ def initialize
102
+ super(with_language_code: :none, stage_format_long: false, with_date: true)
103
+ end
104
+ end
105
+
106
+ # Reference undated: no language code + short form + undated
107
+ class RefUndated < RenderingStyle
108
+ def initialize
109
+ super(with_language_code: :none, stage_format_long: false, with_date: false)
110
+ end
111
+ end
112
+
113
+ # Reference undated long: no language code + long form + undated
114
+ class RefUndatedLong < RenderingStyle
115
+ def initialize
116
+ super(with_language_code: :none, stage_format_long: true, with_date: false)
117
+ end
118
+ end
119
+ end
120
+ end