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
@@ -0,0 +1,1050 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Bsi
5
+ # Human-readable renderer for BSI identifiers.
6
+ #
7
+ # Produces strings like:
8
+ # "BS 4592-0:2006+A1:2012"
9
+ # "BSI Flex 220 v1.0:2024"
10
+ # "NA+A1:2012 to BS EN 1090-2:2018"
11
+ #
12
+ # The renderer is registered as the +:human+ format in the BSI format
13
+ # registry and invoked via +render(format: :human)+.
14
+ #
15
+ # For wrapper types (Consolidated, NationalAnnex, ExpertCommentary, etc.)
16
+ # the renderer composes child identifiers. For simple identifiers it
17
+ # dispatches to type-specific rendering methods.
18
+ class Renderer < ::Pubid::Renderers::Base
19
+ def render(context: nil, **opts)
20
+ @context = context
21
+ id = @id
22
+
23
+ case id
24
+ when Identifiers::AddendumDocument
25
+ render_addendum_document(id, opts)
26
+ when Identifiers::AdoptedEuropeanNorm
27
+ render_adopted_european_norm(id)
28
+ when Identifiers::AdoptedInternationalStandard
29
+ render_adopted_international_standard(id)
30
+ when Identifiers::AerospaceStandard
31
+ render_aerospace_standard(id)
32
+ when Identifiers::Amendment
33
+ render_amendment(id)
34
+ when Identifiers::BritishIndustrialPractice
35
+ render_british_industrial_practice(id)
36
+ when Identifiers::BundledIdentifier
37
+ render_bundled_identifier(id)
38
+ when Identifiers::CommitteeDocument
39
+ render_committee_document(id)
40
+ when Identifiers::ConsolidatedIdentifier
41
+ render_consolidated_identifier(id, opts)
42
+ when Identifiers::Corrigendum
43
+ render_corrigendum(id)
44
+ when Identifiers::DetailedSpecification
45
+ render_detailed_specification(id)
46
+ when Identifiers::Disc
47
+ render_disc(id)
48
+ when Identifiers::DraftDocument
49
+ render_draft_document(id)
50
+ when Identifiers::ElectronicBook
51
+ render_electronic_book(id)
52
+ when Identifiers::ExpertCommentary
53
+ render_expert_commentary(id)
54
+ when Identifiers::ExplanatorySupplement
55
+ render_explanatory_supplement(id)
56
+ when Identifiers::Flex
57
+ render_flex(id)
58
+ when Identifiers::Handbook
59
+ render_handbook(id)
60
+ when Identifiers::Index
61
+ render_index(id)
62
+ when Identifiers::Method
63
+ render_method(id)
64
+ when Identifiers::NationalAnnex
65
+ render_national_annex(id)
66
+ when Identifiers::PracticeGuide
67
+ render_practice_guide(id)
68
+ when Identifiers::PubliclyAvailableSpecification
69
+ render_publicly_available_specification(id)
70
+ when Identifiers::PublishedDocument
71
+ render_published_document(id)
72
+ when Identifiers::Section
73
+ render_section(id)
74
+ when Identifiers::Set
75
+ render_set(id)
76
+ when Identifiers::StandaloneAmendment
77
+ render_standalone_amendment(id)
78
+ when Identifiers::SupplementDocument
79
+ render_supplement_document(id)
80
+ when Identifiers::SupplementaryIndex
81
+ render_supplementary_index(id)
82
+ when Identifiers::TechnicalSpecification
83
+ render_technical_specification(id)
84
+ when Identifiers::TestMethod
85
+ render_test_method(id)
86
+ when Identifiers::ValueAddedPublication
87
+ render_value_added_publication(id, opts)
88
+ when SingleIdentifier
89
+ render_single_identifier(id)
90
+ else
91
+ id.to_s
92
+ end
93
+ end
94
+
95
+ private
96
+
97
+ # ------------------------------------------------------------------
98
+ # SingleIdentifier (base BSI identifier)
99
+ # ------------------------------------------------------------------
100
+
101
+ def render_single_identifier(id)
102
+ parts = []
103
+
104
+ parts << id.publisher.to_s if id.publisher
105
+ if id.flex_prefix
106
+ parts << id.flex_prefix
107
+ elsif id.prefix
108
+ parts << id.prefix.to_s
109
+ end
110
+
111
+ if id.number
112
+ number_str = id.number.render(context: @context)
113
+
114
+ if id.second_number
115
+ second_val = id.second_number.render(context: @context)
116
+ number_str += "/#{second_val}"
117
+ end
118
+
119
+ space_separated = id.space_separated_part
120
+ if id.part
121
+ part_val = id.part.render(context: @context)
122
+ part_str = part_val.to_s.strip
123
+ separator = space_separated ? " " : "-"
124
+ number_str += "#{separator}#{part_str}"
125
+ end
126
+ if id.subpart
127
+ subpart_val = id.subpart.render(context: @context)
128
+ subpart_str = subpart_val.to_s.strip
129
+ number_str += "-#{subpart_str}"
130
+ end
131
+
132
+ if id.iteration && !id.iteration.empty?
133
+ number_str += "[#{id.iteration}]"
134
+ end
135
+
136
+ parts << number_str
137
+ end
138
+
139
+ result = parts.join(" ")
140
+
141
+ if id.date
142
+ year_val = id.date.render(context: @context)
143
+ result += ":#{year_val}"
144
+ result += "-#{format('%02d', id.month)}" if id.month
145
+ end
146
+
147
+ result += " v#{id.edition}" if id.edition
148
+
149
+ if id.translation_lang
150
+ result += " (#{id.translation_lang})"
151
+ elsif id.translation_upper
152
+ result += " (#{id.translation_upper})"
153
+ end
154
+
155
+ result
156
+ end
157
+
158
+ # ------------------------------------------------------------------
159
+ # Wrapper types
160
+ # ------------------------------------------------------------------
161
+
162
+ def render_addendum_document(id, opts)
163
+ result = id.base_identifier.to_s(**opts)
164
+
165
+ base_has_year = id.base_identifier.to_s =~ /:(\d{4})$/
166
+
167
+ sep = if id.separator == ":"
168
+ ":"
169
+ elsif base_has_year && id.base_identifier.to_s !~ /:\d{4}:/
170
+ " "
171
+ else
172
+ id.separator
173
+ end
174
+
175
+ result += sep
176
+ result += "Addendum"
177
+
178
+ if id.addendum_type.empty?
179
+ # No type prefix
180
+ else
181
+ result += " #{id.addendum_type}"
182
+ end
183
+ result += " "
184
+ result += " "
185
+
186
+ result += id.addendum_number.to_s
187
+ result += ":#{id.addendum_year}" if id.addendum_year
188
+
189
+ result
190
+ end
191
+
192
+ def render_adopted_european_norm(id)
193
+ prefix = case id.publisher
194
+ when Components::Publisher
195
+ id.publisher.render(context: @context)
196
+ when Array
197
+ id.publisher.join("/")
198
+ when String
199
+ id.publisher
200
+ else
201
+ "BS"
202
+ end
203
+
204
+ result = prefix
205
+ result += " #{id.adopted_identifier}" if id.adopted_identifier
206
+ result += " ED#{id.edition}" if id.edition
207
+
208
+ result += " (R#{id.reaffirmation_year})" if id.reaffirmation_year
209
+
210
+ result = render_translation(result, id)
211
+
212
+ result = render_expert_commentary_suffix(result, id)
213
+
214
+ result
215
+ end
216
+
217
+ def render_adopted_international_standard(id)
218
+ prefix = case id.publisher
219
+ when Components::Publisher
220
+ id.publisher.render(context: @context)
221
+ when Array
222
+ id.publisher.join("/")
223
+ when String
224
+ id.publisher
225
+ else
226
+ "BS"
227
+ end
228
+
229
+ result = prefix
230
+ result += " #{id.adopted_identifier}" if id.adopted_identifier
231
+ result += " ED#{id.edition}" if id.edition
232
+
233
+ result += " (R#{id.reaffirmation_year})" if id.reaffirmation_year
234
+
235
+ if id.translation_lang
236
+ result += " (#{id.translation_lang})"
237
+ elsif id.translation_upper
238
+ result += " (#{id.translation_upper})"
239
+ end
240
+
241
+ result = render_expert_commentary_suffix(result, id)
242
+
243
+ result
244
+ end
245
+
246
+ def render_aerospace_standard(id)
247
+ parts = []
248
+ parts << "BS"
249
+ parts << id.prefix if id.prefix
250
+
251
+ if id.number
252
+ number_str = id.number.render(context: @context)
253
+
254
+ if id.part
255
+ part_val = id.part.render(context: @context)
256
+ number_str += "-#{part_val}"
257
+ end
258
+ if id.subpart
259
+ subpart_val = id.subpart.render(context: @context)
260
+ number_str += "-#{subpart_val}"
261
+ end
262
+
263
+ parts << number_str
264
+ end
265
+
266
+ result = parts.join(" ")
267
+
268
+ if id.edition&.match?(/^[a-zA-Z]$/)
269
+ result += id.edition
270
+ end
271
+
272
+ if id.date
273
+ year_val = id.date.render(context: @context)
274
+ result += ":#{year_val}"
275
+ result += "-#{format('%02d', id.month)}" if id.month
276
+ end
277
+
278
+ if id.edition && !id.edition.match?(/^[a-zA-Z]$/)
279
+ result += " v#{id.edition}"
280
+ end
281
+
282
+ if id.translation_lang
283
+ result += " (#{id.translation_lang})"
284
+ elsif id.translation_upper
285
+ result += " (#{id.translation_upper})"
286
+ end
287
+
288
+ result
289
+ end
290
+
291
+ def render_amendment(id)
292
+ if id.base_identifier
293
+ if id.amendment_year
294
+ "#{id.base_identifier}#{id.separator}A#{id.amendment_number}:#{id.amendment_year}"
295
+ elsif id.amendment_number&.match?(/^[A-Z]+$/)
296
+ "#{id.base_identifier} AMD #{id.amendment_number}"
297
+ else
298
+ "#{id.base_identifier} AMD#{id.amendment_number}"
299
+ end
300
+ elsif id.amendment_year
301
+ "#{id.separator}A#{id.amendment_number}:#{id.amendment_year}"
302
+ elsif id.amendment_number&.match?(/^[A-Z]+$/)
303
+ "AMD #{id.amendment_number}"
304
+ else
305
+ "AMD#{id.amendment_number}"
306
+ end
307
+ end
308
+
309
+ def render_british_industrial_practice(id)
310
+ result = "BIP #{id.number}"
311
+ result += ":#{id.date.render(context: @context)}" if id.date
312
+ result
313
+ end
314
+
315
+ def render_bundled_identifier(id)
316
+ return "" if id.identifiers.nil? || id.identifiers.empty?
317
+
318
+ if id.bundle_type
319
+ base_id = id.identifiers.first
320
+ parts_list = id.identifiers[1..].map do |idd|
321
+ part_val = idd.class.attributes.key?(:part) ? idd.part : nil
322
+ if part_val
323
+ pv = part_val.render(context: @context)
324
+ pv.to_s
325
+ else
326
+ idd.to_s
327
+ end
328
+ end.join(" and ")
329
+
330
+ result = "#{base_id.to_s.sub(/:.*$/, '')}:#{id.bundle_type} #{parts_list}"
331
+ result += ":#{id.common_year.render(context: @context)}" if id.common_year
332
+ return result
333
+ end
334
+
335
+ parts = []
336
+
337
+ id.identifiers.each_with_index do |idd, i|
338
+ explicit_prefix = idd.explicit_prefix
339
+ explicit_publisher = idd.explicit_publisher
340
+
341
+ if i.zero?
342
+ parts << idd.to_s
343
+ elsif explicit_publisher
344
+ parts << idd.to_s
345
+ elsif explicit_prefix
346
+ abbrev_str = ""
347
+ prefix = idd.class.attributes.key?(:prefix) ? idd.prefix : nil
348
+ if prefix && !prefix.to_s.empty?
349
+ abbrev_str = prefix.to_s
350
+ end
351
+ if idd.number
352
+ number_val = idd.number.render(context: @context)
353
+ abbrev_str += " " if !abbrev_str.empty?
354
+ abbrev_str += number_val.to_s
355
+ end
356
+ if idd.part
357
+ part_val = idd.part.render(context: @context)
358
+ abbrev_str += "-#{part_val}"
359
+ end
360
+ parts << abbrev_str
361
+ else
362
+ abbrev_str = ""
363
+ if idd.number
364
+ number_val = idd.number.render(context: @context)
365
+ abbrev_str = number_val.to_s
366
+ end
367
+ if idd.part
368
+ part_val = idd.part.render(context: @context)
369
+ abbrev_str += "-#{part_val}"
370
+ end
371
+ parts << abbrev_str
372
+ end
373
+
374
+ if i < id.identifiers.length - 1
375
+ sep = id.separators[i] || " and "
376
+ parts << sep
377
+ end
378
+ end
379
+
380
+ result = parts.join
381
+
382
+ if id.common_year && !result.match?(/:#{id.common_year.render(context: @context)}$/)
383
+ result += ":#{id.common_year.render(context: @context)}"
384
+ end
385
+
386
+ result
387
+ end
388
+
389
+ def render_committee_document(id)
390
+ year_str = if id.date
391
+ id.date.render(context: @context).to_s[-2, 2]
392
+ else
393
+ "00"
394
+ end
395
+
396
+ "#{year_str}/#{id.document_number} DC"
397
+ end
398
+
399
+ def render_consolidated_identifier(id, opts)
400
+ base_id = id.identifiers.first
401
+
402
+ base_str = base_id.to_s
403
+ result = base_str.sub(/ ExComm \(.*?\)$/, "")
404
+ .sub(/ ExComm$/, "")
405
+ .sub(/ - TC$/, "")
406
+ .sub(/ PDF$/, "")
407
+ .sub(/ \([A-Z][a-z]+\)$/, "")
408
+
409
+ id.identifiers[1..].each do |idd|
410
+ if idd.is_a?(Identifiers::Amendment)
411
+ if idd.amendment_year
412
+ sep = idd.separator || "+"
413
+ result += "#{sep}A#{idd.amendment_number}:#{idd.amendment_year}"
414
+ else
415
+ result += if idd.amendment_number&.match?(/^[A-Z]+$/)
416
+ " AMD #{idd.amendment_number}"
417
+ else
418
+ " AMD#{idd.amendment_number}"
419
+ end
420
+ end
421
+ elsif idd.is_a?(Identifiers::Corrigendum)
422
+ sep = idd.separator || "+"
423
+ result += "#{sep}C"
424
+ result += idd.corrigendum_number.to_s if idd.corrigendum_number
425
+ result += ":#{idd.corrigendum_year}" if idd.corrigendum_year
426
+ else
427
+ result += idd.to_s
428
+ end
429
+ end
430
+
431
+ if base_id.is_a?(Pubid::Identifier)
432
+ base_attrs = base_id.class.attributes
433
+ ec = base_attrs.key?(:expert_commentary) ? base_id.expert_commentary : nil
434
+ if ec
435
+ ect = base_attrs.key?(:expert_commentary_topic) ? base_id.expert_commentary_topic : nil
436
+ result += ect ? " ExComm (#{ect})" : " ExComm"
437
+ end
438
+
439
+ tc = base_attrs.key?(:tracked_changes) ? base_id.tracked_changes : nil
440
+ result += " - TC" if tc
441
+
442
+ tl = base_attrs.key?(:translation_lang) ? base_id.translation_lang : nil
443
+ if tl
444
+ ts_type = base_attrs.key?(:translation_suffix_type) ? base_id.translation_suffix_type : nil
445
+ result += if ts_type == "version"
446
+ " (#{tl} version)"
447
+ elsif ts_type == "Translation"
448
+ " (#{tl} Translation)"
449
+ else
450
+ " (#{tl})"
451
+ end
452
+ else
453
+ tu = base_attrs.key?(:translation_upper) ? base_id.translation_upper : nil
454
+ if tu
455
+ ts_type = base_attrs.key?(:translation_suffix_type) ? base_id.translation_suffix_type : nil
456
+ result += if ts_type == "Translation"
457
+ " (#{tu} Translation)"
458
+ else
459
+ " (#{tu})"
460
+ end
461
+ end
462
+ end
463
+
464
+ ry = base_attrs.key?(:reaffirmation_year) ? base_id.reaffirmation_year : nil
465
+ result += " (R#{ry})" if ry
466
+ end
467
+
468
+ result
469
+ end
470
+
471
+ def render_corrigendum(id)
472
+ result = id.base_identifier ? id.base_identifier.to_s : ""
473
+ result += "#{id.separator}C"
474
+ result += id.corrigendum_number.to_s if id.corrigendum_number
475
+ result += ":#{id.corrigendum_year}" if id.corrigendum_year
476
+ result
477
+ end
478
+
479
+ def render_detailed_specification(id)
480
+ parts = []
481
+ parts << "BS"
482
+
483
+ if id.number
484
+ number_str = id.number.render(context: @context)
485
+ parts << number_str
486
+ end
487
+
488
+ if id.spec_code
489
+ code_val = id.spec_code.render(context: @context)
490
+ result = "#{parts.join(' ')} #{code_val}"
491
+ else
492
+ result = parts.join(" ")
493
+ end
494
+
495
+ if id.date
496
+ year_val = id.date.render(context: @context)
497
+ result += ":#{year_val}"
498
+ end
499
+
500
+ result
501
+ end
502
+
503
+ def render_disc(id)
504
+ parts = []
505
+ parts << "DISC"
506
+
507
+ if id.number
508
+ number_str = id.number.render(context: @context)
509
+ if id.part
510
+ part_val = id.part.render(context: @context)
511
+ number_str += "-#{part_val.to_s.strip}"
512
+ end
513
+ parts << "PD #{number_str}"
514
+ end
515
+
516
+ result = parts.join(" ")
517
+
518
+ result += ":#{id.date}" if id.date
519
+
520
+ result
521
+ end
522
+
523
+ def render_draft_document(id)
524
+ parts = []
525
+
526
+ type_abbr = id.type&.abbr || "DD"
527
+ parts << type_abbr
528
+
529
+ if id.number
530
+ number_str = id.number.render(context: @context)
531
+
532
+ if id.part
533
+ part_val = id.part.render(context: @context)
534
+ number_str += "-#{part_val.to_s.strip}"
535
+ end
536
+ if id.subpart
537
+ subpart_val = id.subpart.render(context: @context)
538
+ number_str += "-#{subpart_val.to_s.strip}"
539
+ end
540
+
541
+ parts << number_str
542
+ end
543
+
544
+ result = parts.join(" ")
545
+
546
+ if id.date
547
+ year_val = id.date.render(context: @context)
548
+ result += ":#{year_val}"
549
+ end
550
+
551
+ result += " v#{id.edition}" if id.edition
552
+
553
+ result = render_translation(result, id)
554
+
555
+ result
556
+ end
557
+
558
+ def render_electronic_book(id)
559
+ parts = []
560
+ parts << "EP"
561
+
562
+ if id.number
563
+ number_str = id.number.render(context: @context)
564
+
565
+ if id.part
566
+ part_val = id.part.render(context: @context)
567
+ number_str += "-#{part_val.to_s.strip}"
568
+ end
569
+ if id.subpart
570
+ subpart_val = id.subpart.render(context: @context)
571
+ number_str += "-#{subpart_val.to_s.strip}"
572
+ end
573
+
574
+ parts << number_str
575
+ end
576
+
577
+ result = parts.join(" ")
578
+
579
+ if id.date
580
+ year_val = id.date.render(context: @context)
581
+ result += ":#{year_val}"
582
+ end
583
+
584
+ result += " Version #{id.edition}" if id.edition
585
+
586
+ result
587
+ end
588
+
589
+ def render_expert_commentary(id)
590
+ base_str = id.base_identifier.to_s
591
+ base_str = base_str.sub(/ (Expert Commentary|ExComm(\s*\(.*\))?)$/, "")
592
+
593
+ case id.format
594
+ when "full"
595
+ "#{base_str} Expert Commentary"
596
+ when "abbr_with_topic"
597
+ "#{base_str} ExComm (#{id.topic})"
598
+ else
599
+ "#{base_str} ExComm"
600
+ end
601
+ end
602
+
603
+ def render_explanatory_supplement(id)
604
+ parts = []
605
+ parts << "BS"
606
+
607
+ if id.number
608
+ number_str = id.number.render(context: @context)
609
+
610
+ if id.part
611
+ part_val = id.part.render(context: @context)
612
+ number_str += "-#{part_val}"
613
+ end
614
+ if id.subpart
615
+ subpart_val = id.subpart.render(context: @context)
616
+ number_str += "-#{subpart_val}"
617
+ end
618
+
619
+ parts << number_str
620
+ end
621
+
622
+ result = parts.join(" ")
623
+
624
+ if id.date
625
+ year_val = id.date.render(context: @context)
626
+ result += ":Explanatory Supplement:#{year_val}"
627
+ result += "-#{format('%02d', id.month)}" if id.month
628
+ end
629
+
630
+ result
631
+ end
632
+
633
+ def render_flex(id)
634
+ parts = []
635
+ parts << "BSI Flex"
636
+
637
+ if id.number
638
+ number_str = id.number.render(context: @context)
639
+ if id.part
640
+ part_val = id.part.render(context: @context)
641
+ number_str += "-#{part_val}"
642
+ end
643
+ if id.subpart
644
+ subpart_val = id.subpart.render(context: @context)
645
+ number_str += "-#{subpart_val}"
646
+ end
647
+ parts << number_str
648
+ end
649
+
650
+ result = parts.join(" ")
651
+
652
+ result += " v#{id.edition}" if id.edition
653
+
654
+ if id.date
655
+ year_val = id.date.render(context: @context)
656
+ result += ":#{year_val}"
657
+ result += "-#{format('%02d', id.month)}" if id.month
658
+ end
659
+
660
+ result
661
+ end
662
+
663
+ def render_handbook(id)
664
+ abbr = id.original_abbr || "Handbook"
665
+
666
+ number_str = id.number.render(context: @context)
667
+ if id.part
668
+ part_val = id.part.render(context: @context)
669
+ number_str += "-#{part_val.to_s.strip}"
670
+ end
671
+
672
+ result = "#{abbr} #{number_str}"
673
+ result += ":#{id.date.render(context: @context)}" if id.date
674
+ result
675
+ end
676
+
677
+ def render_index(id)
678
+ parts = []
679
+ parts << id.publisher.to_s if id.publisher
680
+
681
+ if id.number
682
+ number_str = id.number.render(context: @context)
683
+ parts << number_str
684
+ end
685
+
686
+ result = parts.join(" ")
687
+
688
+ if id.issue_number
689
+ result += " Index Issue #{id.issue_number}"
690
+ elsif id.index_format == "colon"
691
+ result += ":Index"
692
+ else
693
+ result += " Index"
694
+ end
695
+
696
+ if id.date
697
+ year_val = id.date.render(context: @context)
698
+ result += ":#{year_val}"
699
+ end
700
+
701
+ result
702
+ end
703
+
704
+ def render_method(id)
705
+ parts = []
706
+ parts << id.publisher.to_s if id.publisher
707
+
708
+ if id.number
709
+ number_str = id.number.render(context: @context)
710
+ if id.part
711
+ part_val = id.part.render(context: @context)
712
+ number_str += "-#{part_val}"
713
+ end
714
+ parts << number_str
715
+ end
716
+
717
+ result = parts.join(" ")
718
+
719
+ if id.method_to
720
+ result += ":Methods #{id.method_code} to #{id.method_to}"
721
+ elsif id.method_and
722
+ result += ":Methods #{id.method_code} and #{id.method_and}"
723
+ else
724
+ method_word = id.is_plural ? "Methods" : "Method"
725
+ result += ":#{method_word} #{id.method_code}"
726
+ end
727
+
728
+ if id.date
729
+ year_val = id.date.render(context: @context)
730
+ result += ":#{year_val}"
731
+ end
732
+
733
+ result
734
+ end
735
+
736
+ def render_national_annex(id)
737
+ result = "NA"
738
+
739
+ if id.na_supplements&.any?
740
+ id.na_supplements.each do |supp|
741
+ if supp.is_a?(Identifiers::Amendment)
742
+ result += "+A#{supp.amendment_number}:#{supp.amendment_year}"
743
+ elsif supp.is_a?(Identifiers::Corrigendum)
744
+ result += "+C#{supp.corrigendum_number}:#{supp.corrigendum_year}"
745
+ end
746
+ end
747
+ end
748
+
749
+ result += " to "
750
+
751
+ result += if id.base_doc
752
+ id.base_doc.to_s
753
+ else
754
+ render_single_identifier(id)
755
+ end
756
+
757
+ result
758
+ end
759
+
760
+ def render_practice_guide(id)
761
+ result = "PP #{id.number}"
762
+ result += ":#{id.date.render(context: @context)}" if id.date
763
+ result
764
+ end
765
+
766
+ def render_publicly_available_specification(id)
767
+ parts = []
768
+ type_abbr = id.type&.abbr || "PAS"
769
+ parts << type_abbr
770
+
771
+ if id.number
772
+ number_str = id.number.render(context: @context)
773
+
774
+ if id.second_number
775
+ second_val = id.second_number.render(context: @context)
776
+ number_str += "/#{second_val}"
777
+ end
778
+
779
+ if id.part
780
+ part_val = id.part.render(context: @context)
781
+ number_str += "-#{part_val.to_s.strip}"
782
+ end
783
+ if id.subpart
784
+ subpart_val = id.subpart.render(context: @context)
785
+ number_str += "-#{subpart_val.to_s.strip}"
786
+ end
787
+
788
+ parts << number_str
789
+ end
790
+
791
+ result = parts.join(" ")
792
+
793
+ if id.date
794
+ year_val = id.date.render(context: @context)
795
+ result += ":#{year_val}"
796
+ result += "-#{format('%02d', id.month)}" if id.month
797
+ end
798
+
799
+ result += " v#{id.edition}" if id.edition
800
+
801
+ result = render_translation(result, id)
802
+
803
+ result
804
+ end
805
+
806
+ def render_published_document(id)
807
+ parts = []
808
+ type_abbr = id.type&.abbr || "PD"
809
+ parts << type_abbr
810
+
811
+ if id.number
812
+ number_str = id.number.render(context: @context)
813
+
814
+ if id.second_number
815
+ second_val = id.second_number.render(context: @context)
816
+ number_str += "/#{second_val}"
817
+ end
818
+
819
+ if id.part
820
+ part_val = id.part.render(context: @context)
821
+ number_str += "-#{part_val.to_s.strip}"
822
+ end
823
+ if id.subpart
824
+ subpart_val = id.subpart.render(context: @context)
825
+ number_str += "-#{subpart_val.to_s.strip}"
826
+ end
827
+
828
+ parts << number_str
829
+ end
830
+
831
+ result = parts.join(" ")
832
+
833
+ if id.date
834
+ year_val = id.date.render(context: @context)
835
+ result += ":#{year_val}"
836
+ result += "-#{format('%02d', id.month)}" if id.month
837
+ end
838
+
839
+ result += " v#{id.edition}" if id.edition
840
+
841
+ result = render_translation(result, id)
842
+
843
+ result
844
+ end
845
+
846
+ def render_section(id)
847
+ parts = []
848
+ parts << id.publisher.to_s if id.publisher
849
+
850
+ if id.number
851
+ number_str = id.number.render(context: @context)
852
+ parts << number_str
853
+ end
854
+
855
+ result = parts.join(" ")
856
+
857
+ if id.section_format == "colon"
858
+ result += ":Section #{id.section_id}"
859
+ else
860
+ result += " Section #{id.section_id}"
861
+ end
862
+
863
+ if id.date
864
+ year_val = id.date.render(context: @context)
865
+ result += ":#{year_val}"
866
+ end
867
+
868
+ result
869
+ end
870
+
871
+ def render_set(id)
872
+ return "" if id.identifiers.nil? || id.identifiers.empty?
873
+
874
+ parts = []
875
+ id.identifiers.each_with_index do |idd, i|
876
+ parts << idd.to_s
877
+ if i < id.identifiers.length - 1
878
+ parts << " + "
879
+ end
880
+ end
881
+
882
+ parts.join
883
+ end
884
+
885
+ def render_standalone_amendment(id)
886
+ base = if id.corrigendum
887
+ "AMD Corrigendum #{id.amendment_number}"
888
+ else
889
+ "AMD #{id.amendment_number}"
890
+ end
891
+
892
+ id.parenthesized ? "(#{base})" : base
893
+ end
894
+
895
+ def render_supplement_document(id)
896
+ base_str = id.base_identifier.to_s
897
+
898
+ if id.reverse_format
899
+ supplement_str = if id.supplement_type == "No."
900
+ "Supplement No. #{id.supplement_number} (#{id.supplement_year})"
901
+ else
902
+ "Supplement #{id.supplement_number} (#{id.supplement_year})"
903
+ end
904
+ "#{supplement_str} to #{base_str}"
905
+ else
906
+ supplement_str = if id.supplement_type == "No."
907
+ "#{id.separator}Supplement No. #{id.supplement_number}:#{id.supplement_year}"
908
+ else
909
+ "#{id.separator}Supplement #{id.supplement_number}:#{id.supplement_year}"
910
+ end
911
+ "#{base_str}#{supplement_str}"
912
+ end
913
+ end
914
+
915
+ def render_supplementary_index(id)
916
+ parts = []
917
+ parts << "BS"
918
+
919
+ if id.number
920
+ number_str = id.number.render(context: @context)
921
+
922
+ if id.part
923
+ part_val = id.part.render(context: @context)
924
+ number_str += "-#{part_val}"
925
+ end
926
+ if id.subpart
927
+ subpart_val = id.subpart.render(context: @context)
928
+ number_str += "-#{subpart_val}"
929
+ end
930
+
931
+ parts << number_str
932
+ end
933
+
934
+ result = parts.join(" ")
935
+
936
+ if id.date
937
+ year_val = id.date.render(context: @context)
938
+ result += " Supplementary Index:#{year_val}"
939
+ result += "-#{format('%02d', id.month)}" if id.month
940
+ end
941
+
942
+ result
943
+ end
944
+
945
+ def render_technical_specification(id)
946
+ parts = []
947
+ parts << "TS"
948
+
949
+ if id.number
950
+ number_str = id.number.render(context: @context)
951
+
952
+ if id.part
953
+ part_val = id.part.render(context: @context)
954
+ number_str += "-#{part_val}"
955
+ end
956
+ if id.subpart
957
+ subpart_val = id.subpart.render(context: @context)
958
+ number_str += "-#{subpart_val}"
959
+ end
960
+
961
+ parts << number_str
962
+ end
963
+
964
+ result = parts.join(" ")
965
+
966
+ if id.date
967
+ year_val = id.date.render(context: @context)
968
+ result += ":#{year_val}"
969
+ result += "-#{format('%02d', id.month)}" if id.month
970
+ end
971
+
972
+ result
973
+ end
974
+
975
+ def render_test_method(id)
976
+ parts = []
977
+ parts << "BS"
978
+
979
+ if id.number
980
+ number_str = id.number.render(context: @context)
981
+ parts << number_str
982
+ end
983
+
984
+ result = parts.join(" ")
985
+
986
+ if id.test_series && id.test_id
987
+ result += ":#{id.test_series}:#{id.test_id}"
988
+ end
989
+
990
+ if id.date
991
+ year_val = id.date.render(context: @context)
992
+ result += ":#{year_val}"
993
+ end
994
+
995
+ result
996
+ end
997
+
998
+ def render_value_added_publication(id, opts)
999
+ base_str = id.base_identifier.to_s(**opts)
1000
+
1001
+ case id.format
1002
+ when "TC"
1003
+ "#{base_str} - TC"
1004
+ when "PDF"
1005
+ "#{base_str} PDF"
1006
+ when "BOOK"
1007
+ "#{base_str} BOOK"
1008
+ else
1009
+ base_str
1010
+ end
1011
+ end
1012
+
1013
+ # ------------------------------------------------------------------
1014
+ # Shared helpers
1015
+ # ------------------------------------------------------------------
1016
+
1017
+ def render_translation(result, id)
1018
+ if id.translation_lang
1019
+ suffix_type = id.translation_suffix_type if id.class.attributes.key?(:translation_suffix_type)
1020
+ result += if suffix_type == "version"
1021
+ " (#{id.translation_lang} version)"
1022
+ elsif suffix_type == "Translation"
1023
+ " (#{id.translation_lang} Translation)"
1024
+ else
1025
+ " (#{id.translation_lang})"
1026
+ end
1027
+ elsif id.translation_upper
1028
+ suffix_type = id.translation_suffix_type if id.class.attributes.key?(:translation_suffix_type)
1029
+ result += if suffix_type == "Translation"
1030
+ " (#{id.translation_upper} Translation)"
1031
+ else
1032
+ " (#{id.translation_upper})"
1033
+ end
1034
+ end
1035
+ result
1036
+ end
1037
+
1038
+ def render_expert_commentary_suffix(result, id)
1039
+ if id.expert_commentary
1040
+ if id.expert_commentary_topic
1041
+ result += " ExComm (#{id.expert_commentary_topic})"
1042
+ else
1043
+ result += " ExComm"
1044
+ end
1045
+ end
1046
+ result
1047
+ end
1048
+ end
1049
+ end
1050
+ end