metanorma-iso 2.3.2 → 2.3.4

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.
@@ -34,153 +34,158 @@ module Metanorma
34
34
  "95": "Withdrawal",
35
35
  }.freeze
36
36
 
37
- def stage_abbr(stage, substage, doctype)
37
+ def stage_abbr(stage, substage, _doctype)
38
38
  return nil if stage.to_i > 60
39
39
 
40
40
  ret = STAGE_ABBRS[stage.to_sym]
41
41
  ret = "PRF" if stage == "60" && substage == "00"
42
+ ret = nil if stage == "60" && substage != "00"
42
43
  ret = "AWI" if stage == "10" && substage == "99"
43
44
  ret = "AWI" if stage == "20" && substage == "00"
44
- if %w(amendment technical-corrigendum technical-report
45
- technical-specification).include?(doctype)
46
- ret = "D" if stage == "40" && doctype == "amendment"
47
- ret = "FD" if stage == "50" && %w(amendment technical-corrigendum)
48
- .include?(doctype)
49
- end
50
- ret
51
- end
52
-
53
- def stage_name(stage, substage, _doctype, iteration = nil)
54
- return "Proof" if stage == "60" && substage == "00"
55
-
56
- ret = STAGE_NAMES[stage.to_sym]
57
- if iteration && %w(20 30).include?(stage)
58
- prefix = iteration.to_i.localize(@lang.to_sym)
59
- .to_rbnf_s("SpelloutRules", "spellout-ordinal")
60
- ret = "#{prefix.capitalize} #{ret.downcase}"
61
- end
62
45
  ret
63
46
  end
64
47
 
65
48
  def metadata_id(node, xml)
66
49
  iso_id(node, xml)
67
- node&.attr("tc-docnumber")&.split(/,\s*/)&.each do |n|
50
+ node.attr("tc-docnumber")&.split(/,\s*/)&.each do |n|
68
51
  xml.docidentifier(n, **attr_code(type: "iso-tc"))
69
52
  end
70
53
  xml.docnumber node&.attr("docnumber")
71
54
  end
72
55
 
56
+ # @param type [nil, :tr, :ts, :amd, :cor, :guide, :dir, :tc, Type]
57
+ # document's type, eg. :tr, :ts, :amd, :cor, Type.new(:tr)
58
+ def get_typeabbr(node, amd: false)
59
+ node.attr("amendment-number") and return :amd
60
+ node.attr("corrigendum-number") and return :cor
61
+ case doctype(node)
62
+ when "directive" then :dir
63
+ when "technical-report" then :tr
64
+ when "technical-specification" then :ts
65
+ when "guide" then :guide
66
+ end
67
+ end
68
+
73
69
  def iso_id(node, xml)
74
70
  (!@amd && node.attr("docnumber")) || (@amd && node.attr("updates")) or
75
71
  return
76
- dn = id_stage_prefix(iso_id1(node), node)
77
- dns = [id_year(dn, node, mode: :default),
78
- id_year(dn, node, mode: :force),
79
- id_year(dn, node, mode: :strip)]
80
- iso_id_out(node, xml, dns)
72
+ params = iso_id_params(node)
73
+ iso_id_out(xml, params, true)
81
74
  end
82
75
 
83
- def iso_id_out(node, xml, dns)
84
- xml.docidentifier dns[0], **attr_code(type: "ISO")
85
- xml.docidentifier dns[2], **attr_code(type: "iso-undated")
86
- xml.docidentifier(id_langsuffix(dns[0], node),
87
- **attr_code(type: "iso-with-lang"))
88
- xml.docidentifier(id_langsuffix(dns[1], node),
89
- **attr_code(type: "iso-reference"))
76
+ def iso_id_params(node)
77
+ params = iso_id_params_core(node)
78
+ params2 = iso_id_params_add(node)
79
+ if node.attr("updates")
80
+ orig_id = Pubid::Iso::Identifier::Base.parse(node.attr("updates"))
81
+ orig_id.edition ||= 1
82
+ end
83
+ iso_id_params_resolve(params, params2, node, orig_id)
84
+ end
85
+
86
+ # unpublished is for internal use
87
+ def iso_id_params_core(node)
88
+ pub = (node.attr("publisher") || "ISO").split(/[;,]/)
89
+ ret = { number: node.attr("docnumber"),
90
+ part: node.attr("partnumber"),
91
+ language: node.attr("language") || "en",
92
+ type: get_typeabbr(node),
93
+ publisher: pub[0],
94
+ unpublished: /^[0-5]/.match?(get_stage(node)),
95
+ copublisher: pub[1..-1] }.compact
96
+ ret[:copublisher].empty? and ret.delete(:copublisher)
97
+ ret
90
98
  end
91
99
 
92
- def get_typeabbr(node, amd: false)
93
- case doctype(node)
94
- when "directive" then "DIR "
95
- when "technical-report" then "TR "
96
- when "technical-specification" then "TS "
97
- when "amendment" then (amd ? "Amd " : "")
98
- when "technical-corrigendum" then (amd ? "Cor " : "")
99
- end
100
+ def iso_id_params_add(node)
101
+ stage = iso_id_stage(node)
102
+
103
+ ret = { number: node.attr("amendment-number") ||
104
+ node.attr("corrigendum-number"),
105
+ year: iso_id_year(node),
106
+ iteration: node.attr("iteration") }.compact
107
+ stage and ret[:stage] = stage
108
+ ret[:stage] == "60.00" and ret[:stage] = :PRF
109
+ ret
100
110
  end
101
111
 
102
- =begin
103
- def get_typeabbr(node, amd: false)
104
- case doctype(node)
105
- when "directive" then "DIR"
106
- when "technical-report" then "TR"
107
- when "technical-specification" then "TS"
108
- else nil
112
+ def iso_id_stage(node)
113
+ stage = stage_abbr(get_stage(node), get_substage(node),
114
+ doctype(node))
115
+ harmonised = "#{get_stage(node)}.#{get_substage(node)}"
116
+ harmonised = nil unless /^\d\d\.\d\d/.match?(harmonised)
117
+ { abbr: stage&.to_sym, harmonized_code: harmonised }
118
+ harmonised || stage&.to_sym
119
+ end
120
+
121
+ def iso_id_year(node)
122
+ node.attr("copyright-year") || node.attr("updated-date")
123
+ &.sub(/-.*$/, "") || Date.today.year
124
+ end
125
+
126
+ def iso_id_params_resolve(params, params2, node, orig_id)
127
+ if orig_id && (node.attr("amendment-number") ||
128
+ node.attr("corrigendum-number"))
129
+ params.delete(:unpublished)
130
+ params.delete(:part)
131
+ params2[:base] = orig_id
109
132
  end
133
+ params.merge!(params2)
134
+ params
110
135
  end
111
136
 
112
- def iso_id(node, xml)
113
- (!@amd && node.attr("docnumber")) || (@amd && node.attr("updates")) or
114
- return
115
- stage = id_stage_abbr(get_stage(node), get_substage(node), node, true)&.strip
116
- stage = nil if %w{IS (Review) (Withdrwal)}.include?(stage.strip)
117
- urn_stage = "#{get_stage(node)}.#{get_substage(node)}"
118
- pub = (node.attr("publisher") || "ISO").split(/[;,]/)
119
- params = {
120
- number: node.attr("docnumber"), # (@amd ? node.attr("updates") : node.attr("docnumber")),
121
- part: node.attr("partnumber"),
122
- language: node.attr("language") || "en",
123
- type: get_typeabbr(node),
124
- year: node.attr("copyright-year") || node.attr("updated-date")&.sub(/-.*$/, ""),
125
- publisher: pub[0],
126
- copublisher: pub[1..-1],
127
- }.compact
128
- if a = node.attr("amendment-number")
129
- params[:amendments] = { number: a, stage: stage }
130
- elsif a = node.attr("corrigendum-number")
131
- params[:corrigendums] = { number: a, stage: stage }
132
- else
133
- params.merge!( { stage: stage, urn_stage: urn_stage }.compact )
134
- end
135
- iso_id_out(xml, params)
137
+ def iso_id_out(xml, params, with_prf)
138
+ xml.docidentifier iso_id_default(params).to_s(with_prf: with_prf),
139
+ **attr_code(type: "ISO")
140
+ xml.docidentifier iso_id_reference(params)
141
+ .to_s(format: :ref_num_long, with_prf: with_prf),
142
+ **attr_code(type: "iso-reference")
143
+ xml.docidentifier iso_id_reference(params).urn, **attr_code(type: "URN")
144
+ return if @amd
145
+
146
+ xml.docidentifier iso_id_undated(params).to_s(with_prf: with_prf),
147
+ **attr_code(type: "iso-undated")
148
+ xml.docidentifier iso_id_with_lang(params)
149
+ .to_s(format: :ref_num_short, with_prf: with_prf),
150
+ **attr_code(type: "iso-with-lang")
151
+ rescue StandardError => e
152
+ clean_abort("Document identifier: #{e}", xml)
136
153
  end
137
154
 
138
- def iso_id_out(xml, params)
155
+ def iso_id_default(params)
139
156
  params_nolang = params.dup.tap { |hs| hs.delete(:language) }
140
- unpub = /^[0-5]/.match?(params[:urn_stage])
141
- params1 = unpub ? params_nolang.dup.tap { |hs| hs.delete(:year) } : params_nolang
142
- xml.docidentifier Pubid::Iso::Identifier.new(**params1), **attr_code(type: "ISO")
143
- params2 = params_nolang.dup.tap { |hs| hs.delete(:year) }
144
- xml.docidentifier Pubid::Iso::Identifier.new(**params2), **attr_code(type: "iso-undated")
145
- params1 = unpub ? params.dup.tap { |hs| hs.delete(:year) } : params
146
- xml.docidentifier(Pubid::Iso::Identifier.new(**params1),
147
- **attr_code(type: "iso-with-lang"))
148
- warn params
149
- warn "Generated: #{Pubid::Iso::Identifier.new(**params).to_s}"
150
- xml.docidentifier(Pubid::Iso::Identifier.new(**params),
151
- **attr_code(type: "iso-reference"))
157
+ params1 = if params[:unpublished]
158
+ params_nolang.dup.tap do |hs|
159
+ hs.delete(:year)
160
+ end
161
+ else params_nolang
162
+ end
163
+ params1.delete(:unpublished)
164
+ Pubid::Iso::Identifier.create(**params1)
152
165
  end
153
- =end
154
166
 
155
- def iso_id1(node)
156
- if @amd
157
- dn = node.attr("updates")
158
- add_amd_parts(dn, node)
159
- else
160
- part, subpart = node&.attr("partnumber")&.split(/-/)
161
- add_id_parts(node.attr("docnumber"), part, subpart)
167
+ def iso_id_undated(params)
168
+ params_nolang = params.dup.tap { |hs| hs.delete(:language) }
169
+ params2 = params_nolang.dup.tap do |hs|
170
+ hs.delete(:year)
171
+ hs.delete(:unpublished)
162
172
  end
173
+ Pubid::Iso::Identifier.create(**params2)
163
174
  end
164
175
 
165
- def add_amd_parts(docnum, node)
166
- case doctype(node)
167
- when "amendment"
168
- "#{docnum}/Amd #{node.attr('amendment-number')}"
169
- when "technical-corrigendum"
170
- "#{docnum}/Cor.#{node.attr('corrigendum-number')}"
171
- end
176
+ def iso_id_with_lang(params)
177
+ params1 = if params[:unpublished]
178
+ params.dup.tap do |hs|
179
+ hs.delete(:year)
180
+ end
181
+ else params end
182
+ params1.delete(:unpublished)
183
+ Pubid::Iso::Identifier.create(**params1)
172
184
  end
173
185
 
174
- def id_langsuffix(docnum, node)
175
- lang = node.attr("language") || "en"
176
- suffix = case lang
177
- when "en" then "(E)"
178
- when "fr" then "(F)"
179
- when "ru" then "(R)"
180
- else
181
- "(X)"
182
- end
183
- "#{docnum}#{suffix}"
186
+ def iso_id_reference(params)
187
+ params1 = params.dup.tap { |hs| hs.delete(:unpublished) }
188
+ Pubid::Iso::Identifier.create(**params1)
184
189
  end
185
190
 
186
191
  def structured_id(node, xml)
@@ -197,83 +202,6 @@ pub = (node.attr("publisher") || "ISO").split(/[;,]/)
197
202
  end
198
203
  end
199
204
 
200
- def add_id_parts(docnum, part, subpart)
201
- docnum += "-#{part}" if part
202
- docnum += "-#{subpart}" if subpart
203
- docnum
204
- end
205
-
206
- def id_stage_abbr(stage, substage, node, bare = false)
207
- ret = id_stage_abbr1(stage, substage, node, bare)
208
- if %w(amendment technical-corrigendum technical-report
209
- technical-specification).include?(doctype(node)) &&
210
- !%w(D FD).include?(ret)
211
- ret = "#{ret} "
212
- end
213
- ret
214
- end
215
-
216
- def id_stage_abbr1(stage, substage, node, bare)
217
- if bare
218
- IsoDoc::Iso::Metadata.new("en", "Latn", nil, @i18n)
219
- .status_abbrev(stage_abbr(stage, substage, doctype(node)),
220
- substage, nil, nil, doctype(node))
221
- else
222
- IsoDoc::Iso::Metadata.new("en", "Latn", nil, @i18n)
223
- .status_abbrev(stage_abbr(stage, substage, doctype(node)),
224
- substage, node.attr("iteration"),
225
- node.attr("draft"), doctype(node))
226
- end
227
- end
228
-
229
- def cover_stage_abbr(node)
230
- stage = get_stage(node)
231
- abbr = id_stage_abbr(get_stage(node), get_substage(node), node, true)
232
- typeabbr = get_typeabbr(node, amd: true)
233
- if stage.to_i > 50 || (stage.to_i == 60 && get_substage(node).to_i < 60)
234
- typeabbr = ""
235
- end
236
- "#{abbr}#{typeabbr}".strip
237
- end
238
-
239
- def id_stage_prefix(docnum, node)
240
- stage = get_stage(node)
241
- typeabbr = get_typeabbr(node)
242
- if stage && (stage.to_i < 60)
243
- docnum = unpub_stage_prefix(docnum, stage, typeabbr, node)
244
- elsif typeabbr == "DIR " then docnum = "#{typeabbr}#{docnum}"
245
- elsif typeabbr && !@amd then docnum = "/#{typeabbr}#{docnum}"
246
- end
247
- docnum
248
- end
249
-
250
- def id_year(docnum, node, mode: :default)
251
- case mode
252
- when :strip then docnum.sub(/:(19|20)\d\d(?!\d)/, "")
253
- when :force then id_add_year(docnum, node)
254
- else
255
- stage = get_stage(node)
256
- if stage && (stage.to_i < 60)
257
- docnum
258
- else id_add_year(docnum, node)
259
- end
260
- end
261
- end
262
-
263
- def unpub_stage_prefix(docnum, stage, typeabbr, node)
264
- abbr = id_stage_abbr(stage, get_substage(node), node)
265
- %w(40 50).include?(stage) && i = node.attr("iteration") and
266
- itersuffix = ".#{i}"
267
- return docnum if abbr.nil? || abbr.empty? # prefixes added in cleanup
268
-
269
- typeabbr = "" if %w(DTS FDTS).include?(abbr.sub(/\s+$/, ""))
270
- return "/#{abbr}#{typeabbr} #{docnum}#{itersuffix}" unless @amd
271
-
272
- a = docnum.split(%r{/})
273
- a[-1] = "#{abbr}#{a[-1]}#{itersuffix}"
274
- a.join("/")
275
- end
276
-
277
205
  def id_add_year(docnum, node)
278
206
  year = node.attr("copyright-year")
279
207
  @amd and year ||= node.attr("updated-date")&.sub(/-.*$/, "")
@@ -66,6 +66,7 @@
66
66
  <value>caution</value>
67
67
  <value>statement</value>
68
68
  <value>editorial</value>
69
+ <value>box</value>
69
70
  </choice>
70
71
  </define>
71
72
  <define name="index">
@@ -1580,7 +1581,7 @@
1580
1581
  </element>
1581
1582
  </define>
1582
1583
  <define name="misccontainer">
1583
- <element name="misc-container">
1584
+ <element name="metanorma-extension">
1584
1585
  <oneOrMore>
1585
1586
  <ref name="AnyElement"/>
1586
1587
  </oneOrMore>
@@ -37,7 +37,7 @@ module Metanorma
37
37
  end
38
38
 
39
39
  def use_presentation_xml(ext)
40
- return true if ext == :html_alt
40
+ return true if [:html_alt, :sts, :isosts].include?(ext)
41
41
 
42
42
  super
43
43
  end
@@ -45,9 +45,13 @@ module Metanorma
45
45
  super
46
46
  end
47
47
 
48
+ # in ISO, term has subterm, unless
49
+ # there is no definition to the term (subclauses start immediately),
50
+ # or it is labelled as "grouping"
48
51
  def term_contains_subclauses(node)
49
- @vocab and return false # treat this as a term
50
- super
52
+ !node.sections? and return false
53
+ node.level != node.blocks[0].level ||
54
+ node.role == "grouping"
51
55
  end
52
56
  end
53
57
  end
@@ -1,5 +1,5 @@
1
1
  module Metanorma
2
2
  module ISO
3
- VERSION = "2.3.2".freeze
3
+ VERSION = "2.3.4".freeze
4
4
  end
5
5
  end
@@ -1,4 +1,5 @@
1
1
  require "relaton-render"
2
+ require "isodoc"
2
3
  require_relative "parse"
3
4
 
4
5
  module Relaton
@@ -34,7 +34,7 @@ Gem::Specification.new do |spec|
34
34
 
35
35
  spec.add_dependency "metanorma-standoc", "~> 2.3.0"
36
36
  spec.add_dependency "mnconvert", "~> 1.14"
37
- spec.add_dependency "pubid-iso"
37
+ spec.add_dependency "pubid-iso", "~> 0.4.0"
38
38
  spec.add_dependency "ruby-jing"
39
39
  spec.add_dependency "tokenizer", "~> 0.3.0"
40
40
  spec.add_dependency "twitter_cldr"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metanorma-iso
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.2
4
+ version: 2.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-30 00:00:00.000000000 Z
11
+ date: 2023-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: metanorma-standoc
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: pubid-iso
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 0.4.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 0.4.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: ruby-jing
57
57
  requirement: !ruby/object:Gem::Requirement