pubid 2.0.0.pre.alpha.2 → 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 (458) 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 +7 -39
  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 -43
  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 -51
  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 -39
  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/identifier.rb +0 -46
  55. data/lib/pubid/asme/identifiers/base.rb +0 -60
  56. data/lib/pubid/asme/renderer.rb +66 -0
  57. data/lib/pubid/asme/urn_parser.rb +31 -0
  58. data/lib/pubid/asme.rb +42 -1
  59. data/lib/pubid/astm/components/code.rb +9 -0
  60. data/lib/pubid/{jis → astm}/components.rb +1 -1
  61. data/lib/pubid/astm/identifier.rb +0 -77
  62. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  63. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  64. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  65. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  66. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  67. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  68. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  69. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  70. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  71. data/lib/pubid/astm/identifiers.rb +18 -0
  72. data/lib/pubid/astm/renderer.rb +172 -0
  73. data/lib/pubid/astm/single_identifier.rb +0 -10
  74. data/lib/pubid/astm/urn_parser.rb +30 -0
  75. data/lib/pubid/astm.rb +39 -27
  76. data/lib/pubid/bsi/builder.rb +21 -12
  77. data/lib/pubid/bsi/identifier.rb +8 -62
  78. data/lib/pubid/bsi/identifiers/addendum_document.rb +3 -33
  79. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +11 -47
  80. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +11 -38
  81. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +3 -53
  82. data/lib/pubid/bsi/identifiers/amendment.rb +3 -19
  83. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +2 -4
  84. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  85. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -84
  86. data/lib/pubid/bsi/identifiers/committee_document.rb +1 -14
  87. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -84
  88. data/lib/pubid/bsi/identifiers/corrigendum.rb +3 -7
  89. data/lib/pubid/bsi/identifiers/detailed_specification.rb +1 -34
  90. data/lib/pubid/bsi/identifiers/disc.rb +1 -27
  91. data/lib/pubid/bsi/identifiers/draft_document.rb +3 -44
  92. data/lib/pubid/bsi/identifiers/electronic_book.rb +3 -36
  93. data/lib/pubid/bsi/identifiers/expert_commentary.rb +3 -15
  94. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +1 -45
  95. data/lib/pubid/bsi/identifiers/flex.rb +1 -33
  96. data/lib/pubid/bsi/identifiers/handbook.rb +2 -13
  97. data/lib/pubid/bsi/identifiers/index.rb +1 -30
  98. data/lib/pubid/bsi/identifiers/method.rb +1 -39
  99. data/lib/pubid/bsi/identifiers/national_annex.rb +5 -27
  100. data/lib/pubid/bsi/identifiers/practice_guide.rb +2 -4
  101. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +3 -52
  102. data/lib/pubid/bsi/identifiers/published_document.rb +3 -52
  103. data/lib/pubid/bsi/identifiers/section.rb +1 -28
  104. data/lib/pubid/bsi/identifiers/set.rb +3 -17
  105. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +1 -7
  106. data/lib/pubid/bsi/identifiers/supplement_document.rb +3 -21
  107. data/lib/pubid/bsi/identifiers/supplementary_index.rb +1 -44
  108. data/lib/pubid/bsi/identifiers/technical_specification.rb +3 -45
  109. data/lib/pubid/bsi/identifiers/test_method.rb +1 -30
  110. data/lib/pubid/bsi/identifiers/value_added_publication.rb +3 -14
  111. data/lib/pubid/bsi/identifiers.rb +0 -1
  112. data/lib/pubid/bsi/renderer.rb +1050 -0
  113. data/lib/pubid/bsi/single_identifier.rb +6 -70
  114. data/lib/pubid/bsi/urn_generator.rb +2 -3
  115. data/lib/pubid/bsi/urn_parser.rb +52 -0
  116. data/lib/pubid/bsi.rb +224 -1
  117. data/lib/pubid/builder/base.rb +57 -10
  118. data/lib/pubid/bundled_identifier.rb +0 -1
  119. data/lib/pubid/ccsds/builder.rb +4 -3
  120. data/lib/pubid/ccsds/identifier.rb +63 -66
  121. data/lib/pubid/ccsds/identifiers/base.rb +11 -61
  122. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  123. data/lib/pubid/ccsds/parser.rb +4 -2
  124. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  125. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  126. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  127. data/lib/pubid/ccsds.rb +39 -1
  128. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  129. data/lib/pubid/cen_cenelec/identifier.rb +7 -38
  130. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +13 -4
  131. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -8
  132. data/lib/pubid/cen_cenelec/identifiers/base.rb +5 -41
  133. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  134. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  135. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +2 -25
  136. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -13
  137. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  138. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +4 -7
  139. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  140. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
  141. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  143. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  144. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  145. data/lib/pubid/cen_cenelec/single_identifier.rb +11 -89
  146. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  147. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  148. data/lib/pubid/cen_cenelec.rb +168 -1
  149. data/lib/pubid/cie/components/code.rb +8 -0
  150. data/lib/pubid/cie/identifier.rb +6 -57
  151. data/lib/pubid/cie/urn_parser.rb +28 -0
  152. data/lib/pubid/cie.rb +43 -1
  153. data/lib/pubid/components/adoption.rb +104 -0
  154. data/lib/pubid/components/code.rb +22 -8
  155. data/lib/pubid/components/date.rb +23 -16
  156. data/lib/pubid/components/edition.rb +9 -6
  157. data/lib/pubid/components/iteration.rb +32 -0
  158. data/lib/pubid/components/language.rb +6 -4
  159. data/lib/pubid/components/locality.rb +10 -1
  160. data/lib/pubid/components/publisher.rb +9 -6
  161. data/lib/pubid/components/relationship.rb +151 -0
  162. data/lib/pubid/components/stage.rb +5 -14
  163. data/lib/pubid/components/supplement.rb +184 -0
  164. data/lib/pubid/components/type.rb +5 -15
  165. data/lib/pubid/components/typed_stage.rb +10 -11
  166. data/lib/pubid/components.rb +4 -1
  167. data/lib/pubid/core/update_codes.rb +28 -7
  168. data/lib/pubid/csa/identifier.rb +0 -59
  169. data/lib/pubid/csa/identifiers/base.rb +2 -122
  170. data/lib/pubid/csa/identifiers/cec.rb +2 -101
  171. data/lib/pubid/csa/identifiers/series.rb +2 -102
  172. data/lib/pubid/csa/renderer.rb +292 -0
  173. data/lib/pubid/csa/urn_generator.rb +1 -1
  174. data/lib/pubid/csa/urn_parser.rb +33 -0
  175. data/lib/pubid/csa.rb +42 -1
  176. data/lib/pubid/etsi/components/code.rb +9 -2
  177. data/lib/pubid/etsi/identifier.rb +0 -43
  178. data/lib/pubid/etsi/identifiers/base.rb +1 -4
  179. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +2 -9
  180. data/lib/pubid/etsi/renderer.rb +42 -0
  181. data/lib/pubid/etsi/urn_parser.rb +34 -0
  182. data/lib/pubid/etsi.rb +42 -1
  183. data/lib/pubid/export/exporter.rb +4 -46
  184. data/lib/pubid/export/flavor_exporter.rb +111 -278
  185. data/lib/pubid/export.rb +0 -6
  186. data/lib/pubid/identifier.rb +2 -17
  187. data/lib/pubid/identifier_facade.rb +114 -0
  188. data/lib/pubid/identifier_metadata.rb +1 -1
  189. data/lib/pubid/idf/builder.rb +3 -3
  190. data/lib/pubid/idf/identifier.rb +3 -66
  191. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  192. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  193. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  194. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  195. data/lib/pubid/idf/parser.rb +3 -2
  196. data/lib/pubid/idf/renderer.rb +84 -0
  197. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  198. data/lib/pubid/idf/urn_generator.rb +4 -39
  199. data/lib/pubid/idf/urn_parser.rb +25 -0
  200. data/lib/pubid/idf.rb +51 -1
  201. data/lib/pubid/iec/builder.rb +46 -64
  202. data/lib/pubid/iec/components/code.rb +8 -32
  203. data/lib/pubid/iec/components/publisher.rb +0 -1
  204. data/lib/pubid/iec/components.rb +14 -0
  205. data/lib/pubid/iec/identifier.rb +251 -213
  206. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  207. data/lib/pubid/iec/identifiers/base.rb +8 -32
  208. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  209. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  210. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +27 -26
  211. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  212. data/lib/pubid/iec/identifiers/fragment_identifier.rb +37 -22
  213. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  214. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  215. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  216. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  217. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  218. data/lib/pubid/iec/identifiers/sheet_identifier.rb +21 -11
  219. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  220. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  221. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  222. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  223. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  224. data/lib/pubid/iec/identifiers/test_report_form.rb +5 -34
  225. data/lib/pubid/iec/identifiers/vap_identifier.rb +26 -19
  226. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  227. data/lib/pubid/iec/identifiers/working_document.rb +4 -48
  228. data/lib/pubid/iec/identifiers.rb +30 -0
  229. data/lib/pubid/iec/parser.rb +13 -12
  230. data/lib/pubid/iec/renderer.rb +254 -0
  231. data/lib/pubid/iec/single_identifier.rb +6 -12
  232. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  233. data/lib/pubid/iec/urn_generator.rb +3 -3
  234. data/lib/pubid/iec/urn_parser.rb +3 -3
  235. data/lib/pubid/iec.rb +40 -68
  236. data/lib/pubid/ieee/builder.rb +12 -12
  237. data/lib/pubid/ieee/components/code.rb +8 -0
  238. data/lib/pubid/ieee/components/draft.rb +14 -0
  239. data/lib/pubid/ieee/components/relationship.rb +5 -149
  240. data/lib/pubid/ieee/identifier.rb +6 -41
  241. data/lib/pubid/ieee/identifiers/adopted_standard.rb +1 -6
  242. data/lib/pubid/ieee/identifiers/base.rb +101 -458
  243. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +1 -7
  244. data/lib/pubid/ieee/identifiers/corrigendum.rb +1 -9
  245. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +1 -7
  246. data/lib/pubid/ieee/identifiers/dual_identifier.rb +1 -1
  247. data/lib/pubid/ieee/identifiers/dual_published.rb +1 -1
  248. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +1 -6
  249. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +1 -7
  250. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  251. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -15
  252. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +1 -3
  253. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  254. data/lib/pubid/ieee/identifiers/redlined_standard.rb +1 -4
  255. data/lib/pubid/ieee/identifiers/si_standard.rb +1 -35
  256. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  257. data/lib/pubid/ieee/pre_parser.rb +301 -0
  258. data/lib/pubid/ieee/renderer.rb +307 -0
  259. data/lib/pubid/ieee/urn_parser.rb +34 -0
  260. data/lib/pubid/ieee.rb +62 -1
  261. data/lib/pubid/ieee_debug.rb +0 -1
  262. data/lib/pubid/iho/builder.rb +2 -2
  263. data/lib/pubid/iho/identifier.rb +8 -42
  264. data/lib/pubid/iho/identifiers/base.rb +49 -10
  265. data/lib/pubid/iho/parser.rb +3 -3
  266. data/lib/pubid/iho/renderer.rb +30 -0
  267. data/lib/pubid/iho/urn_generator.rb +2 -2
  268. data/lib/pubid/iho/urn_parser.rb +58 -0
  269. data/lib/pubid/iho.rb +50 -1
  270. data/lib/pubid/iso/builder.rb +55 -53
  271. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  272. data/lib/pubid/iso/components/code.rb +7 -19
  273. data/lib/pubid/iso/components/publisher.rb +10 -8
  274. data/lib/pubid/iso/components.rb +2 -4
  275. data/lib/pubid/iso/identifier.rb +218 -252
  276. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  277. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  278. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  279. data/lib/pubid/iso/identifiers/data.rb +0 -1
  280. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  281. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  282. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  283. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  284. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  285. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  286. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  287. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  288. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  289. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  290. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  291. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  292. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  293. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  294. data/lib/pubid/iso/identifiers.rb +0 -1
  295. data/lib/pubid/iso/normalizer.rb +89 -0
  296. data/lib/pubid/iso/parser.rb +22 -4
  297. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  298. data/lib/pubid/iso/urn_generator.rb +66 -182
  299. data/lib/pubid/iso/urn_parser.rb +12 -7
  300. data/lib/pubid/iso.rb +173 -2
  301. data/lib/pubid/itu/builder.rb +0 -12
  302. data/lib/pubid/itu/components/code.rb +8 -0
  303. data/lib/pubid/itu/components.rb +11 -0
  304. data/lib/pubid/itu/identifier.rb +6 -104
  305. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  306. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  307. data/lib/pubid/itu/identifiers/base.rb +0 -6
  308. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  309. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  310. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  311. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  312. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  313. data/lib/pubid/itu/urn_parser.rb +23 -0
  314. data/lib/pubid/itu.rb +42 -1
  315. data/lib/pubid/jcgm/builder.rb +16 -8
  316. data/lib/pubid/jcgm/identifier.rb +0 -43
  317. data/lib/pubid/jcgm/identifiers/amendment.rb +2 -7
  318. data/lib/pubid/jcgm/identifiers/gum_guide.rb +2 -10
  319. data/lib/pubid/jcgm/renderer.rb +68 -0
  320. data/lib/pubid/jcgm/single_identifier.rb +1 -5
  321. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  322. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  323. data/lib/pubid/jcgm.rb +43 -2
  324. data/lib/pubid/jis/builder.rb +44 -52
  325. data/lib/pubid/jis/identifier.rb +132 -46
  326. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  327. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  328. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  329. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  330. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  331. data/lib/pubid/jis/identifiers.rb +1 -1
  332. data/lib/pubid/jis/parser.rb +31 -5
  333. data/lib/pubid/jis/renderer.rb +69 -0
  334. data/lib/pubid/jis/single_identifier.rb +6 -12
  335. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  336. data/lib/pubid/jis/urn_parser.rb +23 -0
  337. data/lib/pubid/jis.rb +42 -2
  338. data/lib/pubid/nist/builder.rb +63 -1871
  339. data/lib/pubid/nist/caster.rb +1272 -0
  340. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  341. data/lib/pubid/nist/components/code.rb +9 -20
  342. data/lib/pubid/nist/components/supplement.rb +2 -2
  343. data/lib/pubid/nist/components.rb +0 -1
  344. data/lib/pubid/nist/identifier.rb +11 -48
  345. data/lib/pubid/nist/identifiers/base.rb +110 -47
  346. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  347. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -1
  348. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  349. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  350. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  351. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -8
  352. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  353. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +15 -24
  354. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  355. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  356. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  357. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  358. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  359. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  360. data/lib/pubid/nist/identifiers/report.rb +4 -2
  361. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  362. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  363. data/lib/pubid/nist/identifiers.rb +1 -0
  364. data/lib/pubid/nist/parser.rb +62 -452
  365. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  366. data/lib/pubid/nist/preprocessor.rb +416 -0
  367. data/lib/pubid/nist/renderer.rb +43 -0
  368. data/lib/pubid/nist/router.rb +148 -0
  369. data/lib/pubid/nist/series/base.rb +58 -0
  370. data/lib/pubid/nist/series/crpl.rb +13 -0
  371. data/lib/pubid/nist/series/fips.rb +14 -0
  372. data/lib/pubid/nist/series/ir.rb +60 -0
  373. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  374. data/lib/pubid/nist/series/mono.rb +19 -0
  375. data/lib/pubid/nist/series/ncstar.rb +20 -0
  376. data/lib/pubid/nist/series.rb +49 -0
  377. data/lib/pubid/nist/supplement_identifier.rb +3 -1
  378. data/lib/pubid/nist/urn_parser.rb +67 -0
  379. data/lib/pubid/nist.rb +82 -4
  380. data/lib/pubid/oiml/components/code.rb +10 -0
  381. data/lib/pubid/oiml/identifier.rb +0 -50
  382. data/lib/pubid/oiml/identifiers/annex.rb +3 -45
  383. data/lib/pubid/oiml/identifiers/base.rb +2 -17
  384. data/lib/pubid/oiml/renderer.rb +161 -0
  385. data/lib/pubid/oiml/single_identifier.rb +6 -45
  386. data/lib/pubid/oiml/supplement_identifier.rb +4 -19
  387. data/lib/pubid/oiml/urn_generator.rb +0 -8
  388. data/lib/pubid/oiml/urn_parser.rb +22 -0
  389. data/lib/pubid/oiml.rb +42 -1
  390. data/lib/pubid/plateau/identifier.rb +7 -41
  391. data/lib/pubid/plateau/identifiers/handbook.rb +1 -3
  392. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  393. data/lib/pubid/plateau/renderer.rb +51 -0
  394. data/lib/pubid/plateau/supplement_identifier.rb +1 -1
  395. data/lib/pubid/plateau/urn_parser.rb +43 -0
  396. data/lib/pubid/plateau.rb +43 -1
  397. data/lib/pubid/renderers/directives_renderer.rb +22 -8
  398. data/lib/pubid/renderers/guide_renderer.rb +4 -2
  399. data/lib/pubid/renderers/human_readable.rb +18 -7
  400. data/lib/pubid/rendering/context.rb +28 -19
  401. data/lib/pubid/rendering.rb +0 -3
  402. data/lib/pubid/sae/components/date.rb +8 -0
  403. data/lib/pubid/sae/components/type.rb +5 -1
  404. data/lib/pubid/sae/identifier.rb +0 -23
  405. data/lib/pubid/sae/identifiers/base.rb +2 -16
  406. data/lib/pubid/sae/renderer.rb +36 -0
  407. data/lib/pubid/sae/urn_generator.rb +2 -10
  408. data/lib/pubid/sae/urn_parser.rb +36 -0
  409. data/lib/pubid/sae.rb +42 -1
  410. data/lib/pubid/urn_generator/base.rb +12 -12
  411. data/lib/pubid/urn_parser/base.rb +81 -0
  412. data/lib/pubid/urn_parser/errors.rb +9 -0
  413. data/lib/pubid/urn_parser.rb +14 -0
  414. data/lib/pubid/version.rb +1 -1
  415. data/lib/pubid.rb +29 -7
  416. data/lib/tasks/website-data.json +1940 -1882
  417. metadata +75 -44
  418. data/lib/pubid/amca/scheme.rb +0 -16
  419. data/lib/pubid/ansi/scheme.rb +0 -15
  420. data/lib/pubid/api/scheme.rb +0 -66
  421. data/lib/pubid/ashrae/scheme.rb +0 -53
  422. data/lib/pubid/asme/scheme.rb +0 -37
  423. data/lib/pubid/astm/scheme.rb +0 -55
  424. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  425. data/lib/pubid/bsi/scheme.rb +0 -243
  426. data/lib/pubid/ccsds/scheme.rb +0 -57
  427. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  428. data/lib/pubid/cie/scheme.rb +0 -64
  429. data/lib/pubid/components/factory.rb +0 -50
  430. data/lib/pubid/csa/scheme.rb +0 -44
  431. data/lib/pubid/etsi/scheme.rb +0 -42
  432. data/lib/pubid/export/data_class_exporter.rb +0 -59
  433. data/lib/pubid/export/ieee_exporter.rb +0 -78
  434. data/lib/pubid/export/itu_exporter.rb +0 -66
  435. data/lib/pubid/export/nist_exporter.rb +0 -64
  436. data/lib/pubid/export/registry_exporter.rb +0 -90
  437. data/lib/pubid/export/scheme_exporter.rb +0 -70
  438. data/lib/pubid/identifier_registry.rb +0 -198
  439. data/lib/pubid/idf/scheme.rb +0 -61
  440. data/lib/pubid/iec/scheme.rb +0 -71
  441. data/lib/pubid/ieee/scheme.rb +0 -90
  442. data/lib/pubid/iho/scheme.rb +0 -29
  443. data/lib/pubid/iso/identifiers/base.rb +0 -115
  444. data/lib/pubid/iso/scheme.rb +0 -193
  445. data/lib/pubid/itu/scheme.rb +0 -174
  446. data/lib/pubid/jcgm/scheme.rb +0 -60
  447. data/lib/pubid/jis/components/code.rb +0 -59
  448. data/lib/pubid/jis/identifiers/base.rb +0 -72
  449. data/lib/pubid/jis/scheme.rb +0 -49
  450. data/lib/pubid/nist/components/publisher.rb +0 -24
  451. data/lib/pubid/nist/scheme.rb +0 -199
  452. data/lib/pubid/oiml/scheme.rb +0 -46
  453. data/lib/pubid/plateau/scheme.rb +0 -45
  454. data/lib/pubid/rendering/base.rb +0 -73
  455. data/lib/pubid/rendering/common.rb +0 -211
  456. data/lib/pubid/rendering/format.rb +0 -25
  457. data/lib/pubid/sae/scheme.rb +0 -47
  458. data/lib/pubid/scheme.rb +0 -219
@@ -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
@@ -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