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
@@ -5,7 +5,6 @@ module Pubid
5
5
  module Identifiers
6
6
  # Publicly Available Specification", Identifier
7
7
  class Pas < SingleIdentifier
8
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
9
8
 
10
9
  TYPED_STAGES = [
11
10
  ::Pubid::Components::TypedStage.new(
@@ -85,7 +84,8 @@ module Pubid
85
84
  ].freeze
86
85
 
87
86
  def self.type
88
- { key: :pas, title: "Publicly Available Specification", short: "PAS" }
87
+ { key: :pas,
88
+ web: :publicly_available_specification, title: "Publicly Available Specification", short: "PAS" }
89
89
  end
90
90
  end
91
91
  end
@@ -4,7 +4,6 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class Recommendation < SingleIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
 
9
8
  TYPED_STAGES = [
10
9
  ::Pubid::Components::TypedStage.new(
@@ -32,7 +31,8 @@ module Pubid
32
31
  ].freeze
33
32
 
34
33
  def self.type
35
- { key: :rec, title: "Recommendation", short: "R" }
34
+ { key: :rec,
35
+ web: :recommendation, title: "Recommendation", short: "R" }
36
36
  end
37
37
 
38
38
  # Override URN type code - Recommendation uses 'r' in URN (RFC 5141)
@@ -4,9 +4,16 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class Supplement < SupplementIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
 
9
8
  TYPED_STAGES = [
9
+ ::Pubid::Components::TypedStage.new(
10
+ code: :pwisuppl,
11
+ stage_code: :pwi,
12
+ type_code: :suppl,
13
+ abbr: ["PWI Suppl"],
14
+ name: "Proposed Work Item for Supplement",
15
+ harmonized_stages: %w[00.00 00.20 00.60 00.92 00.93 00.98 00.99],
16
+ ),
10
17
  ::Pubid::Components::TypedStage.new(
11
18
  code: :npsuppl,
12
19
  stage_code: :np,
@@ -43,7 +50,7 @@ module Pubid
43
50
  code: :dsuppl,
44
51
  stage_code: :dsuppl,
45
52
  type_code: :suppl,
46
- abbr: ["DSuppl"],
53
+ abbr: ["DSuppl", "DIS Suppl"],
47
54
  name: "Draft Supplement",
48
55
  harmonized_stages: %w[40.00 40.20 40.60 40.92 40.93 40.98 40.99],
49
56
  ),
@@ -79,7 +86,8 @@ module Pubid
79
86
  end
80
87
 
81
88
  def self.type
82
- { key: :suppl, title: "Supplement", short: "suppl" }
89
+ { key: :suppl,
90
+ web: :supplement, title: "Supplement", short: "suppl" }
83
91
  end
84
92
  end
85
93
  end
@@ -5,7 +5,7 @@ module Pubid
5
5
  module Identifiers
6
6
  # Technical Committee Document
7
7
  # Format: TC 184/SC 4/WG 3 N 123, JTC 1 N 456, TC 184 N 100
8
- class TcDocument < Base
8
+ class TcDocument < Identifier
9
9
  # TC type (TC, JTC, PC, IT, etc.)
10
10
  attribute :tc_type, ::Pubid::Components::Code
11
11
  # TC number
@@ -33,8 +33,36 @@ module Pubid
33
33
  # TC documents don't use typed stages like other identifiers
34
34
  TYPED_STAGES = [].freeze
35
35
 
36
+ # Serialize the committee structure (all plain-string Codes) on top of
37
+ # the inherited ISO mapping; TC documents have no stage.
38
+ key_value do
39
+ map "tc_type", with: { to: :tc_type_to_kv, from: :tc_type_from_kv }
40
+ map "tc_number", with: { to: :tc_number_to_kv, from: :tc_number_from_kv }
41
+ map "sc_type", with: { to: :sc_type_to_kv, from: :sc_type_from_kv }
42
+ map "sc_number", with: { to: :sc_number_to_kv, from: :sc_number_from_kv }
43
+ map "wg_type", with: { to: :wg_type_to_kv, from: :wg_type_from_kv }
44
+ map "wg_number", with: { to: :wg_number_to_kv, from: :wg_number_from_kv }
45
+ end
46
+
47
+ # TC documents have no stage; suppress the inherited stage emission.
48
+ def stage_to_kv(_model, _doc); end
49
+
50
+ def tc_type_to_kv(m, doc) = emit_code(doc, "tc_type", m.tc_type)
51
+ def tc_type_from_kv(m, v) = m.tc_type = build_code(v)
52
+ def tc_number_to_kv(m, doc) = emit_code(doc, "tc_number", m.tc_number)
53
+ def tc_number_from_kv(m, v) = m.tc_number = build_code(v)
54
+ def sc_type_to_kv(m, doc) = emit_code(doc, "sc_type", m.sc_type)
55
+ def sc_type_from_kv(m, v) = m.sc_type = build_code(v)
56
+ def sc_number_to_kv(m, doc) = emit_code(doc, "sc_number", m.sc_number)
57
+ def sc_number_from_kv(m, v) = m.sc_number = build_code(v)
58
+ def wg_type_to_kv(m, doc) = emit_code(doc, "wg_type", m.wg_type)
59
+ def wg_type_from_kv(m, v) = m.wg_type = build_code(v)
60
+ def wg_number_to_kv(m, doc) = emit_code(doc, "wg_number", m.wg_number)
61
+ def wg_number_from_kv(m, v) = m.wg_number = build_code(v)
62
+
36
63
  def self.type
37
- { key: :tc, title: "Technical Committee Document", short: "TC" }
64
+ { key: :tc,
65
+ web: :tc_document, title: "Technical Committee Document", short: "TC" }
38
66
  end
39
67
 
40
68
  def self.typed_stages
@@ -45,26 +73,26 @@ module Pubid
45
73
  result = publisher.to_s if publisher
46
74
 
47
75
  # Add TC type and number
48
- result += "/#{tc_type.value} " if tc_type&.value
49
- result += tc_number.value.to_s if tc_number&.value
76
+ result += "/#{tc_type.render} " if tc_type&.value
77
+ result += tc_number.render.to_s if tc_number&.value
50
78
 
51
79
  # Add SC type and number
52
80
  if sc_type&.value && sc_number&.value
53
- result += "/#{sc_type.value} "
54
- result += sc_number.value.to_s
81
+ result += "/#{sc_type.render} "
82
+ result += sc_number.render.to_s
55
83
  end
56
84
 
57
85
  # Add WG type and number
58
86
  if wg_type&.value && wg_number&.value
59
- result += "/#{wg_type.value} "
60
- result += wg_number.value.to_s
87
+ result += "/#{wg_type.render} "
88
+ result += wg_number.render.to_s
61
89
  end
62
90
 
63
91
  # Add document number
64
- result += " N #{number.value}" if number&.value
92
+ result += " N #{number.render}" if number&.value
65
93
 
66
94
  # Add year if present
67
- result += ":#{date.year}" if date&.year
95
+ result += ":#{date.render}" if date&.year
68
96
 
69
97
  result
70
98
  end
@@ -72,20 +100,21 @@ module Pubid
72
100
  # Generate URN for TC document
73
101
  # Format: urn:iso:doc:iso:tc:184:sc-4:wg-3:123
74
102
  def to_urn
103
+ urn_ctx = Rendering::RenderingContext.urn
75
104
  parts = ["urn:iso:doc"]
76
- parts << publisher.to_s.downcase if publisher
105
+ parts << publisher.render(context: urn_ctx) if publisher
77
106
 
78
107
  # Add TC
79
- parts << "tc:#{tc_number.value}" if tc_number&.value
108
+ parts << "tc:#{tc_number.render(context: urn_ctx)}" if tc_number&.value
80
109
 
81
110
  # Add SC
82
- parts << "sc-#{sc_number.value}" if sc_number&.value
111
+ parts << "sc-#{sc_number.render(context: urn_ctx)}" if sc_number&.value
83
112
 
84
113
  # Add WG
85
- parts << "wg-#{wg_number.value}" if wg_number&.value
114
+ parts << "wg-#{wg_number.render(context: urn_ctx)}" if wg_number&.value
86
115
 
87
116
  # Add document number
88
- parts << number.value if number&.value
117
+ parts << number.render(context: urn_ctx) if number&.value
89
118
 
90
119
  parts.join(":")
91
120
  end
@@ -4,7 +4,6 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class TechnicalReport < SingleIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
 
9
8
  TYPED_STAGES = [
10
9
  ::Pubid::Components::TypedStage.new(
@@ -64,7 +63,7 @@ module Pubid
64
63
  code: :dtr,
65
64
  stage_code: :draft,
66
65
  type_code: :tr,
67
- abbr: ["DTR"],
66
+ abbr: ["DTR", "DIS TR"],
68
67
  name: "Draft Technical Report",
69
68
  harmonized_stages: %w[40.00 40.20 40.60 40.92 40.93 40.98 40.99],
70
69
  ),
@@ -72,7 +71,7 @@ module Pubid
72
71
  code: :fdtr,
73
72
  stage_code: :final_draft,
74
73
  type_code: :tr,
75
- abbr: ["FDTR"],
74
+ abbr: ["FDTR", "FDIS TR"],
76
75
  name: "Final Draft Technical Report",
77
76
  harmonized_stages: %w[50.00 50.20 50.60 50.92 50.98 50.99],
78
77
  ),
@@ -95,7 +94,8 @@ module Pubid
95
94
  ].freeze
96
95
 
97
96
  def self.type
98
- { key: :tr, title: "Technical Report", short: "TR" }
97
+ { key: :tr,
98
+ web: :technical_report, title: "Technical Report", short: "TR" }
99
99
  end
100
100
  end
101
101
  end
@@ -4,7 +4,6 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class TechnicalSpecification < SingleIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
  TYPED_STAGES = [
9
8
  ::Pubid::Components::TypedStage.new(
10
9
  code: :pwits,
@@ -94,7 +93,8 @@ module Pubid
94
93
  ].freeze
95
94
 
96
95
  def self.type
97
- { key: :ts, title: "Technical Specification", short: "TS" }
96
+ { key: :ts,
97
+ web: :technical_specification, title: "Technical Specification", short: "TS" }
98
98
  end
99
99
  end
100
100
  end
@@ -4,7 +4,6 @@ module Pubid
4
4
  module Iso
5
5
  module Identifiers
6
6
  class TechnologyTrendsAssessments < SingleIdentifier
7
- attribute :type, ::Pubid::Components::Type, default: -> { self.class.type[:key] }
8
7
 
9
8
  TYPED_STAGES = [
10
9
  ::Pubid::Components::TypedStage.new(
@@ -87,7 +86,8 @@ module Pubid
87
86
  ].freeze
88
87
 
89
88
  def self.type
90
- { key: :tta, title: "Technology Trends Assessments", short: "TTA" }
89
+ { key: :tta,
90
+ web: :technology_trends_assessments, title: "Technology Trends Assessments", short: "TTA" }
91
91
  end
92
92
  end
93
93
  end
@@ -5,7 +5,6 @@ module Pubid
5
5
  module Identifiers
6
6
  autoload :Addendum, "#{__dir__}/identifiers/addendum"
7
7
  autoload :Amendment, "#{__dir__}/identifiers/amendment"
8
- autoload :Base, "#{__dir__}/identifiers/base"
9
8
  autoload :Corrigendum, "#{__dir__}/identifiers/corrigendum"
10
9
  autoload :Data, "#{__dir__}/identifiers/data"
11
10
  autoload :Directives, "#{__dir__}/identifiers/directives"
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubid
4
+ module Iso
5
+ # Applies pre-parse normalizations to ISO identifier strings, then dispatches
6
+ # to the parser/builder. Handles Cyrillic (Russian) translations, legacy
7
+ # update_codes regex rewrites, and the DAD/FDAM pattern that the PEG
8
+ # parser cannot recognize because it treats "/" as a copublisher separator.
9
+ class Normalizer
10
+ DAD_PATTERN = /^(.+?)\/(F?DAD)\s+(\d+)(?::(\d{4}))?$/.freeze
11
+
12
+ class << self
13
+ # Apply all normalizations to an identifier string and return the
14
+ # parsed identifier object.
15
+ # @param identifier [String]
16
+ # @return [Pubid::Iso::Identifier]
17
+ def apply(identifier)
18
+ if (match = identifier.match(DAD_PATTERN))
19
+ parse_dad_pattern(match)
20
+ else
21
+ normalized = Core::UpdateCodes.apply(identifier, :iso)
22
+ normalized = normalize_cyrillic(normalized)
23
+ parse_with_builder(normalized)
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def parse_with_builder(string)
30
+ parsed = Pubid::Iso.parser.parse(string)
31
+ Pubid::Iso.builder.build(parsed)
32
+ end
33
+
34
+ # Normalize Cyrillic (Russian) ISO identifiers to Latin equivalents.
35
+ # ИСО = ISO, МЭК = IEC, Руководство/Руководства = Guide,
36
+ # ОПМС = FDIS, ПМС = DIS, ТО = TR, ТС = TS.
37
+ # @return [String]
38
+ def normalize_cyrillic(identifier)
39
+ return identifier unless identifier.match?(/[а-яА-Я]/)
40
+
41
+ normalized = identifier.dup
42
+ # Remove inline comments (Russian style comments with #)
43
+ normalized = normalized.gsub(/\s*#\s*.*$/, "")
44
+ # Translate Russian abbreviations (order matters: longer first)
45
+ normalized = normalized.gsub("Руководства", "GUIDE")
46
+ normalized = normalized.gsub("Руководство", "GUIDE")
47
+ normalized = normalized.gsub("ИСО/МЭК", "ISO/IEC")
48
+ normalized = normalized.gsub("ИСО/ОПМС", "ISO/FDIS")
49
+ normalized = normalized.gsub("ИСО/ПМС", "ISO/DIS")
50
+ normalized = normalized.gsub("ИСО/ТО", "ISO/TR")
51
+ normalized = normalized.gsub("ИСО/ТС", "ISO/TS")
52
+ normalized = normalized.gsub("ИСО", "ISO")
53
+ normalized = normalized.gsub("МЭК", "IEC")
54
+ # Standalone Cyrillic stage abbreviations (after publisher replacements)
55
+ normalized = normalized.gsub("ТО", "TR")
56
+ normalized = normalized.gsub("ТС", "TS")
57
+ normalized = normalized.gsub("ОПМС", "FDIS")
58
+ normalized = normalized.gsub("ПМС", "DIS")
59
+ normalized.strip
60
+ end
61
+
62
+ # Parse the DAD/FDAM pattern manually. The parser fails because it
63
+ # treats "/" as a copublisher separator.
64
+ # Pattern: "ISO 2631/DAD 1" or "ISO 2553/DAD 1:1987"
65
+ def parse_dad_pattern(match)
66
+ base_str = match[1] # "ISO 2631" or "ISO 2553"
67
+ stage_abbr = match[2] # "DAD" or "FDAD"
68
+ supplement_number = match[3] # "1"
69
+ supplement_year = match[4] # "1987" or nil
70
+
71
+ base_parsed = Pubid::Iso.parser.parse(base_str)
72
+ base_identifier = Pubid::Iso.builder.build(base_parsed)
73
+
74
+ addendum = Identifiers::Addendum.new
75
+ addendum.base_identifier = base_identifier
76
+ addendum.number = Iso::Components::Code.new(value: supplement_number)
77
+ addendum.date = Pubid::Components::Date.new(year: supplement_year) if supplement_year
78
+
79
+ typed_stage = Pubid::Iso.locate_stage(stage_abbr)
80
+ addendum.typed_stage = typed_stage
81
+ addendum.stage = typed_stage.to_stage
82
+ addendum.type = typed_stage.to_type
83
+
84
+ addendum
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -9,10 +9,19 @@ module Pubid
9
9
 
10
10
  DASH_CHARS = ["-", "‑", "‐"].freeze
11
11
 
12
+ # Supplement identifier type keys (kept as a hard-coded list to match
13
+ # the previous identifier split; only the base identifier registry
14
+ # is auto-discovered from the Identifiers namespace).
15
+ SUPPLEMENT_TYPE_KEYS = %i[amd cor suppl ext add].freeze
16
+
12
17
  # We need to sort by length to match longest first because that's how Parslet works
13
- TYPED_STAGES = Pubid::Iso::Scheme.typed_stages
18
+ TYPED_STAGES = Pubid::Iso.identifier_types
19
+ .reject { |k| SUPPLEMENT_TYPE_KEYS.include?(k.type[:key]) }
20
+ .flat_map { |k| k.const_defined?(:TYPED_STAGES) ? k.const_get(:TYPED_STAGES) : [] }
14
21
  .map(&:abbr).flatten.sort_by(&:length).reverse
15
- TYPED_STAGES_SUPPLEMENTS = Pubid::Iso::Scheme.supplement_typed_stages
22
+ TYPED_STAGES_SUPPLEMENTS = Pubid::Iso.identifier_types
23
+ .select { |k| SUPPLEMENT_TYPE_KEYS.include?(k.type[:key]) }
24
+ .flat_map { |k| k.const_defined?(:TYPED_STAGES) ? k.const_get(:TYPED_STAGES) : [] }
16
25
  .map(&:abbr).flatten.sort_by(&:length).reverse
17
26
 
18
27
  root :identifier
@@ -45,7 +54,9 @@ module Pubid
45
54
  # ISO/JTC 1 N 456
46
55
  # ISO/TC 184/SC 4 N 789 (TC and SC only, no WG)
47
56
  rule(:tc_document) do
48
- prefix_sole_publisher >> str("/") >> tc_type >> space >> tc_number.as(:tc_number) >>
57
+ # Accept either "ISO/TC 184…" or the lenient space form "ISO TC 184…"
58
+ # (the latter was valid in pubid 1.x via an optional slash).
59
+ prefix_sole_publisher >> (str("/") | space) >> tc_type >> space >> tc_number.as(:tc_number) >>
49
60
  tc_subcommittee_part.maybe >>
50
61
  space >> str("N") >> space? >> digits.as(:number) >>
51
62
  (str(":") >> year_digits.as(:year)).maybe
@@ -64,7 +75,9 @@ module Pubid
64
75
  end
65
76
 
66
77
  rule(:sc_type) do
67
- str("SC").as(:sc_type)
78
+ # "SC" plus the "SC/QC" quality-committee variant
79
+ # (e.g. ISO/TC 184/SC/QC 4 N 246). Longest first for Parslet.
80
+ (str("SC/QC") | str("SC")).as(:sc_type)
68
81
  end
69
82
 
70
83
  rule(:wg_type) do
@@ -325,7 +338,9 @@ module Pubid
325
338
  rule(:supplement_identifier_no_third) do
326
339
  identifier_copublishers_no_third.as(:base_identifier) >>
327
340
  str("/") >> supplement_type_with_stage >>
328
- ((space? >> second_part) | (str(".") >> digits.as(:number)) | (space? >> date))
341
+ # The trailing number/date is optional: some draft supplements have no
342
+ # number yet, e.g. "ISO/IEC 9579/WD Amd".
343
+ ((space? >> second_part) | (str(".") >> digits.as(:number)) | (space? >> date)).maybe
329
344
  end
330
345
 
331
346
  rule(:supplement_identifier) do
@@ -378,9 +393,14 @@ module Pubid
378
393
 
379
394
  DIRECTIVES_TYPED_STAGES = Identifiers::Directives::TYPED_STAGES.map(&:abbr).flatten.sort_by(&:length).reverse
380
395
  rule(:directives_identifier_no_third) do
381
- prefix_with_copublishers >> space >>
396
+ prefix_with_copublishers >> space? >>
382
397
  (directives_publisher_subgroup >> space).maybe >>
383
398
  array_to_str(DIRECTIVES_TYPED_STAGES).as(:type_with_stage) >>
399
+ # The subgroup may also follow the type, e.g. "ISO/IEC DIR JTC 1"
400
+ # (canonical form is "ISO/IEC JTC 1 DIR"). Guard against a trailing
401
+ # supplement, where "JTC 1" is the supplement publisher instead
402
+ # (e.g. "ISO/IEC DIR JTC 1 SUP").
403
+ (space >> directives_publisher_subgroup >> (space >> str("SUP")).absent?).maybe >>
384
404
  (
385
405
  (space >> directives_number_with_part).maybe >>
386
406
  (str(":") >> date).maybe
@@ -11,7 +11,8 @@ module Pubid
11
11
 
12
12
  def build_rendering_context(_renderer, format:, with_edition: false,
13
13
  lang: :en, lang_single: false,
14
- stage_format_long: nil, with_date: nil)
14
+ stage_format_long: nil, with_date: nil,
15
+ annotated: false)
15
16
  if format == :mr_string
16
17
  nil
17
18
  elsif lang_single || stage_format_long || !with_date.nil?
@@ -19,17 +20,19 @@ module Pubid
19
20
  with_language_code: lang_single ? :single : :none,
20
21
  stage_format_long: stage_format_long || false,
21
22
  with_date: with_date.nil? || with_date,
23
+ annotated: annotated,
22
24
  )
23
25
  else
24
- detect_rendering_context
26
+ detect_rendering_context(annotated: annotated)
25
27
  end
26
28
  end
27
29
 
28
- def detect_rendering_context
30
+ def detect_rendering_context(annotated: false)
29
31
  Rendering::RenderingContext.new(
30
32
  with_language_code: detect_language_code_format,
31
33
  stage_format_long: detect_stage_format_long,
32
34
  with_date: true,
35
+ annotated: annotated,
33
36
  )
34
37
  end
35
38
 
@@ -7,14 +7,27 @@ module Pubid
7
7
  polymorphic: true
8
8
 
9
9
  key_value do
10
- map "base_identifier", to: :base_identifier, polymorphic: {
10
+ # Serialized key is "base" (matches JIS); the attribute/method stays
11
+ # `base_identifier`, which relaton-index's get_id_number depends on.
12
+ map "base", to: :base_identifier, polymorphic: {
11
13
  attribute: "_type",
12
14
  class_map: Identifier::ISO_TYPE_MAP,
13
15
  }
14
16
  end
15
17
 
18
+ # A supplement carries the publisher/copublishers of the document it
19
+ # supplements. Delegate to the root rather than the immediate base so a
20
+ # nested supplement (e.g. ".../Amd 1/Cor 1") reads identity from the
21
+ # underlying standard in one hop, regardless of chain depth. This keeps a
22
+ # parsed supplement and a from_hash-deserialized one in agreement (== and
23
+ # index matching compare both). Guard on base_identifier: `root` returns
24
+ # self when there is no base, which would otherwise recurse forever.
16
25
  def publisher
17
- base_identifier&.publisher
26
+ root.publisher if base_identifier
27
+ end
28
+
29
+ def copublishers
30
+ root.copublishers if base_identifier
18
31
  end
19
32
 
20
33
  def to_s(**opts)