pubid 1.15.19 → 2.0.0.pre.alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.adoc +2041 -53
  4. data/archived-gems/pubid-ccsds/update_codes.yaml +1 -0
  5. data/archived-gems/pubid-iec/stages.yaml +129 -0
  6. data/archived-gems/pubid-iec/update_codes.yaml +67 -0
  7. data/archived-gems/pubid-ieee/update_codes.yaml +104 -0
  8. data/archived-gems/pubid-iso/stages.yaml +106 -0
  9. data/archived-gems/pubid-iso/update_codes.yaml +4 -0
  10. data/archived-gems/pubid-itu/i18n.yaml +13 -0
  11. data/archived-gems/pubid-itu/series.yaml +42 -0
  12. data/archived-gems/pubid-nist/publishers.yaml +6 -0
  13. data/archived-gems/pubid-nist/series.yaml +121 -0
  14. data/archived-gems/pubid-nist/stages.yaml +16 -0
  15. data/archived-gems/pubid-nist/update_codes.yaml +93 -0
  16. data/archived-gems/pubid-plateau/update_codes.yaml +6 -0
  17. data/data/ccsds/update_codes.yaml +1 -0
  18. data/data/iec/update_codes.yaml +67 -0
  19. data/data/ieee/update_codes.yaml +104 -0
  20. data/data/iso/update_codes.yaml +21 -0
  21. data/data/nist/update_codes.yaml +87 -0
  22. data/data/plateau/update_codes.yaml +6 -0
  23. data/lib/pubid/amca/builder.rb +176 -0
  24. data/lib/pubid/amca/identifier.rb +18 -0
  25. data/lib/pubid/amca/identifiers/base.rb +64 -0
  26. data/lib/pubid/amca/identifiers/interpretation.rb +51 -0
  27. data/lib/pubid/amca/identifiers/publication.rb +47 -0
  28. data/lib/pubid/amca/identifiers/standard.rb +22 -0
  29. data/lib/pubid/amca/identifiers.rb +12 -0
  30. data/lib/pubid/amca/parser.rb +153 -0
  31. data/lib/pubid/amca/scheme.rb +16 -0
  32. data/lib/pubid/amca/single_identifier.rb +33 -0
  33. data/lib/pubid/amca/urn_generator.rb +50 -0
  34. data/lib/pubid/amca.rb +26 -0
  35. data/lib/pubid/ansi/builder.rb +52 -0
  36. data/lib/pubid/ansi/identifier.rb +13 -0
  37. data/lib/pubid/ansi/identifiers/american_national_standard.rb +12 -0
  38. data/lib/pubid/ansi/identifiers/standard.rb +16 -0
  39. data/lib/pubid/ansi/identifiers.rb +11 -0
  40. data/lib/pubid/ansi/parser.rb +91 -0
  41. data/lib/pubid/ansi/scheme.rb +15 -0
  42. data/lib/pubid/ansi/single_identifier.rb +45 -0
  43. data/lib/pubid/ansi/urn_generator.rb +76 -0
  44. data/lib/pubid/ansi.rb +27 -0
  45. data/lib/pubid/api/builder.rb +85 -0
  46. data/lib/pubid/api/components/code.rb +9 -0
  47. data/lib/pubid/api/identifier.rb +21 -0
  48. data/lib/pubid/api/identifiers/base.rb +24 -0
  49. data/lib/pubid/api/identifiers/bulletin.rb +15 -0
  50. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +15 -0
  51. data/lib/pubid/api/identifiers/mpms.rb +44 -0
  52. data/lib/pubid/api/identifiers/publication.rb +15 -0
  53. data/lib/pubid/api/identifiers/recommended_practice.rb +15 -0
  54. data/lib/pubid/api/identifiers/specification.rb +15 -0
  55. data/lib/pubid/api/identifiers/standard.rb +15 -0
  56. data/lib/pubid/api/identifiers/technical_report.rb +15 -0
  57. data/lib/pubid/api/identifiers/typeless_standard.rb +27 -0
  58. data/lib/pubid/api/parser.rb +140 -0
  59. data/lib/pubid/api/scheme.rb +66 -0
  60. data/lib/pubid/api/single_identifier.rb +46 -0
  61. data/lib/pubid/api/urn_generator.rb +41 -0
  62. data/lib/pubid/api.rb +17 -0
  63. data/lib/pubid/ashrae/builder.rb +498 -0
  64. data/lib/pubid/ashrae/identifier.rb +18 -0
  65. data/lib/pubid/ashrae/identifiers/addenda_package.rb +46 -0
  66. data/lib/pubid/ashrae/identifiers/addendum.rb +55 -0
  67. data/lib/pubid/ashrae/identifiers/base.rb +23 -0
  68. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +51 -0
  69. data/lib/pubid/ashrae/identifiers/errata.rb +40 -0
  70. data/lib/pubid/ashrae/identifiers/guideline.rb +38 -0
  71. data/lib/pubid/ashrae/identifiers/interpretation.rb +39 -0
  72. data/lib/pubid/ashrae/identifiers/standard.rb +38 -0
  73. data/lib/pubid/ashrae/identifiers.rb +16 -0
  74. data/lib/pubid/ashrae/parser.rb +724 -0
  75. data/lib/pubid/ashrae/scheme.rb +53 -0
  76. data/lib/pubid/ashrae/single_identifier.rb +23 -0
  77. data/lib/pubid/ashrae/supplement_identifier.rb +23 -0
  78. data/lib/pubid/ashrae/urn_generator.rb +59 -0
  79. data/lib/pubid/ashrae.rb +21 -0
  80. data/lib/pubid/asme/builder.rb +153 -0
  81. data/lib/pubid/asme/components/code.rb +18 -0
  82. data/lib/pubid/asme/identifier.rb +15 -0
  83. data/lib/pubid/asme/identifiers/base.rb +70 -0
  84. data/lib/pubid/asme/identifiers/standard.rb +12 -0
  85. data/lib/pubid/asme/identifiers.rb +10 -0
  86. data/lib/pubid/asme/parser.rb +308 -0
  87. data/lib/pubid/asme/scheme.rb +37 -0
  88. data/lib/pubid/asme/single_identifier.rb +29 -0
  89. data/lib/pubid/asme/urn_generator.rb +133 -0
  90. data/lib/pubid/asme.rb +21 -0
  91. data/lib/pubid/astm/builder.rb +159 -0
  92. data/lib/pubid/astm/components/code.rb +33 -0
  93. data/lib/pubid/astm/identifier.rb +15 -0
  94. data/lib/pubid/astm/identifiers/adjunct.rb +21 -0
  95. data/lib/pubid/astm/identifiers/base.rb +13 -0
  96. data/lib/pubid/astm/identifiers/data_series.rb +25 -0
  97. data/lib/pubid/astm/identifiers/iso_dual_published.rb +74 -0
  98. data/lib/pubid/astm/identifiers/manual.rb +40 -0
  99. data/lib/pubid/astm/identifiers/monograph.rb +25 -0
  100. data/lib/pubid/astm/identifiers/research_report.rb +18 -0
  101. data/lib/pubid/astm/identifiers/standard.rb +52 -0
  102. data/lib/pubid/astm/identifiers/technical_report.rb +23 -0
  103. data/lib/pubid/astm/identifiers/work_in_progress.rb +21 -0
  104. data/lib/pubid/astm/parser.rb +244 -0
  105. data/lib/pubid/astm/scheme.rb +55 -0
  106. data/lib/pubid/astm/single_identifier.rb +25 -0
  107. data/lib/pubid/astm/urn_generator.rb +99 -0
  108. data/lib/pubid/astm.rb +38 -0
  109. data/lib/pubid/bsi/builder.rb +1483 -0
  110. data/lib/pubid/bsi/components/code.rb +11 -0
  111. data/lib/pubid/bsi/components/date.rb +11 -0
  112. data/lib/pubid/bsi/components/publisher.rb +11 -0
  113. data/lib/pubid/bsi/components/type.rb +11 -0
  114. data/lib/pubid/bsi/identifier.rb +27 -0
  115. data/lib/pubid/bsi/identifiers/addendum_document.rb +64 -0
  116. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +95 -0
  117. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +82 -0
  118. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +118 -0
  119. data/lib/pubid/bsi/identifiers/amendment.rb +40 -0
  120. data/lib/pubid/bsi/identifiers/base.rb +11 -0
  121. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +27 -0
  122. data/lib/pubid/bsi/identifiers/british_standard.rb +33 -0
  123. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +114 -0
  124. data/lib/pubid/bsi/identifiers/committee_document.rb +51 -0
  125. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +152 -0
  126. data/lib/pubid/bsi/identifiers/corrigendum.rb +28 -0
  127. data/lib/pubid/bsi/identifiers/detailed_specification.rb +69 -0
  128. data/lib/pubid/bsi/identifiers/disc.rb +56 -0
  129. data/lib/pubid/bsi/identifiers/draft_document.rb +71 -0
  130. data/lib/pubid/bsi/identifiers/electronic_book.rb +52 -0
  131. data/lib/pubid/bsi/identifiers/expert_commentary.rb +47 -0
  132. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +82 -0
  133. data/lib/pubid/bsi/identifiers/flex.rb +61 -0
  134. data/lib/pubid/bsi/identifiers/handbook.rb +39 -0
  135. data/lib/pubid/bsi/identifiers/index.rb +62 -0
  136. data/lib/pubid/bsi/identifiers/method.rb +76 -0
  137. data/lib/pubid/bsi/identifiers/national_annex.rb +73 -0
  138. data/lib/pubid/bsi/identifiers/practice_guide.rb +27 -0
  139. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +79 -0
  140. data/lib/pubid/bsi/identifiers/published_document.rb +79 -0
  141. data/lib/pubid/bsi/identifiers/section.rb +62 -0
  142. data/lib/pubid/bsi/identifiers/set.rb +46 -0
  143. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +40 -0
  144. data/lib/pubid/bsi/identifiers/supplement_document.rb +51 -0
  145. data/lib/pubid/bsi/identifiers/supplementary_index.rb +81 -0
  146. data/lib/pubid/bsi/identifiers/technical_specification.rb +79 -0
  147. data/lib/pubid/bsi/identifiers/test_method.rb +67 -0
  148. data/lib/pubid/bsi/identifiers/value_added_publication.rb +52 -0
  149. data/lib/pubid/bsi/identifiers.rb +52 -0
  150. data/lib/pubid/bsi/model.rb +196 -0
  151. data/lib/pubid/bsi/parser.rb +659 -0
  152. data/lib/pubid/bsi/scheme.rb +243 -0
  153. data/lib/pubid/bsi/single_identifier.rb +129 -0
  154. data/lib/pubid/bsi/urn_generator.rb +84 -0
  155. data/lib/pubid/bsi.rb +32 -0
  156. data/lib/pubid/builder/base.rb +138 -0
  157. data/lib/pubid/bundled_identifier.rb +126 -0
  158. data/lib/pubid/ccsds/builder.rb +56 -0
  159. data/lib/pubid/ccsds/identifier.rb +16 -0
  160. data/lib/pubid/ccsds/identifiers/base.rb +78 -0
  161. data/lib/pubid/ccsds/identifiers/base_BASE_88929.rb +70 -0
  162. data/lib/pubid/ccsds/identifiers/corrigendum.rb +39 -0
  163. data/lib/pubid/ccsds/identifiers.rb +10 -0
  164. data/lib/pubid/ccsds/parser.rb +71 -0
  165. data/lib/pubid/ccsds/scheme.rb +57 -0
  166. data/lib/pubid/ccsds/single_identifier.rb +74 -0
  167. data/lib/pubid/ccsds/supplement_identifier.rb +33 -0
  168. data/lib/pubid/ccsds/urn_generator.rb +115 -0
  169. data/lib/pubid/ccsds.rb +21 -0
  170. data/lib/pubid/cen_cenelec/builder.rb +330 -0
  171. data/lib/pubid/cen_cenelec/identifier.rb +15 -0
  172. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +40 -0
  173. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +29 -0
  174. data/lib/pubid/cen_cenelec/identifiers/base.rb +75 -0
  175. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +28 -0
  176. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +27 -0
  177. data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +28 -0
  178. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +61 -0
  179. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +35 -0
  180. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +41 -0
  181. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +37 -0
  182. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +28 -0
  183. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +22 -0
  184. data/lib/pubid/cen_cenelec/identifiers/guide.rb +27 -0
  185. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +27 -0
  186. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +27 -0
  187. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +35 -0
  188. data/lib/pubid/cen_cenelec/identifiers.rb +32 -0
  189. data/lib/pubid/cen_cenelec/parser.rb +144 -0
  190. data/lib/pubid/cen_cenelec/scheme.rb +164 -0
  191. data/lib/pubid/cen_cenelec/single_identifier.rb +130 -0
  192. data/lib/pubid/cen_cenelec/supplement_identifier.rb +48 -0
  193. data/lib/pubid/cen_cenelec/urn_generator.rb +129 -0
  194. data/lib/pubid/cen_cenelec.rb +21 -0
  195. data/lib/pubid/cie/builder.rb +399 -0
  196. data/lib/pubid/cie/components/code.rb +72 -0
  197. data/lib/pubid/cie/components/language.rb +58 -0
  198. data/lib/pubid/cie/identifier.rb +18 -0
  199. data/lib/pubid/cie/identifiers/bundle.rb +20 -0
  200. data/lib/pubid/cie/identifiers/conference.rb +32 -0
  201. data/lib/pubid/cie/identifiers/corrigendum.rb +40 -0
  202. data/lib/pubid/cie/identifiers/dual_published.rb +41 -0
  203. data/lib/pubid/cie/identifiers/identical.rb +64 -0
  204. data/lib/pubid/cie/identifiers/joint_published.rb +52 -0
  205. data/lib/pubid/cie/identifiers/standard.rb +58 -0
  206. data/lib/pubid/cie/identifiers/supplement.rb +45 -0
  207. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +20 -0
  208. data/lib/pubid/cie/identifiers.rb +17 -0
  209. data/lib/pubid/cie/parser.rb +347 -0
  210. data/lib/pubid/cie/scheme.rb +64 -0
  211. data/lib/pubid/cie/single_identifier.rb +30 -0
  212. data/lib/pubid/cie/supplement_identifier.rb +26 -0
  213. data/lib/pubid/cie/urn_generator.rb +123 -0
  214. data/lib/pubid/cie.rb +28 -0
  215. data/lib/pubid/components/code.rb +33 -0
  216. data/lib/pubid/components/date.rb +49 -0
  217. data/lib/pubid/components/edition.rb +32 -0
  218. data/lib/pubid/components/language.rb +37 -0
  219. data/lib/pubid/components/locality.rb +10 -0
  220. data/lib/pubid/components/publisher.rb +36 -0
  221. data/lib/pubid/components/stage.rb +54 -0
  222. data/lib/pubid/components/type.rb +58 -0
  223. data/lib/pubid/components/typed_stage.rb +55 -0
  224. data/lib/pubid/components.rb +15 -0
  225. data/lib/pubid/core/pattern_doc_generator.rb +272 -0
  226. data/lib/pubid/core/update_codes.rb +77 -0
  227. data/lib/pubid/core.rb +8 -0
  228. data/lib/pubid/csa/builder.rb +671 -0
  229. data/lib/pubid/csa/components/code.rb +9 -0
  230. data/lib/pubid/csa/components.rb +9 -0
  231. data/lib/pubid/csa/composite_identifier.rb +27 -0
  232. data/lib/pubid/csa/identifier.rb +457 -0
  233. data/lib/pubid/csa/identifiers/base.rb +133 -0
  234. data/lib/pubid/csa/identifiers/bundled.rb +125 -0
  235. data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
  236. data/lib/pubid/csa/identifiers/cec.rb +129 -0
  237. data/lib/pubid/csa/identifiers/combined.rb +130 -0
  238. data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
  239. data/lib/pubid/csa/identifiers/package.rb +65 -0
  240. data/lib/pubid/csa/identifiers/series.rb +127 -0
  241. data/lib/pubid/csa/identifiers/standard.rb +10 -0
  242. data/lib/pubid/csa/identifiers.rb +17 -0
  243. data/lib/pubid/csa/parser.rb +445 -0
  244. data/lib/pubid/csa/scheme.rb +44 -0
  245. data/lib/pubid/csa/single_identifier.rb +30 -0
  246. data/lib/pubid/csa/urn_generator.rb +80 -0
  247. data/lib/pubid/csa/wrapper_identifier.rb +31 -0
  248. data/lib/pubid/csa.rb +25 -0
  249. data/lib/pubid/etsi/builder.rb +133 -0
  250. data/lib/pubid/etsi/components/code.rb +42 -0
  251. data/lib/pubid/etsi/components/version.rb +37 -0
  252. data/lib/pubid/etsi/components.rb +10 -0
  253. data/lib/pubid/etsi/identifier.rb +14 -0
  254. data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
  255. data/lib/pubid/etsi/identifiers/base.rb +38 -0
  256. data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
  257. data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
  258. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
  259. data/lib/pubid/etsi/identifiers.rb +14 -0
  260. data/lib/pubid/etsi/parser.rb +133 -0
  261. data/lib/pubid/etsi/scheme.rb +42 -0
  262. data/lib/pubid/etsi/urn_generator.rb +76 -0
  263. data/lib/pubid/etsi.rb +21 -0
  264. data/lib/pubid/export/auditor.rb +89 -0
  265. data/lib/pubid/export/data_class_exporter.rb +59 -0
  266. data/lib/pubid/export/exporter.rb +74 -0
  267. data/lib/pubid/export/flavor_exporter.rb +402 -0
  268. data/lib/pubid/export/ieee_exporter.rb +78 -0
  269. data/lib/pubid/export/itu_exporter.rb +66 -0
  270. data/lib/pubid/export/nist_exporter.rb +64 -0
  271. data/lib/pubid/export/registry_exporter.rb +90 -0
  272. data/lib/pubid/export/result.rb +97 -0
  273. data/lib/pubid/export/scheme_exporter.rb +70 -0
  274. data/lib/pubid/export.rb +18 -0
  275. data/lib/pubid/format_detector.rb +16 -0
  276. data/lib/pubid/format_registry.rb +42 -0
  277. data/lib/pubid/identifier.rb +235 -0
  278. data/lib/pubid/identifier_metadata.rb +148 -0
  279. data/lib/pubid/identifier_registry.rb +198 -0
  280. data/lib/pubid/idf/builder.rb +82 -0
  281. data/lib/pubid/idf/identifier.rb +69 -0
  282. data/lib/pubid/idf/identifiers/amendment.rb +27 -0
  283. data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
  284. data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
  285. data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
  286. data/lib/pubid/idf/identifiers.rb +13 -0
  287. data/lib/pubid/idf/parser.rb +143 -0
  288. data/lib/pubid/idf/scheme.rb +61 -0
  289. data/lib/pubid/idf/single_identifier.rb +19 -0
  290. data/lib/pubid/idf/supplement_identifier.rb +43 -0
  291. data/lib/pubid/idf/urn_generator.rb +84 -0
  292. data/lib/pubid/idf.rb +25 -0
  293. data/lib/pubid/iec/builder.rb +457 -0
  294. data/lib/pubid/iec/components/code.rb +59 -0
  295. data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
  296. data/lib/pubid/iec/components/publisher.rb +35 -0
  297. data/lib/pubid/iec/components/sheet.rb +32 -0
  298. data/lib/pubid/iec/components/trf_info.rb +38 -0
  299. data/lib/pubid/iec/components/vap_suffix.rb +41 -0
  300. data/lib/pubid/iec/identifier.rb +21 -0
  301. data/lib/pubid/iec/identifiers/amendment.rb +94 -0
  302. data/lib/pubid/iec/identifiers/base.rb +78 -0
  303. data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
  304. data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
  305. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +86 -0
  306. data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
  307. data/lib/pubid/iec/identifiers/fragment_identifier.rb +141 -0
  308. data/lib/pubid/iec/identifiers/guide.rb +104 -0
  309. data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
  310. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
  311. data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
  312. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
  313. data/lib/pubid/iec/identifiers/sheet_identifier.rb +66 -0
  314. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
  315. data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
  316. data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
  317. data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
  318. data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
  319. data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
  320. data/lib/pubid/iec/identifiers/vap_identifier.rb +77 -0
  321. data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
  322. data/lib/pubid/iec/identifiers/working_document.rb +96 -0
  323. data/lib/pubid/iec/parser.rb +412 -0
  324. data/lib/pubid/iec/rendering_style.rb +113 -0
  325. data/lib/pubid/iec/scheme.rb +71 -0
  326. data/lib/pubid/iec/single_identifier.rb +80 -0
  327. data/lib/pubid/iec/supplement_identifier.rb +161 -0
  328. data/lib/pubid/iec/urn_generator.rb +193 -0
  329. data/lib/pubid/iec/urn_parser.rb +289 -0
  330. data/lib/pubid/iec.rb +85 -0
  331. data/lib/pubid/ieee/aiee/builder.rb +71 -0
  332. data/lib/pubid/ieee/aiee/identifier.rb +105 -0
  333. data/lib/pubid/ieee/aiee/parser.rb +130 -0
  334. data/lib/pubid/ieee/aiee.rb +11 -0
  335. data/lib/pubid/ieee/builder.rb +1237 -0
  336. data/lib/pubid/ieee/components/code.rb +102 -0
  337. data/lib/pubid/ieee/components/draft.rb +93 -0
  338. data/lib/pubid/ieee/components/relationship.rb +157 -0
  339. data/lib/pubid/ieee/components/typed_stage.rb +100 -0
  340. data/lib/pubid/ieee/identifier.rb +13 -0
  341. data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
  342. data/lib/pubid/ieee/identifiers/base.rb +591 -0
  343. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
  344. data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
  345. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
  346. data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
  347. data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
  348. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
  349. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
  350. data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
  351. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
  352. data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
  353. data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
  354. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
  355. data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
  356. data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
  357. data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
  358. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
  359. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
  360. data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
  361. data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
  362. data/lib/pubid/ieee/identifiers/standard.rb +41 -0
  363. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
  364. data/lib/pubid/ieee/identifiers.rb +33 -0
  365. data/lib/pubid/ieee/ire/builder.rb +61 -0
  366. data/lib/pubid/ieee/ire/identifier.rb +58 -0
  367. data/lib/pubid/ieee/ire/parser.rb +91 -0
  368. data/lib/pubid/ieee/ire.rb +11 -0
  369. data/lib/pubid/ieee/nesc/builder.rb +101 -0
  370. data/lib/pubid/ieee/nesc/parser.rb +154 -0
  371. data/lib/pubid/ieee/nesc.rb +10 -0
  372. data/lib/pubid/ieee/parser.rb +1226 -0
  373. data/lib/pubid/ieee/scheme.rb +90 -0
  374. data/lib/pubid/ieee/typed_stages.rb +172 -0
  375. data/lib/pubid/ieee/urn_generator.rb +188 -0
  376. data/lib/pubid/ieee.rb +32 -0
  377. data/lib/pubid/ieee_debug.rb +31 -0
  378. data/lib/pubid/iho/builder.rb +37 -0
  379. data/lib/pubid/iho/identifier.rb +19 -0
  380. data/lib/pubid/iho/identifiers/base.rb +41 -0
  381. data/lib/pubid/iho/identifiers/bibliographic.rb +20 -0
  382. data/lib/pubid/iho/identifiers/circular_letter.rb +19 -0
  383. data/lib/pubid/iho/identifiers/miscellaneous.rb +20 -0
  384. data/lib/pubid/iho/identifiers/publication.rb +19 -0
  385. data/lib/pubid/iho/identifiers/standard.rb +19 -0
  386. data/lib/pubid/iho/identifiers.rb +14 -0
  387. data/lib/pubid/iho/parser.rb +68 -0
  388. data/lib/pubid/iho/scheme.rb +29 -0
  389. data/lib/pubid/iho/urn_generator.rb +29 -0
  390. data/lib/pubid/iho.rb +21 -0
  391. data/lib/pubid/iso/builder.rb +305 -0
  392. data/lib/pubid/iso/bundled_identifier.rb +85 -0
  393. data/lib/pubid/iso/combined_identifier.rb +22 -0
  394. data/lib/pubid/iso/components/code.rb +36 -0
  395. data/lib/pubid/iso/components/publisher.rb +60 -0
  396. data/lib/pubid/iso/components.rb +12 -0
  397. data/lib/pubid/iso/format_resolver.rb +45 -0
  398. data/lib/pubid/iso/identifier.rb +69 -0
  399. data/lib/pubid/iso/identifiers/addendum.rb +104 -0
  400. data/lib/pubid/iso/identifiers/amendment.rb +128 -0
  401. data/lib/pubid/iso/identifiers/base.rb +115 -0
  402. data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
  403. data/lib/pubid/iso/identifiers/data.rb +76 -0
  404. data/lib/pubid/iso/identifiers/directives.rb +59 -0
  405. data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
  406. data/lib/pubid/iso/identifiers/extract.rb +30 -0
  407. data/lib/pubid/iso/identifiers/guide.rb +100 -0
  408. data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
  409. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
  410. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +89 -0
  411. data/lib/pubid/iso/identifiers/pas.rb +93 -0
  412. data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
  413. data/lib/pubid/iso/identifiers/supplement.rb +87 -0
  414. data/lib/pubid/iso/identifiers/tc_document.rb +108 -0
  415. data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
  416. data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
  417. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
  418. data/lib/pubid/iso/identifiers.rb +33 -0
  419. data/lib/pubid/iso/parser.rb +510 -0
  420. data/lib/pubid/iso/rendering_style.rb +120 -0
  421. data/lib/pubid/iso/scheme.rb +187 -0
  422. data/lib/pubid/iso/single_identifier.rb +61 -0
  423. data/lib/pubid/iso/supplement_identifier.rb +27 -0
  424. data/lib/pubid/iso/urn_generator.rb +412 -0
  425. data/lib/pubid/iso/urn_parser.rb +423 -0
  426. data/lib/pubid/iso/utilities.rb +86 -0
  427. data/lib/pubid/iso.rb +50 -0
  428. data/lib/pubid/itu/builder.rb +171 -0
  429. data/lib/pubid/itu/components/code.rb +39 -0
  430. data/lib/pubid/itu/components/sector.rb +35 -0
  431. data/lib/pubid/itu/components/series.rb +29 -0
  432. data/lib/pubid/itu/i18n.rb +9 -0
  433. data/lib/pubid/itu/i18n.yaml +30 -0
  434. data/lib/pubid/itu/identifier.rb +53 -0
  435. data/lib/pubid/itu/identifiers/amendment.rb +43 -0
  436. data/lib/pubid/itu/identifiers/annex.rb +74 -0
  437. data/lib/pubid/itu/identifiers/base.rb +154 -0
  438. data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
  439. data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
  440. data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
  441. data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
  442. data/lib/pubid/itu/identifiers/supplement.rb +46 -0
  443. data/lib/pubid/itu/identifiers.rb +16 -0
  444. data/lib/pubid/itu/model.rb +111 -0
  445. data/lib/pubid/itu/parser.rb +225 -0
  446. data/lib/pubid/itu/scheme.rb +174 -0
  447. data/lib/pubid/itu/urn_generator.rb +105 -0
  448. data/lib/pubid/itu.rb +22 -0
  449. data/lib/pubid/jcgm/builder.rb +88 -0
  450. data/lib/pubid/jcgm/components/publisher.rb +20 -0
  451. data/lib/pubid/jcgm/components.rb +9 -0
  452. data/lib/pubid/jcgm/identifier.rb +11 -0
  453. data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
  454. data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
  455. data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
  456. data/lib/pubid/jcgm/identifiers.rb +11 -0
  457. data/lib/pubid/jcgm/parser.rb +84 -0
  458. data/lib/pubid/jcgm/scheme.rb +60 -0
  459. data/lib/pubid/jcgm/single_identifier.rb +48 -0
  460. data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
  461. data/lib/pubid/jcgm/urn_generator.rb +110 -0
  462. data/lib/pubid/jcgm.rb +31 -0
  463. data/lib/pubid/jis/builder.rb +124 -0
  464. data/lib/pubid/jis/components/code.rb +59 -0
  465. data/lib/pubid/jis/components.rb +9 -0
  466. data/lib/pubid/jis/identifier.rb +18 -0
  467. data/lib/pubid/jis/identifiers/amendment.rb +16 -0
  468. data/lib/pubid/jis/identifiers/base.rb +72 -0
  469. data/lib/pubid/jis/identifiers/explanation.rb +22 -0
  470. data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
  471. data/lib/pubid/jis/identifiers/standard.rb +27 -0
  472. data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
  473. data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
  474. data/lib/pubid/jis/identifiers.rb +17 -0
  475. data/lib/pubid/jis/parser.rb +109 -0
  476. data/lib/pubid/jis/scheme.rb +49 -0
  477. data/lib/pubid/jis/single_identifier.rb +37 -0
  478. data/lib/pubid/jis/supplement_identifier.rb +47 -0
  479. data/lib/pubid/jis/urn_generator.rb +25 -0
  480. data/lib/pubid/jis.rb +23 -0
  481. data/lib/pubid/lutaml/no_store_registration.rb +30 -0
  482. data/lib/pubid/nist/builder.rb +2100 -0
  483. data/lib/pubid/nist/components/code.rb +38 -0
  484. data/lib/pubid/nist/components/edition.rb +118 -0
  485. data/lib/pubid/nist/components/issue_number.rb +28 -0
  486. data/lib/pubid/nist/components/part.rb +77 -0
  487. data/lib/pubid/nist/components/publisher.rb +24 -0
  488. data/lib/pubid/nist/components/stage.rb +53 -0
  489. data/lib/pubid/nist/components/supplement.rb +121 -0
  490. data/lib/pubid/nist/components/translation.rb +42 -0
  491. data/lib/pubid/nist/components/update.rb +103 -0
  492. data/lib/pubid/nist/components/version.rb +35 -0
  493. data/lib/pubid/nist/components/volume.rb +32 -0
  494. data/lib/pubid/nist/components.rb +19 -0
  495. data/lib/pubid/nist/configuration.rb +77 -0
  496. data/lib/pubid/nist/identifiers/base.rb +499 -0
  497. data/lib/pubid/nist/identifiers/circular.rb +68 -0
  498. data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
  499. data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
  500. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
  501. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
  502. data/lib/pubid/nist/identifiers/crpl_report.rb +135 -0
  503. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +94 -0
  504. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
  505. data/lib/pubid/nist/identifiers/handbook.rb +50 -0
  506. data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
  507. data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
  508. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
  509. data/lib/pubid/nist/identifiers/monograph.rb +69 -0
  510. data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
  511. data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
  512. data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
  513. data/lib/pubid/nist/identifiers/report.rb +68 -0
  514. data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
  515. data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
  516. data/lib/pubid/nist/identifiers.rb +33 -0
  517. data/lib/pubid/nist/parser.rb +1084 -0
  518. data/lib/pubid/nist/scheme.rb +199 -0
  519. data/lib/pubid/nist/supplement_identifier.rb +83 -0
  520. data/lib/pubid/nist/urn_generator.rb +127 -0
  521. data/lib/pubid/nist.rb +36 -0
  522. data/lib/pubid/oiml/builder.rb +189 -0
  523. data/lib/pubid/oiml/components/code.rb +20 -0
  524. data/lib/pubid/oiml/components.rb +9 -0
  525. data/lib/pubid/oiml/identifier.rb +11 -0
  526. data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
  527. data/lib/pubid/oiml/identifiers/annex.rb +62 -0
  528. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  529. data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
  530. data/lib/pubid/oiml/identifiers/document.rb +13 -0
  531. data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
  532. data/lib/pubid/oiml/identifiers/guide.rb +13 -0
  533. data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
  534. data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
  535. data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
  536. data/lib/pubid/oiml/identifiers.rb +18 -0
  537. data/lib/pubid/oiml/parser.rb +173 -0
  538. data/lib/pubid/oiml/scheme.rb +46 -0
  539. data/lib/pubid/oiml/single_identifier.rb +90 -0
  540. data/lib/pubid/oiml/supplement_identifier.rb +43 -0
  541. data/lib/pubid/oiml/urn_generator.rb +64 -0
  542. data/lib/pubid/oiml.rb +26 -0
  543. data/lib/pubid/parser/common_parse_methods.rb +13 -0
  544. data/lib/pubid/parser/common_parse_rules.rb +56 -0
  545. data/lib/pubid/parser.rb +8 -0
  546. data/lib/pubid/parsers/base.rb +11 -0
  547. data/lib/pubid/parsers/mr_string.rb +93 -0
  548. data/lib/pubid/plateau/builder.rb +50 -0
  549. data/lib/pubid/plateau/identifiers/annex.rb +16 -0
  550. data/lib/pubid/plateau/identifiers/base.rb +51 -0
  551. data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
  552. data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
  553. data/lib/pubid/plateau/identifiers.rb +12 -0
  554. data/lib/pubid/plateau/parser.rb +63 -0
  555. data/lib/pubid/plateau/scheme.rb +45 -0
  556. data/lib/pubid/plateau/supplement_identifier.rb +72 -0
  557. data/lib/pubid/plateau/urn_generator.rb +29 -0
  558. data/lib/pubid/plateau.rb +25 -0
  559. data/lib/pubid/renderers/base.rb +19 -0
  560. data/lib/pubid/renderers/directives_renderer.rb +62 -0
  561. data/lib/pubid/renderers/guide_renderer.rb +20 -0
  562. data/lib/pubid/renderers/human_readable.rb +58 -0
  563. data/lib/pubid/renderers/iwa_renderer.rb +16 -0
  564. data/lib/pubid/renderers/mr_string.rb +16 -0
  565. data/lib/pubid/renderers/supplement_renderer.rb +33 -0
  566. data/lib/pubid/renderers/urn.rb +11 -0
  567. data/lib/pubid/renderers.rb +14 -0
  568. data/lib/pubid/rendering/base.rb +73 -0
  569. data/lib/pubid/rendering/common.rb +211 -0
  570. data/lib/pubid/rendering/context.rb +156 -0
  571. data/lib/pubid/rendering/date.rb +27 -0
  572. data/lib/pubid/rendering/format.rb +25 -0
  573. data/lib/pubid/rendering/language.rb +21 -0
  574. data/lib/pubid/rendering/numbering.rb +24 -0
  575. data/lib/pubid/rendering/publisher.rb +25 -0
  576. data/lib/pubid/rendering/stage.rb +38 -0
  577. data/lib/pubid/rendering/supplement.rb +46 -0
  578. data/lib/pubid/rendering.rb +16 -0
  579. data/lib/pubid/sae/builder.rb +32 -0
  580. data/lib/pubid/sae/components/code.rb +9 -0
  581. data/lib/pubid/sae/components/date.rb +19 -0
  582. data/lib/pubid/sae/components/type.rb +19 -0
  583. data/lib/pubid/sae/components.rb +11 -0
  584. data/lib/pubid/sae/identifier.rb +14 -0
  585. data/lib/pubid/sae/identifiers/base.rb +42 -0
  586. data/lib/pubid/sae/identifiers.rb +9 -0
  587. data/lib/pubid/sae/parser.rb +55 -0
  588. data/lib/pubid/sae/scheme.rb +47 -0
  589. data/lib/pubid/sae/urn_generator.rb +38 -0
  590. data/lib/pubid/sae.rb +19 -0
  591. data/lib/pubid/scheme.rb +207 -0
  592. data/lib/pubid/urn_generator/base.rb +110 -0
  593. data/lib/pubid/utils/string_normalizer.rb +196 -0
  594. data/lib/pubid/utils.rb +7 -0
  595. data/lib/pubid/version.rb +3 -1
  596. data/lib/pubid.rb +137 -13
  597. data/lib/tasks/docs.rake +37 -0
  598. data/lib/tasks/export.rake +38 -0
  599. data/lib/tasks/website-data.json +7488 -0
  600. metadata +613 -171
  601. data/lib/pubid/registry.rb +0 -30
@@ -0,0 +1,19 @@
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
+
13
+ def type
14
+ self.class.type
15
+ end
16
+ end
17
+ end
18
+ end
19
+ 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.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,305 @@
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
+ Pubid::Iso::Components::Publisher.new(publisher: value)
129
+ end
130
+
131
+ when :copublishers
132
+ # Copublishers already merged into publisher
133
+ # Create array of Publisher objects for identifier.copublishers attribute
134
+ if value.nil? || value.empty?
135
+ nil
136
+ else
137
+ value.map do |copublisher|
138
+ Pubid::Iso::Components::Publisher.new(publisher: copublisher[:copublisher])
139
+ end
140
+ end
141
+
142
+ when :year
143
+ # For TC documents, parser returns :year but identifier uses :date
144
+ # Return as date for assignment
145
+ { date: Pubid::Components::Date.new(year: value.to_s) }
146
+
147
+ when :number_with_part
148
+ # "1234" (no part)
149
+ # or "1234-1" ('1' is part)
150
+ # or "1234-1-2" ('1' is part, '2' is subpart)
151
+ # or "29110-5-1-1" ('5' is part, '1-1' is subpart)
152
+ # or "105/F" ('F' is part)
153
+ # or "5843/6" ('6' is part)
154
+ # LEGACY: "4037-1979" (number-year, year should become date)
155
+
156
+ # Split the number into parts
157
+ normalized_value = value.to_s.tr("#{Parser::DASH_CHARS.join}/", "-")
158
+
159
+ # for "1 IEC" ('IEC' is part) (in case of "ISO/IEC DIR 1 IEC")
160
+ normalized_value.gsub!(" ", "-")
161
+
162
+ parts = normalized_value.split("-").reject(&:empty?)
163
+ number = parts.shift # The first part is always the number
164
+ part = parts.shift&.strip # The second part is the part, if present
165
+ subpart = parts.any? ? parts.join("-") : nil # The remaining parts form the subpart, if present
166
+
167
+ # LEGACY FORMAT FIX: If "part" is a 4-digit year (1900-2099), move it to date field
168
+ # This handles legacy formats like "ISO 4037-1979" where hyphen was used instead of colon
169
+ if part&.match?(/^\d{4}$/)
170
+ year_value = part.to_i
171
+ # Only treat as year if in reasonable year range (excludes part numbers like "1751")
172
+ if year_value.between?(1900, 2099)
173
+ return {
174
+ number: Pubid::Iso::Components::Code.new(number: number),
175
+ date: Pubid::Components::Date.new(year: part),
176
+ }
177
+ end
178
+ end
179
+
180
+ part = convert_roman_to_integer(part)
181
+
182
+ code_hash = { number: Pubid::Iso::Components::Code.new(number: number) }
183
+
184
+ if part
185
+ code_hash[:part] = Pubid::Iso::Components::Code.new(number: part)
186
+ end
187
+
188
+ if subpart
189
+ code_hash[:subpart] =
190
+ Pubid::Iso::Components::Code.new(number: subpart)
191
+ end
192
+
193
+ code_hash
194
+
195
+ when :directives_type
196
+ # nothing to do here, just return nil
197
+ nil
198
+
199
+ when :type_with_stage
200
+ # "WD"
201
+ # "PAS"
202
+ # "CD TR"
203
+ original_value = value.to_s # Store the original parsed value
204
+ iteration = original_value.match(/(\d+)$/)
205
+ normalized_value = original_value.sub(iteration.to_s, "")
206
+ typed_stage = locate_typed_stage(normalized_value || "")
207
+
208
+ # Create a copy with the original abbreviation preserved
209
+ typed_stage_with_original = typed_stage.dup
210
+ typed_stage_with_original.original_abbr = original_value.strip
211
+
212
+ ##
213
+ # Always use TypedStage in an Identifier or separate Type and Stage.
214
+ {
215
+ stage: typed_stage_with_original.to_stage,
216
+ type: typed_stage_with_original.to_type,
217
+ typed_stage: typed_stage_with_original,
218
+ }
219
+ when :stage_iteration
220
+ # "1" or "2"
221
+ Pubid::Iso::Components::Code.new(number: value.to_s)
222
+
223
+ when :date
224
+ parse_date(value)
225
+
226
+ when :edition
227
+ # value can be "Ed.2", "Ed 2", "ED1", "Edition 13", or just "Ed"
228
+ original_text = value.to_s
229
+ # Extract just the digit(s) for the number field
230
+ number_string = original_text.match(/\d+/)&.to_s
231
+ number_code = number_string ? Pubid::Iso::Components::Code.new(number: number_string) : nil
232
+ Pubid::Components::Edition.new(number: number_code,
233
+ original_text: original_text)
234
+
235
+ when :languages
236
+ parse_languages(value)
237
+
238
+ when :all_parts
239
+ # Set all_parts boolean attribute directly on identifier
240
+ true
241
+
242
+ # ISO 4214:2022 | IDF/RM 254:2022
243
+ when :joint_identifier
244
+ case value[:publisher]
245
+ when "IDF"
246
+ require_relative "../idf/builder"
247
+ Idf::Builder.new.build(value)
248
+ end
249
+
250
+ when :subgroup
251
+ # Handle JTC 1 subgroup in directives (ISO/IEC JTC 1 DIR)
252
+ # Store as a component for potential use in rendering
253
+ Pubid::Iso::Components::Code.new(number: value.to_s)
254
+
255
+ when :supplements
256
+ # Handle bundled supplements (+ operator)
257
+ # Each supplement is a hash that needs to be built
258
+ value.map { |supplement_hash| build(supplement_hash[:supplement]) }
259
+
260
+ when :base_document
261
+ # For bundled identifiers, build the base document
262
+ build(value)
263
+
264
+ # TC Document attributes
265
+ when :tc_type, :sc_type, :wg_type
266
+ # TC, SC, WG types are code components
267
+ Pubid::Iso::Components::Code.new(number: value.to_s)
268
+
269
+ when :tc_number, :sc_number, :wg_number
270
+ # TC, SC, WG numbers are code components
271
+ Pubid::Iso::Components::Code.new(number: value.to_s)
272
+
273
+ when :year
274
+ # For TC documents with year, convert to Date
275
+ Pubid::Components::Date.new(year: value.to_s)
276
+
277
+ when :number
278
+ # For TC documents, number is the document number (N number)
279
+ # For regular identifiers, this is handled in :number_with_part
280
+ if value.is_a?(Parslet::Slice) || value.is_a?(String) ||
281
+ value.is_a?(Integer)
282
+ Pubid::Iso::Components::Code.new(number: value.to_s)
283
+ else
284
+ value
285
+ end
286
+
287
+ when :stage
288
+ # Raw stage code from URN parser (e.g., "10.00", "50.00")
289
+ # Convert to type_with_stage format for builder
290
+ # Look up the typed stage from stage code
291
+ typed_stage = Scheme.locate_typed_stage_by_stage_code(value.to_s)
292
+ if typed_stage
293
+ typed_stage.abbr.is_a?(Array) ? typed_stage.abbr.first : typed_stage.abbr
294
+ else
295
+ # Fallback: return the raw stage code (shouldn't happen with valid data)
296
+ value.to_s
297
+ end
298
+
299
+ else
300
+ raise ArgumentError, "Unknown parameter type: #{type}"
301
+ end
302
+ end
303
+ end
304
+ end
305
+ 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
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Iso
7
+ module Components
8
+ # ISO Publisher with copublisher support
9
+ # Examples: ISO, ISO/IEC, ISO/IEC/IEEE
10
+ class Publisher < Lutaml::Model::Serializable
11
+ attribute :publisher, :string, default: -> { "ISO" }
12
+ attribute :copublisher, :string, collection: true
13
+
14
+ def body
15
+ publisher
16
+ end
17
+
18
+ def render(context: nil)
19
+ return publisher unless copublisher&.any?
20
+
21
+ publisher + copublisher.map { |cp| "/#{cp}" }.join
22
+ end
23
+
24
+ def to_s
25
+ result = publisher
26
+ result += copublisher.map { |cp| "/#{cp}" }.join if copublisher&.any?
27
+ result
28
+ end
29
+
30
+ def has_copublisher?
31
+ copublisher&.any?
32
+ end
33
+
34
+ def copublished?
35
+ copublisher&.any?
36
+ end
37
+
38
+ def ==(other)
39
+ return false unless other.is_a?(Publisher)
40
+
41
+ publisher == other.publisher && copublisher == other.copublisher
42
+ end
43
+
44
+ # Returns hash code for publisher component
45
+ # @return [Integer] hash code
46
+ # @note Memoized for performance
47
+ def hash
48
+ @hash ||= [publisher, copublisher].compact.map(&:hash).hash
49
+ end
50
+
51
+ # Checks equality using hash for consistency
52
+ # @param other [Object] object to compare with
53
+ # @return [Boolean] true if equal
54
+ def eql?(other)
55
+ hash == other.hash && self == other
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end