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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +5 -1
  3. data/data/nist/update_codes.yaml +25 -0
  4. data/lib/pubid/amca/builder.rb +2 -2
  5. data/lib/pubid/amca/identifier.rb +4 -55
  6. data/lib/pubid/amca/identifiers/base.rb +58 -47
  7. data/lib/pubid/amca/identifiers/interpretation.rb +0 -21
  8. data/lib/pubid/amca/identifiers/publication.rb +0 -17
  9. data/lib/pubid/amca/identifiers/standard.rb +0 -4
  10. data/lib/pubid/amca/renderer.rb +82 -0
  11. data/lib/pubid/amca/single_identifier.rb +0 -23
  12. data/lib/pubid/amca/urn_generator.rb +2 -1
  13. data/lib/pubid/amca/urn_parser.rb +28 -0
  14. data/lib/pubid/amca.rb +42 -1
  15. data/lib/pubid/ansi/builder.rb +5 -3
  16. data/lib/pubid/ansi/identifier.rb +1 -43
  17. data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
  18. data/lib/pubid/ansi/identifiers/standard.rb +2 -3
  19. data/lib/pubid/ansi/renderer.rb +53 -0
  20. data/lib/pubid/ansi/single_identifier.rb +2 -31
  21. data/lib/pubid/ansi/urn_generator.rb +3 -38
  22. data/lib/pubid/ansi/urn_parser.rb +23 -0
  23. data/lib/pubid/ansi.rb +38 -3
  24. data/lib/pubid/api/builder.rb +33 -74
  25. data/lib/pubid/api/identifier.rb +5 -52
  26. data/lib/pubid/api/identifiers/base.rb +2 -14
  27. data/lib/pubid/api/identifiers/bulletin.rb +0 -2
  28. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
  29. data/lib/pubid/api/identifiers/mpms.rb +0 -20
  30. data/lib/pubid/api/identifiers/publication.rb +0 -2
  31. data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
  32. data/lib/pubid/api/identifiers/specification.rb +0 -2
  33. data/lib/pubid/api/identifiers/standard.rb +0 -2
  34. data/lib/pubid/api/identifiers/technical_report.rb +0 -2
  35. data/lib/pubid/api/identifiers/typeless_standard.rb +0 -16
  36. data/lib/pubid/api/identifiers.rb +18 -0
  37. data/lib/pubid/api/renderer.rb +89 -0
  38. data/lib/pubid/api/single_identifier.rb +5 -20
  39. data/lib/pubid/api/urn_generator.rb +0 -18
  40. data/lib/pubid/api/urn_parser.rb +35 -0
  41. data/lib/pubid/api.rb +51 -5
  42. data/lib/pubid/ashrae/builder.rb +3 -3
  43. data/lib/pubid/ashrae/identifier.rb +7 -55
  44. data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
  45. data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
  46. data/lib/pubid/ashrae/identifiers/base.rb +29 -15
  47. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
  48. data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
  49. data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
  50. data/lib/pubid/ashrae/parser.rb +4 -0
  51. data/lib/pubid/ashrae/renderer.rb +117 -0
  52. data/lib/pubid/ashrae/single_identifier.rb +0 -13
  53. data/lib/pubid/ashrae/urn_generator.rb +0 -8
  54. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  55. data/lib/pubid/ashrae.rb +46 -1
  56. data/lib/pubid/asme/components/code.rb +10 -2
  57. data/lib/pubid/asme/identifier.rb +0 -46
  58. data/lib/pubid/asme/identifiers/base.rb +0 -60
  59. data/lib/pubid/asme/renderer.rb +66 -0
  60. data/lib/pubid/asme/single_identifier.rb +3 -1
  61. data/lib/pubid/asme/urn_parser.rb +31 -0
  62. data/lib/pubid/asme.rb +42 -1
  63. data/lib/pubid/astm/components/code.rb +9 -0
  64. data/lib/pubid/{jis → astm}/components.rb +1 -1
  65. data/lib/pubid/astm/identifier.rb +0 -77
  66. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  67. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  68. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  69. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  70. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  71. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  72. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  73. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  74. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  75. data/lib/pubid/astm/identifiers.rb +18 -0
  76. data/lib/pubid/astm/renderer.rb +172 -0
  77. data/lib/pubid/astm/single_identifier.rb +3 -11
  78. data/lib/pubid/astm/urn_parser.rb +30 -0
  79. data/lib/pubid/astm.rb +39 -27
  80. data/lib/pubid/bsi/builder.rb +21 -12
  81. data/lib/pubid/bsi/identifier.rb +5 -85
  82. data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -36
  83. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +8 -48
  84. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +8 -39
  85. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +2 -55
  86. data/lib/pubid/bsi/identifiers/amendment.rb +2 -22
  87. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +1 -6
  88. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  89. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -87
  90. data/lib/pubid/bsi/identifiers/committee_document.rb +0 -16
  91. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -87
  92. data/lib/pubid/bsi/identifiers/corrigendum.rb +2 -10
  93. data/lib/pubid/bsi/identifiers/detailed_specification.rb +0 -36
  94. data/lib/pubid/bsi/identifiers/disc.rb +0 -29
  95. data/lib/pubid/bsi/identifiers/draft_document.rb +2 -46
  96. data/lib/pubid/bsi/identifiers/electronic_book.rb +2 -38
  97. data/lib/pubid/bsi/identifiers/expert_commentary.rb +2 -18
  98. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +0 -47
  99. data/lib/pubid/bsi/identifiers/flex.rb +0 -35
  100. data/lib/pubid/bsi/identifiers/handbook.rb +1 -15
  101. data/lib/pubid/bsi/identifiers/index.rb +0 -32
  102. data/lib/pubid/bsi/identifiers/method.rb +0 -41
  103. data/lib/pubid/bsi/identifiers/national_annex.rb +4 -29
  104. data/lib/pubid/bsi/identifiers/practice_guide.rb +1 -6
  105. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +2 -54
  106. data/lib/pubid/bsi/identifiers/published_document.rb +2 -54
  107. data/lib/pubid/bsi/identifiers/section.rb +0 -30
  108. data/lib/pubid/bsi/identifiers/set.rb +3 -20
  109. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +0 -9
  110. data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -24
  111. data/lib/pubid/bsi/identifiers/supplementary_index.rb +0 -46
  112. data/lib/pubid/bsi/identifiers/technical_specification.rb +2 -47
  113. data/lib/pubid/bsi/identifiers/test_method.rb +0 -32
  114. data/lib/pubid/bsi/identifiers/value_added_publication.rb +2 -17
  115. data/lib/pubid/bsi/identifiers.rb +0 -1
  116. data/lib/pubid/bsi/renderer.rb +1050 -0
  117. data/lib/pubid/bsi/single_identifier.rb +33 -78
  118. data/lib/pubid/bsi/urn_generator.rb +2 -3
  119. data/lib/pubid/bsi/urn_parser.rb +52 -0
  120. data/lib/pubid/bsi.rb +232 -2
  121. data/lib/pubid/builder/base.rb +57 -10
  122. data/lib/pubid/bundled_identifier.rb +0 -1
  123. data/lib/pubid/ccsds/builder.rb +4 -3
  124. data/lib/pubid/ccsds/identifier.rb +53 -68
  125. data/lib/pubid/ccsds/identifiers/base.rb +11 -61
  126. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  127. data/lib/pubid/ccsds/parser.rb +4 -2
  128. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  129. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  130. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  131. data/lib/pubid/ccsds.rb +39 -1
  132. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  133. data/lib/pubid/cen_cenelec/identifier.rb +11 -40
  134. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +9 -4
  135. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +0 -10
  136. data/lib/pubid/cen_cenelec/identifiers/base.rb +2 -45
  137. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  138. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  139. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +0 -27
  140. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +0 -15
  141. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +2 -8
  143. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  144. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +0 -4
  145. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  146. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  147. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  148. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  149. data/lib/pubid/cen_cenelec/single_identifier.rb +9 -90
  150. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  151. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  152. data/lib/pubid/cen_cenelec.rb +172 -1
  153. data/lib/pubid/cie/components/code.rb +8 -0
  154. data/lib/pubid/cie/identifier.rb +10 -57
  155. data/lib/pubid/cie/single_identifier.rb +4 -4
  156. data/lib/pubid/cie/urn_parser.rb +28 -0
  157. data/lib/pubid/cie.rb +47 -1
  158. data/lib/pubid/components/adoption.rb +104 -0
  159. data/lib/pubid/components/code.rb +22 -8
  160. data/lib/pubid/components/date.rb +23 -16
  161. data/lib/pubid/components/edition.rb +9 -6
  162. data/lib/pubid/components/iteration.rb +32 -0
  163. data/lib/pubid/components/language.rb +6 -4
  164. data/lib/pubid/components/locality.rb +10 -1
  165. data/lib/pubid/components/publisher.rb +9 -6
  166. data/lib/pubid/components/relationship.rb +151 -0
  167. data/lib/pubid/components/stage.rb +5 -14
  168. data/lib/pubid/components/supplement.rb +184 -0
  169. data/lib/pubid/components/type.rb +5 -15
  170. data/lib/pubid/components/typed_stage.rb +10 -11
  171. data/lib/pubid/components.rb +4 -1
  172. data/lib/pubid/core/update_codes.rb +28 -7
  173. data/lib/pubid/csa/identifier.rb +9 -59
  174. data/lib/pubid/csa/identifiers/base.rb +0 -123
  175. data/lib/pubid/csa/identifiers/cec.rb +0 -103
  176. data/lib/pubid/csa/identifiers/series.rb +0 -104
  177. data/lib/pubid/csa/renderer.rb +292 -0
  178. data/lib/pubid/csa/single_identifier.rb +1 -1
  179. data/lib/pubid/csa/urn_generator.rb +1 -1
  180. data/lib/pubid/csa/urn_parser.rb +33 -0
  181. data/lib/pubid/csa.rb +46 -1
  182. data/lib/pubid/etsi/components/code.rb +10 -9
  183. data/lib/pubid/etsi/components/version.rb +0 -5
  184. data/lib/pubid/etsi/identifier.rb +4 -55
  185. data/lib/pubid/etsi/identifiers/base.rb +31 -27
  186. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +1 -11
  187. data/lib/pubid/etsi/renderer.rb +42 -0
  188. data/lib/pubid/etsi/urn_parser.rb +34 -0
  189. data/lib/pubid/etsi.rb +44 -1
  190. data/lib/pubid/export/exporter.rb +4 -46
  191. data/lib/pubid/export/flavor_exporter.rb +111 -278
  192. data/lib/pubid/export.rb +0 -6
  193. data/lib/pubid/identifier.rb +92 -18
  194. data/lib/pubid/identifier_metadata.rb +1 -1
  195. data/lib/pubid/idf/builder.rb +3 -3
  196. data/lib/pubid/idf/identifier.rb +7 -66
  197. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  198. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  199. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  200. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  201. data/lib/pubid/idf/parser.rb +3 -2
  202. data/lib/pubid/idf/renderer.rb +84 -0
  203. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  204. data/lib/pubid/idf/urn_generator.rb +4 -39
  205. data/lib/pubid/idf/urn_parser.rb +25 -0
  206. data/lib/pubid/idf.rb +55 -1
  207. data/lib/pubid/iec/builder.rb +46 -64
  208. data/lib/pubid/iec/components/code.rb +8 -32
  209. data/lib/pubid/iec/components/publisher.rb +0 -1
  210. data/lib/pubid/iec/components.rb +14 -0
  211. data/lib/pubid/iec/identifier.rb +251 -213
  212. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  213. data/lib/pubid/iec/identifiers/base.rb +5 -33
  214. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  215. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  216. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +23 -26
  217. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  218. data/lib/pubid/iec/identifiers/fragment_identifier.rb +35 -24
  219. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  220. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  221. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  222. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  223. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  224. data/lib/pubid/iec/identifiers/sheet_identifier.rb +17 -11
  225. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  226. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  227. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  228. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  229. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  230. data/lib/pubid/iec/identifiers/test_report_form.rb +3 -35
  231. data/lib/pubid/iec/identifiers/vap_identifier.rb +24 -21
  232. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  233. data/lib/pubid/iec/identifiers/working_document.rb +2 -50
  234. data/lib/pubid/iec/identifiers.rb +30 -0
  235. data/lib/pubid/iec/parser.rb +13 -12
  236. data/lib/pubid/iec/renderer.rb +254 -0
  237. data/lib/pubid/iec/single_identifier.rb +6 -12
  238. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  239. data/lib/pubid/iec/urn_generator.rb +3 -3
  240. data/lib/pubid/iec/urn_parser.rb +3 -3
  241. data/lib/pubid/iec.rb +43 -67
  242. data/lib/pubid/ieee/builder.rb +12 -12
  243. data/lib/pubid/ieee/components/code.rb +8 -0
  244. data/lib/pubid/ieee/components/draft.rb +14 -0
  245. data/lib/pubid/ieee/components/relationship.rb +5 -149
  246. data/lib/pubid/ieee/identifier.rb +5 -52
  247. data/lib/pubid/ieee/identifiers/adopted_standard.rb +0 -9
  248. data/lib/pubid/ieee/identifiers/base.rb +221 -556
  249. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +0 -10
  250. data/lib/pubid/ieee/identifiers/corrigendum.rb +0 -12
  251. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +0 -10
  252. data/lib/pubid/ieee/identifiers/dual_identifier.rb +0 -4
  253. data/lib/pubid/ieee/identifiers/dual_published.rb +0 -4
  254. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +0 -9
  255. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +0 -10
  256. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  257. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +0 -18
  258. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +0 -6
  259. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  260. data/lib/pubid/ieee/identifiers/redlined_standard.rb +0 -7
  261. data/lib/pubid/ieee/identifiers/si_standard.rb +0 -38
  262. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  263. data/lib/pubid/ieee/pre_parser.rb +301 -0
  264. data/lib/pubid/ieee/renderer.rb +307 -0
  265. data/lib/pubid/ieee/urn_parser.rb +34 -0
  266. data/lib/pubid/ieee.rb +66 -1
  267. data/lib/pubid/ieee_debug.rb +0 -1
  268. data/lib/pubid/iho/builder.rb +2 -2
  269. data/lib/pubid/iho/identifier.rb +7 -59
  270. data/lib/pubid/iho/identifiers/base.rb +64 -31
  271. data/lib/pubid/iho/parser.rb +3 -3
  272. data/lib/pubid/iho/renderer.rb +30 -0
  273. data/lib/pubid/iho/urn_generator.rb +2 -2
  274. data/lib/pubid/iho/urn_parser.rb +58 -0
  275. data/lib/pubid/iho.rb +52 -1
  276. data/lib/pubid/iso/builder.rb +55 -53
  277. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  278. data/lib/pubid/iso/components/code.rb +7 -19
  279. data/lib/pubid/iso/components/publisher.rb +10 -8
  280. data/lib/pubid/iso/components.rb +2 -4
  281. data/lib/pubid/iso/identifier.rb +219 -252
  282. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  283. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  284. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  285. data/lib/pubid/iso/identifiers/data.rb +0 -1
  286. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  287. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  288. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  289. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  290. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  291. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  292. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  293. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  294. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  295. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  296. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  297. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  298. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  299. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  300. data/lib/pubid/iso/identifiers.rb +0 -1
  301. data/lib/pubid/iso/normalizer.rb +89 -0
  302. data/lib/pubid/iso/parser.rb +22 -4
  303. data/lib/pubid/iso/single_identifier.rb +0 -4
  304. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  305. data/lib/pubid/iso/urn_generator.rb +66 -182
  306. data/lib/pubid/iso/urn_parser.rb +12 -7
  307. data/lib/pubid/iso.rb +177 -2
  308. data/lib/pubid/itu/builder.rb +0 -12
  309. data/lib/pubid/itu/components/code.rb +9 -7
  310. data/lib/pubid/itu/components/sector.rb +15 -4
  311. data/lib/pubid/itu/components/series.rb +0 -4
  312. data/lib/pubid/itu/components.rb +11 -0
  313. data/lib/pubid/itu/identifier.rb +4 -116
  314. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  315. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  316. data/lib/pubid/itu/identifiers/base.rb +124 -128
  317. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  318. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  319. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  320. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  321. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  322. data/lib/pubid/itu/urn_parser.rb +23 -0
  323. data/lib/pubid/itu.rb +44 -1
  324. data/lib/pubid/jcgm/builder.rb +16 -8
  325. data/lib/pubid/jcgm/identifier.rb +0 -43
  326. data/lib/pubid/jcgm/identifiers/amendment.rb +0 -9
  327. data/lib/pubid/jcgm/identifiers/gum_guide.rb +0 -12
  328. data/lib/pubid/jcgm/renderer.rb +68 -0
  329. data/lib/pubid/jcgm/single_identifier.rb +0 -8
  330. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  331. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  332. data/lib/pubid/jcgm.rb +43 -2
  333. data/lib/pubid/jis/builder.rb +44 -52
  334. data/lib/pubid/jis/identifier.rb +120 -46
  335. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  336. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  337. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  338. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  339. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  340. data/lib/pubid/jis/identifiers.rb +1 -1
  341. data/lib/pubid/jis/parser.rb +31 -5
  342. data/lib/pubid/jis/renderer.rb +69 -0
  343. data/lib/pubid/jis/single_identifier.rb +6 -12
  344. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  345. data/lib/pubid/jis/urn_parser.rb +23 -0
  346. data/lib/pubid/jis.rb +42 -2
  347. data/lib/pubid/nist/builder.rb +63 -1871
  348. data/lib/pubid/nist/caster.rb +1272 -0
  349. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  350. data/lib/pubid/nist/components/code.rb +9 -20
  351. data/lib/pubid/nist/components/supplement.rb +2 -2
  352. data/lib/pubid/nist/components.rb +0 -1
  353. data/lib/pubid/nist/identifier.rb +8 -60
  354. data/lib/pubid/nist/identifiers/base.rb +564 -492
  355. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  356. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -1
  357. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  358. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  359. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  360. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -8
  361. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  362. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +15 -24
  363. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  364. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  365. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  366. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  367. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  368. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  369. data/lib/pubid/nist/identifiers/report.rb +4 -2
  370. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  371. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  372. data/lib/pubid/nist/identifiers.rb +1 -0
  373. data/lib/pubid/nist/parser.rb +62 -452
  374. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  375. data/lib/pubid/nist/preprocessor.rb +428 -0
  376. data/lib/pubid/nist/renderer.rb +43 -0
  377. data/lib/pubid/nist/router.rb +148 -0
  378. data/lib/pubid/nist/series/base.rb +58 -0
  379. data/lib/pubid/nist/series/crpl.rb +13 -0
  380. data/lib/pubid/nist/series/fips.rb +14 -0
  381. data/lib/pubid/nist/series/ir.rb +60 -0
  382. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  383. data/lib/pubid/nist/series/mono.rb +19 -0
  384. data/lib/pubid/nist/series/ncstar.rb +20 -0
  385. data/lib/pubid/nist/series.rb +49 -0
  386. data/lib/pubid/nist/supplement_identifier.rb +3 -1
  387. data/lib/pubid/nist/urn_parser.rb +67 -0
  388. data/lib/pubid/nist.rb +86 -4
  389. data/lib/pubid/oiml/builder.rb +21 -3
  390. data/lib/pubid/oiml/components/code.rb +17 -0
  391. data/lib/pubid/oiml/identifier.rb +40 -46
  392. data/lib/pubid/oiml/identifiers/annex.rb +13 -46
  393. data/lib/pubid/oiml/identifiers/errata.rb +15 -0
  394. data/lib/pubid/oiml/identifiers.rb +1 -1
  395. data/lib/pubid/oiml/parser.rb +59 -12
  396. data/lib/pubid/oiml/renderer.rb +171 -0
  397. data/lib/pubid/oiml/single_identifier.rb +61 -42
  398. data/lib/pubid/oiml/supplement_identifier.rb +31 -17
  399. data/lib/pubid/oiml/urn_generator.rb +0 -8
  400. data/lib/pubid/oiml/urn_parser.rb +22 -0
  401. data/lib/pubid/oiml.rb +42 -1
  402. data/lib/pubid/plateau/identifier.rb +4 -55
  403. data/lib/pubid/plateau/identifiers/base.rb +45 -36
  404. data/lib/pubid/plateau/identifiers/handbook.rb +0 -6
  405. data/lib/pubid/plateau/identifiers/technical_report.rb +0 -4
  406. data/lib/pubid/plateau/renderer.rb +51 -0
  407. data/lib/pubid/plateau/supplement_identifier.rb +0 -4
  408. data/lib/pubid/plateau/urn_parser.rb +43 -0
  409. data/lib/pubid/plateau.rb +43 -1
  410. data/lib/pubid/renderers/directives_renderer.rb +22 -8
  411. data/lib/pubid/renderers/guide_renderer.rb +4 -2
  412. data/lib/pubid/renderers/human_readable.rb +18 -7
  413. data/lib/pubid/rendering/context.rb +28 -19
  414. data/lib/pubid/rendering.rb +0 -3
  415. data/lib/pubid/sae/components/date.rb +8 -0
  416. data/lib/pubid/sae/components/type.rb +5 -1
  417. data/lib/pubid/sae/identifier.rb +4 -35
  418. data/lib/pubid/sae/identifiers/base.rb +26 -31
  419. data/lib/pubid/sae/renderer.rb +36 -0
  420. data/lib/pubid/sae/urn_generator.rb +2 -10
  421. data/lib/pubid/sae/urn_parser.rb +36 -0
  422. data/lib/pubid/sae.rb +42 -1
  423. data/lib/pubid/urn_generator/base.rb +12 -12
  424. data/lib/pubid/urn_parser/base.rb +81 -0
  425. data/lib/pubid/urn_parser/errors.rb +9 -0
  426. data/lib/pubid/urn_parser.rb +14 -0
  427. data/lib/pubid/version.rb +1 -1
  428. data/lib/pubid.rb +45 -7
  429. data/lib/tasks/export.rake +6 -5
  430. data/lib/tasks/website-data.json +1940 -1882
  431. metadata +75 -45
  432. data/lib/pubid/amca/scheme.rb +0 -16
  433. data/lib/pubid/ansi/scheme.rb +0 -15
  434. data/lib/pubid/api/scheme.rb +0 -66
  435. data/lib/pubid/ashrae/scheme.rb +0 -53
  436. data/lib/pubid/asme/scheme.rb +0 -37
  437. data/lib/pubid/astm/scheme.rb +0 -55
  438. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  439. data/lib/pubid/bsi/scheme.rb +0 -243
  440. data/lib/pubid/ccsds/scheme.rb +0 -57
  441. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  442. data/lib/pubid/cie/scheme.rb +0 -64
  443. data/lib/pubid/components/factory.rb +0 -50
  444. data/lib/pubid/csa/scheme.rb +0 -44
  445. data/lib/pubid/etsi/scheme.rb +0 -42
  446. data/lib/pubid/export/data_class_exporter.rb +0 -59
  447. data/lib/pubid/export/ieee_exporter.rb +0 -78
  448. data/lib/pubid/export/itu_exporter.rb +0 -66
  449. data/lib/pubid/export/nist_exporter.rb +0 -64
  450. data/lib/pubid/export/registry_exporter.rb +0 -90
  451. data/lib/pubid/export/scheme_exporter.rb +0 -70
  452. data/lib/pubid/identifier_registry.rb +0 -198
  453. data/lib/pubid/idf/scheme.rb +0 -61
  454. data/lib/pubid/iec/scheme.rb +0 -71
  455. data/lib/pubid/ieee/scheme.rb +0 -90
  456. data/lib/pubid/iho/scheme.rb +0 -29
  457. data/lib/pubid/iso/identifiers/base.rb +0 -115
  458. data/lib/pubid/iso/scheme.rb +0 -193
  459. data/lib/pubid/itu/scheme.rb +0 -174
  460. data/lib/pubid/jcgm/scheme.rb +0 -60
  461. data/lib/pubid/jis/components/code.rb +0 -59
  462. data/lib/pubid/jis/identifiers/base.rb +0 -72
  463. data/lib/pubid/jis/scheme.rb +0 -49
  464. data/lib/pubid/nist/components/publisher.rb +0 -24
  465. data/lib/pubid/nist/scheme.rb +0 -199
  466. data/lib/pubid/oiml/identifiers/base.rb +0 -36
  467. data/lib/pubid/oiml/scheme.rb +0 -46
  468. data/lib/pubid/plateau/scheme.rb +0 -45
  469. data/lib/pubid/rendering/base.rb +0 -73
  470. data/lib/pubid/rendering/common.rb +0 -211
  471. data/lib/pubid/rendering/format.rb +0 -25
  472. data/lib/pubid/sae/scheme.rb +0 -47
  473. data/lib/pubid/scheme.rb +0 -219
@@ -15,18 +15,24 @@ module Pubid
15
15
  #
16
16
  # Format in YAML files:
17
17
  # plain string match: "IEC 60285-/1:1989" → "IEC 60285-1:1989"
18
- # regex match: "/^NBS CIRC sup$/" → "NBS CIRC 24e7sup"
18
+ # regex match: "/^NBS CIRC sup$/" → "NBS CIRC 24e7sup"
19
+ # regex with flags: "/^nbs\\b/i" → "NBS"
19
20
  #
20
21
  # Plain strings use full-line anchoring (^pattern$).
21
- # Regex patterns are wrapped in /.../ slashes.
22
+ # Regex patterns are wrapped in /.../ slashes with optional trailing flags
23
+ # (i = IGNORECASE, m = MULTILINE, x = EXTENDED) and applied via gsub.
22
24
  class UpdateCodes
23
25
  DATA_DIR = Pathname.new(__dir__).join("../../../data").expand_path
24
26
 
27
+ # Regex literal: /body/flags where flags is optional (i, m, x).
28
+ REGEX_LITERAL = %r{\A/(.*)/([imx]*)\z}m
29
+
25
30
  class << self
26
31
  # Apply update_codes substitutions for the given flavor.
27
32
  #
28
33
  # @param code [String] identifier string to normalize
29
- # @param flavor [Symbol, String] flavor name (e.g., :iso, :iec, :ieee, :nist)
34
+ # @param flavor [Symbol, String] flavor name
35
+ # (e.g., :iso, :iec, :ieee, :nist)
30
36
  # @return [String] normalized identifier string
31
37
  #
32
38
  # @example
@@ -37,9 +43,7 @@ module Pubid
37
43
  return code if codes.nil? || codes.empty?
38
44
 
39
45
  codes.each do |from, to|
40
- code = code.gsub(
41
- from.match?(%r{^/.*/$}) ? Regexp.new(from[1..-2]) : /^#{Regexp.escape(from)}$/, to
42
- )
46
+ code = code.gsub(compile_pattern(from), to.to_s)
43
47
  end
44
48
  code
45
49
  end
@@ -56,13 +60,30 @@ module Pubid
56
60
 
57
61
  # Available flavors that have update_codes files.
58
62
  #
59
- # @return [Array<Symbol>] list of flavors with data/{flavor}/update_codes.yaml
63
+ # @return [Array<Symbol>] flavors with data/{flavor}/update_codes.yaml
60
64
  def flavors
61
65
  @flavors ||= DATA_DIR.children.select(&:directory?).map do |dir|
62
66
  dir.basename.to_s.to_sym
63
67
  end.select { |f| (DATA_DIR / f.to_s / "update_codes.yaml").exist? }
64
68
  end
65
69
 
70
+ # Compile a YAML key into a Regexp. Plain strings are anchored to the
71
+ # full line; regex literals support optional trailing flags.
72
+ def compile_pattern(from)
73
+ match = from.to_s.match(REGEX_LITERAL)
74
+ return /^#{Regexp.escape(from.to_s)}$/ unless match
75
+
76
+ Regexp.new(match[1], compile_options(match[2]))
77
+ end
78
+
79
+ def compile_options(flags)
80
+ options = 0
81
+ options |= Regexp::IGNORECASE if flags.include?("i")
82
+ options |= Regexp::MULTILINE if flags.include?("m")
83
+ options |= Regexp::EXTENDED if flags.include?("x")
84
+ options
85
+ end
86
+
66
87
  private
67
88
 
68
89
  def load_yaml(flavor)
@@ -2,64 +2,17 @@
2
2
 
3
3
  module Pubid
4
4
  module Csa
5
- class Identifier
6
- # Factory that builds a CSA identifier from a hash of primitives.
7
- # Default is {Identifiers::Standard}.
8
- TYPE_KEY_TO_KLASS = {
9
- standard: "Standard",
10
- bundled: "Bundled",
11
- canadian_adopted: "CanadianAdopted",
12
- cec: "Cec",
13
- combined: "Combined",
14
- csa_adopted: "CsaAdopted",
15
- package: "Package",
16
- series: "Series",
17
- }.freeze
18
-
19
- def self.create(type: nil, **opts)
20
- klass = resolve_create_class(type)
21
- klass.new(**coerce_create_attrs(opts, klass: klass))
22
- end
23
-
24
- def self.resolve_create_class(type)
25
- return Identifiers::Standard if type.nil?
26
-
27
- klass_name = TYPE_KEY_TO_KLASS[type.to_sym]
28
- raise ArgumentError, "Unknown CSA type: #{type.inspect}" unless klass_name
29
-
30
- Identifiers.const_get(klass_name)
31
- end
32
-
33
- def self.coerce_create_attrs(opts, klass:)
34
- attrs = {}
35
-
36
- if (v = opts[:code] || opts[:number])
37
- attrs[:code] = Pubid::Components::Code.new(value: v.to_s)
38
- end
39
-
40
- if opts[:year]
41
- year_str = opts[:year].to_s
42
- attrs[:year] = year_str
43
- # Preserve 4-digit year rendering (e.g. "B51:2024") rather than
44
- # collapsing to "B51:24".
45
- attrs[:original_year_4digit] = year_str.length == 4 unless opts.key?(:original_year_4digit)
5
+ # Common base class for all CSA identifiers. SingleIdentifier (and the
6
+ # concrete Identifiers::* types through it) descends from it, so every CSA
7
+ # identifier is `is_a?(Pubid::Csa::Identifier)` natively and gets the shared
8
+ # polymorphic `from_hash`. (The Wrapper/Composite container models are
9
+ # separate Lutaml::Model types, not identifiers.)
10
+ class Identifier < ::Pubid::Identifier
11
+ def self.parse(input)
12
+ if input.length > Pubid::MAX_INPUT_LENGTH
13
+ raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
46
14
  end
47
- attrs[:original_year_4digit] = opts[:original_year_4digit] if opts.key?(:original_year_4digit)
48
- attrs[:year_format] = opts[:year_format].to_s if opts[:year_format]
49
- attrs[:year_prefix] = opts[:year_prefix].to_s if opts[:year_prefix]
50
- attrs[:reaffirmation] = opts[:reaffirmation].to_s if opts[:reaffirmation]
51
- attrs[:french] = opts[:french] if opts.key?(:french)
52
- attrs[:has_publisher] = opts.fetch(:has_publisher, true)
53
- attrs[:publisher_prefix] = opts[:publisher_prefix].to_s if opts[:publisher_prefix]
54
- attrs[:series_prefix] = opts[:series_prefix].to_s if opts[:series_prefix]
55
- attrs[:series] = opts[:series] if opts.key?(:series) && [true, false].include?(opts[:series])
56
- attrs[:package] = opts[:package].to_s if opts[:package]
57
- attrs[:no_number] = opts[:no_number].to_s if opts[:no_number]
58
- attrs
59
- end
60
- private_class_method :resolve_create_class, :coerce_create_attrs
61
15
 
62
- def self.parse(input)
63
16
  # Filter out comments
64
17
  return nil if input.start_with?("#")
65
18
 
@@ -483,9 +436,6 @@ module Pubid
483
436
  end
484
437
 
485
438
  def self.parse_external_standard(input)
486
- # Ensure full Pubid is loaded (handles Scheme and all flavors)
487
- require_relative "../../pubid" unless defined?(Pubid::Iso) && defined?(Pubid::Iec)
488
-
489
439
  # Try ISO/IEC first (most common)
490
440
  if input.match?(/^(ISO\/IEC|ISO|IEC|CEI|CEI\/IEC)\s/)
491
441
  begin
@@ -4,129 +4,6 @@ module Pubid
4
4
  module Csa
5
5
  module Identifiers
6
6
  class Base < SingleIdentifier
7
- def to_s
8
- prefix = publisher_prefix || "CSA"
9
-
10
- # Handle code_only identifiers (empty string means no prefix)
11
- if prefix == ""
12
- # No prefix for code_only identifiers
13
- parts = []
14
- else
15
- # Determine if we need space after prefix
16
- # CAN/CSA- and CAN3- end with dash, so no space needed
17
- needs_space = !prefix.end_with?("-")
18
-
19
- parts = []
20
- parts << prefix
21
- end
22
-
23
- # Code and year together
24
- code_part = code.to_s if code
25
-
26
- # NO. keyword
27
- if no_number
28
- code_part += " NO. #{no_number}"
29
- end
30
-
31
- # Series prefix and keyword (before year)
32
- if series_prefix
33
- code_part += " #{series_prefix} SERIES"
34
- elsif series
35
- # SERIES without prefix
36
- code_part += " SERIES"
37
- end
38
-
39
- parts << code_part if code_part
40
-
41
- # Year with proper format (colon or dash)
42
- if year
43
- # Use dash if year_format is dash, otherwise colon
44
- separator = year_format == "dash" ? "-" : ":"
45
- year_part = separator
46
- year_part += year_prefix if year_prefix # Add M or F prefix
47
- year_part += "F" if french && year_format != "dash" && !year_prefix # Only add F if no prefix
48
- # Convert 4-digit year back to 2-digit for M/F prefix preservation
49
- # M1983 → M83, F1983 → F83, 1983 → 83, 20xx → xx
50
- # However, preserve original 4-digit format if the input was 4-digit (original_year_4digit)
51
- year_str = year.to_s
52
- year_part += if original_year_4digit
53
- # Preserve 4-digit format (e.g., "M1981" stays "M1981")
54
- year_str
55
- elsif year_prefix&.match?(/^[MF]$/) && year_str.length == 4 && year_str.start_with?("19")
56
- # M/F + 4-digit year (1900s) → convert to 2-digit with prefix
57
- year_str[2..3]
58
- elsif year_str.length == 4 && year_str.start_with?("20")
59
- # 2000s → just last 2 digits
60
- year_str[2..3]
61
- elsif year_str.length == 4 && year_str.start_with?("19") && !original_year_4digit
62
- # 1900s with no M/F prefix, but original was 2-digit (e.g., CAN3-Z299.0-86)
63
- # Convert back to 2-digit
64
- year_str[2..3]
65
- else
66
- # Other formats - keep as-is
67
- year_str
68
- end
69
- parts[-1] += year_part
70
- end
71
-
72
- result = if prefix == ""
73
- # No prefix, just join parts
74
- parts.join(" ")
75
- elsif needs_space
76
- parts.join(" ")
77
- elsif parts.length == 2
78
- # No space after dash-ending prefix - join first two parts directly
79
- # If there are more parts after code, they should still have spaces
80
- parts.join
81
- else
82
- # More than 2 parts shouldn't happen in current design
83
- parts.join
84
- end
85
-
86
- # Reaffirmation - preserve original format and determine spacing
87
- if reaffirmation
88
- # Check if year was originally 2-digit (original_year_4digit flag)
89
- year_was_2digit = !original_year_4digit
90
-
91
- # Check if reaffirmation was originally 4-digit (original_reaffirmation_4digit flag)
92
- reaffirmation_was_4digit = original_reaffirmation_4digit
93
-
94
- # Preserve original reaffirmation format
95
- # If original was 4-digit, keep as 4-digit
96
- # If original was 2-digit, convert from 4-digit storage back to 2-digit
97
- reaffirmation_str = if reaffirmation_was_4digit
98
- # Original was 4-digit, keep as-is
99
- reaffirmation.to_s
100
- elsif reaffirmation.to_s.length == 4 && reaffirmation.to_s.start_with?(
101
- "19", "20"
102
- )
103
- # Original was 2-digit, convert 4-digit storage back to 2-digit
104
- # (R2004) → (R04), (R1994) → (R94)
105
- reaffirmation.to_s[2..3]
106
- else
107
- # Already 2-digit or other format
108
- reaffirmation.to_s
109
- end
110
-
111
- # Determine spacing based on original formats
112
- # Space needed if year is 2-digit and reaffirmation is 4-digit (original format)
113
- # No space if both year and reaffirmation are 2-digit, or both are 4-digit
114
- if year_was_2digit && reaffirmation_was_4digit
115
- # Year was 2-digit, reaffirmation was 4-digit → add space
116
- result += " (R#{reaffirmation_str})"
117
- else
118
- # Both 2-digit, both 4-digit, or other cases → no space
119
- result += "(R#{reaffirmation_str})"
120
- end
121
- end
122
-
123
- # Package (already has leading space from parser)
124
- if package
125
- result += package
126
- end
127
-
128
- result
129
- end
130
7
  end
131
8
  end
132
9
  end
@@ -20,109 +20,6 @@ module Pubid
20
20
 
21
21
  @code ||= Components::Code.new(value: "#{cec_part.value}-#{no_number.value}")
22
22
  end
23
-
24
- def to_s
25
- parts = []
26
-
27
- # Publisher prefix (CSA, CAN/CSA-, CAN3-)
28
- prefix = publisher_prefix || "CSA"
29
-
30
- # Determine if we need space after prefix
31
- # CAN/CSA- and CAN3- end with dash, so no space needed
32
- needs_space = !prefix.end_with?("-")
33
-
34
- parts << prefix unless prefix == ""
35
-
36
- # CEC Part (C22.2, C22.3, etc.)
37
- parts << cec_part.value if cec_part
38
-
39
- # NO. notation - this is the key semantic component
40
- parts << "NO."
41
-
42
- # Number after NO.
43
- parts << no_number.value if no_number
44
-
45
- # Determine separator based on prefix ending
46
- result = if prefix == ""
47
- parts.join(" ")
48
- elsif needs_space
49
- parts.join(" ")
50
- elsif parts.length <= 2
51
- # No space after dash-ending prefix (CAN/CSA-, CAN3-)
52
- # Join first two parts directly, rest with spaces
53
- parts.join
54
- else
55
- parts[0] + parts[1..].join(" ")
56
- end
57
-
58
- # Year with proper format (colon or dash)
59
- if year
60
- # Use dash if year_format is dash, otherwise colon
61
- separator = year_format == "dash" ? "-" : ":"
62
- year_part = separator
63
-
64
- # Convert 4-digit year back to 2-digit for display
65
- year_str = year.to_s
66
- display_year = if year_str.length == 4 && year_str.start_with?("20")
67
- year_str[2..3]
68
- elsif year_str.length == 4 && year_str.start_with?("19")
69
- year_str[2..3]
70
- else
71
- year_str
72
- end
73
-
74
- # Add prefix if present
75
- year_part += if year_prefix
76
- year_prefix + display_year
77
- elsif french && year_format != "dash"
78
- # Only add F if no prefix already set
79
- "F#{display_year}"
80
- else
81
- display_year
82
- end
83
-
84
- result += year_part
85
- end
86
-
87
- # Reaffirmation - preserve original format and determine spacing
88
- if reaffirmation
89
- # Check if year was originally 2-digit (original_year_4digit flag)
90
- year_was_2digit = !original_year_4digit
91
-
92
- # Check if reaffirmation was originally 4-digit (original_reaffirmation_4digit flag)
93
- reaffirmation_was_4digit = original_reaffirmation_4digit
94
-
95
- # Preserve original reaffirmation format
96
- # If original was 4-digit, keep as 4-digit
97
- # If original was 2-digit, convert from 4-digit storage back to 2-digit
98
- reaffirmation_str = if reaffirmation_was_4digit
99
- # Original was 4-digit, keep as-is
100
- reaffirmation.to_s
101
- elsif reaffirmation.to_s.length == 4 && reaffirmation.to_s.start_with?(
102
- "19", "20"
103
- )
104
- # Original was 2-digit, convert 4-digit storage back to 2-digit
105
- # (R2004) → (R04), (R1994) → (R94)
106
- reaffirmation.to_s[2..3]
107
- else
108
- # Already 2-digit or other format
109
- reaffirmation.to_s
110
- end
111
-
112
- # Determine spacing based on original formats
113
- # Space needed if year is 2-digit and reaffirmation is 4-digit (original format)
114
- # No space if both year and reaffirmation are 2-digit, or both are 4-digit
115
- if year_was_2digit && reaffirmation_was_4digit
116
- # Year was 2-digit, reaffirmation was 4-digit → add space
117
- result += " (R#{reaffirmation_str})"
118
- else
119
- # Both 2-digit, both 4-digit, or other cases → no space
120
- result += "(R#{reaffirmation_str})"
121
- end
122
- end
123
-
124
- result
125
- end
126
23
  end
127
24
  end
128
25
  end
@@ -17,110 +17,6 @@ module Pubid
17
17
  class Series < Base
18
18
  # Series prefix (MH, RV, etc.) - optional
19
19
  attribute :series_prefix, :string
20
-
21
- def to_s
22
- result = publisher_prefix_portion
23
-
24
- # Add code FIRST (before SERIES keyword)
25
- result += code.to_s
26
-
27
- # Add space before series prefix/SERIES keyword
28
- result += " "
29
-
30
- # Add series prefix if present
31
- result += "#{series_prefix} " if series_prefix && !series_prefix.empty?
32
-
33
- # Add SERIES keyword
34
- result += "SERIES"
35
-
36
- # Add year
37
- result += year_portion
38
-
39
- # Add language
40
- result += language_portion
41
-
42
- # Add reaffirmation
43
- result += reaffirmation_portion
44
-
45
- result
46
- end
47
-
48
- private
49
-
50
- def publisher_prefix_portion
51
- prefix = publisher_prefix || "CSA"
52
-
53
- # Handle code_only identifiers (empty string means no prefix)
54
- return "" if prefix == ""
55
-
56
- # Determine if we need space after prefix
57
- # CAN/CSA- and CAN3- end with dash, so no space needed
58
- needs_space = !prefix.end_with?("-")
59
-
60
- needs_space ? "#{prefix} " : prefix
61
- end
62
-
63
- def year_portion
64
- return "" unless year
65
-
66
- # Use dash if year_format is dash, otherwise colon
67
- separator = year_format == "dash" ? "-" : ":"
68
- year_part = separator
69
- year_part += year_prefix if year_prefix # Add M or F prefix
70
- year_part += "F" if french && year_format != "dash" && !year_prefix # Only add F if no prefix
71
-
72
- # Convert 4-digit year back to 2-digit
73
- year_str = year.to_s
74
- year_part += if year_str.length == 4 && year_str.start_with?("20")
75
- year_str[2..3]
76
- else
77
- year_str
78
- end
79
-
80
- year_part
81
- end
82
-
83
- def language_portion
84
- "" # CSA doesn't use language codes in rendering
85
- end
86
-
87
- def reaffirmation_portion
88
- return "" unless reaffirmation
89
-
90
- # Check if year was originally 2-digit (original_year_4digit flag)
91
- year_was_2digit = !original_year_4digit
92
-
93
- # Check if reaffirmation was originally 4-digit (original_reaffirmation_4digit flag)
94
- reaffirmation_was_4digit = original_reaffirmation_4digit
95
-
96
- # Preserve original reaffirmation format
97
- # If original was 4-digit, keep as 4-digit
98
- # If original was 2-digit, convert from 4-digit storage back to 2-digit
99
- reaffirmation_str = if reaffirmation_was_4digit
100
- # Original was 4-digit, keep as-is
101
- reaffirmation.to_s
102
- elsif reaffirmation.to_s.length == 4 && reaffirmation.to_s.start_with?(
103
- "19", "20"
104
- )
105
- # Original was 2-digit, convert 4-digit storage back to 2-digit
106
- # (R2004) → (R04), (R1994) → (R94)
107
- reaffirmation.to_s[2..3]
108
- else
109
- # Already 2-digit or other format
110
- reaffirmation.to_s
111
- end
112
-
113
- # Determine spacing based on original formats
114
- # Space needed if year is 2-digit and reaffirmation is 4-digit (original format)
115
- # No space if both year and reaffirmation are 2-digit, or both are 4-digit
116
- if year_was_2digit && reaffirmation_was_4digit
117
- # Year was 2-digit, reaffirmation was 4-digit → add space
118
- " (R#{reaffirmation_str})"
119
- else
120
- # Both 2-digit, both 4-digit, or other cases → no space
121
- "(R#{reaffirmation_str})"
122
- end
123
- end
124
20
  end
125
21
  end
126
22
  end