pubid 2.0.0.alpha.10 → 2.0.0.pre.alpha.1

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 (811) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +51 -54
  3. data/data/iec/update_codes.yaml +0 -3
  4. data/data/ieee/update_codes.yaml +1 -107
  5. data/data/nist/update_codes.yaml +0 -35
  6. data/lib/pubid/amca/builder.rb +6 -6
  7. data/lib/pubid/amca/identifier.rb +16 -2
  8. data/lib/pubid/amca/identifiers/base.rb +46 -74
  9. data/lib/pubid/amca/identifiers/interpretation.rb +30 -17
  10. data/lib/pubid/amca/identifiers/publication.rb +27 -14
  11. data/lib/pubid/amca/identifiers/standard.rb +5 -3
  12. data/lib/pubid/amca/identifiers.rb +1 -0
  13. data/lib/pubid/amca/parser.rb +1 -1
  14. data/lib/pubid/amca/scheme.rb +16 -0
  15. data/lib/pubid/amca/single_identifier.rb +24 -1
  16. data/lib/pubid/amca/urn_generator.rb +3 -4
  17. data/lib/pubid/amca.rb +3 -50
  18. data/lib/pubid/ansi/builder.rb +5 -7
  19. data/lib/pubid/ansi/identifier.rb +1 -19
  20. data/lib/pubid/ansi/identifiers/american_national_standard.rb +1 -2
  21. data/lib/pubid/ansi/identifiers/standard.rb +3 -2
  22. data/lib/pubid/ansi/parser.rb +1 -1
  23. data/lib/pubid/ansi/scheme.rb +15 -0
  24. data/lib/pubid/ansi/single_identifier.rb +31 -2
  25. data/lib/pubid/ansi/urn_generator.rb +38 -3
  26. data/lib/pubid/ansi.rb +6 -47
  27. data/lib/pubid/api/builder.rb +72 -45
  28. data/lib/pubid/api/identifier.rb +9 -30
  29. data/lib/pubid/api/identifiers/base.rb +14 -2
  30. data/lib/pubid/api/identifiers/bulletin.rb +2 -0
  31. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +2 -0
  32. data/lib/pubid/api/identifiers/mpms.rb +28 -10
  33. data/lib/pubid/api/identifiers/publication.rb +2 -0
  34. data/lib/pubid/api/identifiers/recommended_practice.rb +2 -0
  35. data/lib/pubid/api/identifiers/specification.rb +2 -0
  36. data/lib/pubid/api/identifiers/standard.rb +2 -0
  37. data/lib/pubid/api/identifiers/technical_report.rb +2 -0
  38. data/lib/pubid/api/identifiers/typeless_standard.rb +16 -0
  39. data/lib/pubid/api/parser.rb +1 -1
  40. data/lib/pubid/api/scheme.rb +66 -0
  41. data/lib/pubid/api/single_identifier.rb +32 -10
  42. data/lib/pubid/api/urn_generator.rb +18 -0
  43. data/lib/pubid/api.rb +5 -56
  44. data/lib/pubid/ashrae/builder.rb +35 -56
  45. data/lib/pubid/ashrae/identifier.rb +16 -6
  46. data/lib/pubid/ashrae/identifiers/addenda_package.rb +11 -7
  47. data/lib/pubid/ashrae/identifiers/addendum.rb +20 -9
  48. data/lib/pubid/ashrae/identifiers/base.rb +15 -111
  49. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +16 -8
  50. data/lib/pubid/ashrae/identifiers/errata.rb +10 -9
  51. data/lib/pubid/ashrae/identifiers/guideline.rb +0 -3
  52. data/lib/pubid/ashrae/identifiers/interpretation.rb +10 -16
  53. data/lib/pubid/ashrae/identifiers/standard.rb +0 -3
  54. data/lib/pubid/ashrae/identifiers.rb +1 -0
  55. data/lib/pubid/ashrae/parser.rb +16 -40
  56. data/lib/pubid/ashrae/scheme.rb +53 -0
  57. data/lib/pubid/ashrae/single_identifier.rb +14 -1
  58. data/lib/pubid/ashrae/supplement_identifier.rb +6 -21
  59. data/lib/pubid/ashrae/urn_generator.rb +10 -8
  60. data/lib/pubid/ashrae.rb +2 -58
  61. data/lib/pubid/asme/builder.rb +2 -11
  62. data/lib/pubid/asme/components/code.rb +2 -10
  63. data/lib/pubid/asme/identifier.rb +0 -9
  64. data/lib/pubid/asme/identifiers/base.rb +60 -0
  65. data/lib/pubid/asme/identifiers/standard.rb +2 -86
  66. data/lib/pubid/asme/parser.rb +1 -1
  67. data/lib/pubid/asme/scheme.rb +37 -0
  68. data/lib/pubid/asme/single_identifier.rb +2 -11
  69. data/lib/pubid/asme/urn_generator.rb +2 -2
  70. data/lib/pubid/asme.rb +1 -47
  71. data/lib/pubid/astm/builder.rb +3 -10
  72. data/lib/pubid/astm/components/code.rb +0 -9
  73. data/lib/pubid/astm/identifier.rb +0 -9
  74. data/lib/pubid/astm/identifiers/adjunct.rb +9 -16
  75. data/lib/pubid/astm/identifiers/data_series.rb +14 -2
  76. data/lib/pubid/astm/identifiers/iso_dual_published.rb +34 -25
  77. data/lib/pubid/astm/identifiers/manual.rb +25 -8
  78. data/lib/pubid/astm/identifiers/monograph.rb +14 -2
  79. data/lib/pubid/astm/identifiers/research_report.rb +5 -8
  80. data/lib/pubid/astm/identifiers/standard.rb +37 -8
  81. data/lib/pubid/astm/identifiers/technical_report.rb +13 -2
  82. data/lib/pubid/astm/identifiers/work_in_progress.rb +10 -1
  83. data/lib/pubid/astm/parser.rb +1 -1
  84. data/lib/pubid/astm/scheme.rb +55 -0
  85. data/lib/pubid/astm/single_identifier.rb +10 -32
  86. data/lib/pubid/astm/urn_generator.rb +5 -7
  87. data/lib/pubid/astm.rb +27 -44
  88. data/lib/pubid/bsi/builder.rb +107 -119
  89. data/lib/pubid/bsi/identifier.rb +25 -4
  90. data/lib/pubid/bsi/identifiers/addendum_document.rb +37 -3
  91. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +47 -19
  92. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +39 -8
  93. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +55 -2
  94. data/lib/pubid/bsi/identifiers/amendment.rb +22 -30
  95. data/lib/pubid/bsi/identifiers/base.rb +11 -0
  96. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +7 -1
  97. data/lib/pubid/bsi/identifiers/british_standard.rb +1 -2
  98. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +87 -13
  99. data/lib/pubid/bsi/identifiers/committee_document.rb +17 -10
  100. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +87 -19
  101. data/lib/pubid/bsi/identifiers/corrigendum.rb +10 -26
  102. data/lib/pubid/bsi/identifiers/detailed_specification.rb +36 -0
  103. data/lib/pubid/bsi/identifiers/disc.rb +29 -0
  104. data/lib/pubid/bsi/identifiers/draft_document.rb +46 -2
  105. data/lib/pubid/bsi/identifiers/electronic_book.rb +38 -2
  106. data/lib/pubid/bsi/identifiers/expert_commentary.rb +21 -10
  107. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +47 -0
  108. data/lib/pubid/bsi/identifiers/flex.rb +34 -3
  109. data/lib/pubid/bsi/identifiers/handbook.rb +17 -1
  110. data/lib/pubid/bsi/identifiers/index.rb +32 -0
  111. data/lib/pubid/bsi/identifiers/method.rb +41 -0
  112. data/lib/pubid/bsi/identifiers/national_annex.rb +29 -4
  113. data/lib/pubid/bsi/identifiers/practice_guide.rb +7 -1
  114. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +54 -2
  115. data/lib/pubid/bsi/identifiers/published_document.rb +54 -2
  116. data/lib/pubid/bsi/identifiers/section.rb +30 -0
  117. data/lib/pubid/bsi/identifiers/set.rb +20 -14
  118. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +10 -10
  119. data/lib/pubid/bsi/identifiers/supplement_document.rb +25 -3
  120. data/lib/pubid/bsi/identifiers/supplementary_index.rb +46 -0
  121. data/lib/pubid/bsi/identifiers/technical_specification.rb +47 -2
  122. data/lib/pubid/bsi/identifiers/test_method.rb +32 -0
  123. data/lib/pubid/bsi/identifiers/value_added_publication.rb +22 -7
  124. data/lib/pubid/bsi/identifiers.rb +1 -0
  125. data/lib/pubid/bsi/parser.rb +6 -20
  126. data/lib/pubid/bsi/scheme.rb +243 -0
  127. data/lib/pubid/bsi/single_identifier.rb +82 -94
  128. data/lib/pubid/bsi/urn_generator.rb +5 -13
  129. data/lib/pubid/bsi.rb +2 -252
  130. data/lib/pubid/builder/base.rb +13 -62
  131. data/lib/pubid/bundled_identifier.rb +10 -18
  132. data/lib/pubid/ccsds/builder.rb +4 -5
  133. data/lib/pubid/ccsds/identifier.rb +3 -63
  134. data/lib/pubid/ccsds/identifiers/base.rb +51 -14
  135. data/lib/pubid/ccsds/identifiers/corrigendum.rb +8 -9
  136. data/lib/pubid/ccsds/parser.rb +3 -5
  137. data/lib/pubid/ccsds/scheme.rb +57 -0
  138. data/lib/pubid/ccsds/single_identifier.rb +3 -6
  139. data/lib/pubid/ccsds/supplement_identifier.rb +13 -17
  140. data/lib/pubid/ccsds/urn_generator.rb +6 -6
  141. data/lib/pubid/ccsds.rb +1 -44
  142. data/lib/pubid/cen_cenelec/builder.rb +29 -61
  143. data/lib/pubid/cen_cenelec/identifier.rb +5 -28
  144. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +4 -9
  145. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +12 -2
  146. data/lib/pubid/cen_cenelec/identifiers/base.rb +46 -5
  147. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +1 -2
  148. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +1 -2
  149. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +27 -6
  150. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +17 -2
  151. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +4 -62
  152. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +7 -20
  153. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +1 -2
  154. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +6 -2
  155. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +1 -2
  156. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +1 -2
  157. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +1 -2
  158. data/lib/pubid/cen_cenelec/parser.rb +1 -1
  159. data/lib/pubid/cen_cenelec/scheme.rb +164 -0
  160. data/lib/pubid/cen_cenelec/single_identifier.rb +91 -10
  161. data/lib/pubid/cen_cenelec/supplement_identifier.rb +7 -6
  162. data/lib/pubid/cen_cenelec/urn_generator.rb +7 -7
  163. data/lib/pubid/cen_cenelec.rb +1 -188
  164. data/lib/pubid/cie/builder.rb +24 -149
  165. data/lib/pubid/cie/components/code.rb +72 -0
  166. data/lib/pubid/cie/identifier.rb +5 -20
  167. data/lib/pubid/cie/identifiers/bundle.rb +5 -35
  168. data/lib/pubid/cie/identifiers/conference.rb +6 -11
  169. data/lib/pubid/cie/identifiers/corrigendum.rb +23 -17
  170. data/lib/pubid/cie/identifiers/dual_published.rb +6 -6
  171. data/lib/pubid/cie/identifiers/identical.rb +9 -9
  172. data/lib/pubid/cie/identifiers/joint_published.rb +10 -10
  173. data/lib/pubid/cie/identifiers/standard.rb +8 -43
  174. data/lib/pubid/cie/identifiers/supplement.rb +25 -27
  175. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +3 -7
  176. data/lib/pubid/cie/identifiers.rb +0 -2
  177. data/lib/pubid/cie/parser.rb +6 -55
  178. data/lib/pubid/cie/scheme.rb +64 -0
  179. data/lib/pubid/cie/single_identifier.rb +5 -44
  180. data/lib/pubid/cie/supplement_identifier.rb +16 -29
  181. data/lib/pubid/cie/urn_generator.rb +8 -11
  182. data/lib/pubid/cie.rb +2 -57
  183. data/lib/pubid/components/code.rb +8 -22
  184. data/lib/pubid/components/date.rb +18 -41
  185. data/lib/pubid/components/edition.rb +6 -9
  186. data/lib/pubid/components/language.rb +4 -6
  187. data/lib/pubid/components/locality.rb +1 -10
  188. data/lib/pubid/components/publisher.rb +6 -9
  189. data/lib/pubid/components/stage.rb +14 -5
  190. data/lib/pubid/components/type.rb +15 -5
  191. data/lib/pubid/components/typed_stage.rb +8 -11
  192. data/lib/pubid/components.rb +0 -4
  193. data/lib/pubid/core/update_codes.rb +7 -28
  194. data/lib/pubid/csa/builder.rb +48 -48
  195. data/lib/pubid/csa/composite_identifier.rb +7 -18
  196. data/lib/pubid/csa/identifier.rb +78 -191
  197. data/lib/pubid/csa/identifiers/base.rb +123 -0
  198. data/lib/pubid/csa/identifiers/bundled.rb +9 -25
  199. data/lib/pubid/csa/identifiers/canadian_adopted.rb +13 -13
  200. data/lib/pubid/csa/identifiers/cec.rb +103 -40
  201. data/lib/pubid/csa/identifiers/combined.rb +69 -97
  202. data/lib/pubid/csa/identifiers/csa_adopted.rb +4 -4
  203. data/lib/pubid/csa/identifiers/package.rb +4 -4
  204. data/lib/pubid/csa/identifiers/series.rb +104 -0
  205. data/lib/pubid/csa/parser.rb +8 -12
  206. data/lib/pubid/csa/scheme.rb +44 -0
  207. data/lib/pubid/csa/single_identifier.rb +5 -94
  208. data/lib/pubid/csa/urn_generator.rb +2 -9
  209. data/lib/pubid/csa/wrapper_identifier.rb +10 -43
  210. data/lib/pubid/csa.rb +1 -56
  211. data/lib/pubid/etsi/builder.rb +4 -13
  212. data/lib/pubid/etsi/components/code.rb +9 -10
  213. data/lib/pubid/etsi/components/version.rb +5 -0
  214. data/lib/pubid/etsi/identifier.rb +12 -2
  215. data/lib/pubid/etsi/identifiers/base.rb +24 -60
  216. data/lib/pubid/etsi/identifiers/etsi_standard.rb +4 -207
  217. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +14 -46
  218. data/lib/pubid/etsi/identifiers.rb +1 -0
  219. data/lib/pubid/etsi/parser.rb +3 -9
  220. data/lib/pubid/etsi/scheme.rb +42 -0
  221. data/lib/pubid/etsi.rb +2 -52
  222. data/lib/pubid/export/data_class_exporter.rb +59 -0
  223. data/lib/pubid/export/exporter.rb +47 -6
  224. data/lib/pubid/export/flavor_exporter.rb +276 -124
  225. data/lib/pubid/export/ieee_exporter.rb +78 -0
  226. data/lib/pubid/export/itu_exporter.rb +66 -0
  227. data/lib/pubid/export/nist_exporter.rb +64 -0
  228. data/lib/pubid/export/registry_exporter.rb +90 -0
  229. data/lib/pubid/export/scheme_exporter.rb +70 -0
  230. data/lib/pubid/export.rb +6 -0
  231. data/lib/pubid/identifier.rb +37 -920
  232. data/lib/pubid/identifier_metadata.rb +1 -1
  233. data/lib/pubid/identifier_registry.rb +198 -0
  234. data/lib/pubid/idf/builder.rb +7 -7
  235. data/lib/pubid/idf/identifier.rb +13 -23
  236. data/lib/pubid/idf/identifiers/amendment.rb +1 -2
  237. data/lib/pubid/idf/identifiers/corrigendum.rb +1 -2
  238. data/lib/pubid/idf/identifiers/international_standard.rb +1 -2
  239. data/lib/pubid/idf/identifiers/reviewed_method.rb +1 -2
  240. data/lib/pubid/idf/parser.rb +5 -6
  241. data/lib/pubid/idf/scheme.rb +61 -0
  242. data/lib/pubid/idf/supplement_identifier.rb +13 -5
  243. data/lib/pubid/idf/urn_generator.rb +39 -4
  244. data/lib/pubid/idf.rb +1 -65
  245. data/lib/pubid/iec/builder.rb +91 -92
  246. data/lib/pubid/iec/components/code.rb +32 -9
  247. data/lib/pubid/iec/components/publisher.rb +1 -1
  248. data/lib/pubid/iec/identifier.rb +8 -328
  249. data/lib/pubid/iec/identifiers/amendment.rb +5 -8
  250. data/lib/pubid/iec/identifiers/base.rb +31 -7
  251. data/lib/pubid/iec/identifiers/component_specification.rb +13 -3
  252. data/lib/pubid/iec/identifiers/conformity_assessment.rb +12 -1
  253. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +30 -29
  254. data/lib/pubid/iec/identifiers/corrigendum.rb +5 -4
  255. data/lib/pubid/iec/identifiers/fragment_identifier.rb +36 -43
  256. data/lib/pubid/iec/identifiers/guide.rb +18 -0
  257. data/lib/pubid/iec/identifiers/international_standard.rb +9 -24
  258. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +3 -2
  259. data/lib/pubid/iec/identifiers/operational_document.rb +13 -3
  260. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +15 -2
  261. data/lib/pubid/iec/identifiers/sheet_identifier.rb +24 -26
  262. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +13 -3
  263. data/lib/pubid/iec/identifiers/systems_reference_document.rb +13 -2
  264. data/lib/pubid/iec/identifiers/technical_report.rb +21 -3
  265. data/lib/pubid/iec/identifiers/technical_specification.rb +21 -3
  266. data/lib/pubid/iec/identifiers/technology_report.rb +12 -1
  267. data/lib/pubid/iec/identifiers/test_report_form.rb +46 -3
  268. data/lib/pubid/iec/identifiers/vap_identifier.rb +34 -33
  269. data/lib/pubid/iec/identifiers/white_paper.rb +13 -3
  270. data/lib/pubid/iec/identifiers/working_document.rb +60 -26
  271. data/lib/pubid/iec/parser.rb +42 -73
  272. data/lib/pubid/iec/scheme.rb +71 -0
  273. data/lib/pubid/iec/single_identifier.rb +23 -15
  274. data/lib/pubid/iec/supplement_identifier.rb +67 -84
  275. data/lib/pubid/iec/urn_generator.rb +143 -195
  276. data/lib/pubid/iec/urn_parser.rb +246 -85
  277. data/lib/pubid/iec.rb +66 -45
  278. data/lib/pubid/ieee/aiee/builder.rb +3 -17
  279. data/lib/pubid/ieee/aiee/identifier.rb +62 -46
  280. data/lib/pubid/ieee/aiee/parser.rb +1 -1
  281. data/lib/pubid/ieee/builder.rb +81 -398
  282. data/lib/pubid/ieee/components/code.rb +0 -8
  283. data/lib/pubid/ieee/components/draft.rb +0 -54
  284. data/lib/pubid/ieee/components/relationship.rb +149 -5
  285. data/lib/pubid/ieee/identifier.rb +11 -3
  286. data/lib/pubid/ieee/identifiers/adopted_standard.rb +14 -62
  287. data/lib/pubid/ieee/identifiers/base.rb +547 -340
  288. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +12 -6
  289. data/lib/pubid/ieee/identifiers/corrigendum.rb +12 -15
  290. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +13 -24
  291. data/lib/pubid/ieee/identifiers/dual_identifier.rb +7 -3
  292. data/lib/pubid/ieee/identifiers/dual_published.rb +7 -58
  293. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +11 -99
  294. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +11 -25
  295. data/lib/pubid/ieee/identifiers/joint_development.rb +15 -66
  296. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +24 -58
  297. data/lib/pubid/ieee/identifiers/nesc/base.rb +19 -90
  298. data/lib/pubid/ieee/identifiers/nesc/draft.rb +5 -20
  299. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +5 -16
  300. data/lib/pubid/ieee/identifiers/nesc/redline.rb +2 -11
  301. data/lib/pubid/ieee/identifiers/nesc/standard.rb +3 -18
  302. data/lib/pubid/ieee/identifiers/nesc.rb +0 -1
  303. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +9 -3
  304. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +6 -29
  305. data/lib/pubid/ieee/identifiers/redlined_standard.rb +11 -4
  306. data/lib/pubid/ieee/identifiers/si_standard.rb +39 -4
  307. data/lib/pubid/ieee/identifiers/standard.rb +2 -5
  308. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +7 -26
  309. data/lib/pubid/ieee/identifiers.rb +1 -2
  310. data/lib/pubid/ieee/ire/builder.rb +6 -7
  311. data/lib/pubid/ieee/ire/identifier.rb +33 -48
  312. data/lib/pubid/ieee/ire/parser.rb +1 -1
  313. data/lib/pubid/ieee/nesc/builder.rb +20 -33
  314. data/lib/pubid/ieee/nesc/parser.rb +15 -16
  315. data/lib/pubid/ieee/parser.rb +44 -462
  316. data/lib/pubid/ieee/scheme.rb +90 -0
  317. data/lib/pubid/ieee/typed_stages.rb +1 -12
  318. data/lib/pubid/ieee/urn_generator.rb +8 -35
  319. data/lib/pubid/ieee.rb +2 -133
  320. data/lib/pubid/ieee_debug.rb +1 -0
  321. data/lib/pubid/iho/builder.rb +2 -2
  322. data/lib/pubid/iho/identifier.rb +17 -5
  323. data/lib/pubid/iho/identifiers/base.rb +30 -64
  324. data/lib/pubid/iho/identifiers/bibliographic.rb +5 -1
  325. data/lib/pubid/iho/identifiers/circular_letter.rb +5 -1
  326. data/lib/pubid/iho/identifiers/miscellaneous.rb +5 -1
  327. data/lib/pubid/iho/identifiers/publication.rb +5 -1
  328. data/lib/pubid/iho/identifiers/standard.rb +5 -1
  329. data/lib/pubid/iho/identifiers.rb +1 -0
  330. data/lib/pubid/iho/parser.rb +4 -4
  331. data/lib/pubid/iho/scheme.rb +29 -0
  332. data/lib/pubid/iho/urn_generator.rb +3 -3
  333. data/lib/pubid/iho.rb +3 -59
  334. data/lib/pubid/iso/builder.rb +57 -68
  335. data/lib/pubid/iso/bundled_identifier.rb +3 -56
  336. data/lib/pubid/iso/combined_identifier.rb +4 -6
  337. data/lib/pubid/iso/components/code.rb +19 -7
  338. data/lib/pubid/iso/components/publisher.rb +8 -10
  339. data/lib/pubid/iso/components.rb +4 -2
  340. data/lib/pubid/iso/identifier.rb +11 -260
  341. data/lib/pubid/iso/identifiers/addendum.rb +6 -9
  342. data/lib/pubid/iso/identifiers/amendment.rb +4 -8
  343. data/lib/pubid/iso/identifiers/base.rb +115 -0
  344. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  345. data/lib/pubid/iso/identifiers/data.rb +1 -0
  346. data/lib/pubid/iso/identifiers/directives.rb +2 -8
  347. data/lib/pubid/iso/identifiers/directives_supplement.rb +26 -55
  348. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  349. data/lib/pubid/iso/identifiers/guide.rb +1 -0
  350. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  351. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  352. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +4 -10
  353. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  354. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  355. data/lib/pubid/iso/identifiers/supplement.rb +3 -11
  356. data/lib/pubid/iso/identifiers/tc_document.rb +15 -44
  357. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  358. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  359. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  360. data/lib/pubid/iso/identifiers.rb +1 -0
  361. data/lib/pubid/iso/parser.rb +19 -43
  362. data/lib/pubid/iso/scheme.rb +187 -0
  363. data/lib/pubid/iso/single_identifier.rb +7 -6
  364. data/lib/pubid/iso/supplement_identifier.rb +3 -29
  365. data/lib/pubid/iso/urn_generator.rb +177 -78
  366. data/lib/pubid/iso/urn_parser.rb +10 -29
  367. data/lib/pubid/iso.rb +2 -188
  368. data/lib/pubid/itu/builder.rb +41 -230
  369. data/lib/pubid/itu/components/code.rb +12 -57
  370. data/lib/pubid/itu/components/sector.rb +4 -15
  371. data/lib/pubid/itu/components/series.rb +4 -0
  372. data/lib/pubid/itu/identifier.rb +51 -2
  373. data/lib/pubid/itu/identifiers/amendment.rb +31 -7
  374. data/lib/pubid/itu/identifiers/annex.rb +4 -13
  375. data/lib/pubid/itu/identifiers/base.rb +128 -456
  376. data/lib/pubid/itu/identifiers/combined_identifier.rb +25 -99
  377. data/lib/pubid/itu/identifiers/corrigendum.rb +25 -16
  378. data/lib/pubid/itu/identifiers/recommendation.rb +4 -3
  379. data/lib/pubid/itu/identifiers/special_publication.rb +3 -3
  380. data/lib/pubid/itu/identifiers/supplement.rb +16 -119
  381. data/lib/pubid/itu/identifiers.rb +1 -10
  382. data/lib/pubid/itu/model.rb +1 -1
  383. data/lib/pubid/itu/parser.rb +27 -481
  384. data/lib/pubid/itu/scheme.rb +174 -0
  385. data/lib/pubid/itu/urn_generator.rb +6 -36
  386. data/lib/pubid/itu.rb +2 -58
  387. data/lib/pubid/jcgm/builder.rb +19 -37
  388. data/lib/pubid/jcgm/identifier.rb +0 -10
  389. data/lib/pubid/jcgm/identifiers/amendment.rb +11 -0
  390. data/lib/pubid/jcgm/identifiers/gum_guide.rb +15 -3
  391. data/lib/pubid/jcgm/identifiers.rb +0 -2
  392. data/lib/pubid/jcgm/parser.rb +7 -74
  393. data/lib/pubid/jcgm/scheme.rb +60 -0
  394. data/lib/pubid/jcgm/single_identifier.rb +14 -84
  395. data/lib/pubid/jcgm/supplement_identifier.rb +4 -39
  396. data/lib/pubid/jcgm/urn_generator.rb +19 -25
  397. data/lib/pubid/jcgm.rb +2 -57
  398. data/lib/pubid/jis/builder.rb +52 -44
  399. data/lib/pubid/jis/components/code.rb +59 -0
  400. data/lib/pubid/{astm → jis}/components.rb +1 -1
  401. data/lib/pubid/jis/identifier.rb +5 -181
  402. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  403. data/lib/pubid/jis/identifiers/base.rb +72 -0
  404. data/lib/pubid/jis/identifiers/standard.rb +1 -2
  405. data/lib/pubid/jis/identifiers/technical_report.rb +1 -2
  406. data/lib/pubid/jis/identifiers/technical_specification.rb +1 -2
  407. data/lib/pubid/jis/identifiers.rb +1 -1
  408. data/lib/pubid/jis/parser.rb +6 -32
  409. data/lib/pubid/jis/scheme.rb +49 -0
  410. data/lib/pubid/jis/single_identifier.rb +12 -6
  411. data/lib/pubid/jis/supplement_identifier.rb +14 -17
  412. data/lib/pubid/jis.rb +2 -48
  413. data/lib/pubid/nist/builder.rb +1765 -146
  414. data/lib/pubid/nist/components/code.rb +20 -9
  415. data/lib/pubid/nist/components/edition.rb +0 -16
  416. data/lib/pubid/nist/components/publisher.rb +24 -0
  417. data/lib/pubid/nist/components/supplement.rb +21 -91
  418. data/lib/pubid/nist/components.rb +1 -0
  419. data/lib/pubid/nist/configuration.rb +2 -12
  420. data/lib/pubid/nist/identifiers/base.rb +417 -662
  421. data/lib/pubid/nist/identifiers/circular.rb +5 -17
  422. data/lib/pubid/nist/identifiers/circular_supplement.rb +6 -16
  423. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -3
  424. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +5 -7
  425. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +5 -18
  426. data/lib/pubid/nist/identifiers/crpl_report.rb +13 -16
  427. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +17 -18
  428. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -3
  429. data/lib/pubid/nist/identifiers/handbook.rb +4 -12
  430. data/lib/pubid/nist/identifiers/internal_report.rb +7 -15
  431. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -3
  432. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +11 -20
  433. data/lib/pubid/nist/identifiers/monograph.rb +11 -22
  434. data/lib/pubid/nist/identifiers/ncstar.rb +2 -2
  435. data/lib/pubid/nist/identifiers/nsrds.rb +1 -1
  436. data/lib/pubid/nist/identifiers/owmwp.rb +1 -1
  437. data/lib/pubid/nist/identifiers/report.rb +10 -19
  438. data/lib/pubid/nist/identifiers/special_publication.rb +2 -12
  439. data/lib/pubid/nist/identifiers/technical_note.rb +3 -4
  440. data/lib/pubid/nist/identifiers.rb +1 -1
  441. data/lib/pubid/nist/parser.rb +429 -97
  442. data/lib/pubid/nist/scheme.rb +199 -0
  443. data/lib/pubid/nist/supplement_identifier.rb +34 -35
  444. data/lib/pubid/nist/urn_generator.rb +8 -14
  445. data/lib/pubid/nist.rb +5 -107
  446. data/lib/pubid/oiml/builder.rb +10 -91
  447. data/lib/pubid/oiml/components/code.rb +0 -17
  448. data/lib/pubid/oiml/identifier.rb +0 -53
  449. data/lib/pubid/oiml/identifiers/annex.rb +46 -13
  450. data/lib/pubid/oiml/identifiers/base.rb +36 -0
  451. data/lib/pubid/oiml/identifiers/basic_publication.rb +0 -2
  452. data/lib/pubid/oiml/identifiers/document.rb +0 -2
  453. data/lib/pubid/oiml/identifiers/expert_report.rb +0 -2
  454. data/lib/pubid/oiml/identifiers/guide.rb +0 -2
  455. data/lib/pubid/oiml/identifiers/recommendation.rb +0 -2
  456. data/lib/pubid/oiml/identifiers/seminar_report.rb +0 -2
  457. data/lib/pubid/oiml/identifiers/vocabulary.rb +0 -2
  458. data/lib/pubid/oiml/identifiers.rb +1 -3
  459. data/lib/pubid/oiml/parser.rb +17 -118
  460. data/lib/pubid/oiml/scheme.rb +46 -0
  461. data/lib/pubid/oiml/single_identifier.rb +43 -66
  462. data/lib/pubid/oiml/supplement_identifier.rb +17 -62
  463. data/lib/pubid/oiml/urn_generator.rb +8 -22
  464. data/lib/pubid/oiml.rb +1 -56
  465. data/lib/pubid/parser.rb +0 -1
  466. data/lib/pubid/parsers/mr_string.rb +7 -120
  467. data/lib/pubid/plateau/builder.rb +4 -8
  468. data/lib/pubid/plateau/identifiers/base.rb +36 -40
  469. data/lib/pubid/plateau/identifiers/handbook.rb +7 -1
  470. data/lib/pubid/plateau/identifiers/technical_report.rb +5 -1
  471. data/lib/pubid/plateau/identifiers.rb +1 -0
  472. data/lib/pubid/plateau/parser.rb +6 -16
  473. data/lib/pubid/plateau/scheme.rb +45 -0
  474. data/lib/pubid/plateau/supplement_identifier.rb +15 -11
  475. data/lib/pubid/plateau.rb +1 -58
  476. data/lib/pubid/renderers/base.rb +0 -47
  477. data/lib/pubid/renderers/directives_renderer.rb +14 -27
  478. data/lib/pubid/renderers/guide_renderer.rb +1 -7
  479. data/lib/pubid/renderers/human_readable.rb +9 -34
  480. data/lib/pubid/renderers/iwa_renderer.rb +1 -5
  481. data/lib/pubid/renderers/mr_string.rb +6 -54
  482. data/lib/pubid/renderers/supplement_renderer.rb +2 -5
  483. data/lib/pubid/renderers.rb +0 -1
  484. data/lib/pubid/rendering/base.rb +73 -0
  485. data/lib/pubid/rendering/common.rb +211 -0
  486. data/lib/pubid/rendering/context.rb +21 -33
  487. data/lib/pubid/rendering/format.rb +25 -0
  488. data/lib/pubid/rendering/numbering.rb +7 -25
  489. data/lib/pubid/rendering/supplement.rb +4 -4
  490. data/lib/pubid/rendering.rb +3 -0
  491. data/lib/pubid/sae/builder.rb +1 -1
  492. data/lib/pubid/sae/components/date.rb +0 -8
  493. data/lib/pubid/sae/components/type.rb +1 -5
  494. data/lib/pubid/sae/identifier.rb +12 -2
  495. data/lib/pubid/sae/identifiers/base.rb +28 -33
  496. data/lib/pubid/sae/identifiers.rb +1 -0
  497. data/lib/pubid/sae/parser.rb +1 -1
  498. data/lib/pubid/sae/scheme.rb +47 -0
  499. data/lib/pubid/sae/urn_generator.rb +10 -2
  500. data/lib/pubid/sae.rb +2 -49
  501. data/lib/pubid/scheme.rb +207 -0
  502. data/lib/pubid/urn_generator/base.rb +12 -12
  503. data/lib/pubid/version.rb +1 -1
  504. data/lib/pubid.rb +10 -424
  505. data/lib/tasks/export.rake +5 -6
  506. data/lib/tasks/website-data.json +1796 -1854
  507. metadata +45 -307
  508. data/data/bipm/update_codes.yaml +0 -9
  509. data/data/nist/series.yaml +0 -155
  510. data/lib/pubid/adobe/builder.rb +0 -52
  511. data/lib/pubid/adobe/identifier.rb +0 -47
  512. data/lib/pubid/adobe/identifiers/publication.rb +0 -31
  513. data/lib/pubid/adobe/identifiers/tech_note.rb +0 -32
  514. data/lib/pubid/adobe/identifiers.rb +0 -10
  515. data/lib/pubid/adobe/parser.rb +0 -136
  516. data/lib/pubid/adobe/renderer.rb +0 -39
  517. data/lib/pubid/adobe/urn_generator.rb +0 -42
  518. data/lib/pubid/adobe/urn_parser.rb +0 -69
  519. data/lib/pubid/adobe.rb +0 -60
  520. data/lib/pubid/amca/renderer.rb +0 -82
  521. data/lib/pubid/amca/urn_parser.rb +0 -28
  522. data/lib/pubid/ansi/renderer.rb +0 -53
  523. data/lib/pubid/ansi/urn_parser.rb +0 -23
  524. data/lib/pubid/api/identifiers.rb +0 -18
  525. data/lib/pubid/api/renderer.rb +0 -98
  526. data/lib/pubid/api/urn_parser.rb +0 -35
  527. data/lib/pubid/ashrae/renderer.rb +0 -117
  528. data/lib/pubid/ashrae/urn_parser.rb +0 -27
  529. data/lib/pubid/asme/renderer.rb +0 -66
  530. data/lib/pubid/asme/urn_parser.rb +0 -31
  531. data/lib/pubid/astm/identifiers/code_number.rb +0 -81
  532. data/lib/pubid/astm/identifiers.rb +0 -19
  533. data/lib/pubid/astm/renderer.rb +0 -172
  534. data/lib/pubid/astm/urn_parser.rb +0 -30
  535. data/lib/pubid/bipm/builder.rb +0 -163
  536. data/lib/pubid/bipm/identifier.rb +0 -285
  537. data/lib/pubid/bipm/identifiers/committee_document.rb +0 -36
  538. data/lib/pubid/bipm/identifiers/guide.rb +0 -35
  539. data/lib/pubid/bipm/identifiers/meeting.rb +0 -53
  540. data/lib/pubid/bipm/identifiers/mep.rb +0 -33
  541. data/lib/pubid/bipm/identifiers/metrologia_article.rb +0 -48
  542. data/lib/pubid/bipm/identifiers/si_brochure.rb +0 -33
  543. data/lib/pubid/bipm/identifiers.rb +0 -15
  544. data/lib/pubid/bipm/parser.rb +0 -237
  545. data/lib/pubid/bipm/renderer.rb +0 -118
  546. data/lib/pubid/bipm/urn_generator.rb +0 -58
  547. data/lib/pubid/bipm/urn_parser.rb +0 -60
  548. data/lib/pubid/bipm.rb +0 -91
  549. data/lib/pubid/bsi/renderer.rb +0 -1064
  550. data/lib/pubid/bsi/urn_parser.rb +0 -52
  551. data/lib/pubid/calconnect/builder.rb +0 -38
  552. data/lib/pubid/calconnect/identifier.rb +0 -121
  553. data/lib/pubid/calconnect/identifiers/standard.rb +0 -29
  554. data/lib/pubid/calconnect/identifiers.rb +0 -9
  555. data/lib/pubid/calconnect/parser.rb +0 -54
  556. data/lib/pubid/calconnect/renderer.rb +0 -36
  557. data/lib/pubid/calconnect/urn_generator.rb +0 -33
  558. data/lib/pubid/calconnect/urn_parser.rb +0 -34
  559. data/lib/pubid/calconnect.rb +0 -82
  560. data/lib/pubid/ccsds/urn_parser.rb +0 -20
  561. data/lib/pubid/cen_cenelec/renderer.rb +0 -261
  562. data/lib/pubid/cen_cenelec/urn_parser.rb +0 -28
  563. data/lib/pubid/cie/identifiers/code_attributes.rb +0 -52
  564. data/lib/pubid/cie/identifiers/proceedings.rb +0 -41
  565. data/lib/pubid/cie/urn_parser.rb +0 -28
  566. data/lib/pubid/components/adoption.rb +0 -104
  567. data/lib/pubid/components/iteration.rb +0 -32
  568. data/lib/pubid/components/relationship.rb +0 -151
  569. data/lib/pubid/components/supplement.rb +0 -184
  570. data/lib/pubid/csa/renderer.rb +0 -300
  571. data/lib/pubid/csa/urn_parser.rb +0 -33
  572. data/lib/pubid/doi/builder.rb +0 -18
  573. data/lib/pubid/doi/identifier.rb +0 -49
  574. data/lib/pubid/doi/identifiers/resource.rb +0 -30
  575. data/lib/pubid/doi/identifiers.rb +0 -9
  576. data/lib/pubid/doi/parser.rb +0 -52
  577. data/lib/pubid/doi/renderer.rb +0 -13
  578. data/lib/pubid/doi.rb +0 -55
  579. data/lib/pubid/easc/builder.rb +0 -55
  580. data/lib/pubid/easc/identifier.rb +0 -59
  581. data/lib/pubid/easc/identifiers/pmg.rb +0 -20
  582. data/lib/pubid/easc/identifiers/rmg.rb +0 -19
  583. data/lib/pubid/easc/identifiers.rb +0 -10
  584. data/lib/pubid/easc/parser.rb +0 -88
  585. data/lib/pubid/easc/renderer.rb +0 -48
  586. data/lib/pubid/easc/urn_generator.rb +0 -46
  587. data/lib/pubid/easc/urn_parser.rb +0 -57
  588. data/lib/pubid/easc.rb +0 -52
  589. data/lib/pubid/ecma/builder.rb +0 -45
  590. data/lib/pubid/ecma/identifier.rb +0 -147
  591. data/lib/pubid/ecma/identifiers/memento.rb +0 -30
  592. data/lib/pubid/ecma/identifiers/standard.rb +0 -31
  593. data/lib/pubid/ecma/identifiers/technical_report.rb +0 -31
  594. data/lib/pubid/ecma/identifiers.rb +0 -11
  595. data/lib/pubid/ecma/parser.rb +0 -76
  596. data/lib/pubid/ecma/renderer.rb +0 -67
  597. data/lib/pubid/ecma/urn_generator.rb +0 -46
  598. data/lib/pubid/ecma/urn_parser.rb +0 -51
  599. data/lib/pubid/ecma.rb +0 -67
  600. data/lib/pubid/errors.rb +0 -79
  601. data/lib/pubid/etsi/renderer.rb +0 -48
  602. data/lib/pubid/etsi/urn_parser.rb +0 -34
  603. data/lib/pubid/gb/builder.rb +0 -45
  604. data/lib/pubid/gb/identifier.rb +0 -67
  605. data/lib/pubid/gb/identifiers/standard.rb +0 -34
  606. data/lib/pubid/gb/identifiers.rb +0 -9
  607. data/lib/pubid/gb/parser.rb +0 -63
  608. data/lib/pubid/gb/renderer.rb +0 -35
  609. data/lib/pubid/gb.rb +0 -87
  610. data/lib/pubid/gost/builder.rb +0 -148
  611. data/lib/pubid/gost/identifier.rb +0 -47
  612. data/lib/pubid/gost/identifiers/foreign_reference.rb +0 -25
  613. data/lib/pubid/gost/identifiers/harmonized.rb +0 -39
  614. data/lib/pubid/gost/identifiers/identical_adoption.rb +0 -39
  615. data/lib/pubid/gost/identifiers/interstate_standard.rb +0 -20
  616. data/lib/pubid/gost/identifiers/national_standard.rb +0 -19
  617. data/lib/pubid/gost/identifiers.rb +0 -13
  618. data/lib/pubid/gost/parser.rb +0 -105
  619. data/lib/pubid/gost/renderer.rb +0 -48
  620. data/lib/pubid/gost/urn_generator.rb +0 -46
  621. data/lib/pubid/gost/urn_parser.rb +0 -52
  622. data/lib/pubid/gost.rb +0 -49
  623. data/lib/pubid/iala/builder.rb +0 -102
  624. data/lib/pubid/iala/identifier.rb +0 -90
  625. data/lib/pubid/iala/identifiers/advice.rb +0 -15
  626. data/lib/pubid/iala/identifiers/annex.rb +0 -57
  627. data/lib/pubid/iala/identifiers/general_assembly.rb +0 -19
  628. data/lib/pubid/iala/identifiers/guideline.rb +0 -17
  629. data/lib/pubid/iala/identifiers/letter.rb +0 -16
  630. data/lib/pubid/iala/identifiers/manual.rb +0 -18
  631. data/lib/pubid/iala/identifiers/model_course.rb +0 -17
  632. data/lib/pubid/iala/identifiers/recommendation.rb +0 -17
  633. data/lib/pubid/iala/identifiers/report.rb +0 -16
  634. data/lib/pubid/iala/identifiers/resolution.rb +0 -16
  635. data/lib/pubid/iala/identifiers/standard.rb +0 -17
  636. data/lib/pubid/iala/identifiers.rb +0 -19
  637. data/lib/pubid/iala/parser.rb +0 -138
  638. data/lib/pubid/iala/renderer.rb +0 -36
  639. data/lib/pubid/iala/urn_generator.rb +0 -49
  640. data/lib/pubid/iala/urn_parser.rb +0 -67
  641. data/lib/pubid/iala.rb +0 -71
  642. data/lib/pubid/iana/builder.rb +0 -22
  643. data/lib/pubid/iana/identifier.rb +0 -140
  644. data/lib/pubid/iana/identifiers/registry.rb +0 -69
  645. data/lib/pubid/iana/identifiers.rb +0 -9
  646. data/lib/pubid/iana/parser.rb +0 -38
  647. data/lib/pubid/iana/renderer.rb +0 -32
  648. data/lib/pubid/iana/urn_generator.rb +0 -19
  649. data/lib/pubid/iana/urn_parser.rb +0 -24
  650. data/lib/pubid/iana.rb +0 -69
  651. data/lib/pubid/idf/renderer.rb +0 -84
  652. data/lib/pubid/idf/urn_parser.rb +0 -25
  653. data/lib/pubid/iec/components.rb +0 -14
  654. data/lib/pubid/iec/identifiers/technical_group.rb +0 -30
  655. data/lib/pubid/iec/identifiers.rb +0 -31
  656. data/lib/pubid/iec/renderer.rb +0 -267
  657. data/lib/pubid/ieee/compaction.rb +0 -121
  658. data/lib/pubid/ieee/identifiers/amendment.rb +0 -40
  659. data/lib/pubid/ieee/identifiers/code_number.rb +0 -82
  660. data/lib/pubid/ieee/identifiers/nesc/edition.rb +0 -32
  661. data/lib/pubid/ieee/pre_parser.rb +0 -301
  662. data/lib/pubid/ieee/renderer.rb +0 -408
  663. data/lib/pubid/ieee/urn_parser.rb +0 -34
  664. data/lib/pubid/ietf/builder.rb +0 -78
  665. data/lib/pubid/ietf/identifier.rb +0 -5
  666. data/lib/pubid/ietf/identifiers/base.rb +0 -72
  667. data/lib/pubid/ietf/identifiers/bcp.rb +0 -36
  668. data/lib/pubid/ietf/identifiers/fyi.rb +0 -36
  669. data/lib/pubid/ietf/identifiers/internet_draft.rb +0 -45
  670. data/lib/pubid/ietf/identifiers/rfc.rb +0 -27
  671. data/lib/pubid/ietf/identifiers/serialization.rb +0 -51
  672. data/lib/pubid/ietf/identifiers/std.rb +0 -36
  673. data/lib/pubid/ietf/identifiers.rb +0 -14
  674. data/lib/pubid/ietf/parser.rb +0 -61
  675. data/lib/pubid/ietf/renderer.rb +0 -64
  676. data/lib/pubid/ietf/urn_generator.rb +0 -37
  677. data/lib/pubid/ietf/urn_parser.rb +0 -43
  678. data/lib/pubid/ietf.rb +0 -85
  679. data/lib/pubid/iho/renderer.rb +0 -30
  680. data/lib/pubid/iho/urn_parser.rb +0 -58
  681. data/lib/pubid/isbn/builder.rb +0 -44
  682. data/lib/pubid/isbn/check_digit.rb +0 -53
  683. data/lib/pubid/isbn/identifier.rb +0 -81
  684. data/lib/pubid/isbn/identifiers/book.rb +0 -30
  685. data/lib/pubid/isbn/identifiers.rb +0 -9
  686. data/lib/pubid/isbn/parser.rb +0 -45
  687. data/lib/pubid/isbn/renderer.rb +0 -16
  688. data/lib/pubid/isbn.rb +0 -52
  689. data/lib/pubid/iso/normalizer.rb +0 -89
  690. data/lib/pubid/itu/components/designation.rb +0 -35
  691. data/lib/pubid/itu/components.rb +0 -12
  692. data/lib/pubid/itu/identifiers/addendum.rb +0 -15
  693. data/lib/pubid/itu/identifiers/annex_of_recommendation.rb +0 -87
  694. data/lib/pubid/itu/identifiers/appendix_of_recommendation.rb +0 -92
  695. data/lib/pubid/itu/identifiers/errata.rb +0 -15
  696. data/lib/pubid/itu/identifiers/handbook.rb +0 -38
  697. data/lib/pubid/itu/identifiers/question.rb +0 -63
  698. data/lib/pubid/itu/identifiers/report.rb +0 -39
  699. data/lib/pubid/itu/identifiers/standard_serialization.rb +0 -58
  700. data/lib/pubid/itu/urn_parser.rb +0 -31
  701. data/lib/pubid/jcgm/identifiers/corrigendum.rb +0 -34
  702. data/lib/pubid/jcgm/identifiers/meeting.rb +0 -47
  703. data/lib/pubid/jcgm/renderer.rb +0 -89
  704. data/lib/pubid/jcgm/urn_parser.rb +0 -177
  705. data/lib/pubid/jis/identifiers/corrigendum.rb +0 -16
  706. data/lib/pubid/jis/renderer.rb +0 -69
  707. data/lib/pubid/jis/urn_parser.rb +0 -23
  708. data/lib/pubid/nist/caster.rb +0 -1234
  709. data/lib/pubid/nist/circular_supplement_builder.rb +0 -293
  710. data/lib/pubid/nist/identifier.rb +0 -8
  711. data/lib/pubid/nist/identifiers/dated_document.rb +0 -49
  712. data/lib/pubid/nist/parser_output_normalizer.rb +0 -233
  713. data/lib/pubid/nist/preprocessor.rb +0 -443
  714. data/lib/pubid/nist/renderer.rb +0 -43
  715. data/lib/pubid/nist/router.rb +0 -149
  716. data/lib/pubid/nist/series/base.rb +0 -58
  717. data/lib/pubid/nist/series/crpl.rb +0 -13
  718. data/lib/pubid/nist/series/fips.rb +0 -14
  719. data/lib/pubid/nist/series/ir.rb +0 -57
  720. data/lib/pubid/nist/series/letter_preserving.rb +0 -15
  721. data/lib/pubid/nist/series/mono.rb +0 -19
  722. data/lib/pubid/nist/series/ncstar.rb +0 -20
  723. data/lib/pubid/nist/series.rb +0 -49
  724. data/lib/pubid/nist/urn_parser.rb +0 -67
  725. data/lib/pubid/oasis/builder.rb +0 -79
  726. data/lib/pubid/oasis/identifier.rb +0 -160
  727. data/lib/pubid/oasis/identifiers/standard.rb +0 -29
  728. data/lib/pubid/oasis/identifiers.rb +0 -9
  729. data/lib/pubid/oasis/parser.rb +0 -34
  730. data/lib/pubid/oasis/renderer.rb +0 -29
  731. data/lib/pubid/oasis/urn_generator.rb +0 -25
  732. data/lib/pubid/oasis/urn_parser.rb +0 -22
  733. data/lib/pubid/oasis.rb +0 -79
  734. data/lib/pubid/ogc/builder.rb +0 -33
  735. data/lib/pubid/ogc/identifier.rb +0 -81
  736. data/lib/pubid/ogc/identifiers/document.rb +0 -26
  737. data/lib/pubid/ogc/identifiers.rb +0 -10
  738. data/lib/pubid/ogc/parser.rb +0 -40
  739. data/lib/pubid/ogc/renderer.rb +0 -33
  740. data/lib/pubid/ogc/urn_generator.rb +0 -14
  741. data/lib/pubid/ogc/urn_parser.rb +0 -22
  742. data/lib/pubid/ogc.rb +0 -71
  743. data/lib/pubid/oiml/identifiers/bulletin.rb +0 -137
  744. data/lib/pubid/oiml/identifiers/code_number.rb +0 -90
  745. data/lib/pubid/oiml/identifiers/errata.rb +0 -15
  746. data/lib/pubid/oiml/renderer.rb +0 -232
  747. data/lib/pubid/oiml/urn_parser.rb +0 -39
  748. data/lib/pubid/omg/builder.rb +0 -19
  749. data/lib/pubid/omg/identifier.rb +0 -47
  750. data/lib/pubid/omg/identifiers/specification.rb +0 -32
  751. data/lib/pubid/omg/identifiers.rb +0 -9
  752. data/lib/pubid/omg/parser.rb +0 -40
  753. data/lib/pubid/omg/renderer.rb +0 -19
  754. data/lib/pubid/omg.rb +0 -51
  755. data/lib/pubid/parser/grammar.rb +0 -74
  756. data/lib/pubid/plateau/identifier.rb +0 -4
  757. data/lib/pubid/plateau/renderer.rb +0 -51
  758. data/lib/pubid/plateau/urn_parser.rb +0 -43
  759. data/lib/pubid/prefixes_support.rb +0 -51
  760. data/lib/pubid/renderers/annotator.rb +0 -233
  761. data/lib/pubid/sae/renderer.rb +0 -36
  762. data/lib/pubid/sae/urn_parser.rb +0 -36
  763. data/lib/pubid/tgpp/builder.rb +0 -41
  764. data/lib/pubid/tgpp/identifier.rb +0 -107
  765. data/lib/pubid/tgpp/identifiers/technical_report.rb +0 -32
  766. data/lib/pubid/tgpp/identifiers/technical_specification.rb +0 -33
  767. data/lib/pubid/tgpp/identifiers.rb +0 -11
  768. data/lib/pubid/tgpp/parser.rb +0 -78
  769. data/lib/pubid/tgpp/renderer.rb +0 -52
  770. data/lib/pubid/tgpp/urn_generator.rb +0 -39
  771. data/lib/pubid/tgpp/urn_parser.rb +0 -30
  772. data/lib/pubid/tgpp.rb +0 -83
  773. data/lib/pubid/type_resolver.rb +0 -59
  774. data/lib/pubid/un/builder.rb +0 -42
  775. data/lib/pubid/un/identifier.rb +0 -40
  776. data/lib/pubid/un/identifiers/document.rb +0 -24
  777. data/lib/pubid/un/identifiers.rb +0 -9
  778. data/lib/pubid/un/parser.rb +0 -25
  779. data/lib/pubid/un/renderer.rb +0 -11
  780. data/lib/pubid/un.rb +0 -46
  781. data/lib/pubid/urn_parser/base.rb +0 -81
  782. data/lib/pubid/urn_parser/errors.rb +0 -16
  783. data/lib/pubid/urn_parser.rb +0 -14
  784. data/lib/pubid/w3c/builder.rb +0 -55
  785. data/lib/pubid/w3c/identifier.rb +0 -130
  786. data/lib/pubid/w3c/identifiers/candidate_recommendation.rb +0 -31
  787. data/lib/pubid/w3c/identifiers/candidate_recommendation_draft.rb +0 -31
  788. data/lib/pubid/w3c/identifiers/draft_note.rb +0 -31
  789. data/lib/pubid/w3c/identifiers/note.rb +0 -30
  790. data/lib/pubid/w3c/identifiers/obsolete_recommendation.rb +0 -31
  791. data/lib/pubid/w3c/identifiers/proposed_edited_recommendation.rb +0 -31
  792. data/lib/pubid/w3c/identifiers/proposed_recommendation.rb +0 -31
  793. data/lib/pubid/w3c/identifiers/recommendation.rb +0 -31
  794. data/lib/pubid/w3c/identifiers/standard.rb +0 -12
  795. data/lib/pubid/w3c/identifiers/superseded_recommendation.rb +0 -31
  796. data/lib/pubid/w3c/identifiers/working_draft.rb +0 -30
  797. data/lib/pubid/w3c/identifiers.rb +0 -25
  798. data/lib/pubid/w3c/parser.rb +0 -43
  799. data/lib/pubid/w3c/renderer.rb +0 -35
  800. data/lib/pubid/w3c/urn_generator.rb +0 -18
  801. data/lib/pubid/w3c/urn_parser.rb +0 -36
  802. data/lib/pubid/w3c.rb +0 -67
  803. data/lib/pubid/xsf/builder.rb +0 -17
  804. data/lib/pubid/xsf/identifier.rb +0 -66
  805. data/lib/pubid/xsf/identifiers/xep.rb +0 -31
  806. data/lib/pubid/xsf/identifiers.rb +0 -9
  807. data/lib/pubid/xsf/parser.rb +0 -25
  808. data/lib/pubid/xsf/renderer.rb +0 -23
  809. data/lib/pubid/xsf/urn_generator.rb +0 -13
  810. data/lib/pubid/xsf/urn_parser.rb +0 -18
  811. data/lib/pubid/xsf.rb +0 -81
@@ -7,7 +7,7 @@ module Pubid
7
7
  # Parser class for IEEE identifiers
8
8
  # Single Responsibility: Parsing IEEE identifier syntax
9
9
  # Note: IEEE is extremely complex with many edge cases
10
- class Parser < ::Pubid::Parser::Grammar
10
+ class Parser < Parslet::Parser
11
11
  # Basic building blocks
12
12
  rule(:space) { str(" ") }
13
13
  rule(:space?) { space.maybe }
@@ -57,24 +57,6 @@ module Pubid
57
57
  date_with_month_text | date_with_month_numeric | date_year_only
58
58
  end
59
59
 
60
- # Trailing print/reaffirm date "<sep>Month YYYY" — captured under the
61
- # distinct :trailing_month/:trailing_year keys so it never collides with a
62
- # base -YYYY identity year (the builder promotes it only when no base year
63
- # exists). Accepts BOTH a month name ("May 2014") and a month-first numeric
64
- # month ("05 2014"). The two variants are unambiguous: month_name never
65
- # starts with a digit, and month_numeric (01-12) never matches a bare
66
- # 19xx/20xx year — so a bare trailing year still falls through to callers'
67
- # own bare-year clause.
68
- rule(:trailing_month_year) do
69
- # The numeric branch accepts `-` as well as space before the year:
70
- # preprocessing (the `(\d)\s+(\d{4})` gsub) rewrites a trailing
71
- # "05 2014" → "05-2014", so a numeric month reaches the grammar
72
- # dash-joined; the month-name branch escapes that gsub (the char before
73
- # the space is a letter) and stays space-joined.
74
- ((comma | space) >> month_name.as(:trailing_month) >> space >> year_digits.as(:trailing_year)) |
75
- ((comma | space) >> month_numeric.as(:trailing_month) >> (space | dash) >> year_digits.as(:trailing_year))
76
- end
77
-
78
60
  # Month patterns
79
61
  rule(:month_name) do
80
62
  # Period-suffixed abbreviations (longest first)
@@ -93,17 +75,9 @@ module Pubid
93
75
  # Organizations
94
76
  rule(:organization) do
95
77
  str("IEEE") | str("AIEE") | str("ANSI") | str("ASA") |
96
- # ANS (American Nuclear Society) — a third co-publisher on nuclear
97
- # standards ("ANSI/IEEE/ANS 7.4-3-2-1982"). Listed AFTER ANSI so it
98
- # never shadows the longer token.
99
- str("ANS") |
100
78
  str("IEC") | str("ISO") | str("ASTM") | str("CSA") | str("ASME") |
101
79
  str("NACE") | str("NSF") | str("ASHRAE") | str("NCTA") | str("AESC") |
102
- str("EIA") | # NEW Session 224: Add EIA support
103
- # Historical / foreign co-publishers seen in relaton-data-ieee
104
- # (bucket 4): AMPP, USAS (both standalone), and the IEEE sub-board /
105
- # partner co-publishers USEMCSC, EAB, MPAI.
106
- str("USEMCSC") | str("AMPP") | str("USAS") | str("EAB") | str("MPAI")
80
+ str("EIA") # NEW Session 224: Add EIA support
107
81
  end
108
82
 
109
83
  # Complex organization prefixes (Category 5: ANSI Complex)
@@ -156,42 +130,12 @@ module Pubid
156
130
  (slash >> str("C") >> digits >> dot >> digits >> dot >> digits >> dash >> year_digits).as(:ieee_crossref)
157
131
  end
158
132
 
159
- # IPCEA co-designation suffix (/IPCEA P-46-426-1962). Captured verbatim
160
- # (leading slash included) so it round-trips through the `crossref`
161
- # attribute. Used only by the S-designation rule below.
162
- rule(:ipcea_copub) do
163
- (slash >> str("IPCEA") >> space >>
164
- match('[A-Za-z0-9.\-]').repeat(1)).as(:ipcea_copub)
165
- end
166
-
167
- # Historical IEEE/IPCEA co-published cable designation (e.g. S-135).
168
- # The "S-<digits>" number has a dash between the letter series and the
169
- # digits, which the shared `number` rule deliberately rejects (that
170
- # tightening is what keeps a bare "IEEE S" from parsing). So this one-off
171
- # family gets its own rule rather than loosening `number` and risking the
172
- # 12k-row corpus. Requiring `str("S") >> dash >> digits` keeps "IEEE S"
173
- # (no dash+digit) rejected. Handles: "IEEE Std S-135", "IEEE S-135",
174
- # bare "S-135", the "/IPCEA …" slash co-designation, and the
175
- # "(IPCEA …)" parenthetical variant.
176
- rule(:s_designation) do
177
- (publisher >> space).maybe >>
178
- (type_word.as(:type) >> space?).maybe >>
179
- (str("S") >> dash >> digits).as(:s_number) >>
180
- ipcea_copub.maybe >>
181
- parenthetical.maybe
182
- end
183
-
184
133
  # Document number - support letters and digits, with optional prefix P
185
134
  # Complex multi-part numbers like P11073-10404-10419 should be fully captured
186
135
  # But simple cases like "623-1976" should not consume the dash before year
187
136
  rule(:number) do
188
137
  (str("P").maybe >>
189
- # The numeric core must contain at least one digit: an optional letter
190
- # prefix (C, S, …) then a required `digits` run, then any digit/letter
191
- # tail. The old `(digits | upper).repeat(1)` wrongly accepted an
192
- # all-letter token like a bare "S" (a prefix with no number — e.g.
193
- # "IEEE S"), which is not a valid IEEE identifier.
194
- upper.repeat(0) >> digits >> (digits | upper).repeat(0) >>
138
+ (digits | upper).repeat(1) >> # The first component must be at least one digit
195
139
  # Only consume dash+digits if followed by another dash+digits (multi-part pattern)
196
140
  # OR if the digits don't look like a year (not 4 digits starting with 19/20)
197
141
  # This prevents consuming "623-1976" as a number but allows "P11073-10404-10419"
@@ -226,14 +170,7 @@ module Pubid
226
170
 
227
171
  # Draft patterns
228
172
  rule(:draft_status) do
229
- # "Active" (bucket 3) joins the generic draft-status path so
230
- # "IEEE Active Std P… /D…" parses like the "Unapproved" forms, without
231
- # touching ieee_approved_draft_identifier (which would break the
232
- # issue-#209 unapproved-drops-Std rendering). "Active Approved" completes
233
- # the two-word matrix alongside "Active Unapproved" (draft-grammar
234
- # coverage: the "<status> Draft P…/D…" prefix forms). Longest token first.
235
- (str("Active Unapproved") | str("Active Approved") | str("Unapproved") |
236
- str("Approved") | str("Active")) >> space
173
+ (str("Active Unapproved") | str("Unapproved") | str("Approved")) >> space
237
174
  end
238
175
 
239
176
  rule(:draft_prefix) do
@@ -243,11 +180,7 @@ module Pubid
243
180
  rule(:draft_version) do
244
181
  # Enhanced to handle multiple draft notation patterns
245
182
  # D is optional to handle /08 style drafts (e.g., IEEE P1052/08)
246
- # A draft never begins with "R-" — that is the revision suffix
247
- # (revision_suffix rule); guard so the D-less path doesn't swallow a
248
- # bare "/R-<id>" (e.g. the no-draft "P1722/R-1") as a draft.
249
- (str("R") >> dash).absent? >>
250
- (str("D") >> str("IS").absent?).maybe >> # Avoid matching "DIS" (ISO stage)
183
+ (str("D") >> str("IS").absent?).maybe >> # Avoid matching "DIS" (ISO stage)
251
184
  (
252
185
  # Pattern: D3.1 (decimal with 1-2 digits on each side) - MOST COMMON, put first
253
186
  # Also handles trailing letter: D7.3A, D2.0E
@@ -269,17 +202,8 @@ module Pubid
269
202
  rule(:draft_date) do
270
203
  # Enhanced to handle: ", Sept 2008" or " Sept 2008" or ", Month Year"
271
204
  ((comma | space) >> month_name.as(:month) >> space >> year_digits.as(:year)) |
272
- # Numeric-month form ", 05 2007" / " 05 2007" — no text month name. The
273
- # year separator may be a dash: preprocessing (parser.rb ~1278) rewrites
274
- # a trailing " <digits> <year>" to "<digits>-<year>", so "05 2007"
275
- # reaches the grammar as "05-2007".
276
- ((comma | space) >> month_numeric.as(:month) >> (space | dash) >> year_digits.as(:year)) |
277
205
  (((space? >> comma >> space?) | space) >> month_name.as(:month) >>
278
206
  (
279
- # "Month DD, Year" (day then comma) and "Month DD Year" (day, no
280
- # comma) — the day/year separator may be a dash for the same
281
- # preprocessing reason ("July 15 2012" → "July 15-2012").
282
- ((space >> digits.as(:day)) >> ((comma | space | dash) >> year_digits.as(:year))) |
283
207
  ((space >> digits.as(:day)).maybe >> comma >> year_digits.as(:year)) |
284
208
  (comma >> space? >> year_digits.as(:year)) |
285
209
  (space >> year_digits.as(:year))
@@ -305,32 +229,13 @@ module Pubid
305
229
  draft_date.maybe).as(:draft)
306
230
  end
307
231
 
308
- # Trailing revision suffix "/R-<id>". Normalization funnels every revision
309
- # spelling here — IEEE's native inline "Rev<n>" (repositioned) and
310
- # relaton's synthetic "/R-<x>" (kept in place) — so a single trailing rule
311
- # captures them all. The id is alphanumeric ("2", "18", "i").
312
- rule(:revision_suffix) do
313
- slash >> str("R") >> dash >> match('[0-9A-Za-z]').repeat(1).as(:revision)
314
- end
315
-
316
232
  # Edition - enhanced to support IEC formats like "Edition 1.0 2015-03"
317
- #
318
- # The edition's own year is captured as :edition_year (NOT :year). The
319
- # generic Std branch carries a base "-YYYY" slot AND a separate trailing
320
- # `edition.maybe`; a bare :year here would collide with the base :year
321
- # when both fire, so Parslet warns "Duplicate subtrees … keys: [:year]"
322
- # and drops the base identity year (the same failure #299 fixed for the
323
- # trailing month/year clause). The builder promotes :edition_year to the
324
- # identity year only when there is no base year.
325
233
  rule(:edition) do
326
- (comma >> year_digits.as(:edition_year) >> str(" Edition")) |
234
+ (comma >> year_digits.as(:year) >> str(" Edition")) |
327
235
  ((space | dash) >> str("Edition ") >>
328
236
  (digits >> dot >> digits).as(:edition) >>
329
- # Year separator: a space, " - ", or a bare dash (preprocessing
330
- # rewrites "Edition 3.0 2016" -> "Edition 3.0-2016", the shape the
331
- # normalized "/E-<n>-YYYY" suffix produces — nil-residue item 1).
332
- (str(" - ") | space | dash) >>
333
- year_digits.as(:edition_year) >>
237
+ (space | str(" - ")) >>
238
+ year_digits.as(:year) >>
334
239
  (dash >> digit.repeat(2, 2).as(:edition_month)).maybe) # Capture -MM as edition_month
335
240
  end
336
241
 
@@ -356,16 +261,10 @@ module Pubid
356
261
  ((dash | str(":") | space) >> year_digits.as(:cor_year)).maybe).as(:corrigendum)
357
262
  end
358
263
 
359
- # Amendment — mirrors the corrigendum rule's separator flexibility so
360
- # IEEE-format "/Amd 2-2004" and "/Amd2-2004" parse the same way as
361
- # their Cor counterparts (issue #210).
264
+ # Amendment
362
265
  rule(:amendment) do
363
- ((str("_") | slash | dash | space) >>
364
- (str("Amendment") | str("Amd")) >>
365
- (dash | dot | space).maybe >>
366
- space? >>
367
- digits.as(:amd_number).maybe >>
368
- ((dash | str(":") | space) >> year_digits.as(:amd_year)).maybe).as(:amendment)
266
+ (slash >> str("Amd") >> digits.as(:amd_number) >>
267
+ (dash >> year_digits.as(:amd_year)).maybe).as(:amendment)
369
268
  end
370
269
 
371
270
  # Interpretation notation (/INT)
@@ -384,14 +283,9 @@ module Pubid
384
283
  ).as(:reaffirmed)
385
284
  end
386
285
 
387
- # Redline suffix at the very end. Accepts relaton's canonical " Redline"
388
- # (space, no dash) and pubid's older " - Redline" (space-dash-space),
389
- # case-insensitive. Captured (presence only) so the builder sets a
390
- # `redline: true` flag the renderer restores — a redline is a distinct
391
- # document and must not collapse to its base standard.
286
+ # Redline
392
287
  rule(:redline) do
393
- (space >> (dash >> space).maybe >>
394
- (str("Redline") | str("REDLINE") | str("redline"))).as(:redline)
288
+ str(" - Redline").as(:redline)
395
289
  end
396
290
 
397
291
  # Book nickname (e.g., "[The Orange Book]", "[IEEE Gold Book]")
@@ -452,11 +346,8 @@ module Pubid
452
346
  str(" and ").absent? >>
453
347
  str(", ").absent? >>
454
348
  str(" as amended by ").absent? >>
455
- # Stop at any "/", ";", or "-" that introduces another relationship
456
- # (look-ahead: separator + relationship_type keyword). This lets the
457
- # slash inside "IEEE Std 525-2007/Cor 1-2015" stay part of the
458
- # identifier, while the slash before "Incorporates ..." splits.
459
- relationship_break.absent? >>
349
+ str(" / ").absent? >>
350
+ str("; ").absent? >>
460
351
  str(")").absent? >>
461
352
  match(".")
462
353
  ).repeat(1)
@@ -481,38 +372,15 @@ module Pubid
481
372
  str(" and its approved amendments").as(:approved_amendments)
482
373
  end
483
374
 
484
- # A character sequence that may separate two relationships inside the
485
- # parenthetical: a "/", ";", or "-" with optional surrounding spaces.
486
- # Standalone it is permissive — the actual decision to split is gated by
487
- # `relationship_break`, which requires another relationship_type to
488
- # follow. This way the slash in "IEEE Std 525-2007/Cor 1-2015" stays
489
- # part of the related identifier.
490
- rule(:relationship_separator) do
491
- (space.maybe >> str("/") >> space.maybe) |
492
- (space.maybe >> str(";") >> space.maybe) |
493
- (space.maybe >> str("-") >> space.maybe)
494
- end
495
-
496
- # Look-ahead: a separator followed by another relationship_type keyword.
497
- # Used as an absent? guard in identifier_string so the parser stops
498
- # consuming characters right before a new relationship begins.
499
- rule(:relationship_break) do
500
- relationship_separator >> space.maybe >> relationship_type
501
- end
502
-
503
375
  # Relationship clause (handles all relationship types)
504
376
  rule(:relationship_clause) do
505
377
  space.maybe >> str("(") >>
506
378
  relationship_type.as(:relationship_type) >>
507
379
  identifier_list.as(:related_ids) >>
508
380
  as_amended_by_clause.maybe >>
509
- # Additional relationships separated by "/", ";", or "-" (optionally
510
- # surrounded by spaces). The separator is only honored when followed
511
- # by another relationship_type — identifier-internal slashes like
512
- # "/Cor 1-2015" are not mistaken for relationship breaks because
513
- # identifier_string stops at relationship_break ahead.
381
+ # Handle multiple relationships separated by " / " OR "; "
514
382
  (
515
- relationship_separator >>
383
+ (str(" / ") | str("; ")) >> # Support both separators
516
384
  relationship_type.as(:relationship_type) >>
517
385
  identifier_list.as(:related_ids) >>
518
386
  as_amended_by_clause.maybe
@@ -567,11 +435,6 @@ module Pubid
567
435
  str("IEC/IEEE") >>
568
436
  space >>
569
437
  str("P").absent? >> # NOT a P prefix (would be joint development)
570
- # The copublished number must contain at least one digit. This rejects
571
- # an all-letter placeholder like "IEC/IEEE TR" (no real document
572
- # number) — the same "require a digit" tightening the Standard number
573
- # rule got, applied to the copublished number grammar.
574
- (match("[^0-9\n]").repeat >> digit).present? >>
575
438
  match("[^\n]").repeat(1).as(:content)
576
439
  end
577
440
 
@@ -593,100 +456,20 @@ module Pubid
593
456
  # Variant 2: , CDV1 notation (comma before stage code)
594
457
  (comma >> (str("CDV") | str("FDIS") | str("CD") | str("DIS")).as(:iec_stage) >> digits.maybe.as(:stage_iteration))
595
458
  ).maybe >>
596
- # Optional edition, from relaton's "/E-<n>" suffix normalized to
597
- # "Edition <n>.0[ YYYY]" (nil-residue hand-off item 1). The edition
598
- # rule carries its own year, so the year clause below simply doesn't
599
- # fire when an edition is present.
600
- edition.maybe >>
601
459
  ((dash >> year_digits.as(:year)) | # Either -YEAR
602
- (comma.maybe >> space >> month_name.as(:month) >> space.maybe >> year_digits.as(:year))).maybe >> # Or Month YEAR (with optional comma)
603
- revision_suffix.maybe
460
+ (comma.maybe >> space >> month_name.as(:month) >> space.maybe >> year_digits.as(:year))).maybe # Or Month YEAR (with optional comma)
604
461
  end
605
462
 
606
463
  rule(:joint_development_iso_format) do
607
- # ISO-led stage designations. Two spellings:
608
- # colon form : "ISO/IEC/IEEE FDIS 26511:2018" (already used)
609
- # corpus form : "ISO/IEC/IEEE FDIS P26515-2018-05" (historical)
610
- # The corpus form adds a leading "P" on the number, a trailing
611
- # "-YYYY[-MM]" date (instead of ":YYYY"), multi-digit committee-draft
612
- # stage codes (CD1..CD4) plus CDV, and a wider set of joint publishers.
613
- # (roadmap items 2/3, phase 1). longest publisher token first.
614
- (str("ISO/IEC/IEEE") | str("IEEE/ISO/IEC") | str("IEEE/IEC/ISO") |
615
- str("ISO/IEEE") | str("IEC/IEEE") | str("IEEE/IEC") | str("ISO/IEC") |
616
- str("IEEE")).as(:joint_publishers) >>
464
+ # ISO/IEC/IEEE FDIS 26511:2018 (ISO-led format)
465
+ (str("ISO/IEC/IEEE") | str("ISO/IEEE") | str("IEC/IEEE")).as(:joint_publishers) >>
617
466
  space >>
618
- # ISO stage codes: FDIS, FCD, CDV; DIS/CD with an optional round digit
619
- # (DIS2, CD1..CD4); WD/PWI/NP. (FCD before FDIS is fine — distinct.)
620
- (str("FDIS") | str("FCD") | str("CDV") |
621
- (str("DIS") >> digit.maybe) |
622
- (str("CD") >> digit.maybe) |
623
- str("WD") | str("PWI") | str("NP")).as(:iso_stage) >>
624
- # optional " Std" noise word after the stage (e.g. "FDIS Std P15288")
625
- (space >> str("Std")).maybe >>
467
+ # ISO stage codes
468
+ (str("FDIS") | str("DIS") | str("CD") | str("WD") | str("PWI") | str("NP")).as(:iso_stage) >>
626
469
  space >>
627
- str("P").maybe >> # optional project marker on the number
628
470
  digits.as(:number) >>
629
- # part must not swallow the trailing year (year_digits.absent?)
630
- ((dot | dash) >> year_digits.absent? >> digits.as(:part)).maybe >>
631
- (
632
- (str(":") >> year_digits.as(:year)) |
633
- (dash >> year_digits.as(:year) >>
634
- (dash >> month_numeric.as(:month)).maybe) |
635
- # Trailing text date ", April 2015" / " April 2015" (build_joint_development
636
- # already reads :month/:year). No :year collision — the iso rule has no
637
- # other :year capture (edition uses :edition_year).
638
- ((comma | space) >> month_name.as(:month) >> space >> year_digits.as(:year))
639
- ).maybe >>
640
- # Optional /D<draft> tail. normalize_relaton_suffixes repositions the
641
- # historical "…/D-3-2017" onto the number as "…-2017/D3", so by the
642
- # time this rule runs the draft usually trails the date (bucket 5);
643
- # a date-less "/D-4" keeps its hyphen (bucket 7), hence dash.maybe.
644
- (slash >> str("D") >> dash.maybe >>
645
- match('[0-9.]').repeat(1).as(:draft_version)).maybe >>
646
- # Optional edition, from relaton's "/E-<n>" suffix normalized to
647
- # "Edition <n>.0[ YYYY]" (nil-residue hand-off item 1).
648
- edition.maybe >>
649
- revision_suffix.maybe
650
- end
651
-
652
- # Embedded (stage-LAST) ISO-led designations: the corpus writes the ISO
653
- # stage AFTER the (dotted or dashed) part —
654
- # "ISO/IEC/IEEE 29119.4.FDIS, April 2015" (dot part .4, stage .FDIS)
655
- # "ISO/IEC/IEEE 24748-5.CD3, February 2015" (dash part -5, stage .CD3)
656
- # "IEEE P24748.5.CD3, July 2015" (bare IEEE + P)
657
- # — rather than before the number (joint_development_iso_format). Same
658
- # meaning as the stage-first form: `29119.4`/`29119-4` = "29119 part 4" and
659
- # the trailing `.FDIS` is the ISO stage, NOT a second part. Routes through
660
- # the same build_joint_development (via :joint_publishers/:iso_stage), so the
661
- # stage is modeled correctly and the numeric part stays separate.
662
- rule(:joint_development_embedded_stage) do
663
- # publisher set mirrors joint_development_iso_format (incl. bare IEEE);
664
- # longest token first.
665
- (str("ISO/IEC/IEEE") | str("IEEE/ISO/IEC") | str("IEEE/IEC/ISO") |
666
- str("ISO/IEEE") | str("IEC/IEEE") | str("IEEE/IEC") | str("ISO/IEC") |
667
- str("IEEE")).as(:joint_publishers) >>
668
- space >>
669
- str("P").maybe >> # optional project marker on the number
670
- digits.as(:number) >>
671
- # optional numeric part (dot or dash); must not swallow a year
672
- ((dot | dash) >> year_digits.absent? >> digits.as(:part)).maybe >>
673
- # the embedded stage, dot-separated, closed vocab (same as iso_stage).
674
- # The (digit|letter) look-ahead keeps it at a token boundary so "CD"
675
- # can't match inside a longer token and a glued no-space date
676
- # (".DISMay2013") is left to fall through.
677
- dot >>
678
- (str("FDIS") | str("FCD") | str("CDV") |
679
- (str("DIS") >> digit.maybe) |
680
- (str("CD") >> digit.maybe) |
681
- str("WD") | str("PWI") | str("NP")).as(:iso_stage) >>
682
- (digit | match("[A-Za-z]")).absent? >>
683
- # optional trailing date: :YYYY, -YYYY[-MM], or text "Month YYYY"
684
- (
685
- (str(":") >> year_digits.as(:year)) |
686
- (dash >> year_digits.as(:year) >>
687
- (dash >> month_numeric.as(:month)).maybe) |
688
- ((comma | space) >> month_name.as(:month) >> space >> year_digits.as(:year))
689
- ).maybe
471
+ ((dot | dash) >> digits.as(:part)).maybe >> # Optional part
472
+ (str(":") >> year_digits.as(:year)).maybe
690
473
  end
691
474
 
692
475
  # Number-first pattern: "1873-2015 IEEE Standard..."
@@ -710,25 +493,12 @@ module Pubid
710
493
  (slash >> digits.as(:draft_version)).as(:digit_draft).maybe >>
711
494
  # FDIS and other ISO stage codes without D prefix (Pattern 3)
712
495
  fdraft.maybe >>
713
- # Trailing "Month YYYY" print/reaffirm date. Captured under distinct
714
- # keys so it never collides with the base -YYYY identity year (a
715
- # collision made Parslet drop the base year and warn "Duplicate
716
- # subtrees … keys: [:year]"). The builder promotes it to the identity
717
- # only when there is no base year.
718
- trailing_month_year.maybe >>
496
+ # Enhanced: Accept both comma and space before month/year
497
+ ((comma | space) >> month_name.as(:month) >> space >> year_digits.as(:year)).maybe >>
719
498
  corrigendum.maybe >>
720
499
  draft.maybe >>
721
- # Revision trails the draft (before any date), matching normalization's
722
- # ".../D<n>/R-<x>" repositioning of "P802.16Rev2/D3 Feb 2008".
723
- revision_suffix.maybe >>
724
500
  # ALSO accept month/year after draft (some patterns like /DX, Month YEAR)
725
- trailing_month_year.maybe >>
726
- # Trailing corrigendum AFTER the draft+date ("…/D1, Jan 2007/Cor. 1").
727
- # The draft's own draft_date has already consumed the date, leaving
728
- # "/Cor. 1" here; the resulting flat corrigendum+draft tree routes to
729
- # build_flat_corrigendum (disjoint from the pre-draft corrigendum slot,
730
- # which only fires when no draft precedes it).
731
- corrigendum.maybe >>
501
+ ((comma | space) >> month_name.as(:month) >> space >> year_digits.as(:year)).maybe >>
732
502
  parenthetical.maybe
733
503
  end
734
504
 
@@ -738,50 +508,27 @@ module Pubid
738
508
  str("P") >> space.maybe >> # Make space after P optional
739
509
  number >>
740
510
  (part_subpart_year | edition).maybe >>
741
- # Trailing "Month YYYY"/bare-year date under distinct keys so they
742
- # never collide with the base -YYYY identity year (see ieee_p_identifier).
743
- trailing_month_year.maybe >>
511
+ # Enhanced: Accept both comma and space before month/year
512
+ ((comma | space) >> month_name.as(:month) >> space >> year_digits.as(:year)).maybe >>
744
513
  corrigendum.maybe >>
745
514
  draft.maybe >>
746
- revision_suffix.maybe >>
747
515
  # ALSO accept month/year after draft
748
- trailing_month_year.maybe >>
516
+ ((comma | space) >> month_name.as(:month) >> space >> year_digits.as(:year)).maybe >>
749
517
  # Accept bare year after draft: ", 2015"
750
- ((comma | space) >> year_digits.as(:trailing_year)).maybe >>
751
- # Trailing corrigendum after the draft+date (parity with ieee_p_identifier).
752
- corrigendum.maybe >>
518
+ ((comma | space) >> year_digits.as(:year)).maybe >>
753
519
  parenthetical.maybe
754
520
  end
755
521
 
756
522
  # IEEE Draft P pattern: "IEEE Draft P802.11..." OR "Draft P802.11..." (IEEE prefix optional)
757
- # An optional status phrase may precede "Draft" — "IEEE Unapproved Draft P…",
758
- # "IEEE Active Approved Draft P…" — the largest index-v2 draft bucket. The
759
- # status is captured (draft_status ends in a space, so "Approved Draft"
760
- # splits cleanly) and round-trips as the draft_status attribute; the literal
761
- # "Draft" stays a bare marker (dropped on render, like the plain form).
762
523
  rule(:ieee_draft_p_identifier) do
763
524
  (str("IEEE").as(:publisher) >> space).maybe >> # Make IEEE prefix optional
764
- draft_status.as(:draft_status).maybe >>
765
525
  str("Draft") >> space >>
766
- # `P` is optional — a status-word draft may carry a bare number
767
- # ("IEEE Unapproved Draft 802.1ah/D4.2"), mirroring
768
- # ieee_approved_draft_identifier's str("P").maybe. The `number` rule
769
- # already accepts the bare forms (802.1ah, C57.15, 11073-10471).
770
- str("P").maybe >>
526
+ str("P") >>
771
527
  number >>
772
528
  (part_subpart_year | edition).maybe >>
773
- # Trailing "Month YYYY" date under distinct keys so it never collides
774
- # with the base -YYYY identity year (see ieee_p_identifier).
775
- ((space >> month_name.as(:trailing_month) >> space >> year_digits.as(:trailing_year)) |
776
- (space >> month_numeric.as(:trailing_month) >> (space | dash) >> year_digits.as(:trailing_year))).maybe >>
529
+ # Enhanced: Accept month/year after draft number
530
+ (space >> month_name.as(:month) >> space >> year_digits.as(:year)).maybe >>
777
531
  draft.maybe >>
778
- revision_suffix.maybe >>
779
- # Trailing corrigendum after the draft ("…/D2.0/Cor. 1", or
780
- # "…/D1.0, Dec 2007/Cor. 1" where the draft's own draft_date consumes
781
- # the date, leaving "/Cor. N"). The flat corrigendum+draft tree (no
782
- # :base) routes to build_flat_corrigendum, which rebuilds the base
783
- # standard (carrying the draft + draft_status) and wraps it.
784
- corrigendum.maybe >>
785
532
  parenthetical.maybe
786
533
  end
787
534
 
@@ -795,7 +542,6 @@ module Pubid
795
542
  number >>
796
543
  (part_subpart_year | edition).maybe >>
797
544
  draft.maybe >>
798
- revision_suffix.maybe >>
799
545
  parenthetical.maybe
800
546
  end
801
547
 
@@ -910,7 +656,7 @@ module Pubid
910
656
  (type_word.as(:type) >> space?).maybe >>
911
657
  number >>
912
658
  part_subpart_year.maybe # This captures the full identifier before /Cor
913
- ).as(:base) >>
659
+ ).as(:base_identifier) >>
914
660
  # Now match the corrigendum portion
915
661
  (slash | dash | space) >>
916
662
  str("Cor") >>
@@ -931,7 +677,7 @@ module Pubid
931
677
  (type_word.as(:type) >> space?).maybe >>
932
678
  number >>
933
679
  part_subpart_year.maybe
934
- ).as(:base) >>
680
+ ).as(:base_identifier) >>
935
681
  # Now match the interpretation portion
936
682
  (slash | dash | space) >>
937
683
  str("INT") >>
@@ -949,7 +695,7 @@ module Pubid
949
695
  (type_word.as(:type) >> space?).maybe >>
950
696
  number >>
951
697
  part_subpart_year.maybe
952
- ).as(:base) >>
698
+ ).as(:base_identifier) >>
953
699
  # Now match the conformance portion
954
700
  (slash | dash | space) >>
955
701
  str("Conformance") >>
@@ -1011,13 +757,11 @@ module Pubid
1011
757
  ieee_astm_si_psi | # NEW Session 171: Add IEEE/ASTM SI/PSI support
1012
758
  multi_numbered_identifier | # NEW: Try multi-numbered identifiers before generic patterns
1013
759
  csa_dual_published | # NEW: Try CSA dual published before generic patterns
1014
- s_designation | # Historical IEEE/IPCEA cable designation (S-135)
1015
760
  corrigendum_identifier | # NEW: Try corrigendum before generic patterns
1016
761
  interpretation_identifier | # NEW: Try interpretation identifier before generic patterns
1017
762
  conformance_identifier | # NEW: Try conformance identifier before generic patterns
1018
763
  joint_development_ieee_format |
1019
764
  joint_development_iso_format |
1020
- joint_development_embedded_stage | # stage-LAST embedded form (before generic)
1021
765
  iec_ieee_copublished |
1022
766
  number_first_identifier |
1023
767
  ieee_approved_draft_identifier |
@@ -1037,16 +781,8 @@ module Pubid
1037
781
  ashrae_copub.maybe >> # NEW: Add /ASHRAE Guideline support
1038
782
  ieee_crossref.maybe >> # NEW: Add /C62.22.1-1996 cross-reference support
1039
783
  draft.maybe >>
1040
- revision_suffix.maybe >>
1041
- # Trailing "Month YYYY" print/reaffirm date under distinct keys so it
1042
- # never collides with the base -YYYY identity year (see
1043
- # ieee_p_identifier). The builder promotes it only when no base year.
1044
- trailing_month_year.maybe >>
1045
- # Trailing corrigendum after the draft+date ("IEEE Approved P1015/D1,
1046
- # Jan 2007/Cor. 1"): the generic bucket is the only path a status-word
1047
- # form reaches. Routes via build_flat_corrigendum (disjoint from the
1048
- # pre-draft corrigendum slot at line 954).
1049
- corrigendum.maybe >>
784
+ # Enhanced: Accept both comma and space before month/year
785
+ ((comma | space) >> month_name.as(:month) >> space >> year_digits.as(:year)).maybe >>
1050
786
  edition.maybe >>
1051
787
  parenthetical.maybe >> # REVERT: Back to single parenthetical
1052
788
  book_nickname.maybe >> # NEW: Add book nickname support
@@ -1058,133 +794,6 @@ module Pubid
1058
794
 
1059
795
  root(:identifier)
1060
796
 
1061
- # Rewrite relaton's historical IEEE serialization into canonical pubid
1062
- # spellings. relaton's own formatter (Relaton::Ieee::PubId::Id#to_s) emits
1063
- # suffix tokens that differ from pubid's grammar:
1064
- #
1065
- # /D-N-YYYY[-MM] draft + trailing numeric date (the dominant form)
1066
- # /E-N[-YYYY[-MM]] edition
1067
- # /R-N[-YYYY] revision (pubid has no revision suffix)
1068
- # " Redline" redline suffix without the " - " pubid expects
1069
- #
1070
- # The draft/edition trailing date is repositioned onto the document number
1071
- # as a base year/month (a form pubid already parses), which also keeps the
1072
- # draft component clean so it round-trips through to_hash/from_hash.
1073
- def self.normalize_relaton_suffixes(cleaned)
1074
- # NOTE: the trailing " Redline"/" - Redline" suffix is NO LONGER stripped
1075
- # here — the grammar's `redline` rule captures it into a redline flag so
1076
- # a redline id stays distinct from its base standard.
1077
-
1078
- # Combined draft + corrigendum: relaton emits "…/D-N/CorM-YYYY" (draft
1079
- # then corrigendum), but pubid's grammar accepts the corrigendum first.
1080
- # Swap them so the corrigendum keeps its own year and the draft trails.
1081
- # The hyphen after "D" is mandatory here: relaton's formatter always
1082
- # emits "/D-<draft>", whereas pubid's own canonical joint-development
1083
- # form is "/D<draft>-<year>" (no hyphen, year kept on the draft) — which
1084
- # already parses and must not be repositioned. A trailing corrigendum
1085
- # month (the "-MM" in "/CorM-YYYY-MM") is intentionally dropped: pubid's
1086
- # corrigendum model carries only a year.
1087
- cleaned = cleaned.sub(
1088
- %r{\A(.*)/D-([0-9A-Za-z][0-9A-Za-z.+]*?)/Cor\.?[ ]?(\d+)(?:-((?:19|20)\d\d))?(?:-\d\d)?\z},
1089
- ) do
1090
- base, draft, cor, year = Regexp.last_match.captures
1091
- "#{base}/Cor #{cor}#{year ? "-#{year}" : ''}/D#{draft}"
1092
- end
1093
-
1094
- # Combined draft + revision, and the empty-draft revision-only form:
1095
- # "…/D-<d>/R-<x>-YYYY[-MM]" and "…/D-/R-<x>-YYYY" (nil-residue #2).
1096
- # Reposition the base publication date onto the number (pubid's
1097
- # "-YYYY[-MM]" shape), keep the draft as "/D<d>" (dropped when the draft
1098
- # is empty), and leave a trailing "/R-<x>" the grammar captures as the
1099
- # revision. Runs before the plain "/D-…" reposition, which the embedded
1100
- # "/R-" would otherwise defeat.
1101
- cleaned = cleaned.sub(
1102
- %r{\A(.*?)/D-([0-9A-Za-z.+]*)/R-([0-9A-Za-z]+)(?:-((?:19|20)\d\d)(?:-(0[1-9]|1[0-2]))?)?\z},
1103
- ) do
1104
- base, draft, rev, year, month = Regexp.last_match.captures
1105
- date = year ? "-#{year}#{month ? "-#{month}" : ''}" : ""
1106
- draft_part = draft.to_s.empty? ? "" : "/D#{draft}"
1107
- "#{base}#{date}#{draft_part}/R-#{rev}"
1108
- end
1109
-
1110
- # /D-N drafts with a trailing numeric date, when the draft is the last
1111
- # suffix: reposition the -YYYY[-MM] date onto the number. A following
1112
- # /Cor, /Amd, /R or /E suffix carries its own year, so the `\z` anchor
1113
- # keeps this from firing on those combined forms.
1114
- cleaned = cleaned.sub(
1115
- %r{\A(.*)/D-([0-9A-Za-z][0-9A-Za-z.+]*?)-((?:19|20)\d\d)(?:-(0[1-9]|1[0-2]))?\z},
1116
- ) do
1117
- base, draft, year, month = Regexp.last_match.captures
1118
- "#{base}-#{year}#{month ? "-#{month}" : ''}/D#{draft}"
1119
- end
1120
-
1121
- # /E-N editions: relaton's "/E-2-2023-02" → pubid's "Edition 2.0 2023-02".
1122
- cleaned = cleaned.sub(
1123
- %r{\A(.*?)/E-(\d+)(?:-((?:19|20)\d\d)(?:-(0[1-9]|1[0-2]))?)?\z},
1124
- ) do
1125
- base, edition, year, month = Regexp.last_match.captures
1126
- date = year ? " #{year}#{month ? "-#{month}" : ''}" : ""
1127
- "#{base} Edition #{edition}.0#{date}"
1128
- end
1129
-
1130
- # /R-N revisions: PRESERVE them (the grammar's revision_suffix rule now
1131
- # captures a trailing "/R-<x>" into the `revision` attribute). Just
1132
- # reposition any trailing publication year onto the number, keeping the
1133
- # "/R-<x>" in place for the grammar.
1134
- cleaned.sub(
1135
- %r{\A(.*?)/R-([0-9A-Za-z]+)(?:-((?:19|20)\d\d))?\z},
1136
- ) do
1137
- base, rev, year = Regexp.last_match.captures
1138
- "#{year ? "#{base}-#{year}" : base}/R-#{rev}"
1139
- end
1140
- end
1141
-
1142
- # Strip the IEEE rawbib revision-notation dialects. `REV`/`Rev`
1143
- # (case-insensitive) + a trailing revision id `[A-Za-z0-9]+`, glued to the
1144
- # number or separated by `-`, `/`, `_`, `.`, or a space, and preceding the
1145
- # draft. pubid's canonical "<num>/D<n>/R-<x>" form already drops the
1146
- # revision on render (normalize_relaton_suffixes strips a trailing /R-x),
1147
- # so the revision-less result is *the same identifier* — and stripping
1148
- # (rather than reordering) leaves any trailing date/parenthetical intact,
1149
- # which is why forms that already parse (`Draft P…-REVmb/D3.0, Mar 2010`)
1150
- # are NOT disturbed. Examples:
1151
- # "P802.16.2-REVa/D8" -> "P802.16.2/D8"
1152
- # "P802.16/REVd/D5" -> "P802.16/D5"
1153
- # "P802.15.1REVa/D5" -> "P802.15.1/D5"
1154
- # "P802.11REVmb" -> "P802.11" (no draft)
1155
- def self.normalize_revision_notation(cleaned)
1156
- # NUMBERED revisions ("Rev<digits>") are PRESERVED — repositioned to a
1157
- # trailing "/R-<n>" suffix the grammar captures as the `revision`
1158
- # attribute (IEEE's native inline spelling; numbered-revision hand-off).
1159
- # A "\d+" right after "Rev" both selects the numbered subset and keeps
1160
- # these off the English word "Revision". Three source positions:
1161
- # after a draft : "PC37.30.2/D043 Rev 18" -> ".../D043/R-18"
1162
- cleaned = cleaned.sub(
1163
- %r{(/D[0-9A-Za-z.]*)\s+[Rr][Ee][Vv]\s*(\d+)}, '\1/R-\2'
1164
- )
1165
- # before a draft: "P802.16Rev2/D3" -> "P802.16/D3/R-2"
1166
- cleaned = cleaned.sub(
1167
- %r{[-/_.]?\s?[Rr][Ee][Vv][-\s]?(\d+)(/D[0-9A-Za-z.]*)}, '\2/R-\1'
1168
- )
1169
- # no draft, trailing: "P1722-rev1" -> "P1722/R-1"
1170
- cleaned = cleaned.sub(
1171
- %r{(\d)[-._]?\s?[Rr][Ee][Vv]\s*(\d+)\s*\z}, '\1/R-\2'
1172
- )
1173
-
1174
- # LETTERED inline revisions ("REVa", "REVmb") have no pubid model and are
1175
- # still STRIPPED (unchanged behaviour). The numbered forms above already
1176
- # became "/R-<n>", so these regexes only see the lettered residue.
1177
- # Revision token that PRECEDES a draft: drop it (keep the /D…).
1178
- cleaned = cleaned.sub(
1179
- %r{[-/_.]?\s?[Rr][Ee][Vv][-\s]?[A-Za-z0-9]+(?=/D[0-9])},
1180
- "",
1181
- )
1182
- # Trailing revision glued to the number with no draft ("P802.11REVmb");
1183
- # a digit must immediately precede REV so a trailing English word like
1184
- # "…Revision" can't match.
1185
- cleaned.sub(%r{(\d)[Rr][Ee][Vv][A-Za-z0-9]+\s*\z}, '\1')
1186
- end
1187
-
1188
797
  def self.parse(string)
1189
798
  # Strip .pdf extension if present (Pattern 3: File Extensions)
1190
799
  cleaned = string.sub(/\.pdf$/i, "")
@@ -1202,24 +811,6 @@ module Pubid
1202
811
  # No valid IEEE identifier pattern needs more than 1 space
1203
812
  cleaned = cleaned.gsub(/\s+/, " ")
1204
813
 
1205
- # A joint ISO-led publisher list is sometimes crawled with a stray slash
1206
- # (or slash+space) before the ISO stage code — "ISO/IEC/IEEE/ FDIS …" or
1207
- # "ISO/IEC/IEEE/FDIS …". Restore the space separator so the stage parses
1208
- # (bucket 7).
1209
- cleaned = cleaned.gsub(
1210
- %r{\b(ISO/IEC/IEEE|IEEE/ISO/IEC|IEEE/IEC/ISO|ISO/IEEE|IEC/IEEE|IEEE/IEC|ISO/IEC)/ ?(FDIS|FCD|CDV|DIS\d?|CD\d?|WD|PWI|NP)\b},
1211
- '\1 \2',
1212
- )
1213
-
1214
- # Rewrite the rawbib revision-notation dialects (REVa/REVd/glued) into
1215
- # the canonical /R-<x> form before the suffix normalization below.
1216
- cleaned = normalize_revision_notation(cleaned)
1217
-
1218
- # Normalize relaton's bespoke historical serialization (the spellings
1219
- # emitted by Relaton::Ieee::PubId::Id#to_s) into canonical pubid forms
1220
- # so `relaton-data-ieee` parses. See #normalize_relaton_suffixes.
1221
- cleaned = normalize_relaton_suffixes(cleaned)
1222
-
1223
814
  # NEW Session 171: CONSERVATIVE data quality fixes for TODO.IEEE-MUST-DO.txt
1224
815
  # Only fix clear typos: space before dash + 4-digit year, OR dash + space + 4-digit year
1225
816
  # Do NOT touch " - " (space-dash-space) which is valid formatting
@@ -1268,21 +859,10 @@ module Pubid
1268
859
  # NEW: Convert IEC/IEEE space-separated to semicolon format
1269
860
  # Pattern: "IEC 61523-3 First edition 2004-09; IEEE 1497" → already semicolon
1270
861
  # Pattern: "IEC 62539 First Edition 2007-07 IEEE 930" → needs semicolon
1271
- # Pattern: "IEC 60076-21:2011 Edition 1.0 2011-12 IEEE Std C57.15" → needs semicolon (issue #202)
1272
- # Match: IEC identifier (with optional colon-year, optional "First"/numeric
1273
- # Edition + YYYY-MM) + space + IEEE identifier.
1274
- cleaned = cleaned.gsub(
1275
- /(IEC\s+\d+(?:-\d+)?(?::\d{4})?(?:\s+(?:First\s+)?[Ee]dition\s+\d+(?:\.\d+)?\s+\d{4}-\d{2})?)\s+(IEEE\s+Std\s+\S+|IEEE\s+\S+)/,
1276
- '\1; \2'
1277
- )
1278
-
1279
- # Strip ":YYYY" from IEC numbers when an Edition clause follows — the
1280
- # IEEE parser's number rule doesn't accept the colon-year form, but
1281
- # the year is preserved in the "Edition N.M YYYY-MM" suffix.
1282
- # (issue #202)
862
+ # Match: IEC identifier (with edition) + space + IEEE identifier
863
+ # Be conservative: only convert if IEC has "First edition" or similar and followed by IEEE
1283
864
  cleaned = cleaned.gsub(
1284
- /^(IEC\s+\d+(?:-\d+)?):\d{4}(\s+(?:First\s+)?[Ee]dition\s+\d+(?:\.\d+)?\s+\d{4}-\d{2})/,
1285
- '\1\2'
865
+ /(IEC\s+\d+(?:-\d+)?(?:\s+First?\s+Edition\s+\d{4}-\d{2})?)\s+(IEEE\s+\S+)/, '\1; \2'
1286
866
  )
1287
867
 
1288
868
  # NEW Phase 1 (Session 141): Remove literal trademark symbol
@@ -1498,6 +1078,8 @@ module Pubid
1498
1078
  # Remove period after "Std": "IEEE Std." -> "IEEE Std"
1499
1079
  cleaned = cleaned.gsub(/\bStd\.\s+/, "Std ")
1500
1080
 
1081
+ # Redline Suffix Removal: " - Redline" at end
1082
+ cleaned = cleaned.gsub(/\s+-\s+Redline\b.*$/, "")
1501
1083
 
1502
1084
  # Title portion removal after year: "YYYY - IEEE Standard for..."
1503
1085
  cleaned = cleaned.gsub(