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,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iho
5
+ module Identifiers
6
+ # IHO Miscellaneous Publication (M series).
7
+ # Example: IHO M-3 2.0.0.
8
+ class Miscellaneous < Base
9
+ def self.type
10
+ { key: :miscellaneous, title: "Miscellaneous Publication",
11
+ short: "M" }
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iho
5
+ module Identifiers
6
+ # IHO Publication (P series).
7
+ # Examples: IHO P-1 1.0.0, IHO P-1/21 1.0.0, IHO P-6-3 1.0.0.
8
+ class Publication < Base
9
+ def self.type
10
+ { key: :publication, title: "Publication", short: "P" }
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iho
5
+ module Identifiers
6
+ # IHO Standards and Specifications (S series).
7
+ # Examples: IHO S-44 5.0.0, IHO S-100 Part 4a 1.0.0, IHO S-65 Ap. A 1.0.0.
8
+ class Standard < Base
9
+ def self.type
10
+ { key: :standard, title: "Standards and Specifications", short: "S" }
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iho
5
+ module Identifiers
6
+ autoload :Base, "#{__dir__}/identifiers/base"
7
+ autoload :Bibliographic, "#{__dir__}/identifiers/bibliographic"
8
+ autoload :CircularLetter, "#{__dir__}/identifiers/circular_letter"
9
+ autoload :Miscellaneous, "#{__dir__}/identifiers/miscellaneous"
10
+ autoload :Publication, "#{__dir__}/identifiers/publication"
11
+ autoload :Standard, "#{__dir__}/identifiers/standard"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parslet"
4
+
5
+ module Pubid
6
+ module Iho
7
+ # Parser class for IHO identifiers
8
+ class Parser < Parslet::Parser
9
+ rule(:space) { str(" ") }
10
+ rule(:dash) { str("-") }
11
+ rule(:dot) { str(".") }
12
+ rule(:digits) { match("[0-9]").repeat(1) }
13
+
14
+ rule(:series) do
15
+ (str("S") | str("P") | str("M") | str("B") | str("C")).as(:type)
16
+ end
17
+
18
+ rule(:number_suffix) do
19
+ (str(":") >> digits) | (str("/") >> digits) | (dash >> digits) | match("[A-Z]")
20
+ end
21
+
22
+ rule(:code) do
23
+ (digits >> number_suffix.maybe).as(:code)
24
+ end
25
+
26
+ rule(:appendix) do
27
+ space >> (str("Appendix") | str("Ap.")) >> space >>
28
+ (
29
+ (match("[A-Z]") >> dash >> digits) |
30
+ digits |
31
+ match("[A-Z]")
32
+ ).as(:appendix)
33
+ end
34
+
35
+ rule(:part) do
36
+ space >> str("Part") >> space >>
37
+ (
38
+ (digits >> match("[a-zA-Z]").repeat).as(:part) |
39
+ match("[A-Z]").as(:part)
40
+ )
41
+ end
42
+
43
+ rule(:annex) do
44
+ space >> str("Annex") >> space >> match("[A-Z]").as(:annex)
45
+ end
46
+
47
+ rule(:supplement) do
48
+ space >> str("Suppl") >> space >> digits.as(:supplement)
49
+ end
50
+
51
+ rule(:version) do
52
+ space >> (digits >> dot >> digits >> dot >> digits).as(:version)
53
+ end
54
+
55
+ rule(:identifier) do
56
+ (str("IHO") >> space).maybe >>
57
+ series >> dash >> code >>
58
+ appendix.maybe >> part.maybe >> annex.maybe >> supplement.maybe >> version.maybe
59
+ end
60
+
61
+ root :identifier
62
+
63
+ def self.parse(string)
64
+ new.parse(string.strip)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iho
5
+ # Scheme registry for IHO identifier types.
6
+ class Scheme < Pubid::Scheme
7
+ IDENTIFIERS = [
8
+ Identifiers::Standard,
9
+ Identifiers::Publication,
10
+ Identifiers::Miscellaneous,
11
+ Identifiers::Bibliographic,
12
+ Identifiers::CircularLetter,
13
+ ].freeze
14
+
15
+ def initialize
16
+ @identifiers = IDENTIFIERS
17
+ end
18
+
19
+ # Look up an identifier class by its IHO series letter (S/P/M/B/C).
20
+ # @param letter [String]
21
+ # @return [Class<Identifiers::Base>]
22
+ # @raise [KeyError] if the letter is not a known IHO series
23
+ def self.identifier_klass_for_type_letter(letter)
24
+ @by_letter ||= IDENTIFIERS.to_h { |klass| [klass.type[:short], klass] }
25
+ @by_letter.fetch(letter.to_s)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iho
5
+ # Generates URN strings for IHO identifiers.
6
+ #
7
+ # Format: urn:iho:{type-letter-lowercase}:{code}[:ap.{appendix}][:part.{part}][:annex.{annex}][:suppl.{supplement}][:{version}]
8
+ # Example: urn:iho:s:44:5.0.0 for "IHO S-44 5.0.0".
9
+ class UrnGenerator
10
+ attr_reader :identifier
11
+
12
+ def initialize(identifier)
13
+ @identifier = identifier
14
+ end
15
+
16
+ def generate
17
+ parts = ["urn", "iho"]
18
+ parts << identifier.class.type[:short].to_s.downcase
19
+ parts << identifier.code.to_s
20
+ parts << "ap.#{identifier.appendix}" if identifier.appendix
21
+ parts << "part.#{identifier.part}" if identifier.part
22
+ parts << "annex.#{identifier.annex}" if identifier.annex
23
+ parts << "suppl.#{identifier.supplement}" if identifier.supplement
24
+ parts << identifier.version.to_s if identifier.version
25
+ parts.join(":")
26
+ end
27
+ end
28
+ end
29
+ end
data/lib/pubid/iho.rb ADDED
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iho
5
+ autoload :Builder, "#{__dir__}/iho/builder"
6
+ autoload :Identifier, "#{__dir__}/iho/identifier"
7
+ autoload :Identifiers, "#{__dir__}/iho/identifiers"
8
+ autoload :Parser, "#{__dir__}/iho/parser"
9
+ autoload :Scheme, "#{__dir__}/iho/scheme"
10
+ autoload :UrnGenerator, "#{__dir__}/iho/urn_generator"
11
+
12
+ # Parse an IHO identifier string into an identifier object
13
+ # @param identifier [String] The IHO identifier string to parse
14
+ # @return [Pubid::Iho::Identifiers::Base] The appropriate identifier object
15
+ def self.parse(identifier)
16
+ Identifier.parse(identifier)
17
+ end
18
+ end
19
+ end
20
+
21
+ Pubid::Registry.register(:iho, Pubid::Iho)
@@ -0,0 +1,309 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iso
5
+ class Builder < Pubid::Builder::Base
6
+ def initialize(scheme)
7
+ @scheme = scheme
8
+ end
9
+
10
+ def locate_identifier_klass(parsed_hash)
11
+ # If there is a joint_identifier, we need to use a CombinedIdentifier
12
+ # which takes `base_identifier` and `additional_identifiers`
13
+ if parsed_hash[:joint_identifier]
14
+ return CombinedIdentifier
15
+ end
16
+
17
+ # If there are supplements, we need to use a BundledIdentifier
18
+ # which takes `base_document` and `supplements`
19
+ if parsed_hash[:supplements]
20
+ return BundledIdentifier
21
+ end
22
+
23
+ # TC documents are identified by the presence of tc_type
24
+ if parsed_hash[:tc_type]
25
+ return Identifiers::TcDocument
26
+ end
27
+
28
+ # Check the `:type_with_stage` to determine the identifier class
29
+ # 1. :type_with_stage will be nil if:
30
+ # a) It is an IS.
31
+ # b) It is a Directive Supplements. The "SUP" keyword may be entirely missing, and hence nil. If the base type_with_stage is a directive, then if the type_with_stage is blank, it is a directive supplement.
32
+
33
+ if parsed_hash[:type_with_stage].nil? && parsed_hash[:base_identifier] && parsed_hash[:base_identifier][:type_with_stage] == "DIR"
34
+ # Directive Supplement without "SUP" keyword
35
+ parsed_hash[:type_with_stage] = "SUP"
36
+ end
37
+
38
+ typed_stage = locate_typed_stage(parsed_hash[:type_with_stage])
39
+
40
+ @scheme.locate_identifier_klass_by_type_code(typed_stage.type_code)
41
+ end
42
+
43
+ def build(parsed_hash)
44
+ # For ISO/R legacy format, split into publisher and type
45
+ if parsed_hash[:iso_r_prefix]
46
+ parsed_hash[:publisher] = "ISO"
47
+ parsed_hash[:type_with_stage] = "R"
48
+ parsed_hash.delete(:iso_r_prefix)
49
+ end
50
+
51
+ # For NSB-prefixed identifiers (FprISO, WD/ISO), set stage
52
+ if parsed_hash[:nsb_stage]
53
+ nsb_stage = parsed_hash.delete(:nsb_stage)
54
+ # Map NSB stage to typed stage
55
+ case nsb_stage
56
+ when "Fpr"
57
+ parsed_hash[:type_with_stage] = "PRF"
58
+ when "WD"
59
+ parsed_hash[:type_with_stage] = "WD"
60
+ end
61
+ end
62
+
63
+ # Instantiate the identifier based on the typed stage
64
+ identifier = locate_identifier_klass(parsed_hash).new
65
+
66
+ # For French GUIDE entries: "Guide ISO/CEI 37:1995"
67
+ if type_with_stage_fr = parsed_hash.delete(:type_with_stage_fr)
68
+ parsed_hash[:type_with_stage] = type_with_stage_fr
69
+ end
70
+
71
+ # For DirectivesSupplement, rename :publisher to :supplement_publisher
72
+ if identifier.is_a?(Identifiers::DirectivesSupplement) && parsed_hash[:publisher]
73
+ parsed_hash[:supplement_publisher] = parsed_hash.delete(:publisher)
74
+ end
75
+
76
+ # Merge copublishers into publisher object
77
+ if parsed_hash[:publisher] && parsed_hash[:copublishers]
78
+ copublisher_strings = parsed_hash[:copublishers].map do |cp|
79
+ cp[:copublisher]
80
+ end
81
+ parsed_hash[:publisher] = {
82
+ publisher: parsed_hash[:publisher],
83
+ copublisher: copublisher_strings,
84
+ }
85
+ end
86
+
87
+ assign_attributes(identifier, parsed_hash)
88
+
89
+ # If typed_stage, stage, or type are still nil after building,
90
+ # set them to the default International Standard values
91
+ if identifier.typed_stage.nil?
92
+ default_typed_stage = @scheme.locate_typed_stage_by_abbr("")
93
+ identifier.typed_stage = default_typed_stage
94
+ identifier.stage = default_typed_stage.to_stage
95
+ identifier.type = default_typed_stage.to_type
96
+ end
97
+
98
+ identifier
99
+ end
100
+
101
+ def handle_key(identifier, key, value)
102
+ if key == :joint_identifier
103
+ identifier.additional_identifiers ||= []
104
+ identifier.additional_identifiers << value
105
+ true
106
+ else
107
+ false
108
+ end
109
+ end
110
+
111
+ def cast(type, value)
112
+ case type
113
+ when :base_identifier
114
+ # If it has a base identifier, we need to build a supplement
115
+ # We assume that the base identifier is already a valid Identifier object
116
+ build(value)
117
+
118
+ # If there is a base_identifier, and it has a joint_identifier, we need to use a CombinedIdentifier.
119
+
120
+ when :publisher, :directives_supplement_body, :supplement_publisher
121
+ # value can be either a string OR a hash with publisher + copublisher
122
+ if value.is_a?(Hash)
123
+ Pubid::Iso::Components::Publisher.new(
124
+ publisher: value[:publisher],
125
+ copublisher: value[:copublisher],
126
+ )
127
+ else
128
+ # Default copublisher to [] (not nil) so a bare-string publisher
129
+ # (e.g. a TC document, which skips the copublisher merge) matches
130
+ # the [] convention used by copublisher-merged parses and by
131
+ # Identifier.create. Otherwise equality fails on [] vs nil.
132
+ Pubid::Iso::Components::Publisher.new(publisher: value, copublisher: [])
133
+ end
134
+
135
+ when :copublishers
136
+ # Copublishers already merged into publisher
137
+ # Create array of Publisher objects for identifier.copublishers attribute
138
+ if value.nil? || value.empty?
139
+ nil
140
+ else
141
+ value.map do |copublisher|
142
+ Pubid::Iso::Components::Publisher.new(publisher: copublisher[:copublisher])
143
+ end
144
+ end
145
+
146
+ when :year
147
+ # For TC documents, parser returns :year but identifier uses :date
148
+ # Return as date for assignment
149
+ { date: Pubid::Components::Date.new(year: value.to_s) }
150
+
151
+ when :number_with_part
152
+ # "1234" (no part)
153
+ # or "1234-1" ('1' is part)
154
+ # or "1234-1-2" ('1' is part, '2' is subpart)
155
+ # or "29110-5-1-1" ('5' is part, '1-1' is subpart)
156
+ # or "105/F" ('F' is part)
157
+ # or "5843/6" ('6' is part)
158
+ # LEGACY: "4037-1979" (number-year, year should become date)
159
+
160
+ # Split the number into parts
161
+ normalized_value = value.to_s.tr("#{Parser::DASH_CHARS.join}/", "-")
162
+
163
+ # for "1 IEC" ('IEC' is part) (in case of "ISO/IEC DIR 1 IEC")
164
+ normalized_value.gsub!(" ", "-")
165
+
166
+ parts = normalized_value.split("-").reject(&:empty?)
167
+ number = parts.shift # The first part is always the number
168
+ part = parts.shift&.strip # The second part is the part, if present
169
+ subpart = parts.any? ? parts.join("-") : nil # The remaining parts form the subpart, if present
170
+
171
+ # LEGACY FORMAT FIX: If "part" is a 4-digit year (1900-2099), move it to date field
172
+ # This handles legacy formats like "ISO 4037-1979" where hyphen was used instead of colon
173
+ if part&.match?(/^\d{4}$/)
174
+ year_value = part.to_i
175
+ # Only treat as year if in reasonable year range (excludes part numbers like "1751")
176
+ if year_value.between?(1900, 2099)
177
+ return {
178
+ number: Pubid::Iso::Components::Code.new(number: number),
179
+ date: Pubid::Components::Date.new(year: part),
180
+ }
181
+ end
182
+ end
183
+
184
+ part = convert_roman_to_integer(part)
185
+
186
+ code_hash = { number: Pubid::Iso::Components::Code.new(number: number) }
187
+
188
+ if part
189
+ code_hash[:part] = Pubid::Iso::Components::Code.new(number: part)
190
+ end
191
+
192
+ if subpart
193
+ code_hash[:subpart] =
194
+ Pubid::Iso::Components::Code.new(number: subpart)
195
+ end
196
+
197
+ code_hash
198
+
199
+ when :directives_type
200
+ # nothing to do here, just return nil
201
+ nil
202
+
203
+ when :type_with_stage
204
+ # "WD"
205
+ # "PAS"
206
+ # "CD TR"
207
+ original_value = value.to_s # Store the original parsed value
208
+ iteration = original_value.match(/(\d+)$/)
209
+ normalized_value = original_value.sub(iteration.to_s, "")
210
+ typed_stage = locate_typed_stage(normalized_value || "")
211
+
212
+ # Create a copy with the original abbreviation preserved
213
+ typed_stage_with_original = typed_stage.dup
214
+ typed_stage_with_original.original_abbr = original_value.strip
215
+
216
+ ##
217
+ # Always use TypedStage in an Identifier or separate Type and Stage.
218
+ {
219
+ stage: typed_stage_with_original.to_stage,
220
+ type: typed_stage_with_original.to_type,
221
+ typed_stage: typed_stage_with_original,
222
+ }
223
+ when :stage_iteration
224
+ # "1" or "2"
225
+ Pubid::Iso::Components::Code.new(number: value.to_s)
226
+
227
+ when :date
228
+ parse_date(value)
229
+
230
+ when :edition
231
+ # value can be "Ed.2", "Ed 2", "ED1", "Edition 13", or just "Ed"
232
+ original_text = value.to_s
233
+ # Extract just the digit(s) for the number field
234
+ number_string = original_text.match(/\d+/)&.to_s
235
+ number_code = number_string ? Pubid::Iso::Components::Code.new(number: number_string) : nil
236
+ Pubid::Components::Edition.new(number: number_code,
237
+ original_text: original_text)
238
+
239
+ when :languages
240
+ parse_languages(value)
241
+
242
+ when :all_parts
243
+ # Set all_parts boolean attribute directly on identifier
244
+ true
245
+
246
+ # ISO 4214:2022 | IDF/RM 254:2022
247
+ when :joint_identifier
248
+ case value[:publisher]
249
+ when "IDF"
250
+ require_relative "../idf/builder"
251
+ Idf::Builder.new.build(value)
252
+ end
253
+
254
+ when :subgroup
255
+ # Handle JTC 1 subgroup in directives (ISO/IEC JTC 1 DIR)
256
+ # Store as a component for potential use in rendering
257
+ Pubid::Iso::Components::Code.new(number: value.to_s)
258
+
259
+ when :supplements
260
+ # Handle bundled supplements (+ operator)
261
+ # Each supplement is a hash that needs to be built
262
+ value.map { |supplement_hash| build(supplement_hash[:supplement]) }
263
+
264
+ when :base_document
265
+ # For bundled identifiers, build the base document
266
+ build(value)
267
+
268
+ # TC Document attributes
269
+ when :tc_type, :sc_type, :wg_type
270
+ # TC, SC, WG types are code components
271
+ Pubid::Iso::Components::Code.new(number: value.to_s)
272
+
273
+ when :tc_number, :sc_number, :wg_number
274
+ # TC, SC, WG numbers are code components
275
+ Pubid::Iso::Components::Code.new(number: value.to_s)
276
+
277
+ when :year
278
+ # For TC documents with year, convert to Date
279
+ Pubid::Components::Date.new(year: value.to_s)
280
+
281
+ when :number
282
+ # For TC documents, number is the document number (N number)
283
+ # For regular identifiers, this is handled in :number_with_part
284
+ if value.is_a?(Parslet::Slice) || value.is_a?(String) ||
285
+ value.is_a?(Integer)
286
+ Pubid::Iso::Components::Code.new(number: value.to_s)
287
+ else
288
+ value
289
+ end
290
+
291
+ when :stage
292
+ # Raw stage code from URN parser (e.g., "10.00", "50.00")
293
+ # Convert to type_with_stage format for builder
294
+ # Look up the typed stage from stage code
295
+ typed_stage = Scheme.locate_typed_stage_by_stage_code(value.to_s)
296
+ if typed_stage
297
+ typed_stage.abbr.is_a?(Array) ? typed_stage.abbr.first : typed_stage.abbr
298
+ else
299
+ # Fallback: return the raw stage code (shouldn't happen with valid data)
300
+ value.to_s
301
+ end
302
+
303
+ else
304
+ raise ArgumentError, "Unknown parameter type: #{type}"
305
+ end
306
+ end
307
+ end
308
+ end
309
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iso
5
+ # Identifier that represents a bundled identifier with base document and supplements
6
+ # E.g., "ISO/IEC DIR 1 + IEC SUP:2016-05" or "ISO/IEC DIR 1:2022 + IEC SUP:2022"
7
+ class BundledIdentifier < Identifier
8
+ attribute :base_document, Identifier, polymorphic: true
9
+ attribute :supplements, ::Pubid::Identifier, polymorphic: true,
10
+ collection: true
11
+ attribute :type, :string, default: -> { "bundled_identifier" }
12
+
13
+ # Delegate key attributes to base_document for easier access in tests
14
+ def publisher
15
+ base_document&.publisher
16
+ end
17
+
18
+ def number
19
+ base_document&.number
20
+ end
21
+
22
+ def part
23
+ base_document&.part
24
+ end
25
+
26
+ def date
27
+ base_document&.date
28
+ end
29
+
30
+ def typed_stage
31
+ base_document&.typed_stage
32
+ end
33
+
34
+ def copublishers
35
+ base_document&.copublishers
36
+ end
37
+
38
+ def to_s(lang: :en, lang_single: false, with_edition: false, format: nil,
39
+ stage_format_long: nil, with_date: nil)
40
+ parts = [base_document.to_s(lang: lang, lang_single: lang_single,
41
+ with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date)]
42
+
43
+ # Add each supplement with "+" separator
44
+ supplements.each do |supplement|
45
+ supplement_str = supplement.to_supplement_s(lang: lang, lang_single: lang_single,
46
+ with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date)
47
+ parts << "+ #{supplement_str}"
48
+ end
49
+
50
+ parts.join(" ")
51
+ end
52
+
53
+ # Generate URN for bundled identifier
54
+ # Format: urn:iso:doc:{base_urn}:{supplement_urn_parts}
55
+ # Example: urn:iso:doc:iso-iec:dir:1:2022:iec:sup:2022
56
+ def to_urn
57
+ # Start with base document URN (remove "urn:" prefix if exists)
58
+ base_urn = base_document.to_urn
59
+ base_parts = base_urn.split(":").drop(1) # Drop "urn" prefix
60
+
61
+ # Build URN parts starting with "urn"
62
+ urn_parts = ["urn"]
63
+
64
+ # Add base URN parts
65
+ urn_parts.concat(base_parts)
66
+
67
+ # Add each supplement's URN contribution
68
+ supplements.each do |supplement|
69
+ sup_urn = supplement.to_urn
70
+ if supplement.is_a?(Identifiers::DirectivesSupplement)
71
+ # DirectivesSupplement has special URN format
72
+ # Extract parts after "urn:iso:doc:"
73
+ else
74
+ # For other supplement types, add their URN parts
75
+ # Extract relevant parts and add them
76
+ end
77
+ sup_parts = sup_urn.split(":").drop(3)
78
+ urn_parts.concat(sup_parts)
79
+ end
80
+
81
+ urn_parts.join(":")
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iso
5
+ # Identifier that represents a supplement to a base identifier.
6
+ class CombinedIdentifier < Identifier
7
+ attribute :base_identifier, Identifier, polymorphic: true
8
+ attribute :additional_identifiers, ::Pubid::Identifier,
9
+ polymorphic: true, collection: true
10
+ attribute :type, :string, default: -> { "combined_identifier" }
11
+
12
+ def to_s(lang: :en, lang_single: false)
13
+ [
14
+ base_identifier.to_s(lang: lang, lang_single: lang_single),
15
+ additional_identifiers.map do |id|
16
+ id.to_s(lang: lang, lang_single: lang_single)
17
+ end,
18
+ ].flatten.join(" | ")
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Iso
7
+ module Components
8
+ class Code < ::Pubid::Components::Code
9
+ attribute :number, :string
10
+ attribute :parts, :string, collection: true
11
+
12
+ def value
13
+ number || self[:value]
14
+ end
15
+
16
+ def render(context: nil)
17
+ result = value.to_s
18
+ result += parts.map { |p| "-#{p}" }.join if parts&.any?
19
+ result
20
+ end
21
+
22
+ def to_s
23
+ result = value.to_s
24
+ result += parts.map { |p| "-#{p}" }.join if parts&.any?
25
+ result
26
+ end
27
+
28
+ def ==(other)
29
+ return false unless other.is_a?(Code)
30
+
31
+ value == other.value && parts == other.parts
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end