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,512 @@
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
+ # Accept either "ISO/TC 184…" or the lenient space form "ISO TC 184…"
49
+ # (the latter was valid in pubid 1.x via an optional slash).
50
+ prefix_sole_publisher >> (str("/") | space) >> tc_type >> space >> tc_number.as(:tc_number) >>
51
+ tc_subcommittee_part.maybe >>
52
+ space >> str("N") >> space? >> digits.as(:number) >>
53
+ (str(":") >> year_digits.as(:year)).maybe
54
+ end
55
+
56
+ rule(:tc_subcommittee_part) do
57
+ # Full path: TC/SC 4/WG 3
58
+ (str("/") >> sc_type >> space >> digits.as(:sc_number) >> str("/") >>
59
+ wg_type >> space >> digits.as(:wg_number)) |
60
+ # TC and SC only: TC/SC 4 N 789
61
+ (str("/") >> sc_type >> space >> digits.as(:sc_number))
62
+ end
63
+
64
+ rule(:tc_type) do
65
+ array_to_str(Identifiers::TcDocument::TC_TYPES).as(:tc_type)
66
+ end
67
+
68
+ rule(:sc_type) do
69
+ str("SC").as(:sc_type)
70
+ end
71
+
72
+ rule(:wg_type) do
73
+ array_to_str(Identifiers::TcDocument::WG_TYPES).as(:wg_type)
74
+ end
75
+
76
+ rule(:tc_number) do
77
+ digits
78
+ end
79
+
80
+ # ISO/R 947:1969 (legacy Recommendation without supplement)
81
+ rule(:iso_r_identifier) do
82
+ str("ISO/R").as(:iso_r_prefix) >> space >>
83
+ iso_r_second_part >> third_part
84
+ end
85
+
86
+ # ISO/R 947:1969/Add 1:1969 (legacy Recommendation with supplement)
87
+ # Also handles: ISO/R 91-1970 — Addendum 1 (dash for year, em-dash + word)
88
+ rule(:iso_r_supplement_identifier) do
89
+ (
90
+ str("ISO/R").as(:iso_r_prefix) >> space >> iso_r_second_part
91
+ ).as(:base_identifier) >>
92
+ iso_r_supplement_separator >>
93
+ supplement_type_with_stage >>
94
+ space? >> second_part >> third_part
95
+ end
96
+
97
+ # ISO/R supplements can use "/" or em-dash "—" or " - " as separator
98
+ rule(:iso_r_supplement_separator) do
99
+ str("/") | (space? >> str("—") >> space?) | (space >> str("-") >> space)
100
+ end
101
+
102
+ # Special second_part for ISO/R that treats dash as date separator only
103
+ rule(:iso_r_second_part) do
104
+ number.as(:number_with_part) >>
105
+ stage_iteration.maybe >>
106
+ space? >> date.maybe
107
+ end
108
+
109
+ # ISO 8601-1:2019
110
+ # ISO/R 947:1969 (legacy Recommendation format)
111
+ rule(:prefix_sole_publisher) do
112
+ (str("ISO") | str("IEC")).as(:publisher)
113
+ end
114
+
115
+ # ISO/SAE PAS 22736:2021
116
+ # ISO/R 947:1969 (legacy Recommendation - special handling)
117
+ rule(:prefix_with_copublishers) do
118
+ # Try ISO/R first (must be followed by space + number to avoid confusion with copublishers)
119
+ (str("ISO/R").as(:iso_r_prefix) >> space) |
120
+ # Otherwise normal publisher with optional copublishers
121
+ (prefix_sole_publisher >> space? >> copublishers.maybe)
122
+ end
123
+
124
+ ORGANIZATIONS = %w[
125
+ ISO IEC IEEE CIW SAE CIE ASME ASTM OECD ISO HL7 CEI UNDP
126
+ ].freeze
127
+ rule(:copublishers) do
128
+ (str("/") >> space? >> array_to_str(ORGANIZATIONS).as(:copublisher)).repeat.as(:copublishers)
129
+ end
130
+
131
+ rule(:number_with_part) do
132
+ (number >> part_and_subpart.maybe).as(:number_with_part)
133
+ end
134
+
135
+ rule(:number) do
136
+ match('\d').repeat(1, 5)
137
+ end
138
+
139
+ rule(:date) do
140
+ # :2005-02
141
+ (str(":") | dash) >>
142
+ (year_digits >>
143
+ (dash >> month_digits).maybe >>
144
+ (dash >> day_digits).maybe
145
+ ).as(:date).maybe
146
+ end
147
+
148
+ rule(:part_and_subpart) do
149
+ # Modern parts
150
+ # ISO 105-A01:1989
151
+ # ISO/IEC/IEEE 8802-1AB
152
+ # ISO/IEC TR 29110-5-1-1
153
+
154
+ # Legacy parts
155
+ # ISO 31/0-1974
156
+ # ISO 105/F (also known as ISO 105-F)
157
+ # ISO 5843/6 (also known as ISO 5843-6)
158
+
159
+ # Modern parts can have subparts using dash
160
+ # the "space?" needed to handle "ISO/TS 10303- 1751:2014"
161
+ (
162
+ dash >> space? >>
163
+ # matches a part
164
+ match('\w').repeat(1) >>
165
+ # matches a subpart, e.g. "A01" or "1-2" (yes we treat {5}-{1-1} as part and subpart)
166
+ (dash >> match('\w').repeat(1)).repeat.maybe
167
+ ) |
168
+ # Legacy parts do not have subparts
169
+ # the "/" to handle old style parts: "ISO 5843/6"
170
+ # Guard: don't match supplement type names (Amd, Cor, Sup, etc.)
171
+ (
172
+ str("/") >> space? >>
173
+ supplement_type_with_stage.absent? >>
174
+ # matches a part
175
+ match('\w').repeat(1)
176
+ )
177
+ end
178
+
179
+ rule(:all_parts) do
180
+ str("(all parts)").as(:all_parts)
181
+ end
182
+
183
+ rule(:type_with_stage) do
184
+ # "DTR"
185
+ # "PRF PAS"
186
+ # "PRF"
187
+ # "PAS"
188
+ array_to_str(TYPED_STAGES).as(:type_with_stage) >>
189
+ (match('\d').as(:stage_iteration) >> space).maybe
190
+ end
191
+
192
+ rule(:language) do
193
+ # ISO 8601-1:2019(en,fr)
194
+ # ISO 8601-1:2019(E/F)
195
+ str("(") >>
196
+ (
197
+ # parse 2-char language codes: ru,en,fr,de,ar,es
198
+ (match["a-z"].repeat(1) >> str(",").maybe) |
199
+ # parse single language codes: R/E/F or R,E,F
200
+ (match["EFARDS"] >> (str("/") | str(",")).maybe)
201
+ ).repeat.as(:languages) >>
202
+ str(")")
203
+ end
204
+
205
+ EDITION_STRINGS = %w[Edition Ed. ED Ed].freeze
206
+ rule(:edition) do
207
+ # Capture the entire edition text for exact reproduction
208
+ (array_to_str(EDITION_STRINGS) >> space? >> digits.maybe).as(:edition)
209
+ end
210
+
211
+ rule(:stage_iteration) do
212
+ # "ISO 11243.1"
213
+ str(".") >> match('\d').as(:stage_iteration)
214
+ end
215
+
216
+ # Modern identifiers use ':' as year identifier, e.g. "ISO 8601-1:2019"
217
+ # Legacy identifiers use '-' as year identifier, e.g. "ISO 31/0-1974"
218
+ rule(:second_part) do
219
+ number_with_part >>
220
+ stage_iteration.maybe >>
221
+ space? >> date.maybe
222
+ end
223
+
224
+ rule(:third_part_edition) do
225
+ space? >> edition.maybe
226
+ end
227
+
228
+ rule(:third_part) do
229
+ # End of the identifier, we can have language, edition, or all parts
230
+ third_part_edition >> language.maybe >> space? >> all_parts.maybe
231
+ end
232
+
233
+ # prefix sole or copublishers with type and stage
234
+ # ISO/WD TR 23642
235
+ # ISO/NP TS 20594-1
236
+ # ISO/PRF PAS 22596
237
+ # ISO/ASTM DTR 52905
238
+ # ISO/IEC WD TS 25025
239
+ #
240
+ ## SUPPORTED ABERRATION: ISO TR 16401-2
241
+ ## SUPPORTED ABERRATION: ISO/IEC/TS 24192-1
242
+ rule(:identifier_copublishers) do
243
+ identifier_copublishers_no_third >> third_part
244
+ end
245
+
246
+ # TODO: Support parsing Russian style identifiers
247
+ rule(:guide_prefix) do
248
+ str("Guide") | str("GUIDE") # | str("Руководство") | str("Руководства")
249
+ end
250
+
251
+ rule(:identifier_copublishers_no_third) do
252
+ # Guide ISO/CEI 51:1999
253
+ (guide_prefix.as(:type_with_stage_fr) >> space).maybe >>
254
+ # maybe prefix_with_copublishers to handle IWA
255
+ prefix_with_copublishers.maybe >> space? >> str("/").maybe >>
256
+ type_with_stage.maybe >>
257
+ space.maybe >>
258
+ second_part >> third_part_edition
259
+ end
260
+
261
+ # For joint identifiers, we do not treat it as a supplementary identifier
262
+ # (hence not a base_identifier)
263
+ # ISO only supports IDF in joint identifiers
264
+ # ISO 5537|IDF 26
265
+ # ISO 17678|IDF 202:2010
266
+ # ISO/TS 4985:2023 | IDF/RM 255
267
+ # ISO 4214:2022 | IDF 254:2022
268
+ rule(:joint_identifier) do
269
+ identifier_copublishers_no_third.as(:base_identifier) >>
270
+ space? >> str("|") >> space? >>
271
+ scope { idf_identifier }.as(:joint_identifier)
272
+ end
273
+
274
+ rule(:idf_identifier) do
275
+ Idf::Parser.new.identifier
276
+ end
277
+
278
+ # NSB ISO identifiers - National Body prefixed ISO identifiers
279
+ # FprISO 105-A03
280
+ # FprISO/IEC 17029
281
+ # WD/ISO 10360-2
282
+ # WD/ISO 10360-5:2000
283
+ rule(:nsb_iso_identifier) do
284
+ # FprISO, FprISO/IEC - stage prefix directly attached to publisher
285
+ (str("Fpr").as(:nsb_stage) >>
286
+ prefix_sole_publisher >> space? >> copublishers.maybe >>
287
+ space.maybe >>
288
+ type_with_stage.maybe >>
289
+ space.maybe >>
290
+ second_part >> third_part) |
291
+ # WD/ISO - stage prefix with slash before publisher
292
+ (str("WD").as(:nsb_stage) >> str("/") >>
293
+ prefix_sole_publisher >> space? >> copublishers.maybe >>
294
+ space.maybe >>
295
+ type_with_stage.maybe >>
296
+ space.maybe >>
297
+ second_part >> third_part)
298
+ end
299
+
300
+ # TODO: Do something with NSB ISO identifiers like "FprISO", "WD/ISO"
301
+ # Guide ISO/CEI 51:1999
302
+ # FprISO 105-A03
303
+ # FprISO/IEC 17029
304
+ # WD/ISO 10360-5:2000
305
+ # ISO 4918:2016+A1:2018
306
+ # rule(:nsb_iso_identifier) do
307
+ # str("Fpr").as(:stage).maybe >>
308
+ # # Withdrawn e.g: WD/ISO 10360-5:2000
309
+ # str("WD/").maybe >>
310
+ # # for French and Russian PubIDs starting with Guide type
311
+ # (guide_prefix.as(:type) >> space).maybe >>
312
+ # (stage.as(:stage) >> space).maybe >>
313
+ # (typed_stage.as(:stage) >> space).maybe >>
314
+ # (originator >> (space | str("/"))).maybe >>
315
+ # (tc_document_body | std_document_body | (dir_document_body >>
316
+ # (str(" + ") >> (originator >> space >> dir_document_body).as(:dir_joint_document)).maybe))
317
+ # end
318
+
319
+ rule(:supplement_type_with_stage) do
320
+ # "DAM"
321
+ # "NP Amd"
322
+ array_to_str(TYPED_STAGES_SUPPLEMENTS).as(:type_with_stage)
323
+ end
324
+
325
+ # ISO 8601-1:2019/Amd 2:2024
326
+ # ISO/IEC 10646-1:1993/pDCOR.2 (legacy dot-prefixed format)
327
+ rule(:supplement_identifier_no_third) do
328
+ identifier_copublishers_no_third.as(:base_identifier) >>
329
+ str("/") >> supplement_type_with_stage >>
330
+ ((space? >> second_part) | (str(".") >> digits.as(:number)) | (space? >> date))
331
+ end
332
+
333
+ rule(:supplement_identifier) do
334
+ supplement_identifier_no_third >> third_part
335
+ end
336
+
337
+ # ISO/IEC 13818-1:2015/Amd 3:2016/Cor 1:2017
338
+ # ISO/IEC 19794-7:2014/Amd 1:2015/CD Cor 1
339
+ # ISO/IEC 10646-1:1993/pDCOR.2 (legacy dot-prefixed format)
340
+ rule(:supplement_supplement_identifier) do
341
+ supplement_identifier_no_third.as(:base_identifier) >>
342
+ str("/") >> supplement_type_with_stage >>
343
+ ((space? >> second_part >> third_part) | (str(".") >> digits.as(:number) >> third_part))
344
+ end
345
+
346
+ # ISO 12345:2020/Amd 1:2021/Cor 1:2022/Amd 2:2023 (three-level supplement)
347
+ rule(:supplement_supplement_supplement_identifier) do
348
+ supplement_supplement_identifier.as(:base_identifier) >>
349
+ str("/") >> supplement_type_with_stage >>
350
+ ((space? >> second_part >> third_part) | (str(".") >> digits.as(:number) >> third_part))
351
+ end
352
+
353
+ # ISO/IEC DIR
354
+ # ISO/IEC DIR 1
355
+ # ISO/IEC DIR 2:2022
356
+ rule(:directives_identifier) do
357
+ directives_identifier_no_third >> third_part.maybe >> space? >> date.maybe
358
+ end
359
+
360
+ # ISO/IEC JTC 1 DIR (JTC 1 Directives)
361
+ rule(:directives_publisher_subgroup) do
362
+ str("JTC 1").as(:subgroup)
363
+ end
364
+
365
+ # Special number_with_part rule for Directives to handle variants
366
+ # We treat the variant as `part` of the number_with_part
367
+ rule(:directives_number_with_part) do
368
+ (number >> directives_part_and_subpart.maybe).as(:number_with_part)
369
+ end
370
+
371
+ # ISO/IEC DIR 1 IEC (IEC version of the ISO/IEC DIR 1)
372
+ # ISO/IEC DIR 2 ISO:2022 (ISO version of the ISO/IEC DIR 2)
373
+ # But NOT: ISO/IEC DIR 1 ISO SUP:2022 (ISO is supplement publisher)
374
+ # "1 IEC"
375
+ # "2 ISO"
376
+ rule(:directives_part_and_subpart) do
377
+ # Only match ISO/IEC if NOT followed by "/" (dual publisher) or supplement keywords
378
+ space >> (str("ISO") | str("IEC")) >> str("/").absent? >> (space >> str("SUP")).absent?
379
+ end
380
+
381
+ DIRECTIVES_TYPED_STAGES = Identifiers::Directives::TYPED_STAGES.map(&:abbr).flatten.sort_by(&:length).reverse
382
+ rule(:directives_identifier_no_third) do
383
+ prefix_with_copublishers >> space? >>
384
+ (directives_publisher_subgroup >> space).maybe >>
385
+ array_to_str(DIRECTIVES_TYPED_STAGES).as(:type_with_stage) >>
386
+ (
387
+ (space >> directives_number_with_part).maybe >>
388
+ (str(":") >> date).maybe
389
+ ).maybe
390
+ end
391
+
392
+ rule(:directives_supplement_identifier) do
393
+ directives_identifier_no_third.as(:base_identifier) >> space? >> directives_supplement_part
394
+ end
395
+
396
+ DIRECTIVES_SUPPLEMENTS_TYPED_STAGES = Identifiers::DirectivesSupplement::TYPED_STAGES.map(&:abbr).flatten.sort_by(&:length).reverse
397
+
398
+ rule(:directives_supplement_part_no_third) do
399
+ # ISO/IEC DIR 1 ISO SUP
400
+ # ISO/IEC DIR 2 ISO SUP:2022
401
+ # ISO/IEC DIR JTC 1 SUP:2021
402
+ # ISO/IEC Directives, Part 1 -- Consolidated ISO Supplement
403
+ (space? >> str("--") >> space? >> str("Consolidated") >> space).maybe >>
404
+ (str("ISO/IEC") | str("ISO") | str("IEC") | str("JTC 1")).as(:publisher) >>
405
+ (space >> array_to_str(DIRECTIVES_SUPPLEMENTS_TYPED_STAGES).as(:type_with_stage)) >>
406
+ date.maybe
407
+ end
408
+
409
+ rule(:directives_supplement_part) do
410
+ directives_supplement_part_no_third >> third_part.maybe
411
+ end
412
+
413
+ # ISO/IEC DIR 1 + IEC SUP:2016-05
414
+ # ISO/IEC DIR 1:2022 + IEC SUP:2022
415
+ rule(:directives_bundled_identifier) do
416
+ (
417
+ directives_identifier_no_third >>
418
+ (third_part >> space?).maybe >>
419
+ (date >> space?).maybe
420
+ ).as(:base_document) >>
421
+ (
422
+ str("+ ") >>
423
+ directives_supplement_part_no_third.as(:supplement)
424
+ ).repeat(1).as(:supplements)
425
+ end
426
+
427
+ rule(:directives_identifiers) do
428
+ directives_bundled_identifier |
429
+ directives_supplement_identifier |
430
+ directives_identifier
431
+ end
432
+
433
+ rule(:dash) do
434
+ DASH_CHARS.map { |char| str(char) }.reduce(:|)
435
+ end
436
+
437
+ # rule(:tctype) do
438
+ # # tc-types
439
+ # array_to_str(TCTYPES)
440
+ # end
441
+
442
+ # rule(:sctype) do
443
+ # str("SC")
444
+ # end
445
+
446
+ # rule(:wgtype) do
447
+ # array_to_str(WGTYPES)
448
+ # end
449
+
450
+ # rule(:roman_numerals) do
451
+ # str("CD").absent? >> array_to_str(%w[I V X L C D M]).repeat(1).as(:roman_numerals)
452
+ # end
453
+
454
+ # rule(:part_matcher) do
455
+ # year_digits.absent? >>
456
+ # supplements.absent? >>
457
+ # staged_addenda.absent? >> ((roman_numerals >> digits.absent?) | match['[\dA-Z]'].repeat(1)).as(:part)
458
+ # end
459
+
460
+ # rule(:supplement) do
461
+ # ((str("/") | space).maybe >>
462
+ # (((stage.as(:typed_stage) >> space).maybe >> supplements.as(:type)) |
463
+ # staged_supplement.as(:typed_stage)) >>
464
+ # (space | str(".")).repeat(1).maybe >>
465
+ # digits.as(:number).maybe >>
466
+ # (str(".") >> digits.as(:iteration)).maybe >>
467
+ # ((str(":") | dash) >> digits.as(:year)).maybe).repeat(1).as(:supplements)
468
+ # end
469
+
470
+ # # Parse technical committee documents
471
+ # rule(:tc_document_body) do
472
+ # (tctype.as(:tctype) >> str("/").maybe).repeat >> space >> digits.as(:tcnumber) >>
473
+ # (str("/") >> (
474
+ # ((sctype.as(:sctype) >> space >> digits.as(:scnumber) >> str("/")).maybe >>
475
+ # wgtype.as(:wgtype) >> space >> digits.as(:wgnumber)) |
476
+ # (sctype.as(:sctype) >> (space | str("/") >> wgtype.as(:wgtype) >> space) >> digits.as(:scnumber))
477
+ # )).maybe >>
478
+ # space >> str("N") >> space? >> digits.as(:number)
479
+ # end
480
+
481
+ # rule(:dir_supplement_edition) do
482
+ # space >> (str("Edition") | str("Ed")) >> space >> digits.as(:edition)
483
+ # end
484
+
485
+ # rule(:dir_document_body) do
486
+ # ((str("DIR") | str("Directives Part") | str("Directives, Part") | str("Directives,")).as(:type) >> space).maybe >>
487
+ # (str("JTC").as(:dirtype) >> space).maybe >>
488
+ # (digits.as(:number) >> (str(":") >> year).maybe).maybe >>
489
+ # (space >> str("DIR").as(:jtc_dir) >> (str(":") >> year).maybe).maybe >>
490
+ # (str(" -- Consolidated").maybe >> (str("").as(:mark) >> space? >>
491
+ # (organization.as(:publisher) >> space?).maybe >>
492
+ # array_to_str(DIR_SUPPLEMENTS) >> (str(":") >> (year >> (dash >> month_digits.as(:month)).maybe)).maybe >>
493
+ # dir_supplement_edition.maybe).repeat(1).as(:supplements)).maybe >>
494
+ # # parse identifiers with publisher at the end, e.g. "ISO/IEC DIR 2 ISO"
495
+ # (space >> organization.as(:publisher) >> (str(":") >> year).maybe).as(:edition).maybe
496
+ # end
497
+
498
+ # rule(:identifier) do
499
+ # str("Fpr").as(:stage).maybe >>
500
+ # # Withdrawn e.g: WD/ISO 10360-5:2000
501
+ # str("WD/").maybe >>
502
+ # # for French and Russian PubIDs starting with Guide type
503
+ # (guide_prefix.as(:type) >> space).maybe >>
504
+ # (stage.as(:stage) >> space).maybe >>
505
+ # (typed_stage.as(:stage) >> space).maybe >>
506
+ # (originator >> (space | str("/"))).maybe >>
507
+ # (tc_document_body | std_document_body | (dir_document_body >>
508
+ # (str(" + ") >> (originator >> space >> dir_document_body).as(:dir_joint_document)).maybe))
509
+ # end
510
+ end
511
+ end
512
+ 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