pubid 2.0.0 → 2.0.2

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 (214) hide show
  1. checksums.yaml +4 -4
  2. data/data/parg/adobe.json +1 -1
  3. data/data/parg/aiee.json +1 -1
  4. data/data/parg/amca.json +1 -1
  5. data/data/parg/ansi.json +1 -1
  6. data/data/parg/api.json +1 -1
  7. data/data/parg/ashrae.json +1 -1
  8. data/data/parg/asme.json +1 -1
  9. data/data/parg/astm.json +1 -1
  10. data/data/parg/bipm.json +1 -1
  11. data/data/parg/bsi.json +1 -1
  12. data/data/parg/calconnect.json +1 -1
  13. data/data/parg/ccsds.json +1 -1
  14. data/data/parg/cen_cenelec.json +1 -1
  15. data/data/parg/cie.json +1 -1
  16. data/data/parg/csa.json +1 -1
  17. data/data/parg/doi.json +1 -1
  18. data/data/parg/easc.json +1 -1
  19. data/data/parg/ecma.json +1 -1
  20. data/data/parg/etsi.json +1 -1
  21. data/data/parg/evs.json +1 -1
  22. data/data/parg/gb.json +1 -1
  23. data/data/parg/gost.json +1 -1
  24. data/data/parg/iala.json +1 -1
  25. data/data/parg/iana.json +1 -1
  26. data/data/parg/idf.json +1 -1
  27. data/data/parg/iec.json +1 -1
  28. data/data/parg/ieee.json +1 -29571
  29. data/data/parg/ietf.json +1 -1
  30. data/data/parg/iho.json +1 -0
  31. data/data/parg/ire.json +1 -1
  32. data/data/parg/isbn.json +1 -1
  33. data/data/parg/iso.json +1 -8510
  34. data/data/parg/itu.json +1 -1
  35. data/data/parg/jcgm.json +1 -1
  36. data/data/parg/jis.json +1 -1
  37. data/data/parg/nesc.json +1 -1
  38. data/data/parg/nist.json +1 -9588
  39. data/data/parg/oasis.json +1 -1
  40. data/data/parg/ogc.json +1 -1
  41. data/data/parg/oiml.json +1 -1
  42. data/data/parg/omg.json +1 -1
  43. data/data/parg/parg.json +1 -1
  44. data/data/parg/plateau.json +1 -1
  45. data/data/parg/sae.json +1 -1
  46. data/data/parg/tables/typed_stages.yaml +1 -0
  47. data/data/parg/tgpp.json +1 -1
  48. data/data/parg/un.json +1 -1
  49. data/data/parg/w3c.json +1 -1
  50. data/data/parg/xsf.json +1 -1
  51. data/lib/pubid/adobe/identifier.rb +1 -1
  52. data/lib/pubid/adobe/parser.rb +2 -113
  53. data/lib/pubid/amca/identifiers/base.rb +1 -1
  54. data/lib/pubid/amca/parser.rb +1 -145
  55. data/lib/pubid/ansi/identifier.rb +1 -1
  56. data/lib/pubid/ansi/parser.rb +1 -82
  57. data/lib/pubid/api/builder.rb +32 -1
  58. data/lib/pubid/api/identifier.rb +1 -1
  59. data/lib/pubid/api/parser.rb +1 -131
  60. data/lib/pubid/ashrae/identifiers/base.rb +1 -1
  61. data/lib/pubid/ashrae/parser.rb +3 -710
  62. data/lib/pubid/asme/builder.rb +6 -4
  63. data/lib/pubid/asme/identifier.rb +1 -2
  64. data/lib/pubid/asme/parser.rb +1 -328
  65. data/lib/pubid/astm/builder.rb +12 -3
  66. data/lib/pubid/astm/identifier.rb +1 -2
  67. data/lib/pubid/astm/parser.rb +1 -227
  68. data/lib/pubid/bipm/identifier.rb +8 -1
  69. data/lib/pubid/bipm/parser.rb +2 -224
  70. data/lib/pubid/bsi/builder.rb +2 -4
  71. data/lib/pubid/bsi/parser.rb +1 -666
  72. data/lib/pubid/bsi/single_identifier.rb +38 -1
  73. data/lib/pubid/calconnect/identifier.rb +1 -1
  74. data/lib/pubid/calconnect/parser.rb +2 -40
  75. data/lib/pubid/ccsds/identifier.rb +1 -1
  76. data/lib/pubid/ccsds/parser.rb +1 -66
  77. data/lib/pubid/cen_cenelec/identifier.rb +16 -1
  78. data/lib/pubid/cen_cenelec/parser.rb +3 -136
  79. data/lib/pubid/cie/identifier.rb +1 -1
  80. data/lib/pubid/cie/parser.rb +3 -378
  81. data/lib/pubid/conformance.rb +1 -1
  82. data/lib/pubid/csa/builder.rb +41 -18
  83. data/lib/pubid/csa/identifier.rb +12 -4
  84. data/lib/pubid/csa/identifiers/amendment.rb +28 -0
  85. data/lib/pubid/csa/identifiers.rb +1 -0
  86. data/lib/pubid/csa/parser.rb +16 -397
  87. data/lib/pubid/doi/identifier.rb +1 -1
  88. data/lib/pubid/doi/parser.rb +2 -37
  89. data/lib/pubid/easc/builder.rb +1 -1
  90. data/lib/pubid/easc/identifier.rb +1 -1
  91. data/lib/pubid/easc/parser.rb +2 -70
  92. data/lib/pubid/ecma/CLAUDE.md +8 -1
  93. data/lib/pubid/ecma/identifier.rb +13 -8
  94. data/lib/pubid/ecma/parser.rb +2 -54
  95. data/lib/pubid/ecma/renderer.rb +3 -7
  96. data/lib/pubid/errors.rb +18 -13
  97. data/lib/pubid/etsi/builder.rb +8 -5
  98. data/lib/pubid/etsi/identifiers/base.rb +1 -1
  99. data/lib/pubid/etsi/parser.rb +1 -132
  100. data/lib/pubid/evs/identifier.rb +7 -0
  101. data/lib/pubid/evs/parser.rb +1 -8
  102. data/lib/pubid/evs.rb +1 -1
  103. data/lib/pubid/gb/identifier.rb +7 -1
  104. data/lib/pubid/gb/parser.rb +2 -51
  105. data/lib/pubid/gost/identifier.rb +9 -1
  106. data/lib/pubid/gost/parser.rb +4 -81
  107. data/lib/pubid/iala/parser.rb +2 -121
  108. data/lib/pubid/iana/identifier.rb +1 -1
  109. data/lib/pubid/iana/parser.rb +2 -24
  110. data/lib/pubid/identifier.rb +78 -1
  111. data/lib/pubid/idf/builder.rb +42 -0
  112. data/lib/pubid/idf/identifier.rb +1 -1
  113. data/lib/pubid/idf/parser.rb +1 -137
  114. data/lib/pubid/idf.rb +1 -2
  115. data/lib/pubid/iec/builder.rb +158 -50
  116. data/lib/pubid/iec/identifier.rb +1 -1
  117. data/lib/pubid/iec/parser.rb +3 -430
  118. data/lib/pubid/ieee/aiee/identifier.rb +2 -1
  119. data/lib/pubid/ieee/aiee.rb +0 -1
  120. data/lib/pubid/ieee/builder.rb +2 -2
  121. data/lib/pubid/ieee/identifiers/base.rb +1 -1
  122. data/lib/pubid/ieee/ire/identifier.rb +2 -1
  123. data/lib/pubid/ieee/ire.rb +0 -1
  124. data/lib/pubid/ieee/nesc.rb +0 -1
  125. data/lib/pubid/ieee/parser.rb +1 -1257
  126. data/lib/pubid/ietf/identifiers/base.rb +17 -1
  127. data/lib/pubid/ietf/parser.rb +2 -47
  128. data/lib/pubid/ietf/renderer.rb +17 -2
  129. data/lib/pubid/iho/CLAUDE.md +89 -0
  130. data/lib/pubid/iho/builder.rb +4 -1
  131. data/lib/pubid/iho/identifiers/base.rb +28 -2
  132. data/lib/pubid/iho/renderer.rb +8 -0
  133. data/lib/pubid/iho/urn_generator.rb +11 -1
  134. data/lib/pubid/iho/urn_parser.rb +21 -11
  135. data/lib/pubid/iho.rb +0 -1
  136. data/lib/pubid/isbn/identifier.rb +1 -1
  137. data/lib/pubid/isbn/parser.rb +2 -31
  138. data/lib/pubid/iso/builder.rb +1 -1
  139. data/lib/pubid/iso/identifiers/directives.rb +6 -3
  140. data/lib/pubid/iso/identifiers/guide.rb +6 -3
  141. data/lib/pubid/iso/identifiers/international_standard.rb +3 -1
  142. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +6 -3
  143. data/lib/pubid/iso/normalizer.rb +1 -1
  144. data/lib/pubid/iso/parser.rb +1 -539
  145. data/lib/pubid/iso/supplement_identifier.rb +6 -3
  146. data/lib/pubid/iso/utilities.rb +4 -5
  147. data/lib/pubid/iso.rb +1 -19
  148. data/lib/pubid/itu/builder.rb +36 -20
  149. data/lib/pubid/itu/identifiers/base.rb +15 -2
  150. data/lib/pubid/itu/parser.rb +1 -775
  151. data/lib/pubid/jcgm/builder.rb +35 -0
  152. data/lib/pubid/jcgm/parser.rb +1 -151
  153. data/lib/pubid/jcgm.rb +1 -2
  154. data/lib/pubid/jis/builder.rb +18 -29
  155. data/lib/pubid/jis/identifier.rb +1 -1
  156. data/lib/pubid/jis/parser.rb +1 -128
  157. data/lib/pubid/nist/builder.rb +5 -1
  158. data/lib/pubid/nist/caster.rb +13 -3
  159. data/lib/pubid/nist/identifiers/base.rb +37 -2
  160. data/lib/pubid/nist/identifiers/circular.rb +2 -2
  161. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -2
  162. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +2 -2
  163. data/lib/pubid/nist/identifiers/crpl_report.rb +2 -2
  164. data/lib/pubid/nist/identifiers/handbook.rb +2 -2
  165. data/lib/pubid/nist/identifiers/internal_report.rb +2 -2
  166. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +2 -2
  167. data/lib/pubid/nist/identifiers/monograph.rb +2 -2
  168. data/lib/pubid/nist/identifiers/report.rb +2 -2
  169. data/lib/pubid/nist/parser.rb +19 -775
  170. data/lib/pubid/nist/router.rb +4 -1
  171. data/lib/pubid/nist/supplement_identifier.rb +2 -2
  172. data/lib/pubid/oasis/identifier.rb +1 -1
  173. data/lib/pubid/oasis/parser.rb +2 -16
  174. data/lib/pubid/ogc/identifier.rb +1 -1
  175. data/lib/pubid/ogc/parser.rb +2 -26
  176. data/lib/pubid/oiml/identifiers/certification_system.rb +7 -0
  177. data/lib/pubid/oiml/identifiers/dual_published.rb +2 -2
  178. data/lib/pubid/oiml/parser.rb +1 -303
  179. data/lib/pubid/oiml.rb +1 -2
  180. data/lib/pubid/omg/identifier.rb +6 -1
  181. data/lib/pubid/omg/parser.rb +2 -76
  182. data/lib/pubid/parg/artifact.rb +22 -3
  183. data/lib/pubid/parg/model.rb +98 -0
  184. data/lib/pubid/parg.rb +1 -0
  185. data/lib/pubid/parser.rb +5 -4
  186. data/lib/pubid/parsers/mr_string.rb +1 -1
  187. data/lib/pubid/plateau/parser.rb +1 -66
  188. data/lib/pubid/plateau.rb +1 -2
  189. data/lib/pubid/renderers/directives_renderer.rb +1 -1
  190. data/lib/pubid/renderers/iwa_renderer.rb +1 -1
  191. data/lib/pubid/renderers/publisher_stripper.rb +82 -0
  192. data/lib/pubid/renderers/supplement_renderer.rb +1 -1
  193. data/lib/pubid/renderers.rb +1 -0
  194. data/lib/pubid/sae/identifiers/base.rb +1 -1
  195. data/lib/pubid/sae/parser.rb +1 -48
  196. data/lib/pubid/tgpp/identifier.rb +1 -1
  197. data/lib/pubid/tgpp/parser.rb +2 -59
  198. data/lib/pubid/un/identifier.rb +1 -1
  199. data/lib/pubid/un/parser.rb +1 -18
  200. data/lib/pubid/version.rb +1 -1
  201. data/lib/pubid/w3c/identifier.rb +1 -1
  202. data/lib/pubid/w3c/parser.rb +2 -27
  203. data/lib/pubid/xsf/identifier.rb +11 -7
  204. data/lib/pubid/xsf/parser.rb +3 -31
  205. data/lib/pubid/xsf/renderer.rb +2 -4
  206. data/lib/pubid.rb +8 -9
  207. metadata +15 -25
  208. data/lib/pubid/ieee/aiee/parser.rb +0 -130
  209. data/lib/pubid/ieee/ire/parser.rb +0 -109
  210. data/lib/pubid/ieee/nesc/parser.rb +0 -155
  211. data/lib/pubid/iho/parser.rb +0 -68
  212. data/lib/pubid/parser/common_parse_methods.rb +0 -13
  213. data/lib/pubid/parser/common_parse_rules.rb +0 -56
  214. data/lib/pubid/parser/grammar.rb +0 -96
@@ -4,8 +4,8 @@ module Pubid
4
4
  module Xsf
5
5
  # Human-readable renderer for XSF identifiers.
6
6
  #
7
- # Produces strings like "XEP 0001". With `with_publisher: false` it emits
8
- # just the bare number ("0001").
7
+ # Produces strings like "XEP 0001". The `XEP` token is the series and is
8
+ # always rendered.
9
9
  #
10
10
  # Registered as the `:human` format in the XSF format registry and invoked
11
11
  # via `render(format: :human)`.
@@ -14,8 +14,6 @@ module Pubid
14
14
 
15
15
  def render(context: nil, **opts)
16
16
  id = @id
17
- return id.number.to_s if id.with_publisher == false
18
-
19
17
  "#{PUBLISHER} #{id.number}"
20
18
  end
21
19
  end
data/lib/pubid.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "lutaml/model"
4
- require "parslet"
5
4
 
6
5
  # Eagerly load the Lutaml::Model patch (disables reference store to avoid
7
6
  # unbounded memory growth during bulk parsing, and adds a default +to_urn+
@@ -114,7 +113,7 @@ module Pubid
114
113
  #
115
114
  # @param string [String] the identifier string
116
115
  # @return [Pubid::Identifier]
117
- # @raise [Parslet::ParseFailed] when no flavor can parse it
116
+ # @raise [Pubid::Errors::ParseError] when no flavor can parse it
118
117
  def parse(string, **opts)
119
118
  Pubid.parse(string, **opts)
120
119
  end
@@ -238,7 +237,7 @@ module Pubid
238
237
  # @param format [Symbol] :auto, :human, :mr_string, or :urn
239
238
  # @return [Identifier] The parsed identifier
240
239
  # @raise [ArgumentError] for a non-String, or one over {MAX_INPUT_LENGTH}
241
- # @raise [Parslet::ParseFailed] when no flavor can parse the string — the
240
+ # @raise [Pubid::Errors::ParseError] when no flavor can parse the string — the
242
241
  # class every flavor's own +parse+ raises (see the parse-failure contract)
243
242
  def self.parse(string, format: :auto)
244
243
  unless string.is_a?(String)
@@ -259,13 +258,13 @@ module Pubid
259
258
  # standing example. Fall through to prefix routing when the MR parse
260
259
  # fails, rather than reporting an MR error for a string that was never
261
260
  # an MR string. A genuine MR failure still surfaces, from the second
262
- # attempt, as Parslet::ParseFailed.
261
+ # attempt, as Pubid::Errors::ParseError.
263
262
  #
264
263
  # Narrow, for the reason spelled out on {parse_by_prefix}: only a parse
265
264
  # failure means "wrong shape". Anything else is a defect and propagates.
266
265
  begin
267
266
  Parsers::MrString.parse(string)
268
- rescue Parslet::ParseFailed
267
+ rescue Pubid::Errors::ParseError
269
268
  parse_by_prefix(string)
270
269
  end
271
270
  when :urn
@@ -358,7 +357,7 @@ module Pubid
358
357
  #
359
358
  # @param string [String] a human-readable identifier
360
359
  # @return [Identifier]
361
- # @raise [Parslet::ParseFailed] when no flavor accepts the string
360
+ # @raise [Pubid::Errors::ParseError] when no flavor accepts the string
362
361
  # @api private
363
362
  def self.parse_by_prefix(string)
364
363
  eager_load_flavors!
@@ -370,7 +369,7 @@ module Pubid
370
369
  (prefix_owners + other_candidates(prefix_owners)).each do |mod|
371
370
  begin
372
371
  parsed = mod.parse(string)
373
- rescue Parslet::ParseFailed => e
372
+ rescue Pubid::Errors::ParseError => e
374
373
  # ONLY a parse failure means "not this flavor's identifier". Every
375
374
  # other exception is a defect in that flavor and must propagate.
376
375
  #
@@ -411,7 +410,7 @@ module Pubid
411
410
  return fallback if fallback
412
411
  raise first_error if first_error
413
412
 
414
- raise Parslet::ParseFailed,
413
+ raise Pubid::Errors::ParseError,
415
414
  "no registered flavor could parse #{string.inspect}"
416
415
  end
417
416
  private_class_method :parse_by_prefix
@@ -474,7 +473,7 @@ module Pubid
474
473
  begin
475
474
  mod.parse(ROUTING_PROBE)
476
475
  true
477
- rescue StandardError, Parslet::ParseFailed
476
+ rescue StandardError, Pubid::Errors::ParseError
478
477
  false
479
478
  end
480
479
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pubid
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-10-27 00:00:00.000000000 Z
11
+ date: 2026-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lutaml-model
@@ -24,34 +24,26 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.8'
27
- - !ruby/object:Gem::Dependency
28
- name: parslet
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: parsanol
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - ">="
46
32
  - !ruby/object:Gem::Version
47
- version: 1.3.62
33
+ version: 1.3.114
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '1.4'
48
37
  type: :runtime
49
38
  prerelease: false
50
39
  version_requirements: !ruby/object:Gem::Requirement
51
40
  requirements:
52
41
  - - ">="
53
42
  - !ruby/object:Gem::Version
54
- version: 1.3.62
43
+ version: 1.3.114
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.4'
55
47
  description: PubID is a Ruby library for parsing and generating international publication
56
48
  identifiers (PubIDs). It provides a simple and flexible API for working with PubIDs,
57
49
  allowing developers to easily create, manipulate, and validate PubIDs in their applications.
@@ -106,6 +98,7 @@ files:
106
98
  - data/parg/iec.json
107
99
  - data/parg/ieee.json
108
100
  - data/parg/ietf.json
101
+ - data/parg/iho.json
109
102
  - data/parg/ire.json
110
103
  - data/parg/ire.parg
111
104
  - data/parg/isbn.json
@@ -423,6 +416,7 @@ files:
423
416
  - lib/pubid/csa/composite_identifier.rb
424
417
  - lib/pubid/csa/identifier.rb
425
418
  - lib/pubid/csa/identifiers.rb
419
+ - lib/pubid/csa/identifiers/amendment.rb
426
420
  - lib/pubid/csa/identifiers/base.rb
427
421
  - lib/pubid/csa/identifiers/bundled.rb
428
422
  - lib/pubid/csa/identifiers/canadian_adopted.rb
@@ -621,7 +615,6 @@ files:
621
615
  - lib/pubid/ieee/aiee.rb
622
616
  - lib/pubid/ieee/aiee/builder.rb
623
617
  - lib/pubid/ieee/aiee/identifier.rb
624
- - lib/pubid/ieee/aiee/parser.rb
625
618
  - lib/pubid/ieee/builder.rb
626
619
  - lib/pubid/ieee/compaction.rb
627
620
  - lib/pubid/ieee/components/code.rb
@@ -660,11 +653,9 @@ files:
660
653
  - lib/pubid/ieee/ire.rb
661
654
  - lib/pubid/ieee/ire/builder.rb
662
655
  - lib/pubid/ieee/ire/identifier.rb
663
- - lib/pubid/ieee/ire/parser.rb
664
656
  - lib/pubid/ieee/long_renderer.rb
665
657
  - lib/pubid/ieee/nesc.rb
666
658
  - lib/pubid/ieee/nesc/builder.rb
667
- - lib/pubid/ieee/nesc/parser.rb
668
659
  - lib/pubid/ieee/parser.rb
669
660
  - lib/pubid/ieee/pre_parser.rb
670
661
  - lib/pubid/ieee/project_renderer.rb
@@ -690,6 +681,7 @@ files:
690
681
  - lib/pubid/ietf/urn_generator.rb
691
682
  - lib/pubid/ietf/urn_parser.rb
692
683
  - lib/pubid/iho.rb
684
+ - lib/pubid/iho/CLAUDE.md
693
685
  - lib/pubid/iho/builder.rb
694
686
  - lib/pubid/iho/identifier.rb
695
687
  - lib/pubid/iho/identifiers.rb
@@ -699,7 +691,6 @@ files:
699
691
  - lib/pubid/iho/identifiers/miscellaneous.rb
700
692
  - lib/pubid/iho/identifiers/publication.rb
701
693
  - lib/pubid/iho/identifiers/standard.rb
702
- - lib/pubid/iho/parser.rb
703
694
  - lib/pubid/iho/renderer.rb
704
695
  - lib/pubid/iho/urn_generator.rb
705
696
  - lib/pubid/iho/urn_parser.rb
@@ -933,10 +924,8 @@ files:
933
924
  - lib/pubid/parg.rb
934
925
  - lib/pubid/parg/artifact.rb
935
926
  - lib/pubid/parg/backend.rb
927
+ - lib/pubid/parg/model.rb
936
928
  - lib/pubid/parser.rb
937
- - lib/pubid/parser/common_parse_methods.rb
938
- - lib/pubid/parser/common_parse_rules.rb
939
- - lib/pubid/parser/grammar.rb
940
929
  - lib/pubid/parsers/base.rb
941
930
  - lib/pubid/parsers/mr_string.rb
942
931
  - lib/pubid/parsers/urn.rb
@@ -963,6 +952,7 @@ files:
963
952
  - lib/pubid/renderers/human_readable.rb
964
953
  - lib/pubid/renderers/iwa_renderer.rb
965
954
  - lib/pubid/renderers/mr_string.rb
955
+ - lib/pubid/renderers/publisher_stripper.rb
966
956
  - lib/pubid/renderers/supplement_renderer.rb
967
957
  - lib/pubid/renderers/urn.rb
968
958
  - lib/pubid/rendering.rb
@@ -1,130 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "parslet"
4
-
5
- module Pubid
6
- module Ieee
7
- module Aiee
8
- # Parser for AIEE (American Institute of Electrical Engineers) identifiers
9
- # Historical period: 1884-1963 (merged into IEEE in 1963)
10
- class Parser < ::Pubid::Parser::Grammar
11
- # Basic building blocks
12
- rule(:space) { str(" ") }
13
- rule(:space?) { space.maybe }
14
- rule(:dash) { str("-") }
15
- rule(:dot) { str(".") }
16
- rule(:digit) { match("[0-9]") }
17
- rule(:digits) { digit.repeat(1) }
18
- rule(:letter) { match("[A-Za-z]") }
19
- rule(:upper) { match("[A-Z]") }
20
-
21
- # Year pattern (for AIEE period: 1884-1963)
22
- rule(:year) do
23
- (str("18") >> digit.repeat(2, 2)) | # 1884-1899
24
- (str("19") >> (str("0") | str("1") | str("2") | str("3") | str("4") | str("5")) >> digit) | # 1900-1959
25
- (str("196") >> match("[0-3]")) # 1960-1963
26
- end
27
-
28
- # Month patterns
29
- rule(:month_name) do
30
- str("January") | str("February") | str("March") | str("April") |
31
- str("May") | str("June") | str("July") | str("August") |
32
- str("September") | str("October") | str("November") | str("December") |
33
- str("Jan") | str("Feb") | str("Mar") | str("Apr") | str("Jun") |
34
- str("Jul") | str("Aug") | str("Sep") | str("Sept") | str("Oct") | str("Nov") | str("Dec")
35
- end
36
-
37
- # AIEE prefix variations
38
- rule(:aiee_prefix) do
39
- (
40
- str("IEEE-AIEE") | # Transitional period (1963-1965)
41
- str("A.I.E.E.") | # With dots variant (no spaces)
42
- str("A. I. E. E.") | # With dots and spaces variant
43
- str("AIEE")
44
- ).as(:publisher)
45
- end
46
-
47
- # Document types
48
- rule(:aiee_type) do
49
- (
50
- str("Standard No.") | # AIEE Standard No. 19-1938 (compound type)
51
- str("Standard No") | # AIEE Standard No 19-1938 (compound type, no dot)
52
- str("Std No.") | # AIEE Std No. 800
53
- str("Std No") | # AIEE Std No 800 (no dot)
54
- str("Std") | # AIEE Std 800
55
- str("Nos") | # NEW Session 171: Plural variant (e.g., "Nos 72 and 73")
56
- str("No.") | # AIEE No. 56
57
- str("No") | # AIEE No 18 (can be followed by space)
58
- str("no") | # AIEE no 700 (lowercase variant)
59
- str("Standard") | # AIEE Standard 56
60
- str("Trans.") # AIEE Trans. PAS-84
61
- ).as(:type)
62
- end
63
-
64
- # Number formats
65
- rule(:number) do
66
- (
67
- # Transaction format: PAS-84, PGI-7
68
- (upper.repeat(2, 3) >> dash >> digits) |
69
-
70
- # Complex with letter suffix: 27A, 22A, 1E - allow space before dash
71
- # But don't match if it's actually "Nos 72 and 73" pattern
72
- (digits >> upper >> (space >> str("and")).absent?) |
73
-
74
- # Decimal number: 750.1, 750.11, 750.5
75
- (digits >> dot >> digits) |
76
-
77
- # Number with parenthetical variant: 431 (105)
78
- # Pattern: main number followed by alternate number in parentheses
79
- (digits.as(:main_number) >> space >> (str("(") >> digits.as(:alt_number) >> str(")")).as(:parenthetical)) |
80
-
81
- # Simple number: 56, 123, 18, 552
82
- (digits >>
83
-
84
- # Handle "Nos X and Y" pattern - we only capture first number
85
- (space >> str("and") >> space >> digits).absent?)
86
- ).as(:number)
87
- end
88
-
89
- # Date formats
90
- # Long form: ", 1956" or ", November 1955" or ". December 1958" or " -1957" (with space)
91
- # NEW: Also support "May-1928" (month dash year, no comma)
92
- rule(:date_long) do
93
- space? >>
94
- (
95
- # Format 1: ", Month Year" or ". Month Year"
96
- ((str(",") | dot).as(:separator) >> space? >>
97
- (month_name.as(:month) >> space).maybe >> year.as(:year)) |
98
- # Format 2: " -Year" (space dash year)
99
- ((space >> dash).as(:separator) >> space? >> year.as(:year)) |
100
- # Format 3: "Month-Year" (NEW - month dash year, no comma/dot/space prefix)
101
- (month_name.as(:month) >> dash >> year.as(:year))
102
- )
103
- end
104
-
105
- # Short form: "-1962" (directly after number) or " -1958" (with space)
106
- # ENHANCED: Allow leading space for patterns like "431 (105) -1958"
107
- rule(:date_short) do
108
- space.maybe >> dash >> year.as(:year)
109
- end
110
-
111
- # Combined date rule
112
- # Try short form first to avoid matching empty prefix in date_long
113
- rule(:date) do
114
- (date_short | date_long).maybe
115
- end
116
-
117
- # Complete AIEE identifier
118
- rule(:aiee_identifier) do
119
- aiee_prefix >>
120
- space >>
121
- (aiee_type >> space).maybe >>
122
- number >>
123
- date
124
- end
125
-
126
- root(:aiee_identifier)
127
- end
128
- end
129
- end
130
- end
@@ -1,109 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "parslet"
4
-
5
- module Pubid
6
- module Ieee
7
- module Ire
8
- # Parser for IRE (Institute of Radio Engineers) identifiers
9
- # Historical period: 1912-1963 (merged into IEEE in 1963)
10
- class Parser < ::Pubid::Parser::Grammar
11
- # Basic building blocks
12
- rule(:space) { str(" ") }
13
- rule(:space?) { space.maybe }
14
- rule(:dash) { str("-") }
15
- rule(:dot) { str(".") }
16
- rule(:digit) { match("[0-9]") }
17
- rule(:digits) { digit.repeat(1) }
18
- rule(:letter) { match("[A-Za-z]") }
19
- rule(:upper) { match("[A-Z]") }
20
-
21
- # Year pattern - handle both 2-digit (52 = 1952) and 4-digit (1952) formats
22
- rule(:year_short) do
23
- # 2-digit year: 12-63 (1912-1963 IRE period)
24
- match("[1-6]") >> digit
25
- end
26
-
27
- rule(:year_full) do
28
- # 4-digit year for IRE period: 1912-1963
29
- (str("191") >> digit.repeat(1, 1)) | # 1912-1919
30
- (str("19") >> (str("2") | str("3") | str("4") | str("5")) >> digit) | # 1920-1959
31
- (str("196") >> match("[0-3]")) # 1960-1963
32
- end
33
-
34
- rule(:year) { year_full | year_short }
35
-
36
- # IRE prefix variations
37
- rule(:ire_prefix) do
38
- (
39
- str("IEEE-IRE") | # Transitional period (1963-1965)
40
- str("IRE")
41
- ).as(:publisher)
42
- end
43
-
44
- # Document types
45
- rule(:ire_type) do
46
- (
47
- str("Trans.") | # IRE Trans. PGI-7
48
- str("Standard") | # IRE Standard
49
- str("Std") # IRE Std
50
- ).as(:type)
51
- end
52
-
53
- # Number formats
54
- rule(:number) do
55
- (
56
- # Complex format with spaces: 28 S1, 15.S1, 7.S2
57
- (digits >> (space | dot) >> upper >> digits) |
58
-
59
- # Complex format: 1.IRE62.1S1
60
- (digits >> dot >> str("IRE") >> digits >> dot >> digits >> upper >> digits) |
61
-
62
- # Transaction format: PGI-7, PGAP-4
63
- (upper.repeat(2, 4) >> dash >> digits) |
64
-
65
- # Simple number: 56, 123
66
- digits
67
- ).as(:number)
68
- end
69
-
70
- # Date (year only for IRE)
71
- rule(:date) do
72
- (space? >> (dash | str(",")).maybe >> space? >> year.as(:year)).maybe
73
- end
74
-
75
- # Complete IRE identifier - YEAR FIRST format
76
- rule(:ire_identifier_year_first) do
77
- # Format: "52 IRE 7.S2" or "1952 IRE 7.S2"
78
- year.as(:year) >>
79
- space >>
80
- ire_prefix >>
81
- space >>
82
- (ire_type >> space).maybe >>
83
- number >>
84
- (space? >> (dash | str(",")).maybe >> space? >> year_full.as(:full_year)).maybe
85
- end
86
-
87
- # Prefix-first format: "IRE 7.S2-1952" (pubid#316 family 2) — the
88
- # year trails the designation instead of leading the identifier.
89
- # The renderer always emits the year-first short-year form, so this
90
- # spelling canonicalizes onto it ("IRE 7.S2-1952" → "52 IRE 7.S2").
91
- rule(:ire_identifier_prefix_first) do
92
- ire_prefix >>
93
- space >>
94
- (ire_type >> space).maybe >>
95
- number >>
96
- date
97
- end
98
-
99
- # Year-first is tried first so the original spellings keep their
100
- # match; prefix-first claims only what year-first cannot.
101
- rule(:ire_identifier) do
102
- ire_identifier_year_first | ire_identifier_prefix_first
103
- end
104
-
105
- root(:ire_identifier)
106
- end
107
- end
108
- end
109
- end
@@ -1,155 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "parslet"
4
-
5
- module Pubid
6
- module Ieee
7
- module Nesc
8
- # Parser for National Electrical Safety Code (NESC) identifiers
9
- #
10
- # Handles multiple NESC identifier formats including:
11
- # - Standard C2-YYYY format
12
- # - Year-first YYYY NESC format
13
- # - Draft format
14
- # - Handbook and Redline variations
15
- #
16
- # @example Parse C2 standard
17
- # parser = Parser.new
18
- # result = parser.parse("C2-1997 National Electric Safety Code")
19
- #
20
- # @example Parse handbook
21
- # parser = Parser.new
22
- # result = parser.parse("2017 NESC Handbook, Premier Edition")
23
- class Parser < ::Pubid::Parser::Grammar
24
- root(:nesc_identifier)
25
-
26
- rule(:space) { str(" ") }
27
- rule(:comma) { str(",") }
28
- rule(:digit) { match("[0-9]") }
29
- rule(:year) { digit.repeat(4, 4) }
30
- rule(:dash) { str("-") }
31
-
32
- # C2 code designation
33
- rule(:c2_code) do
34
- str("C2").as(:code)
35
- end
36
-
37
- # NESC name variations (the "(R)" registered mark is captured
38
- # separately by the `registered` rule so it can be round-tripped)
39
- rule(:nesc_full_name) do
40
- str("National Electrical Safety Code") |
41
- str("National Electric Safety Code") # Typo variation
42
- end
43
-
44
- rule(:nesc_abbr) do
45
- str("NESC")
46
- end
47
-
48
- rule(:nesc_name) do
49
- nesc_full_name | nesc_abbr
50
- end
51
-
52
- # Registered trademark notation
53
- rule(:registered) do
54
- str("(R)")
55
- end
56
-
57
- # Edition notations
58
- rule(:edition) do
59
- (
60
- str("Premier Edition") |
61
- str("First Edition") |
62
- str("Second Edition") |
63
- str("Third Edition") |
64
- str("Fourth Edition") |
65
- str("Fifth Edition") |
66
- str("Sixth Edition") |
67
- str("Seventh Edition") |
68
- str("Eighth Edition") |
69
- str("Ninth Edition") |
70
- str("Tenth Edition")
71
- ).as(:edition)
72
- end
73
-
74
- # Variant types (Handbook, Redline)
75
- rule(:variant) do
76
- (
77
- str("Handbook") |
78
- str("Redline")
79
- ).as(:variant)
80
- end
81
-
82
- # Month names for drafts
83
- rule(:month) do
84
- (
85
- str("January") | str("February") | str("March") |
86
- str("April") | str("May") | str("June") |
87
- str("July") | str("August") | str("September") |
88
- str("October") | str("November") | str("December")
89
- ).as(:month)
90
- end
91
-
92
- # Pattern 1: C2-YYYY Standard format
93
- # Examples: "C2-1997 National Electric Safety Code (NESC)"
94
- # "C2-2012 National Electrical Safety Code"
95
- rule(:c2_standard) do
96
- c2_code >>
97
- dash >>
98
- year.as(:year) >>
99
- (comma.maybe >> space).maybe >>
100
- nesc_full_name >> registered.maybe >>
101
- (space >> str("(") >> nesc_abbr >> registered.maybe >> str(")")).maybe
102
- end
103
-
104
- # Pattern 2: YYYY NESC format (year-first)
105
- # Examples: "2017 NESC(R) Handbook, Premier Edition"
106
- # "2017 National Electrical Safety Code(R) (NESC(R))"
107
- # "2012 NESC Handbook"
108
- rule(:year_first) do
109
- year.as(:year) >>
110
- space >>
111
- (
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)
118
- ) >>
119
- (space >> variant).maybe >>
120
- (comma >> space >> edition).maybe
121
- end
122
-
123
- # Pattern 3: Name-first format
124
- # Examples: "National Electrical Safety Code, C2-2012"
125
- # "National Electrical Safety Code, C2-2012 - Redline"
126
- rule(:name_first) do
127
- nesc_full_name >> registered.maybe >>
128
- comma >>
129
- space >>
130
- c2_code >>
131
- dash >>
132
- year.as(:year) >>
133
- (space >> str("-") >> space >> variant.as(:variant)).maybe
134
- end
135
-
136
- # Pattern 4: Draft format
137
- # Examples: "Draft National Electrical Safety Code, January 2016"
138
- # "Draft NESC, June 2011"
139
- rule(:draft_nesc) do
140
- str("Draft").as(:draft) >>
141
- space >>
142
- nesc_name >> registered.maybe >>
143
- comma >> space >>
144
- month >> space >> year.as(:year)
145
- end
146
-
147
- # Main identifier rule - try patterns in order
148
- # Put most specific patterns first
149
- rule(:nesc_identifier) do
150
- draft_nesc | name_first | c2_standard | year_first
151
- end
152
- end
153
- end
154
- end
155
- end
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "parslet"
4
-
5
- module Pubid
6
- module Iho
7
- # Parser class for IHO identifiers
8
- class Parser < ::Pubid::Parser::Grammar
9
- rule(:space) { str(" ") }
10
- rule(:dash) { str("-") }
11
- rule(:dot) { str(".") }
12
- rule(:digits) { match("[0-9]").repeat(1) }
13
-
14
- rule(:series) do
15
- (str("S") | str("P") | str("M") | str("B") | str("C")).as(:type)
16
- end
17
-
18
- rule(:number_suffix) do
19
- (str(":") >> digits) | (str("/") >> digits) | (dash >> digits) | match("[A-Z]")
20
- end
21
-
22
- rule(:number) do
23
- (digits >> number_suffix.maybe).as(:number)
24
- end
25
-
26
- rule(:appendix) do
27
- space >> (str("Appendix") | str("Ap.")) >> space >>
28
- (
29
- (match("[A-Z]") >> dash >> digits) |
30
- digits |
31
- match("[A-Z]")
32
- ).as(:appendix)
33
- end
34
-
35
- rule(:part) do
36
- space >> str("Part") >> space >>
37
- (
38
- (digits >> match("[a-zA-Z]").repeat).as(:part) |
39
- match("[A-Z]").as(:part)
40
- )
41
- end
42
-
43
- rule(:annex) do
44
- space >> str("Annex") >> space >> match("[A-Z]").as(:annex)
45
- end
46
-
47
- rule(:supplement) do
48
- space >> str("Suppl") >> space >> digits.as(:supplement)
49
- end
50
-
51
- rule(:version) do
52
- space >> (digits >> dot >> digits >> dot >> digits).as(:version)
53
- end
54
-
55
- rule(:identifier) do
56
- (str("IHO") >> space).maybe >>
57
- series >> dash >> number >>
58
- appendix.maybe >> part.maybe >> annex.maybe >> supplement.maybe >> version.maybe
59
- end
60
-
61
- root :identifier
62
-
63
- def self.parse(string)
64
- new.parse(string.strip)
65
- end
66
- end
67
- end
68
- end