pubid-iso 0.1.6 → 0.1.9

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: 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