pubid-iso 0.1.5 → 0.1.8

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: d0daa77a77b864f2c4799226d5a5d458a3a852ba5321bf243f5415082ca66d52
4
- data.tar.gz: 2efd25c20e35d80cd14a2f286e435eab2d017a295b08fb16f7c05ff079fe8986
3
+ metadata.gz: 583ae9e428707932e9c3bc08eb9b726ea3e1f90dbf8c9fdba05e7b12e98302a2
4
+ data.tar.gz: 2fc723a9027e6bd49c6643b07618dcb68d38295846488c2f34513260f145ca57
5
5
  SHA512:
6
- metadata.gz: e740022023d24557f1650de284b22411176ac4fb09d6ecac8bb8c3a69a328dcaeeb79aadc0c3a5644840fadd1167699a010039dbedd5f5412f82387a7566c88c
7
- data.tar.gz: 3d7437f44ed7e4fc6496b315d30940ea79bb3e4e275ea1bb1f973fe2a7927c339ec57758a90494a27afcba71c266dae4bf1d9cd61a7002a4e9bdb515e9ca6a49
6
+ metadata.gz: f623fd9c0dadc20861cfed1c9a8ed788f5a5122d50835913689c69df5e67b1671141f7ad09af16e1bfccc186bc7c6144104f44c911561c910dea7d9c5b6d715e
7
+ data.tar.gz: e48de733a3ade64447d41ddd29b170eb13c1c60281b4f1d5cc27882f64a710706e9df87c001a827fd0ccc082843b882b7c78c69b5ff9a57649c1234a5f3af66f
@@ -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,192 +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)
28
- end
29
-
30
- def self.parse(code_or_params)
31
- params = code_or_params.is_a?(String) ? Parser.new.parse(code_or_params) : code_or_params
32
- # Parslet returns an array when match any copublisher
33
- # otherwise it's hash
34
- if params.is_a?(Array)
35
- new(
36
- **(
37
- params.inject({}) do |r, i|
38
- result = r
39
- i.map {|k, v| Transformer.new.apply(k => v).to_a.first }.each do |k, v|
40
- result = result.merge(k => r.key?(k) ? [v, r[k]] : v)
41
- end
42
- result
43
- end
44
- )
45
- )
46
- else
47
- new(**params.map do |k, v|
48
- Transformer.new.apply(k => v).to_a.first
49
- end.to_h)
10
+ super
11
+ # if supplement
12
+ # @supplement = Supplement.new(number: supplement[:year],
13
+ # publisher: supplement[:publisher],
14
+ # edition: supplement[:edition])
15
+ # end
16
+ end
17
+
18
+ def self.parse_from_title(title)
19
+ title.split.reverse.inject(title) do |acc, part|
20
+ return parse(acc)
21
+ rescue Pubid::Core::Errors::ParseError
22
+ # delete parts from the title until it's parseable
23
+ acc.reverse.sub(part.reverse, "").reverse.strip
50
24
  end
51
- # merge values repeating keys into array (for copublishers)
52
-
53
-
54
- # params.to_h)
55
- rescue Parslet::ParseFailed => failure
56
- raise Pubid::Iso::Errors::ParseError, "#{failure.message}\ncause: #{failure.parse_failure_cause.ascii_tree}"
57
25
  end
58
26
 
59
- def to_s(lang: nil, with_date: true, with_language_code: :iso)
60
- # @pubid_language = lang
61
- case lang
62
- when :french
63
- French.new(**get_params)
64
- when :russian
65
- Russian.new(**get_params)
66
- else
67
- self
68
- end.identifier(with_date, with_language_code) + (@joint_document && "|#{@joint_document}").to_s
69
- end
70
-
71
- def identifier(with_date, with_language_code)
72
- if @tctype
73
- "#{originator} #{tctype} #{tcnumber}#{sctype}#{wgtype} N#{number}"
74
- else
75
- "#{originator}#{type}#{stage} #{number}#{part}#{iteration}"\
76
- "#{with_date && rendered_year || ''}#{edition}#{supplements}#{language(with_language_code)}"
27
+ class << self
28
+ def get_amendment_class
29
+ Pubid::Iso::Amendment
77
30
  end
78
- end
79
-
80
- def tctype
81
- return @tctype.join("/") if @tctype.is_a?(Array)
82
-
83
- @tctype
84
- end
85
-
86
- # TC 184/SC/WG 4 - no wg number
87
- # TC 184/SC 4/WG 12 - separate sc and wg number
88
- def sctype
89
- return unless @sctype
90
31
 
91
- if @wgnumber || !@wgtype
92
- "/#{@sctype} #{@scnumber}"
93
- else
94
- "/#{@sctype}"
32
+ def get_corrigendum_class
33
+ Pubid::Iso::Corrigendum
95
34
  end
96
- end
97
35
 
98
- def wgtype
99
- return unless @wgtype
100
-
101
- if @wgnumber
102
- "/#{@wgtype} #{@wgnumber}"
103
- else
104
- "/#{@wgtype} #{@scnumber}"
36
+ def get_parser_class
37
+ Parser
105
38
  end
106
- end
107
-
108
- def copublisher
109
- return nil unless @copublisher
110
-
111
- (!@copublisher.is_a?(Array) && [@copublisher]) || @copublisher
112
- end
113
39
 
114
- def originator
115
- if copublisher
116
- # @copublisher = [@copublisher] unless @copublisher.is_a?(Array)
117
- # @copublisher.map! { |copublisher| copublisher.sub("IEC", "CEI") } if @french
118
- publisher + copublisher.map(&:to_s).sort.map do |copublisher|
119
- "/#{copublisher.gsub('-', '/')}"
120
- end.join
121
- else
122
- publisher
40
+ def get_transformer_class
41
+ Transformer
123
42
  end
124
43
  end
125
44
 
126
- def stage
127
- "#{(@copublisher && ' ') || '/'}#{@stage}" if @stage
128
- end
129
-
130
- def part
131
- "-#{@part}" if @part
132
- end
133
-
134
- def rendered_year
135
- @year && ":#{@year}"
136
- end
137
-
138
- def type
139
- "#{(@copublisher && ' ') || '/'}#{@type}" if @type
140
- end
141
-
142
- def edition
143
- " ED#{@edition}" if @edition
144
- end
145
-
146
- def iteration
147
- ".#{@iteration}" if @iteration
148
- end
149
-
150
- def amendment
151
- if @amendment_number
152
- "Amd #{@amendment_version}:#{@amendment_number}"
153
- else
154
- "Amd #{@amendment_version}"
155
- end
45
+ def urn
46
+ (@tctype && Renderer::UrnTc || @dir && Renderer::UrnDir || Pubid::Core::Renderer::Urn).new(get_params).render
156
47
  end
157
48
 
158
- def corrigendum
159
- if @corrigendum_number
160
- "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)
161
56
  else
162
- "Cor #{@corrigendum_version}"
163
- end
164
- end
165
-
166
- def supplements
167
- result = ""
168
- if @amendment_version
169
- result += (@amendment_stage && "/#{@amendment_stage} ") || "/"
170
- result += amendment
171
- end
172
-
173
- if @corrigendum_version
174
- result += (@corrigendum_stage && "/#{@corrigendum_stage} ") || "/"
175
- result += corrigendum
176
- end
177
-
178
- result
179
- end
180
-
181
- def language(with_language_code = :iso)
182
- if @language
183
- if with_language_code == :single
184
- "(#{LANGUAGES[@language]})"
57
+ if @tctype
58
+ Renderer::Tc.new(get_params)
59
+ elsif @dir
60
+ Renderer::Dir.new(get_params)
185
61
  else
186
- "(#{@language})"
62
+ self.class.get_renderer_class.new(get_params)
187
63
  end
188
- 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
189
68
  end
190
-
191
69
  end
192
70
  end
@@ -1,31 +1,7 @@
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
6
  str("NP") | str("WD") | str("CD") | str("DIS") | str("FDIS") | str("PRF") |
31
7
  str("IS") | str("AWI") | str("PWI") |
@@ -35,18 +11,9 @@ module Pubid::Iso
35
11
  end
36
12
  end
37
13
 
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
14
  rule(:type) do
48
15
  (
49
- Russian::TYPE.values.reduce(
16
+ Renderer::Russian::TYPE.values.reduce(
50
17
  str("DATA") | str("ISP") | str("IWA") | str("R") | str("TTA") |
51
18
  str("TS") | str("TR") | str("PAS") | str("Guide") | str("GUIDE")) do |acc, type|
52
19
  acc | str(type)
@@ -76,22 +43,13 @@ module Pubid::Iso
76
43
  str("CSC/SP") | str("CSC/FIN") | str("JAG")
77
44
  end
78
45
 
79
- rule(:year) do
80
- match('\d').repeat(4, 4).as(:year)
81
- end
82
-
83
46
  rule(:part) do
84
47
  (str("-") | str("/")) >> space? >>
85
48
  (str("Amd") | str("Cor")).absent? >> (match['[\dA-Z]'] | str("-")).repeat(1).as(:part)
86
49
  end
87
50
 
88
- rule(:originator) do
89
- organization.as(:publisher) >>
90
- (space? >> str("/") >> organization.as(:copublisher)).repeat
91
- end
92
-
93
51
  rule(:organization) do
94
- Russian::PUBLISHER.values.reduce(
52
+ Renderer::Russian::PUBLISHER.values.reduce(
95
53
  str("IEC") | str("IEEE") | str("CIW") | str("SAE") |
96
54
  str("CIE") | str("ASME") | str("ASTM") | str("OECD") | str("ISO") |
97
55
  str("IWA") | str("HL7") | str("CEI")) do |acc, publisher|
@@ -109,21 +67,21 @@ module Pubid::Iso
109
67
  end
110
68
 
111
69
  rule(:amendment) do
112
- (str("/") >> stage.as(:amendment_stage)).maybe >>
70
+ ((str("/") >> stage.as(:stage)).maybe >>
113
71
  (str("/") | space).maybe >>
114
- (str("Amd") | str("AMD") | str("AM")).as(:amendment) >>
72
+ (str("Amd") | str("AMD") | str("AM")) >>
115
73
  (space | str(".")) >>
116
- digits.as(:amendment_version) >>
117
- (str(":") >> digits.as(:amendment_number)).maybe
74
+ digits.as(:version) >>
75
+ (str(":") >> digits.as(:number)).maybe).as(:amendments)
118
76
  end
119
77
 
120
78
  rule(:corrigendum) do
121
- (str("/") >> stage.as(:corrigendum_stage)).maybe >>
79
+ ((str("/") >> stage.as(:stage)).maybe >>
122
80
  (str("/") | space).maybe >>
123
- (str("Cor") | str("COR")).as(:corrigendum) >>
81
+ (str("Cor") | str("COR")) >>
124
82
  (space | str(".")) >>
125
- digits.as(:corrigendum_version) >>
126
- (str(":") >> digits.as(:corrigendum_number)).maybe
83
+ digits.as(:version) >>
84
+ (str(":") >> digits.as(:number)).maybe).as(:corrigendums)
127
85
  end
128
86
 
129
87
  rule(:language) do
@@ -148,7 +106,20 @@ module Pubid::Iso
148
106
  wgtype.as(:wgtype) >> space >> digits.as(:wgnumber)) |
149
107
  (sctype.as(:sctype) >> (space | str("/") >> wgtype.as(:wgtype) >> space) >> digits.as(:scnumber))
150
108
  )).maybe >>
151
- str(" N") >> space? >> digits.as(:number)
109
+ space >> str("N") >> space? >> digits.as(:number)
110
+ end
111
+
112
+ rule(:dir_supplement_edition) do
113
+ space >> (str("Edition") | str("Ed")) >> space >> digits.as(:edition)
114
+ end
115
+
116
+ rule(:dir_document_body) do
117
+ ((str("DIR") | str("Directives Part") | str("Directives, Part") | str("Directives,")).as(:dir) >> space).maybe >>
118
+ (str("JTC").as(:dirtype) >> space).maybe >>
119
+ (digits.as(:number) >> (str(":") >> year).maybe).maybe >>
120
+ (str(" -- Consolidated").maybe >> (space? >> (organization.as(:publisher) >> space).maybe >>
121
+ (str("SUP") | str("Supplement")) >> (str(":") >> year).maybe >>
122
+ dir_supplement_edition.maybe).as(:supplement)).maybe
152
123
  end
153
124
 
154
125
  rule(:std_document_body) do
@@ -176,7 +147,8 @@ module Pubid::Iso
176
147
  (guide_prefix.as(:type) >> space).maybe >>
177
148
  (stage.as(:stage) >> space).maybe >>
178
149
  originator >> (space | str("/")) >>
179
- (tc_document_body | std_document_body)
150
+ (tc_document_body | std_document_body | (dir_document_body >>
151
+ (str(" + ") >> (originator >> space >> dir_document_body).as(:joint_document)).maybe))
180
152
  end
181
153
 
182
154
  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,12 +62,33 @@ 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
@@ -1,5 +1,5 @@
1
1
  module Pubid
2
2
  module Iso
3
- VERSION = "0.1.5".freeze
3
+ VERSION = "0.1.8".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.5
4
+ version: 0.1.8
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-05-26 00:00:00.000000000 Z
11
+ date: 2022-07-20 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