pubid-iso 0.1.6 → 0.1.9

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: d3db426781c12fb80bbd99118bc9b601fe93473d0c9b395f88929ac8eb3b996d
4
- data.tar.gz: 7e2c155d3397e1ac4888258c680357b204edb8252a3e03fa8d336292be85ccbb
3
+ metadata.gz: b09b867ebc673153defa32f6987a1f6337895789069e76388d8791cb9c8f2545
4
+ data.tar.gz: caa42c15191fca2b22905524f8ffa8765e137b4fb8fa96b693eec8626e3d46f2
5
5
  SHA512:
6
- metadata.gz: 765bdaef471049f21f15ba5cf9f45bbb42edfe88baf53ee5f67d155fdba6f0b8ef8a1b8cf212a9f6d3d35ce289946c6c5281efd94e913d59274b9ea1a7143e8c
7
- data.tar.gz: 628307f60259f11b97476d893861b73f1042104c940958ee695acc24069033e4689b0bfe490a641a6c7d557a5f8635ec6cf2140bed56d594910c8e2c46670d6f
6
+ metadata.gz: 251a4b42ce806cc3a55dc31923b07ea8c2202bacd563041d1fd4dd6bc8a4de0572fd8ff219b9f39bc58fba4e6edc713a33a86041b961d849567ac7cdbf7128bb
7
+ data.tar.gz: 45493ee2cc7deaade4a97ba422d87c9c76b0d9db9745ce1573a903be5669591897d9606a3cdd5dff03638d71aeb4c2ea94ed6ed59e92e6200741fceb28e35550
@@ -0,0 +1,13 @@
1
+ module Pubid::Iso
2
+ class Amendment < Supplement
3
+ def render_pubid
4
+ stage = render_pubid_stage
5
+ stage += " " unless stage.size == 0
6
+ "/#{stage}Amd #{render_pubid_number}"
7
+ end
8
+
9
+ def render_urn
10
+ "#{render_urn_stage}:amd#{render_urn_number}"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Pubid::Iso
2
+ class Corrigendum < Supplement
3
+ def render_pubid
4
+ stage = render_pubid_stage
5
+ stage += " " unless stage.size == 0
6
+ "/#{stage}Cor #{render_pubid_number}"
7
+ end
8
+
9
+ def render_urn
10
+ "#{render_urn_stage}:cor#{render_urn_number}"
11
+ end
12
+ end
13
+ end
@@ -1,201 +1,70 @@
1
1
  module Pubid::Iso
2
- class Identifier
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,
2
+ class Identifier < Pubid::Core::Identifier
3
+ attr_accessor :stage, :substage,
4
+ :iteration, :supplements,
7
5
  :amendment_stage, :corrigendum_stage, :joint_document,
8
6
  :tctype, :sctype, :wgtype, :tcnumber, :scnumber, :wgnumber,
9
- :urn_stage
10
-
11
- LANGUAGES = {
12
- "ru" => "R",
13
- "fr" => "F",
14
- "en" => "E",
15
- "ar" => "A",
16
- }.freeze
7
+ :urn_stage, :dir, :dirtype, :supplement
17
8
 
18
9
  def initialize(**opts)
19
- opts.each { |key, value| send("#{key}=", value.is_a?(Array) && value || value.to_s) }
20
- end
21
-
22
- def get_params
23
- instance_variables.map { |var| [var.to_s.gsub("@", "").to_sym, instance_variable_get(var)] }.to_h
24
- end
25
-
26
- def urn
27
- Urn.new(**get_params)
10
+ super
11
+ # if supplement
12
+ # @supplement = Supplement.new(number: supplement[:year],
13
+ # publisher: supplement[:publisher],
14
+ # edition: supplement[:edition])
15
+ # end
28
16
  end
29
17
 
30
18
  def self.parse_from_title(title)
31
19
  title.split.reverse.inject(title) do |acc, part|
32
20
  return parse(acc)
33
- rescue Pubid::Iso::Errors::ParseError
21
+ rescue Pubid::Core::Errors::ParseError
34
22
  # delete parts from the title until it's parseable
35
23
  acc.reverse.sub(part.reverse, "").reverse.strip
36
24
  end
37
25
  end
38
26
 
39
- def self.parse(code_or_params)
40
- params = code_or_params.is_a?(String) ? Parser.new.parse(code_or_params) : code_or_params
41
- # Parslet returns an array when match any copublisher
42
- # otherwise it's hash
43
- if params.is_a?(Array)
44
- new(
45
- **(
46
- params.inject({}) do |r, i|
47
- result = r
48
- i.map {|k, v| Transformer.new.apply(k => v).to_a.first }.each do |k, v|
49
- result = result.merge(k => r.key?(k) ? [v, r[k]] : v)
50
- end
51
- result
52
- end
53
- )
54
- )
55
- else
56
- new(**params.map do |k, v|
57
- Transformer.new.apply(k => v).to_a.first
58
- end.to_h)
27
+ class << self
28
+ def get_amendment_class
29
+ Pubid::Iso::Amendment
59
30
  end
60
- # merge values repeating keys into array (for copublishers)
61
31
 
62
-
63
- # params.to_h)
64
- rescue Parslet::ParseFailed => failure
65
- raise Pubid::Iso::Errors::ParseError, "#{failure.message}\ncause: #{failure.parse_failure_cause.ascii_tree}"
66
- end
67
-
68
- def to_s(lang: nil, with_date: true, with_language_code: :iso)
69
- # @pubid_language = lang
70
- case lang
71
- when :french
72
- French.new(**get_params)
73
- when :russian
74
- Russian.new(**get_params)
75
- else
76
- self
77
- end.identifier(with_date, with_language_code) + (@joint_document && "|#{@joint_document}").to_s
78
- end
79
-
80
- def identifier(with_date, 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}"
32
+ def get_corrigendum_class
33
+ Pubid::Iso::Corrigendum
104
34
  end
105
- end
106
-
107
- def wgtype
108
- return unless @wgtype
109
35
 
110
- if @wgnumber
111
- "/#{@wgtype} #{@wgnumber}"
112
- else
113
- "/#{@wgtype} #{@scnumber}"
36
+ def get_parser_class
37
+ Parser
114
38
  end
115
- end
116
-
117
- def copublisher
118
- return nil unless @copublisher
119
-
120
- (!@copublisher.is_a?(Array) && [@copublisher]) || @copublisher
121
- end
122
39
 
123
- def originator
124
- if copublisher
125
- # @copublisher = [@copublisher] unless @copublisher.is_a?(Array)
126
- # @copublisher.map! { |copublisher| copublisher.sub("IEC", "CEI") } if @french
127
- publisher + copublisher.map(&:to_s).sort.map do |copublisher|
128
- "/#{copublisher.gsub('-', '/')}"
129
- end.join
130
- else
131
- publisher
40
+ def get_transformer_class
41
+ Transformer
132
42
  end
133
43
  end
134
44
 
135
- def stage
136
- "#{(@copublisher && ' ') || '/'}#{@stage}" if @stage
137
- end
138
-
139
- def part
140
- "-#{@part}" if @part
141
- end
142
-
143
- def rendered_year
144
- @year && ":#{@year}"
145
- end
146
-
147
- def type
148
- "#{(@copublisher && ' ') || '/'}#{@type}" if @type
149
- end
150
-
151
- def edition
152
- " ED#{@edition}" if @edition
153
- end
154
-
155
- def iteration
156
- ".#{@iteration}" if @iteration
157
- end
158
-
159
- def amendment
160
- if @amendment_number
161
- "Amd #{@amendment_version}:#{@amendment_number}"
162
- else
163
- "Amd #{@amendment_version}"
164
- end
45
+ def urn
46
+ (@tctype && Renderer::UrnTc || @dir && Renderer::UrnDir || Pubid::Core::Renderer::Urn).new(get_params).render
165
47
  end
166
48
 
167
- def corrigendum
168
- if @corrigendum_number
169
- "Cor #{@corrigendum_version}:#{@corrigendum_number}"
49
+ def to_s(lang: nil, with_date: true, with_language_code: :iso)
50
+ # @pubid_language = lang
51
+ case lang
52
+ when :french
53
+ Renderer::French.new(get_params)
54
+ when :russian
55
+ Renderer::Russian.new(get_params)
170
56
  else
171
- "Cor #{@corrigendum_version}"
172
- end
173
- end
174
-
175
- def supplements
176
- result = ""
177
- if @amendment_version
178
- result += (@amendment_stage && "/#{@amendment_stage} ") || "/"
179
- result += amendment
180
- end
181
-
182
- if @corrigendum_version
183
- result += (@corrigendum_stage && "/#{@corrigendum_stage} ") || "/"
184
- result += corrigendum
185
- end
186
-
187
- result
188
- end
189
-
190
- def language(with_language_code = :iso)
191
- if @language
192
- if with_language_code == :single
193
- "(#{LANGUAGES[@language]})"
57
+ if @tctype
58
+ Renderer::Tc.new(get_params)
59
+ elsif @dir
60
+ Renderer::Dir.new(get_params)
194
61
  else
195
- "(#{@language})"
62
+ self.class.get_renderer_class.new(get_params)
196
63
  end
197
- end
64
+ end.render(with_date: with_date, with_language_code: with_language_code) +
65
+ if @joint_document && !@dir
66
+ "|#{@joint_document}"
67
+ end.to_s
198
68
  end
199
-
200
69
  end
201
70
  end
@@ -1,33 +1,10 @@
1
- # from https://github.com/relaton/relaton-iso/issues/47#issuecomment-512251416
2
- # ISO {num}-{docpart}:{year} - docpart and year are optional. docpart is [\w-]+
3
- # ISO/{stage} {num}-{docpart}:{year} or ISO/{subprefix} {stage} {num}:{year} - stages are WD, CD, DIS, FDIS, AWI
4
- # ISO/{subprefix} {stage} {num}-{docpart}:{year} - subpefixes are IEC, IEEE, IEC/IEEE, TR, R. Any other?
5
- # ISO {num}:{year}/{correction} {cornum}:{coryear} - corrections are Amd, DAmd, Cor. coryear is optional
6
- # ISO {num}:{year}/{corstage} {correction} {cornum}:{coryear} - corstages are CD, NP, AWI, PRF, WD, DIS. Any others?
7
-
8
1
  module Pubid::Iso
9
- # ISO/IEC FDIS 7816-6
10
- # ISO/IEC/IEEE 15289:2019
11
- #
12
- # Stage 10: NP (non-public)
13
- # Stage 20: WD (non-public)
14
- # Stage 30: CD
15
- # Stage 40: DIS
16
- # Stage 50: FDIS
17
- # Stage 50.60: PRF ("proof") (non-public)
18
- # Stage 60: IS
19
- class Parser < Parslet::Parser
20
- rule(:space) { str(" ") }
21
- rule(:space?) { space.maybe }
22
-
23
- rule(:digits) do
24
- match('\d').repeat(1)
25
- end
26
-
2
+ class Parser < Pubid::Core::Parser
27
3
  rule(:stage) do
28
- Russian::STAGE.values.reduce(
4
+ Renderer::Russian::STAGE.values.reduce(
29
5
  # other stages
30
- str("NP") | str("WD") | str("CD") | str("DIS") | str("FDIS") | str("PRF") |
6
+ str("NP") | str("NWIP") |
7
+ str("WD") | str("CD") | str("DIS") | str("FDIS") | str("PRF") |
31
8
  str("IS") | str("AWI") | str("PWI") |
32
9
  # AMD and COR stages
33
10
  str("FPD") | str("pD") | str("PD") | str("FD") | str("D")) do |acc, stage|
@@ -35,18 +12,9 @@ module Pubid::Iso
35
12
  end
36
13
  end
37
14
 
38
- # TYPES = {
39
- # "TS" => "technical-specification",
40
- # "TR" => "technical-report",
41
- # "PAS" => "publicly-available-specification",
42
- # "Guide" => "guide",
43
- # }.freeze
44
- # DATA|GUIDE|ISP|IWA|PAS|R|TR|TS|TTA
45
- # # type = "data" / "guide" / "isp" / "iwa" /
46
- # # "pas" / "r" / "tr" / "ts" / "tta"
47
15
  rule(:type) do
48
16
  (
49
- Russian::TYPE.values.reduce(
17
+ Renderer::Russian::TYPE.values.reduce(
50
18
  str("DATA") | str("ISP") | str("IWA") | str("R") | str("TTA") |
51
19
  str("TS") | str("TR") | str("PAS") | str("Guide") | str("GUIDE")) do |acc, type|
52
20
  acc | str(type)
@@ -76,22 +44,13 @@ module Pubid::Iso
76
44
  str("CSC/SP") | str("CSC/FIN") | str("JAG")
77
45
  end
78
46
 
79
- rule(:year) do
80
- match('\d').repeat(4, 4).as(:year)
81
- end
82
-
83
47
  rule(:part) do
84
48
  (str("-") | str("/")) >> space? >>
85
49
  (str("Amd") | str("Cor")).absent? >> (match['[\dA-Z]'] | str("-")).repeat(1).as(:part)
86
50
  end
87
51
 
88
- rule(:originator) do
89
- organization.as(:publisher) >>
90
- (space? >> str("/") >> organization.as(:copublisher)).repeat
91
- end
92
-
93
52
  rule(:organization) do
94
- Russian::PUBLISHER.values.reduce(
53
+ Renderer::Russian::PUBLISHER.values.reduce(
95
54
  str("IEC") | str("IEEE") | str("CIW") | str("SAE") |
96
55
  str("CIE") | str("ASME") | str("ASTM") | str("OECD") | str("ISO") |
97
56
  str("IWA") | str("HL7") | str("CEI")) do |acc, publisher|
@@ -109,21 +68,23 @@ module Pubid::Iso
109
68
  end
110
69
 
111
70
  rule(:amendment) do
112
- (str("/") >> stage.as(:amendment_stage)).maybe >>
71
+ ((str("/") >> stage.as(:stage)).maybe >>
113
72
  (str("/") | space).maybe >>
114
- (str("Amd") | str("AMD") | str("AM")).as(:amendment) >>
115
- (space | str(".")) >>
116
- digits.as(:amendment_version) >>
117
- (str(":") >> digits.as(:amendment_number)).maybe
73
+ (str("Amd") | str("AMD") | str("AM")) >>
74
+ str(".").maybe >>
75
+ space.maybe >>
76
+ digits.as(:version) >>
77
+ (str(":") >> digits.as(:number)).maybe).as(:amendments)
118
78
  end
119
79
 
120
80
  rule(:corrigendum) do
121
- (str("/") >> stage.as(:corrigendum_stage)).maybe >>
81
+ ((str("/") >> stage.as(:stage)).maybe >>
122
82
  (str("/") | space).maybe >>
123
- (str("Cor") | str("COR")).as(:corrigendum) >>
124
- (space | str(".")) >>
125
- digits.as(:corrigendum_version) >>
126
- (str(":") >> digits.as(:corrigendum_number)).maybe
83
+ (str("Cor") | str("COR")) >>
84
+ str(".").maybe >>
85
+ space.maybe >>
86
+ digits.as(:version) >>
87
+ (str(":") >> digits.as(:number)).maybe).as(:corrigendums)
127
88
  end
128
89
 
129
90
  rule(:language) do
@@ -148,7 +109,20 @@ module Pubid::Iso
148
109
  wgtype.as(:wgtype) >> space >> digits.as(:wgnumber)) |
149
110
  (sctype.as(:sctype) >> (space | str("/") >> wgtype.as(:wgtype) >> space) >> digits.as(:scnumber))
150
111
  )).maybe >>
151
- str(" N") >> space? >> digits.as(:number)
112
+ space >> str("N") >> space? >> digits.as(:number)
113
+ end
114
+
115
+ rule(:dir_supplement_edition) do
116
+ space >> (str("Edition") | str("Ed")) >> space >> digits.as(:edition)
117
+ end
118
+
119
+ rule(:dir_document_body) do
120
+ ((str("DIR") | str("Directives Part") | str("Directives, Part") | str("Directives,")).as(:dir) >> space).maybe >>
121
+ (str("JTC").as(:dirtype) >> space).maybe >>
122
+ (digits.as(:number) >> (str(":") >> year).maybe).maybe >>
123
+ (str(" -- Consolidated").maybe >> (space? >> (organization.as(:publisher) >> space).maybe >>
124
+ (str("SUP") | str("Supplement")) >> (str(":") >> year).maybe >>
125
+ dir_supplement_edition.maybe).as(:supplement)).maybe
152
126
  end
153
127
 
154
128
  rule(:std_document_body) do
@@ -176,7 +150,8 @@ module Pubid::Iso
176
150
  (guide_prefix.as(:type) >> space).maybe >>
177
151
  (stage.as(:stage) >> space).maybe >>
178
152
  originator >> (space | str("/")) >>
179
- (tc_document_body | std_document_body)
153
+ (tc_document_body | std_document_body | (dir_document_body >>
154
+ (str(" + ") >> (originator >> space >> dir_document_body).as(:joint_document)).maybe))
180
155
  end
181
156
 
182
157
  rule(:root) { identifier }
@@ -0,0 +1,33 @@
1
+ module Pubid::Iso::Renderer
2
+ class Dir < Pubid::Core::Renderer::Base
3
+
4
+ def render_identifier(params)
5
+ res = ("%{publisher}%{copublisher} DIR%{dirtype}%{number}%{year}%{supplement}" % params)
6
+
7
+ if params.key?(:joint_document)
8
+ joint_params = prerender_params(params[:joint_document], {})
9
+ joint_params.default = ""
10
+ res += (" + %{publisher}%{copublisher}%{dirtype}%{number}%{year}%{supplement}" % joint_params)
11
+ end
12
+
13
+ res
14
+ end
15
+
16
+ def render_number(number, _opts, _params)
17
+ " #{number}"
18
+ end
19
+
20
+ def render_dirtype(dirtype, _opts, _params)
21
+ " #{dirtype}"
22
+ end
23
+
24
+ def render_supplement(supplement, _opts, _params)
25
+ if supplement.publisher && supplement.publisher != ""
26
+ " #{supplement.publisher} SUP"
27
+ else
28
+ " SUP"
29
+ end + (supplement.number && ":#{supplement.number}" || "") +
30
+ (supplement.edition && " Edition #{supplement.edition}" || "")
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,24 @@
1
+ module Pubid::Iso::Renderer
2
+ class French < Pubid::Core::Renderer::Base
3
+ def render_identifier(params)
4
+ if params[:type] == " Guide"
5
+ params[:type] = ""
6
+ "Guide #{super(params)}"
7
+ else
8
+ super
9
+ end
10
+ end
11
+
12
+ def render_copublisher(copublisher, opts, params)
13
+ "/#{copublisher.sub("IEC", "CEI")}"
14
+ end
15
+
16
+ def render_corrigendums(corrigendums, _opts, _params)
17
+ super.gsub(" ", ".")
18
+ end
19
+
20
+ def render_amendments(amendments, _opts, _params)
21
+ super.gsub(" ", ".")
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,61 @@
1
+ module Pubid::Iso::Renderer
2
+ class Russian < Pubid::Core::Renderer::Base
3
+ PUBLISHER = { "ISO" => "ИСО", "IEC" => "МЭК" }.freeze
4
+ STAGE = { "FDIS" => "ОПМС",
5
+ "DIS" => "ПМС",
6
+ "NP" => "НП",
7
+ "AWI" => "АВИ",
8
+ "CD" => "КПК",
9
+ "PD" => "ПД",
10
+ "FPD" => "ФПД",
11
+
12
+
13
+ }.freeze
14
+
15
+ TYPE = { "Guide" => "Руководство",
16
+ "TS" => "ТС",
17
+ "TR" => "ТО",
18
+ "ISP" => "ИСП",
19
+ }.freeze
20
+
21
+ def render_identifier(params)
22
+ if params[:type] == " Guide"
23
+ params[:type] = ""
24
+ "Руководство #{super(params)}"
25
+ else
26
+ super
27
+ end
28
+ end
29
+
30
+ def render_publisher(publisher, _opts, _params)
31
+ PUBLISHER[publisher]
32
+ end
33
+
34
+ def render_copublisher(copublisher, _opts, _params)
35
+ # (!@copublisher.is_a?(Array) && [@copublisher]) || @copublisher
36
+ if copublisher.is_a?(Array)
37
+ copublisher.map(&:to_s).sort.map do |copublisher|
38
+ "/#{PUBLISHER[copublisher].gsub('-', '/')}"
39
+ end.join
40
+ else
41
+ "/#{PUBLISHER[copublisher]}"
42
+ end
43
+ end
44
+
45
+ def render_stage(stage, _opts, params)
46
+ if params[:copublisher]
47
+ " #{STAGE[stage]}"
48
+ else
49
+ "/#{STAGE[stage]}"
50
+ end
51
+ end
52
+
53
+ def render_corrigendums(corrigendums, _opts, _params)
54
+ super.gsub(" ", ".")
55
+ end
56
+
57
+ def render_amendments(amendments, _opts, _params)
58
+ super.gsub(" ", ".")
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,30 @@
1
+ module Pubid::Iso::Renderer
2
+ class Tc < Pubid::Core::Renderer::Base
3
+
4
+ def render_identifier(params)
5
+ "%{publisher}%{copublisher} %{tctype} %{tcnumber}%{sctype}%{wgtype} N%{number}" % params
6
+ end
7
+
8
+ def render_tctype(tctype, _opts, _params)
9
+ tctype.is_a?(Array) && tctype.join("/") || tctype
10
+ end
11
+
12
+ # TC 184/SC/WG 4 - no wg number
13
+ # TC 184/SC 4/WG 12 - separate sc and wg number
14
+ def render_sctype(sctype, _opts, params)
15
+ if params[:wgnumber] || !params[:wgtype]
16
+ "/#{sctype} #{params[:scnumber]}"
17
+ else
18
+ "/#{sctype}"
19
+ end
20
+ end
21
+
22
+ def render_wgtype(wgtype, _opts, params)
23
+ if params[:wgnumber]
24
+ "/#{wgtype} #{params[:wgnumber]}"
25
+ else
26
+ "/#{wgtype} #{params[:scnumber]}"
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,35 @@
1
+ module Pubid::Iso::Renderer
2
+ class UrnDir < Pubid::Core::Renderer::Urn
3
+
4
+ def render_identifier(params)
5
+ res = ("urn:iso:doc:%{publisher}%{copublisher}:dir%{dirtype}%{number}%{year}%{supplement}" % params)
6
+
7
+ if params.key?(:joint_document)
8
+ joint_params = prerender_params(
9
+ params[:joint_document].transform_values { |value| value.is_a?(Parslet::Slice) && value.to_s || value }, {}
10
+ )
11
+ joint_params.default = ""
12
+ res += (":%{publisher}%{copublisher}%{dirtype}%{number}%{supplement}" % joint_params)
13
+ end
14
+
15
+ res
16
+ end
17
+
18
+ def render_number(number, _opts, _params)
19
+ ":#{number}"
20
+ end
21
+
22
+ def render_dirtype(dirtype, _opts, _params)
23
+ ":#{dirtype.downcase}"
24
+ end
25
+
26
+ def render_supplement(supplement, _opts, _params)
27
+ if supplement.publisher && supplement.publisher != ""
28
+ ":sup:#{supplement.publisher.downcase}"
29
+ else
30
+ ":sup"
31
+ end + (supplement.number && ":#{supplement.number}" || "") +
32
+ (supplement.edition && ":ed-#{supplement.edition}" || "")
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,24 @@
1
+ module Pubid::Iso::Renderer
2
+ class UrnTc < Pubid::Core::Renderer::Urn
3
+
4
+ def render_identifier(params)
5
+ "urn:iso:doc:%{publisher}%{copublisher}:%{tctype}:%{tcnumber}%{sctype}%{wgtype}:%{number}" % params
6
+ end
7
+
8
+ def render_tctype(tctype, _opts, _params)
9
+ (tctype.is_a?(Array) && tctype.join(":") || tctype).downcase
10
+ end
11
+
12
+ def render_sctype(sctype, _opts, params)
13
+ ":#{sctype.downcase}:#{params[:scnumber]}"
14
+ end
15
+
16
+ def render_wgtype(wgtype, _opts, params)
17
+ if params[:wgnumber]
18
+ ":#{wgtype.downcase}:#{params[:wgnumber]}"
19
+ else
20
+ ":#{wgtype.downcase}"
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module Pubid::Iso
2
+ class Supplement < Pubid::Core::Supplement
3
+ attr_accessor :stage, :publisher, :edition
4
+
5
+ def initialize(stage: nil, version: nil, publisher: nil, edition: nil, **args)
6
+ super(version: version, **args)
7
+ @stage = stage
8
+ @publisher = publisher.to_s
9
+ @edition = edition
10
+ end
11
+
12
+ def render_pubid_stage
13
+ ((@stage && @stage) || "")
14
+ end
15
+
16
+ def render_urn_stage
17
+ ((@stage && ":stage-#{sprintf('%05.2f', Pubid::Core::Renderer::Urn::STAGES[@stage.to_sym])}") || "")
18
+ end
19
+
20
+ def <=>(other)
21
+ (super == 0) && ((stage.nil? || stage == other.stage) && 0 || -1) || super
22
+ end
23
+ end
24
+ end
@@ -8,12 +8,18 @@ module Pubid::Iso
8
8
  { stage: convert_stage(context[:stage]) }
9
9
  end
10
10
 
11
- rule(amendment_stage: simple(:amendment_stage)) do |context|
12
- { amendment_stage: convert_stage(context[:amendment_stage]) }
11
+ rule(amendments: subtree(:amendments)) do |context|
12
+ if context[:amendments].key?(:stage)
13
+ context[:amendments][:stage] = convert_stage(context[:amendments][:stage])
14
+ end
15
+ context
13
16
  end
14
-
15
- rule(corrigendum_stage: simple(:corrigendum_stage)) do |context|
16
- { corrigendum_stage: convert_stage(context[:corrigendum_stage]) }
17
+ #
18
+ rule(corrigendums: subtree(:corrigendums)) do |context|
19
+ if context[:corrigendums].key?(:stage)
20
+ context[:corrigendums][:stage] = convert_stage(context[:corrigendums][:stage])
21
+ end
22
+ context
17
23
  end
18
24
 
19
25
  rule(language: simple(:language)) do |context|
@@ -27,7 +33,7 @@ module Pubid::Iso
27
33
  end
28
34
 
29
35
  rule(type: simple(:type)) do
30
- russian_type = Russian::TYPE.key(type.to_s)
36
+ russian_type = Renderer::Russian::TYPE.key(type.to_s)
31
37
  { type: russian_type&.to_s ||
32
38
  case type
33
39
  # XXX: can't put 2 alternative Russian translations to dictionary, temporary hack
@@ -44,7 +50,7 @@ module Pubid::Iso
44
50
  end
45
51
 
46
52
  rule(copublisher: simple(:copublisher)) do
47
- russian_copublisher = Russian::PUBLISHER.key(copublisher.to_s)
53
+ russian_copublisher = Renderer::Russian::PUBLISHER.key(copublisher.to_s)
48
54
  { copublisher: russian_copublisher&.to_s ||
49
55
  case copublisher
50
56
  when "CEI"
@@ -56,15 +62,38 @@ module Pubid::Iso
56
62
  end
57
63
 
58
64
  rule(publisher: simple(:publisher)) do
59
- russian_publisher = Russian::PUBLISHER.key(publisher.to_s)
65
+ russian_publisher = Renderer::Russian::PUBLISHER.key(publisher.to_s)
60
66
  { publisher: russian_publisher&.to_s || publisher }
61
67
  end
62
68
 
69
+ # rule(year: simple(:year)) do
70
+ # { year: year.to_i }
71
+ # end
72
+ #
73
+ rule(publisher: simple(:publisher), supplement: subtree(:supplement)) do |context|
74
+ context[:supplement] =
75
+ Supplement.new(number: context[:supplement][:year],
76
+ publisher: context[:supplement][:publisher],
77
+ edition: context[:supplement][:edition])
78
+ context
79
+ end
80
+
81
+ rule(supplement: subtree(:supplement)) do |context|
82
+ context[:supplement] =
83
+ Supplement.new(number: context[:supplement][:year],
84
+ publisher: context[:supplement][:publisher],
85
+ edition: context[:supplement][:edition])
86
+ context
87
+ end
88
+
89
+
63
90
  def self.convert_stage(code)
64
- russian_code = Russian::STAGE.key(code.to_s)
91
+ russian_code = Renderer::Russian::STAGE.key(code.to_s)
65
92
  return russian_code.to_s if russian_code
66
93
 
67
94
  case code
95
+ when "NWIP"
96
+ "NP"
68
97
  when "D"
69
98
  "DIS"
70
99
  when "FD"
@@ -1,5 +1,5 @@
1
1
  module Pubid
2
2
  module Iso
3
- VERSION = "0.1.6".freeze
3
+ VERSION = "0.1.9".freeze
4
4
  end
5
5
  end
data/lib/pubid/iso.rb CHANGED
@@ -8,10 +8,17 @@ module Pubid
8
8
  end
9
9
  end
10
10
 
11
+ require "pubid-core"
11
12
  require_relative "iso/errors"
12
13
  require_relative "iso/parser"
13
14
  require_relative "iso/transformer"
15
+ require_relative "iso/supplement"
16
+ require_relative "iso/amendment"
17
+ require_relative "iso/corrigendum"
14
18
  require_relative "iso/identifier"
15
- require_relative "iso/identifier/french"
16
- require_relative "iso/identifier/russian"
17
- require_relative "iso/urn"
19
+ require_relative "iso/renderer/french"
20
+ require_relative "iso/renderer/russian"
21
+ require_relative "iso/renderer/tc"
22
+ require_relative "iso/renderer/urn-tc"
23
+ require_relative "iso/renderer/dir"
24
+ require_relative "iso/renderer/urn-dir"
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.6
4
+ version: 0.1.9
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-06-01 00:00:00.000000000 Z
11
+ date: 2022-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pubid-core
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.2'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.2'
97
111
  description: Library to generate, parse and manipulate ISO PubID.
98
112
  email:
99
113
  - open.source@ribose.com
@@ -107,13 +121,19 @@ files:
107
121
  - README.adoc
108
122
  - lib/pubid-iso.rb
109
123
  - lib/pubid/iso.rb
124
+ - lib/pubid/iso/amendment.rb
125
+ - lib/pubid/iso/corrigendum.rb
110
126
  - lib/pubid/iso/errors.rb
111
127
  - lib/pubid/iso/identifier.rb
112
- - lib/pubid/iso/identifier/french.rb
113
- - lib/pubid/iso/identifier/russian.rb
114
128
  - lib/pubid/iso/parser.rb
129
+ - lib/pubid/iso/renderer/dir.rb
130
+ - lib/pubid/iso/renderer/french.rb
131
+ - lib/pubid/iso/renderer/russian.rb
132
+ - lib/pubid/iso/renderer/tc.rb
133
+ - lib/pubid/iso/renderer/urn-dir.rb
134
+ - lib/pubid/iso/renderer/urn-tc.rb
135
+ - lib/pubid/iso/supplement.rb
115
136
  - lib/pubid/iso/transformer.rb
116
- - lib/pubid/iso/urn.rb
117
137
  - lib/pubid/iso/version.rb
118
138
  homepage: https://github.com/metanorma/pubid-iso
119
139
  licenses:
@@ -1,32 +0,0 @@
1
- module Pubid::Iso
2
- class French < Identifier
3
- def identifier(with_date, with_language_code)
4
- if @type == "Guide"
5
- "Guide #{originator}#{stage} #{number}#{part}#{iteration}"\
6
- "#{with_date && rendered_year || ''}#{edition}#{supplements}#{language(with_language_code)}"
7
- else
8
- super
9
- end
10
- end
11
-
12
- def copublisher
13
- super.map { |copublisher| copublisher.sub("IEC", "CEI") }
14
- end
15
-
16
- def amendment
17
- if @amendment_number
18
- "Amd.#{@amendment_version}:#{@amendment_number}"
19
- else
20
- "Amd.#{@amendment_version}"
21
- end
22
- end
23
-
24
- def corrigendum
25
- if @corrigendum_number
26
- "Cor.#{@corrigendum_version}:#{@corrigendum_number}"
27
- else
28
- "Cor.#{@corrigendum_version}"
29
- end
30
- end
31
- end
32
- end
@@ -1,41 +0,0 @@
1
- module Pubid::Iso
2
- class Russian < Identifier
3
- PUBLISHER = { "ISO" => "ИСО", "IEC" => "МЭК" }.freeze
4
- STAGE = { "FDIS" => "ОПМС",
5
- "DIS" => "ПМС",
6
- "NP" => "НП",
7
- "AWI" => "АВИ",
8
- "CD" => "КПК",
9
- "PD" => "ПД",
10
- "FPD" => "ФПД",
11
-
12
-
13
- }.freeze
14
- TYPE = { "Guide" => "Руководство",
15
- "TS" => "ТС",
16
- "TR" => "ТО",
17
- "ISP" => "ИСП",
18
- }.freeze
19
-
20
- def identifier(with_date, with_language_code)
21
- if @type == "Guide"
22
- "Руководство #{originator}#{stage} #{number}#{part}#{iteration}"\
23
- "#{with_date && rendered_year || ''}#{edition}#{supplements}#{language(with_language_code)}"
24
- else
25
- super
26
- end
27
- end
28
-
29
- def publisher
30
- PUBLISHER[@publisher]
31
- end
32
-
33
- def copublisher
34
- super&.map { |copublisher| PUBLISHER[copublisher] }
35
- end
36
-
37
- def stage
38
- "#{(@copublisher && ' ') || '/'}#{STAGE[@stage]}" if @stage
39
- end
40
- end
41
- end
data/lib/pubid/iso/urn.rb DELETED
@@ -1,128 +0,0 @@
1
- module Pubid::Iso
2
- class Urn < Identifier
3
-
4
- STAGES = { PWI: 0,
5
- NP: 10,
6
- AWI: 20,
7
- WD: 20.20,
8
- CD: 30,
9
- DIS: 40,
10
- FDIS: 50,
11
- PRF: 50,
12
- IS: 60 }.freeze
13
-
14
- def initialize(**opts)
15
- opts.each { |key, value| send("#{key}=", value) }
16
- end
17
-
18
- def to_s
19
- # docidentifier = originator [":" type] ":" docnumber [":" partnumber]
20
- # [[":" status] ":" edition]
21
- # [":" docversion] [":" language]
22
-
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
50
- end
51
-
52
- def part
53
- ":-#{@part}" if @part
54
- end
55
-
56
- def render_stage(stage)
57
- return ":stage-#{sprintf('%05.2f', stage)}#{iteration}" if stage.is_a?(Float)
58
-
59
- ":stage-#{sprintf('%05.2f', STAGES[stage.to_sym])}#{iteration}"
60
- end
61
-
62
- def stage
63
- return render_stage(@urn_stage) if @urn_stage
64
-
65
- return render_stage(@stage) if @stage
66
-
67
- return render_stage(@amendment_stage) if @amendment_stage
68
-
69
- render_stage(@corrigendum_stage) if @corrigendum_stage
70
- end
71
-
72
- def originator
73
- # originator = "iso" / "iso-iec" / "iso-cie" / "iso-astm" /
74
- # "iso-ieee" / "iec"
75
-
76
- if @copublisher
77
- @copublisher = [@copublisher] unless @copublisher.is_a?(Array)
78
- @publisher.downcase + @copublisher.map(&:to_s).sort.map do |copublisher|
79
- "-#{copublisher.downcase.gsub('/', '-')}"
80
- end.join
81
- else
82
- @publisher.downcase
83
- end
84
- end
85
-
86
- def edition
87
- ":ed-#{@edition}" if @edition
88
- end
89
-
90
- def iteration
91
- ".v#{@iteration}" if @iteration
92
- end
93
-
94
- def type
95
- # type = "data" / "guide" / "isp" / "iwa" /
96
- # "pas" / "r" / "tr" / "ts" / "tta"
97
- if @type
98
- ":#{@type.downcase}"
99
- end
100
- end
101
-
102
- def supplement
103
- result = ""
104
- if @amendment
105
- result += if @amendment_number
106
- ":amd:#{@amendment_number}:v#{@amendment_version}"
107
- else
108
- ":amd:#{@amendment_version}:v1"
109
- end
110
- end
111
- if @corrigendum
112
- result += if @corrigendum_number
113
- ":cor:#{@corrigendum_number}:v#{@corrigendum_version}"
114
- else
115
- ":cor:#{@corrigendum_version}:v1"
116
- end
117
- end
118
-
119
- result
120
- end
121
-
122
- def language
123
- if @language
124
- ":#{@language}"
125
- end
126
- end
127
- end
128
- end