metanorma-standoc 2.8.5 → 2.8.6

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: c543029f3b14b657d9688b9fd220df2a476c0d34a50eafd89bc7a94342a59fe0
4
- data.tar.gz: 6c84b411e9fd00947893827f821a63f6877b3fab227873611fe76e6793776bf5
3
+ metadata.gz: 26ef7eeadddd66ca86125ae72f91a3e920057ad5ed1e8f0e1e5670f831355d0b
4
+ data.tar.gz: e1d1e42f6d4962d11ab86421fec3fc2877480e33fdac9aabcc4bd478fd3cc2df
5
5
  SHA512:
6
- metadata.gz: eb65532e33f4114c5a268094f26053338b5dc56911f1801d3a78b4f61b6f1e9ed5d5689d2a6cf22a02d2c06266fb1758a809edf078c353933222c4fd64eba552
7
- data.tar.gz: 9b2b1c7bd047da5dc81128e00f04da4b4f9e735699e542568665577167889ad9b671bad82fa72b4147f85a3263aa7a6e2923b1b444fe33f97e48f62c0bd9e0d8
6
+ metadata.gz: 4a014a7cbc4f3665f07322713d0edad6dbd42301eb3b0e548a78efd116f7c6da4b7359db4f26e3cbc50315cdbdad99169997493fa792000b6f36e63c49c8ace1
7
+ data.tar.gz: 25f39be9f0df10ecdfaea29ecdf2e1cf8a50789f80fce1cf6fa71cd23beb1a69f6b890e2ca69527bc486091631281cce5926f3b3ec743bdbbfb24b9c7d195264
@@ -31,10 +31,11 @@ module Metanorma
31
31
 
32
32
  def inline_anchor_xref_attrs(node)
33
33
  text = concatenate_attributes_to_xref_text(node)
34
- m = inline_anchor_xref_match(text)
35
34
  t = node.target.gsub(/^#/, "").gsub(%r{(\.xml|\.adoc)(#.*$)}, "\\2")
36
- m.nil? and return { target: t, type: "inline", text: text }
37
- inline_anchor_xref_attrs1(m, t, text)
35
+ attrs, text = inline_anchor_xref_match(text)
36
+ attrs.empty? and
37
+ return { target: t, type: "inline", text: text, style: @xrefstyle }
38
+ inline_anchor_xref_attrs1(attrs, t, text)
38
39
  end
39
40
 
40
41
  def concatenate_attributes_to_xref_text(node)
@@ -44,20 +45,29 @@ module Metanorma
44
45
  end.map { |x| x.sub(/%+/, "%") }.join + (node.text || "")
45
46
  end
46
47
 
47
- def inline_anchor_xref_attrs1(match, target, text)
48
- { target: target, hidden: match[:hidden],
49
- type: match[:fn].nil? ? "inline" : "footnote",
50
- case: match[:case]&.sub(/%$/, ""),
51
- style: match[:style] || @xrefstyle,
52
- droploc: match[:drop].nil? && match[:drop2].nil? ? nil : true,
53
- text: inline_anchor_xref_text(match, text) }
48
+ def inline_anchor_xref_attrs1(attrs, target, text)
49
+ { target: target, hidden: attrs["hidden"],
50
+ type: attrs.key?("fn") ? "footnote" : "inline",
51
+ case: %w(capital lowercase).detect { |x| attrs.key?(x) },
52
+ label: attrs["label"],
53
+ style: attrs["style"] || @xrefstyle,
54
+ droploc: attrs.key?("droploc") ? true : nil,
55
+ text: text }.compact
54
56
  end
55
57
 
58
+ XREF_ATTRS = "hidden|style|droploc|capital|lowercase|label".freeze
59
+
56
60
  def inline_anchor_xref_match(text)
57
- /^(?:hidden%(?<hidden>[^,]+),?)?
58
- (?:style=(?<style>[^%]+)%)?
59
- (?<drop>droploc%)?(?<case>capital%|lowercase%)?(?<drop2>droploc%)?
60
- (?<fn>fn:?\s*)?(?<text>.*)$/x.match text
61
+ attrs = {}
62
+ while m = /^(#{XREF_ATTRS})(=[^%]+)?%(.*)$/o.match(text)
63
+ text = m[3]
64
+ attrs[m[1]] = m[2]&.sub(/^=/, "")
65
+ end
66
+ if m = /^(fn:?\s*)(\S.*)?$/.match(text)
67
+ text = m[2]
68
+ attrs["fn"] = ""
69
+ end
70
+ [attrs, text]
61
71
  end
62
72
 
63
73
  def inline_anchor_xref_text(match, text)
@@ -208,7 +208,9 @@
208
208
  </define>
209
209
  <define name="roledescription">
210
210
  <element name="description">
211
- <ref name="FormattedString"/>
211
+ <oneOrMore>
212
+ <ref name="TextElement"/>
213
+ </oneOrMore>
212
214
  </element>
213
215
  </define>
214
216
  <define name="person">
@@ -333,7 +335,9 @@
333
335
  </define>
334
336
  <define name="affiliationdescription">
335
337
  <element name="description">
336
- <ref name="FormattedString"/>
338
+ <oneOrMore>
339
+ <ref name="TextElement"/>
340
+ </oneOrMore>
337
341
  </element>
338
342
  </define>
339
343
  <define name="organization">
@@ -897,7 +901,9 @@
897
901
  </define>
898
902
  <define name="formattedref">
899
903
  <element name="formattedref">
900
- <ref name="FormattedString"/>
904
+ <oneOrMore>
905
+ <ref name="TextElement"/>
906
+ </oneOrMore>
901
907
  </element>
902
908
  </define>
903
909
  <define name="license">
@@ -942,7 +948,9 @@
942
948
  <optional>
943
949
  <attribute name="type"/>
944
950
  </optional>
945
- <ref name="FormattedString"/>
951
+ <zeroOrMore>
952
+ <ref name="TextElement"/>
953
+ </zeroOrMore>
946
954
  </define>
947
955
  <!-- TitleType = ( "alternative" | "original" | "unofficial" | "subtitle" | "main" ) -->
948
956
  <define name="TypedUri">
@@ -1042,7 +1050,9 @@
1042
1050
  <optional>
1043
1051
  <attribute name="script"/>
1044
1052
  </optional>
1045
- <text/>
1053
+ <oneOrMore>
1054
+ <ref name="TextElement"/>
1055
+ </oneOrMore>
1046
1056
  </element>
1047
1057
  </define>
1048
1058
  <define name="docnumber">
@@ -1267,12 +1277,16 @@
1267
1277
  <optional>
1268
1278
  <attribute name="type"/>
1269
1279
  </optional>
1270
- <ref name="FormattedString"/>
1280
+ <oneOrMore>
1281
+ <ref name="TextElement"/>
1282
+ </oneOrMore>
1271
1283
  </element>
1272
1284
  </define>
1273
1285
  <define name="bibabstract">
1274
1286
  <element name="abstract">
1275
- <ref name="FormattedString"/>
1287
+ <oneOrMore>
1288
+ <ref name="TextElement"/>
1289
+ </oneOrMore>
1276
1290
  </element>
1277
1291
  </define>
1278
1292
  <define name="copyright">
@@ -1377,7 +1391,9 @@
1377
1391
  </attribute>
1378
1392
  <optional>
1379
1393
  <element name="description">
1380
- <ref name="FormattedString"/>
1394
+ <oneOrMore>
1395
+ <ref name="TextElement"/>
1396
+ </oneOrMore>
1381
1397
  </element>
1382
1398
  </optional>
1383
1399
  <element name="bibitem">
@@ -36,7 +36,8 @@ module Metanorma
36
36
 
37
37
  def figure_attrs(node)
38
38
  attr_code(id_unnum_attrs(node).merge(keep_attrs(node))
39
- .merge(class: node.attr("class")))
39
+ .merge(class: node.attr("class"),
40
+ width: node.attr("width")))
40
41
  end
41
42
 
42
43
  def image(node)
@@ -1,4 +1,5 @@
1
1
  require "vectory"
2
+ require "crass"
2
3
 
3
4
  module Metanorma
4
5
  module Standoc
@@ -30,8 +31,7 @@ module Metanorma
30
31
  def svgmap_moveattrs1(svgmap, figure)
31
32
  %w(unnumbered number subsequence keep-with-next
32
33
  keep-lines-together tag multilingual-rendering).each do |a|
33
- next if figure[a] || !svgmap[a]
34
-
34
+ figure[a] || !svgmap[a] and next
35
35
  figure[a] = svgmap[a]
36
36
  svgmap.delete(a)
37
37
  end
@@ -43,7 +43,7 @@ module Metanorma
43
43
  s.children.remove
44
44
  f = s1.at(".//figure") and s << f
45
45
  s1.xpath(".//li").each do |li|
46
- t = li&.at(".//eref | .//link | .//xref") or next
46
+ t = li.at(".//eref | .//link | .//xref") or next
47
47
  href = t.xpath("./following-sibling::node()")
48
48
  href.empty? or
49
49
  s << %[<target href="#{svgmap_target(href)}">#{t.to_xml}</target>]
@@ -53,8 +53,7 @@ module Metanorma
53
53
 
54
54
  def svgmap_target(nodeset)
55
55
  nodeset.each do |n|
56
- next unless n.name == "link"
57
-
56
+ n.name == "link" or next
58
57
  n.children = n["target"]
59
58
  end
60
59
  nodeset.text.sub(/^[,; ]/, "").strip
@@ -69,13 +68,17 @@ module Metanorma
69
68
  end
70
69
  end
71
70
  end
72
- svg_uniqueids(xmldoc)
71
+ svg_cleanup(xmldoc)
73
72
  xmldoc
74
73
  end
75
74
 
76
- def read_in_if_svg(img, localdir)
77
- return false unless img["src"]
75
+ def svg_cleanup(xmldoc)
76
+ svg_uniqueids(xmldoc)
77
+ svg_classupdate(xmldoc)
78
+ end
78
79
 
80
+ def read_in_if_svg(img, localdir)
81
+ img["src"] or return false
79
82
  path = Vectory::Utils.svgmap_rewrite0_path(img["src"], localdir)
80
83
  File.file?(path) or return false
81
84
  types = MIME::Types.type_for(path) or return false
@@ -85,6 +88,31 @@ module Metanorma
85
88
  true
86
89
  end
87
90
 
91
+ def svg_classupdate(xmldoc)
92
+ xmldoc.xpath("//m:svg[m:style]", "m" => SVG_NS)
93
+ .each_with_index do |s, i|
94
+ svg_classupdate1(s, s.at("./m:style", "m" => SVG_NS), i)
95
+ end
96
+ end
97
+
98
+ def svg_classupdate1(svg, style, idx)
99
+ tree = Crass.parse(style.text)
100
+ tree.each { |n| svg_suffix_css_style(n, idx) }
101
+ style.children = Crass::Parser.stringify(tree)
102
+ svg.xpath(".//*[@class]").each do |n|
103
+ n["class"] = n["class"].split(/\s+/)
104
+ .map { |x| "#{x}_inject_#{idx}" }.join(" ")
105
+ end
106
+ end
107
+
108
+ def svg_suffix_css_style(node, idx)
109
+ node[:node] == :style_rule && /\./.match?(node[:selector][:value]) or
110
+ return
111
+ v = node[:selector][:value]
112
+ .gsub(/([^.\s]*\.\S+)/, "\\1_inject_#{idx}")
113
+ node[:selector] = Crass.parse("#{v} {}").first[:selector]
114
+ end
115
+
88
116
  IRI_TAG_PROPERTIES_MAP = {
89
117
  clipPath: ["clip-path"],
90
118
  "color-profile": nil,
@@ -111,13 +139,12 @@ module Metanorma
111
139
 
112
140
  def svg_iri_properties(id_elems)
113
141
  iri_tag_names = id_elems.each_with_object([]) do |e, m|
114
- IRI_TAG_PROPERTIES_MAP.key?(e.name.to_sym) and m = m << e.name
142
+ IRI_TAG_PROPERTIES_MAP.key?(e.name.to_sym) and m << e.name
115
143
  end.uniq
116
144
  iri_properties = iri_tag_names.each_with_object([]) do |t, m|
117
145
  (IRI_TAG_PROPERTIES_MAP[t.to_sym] || [t]).each { |t1| m = m << t1 }
118
146
  end.uniq
119
- return [] if iri_properties.empty?
120
-
147
+ iri_properties.empty? and return []
121
148
  iri_properties << "style"
122
149
  end
123
150
 
@@ -132,8 +159,7 @@ module Metanorma
132
159
 
133
160
  def svg_uniqueids2(svg, iri_properties, idx, ids)
134
161
  svg.traverse do |e|
135
- next unless e.element?
136
-
162
+ e.element? or next
137
163
  if e.name == "style"
138
164
  svg_styleupdate(e, idx, ids)
139
165
  elsif !e.attributes.empty?
@@ -158,8 +184,7 @@ module Metanorma
158
184
 
159
185
  def svg_attrupdate(elem, iri_properties, idx, ids)
160
186
  iri_properties.each do |p|
161
- next unless elem[p]
162
-
187
+ elem[p] or next
163
188
  elem[p] = svg_update_url(elem[p], idx, ids)
164
189
  end
165
190
  end
@@ -167,17 +192,15 @@ module Metanorma
167
192
  def svg_linkupdate(elem, idx, ids)
168
193
  %w(xlink:href href).each do |ref|
169
194
  iri = elem[ref]&.strip
170
- next unless /^#/.match?(iri)
171
- next unless ids[iri.sub(/^#/, "")]
172
-
195
+ /^#/.match?(iri) or next
196
+ ids[iri.sub(/^#/, "")] or next
173
197
  elem[ref] += "_inject_#{idx}"
174
198
  end
175
199
  end
176
200
 
177
201
  def svg_idupdate(elem, idx, ids)
178
- return unless elem["id"]
179
- return unless ids[elem["id"]]
180
-
202
+ elem["id"] or return
203
+ ids[elem["id"]] or return
181
204
  elem["id"] += "_inject_#{idx}"
182
205
  end
183
206
  end
@@ -97,8 +97,7 @@ module Metanorma
97
97
  def make_annexes(xml)
98
98
  xml.xpath("//*[@annex]").each do |y|
99
99
  y.delete("annex")
100
- next if y.name == "annex" || !y.ancestors("annex").empty?
101
-
100
+ y.name == "annex" || !y.ancestors("annex").empty? and next
102
101
  y.wrap("<annex/>")
103
102
  y.parent["id"] = "_#{UUIDTools::UUID.random_create}"
104
103
  y.parent["obligation"] = y["obligation"]
@@ -117,8 +116,7 @@ module Metanorma
117
116
 
118
117
  def sections_level_cleanup(xml)
119
118
  m = maxlevel(xml)
120
- return if m < 6
121
-
119
+ m < 6 and return
122
120
  m.downto(6).each do |l|
123
121
  xml.xpath("//clause[@level = '#{l}']").each do |c|
124
122
  c.delete("level")
@@ -173,7 +171,7 @@ module Metanorma
173
171
  r["obligation"] = "normative" unless r["obligation"]
174
172
  end
175
173
  xml.xpath(Utils::SUBCLAUSE_XPATH).each do |r|
176
- o = r&.at("./ancestor::*/@obligation")&.text and r["obligation"] = o
174
+ o = r.at("./ancestor::*/@obligation")&.text and r["obligation"] = o
177
175
  end
178
176
  end
179
177
 
@@ -183,8 +181,7 @@ module Metanorma
183
181
  end
184
182
 
185
183
  def preface_clausebefore_cleanup(xmldoc)
186
- return unless xmldoc.at("//preface")
187
-
184
+ xmldoc.at("//preface") or return
188
185
  ins = insert_before(xmldoc, "//preface")
189
186
  xmldoc.xpath("//preface//*[@beforeclauses = 'true']").each do |x|
190
187
  x.delete("beforeclauses")
@@ -232,9 +229,8 @@ module Metanorma
232
229
  loop do
233
230
  found = false
234
231
  xmldoc.xpath("//floating-title").each do |t|
235
- next unless t.next_element.nil?
236
- next if %w(sections annex preface).include? t.parent.name
237
-
232
+ t.next_element.nil? or next
233
+ %w(sections annex preface).include? t.parent.name and next
238
234
  t.parent.next = t
239
235
  found = true
240
236
  end
@@ -16,22 +16,32 @@ module Metanorma
16
16
  text or return
17
17
  doc.xpath(xpath).each_with_index do |node, i|
18
18
  first && !i.zero? and next
19
+ node["keeptitle"] == "true" and next
19
20
  title = get_or_make_title(node)
20
- fn = title.xpath("./fn | ./bookmark")
21
- fn.each(&:remove)
22
- title.children = text
23
- fn.each { |n| title << n }
21
+ set_title_with_footnotes(title, text)
24
22
  end
25
23
  end
26
24
 
25
+ def set_title_with_footnotes(title, text)
26
+ fn = title.xpath("./fn | ./bookmark | ./index")
27
+ fn.each(&:remove)
28
+ title.children = text
29
+ fn.each { |n| title << n }
30
+ end
31
+
27
32
  def sections_names_cleanup(xml)
28
33
  replace_title(xml, "//clause[@type = 'scope']", @i18n&.scope)
34
+ sections_names_pref_cleanup(xml)
35
+ section_names_refs_cleanup(xml)
36
+ section_names_terms_cleanup(xml)
37
+ xml.xpath("//*[@keeptitle]").each { |s| s.delete("keeptitle") }
38
+ end
39
+
40
+ def sections_names_pref_cleanup(xml)
29
41
  replace_title(xml, "//preface//abstract", @i18n&.abstract)
30
42
  replace_title(xml, "//foreword", @i18n&.foreword)
31
43
  replace_title(xml, "//introduction", @i18n&.introduction)
32
44
  replace_title(xml, "//acknowledgements", @i18n&.acknowledgements)
33
- section_names_refs_cleanup(xml)
34
- section_names_terms_cleanup(xml)
35
45
  end
36
46
 
37
47
  def section_names_refs_cleanup(xml)
@@ -82,11 +92,8 @@ module Metanorma
82
92
  @i18n&.termsdefsymbolsabbrev, true)
83
93
  replace_title(xml, "//terms#{NO_SYMABBR} | //clause[.//terms]#{NO_SYMABBR}",
84
94
  @i18n&.termsdefsymbolsabbrev, true)
85
- replace_title(
86
- xml,
87
- "//terms[not(.//definitions)] | //clause[.//terms][not(.//definitions)]",
88
- @i18n&.termsdef, true
89
- )
95
+ replace_title(xml, "//terms[not(.//definitions)] | //clause[.//terms][not(.//definitions)]",
96
+ @i18n&.termsdef, true)
90
97
  end
91
98
 
92
99
  # do not auto-name terms sections if there are terms subclauses
@@ -10,7 +10,7 @@ module Metanorma
10
10
  module Front
11
11
  def metadata_id(node, xml)
12
12
  id = node.attr("docidentifier") || metadata_id_build(node)
13
- xml.docidentifier id
13
+ xml.docidentifier id, primary: "true"
14
14
  end
15
15
 
16
16
  def metadata_id_build(node)
@@ -156,44 +156,7 @@
156
156
  </define>
157
157
  <define name="xref">
158
158
  <element name="xref">
159
- <attribute name="target">
160
- <data type="string">
161
- <param name="pattern">\i\c*|\c+#\c+</param>
162
- </data>
163
- </attribute>
164
- <optional>
165
- <attribute name="to">
166
- <data type="string">
167
- <param name="pattern">\i\c*|\c+#\c+</param>
168
- </data>
169
- </attribute>
170
- </optional>
171
- <optional>
172
- <attribute name="type">
173
- <ref name="ReferenceFormat"/>
174
- </attribute>
175
- </optional>
176
- <optional>
177
- <attribute name="alt"/>
178
- </optional>
179
- <optional>
180
- <attribute name="case">
181
- <choice>
182
- <value>capital</value>
183
- <value>lowercase</value>
184
- </choice>
185
- </attribute>
186
- </optional>
187
- <optional>
188
- <attribute name="droploc">
189
- <data type="boolean"/>
190
- </attribute>
191
- </optional>
192
- <optional>
193
- <attribute name="style">
194
- <ref name="XrefStyleType"/>
195
- </attribute>
196
- </optional>
159
+ <ref name="XrefAttributes"/>
197
160
  <ref name="XrefBody"/>
198
161
  </element>
199
162
  </define>
@@ -407,23 +370,7 @@
407
370
  </define>
408
371
  <define name="figure">
409
372
  <element name="figure">
410
- <attribute name="id">
411
- <data type="ID"/>
412
- </attribute>
413
- <optional>
414
- <attribute name="unnumbered">
415
- <data type="boolean"/>
416
- </attribute>
417
- </optional>
418
- <optional>
419
- <attribute name="number"/>
420
- </optional>
421
- <optional>
422
- <attribute name="subsequence"/>
423
- </optional>
424
- <optional>
425
- <attribute name="class"/>
426
- </optional>
373
+ <ref name="FigureAttributes"/>
427
374
  <ref name="BlockAttributes"/>
428
375
  <optional>
429
376
  <ref name="tname"/>
@@ -2450,6 +2397,49 @@
2450
2397
  </zeroOrMore>
2451
2398
  </element>
2452
2399
  </define>
2400
+ <define name="XrefAttributes">
2401
+ <attribute name="target">
2402
+ <data type="string">
2403
+ <param name="pattern">\i\c*|\c+#\c+</param>
2404
+ </data>
2405
+ </attribute>
2406
+ <optional>
2407
+ <attribute name="to">
2408
+ <data type="string">
2409
+ <param name="pattern">\i\c*|\c+#\c+</param>
2410
+ </data>
2411
+ </attribute>
2412
+ </optional>
2413
+ <optional>
2414
+ <attribute name="type">
2415
+ <ref name="ReferenceFormat"/>
2416
+ </attribute>
2417
+ </optional>
2418
+ <optional>
2419
+ <attribute name="alt"/>
2420
+ </optional>
2421
+ <optional>
2422
+ <attribute name="case">
2423
+ <choice>
2424
+ <value>capital</value>
2425
+ <value>lowercase</value>
2426
+ </choice>
2427
+ </attribute>
2428
+ </optional>
2429
+ <optional>
2430
+ <attribute name="droploc">
2431
+ <data type="boolean"/>
2432
+ </attribute>
2433
+ </optional>
2434
+ <optional>
2435
+ <attribute name="style">
2436
+ <ref name="XrefStyleType"/>
2437
+ </attribute>
2438
+ </optional>
2439
+ <optional>
2440
+ <attribute name="label"/>
2441
+ </optional>
2442
+ </define>
2453
2443
  <define name="XrefBody">
2454
2444
  <zeroOrMore>
2455
2445
  <ref name="XrefTarget"/>
@@ -2528,6 +2518,28 @@
2528
2518
  <attribute name="columns"/>
2529
2519
  </optional>
2530
2520
  </define>
2521
+ <define name="FigureAttributes">
2522
+ <attribute name="id">
2523
+ <data type="ID"/>
2524
+ </attribute>
2525
+ <optional>
2526
+ <attribute name="unnumbered">
2527
+ <data type="boolean"/>
2528
+ </attribute>
2529
+ </optional>
2530
+ <optional>
2531
+ <attribute name="number"/>
2532
+ </optional>
2533
+ <optional>
2534
+ <attribute name="subsequence"/>
2535
+ </optional>
2536
+ <optional>
2537
+ <attribute name="class"/>
2538
+ </optional>
2539
+ <optional>
2540
+ <attribute name="width"/>
2541
+ </optional>
2542
+ </define>
2531
2543
  <start>
2532
2544
  <ref name="standard-document"/>
2533
2545
  </start>
@@ -201,7 +201,13 @@ module Metanorma
201
201
  using_format :short
202
202
 
203
203
  def process(parent, _target, attrs)
204
- create_anchor(parent, "hidden%#{attrs['text']}",
204
+ t = attrs["text"]
205
+ t = if /,/.match?(t)
206
+ t.sub(/,/, "%")
207
+ else
208
+ "#{t}%"
209
+ end
210
+ create_anchor(parent, "hidden=#{t}",
205
211
  type: :xref, target: "_#{UUIDTools::UUID.random_create}")
206
212
  end
207
213
  end
@@ -10,9 +10,8 @@ module Metanorma
10
10
  @norm_ref = false
11
11
 
12
12
  def sectiontype1(node)
13
- return "abstract" if node.attr("style") == "abstract"
14
-
15
- node&.attr("heading")&.downcase ||
13
+ node.attr("style") == "abstract" and return "abstract"
14
+ node.attr("heading")&.downcase ||
16
15
  node.title
17
16
  .gsub(%r{<index>.*?</index>}m, "")
18
17
  .gsub(%r{<fn[^>]*>.*?</fn>}m, "")
@@ -25,7 +24,7 @@ module Metanorma
25
24
  ret = sectiontype1(node)
26
25
  ret1 = preface_main_filter(sectiontype_streamline(ret), node)
27
26
  ret1 == "symbols and abbreviated terms" and return ret1
28
- !level || node.level == 1 or return nil
27
+ !level || node.level == 1 || node.attr("heading") or return nil
29
28
  @seen_headers.include? ret and return nil
30
29
  @seen_headers << ret unless ret1.nil?
31
30
  @seen_headers_canonical << ret1 unless ret1.nil?
@@ -59,9 +58,12 @@ module Metanorma
59
58
  ["normative references", "terms and definitions", "scope",
60
59
  "symbols and abbreviated terms", "clause", "bibliography"].freeze
61
60
 
62
- def start_main_section(ret, node)
63
- return if node.role == "preface" || node.attr("style") == "preface"
61
+ def role_style(node, value)
62
+ node.role == value || node.attr("style") == value
63
+ end
64
64
 
65
+ def start_main_section(ret, node)
66
+ role_style(node, "preface") and return
65
67
  @preface = false if self.class::MAIN_CLAUSE_NAMES.include?(ret)
66
68
  @preface = false if self.class::PREFACE_CLAUSE_NAMES
67
69
  .intersection(@seen_headers_canonical + [ret]).empty?
@@ -79,29 +81,20 @@ module Metanorma
79
81
  end
80
82
 
81
83
  def section_attributes(node)
82
- ret = { id: Metanorma::Utils::anchor_or_uuid(node),
83
- language: node.attributes["language"],
84
- script: node.attributes["script"],
85
- number: node.attributes["number"],
86
- "branch-number": node.attributes["branch-number"],
87
- type: node.attributes["type"],
88
- annex: (if (node.attr("style") == "appendix" ||
89
- node.role == "appendix") &&
90
- node.level == 1
91
- true
92
- end),
93
- tag: node&.attr("tag"),
94
- "multilingual-rendering": node&.attr("multilingual-rendering"),
95
- colophon: (if node.role == "colophon" ||
96
- node.attr("style") == "colophon"
97
- true
98
- end),
99
- preface: (if node.role == "preface" ||
100
- node.attr("style") == "preface"
101
- true
102
- end) }
103
- return ret unless node.attributes["change"]
84
+ ret =
85
+ { id: Metanorma::Utils::anchor_or_uuid(node),
86
+ annex: role_style(node, "appendix") && node.level == 1 ? true : nil,
87
+ colophon: role_style(node, "colophon") ? true : nil,
88
+ preface: role_style(node, "preface") ? true : nil }
89
+ %w(language script number branch-number type tag keeptitle
90
+ multilingual-rendering).each do |k|
91
+ a = node.attr(k) and ret[k.to_sym] = a
92
+ end
93
+ section_attributes_change(node, ret).compact
94
+ end
104
95
 
96
+ def section_attributes_change(node, ret)
97
+ node.attributes["change"] or return ret
105
98
  ret.merge(change: node.attributes["change"],
106
99
  path: node.attributes["path"],
107
100
  path_end: node.attributes["path_end"],
@@ -5,8 +5,6 @@ module Metanorma
5
5
  # Intelligent term lookup xml modifier
6
6
  class TermLookupCleanup
7
7
  AUTO_GEN_ID_REGEXP = /\A_/.freeze
8
- EXISTING_TERM_REGEXP = /\Aterm-/.freeze
9
- EXISTING_SYMBOL_REGEXP = /\Asymbol-/.freeze
10
8
 
11
9
  attr_reader :xmldoc, :lookup, :log
12
10
 
@@ -61,13 +59,12 @@ module Metanorma
61
59
  def related_cleanup
62
60
  xmldoc.xpath("//related").each do |n|
63
61
  refterm = n.at("./refterm") or next
62
+ repl = "<preferred><expression>" \
63
+ "<name>#{refterm.children.to_xml}</name></expression></preferred>"
64
64
  lookup = norm_ref_id_text(refterm.text.strip)
65
65
  p = @lookup[:sec2prim][lookup] and refterm.children = @c.encode(p)
66
66
  p || @lookup[:term][lookup] and
67
- refterm.replace(<<~XML,
68
- <preferred><expression><name>#{refterm.children.to_xml}</name></expression></preferred>
69
- XML
70
- )
67
+ refterm.replace(repl)
71
68
  end
72
69
  end
73
70
 
@@ -96,7 +93,7 @@ module Metanorma
96
93
  def remove_missing_ref?(node)
97
94
  node.at("../eref | ../termref") and return false
98
95
  xref = node.at("../xref") or return true
99
- xref["target"] && !xref["target"]&.empty? and return false
96
+ xref["target"] && !xref["target"].empty? and return false
100
97
  xref.remove # if xref supplied by user, we won't delete
101
98
  true
102
99
  end
@@ -251,8 +248,7 @@ module Metanorma
251
248
  end
252
249
 
253
250
  def unique_text_id(text, prefix)
254
- @idhash["#{prefix}-#{text}"] or
255
- return "#{prefix}-#{text}"
251
+ @idhash["#{prefix}-#{text}"] or return "#{prefix}-#{text}"
256
252
  (1..Float::INFINITY).lazy.each do |index|
257
253
  @idhash["#{prefix}-#{text}-#{index}"] or
258
254
  break("#{prefix}-#{text}-#{index}")
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "2.8.5".freeze
22
+ VERSION = "2.8.6".freeze
23
23
  end
24
24
  end
@@ -30,6 +30,7 @@ Gem::Specification.new do |spec|
30
30
 
31
31
  spec.add_dependency "addressable", "~> 2.8.0"
32
32
  spec.add_dependency "asciidoctor", "~> 2.0.0"
33
+ spec.add_dependency "crass", "~> 1.0.0"
33
34
  spec.add_dependency "iev", "~> 0.3.0"
34
35
  spec.add_dependency "isodoc", "~> 2.9.0"
35
36
  spec.add_dependency "metanorma", ">= 1.6.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metanorma-standoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.5
4
+ version: 2.8.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-10 00:00:00.000000000 Z
11
+ date: 2024-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 2.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: crass
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.0.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.0
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: iev
43
57
  requirement: !ruby/object:Gem::Requirement