metanorma-iso 2.3.5 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -215,6 +215,27 @@ module IsoDoc
215
215
  node.remove
216
216
  end
217
217
 
218
+ def note1(elem)
219
+ elem["type"] == "units" and return
220
+ super
221
+ end
222
+
223
+ def formula_where(dlist)
224
+ dlist.nil? and return
225
+ return super unless dlist.xpath(ns("./dt")).size == 1 &&
226
+ dlist.at(ns("./dd"))&.elements&.size == 1 &&
227
+ dlist.at(ns("./dd/p"))
228
+
229
+ formula_where_one(dlist)
230
+ end
231
+
232
+ def formula_where_one(dlist)
233
+ dt = to_xml(dlist.at(ns("./dt")).children)
234
+ dd = to_xml(dlist.at(ns("./dd/p")).children)
235
+ dlist.previous = "<p>#{@i18n.where_one} #{dt} #{dd}</p>"
236
+ dlist.remove
237
+ end
238
+
218
239
  include Init
219
240
  end
220
241
  end
@@ -7,24 +7,24 @@ module IsoDoc
7
7
  end
8
8
 
9
9
  def middle_title_main(out)
10
- out.p(**{ class: "zzSTDTitle1" }) do |p|
10
+ out.p(class: "zzSTDTitle1") do |p|
11
11
  p << @meta.get[:doctitleintro]
12
12
  p << " &#x2014; " if @meta.get[:doctitleintro] && @meta.get[:doctitlemain]
13
13
  p << @meta.get[:doctitlemain]
14
14
  p << " &#x2014; " if @meta.get[:doctitlemain] && @meta.get[:doctitlepart]
15
15
  end
16
- a = @meta.get[:doctitlepart] and out.p(**{ class: "zzSTDTitle2" }) do |p|
16
+ a = @meta.get[:doctitlepart] and out.p(class: "zzSTDTitle2") do |p|
17
17
  b = @meta.get[:doctitlepartlabel] and p << "#{b}: "
18
18
  p << "<br/><b>#{a}</b>"
19
19
  end
20
20
  end
21
21
 
22
22
  def middle_title_amd(out)
23
- a = @meta.get[:doctitleamdlabel] and out.p(**{ class: "zzSTDTitle2" }) do |p|
23
+ a = @meta.get[:doctitleamdlabel] and out.p(class: "zzSTDTitle2") do |p|
24
24
  p << a
25
25
  a = @meta.get[:doctitleamd] and p << ": #{a}"
26
26
  end
27
- a = @meta.get[:doctitlecorrlabel] and out.p(**{ class: "zzSTDTitle2" }) do |p|
27
+ a = @meta.get[:doctitlecorrlabel] and out.p(class: "zzSTDTitle2") do |p|
28
28
  p << a
29
29
  end
30
30
  end
@@ -39,8 +39,8 @@ module IsoDoc
39
39
  f = isoxml.at(ns("//introduction")) || return
40
40
  title_attr = { class: "IntroTitle" }
41
41
  page_break(out)
42
- out.div **{ class: "Section3", id: f["id"] } do |div|
43
- clause_name(nil, f.at(ns("./title")), div, title_attr)
42
+ out.div class: "Section3", id: f["id"] do |div|
43
+ clause_name(f, f.at(ns("./title")), div, title_attr)
44
44
  f.elements.each do |e|
45
45
  parse(e, div) unless e.name == "title"
46
46
  end
@@ -5,7 +5,7 @@ module IsoDoc
5
5
  super
6
6
  xml.xpath("//div[@class = 'figure']//table[@class = 'dl']").each do |t|
7
7
  t["class"] = "figdl"
8
- d = t.add_previous_sibling("<div class='figdl' "\
8
+ d = t.add_previous_sibling("<div class='figdl' " \
9
9
  "style='page-break-after:avoid;'/>")
10
10
  t.parent = d.first
11
11
  end
@@ -38,6 +38,16 @@ module IsoDoc
38
38
  word_annex_cleanup_h1(docxml)
39
39
  figure_style(docxml)
40
40
  new_styles(docxml)
41
+ index_cleanup(docxml)
42
+ end
43
+
44
+ def index_cleanup(docxml)
45
+ docxml.xpath("//div[@class = 'index']").each do |i|
46
+ i.xpath(".//p | .//li").each do |p|
47
+ p["style"] ||= ""
48
+ p["style"] += "margin-bottom:0px;"
49
+ end
50
+ end
41
51
  end
42
52
 
43
53
  def figure_style(docxml)
@@ -48,7 +58,7 @@ module IsoDoc
48
58
  end
49
59
 
50
60
  def quote_style(docxml)
51
- docxml.xpath("//div[@class = 'Quote' or @class = 'Note' or "\
61
+ docxml.xpath("//div[@class = 'Quote' or @class = 'Note' or " \
52
62
  "@class = 'Example' or @class = 'Admonition']").each do |d|
53
63
  quote_style1(d)
54
64
  end
@@ -10,10 +10,6 @@ module IsoDoc
10
10
  def initialize(options)
11
11
  @libdir = File.dirname(__FILE__)
12
12
  super
13
- @wordToClevels = options[:doctoclevels].to_i
14
- @wordToClevels = 3 if @wordToClevels.zero?
15
- @htmlToClevels = options[:htmltoclevels].to_i
16
- @htmlToClevels = 3 if @htmlToClevels.zero?
17
13
  init_dis(options)
18
14
  end
19
15
 
@@ -74,17 +70,41 @@ module IsoDoc
74
70
  make_body1(body, docxml)
75
71
  make_body2(body, docxml)
76
72
  make_body3(body, docxml)
73
+ indexsect(docxml, body)
77
74
  colophon(body, docxml)
78
75
  end
79
76
  end
80
77
 
78
+ def br(out, pagebreak)
79
+ out.br clear: "all", style: "page-break-before:#{pagebreak};" \
80
+ "mso-break-type:section-break"
81
+ end
82
+
81
83
  def colophon(body, _docxml)
82
84
  stage = @meta.get[:stage_int]
83
85
  return if !stage.nil? && stage < 60
84
86
 
85
- body.br **{ clear: "all", style: "page-break-before:left;" \
86
- "mso-break-type:section-break" }
87
- body.div **{ class: "colophon" } do |div|
87
+ br(body, "left")
88
+ body.div class: "colophon" do |div|
89
+ end
90
+ end
91
+
92
+ def indexsect(isoxml, out)
93
+ isoxml.xpath(ns("//indexsect")).each do |i|
94
+ indexsect_title(i, out)
95
+ br(out, "auto")
96
+ out.div class: "index" do |div|
97
+ i.children.each do |e|
98
+ parse(e, div) unless e.name == "title"
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ def indexsect_title(clause, out)
105
+ br(out, "always")
106
+ out.div class: "WordSection3" do |div|
107
+ clause_name(clause, clause.at(ns("./title")), div, nil)
88
108
  end
89
109
  end
90
110
 
@@ -181,7 +201,7 @@ module IsoDoc
181
201
  return if name.nil?
182
202
 
183
203
  name&.at(ns("./strong"))&.remove # supplied by CSS list numbering
184
- div.h1 **{ class: "Annex" } do |t|
204
+ div.h1 class: "Annex" do |t|
185
205
  annex_name1(name, t)
186
206
  clause_parse_subtitle(name, t)
187
207
  end
@@ -190,7 +210,7 @@ module IsoDoc
190
210
  def annex_name1(name, out)
191
211
  name.children.each do |c2|
192
212
  if c2.name == "span" && c2["class"] == "obligation"
193
- out.span **{ style: "font-weight:normal;" } do |s|
213
+ out.span style: "font-weight:normal;" do |s|
194
214
  c2.children.each { |c3| parse(c3, s) }
195
215
  end
196
216
  else parse(c2, out)
@@ -204,6 +224,21 @@ module IsoDoc
204
224
  ret
205
225
  end
206
226
 
227
+ def table_parse(node, out)
228
+ @in_table = true
229
+ table_title_parse(node, out)
230
+ measurement_units(node, out)
231
+ out.div align: "center", class: "table_container" do |div|
232
+ div.table **table_attrs(node) do |t|
233
+ table_parse_core(node, t)
234
+ (dl = node.at(ns("./dl"))) && parse(dl, div)
235
+ node.xpath(ns("./note[not(@type = 'units')]"))
236
+ .each { |n| parse(n, div) }
237
+ end
238
+ end
239
+ @in_table = false
240
+ end
241
+
207
242
  include BaseConvert
208
243
  include Init
209
244
  end
@@ -65,19 +65,24 @@ module IsoDoc
65
65
 
66
66
  def figure_anchor(elem, sublabel, label, klass)
67
67
  @anchors[elem["id"]] = anchor_struct(
68
- (sublabel ? "#{label} #{sublabel}" : label),
68
+ "#{label}#{sublabel}",
69
69
  nil, @labels[klass] || klass.capitalize, klass, elem["unnumbered"]
70
70
  )
71
- sublabel && elem["unnumbered"] != "true" and
71
+ !sublabel.empty? && elem["unnumbered"] != "true" and
72
72
  @anchors[elem["id"]][:label] = sublabel
73
73
  end
74
74
 
75
+ def subfigure_label(subfignum)
76
+ subfignum.zero? and return ""
77
+ " #{(subfignum + 96).chr})"
78
+ end
79
+
75
80
  def sequential_figure_names(clause)
76
81
  j = 0
77
82
  clause.xpath(ns(FIGURE_NO_CLASS)).noblank
78
83
  .each_with_object(IsoDoc::XrefGen::Counter.new) do |t, c|
79
84
  j = subfigure_increment(j, c, t)
80
- sublabel = j.zero? ? nil : "#{(j + 96).chr})"
85
+ sublabel = subfigure_label(j)
81
86
  figure_anchor(t, sublabel, c.print, "figure")
82
87
  end
83
88
  sequential_figure_class_names(clause)
@@ -101,7 +106,7 @@ module IsoDoc
101
106
  clause.xpath(ns(FIGURE_NO_CLASS)).noblank.each do |t|
102
107
  j = subfigure_increment(j, c, t)
103
108
  label = "#{num}#{hiersep}#{c.print}"
104
- sublabel = j.zero? ? nil : "#{(j + 96).chr})"
109
+ sublabel = subfigure_label(j)
105
110
  figure_anchor(t, sublabel, label, "figure")
106
111
  end
107
112
  hierarchical_figure_class_names(clause, num)
@@ -196,6 +201,19 @@ module IsoDoc
196
201
  super
197
202
  modspec_table_xrefs(clause) if @anchors_previous
198
203
  end
204
+
205
+ def uncountable_note?(note)
206
+ @anchors[note["id"]] || blank?(note["id"]) || note["type"] == "units"
207
+ end
208
+
209
+ def note_anchor_names1(notes, counter)
210
+ countable = notes.reject { |n| uncountable_note?(n) }
211
+ countable.each do |n|
212
+ @anchors[n["id"]] =
213
+ anchor_struct(increment_label(countable, n, counter), n,
214
+ @labels["note_xref"], "note", false)
215
+ end
216
+ end
199
217
  end
200
218
  end
201
219
  end
@@ -56,9 +56,14 @@ module Metanorma
56
56
  @vocab = node.attr("docsubtype") == "vocabulary"
57
57
  end
58
58
 
59
+ def toc_default
60
+ { word_levels: 3, html_levels: 2 }
61
+ end
62
+
59
63
  def ol_attrs(node)
60
64
  attr_code(keep_attrs(node)
61
65
  .merge(id: ::Metanorma::Utils::anchor_or_uuid(node),
66
+ "explicit-type": olist_style(node.attributes[1]),
62
67
  start: node.attr("start")))
63
68
  end
64
69
 
@@ -216,6 +216,9 @@
216
216
  <optional>
217
217
  <ref name="fullname"/>
218
218
  </optional>
219
+ <zeroOrMore>
220
+ <ref name="credential"/>
221
+ </zeroOrMore>
219
222
  <zeroOrMore>
220
223
  <ref name="affiliation"/>
221
224
  </zeroOrMore>
@@ -232,6 +235,11 @@
232
235
  <ref name="FullNameType"/>
233
236
  </element>
234
237
  </define>
238
+ <define name="credential">
239
+ <element name="credential">
240
+ <text/>
241
+ </element>
242
+ </define>
235
243
  <define name="FullNameType">
236
244
  <choice>
237
245
  <group>
@@ -305,7 +313,9 @@
305
313
  <zeroOrMore>
306
314
  <ref name="affiliationdescription"/>
307
315
  </zeroOrMore>
308
- <ref name="organization"/>
316
+ <optional>
317
+ <ref name="organization"/>
318
+ </optional>
309
319
  </element>
310
320
  </define>
311
321
  <define name="affiliationname">
@@ -8,11 +8,13 @@ module Metanorma
8
8
  "//clause[@type = 'scope']//fn".freeze
9
9
 
10
10
  NORMREF_FOOTNOTES =
11
- "//references[@normative = 'true']//fn".freeze
11
+ "//references[@normative = 'true']//fn | " \
12
+ "//clause[.//references[@normative = 'true']]//fn".freeze
12
13
 
13
14
  POST_NORMREF_FOOTNOTES =
14
15
  "//sections//clause[not(@type = 'scope')]//fn | " \
15
- "//annex//fn | //references[@normative = 'false']//fn".freeze
16
+ "//annex//fn | //references[@normative = 'false']//fn | " \
17
+ "//clause[.//references[@normative = 'false']]//fn".freeze
16
18
 
17
19
  def other_footnote_renumber(xmldoc)
18
20
  seen = {}
@@ -27,8 +29,7 @@ module Metanorma
27
29
 
28
30
  def id_prefix(prefix, id)
29
31
  # we're just inheriting the prefixes from parent doc
30
- return id.text if @amd
31
-
32
+ @amd and return id.text
32
33
  prefix.join("/") + (id.text.match?(%{^/}) ? "" : " ") + id.text
33
34
  end
34
35
 
@@ -44,18 +45,8 @@ module Metanorma
44
45
  # ISO as a prefix goes first
45
46
  def docidentifier_cleanup(xmldoc)
46
47
  prefix = get_id_prefix(xmldoc)
47
- =begin
48
- id = xmldoc.at("//bibdata/docidentifier[@type = 'ISO']") or return
49
- id.content = id_prefix(prefix, id)
50
- =end
51
48
  id = xmldoc.at("//bibdata/ext/structuredidentifier/project-number") and
52
49
  id.content = id_prefix(prefix, id)
53
- =begin
54
- %w(iso-with-lang iso-reference iso-undated).each do |t|
55
- id = xmldoc.at("//bibdata/docidentifier[@type = '#{t}']") and
56
- id.content = id_prefix(prefix, id)
57
- end
58
- =end
59
50
  end
60
51
 
61
52
  def format_ref(ref, type)
@@ -115,8 +106,7 @@ module Metanorma
115
106
 
116
107
  def sections_cleanup(xml)
117
108
  super
118
- return unless @amd
119
-
109
+ @amd or return
120
110
  xml.xpath("//*[@inline-header]").each { |h| h.delete("inline-header") }
121
111
  end
122
112
 
@@ -163,8 +153,7 @@ module Metanorma
163
153
  def withdrawn_note(xmldoc)
164
154
  xmldoc.xpath("//bibitem[not(note[@type = 'Unpublished-Status'])]")
165
155
  .each do |b|
166
- next unless withdrawn_ref?(b)
167
-
156
+ withdrawn_ref?(b) or next
168
157
  if id = replacement_standard(b)
169
158
  insert_unpub_note(b, @i18n.cancelled_and_replaced.sub(/%/, id))
170
159
  else insert_unpub_note(b, @i18n.withdrawn)
@@ -173,8 +162,7 @@ module Metanorma
173
162
  end
174
163
 
175
164
  def withdrawn_ref?(biblio)
176
- return false if pub_class(biblio) > 2
177
-
165
+ pub_class(biblio) > 2 and return false
178
166
  (s = biblio.at("./status/stage")) && (s.text.to_i == 95) &&
179
167
  (t = biblio.at("./status/substage")) && (t.text.to_i == 99)
180
168
  end
@@ -46,11 +46,14 @@ module Metanorma
46
46
  end
47
47
 
48
48
  def metadata_id(node, xml)
49
- iso_id(node, xml)
49
+ if id = node.attr("docidentifier")
50
+ xml.docidentifier id, **attr_code(type: "ISO")
51
+ else iso_id(node, xml)
52
+ end
50
53
  node.attr("tc-docnumber")&.split(/,\s*/)&.each do |n|
51
54
  xml.docidentifier(n, **attr_code(type: "iso-tc"))
52
55
  end
53
- xml.docnumber node&.attr("docnumber")
56
+ xml.docnumber node.attr("docnumber")
54
57
  end
55
58
 
56
59
  # @param type [nil, :tr, :ts, :amd, :cor, :guide, :dir, :tc, Type]
@@ -62,6 +65,7 @@ module Metanorma
62
65
  when "directive" then :dir
63
66
  when "technical-report" then :tr
64
67
  when "technical-specification" then :ts
68
+ when "publicly-available-specification" then :pas
65
69
  when "guide" then :guide
66
70
  end
67
71
  end
@@ -138,7 +142,7 @@ module Metanorma
138
142
  xml.docidentifier iso_id_default(params).to_s(with_prf: with_prf),
139
143
  **attr_code(type: "ISO")
140
144
  xml.docidentifier iso_id_reference(params)
141
- .to_s(format: :ref_num_long, with_prf: with_prf),
145
+ .to_s(format: :ref_num_short, with_prf: with_prf),
142
146
  **attr_code(type: "iso-reference")
143
147
  xml.docidentifier iso_id_reference(params).urn, **attr_code(type: "URN")
144
148
  return if @amd
@@ -146,7 +150,7 @@ module Metanorma
146
150
  xml.docidentifier iso_id_undated(params).to_s(with_prf: with_prf),
147
151
  **attr_code(type: "iso-undated")
148
152
  xml.docidentifier iso_id_with_lang(params)
149
- .to_s(format: :ref_num_short, with_prf: with_prf),
153
+ .to_s(format: :ref_num_long, with_prf: with_prf),
150
154
  **attr_code(type: "iso-with-lang")
151
155
  rescue StandardError => e
152
156
  clean_abort("Document identifier: #{e}", xml)