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
@@ -30,51 +30,7 @@ module Pubid
30
30
  end
31
31
 
32
32
  def to_s(lang: :en, lang_single: false)
33
- # Explanatory Supplement format:
34
- # BS {number}-{part}:Explanatory Supplement:{year}
35
- parts = []
36
- parts << "BS"
37
-
38
- # Number with part/subpart
39
- if number
40
- number_str = if number.is_a?(Components::Code)
41
- number.value.to_s
42
- else
43
- number.to_s
44
- end
45
-
46
- # Part and subpart
47
- if part
48
- part_val = if part.is_a?(Components::Code)
49
- part.value
50
- else
51
- part
52
- end
53
- number_str += "-#{part_val}"
54
- end
55
- if subpart
56
- subpart_val = if supart.is_a?(Components::Code)
57
- subpart.value
58
- else
59
- subpart
60
- end
61
- number_str += "-#{subpart_val}"
62
- end
63
-
64
- parts << number_str
65
- end
66
-
67
- result = parts.join(" ")
68
-
69
- # Date
70
- if date
71
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
72
- result += ":Explanatory Supplement:#{year_val}"
73
- # Month if present
74
- result += "-#{format('%02d', month)}" if month
75
- end
76
-
77
- result
33
+ render(format: :human, lang: lang, lang_single: lang_single)
78
34
  end
79
35
  end
80
36
  end
@@ -21,39 +21,7 @@ module Pubid
21
21
  end
22
22
 
23
23
  def to_s(lang: :en, lang_single: false)
24
- parts = []
25
-
26
- # Publisher is always "BSI Flex"
27
- parts << "BSI Flex"
28
-
29
- # Number with part/subpart
30
- if number
31
- number_str = number.is_a?(Components::Code) ? number.value.to_s : number.to_s
32
- if part
33
- part_val = part.is_a?(Components::Code) ? part.value : part
34
- number_str += "-#{part_val}"
35
- end
36
- if subpart
37
- subpart_val = subpart.is_a?(Components::Code) ? subpart.value : subpart
38
- number_str += "-#{subpart_val}"
39
- end
40
- parts << number_str
41
- end
42
-
43
- result = parts.join(" ")
44
-
45
- # Edition comes before date for Flex
46
- result += " v#{edition}" if edition
47
-
48
- # Date
49
- if date
50
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
51
- result += ":#{year_val}"
52
- # Month if present
53
- result += "-#{format('%02d', month)}" if month
54
- end
55
-
56
- result
24
+ render(format: :human, lang: lang, lang_single: lang_single)
57
25
  end
58
26
  end
59
27
  end
@@ -5,7 +5,7 @@ module Pubid
5
5
  module Identifiers
6
6
  # BSI Handbook
7
7
  # Examples: "Handbook 17:1963", "HB 10146:1998"
8
- class Handbook < Base
8
+ class Handbook < SingleIdentifier
9
9
  attribute :number, Bsi::Components::Code
10
10
  attribute :part, Bsi::Components::Code
11
11
  attribute :date, Bsi::Components::Date
@@ -20,18 +20,7 @@ module Pubid
20
20
  end
21
21
 
22
22
  def to_s(lang: :en, lang_single: false)
23
- # Use preserved original abbreviation, default to "Handbook"
24
- abbr = original_abbr || "Handbook"
25
-
26
- number_str = number.is_a?(Components::Code) ? number.value.to_s : number.to_s
27
- if part
28
- part_val = part.is_a?(Components::Code) ? part.value : part
29
- number_str += "-#{part_val.to_s.strip}"
30
- end
31
-
32
- result = "#{abbr} #{number_str}"
33
- result += ":#{date.year}" if date
34
- result
23
+ render(format: :human, lang: lang, lang_single: lang_single)
35
24
  end
36
25
  end
37
26
  end
@@ -25,36 +25,7 @@ module Pubid
25
25
  end
26
26
 
27
27
  def to_s(lang: :en, lang_single: false)
28
- # Build string representation - Index has special format
29
- parts = []
30
-
31
- # Publisher (BS)
32
- parts << publisher.to_s if publisher
33
-
34
- # Number
35
- if number
36
- number_str = number.is_a?(Components::Code) ? number.value.to_s : number.to_s
37
- parts << number_str
38
- end
39
-
40
- result = parts.join(" ")
41
-
42
- # Index suffix with colon or space format
43
- result += if issue_number
44
- " Index Issue #{issue_number}"
45
- elsif index_format == "colon"
46
- ":Index"
47
- else
48
- " Index"
49
- end
50
-
51
- # Date
52
- if date
53
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
54
- result += ":#{year_val}"
55
- end
56
-
57
- result
28
+ render(format: :human, lang: lang, lang_single: lang_single)
58
29
  end
59
30
  end
60
31
  end
@@ -30,45 +30,7 @@ module Pubid
30
30
  end
31
31
 
32
32
  def to_s(lang: :en, lang_single: false)
33
- # Build string representation - Method has three formats
34
- parts = []
35
-
36
- # Publisher (BS)
37
- parts << publisher.to_s if publisher
38
-
39
- # Number with part (e.g., "2782-1")
40
- if number
41
- number_str = number.is_a?(Components::Code) ? number.value.to_s : number.to_s
42
- # Add part if present (e.g., "2782" + "-" + "1")
43
- if part
44
- part_val = part.is_a?(Components::Code) ? part.value : part
45
- number_str += "-#{part_val}"
46
- end
47
- parts << number_str
48
- end
49
-
50
- result = parts.join(" ")
51
-
52
- # Method suffix with appropriate format
53
- if method_to
54
- # Range format: ":Methods X to Y"
55
- result += ":Methods #{method_code} to #{method_to}"
56
- elsif method_and
57
- # And format: ":Methods X and Y"
58
- result += ":Methods #{method_code} and #{method_and}"
59
- else
60
- # Basic format: singular or plural
61
- method_word = is_plural ? "Methods" : "Method"
62
- result += ":#{method_word} #{method_code}"
63
- end
64
-
65
- # Date
66
- if date
67
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
68
- result += ":#{year_val}"
69
- end
70
-
71
- result
33
+ render(format: :human, lang: lang, lang_single: lang_single)
72
34
  end
73
35
  end
74
36
  end
@@ -6,8 +6,8 @@ module Pubid
6
6
  # National Annex (NA) identifier
7
7
  # Can have own supplements: "NA+A1:2012 to BASE"
8
8
  class NationalAnnex < SingleIdentifier
9
- attribute :na_supplements, Base, polymorphic: true, collection: true # Supplements on the NA itself
10
- attribute :base_doc, Base, polymorphic: true # The identifier after "to"
9
+ attribute :na_supplements, ::Pubid::Identifier, polymorphic: true, collection: true # Supplements on the NA itself
10
+ attribute :base_doc, ::Pubid::Identifier, polymorphic: true # The identifier after "to"
11
11
 
12
12
  TYPED_STAGES = [
13
13
  Pubid::Components::TypedStage.new(
@@ -21,7 +21,8 @@ module Pubid
21
21
  ].freeze
22
22
 
23
23
  def self.type
24
- { key: :na, title: "National Annex", short: "NA" }
24
+ { key: :na,
25
+ web: :national_annex, title: "National Annex", short: "NA" }
25
26
  end
26
27
 
27
28
  # Delegation methods to access wrapped base_doc attributes
@@ -42,30 +43,7 @@ module Pubid
42
43
  end
43
44
 
44
45
  def to_s(lang: :en, lang_single: false)
45
- result = "NA"
46
-
47
- # Add NA supplements if present
48
- if na_supplements&.any?
49
- na_supplements.each do |supp|
50
- if supp.is_a?(Amendment)
51
- result += "+A#{supp.amendment_number}:#{supp.amendment_year}"
52
- elsif supp.is_a?(Corrigendum)
53
- result += "+C#{supp.corrigendum_number}:#{supp.corrigendum_year}"
54
- end
55
- end
56
- end
57
-
58
- result += " to "
59
-
60
- # Render the base identifier (what this NA is for)
61
- result += if base_doc
62
- base_doc.to_s
63
- else
64
- # Fallback to parent rendering
65
- super
66
- end
67
-
68
- result
46
+ render(format: :human, lang: lang, lang_single: lang_single)
69
47
  end
70
48
  end
71
49
  end
@@ -5,7 +5,7 @@ module Pubid
5
5
  module Identifiers
6
6
  # BSI Practice Guide (PP - Published Practice)
7
7
  # Examples: "PP 888:1982", "PP 7307:1986", "PP 7722:2006"
8
- class PracticeGuide < Base
8
+ class PracticeGuide < 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 = "PP #{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
@@ -17,61 +17,12 @@ module Pubid
17
17
  ].freeze
18
18
 
19
19
  def self.type
20
- { key: :pas, title: "Publicly Available Specification", short: "PAS" }
20
+ { key: :pas,
21
+ web: :publicly_available_specification, title: "Publicly Available Specification", short: "PAS" }
21
22
  end
22
23
 
23
24
  def to_s(lang: :en, lang_single: false)
24
- # Build string representation - PAS uses type abbreviation as prefix
25
- parts = []
26
-
27
- # Use type abbreviation (PAS) instead of publisher (BS)
28
- type_abbr = type&.abbr || "PAS"
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
- # Collection (second number with slash, e.g., PAS 2035/2030)
36
- if second_number
37
- second_val = second_number.is_a?(Components::Code) ? second_number.value : second_number
38
- number_str += "/#{second_val}"
39
- end
40
-
41
- # Part and subpart
42
- if part
43
- part_val = part.is_a?(Components::Code) ? part.value : part
44
- number_str += "-#{part_val.to_s.strip}"
45
- end
46
- if subpart
47
- subpart_val = subpart.is_a?(Components::Code) ? subpart.value : subpart
48
- number_str += "-#{subpart_val.to_s.strip}"
49
- end
50
-
51
- parts << number_str
52
- end
53
-
54
- result = parts.join(" ")
55
-
56
- # Date
57
- if date
58
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
59
- result += ":#{year_val}"
60
- # Month if present
61
- result += "-#{format('%02d', month)}" if month
62
- end
63
-
64
- # Edition
65
- result += " v#{edition}" if edition
66
-
67
- # Translation
68
- if translation_lang
69
- result += " (#{translation_lang})"
70
- elsif translation_upper
71
- result += " (#{translation_upper})"
72
- end
73
-
74
- result
25
+ render(format: :human, lang: lang, lang_single: lang_single)
75
26
  end
76
27
  end
77
28
  end
@@ -17,61 +17,12 @@ module Pubid
17
17
  ].freeze
18
18
 
19
19
  def self.type
20
- { key: :pd, title: "Published Document", short: "PD" }
20
+ { key: :pd,
21
+ web: :published_document, title: "Published Document", short: "PD" }
21
22
  end
22
23
 
23
24
  def to_s(lang: :en, lang_single: false)
24
- # Build string representation - PD uses type abbreviation as prefix
25
- parts = []
26
-
27
- # Use type abbreviation (PD) instead of publisher (BS)
28
- type_abbr = type&.abbr || "PD"
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
- # Collection (second number with slash, e.g., PD 6430/1)
36
- if second_number
37
- second_val = second_number.is_a?(Components::Code) ? second_number.value : second_number
38
- number_str += "/#{second_val}"
39
- end
40
-
41
- # Part and subpart
42
- if part
43
- part_val = part.is_a?(Components::Code) ? part.value : part
44
- number_str += "-#{part_val.to_s.strip}"
45
- end
46
- if subpart
47
- subpart_val = subpart.is_a?(Components::Code) ? subpart.value : subpart
48
- number_str += "-#{subpart_val.to_s.strip}"
49
- end
50
-
51
- parts << number_str
52
- end
53
-
54
- result = parts.join(" ")
55
-
56
- # Date
57
- if date
58
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
59
- result += ":#{year_val}"
60
- # Month if present
61
- result += "-#{format('%02d', month)}" if month
62
- end
63
-
64
- # Edition
65
- result += " v#{edition}" if edition
66
-
67
- # Translation
68
- if translation_lang
69
- result += " (#{translation_lang})"
70
- elsif translation_upper
71
- result += " (#{translation_upper})"
72
- end
73
-
74
- result
25
+ render(format: :human, lang: lang, lang_single: lang_single)
75
26
  end
76
27
  end
77
28
  end
@@ -27,34 +27,7 @@ module Pubid
27
27
  end
28
28
 
29
29
  def to_s(lang: :en, lang_single: false)
30
- # Build string representation - Section has two formats
31
- parts = []
32
-
33
- # Publisher (DD, BS, etc.)
34
- parts << publisher.to_s if publisher
35
-
36
- # Number
37
- if number
38
- number_str = number.is_a?(Components::Code) ? number.value.to_s : number.to_s
39
- parts << number_str
40
- end
41
-
42
- result = parts.join(" ")
43
-
44
- # Section suffix with colon or space format
45
- result += if section_format == "colon"
46
- ":Section #{section_id}"
47
- else
48
- " Section #{section_id}"
49
- end
50
-
51
- # Date
52
- if date
53
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
54
- result += ":#{year_val}"
55
- end
56
-
57
- result
30
+ render(format: :human, lang: lang, lang_single: lang_single)
58
31
  end
59
32
  end
60
33
  end
@@ -12,26 +12,12 @@ module Pubid
12
12
  # Examples:
13
13
  # BS ISO 20400 + BS ISO 44001+BS ISO 44002
14
14
  # BS ISO 9001+BS ISO 14001
15
- class Set < Base
16
- attribute :identifiers, Base, collection: true, polymorphic: true
15
+ class Set < SingleIdentifier
16
+ attribute :identifiers, ::Pubid::Identifier, collection: true, polymorphic: true
17
17
  attribute :separators, :string, collection: true # Should all be " + "
18
18
 
19
19
  def to_s(lang: :en, lang_single: false)
20
- return "" if identifiers.nil? || identifiers.empty?
21
-
22
- parts = []
23
-
24
- identifiers.each_with_index do |id, i|
25
- # Render each identifier
26
- parts << id.to_s
27
-
28
- # Add separator (always " + " between identifiers)
29
- if i < identifiers.length - 1
30
- parts << " + "
31
- end
32
- end
33
-
34
- parts.join
20
+ render(format: :human, lang: lang, lang_single: lang_single)
35
21
  end
36
22
 
37
23
  def <=>(other)
@@ -26,13 +26,7 @@ module Pubid
26
26
  end
27
27
 
28
28
  def to_s(lang: :en, lang_single: false)
29
- base = if corrigendum
30
- "AMD Corrigendum #{amendment_number}"
31
- else
32
- "AMD #{amendment_number}"
33
- end
34
-
35
- parenthesized ? "(#{base})" : base
29
+ render(format: :human, lang: lang, lang_single: lang_single)
36
30
  end
37
31
  end
38
32
  end
@@ -8,8 +8,8 @@ module Pubid
8
8
  # Supports both forward and reverse formats:
9
9
  # Forward: "BS 1000:Supplement No. 1:1972", "BS 1722-1 Supplement No. 1:1974"
10
10
  # Reverse: "Supplement No. 1 (1970) to BS 1831:1969"
11
- class SupplementDocument < Base
12
- attribute :base_identifier, Base, polymorphic: true
11
+ class SupplementDocument < SingleIdentifier
12
+ attribute :base_identifier, ::Pubid::Identifier, polymorphic: true
13
13
  attribute :supplement_number, :string
14
14
  attribute :supplement_year, :integer
15
15
  attribute :supplement_type, :string, default: -> {
@@ -21,25 +21,7 @@ module Pubid
21
21
  } # Separator before Supplement (":" or " ")
22
22
 
23
23
  def to_s
24
- base_str = base_identifier.to_s
25
-
26
- if reverse_format
27
- # Reverse format: "Supplement No. 1 (1970) to BS 1831:1969"
28
- supplement_str = if supplement_type == "No."
29
- "Supplement No. #{supplement_number} (#{supplement_year})"
30
- else
31
- "Supplement #{supplement_number} (#{supplement_year})"
32
- end
33
- "#{supplement_str} to #{base_str}"
34
- else
35
- # Forward format: "BS 1000:Supplement No. 1:1972" or "BS 1722-1 Supplement No. 1:1974"
36
- supplement_str = if supplement_type == "No."
37
- "#{separator}Supplement No. #{supplement_number}:#{supplement_year}"
38
- else
39
- "#{separator}Supplement #{supplement_number}:#{supplement_year}"
40
- end
41
- "#{base_str}#{supplement_str}"
42
- end
24
+ render(format: :human)
43
25
  end
44
26
 
45
27
  def publisher
@@ -30,50 +30,7 @@ module Pubid
30
30
  end
31
31
 
32
32
  def to_s(lang: :en, lang_single: false)
33
- # Supplementary Index format: BS {number} Supplementary Index:{year}
34
- parts = []
35
- parts << "BS"
36
-
37
- # Number with part/subpart
38
- if number
39
- number_str = if number.is_a?(Components::Code)
40
- number.value.to_s
41
- else
42
- number.to_s
43
- end
44
-
45
- # Part and subpart
46
- if part
47
- part_val = if part.is_a?(Components::Code)
48
- part.value
49
- else
50
- part
51
- end
52
- number_str += "-#{part_val}"
53
- end
54
- if subpart
55
- subpart_val = if supart.is_a?(Components::Code)
56
- subpart.value
57
- else
58
- subpart
59
- end
60
- number_str += "-#{subpart_val}"
61
- end
62
-
63
- parts << number_str
64
- end
65
-
66
- result = parts.join(" ")
67
-
68
- # Date
69
- if date
70
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
71
- result += " Supplementary Index:#{year_val}"
72
- # Month if present
73
- result += "-#{format('%02d', month)}" if month
74
- end
75
-
76
- result
33
+ render(format: :human, lang: lang, lang_single: lang_single)
77
34
  end
78
35
  end
79
36
  end
@@ -24,54 +24,12 @@ module Pubid
24
24
  ].freeze
25
25
 
26
26
  def self.type
27
- { key: :ts, title: "Technical Specification", short: "TS" }
27
+ { key: :ts,
28
+ web: :technical_specification, title: "Technical Specification", short: "TS" }
28
29
  end
29
30
 
30
31
  def to_s(lang: :en, lang_single: false)
31
- # Technical specifications use a simple format: TS {number}:{year}
32
- parts = []
33
- parts << "TS"
34
-
35
- # Number with part/subpart
36
- if number
37
- number_str = if number.is_a?(Components::Code)
38
- number.value.to_s
39
- else
40
- number.to_s
41
- end
42
-
43
- # Part and subpart
44
- if part
45
- part_val = if part.is_a?(Components::Code)
46
- part.value
47
- else
48
- part
49
- end
50
- number_str += "-#{part_val}"
51
- end
52
- if subpart
53
- subpart_val = if supart.is_a?(Components::Code)
54
- subpart.value
55
- else
56
- subpart
57
- end
58
- number_str += "-#{subpart_val}"
59
- end
60
-
61
- parts << number_str
62
- end
63
-
64
- result = parts.join(" ")
65
-
66
- # Date
67
- if date
68
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
69
- result += ":#{year_val}"
70
- # Month if present
71
- result += "-#{format('%02d', month)}" if month
72
- end
73
-
74
- result
32
+ render(format: :human, lang: lang, lang_single: lang_single)
75
33
  end
76
34
  end
77
35
  end
@@ -30,36 +30,7 @@ module Pubid
30
30
  end
31
31
 
32
32
  def to_s(lang: :en, lang_single: false)
33
- # Test Method format: BS {number}:{test_series}:{test_id}:{year}
34
- parts = []
35
-
36
- # Publisher (BS)
37
- parts << "BS"
38
-
39
- # Number
40
- if number
41
- number_str = if number.is_a?(Components::Code)
42
- number.value.to_s
43
- else
44
- number.to_s
45
- end
46
- parts << number_str
47
- end
48
-
49
- result = parts.join(" ")
50
-
51
- # Test series and test ID suffixes
52
- if test_series && test_id
53
- result += ":#{test_series}:#{test_id}"
54
- end
55
-
56
- # Date
57
- if date
58
- year_val = date.is_a?(Components::Date) ? date.year : date.to_i
59
- result += ":#{year_val}"
60
- end
61
-
62
- result
33
+ render(format: :human, lang: lang, lang_single: lang_single)
63
34
  end
64
35
  end
65
36
  end