pubid-iso 0.1.3 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fcb163cba8c2314ef110798ae4467438dcfc2780dfd644d1e2e1535a8fdd468f
4
- data.tar.gz: 10a6573c96b6869f77702e4995cf84fa7a849df9f6a753940a02b145b33b559a
3
+ metadata.gz: d3db426781c12fb80bbd99118bc9b601fe93473d0c9b395f88929ac8eb3b996d
4
+ data.tar.gz: 7e2c155d3397e1ac4888258c680357b204edb8252a3e03fa8d336292be85ccbb
5
5
  SHA512:
6
- metadata.gz: 3b32a417438e220ed40228fa38d1f328fd5c5856f1dabde99e46ad76b2906669fd6722dd84aec1442b99ea70426d02116b93e60f2c5844f77d216d964aafc0e8
7
- data.tar.gz: de3cad631bda3706b4870f3021629dc7e39e60da06ec65c4c94844e226c7007d9a8de08d6e62dbcd044166c580ab25cb840d0759e84aee23ebdc872698c2a5d8
6
+ metadata.gz: 765bdaef471049f21f15ba5cf9f45bbb42edfe88baf53ee5f67d155fdba6f0b8ef8a1b8cf212a9f6d3d35ce289946c6c5281efd94e913d59274b9ea1a7143e8c
7
+ data.tar.gz: 628307f60259f11b97476d893861b73f1042104c940958ee695acc24069033e4689b0bfe490a641a6c7d557a5f8635ec6cf2140bed56d594910c8e2c46670d6f
@@ -3,7 +3,7 @@ module Pubid::Iso
3
3
  def identifier(with_date, with_language_code)
4
4
  if @type == "Guide"
5
5
  "Guide #{originator}#{stage} #{number}#{part}#{iteration}"\
6
- "#{with_date && year || ''}#{edition}#{supplements}#{language(with_language_code)}"
6
+ "#{with_date && rendered_year || ''}#{edition}#{supplements}#{language(with_language_code)}"
7
7
  else
8
8
  super
9
9
  end
@@ -20,7 +20,7 @@ module Pubid::Iso
20
20
  def identifier(with_date, with_language_code)
21
21
  if @type == "Guide"
22
22
  "Руководство #{originator}#{stage} #{number}#{part}#{iteration}"\
23
- "#{with_date && year || ''}#{edition}#{supplements}#{language(with_language_code)}"
23
+ "#{with_date && rendered_year || ''}#{edition}#{supplements}#{language(with_language_code)}"
24
24
  else
25
25
  super
26
26
  end
@@ -4,7 +4,9 @@ module Pubid::Iso
4
4
  :type, :year, :edition, :iteration, :supplements, :language,
5
5
  :amendment, :amendment_version, :amendment_number,
6
6
  :corrigendum, :corrigendum_version, :corrigendum_number,
7
- :amendment_stage, :corrigendum_stage, :joint_document
7
+ :amendment_stage, :corrigendum_stage, :joint_document,
8
+ :tctype, :sctype, :wgtype, :tcnumber, :scnumber, :wgnumber,
9
+ :urn_stage
8
10
 
9
11
  LANGUAGES = {
10
12
  "ru" => "R",
@@ -25,6 +27,15 @@ module Pubid::Iso
25
27
  Urn.new(**get_params)
26
28
  end
27
29
 
30
+ def self.parse_from_title(title)
31
+ title.split.reverse.inject(title) do |acc, part|
32
+ return parse(acc)
33
+ rescue Pubid::Iso::Errors::ParseError
34
+ # delete parts from the title until it's parseable
35
+ acc.reverse.sub(part.reverse, "").reverse.strip
36
+ end
37
+ end
38
+
28
39
  def self.parse(code_or_params)
29
40
  params = code_or_params.is_a?(String) ? Parser.new.parse(code_or_params) : code_or_params
30
41
  # Parslet returns an array when match any copublisher
@@ -67,8 +78,40 @@ module Pubid::Iso
67
78
  end
68
79
 
69
80
  def identifier(with_date, with_language_code)
70
- "#{originator}#{type}#{stage} #{number}#{part}#{iteration}"\
71
- "#{with_date && year || ''}#{edition}#{supplements}#{language(with_language_code)}"
81
+ if @tctype
82
+ "#{originator} #{tctype} #{tcnumber}#{sctype}#{wgtype} N#{number}"
83
+ else
84
+ "#{originator}#{type}#{stage} #{number}#{part}#{iteration}"\
85
+ "#{with_date && rendered_year || ''}#{edition}#{supplements}#{language(with_language_code)}"
86
+ end
87
+ end
88
+
89
+ def tctype
90
+ return @tctype.join("/") if @tctype.is_a?(Array)
91
+
92
+ @tctype
93
+ end
94
+
95
+ # TC 184/SC/WG 4 - no wg number
96
+ # TC 184/SC 4/WG 12 - separate sc and wg number
97
+ def sctype
98
+ return unless @sctype
99
+
100
+ if @wgnumber || !@wgtype
101
+ "/#{@sctype} #{@scnumber}"
102
+ else
103
+ "/#{@sctype}"
104
+ end
105
+ end
106
+
107
+ def wgtype
108
+ return unless @wgtype
109
+
110
+ if @wgnumber
111
+ "/#{@wgtype} #{@wgnumber}"
112
+ else
113
+ "/#{@wgtype} #{@scnumber}"
114
+ end
72
115
  end
73
116
 
74
117
  def copublisher
@@ -97,8 +140,8 @@ module Pubid::Iso
97
140
  "-#{@part}" if @part
98
141
  end
99
142
 
100
- def year
101
- ":#{@year}" if @year
143
+ def rendered_year
144
+ @year && ":#{@year}"
102
145
  end
103
146
 
104
147
  def type
@@ -17,6 +17,9 @@ module Pubid::Iso
17
17
  # Stage 50.60: PRF ("proof") (non-public)
18
18
  # Stage 60: IS
19
19
  class Parser < Parslet::Parser
20
+ rule(:space) { str(" ") }
21
+ rule(:space?) { space.maybe }
22
+
20
23
  rule(:digits) do
21
24
  match('\d').repeat(1)
22
25
  end
@@ -51,18 +54,40 @@ module Pubid::Iso
51
54
  ).as(:type)
52
55
  end
53
56
 
57
+ rule(:tctype) do
58
+ # tc-types
59
+ str("TC") | str("JTC") | str("PC") | str("IT") | str("CAB") | str("CASCO") | str("COPOLCO") |
60
+ str("COUNCIL") | str("CPSG") | str("CS") | str("DEVCO") | str("GA") | str("GAAB") | str("INFCO") |
61
+ str("ISOlutions") | str("ITN") | str("REMCO") | str("TMB") | str("TMBG") | str("WMO") |
62
+ str("DMT") | str("JCG") | str("SGPM") | str("ATMG") | str("CCCC") | str("CCCC-TG") | str("JDMT") |
63
+ str("JSAG") | str("JSCTF-TF") | str("JTCG") | str("JTCG-TF") | str("SAG_Acc") | str("SAG_CRMI") |
64
+ str("SAG_CRMI_CG") | str("SAG_ESG") | str("SAG_ESG_CG") | str("SAG_MRS") | str("SAG SF") | str("SAG SF_CG") |
65
+ str("SMCC") | str("STMG") | str("MENA STAR")
66
+ end
67
+
68
+ rule(:sctype) do
69
+ str("SC")
70
+ end
71
+
72
+ rule(:wgtype) do
73
+ str("AG") | str("AHG") | str("AhG") | str("WG") | str("JWG") | str("QC") | str("TF") |
74
+ str("PPC") | str("CAG") | str("WG SGDG") | str("WG SR") | str("STAR") | str("STTF") | str("TIG") |
75
+ str("CPAG") | str("CSC") | str("ITSAG") | str("CSC/FIN") | str("CSC/NOM") | str("CSC/OVE") |
76
+ str("CSC/SP") | str("CSC/FIN") | str("JAG")
77
+ end
78
+
54
79
  rule(:year) do
55
80
  match('\d').repeat(4, 4).as(:year)
56
81
  end
57
82
 
58
83
  rule(:part) do
59
- (str("-") | str("/")) >> str(" ").maybe >>
60
- (match['[\dA-Z]'] | str("-")).repeat(1).as(:part)
84
+ (str("-") | str("/")) >> space? >>
85
+ (str("Amd") | str("Cor")).absent? >> (match['[\dA-Z]'] | str("-")).repeat(1).as(:part)
61
86
  end
62
87
 
63
88
  rule(:originator) do
64
89
  organization.as(:publisher) >>
65
- (str(" ").maybe >> str("/") >> organization.as(:copublisher)).repeat
90
+ (space? >> str("/") >> organization.as(:copublisher)).repeat
66
91
  end
67
92
 
68
93
  rule(:organization) do
@@ -75,7 +100,7 @@ module Pubid::Iso
75
100
  end
76
101
 
77
102
  rule(:edition) do
78
- str(" ") >> ((str("ED") | str("Ed ") | str("Ed.")) >>
103
+ space >> ((str("ED") | str("Ed ") | str("Ed.")) >>
79
104
  digits.as(:edition) | str("Ed").as(:edition))
80
105
  end
81
106
 
@@ -85,18 +110,18 @@ module Pubid::Iso
85
110
 
86
111
  rule(:amendment) do
87
112
  (str("/") >> stage.as(:amendment_stage)).maybe >>
88
- (str("/") | str(" ")).maybe >>
113
+ (str("/") | space).maybe >>
89
114
  (str("Amd") | str("AMD") | str("AM")).as(:amendment) >>
90
- (str(" ") | str(".")) >>
115
+ (space | str(".")) >>
91
116
  digits.as(:amendment_version) >>
92
117
  (str(":") >> digits.as(:amendment_number)).maybe
93
118
  end
94
119
 
95
120
  rule(:corrigendum) do
96
121
  (str("/") >> stage.as(:corrigendum_stage)).maybe >>
97
- (str("/") | str(" ")).maybe >>
122
+ (str("/") | space).maybe >>
98
123
  (str("Cor") | str("COR")).as(:corrigendum) >>
99
- (str(" ") | str(".")) >>
124
+ (space | str(".")) >>
100
125
  digits.as(:corrigendum_version) >>
101
126
  (str(":") >> digits.as(:corrigendum_number)).maybe
102
127
  end
@@ -115,31 +140,45 @@ module Pubid::Iso
115
140
  str("Guide") | str("GUIDE") | str("Руководство") | str("Руководства")
116
141
  end
117
142
 
118
- rule(:identifier) do
119
- str("Fpr").as(:stage).maybe >>
120
- # Withdrawn e.g: WD/ISO 10360-5:2000
121
- str("WD/").maybe >>
122
- # for French and Russian PubIDs starting with Guide type
123
- (guide_prefix.as(:type) >> str(" ")).maybe >>
124
- (stage.as(:stage) >> str(" ")).maybe >>
125
- originator >> ((str(" ") | str("/")) >>
126
- # for ISO/FDIS
127
- (type | stage.as(:stage))).maybe >>
143
+ # Parse technical committee documents
144
+ rule(:tc_document_body) do
145
+ (tctype.as(:tctype) >> str("/").maybe).repeat >> space >> digits.as(:tcnumber) >>
146
+ (str("/") >> (
147
+ ((sctype.as(:sctype) >> space >> digits.as(:scnumber) >> str("/")).maybe >>
148
+ wgtype.as(:wgtype) >> space >> digits.as(:wgnumber)) |
149
+ (sctype.as(:sctype) >> (space | str("/") >> wgtype.as(:wgtype) >> space) >> digits.as(:scnumber))
150
+ )).maybe >>
151
+ str(" N") >> space? >> digits.as(:number)
152
+ end
153
+
154
+ rule(:std_document_body) do
155
+ (type | stage.as(:stage)).maybe >>
128
156
  # for ISO/IEC WD TS 25025
129
- str(" ").maybe >> ((stage.as(:stage) | type) >> str(" ")).maybe >>
157
+ space? >> ((stage.as(:stage) | type) >> space).maybe >>
130
158
  digits.as(:number) >>
131
159
  # for identifiers like ISO 5537/IDF 26
132
- (str("|") >> (str("IDF") >> str(" ") >> digits).as(:joint_document)).maybe >>
160
+ (str("|") >> (str("IDF") >> space >> digits).as(:joint_document)).maybe >>
133
161
  part.maybe >> iteration.maybe >>
134
- (str(" ").maybe >> str(":") >> year).maybe >>
162
+ (space? >> str(":") >> year).maybe >>
135
163
  # stage before amendment
136
164
  (
137
- # stage before corrigendum
138
- ((amendment >> corrigendum.maybe) | corrigendum).maybe) >>
165
+ # stage before corrigendum
166
+ ((amendment >> corrigendum.maybe) | corrigendum).maybe) >>
139
167
  edition.maybe >>
140
168
  language.maybe
141
169
  end
142
170
 
171
+ rule(:identifier) do
172
+ str("Fpr").as(:stage).maybe >>
173
+ # Withdrawn e.g: WD/ISO 10360-5:2000
174
+ str("WD/").maybe >>
175
+ # for French and Russian PubIDs starting with Guide type
176
+ (guide_prefix.as(:type) >> space).maybe >>
177
+ (stage.as(:stage) >> space).maybe >>
178
+ originator >> (space | str("/")) >>
179
+ (tc_document_body | std_document_body)
180
+ end
181
+
143
182
  rule(:root) { identifier }
144
183
  end
145
184
  end
data/lib/pubid/iso/urn.rb CHANGED
@@ -1,11 +1,5 @@
1
1
  module Pubid::Iso
2
- class Urn
3
- attr_accessor :number, :publisher, :copublisher, :stage, :substage, :part,
4
- :type, :year, :edition, :iteration, :supplements, :language,
5
- :amendment, :amendment_version, :amendment_number,
6
- :corrigendum, :corrigendum_version, :corrigendum_number,
7
- :amendment_stage, :corrigendum_stage, :joint_document
8
-
2
+ class Urn < Identifier
9
3
 
10
4
  STAGES = { PWI: 0,
11
5
  NP: 10,
@@ -26,7 +20,33 @@ module Pubid::Iso
26
20
  # [[":" status] ":" edition]
27
21
  # [":" docversion] [":" language]
28
22
 
29
- "urn:iso:std:#{originator}#{type}:#{number}#{part}#{stage}#{edition}#{supplement}#{language}"
23
+ if tctype
24
+ "urn:iso:doc:#{originator}:#{tctype.downcase}:#{tcnumber}#{sctype}#{wgtype}:#{number}"
25
+ else
26
+ "urn:iso:std:#{originator}#{type}:#{number}#{part}#{stage}#{edition}#{supplement}#{language}"
27
+ end
28
+ end
29
+
30
+ def tctype
31
+ return @tctype.join(":") if @tctype.is_a?(Array)
32
+
33
+ @tctype
34
+ end
35
+
36
+ def sctype
37
+ return unless @sctype
38
+
39
+ ":#{@sctype.downcase}:#{@scnumber}"
40
+ end
41
+
42
+ def wgtype
43
+ return unless @wgtype
44
+
45
+ if @wgnumber
46
+ ":#{@wgtype.downcase}:#{@wgnumber}"
47
+ else
48
+ ":#{@wgtype.downcase}"
49
+ end
30
50
  end
31
51
 
32
52
  def part
@@ -34,10 +54,14 @@ module Pubid::Iso
34
54
  end
35
55
 
36
56
  def render_stage(stage)
57
+ return ":stage-#{sprintf('%05.2f', stage)}#{iteration}" if stage.is_a?(Float)
58
+
37
59
  ":stage-#{sprintf('%05.2f', STAGES[stage.to_sym])}#{iteration}"
38
60
  end
39
61
 
40
62
  def stage
63
+ return render_stage(@urn_stage) if @urn_stage
64
+
41
65
  return render_stage(@stage) if @stage
42
66
 
43
67
  return render_stage(@amendment_stage) if @amendment_stage
@@ -70,7 +94,6 @@ module Pubid::Iso
70
94
  def type
71
95
  # type = "data" / "guide" / "isp" / "iwa" /
72
96
  # "pas" / "r" / "tr" / "ts" / "tta"
73
-
74
97
  if @type
75
98
  ":#{@type.downcase}"
76
99
  end
@@ -1,5 +1,5 @@
1
1
  module Pubid
2
2
  module Iso
3
- VERSION = "0.1.3".freeze
3
+ VERSION = "0.1.6".freeze
4
4
  end
5
5
  end
data/lib/pubid/iso.rb CHANGED
@@ -11,7 +11,7 @@ end
11
11
  require_relative "iso/errors"
12
12
  require_relative "iso/parser"
13
13
  require_relative "iso/transformer"
14
- require_relative "iso/urn"
15
14
  require_relative "iso/identifier"
16
15
  require_relative "iso/identifier/french"
17
16
  require_relative "iso/identifier/russian"
17
+ require_relative "iso/urn"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pubid-iso
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-09 00:00:00.000000000 Z
11
+ date: 2022-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake