pubid 1.15.18 → 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,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module UrnGenerator
5
+ # Base class for all flavor-specific URN generators.
6
+ # Provides template methods for common URN parts.
7
+ # Flavors subclass and override only what differs.
8
+ class Base
9
+ attr_reader :identifier
10
+
11
+ def initialize(identifier)
12
+ @identifier = identifier
13
+ end
14
+
15
+ def generate
16
+ parts = ["urn", urn_namespace]
17
+ parts << urn_publisher if urn_publisher
18
+ parts << urn_type if urn_type
19
+ parts << urn_number if urn_number
20
+ parts << urn_part if urn_part
21
+ parts << urn_subpart if urn_subpart
22
+ parts << urn_year if urn_year
23
+ parts << urn_edition if urn_edition
24
+ parts << urn_language if urn_language
25
+ parts.join(":")
26
+ end
27
+
28
+ # Template methods — override in subclasses
29
+
30
+ def urn_namespace
31
+ flavor_name.downcase
32
+ end
33
+
34
+ def urn_publisher
35
+ pub = maybe(:publisher)
36
+ return nil unless pub
37
+
38
+ pub.to_s.downcase
39
+ end
40
+
41
+ def urn_type
42
+ nil
43
+ end
44
+
45
+ def urn_number
46
+ val = maybe(:number) || maybe(:code)
47
+ return nil unless val
48
+
49
+ val.is_a?(Components::Code) ? val.value.to_s : val.to_s
50
+ end
51
+
52
+ def urn_part
53
+ val = maybe(:part)
54
+ return nil unless val
55
+
56
+ "-#{val.is_a?(Components::Code) ? val.value : val}"
57
+ end
58
+
59
+ def urn_subpart
60
+ val = maybe(:subpart)
61
+ return nil unless val
62
+
63
+ "-#{val.is_a?(Components::Code) ? val.value : val}"
64
+ end
65
+
66
+ def urn_year
67
+ date = maybe(:date)
68
+ if date
69
+ year = date.is_a?(Components::Date) ? date.year : date.to_s
70
+ return year.to_s if year
71
+ end
72
+ if maybe(:year)
73
+ return identifier.year.to_s
74
+ end
75
+
76
+ nil
77
+ end
78
+
79
+ def urn_edition
80
+ ed = maybe(:edition)
81
+ return nil unless ed
82
+
83
+ num = ed.is_a?(Components::Edition) ? ed.number : ed
84
+ return nil unless num
85
+
86
+ "ed.#{num}"
87
+ end
88
+
89
+ def urn_language
90
+ langs = maybe(:languages)
91
+ return nil unless langs&.any?
92
+
93
+ langs.map(&:code).join(",")
94
+ end
95
+
96
+ def maybe(method_name)
97
+ return nil unless identifier.class.attributes.key?(method_name)
98
+
99
+ identifier.public_send(method_name)
100
+ end
101
+
102
+ private
103
+
104
+ def flavor_name
105
+ parts = identifier.class.name.split("::")
106
+ parts[1] || "unknown"
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,196 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Utils
5
+ # String normalization utilities for PubID parsing and rendering
6
+ #
7
+ # This module provides centralized string manipulation methods
8
+ # to reduce duplication and improve consistency.
9
+ #
10
+ # == Usage
11
+ #
12
+ # Pubid::Utils::StringNormalizer.normalize_dashes(str)
13
+ # Pubid::Utils::StringNormalizer.normalize_whitespace(str)
14
+ # Pubid::Utils::StringNormalizer.split_compound_number(str)
15
+ #
16
+ class StringNormalizer
17
+ # Unicode dash characters that should be normalized to ASCII hyphen
18
+ DASH_CHARS = ["-", "‑", "‐", "–", "—"].freeze
19
+
20
+ # Whitespace characters to normalize to single space
21
+ WHITESPACE_CHARS = [" ", "\t", "\n", "\r", "\u00A0"].freeze
22
+
23
+ class << self
24
+ # Normalize all dash characters to ASCII hyphen
25
+ #
26
+ # @param str [String, nil] input string
27
+ # @return [String] normalized string with ASCII hyphens
28
+ #
29
+ # @example Normalize unicode dashes
30
+ # StringNormalizer.normalize_dashes("ISO‑9001") # => "ISO-9001"
31
+ # StringNormalizer.normalize_dashes("ISO–9001") # => "ISO-9001"
32
+ #
33
+ def normalize_dashes(str)
34
+ return str if str.nil?
35
+
36
+ str.tr(DASH_CHARS.join, "-")
37
+ end
38
+
39
+ # Normalize whitespace to single space and strip
40
+ #
41
+ # @param str [String, nil] input string
42
+ # @return [String] normalized string with single spaces
43
+ #
44
+ # @example Normalize whitespace
45
+ # StringNormalizer.normalize_whitespace("ISO 9001") # => "ISO 9001"
46
+ # StringNormalizer.normalize_whitespace("ISO\t9001") # => "ISO 9001"
47
+ #
48
+ def normalize_whitespace(str)
49
+ return "" if str.nil?
50
+
51
+ str.gsub(/[#{WHITESPACE_CHARS.join}]+/, " ").strip
52
+ end
53
+
54
+ # Clean and uppercase abbreviation
55
+ #
56
+ # @param str [String, nil] input string
57
+ # @return [String] cleaned and uppercased abbreviation
58
+ #
59
+ # @example Clean abbreviation
60
+ # StringNormalizer.clean_abbr(" amd ") # => "AMD"
61
+ # StringNormalizer.clean_abbr("Amd") # => "AMD"
62
+ #
63
+ def clean_abbr(str)
64
+ return "" if str.nil?
65
+
66
+ normalize_whitespace(str).upcase
67
+ end
68
+
69
+ # Split compound number (e.g., "800-53-1" -> ["800", "53", "1"])
70
+ #
71
+ # @param str [String] input string
72
+ # @param separators [Array<String>] separators to split on
73
+ # @return [Array<String>] split parts
74
+ #
75
+ # @example Split compound numbers
76
+ # StringNormalizer.split_compound_number("800-53-1")
77
+ # # => ["800", "53", "1"]
78
+ # StringNormalizer.split_compound_number("800/53")
79
+ # # => ["800", "53"]
80
+ #
81
+ def split_compound_number(str, separators: ["-", "/"])
82
+ return [] unless str
83
+
84
+ normalized = normalize_dashes(str)
85
+ normalized.split(/[#{separators.join}]/).reject(&:empty?)
86
+ end
87
+
88
+ # Extract numeric suffix from string
89
+ #
90
+ # @param str [String] input string
91
+ # @return [Array<String, nil>] [number, suffix] or [nil, nil]
92
+ #
93
+ # @example Extract number and suffix
94
+ # StringNormalizer.extract_number_suffix("800-53r5") # => ["53", "r5"]
95
+ # StringNormalizer.extract_number_suffix("ISO") # => [nil, nil]
96
+ #
97
+ def extract_number_suffix(str)
98
+ return [nil, nil] unless str
99
+
100
+ match = str.match(/^(\D+)?(\d+)([a-zA-Z]+)?$/)
101
+ return [nil, nil] unless match
102
+
103
+ number = match[2]
104
+ suffix = match[3]
105
+ [number, suffix]
106
+ end
107
+
108
+ # Join parts with proper separator, skipping nils
109
+ #
110
+ # @param parts [Array] parts to join
111
+ # @param separator [String] separator between parts
112
+ # @return [String] joined string
113
+ #
114
+ # @example Join parts
115
+ # StringNormalizer.join_parts(["ISO", "9001", nil, "2015"], " ")
116
+ # # => "ISO 9001 2015"
117
+ # StringNormalizer.join_parts(["ISO", nil, "9001"], "-")
118
+ # # => "ISO-9001"
119
+ #
120
+ def join_parts(parts, separator: "")
121
+ parts.compact.join(separator)
122
+ end
123
+
124
+ # Truncate string to max length with ellipsis
125
+ #
126
+ # @param str [String] input string
127
+ # @param max_length [Integer] maximum length
128
+ # @param ellipsis [String] ellipsis string (default: "...")
129
+ # @return [String] truncated string
130
+ #
131
+ # @example Truncate string
132
+ # StringNormalizer.truncate("International Standard", 15)
133
+ # # => "International ..."
134
+ # StringNormalizer.truncate("ISO", 10)
135
+ # # => "ISO"
136
+ #
137
+ def truncate(str, max_length:, ellipsis: "...")
138
+ return str if str.nil? || str.length <= max_length
139
+
140
+ str[0...(max_length - ellipsis.length)] + ellipsis
141
+ end
142
+
143
+ # Convert to title case (first letter of each word uppercase)
144
+ #
145
+ # @param str [String] input string
146
+ # @return [String] title cased string
147
+ #
148
+ # @example Title case
149
+ # StringNormalizer.title_case("international standard")
150
+ # # => "International Standard"
151
+ # StringNormalizer.title_case("ISO/TR")
152
+ # # => "ISO/TR" # Preserves existing caps
153
+ #
154
+ def title_case(str)
155
+ return "" if str.nil?
156
+
157
+ str.split.map do |word|
158
+ if word.upcase == word # Preserve acronyms
159
+ word
160
+ else
161
+ word.capitalize
162
+ end
163
+ end.join(" ")
164
+ end
165
+
166
+ # Check if string is blank (nil, empty, or only whitespace)
167
+ #
168
+ # @param str [String] input string
169
+ # @return [Boolean] true if blank
170
+ #
171
+ # @example Check blank
172
+ # StringNormalizer.blank?(nil) # => true
173
+ # StringNormalizer.blank?("") # => true
174
+ # StringNormalizer.blank?(" ") # => true
175
+ # StringNormalizer.blank?("ISO") # => false
176
+ #
177
+ def blank?(str)
178
+ str.nil? || str.to_s.strip.empty?
179
+ end
180
+
181
+ # Safe to_s method that handles nil
182
+ #
183
+ # @param str [String, nil] input string
184
+ # @return [String] string or empty string
185
+ #
186
+ # @example Safe to_s
187
+ # StringNormalizer.to_s(nil) # => ""
188
+ # StringNormalizer.to_s("ISO") # => "ISO"
189
+ #
190
+ def to_s(str)
191
+ str.nil? ? "" : str.to_s
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Utils
5
+ autoload :StringNormalizer, "pubid/utils/string_normalizer"
6
+ end
7
+ end
data/lib/pubid/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Pubid
2
- VERSION = "1.15.18".freeze
4
+ VERSION = "2.0.0.pre.alpha.1"
3
5
  end
data/lib/pubid.rb CHANGED
@@ -1,15 +1,139 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+ require_relative "pubid/lutaml/no_store_registration"
5
+ require "parslet"
6
+
1
7
  module Pubid
2
- end
8
+ # Registry for tracking all loaded flavors
9
+ class Registry
10
+ @flavors = {}
11
+
12
+ class << self
13
+ attr_reader :flavors
14
+
15
+ # Register a flavor with the registry
16
+ # @param name [String, Symbol] Flavor name (e.g., :iso, :iec)
17
+ # @param flavor_module [Module] The flavor module (e.g., Pubid::Iso)
18
+ def register(name, flavor_module)
19
+ @flavors[name.to_s.downcase] = flavor_module
20
+ end
21
+
22
+ # Get all registered flavor names
23
+ # @return [Array<String>] Array of flavor names
24
+ def flavor_names
25
+ @flavors.keys.sort
26
+ end
27
+
28
+ # Get flavor module by name
29
+ # @param name [String, Symbol] Flavor name
30
+ # @return [Module, nil] The flavor module or nil if not found
31
+ def get(name)
32
+ @flavors[name.to_s.downcase]
33
+ end
34
+
35
+ # Check if a flavor is registered
36
+ # @param name [String, Symbol] Flavor name
37
+ # @return [Boolean]
38
+ def registered?(name)
39
+ @flavors.key?(name.to_s.downcase)
40
+ end
41
+ end
42
+ end
43
+
44
+ autoload :Parser, "pubid/parser"
45
+ autoload :Components, "pubid/components"
46
+ autoload :BundledIdentifier, "pubid/bundled_identifier"
47
+ autoload :Identifier, "pubid/identifier"
48
+ autoload :IdentifierMetadata, "pubid/identifier_metadata"
49
+ autoload :IdentifierRegistry, "pubid/identifier_registry"
50
+ autoload :Rendering, "pubid/rendering"
51
+ autoload :Renderers, "pubid/renderers"
52
+ autoload :FormatDetector, "pubid/format_detector"
53
+ autoload :FormatRegistry, "pubid/format_registry"
54
+ autoload :Scheme, "pubid/scheme"
3
55
 
4
- require_relative "pubid/registry"
5
-
6
- require "pubid-core"
7
- require "pubid-iso"
8
- require "pubid-ieee"
9
- require "pubid-nist"
10
- require "pubid-iec"
11
- require "pubid-cen"
12
- require "pubid-bsi"
13
- require "pubid-ccsds"
14
- require "pubid-itu"
15
- require "pubid-jis"
56
+ autoload :UrnGenerator, "pubid/urn_generator/base"
57
+ autoload :Builder, "pubid/builder/base"
58
+ autoload :Utils, "pubid/utils"
59
+ autoload :Version, "pubid/version"
60
+ autoload :Core, "pubid/core"
61
+
62
+ # Require all flavor modules
63
+ autoload :Amca, "pubid/amca"
64
+ autoload :Ansi, "pubid/ansi"
65
+ autoload :Api, "pubid/api"
66
+ autoload :Ashrae, "pubid/ashrae"
67
+ autoload :Asme, "pubid/asme"
68
+ autoload :Astm, "pubid/astm"
69
+ autoload :Bsi, "pubid/bsi"
70
+ autoload :Ccsds, "pubid/ccsds"
71
+ autoload :CenCenelec, "pubid/cen_cenelec"
72
+ autoload :Cie, "pubid/cie"
73
+ autoload :Csa, "pubid/csa"
74
+ autoload :Etsi, "pubid/etsi"
75
+ autoload :Idf, "pubid/idf"
76
+ autoload :Iec, "pubid/iec"
77
+ autoload :Ieee, "pubid/ieee"
78
+ autoload :Iho, "pubid/iho"
79
+ autoload :Iso, "pubid/iso"
80
+ autoload :Itu, "pubid/itu"
81
+ autoload :Jcgm, "pubid/jcgm"
82
+ autoload :Jis, "pubid/jis"
83
+ autoload :Nist, "pubid/nist"
84
+ autoload :Oiml, "pubid/oiml"
85
+ autoload :Plateau, "pubid/plateau"
86
+ autoload :Export, "pubid/export"
87
+ autoload :Sae, "pubid/sae"
88
+
89
+ # Format infrastructure (loaded eagerly so Pubid::Renderers / Pubid::Parsers are always available)
90
+ require "pubid/renderers/base"
91
+ require "pubid/renderers/mr_string"
92
+ require "pubid/renderers/urn"
93
+ require "pubid/parsers/base"
94
+ require "pubid/parsers/mr_string"
95
+
96
+ # Initialize global format registry
97
+ Identifier.format_registry = FormatRegistry.new
98
+ Identifier.format_registry.register(:human, renderer: Renderers::HumanReadable)
99
+ Identifier.format_registry.register(:mr_string, renderer: Renderers::MrString)
100
+ Identifier.format_registry.register(:urn, renderer: Renderers::Urn)
101
+
102
+ # Unified parse entry point with auto-detection
103
+ #
104
+ # @param string [String] The identifier string to parse
105
+ # @param format [Symbol] :auto, :human, :mr_string, or :urn
106
+ # @return [Identifier] The parsed identifier
107
+ def self.parse(string, format: :auto)
108
+ format = FormatDetector.detect(string) if format == :auto
109
+
110
+ case format
111
+ when :mr_string
112
+ Parsers::MrString.parse(string)
113
+ when :urn
114
+ # URN auto-detection: extract flavor from URN namespace
115
+ # e.g., "urn:iso:std:..." → Pubid::Iso
116
+ flavor = detect_flavor_from_urn(string)
117
+ flavor_module = Registry.get(flavor)
118
+ unless flavor_module
119
+ raise ArgumentError,
120
+ "Unknown flavor in URN: #{flavor}"
121
+ end
122
+
123
+ urn_parser = flavor_module.const_get(:UrnParser)
124
+ urn_parser.parse(string)
125
+ else
126
+ # Default to MR string parser for MR format, human-readable otherwise
127
+ # The MR string parser converts to human-readable and delegates to flavor.parse
128
+ raise ArgumentError,
129
+ "No flavor specified. Use Pubid::Iso.parse() or another flavor-specific parse method."
130
+ end
131
+ end
132
+
133
+ def self.detect_flavor_from_urn(urn)
134
+ # urn:iso:std:... → "iso"
135
+ # urn:iec:std:... → "iec"
136
+ parts = urn.downcase.split(":")
137
+ parts[1] # The namespace part after "urn"
138
+ end
139
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal
2
+
3
+ require_relative "../../lib/pubid/core/pattern_doc_generator"
4
+
5
+ namespace :docs do
6
+ desc "Generate identifier pattern reference docs"
7
+ task :patterns do
8
+ output_dir = File.join(__dir__, "..", "..", "docs", "identifier-patterns")
9
+ FileUtils.mkdir_p(output_dir)
10
+
11
+ flavors = Dir[File.join(__dir__, "..", "..", "lib", "pubid",
12
+ "*")].select do |d|
13
+ File.directory?(d)
14
+ end
15
+ .map do |d|
16
+ File.basename(d)
17
+ end
18
+ .reject do |f|
19
+ %w[core components rendering
20
+ parser serializable utils].include?(f)
21
+ end
22
+
23
+ flavors.each do |flavor|
24
+ puts "Generating docs for #{flavor}..."
25
+ generator = Pubid::Core::PatternDocGenerator.new(flavor)
26
+ content = generator.generate
27
+ File.write(File.join(output_dir, "#{flavor}.md"), content)
28
+ end
29
+
30
+ # Generate cross-flavor comparison table
31
+ puts "Generating cross-flavor comparison..."
32
+ table = Pubid::Core::PatternDocGenerator.generate_cross_flavor_table(flavors)
33
+ File.write(File.join(output_dir, "README.md"), table)
34
+
35
+ puts "Done. Generated docs for #{flavors.length} flavors in #{output_dir}/"
36
+ end
37
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ namespace :export do
6
+ desc "Export library metadata as JSON for the PubID website"
7
+ task :website_data do
8
+ require "pubid/export"
9
+ data = Pubid::Export::Exporter.export_all
10
+ output_path = File.expand_path("website-data.json", __dir__)
11
+ File.write(output_path, JSON.pretty_generate(data))
12
+ puts "Exported #{data.keys.size} flavors to #{output_path}"
13
+ data.each do |flavor, fd|
14
+ count = fd[:identifier_types]&.size || 0
15
+ puts " #{flavor}: #{count} identifier types"
16
+ end
17
+ end
18
+
19
+ desc "Audit library data against website publishers"
20
+ task :audit do
21
+ require "pubid/export"
22
+ data = Pubid::Export::Exporter.export_all
23
+
24
+ # Parse website publishers to extract doc type keys
25
+ # For now, read the generated JSON and provide a summary
26
+ auditor = Pubid::Export::Auditor.new(data)
27
+
28
+ # Build a minimal website representation from the generated data itself
29
+ # (in production, this would parse the website's publishers.ts)
30
+ {}
31
+ summary = data.transform_values do |fd|
32
+ { "doc_types" => fd[:identifier_types].map { |t| { "key" => t[:key] } } }
33
+ end
34
+
35
+ results = auditor.audit(summary)
36
+ puts auditor.summary(results)
37
+ end
38
+ end