pubid-iso 0.1.5 → 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: 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