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 +4 -4
- data/lib/pubid/iso/amendment.rb +13 -0
- data/lib/pubid/iso/corrigendum.rb +13 -0
- data/lib/pubid/iso/identifier.rb +38 -169
- data/lib/pubid/iso/parser.rb +34 -59
- data/lib/pubid/iso/renderer/dir.rb +33 -0
- data/lib/pubid/iso/renderer/french.rb +24 -0
- data/lib/pubid/iso/renderer/russian.rb +61 -0
- data/lib/pubid/iso/renderer/tc.rb +30 -0
- data/lib/pubid/iso/renderer/urn-dir.rb +35 -0
- data/lib/pubid/iso/renderer/urn-tc.rb +24 -0
- data/lib/pubid/iso/supplement.rb +24 -0
- data/lib/pubid/iso/transformer.rb +38 -9
- data/lib/pubid/iso/version.rb +1 -1
- data/lib/pubid/iso.rb +10 -3
- metadata +25 -5
- data/lib/pubid/iso/identifier/french.rb +0 -32
- data/lib/pubid/iso/identifier/russian.rb +0 -41
- data/lib/pubid/iso/urn.rb +0 -128
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b09b867ebc673153defa32f6987a1f6337895789069e76388d8791cb9c8f2545
|
4
|
+
data.tar.gz: caa42c15191fca2b22905524f8ffa8765e137b4fb8fa96b693eec8626e3d46f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/lib/pubid/iso/identifier.rb
CHANGED
@@ -1,201 +1,70 @@
|
|
1
1
|
module Pubid::Iso
|
2
|
-
class Identifier
|
3
|
-
attr_accessor :
|
4
|
-
:
|
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
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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::
|
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
|
-
|
40
|
-
|
41
|
-
|
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
|
-
|
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
|
-
|
111
|
-
|
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
|
-
|
124
|
-
|
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
|
136
|
-
|
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
|
168
|
-
|
169
|
-
|
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
|
-
|
172
|
-
|
173
|
-
|
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
|
-
|
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
|
data/lib/pubid/iso/parser.rb
CHANGED
@@ -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
|
-
|
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("
|
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(:
|
71
|
+
((str("/") >> stage.as(:stage)).maybe >>
|
113
72
|
(str("/") | space).maybe >>
|
114
|
-
(str("Amd") | str("AMD") | str("AM"))
|
115
|
-
|
116
|
-
|
117
|
-
|
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(:
|
81
|
+
((str("/") >> stage.as(:stage)).maybe >>
|
122
82
|
(str("/") | space).maybe >>
|
123
|
-
(str("Cor") | str("COR"))
|
124
|
-
|
125
|
-
|
126
|
-
|
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("
|
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(
|
12
|
-
|
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(
|
16
|
-
|
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"
|
data/lib/pubid/iso/version.rb
CHANGED
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/
|
16
|
-
require_relative "iso/
|
17
|
-
require_relative "iso/
|
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.
|
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-
|
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
|