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.
- checksums.yaml +4 -4
- data/data/parg/adobe.json +1 -1
- data/data/parg/aiee.json +1 -1
- data/data/parg/amca.json +1 -1
- data/data/parg/ansi.json +1 -1
- data/data/parg/api.json +1 -1
- data/data/parg/ashrae.json +1 -1
- data/data/parg/asme.json +1 -1
- data/data/parg/astm.json +1 -1
- data/data/parg/bipm.json +1 -1
- data/data/parg/bsi.json +1 -1
- data/data/parg/calconnect.json +1 -1
- data/data/parg/ccsds.json +1 -1
- data/data/parg/cen_cenelec.json +1 -1
- data/data/parg/cie.json +1 -1
- data/data/parg/csa.json +1 -1
- data/data/parg/doi.json +1 -1
- data/data/parg/easc.json +1 -1
- data/data/parg/ecma.json +1 -1
- data/data/parg/etsi.json +1 -1
- data/data/parg/evs.json +1 -1
- data/data/parg/gb.json +1 -1
- data/data/parg/gost.json +1 -1
- data/data/parg/iala.json +1 -1
- data/data/parg/iana.json +1 -1
- data/data/parg/idf.json +1 -1
- data/data/parg/iec.json +1 -1
- data/data/parg/ieee.json +1 -29571
- data/data/parg/ietf.json +1 -1
- data/data/parg/iho.json +1 -0
- data/data/parg/ire.json +1 -1
- data/data/parg/isbn.json +1 -1
- data/data/parg/iso.json +1 -8510
- data/data/parg/itu.json +1 -1
- data/data/parg/jcgm.json +1 -1
- data/data/parg/jis.json +1 -1
- data/data/parg/nesc.json +1 -1
- data/data/parg/nist.json +1 -9588
- data/data/parg/oasis.json +1 -1
- data/data/parg/ogc.json +1 -1
- data/data/parg/oiml.json +1 -1
- data/data/parg/omg.json +1 -1
- data/data/parg/parg.json +1 -1
- data/data/parg/plateau.json +1 -1
- data/data/parg/sae.json +1 -1
- data/data/parg/tables/typed_stages.yaml +1 -0
- data/data/parg/tgpp.json +1 -1
- data/data/parg/un.json +1 -1
- data/data/parg/w3c.json +1 -1
- data/data/parg/xsf.json +1 -1
- data/lib/pubid/adobe/identifier.rb +1 -1
- data/lib/pubid/adobe/parser.rb +2 -113
- data/lib/pubid/amca/identifiers/base.rb +1 -1
- data/lib/pubid/amca/parser.rb +1 -145
- data/lib/pubid/ansi/identifier.rb +1 -1
- data/lib/pubid/ansi/parser.rb +1 -82
- data/lib/pubid/api/builder.rb +32 -1
- data/lib/pubid/api/identifier.rb +1 -1
- data/lib/pubid/api/parser.rb +1 -131
- data/lib/pubid/ashrae/identifiers/base.rb +1 -1
- data/lib/pubid/ashrae/parser.rb +3 -710
- data/lib/pubid/asme/builder.rb +6 -4
- data/lib/pubid/asme/identifier.rb +1 -2
- data/lib/pubid/asme/parser.rb +1 -328
- data/lib/pubid/astm/builder.rb +12 -3
- data/lib/pubid/astm/identifier.rb +1 -2
- data/lib/pubid/astm/parser.rb +1 -227
- data/lib/pubid/bipm/identifier.rb +8 -1
- data/lib/pubid/bipm/parser.rb +2 -224
- data/lib/pubid/bsi/builder.rb +2 -4
- data/lib/pubid/bsi/parser.rb +1 -666
- data/lib/pubid/bsi/single_identifier.rb +38 -1
- data/lib/pubid/calconnect/identifier.rb +1 -1
- data/lib/pubid/calconnect/parser.rb +2 -40
- data/lib/pubid/ccsds/identifier.rb +1 -1
- data/lib/pubid/ccsds/parser.rb +1 -66
- data/lib/pubid/cen_cenelec/identifier.rb +16 -1
- data/lib/pubid/cen_cenelec/parser.rb +3 -136
- data/lib/pubid/cie/identifier.rb +1 -1
- data/lib/pubid/cie/parser.rb +3 -378
- data/lib/pubid/conformance.rb +1 -1
- data/lib/pubid/csa/builder.rb +41 -18
- data/lib/pubid/csa/identifier.rb +12 -4
- data/lib/pubid/csa/identifiers/amendment.rb +28 -0
- data/lib/pubid/csa/identifiers.rb +1 -0
- data/lib/pubid/csa/parser.rb +16 -397
- data/lib/pubid/doi/identifier.rb +1 -1
- data/lib/pubid/doi/parser.rb +2 -37
- data/lib/pubid/easc/builder.rb +1 -1
- data/lib/pubid/easc/identifier.rb +1 -1
- data/lib/pubid/easc/parser.rb +2 -70
- data/lib/pubid/ecma/CLAUDE.md +8 -1
- data/lib/pubid/ecma/identifier.rb +13 -8
- data/lib/pubid/ecma/parser.rb +2 -54
- data/lib/pubid/ecma/renderer.rb +3 -7
- data/lib/pubid/errors.rb +18 -13
- data/lib/pubid/etsi/builder.rb +8 -5
- data/lib/pubid/etsi/identifiers/base.rb +1 -1
- data/lib/pubid/etsi/parser.rb +1 -132
- data/lib/pubid/evs/identifier.rb +7 -0
- data/lib/pubid/evs/parser.rb +1 -8
- data/lib/pubid/evs.rb +1 -1
- data/lib/pubid/gb/identifier.rb +7 -1
- data/lib/pubid/gb/parser.rb +2 -51
- data/lib/pubid/gost/identifier.rb +9 -1
- data/lib/pubid/gost/parser.rb +4 -81
- data/lib/pubid/iala/parser.rb +2 -121
- data/lib/pubid/iana/identifier.rb +1 -1
- data/lib/pubid/iana/parser.rb +2 -24
- data/lib/pubid/identifier.rb +78 -1
- data/lib/pubid/idf/builder.rb +42 -0
- data/lib/pubid/idf/identifier.rb +1 -1
- data/lib/pubid/idf/parser.rb +1 -137
- data/lib/pubid/idf.rb +1 -2
- data/lib/pubid/iec/builder.rb +158 -50
- data/lib/pubid/iec/identifier.rb +1 -1
- data/lib/pubid/iec/parser.rb +3 -430
- data/lib/pubid/ieee/aiee/identifier.rb +2 -1
- data/lib/pubid/ieee/aiee.rb +0 -1
- data/lib/pubid/ieee/builder.rb +2 -2
- data/lib/pubid/ieee/identifiers/base.rb +1 -1
- data/lib/pubid/ieee/ire/identifier.rb +2 -1
- data/lib/pubid/ieee/ire.rb +0 -1
- data/lib/pubid/ieee/nesc.rb +0 -1
- data/lib/pubid/ieee/parser.rb +1 -1257
- data/lib/pubid/ietf/identifiers/base.rb +17 -1
- data/lib/pubid/ietf/parser.rb +2 -47
- data/lib/pubid/ietf/renderer.rb +17 -2
- data/lib/pubid/iho/CLAUDE.md +89 -0
- data/lib/pubid/iho/builder.rb +4 -1
- data/lib/pubid/iho/identifiers/base.rb +28 -2
- data/lib/pubid/iho/renderer.rb +8 -0
- data/lib/pubid/iho/urn_generator.rb +11 -1
- data/lib/pubid/iho/urn_parser.rb +21 -11
- data/lib/pubid/iho.rb +0 -1
- data/lib/pubid/isbn/identifier.rb +1 -1
- data/lib/pubid/isbn/parser.rb +2 -31
- data/lib/pubid/iso/builder.rb +1 -1
- data/lib/pubid/iso/identifiers/directives.rb +6 -3
- data/lib/pubid/iso/identifiers/guide.rb +6 -3
- data/lib/pubid/iso/identifiers/international_standard.rb +3 -1
- data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +6 -3
- data/lib/pubid/iso/normalizer.rb +1 -1
- data/lib/pubid/iso/parser.rb +1 -539
- data/lib/pubid/iso/supplement_identifier.rb +6 -3
- data/lib/pubid/iso/utilities.rb +4 -5
- data/lib/pubid/iso.rb +1 -19
- data/lib/pubid/itu/builder.rb +36 -20
- data/lib/pubid/itu/identifiers/base.rb +15 -2
- data/lib/pubid/itu/parser.rb +1 -775
- data/lib/pubid/jcgm/builder.rb +35 -0
- data/lib/pubid/jcgm/parser.rb +1 -151
- data/lib/pubid/jcgm.rb +1 -2
- data/lib/pubid/jis/builder.rb +18 -29
- data/lib/pubid/jis/identifier.rb +1 -1
- data/lib/pubid/jis/parser.rb +1 -128
- data/lib/pubid/nist/builder.rb +5 -1
- data/lib/pubid/nist/caster.rb +13 -3
- data/lib/pubid/nist/identifiers/base.rb +37 -2
- data/lib/pubid/nist/identifiers/circular.rb +2 -2
- data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -2
- data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +2 -2
- data/lib/pubid/nist/identifiers/crpl_report.rb +2 -2
- data/lib/pubid/nist/identifiers/handbook.rb +2 -2
- data/lib/pubid/nist/identifiers/internal_report.rb +2 -2
- data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +2 -2
- data/lib/pubid/nist/identifiers/monograph.rb +2 -2
- data/lib/pubid/nist/identifiers/report.rb +2 -2
- data/lib/pubid/nist/parser.rb +19 -775
- data/lib/pubid/nist/router.rb +4 -1
- data/lib/pubid/nist/supplement_identifier.rb +2 -2
- data/lib/pubid/oasis/identifier.rb +1 -1
- data/lib/pubid/oasis/parser.rb +2 -16
- data/lib/pubid/ogc/identifier.rb +1 -1
- data/lib/pubid/ogc/parser.rb +2 -26
- data/lib/pubid/oiml/identifiers/certification_system.rb +7 -0
- data/lib/pubid/oiml/identifiers/dual_published.rb +2 -2
- data/lib/pubid/oiml/parser.rb +1 -303
- data/lib/pubid/oiml.rb +1 -2
- data/lib/pubid/omg/identifier.rb +6 -1
- data/lib/pubid/omg/parser.rb +2 -76
- data/lib/pubid/parg/artifact.rb +22 -3
- data/lib/pubid/parg/model.rb +98 -0
- data/lib/pubid/parg.rb +1 -0
- data/lib/pubid/parser.rb +5 -4
- data/lib/pubid/parsers/mr_string.rb +1 -1
- data/lib/pubid/plateau/parser.rb +1 -66
- data/lib/pubid/plateau.rb +1 -2
- data/lib/pubid/renderers/directives_renderer.rb +1 -1
- data/lib/pubid/renderers/iwa_renderer.rb +1 -1
- data/lib/pubid/renderers/publisher_stripper.rb +82 -0
- data/lib/pubid/renderers/supplement_renderer.rb +1 -1
- data/lib/pubid/renderers.rb +1 -0
- data/lib/pubid/sae/identifiers/base.rb +1 -1
- data/lib/pubid/sae/parser.rb +1 -48
- data/lib/pubid/tgpp/identifier.rb +1 -1
- data/lib/pubid/tgpp/parser.rb +2 -59
- data/lib/pubid/un/identifier.rb +1 -1
- data/lib/pubid/un/parser.rb +1 -18
- data/lib/pubid/version.rb +1 -1
- data/lib/pubid/w3c/identifier.rb +1 -1
- data/lib/pubid/w3c/parser.rb +2 -27
- data/lib/pubid/xsf/identifier.rb +11 -7
- data/lib/pubid/xsf/parser.rb +3 -31
- data/lib/pubid/xsf/renderer.rb +2 -4
- data/lib/pubid.rb +8 -9
- metadata +15 -25
- data/lib/pubid/ieee/aiee/parser.rb +0 -130
- data/lib/pubid/ieee/ire/parser.rb +0 -109
- data/lib/pubid/ieee/nesc/parser.rb +0 -155
- data/lib/pubid/iho/parser.rb +0 -68
- data/lib/pubid/parser/common_parse_methods.rb +0 -13
- data/lib/pubid/parser/common_parse_rules.rb +0 -56
- data/lib/pubid/parser/grammar.rb +0 -96
data/lib/pubid/xsf/renderer.rb
CHANGED
|
@@ -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".
|
|
8
|
-
#
|
|
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 [
|
|
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 [
|
|
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
|
|
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
|
|
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 [
|
|
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
|
|
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
|
|
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,
|
|
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.
|
|
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-
|
|
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.
|
|
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.
|
|
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
|
data/lib/pubid/iho/parser.rb
DELETED
|
@@ -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
|