pubid 2.0.0.pre.alpha.2 → 2.0.0.pre.alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +5 -1
  3. data/data/nist/update_codes.yaml +25 -0
  4. data/lib/pubid/amca/builder.rb +2 -2
  5. data/lib/pubid/amca/identifier.rb +7 -39
  6. data/lib/pubid/amca/identifiers/base.rb +0 -26
  7. data/lib/pubid/amca/identifiers/interpretation.rb +0 -17
  8. data/lib/pubid/amca/identifiers/publication.rb +0 -13
  9. data/lib/pubid/amca/renderer.rb +82 -0
  10. data/lib/pubid/amca/single_identifier.rb +0 -23
  11. data/lib/pubid/amca/urn_parser.rb +28 -0
  12. data/lib/pubid/amca.rb +42 -1
  13. data/lib/pubid/ansi/builder.rb +5 -3
  14. data/lib/pubid/ansi/identifier.rb +1 -43
  15. data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
  16. data/lib/pubid/ansi/identifiers/standard.rb +2 -3
  17. data/lib/pubid/ansi/renderer.rb +53 -0
  18. data/lib/pubid/ansi/single_identifier.rb +2 -31
  19. data/lib/pubid/ansi/urn_generator.rb +3 -38
  20. data/lib/pubid/ansi/urn_parser.rb +23 -0
  21. data/lib/pubid/ansi.rb +38 -3
  22. data/lib/pubid/api/builder.rb +29 -74
  23. data/lib/pubid/api/identifier.rb +0 -51
  24. data/lib/pubid/api/identifiers/base.rb +0 -2
  25. data/lib/pubid/api/identifiers/bulletin.rb +0 -2
  26. data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
  27. data/lib/pubid/api/identifiers/mpms.rb +1 -17
  28. data/lib/pubid/api/identifiers/publication.rb +0 -2
  29. data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
  30. data/lib/pubid/api/identifiers/specification.rb +0 -2
  31. data/lib/pubid/api/identifiers/standard.rb +0 -2
  32. data/lib/pubid/api/identifiers/technical_report.rb +0 -2
  33. data/lib/pubid/api/identifiers/typeless_standard.rb +1 -14
  34. data/lib/pubid/api/identifiers.rb +18 -0
  35. data/lib/pubid/api/renderer.rb +89 -0
  36. data/lib/pubid/api/single_identifier.rb +1 -13
  37. data/lib/pubid/api/urn_generator.rb +0 -18
  38. data/lib/pubid/api/urn_parser.rb +35 -0
  39. data/lib/pubid/api.rb +51 -5
  40. data/lib/pubid/ashrae/builder.rb +3 -3
  41. data/lib/pubid/ashrae/identifier.rb +6 -39
  42. data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
  43. data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
  44. data/lib/pubid/ashrae/identifiers/base.rb +3 -0
  45. data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
  46. data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
  47. data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
  48. data/lib/pubid/ashrae/renderer.rb +117 -0
  49. data/lib/pubid/ashrae/single_identifier.rb +0 -13
  50. data/lib/pubid/ashrae/urn_generator.rb +0 -8
  51. data/lib/pubid/ashrae/urn_parser.rb +27 -0
  52. data/lib/pubid/ashrae.rb +42 -1
  53. data/lib/pubid/asme/components/code.rb +10 -2
  54. data/lib/pubid/asme/identifier.rb +0 -46
  55. data/lib/pubid/asme/identifiers/base.rb +0 -60
  56. data/lib/pubid/asme/renderer.rb +66 -0
  57. data/lib/pubid/asme/urn_parser.rb +31 -0
  58. data/lib/pubid/asme.rb +42 -1
  59. data/lib/pubid/astm/components/code.rb +9 -0
  60. data/lib/pubid/{jis → astm}/components.rb +1 -1
  61. data/lib/pubid/astm/identifier.rb +0 -77
  62. data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
  63. data/lib/pubid/astm/identifiers/data_series.rb +0 -14
  64. data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
  65. data/lib/pubid/astm/identifiers/manual.rb +0 -27
  66. data/lib/pubid/astm/identifiers/monograph.rb +0 -14
  67. data/lib/pubid/astm/identifiers/research_report.rb +0 -7
  68. data/lib/pubid/astm/identifiers/standard.rb +0 -39
  69. data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
  70. data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
  71. data/lib/pubid/astm/identifiers.rb +18 -0
  72. data/lib/pubid/astm/renderer.rb +172 -0
  73. data/lib/pubid/astm/single_identifier.rb +0 -10
  74. data/lib/pubid/astm/urn_parser.rb +30 -0
  75. data/lib/pubid/astm.rb +39 -27
  76. data/lib/pubid/bsi/builder.rb +21 -12
  77. data/lib/pubid/bsi/identifier.rb +8 -62
  78. data/lib/pubid/bsi/identifiers/addendum_document.rb +3 -33
  79. data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +11 -47
  80. data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +11 -38
  81. data/lib/pubid/bsi/identifiers/aerospace_standard.rb +3 -53
  82. data/lib/pubid/bsi/identifiers/amendment.rb +3 -19
  83. data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +2 -4
  84. data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
  85. data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -84
  86. data/lib/pubid/bsi/identifiers/committee_document.rb +1 -14
  87. data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -84
  88. data/lib/pubid/bsi/identifiers/corrigendum.rb +3 -7
  89. data/lib/pubid/bsi/identifiers/detailed_specification.rb +1 -34
  90. data/lib/pubid/bsi/identifiers/disc.rb +1 -27
  91. data/lib/pubid/bsi/identifiers/draft_document.rb +3 -44
  92. data/lib/pubid/bsi/identifiers/electronic_book.rb +3 -36
  93. data/lib/pubid/bsi/identifiers/expert_commentary.rb +3 -15
  94. data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +1 -45
  95. data/lib/pubid/bsi/identifiers/flex.rb +1 -33
  96. data/lib/pubid/bsi/identifiers/handbook.rb +2 -13
  97. data/lib/pubid/bsi/identifiers/index.rb +1 -30
  98. data/lib/pubid/bsi/identifiers/method.rb +1 -39
  99. data/lib/pubid/bsi/identifiers/national_annex.rb +5 -27
  100. data/lib/pubid/bsi/identifiers/practice_guide.rb +2 -4
  101. data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +3 -52
  102. data/lib/pubid/bsi/identifiers/published_document.rb +3 -52
  103. data/lib/pubid/bsi/identifiers/section.rb +1 -28
  104. data/lib/pubid/bsi/identifiers/set.rb +3 -17
  105. data/lib/pubid/bsi/identifiers/standalone_amendment.rb +1 -7
  106. data/lib/pubid/bsi/identifiers/supplement_document.rb +3 -21
  107. data/lib/pubid/bsi/identifiers/supplementary_index.rb +1 -44
  108. data/lib/pubid/bsi/identifiers/technical_specification.rb +3 -45
  109. data/lib/pubid/bsi/identifiers/test_method.rb +1 -30
  110. data/lib/pubid/bsi/identifiers/value_added_publication.rb +3 -14
  111. data/lib/pubid/bsi/identifiers.rb +0 -1
  112. data/lib/pubid/bsi/renderer.rb +1050 -0
  113. data/lib/pubid/bsi/single_identifier.rb +6 -70
  114. data/lib/pubid/bsi/urn_generator.rb +2 -3
  115. data/lib/pubid/bsi/urn_parser.rb +52 -0
  116. data/lib/pubid/bsi.rb +224 -1
  117. data/lib/pubid/builder/base.rb +57 -10
  118. data/lib/pubid/bundled_identifier.rb +0 -1
  119. data/lib/pubid/ccsds/builder.rb +4 -3
  120. data/lib/pubid/ccsds/identifier.rb +63 -66
  121. data/lib/pubid/ccsds/identifiers/base.rb +11 -61
  122. data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
  123. data/lib/pubid/ccsds/parser.rb +4 -2
  124. data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
  125. data/lib/pubid/ccsds/urn_generator.rb +3 -3
  126. data/lib/pubid/ccsds/urn_parser.rb +20 -0
  127. data/lib/pubid/ccsds.rb +39 -1
  128. data/lib/pubid/cen_cenelec/builder.rb +12 -14
  129. data/lib/pubid/cen_cenelec/identifier.rb +7 -38
  130. data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +13 -4
  131. data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -8
  132. data/lib/pubid/cen_cenelec/identifiers/base.rb +5 -41
  133. data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
  134. data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
  135. data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +2 -25
  136. data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -13
  137. data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
  138. data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +4 -7
  139. data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
  140. data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
  141. data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
  142. data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
  143. data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
  144. data/lib/pubid/cen_cenelec/renderer.rb +261 -0
  145. data/lib/pubid/cen_cenelec/single_identifier.rb +11 -89
  146. data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
  147. data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
  148. data/lib/pubid/cen_cenelec.rb +168 -1
  149. data/lib/pubid/cie/components/code.rb +8 -0
  150. data/lib/pubid/cie/identifier.rb +6 -57
  151. data/lib/pubid/cie/urn_parser.rb +28 -0
  152. data/lib/pubid/cie.rb +43 -1
  153. data/lib/pubid/components/adoption.rb +104 -0
  154. data/lib/pubid/components/code.rb +22 -8
  155. data/lib/pubid/components/date.rb +23 -16
  156. data/lib/pubid/components/edition.rb +9 -6
  157. data/lib/pubid/components/iteration.rb +32 -0
  158. data/lib/pubid/components/language.rb +6 -4
  159. data/lib/pubid/components/locality.rb +10 -1
  160. data/lib/pubid/components/publisher.rb +9 -6
  161. data/lib/pubid/components/relationship.rb +151 -0
  162. data/lib/pubid/components/stage.rb +5 -14
  163. data/lib/pubid/components/supplement.rb +184 -0
  164. data/lib/pubid/components/type.rb +5 -15
  165. data/lib/pubid/components/typed_stage.rb +10 -11
  166. data/lib/pubid/components.rb +4 -1
  167. data/lib/pubid/core/update_codes.rb +28 -7
  168. data/lib/pubid/csa/identifier.rb +0 -59
  169. data/lib/pubid/csa/identifiers/base.rb +2 -122
  170. data/lib/pubid/csa/identifiers/cec.rb +2 -101
  171. data/lib/pubid/csa/identifiers/series.rb +2 -102
  172. data/lib/pubid/csa/renderer.rb +292 -0
  173. data/lib/pubid/csa/urn_generator.rb +1 -1
  174. data/lib/pubid/csa/urn_parser.rb +33 -0
  175. data/lib/pubid/csa.rb +42 -1
  176. data/lib/pubid/etsi/components/code.rb +9 -2
  177. data/lib/pubid/etsi/identifier.rb +0 -43
  178. data/lib/pubid/etsi/identifiers/base.rb +1 -4
  179. data/lib/pubid/etsi/identifiers/supplement_identifier.rb +2 -9
  180. data/lib/pubid/etsi/renderer.rb +42 -0
  181. data/lib/pubid/etsi/urn_parser.rb +34 -0
  182. data/lib/pubid/etsi.rb +42 -1
  183. data/lib/pubid/export/exporter.rb +4 -46
  184. data/lib/pubid/export/flavor_exporter.rb +111 -278
  185. data/lib/pubid/export.rb +0 -6
  186. data/lib/pubid/identifier.rb +2 -17
  187. data/lib/pubid/identifier_facade.rb +114 -0
  188. data/lib/pubid/identifier_metadata.rb +1 -1
  189. data/lib/pubid/idf/builder.rb +3 -3
  190. data/lib/pubid/idf/identifier.rb +3 -66
  191. data/lib/pubid/idf/identifiers/amendment.rb +2 -1
  192. data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
  193. data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
  194. data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
  195. data/lib/pubid/idf/parser.rb +3 -2
  196. data/lib/pubid/idf/renderer.rb +84 -0
  197. data/lib/pubid/idf/supplement_identifier.rb +2 -10
  198. data/lib/pubid/idf/urn_generator.rb +4 -39
  199. data/lib/pubid/idf/urn_parser.rb +25 -0
  200. data/lib/pubid/idf.rb +51 -1
  201. data/lib/pubid/iec/builder.rb +46 -64
  202. data/lib/pubid/iec/components/code.rb +8 -32
  203. data/lib/pubid/iec/components/publisher.rb +0 -1
  204. data/lib/pubid/iec/components.rb +14 -0
  205. data/lib/pubid/iec/identifier.rb +251 -213
  206. data/lib/pubid/iec/identifiers/amendment.rb +2 -3
  207. data/lib/pubid/iec/identifiers/base.rb +8 -32
  208. data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
  209. data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
  210. data/lib/pubid/iec/identifiers/consolidated_identifier.rb +27 -26
  211. data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
  212. data/lib/pubid/iec/identifiers/fragment_identifier.rb +37 -22
  213. data/lib/pubid/iec/identifiers/guide.rb +0 -2
  214. data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
  215. data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
  216. data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
  217. data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
  218. data/lib/pubid/iec/identifiers/sheet_identifier.rb +21 -11
  219. data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
  220. data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
  221. data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
  222. data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
  223. data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
  224. data/lib/pubid/iec/identifiers/test_report_form.rb +5 -34
  225. data/lib/pubid/iec/identifiers/vap_identifier.rb +26 -19
  226. data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
  227. data/lib/pubid/iec/identifiers/working_document.rb +4 -48
  228. data/lib/pubid/iec/identifiers.rb +30 -0
  229. data/lib/pubid/iec/parser.rb +13 -12
  230. data/lib/pubid/iec/renderer.rb +254 -0
  231. data/lib/pubid/iec/single_identifier.rb +6 -12
  232. data/lib/pubid/iec/supplement_identifier.rb +58 -54
  233. data/lib/pubid/iec/urn_generator.rb +3 -3
  234. data/lib/pubid/iec/urn_parser.rb +3 -3
  235. data/lib/pubid/iec.rb +40 -68
  236. data/lib/pubid/ieee/builder.rb +12 -12
  237. data/lib/pubid/ieee/components/code.rb +8 -0
  238. data/lib/pubid/ieee/components/draft.rb +14 -0
  239. data/lib/pubid/ieee/components/relationship.rb +5 -149
  240. data/lib/pubid/ieee/identifier.rb +6 -41
  241. data/lib/pubid/ieee/identifiers/adopted_standard.rb +1 -6
  242. data/lib/pubid/ieee/identifiers/base.rb +101 -458
  243. data/lib/pubid/ieee/identifiers/conformance_identifier.rb +1 -7
  244. data/lib/pubid/ieee/identifiers/corrigendum.rb +1 -9
  245. data/lib/pubid/ieee/identifiers/csa_dual_published.rb +1 -7
  246. data/lib/pubid/ieee/identifiers/dual_identifier.rb +1 -1
  247. data/lib/pubid/ieee/identifiers/dual_published.rb +1 -1
  248. data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +1 -6
  249. data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +1 -7
  250. data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
  251. data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -15
  252. data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +1 -3
  253. data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
  254. data/lib/pubid/ieee/identifiers/redlined_standard.rb +1 -4
  255. data/lib/pubid/ieee/identifiers/si_standard.rb +1 -35
  256. data/lib/pubid/ieee/identifiers/standard.rb +1 -1
  257. data/lib/pubid/ieee/pre_parser.rb +301 -0
  258. data/lib/pubid/ieee/renderer.rb +307 -0
  259. data/lib/pubid/ieee/urn_parser.rb +34 -0
  260. data/lib/pubid/ieee.rb +62 -1
  261. data/lib/pubid/ieee_debug.rb +0 -1
  262. data/lib/pubid/iho/builder.rb +2 -2
  263. data/lib/pubid/iho/identifier.rb +8 -42
  264. data/lib/pubid/iho/identifiers/base.rb +49 -10
  265. data/lib/pubid/iho/parser.rb +3 -3
  266. data/lib/pubid/iho/renderer.rb +30 -0
  267. data/lib/pubid/iho/urn_generator.rb +2 -2
  268. data/lib/pubid/iho/urn_parser.rb +58 -0
  269. data/lib/pubid/iho.rb +50 -1
  270. data/lib/pubid/iso/builder.rb +55 -53
  271. data/lib/pubid/iso/bundled_identifier.rb +51 -0
  272. data/lib/pubid/iso/components/code.rb +7 -19
  273. data/lib/pubid/iso/components/publisher.rb +10 -8
  274. data/lib/pubid/iso/components.rb +2 -4
  275. data/lib/pubid/iso/identifier.rb +218 -252
  276. data/lib/pubid/iso/identifiers/addendum.rb +9 -6
  277. data/lib/pubid/iso/identifiers/amendment.rb +8 -4
  278. data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
  279. data/lib/pubid/iso/identifiers/data.rb +0 -1
  280. data/lib/pubid/iso/identifiers/directives.rb +8 -2
  281. data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
  282. data/lib/pubid/iso/identifiers/extract.rb +2 -2
  283. data/lib/pubid/iso/identifiers/guide.rb +0 -1
  284. data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
  285. data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
  286. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
  287. data/lib/pubid/iso/identifiers/pas.rb +2 -2
  288. data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
  289. data/lib/pubid/iso/identifiers/supplement.rb +11 -3
  290. data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
  291. data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
  292. data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
  293. data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
  294. data/lib/pubid/iso/identifiers.rb +0 -1
  295. data/lib/pubid/iso/normalizer.rb +89 -0
  296. data/lib/pubid/iso/parser.rb +22 -4
  297. data/lib/pubid/iso/supplement_identifier.rb +15 -2
  298. data/lib/pubid/iso/urn_generator.rb +66 -182
  299. data/lib/pubid/iso/urn_parser.rb +12 -7
  300. data/lib/pubid/iso.rb +173 -2
  301. data/lib/pubid/itu/builder.rb +0 -12
  302. data/lib/pubid/itu/components/code.rb +8 -0
  303. data/lib/pubid/itu/components.rb +11 -0
  304. data/lib/pubid/itu/identifier.rb +6 -104
  305. data/lib/pubid/itu/identifiers/amendment.rb +0 -2
  306. data/lib/pubid/itu/identifiers/annex.rb +0 -2
  307. data/lib/pubid/itu/identifiers/base.rb +0 -6
  308. data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
  309. data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
  310. data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
  311. data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
  312. data/lib/pubid/itu/identifiers/supplement.rb +0 -2
  313. data/lib/pubid/itu/urn_parser.rb +23 -0
  314. data/lib/pubid/itu.rb +42 -1
  315. data/lib/pubid/jcgm/builder.rb +16 -8
  316. data/lib/pubid/jcgm/identifier.rb +0 -43
  317. data/lib/pubid/jcgm/identifiers/amendment.rb +2 -7
  318. data/lib/pubid/jcgm/identifiers/gum_guide.rb +2 -10
  319. data/lib/pubid/jcgm/renderer.rb +68 -0
  320. data/lib/pubid/jcgm/single_identifier.rb +1 -5
  321. data/lib/pubid/jcgm/urn_generator.rb +4 -6
  322. data/lib/pubid/jcgm/urn_parser.rb +23 -0
  323. data/lib/pubid/jcgm.rb +43 -2
  324. data/lib/pubid/jis/builder.rb +44 -52
  325. data/lib/pubid/jis/identifier.rb +132 -46
  326. data/lib/pubid/jis/identifiers/amendment.rb +1 -1
  327. data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
  328. data/lib/pubid/jis/identifiers/standard.rb +2 -1
  329. data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
  330. data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
  331. data/lib/pubid/jis/identifiers.rb +1 -1
  332. data/lib/pubid/jis/parser.rb +31 -5
  333. data/lib/pubid/jis/renderer.rb +69 -0
  334. data/lib/pubid/jis/single_identifier.rb +6 -12
  335. data/lib/pubid/jis/supplement_identifier.rb +17 -14
  336. data/lib/pubid/jis/urn_parser.rb +23 -0
  337. data/lib/pubid/jis.rb +42 -2
  338. data/lib/pubid/nist/builder.rb +63 -1871
  339. data/lib/pubid/nist/caster.rb +1272 -0
  340. data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
  341. data/lib/pubid/nist/components/code.rb +9 -20
  342. data/lib/pubid/nist/components/supplement.rb +2 -2
  343. data/lib/pubid/nist/components.rb +0 -1
  344. data/lib/pubid/nist/identifier.rb +11 -48
  345. data/lib/pubid/nist/identifiers/base.rb +110 -47
  346. data/lib/pubid/nist/identifiers/circular.rb +7 -2
  347. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -1
  348. data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
  349. data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
  350. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
  351. data/lib/pubid/nist/identifiers/crpl_report.rb +8 -8
  352. data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
  353. data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +15 -24
  354. data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
  355. data/lib/pubid/nist/identifiers/handbook.rb +2 -1
  356. data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
  357. data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
  358. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
  359. data/lib/pubid/nist/identifiers/monograph.rb +7 -3
  360. data/lib/pubid/nist/identifiers/report.rb +4 -2
  361. data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
  362. data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
  363. data/lib/pubid/nist/identifiers.rb +1 -0
  364. data/lib/pubid/nist/parser.rb +62 -452
  365. data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
  366. data/lib/pubid/nist/preprocessor.rb +416 -0
  367. data/lib/pubid/nist/renderer.rb +43 -0
  368. data/lib/pubid/nist/router.rb +148 -0
  369. data/lib/pubid/nist/series/base.rb +58 -0
  370. data/lib/pubid/nist/series/crpl.rb +13 -0
  371. data/lib/pubid/nist/series/fips.rb +14 -0
  372. data/lib/pubid/nist/series/ir.rb +60 -0
  373. data/lib/pubid/nist/series/letter_preserving.rb +15 -0
  374. data/lib/pubid/nist/series/mono.rb +19 -0
  375. data/lib/pubid/nist/series/ncstar.rb +20 -0
  376. data/lib/pubid/nist/series.rb +49 -0
  377. data/lib/pubid/nist/supplement_identifier.rb +3 -1
  378. data/lib/pubid/nist/urn_parser.rb +67 -0
  379. data/lib/pubid/nist.rb +82 -4
  380. data/lib/pubid/oiml/components/code.rb +10 -0
  381. data/lib/pubid/oiml/identifier.rb +0 -50
  382. data/lib/pubid/oiml/identifiers/annex.rb +3 -45
  383. data/lib/pubid/oiml/identifiers/base.rb +2 -17
  384. data/lib/pubid/oiml/renderer.rb +161 -0
  385. data/lib/pubid/oiml/single_identifier.rb +6 -45
  386. data/lib/pubid/oiml/supplement_identifier.rb +4 -19
  387. data/lib/pubid/oiml/urn_generator.rb +0 -8
  388. data/lib/pubid/oiml/urn_parser.rb +22 -0
  389. data/lib/pubid/oiml.rb +42 -1
  390. data/lib/pubid/plateau/identifier.rb +7 -41
  391. data/lib/pubid/plateau/identifiers/handbook.rb +1 -3
  392. data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
  393. data/lib/pubid/plateau/renderer.rb +51 -0
  394. data/lib/pubid/plateau/supplement_identifier.rb +1 -1
  395. data/lib/pubid/plateau/urn_parser.rb +43 -0
  396. data/lib/pubid/plateau.rb +43 -1
  397. data/lib/pubid/renderers/directives_renderer.rb +22 -8
  398. data/lib/pubid/renderers/guide_renderer.rb +4 -2
  399. data/lib/pubid/renderers/human_readable.rb +18 -7
  400. data/lib/pubid/rendering/context.rb +28 -19
  401. data/lib/pubid/rendering.rb +0 -3
  402. data/lib/pubid/sae/components/date.rb +8 -0
  403. data/lib/pubid/sae/components/type.rb +5 -1
  404. data/lib/pubid/sae/identifier.rb +0 -23
  405. data/lib/pubid/sae/identifiers/base.rb +2 -16
  406. data/lib/pubid/sae/renderer.rb +36 -0
  407. data/lib/pubid/sae/urn_generator.rb +2 -10
  408. data/lib/pubid/sae/urn_parser.rb +36 -0
  409. data/lib/pubid/sae.rb +42 -1
  410. data/lib/pubid/urn_generator/base.rb +12 -12
  411. data/lib/pubid/urn_parser/base.rb +81 -0
  412. data/lib/pubid/urn_parser/errors.rb +9 -0
  413. data/lib/pubid/urn_parser.rb +14 -0
  414. data/lib/pubid/version.rb +1 -1
  415. data/lib/pubid.rb +29 -7
  416. data/lib/tasks/website-data.json +1940 -1882
  417. metadata +75 -44
  418. data/lib/pubid/amca/scheme.rb +0 -16
  419. data/lib/pubid/ansi/scheme.rb +0 -15
  420. data/lib/pubid/api/scheme.rb +0 -66
  421. data/lib/pubid/ashrae/scheme.rb +0 -53
  422. data/lib/pubid/asme/scheme.rb +0 -37
  423. data/lib/pubid/astm/scheme.rb +0 -55
  424. data/lib/pubid/bsi/identifiers/base.rb +0 -11
  425. data/lib/pubid/bsi/scheme.rb +0 -243
  426. data/lib/pubid/ccsds/scheme.rb +0 -57
  427. data/lib/pubid/cen_cenelec/scheme.rb +0 -164
  428. data/lib/pubid/cie/scheme.rb +0 -64
  429. data/lib/pubid/components/factory.rb +0 -50
  430. data/lib/pubid/csa/scheme.rb +0 -44
  431. data/lib/pubid/etsi/scheme.rb +0 -42
  432. data/lib/pubid/export/data_class_exporter.rb +0 -59
  433. data/lib/pubid/export/ieee_exporter.rb +0 -78
  434. data/lib/pubid/export/itu_exporter.rb +0 -66
  435. data/lib/pubid/export/nist_exporter.rb +0 -64
  436. data/lib/pubid/export/registry_exporter.rb +0 -90
  437. data/lib/pubid/export/scheme_exporter.rb +0 -70
  438. data/lib/pubid/identifier_registry.rb +0 -198
  439. data/lib/pubid/idf/scheme.rb +0 -61
  440. data/lib/pubid/iec/scheme.rb +0 -71
  441. data/lib/pubid/ieee/scheme.rb +0 -90
  442. data/lib/pubid/iho/scheme.rb +0 -29
  443. data/lib/pubid/iso/identifiers/base.rb +0 -115
  444. data/lib/pubid/iso/scheme.rb +0 -193
  445. data/lib/pubid/itu/scheme.rb +0 -174
  446. data/lib/pubid/jcgm/scheme.rb +0 -60
  447. data/lib/pubid/jis/components/code.rb +0 -59
  448. data/lib/pubid/jis/identifiers/base.rb +0 -72
  449. data/lib/pubid/jis/scheme.rb +0 -49
  450. data/lib/pubid/nist/components/publisher.rb +0 -24
  451. data/lib/pubid/nist/scheme.rb +0 -199
  452. data/lib/pubid/oiml/scheme.rb +0 -46
  453. data/lib/pubid/plateau/scheme.rb +0 -45
  454. data/lib/pubid/rendering/base.rb +0 -73
  455. data/lib/pubid/rendering/common.rb +0 -211
  456. data/lib/pubid/rendering/format.rb +0 -25
  457. data/lib/pubid/sae/scheme.rb +0 -47
  458. data/lib/pubid/scheme.rb +0 -219
@@ -1,71 +0,0 @@
1
- require_relative "identifiers/international_standard"
2
- # frozen_string_literal: true
3
- require_relative "identifiers/technical_specification"
4
- require_relative "identifiers/technical_report"
5
- require_relative "identifiers/publicly_available_specification"
6
- require_relative "identifiers/guide"
7
- require_relative "identifiers/amendment"
8
- require_relative "identifiers/corrigendum"
9
- require_relative "identifiers/fragment_identifier"
10
-
11
- module Pubid
12
- module Iec
13
- class Scheme < Pubid::Scheme
14
- class << self
15
- def identifiers
16
- [
17
- Identifiers::InternationalStandard,
18
- Identifiers::TechnicalSpecification,
19
- Identifiers::TechnicalReport,
20
- Identifiers::PubliclyAvailableSpecification,
21
- Identifiers::Guide,
22
- ]
23
- end
24
-
25
- def supplement_identifiers
26
- [
27
- Identifiers::Amendment,
28
- Identifiers::Corrigendum,
29
- Identifiers::FragmentIdentifier,
30
- ]
31
- end
32
-
33
- def typed_stages
34
- identifiers.flat_map { |klass| klass::TYPED_STAGES }
35
- end
36
-
37
- def supplement_typed_stages
38
- supplement_identifiers.flat_map { |klass| klass::TYPED_STAGES }
39
- end
40
-
41
- def locate_typed_stage_by_abbr(abbr)
42
- abbr = "" if abbr.nil?
43
-
44
- typed_stage = (typed_stages + supplement_typed_stages).detect do |ts|
45
- ts.abbr.include?(abbr)
46
- end
47
-
48
- unless typed_stage
49
- raise ArgumentError,
50
- "Unknown type abbreviation: '#{abbr}'"
51
- end
52
-
53
- typed_stage
54
- end
55
-
56
- def locate_identifier_klass_by_type_code(type_code)
57
- identifier_klass = (identifiers + supplement_identifiers).detect do |klass|
58
- klass.type[:key].to_s == type_code.to_s
59
- end
60
-
61
- unless identifier_klass
62
- raise ArgumentError,
63
- "Unknown type code: #{type_code}"
64
- end
65
-
66
- identifier_klass
67
- end
68
- end
69
- end
70
- end
71
- end
@@ -1,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "typed_stages"
4
-
5
- module Pubid
6
- module Ieee
7
- # Scheme provides registry access for IEEE identifiers
8
- # Following the proven ISO/IEC/CEN/BSI pattern
9
- #
10
- # This class is the single source of truth for:
11
- # - TypedStage lookup by abbreviation
12
- # - TypedStage lookup by IEEE draft notation
13
- # - TypedStage lookup by ISO stage code
14
- # - Identifier class selection based on type code
15
- class Scheme < Pubid::Scheme
16
- class << self
17
- # Locate typed stage by abbreviation
18
- # @param abbr [String, nil] stage abbreviation (e.g., "D1", "FDIS", "Std")
19
- # @return [Components::TypedStage] matching typed stage
20
- def locate_typed_stage_by_abbr(abbr)
21
- return TypedStages::DEFAULT_TYPED_STAGE if abbr.nil? || abbr.to_s.strip.empty?
22
-
23
- # Normalize abbreviation
24
- abbr_str = abbr.to_s.strip
25
-
26
- # Find typed stage that includes this abbreviation
27
- typed_stage = TypedStages::TYPED_STAGES.find { |ts| ts.abbr.include?(abbr_str) }
28
-
29
- # Fall back to default if not found
30
- typed_stage || TypedStages::DEFAULT_TYPED_STAGE
31
- end
32
-
33
- # Locate typed stage by IEEE draft notation
34
- # @param draft [String] IEEE draft notation (e.g., "D1", "D5", "P")
35
- # @return [Components::TypedStage, nil] matching typed stage
36
- def locate_typed_stage_by_ieee_draft(draft)
37
- return nil if draft.nil? || draft.to_s.strip.empty?
38
-
39
- draft_str = draft.to_s.strip
40
-
41
- # Try exact match on abbreviation first
42
- ts = TypedStages::TYPED_STAGES.find { |t| t.abbr.include?(draft_str) }
43
- return ts if ts
44
-
45
- # Try match on ieee_draft_equivalent
46
- TypedStages::TYPED_STAGES.find { |t| t.ieee_draft_equivalent == draft_str }
47
- end
48
-
49
- # Locate typed stage by ISO stage code
50
- # @param stage [String] ISO stage code (e.g., "WD", "CD", "DIS", "FDIS")
51
- # @return [Components::TypedStage, nil] matching typed stage
52
- def locate_typed_stage_by_iso_stage(stage)
53
- return nil if stage.nil? || stage.to_s.strip.empty?
54
-
55
- TypedStages::TYPED_STAGES.find { |ts| ts.iso_stage_equivalent == stage.to_s.strip }
56
- end
57
-
58
- # Locate identifier class by type code
59
- # @param type_code [String, Symbol] type code (:standard, :draft, :std, :P, etc.)
60
- # @return [Class] identifier class
61
- def locate_identifier_klass_by_type_code(type_code)
62
- type_str = type_code.to_s
63
-
64
- case type_str
65
- when "draft", "Draft Std", "Draft", "P"
66
- # "P" indicates project draft status - maps to ProjectDraftIdentifier
67
- Identifiers::ProjectDraftIdentifier
68
- when "standard", "Std", "std"
69
- Identifiers::Standard
70
- else
71
- # Default to base identifier
72
- Identifiers::Base
73
- end
74
- end
75
-
76
- # Get all typed stages
77
- # @return [Array<Components::TypedStage>] all registered typed stages
78
- def typed_stages
79
- TypedStages::TYPED_STAGES
80
- end
81
-
82
- # Get default typed stage (published standard)
83
- # @return [Components::TypedStage] default typed stage
84
- def default_typed_stage
85
- TypedStages::DEFAULT_TYPED_STAGE
86
- end
87
- end
88
- end
89
- end
90
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Iho
5
- # Scheme registry for IHO identifier types.
6
- class Scheme < Pubid::Scheme
7
- IDENTIFIERS = [
8
- Identifiers::Standard,
9
- Identifiers::Publication,
10
- Identifiers::Miscellaneous,
11
- Identifiers::Bibliographic,
12
- Identifiers::CircularLetter,
13
- ].freeze
14
-
15
- def initialize
16
- @identifiers = IDENTIFIERS
17
- end
18
-
19
- # Look up an identifier class by its IHO series letter (S/P/M/B/C).
20
- # @param letter [String]
21
- # @return [Class<Identifiers::Base>]
22
- # @raise [KeyError] if the letter is not a known IHO series
23
- def self.identifier_klass_for_type_letter(letter)
24
- @by_letter ||= IDENTIFIERS.to_h { |klass| [klass.type[:short], klass] }
25
- @by_letter.fetch(letter.to_s)
26
- end
27
- end
28
- end
29
- end
@@ -1,115 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "lutaml/model"
4
-
5
- module Pubid
6
- module Iso
7
- module Identifiers
8
- # Base class for ISO identifiers
9
- class Base < ::Pubid::Identifier
10
- # Inherit most attributes from parent
11
- # ISO-specific attributes
12
- attribute :stage_iteration, ::Pubid::Iso::Components::Code
13
-
14
- # ISO rendering context singleton
15
- def self.rendering_context
16
- @rendering_context ||= Pubid::Rendering::RenderingContext.iso
17
- end
18
-
19
- # Render identifier using OOP approach - each component renders itself
20
- #
21
- # @param lang [Symbol] language for rendering (:en or :fr)
22
- # @param lang_single [Boolean] use single char language format
23
- # @param with_edition [Boolean] include edition in output
24
- # @return [String] formatted identifier string
25
- def to_s(lang: :en, lang_single: false, with_edition: false)
26
- # Create rendering context with language settings
27
- context = Pubid::Rendering::RenderingContext.new(
28
- stage_separator: "/",
29
- stage_separator_with_copublisher: " ",
30
- type_separator: "/",
31
- type_separator_with_prefix: " ",
32
- default_type_abbr: "IS",
33
- lang: lang,
34
- lang_single: lang_single,
35
- )
36
-
37
- # Compose the identifier from component renderings
38
- render_from_components(context: context, with_edition: with_edition)
39
- end
40
-
41
- private
42
-
43
- # Compose identifier string by having each component render itself
44
- #
45
- # @param context [RenderingContext] rendering context for flavor rules
46
- # @param with_edition [Boolean] include edition in output
47
- # @return [String] composed identifier string
48
- def render_from_components(context:, with_edition: false)
49
- parts = []
50
- parts << publisher.to_s
51
-
52
- # Stage renders itself with context-aware separators
53
- if stage
54
- has_copub = publisher&.has_copublisher?
55
- parts << stage.to_s(context: context, has_copublisher: has_copub)
56
- end
57
-
58
- # Type renders itself with context-aware separators and default handling
59
- if type
60
- has_prefix = stage || publisher&.has_copublisher?
61
- type_render = type.to_s(context: context, has_prefix: has_prefix)
62
- parts << type_render if type_render != ""
63
- end
64
-
65
- # Number renders itself
66
- parts << " #{number.value}" if number&.value
67
-
68
- # Parts render themselves
69
- parts << "-#{part.value}" if part&.value
70
- parts << "-#{subpart.value}" if subpart&.value
71
-
72
- # Stage iteration renders itself
73
- parts << ".#{stage_iteration.value}" if stage_iteration&.value
74
-
75
- # Date renders itself with context
76
- parts << date.to_s(context: context) if date&.year
77
-
78
- # Edition renders itself
79
- parts << " #{edition}" if with_edition && edition&.number
80
-
81
- # Languages render themselves
82
- if languages&.any?
83
- parts << "(#{languages.map do |l|
84
- l.to_s(lang_single: context.lang_single)
85
- end.join('/')})"
86
- end
87
-
88
- parts.join
89
- end
90
-
91
- public
92
-
93
- # V1 API compatibility - tests expect .copublishers returning array of Publisher objects
94
- def copublishers
95
- return [] unless publisher.copublisher&.any?
96
-
97
- publisher.copublisher.map do |cp|
98
- ::Pubid::Components::Publisher.new(body: cp)
99
- end
100
- end
101
-
102
- def ==(other)
103
- return false unless other.is_a?(Base)
104
-
105
- publisher == other.publisher &&
106
- type == other.type &&
107
- number == other.number &&
108
- part == other.part &&
109
- date == other.date &&
110
- stage == other.stage
111
- end
112
- end
113
- end
114
- end
115
- end
@@ -1,193 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Pubid
4
- module Iso
5
- # ISO Scheme with memoized parser/builder and hash-based indexing
6
- class Scheme < Pubid::Scheme
7
- class << self
8
- # Singleton instance for memoization
9
- # @return [Pubid::Iso::Scheme] the singleton scheme instance
10
- def instance
11
- @instance ||= new
12
- end
13
-
14
- # Delegate class methods to singleton instance for backward compatibility
15
- # @param identifier [String] the identifier string to parse
16
- # @return [Identifier] the parsed identifier
17
- def parse(identifier)
18
- instance.parse(identifier)
19
- end
20
-
21
- # @param abbr [String, Symbol] the abbreviation to find
22
- # @return [TypedStage] the matching typed stage
23
- def locate_typed_stage_by_abbr(abbr)
24
- instance.locate_typed_stage_by_abbr(abbr)
25
- end
26
-
27
- # @param type_code [String, Symbol] the type code to find
28
- # @return [Class] the matching identifier class
29
- def locate_identifier_klass_by_type_code(type_code)
30
- instance.locate_identifier_klass_by_type_code(type_code)
31
- end
32
-
33
- # @param stage_code [String, Symbol] the stage code to find
34
- # @return [TypedStage] the matching typed stage
35
- def locate_typed_stage_by_stage_code(stage_code)
36
- instance.locate_typed_stage_by_stage_code(stage_code)
37
- end
38
-
39
- # @param code [String, Symbol] the per-typed-stage code to find
40
- # @return [TypedStage, nil] the matching typed stage
41
- def locate_typed_stage_by_code(code)
42
- instance.locate_typed_stage_by_code(code)
43
- end
44
-
45
- # @param harmonized_code [String] the harmonized stage code to find
46
- # @return [TypedStage, nil] the matching typed stage
47
- def locate_typed_stage_by_harmonized_code(harmonized_code)
48
- instance.locate_typed_stage_by_harmonized_code(harmonized_code)
49
- end
50
-
51
- # Keep existing class methods for backward compatibility
52
- # @return [Array<Class>] all base identifier classes
53
- def identifiers
54
- [
55
- Identifiers::InternationalStandard,
56
- Identifiers::TechnicalReport,
57
- Identifiers::TechnicalSpecification,
58
- Identifiers::Guide,
59
- Identifiers::Pas,
60
- Identifiers::Data,
61
- Identifiers::TechnologyTrendsAssessments,
62
- Identifiers::InternationalWorkshopAgreement,
63
- Identifiers::InternationalStandardizedProfile,
64
- Identifiers::Recommendation,
65
- Identifiers::Directives,
66
- Identifiers::Amendment,
67
- Identifiers::Corrigendum,
68
- Identifiers::Supplement,
69
- Identifiers::Extract,
70
- Identifiers::DirectivesSupplement,
71
- Identifiers::Addendum,
72
- Identifiers::TcDocument,
73
- ]
74
- end
75
-
76
- def typed_stages
77
- identifiers.flat_map { |klass| klass::TYPED_STAGES }.compact
78
- end
79
-
80
- def supplement_typed_stages
81
- supplement_identifiers = [
82
- Identifiers::Amendment,
83
- Identifiers::Corrigendum,
84
- Identifiers::Supplement,
85
- Identifiers::Extract,
86
- Identifiers::Addendum,
87
- ]
88
- supplement_identifiers.flat_map { |klass| klass::TYPED_STAGES }
89
- end
90
- end
91
-
92
- # Initialize the scheme with identifiers
93
- def initialize
94
- super(
95
- identifiers: self.class.identifiers,
96
- supplement_identifiers: [
97
- Identifiers::Amendment,
98
- Identifiers::Corrigendum,
99
- Identifiers::Supplement,
100
- Identifiers::Extract,
101
- Identifiers::Addendum,
102
- ],
103
- )
104
- end
105
-
106
- # Parse an ISO identifier string using memoized parser/builder
107
- # @param identifier [String] the identifier string to parse
108
- # @return [Identifier] the parsed identifier
109
- def parse(identifier)
110
- # Handle DAD/FDAD patterns that parser can't recognize
111
- if match = identifier.match(/^(.+?)\/(F?DAD)\s+(\d+)(?::(\d{4}))?$/)
112
- parse_dad_pattern(match)
113
- else
114
- # Apply legacy update_codes normalization first, before any other preprocessing
115
- normalized = Core::UpdateCodes.apply(identifier, :iso)
116
- # Normalize Cyrillic (Russian) identifiers to Latin equivalents
117
- normalized = normalize_cyrillic(normalized)
118
- parsed = parser.parse(normalized)
119
- builder.build(parsed)
120
- end
121
- end
122
-
123
- private
124
-
125
- # Memoized parser instance
126
- # @return [Pubid::Iso::Parser] parser instance
127
- def parser
128
- @parser ||= ::Pubid::Iso::Parser.new
129
- end
130
-
131
- # Memoized builder instance
132
- # @return [Pubid::Iso::Builder] builder instance
133
- def builder
134
- @builder ||= ::Pubid::Iso::Builder.new(self)
135
- end
136
-
137
- # Normalize Cyrillic (Russian) ISO identifiers to Latin equivalents
138
- # ИСО = ISO, МЭК = IEC, Руководство/Руководства = Guide,
139
- # ОПМС = FDIS, ПМС = DIS, ТО = TR, ТС = TS
140
- def normalize_cyrillic(identifier)
141
- return identifier unless identifier.match?(/[а-яА-Я]/)
142
-
143
- normalized = identifier.dup
144
- # Remove inline comments (Russian style comments with #)
145
- normalized = normalized.gsub(/\s*#\s*.*$/, "")
146
- # Translate Russian abbreviations (order matters: longer first)
147
- normalized = normalized.gsub("Руководства", "GUIDE")
148
- normalized = normalized.gsub("Руководство", "GUIDE")
149
- normalized = normalized.gsub("ИСО/МЭК", "ISO/IEC")
150
- normalized = normalized.gsub("ИСО/ОПМС", "ISO/FDIS")
151
- normalized = normalized.gsub("ИСО/ПМС", "ISO/DIS")
152
- normalized = normalized.gsub("ИСО/ТО", "ISO/TR")
153
- normalized = normalized.gsub("ИСО/ТС", "ISO/TS")
154
- normalized = normalized.gsub("ИСО", "ISO")
155
- normalized = normalized.gsub("МЭК", "IEC")
156
- # Standalone Cyrillic stage abbreviations (after publisher replacements)
157
- normalized = normalized.gsub("ТО", "TR")
158
- normalized = normalized.gsub("ТС", "TS")
159
- normalized = normalized.gsub("ОПМС", "FDIS")
160
- normalized = normalized.gsub("ПМС", "DIS")
161
- normalized.strip
162
- end
163
-
164
- # Parse DAD/FDAM pattern manually
165
- # Pattern: "ISO 2631/DAD 1" or "ISO 2553/DAD 1:1987"
166
- # The parser fails because it treats "/" as copublisher separator
167
- def parse_dad_pattern(match)
168
- base_str = match[1] # "ISO 2631" or "ISO 2553"
169
- stage_abbr = match[2] # "DAD" or "FDAD"
170
- supplement_number = match[3] # "1"
171
- supplement_year = match[4] # "1987" or nil
172
-
173
- # Parse the base identifier normally (without supplement)
174
- base_parsed = parser.parse(base_str)
175
- base_identifier = builder.build(base_parsed)
176
-
177
- # Construct the Addendum supplement manually
178
- addendum = Identifiers::Addendum.new
179
- addendum.base_identifier = base_identifier
180
- addendum.number = Iso::Components::Code.new(number: supplement_number)
181
- addendum.date = Pubid::Components::Date.new(year: supplement_year) if supplement_year
182
-
183
- # Set typed_stage from register (uses TYPED_STAGES in Addendum class)
184
- typed_stage = locate_typed_stage_by_abbr(stage_abbr)
185
- addendum.typed_stage = typed_stage
186
- addendum.stage = typed_stage.to_stage
187
- addendum.type = typed_stage.to_type
188
-
189
- addendum
190
- end
191
- end
192
- end
193
- end
@@ -1,174 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "model"
4
-
5
- module Pubid
6
- module Itu
7
- class Scheme < Pubid::Scheme
8
- # Attribute mappings define how parsed data maps to model attributes
9
- ATTRIBUTE_MAPPINGS = {
10
- sector: :sector,
11
- series: :series,
12
- number: :number,
13
- subseries: :subseries,
14
- part: :part,
15
- supplement: :supplement,
16
- amendment: :amendment,
17
- annex: :annex,
18
- corrigendum: :corrigendum,
19
- addendum: :addendum,
20
- appendix: :appendix,
21
- date: :date,
22
- month: :month,
23
- year: :year,
24
- second_number: :second_number,
25
- range_series: :range_series,
26
- range_number: :range_number,
27
- sg_number: :sg_number,
28
- }.freeze
29
-
30
- # Model class to use for rendering
31
- def self.model_class
32
- Model
33
- end
34
-
35
- # Convert parsed data to model attributes
36
- def self.transform(parsed)
37
- attributes = {}
38
-
39
- # Extract sector
40
- attributes[:sector] = parsed[:sector].to_s if parsed[:sector]
41
-
42
- # Determine content based on sector
43
- content = parsed[:t_content] || parsed[:r_content] || {}
44
-
45
- # Extract series and study group
46
- if content[:series].is_a?(Hash) && content[:series][:sg_number]
47
- # Study groups (questions)
48
- attributes[:series] = "SG#{content[:series][:sg_number]}"
49
- elsif content[:series]
50
- attributes[:series] = content[:series].to_s
51
- end
52
-
53
- # Extract numbering components
54
- if content[:numbering]
55
- numbering = content[:numbering]
56
-
57
- # Handle numbering as array (e.g., number + subseries)
58
- if numbering.is_a?(Array)
59
- numbering.each do |part|
60
- if part.is_a?(Hash)
61
- if part[:number]
62
- attributes[:number] = part[:number].to_s
63
- elsif part[:subseries]
64
- # Collect subseries parts
65
- if attributes[:subseries]
66
- attributes[:subseries] =
67
- "#{attributes[:subseries]}.#{part[:subseries]}"
68
- else
69
- attributes[:subseries] = part[:subseries].to_s
70
- end
71
- elsif part[:part]
72
- attributes[:part] = part[:part].to_s
73
- end
74
- end
75
- end
76
- elsif numbering.is_a?(Hash)
77
- # Handle numbering as hash
78
- attributes[:number] = numbering[:number].to_s if numbering[:number]
79
- if numbering[:subseries]
80
- attributes[:subseries] =
81
- numbering[:subseries].to_s
82
- end
83
- attributes[:part] = numbering[:part].to_s if numbering[:part]
84
- end
85
- end
86
-
87
- # Extract supplement/amendment/etc.
88
- if content[:supplement]
89
- attributes[:supplement] =
90
- content[:supplement].to_s
91
- end
92
- attributes[:amendment] = content[:amendment].to_s if content[:amendment]
93
- attributes[:annex] = content[:annex].to_s if content[:annex]
94
- if content[:corrigendum]
95
- attributes[:corrigendum] =
96
- content[:corrigendum].to_s
97
- end
98
- attributes[:addendum] = content[:addendum].to_s if content[:addendum]
99
-
100
- # Handle appendix (convert Roman numerals to Arabic)
101
- if content[:appendix]
102
- appendix = content[:appendix].to_s
103
- attributes[:appendix] = roman_to_arabic(appendix) || appendix
104
- end
105
-
106
- # Extract date
107
- if content[:date]
108
- date = content[:date]
109
- if date[:month] && date[:year]
110
- attributes[:month] = date[:month].to_s
111
- attributes[:year] = date[:year].to_s
112
- elsif date[:year]
113
- attributes[:year] = date[:year].to_s
114
- end
115
- end
116
-
117
- # Extract second number (for combined standards like G.780/Y.1351)
118
- if content[:second_number]
119
- second = content[:second_number]
120
- second_attrs = {}
121
- second_attrs[:series] = second[:series].to_s if second[:series]
122
- if second[:numbering]
123
- numbering = second[:numbering]
124
- if numbering[:number]
125
- second_attrs[:number] =
126
- numbering[:number].to_s
127
- end
128
- if numbering[:subseries]
129
- second_attrs[:subseries] = numbering[:subseries].to_s
130
- end
131
- second_attrs[:part] = numbering[:part].to_s if numbering[:part]
132
- end
133
- attributes[:second_number] = second_attrs unless second_attrs.empty?
134
- end
135
-
136
- # Extract range (for Q.400-Q.490 style)
137
- if content[:range_series] && content[:range_number]
138
- attributes[:range] = {
139
- series: content[:range_series].to_s,
140
- number: content[:range_number].to_s,
141
- }
142
- end
143
-
144
- attributes
145
- end
146
-
147
- # Convert Roman numerals to Arabic numbers
148
- def self.roman_to_arabic(roman)
149
- return roman unless roman.match?(/^[IVXLCDM]+$/i)
150
-
151
- roman_map = {
152
- "I" => 1, "V" => 5, "X" => 10, "L" => 50,
153
- "C" => 100, "D" => 500, "M" => 1000
154
- }
155
-
156
- roman = roman.upcase
157
- result = 0
158
- prev_value = 0
159
-
160
- roman.reverse.each_char do |char|
161
- value = roman_map[char]
162
- if value < prev_value
163
- result -= value
164
- else
165
- result += value
166
- end
167
- prev_value = value
168
- end
169
-
170
- result.to_s
171
- end
172
- end
173
- end
174
- end