pubid-iso 0.1.7 → 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: 821262e1b683c07f484d9102195fe832fd1eb00fb3a6b23f713893f081a527f3
4
- data.tar.gz: 105da964ba57e1c703bf4d77f485a3fc981660b218b4bf019376f937758a4f6c
3
+ metadata.gz: 583ae9e428707932e9c3bc08eb9b726ea3e1f90dbf8c9fdba05e7b12e98302a2
4
+ data.tar.gz: 2fc723a9027e6bd49c6643b07618dcb68d38295846488c2f34513260f145ca57
5
5
  SHA512:
6
- metadata.gz: 1e5fb2bdd1b05f02c788f4b546fa0f6b2054ef0ab01dd4b59961e8c92ccd063a95b655d04969062c2d3674ab7511058b22e7882e586c9ae00e666065592cc5d3
7
- data.tar.gz: d5ded0494dbf495d81da9a98b25d72ed90303a343159bbe4d30315d857ae19e0824437f0ebbb0e47371c6f89565b39ca9d4f08bdc5b4bc8358656f7a56b54795
6
+ metadata.gz: f623fd9c0dadc20861cfed1c9a8ed788f5a5122d50835913689c69df5e67b1671141f7ad09af16e1bfccc186bc7c6144104f44c911561c910dea7d9c5b6d715e
7
+ data.tar.gz: e48de733a3ade64447d41ddd29b170eb13c1c60281b4f1d5cc27882f64a710706e9df87c001a827fd0ccc082843b882b7c78c69b5ff9a57649c1234a5f3af66f
@@ -1,6 +1,5 @@
1
1
  module Pubid::Iso
2
2
  class Amendment < Supplement
3
-
4
3
  def render_pubid
5
4
  stage = render_pubid_stage
6
5
  stage += " " unless stage.size == 0
@@ -1,6 +1,5 @@
1
1
  module Pubid::Iso
2
2
  class Corrigendum < Supplement
3
-
4
3
  def render_pubid
5
4
  stage = render_pubid_stage
6
5
  stage += " " unless stage.size == 0
@@ -1,190 +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
7
+ :urn_stage, :dir, :dirtype, :supplement
10
8
 
11
- LANGUAGES = {
12
- "ru" => "R",
13
- "fr" => "F",
14
- "en" => "E",
15
- "ar" => "A",
16
- }.freeze
17
-
18
- def initialize(amendment: nil, amendment_number: nil, amendment_version: nil,
19
- amendment_stage: nil,
20
- corrigendum: nil, corrigendum_number: nil, corrigendum_version: nil,
21
- corrigendum_stage: nil, **opts)
22
- if amendment_version
23
- @amendment = Amendment.new(number: amendment_number,
24
- version: amendment_version,
25
- stage: amendment_stage)
26
- end
27
- if corrigendum_version
28
- @corrigendum = Corrigendum.new(number: corrigendum_number,
29
- version: corrigendum_version,
30
- stage: corrigendum_stage)
31
- end
32
-
33
- opts.each { |key, value| send("#{key}=", value.is_a?(Array) && value || value.to_s) }
34
- end
35
-
36
- def get_params
37
- instance_variables.map { |var| [var.to_s.gsub("@", "").to_sym, instance_variable_get(var)] }.to_h
38
- end
39
-
40
- def urn
41
- Urn.new(**get_params)
9
+ def initialize(**opts)
10
+ super
11
+ # if supplement
12
+ # @supplement = Supplement.new(number: supplement[:year],
13
+ # publisher: supplement[:publisher],
14
+ # edition: supplement[:edition])
15
+ # end
42
16
  end
43
17
 
44
18
  def self.parse_from_title(title)
45
19
  title.split.reverse.inject(title) do |acc, part|
46
20
  return parse(acc)
47
- rescue Pubid::Iso::Errors::ParseError
21
+ rescue Pubid::Core::Errors::ParseError
48
22
  # delete parts from the title until it's parseable
49
23
  acc.reverse.sub(part.reverse, "").reverse.strip
50
24
  end
51
25
  end
52
26
 
53
- def self.parse(code_or_params)
54
- params = code_or_params.is_a?(String) ? Parser.new.parse(code_or_params) : code_or_params
55
- # Parslet returns an array when match any copublisher
56
- # otherwise it's hash
57
- if params.is_a?(Array)
58
- new(
59
- **(
60
- params.inject({}) do |r, i|
61
- result = r
62
- i.map {|k, v| Transformer.new.apply(k => v).to_a.first }.each do |k, v|
63
- result = result.merge(k => r.key?(k) ? [v, r[k]] : v)
64
- end
65
- result
66
- end
67
- )
68
- )
69
- else
70
- new(**params.map do |k, v|
71
- Transformer.new.apply(k => v).to_a.first
72
- end.to_h)
27
+ class << self
28
+ def get_amendment_class
29
+ Pubid::Iso::Amendment
73
30
  end
74
- # merge values repeating keys into array (for copublishers)
75
31
 
76
-
77
- # params.to_h)
78
- rescue Parslet::ParseFailed => failure
79
- raise Pubid::Iso::Errors::ParseError, "#{failure.message}\ncause: #{failure.parse_failure_cause.ascii_tree}"
80
- end
81
-
82
- def to_s(lang: nil, with_date: true, with_language_code: :iso)
83
- # @pubid_language = lang
84
- case lang
85
- when :french
86
- French.new(**get_params)
87
- when :russian
88
- Russian.new(**get_params)
89
- else
90
- self
91
- end.identifier(with_date, with_language_code) + (@joint_document && "|#{@joint_document}").to_s
92
- end
93
-
94
- def identifier(with_date, with_language_code)
95
- if @tctype
96
- "#{originator} #{tctype} #{tcnumber}#{sctype}#{wgtype} N#{number}"
97
- else
98
- "#{originator}#{type}#{stage} #{number}#{part}#{iteration}"\
99
- "#{with_date && rendered_year || ''}#{edition}#{supplements}#{language(with_language_code)}"
32
+ def get_corrigendum_class
33
+ Pubid::Iso::Corrigendum
100
34
  end
101
- end
102
-
103
- def tctype
104
- return @tctype.join("/") if @tctype.is_a?(Array)
105
-
106
- @tctype
107
- end
108
35
 
109
- # TC 184/SC/WG 4 - no wg number
110
- # TC 184/SC 4/WG 12 - separate sc and wg number
111
- def sctype
112
- return unless @sctype
113
-
114
- if @wgnumber || !@wgtype
115
- "/#{@sctype} #{@scnumber}"
116
- else
117
- "/#{@sctype}"
36
+ def get_parser_class
37
+ Parser
118
38
  end
119
- end
120
39
 
121
- def wgtype
122
- return unless @wgtype
123
-
124
- if @wgnumber
125
- "/#{@wgtype} #{@wgnumber}"
126
- else
127
- "/#{@wgtype} #{@scnumber}"
40
+ def get_transformer_class
41
+ Transformer
128
42
  end
129
43
  end
130
44
 
131
- def copublisher
132
- return nil unless @copublisher
133
-
134
- (!@copublisher.is_a?(Array) && [@copublisher]) || @copublisher
45
+ def urn
46
+ (@tctype && Renderer::UrnTc || @dir && Renderer::UrnDir || Pubid::Core::Renderer::Urn).new(get_params).render
135
47
  end
136
48
 
137
- def originator
138
- if copublisher
139
- # @copublisher = [@copublisher] unless @copublisher.is_a?(Array)
140
- # @copublisher.map! { |copublisher| copublisher.sub("IEC", "CEI") } if @french
141
- publisher + copublisher.map(&:to_s).sort.map do |copublisher|
142
- "/#{copublisher.gsub('-', '/')}"
143
- end.join
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)
144
56
  else
145
- publisher
146
- end
147
- end
148
-
149
- def stage
150
- "#{(@copublisher && ' ') || '/'}#{@stage}" if @stage
151
- end
152
-
153
- def part
154
- "-#{@part}" if @part
155
- end
156
-
157
- def rendered_year
158
- @year && ":#{@year}"
159
- end
160
-
161
- def type
162
- "#{(@copublisher && ' ') || '/'}#{@type}" if @type
163
- end
164
-
165
- def edition
166
- " ED#{@edition}" if @edition
167
- end
168
-
169
- def iteration
170
- ".#{@iteration}" if @iteration
171
- end
172
-
173
- def supplements
174
- result = @amendment&.version && @amendment.render_pubid || ""
175
-
176
- result + (@corrigendum&.version && @corrigendum.render_pubid || "")
177
- end
178
-
179
- def language(with_language_code = :iso)
180
- if @language
181
- if with_language_code == :single
182
- "(#{LANGUAGES[@language]})"
57
+ if @tctype
58
+ Renderer::Tc.new(get_params)
59
+ elsif @dir
60
+ Renderer::Dir.new(get_params)
183
61
  else
184
- "(#{@language})"
62
+ self.class.get_renderer_class.new(get_params)
185
63
  end
186
- 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
187
68
  end
188
-
189
69
  end
190
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
@@ -1,37 +1,24 @@
1
1
  module Pubid::Iso
2
- class Supplement
3
- attr_accessor :version, :number, :stage
2
+ class Supplement < Pubid::Core::Supplement
3
+ attr_accessor :stage, :publisher, :edition
4
4
 
5
- def initialize(version:, number:, stage: nil)
6
- @version, @number, @stage = version, number, stage
7
- end
8
-
9
- def ==(other)
10
- other.version == version && (number.nil? || other.number == number) && (stage.nil? || other.stage == stage)
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
11
10
  end
12
11
 
13
12
  def render_pubid_stage
14
13
  ((@stage && @stage) || "")
15
14
  end
16
15
 
17
- def render_pubid_number
18
- if @number
19
- "#{@version}:#{@number}"
20
- else
21
- "#{@version}"
22
- end
23
- end
24
-
25
16
  def render_urn_stage
26
- ((@stage && ":stage-#{sprintf('%05.2f', Urn::STAGES[@stage.to_sym])}") || "")
17
+ ((@stage && ":stage-#{sprintf('%05.2f', Pubid::Core::Renderer::Urn::STAGES[@stage.to_sym])}") || "")
27
18
  end
28
19
 
29
- def render_urn_number
30
- if @number
31
- ":#{@number}:v#{@version}"
32
- else
33
- ":#{@version}:v1"
34
- end
20
+ def <=>(other)
21
+ (super == 0) && ((stage.nil? || stage == other.stage) && 0 || -1) || super
35
22
  end
36
23
  end
37
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.7".freeze
3
+ VERSION = "0.1.8".freeze
4
4
  end
5
5
  end
data/lib/pubid/iso.rb CHANGED
@@ -8,6 +8,7 @@ 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,6 +16,9 @@ require_relative "iso/supplement"
15
16
  require_relative "iso/amendment"
16
17
  require_relative "iso/corrigendum"
17
18
  require_relative "iso/identifier"
18
- require_relative "iso/identifier/french"
19
- require_relative "iso/identifier/russian"
20
- 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.7
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-06-02 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
@@ -111,12 +125,15 @@ files:
111
125
  - lib/pubid/iso/corrigendum.rb
112
126
  - lib/pubid/iso/errors.rb
113
127
  - lib/pubid/iso/identifier.rb
114
- - lib/pubid/iso/identifier/french.rb
115
- - lib/pubid/iso/identifier/russian.rb
116
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
117
135
  - lib/pubid/iso/supplement.rb
118
136
  - lib/pubid/iso/transformer.rb
119
- - lib/pubid/iso/urn.rb
120
137
  - lib/pubid/iso/version.rb
121
138
  homepage: https://github.com/metanorma/pubid-iso
122
139
  licenses:
@@ -1,24 +0,0 @@
1
- module Pubid::Iso
2
- class French < Identifier
3
- def initialize(**opts)
4
- opts.each { |key, value| send("#{key}=", value) }
5
- end
6
-
7
- def identifier(with_date, with_language_code)
8
- if @type == "Guide"
9
- "Guide #{originator}#{stage} #{number}#{part}#{iteration}"\
10
- "#{with_date && rendered_year || ''}#{edition}#{supplements}#{language(with_language_code)}"
11
- else
12
- super
13
- end
14
- end
15
-
16
- def copublisher
17
- super.map { |copublisher| copublisher.sub("IEC", "CEI") }
18
- end
19
-
20
- def supplements
21
- super.gsub(" ", ".")
22
- end
23
- end
24
- end
@@ -1,49 +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 initialize(**opts)
21
- opts.each { |key, value| send("#{key}=", value) }
22
- end
23
-
24
- def identifier(with_date, with_language_code)
25
- if @type == "Guide"
26
- "Руководство #{originator}#{stage} #{number}#{part}#{iteration}"\
27
- "#{with_date && rendered_year || ''}#{edition}#{supplements}#{language(with_language_code)}"
28
- else
29
- super
30
- end
31
- end
32
-
33
- def publisher
34
- PUBLISHER[@publisher]
35
- end
36
-
37
- def copublisher
38
- super&.map { |copublisher| PUBLISHER[copublisher] }
39
- end
40
-
41
- def stage
42
- "#{(@copublisher && ' ') || '/'}#{STAGE[@stage]}" if @stage
43
- end
44
-
45
- def supplements
46
- super.gsub(" ", ".")
47
- end
48
- end
49
- end
data/lib/pubid/iso/urn.rb DELETED
@@ -1,114 +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
- render_stage(@corrigendum_stage) if @corrigendum_stage
68
- end
69
-
70
- def originator
71
- # originator = "iso" / "iso-iec" / "iso-cie" / "iso-astm" /
72
- # "iso-ieee" / "iec"
73
-
74
- if @copublisher
75
- @copublisher = [@copublisher] unless @copublisher.is_a?(Array)
76
- @publisher.downcase + @copublisher.map(&:to_s).sort.map do |copublisher|
77
- "-#{copublisher.downcase.gsub('/', '-')}"
78
- end.join
79
- else
80
- @publisher.downcase
81
- end
82
- end
83
-
84
- def edition
85
- ":ed-#{@edition}" if @edition
86
- end
87
-
88
- def iteration
89
- ".v#{@iteration}" if @iteration
90
- end
91
-
92
- def type
93
- # type = "data" / "guide" / "isp" / "iwa" /
94
- # "pas" / "r" / "tr" / "ts" / "tta"
95
- if @type
96
- ":#{@type.downcase}"
97
- end
98
- end
99
-
100
- def supplement
101
- result = @amendment&.render_urn || ""
102
-
103
- result += @corrigendum&.render_urn || ""
104
-
105
- result
106
- end
107
-
108
- def language
109
- if @language
110
- ":#{@language}"
111
- end
112
- end
113
- end
114
- end