pubid 2.0.0.pre.alpha.7 → 2.0.0.pre.alpha.9

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 (485) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +9 -50
  3. data/data/bipm/update_codes.yaml +9 -0
  4. data/data/iec/update_codes.yaml +3 -0
  5. data/data/ieee/update_codes.yaml +107 -1
  6. data/data/nist/series.yaml +155 -0
  7. data/data/nist/update_codes.yaml +8 -0
  8. data/lib/pubid/adobe/builder.rb +52 -0
  9. data/lib/pubid/adobe/identifier.rb +49 -0
  10. data/lib/pubid/adobe/identifiers/publication.rb +31 -0
  11. data/lib/pubid/adobe/identifiers/tech_note.rb +32 -0
  12. data/lib/pubid/adobe/identifiers.rb +10 -0
  13. data/lib/pubid/adobe/parser.rb +128 -0
  14. data/lib/pubid/adobe/renderer.rb +39 -0
  15. data/lib/pubid/adobe/urn_generator.rb +42 -0
  16. data/lib/pubid/adobe/urn_parser.rb +69 -0
  17. data/lib/pubid/adobe.rb +60 -0
  18. data/lib/pubid/amca/builder.rb +2 -2
  19. data/lib/pubid/amca/identifier.rb +1 -3
  20. data/lib/pubid/amca/identifiers/base.rb +1 -6
  21. data/lib/pubid/amca/identifiers/interpretation.rb +1 -1
  22. data/lib/pubid/amca/identifiers/publication.rb +1 -1
  23. data/lib/pubid/amca/identifiers/standard.rb +1 -1
  24. data/lib/pubid/amca/identifiers.rb +0 -1
  25. data/lib/pubid/amca/single_identifier.rb +1 -1
  26. data/lib/pubid/amca.rb +3 -3
  27. data/lib/pubid/ashrae/builder.rb +22 -22
  28. data/lib/pubid/ashrae/identifier.rb +3 -4
  29. data/lib/pubid/ashrae/identifiers/addenda_package.rb +1 -1
  30. data/lib/pubid/ashrae/identifiers/addendum.rb +1 -1
  31. data/lib/pubid/ashrae/identifiers/base.rb +14 -8
  32. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +1 -1
  33. data/lib/pubid/ashrae/identifiers.rb +0 -1
  34. data/lib/pubid/ashrae/parser.rb +14 -9
  35. data/lib/pubid/ashrae/renderer.rb +19 -19
  36. data/lib/pubid/ashrae/single_identifier.rb +1 -1
  37. data/lib/pubid/ashrae/supplement_identifier.rb +6 -6
  38. data/lib/pubid/ashrae.rb +3 -3
  39. data/lib/pubid/bipm/builder.rb +107 -0
  40. data/lib/pubid/bipm/identifier.rb +160 -0
  41. data/lib/pubid/bipm/identifiers/committee_document.rb +24 -0
  42. data/lib/pubid/bipm/identifiers/guide.rb +24 -0
  43. data/lib/pubid/bipm/identifiers/meeting.rb +41 -0
  44. data/lib/pubid/bipm/identifiers/mep.rb +21 -0
  45. data/lib/pubid/bipm/identifiers/metrologia_article.rb +24 -0
  46. data/lib/pubid/bipm/identifiers/si_brochure.rb +20 -0
  47. data/lib/pubid/bipm/identifiers.rb +15 -0
  48. data/lib/pubid/bipm/parser.rb +184 -0
  49. data/lib/pubid/bipm/renderer.rb +110 -0
  50. data/lib/pubid/bipm/urn_generator.rb +58 -0
  51. data/lib/pubid/bipm/urn_parser.rb +52 -0
  52. data/lib/pubid/bipm.rb +86 -0
  53. data/lib/pubid/bsi/builder.rb +14 -14
  54. data/lib/pubid/bsi/identifier.rb +0 -1
  55. data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -2
  56. data/lib/pubid/bsi/identifiers/amendment.rb +4 -4
  57. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +6 -0
  58. data/lib/pubid/bsi/identifiers/corrigendum.rb +4 -4
  59. data/lib/pubid/bsi/identifiers/expert_commentary.rb +5 -5
  60. data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -2
  61. data/lib/pubid/bsi/identifiers/value_added_publication.rb +6 -6
  62. data/lib/pubid/bsi/renderer.rb +8 -8
  63. data/lib/pubid/bsi/single_identifier.rb +48 -0
  64. data/lib/pubid/builder/base.rb +5 -3
  65. data/lib/pubid/bundled_identifier.rb +3 -3
  66. data/lib/pubid/calconnect/builder.rb +38 -0
  67. data/lib/pubid/calconnect/identifier.rb +117 -0
  68. data/lib/pubid/calconnect/identifiers/standard.rb +29 -0
  69. data/lib/pubid/calconnect/identifiers.rb +9 -0
  70. data/lib/pubid/calconnect/parser.rb +54 -0
  71. data/lib/pubid/calconnect/renderer.rb +36 -0
  72. data/lib/pubid/calconnect/urn_generator.rb +33 -0
  73. data/lib/pubid/calconnect/urn_parser.rb +34 -0
  74. data/lib/pubid/calconnect.rb +77 -0
  75. data/lib/pubid/ccsds/builder.rb +1 -1
  76. data/lib/pubid/ccsds/identifier.rb +1 -1
  77. data/lib/pubid/ccsds/identifiers/corrigendum.rb +2 -2
  78. data/lib/pubid/ccsds/supplement_identifier.rb +6 -6
  79. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  80. data/lib/pubid/cen_cenelec/builder.rb +46 -12
  81. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -2
  82. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +6 -0
  83. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -2
  84. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +60 -3
  85. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
  86. data/lib/pubid/cen_cenelec/renderer.rb +5 -5
  87. data/lib/pubid/cen_cenelec/supplement_identifier.rb +5 -5
  88. data/lib/pubid/cen_cenelec/urn_generator.rb +1 -1
  89. data/lib/pubid/cen_cenelec.rb +76 -72
  90. data/lib/pubid/cie/builder.rb +139 -24
  91. data/lib/pubid/cie/identifier.rb +7 -3
  92. data/lib/pubid/cie/identifiers/bundle.rb +32 -4
  93. data/lib/pubid/cie/identifiers/code_attributes.rb +52 -0
  94. data/lib/pubid/cie/identifiers/conference.rb +9 -4
  95. data/lib/pubid/cie/identifiers/corrigendum.rb +17 -23
  96. data/lib/pubid/cie/identifiers/dual_published.rb +4 -4
  97. data/lib/pubid/cie/identifiers/identical.rb +7 -7
  98. data/lib/pubid/cie/identifiers/joint_published.rb +8 -8
  99. data/lib/pubid/cie/identifiers/proceedings.rb +39 -0
  100. data/lib/pubid/cie/identifiers/standard.rb +33 -7
  101. data/lib/pubid/cie/identifiers/supplement.rb +24 -22
  102. data/lib/pubid/cie/identifiers/tutorial_bundle.rb +6 -2
  103. data/lib/pubid/cie/identifiers.rb +2 -0
  104. data/lib/pubid/cie/parser.rb +54 -5
  105. data/lib/pubid/cie/single_identifier.rb +40 -1
  106. data/lib/pubid/cie/supplement_identifier.rb +29 -16
  107. data/lib/pubid/cie/urn_generator.rb +11 -8
  108. data/lib/pubid/cie.rb +0 -1
  109. data/lib/pubid/components/date.rb +21 -5
  110. data/lib/pubid/csa/builder.rb +1 -1
  111. data/lib/pubid/csa/composite_identifier.rb +17 -1
  112. data/lib/pubid/csa/identifier.rb +48 -3
  113. data/lib/pubid/csa/identifiers/bundled.rb +6 -0
  114. data/lib/pubid/csa/identifiers/combined.rb +6 -0
  115. data/lib/pubid/csa/identifiers/package.rb +2 -2
  116. data/lib/pubid/csa/parser.rb +6 -6
  117. data/lib/pubid/csa/wrapper_identifier.rb +17 -0
  118. data/lib/pubid/doi/builder.rb +18 -0
  119. data/lib/pubid/doi/identifier.rb +46 -0
  120. data/lib/pubid/doi/identifiers/resource.rb +30 -0
  121. data/lib/pubid/doi/identifiers.rb +9 -0
  122. data/lib/pubid/doi/parser.rb +52 -0
  123. data/lib/pubid/doi/renderer.rb +13 -0
  124. data/lib/pubid/doi.rb +55 -0
  125. data/lib/pubid/easc/builder.rb +55 -0
  126. data/lib/pubid/easc/identifier.rb +61 -0
  127. data/lib/pubid/easc/identifiers/pmg.rb +20 -0
  128. data/lib/pubid/easc/identifiers/rmg.rb +19 -0
  129. data/lib/pubid/easc/identifiers.rb +10 -0
  130. data/lib/pubid/easc/parser.rb +80 -0
  131. data/lib/pubid/easc/renderer.rb +48 -0
  132. data/lib/pubid/easc/urn_generator.rb +46 -0
  133. data/lib/pubid/easc/urn_parser.rb +57 -0
  134. data/lib/pubid/easc.rb +52 -0
  135. data/lib/pubid/ecma/builder.rb +31 -0
  136. data/lib/pubid/ecma/identifier.rb +76 -0
  137. data/lib/pubid/ecma/identifiers/memento.rb +30 -0
  138. data/lib/pubid/ecma/identifiers/standard.rb +31 -0
  139. data/lib/pubid/ecma/identifiers/technical_report.rb +31 -0
  140. data/lib/pubid/ecma/identifiers.rb +11 -0
  141. data/lib/pubid/ecma/parser.rb +41 -0
  142. data/lib/pubid/ecma/renderer.rb +46 -0
  143. data/lib/pubid/ecma/urn_generator.rb +25 -0
  144. data/lib/pubid/ecma/urn_parser.rb +35 -0
  145. data/lib/pubid/ecma.rb +67 -0
  146. data/lib/pubid/etsi/builder.rb +7 -3
  147. data/lib/pubid/etsi/identifier.rb +1 -3
  148. data/lib/pubid/etsi/identifiers/base.rb +28 -10
  149. data/lib/pubid/etsi/identifiers/etsi_standard.rb +128 -4
  150. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +35 -3
  151. data/lib/pubid/etsi/identifiers.rb +0 -1
  152. data/lib/pubid/etsi/parser.rb +8 -2
  153. data/lib/pubid/etsi/renderer.rb +8 -2
  154. data/lib/pubid/etsi.rb +5 -5
  155. data/lib/pubid/export/exporter.rb +2 -1
  156. data/lib/pubid/export/flavor_exporter.rb +18 -3
  157. data/lib/pubid/gb/builder.rb +45 -0
  158. data/lib/pubid/gb/identifier.rb +64 -0
  159. data/lib/pubid/gb/identifiers/standard.rb +34 -0
  160. data/lib/pubid/gb/identifiers.rb +9 -0
  161. data/lib/pubid/gb/parser.rb +63 -0
  162. data/lib/pubid/gb/renderer.rb +35 -0
  163. data/lib/pubid/gb.rb +87 -0
  164. data/lib/pubid/gost/builder.rb +148 -0
  165. data/lib/pubid/gost/identifier.rb +49 -0
  166. data/lib/pubid/gost/identifiers/foreign_reference.rb +25 -0
  167. data/lib/pubid/gost/identifiers/harmonized.rb +39 -0
  168. data/lib/pubid/gost/identifiers/identical_adoption.rb +39 -0
  169. data/lib/pubid/gost/identifiers/interstate_standard.rb +20 -0
  170. data/lib/pubid/gost/identifiers/national_standard.rb +19 -0
  171. data/lib/pubid/gost/identifiers.rb +13 -0
  172. data/lib/pubid/gost/parser.rb +97 -0
  173. data/lib/pubid/gost/renderer.rb +48 -0
  174. data/lib/pubid/gost/urn_generator.rb +46 -0
  175. data/lib/pubid/gost/urn_parser.rb +52 -0
  176. data/lib/pubid/gost.rb +49 -0
  177. data/lib/pubid/iala/builder.rb +22 -27
  178. data/lib/pubid/iala/identifier.rb +27 -2
  179. data/lib/pubid/iala/identifiers/advice.rb +1 -1
  180. data/lib/pubid/iala/identifiers/annex.rb +14 -12
  181. data/lib/pubid/iala/identifiers/general_assembly.rb +5 -2
  182. data/lib/pubid/iala/identifiers/guideline.rb +3 -1
  183. data/lib/pubid/iala/identifiers/letter.rb +1 -1
  184. data/lib/pubid/iala/identifiers/manual.rb +3 -1
  185. data/lib/pubid/iala/identifiers/model_course.rb +3 -1
  186. data/lib/pubid/iala/identifiers/recommendation.rb +3 -1
  187. data/lib/pubid/iala/identifiers/report.rb +1 -1
  188. data/lib/pubid/iala/identifiers/resolution.rb +1 -1
  189. data/lib/pubid/iala/identifiers/standard.rb +3 -1
  190. data/lib/pubid/iala/identifiers.rb +0 -1
  191. data/lib/pubid/iala/renderer.rb +1 -1
  192. data/lib/pubid/iala/urn_generator.rb +1 -1
  193. data/lib/pubid/iala/urn_parser.rb +19 -2
  194. data/lib/pubid/iala.rb +4 -4
  195. data/lib/pubid/iana/builder.rb +20 -0
  196. data/lib/pubid/iana/identifier.rb +72 -0
  197. data/lib/pubid/iana/identifiers/registry.rb +33 -0
  198. data/lib/pubid/iana/identifiers.rb +9 -0
  199. data/lib/pubid/iana/parser.rb +38 -0
  200. data/lib/pubid/iana/renderer.rb +29 -0
  201. data/lib/pubid/iana/urn_generator.rb +15 -0
  202. data/lib/pubid/iana/urn_parser.rb +24 -0
  203. data/lib/pubid/iana.rb +69 -0
  204. data/lib/pubid/identifier.rb +210 -23
  205. data/lib/pubid/idf/builder.rb +1 -1
  206. data/lib/pubid/idf/parser.rb +2 -2
  207. data/lib/pubid/idf/renderer.rb +1 -1
  208. data/lib/pubid/idf/supplement_identifier.rb +3 -3
  209. data/lib/pubid/iec/builder.rb +35 -25
  210. data/lib/pubid/iec/identifier.rb +47 -2
  211. data/lib/pubid/iec/identifiers/base.rb +2 -2
  212. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +6 -0
  213. data/lib/pubid/iec/identifiers/fragment_identifier.rb +11 -11
  214. data/lib/pubid/iec/identifiers/international_standard.rb +8 -5
  215. data/lib/pubid/iec/identifiers/sheet_identifier.rb +12 -12
  216. data/lib/pubid/iec/identifiers/technical_group.rb +30 -0
  217. data/lib/pubid/iec/identifiers/technical_report.rb +1 -1
  218. data/lib/pubid/iec/identifiers/technical_specification.rb +1 -1
  219. data/lib/pubid/iec/identifiers/vap_identifier.rb +12 -12
  220. data/lib/pubid/iec/identifiers.rb +1 -0
  221. data/lib/pubid/iec/parser.rb +51 -10
  222. data/lib/pubid/iec/renderer.rb +18 -8
  223. data/lib/pubid/iec/single_identifier.rb +1 -1
  224. data/lib/pubid/iec/supplement_identifier.rb +32 -19
  225. data/lib/pubid/iec.rb +1 -6
  226. data/lib/pubid/ieee/aiee/builder.rb +17 -3
  227. data/lib/pubid/ieee/aiee/identifier.rb +45 -61
  228. data/lib/pubid/ieee/builder.rb +341 -68
  229. data/lib/pubid/ieee/compaction.rb +121 -0
  230. data/lib/pubid/ieee/components/draft.rb +47 -7
  231. data/lib/pubid/ieee/identifier.rb +1 -3
  232. data/lib/pubid/ieee/identifiers/adopted_standard.rb +30 -5
  233. data/lib/pubid/ieee/identifiers/amendment.rb +40 -0
  234. data/lib/pubid/ieee/identifiers/base.rb +106 -13
  235. data/lib/pubid/ieee/identifiers/code_number.rb +82 -0
  236. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +6 -2
  237. data/lib/pubid/ieee/identifiers/corrigendum.rb +17 -2
  238. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +3 -3
  239. data/lib/pubid/ieee/identifiers/dual_identifier.rb +3 -3
  240. data/lib/pubid/ieee/identifiers/dual_published.rb +3 -3
  241. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +102 -5
  242. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +2 -1
  243. data/lib/pubid/ieee/identifiers/joint_development.rb +56 -11
  244. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -1
  245. data/lib/pubid/ieee/identifiers/nesc/base.rb +90 -19
  246. data/lib/pubid/ieee/identifiers/nesc/draft.rb +20 -5
  247. data/lib/pubid/ieee/identifiers/nesc/edition.rb +32 -0
  248. data/lib/pubid/ieee/identifiers/nesc/handbook.rb +16 -5
  249. data/lib/pubid/ieee/identifiers/nesc/redline.rb +11 -2
  250. data/lib/pubid/ieee/identifiers/nesc/standard.rb +18 -3
  251. data/lib/pubid/ieee/identifiers/nesc.rb +1 -0
  252. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +3 -3
  253. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +14 -6
  254. data/lib/pubid/ieee/identifiers/redlined_standard.rb +4 -4
  255. data/lib/pubid/ieee/identifiers/si_standard.rb +4 -1
  256. data/lib/pubid/ieee/identifiers/standard.rb +4 -1
  257. data/lib/pubid/ieee/identifiers/supplement_identifier.rb +26 -7
  258. data/lib/pubid/ieee/identifiers.rb +2 -1
  259. data/lib/pubid/ieee/ire/builder.rb +7 -6
  260. data/lib/pubid/ieee/ire/identifier.rb +48 -33
  261. data/lib/pubid/ieee/nesc/builder.rb +33 -20
  262. data/lib/pubid/ieee/nesc/parser.rb +15 -14
  263. data/lib/pubid/ieee/parser.rb +461 -43
  264. data/lib/pubid/ieee/pre_parser.rb +1 -1
  265. data/lib/pubid/ieee/renderer.rb +154 -57
  266. data/lib/pubid/ieee/typed_stages.rb +12 -1
  267. data/lib/pubid/ieee/urn_generator.rb +3 -5
  268. data/lib/pubid/ieee.rb +56 -3
  269. data/lib/pubid/ietf/builder.rb +62 -0
  270. data/lib/pubid/ietf/identifier.rb +5 -0
  271. data/lib/pubid/ietf/identifiers/base.rb +75 -0
  272. data/lib/pubid/ietf/identifiers/bcp.rb +25 -0
  273. data/lib/pubid/ietf/identifiers/fyi.rb +25 -0
  274. data/lib/pubid/ietf/identifiers/internet_draft.rb +29 -0
  275. data/lib/pubid/ietf/identifiers/rfc.rb +25 -0
  276. data/lib/pubid/ietf/identifiers/std.rb +25 -0
  277. data/lib/pubid/ietf/identifiers.rb +13 -0
  278. data/lib/pubid/ietf/parser.rb +43 -0
  279. data/lib/pubid/ietf/renderer.rb +26 -0
  280. data/lib/pubid/ietf/urn_generator.rb +23 -0
  281. data/lib/pubid/ietf/urn_parser.rb +35 -0
  282. data/lib/pubid/ietf.rb +76 -0
  283. data/lib/pubid/iho/identifier.rb +1 -3
  284. data/lib/pubid/iho/identifiers/base.rb +1 -7
  285. data/lib/pubid/iho/identifiers/bibliographic.rb +1 -1
  286. data/lib/pubid/iho/identifiers/circular_letter.rb +1 -1
  287. data/lib/pubid/iho/identifiers/miscellaneous.rb +1 -1
  288. data/lib/pubid/iho/identifiers/publication.rb +1 -1
  289. data/lib/pubid/iho/identifiers/standard.rb +1 -1
  290. data/lib/pubid/iho/identifiers.rb +0 -1
  291. data/lib/pubid/iho.rb +7 -7
  292. data/lib/pubid/isbn/builder.rb +44 -0
  293. data/lib/pubid/isbn/check_digit.rb +53 -0
  294. data/lib/pubid/isbn/identifier.rb +63 -0
  295. data/lib/pubid/isbn/identifiers/book.rb +30 -0
  296. data/lib/pubid/isbn/identifiers.rb +9 -0
  297. data/lib/pubid/isbn/parser.rb +45 -0
  298. data/lib/pubid/isbn/renderer.rb +16 -0
  299. data/lib/pubid/isbn.rb +52 -0
  300. data/lib/pubid/iso/builder.rb +9 -4
  301. data/lib/pubid/iso/combined_identifier.rb +2 -2
  302. data/lib/pubid/iso/identifier.rb +17 -1
  303. data/lib/pubid/iso/identifiers/directives_supplement.rb +8 -8
  304. data/lib/pubid/iso/normalizer.rb +2 -2
  305. data/lib/pubid/iso/parser.rb +16 -12
  306. data/lib/pubid/iso/supplement_identifier.rb +19 -6
  307. data/lib/pubid/iso/urn_generator.rb +4 -1
  308. data/lib/pubid/iso/urn_parser.rb +1 -1
  309. data/lib/pubid/itu/builder.rb +230 -29
  310. data/lib/pubid/itu/components/code.rb +48 -5
  311. data/lib/pubid/itu/components/designation.rb +35 -0
  312. data/lib/pubid/itu/components.rb +1 -0
  313. data/lib/pubid/itu/identifier.rb +1 -3
  314. data/lib/pubid/itu/identifiers/addendum.rb +15 -0
  315. data/lib/pubid/itu/identifiers/amendment.rb +6 -28
  316. data/lib/pubid/itu/identifiers/annex.rb +13 -2
  317. data/lib/pubid/itu/identifiers/annex_of_recommendation.rb +87 -0
  318. data/lib/pubid/itu/identifiers/appendix_of_recommendation.rb +92 -0
  319. data/lib/pubid/itu/identifiers/base.rb +341 -23
  320. data/lib/pubid/itu/identifiers/combined_identifier.rb +99 -23
  321. data/lib/pubid/itu/identifiers/corrigendum.rb +16 -23
  322. data/lib/pubid/itu/identifiers/errata.rb +15 -0
  323. data/lib/pubid/itu/identifiers/handbook.rb +38 -0
  324. data/lib/pubid/itu/identifiers/question.rb +63 -0
  325. data/lib/pubid/itu/identifiers/recommendation.rb +3 -2
  326. data/lib/pubid/itu/identifiers/report.rb +39 -0
  327. data/lib/pubid/itu/identifiers/special_publication.rb +3 -1
  328. data/lib/pubid/itu/identifiers/standard_serialization.rb +58 -0
  329. data/lib/pubid/itu/identifiers/supplement.rb +119 -14
  330. data/lib/pubid/itu/identifiers.rb +10 -1
  331. data/lib/pubid/itu/model.rb +1 -1
  332. data/lib/pubid/itu/parser.rb +480 -26
  333. data/lib/pubid/itu/urn_generator.rb +36 -6
  334. data/lib/pubid/itu/urn_parser.rb +8 -0
  335. data/lib/pubid/itu.rb +11 -3
  336. data/lib/pubid/jcgm/builder.rb +23 -13
  337. data/lib/pubid/jcgm/identifiers/amendment.rb +0 -2
  338. data/lib/pubid/jcgm/identifiers/corrigendum.rb +34 -0
  339. data/lib/pubid/jcgm/identifiers/gum_guide.rb +3 -3
  340. data/lib/pubid/jcgm/identifiers/meeting.rb +47 -0
  341. data/lib/pubid/jcgm/identifiers.rb +2 -0
  342. data/lib/pubid/jcgm/parser.rb +66 -6
  343. data/lib/pubid/jcgm/renderer.rb +26 -12
  344. data/lib/pubid/jcgm/single_identifier.rb +74 -5
  345. data/lib/pubid/jcgm/supplement_identifier.rb +39 -4
  346. data/lib/pubid/jcgm/urn_generator.rb +21 -13
  347. data/lib/pubid/jcgm/urn_parser.rb +15 -3
  348. data/lib/pubid/jis/identifier.rb +52 -0
  349. data/lib/pubid/nist/builder.rb +29 -9
  350. data/lib/pubid/nist/caster.rb +7 -45
  351. data/lib/pubid/nist/circular_supplement_builder.rb +7 -5
  352. data/lib/pubid/nist/components/supplement.rb +5 -2
  353. data/lib/pubid/nist/configuration.rb +7 -1
  354. data/lib/pubid/nist/identifier.rb +1 -3
  355. data/lib/pubid/nist/identifiers/base.rb +121 -37
  356. data/lib/pubid/nist/identifiers/circular.rb +1 -1
  357. data/lib/pubid/nist/identifiers/commercial_standard.rb +1 -1
  358. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +1 -1
  359. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +1 -1
  360. data/lib/pubid/nist/identifiers/crpl_report.rb +1 -1
  361. data/lib/pubid/nist/identifiers/dated_document.rb +1 -1
  362. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +1 -1
  363. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +1 -1
  364. data/lib/pubid/nist/identifiers/handbook.rb +1 -1
  365. data/lib/pubid/nist/identifiers/internal_report.rb +1 -1
  366. data/lib/pubid/nist/identifiers/letter_circular.rb +1 -1
  367. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +1 -1
  368. data/lib/pubid/nist/identifiers/monograph.rb +1 -1
  369. data/lib/pubid/nist/identifiers/ncstar.rb +2 -2
  370. data/lib/pubid/nist/identifiers/nsrds.rb +1 -1
  371. data/lib/pubid/nist/identifiers/owmwp.rb +1 -1
  372. data/lib/pubid/nist/identifiers/report.rb +1 -1
  373. data/lib/pubid/nist/identifiers/special_publication.rb +10 -1
  374. data/lib/pubid/nist/identifiers/technical_note.rb +1 -1
  375. data/lib/pubid/nist/identifiers.rb +0 -1
  376. data/lib/pubid/nist/parser.rb +29 -4
  377. data/lib/pubid/nist/preprocessor.rb +15 -0
  378. data/lib/pubid/nist/router.rb +3 -2
  379. data/lib/pubid/nist/series/ir.rb +0 -3
  380. data/lib/pubid/nist/supplement_identifier.rb +9 -9
  381. data/lib/pubid/nist.rb +13 -12
  382. data/lib/pubid/oasis/builder.rb +77 -0
  383. data/lib/pubid/oasis/identifier.rb +82 -0
  384. data/lib/pubid/oasis/identifiers/standard.rb +29 -0
  385. data/lib/pubid/oasis/identifiers.rb +9 -0
  386. data/lib/pubid/oasis/parser.rb +34 -0
  387. data/lib/pubid/oasis/renderer.rb +29 -0
  388. data/lib/pubid/oasis/urn_generator.rb +25 -0
  389. data/lib/pubid/oasis/urn_parser.rb +22 -0
  390. data/lib/pubid/oasis.rb +74 -0
  391. data/lib/pubid/ogc/builder.rb +33 -0
  392. data/lib/pubid/ogc/identifier.rb +77 -0
  393. data/lib/pubid/ogc/identifiers/document.rb +26 -0
  394. data/lib/pubid/ogc/identifiers.rb +10 -0
  395. data/lib/pubid/ogc/parser.rb +40 -0
  396. data/lib/pubid/ogc/renderer.rb +33 -0
  397. data/lib/pubid/ogc/urn_generator.rb +14 -0
  398. data/lib/pubid/ogc/urn_parser.rb +22 -0
  399. data/lib/pubid/ogc.rb +71 -0
  400. data/lib/pubid/oiml/builder.rb +31 -7
  401. data/lib/pubid/oiml/identifier.rb +9 -1
  402. data/lib/pubid/oiml/parser.rb +11 -12
  403. data/lib/pubid/oiml/renderer.rb +13 -13
  404. data/lib/pubid/oiml/single_identifier.rb +20 -0
  405. data/lib/pubid/oiml/supplement_identifier.rb +9 -9
  406. data/lib/pubid/oiml/urn_parser.rb +23 -6
  407. data/lib/pubid/oiml.rb +4 -0
  408. data/lib/pubid/omg/builder.rb +19 -0
  409. data/lib/pubid/omg/identifier.rb +44 -0
  410. data/lib/pubid/omg/identifiers/specification.rb +32 -0
  411. data/lib/pubid/omg/identifiers.rb +9 -0
  412. data/lib/pubid/omg/parser.rb +40 -0
  413. data/lib/pubid/omg/renderer.rb +19 -0
  414. data/lib/pubid/omg.rb +51 -0
  415. data/lib/pubid/parsers/mr_string.rb +101 -7
  416. data/lib/pubid/plateau/builder.rb +8 -4
  417. data/lib/pubid/plateau/identifier.rb +1 -3
  418. data/lib/pubid/plateau/identifiers/base.rb +1 -6
  419. data/lib/pubid/plateau/identifiers/handbook.rb +1 -1
  420. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  421. data/lib/pubid/plateau/identifiers.rb +0 -1
  422. data/lib/pubid/plateau/parser.rb +15 -5
  423. data/lib/pubid/plateau/renderer.rb +1 -1
  424. data/lib/pubid/plateau/supplement_identifier.rb +11 -11
  425. data/lib/pubid/plateau.rb +4 -4
  426. data/lib/pubid/renderers/human_readable.rb +3 -1
  427. data/lib/pubid/renderers/mr_string.rb +46 -4
  428. data/lib/pubid/renderers/supplement_renderer.rb +1 -1
  429. data/lib/pubid/rendering/supplement.rb +4 -4
  430. data/lib/pubid/sae/builder.rb +1 -1
  431. data/lib/pubid/sae/identifier.rb +1 -3
  432. data/lib/pubid/sae/identifiers/base.rb +10 -7
  433. data/lib/pubid/sae/identifiers.rb +0 -1
  434. data/lib/pubid/sae.rb +3 -3
  435. data/lib/pubid/tgpp/builder.rb +41 -0
  436. data/lib/pubid/tgpp/identifier.rb +91 -0
  437. data/lib/pubid/tgpp/identifiers/technical_report.rb +32 -0
  438. data/lib/pubid/tgpp/identifiers/technical_specification.rb +33 -0
  439. data/lib/pubid/tgpp/identifiers.rb +11 -0
  440. data/lib/pubid/tgpp/parser.rb +62 -0
  441. data/lib/pubid/tgpp/renderer.rb +36 -0
  442. data/lib/pubid/tgpp/urn_generator.rb +20 -0
  443. data/lib/pubid/tgpp/urn_parser.rb +28 -0
  444. data/lib/pubid/tgpp.rb +78 -0
  445. data/lib/pubid/type_resolver.rb +59 -0
  446. data/lib/pubid/un/builder.rb +42 -0
  447. data/lib/pubid/un/identifier.rb +37 -0
  448. data/lib/pubid/un/identifiers/document.rb +24 -0
  449. data/lib/pubid/un/identifiers.rb +9 -0
  450. data/lib/pubid/un/parser.rb +25 -0
  451. data/lib/pubid/un/renderer.rb +11 -0
  452. data/lib/pubid/un.rb +46 -0
  453. data/lib/pubid/version.rb +1 -1
  454. data/lib/pubid/w3c/builder.rb +55 -0
  455. data/lib/pubid/w3c/identifier.rb +101 -0
  456. data/lib/pubid/w3c/identifiers/candidate_recommendation.rb +31 -0
  457. data/lib/pubid/w3c/identifiers/candidate_recommendation_draft.rb +31 -0
  458. data/lib/pubid/w3c/identifiers/draft_note.rb +31 -0
  459. data/lib/pubid/w3c/identifiers/note.rb +30 -0
  460. data/lib/pubid/w3c/identifiers/obsolete_recommendation.rb +31 -0
  461. data/lib/pubid/w3c/identifiers/proposed_edited_recommendation.rb +31 -0
  462. data/lib/pubid/w3c/identifiers/proposed_recommendation.rb +31 -0
  463. data/lib/pubid/w3c/identifiers/recommendation.rb +31 -0
  464. data/lib/pubid/w3c/identifiers/standard.rb +12 -0
  465. data/lib/pubid/w3c/identifiers/superseded_recommendation.rb +31 -0
  466. data/lib/pubid/w3c/identifiers/working_draft.rb +30 -0
  467. data/lib/pubid/w3c/identifiers.rb +25 -0
  468. data/lib/pubid/w3c/parser.rb +43 -0
  469. data/lib/pubid/w3c/renderer.rb +35 -0
  470. data/lib/pubid/w3c/urn_generator.rb +18 -0
  471. data/lib/pubid/w3c/urn_parser.rb +36 -0
  472. data/lib/pubid/w3c.rb +67 -0
  473. data/lib/pubid/xsf/builder.rb +17 -0
  474. data/lib/pubid/xsf/identifier.rb +62 -0
  475. data/lib/pubid/xsf/identifiers/xep.rb +31 -0
  476. data/lib/pubid/xsf/identifiers.rb +9 -0
  477. data/lib/pubid/xsf/parser.rb +25 -0
  478. data/lib/pubid/xsf/renderer.rb +23 -0
  479. data/lib/pubid/xsf/urn_generator.rb +13 -0
  480. data/lib/pubid/xsf/urn_parser.rb +18 -0
  481. data/lib/pubid/xsf.rb +76 -0
  482. data/lib/pubid.rb +25 -1
  483. metadata +205 -4
  484. data/lib/pubid/cie/components/code.rb +0 -80
  485. data/lib/pubid/iala/identifiers/base.rb +0 -14
@@ -8,7 +8,10 @@ module Pubid
8
8
  # Handles both:
9
9
  # - SI: Published standards (IEEE/ASTM SI 10-1997)
10
10
  # - PSI: Proposed SI (drafts: IEEE/ASTM PSI 10/D2, October 2015)
11
- class SiStandard < Base
11
+ class SiStandard < Identifier
12
+ # Reliable string `number` for relaton's index key (see CodeNumber).
13
+ include CodeNumber
14
+
12
15
  # TYPED_STAGES for SI standards
13
16
  TYPED_STAGES = [
14
17
  Components::TypedStage.new(
@@ -17,7 +17,10 @@ module Pubid
17
17
  # std = Pubid::Ieee.parse("ANSI/IEEE Std 500-1984")
18
18
  # std.publisher # => "IEEE"
19
19
  # std.copublisher # => ["ANSI"]
20
- class Standard < Base
20
+ class Standard < Identifier
21
+ # Reliable string `number` for relaton's index key (see CodeNumber).
22
+ include CodeNumber
23
+
21
24
  # TYPED_STAGES for published IEEE standards
22
25
  # Standards use "Std" abbreviation for published state
23
26
  TYPED_STAGES = [
@@ -3,19 +3,38 @@
3
3
  module Pubid
4
4
  module Ieee
5
5
  module Identifiers
6
- # Base class for supplement identifiers (amendments, corrigenda, interpretations, etc.)
6
+ # Identifier class for supplement identifiers (amendments, corrigenda, interpretations, etc.)
7
7
  # Supplements modify or add to a base document
8
- class SupplementIdentifier < Base
9
- attribute :base_identifier, Base, polymorphic: true
8
+ class SupplementIdentifier < Identifier
9
+ attribute :base, Identifier, polymorphic: true
10
10
 
11
- # Delegate publisher to base_identifier
11
+ # Delegate publisher to base
12
12
  def publisher
13
- base_identifier&.publisher
13
+ base&.publisher
14
14
  end
15
15
 
16
- # Delegate code to base_identifier if not overridden
16
+ # Delegate code to base if not overridden
17
17
  def code
18
- base_identifier&.code
18
+ base&.code
19
+ end
20
+
21
+ # `publisher` is a pure delegation to `base`, so it must never be
22
+ # serialized independently on the wrapper. lutaml's default-tracking
23
+ # otherwise emits it asymmetrically — omitted on the parse path (the
24
+ # wrapper's own attribute is never assigned) but present after
25
+ # `from_hash` (deserialization assigns it) — which breaks the canonical
26
+ # `to_hash` round-trip for a supplement whose base carries a non-default
27
+ # publisher (e.g. an ANSI/ISO corrigendum). The truth lives in `base`.
28
+ def to_hash(*args)
29
+ hash = super
30
+ if hash.is_a?(::Hash)
31
+ # `publisher` and `code` are delegated to `base`; never serialize
32
+ # them on the wrapper (they'd duplicate base.publisher/base.number
33
+ # and, for publisher, desync across parse vs from_hash).
34
+ hash.delete("publisher")
35
+ hash.delete("code")
36
+ end
37
+ hash
19
38
  end
20
39
  end
21
40
  end
@@ -4,9 +4,10 @@ module Pubid
4
4
  module Ieee
5
5
  module Identifiers
6
6
  autoload :AdoptedStandard, "#{__dir__}/identifiers/adopted_standard"
7
- autoload :Base, "#{__dir__}/identifiers/base"
7
+ autoload :Amendment, "#{__dir__}/identifiers/amendment"
8
8
  autoload :ConformanceIdentifier,
9
9
  "#{__dir__}/identifiers/conformance_identifier"
10
+ autoload :CodeNumber, "#{__dir__}/identifiers/code_number"
10
11
  autoload :Corrigendum, "#{__dir__}/identifiers/corrigendum"
11
12
  autoload :CsaDualPublished, "#{__dir__}/identifiers/csa_dual_published"
12
13
  autoload :DualIdentifier, "#{__dir__}/identifiers/dual_identifier"
@@ -14,11 +14,12 @@ module Pubid
14
14
  # Extract type
15
15
  attributes[:type] = extract_value(parsed[:type])
16
16
 
17
- # Extract number
17
+ # Extract the document designation. It travels as `code:` so the base
18
+ # initializer parses it into `code_obj` and the CodeNumber mixin
19
+ # hoists the flat split columns (number/prefix/parts/separator) that
20
+ # relaton indexes on.
18
21
  number_str = extract_value(parsed[:number])
19
- if number_str
20
- attributes[:number] = Components::Code.parse(number_str)
21
- end
22
+ attributes[:code] = number_str if number_str
22
23
 
23
24
  # Extract year - handle both short (52) and full (1952) formats
24
25
  year_str = extract_value(parsed[:year])
@@ -28,13 +29,13 @@ module Pubid
28
29
  if year_int.between?(12, 63)
29
30
  year_int += 1900
30
31
  end
31
- attributes[:year] = year_int
32
+ attributes[:year] = year_int.to_s
32
33
  end
33
34
 
34
35
  # Override with full_year if present
35
36
  full_year_str = extract_value(parsed[:full_year])
36
37
  if full_year_str
37
- attributes[:year] = full_year_str.to_i
38
+ attributes[:year] = full_year_str.to_i.to_s
38
39
  end
39
40
 
40
41
  # Create identifier
@@ -5,32 +5,36 @@ require "lutaml/model"
5
5
  module Pubid
6
6
  module Ieee
7
7
  module Ire
8
- # Base class for IRE identifiers
9
- # IRE (Institute of Radio Engineers): 1912-1963
10
- class Identifier < Lutaml::Model::Serializable
11
- attribute :publisher, :string, default: -> { "IRE" }
12
- attribute :type, :string # "Trans.", "Standard", "Std"
13
- attribute :number, Components::Code
14
- attribute :year, :integer
15
-
16
- def initialize(**args)
17
- super()
18
-
19
- # Handle number as string or Code object
20
- if args[:number].is_a?(String)
21
- self.number = Components::Code.parse(args[:number])
22
- elsif args[:number]
23
- self.number = args[:number]
24
- end
8
+ # IRE identifiers (Institute of Radio Engineers: 1912-1963).
9
+ #
10
+ # Reparented onto Pubid::Ieee::Identifier + the CodeNumber mixin for the
11
+ # same reasons AIEE was (see Pubid::Ieee::Aiee::Identifier): descending
12
+ # from bare Lutaml::Model::Serializable left IRE without `#root` (relaton
13
+ # keys its index on `id.root.number.to_s` -> NoMethodError), without a
14
+ # polymorphic `_type` (so `from_hash` could not route back), and — because
15
+ # an IRE object was not a ::Pubid::Identifier — unassignable to
16
+ # Identifiers::AdoptedStandard#adopted_identifiers, which raised
17
+ # Lutaml::Model::IncorrectModelError on `to_hash` for the IRE-adopted
18
+ # forms ("IEEE Std 159-1972 (52 IRE 7 S2)").
19
+ #
20
+ # The document designation ("7.S2") is carried in the shared `code_obj`
21
+ # and serialized as the flat split columns (number/prefix/parts/
22
+ # separator); the publication year uses the base's plain `:string` `year`
23
+ # (IRE previously declared its own `:integer` one, which would collide).
24
+ class Identifier < Pubid::Ieee::Identifier
25
+ include Pubid::Ieee::Identifiers::CodeNumber
25
26
 
26
- # Set other attributes
27
- attrs = self.class.attributes
28
- args.each do |key, value|
29
- next if key == :number
27
+ attribute :publisher, :string, default: -> { "IRE" }
28
+ # IRE spells its type word out when present ("Trans.", "Standard",
29
+ # "Std") and omits it otherwise, so the base's "Std" default must go —
30
+ # else "52 IRE 7.S2" would render as "52 IRE Std 7.S2".
31
+ attribute :type, :string, default: -> {}
30
32
 
31
- setter = :"#{key}="
32
- public_send(setter, value) if attrs.key?(key)
33
- end
33
+ # A distinct polymorphic name so from_hash routes to IRE. The derived
34
+ # default (last name segment "Identifier") would be
35
+ # "pubid:ieee:identifier", colliding with the base class.
36
+ def self.polymorphic_name
37
+ "pubid:ieee:ire"
34
38
  end
35
39
 
36
40
  # Parse IRE identifier string
@@ -40,17 +44,28 @@ module Pubid
40
44
  builder.build(parsed)
41
45
  end
42
46
 
43
- def to_s
44
- parts = []
47
+ def to_s(trademark: false)
45
48
  # Year comes FIRST in IRE format - render as 2-digit short year
46
- if year
47
- short_year = year.between?(1900, 1999) ? year - 1900 : year
48
- parts << short_year.to_s
49
+ result = [(short_year if year), publisher, type, code&.to_s]
50
+ .compact.join(" ")
51
+ # The code is the last token, so the end of the string already *is*
52
+ # the code boundary — but the symbol is picked from the code, not by
53
+ # scanning the string (which starts with the year).
54
+ if trademark
55
+ result += Pubid::Ieee.trademark_symbol_for(code_obj&.number,
56
+ code_obj&.prefix,
57
+ publishers: [publisher])
49
58
  end
50
- parts << publisher
51
- parts << type if type
52
- parts << number.to_s if number
53
- parts.join(" ")
59
+ result
60
+ end
61
+
62
+ private
63
+
64
+ # IRE prints the publication year first, abbreviated to two digits for
65
+ # the 20th century ("1952" => "52").
66
+ def short_year
67
+ value = year.to_i
68
+ (value.between?(1900, 1999) ? value - 1900 : value).to_s
54
69
  end
55
70
  end
56
71
  end
@@ -20,6 +20,18 @@ module Pubid
20
20
  # identifier = builder.build(parsed)
21
21
  # # => #<Pubid::Ieee::Identifiers::Nesc::Handbook>
22
22
  class Builder
23
+ # The NESC's own designation (ANSI/IEEE C2). Used as the index code for
24
+ # the year-first forms, which print no code of their own.
25
+ #
26
+ # CAVEAT: this files the whole NESC family — including the Handbook and
27
+ # Redline, which are companions of the code rather than the code itself
28
+ # — under one `prefix "C"` + `number "2"` index key. That is deliberate:
29
+ # relaton narrows on `root.number` and then matches the full hash, so
30
+ # `_type` (and `variant`) keep the documents distinct; the alternative
31
+ # was an empty key, which silently defeats the binary search. Revisit if
32
+ # relaton ever treats `prefix + number` alone as an identity.
33
+ DEFAULT_CODE = "C2"
34
+
23
35
  # Build NESC identifier from parsed hash
24
36
  #
25
37
  # @param parsed_hash [Hash] Hash from parser
@@ -28,22 +40,18 @@ module Pubid
28
40
  # Determine identifier type based on parsed attributes
29
41
  identifier_class = determine_identifier_class(parsed_hash)
30
42
 
31
- identifier = identifier_class.new
32
-
33
- # Set code if present (C2)
34
- if parsed_hash[:code]
35
- code_str = parsed_hash[:code].to_s
36
- identifier.code = Pubid::Ieee::Components::Code.new(
37
- prefix: code_str[0], # "C" from "C2"
38
- number: code_str[1..], # "2" from "C2"
39
- )
40
- end
43
+ # The code travels through the base initializer as `code:` so it lands
44
+ # in `code_obj` and the CodeNumber mixin hoists the flat split columns
45
+ # relaton indexes on. Every NESC document is the C2-designated code
46
+ # (or a companion of it), so the year-first forms — which print no
47
+ # code — still key under "C2" rather than leaving `root.number` empty.
48
+ identifier = identifier_class.new(
49
+ code: parsed_hash[:code]&.to_s || DEFAULT_CODE,
50
+ )
41
51
 
42
52
  # Set year (required for all NESC identifiers)
43
53
  if parsed_hash[:year]
44
- identifier.year = Pubid::Components::Date.new(
45
- year: parsed_hash[:year].to_s.to_i,
46
- )
54
+ identifier.year = parsed_hash[:year].to_s
47
55
  end
48
56
 
49
57
  # Set variant (Handbook, Redline, etc.)
@@ -56,16 +64,20 @@ module Pubid
56
64
  identifier.edition = parsed_hash[:edition].to_s
57
65
  end
58
66
 
59
- # Set draft flag
60
- if parsed_hash[:draft]
61
- identifier.draft = true
62
- end
63
-
64
67
  # Set month (for drafts)
65
68
  if parsed_hash[:month]
66
69
  identifier.month = parsed_hash[:month].to_s
67
70
  end
68
71
 
72
+ # Registered-trademark "(R)" marks and the "(NESC(R))" abbreviation
73
+ # suffix (year-first forms) — see Identifiers::Nesc::Base#name_portion.
74
+ identifier.registered = true if parsed_hash[:name_registered] ||
75
+ parsed_hash[:abbr_registered]
76
+ if parsed_hash[:paren_abbr]
77
+ identifier.abbr_suffix = true
78
+ identifier.abbr_suffix_registered = true if parsed_hash[:paren_registered]
79
+ end
80
+
69
81
  identifier
70
82
  end
71
83
 
@@ -92,8 +104,9 @@ module Pubid
92
104
  # C2 code means standard NESC
93
105
  return Identifiers::Nesc::Standard if parsed_hash[:code]
94
106
 
95
- # Fallback to base class
96
- Identifiers::Nesc::Base
107
+ # Plain year-first edition. Never the abstract Nesc::Base — only
108
+ # concrete leaves carry the CodeNumber `number` column.
109
+ Identifiers::Nesc::Edition
97
110
  end
98
111
  end
99
112
  end
@@ -34,15 +34,15 @@ module Pubid
34
34
  str("C2").as(:code)
35
35
  end
36
36
 
37
- # NESC name variations
37
+ # NESC name variations (the "(R)" registered mark is captured
38
+ # separately by the `registered` rule so it can be round-tripped)
38
39
  rule(:nesc_full_name) do
39
- str("National Electrical Safety Code(R)") |
40
- str("National Electrical Safety Code") |
40
+ str("National Electrical Safety Code") |
41
41
  str("National Electric Safety Code") # Typo variation
42
42
  end
43
43
 
44
44
  rule(:nesc_abbr) do
45
- str("NESC(R)") | str("NESC")
45
+ str("NESC")
46
46
  end
47
47
 
48
48
  rule(:nesc_name) do
@@ -51,7 +51,7 @@ module Pubid
51
51
 
52
52
  # Registered trademark notation
53
53
  rule(:registered) do
54
- str("(R)").maybe
54
+ str("(R)")
55
55
  end
56
56
 
57
57
  # Edition notations
@@ -97,8 +97,8 @@ module Pubid
97
97
  dash >>
98
98
  year.as(:year) >>
99
99
  (comma.maybe >> space).maybe >>
100
- nesc_full_name >>
101
- (space >> str("(") >> nesc_abbr >> str(")")).maybe
100
+ nesc_full_name >> registered.maybe >>
101
+ (space >> str("(") >> nesc_abbr >> registered.maybe >> str(")")).maybe
102
102
  end
103
103
 
104
104
  # Pattern 2: YYYY NESC format (year-first)
@@ -109,11 +109,12 @@ module Pubid
109
109
  year.as(:year) >>
110
110
  space >>
111
111
  (
112
- # Full name with optional (NESC) suffix
113
- (nesc_full_name >> registered >>
114
- (space >> str("(") >> nesc_abbr >> registered >> str(")")).maybe) |
115
- # Just NESC abbreviation
116
- (nesc_abbr >> registered)
112
+ # Full name with optional (NESC) abbreviation suffix
113
+ (nesc_full_name.as(:full_name) >> registered.as(:name_registered).maybe >>
114
+ (space >> str("(") >> nesc_abbr.as(:paren_abbr) >>
115
+ registered.as(:paren_registered).maybe >> str(")")).maybe) |
116
+ # Just the NESC abbreviation (e.g. "2017 NESC(R) Handbook")
117
+ (nesc_abbr.as(:abbr) >> registered.as(:abbr_registered).maybe)
117
118
  ) >>
118
119
  (space >> variant).maybe >>
119
120
  (comma >> space >> edition).maybe
@@ -123,7 +124,7 @@ module Pubid
123
124
  # Examples: "National Electrical Safety Code, C2-2012"
124
125
  # "National Electrical Safety Code, C2-2012 - Redline"
125
126
  rule(:name_first) do
126
- nesc_full_name >>
127
+ nesc_full_name >> registered.maybe >>
127
128
  comma >>
128
129
  space >>
129
130
  c2_code >>
@@ -138,7 +139,7 @@ module Pubid
138
139
  rule(:draft_nesc) do
139
140
  str("Draft").as(:draft) >>
140
141
  space >>
141
- nesc_name >>
142
+ nesc_name >> registered.maybe >>
142
143
  comma >> space >>
143
144
  month >> space >> year.as(:year)
144
145
  end