pubid 2.0.0.pre.alpha.1 → 2.0.0.pre.alpha.3

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 (463) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +5 -1
  3. data/data/nist/update_codes.yaml +27 -0
  4. data/lib/pubid/amca/builder.rb +2 -2
  5. data/lib/pubid/amca/identifier.rb +7 -0
  6. data/lib/pubid/amca/identifiers/base.rb +0 -26
  7. data/lib/pubid/amca/identifiers/interpretation.rb +0 -17
  8. data/lib/pubid/amca/identifiers/publication.rb +0 -13
  9. data/lib/pubid/amca/renderer.rb +82 -0
  10. data/lib/pubid/amca/single_identifier.rb +0 -23
  11. data/lib/pubid/amca/urn_parser.rb +28 -0
  12. data/lib/pubid/amca.rb +42 -1
  13. data/lib/pubid/ansi/builder.rb +5 -3
  14. data/lib/pubid/ansi/identifier.rb +1 -1
  15. data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
  16. data/lib/pubid/ansi/identifiers/standard.rb +2 -3
  17. data/lib/pubid/ansi/renderer.rb +53 -0
  18. data/lib/pubid/ansi/single_identifier.rb +2 -31
  19. data/lib/pubid/ansi/urn_generator.rb +3 -38
  20. data/lib/pubid/ansi/urn_parser.rb +23 -0
  21. data/lib/pubid/ansi.rb +38 -3
  22. data/lib/pubid/api/builder.rb +29 -74
  23. data/lib/pubid/api/identifier.rb +0 -4
  24. data/lib/pubid/api/identifiers/base.rb +0 -2
  25. data/lib/pubid/api/identifiers/bulletin.rb +0 -2
  26. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
  27. data/lib/pubid/api/identifiers/mpms.rb +1 -17
  28. data/lib/pubid/api/identifiers/publication.rb +0 -2
  29. data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
  30. data/lib/pubid/api/identifiers/specification.rb +0 -2
  31. data/lib/pubid/api/identifiers/standard.rb +0 -2
  32. data/lib/pubid/api/identifiers/technical_report.rb +0 -2
  33. data/lib/pubid/api/identifiers/typeless_standard.rb +1 -14
  34. data/lib/pubid/api/identifiers.rb +18 -0
  35. data/lib/pubid/api/renderer.rb +89 -0
  36. data/lib/pubid/api/single_identifier.rb +1 -13
  37. data/lib/pubid/api/urn_generator.rb +0 -18
  38. data/lib/pubid/api/urn_parser.rb +35 -0
  39. data/lib/pubid/api.rb +51 -5
  40. data/lib/pubid/ashrae/builder.rb +3 -3
  41. data/lib/pubid/ashrae/identifier.rb +6 -0
  42. data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
  43. data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
  44. data/lib/pubid/ashrae/identifiers/base.rb +3 -0
  45. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
  46. data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
  47. data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
  48. data/lib/pubid/ashrae/renderer.rb +117 -0
  49. data/lib/pubid/ashrae/single_identifier.rb +0 -13
  50. data/lib/pubid/ashrae/urn_generator.rb +0 -8
  51. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  52. data/lib/pubid/ashrae.rb +42 -1
  53. data/lib/pubid/asme/components/code.rb +10 -2
  54. data/lib/pubid/asme/identifiers/base.rb +0 -60
  55. data/lib/pubid/asme/renderer.rb +66 -0
  56. data/lib/pubid/asme/urn_parser.rb +31 -0
  57. data/lib/pubid/asme.rb +42 -1
  58. data/lib/pubid/astm/components/code.rb +9 -0
  59. data/lib/pubid/{jis → astm}/components.rb +1 -1
  60. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  61. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  62. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  63. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  64. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  65. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  66. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  67. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  68. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  69. data/lib/pubid/astm/identifiers.rb +18 -0
  70. data/lib/pubid/astm/renderer.rb +172 -0
  71. data/lib/pubid/astm/single_identifier.rb +0 -10
  72. data/lib/pubid/astm/urn_parser.rb +30 -0
  73. data/lib/pubid/astm.rb +39 -27
  74. data/lib/pubid/bsi/builder.rb +21 -12
  75. data/lib/pubid/bsi/identifier.rb +8 -2
  76. data/lib/pubid/bsi/identifiers/addendum_document.rb +3 -33
  77. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +11 -47
  78. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +11 -38
  79. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +3 -53
  80. data/lib/pubid/bsi/identifiers/amendment.rb +3 -19
  81. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +2 -4
  82. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  83. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -84
  84. data/lib/pubid/bsi/identifiers/committee_document.rb +1 -14
  85. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -84
  86. data/lib/pubid/bsi/identifiers/corrigendum.rb +3 -7
  87. data/lib/pubid/bsi/identifiers/detailed_specification.rb +1 -34
  88. data/lib/pubid/bsi/identifiers/disc.rb +1 -27
  89. data/lib/pubid/bsi/identifiers/draft_document.rb +3 -44
  90. data/lib/pubid/bsi/identifiers/electronic_book.rb +3 -36
  91. data/lib/pubid/bsi/identifiers/expert_commentary.rb +3 -15
  92. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +1 -45
  93. data/lib/pubid/bsi/identifiers/flex.rb +1 -33
  94. data/lib/pubid/bsi/identifiers/handbook.rb +2 -13
  95. data/lib/pubid/bsi/identifiers/index.rb +1 -30
  96. data/lib/pubid/bsi/identifiers/method.rb +1 -39
  97. data/lib/pubid/bsi/identifiers/national_annex.rb +5 -27
  98. data/lib/pubid/bsi/identifiers/practice_guide.rb +2 -4
  99. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +3 -52
  100. data/lib/pubid/bsi/identifiers/published_document.rb +3 -52
  101. data/lib/pubid/bsi/identifiers/section.rb +1 -28
  102. data/lib/pubid/bsi/identifiers/set.rb +3 -17
  103. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +1 -7
  104. data/lib/pubid/bsi/identifiers/supplement_document.rb +3 -21
  105. data/lib/pubid/bsi/identifiers/supplementary_index.rb +1 -44
  106. data/lib/pubid/bsi/identifiers/technical_specification.rb +3 -45
  107. data/lib/pubid/bsi/identifiers/test_method.rb +1 -30
  108. data/lib/pubid/bsi/identifiers/value_added_publication.rb +3 -14
  109. data/lib/pubid/bsi/identifiers.rb +0 -1
  110. data/lib/pubid/bsi/renderer.rb +1050 -0
  111. data/lib/pubid/bsi/single_identifier.rb +6 -70
  112. data/lib/pubid/bsi/urn_generator.rb +2 -3
  113. data/lib/pubid/bsi/urn_parser.rb +52 -0
  114. data/lib/pubid/bsi.rb +224 -1
  115. data/lib/pubid/builder/base.rb +57 -10
  116. data/lib/pubid/bundled_identifier.rb +0 -1
  117. data/lib/pubid/ccsds/builder.rb +4 -3
  118. data/lib/pubid/ccsds/identifier.rb +66 -1
  119. data/lib/pubid/ccsds/identifiers/base.rb +11 -50
  120. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  121. data/lib/pubid/ccsds/parser.rb +4 -2
  122. data/lib/pubid/ccsds/single_identifier.rb +4 -1
  123. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  124. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  125. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  126. data/lib/pubid/ccsds.rb +39 -1
  127. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  128. data/lib/pubid/cen_cenelec/identifier.rb +8 -2
  129. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +13 -4
  130. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -8
  131. data/lib/pubid/cen_cenelec/identifiers/base.rb +5 -41
  132. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  133. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  134. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +2 -25
  135. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -13
  136. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  137. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +4 -7
  138. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  139. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
  140. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  141. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  143. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  144. data/lib/pubid/cen_cenelec/single_identifier.rb +11 -89
  145. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  146. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  147. data/lib/pubid/cen_cenelec.rb +168 -1
  148. data/lib/pubid/cie/components/code.rb +8 -0
  149. data/lib/pubid/cie/identifier.rb +6 -4
  150. data/lib/pubid/cie/urn_parser.rb +28 -0
  151. data/lib/pubid/cie.rb +43 -1
  152. data/lib/pubid/components/adoption.rb +104 -0
  153. data/lib/pubid/components/code.rb +22 -8
  154. data/lib/pubid/components/date.rb +23 -16
  155. data/lib/pubid/components/edition.rb +9 -6
  156. data/lib/pubid/components/iteration.rb +32 -0
  157. data/lib/pubid/components/language.rb +6 -4
  158. data/lib/pubid/components/locality.rb +10 -1
  159. data/lib/pubid/components/publisher.rb +9 -6
  160. data/lib/pubid/components/relationship.rb +151 -0
  161. data/lib/pubid/components/stage.rb +5 -14
  162. data/lib/pubid/components/supplement.rb +184 -0
  163. data/lib/pubid/components/type.rb +5 -15
  164. data/lib/pubid/components/typed_stage.rb +11 -8
  165. data/lib/pubid/components.rb +4 -0
  166. data/lib/pubid/core/update_codes.rb +28 -7
  167. data/lib/pubid/csa/identifier.rb +0 -3
  168. data/lib/pubid/csa/identifiers/base.rb +2 -122
  169. data/lib/pubid/csa/identifiers/cec.rb +2 -101
  170. data/lib/pubid/csa/identifiers/series.rb +2 -102
  171. data/lib/pubid/csa/renderer.rb +292 -0
  172. data/lib/pubid/csa/urn_generator.rb +1 -1
  173. data/lib/pubid/csa/urn_parser.rb +33 -0
  174. data/lib/pubid/csa.rb +42 -1
  175. data/lib/pubid/etsi/components/code.rb +9 -2
  176. data/lib/pubid/etsi/identifiers/base.rb +1 -4
  177. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +2 -9
  178. data/lib/pubid/etsi/renderer.rb +42 -0
  179. data/lib/pubid/etsi/urn_parser.rb +34 -0
  180. data/lib/pubid/etsi.rb +42 -1
  181. data/lib/pubid/export/exporter.rb +4 -46
  182. data/lib/pubid/export/flavor_exporter.rb +111 -278
  183. data/lib/pubid/export.rb +0 -6
  184. data/lib/pubid/identifier.rb +10 -18
  185. data/lib/pubid/identifier_facade.rb +114 -0
  186. data/lib/pubid/identifier_metadata.rb +1 -1
  187. data/lib/pubid/idf/builder.rb +3 -3
  188. data/lib/pubid/idf/identifier.rb +3 -6
  189. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  190. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  191. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  192. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  193. data/lib/pubid/idf/parser.rb +3 -2
  194. data/lib/pubid/idf/renderer.rb +84 -0
  195. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  196. data/lib/pubid/idf/urn_generator.rb +4 -39
  197. data/lib/pubid/idf/urn_parser.rb +25 -0
  198. data/lib/pubid/idf.rb +51 -1
  199. data/lib/pubid/iec/builder.rb +48 -65
  200. data/lib/pubid/iec/components/code.rb +9 -32
  201. data/lib/pubid/iec/components/publisher.rb +1 -1
  202. data/lib/pubid/iec/components.rb +14 -0
  203. data/lib/pubid/iec/identifier.rb +276 -3
  204. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  205. data/lib/pubid/iec/identifiers/base.rb +8 -28
  206. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  207. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  208. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +27 -30
  209. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  210. data/lib/pubid/iec/identifiers/fragment_identifier.rb +37 -26
  211. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  212. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  213. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  214. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  215. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  216. data/lib/pubid/iec/identifiers/sheet_identifier.rb +21 -15
  217. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  218. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  219. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  220. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  221. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  222. data/lib/pubid/iec/identifiers/test_report_form.rb +5 -34
  223. data/lib/pubid/iec/identifiers/vap_identifier.rb +26 -23
  224. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  225. data/lib/pubid/iec/identifiers/working_document.rb +4 -48
  226. data/lib/pubid/iec/identifiers.rb +30 -0
  227. data/lib/pubid/iec/parser.rb +20 -14
  228. data/lib/pubid/iec/renderer.rb +254 -0
  229. data/lib/pubid/iec/single_identifier.rb +6 -12
  230. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  231. data/lib/pubid/iec/urn_generator.rb +57 -171
  232. data/lib/pubid/iec/urn_parser.rb +53 -252
  233. data/lib/pubid/iec.rb +40 -68
  234. data/lib/pubid/ieee/builder.rb +12 -12
  235. data/lib/pubid/ieee/components/code.rb +8 -0
  236. data/lib/pubid/ieee/components/draft.rb +14 -0
  237. data/lib/pubid/ieee/components/relationship.rb +5 -149
  238. data/lib/pubid/ieee/identifier.rb +6 -0
  239. data/lib/pubid/ieee/identifiers/adopted_standard.rb +1 -6
  240. data/lib/pubid/ieee/identifiers/base.rb +101 -458
  241. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +1 -7
  242. data/lib/pubid/ieee/identifiers/corrigendum.rb +1 -9
  243. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +1 -7
  244. data/lib/pubid/ieee/identifiers/dual_identifier.rb +1 -1
  245. data/lib/pubid/ieee/identifiers/dual_published.rb +1 -1
  246. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +1 -6
  247. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +1 -7
  248. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  249. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -15
  250. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +1 -3
  251. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  252. data/lib/pubid/ieee/identifiers/redlined_standard.rb +1 -4
  253. data/lib/pubid/ieee/identifiers/si_standard.rb +1 -35
  254. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  255. data/lib/pubid/ieee/pre_parser.rb +301 -0
  256. data/lib/pubid/ieee/renderer.rb +307 -0
  257. data/lib/pubid/ieee/urn_parser.rb +34 -0
  258. data/lib/pubid/ieee.rb +62 -1
  259. data/lib/pubid/ieee_debug.rb +0 -1
  260. data/lib/pubid/iho/builder.rb +2 -2
  261. data/lib/pubid/iho/identifier.rb +8 -0
  262. data/lib/pubid/iho/identifiers/base.rb +49 -10
  263. data/lib/pubid/iho/identifiers/bibliographic.rb +0 -4
  264. data/lib/pubid/iho/identifiers/circular_letter.rb +0 -4
  265. data/lib/pubid/iho/identifiers/miscellaneous.rb +0 -4
  266. data/lib/pubid/iho/identifiers/publication.rb +0 -4
  267. data/lib/pubid/iho/identifiers/standard.rb +0 -4
  268. data/lib/pubid/iho/parser.rb +3 -3
  269. data/lib/pubid/iho/renderer.rb +30 -0
  270. data/lib/pubid/iho/urn_generator.rb +3 -3
  271. data/lib/pubid/iho/urn_parser.rb +58 -0
  272. data/lib/pubid/iho.rb +50 -1
  273. data/lib/pubid/iso/builder.rb +59 -53
  274. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  275. data/lib/pubid/iso/components/code.rb +7 -19
  276. data/lib/pubid/iso/components/publisher.rb +10 -8
  277. data/lib/pubid/iso/components.rb +2 -4
  278. data/lib/pubid/iso/identifier.rb +233 -6
  279. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  280. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  281. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  282. data/lib/pubid/iso/identifiers/data.rb +0 -1
  283. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  284. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  285. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  286. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  287. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  288. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  289. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  290. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  291. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  292. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  293. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  294. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  295. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  296. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  297. data/lib/pubid/iso/identifiers.rb +0 -1
  298. data/lib/pubid/iso/normalizer.rb +89 -0
  299. data/lib/pubid/iso/parser.rb +26 -6
  300. data/lib/pubid/iso/single_identifier.rb +6 -3
  301. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  302. data/lib/pubid/iso/urn_generator.rb +74 -176
  303. data/lib/pubid/iso/urn_parser.rb +28 -9
  304. data/lib/pubid/iso.rb +173 -2
  305. data/lib/pubid/itu/builder.rb +0 -12
  306. data/lib/pubid/itu/components/code.rb +8 -0
  307. data/lib/pubid/itu/components.rb +11 -0
  308. data/lib/pubid/itu/identifier.rb +6 -39
  309. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  310. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  311. data/lib/pubid/itu/identifiers/base.rb +0 -6
  312. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  313. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  314. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  315. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  316. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  317. data/lib/pubid/itu/urn_parser.rb +23 -0
  318. data/lib/pubid/itu.rb +42 -1
  319. data/lib/pubid/jcgm/builder.rb +16 -8
  320. data/lib/pubid/jcgm/identifiers/amendment.rb +2 -7
  321. data/lib/pubid/jcgm/identifiers/gum_guide.rb +2 -10
  322. data/lib/pubid/jcgm/renderer.rb +68 -0
  323. data/lib/pubid/jcgm/single_identifier.rb +1 -5
  324. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  325. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  326. data/lib/pubid/jcgm.rb +43 -2
  327. data/lib/pubid/jis/builder.rb +44 -52
  328. data/lib/pubid/jis/identifier.rb +132 -3
  329. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  330. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  331. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  332. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  333. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  334. data/lib/pubid/jis/identifiers.rb +1 -1
  335. data/lib/pubid/jis/parser.rb +31 -5
  336. data/lib/pubid/jis/renderer.rb +69 -0
  337. data/lib/pubid/jis/single_identifier.rb +6 -12
  338. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  339. data/lib/pubid/jis/urn_parser.rb +23 -0
  340. data/lib/pubid/jis.rb +42 -2
  341. data/lib/pubid/nist/builder.rb +122 -1761
  342. data/lib/pubid/nist/caster.rb +1272 -0
  343. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  344. data/lib/pubid/nist/components/code.rb +9 -20
  345. data/lib/pubid/nist/components/edition.rb +16 -0
  346. data/lib/pubid/nist/components/supplement.rb +88 -21
  347. data/lib/pubid/nist/components.rb +0 -1
  348. data/lib/pubid/nist/identifier.rb +25 -0
  349. data/lib/pubid/nist/identifiers/base.rb +206 -64
  350. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  351. data/lib/pubid/nist/identifiers/circular_supplement.rb +3 -2
  352. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  353. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  354. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  355. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -11
  356. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  357. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +17 -16
  358. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  359. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  360. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  361. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  362. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  363. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  364. data/lib/pubid/nist/identifiers/report.rb +4 -3
  365. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  366. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  367. data/lib/pubid/nist/identifiers.rb +1 -0
  368. data/lib/pubid/nist/parser.rb +67 -424
  369. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  370. data/lib/pubid/nist/preprocessor.rb +416 -0
  371. data/lib/pubid/nist/renderer.rb +43 -0
  372. data/lib/pubid/nist/router.rb +148 -0
  373. data/lib/pubid/nist/series/base.rb +58 -0
  374. data/lib/pubid/nist/series/crpl.rb +13 -0
  375. data/lib/pubid/nist/series/fips.rb +14 -0
  376. data/lib/pubid/nist/series/ir.rb +60 -0
  377. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  378. data/lib/pubid/nist/series/mono.rb +19 -0
  379. data/lib/pubid/nist/series/ncstar.rb +20 -0
  380. data/lib/pubid/nist/series.rb +49 -0
  381. data/lib/pubid/nist/supplement_identifier.rb +11 -25
  382. data/lib/pubid/nist/urn_generator.rb +14 -8
  383. data/lib/pubid/nist/urn_parser.rb +67 -0
  384. data/lib/pubid/nist.rb +83 -4
  385. data/lib/pubid/oiml/components/code.rb +10 -0
  386. data/lib/pubid/oiml/identifiers/annex.rb +3 -45
  387. data/lib/pubid/oiml/identifiers/base.rb +2 -17
  388. data/lib/pubid/oiml/renderer.rb +161 -0
  389. data/lib/pubid/oiml/single_identifier.rb +6 -45
  390. data/lib/pubid/oiml/supplement_identifier.rb +4 -19
  391. data/lib/pubid/oiml/urn_generator.rb +0 -8
  392. data/lib/pubid/oiml/urn_parser.rb +22 -0
  393. data/lib/pubid/oiml.rb +42 -1
  394. data/lib/pubid/plateau/identifier.rb +23 -0
  395. data/lib/pubid/plateau/identifiers/handbook.rb +1 -3
  396. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  397. data/lib/pubid/plateau/renderer.rb +51 -0
  398. data/lib/pubid/plateau/supplement_identifier.rb +1 -1
  399. data/lib/pubid/plateau/urn_parser.rb +43 -0
  400. data/lib/pubid/plateau.rb +44 -1
  401. data/lib/pubid/renderers/base.rb +34 -0
  402. data/lib/pubid/renderers/directives_renderer.rb +27 -14
  403. data/lib/pubid/renderers/guide_renderer.rb +7 -1
  404. data/lib/pubid/renderers/human_readable.rb +31 -8
  405. data/lib/pubid/renderers/iwa_renderer.rb +5 -1
  406. data/lib/pubid/renderers/supplement_renderer.rb +4 -1
  407. data/lib/pubid/rendering/context.rb +33 -21
  408. data/lib/pubid/rendering.rb +0 -3
  409. data/lib/pubid/sae/components/date.rb +8 -0
  410. data/lib/pubid/sae/components/type.rb +5 -1
  411. data/lib/pubid/sae/identifiers/base.rb +2 -16
  412. data/lib/pubid/sae/renderer.rb +36 -0
  413. data/lib/pubid/sae/urn_generator.rb +2 -10
  414. data/lib/pubid/sae/urn_parser.rb +36 -0
  415. data/lib/pubid/sae.rb +42 -1
  416. data/lib/pubid/urn_generator/base.rb +12 -12
  417. data/lib/pubid/urn_parser/base.rb +81 -0
  418. data/lib/pubid/urn_parser/errors.rb +9 -0
  419. data/lib/pubid/urn_parser.rb +14 -0
  420. data/lib/pubid/version.rb +1 -1
  421. data/lib/pubid.rb +29 -7
  422. data/lib/tasks/website-data.json +1940 -1882
  423. metadata +77 -43
  424. data/lib/pubid/amca/scheme.rb +0 -16
  425. data/lib/pubid/ansi/scheme.rb +0 -15
  426. data/lib/pubid/api/scheme.rb +0 -66
  427. data/lib/pubid/ashrae/scheme.rb +0 -53
  428. data/lib/pubid/asme/scheme.rb +0 -37
  429. data/lib/pubid/astm/scheme.rb +0 -55
  430. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  431. data/lib/pubid/bsi/scheme.rb +0 -243
  432. data/lib/pubid/ccsds/scheme.rb +0 -57
  433. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  434. data/lib/pubid/cie/scheme.rb +0 -64
  435. data/lib/pubid/csa/scheme.rb +0 -44
  436. data/lib/pubid/etsi/scheme.rb +0 -42
  437. data/lib/pubid/export/data_class_exporter.rb +0 -59
  438. data/lib/pubid/export/ieee_exporter.rb +0 -78
  439. data/lib/pubid/export/itu_exporter.rb +0 -66
  440. data/lib/pubid/export/nist_exporter.rb +0 -64
  441. data/lib/pubid/export/registry_exporter.rb +0 -90
  442. data/lib/pubid/export/scheme_exporter.rb +0 -70
  443. data/lib/pubid/identifier_registry.rb +0 -198
  444. data/lib/pubid/idf/scheme.rb +0 -61
  445. data/lib/pubid/iec/scheme.rb +0 -71
  446. data/lib/pubid/ieee/scheme.rb +0 -90
  447. data/lib/pubid/iho/scheme.rb +0 -29
  448. data/lib/pubid/iso/identifiers/base.rb +0 -115
  449. data/lib/pubid/iso/scheme.rb +0 -187
  450. data/lib/pubid/itu/scheme.rb +0 -174
  451. data/lib/pubid/jcgm/scheme.rb +0 -60
  452. data/lib/pubid/jis/components/code.rb +0 -59
  453. data/lib/pubid/jis/identifiers/base.rb +0 -72
  454. data/lib/pubid/jis/scheme.rb +0 -49
  455. data/lib/pubid/nist/components/publisher.rb +0 -24
  456. data/lib/pubid/nist/scheme.rb +0 -199
  457. data/lib/pubid/oiml/scheme.rb +0 -46
  458. data/lib/pubid/plateau/scheme.rb +0 -45
  459. data/lib/pubid/rendering/base.rb +0 -73
  460. data/lib/pubid/rendering/common.rb +0 -211
  461. data/lib/pubid/rendering/format.rb +0 -25
  462. data/lib/pubid/sae/scheme.rb +0 -47
  463. data/lib/pubid/scheme.rb +0 -207
@@ -7,7 +7,7 @@ module Pubid
7
7
  # Example: "BS ISO 8601:2019" where ISO 8601:2019 is an ISO identifier object
8
8
  # Example: "BS IEC 62600:2020" where IEC 62600:2020 is an IEC identifier object
9
9
  class AdoptedInternationalStandard < BritishStandard
10
- attribute :adopted_identifier, Base, polymorphic: true # ISO/IEC object
10
+ attribute :adopted_identifier, ::Pubid::Identifier, polymorphic: true # ISO/IEC object
11
11
  attribute :edition, :string
12
12
  attribute :translation_lang, :string
13
13
  attribute :translation_upper, :string
@@ -16,44 +16,17 @@ module Pubid
16
16
  attribute :expert_commentary, :boolean
17
17
  attribute :expert_commentary_topic, :string
18
18
 
19
- def to_s
20
- # Get the BSI prefix (BS, PD, DD)
21
- prefix = case publisher
22
- when Components::Publisher
23
- publisher.body
24
- when Array
25
- publisher.join("/")
26
- when String
27
- publisher
28
- else
29
- "BS"
30
- end
31
-
32
- result = prefix
33
- result += " #{adopted_identifier}" if adopted_identifier
34
- result += " ED#{edition}" if edition
35
-
36
- # Reaffirmation notation like (R2004)
37
- result += " (R#{reaffirmation_year})" if reaffirmation_year
38
-
39
- # Translation - normalize to just "(Language)" format
40
- # "(French version)", "(French Translation)", "(French)" all become "(French)"
41
- if translation_lang
42
- result += " (#{translation_lang})"
43
- elsif translation_upper
44
- result += " (#{translation_upper})"
45
- end
46
-
47
- # ExpertCommentary suffix
48
- if expert_commentary
49
- result += if expert_commentary_topic
50
- " ExComm (#{expert_commentary_topic})"
51
- else
52
- " ExComm"
53
- end
54
- end
19
+ # Override self.type to return nil so this polymorphic wrapper is not
20
+ # registered as a base type. Inherits `:bs` from BritishStandard which
21
+ # would otherwise shadow it in Bsi.locate_type(:bs) auto-discovery.
22
+ # AdoptedInternationalStandard is constructed explicitly by the builder,
23
+ # not selected by type-code lookup.
24
+ def self.type
25
+ nil
26
+ end
55
27
 
56
- result
28
+ def to_s
29
+ render(format: :human)
57
30
  end
58
31
 
59
32
  # Delegate common methods to adopted identifier
@@ -54,63 +54,13 @@ module Pubid
54
54
  ].freeze
55
55
 
56
56
  def self.type
57
- { key: :aerospace, title: "Aerospace/Specialized Standard",
57
+ { key: :aerospace,
58
+ web: :aerospace_standard, title: "Aerospace/Specialized Standard",
58
59
  short: "BS" }
59
60
  end
60
61
 
61
62
  def to_s(lang: :en, lang_single: false)
62
- parts = []
63
- parts << "BS" # Always BS for aerospace
64
- parts << prefix if prefix
65
-
66
- # Number with part/subpart and letter suffix edition
67
- if number
68
- number_str = number.is_a?(Components::Code) ? number.value.to_s : number.to_s
69
-
70
- # Part and subpart
71
- if part
72
- part_val = part.is_a?(Components::Code) ? part.value : part
73
- number_str += "-#{part_val}"
74
- end
75
- if subpart
76
- subpart_val = subpart.is_a?(Components::Code) ? subpart.value : subpart
77
- number_str += "-#{subpart_val}"
78
- end
79
-
80
- parts << number_str
81
- end
82
-
83
- result = parts.join(" ")
84
-
85
- # Letter suffix edition (for aerospace/specialized standards)
86
- # Append directly to number/part without space or v prefix
87
- # e.g., BS AU 145e:2018, BS AU 200-1a:1984
88
- if edition&.match?(/^[a-zA-Z]$/)
89
- result += edition
90
- end
91
-
92
- # Date
93
- if date
94
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
95
- result += ":#{year_val}"
96
- # Month if present
97
- result += "-#{format('%02d', month)}" if month
98
- end
99
-
100
- # Regular edition (non-letter suffix, like v1.0)
101
- # Only add if edition is not a single letter (already handled above)
102
- if edition && !edition.match?(/^[a-zA-Z]$/)
103
- result += " v#{edition}"
104
- end
105
-
106
- # Translation
107
- if translation_lang
108
- result += " (#{translation_lang})"
109
- elsif translation_upper
110
- result += " (#{translation_upper})"
111
- end
112
-
113
- result
63
+ render(format: :human, lang: lang, lang_single: lang_single)
114
64
  end
115
65
  end
116
66
  end
@@ -5,30 +5,14 @@ module Pubid
5
5
  module Identifiers
6
6
  # Amendment Identifier
7
7
  # Contains a base identifier plus amendment parameters
8
- class Amendment < Base
9
- attribute :base_identifier, Base, polymorphic: true
8
+ class Amendment < SingleIdentifier
9
+ attribute :base_identifier, ::Pubid::Identifier, polymorphic: true
10
10
  attribute :amendment_number, :string
11
11
  attribute :amendment_year, :integer
12
12
  attribute :separator, :string, default: -> { "+" }
13
13
 
14
14
  def to_s
15
- if base_identifier
16
- if amendment_year
17
- "#{base_identifier}#{separator}A#{amendment_number}:#{amendment_year}"
18
- elsif amendment_number&.match?(/^[A-Z]+$/)
19
- # Letter suffixes (AA, AB, etc.) have a space, numeric suffixes don't
20
- "#{base_identifier} AMD #{amendment_number}"
21
- else
22
- "#{base_identifier} AMD#{amendment_number}"
23
- end
24
- elsif amendment_year
25
- "#{separator}A#{amendment_number}:#{amendment_year}"
26
- elsif amendment_number&.match?(/^[A-Z]+$/)
27
- # Letter suffixes (AA, AB, etc.) have a space, numeric suffixes don't
28
- "AMD #{amendment_number}"
29
- else
30
- "AMD#{amendment_number}"
31
- end
15
+ render(format: :human)
32
16
  end
33
17
 
34
18
  def publisher
@@ -5,7 +5,7 @@ module Pubid
5
5
  module Identifiers
6
6
  # British Industrial Practice (BIP)
7
7
  # Examples: "BIP 2225:2022", "BIP 0142:2014", "BIP 0009:2020"
8
- class BritishIndustrialPractice < Base
8
+ class BritishIndustrialPractice < SingleIdentifier
9
9
  attribute :number, Bsi::Components::Code
10
10
  attribute :date, Bsi::Components::Date
11
11
 
@@ -17,9 +17,7 @@ module Pubid
17
17
  end
18
18
 
19
19
  def to_s(lang: :en, lang_single: false)
20
- result = "BIP #{number}"
21
- result += ":#{date.year}" if date
22
- result
20
+ render(format: :human, lang: lang, lang_single: lang_single)
23
21
  end
24
22
  end
25
23
  end
@@ -25,7 +25,8 @@ module Pubid
25
25
  ].freeze
26
26
 
27
27
  def self.type
28
- { key: :bs, title: "British Standard", short: "BS" }
28
+ { key: :bs,
29
+ web: :british_standard, title: "British Standard", short: "BS" }
29
30
  end
30
31
  end
31
32
  end
@@ -11,95 +11,14 @@ module Pubid
11
11
  # BS 2SP 68 to BS 2SP 71:1973
12
12
  # BS SP 13; 14; 15 and 16:1949
13
13
  # BS 4048:Parts 1 and 2:1966
14
- class BundledIdentifier < Base
15
- attribute :identifiers, Base, collection: true, polymorphic: true
14
+ class BundledIdentifier < SingleIdentifier
15
+ attribute :identifiers, ::Pubid::Identifier, collection: true, polymorphic: true
16
16
  attribute :separators, :string, collection: true # Separators between identifiers
17
17
  attribute :common_year, Bsi::Components::Date # Year applied to all if present
18
18
  attribute :bundle_type, :string # "Parts", "Sections", or nil for regular bundles
19
19
 
20
20
  def to_s(lang: :en, lang_single: false)
21
- return "" if identifiers.nil? || identifiers.empty?
22
-
23
- # Special case: Parts/Sections bundles like "BS 4048:Parts 1 and 2:1966"
24
- if bundle_type
25
- base_id = identifiers.first
26
- parts_list = identifiers[1..].map do |id|
27
- # Extract just the part number
28
- part_val = id.class.attributes.key?(:part) ? id.part : nil
29
- if part_val
30
- pv = part_val.is_a?(Components::Code) ? part_val.value : part_val
31
- pv.to_s
32
- else
33
- id.to_s
34
- end
35
- end.join(" and ")
36
-
37
- result = "#{base_id.to_s.sub(/:.*$/,
38
- '')}:#{bundle_type} #{parts_list}"
39
- result += ":#{common_year.year}" if common_year
40
- return result
41
- end
42
-
43
- # Regular bundle: render based on explicit markers
44
- parts = []
45
-
46
- identifiers.each_with_index do |id, i|
47
- # Check metadata flags for how item was parsed
48
- explicit_prefix = id.explicit_prefix
49
- explicit_publisher = id.explicit_publisher
50
-
51
- if i.zero?
52
- # First item always uses full form
53
- parts << id.to_s
54
- elsif explicit_publisher
55
- # Full form: has explicit publisher (e.g., "BS SP 50")
56
- parts << id.to_s
57
- elsif explicit_prefix
58
- # Prefix-only form: has explicit prefix but no publisher (e.g., "SP 138")
59
- abbrev_str = ""
60
- prefix = id.class.attributes.key?(:prefix) ? id.prefix : nil
61
- if prefix && !prefix.to_s.empty?
62
- abbrev_str = prefix.to_s
63
- end
64
- if id.number
65
- number_val = id.number.is_a?(Components::Code) ? id.number.value : id.number
66
- abbrev_str += " " if !abbrev_str.empty?
67
- abbrev_str += number_val.to_s
68
- end
69
- if id.part
70
- part_val = id.part.is_a?(Components::Code) ? id.part.value : id.part
71
- abbrev_str += "-#{part_val}"
72
- end
73
- parts << abbrev_str
74
- else
75
- # Minimal form: no explicit markers (e.g., "125")
76
- abbrev_str = ""
77
- if id.number
78
- number_val = id.number.is_a?(Components::Code) ? id.number.value : id.number
79
- abbrev_str = number_val.to_s
80
- end
81
- if id.part
82
- part_val = id.part.is_a?(Components::Code) ? id.part.value : id.part
83
- abbrev_str += "-#{part_val}"
84
- end
85
- parts << abbrev_str
86
- end
87
-
88
- # Add separator - preserve original spacing
89
- if i < identifiers.length - 1
90
- sep = separators[i] || " and "
91
- parts << sep
92
- end
93
- end
94
-
95
- result = parts.join
96
-
97
- # Add common year if present and not already in last identifier
98
- if common_year && !result.match?(/:#{common_year.year}$/)
99
- result += ":#{common_year.year}"
100
- end
101
-
102
- result
21
+ render(format: :human, lang: lang, lang_single: lang_single)
103
22
  end
104
23
 
105
24
  def <=>(other)
@@ -30,20 +30,7 @@ module Pubid
30
30
  end
31
31
 
32
32
  def to_s(lang: :en, lang_single: false)
33
- # Committee documents use a unique format: YY/NNNNNNNN DC
34
- # The year is 2-digit (extracted from date or use current date format)
35
- # Note: Assumes 2000s for years 00-99 (Y2K assumption)
36
- year_str = if date
37
- if date.is_a?(Components::Date)
38
- date.year.to_s[-2, 2]
39
- else
40
- date.to_s[-2, 2]
41
- end
42
- else
43
- "00" # Default if no date
44
- end
45
-
46
- "#{year_str}/#{document_number} DC"
33
+ render(format: :human, lang: lang, lang_single: lang_single)
47
34
  end
48
35
  end
49
36
  end
@@ -5,92 +5,11 @@ module Pubid
5
5
  module Identifiers
6
6
  # Consolidated Identifier - contains base document plus supplements
7
7
  # Example: "BS 4592-0:2006+A1:2012" = [BS 4592-0:2006, Amendment 1:2012]
8
- class ConsolidatedIdentifier < Base
9
- attribute :identifiers, Base, polymorphic: true, collection: true
8
+ class ConsolidatedIdentifier < SingleIdentifier
9
+ attribute :identifiers, ::Pubid::Identifier, polymorphic: true, collection: true
10
10
 
11
11
  def to_s(lang: :en, lang_single: false)
12
- base_id = identifiers.first
13
-
14
- # Render base without suffixes (will add them after supplements)
15
- result = if base_id.is_a?(Base) && base_id.class.method_defined?(:to_s_without_suffixes)
16
- base_id.to_s_without_suffixes
17
- else
18
- # Temporarily remove suffixes for rendering
19
- base_str = base_id.to_s
20
- # Remove known suffixes (more flexible patterns to handle topics)
21
- base_str = base_str.sub(/ ExComm \(.*?\)$/, "") # ExComm (Fire)
22
- .sub(/ ExComm$/, "") # ExComm without topic
23
- .sub(/ - TC$/, "")
24
- .sub(/ PDF$/, "")
25
- .sub(/ \([A-Z][a-z]+\)$/, "")
26
- base_str
27
- end
28
-
29
- # Add supplements
30
- identifiers[1..].each do |id|
31
- if id.is_a?(Amendment)
32
- if id.amendment_year
33
- sep = id.is_a?(Base) && id.separator ? id.separator : "+"
34
- result += "#{sep}A#{id.amendment_number}:#{id.amendment_year}"
35
- else
36
- # Letter suffixes (AA, AB, etc.) have a space, numeric suffixes don't
37
- result += if id.amendment_number&.match?(/^[A-Z]+$/)
38
- " AMD #{id.amendment_number}"
39
- else
40
- " AMD#{id.amendment_number}"
41
- end
42
- end
43
- elsif id.is_a?(Corrigendum)
44
- sep = id.is_a?(Base) && id.separator ? id.separator : "+"
45
- result += "#{sep}C"
46
- result += id.corrigendum_number.to_s if id.corrigendum_number
47
- result += ":#{id.corrigendum_year}" if id.corrigendum_year
48
- else
49
- result += id.to_s
50
- end
51
- end
52
-
53
- # Add suffixes from base identifier AFTER supplements
54
- if base_id.is_a?(Pubid::Identifier)
55
- base_attrs = base_id.class.attributes
56
- ec = base_attrs.key?(:expert_commentary) ? base_id.expert_commentary : nil
57
- if ec
58
- ect = base_attrs.key?(:expert_commentary_topic) ? base_id.expert_commentary_topic : nil
59
- result += ect ? " ExComm (#{ect})" : " ExComm"
60
- end
61
-
62
- tc = base_attrs.key?(:tracked_changes) ? base_id.tracked_changes : nil
63
- result += " - TC" if tc
64
-
65
- # Translation - preserve the "version" or "Translation" suffix if present
66
- tl = base_attrs.key?(:translation_lang) ? base_id.translation_lang : nil
67
- if tl
68
- ts_type = base_attrs.key?(:translation_suffix_type) ? base_id.translation_suffix_type : nil
69
- result += if ts_type == "version"
70
- " (#{tl} version)"
71
- elsif ts_type == "Translation"
72
- " (#{tl} Translation)"
73
- else
74
- " (#{tl})"
75
- end
76
- else
77
- tu = base_attrs.key?(:translation_upper) ? base_id.translation_upper : nil
78
- if tu
79
- ts_type = base_attrs.key?(:translation_suffix_type) ? base_id.translation_suffix_type : nil
80
- result += if ts_type == "Translation"
81
- " (#{tu} Translation)"
82
- else
83
- " (#{tu})"
84
- end
85
- end
86
- end
87
-
88
- # Reaffirmation notation like (R2004)
89
- ry = base_attrs.key?(:reaffirmation_year) ? base_id.reaffirmation_year : nil
90
- result += " (R#{ry})" if ry
91
- end
92
-
93
- result
12
+ render(format: :human, lang: lang, lang_single: lang_single)
94
13
  end
95
14
 
96
15
  def to_urn
@@ -5,18 +5,14 @@ module Pubid
5
5
  module Identifiers
6
6
  # Corrigendum Identifier
7
7
  # Contains a base identifier plus corrigendum parameters
8
- class Corrigendum < Base
9
- attribute :base_identifier, Base, polymorphic: true
8
+ class Corrigendum < SingleIdentifier
9
+ attribute :base_identifier, ::Pubid::Identifier, polymorphic: true
10
10
  attribute :corrigendum_number, :string
11
11
  attribute :corrigendum_year, :integer
12
12
  attribute :separator, :string, default: -> { "+" }
13
13
 
14
14
  def to_s
15
- result = base_identifier ? base_identifier.to_s : ""
16
- result += "#{separator}C"
17
- result += corrigendum_number.to_s if corrigendum_number
18
- result += ":#{corrigendum_year}" if corrigendum_year
19
- result
15
+ render(format: :human)
20
16
  end
21
17
 
22
18
  def publisher
@@ -28,40 +28,7 @@ module Pubid
28
28
  end
29
29
 
30
30
  def to_s(lang: :en, lang_single: false)
31
- parts = []
32
-
33
- # Publisher prefix
34
- parts << "BS"
35
-
36
- # Base number
37
- if number
38
- number_str = if number.is_a?(Components::Code)
39
- number.value.to_s
40
- else
41
- number.to_s
42
- end
43
- parts << number_str
44
- end
45
-
46
- # Spec notation (N002 or C155-168)
47
- if spec_code
48
- code_val = if spec_code.is_a?(Components::Code)
49
- spec_code.value
50
- else
51
- spec_code
52
- end
53
- result = "#{parts.join(' ')} #{code_val}"
54
- else
55
- result = parts.join(" ")
56
- end
57
-
58
- # Date
59
- if date
60
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
61
- result += ":#{year_val}"
62
- end
63
-
64
- result
31
+ render(format: :human, lang: lang, lang_single: lang_single)
65
32
  end
66
33
  end
67
34
  end
@@ -22,33 +22,7 @@ module Pubid
22
22
  end
23
23
 
24
24
  def to_s(lang: :en, lang_single: false)
25
- parts = []
26
-
27
- # DISC prefix
28
- parts << "DISC"
29
-
30
- # Type (PD) + number
31
- if number
32
- number_str = if number.is_a?(Components::Code)
33
- number.value.to_s
34
- else
35
- number.to_s
36
- end
37
- if part
38
- part_val = part.is_a?(Components::Code) ? part.value : part
39
- number_str += "-#{part_val.to_s.strip}"
40
- end
41
- parts << "PD #{number_str}"
42
- end
43
-
44
- result = parts.join(" ")
45
-
46
- # Date with colon separator
47
- if date
48
- result += ":#{date}"
49
- end
50
-
51
- result
25
+ render(format: :human, lang: lang, lang_single: lang_single)
52
26
  end
53
27
  end
54
28
  end
@@ -17,53 +17,12 @@ module Pubid
17
17
  ].freeze
18
18
 
19
19
  def self.type
20
- { key: :dd, title: "Draft Document", short: "DD" }
20
+ { key: :dd,
21
+ web: :draft_document, title: "Draft Document", short: "DD" }
21
22
  end
22
23
 
23
24
  def to_s(lang: :en, lang_single: false)
24
- # Build string representation - DD uses type abbreviation as prefix
25
- parts = []
26
-
27
- # Use type abbreviation (DD) instead of publisher (BS)
28
- type_abbr = type&.abbr || "DD"
29
- parts << type_abbr
30
-
31
- # Number with part and subpart
32
- if number
33
- number_str = number.is_a?(Components::Code) ? number.value.to_s : number.to_s
34
-
35
- # Part and subpart
36
- if part
37
- part_val = part.is_a?(Components::Code) ? part.value : part
38
- number_str += "-#{part_val.to_s.strip}"
39
- end
40
- if subpart
41
- subpart_val = subpart.is_a?(Components::Code) ? subpart.value : subpart
42
- number_str += "-#{subpart_val.to_s.strip}"
43
- end
44
-
45
- parts << number_str
46
- end
47
-
48
- result = parts.join(" ")
49
-
50
- # Date
51
- if date
52
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
53
- result += ":#{year_val}"
54
- end
55
-
56
- # Edition
57
- result += " v#{edition}" if edition
58
-
59
- # Translation
60
- if translation_lang
61
- result += " (#{translation_lang})"
62
- elsif translation_upper
63
- result += " (#{translation_upper})"
64
- end
65
-
66
- result
25
+ render(format: :human, lang: lang, lang_single: lang_single)
67
26
  end
68
27
  end
69
28
  end
@@ -6,45 +6,12 @@ module Pubid
6
6
  # Electronic Publication (EP) identifier
7
7
  class ElectronicBook < SingleIdentifier
8
8
  def self.type
9
- { key: :ep, title: "Electronic Publication", short: "EP" }
9
+ { key: :ep,
10
+ web: :electronic_book, title: "Electronic Publication", short: "EP" }
10
11
  end
11
12
 
12
13
  def to_s(lang: :en, lang_single: false)
13
- # Build string representation - EP uses type abbreviation as prefix
14
- parts = []
15
-
16
- # Use type abbreviation (EP)
17
- parts << "EP"
18
-
19
- # Number with part and subpart
20
- if number
21
- number_str = number.is_a?(Components::Code) ? number.value.to_s : number.to_s
22
-
23
- # Part and subpart
24
- if part
25
- part_val = part.is_a?(Components::Code) ? part.value : part
26
- number_str += "-#{part_val.to_s.strip}"
27
- end
28
- if subpart
29
- subpart_val = subpart.is_a?(Components::Code) ? subpart.value : subpart
30
- number_str += "-#{subpart_val.to_s.strip}"
31
- end
32
-
33
- parts << number_str
34
- end
35
-
36
- result = parts.join(" ")
37
-
38
- # Date
39
- if date
40
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
41
- result += ":#{year_val}"
42
- end
43
-
44
- # Edition/Version
45
- result += " Version #{edition}" if edition
46
-
47
- result
14
+ render(format: :human, lang: lang, lang_single: lang_single)
48
15
  end
49
16
  end
50
17
  end
@@ -9,25 +9,13 @@ module Pubid
9
9
  # 1. "Expert Commentary" (full form)
10
10
  # 2. "ExComm" (abbreviated form)
11
11
  # 3. "ExComm (Fire)" (with optional topic suffix)
12
- class ExpertCommentary < Base
13
- attribute :base_identifier, Base, polymorphic: true
12
+ class ExpertCommentary < SingleIdentifier
13
+ attribute :base_identifier, ::Pubid::Identifier, polymorphic: true
14
14
  attribute :format, :string # "full", "abbr", "abbr_with_topic"
15
15
  attribute :topic, :string # e.g., "Fire"
16
16
 
17
17
  def to_s
18
- base_str = base_identifier.to_s
19
- # Ensure suffix appears only once at the end
20
- base_str = base_str.sub(/ (Expert Commentary|ExComm(\s*\(.*\))?)$/,
21
- "")
22
-
23
- case format
24
- when "full"
25
- "#{base_str} Expert Commentary"
26
- when "abbr_with_topic"
27
- "#{base_str} ExComm (#{topic})"
28
- else # "abbr" (default)
29
- "#{base_str} ExComm"
30
- end
18
+ render(format: :human)
31
19
  end
32
20
 
33
21
  def publisher