pubid-iso 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml 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