pubid 1.15.19 → 2.0.0.pre.alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.adoc +2041 -53
  4. data/archived-gems/pubid-ccsds/update_codes.yaml +1 -0
  5. data/archived-gems/pubid-iec/stages.yaml +129 -0
  6. data/archived-gems/pubid-iec/update_codes.yaml +67 -0
  7. data/archived-gems/pubid-ieee/update_codes.yaml +104 -0
  8. data/archived-gems/pubid-iso/stages.yaml +106 -0
  9. data/archived-gems/pubid-iso/update_codes.yaml +4 -0
  10. data/archived-gems/pubid-itu/i18n.yaml +13 -0
  11. data/archived-gems/pubid-itu/series.yaml +42 -0
  12. data/archived-gems/pubid-nist/publishers.yaml +6 -0
  13. data/archived-gems/pubid-nist/series.yaml +121 -0
  14. data/archived-gems/pubid-nist/stages.yaml +16 -0
  15. data/archived-gems/pubid-nist/update_codes.yaml +93 -0
  16. data/archived-gems/pubid-plateau/update_codes.yaml +6 -0
  17. data/data/ccsds/update_codes.yaml +1 -0
  18. data/data/iec/update_codes.yaml +67 -0
  19. data/data/ieee/update_codes.yaml +104 -0
  20. data/data/iso/update_codes.yaml +21 -0
  21. data/data/nist/update_codes.yaml +89 -0
  22. data/data/plateau/update_codes.yaml +6 -0
  23. data/lib/pubid/amca/builder.rb +176 -0
  24. data/lib/pubid/amca/identifier.rb +57 -0
  25. data/lib/pubid/amca/identifiers/base.rb +64 -0
  26. data/lib/pubid/amca/identifiers/interpretation.rb +51 -0
  27. data/lib/pubid/amca/identifiers/publication.rb +47 -0
  28. data/lib/pubid/amca/identifiers/standard.rb +22 -0
  29. data/lib/pubid/amca/identifiers.rb +12 -0
  30. data/lib/pubid/amca/parser.rb +153 -0
  31. data/lib/pubid/amca/scheme.rb +16 -0
  32. data/lib/pubid/amca/single_identifier.rb +33 -0
  33. data/lib/pubid/amca/urn_generator.rb +50 -0
  34. data/lib/pubid/amca.rb +26 -0
  35. data/lib/pubid/ansi/builder.rb +52 -0
  36. data/lib/pubid/ansi/identifier.rb +55 -0
  37. data/lib/pubid/ansi/identifiers/american_national_standard.rb +12 -0
  38. data/lib/pubid/ansi/identifiers/standard.rb +16 -0
  39. data/lib/pubid/ansi/identifiers.rb +11 -0
  40. data/lib/pubid/ansi/parser.rb +91 -0
  41. data/lib/pubid/ansi/scheme.rb +15 -0
  42. data/lib/pubid/ansi/single_identifier.rb +45 -0
  43. data/lib/pubid/ansi/urn_generator.rb +76 -0
  44. data/lib/pubid/ansi.rb +27 -0
  45. data/lib/pubid/api/builder.rb +85 -0
  46. data/lib/pubid/api/components/code.rb +9 -0
  47. data/lib/pubid/api/identifier.rb +68 -0
  48. data/lib/pubid/api/identifiers/base.rb +24 -0
  49. data/lib/pubid/api/identifiers/bulletin.rb +15 -0
  50. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +15 -0
  51. data/lib/pubid/api/identifiers/mpms.rb +44 -0
  52. data/lib/pubid/api/identifiers/publication.rb +15 -0
  53. data/lib/pubid/api/identifiers/recommended_practice.rb +15 -0
  54. data/lib/pubid/api/identifiers/specification.rb +15 -0
  55. data/lib/pubid/api/identifiers/standard.rb +15 -0
  56. data/lib/pubid/api/identifiers/technical_report.rb +15 -0
  57. data/lib/pubid/api/identifiers/typeless_standard.rb +27 -0
  58. data/lib/pubid/api/parser.rb +140 -0
  59. data/lib/pubid/api/scheme.rb +66 -0
  60. data/lib/pubid/api/single_identifier.rb +46 -0
  61. data/lib/pubid/api/urn_generator.rb +41 -0
  62. data/lib/pubid/api.rb +17 -0
  63. data/lib/pubid/ashrae/builder.rb +498 -0
  64. data/lib/pubid/ashrae/identifier.rb +57 -0
  65. data/lib/pubid/ashrae/identifiers/addenda_package.rb +46 -0
  66. data/lib/pubid/ashrae/identifiers/addendum.rb +55 -0
  67. data/lib/pubid/ashrae/identifiers/base.rb +23 -0
  68. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +51 -0
  69. data/lib/pubid/ashrae/identifiers/errata.rb +40 -0
  70. data/lib/pubid/ashrae/identifiers/guideline.rb +38 -0
  71. data/lib/pubid/ashrae/identifiers/interpretation.rb +39 -0
  72. data/lib/pubid/ashrae/identifiers/standard.rb +38 -0
  73. data/lib/pubid/ashrae/identifiers.rb +16 -0
  74. data/lib/pubid/ashrae/parser.rb +724 -0
  75. data/lib/pubid/ashrae/scheme.rb +53 -0
  76. data/lib/pubid/ashrae/single_identifier.rb +23 -0
  77. data/lib/pubid/ashrae/supplement_identifier.rb +23 -0
  78. data/lib/pubid/ashrae/urn_generator.rb +59 -0
  79. data/lib/pubid/ashrae.rb +21 -0
  80. data/lib/pubid/asme/builder.rb +153 -0
  81. data/lib/pubid/asme/components/code.rb +18 -0
  82. data/lib/pubid/asme/identifier.rb +61 -0
  83. data/lib/pubid/asme/identifiers/base.rb +70 -0
  84. data/lib/pubid/asme/identifiers/standard.rb +12 -0
  85. data/lib/pubid/asme/identifiers.rb +10 -0
  86. data/lib/pubid/asme/parser.rb +308 -0
  87. data/lib/pubid/asme/scheme.rb +37 -0
  88. data/lib/pubid/asme/single_identifier.rb +29 -0
  89. data/lib/pubid/asme/urn_generator.rb +133 -0
  90. data/lib/pubid/asme.rb +21 -0
  91. data/lib/pubid/astm/builder.rb +159 -0
  92. data/lib/pubid/astm/components/code.rb +33 -0
  93. data/lib/pubid/astm/identifier.rb +92 -0
  94. data/lib/pubid/astm/identifiers/adjunct.rb +21 -0
  95. data/lib/pubid/astm/identifiers/base.rb +13 -0
  96. data/lib/pubid/astm/identifiers/data_series.rb +25 -0
  97. data/lib/pubid/astm/identifiers/iso_dual_published.rb +74 -0
  98. data/lib/pubid/astm/identifiers/manual.rb +40 -0
  99. data/lib/pubid/astm/identifiers/monograph.rb +25 -0
  100. data/lib/pubid/astm/identifiers/research_report.rb +18 -0
  101. data/lib/pubid/astm/identifiers/standard.rb +52 -0
  102. data/lib/pubid/astm/identifiers/technical_report.rb +23 -0
  103. data/lib/pubid/astm/identifiers/work_in_progress.rb +21 -0
  104. data/lib/pubid/astm/parser.rb +244 -0
  105. data/lib/pubid/astm/scheme.rb +55 -0
  106. data/lib/pubid/astm/single_identifier.rb +25 -0
  107. data/lib/pubid/astm/urn_generator.rb +99 -0
  108. data/lib/pubid/astm.rb +38 -0
  109. data/lib/pubid/bsi/builder.rb +1483 -0
  110. data/lib/pubid/bsi/components/code.rb +11 -0
  111. data/lib/pubid/bsi/components/date.rb +11 -0
  112. data/lib/pubid/bsi/components/publisher.rb +11 -0
  113. data/lib/pubid/bsi/components/type.rb +11 -0
  114. data/lib/pubid/bsi/identifier.rb +87 -0
  115. data/lib/pubid/bsi/identifiers/addendum_document.rb +64 -0
  116. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +95 -0
  117. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +82 -0
  118. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +118 -0
  119. data/lib/pubid/bsi/identifiers/amendment.rb +40 -0
  120. data/lib/pubid/bsi/identifiers/base.rb +11 -0
  121. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +27 -0
  122. data/lib/pubid/bsi/identifiers/british_standard.rb +33 -0
  123. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +114 -0
  124. data/lib/pubid/bsi/identifiers/committee_document.rb +51 -0
  125. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +152 -0
  126. data/lib/pubid/bsi/identifiers/corrigendum.rb +28 -0
  127. data/lib/pubid/bsi/identifiers/detailed_specification.rb +69 -0
  128. data/lib/pubid/bsi/identifiers/disc.rb +56 -0
  129. data/lib/pubid/bsi/identifiers/draft_document.rb +71 -0
  130. data/lib/pubid/bsi/identifiers/electronic_book.rb +52 -0
  131. data/lib/pubid/bsi/identifiers/expert_commentary.rb +47 -0
  132. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +82 -0
  133. data/lib/pubid/bsi/identifiers/flex.rb +61 -0
  134. data/lib/pubid/bsi/identifiers/handbook.rb +39 -0
  135. data/lib/pubid/bsi/identifiers/index.rb +62 -0
  136. data/lib/pubid/bsi/identifiers/method.rb +76 -0
  137. data/lib/pubid/bsi/identifiers/national_annex.rb +73 -0
  138. data/lib/pubid/bsi/identifiers/practice_guide.rb +27 -0
  139. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +79 -0
  140. data/lib/pubid/bsi/identifiers/published_document.rb +79 -0
  141. data/lib/pubid/bsi/identifiers/section.rb +62 -0
  142. data/lib/pubid/bsi/identifiers/set.rb +46 -0
  143. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +40 -0
  144. data/lib/pubid/bsi/identifiers/supplement_document.rb +51 -0
  145. data/lib/pubid/bsi/identifiers/supplementary_index.rb +81 -0
  146. data/lib/pubid/bsi/identifiers/technical_specification.rb +79 -0
  147. data/lib/pubid/bsi/identifiers/test_method.rb +67 -0
  148. data/lib/pubid/bsi/identifiers/value_added_publication.rb +52 -0
  149. data/lib/pubid/bsi/identifiers.rb +52 -0
  150. data/lib/pubid/bsi/model.rb +196 -0
  151. data/lib/pubid/bsi/parser.rb +659 -0
  152. data/lib/pubid/bsi/scheme.rb +243 -0
  153. data/lib/pubid/bsi/single_identifier.rb +129 -0
  154. data/lib/pubid/bsi/urn_generator.rb +84 -0
  155. data/lib/pubid/bsi.rb +32 -0
  156. data/lib/pubid/builder/base.rb +138 -0
  157. data/lib/pubid/bundled_identifier.rb +126 -0
  158. data/lib/pubid/ccsds/builder.rb +56 -0
  159. data/lib/pubid/ccsds/identifier.rb +84 -0
  160. data/lib/pubid/ccsds/identifiers/base.rb +89 -0
  161. data/lib/pubid/ccsds/identifiers/base_BASE_88929.rb +70 -0
  162. data/lib/pubid/ccsds/identifiers/corrigendum.rb +39 -0
  163. data/lib/pubid/ccsds/identifiers.rb +10 -0
  164. data/lib/pubid/ccsds/parser.rb +71 -0
  165. data/lib/pubid/ccsds/scheme.rb +57 -0
  166. data/lib/pubid/ccsds/single_identifier.rb +77 -0
  167. data/lib/pubid/ccsds/supplement_identifier.rb +33 -0
  168. data/lib/pubid/ccsds/urn_generator.rb +115 -0
  169. data/lib/pubid/ccsds.rb +21 -0
  170. data/lib/pubid/cen_cenelec/builder.rb +330 -0
  171. data/lib/pubid/cen_cenelec/identifier.rb +52 -0
  172. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +40 -0
  173. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +29 -0
  174. data/lib/pubid/cen_cenelec/identifiers/base.rb +75 -0
  175. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +28 -0
  176. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +27 -0
  177. data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +28 -0
  178. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +61 -0
  179. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +35 -0
  180. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +41 -0
  181. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +37 -0
  182. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +28 -0
  183. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +22 -0
  184. data/lib/pubid/cen_cenelec/identifiers/guide.rb +27 -0
  185. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +27 -0
  186. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +27 -0
  187. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +35 -0
  188. data/lib/pubid/cen_cenelec/identifiers.rb +32 -0
  189. data/lib/pubid/cen_cenelec/parser.rb +144 -0
  190. data/lib/pubid/cen_cenelec/scheme.rb +164 -0
  191. data/lib/pubid/cen_cenelec/single_identifier.rb +130 -0
  192. data/lib/pubid/cen_cenelec/supplement_identifier.rb +48 -0
  193. data/lib/pubid/cen_cenelec/urn_generator.rb +129 -0
  194. data/lib/pubid/cen_cenelec.rb +21 -0
  195. data/lib/pubid/cie/builder.rb +399 -0
  196. data/lib/pubid/cie/components/code.rb +72 -0
  197. data/lib/pubid/cie/components/language.rb +58 -0
  198. data/lib/pubid/cie/identifier.rb +71 -0
  199. data/lib/pubid/cie/identifiers/bundle.rb +20 -0
  200. data/lib/pubid/cie/identifiers/conference.rb +32 -0
  201. data/lib/pubid/cie/identifiers/corrigendum.rb +40 -0
  202. data/lib/pubid/cie/identifiers/dual_published.rb +41 -0
  203. data/lib/pubid/cie/identifiers/identical.rb +64 -0
  204. data/lib/pubid/cie/identifiers/joint_published.rb +52 -0
  205. data/lib/pubid/cie/identifiers/standard.rb +58 -0
  206. data/lib/pubid/cie/identifiers/supplement.rb +45 -0
  207. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +20 -0
  208. data/lib/pubid/cie/identifiers.rb +17 -0
  209. data/lib/pubid/cie/parser.rb +347 -0
  210. data/lib/pubid/cie/scheme.rb +64 -0
  211. data/lib/pubid/cie/single_identifier.rb +30 -0
  212. data/lib/pubid/cie/supplement_identifier.rb +26 -0
  213. data/lib/pubid/cie/urn_generator.rb +123 -0
  214. data/lib/pubid/cie.rb +28 -0
  215. data/lib/pubid/components/code.rb +33 -0
  216. data/lib/pubid/components/date.rb +49 -0
  217. data/lib/pubid/components/edition.rb +32 -0
  218. data/lib/pubid/components/factory.rb +50 -0
  219. data/lib/pubid/components/language.rb +37 -0
  220. data/lib/pubid/components/locality.rb +10 -0
  221. data/lib/pubid/components/publisher.rb +36 -0
  222. data/lib/pubid/components/stage.rb +54 -0
  223. data/lib/pubid/components/type.rb +58 -0
  224. data/lib/pubid/components/typed_stage.rb +59 -0
  225. data/lib/pubid/components.rb +16 -0
  226. data/lib/pubid/core/pattern_doc_generator.rb +272 -0
  227. data/lib/pubid/core/update_codes.rb +77 -0
  228. data/lib/pubid/core.rb +8 -0
  229. data/lib/pubid/csa/builder.rb +671 -0
  230. data/lib/pubid/csa/components/code.rb +9 -0
  231. data/lib/pubid/csa/components.rb +9 -0
  232. data/lib/pubid/csa/composite_identifier.rb +27 -0
  233. data/lib/pubid/csa/identifier.rb +513 -0
  234. data/lib/pubid/csa/identifiers/base.rb +133 -0
  235. data/lib/pubid/csa/identifiers/bundled.rb +125 -0
  236. data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
  237. data/lib/pubid/csa/identifiers/cec.rb +129 -0
  238. data/lib/pubid/csa/identifiers/combined.rb +130 -0
  239. data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
  240. data/lib/pubid/csa/identifiers/package.rb +65 -0
  241. data/lib/pubid/csa/identifiers/series.rb +127 -0
  242. data/lib/pubid/csa/identifiers/standard.rb +10 -0
  243. data/lib/pubid/csa/identifiers.rb +17 -0
  244. data/lib/pubid/csa/parser.rb +445 -0
  245. data/lib/pubid/csa/scheme.rb +44 -0
  246. data/lib/pubid/csa/single_identifier.rb +30 -0
  247. data/lib/pubid/csa/urn_generator.rb +80 -0
  248. data/lib/pubid/csa/wrapper_identifier.rb +31 -0
  249. data/lib/pubid/csa.rb +25 -0
  250. data/lib/pubid/etsi/builder.rb +133 -0
  251. data/lib/pubid/etsi/components/code.rb +42 -0
  252. data/lib/pubid/etsi/components/version.rb +37 -0
  253. data/lib/pubid/etsi/components.rb +10 -0
  254. data/lib/pubid/etsi/identifier.rb +57 -0
  255. data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
  256. data/lib/pubid/etsi/identifiers/base.rb +38 -0
  257. data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
  258. data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
  259. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
  260. data/lib/pubid/etsi/identifiers.rb +14 -0
  261. data/lib/pubid/etsi/parser.rb +133 -0
  262. data/lib/pubid/etsi/scheme.rb +42 -0
  263. data/lib/pubid/etsi/urn_generator.rb +76 -0
  264. data/lib/pubid/etsi.rb +21 -0
  265. data/lib/pubid/export/auditor.rb +89 -0
  266. data/lib/pubid/export/data_class_exporter.rb +59 -0
  267. data/lib/pubid/export/exporter.rb +74 -0
  268. data/lib/pubid/export/flavor_exporter.rb +402 -0
  269. data/lib/pubid/export/ieee_exporter.rb +78 -0
  270. data/lib/pubid/export/itu_exporter.rb +66 -0
  271. data/lib/pubid/export/nist_exporter.rb +64 -0
  272. data/lib/pubid/export/registry_exporter.rb +90 -0
  273. data/lib/pubid/export/result.rb +97 -0
  274. data/lib/pubid/export/scheme_exporter.rb +70 -0
  275. data/lib/pubid/export.rb +18 -0
  276. data/lib/pubid/format_detector.rb +16 -0
  277. data/lib/pubid/format_registry.rb +42 -0
  278. data/lib/pubid/identifier.rb +242 -0
  279. data/lib/pubid/identifier_metadata.rb +148 -0
  280. data/lib/pubid/identifier_registry.rb +198 -0
  281. data/lib/pubid/idf/builder.rb +82 -0
  282. data/lib/pubid/idf/identifier.rb +129 -0
  283. data/lib/pubid/idf/identifiers/amendment.rb +27 -0
  284. data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
  285. data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
  286. data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
  287. data/lib/pubid/idf/identifiers.rb +13 -0
  288. data/lib/pubid/idf/parser.rb +143 -0
  289. data/lib/pubid/idf/scheme.rb +61 -0
  290. data/lib/pubid/idf/single_identifier.rb +19 -0
  291. data/lib/pubid/idf/supplement_identifier.rb +43 -0
  292. data/lib/pubid/idf/urn_generator.rb +84 -0
  293. data/lib/pubid/idf.rb +25 -0
  294. data/lib/pubid/iec/builder.rb +458 -0
  295. data/lib/pubid/iec/components/code.rb +60 -0
  296. data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
  297. data/lib/pubid/iec/components/publisher.rb +36 -0
  298. data/lib/pubid/iec/components/sheet.rb +32 -0
  299. data/lib/pubid/iec/components/trf_info.rb +38 -0
  300. data/lib/pubid/iec/components/vap_suffix.rb +41 -0
  301. data/lib/pubid/iec/identifier.rb +256 -0
  302. data/lib/pubid/iec/identifiers/amendment.rb +94 -0
  303. data/lib/pubid/iec/identifiers/base.rb +82 -0
  304. data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
  305. data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
  306. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +82 -0
  307. data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
  308. data/lib/pubid/iec/identifiers/fragment_identifier.rb +137 -0
  309. data/lib/pubid/iec/identifiers/guide.rb +104 -0
  310. data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
  311. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
  312. data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
  313. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
  314. data/lib/pubid/iec/identifiers/sheet_identifier.rb +62 -0
  315. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
  316. data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
  317. data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
  318. data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
  319. data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
  320. data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
  321. data/lib/pubid/iec/identifiers/vap_identifier.rb +73 -0
  322. data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
  323. data/lib/pubid/iec/identifiers/working_document.rb +96 -0
  324. data/lib/pubid/iec/parser.rb +417 -0
  325. data/lib/pubid/iec/rendering_style.rb +113 -0
  326. data/lib/pubid/iec/scheme.rb +71 -0
  327. data/lib/pubid/iec/single_identifier.rb +80 -0
  328. data/lib/pubid/iec/supplement_identifier.rb +161 -0
  329. data/lib/pubid/iec/urn_generator.rb +79 -0
  330. data/lib/pubid/iec/urn_parser.rb +90 -0
  331. data/lib/pubid/iec.rb +85 -0
  332. data/lib/pubid/ieee/aiee/builder.rb +71 -0
  333. data/lib/pubid/ieee/aiee/identifier.rb +105 -0
  334. data/lib/pubid/ieee/aiee/parser.rb +130 -0
  335. data/lib/pubid/ieee/aiee.rb +11 -0
  336. data/lib/pubid/ieee/builder.rb +1237 -0
  337. data/lib/pubid/ieee/components/code.rb +102 -0
  338. data/lib/pubid/ieee/components/draft.rb +93 -0
  339. data/lib/pubid/ieee/components/relationship.rb +157 -0
  340. data/lib/pubid/ieee/components/typed_stage.rb +100 -0
  341. data/lib/pubid/ieee/identifier.rb +54 -0
  342. data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
  343. data/lib/pubid/ieee/identifiers/base.rb +591 -0
  344. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
  345. data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
  346. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
  347. data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
  348. data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
  349. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
  350. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
  351. data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
  352. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
  353. data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
  354. data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
  355. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
  356. data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
  357. data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
  358. data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
  359. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
  360. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
  361. data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
  362. data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
  363. data/lib/pubid/ieee/identifiers/standard.rb +41 -0
  364. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
  365. data/lib/pubid/ieee/identifiers.rb +33 -0
  366. data/lib/pubid/ieee/ire/builder.rb +61 -0
  367. data/lib/pubid/ieee/ire/identifier.rb +58 -0
  368. data/lib/pubid/ieee/ire/parser.rb +91 -0
  369. data/lib/pubid/ieee/ire.rb +11 -0
  370. data/lib/pubid/ieee/nesc/builder.rb +101 -0
  371. data/lib/pubid/ieee/nesc/parser.rb +154 -0
  372. data/lib/pubid/ieee/nesc.rb +10 -0
  373. data/lib/pubid/ieee/parser.rb +1226 -0
  374. data/lib/pubid/ieee/scheme.rb +90 -0
  375. data/lib/pubid/ieee/typed_stages.rb +172 -0
  376. data/lib/pubid/ieee/urn_generator.rb +188 -0
  377. data/lib/pubid/ieee.rb +32 -0
  378. data/lib/pubid/ieee_debug.rb +31 -0
  379. data/lib/pubid/iho/builder.rb +37 -0
  380. data/lib/pubid/iho/identifier.rb +61 -0
  381. data/lib/pubid/iho/identifiers/base.rb +41 -0
  382. data/lib/pubid/iho/identifiers/bibliographic.rb +16 -0
  383. data/lib/pubid/iho/identifiers/circular_letter.rb +15 -0
  384. data/lib/pubid/iho/identifiers/miscellaneous.rb +16 -0
  385. data/lib/pubid/iho/identifiers/publication.rb +15 -0
  386. data/lib/pubid/iho/identifiers/standard.rb +15 -0
  387. data/lib/pubid/iho/identifiers.rb +14 -0
  388. data/lib/pubid/iho/parser.rb +68 -0
  389. data/lib/pubid/iho/scheme.rb +29 -0
  390. data/lib/pubid/iho/urn_generator.rb +29 -0
  391. data/lib/pubid/iho.rb +21 -0
  392. data/lib/pubid/iso/builder.rb +309 -0
  393. data/lib/pubid/iso/bundled_identifier.rb +85 -0
  394. data/lib/pubid/iso/combined_identifier.rb +22 -0
  395. data/lib/pubid/iso/components/code.rb +36 -0
  396. data/lib/pubid/iso/components/publisher.rb +60 -0
  397. data/lib/pubid/iso/components.rb +12 -0
  398. data/lib/pubid/iso/format_resolver.rb +45 -0
  399. data/lib/pubid/iso/identifier.rb +330 -0
  400. data/lib/pubid/iso/identifiers/addendum.rb +104 -0
  401. data/lib/pubid/iso/identifiers/amendment.rb +128 -0
  402. data/lib/pubid/iso/identifiers/base.rb +115 -0
  403. data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
  404. data/lib/pubid/iso/identifiers/data.rb +76 -0
  405. data/lib/pubid/iso/identifiers/directives.rb +59 -0
  406. data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
  407. data/lib/pubid/iso/identifiers/extract.rb +30 -0
  408. data/lib/pubid/iso/identifiers/guide.rb +100 -0
  409. data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
  410. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
  411. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +89 -0
  412. data/lib/pubid/iso/identifiers/pas.rb +93 -0
  413. data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
  414. data/lib/pubid/iso/identifiers/supplement.rb +87 -0
  415. data/lib/pubid/iso/identifiers/tc_document.rb +108 -0
  416. data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
  417. data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
  418. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
  419. data/lib/pubid/iso/identifiers.rb +33 -0
  420. data/lib/pubid/iso/parser.rb +512 -0
  421. data/lib/pubid/iso/rendering_style.rb +120 -0
  422. data/lib/pubid/iso/scheme.rb +193 -0
  423. data/lib/pubid/iso/single_identifier.rb +64 -0
  424. data/lib/pubid/iso/supplement_identifier.rb +27 -0
  425. data/lib/pubid/iso/urn_generator.rb +426 -0
  426. data/lib/pubid/iso/urn_parser.rb +437 -0
  427. data/lib/pubid/iso/utilities.rb +86 -0
  428. data/lib/pubid/iso.rb +50 -0
  429. data/lib/pubid/itu/builder.rb +171 -0
  430. data/lib/pubid/itu/components/code.rb +39 -0
  431. data/lib/pubid/itu/components/sector.rb +35 -0
  432. data/lib/pubid/itu/components/series.rb +29 -0
  433. data/lib/pubid/itu/i18n.rb +9 -0
  434. data/lib/pubid/itu/i18n.yaml +30 -0
  435. data/lib/pubid/itu/identifier.rb +118 -0
  436. data/lib/pubid/itu/identifiers/amendment.rb +43 -0
  437. data/lib/pubid/itu/identifiers/annex.rb +74 -0
  438. data/lib/pubid/itu/identifiers/base.rb +154 -0
  439. data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
  440. data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
  441. data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
  442. data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
  443. data/lib/pubid/itu/identifiers/supplement.rb +46 -0
  444. data/lib/pubid/itu/identifiers.rb +16 -0
  445. data/lib/pubid/itu/model.rb +111 -0
  446. data/lib/pubid/itu/parser.rb +225 -0
  447. data/lib/pubid/itu/scheme.rb +174 -0
  448. data/lib/pubid/itu/urn_generator.rb +105 -0
  449. data/lib/pubid/itu.rb +22 -0
  450. data/lib/pubid/jcgm/builder.rb +88 -0
  451. data/lib/pubid/jcgm/components/publisher.rb +20 -0
  452. data/lib/pubid/jcgm/components.rb +9 -0
  453. data/lib/pubid/jcgm/identifier.rb +54 -0
  454. data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
  455. data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
  456. data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
  457. data/lib/pubid/jcgm/identifiers.rb +11 -0
  458. data/lib/pubid/jcgm/parser.rb +84 -0
  459. data/lib/pubid/jcgm/scheme.rb +60 -0
  460. data/lib/pubid/jcgm/single_identifier.rb +48 -0
  461. data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
  462. data/lib/pubid/jcgm/urn_generator.rb +110 -0
  463. data/lib/pubid/jcgm.rb +31 -0
  464. data/lib/pubid/jis/builder.rb +124 -0
  465. data/lib/pubid/jis/components/code.rb +59 -0
  466. data/lib/pubid/jis/components.rb +9 -0
  467. data/lib/pubid/jis/identifier.rb +61 -0
  468. data/lib/pubid/jis/identifiers/amendment.rb +16 -0
  469. data/lib/pubid/jis/identifiers/base.rb +72 -0
  470. data/lib/pubid/jis/identifiers/explanation.rb +22 -0
  471. data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
  472. data/lib/pubid/jis/identifiers/standard.rb +27 -0
  473. data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
  474. data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
  475. data/lib/pubid/jis/identifiers.rb +17 -0
  476. data/lib/pubid/jis/parser.rb +109 -0
  477. data/lib/pubid/jis/scheme.rb +49 -0
  478. data/lib/pubid/jis/single_identifier.rb +37 -0
  479. data/lib/pubid/jis/supplement_identifier.rb +47 -0
  480. data/lib/pubid/jis/urn_generator.rb +25 -0
  481. data/lib/pubid/jis.rb +23 -0
  482. data/lib/pubid/lutaml/no_store_registration.rb +30 -0
  483. data/lib/pubid/nist/builder.rb +2269 -0
  484. data/lib/pubid/nist/components/code.rb +38 -0
  485. data/lib/pubid/nist/components/edition.rb +134 -0
  486. data/lib/pubid/nist/components/issue_number.rb +28 -0
  487. data/lib/pubid/nist/components/part.rb +77 -0
  488. data/lib/pubid/nist/components/publisher.rb +24 -0
  489. data/lib/pubid/nist/components/stage.rb +53 -0
  490. data/lib/pubid/nist/components/supplement.rb +188 -0
  491. data/lib/pubid/nist/components/translation.rb +42 -0
  492. data/lib/pubid/nist/components/update.rb +103 -0
  493. data/lib/pubid/nist/components/version.rb +35 -0
  494. data/lib/pubid/nist/components/volume.rb +32 -0
  495. data/lib/pubid/nist/components.rb +19 -0
  496. data/lib/pubid/nist/configuration.rb +77 -0
  497. data/lib/pubid/nist/identifier.rb +62 -0
  498. data/lib/pubid/nist/identifiers/base.rb +578 -0
  499. data/lib/pubid/nist/identifiers/circular.rb +68 -0
  500. data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
  501. data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
  502. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
  503. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
  504. data/lib/pubid/nist/identifiers/crpl_report.rb +132 -0
  505. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +104 -0
  506. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
  507. data/lib/pubid/nist/identifiers/handbook.rb +50 -0
  508. data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
  509. data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
  510. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
  511. data/lib/pubid/nist/identifiers/monograph.rb +69 -0
  512. data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
  513. data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
  514. data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
  515. data/lib/pubid/nist/identifiers/report.rb +67 -0
  516. data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
  517. data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
  518. data/lib/pubid/nist/identifiers.rb +33 -0
  519. data/lib/pubid/nist/parser.rb +1117 -0
  520. data/lib/pubid/nist/scheme.rb +199 -0
  521. data/lib/pubid/nist/supplement_identifier.rb +67 -0
  522. data/lib/pubid/nist/urn_generator.rb +133 -0
  523. data/lib/pubid/nist.rb +37 -0
  524. data/lib/pubid/oiml/builder.rb +189 -0
  525. data/lib/pubid/oiml/components/code.rb +20 -0
  526. data/lib/pubid/oiml/components.rb +9 -0
  527. data/lib/pubid/oiml/identifier.rb +61 -0
  528. data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
  529. data/lib/pubid/oiml/identifiers/annex.rb +62 -0
  530. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  531. data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
  532. data/lib/pubid/oiml/identifiers/document.rb +13 -0
  533. data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
  534. data/lib/pubid/oiml/identifiers/guide.rb +13 -0
  535. data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
  536. data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
  537. data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
  538. data/lib/pubid/oiml/identifiers.rb +18 -0
  539. data/lib/pubid/oiml/parser.rb +173 -0
  540. data/lib/pubid/oiml/scheme.rb +46 -0
  541. data/lib/pubid/oiml/single_identifier.rb +90 -0
  542. data/lib/pubid/oiml/supplement_identifier.rb +43 -0
  543. data/lib/pubid/oiml/urn_generator.rb +64 -0
  544. data/lib/pubid/oiml.rb +26 -0
  545. data/lib/pubid/parser/common_parse_methods.rb +13 -0
  546. data/lib/pubid/parser/common_parse_rules.rb +56 -0
  547. data/lib/pubid/parser.rb +8 -0
  548. data/lib/pubid/parsers/base.rb +11 -0
  549. data/lib/pubid/parsers/mr_string.rb +93 -0
  550. data/lib/pubid/plateau/builder.rb +50 -0
  551. data/lib/pubid/plateau/identifier.rb +57 -0
  552. data/lib/pubid/plateau/identifiers/annex.rb +16 -0
  553. data/lib/pubid/plateau/identifiers/base.rb +51 -0
  554. data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
  555. data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
  556. data/lib/pubid/plateau/identifiers.rb +12 -0
  557. data/lib/pubid/plateau/parser.rb +63 -0
  558. data/lib/pubid/plateau/scheme.rb +45 -0
  559. data/lib/pubid/plateau/supplement_identifier.rb +72 -0
  560. data/lib/pubid/plateau/urn_generator.rb +29 -0
  561. data/lib/pubid/plateau.rb +26 -0
  562. data/lib/pubid/renderers/base.rb +53 -0
  563. data/lib/pubid/renderers/directives_renderer.rb +61 -0
  564. data/lib/pubid/renderers/guide_renderer.rb +24 -0
  565. data/lib/pubid/renderers/human_readable.rb +70 -0
  566. data/lib/pubid/renderers/iwa_renderer.rb +20 -0
  567. data/lib/pubid/renderers/mr_string.rb +16 -0
  568. data/lib/pubid/renderers/supplement_renderer.rb +36 -0
  569. data/lib/pubid/renderers/urn.rb +11 -0
  570. data/lib/pubid/renderers.rb +14 -0
  571. data/lib/pubid/rendering/base.rb +73 -0
  572. data/lib/pubid/rendering/common.rb +211 -0
  573. data/lib/pubid/rendering/context.rb +159 -0
  574. data/lib/pubid/rendering/date.rb +27 -0
  575. data/lib/pubid/rendering/format.rb +25 -0
  576. data/lib/pubid/rendering/language.rb +21 -0
  577. data/lib/pubid/rendering/numbering.rb +24 -0
  578. data/lib/pubid/rendering/publisher.rb +25 -0
  579. data/lib/pubid/rendering/stage.rb +38 -0
  580. data/lib/pubid/rendering/supplement.rb +46 -0
  581. data/lib/pubid/rendering.rb +16 -0
  582. data/lib/pubid/sae/builder.rb +32 -0
  583. data/lib/pubid/sae/components/code.rb +9 -0
  584. data/lib/pubid/sae/components/date.rb +19 -0
  585. data/lib/pubid/sae/components/type.rb +19 -0
  586. data/lib/pubid/sae/components.rb +11 -0
  587. data/lib/pubid/sae/identifier.rb +37 -0
  588. data/lib/pubid/sae/identifiers/base.rb +42 -0
  589. data/lib/pubid/sae/identifiers.rb +9 -0
  590. data/lib/pubid/sae/parser.rb +55 -0
  591. data/lib/pubid/sae/scheme.rb +47 -0
  592. data/lib/pubid/sae/urn_generator.rb +38 -0
  593. data/lib/pubid/sae.rb +19 -0
  594. data/lib/pubid/scheme.rb +219 -0
  595. data/lib/pubid/urn_generator/base.rb +110 -0
  596. data/lib/pubid/utils/string_normalizer.rb +196 -0
  597. data/lib/pubid/utils.rb +7 -0
  598. data/lib/pubid/version.rb +3 -1
  599. data/lib/pubid.rb +137 -13
  600. data/lib/tasks/docs.rake +37 -0
  601. data/lib/tasks/export.rake +38 -0
  602. data/lib/tasks/website-data.json +7488 -0
  603. metadata +616 -171
  604. data/lib/pubid/registry.rb +0 -30
@@ -0,0 +1,211 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Rendering
5
+ # Common rendering methods for identifier string representation
6
+ #
7
+ # This module extracts duplicated rendering logic across flavors
8
+ # to reduce code duplication and ensure consistency.
9
+ #
10
+ # == Usage
11
+ #
12
+ # Include this module in flavor-specific identifier base classes:
13
+ #
14
+ # class Base < ::Pubid::Identifier
15
+ # include Pubid::Rendering::Common
16
+ #
17
+ # def to_s(lang: :en, lang_single: false, with_edition: false)
18
+ # render_identifier(lang: lang, lang_single: lang_single, with_edition: with_edition)
19
+ # end
20
+ # end
21
+ #
22
+ module Common
23
+ # Render publisher with optional copublishers
24
+ #
25
+ # @param publisher [Components::Publisher] publisher component
26
+ # @param copublisher_separator [String] separator for copublishers (default: "/")
27
+ # @return [String] formatted publisher string
28
+ def render_publisher(publisher, copublisher_separator: "/")
29
+ return "" unless publisher
30
+
31
+ result = publisher.to_s
32
+ cops = publisher.is_a?(Components::Publisher) ? publisher.copublisher : nil
33
+ if cops&.any?
34
+ result += cops.map do |cp|
35
+ "#{copublisher_separator}#{cp}"
36
+ end.join
37
+ end
38
+ result
39
+ end
40
+
41
+ # Render stage and type abbreviations with proper separators
42
+ #
43
+ # @param stage [Components::Stage] stage component
44
+ # @param type [Components::Type] type component
45
+ # @param has_copublisher [Boolean] whether identifier has copublisher
46
+ # @param default_type_abbr [String] default type abbreviation to skip (default: "IS")
47
+ # @param stage_separator [String] separator before stage without copublisher
48
+ # @return [String] formatted stage/type string
49
+ def render_stage_type(stage, type, has_copublisher: false,
50
+ default_type_abbr: "IS",
51
+ stage_separator: "/")
52
+ result = ""
53
+
54
+ # Add stage abbreviation if present
55
+ if stage&.abbr
56
+ sep = has_copublisher ? " " : stage_separator
57
+ result += "#{sep}#{stage.abbr}"
58
+ end
59
+
60
+ # Add type abbreviation if present and not default
61
+ if type&.abbr && type.abbr != default_type_abbr
62
+ # Separator: space after stage or copublisher, slash otherwise
63
+ has_prefix = stage&.abbr || has_copublisher
64
+ sep = has_prefix ? " " : stage_separator
65
+ result += "#{sep}#{type.abbr}"
66
+ end
67
+
68
+ result
69
+ end
70
+
71
+ # Render number with optional parts
72
+ #
73
+ # @param number [Components::Code] primary number component
74
+ # @param part [Components::Code] optional part component
75
+ # @param subpart [Components::Code] optional subpart component
76
+ # @param part_separator [String] separator for parts (default: "-")
77
+ # @return [String] formatted numbering string
78
+ def render_numbering(number, part = nil, subpart = nil,
79
+ part_separator: "-")
80
+ return "" unless number&.value
81
+
82
+ result = " #{number.value}"
83
+ result += "#{part_separator}#{part.value}" if part&.value
84
+ result += "#{part_separator}#{subpart.value}" if subpart&.value
85
+ result
86
+ end
87
+
88
+ # Render stage iteration (e.g., ".1" for stage iteration)
89
+ #
90
+ # @param stage_iteration [Components::Code] stage iteration component
91
+ # @return [String] formatted stage iteration or empty string
92
+ def render_stage_iteration(stage_iteration)
93
+ stage_iteration&.value ? ".#{stage_iteration.value}" : ""
94
+ end
95
+
96
+ # Render date with optional year/month/day
97
+ #
98
+ # @param date [Components::Date] date component
99
+ # @param include_month [Boolean] include month in output
100
+ # @param date_separator [String] separator for date parts (default: "-")
101
+ # @return [String] formatted date string or empty string
102
+ def render_date(date, include_month: false, date_separator: "-")
103
+ return "" unless date&.year
104
+
105
+ result = ":#{date.year}"
106
+ if date.month && include_month
107
+ result += "#{date_separator}#{format('%02d', date.month)}"
108
+ result += "#{date_separator}#{format('%02d', date.day)}" if date.day
109
+ end
110
+ result
111
+ end
112
+
113
+ # Render language codes
114
+ #
115
+ # @param languages [Array<Components::Language>] language components
116
+ # @param lang_single [Boolean] use single character format
117
+ # @param lang_separator [String] separator between languages (default: "/")
118
+ # @return [String] formatted language string or empty string
119
+ def render_languages(languages, lang_single: false, lang_separator: "/")
120
+ return "" unless languages&.any?
121
+
122
+ formatted = languages.map do |l|
123
+ l.to_s(lang_single: lang_single)
124
+ end.join(lang_separator)
125
+ "(#{formatted})"
126
+ end
127
+
128
+ # Render edition component
129
+ #
130
+ # @param edition [Components::Edition] edition component
131
+ # @param with_prefix [Boolean] include prefix (default: true)
132
+ # @return [String] formatted edition string or empty string
133
+ def render_edition(edition, with_prefix: true)
134
+ return "" unless edition
135
+
136
+ if with_prefix
137
+ edition.to_s
138
+ else
139
+ " #{edition}"
140
+ end
141
+ end
142
+
143
+ # Check if publisher has copublishers
144
+ #
145
+ # @param publisher [Components::Publisher] publisher component
146
+ # @return [Boolean] true if has copublishers
147
+ def publisher_has_copublisher?(publisher)
148
+ publisher.is_a?(Components::Publisher) && publisher.has_copublisher?
149
+ end
150
+
151
+ # Get publisher body/name
152
+ #
153
+ # @param publisher [Components::Publisher] publisher component
154
+ # @return [String] publisher body
155
+ def publisher_body(publisher)
156
+ publisher.is_a?(Components::Publisher) ? publisher.body : publisher.to_s
157
+ end
158
+
159
+ # Get copublishers as array
160
+ #
161
+ # @param publisher [Components::Publisher] publisher component
162
+ # @return [Array<String>] array of copublisher names
163
+ def copublishers_list(publisher)
164
+ return [] unless publisher.is_a?(Components::Publisher) && publisher.copublisher&.any?
165
+
166
+ publisher.copublisher.map { |cp| publisher_body(cp) }
167
+ end
168
+
169
+ # Render full identifier with all components
170
+ #
171
+ # This is a convenience method that combines all rendering methods
172
+ # in the standard order for most identifier types.
173
+ #
174
+ # @param publisher [Components::Publisher] publisher component
175
+ # @param stage [Components::Stage] stage component
176
+ # @param type [Components::Type] type component
177
+ # @param number [Components::Code] number component
178
+ # @param part [Components::Code] part component
179
+ # @param subpart [Components::Code] subpart component
180
+ # @param stage_iteration [Components::Code] stage iteration component
181
+ # @param date [Components::Date] date component
182
+ # @param edition [Components::Edition] edition component
183
+ # @param languages [Array<Components::Language>] language components
184
+ # @param lang [Symbol] language for rendering (:en or :fr)
185
+ # @param lang_single [Boolean] use single char language format
186
+ # @param with_edition [Boolean] include edition in output
187
+ # @param default_type_abbr [String] default type abbreviation to skip
188
+ # @return [String] formatted identifier string
189
+ def render_full_identifier(publisher:, stage: nil, type: nil,
190
+ number: nil, part: nil, subpart: nil,
191
+ stage_iteration: nil, date: nil,
192
+ edition: nil, languages: nil,
193
+ lang: :en, lang_single: false,
194
+ with_edition: false,
195
+ default_type_abbr: "IS")
196
+ result = render_publisher(publisher)
197
+ result += render_stage_type(stage, type,
198
+ has_copublisher: publisher_has_copublisher?(
199
+ publisher,
200
+ ),
201
+ default_type_abbr: default_type_abbr)
202
+ result += render_numbering(number, part, subpart)
203
+ result += render_stage_iteration(stage_iteration) if stage_iteration
204
+ result += render_date(date)
205
+ result += render_edition(edition) if with_edition && edition
206
+ result += render_languages(languages, lang_single: lang_single)
207
+ result
208
+ end
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Rendering
5
+ # Context object for flavor-specific rendering rules
6
+ #
7
+ # This encapsulates the rendering rules that vary between flavors,
8
+ # allowing components to render themselves correctly based on context.
9
+ #
10
+ # == Usage
11
+ #
12
+ # context = RenderingContext.new(
13
+ # stage_separator: "/",
14
+ # stage_separator_with_copublisher: " ",
15
+ # type_separator: "/",
16
+ # type_separator_with_prefix: " ",
17
+ # default_type_abbr: "IS"
18
+ # )
19
+ # identifier.to_s(context: context)
20
+ #
21
+ class RenderingContext
22
+ attr_reader :stage_separator, :stage_separator_with_copublisher,
23
+ :type_separator, :type_separator_with_prefix,
24
+ :default_type_abbr, :lang, :lang_single,
25
+ :with_language_code, :stage_format_long, :with_date,
26
+ :annotated
27
+
28
+ # Initialize a new rendering context
29
+ #
30
+ # @param stage_separator [String] separator before stage without copublisher
31
+ # @param stage_separator_with_copublisher [String] separator before stage with copublisher
32
+ # @param type_separator [String] separator before type (default)
33
+ # @param type_separator_with_prefix [String] separator before type when prefix exists
34
+ # @param default_type_abbr [String] default type abbreviation to skip rendering
35
+ # @param lang [Symbol] language for rendering (:en or :fr)
36
+ # @param lang_single [Boolean] use single char language format
37
+ def initialize(stage_separator: "/",
38
+ stage_separator_with_copublisher: " ",
39
+ type_separator: "/",
40
+ type_separator_with_prefix: " ",
41
+ default_type_abbr: "IS",
42
+ lang: :en,
43
+ lang_single: false,
44
+ with_language_code: :none,
45
+ stage_format_long: false,
46
+ with_date: true,
47
+ annotated: false)
48
+ @stage_separator = stage_separator
49
+ @stage_separator_with_copublisher = stage_separator_with_copublisher
50
+ @type_separator = type_separator
51
+ @type_separator_with_prefix = type_separator_with_prefix
52
+ @default_type_abbr = default_type_abbr
53
+ @lang = lang
54
+ @lang_single = lang_single
55
+ @with_language_code = with_language_code
56
+ @stage_format_long = stage_format_long
57
+ @with_date = with_date
58
+ @annotated = annotated
59
+ end
60
+
61
+ # Get the appropriate stage separator based on whether there's a copublisher
62
+ #
63
+ # @param has_copublisher [Boolean] whether identifier has copublisher
64
+ # @return [String] the separator to use
65
+ def stage_separator_for(has_copublisher:)
66
+ has_copublisher ? @stage_separator_with_copublisher : @stage_separator
67
+ end
68
+
69
+ # Get the appropriate type separator based on whether there's a prefix
70
+ #
71
+ # @param has_prefix [Boolean] whether there's a prefix (stage or copublisher)
72
+ # @return [String] the separator to use
73
+ def type_separator_for(has_prefix:)
74
+ has_prefix ? @type_separator_with_prefix : @type_separator
75
+ end
76
+
77
+ # Check if type should be rendered (not default)
78
+ #
79
+ # @param type_abbr [String] type abbreviation to check
80
+ # @return [Boolean] true if type should be rendered
81
+ def should_render_type?(type_abbr)
82
+ type_abbr && type_abbr != @default_type_abbr
83
+ end
84
+
85
+ # ISO rendering context singleton
86
+ # @return [RenderingContext] ISO-specific context
87
+ def self.iso
88
+ @iso ||= new(
89
+ stage_separator: "/",
90
+ stage_separator_with_copublisher: " ",
91
+ type_separator: "/",
92
+ type_separator_with_prefix: " ",
93
+ default_type_abbr: "IS",
94
+ )
95
+ end
96
+
97
+ # IEC rendering context singleton
98
+ # @return [RenderingContext] IEC-specific context
99
+ def self.iec
100
+ @iec ||= new(
101
+ stage_separator: "/",
102
+ stage_separator_with_copublisher: " ",
103
+ type_separator: "/",
104
+ type_separator_with_prefix: " ",
105
+ default_type_abbr: "IS",
106
+ )
107
+ end
108
+
109
+ # NIST rendering context singleton
110
+ # @return [RenderingContext] NIST-specific context
111
+ def self.nist
112
+ @nist ||= new(
113
+ stage_separator: "",
114
+ stage_separator_with_copublisher: " ",
115
+ type_separator: " ",
116
+ type_separator_with_prefix: " ",
117
+ default_type_abbr: "",
118
+ )
119
+ end
120
+
121
+ # Format factory methods — replace RenderingStyle hierarchy
122
+ def self.ref_num_short
123
+ new(with_language_code: :single, stage_format_long: false,
124
+ with_date: true)
125
+ end
126
+
127
+ def self.ref_num_long
128
+ new(with_language_code: :iso, stage_format_long: true, with_date: true)
129
+ end
130
+
131
+ def self.ref_dated
132
+ new(with_language_code: :none, stage_format_long: false,
133
+ with_date: true)
134
+ end
135
+
136
+ def self.ref_undated
137
+ new(with_language_code: :none, stage_format_long: false,
138
+ with_date: false)
139
+ end
140
+
141
+ def self.ref_undated_long
142
+ new(with_language_code: :none, stage_format_long: true,
143
+ with_date: false)
144
+ end
145
+
146
+ def self.from_format(format)
147
+ case format
148
+ when :ref_num_short then ref_num_short
149
+ when :ref_num_long then ref_num_long
150
+ when :ref_dated then ref_dated
151
+ when :ref_dated_long then ref_dated
152
+ when :ref_undated then ref_undated
153
+ when :ref_undated_long then ref_undated_long
154
+ else ref_dated
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Rendering
5
+ module Date
6
+ # Render date with optional month/day
7
+ # @param date [Components::Date] date component
8
+ # @param options [Hash] rendering options
9
+ # @return [String] formatted date string
10
+ def render_date(date, **options)
11
+ return "" unless date&.year
12
+
13
+ result = ":#{date.year}"
14
+
15
+ if date.month && options[:include_month]
16
+ result += "-#{format('%02d', date.month)}"
17
+ end
18
+
19
+ if date.day && options[:include_day]
20
+ result += "-#{format('%02d', date.day)}"
21
+ end
22
+
23
+ result
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Rendering
5
+ module Format
6
+ # Dispatch to appropriate format renderer
7
+ # @param format [Symbol] target format
8
+ # @return [String] formatted identifier string
9
+ def to_s(format = nil)
10
+ effective_format = determine_format(format)
11
+ send(:"to_#{effective_format}_style")
12
+ end
13
+
14
+ private
15
+
16
+ def determine_format(format)
17
+ return :short unless format
18
+ return :mr if format.to_sym == :mr
19
+ return :full if %i[full long].include?(format.to_sym)
20
+
21
+ :short
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Rendering
5
+ module Language
6
+ # Render language codes in parenthetical format
7
+ # @param languages [Array<Components::Language>] language components
8
+ # @param options [Hash] rendering options
9
+ # @return [String] formatted language string
10
+ def render_languages(languages, **options)
11
+ return "" unless languages&.any?
12
+
13
+ options[:lang_format] || :short
14
+ formatted = languages.map do |l|
15
+ l.to_s(lang_single: options[:lang_single])
16
+ end
17
+ "(#{formatted.join('/')})"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Rendering
5
+ module Numbering
6
+ # Render number with optional parts and subparts
7
+ # @param number [Components::Code] primary number
8
+ # @param part [Components::Code, nil] optional part
9
+ # @param subpart [Components::Code, nil] optional subpart
10
+ # @param options [Hash] rendering options
11
+ # @return [String] formatted numbering string
12
+ def render_numbering(number, part = nil, subpart = nil, **options)
13
+ return "" unless number&.value
14
+
15
+ result = " #{number.value}"
16
+ separator = options[:part_separator] || "-"
17
+ result += "#{separator}#{part.value}" if part&.value
18
+ result += "#{separator}#{subpart.value}" if subpart&.value
19
+
20
+ result
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Rendering
5
+ module Publisher
6
+ # Render publisher with optional copublishers
7
+ # @param publisher [Components::Publisher, String] base publisher
8
+ # @param copublishers [Array<Components::Publisher>, nil] optional copublisher list
9
+ # @param options [Hash] rendering options
10
+ # @return [String] formatted publisher string
11
+ def render_publisher(publisher, copublishers = nil, **options)
12
+ return "" unless publisher
13
+
14
+ result = publisher.to_s
15
+
16
+ if copublishers&.any?
17
+ separator = options[:copublisher_separator] || "/"
18
+ result += copublishers.map { |cp| "#{separator}#{cp}" }.join
19
+ end
20
+
21
+ result
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Rendering
5
+ module Stage
6
+ # Render stage and type abbreviations
7
+ # @param stage [Components::Stage] stage component
8
+ # @param type [Components::Type] type component
9
+ # @param has_copublisher [Boolean] whether copublisher exists
10
+ # @param options [Hash] rendering options
11
+ # @return [String] formatted stage/type string
12
+ def render_stage(stage, type = nil, has_copublisher: false, **_options)
13
+ result = ""
14
+
15
+ if stage&.abbr
16
+ separator = has_copublisher ? " " : "/"
17
+ result += "#{separator}#{stage.abbr}"
18
+ end
19
+
20
+ if type&.abbr && type.abbr != default_type_abbr
21
+ result += type_separator(has_copublisher, result) + type.abbr
22
+ end
23
+
24
+ result
25
+ end
26
+
27
+ private
28
+
29
+ def default_type_abbr
30
+ "IS" # Override in flavors
31
+ end
32
+
33
+ def type_separator(has_copublisher, has_stage)
34
+ has_copublisher || has_stage.empty? ? " " : "/"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Rendering
5
+ module Supplement
6
+ # Render supplement identifiers (amendment, corrigendum, addendum, etc.)
7
+ # @param base_identifier [Identifier] base identifier
8
+ # @param supplements [Array<Hash>] list of supplements
9
+ # @param options [Hash] rendering options
10
+ # @return [String] formatted supplement string
11
+ def render_supplements(base_identifier, supplements, **options)
12
+ return base_identifier.to_s(**options) unless supplements&.any?
13
+
14
+ result = base_identifier.to_s(**options)
15
+
16
+ supplements.each do |supp|
17
+ result += render_single_supplement(supp, **options)
18
+ end
19
+
20
+ result
21
+ end
22
+
23
+ private
24
+
25
+ def render_single_supplement(supp, **options)
26
+ typed_stage = supp[:typed_stage]
27
+ number = supp[:number]
28
+ date = supp[:date]
29
+
30
+ sep = determine_separator(supp, options)
31
+ abbr = typed_stage.abbreviation(format_long: options[:stage_format_long])
32
+
33
+ result = "#{sep}#{abbr}"
34
+ result += " #{number}" if number
35
+ result += ":#{date.year}" if date&.year
36
+
37
+ result
38
+ end
39
+
40
+ def determine_separator(supp, options)
41
+ supp_type = supp[:type]&.to_s
42
+ options[:"#{supp_type}_separator"] || options[:supplement_separator] || "/"
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Rendering
5
+ autoload :Base, "pubid/rendering/base"
6
+ autoload :Common, "pubid/rendering/common"
7
+ autoload :Date, "pubid/rendering/date"
8
+ autoload :Format, "pubid/rendering/format"
9
+ autoload :Language, "pubid/rendering/language"
10
+ autoload :Numbering, "pubid/rendering/numbering"
11
+ autoload :Publisher, "pubid/rendering/publisher"
12
+ autoload :Stage, "pubid/rendering/stage"
13
+ autoload :Supplement, "pubid/rendering/supplement"
14
+ autoload :RenderingContext, "pubid/rendering/context"
15
+ end
16
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Sae
5
+ class Builder < Pubid::Builder::Base
6
+ def self.build(parsed_data)
7
+ new.build(parsed_data)
8
+ end
9
+
10
+ private
11
+
12
+ def default_identifier_class
13
+ Identifiers::Base
14
+ end
15
+
16
+ def cast(type, value)
17
+ case type
18
+ when :publisher
19
+ "SAE"
20
+ when :type
21
+ Components::Type.new(abbr: value.to_s)
22
+ when :number
23
+ Components::Code.new(value: value.to_s)
24
+ when :year
25
+ { date: Components::Date.new(year: value.to_i) }
26
+ else
27
+ value
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Sae
5
+ module Components
6
+ Code = Pubid::Components::Code
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Sae
7
+ module Components
8
+ # Date component for SAE standards
9
+ # SAE uses year only (e.g., 2024, 2022)
10
+ class Date < Lutaml::Model::Serializable
11
+ attribute :year, :integer
12
+
13
+ def to_s
14
+ year.to_s
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Pubid
6
+ module Sae
7
+ module Components
8
+ # Type component for SAE document types
9
+ # AMS, AIR,, ARP, AS, MA
10
+ class Type < Lutaml::Model::Serializable
11
+ attribute :abbr, :string
12
+
13
+ def to_s
14
+ abbr.to_s
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end