pubid 2.0.0.pre.alpha.2 → 2.0.0.pre.alpha.4

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 (473) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +5 -1
  3. data/data/nist/update_codes.yaml +25 -0
  4. data/lib/pubid/amca/builder.rb +2 -2
  5. data/lib/pubid/amca/identifier.rb +4 -55
  6. data/lib/pubid/amca/identifiers/base.rb +58 -47
  7. data/lib/pubid/amca/identifiers/interpretation.rb +0 -21
  8. data/lib/pubid/amca/identifiers/publication.rb +0 -17
  9. data/lib/pubid/amca/identifiers/standard.rb +0 -4
  10. data/lib/pubid/amca/renderer.rb +82 -0
  11. data/lib/pubid/amca/single_identifier.rb +0 -23
  12. data/lib/pubid/amca/urn_generator.rb +2 -1
  13. data/lib/pubid/amca/urn_parser.rb +28 -0
  14. data/lib/pubid/amca.rb +42 -1
  15. data/lib/pubid/ansi/builder.rb +5 -3
  16. data/lib/pubid/ansi/identifier.rb +1 -43
  17. data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
  18. data/lib/pubid/ansi/identifiers/standard.rb +2 -3
  19. data/lib/pubid/ansi/renderer.rb +53 -0
  20. data/lib/pubid/ansi/single_identifier.rb +2 -31
  21. data/lib/pubid/ansi/urn_generator.rb +3 -38
  22. data/lib/pubid/ansi/urn_parser.rb +23 -0
  23. data/lib/pubid/ansi.rb +38 -3
  24. data/lib/pubid/api/builder.rb +33 -74
  25. data/lib/pubid/api/identifier.rb +5 -52
  26. data/lib/pubid/api/identifiers/base.rb +2 -14
  27. data/lib/pubid/api/identifiers/bulletin.rb +0 -2
  28. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
  29. data/lib/pubid/api/identifiers/mpms.rb +0 -20
  30. data/lib/pubid/api/identifiers/publication.rb +0 -2
  31. data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
  32. data/lib/pubid/api/identifiers/specification.rb +0 -2
  33. data/lib/pubid/api/identifiers/standard.rb +0 -2
  34. data/lib/pubid/api/identifiers/technical_report.rb +0 -2
  35. data/lib/pubid/api/identifiers/typeless_standard.rb +0 -16
  36. data/lib/pubid/api/identifiers.rb +18 -0
  37. data/lib/pubid/api/renderer.rb +89 -0
  38. data/lib/pubid/api/single_identifier.rb +5 -20
  39. data/lib/pubid/api/urn_generator.rb +0 -18
  40. data/lib/pubid/api/urn_parser.rb +35 -0
  41. data/lib/pubid/api.rb +51 -5
  42. data/lib/pubid/ashrae/builder.rb +3 -3
  43. data/lib/pubid/ashrae/identifier.rb +7 -55
  44. data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
  45. data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
  46. data/lib/pubid/ashrae/identifiers/base.rb +29 -15
  47. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
  48. data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
  49. data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
  50. data/lib/pubid/ashrae/parser.rb +4 -0
  51. data/lib/pubid/ashrae/renderer.rb +117 -0
  52. data/lib/pubid/ashrae/single_identifier.rb +0 -13
  53. data/lib/pubid/ashrae/urn_generator.rb +0 -8
  54. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  55. data/lib/pubid/ashrae.rb +46 -1
  56. data/lib/pubid/asme/components/code.rb +10 -2
  57. data/lib/pubid/asme/identifier.rb +0 -46
  58. data/lib/pubid/asme/identifiers/base.rb +0 -60
  59. data/lib/pubid/asme/renderer.rb +66 -0
  60. data/lib/pubid/asme/single_identifier.rb +3 -1
  61. data/lib/pubid/asme/urn_parser.rb +31 -0
  62. data/lib/pubid/asme.rb +42 -1
  63. data/lib/pubid/astm/components/code.rb +9 -0
  64. data/lib/pubid/{jis → astm}/components.rb +1 -1
  65. data/lib/pubid/astm/identifier.rb +0 -77
  66. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  67. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  68. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  69. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  70. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  71. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  72. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  73. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  74. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  75. data/lib/pubid/astm/identifiers.rb +18 -0
  76. data/lib/pubid/astm/renderer.rb +172 -0
  77. data/lib/pubid/astm/single_identifier.rb +3 -11
  78. data/lib/pubid/astm/urn_parser.rb +30 -0
  79. data/lib/pubid/astm.rb +39 -27
  80. data/lib/pubid/bsi/builder.rb +21 -12
  81. data/lib/pubid/bsi/identifier.rb +5 -85
  82. data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -36
  83. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +8 -48
  84. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +8 -39
  85. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +2 -55
  86. data/lib/pubid/bsi/identifiers/amendment.rb +2 -22
  87. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +1 -6
  88. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  89. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -87
  90. data/lib/pubid/bsi/identifiers/committee_document.rb +0 -16
  91. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -87
  92. data/lib/pubid/bsi/identifiers/corrigendum.rb +2 -10
  93. data/lib/pubid/bsi/identifiers/detailed_specification.rb +0 -36
  94. data/lib/pubid/bsi/identifiers/disc.rb +0 -29
  95. data/lib/pubid/bsi/identifiers/draft_document.rb +2 -46
  96. data/lib/pubid/bsi/identifiers/electronic_book.rb +2 -38
  97. data/lib/pubid/bsi/identifiers/expert_commentary.rb +2 -18
  98. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +0 -47
  99. data/lib/pubid/bsi/identifiers/flex.rb +0 -35
  100. data/lib/pubid/bsi/identifiers/handbook.rb +1 -15
  101. data/lib/pubid/bsi/identifiers/index.rb +0 -32
  102. data/lib/pubid/bsi/identifiers/method.rb +0 -41
  103. data/lib/pubid/bsi/identifiers/national_annex.rb +4 -29
  104. data/lib/pubid/bsi/identifiers/practice_guide.rb +1 -6
  105. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +2 -54
  106. data/lib/pubid/bsi/identifiers/published_document.rb +2 -54
  107. data/lib/pubid/bsi/identifiers/section.rb +0 -30
  108. data/lib/pubid/bsi/identifiers/set.rb +3 -20
  109. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +0 -9
  110. data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -24
  111. data/lib/pubid/bsi/identifiers/supplementary_index.rb +0 -46
  112. data/lib/pubid/bsi/identifiers/technical_specification.rb +2 -47
  113. data/lib/pubid/bsi/identifiers/test_method.rb +0 -32
  114. data/lib/pubid/bsi/identifiers/value_added_publication.rb +2 -17
  115. data/lib/pubid/bsi/identifiers.rb +0 -1
  116. data/lib/pubid/bsi/renderer.rb +1050 -0
  117. data/lib/pubid/bsi/single_identifier.rb +33 -78
  118. data/lib/pubid/bsi/urn_generator.rb +2 -3
  119. data/lib/pubid/bsi/urn_parser.rb +52 -0
  120. data/lib/pubid/bsi.rb +232 -2
  121. data/lib/pubid/builder/base.rb +57 -10
  122. data/lib/pubid/bundled_identifier.rb +0 -1
  123. data/lib/pubid/ccsds/builder.rb +4 -3
  124. data/lib/pubid/ccsds/identifier.rb +53 -68
  125. data/lib/pubid/ccsds/identifiers/base.rb +11 -61
  126. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  127. data/lib/pubid/ccsds/parser.rb +4 -2
  128. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  129. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  130. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  131. data/lib/pubid/ccsds.rb +39 -1
  132. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  133. data/lib/pubid/cen_cenelec/identifier.rb +11 -40
  134. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +9 -4
  135. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +0 -10
  136. data/lib/pubid/cen_cenelec/identifiers/base.rb +2 -45
  137. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  138. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  139. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +0 -27
  140. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +0 -15
  141. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +2 -8
  143. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  144. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +0 -4
  145. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  146. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  147. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  148. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  149. data/lib/pubid/cen_cenelec/single_identifier.rb +9 -90
  150. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  151. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  152. data/lib/pubid/cen_cenelec.rb +172 -1
  153. data/lib/pubid/cie/components/code.rb +8 -0
  154. data/lib/pubid/cie/identifier.rb +10 -57
  155. data/lib/pubid/cie/single_identifier.rb +4 -4
  156. data/lib/pubid/cie/urn_parser.rb +28 -0
  157. data/lib/pubid/cie.rb +47 -1
  158. data/lib/pubid/components/adoption.rb +104 -0
  159. data/lib/pubid/components/code.rb +22 -8
  160. data/lib/pubid/components/date.rb +23 -16
  161. data/lib/pubid/components/edition.rb +9 -6
  162. data/lib/pubid/components/iteration.rb +32 -0
  163. data/lib/pubid/components/language.rb +6 -4
  164. data/lib/pubid/components/locality.rb +10 -1
  165. data/lib/pubid/components/publisher.rb +9 -6
  166. data/lib/pubid/components/relationship.rb +151 -0
  167. data/lib/pubid/components/stage.rb +5 -14
  168. data/lib/pubid/components/supplement.rb +184 -0
  169. data/lib/pubid/components/type.rb +5 -15
  170. data/lib/pubid/components/typed_stage.rb +10 -11
  171. data/lib/pubid/components.rb +4 -1
  172. data/lib/pubid/core/update_codes.rb +28 -7
  173. data/lib/pubid/csa/identifier.rb +9 -59
  174. data/lib/pubid/csa/identifiers/base.rb +0 -123
  175. data/lib/pubid/csa/identifiers/cec.rb +0 -103
  176. data/lib/pubid/csa/identifiers/series.rb +0 -104
  177. data/lib/pubid/csa/renderer.rb +292 -0
  178. data/lib/pubid/csa/single_identifier.rb +1 -1
  179. data/lib/pubid/csa/urn_generator.rb +1 -1
  180. data/lib/pubid/csa/urn_parser.rb +33 -0
  181. data/lib/pubid/csa.rb +46 -1
  182. data/lib/pubid/etsi/components/code.rb +10 -9
  183. data/lib/pubid/etsi/components/version.rb +0 -5
  184. data/lib/pubid/etsi/identifier.rb +4 -55
  185. data/lib/pubid/etsi/identifiers/base.rb +31 -27
  186. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +1 -11
  187. data/lib/pubid/etsi/renderer.rb +42 -0
  188. data/lib/pubid/etsi/urn_parser.rb +34 -0
  189. data/lib/pubid/etsi.rb +44 -1
  190. data/lib/pubid/export/exporter.rb +4 -46
  191. data/lib/pubid/export/flavor_exporter.rb +111 -278
  192. data/lib/pubid/export.rb +0 -6
  193. data/lib/pubid/identifier.rb +92 -18
  194. data/lib/pubid/identifier_metadata.rb +1 -1
  195. data/lib/pubid/idf/builder.rb +3 -3
  196. data/lib/pubid/idf/identifier.rb +7 -66
  197. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  198. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  199. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  200. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  201. data/lib/pubid/idf/parser.rb +3 -2
  202. data/lib/pubid/idf/renderer.rb +84 -0
  203. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  204. data/lib/pubid/idf/urn_generator.rb +4 -39
  205. data/lib/pubid/idf/urn_parser.rb +25 -0
  206. data/lib/pubid/idf.rb +55 -1
  207. data/lib/pubid/iec/builder.rb +46 -64
  208. data/lib/pubid/iec/components/code.rb +8 -32
  209. data/lib/pubid/iec/components/publisher.rb +0 -1
  210. data/lib/pubid/iec/components.rb +14 -0
  211. data/lib/pubid/iec/identifier.rb +251 -213
  212. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  213. data/lib/pubid/iec/identifiers/base.rb +5 -33
  214. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  215. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  216. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +23 -26
  217. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  218. data/lib/pubid/iec/identifiers/fragment_identifier.rb +35 -24
  219. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  220. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  221. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  222. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  223. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  224. data/lib/pubid/iec/identifiers/sheet_identifier.rb +17 -11
  225. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  226. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  227. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  228. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  229. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  230. data/lib/pubid/iec/identifiers/test_report_form.rb +3 -35
  231. data/lib/pubid/iec/identifiers/vap_identifier.rb +24 -21
  232. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  233. data/lib/pubid/iec/identifiers/working_document.rb +2 -50
  234. data/lib/pubid/iec/identifiers.rb +30 -0
  235. data/lib/pubid/iec/parser.rb +13 -12
  236. data/lib/pubid/iec/renderer.rb +254 -0
  237. data/lib/pubid/iec/single_identifier.rb +6 -12
  238. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  239. data/lib/pubid/iec/urn_generator.rb +3 -3
  240. data/lib/pubid/iec/urn_parser.rb +3 -3
  241. data/lib/pubid/iec.rb +43 -67
  242. data/lib/pubid/ieee/builder.rb +12 -12
  243. data/lib/pubid/ieee/components/code.rb +8 -0
  244. data/lib/pubid/ieee/components/draft.rb +14 -0
  245. data/lib/pubid/ieee/components/relationship.rb +5 -149
  246. data/lib/pubid/ieee/identifier.rb +5 -52
  247. data/lib/pubid/ieee/identifiers/adopted_standard.rb +0 -9
  248. data/lib/pubid/ieee/identifiers/base.rb +221 -556
  249. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +0 -10
  250. data/lib/pubid/ieee/identifiers/corrigendum.rb +0 -12
  251. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +0 -10
  252. data/lib/pubid/ieee/identifiers/dual_identifier.rb +0 -4
  253. data/lib/pubid/ieee/identifiers/dual_published.rb +0 -4
  254. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +0 -9
  255. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +0 -10
  256. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  257. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +0 -18
  258. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +0 -6
  259. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  260. data/lib/pubid/ieee/identifiers/redlined_standard.rb +0 -7
  261. data/lib/pubid/ieee/identifiers/si_standard.rb +0 -38
  262. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  263. data/lib/pubid/ieee/pre_parser.rb +301 -0
  264. data/lib/pubid/ieee/renderer.rb +307 -0
  265. data/lib/pubid/ieee/urn_parser.rb +34 -0
  266. data/lib/pubid/ieee.rb +66 -1
  267. data/lib/pubid/ieee_debug.rb +0 -1
  268. data/lib/pubid/iho/builder.rb +2 -2
  269. data/lib/pubid/iho/identifier.rb +7 -59
  270. data/lib/pubid/iho/identifiers/base.rb +64 -31
  271. data/lib/pubid/iho/parser.rb +3 -3
  272. data/lib/pubid/iho/renderer.rb +30 -0
  273. data/lib/pubid/iho/urn_generator.rb +2 -2
  274. data/lib/pubid/iho/urn_parser.rb +58 -0
  275. data/lib/pubid/iho.rb +52 -1
  276. data/lib/pubid/iso/builder.rb +55 -53
  277. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  278. data/lib/pubid/iso/components/code.rb +7 -19
  279. data/lib/pubid/iso/components/publisher.rb +10 -8
  280. data/lib/pubid/iso/components.rb +2 -4
  281. data/lib/pubid/iso/identifier.rb +219 -252
  282. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  283. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  284. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  285. data/lib/pubid/iso/identifiers/data.rb +0 -1
  286. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  287. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  288. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  289. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  290. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  291. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  292. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  293. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  294. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  295. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  296. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  297. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  298. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  299. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  300. data/lib/pubid/iso/identifiers.rb +0 -1
  301. data/lib/pubid/iso/normalizer.rb +89 -0
  302. data/lib/pubid/iso/parser.rb +22 -4
  303. data/lib/pubid/iso/single_identifier.rb +0 -4
  304. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  305. data/lib/pubid/iso/urn_generator.rb +66 -182
  306. data/lib/pubid/iso/urn_parser.rb +12 -7
  307. data/lib/pubid/iso.rb +177 -2
  308. data/lib/pubid/itu/builder.rb +0 -12
  309. data/lib/pubid/itu/components/code.rb +9 -7
  310. data/lib/pubid/itu/components/sector.rb +15 -4
  311. data/lib/pubid/itu/components/series.rb +0 -4
  312. data/lib/pubid/itu/components.rb +11 -0
  313. data/lib/pubid/itu/identifier.rb +4 -116
  314. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  315. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  316. data/lib/pubid/itu/identifiers/base.rb +124 -128
  317. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  318. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  319. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  320. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  321. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  322. data/lib/pubid/itu/urn_parser.rb +23 -0
  323. data/lib/pubid/itu.rb +44 -1
  324. data/lib/pubid/jcgm/builder.rb +16 -8
  325. data/lib/pubid/jcgm/identifier.rb +0 -43
  326. data/lib/pubid/jcgm/identifiers/amendment.rb +0 -9
  327. data/lib/pubid/jcgm/identifiers/gum_guide.rb +0 -12
  328. data/lib/pubid/jcgm/renderer.rb +68 -0
  329. data/lib/pubid/jcgm/single_identifier.rb +0 -8
  330. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  331. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  332. data/lib/pubid/jcgm.rb +43 -2
  333. data/lib/pubid/jis/builder.rb +44 -52
  334. data/lib/pubid/jis/identifier.rb +120 -46
  335. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  336. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  337. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  338. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  339. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  340. data/lib/pubid/jis/identifiers.rb +1 -1
  341. data/lib/pubid/jis/parser.rb +31 -5
  342. data/lib/pubid/jis/renderer.rb +69 -0
  343. data/lib/pubid/jis/single_identifier.rb +6 -12
  344. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  345. data/lib/pubid/jis/urn_parser.rb +23 -0
  346. data/lib/pubid/jis.rb +42 -2
  347. data/lib/pubid/nist/builder.rb +63 -1871
  348. data/lib/pubid/nist/caster.rb +1272 -0
  349. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  350. data/lib/pubid/nist/components/code.rb +9 -20
  351. data/lib/pubid/nist/components/supplement.rb +2 -2
  352. data/lib/pubid/nist/components.rb +0 -1
  353. data/lib/pubid/nist/identifier.rb +8 -60
  354. data/lib/pubid/nist/identifiers/base.rb +564 -492
  355. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  356. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -1
  357. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  358. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  359. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  360. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -8
  361. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  362. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +15 -24
  363. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  364. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  365. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  366. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  367. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  368. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  369. data/lib/pubid/nist/identifiers/report.rb +4 -2
  370. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  371. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  372. data/lib/pubid/nist/identifiers.rb +1 -0
  373. data/lib/pubid/nist/parser.rb +62 -452
  374. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  375. data/lib/pubid/nist/preprocessor.rb +428 -0
  376. data/lib/pubid/nist/renderer.rb +43 -0
  377. data/lib/pubid/nist/router.rb +148 -0
  378. data/lib/pubid/nist/series/base.rb +58 -0
  379. data/lib/pubid/nist/series/crpl.rb +13 -0
  380. data/lib/pubid/nist/series/fips.rb +14 -0
  381. data/lib/pubid/nist/series/ir.rb +60 -0
  382. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  383. data/lib/pubid/nist/series/mono.rb +19 -0
  384. data/lib/pubid/nist/series/ncstar.rb +20 -0
  385. data/lib/pubid/nist/series.rb +49 -0
  386. data/lib/pubid/nist/supplement_identifier.rb +3 -1
  387. data/lib/pubid/nist/urn_parser.rb +67 -0
  388. data/lib/pubid/nist.rb +86 -4
  389. data/lib/pubid/oiml/builder.rb +21 -3
  390. data/lib/pubid/oiml/components/code.rb +17 -0
  391. data/lib/pubid/oiml/identifier.rb +40 -46
  392. data/lib/pubid/oiml/identifiers/annex.rb +13 -46
  393. data/lib/pubid/oiml/identifiers/errata.rb +15 -0
  394. data/lib/pubid/oiml/identifiers.rb +1 -1
  395. data/lib/pubid/oiml/parser.rb +59 -12
  396. data/lib/pubid/oiml/renderer.rb +171 -0
  397. data/lib/pubid/oiml/single_identifier.rb +61 -42
  398. data/lib/pubid/oiml/supplement_identifier.rb +31 -17
  399. data/lib/pubid/oiml/urn_generator.rb +0 -8
  400. data/lib/pubid/oiml/urn_parser.rb +22 -0
  401. data/lib/pubid/oiml.rb +42 -1
  402. data/lib/pubid/plateau/identifier.rb +4 -55
  403. data/lib/pubid/plateau/identifiers/base.rb +45 -36
  404. data/lib/pubid/plateau/identifiers/handbook.rb +0 -6
  405. data/lib/pubid/plateau/identifiers/technical_report.rb +0 -4
  406. data/lib/pubid/plateau/renderer.rb +51 -0
  407. data/lib/pubid/plateau/supplement_identifier.rb +0 -4
  408. data/lib/pubid/plateau/urn_parser.rb +43 -0
  409. data/lib/pubid/plateau.rb +43 -1
  410. data/lib/pubid/renderers/directives_renderer.rb +22 -8
  411. data/lib/pubid/renderers/guide_renderer.rb +4 -2
  412. data/lib/pubid/renderers/human_readable.rb +18 -7
  413. data/lib/pubid/rendering/context.rb +28 -19
  414. data/lib/pubid/rendering.rb +0 -3
  415. data/lib/pubid/sae/components/date.rb +8 -0
  416. data/lib/pubid/sae/components/type.rb +5 -1
  417. data/lib/pubid/sae/identifier.rb +4 -35
  418. data/lib/pubid/sae/identifiers/base.rb +26 -31
  419. data/lib/pubid/sae/renderer.rb +36 -0
  420. data/lib/pubid/sae/urn_generator.rb +2 -10
  421. data/lib/pubid/sae/urn_parser.rb +36 -0
  422. data/lib/pubid/sae.rb +42 -1
  423. data/lib/pubid/urn_generator/base.rb +12 -12
  424. data/lib/pubid/urn_parser/base.rb +81 -0
  425. data/lib/pubid/urn_parser/errors.rb +9 -0
  426. data/lib/pubid/urn_parser.rb +14 -0
  427. data/lib/pubid/version.rb +1 -1
  428. data/lib/pubid.rb +45 -7
  429. data/lib/tasks/export.rake +6 -5
  430. data/lib/tasks/website-data.json +1940 -1882
  431. metadata +75 -45
  432. data/lib/pubid/amca/scheme.rb +0 -16
  433. data/lib/pubid/ansi/scheme.rb +0 -15
  434. data/lib/pubid/api/scheme.rb +0 -66
  435. data/lib/pubid/ashrae/scheme.rb +0 -53
  436. data/lib/pubid/asme/scheme.rb +0 -37
  437. data/lib/pubid/astm/scheme.rb +0 -55
  438. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  439. data/lib/pubid/bsi/scheme.rb +0 -243
  440. data/lib/pubid/ccsds/scheme.rb +0 -57
  441. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  442. data/lib/pubid/cie/scheme.rb +0 -64
  443. data/lib/pubid/components/factory.rb +0 -50
  444. data/lib/pubid/csa/scheme.rb +0 -44
  445. data/lib/pubid/etsi/scheme.rb +0 -42
  446. data/lib/pubid/export/data_class_exporter.rb +0 -59
  447. data/lib/pubid/export/ieee_exporter.rb +0 -78
  448. data/lib/pubid/export/itu_exporter.rb +0 -66
  449. data/lib/pubid/export/nist_exporter.rb +0 -64
  450. data/lib/pubid/export/registry_exporter.rb +0 -90
  451. data/lib/pubid/export/scheme_exporter.rb +0 -70
  452. data/lib/pubid/identifier_registry.rb +0 -198
  453. data/lib/pubid/idf/scheme.rb +0 -61
  454. data/lib/pubid/iec/scheme.rb +0 -71
  455. data/lib/pubid/ieee/scheme.rb +0 -90
  456. data/lib/pubid/iho/scheme.rb +0 -29
  457. data/lib/pubid/iso/identifiers/base.rb +0 -115
  458. data/lib/pubid/iso/scheme.rb +0 -193
  459. data/lib/pubid/itu/scheme.rb +0 -174
  460. data/lib/pubid/jcgm/scheme.rb +0 -60
  461. data/lib/pubid/jis/components/code.rb +0 -59
  462. data/lib/pubid/jis/identifiers/base.rb +0 -72
  463. data/lib/pubid/jis/scheme.rb +0 -49
  464. data/lib/pubid/nist/components/publisher.rb +0 -24
  465. data/lib/pubid/nist/scheme.rb +0 -199
  466. data/lib/pubid/oiml/identifiers/base.rb +0 -36
  467. data/lib/pubid/oiml/scheme.rb +0 -46
  468. data/lib/pubid/plateau/scheme.rb +0 -45
  469. data/lib/pubid/rendering/base.rb +0 -73
  470. data/lib/pubid/rendering/common.rb +0 -211
  471. data/lib/pubid/rendering/format.rb +0 -25
  472. data/lib/pubid/sae/scheme.rb +0 -47
  473. data/lib/pubid/scheme.rb +0 -219
@@ -8,33 +8,6 @@ module Pubid
8
8
  class ConsolidatedIdentifier < Base
9
9
  attribute :identifiers, Base, polymorphic: true, collection: true
10
10
 
11
- def to_s
12
- identifiers.map.with_index do |id, idx|
13
- if idx.zero?
14
- # First identifier renders normally
15
- id.to_s
16
- elsif id.is_a?(Amendment)
17
- # Supplements render with "+" prefix (bundled/consolidated format)
18
- result = "+A#{id.amendment_number}"
19
- result += ":#{id.amendment_year}" if id.amendment_year
20
- result
21
- # Only render the amendment portion, not the full id.to_s
22
- elsif id.is_a?(Corrigendum)
23
- # Only render the corrigendum portion
24
- result = "+AC"
25
- result += id.corrigendum_number if id.corrigendum_number && !id.corrigendum_number.empty?
26
- if id.corrigendum_year
27
- result += ":#{id.corrigendum_year}"
28
- result += "-#{id.corrigendum_month}" if id.corrigendum_month && !id.corrigendum_month.empty?
29
- end
30
- result
31
- else
32
- # Other identifiers (should not happen in typical bundles) render with +
33
- "+#{id}"
34
- end
35
- end.compact.join
36
- end
37
-
38
11
  # Delegate to first identifier (base document)
39
12
  def publisher
40
13
  identifiers&.first&.publisher
@@ -11,21 +11,6 @@ module Pubid
11
11
  attribute :corrigendum_year, :integer
12
12
  attribute :corrigendum_month, :string
13
13
 
14
- def to_s
15
- if base_identifier
16
- result = base_identifier.to_s
17
- result += "/AC"
18
- result += corrigendum_number if corrigendum_number && !corrigendum_number.empty?
19
- else
20
- result = "/AC#{corrigendum_number}"
21
- end
22
- if corrigendum_year
23
- result += ":#{corrigendum_year}"
24
- result += "-#{corrigendum_month}" if corrigendum_month && !corrigendum_month.empty?
25
- end
26
- result
27
- end
28
-
29
14
  def publisher
30
15
  base_identifier&.publisher
31
16
  end
@@ -33,7 +33,8 @@ module Pubid
33
33
  ].freeze
34
34
 
35
35
  def self.type
36
- { key: :en, title: "European Norm", short: "EN" }
36
+ { key: :en,
37
+ web: :european_norm, title: "European Norm", short: "EN" }
37
38
  end
38
39
  end
39
40
  end
@@ -21,16 +21,10 @@ module Pubid
21
21
  ].freeze
22
22
 
23
23
  def self.type
24
- { key: :env, title: "European Prestandard", short: "ENV" }
24
+ { key: :env,
25
+ web: :european_prestandard, title: "European Prestandard", short: "ENV" }
25
26
  end
26
27
 
27
- def to_s(lang: :en, lang_single: false)
28
- if adopted_identifier
29
- "ENV #{adopted_identifier}"
30
- else
31
- super
32
- end
33
- end
34
28
  end
35
29
  end
36
30
  end
@@ -20,7 +20,8 @@ module Pubid
20
20
  ].freeze
21
21
 
22
22
  def self.type
23
- { key: :es, title: "European Specification", short: "ES" }
23
+ { key: :es,
24
+ web: :european_specification, title: "European Specification", short: "ES" }
24
25
  end
25
26
  end
26
27
  end
@@ -9,10 +9,6 @@ module Pubid
9
9
  attribute :base_identifier, Amendment
10
10
  attribute :fragment_number, :string
11
11
 
12
- def to_s
13
- "#{base_identifier} FRAG#{fragment_number}"
14
- end
15
-
16
12
  def publisher
17
13
  base_identifier&.base_identifier&.publisher
18
14
  end
@@ -19,7 +19,8 @@ module Pubid
19
19
  ].freeze
20
20
 
21
21
  def self.type
22
- { key: :hd, title: "Harmonization Document", short: "HD" }
22
+ { key: :hd,
23
+ web: :harmonization_document, title: "Harmonization Document", short: "HD" }
23
24
  end
24
25
  end
25
26
  end
@@ -19,7 +19,8 @@ module Pubid
19
19
  ].freeze
20
20
 
21
21
  def self.type
22
- { key: :tr, title: "Technical Report", short: "TR" }
22
+ { key: :tr,
23
+ web: :technical_report, title: "Technical Report", short: "TR" }
23
24
  end
24
25
  end
25
26
  end
@@ -27,7 +27,8 @@ module Pubid
27
27
  ].freeze
28
28
 
29
29
  def self.type
30
- { key: :ts, title: "Technical Specification", short: "TS" }
30
+ { key: :ts,
31
+ web: :technical_specification, title: "Technical Specification", short: "TS" }
31
32
  end
32
33
  end
33
34
  end
@@ -0,0 +1,261 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module CenCenelec
5
+ # Human-readable renderer for CEN/CENELEC identifiers.
6
+ #
7
+ # Produces strings like:
8
+ # "EN 196-3:2005"
9
+ # "EN ISO 8601:2019"
10
+ # "prEN 12345:2020"
11
+ # "CEN/TS 12345:2005"
12
+ # "EN 196-3:2005+A1:2008"
13
+ # "EN 60038/AC1:2012"
14
+ # "ENV ISO 8601"
15
+ #
16
+ # The renderer is registered as the +:human+ format in the CEN/CENELEC format
17
+ # registry and invoked via +render(format: :human)+.
18
+ class Renderer < ::Pubid::Renderers::Base
19
+ def render(context: nil, **opts)
20
+ id = @id
21
+ @context = context
22
+
23
+ case id
24
+ when Identifiers::AdoptedEuropeanNorm
25
+ render_adopted_european_norm(id)
26
+ when Identifiers::Amendment
27
+ render_amendment(id)
28
+ when Identifiers::Corrigendum
29
+ render_corrigendum(id)
30
+ when Identifiers::ConsolidatedIdentifier
31
+ render_consolidated(id)
32
+ when Identifiers::Fragment
33
+ render_fragment(id)
34
+ when Identifiers::EuropeanPrestandard
35
+ render_european_prestandard(id, **opts)
36
+ when Identifiers::Base
37
+ # CEN identifiers::Base hierarchy (Amendment, Corrigendum, etc. handled above)
38
+ render_cen_base(id)
39
+ when SingleIdentifier
40
+ render_single(id)
41
+ else
42
+ render_single(id)
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ # SingleIdentifier (EN, Guide, TR, TS, CWA, HD, etc.):
49
+ # Complex rendering with draft stages, copublishers, typed stages
50
+ def render_single(id)
51
+ parts = []
52
+
53
+ # Check if we have a draft stage (prEN, FprEN) - these include both stage and type
54
+ is_draft_stage = id.typed_stage&.abbr && %w[prEN
55
+ FprEN].include?(id.typed_stage.abbr.first)
56
+
57
+ # Get type short name - for draft stages, extract base type
58
+ type_short = if is_draft_stage
59
+ id.typed_stage.type_code.to_s.upcase # :en => "EN"
60
+ elsif id.type.is_a?(Components::Type)
61
+ id.type.abbr
62
+ elsif id.class.type.is_a?(Hash)
63
+ id.class.type[:short]
64
+ else
65
+ "EN" # Default
66
+ end
67
+
68
+ # Track if we should use slash before type
69
+ use_slash_before_type = false
70
+
71
+ # For CWA/HD, they act as publisher (not EN)
72
+ if %w[CWA HD CR].include?(type_short)
73
+ # Stage prefix OR type as publisher
74
+ parts << if id.typed_stage&.abbr && id.typed_stage.abbr.first != type_short
75
+ id.typed_stage.abbr.first
76
+ else
77
+ type_short
78
+ end
79
+ elsif is_draft_stage
80
+ # Draft stage prefix (prEN, FprEN) OR regular publisher
81
+ parts << id.typed_stage.abbr.first
82
+ elsif id.publisher
83
+ parts << id.publisher.render(context: @context)
84
+ use_slash_before_type = true # When publisher present, use slash before type
85
+ end
86
+
87
+ # Copublishers - add to last part (publisher) with slash
88
+ if id.copublishers&.any?
89
+ copub_str = id.copublishers.map { |cp| cp.render(context: @context) }.join("/")
90
+ unless copub_str.empty?
91
+ if parts.any?
92
+ parts[-1] = "#{parts[-1]}/#{copub_str}"
93
+ else
94
+ parts << copub_str
95
+ end
96
+ end
97
+ end
98
+
99
+ # Type for non-EN documents (TS, TR) - but not CWA/HD or Guide
100
+ if type_short != "EN" && !%w[CWA HD CR Guide].include?(type_short)
101
+ if use_slash_before_type && parts.any?
102
+ # Use slash separator for publisher/type combination (TS, TR only)
103
+ parts << "/#{type_short}"
104
+ else
105
+ parts << type_short
106
+ end
107
+ elsif type_short == "Guide"
108
+ # Guide uses SPACE separator, not slash
109
+ parts << "Guide"
110
+ end
111
+
112
+ # Number with part (which may be multi-level like "5-1-1")
113
+ if id.number
114
+ number_str = id.number.render(context: @context)
115
+ if id.part
116
+ number_str += "-#{id.part.render(context: @context)}"
117
+ end
118
+ parts << number_str
119
+ end
120
+
121
+ # Join parts - but handle slash prefix for type
122
+ result = ""
123
+ parts.each_with_index do |part, idx|
124
+ if idx.positive? && !part.start_with?("/")
125
+ result += " "
126
+ end
127
+ result += part
128
+ end
129
+
130
+ # Date
131
+ if id.date
132
+ year_val = id.date.is_a?(::Pubid::Components::Date) ? id.date.render(context: @context) : id.date.to_i
133
+ result += ":#{year_val}"
134
+ end
135
+
136
+ result
137
+ end
138
+
139
+ # CEN Identifiers::Base: simple key-value model
140
+ # Format: {PUBLISHER} NUMBER[-PART]:YEAR
141
+ def render_cen_base(id)
142
+ result = ""
143
+
144
+ # Stage or Publisher
145
+ if id.stage
146
+ result += id.stage
147
+ elsif id.publisher&.any?
148
+ result += id.publisher.join("/")
149
+ end
150
+
151
+ # If we have adopted_identifier, render it (contains all info)
152
+ if id.adopted_identifier
153
+ result += " #{id.adopted_identifier}"
154
+ # Don't add our own number/parts/year - they're in adopted_identifier
155
+ else
156
+ # Only render our own fields if no adoption
157
+ # Type - use space for Guide, slash for TR/TS
158
+ if id.type
159
+ sep = id.type == "Guide" ? " " : "/"
160
+ result += "#{sep}#{id.type}"
161
+ end
162
+
163
+ result += " #{id.number}"
164
+ result += id.parts.map { |p| "-#{p}" }.join if id.parts&.any?
165
+ result += ":#{id.year}" if id.year
166
+
167
+ # Supplements
168
+ if id.supplements&.any?
169
+ id.supplements.each do |supp|
170
+ sep = supp[:type] == :amendment ? "/" : "+"
171
+ result += "#{sep}#{supp[:type] == :amendment ? 'A' : 'AC'}"
172
+ result += supp[:number] if supp[:number] && !supp[:number].empty?
173
+ result += ":#{supp[:year]}" if supp[:year]
174
+ end
175
+ end
176
+
177
+ # Edition
178
+ result += " ED#{id.edition}" if id.edition
179
+ end
180
+
181
+ result
182
+ end
183
+
184
+ # AdoptedEuropeanNorm: "EN ISO 8601:2019"
185
+ def render_adopted_european_norm(id)
186
+ result = id.publisher.is_a?(Array) ? id.publisher.join("/") : id.publisher.join("/")
187
+ result += " #{id.adopted_identifier}" if id.adopted_identifier
188
+ result
189
+ end
190
+
191
+ # Amendment: "EN 196-3:2005/A1:2008"
192
+ def render_amendment(id)
193
+ result = if id.base_identifier
194
+ "#{id.base_identifier}/A#{id.amendment_number}"
195
+ else
196
+ "/A#{id.amendment_number}"
197
+ end
198
+ result += ":#{id.amendment_year}" if id.amendment_year
199
+ result
200
+ end
201
+
202
+ # Corrigendum: "EN 60038/AC1:2012"
203
+ def render_corrigendum(id)
204
+ if id.base_identifier
205
+ result = id.base_identifier.to_s
206
+ result += "/AC"
207
+ result += id.corrigendum_number if id.corrigendum_number && !id.corrigendum_number.empty?
208
+ else
209
+ result = "/AC#{id.corrigendum_number}"
210
+ end
211
+ if id.corrigendum_year
212
+ result += ":#{id.corrigendum_year}"
213
+ result += "-#{id.corrigendum_month}" if id.corrigendum_month && !id.corrigendum_month.empty?
214
+ end
215
+ result
216
+ end
217
+
218
+ # ConsolidatedIdentifier: "EN 196-3:2005+A1:2008"
219
+ def render_consolidated(id)
220
+ id.identifiers.map.with_index do |sub_id, idx|
221
+ if idx.zero?
222
+ # First identifier renders normally
223
+ sub_id.to_s
224
+ elsif sub_id.is_a?(Identifiers::Amendment)
225
+ # Supplements render with "+" prefix (bundled/consolidated format)
226
+ result = "+A#{sub_id.amendment_number}"
227
+ result += ":#{sub_id.amendment_year}" if sub_id.amendment_year
228
+ result
229
+ # Only render the amendment portion, not the full id.to_s
230
+ elsif sub_id.is_a?(Identifiers::Corrigendum)
231
+ # Only render the corrigendum portion
232
+ result = "+AC"
233
+ result += sub_id.corrigendum_number if sub_id.corrigendum_number && !sub_id.corrigendum_number.empty?
234
+ if sub_id.corrigendum_year
235
+ result += ":#{sub_id.corrigendum_year}"
236
+ result += "-#{sub_id.corrigendum_month}" if sub_id.corrigendum_month && !sub_id.corrigendum_month.empty?
237
+ end
238
+ result
239
+ else
240
+ # Other identifiers (should not happen in typical bundles) render with +
241
+ "+#{sub_id}"
242
+ end
243
+ end.compact.join
244
+ end
245
+
246
+ # Fragment: "EN 60038 AMD1 FRAG2"
247
+ def render_fragment(id)
248
+ "#{id.base_identifier} FRAG#{id.fragment_number}"
249
+ end
250
+
251
+ # EuropeanPrestandard: "ENV ISO 8601" or falls through to SingleIdentifier
252
+ def render_european_prestandard(id, **opts)
253
+ if id.adopted_identifier
254
+ "ENV #{id.adopted_identifier}"
255
+ else
256
+ render_single(id)
257
+ end
258
+ end
259
+ end
260
+ end
261
+ end
@@ -2,7 +2,10 @@
2
2
 
3
3
  module Pubid
4
4
  module CenCenelec
5
- class SingleIdentifier < Pubid::Identifier
5
+ # The second of CEN/CENELEC's two identifier roots (the other is
6
+ # Identifiers::Base); both descend from Pubid::CenCenelec::Identifier so every
7
+ # concrete type is `is_a?` it.
8
+ class SingleIdentifier < Pubid::CenCenelec::Identifier
6
9
  attribute :publisher, Components::Publisher, default: -> {
7
10
  Components::Publisher.new(body: "EN")
8
11
  }
@@ -11,96 +14,12 @@ module Pubid
11
14
  #
12
15
  # @return [String] URN representation
13
16
 
14
- def to_s(lang: :en, lang_single: false)
15
- parts = []
16
-
17
- # Check if we have a draft stage (prEN, FprEN) - these include both stage and type
18
- is_draft_stage = typed_stage&.abbr && %w[prEN
19
- FprEN].include?(typed_stage.abbr.first)
20
-
21
- # Get type short name - for draft stages, extract base type
22
- type_short = if is_draft_stage
23
- typed_stage.type_code.to_s.upcase # :en => "EN"
24
- elsif type.is_a?(Components::Type)
25
- type.abbr
26
- elsif self.class.respond_to?(:type) && self.class.type.is_a?(Hash)
27
- self.class.type[:short]
28
- else
29
- "EN" # Default
30
- end
31
-
32
- # Track if we should use slash before type
33
- use_slash_before_type = false
34
-
35
- # For CWA/HD, they act as publisher (not EN)
36
- if %w[CWA HD CR].include?(type_short)
37
- # Stage prefix OR type as publisher
38
- parts << if typed_stage&.abbr && typed_stage.abbr.first != type_short
39
- typed_stage.abbr.first
40
- else
41
- type_short
42
- end
43
- elsif is_draft_stage
44
- # Draft stage prefix (prEN, FprEN) OR regular publisher
45
- parts << typed_stage.abbr.first
46
- elsif publisher
47
- parts << (publisher.is_a?(Components::Publisher) ? publisher.body : publisher.to_s)
48
- use_slash_before_type = true # When publisher present, use slash before type
49
- end
50
-
51
- # Copublishers - add to last part (publisher) with slash
52
- if copublishers&.any?
53
- copub_str = copublishers.map do |cp|
54
- cp.is_a?(Components::Publisher) ? cp.body : cp.to_s
55
- end.join("/")
56
- unless copub_str.empty?
57
- if parts.any?
58
- parts[-1] = "#{parts[-1]}/#{copub_str}"
59
- else
60
- parts << copub_str
61
- end
62
- end
63
- end
64
-
65
- # Type for non-EN documents (TS, TR) - but not CWA/HD or Guide
66
- if type_short != "EN" && !%w[CWA HD CR Guide].include?(type_short)
67
- if use_slash_before_type && parts.any?
68
- # Use slash separator for publisher/type combination (TS, TR only)
69
- parts << "/#{type_short}"
70
- else
71
- parts << type_short
72
- end
73
- elsif type_short == "Guide"
74
- # Guide uses SPACE separator, not slash
75
- parts << "Guide"
76
- end
77
-
78
- # Number with part (which may be multi-level like "5-1-1")
79
- if number
80
- number_str = number.is_a?(Components::Code) ? number.value.to_s : number.to_s
81
- if part
82
- part_val = part.is_a?(Components::Code) ? part.value : part
83
- number_str += "-#{part_val}"
84
- end
85
- parts << number_str
86
- end
87
-
88
- # Join parts - but handle slash prefix for type
89
- result = ""
90
- parts.each_with_index do |part, idx|
91
- if idx.positive? && !part.start_with?("/")
92
- result += " "
93
- end
94
- result += part
95
- end
96
-
97
- # Date
98
- if date
99
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
100
- result += ":#{year_val}"
101
- end
17
+ def self.type
18
+ nil
19
+ end
102
20
 
103
- result
21
+ def to_s(lang: :en, lang_single: false, **opts)
22
+ render(format: :human, lang: lang, lang_single: lang_single, **opts)
104
23
  end
105
24
 
106
25
  def <=>(other)
@@ -50,9 +50,10 @@ module Pubid
50
50
  end
51
51
 
52
52
  date = maybe(:date)
53
- if date
54
- year = date.year
55
- parts << year.to_s
53
+ if date&.is_a?(::Pubid::Components::Date) && date.present?
54
+ parts << date.render(context: URN_CONTEXT)
55
+ elsif date
56
+ parts << date.to_s
56
57
  elsif identifier.year
57
58
  parts << identifier.year.to_s
58
59
  end
@@ -104,9 +105,8 @@ module Pubid
104
105
  amendment_year = maybe(:amendment_year)
105
106
  if amendment_year
106
107
  parts << amendment_year.to_s
107
- elsif identifier.date
108
- year = identifier.date.year
109
- parts << year.to_s
108
+ elsif identifier.date&.is_a?(::Pubid::Components::Date) && identifier.date.present?
109
+ parts << identifier.date.render(context: URN_CONTEXT)
110
110
  end
111
111
  else
112
112
  parts << "unknown"
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module CenCenelec
5
+ # Parses CEN/CENELEC URNs back into identifiers.
6
+ #
7
+ # UrnGenerator emits: `urn:cen:{type}:{number}:{year}` where type is
8
+ # the lowercase document class (en, etsg, ts, tr).
9
+ #
10
+ # Examples:
11
+ # - urn:cen:en:9001:2015 → EN 9001:2015
12
+ class UrnParser < Pubid::UrnParser::Base
13
+ # UrnGenerator uses "cen" rather than "cencenelec" as the namespace.
14
+ def flavor_name
15
+ "cen"
16
+ end
17
+
18
+ def parse_urn(urn)
19
+ body = strip_namespace(urn)
20
+ parts = split_parts(body)
21
+ type_token, number, year = parts
22
+ text = "#{type_token.upcase} #{number}"
23
+ text += ":#{year}" if year
24
+ flavor_parse(text)
25
+ end
26
+ end
27
+ end
28
+ end