metanorma-standoc 2.8.11 → 2.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/lib/metanorma/standoc/anchor.rb +3 -3
  4. data/lib/metanorma/standoc/base.rb +1 -1
  5. data/lib/metanorma/standoc/blocks.rb +5 -5
  6. data/lib/metanorma/standoc/blocks_image.rb +1 -1
  7. data/lib/metanorma/standoc/blocks_notes.rb +6 -6
  8. data/lib/metanorma/standoc/cleanup.rb +15 -0
  9. data/lib/metanorma/standoc/cleanup_block.rb +1 -1
  10. data/lib/metanorma/standoc/cleanup_boilerplate.rb +67 -31
  11. data/lib/metanorma/standoc/cleanup_maths.rb +24 -1
  12. data/lib/metanorma/standoc/cleanup_ref.rb +0 -1
  13. data/lib/metanorma/standoc/cleanup_section.rb +5 -9
  14. data/lib/metanorma/standoc/cleanup_section_names.rb +5 -5
  15. data/lib/metanorma/standoc/cleanup_terms.rb +6 -5
  16. data/lib/metanorma/standoc/cleanup_xref.rb +6 -10
  17. data/lib/metanorma/standoc/converter.rb +1 -0
  18. data/lib/metanorma/standoc/init.rb +23 -2
  19. data/lib/metanorma/standoc/inline.rb +5 -5
  20. data/lib/metanorma/standoc/isodoc.rng +5 -5
  21. data/lib/metanorma/standoc/lists.rb +4 -4
  22. data/lib/metanorma/standoc/macros.rb +16 -44
  23. data/lib/metanorma/standoc/macros_embed.rb +14 -12
  24. data/lib/metanorma/standoc/macros_inline.rb +38 -75
  25. data/lib/metanorma/standoc/macros_link.rb +81 -0
  26. data/lib/metanorma/standoc/ref.rb +9 -12
  27. data/lib/metanorma/standoc/ref_queue.rb +2 -4
  28. data/lib/metanorma/standoc/ref_utility.rb +2 -2
  29. data/lib/metanorma/standoc/section.rb +3 -3
  30. data/lib/metanorma/standoc/terms.rb +2 -2
  31. data/lib/metanorma/standoc/utils.rb +22 -2
  32. data/lib/metanorma/standoc/validate.rb +14 -2
  33. data/lib/metanorma/standoc/validate_table.rb +7 -0
  34. data/lib/metanorma/standoc/version.rb +1 -1
  35. data/metanorma-standoc.gemspec +5 -4
  36. metadata +24 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e6a03a5dfead99850405d6b949a0103367ff0c280aa22d55e9c637eb34d1fe2c
4
- data.tar.gz: '06098dc9ad34cc0fdbd3df1ccaeedd51ef3b79e89a645e0ccb66979f582f82bf'
3
+ metadata.gz: '08c688771192b46a0cabe0ec82dc8b88902a49577b4af1fafb8c3efc00192a6d'
4
+ data.tar.gz: 27b915f4d6ba5ebe4c8a16cf1c02a26f9cf37af524d6d3bdbc145ce360280df7
5
5
  SHA512:
6
- metadata.gz: a35bd65e87ae978c0e34694b94365d364a528168e8aad39aa2733f6e900a14f219a85a38a275f9c24d00001fd0e19b5931a24578063dd1d45d1016066d744677
7
- data.tar.gz: 9e8e5215b27ba6b2e11fe50d0a544084afb32aa7d74fabde539844ff38797bd3217c48b8f980e97cfdd93f446bb4ef44e9cd80e610081996d45941cfc10f2357
6
+ metadata.gz: e0717e6c250f4ae7b649ce1943abf0665dad4abdf1b9b20021681e64a141967c34d53a3ed4de04b8112a4cc8ea8df79f4afd46ea96aa28622d2b6d0314f349a0
7
+ data.tar.gz: 41d8468137fd2b538597dd8379b1364f189c0d500cba23b691513754a84eb3423aa8eb46794258cdad7e21c799f518b305f46240817d4858dcb24d8848050a80
data/.rubocop.yml CHANGED
@@ -7,4 +7,4 @@ inherit_from:
7
7
  # ...
8
8
 
9
9
  AllCops:
10
- TargetRubyVersion: 2.5
10
+ TargetRubyVersion: 3.4
@@ -34,7 +34,7 @@ module Metanorma
34
34
  t = node.target.gsub(/^#/, "").gsub(%r{(\.xml|\.adoc)(#.*$)}, "\\2")
35
35
  attrs, text = inline_anchor_xref_match(text)
36
36
  attrs.empty? and
37
- return { target: t, type: "inline", text: text, style: @xrefstyle }
37
+ return { target: t, type: "inline", text:, style: @xrefstyle }
38
38
  inline_anchor_xref_attrs1(attrs, t, text)
39
39
  end
40
40
 
@@ -46,13 +46,13 @@ module Metanorma
46
46
  end
47
47
 
48
48
  def inline_anchor_xref_attrs1(attrs, target, text)
49
- { target: target, hidden: attrs["hidden"],
49
+ { target:, hidden: attrs["hidden"],
50
50
  type: attrs.key?("fn") ? "footnote" : "inline",
51
51
  case: %w(capital lowercase).detect { |x| attrs.key?(x) },
52
52
  label: attrs["label"],
53
53
  style: attrs["style"] || @xrefstyle,
54
54
  droploc: attrs.key?("droploc") ? true : nil,
55
- text: text }.compact
55
+ text: }.compact
56
56
  end
57
57
 
58
58
  XREF_ATTRS = "hidden|style|droploc|capital|lowercase|label".freeze
@@ -130,7 +130,7 @@ module Metanorma
130
130
  %w(presentation semantic).each do |t|
131
131
  /^#{t}-metadata-/.match?(k) or next
132
132
  k = k.sub(/^#{t}-metadata-/, "")
133
- csv_split(v, ",")&.each do |c|
133
+ quoted_csv_split(v)&.each do |c|
134
134
  ret << "<#{t}-metadata><#{k}>#{c}</#{k}></#{t}-metadata>"
135
135
  end
136
136
  end
@@ -90,7 +90,7 @@ module Metanorma
90
90
  )) do |ex|
91
91
  wrap_in_para(node, ex)
92
92
  end
93
- end.join("\n")
93
+ end.join("")
94
94
  end
95
95
 
96
96
  def example(node)
@@ -128,7 +128,7 @@ module Metanorma
128
128
  figure_title(node, ex)
129
129
  wrap_in_para(node, ex)
130
130
  end
131
- end.join("\n")
131
+ end.join("")
132
132
  end
133
133
 
134
134
  def example_attrs(node)
@@ -141,7 +141,7 @@ module Metanorma
141
141
  node.title.nil? or ex.name { |name| name << node.title }
142
142
  wrap_in_para(node, ex)
143
143
  end
144
- end.join("\n")
144
+ end.join("")
145
145
  end
146
146
 
147
147
  def para_attrs(node)
@@ -158,7 +158,7 @@ module Metanorma
158
158
  xml.p **para_attrs(node) do |xml_t|
159
159
  xml_t << node.content
160
160
  end
161
- end.join("\n")
161
+ end.join("")
162
162
  end
163
163
 
164
164
  def quote_attrs(node)
@@ -183,7 +183,7 @@ module Metanorma
183
183
  quote_attribution(node, q)
184
184
  wrap_in_para(node, q)
185
185
  end
186
- end.join("\n")
186
+ end.join("")
187
187
  end
188
188
 
189
189
  def listing_attrs(node)
@@ -26,7 +26,7 @@ module Metanorma
26
26
  node.title.nil? or ex.name { |name| name << node.title }
27
27
  wrap_in_para(node, ex)
28
28
  end
29
- end.join("\n")
29
+ end.join("")
30
30
  end
31
31
 
32
32
  def figure_title(node, out)
@@ -32,7 +32,7 @@ module Metanorma
32
32
  xml.review **sidebar_attrs(node) do |r|
33
33
  wrap_in_para(node, r)
34
34
  end
35
- end.join("\n")
35
+ end.join("")
36
36
  end
37
37
 
38
38
  def todo_attrs(node)
@@ -41,7 +41,7 @@ module Metanorma
41
41
  attr_code(id_attr(node)
42
42
  .merge(reviewer: node.attr("reviewer") || node.attr("source") ||
43
43
  "(Unknown)",
44
- date: date, type: "todo"))
44
+ date:, type: "todo"))
45
45
  end
46
46
 
47
47
  def todo(node)
@@ -49,7 +49,7 @@ module Metanorma
49
49
  xml.review **todo_attrs(node) do |r|
50
50
  wrap_in_para(node, r)
51
51
  end
52
- end.join("\n")
52
+ end.join("")
53
53
  end
54
54
 
55
55
  def termnote(node)
@@ -57,7 +57,7 @@ module Metanorma
57
57
  xml.termnote **termnote_attrs(node) do |ex|
58
58
  wrap_in_para(node, ex)
59
59
  end
60
- end.join("\n")
60
+ end.join("")
61
61
  end
62
62
 
63
63
  def note(node)
@@ -67,7 +67,7 @@ module Metanorma
67
67
  xml.note **note_attrs(node) do |c|
68
68
  wrap_in_para(node, c)
69
69
  end
70
- end.join("\n")
70
+ end.join("")
71
71
  end
72
72
 
73
73
  def boilerplate_note(node)
@@ -101,7 +101,7 @@ module Metanorma
101
101
  node.title.nil? or a.name { |name| name << node.title }
102
102
  wrap_in_para(node, a)
103
103
  end
104
- end.join("\n")
104
+ end.join("")
105
105
  end
106
106
 
107
107
  def admonition_alternatives(node)
@@ -64,6 +64,7 @@ module Metanorma
64
64
  bookmark_cleanup(xmldoc)
65
65
  termdef_cleanup(xmldoc) # feeds: relaton_iev_cleanup, term_index_cleanup
66
66
  relaton_iev_cleanup(xmldoc)
67
+ relaton_log_cleanup(xmldoc)
67
68
  element_name_cleanup(xmldoc)
68
69
  term_index_cleanup(xmldoc)
69
70
  bpart_cleanup(xmldoc)
@@ -97,6 +98,20 @@ module Metanorma
97
98
  end
98
99
  end
99
100
 
101
+ RELATON_SEVERITIES =
102
+ { "INFO": 3, "WARN": 2, "ERROR": 1, "FATAL": 0,
103
+ "UNKNOWN": 3 }.freeze
104
+
105
+ def relaton_log_cleanup(_xmldoc)
106
+ @relaton_log or return
107
+ @relaton_log.rewind
108
+ @relaton_log.string.split(/(?<=})\n(?={)/).each do |l|
109
+ e = JSON.parse(l)
110
+ @log.add("Relaton", e["key"], e["message"],
111
+ severity: RELATON_SEVERITIES[e["severity"].to_sym])
112
+ end
113
+ end
114
+
100
115
  def docidentifier_cleanup(xmldoc); end
101
116
 
102
117
  TEXT_ELEMS =
@@ -163,7 +163,7 @@ module Metanorma
163
163
  acc << safe_noko(a[0], node.document)
164
164
  a.size == 4 or next
165
165
  acc << Asciidoctor.convert(
166
- a[2], doctype: :inline, backend: (self&.backend&.to_sym || :standoc)
166
+ a[2], doctype: :inline, backend: self&.backend&.to_sym || :standoc
167
167
  )
168
168
  end.join
169
169
  end
@@ -2,19 +2,15 @@ module Metanorma
2
2
  module Standoc
3
3
  module Cleanup
4
4
  def external_terms_boilerplate(sources)
5
- @i18n.l10n(
6
- @i18n.external_terms_boilerplate.gsub(/%(?=\p{P}|\p{Z}|$)/,
7
- sources || "???"),
8
- @lang, @script, @locale
9
- )
5
+ e = @i18n.external_terms_boilerplate
6
+ @i18n.l10n(e.gsub(/%(?=\p{P}|\p{Z}|$)/, sources || "???"),
7
+ @lang, @script, @locale)
10
8
  end
11
9
 
12
10
  def internal_external_terms_boilerplate(sources)
13
- @i18n.l10n(
14
- @i18n.internal_external_terms_boilerplate.gsub(/%(?=\p{P}|\p{Z}|$)/,
15
- sources || "??"),
16
- @lang, @script
17
- )
11
+ e = @i18n.internal_external_terms_boilerplate
12
+ @i18n.l10n(e.gsub(/%(?=\p{P}|\p{Z}|$)/, sources || "??"),
13
+ @lang, @script)
18
14
  end
19
15
 
20
16
  def term_defs_boilerplate(div, source, term, _preface, isodoc)
@@ -26,8 +22,7 @@ module Metanorma
26
22
  end
27
23
  a = if source.empty? && term.nil? then @i18n.no_terms_boilerplate
28
24
  else term_defs_boilerplate_cont(source, term, isodoc)
29
- end
30
- a and div.next = a
25
+ end and div.next = a
31
26
  end
32
27
 
33
28
  def term_defs_boilerplate_cont(src, term, isodoc)
@@ -42,19 +37,42 @@ module Metanorma
42
37
  end
43
38
 
44
39
  def norm_ref_preface(ref)
45
- if ref.at("./note[@type = 'boilerplate']")
46
- unwrap_boilerplate_clauses(ref, ".")
47
- else
48
- refs = ref.elements.select do |e|
49
- %w(references bibitem).include? e.name
50
- end
51
- pref = refs.empty? ? @i18n.norm_empty_pref : @i18n.norm_with_refs_pref
52
- ref.at("./title").next = "<p>#{pref}</p>"
40
+ ins = norm_ref_boilerplate_insert_location(ref)
41
+ ins2 = norm_ref_process_boilerplate_note(ref)
42
+ ins2 == :populated and return
43
+ ins2 == :missing or ins = ins2
44
+ refs = ref.elements.select do |e|
45
+ %w(references bibitem).include? e.name
46
+ end
47
+ pref = refs.empty? ? @i18n.norm_empty_pref : @i18n.norm_with_refs_pref
48
+ ins.next = "<p>#{pref}</p>"
49
+ end
50
+
51
+ def norm_ref_process_boilerplate_note(ref)
52
+ ins2 = ref.at("./note[@type = 'boilerplate']") or return :missing
53
+ if ins2 && ins2.text.strip.downcase == "(default)"
54
+ ins2.children = " "
55
+ ins2.children.first
56
+ else :populated
57
+ end
58
+ end
59
+
60
+ def norm_ref_boilerplate_insert_location(ref)
61
+ while (n = ref.parent) && %w(clause references).include?(n&.name)
62
+ n.elements.detect do |e|
63
+ !%(title references).include?(e.name) &&
64
+ !e.at("./self::clause[@type = 'boilerplate']") &&
65
+ !e.at("./self::clause[.//references][not(.//clause[not(.//bibitem)])]")
66
+ end and break
67
+ ref = n
53
68
  end
69
+ ref.at("./title")
54
70
  end
55
71
 
56
- TERM_CLAUSE = "//sections/terms | " \
57
- "//sections/clause[descendant::terms]".freeze
72
+ TERM_CLAUSE =
73
+ "//sections//terms[not(.//ancestor::clause[@type = 'terms'])] | " \
74
+ "//sections/clause[descendant::terms][@type = 'terms'] | " \
75
+ "//sections/clause[not(@type = 'terms')]//terms".freeze
58
76
 
59
77
  NORM_REF =
60
78
  "//bibliography/references[@normative = 'true'][not(@hidden)] | " \
@@ -100,18 +118,33 @@ module Metanorma
100
118
 
101
119
  def termdef_boilerplate_insert_location(xmldoc)
102
120
  f = xmldoc.at(self.class::TERM_CLAUSE)
103
- root = xmldoc.at("//sections/terms | //sections/clause[.//terms]")
104
- !f || !root and return f || root
105
- f.at("./following::terms") and return root
106
- f.at("./preceding-sibling::clause") and return root
121
+ root = xmldoc.at("//sections/terms | //sections/clause[@type = 'terms']")
122
+ if f && root && f["id"] != root["id"]
123
+ f = termdef_boilerplate_climb_up(f, root)
124
+ elsif !f && root then f = root
125
+ end
107
126
  f
108
127
  end
109
128
 
129
+ def termdef_boilerplate_climb_up(clause, container)
130
+ container.at(".//*[@id = '#{clause['id']}']") or return clause
131
+ while (n = clause.parent)
132
+ n.at(".//definitions") and break
133
+ clause = n
134
+ n["id"] == container["id"] and break
135
+ end
136
+ clause
137
+ end
138
+
110
139
  def termdef_boilerplate_insert1(sect, xmldoc, isodoc)
111
- sect.at("./clause[@type = 'boilerplate'] | " \
112
- "./note[@type = 'boilerplate']") and return
113
- term_defs_boilerplate(sect.at("./title"),
114
- xmldoc.xpath(".//termdocsource"),
140
+ ins = sect.at("./title")
141
+ if (ins2 = sect.at("./clause[@type = 'boilerplate'] | " \
142
+ "./note[@type = 'boilerplate']"))
143
+ ins2.text.strip.downcase == "(default)" or return
144
+ ins2.children = " "
145
+ ins = ins2.children.first
146
+ end
147
+ term_defs_boilerplate(ins, xmldoc.xpath(".//termdocsource"),
115
148
  sect.at(".//term"), sect.at(".//p"), isodoc)
116
149
  end
117
150
 
@@ -120,7 +153,10 @@ module Metanorma
120
153
  termdef_boilerplate_cleanup(xmldoc)
121
154
  termdef_boilerplate_insert(xmldoc, isodoc)
122
155
  unwrap_boilerplate_clauses(xmldoc, self.class::TERM_CLAUSE)
123
- f = xmldoc.at(self.class::NORM_REF) and norm_ref_preface(f)
156
+ if f = xmldoc.at(self.class::NORM_REF)
157
+ norm_ref_preface(f)
158
+ unwrap_boilerplate_clauses(f, ".")
159
+ end
124
160
  initial_boilerplate(xmldoc, isodoc)
125
161
  end
126
162
 
@@ -27,7 +27,7 @@ module Metanorma
27
27
  end
28
28
 
29
29
  # https://medium.com/@rickwang_wxc/in-ruby-given-a-string-detect-if-it-is-valid-numeric-c58275eace60
30
- NUMERIC_REGEX = %r{^((\+|-)?\d*\.?\d+)([eE](\+|-){1}\d+)?$}.freeze
30
+ NUMERIC_REGEX = %r{^((\+|-)?\d*\.?\d+)([eE](\+|-){1}\d+)?$}
31
31
 
32
32
  MATHML_NS = "http://www.w3.org/1998/Math/MathML".freeze
33
33
 
@@ -204,6 +204,28 @@ module Metanorma
204
204
  end
205
205
  end
206
206
 
207
+ def mathml_mn_format(math)
208
+ math.xpath(".//m:mn", "m" => MATHML_NS).each do |m|
209
+ profile = mathml_mn_profile(m)
210
+ attr = profile.each_with_object([]) do |(k, v), acc|
211
+ v == "nil" and next
212
+ acc << "#{k}='#{v}'"
213
+ end.join(",")
214
+ attr.empty? or m["data-metanorma-numberformat"] = attr
215
+ end
216
+ end
217
+
218
+ def mathml_mn_profile(mnum)
219
+ fmt = @numberfmt_default&.dup || {}
220
+ fmt1 = {}
221
+ fmt2 = kv_parse(mnum["data-metanorma-numberformat"] || "")
222
+ if fmt2["profile"]
223
+ fmt1 = @numberfmt_prof[fmt2["profile"]] || {}
224
+ fmt2.delete("profile")
225
+ end
226
+ fmt.merge(fmt1).merge(fmt2)
227
+ end
228
+
207
229
  def mathml_cleanup(xmldoc)
208
230
  unitsml = Asciimath2UnitsML::Conv.new(asciimath2unitsml_options)
209
231
  xmldoc.xpath("//stem[@type = 'MathML'][not(@validate = 'false')]")
@@ -214,6 +236,7 @@ module Metanorma
214
236
  unitsml.MathML2UnitsML(x)
215
237
  mathml_mathvariant(x)
216
238
  mathml_italicise(x)
239
+ mathml_mn_format(x)
217
240
  end
218
241
  mathml_unitsML(xmldoc)
219
242
  end
@@ -1,4 +1,3 @@
1
- require "set"
2
1
  require "relaton_bib"
3
2
  require_relative "merge_bibitems"
4
3
  require_relative "spans_to_bibitem"
@@ -16,9 +16,7 @@ module Metanorma
16
16
  end
17
17
 
18
18
  def move_clauses_into_preface(xml, preface)
19
- xml.xpath("//*[@preface]").each do |c|
20
- to_preface(preface, c)
21
- end
19
+ xml.xpath("//*[@preface]").each { |c| to_preface(preface, c) }
22
20
  end
23
21
 
24
22
  def to_preface(preface, clause)
@@ -202,10 +200,9 @@ module Metanorma
202
200
  end
203
201
 
204
202
  # only move clausebefore notes at the very end of preface
205
- def endofpreface_clausebefore(xmldoc, ins)
206
- xmldoc.xpath("//preface//*[@beforeclauses = 'true']").reverse
207
- .each do |x|
208
- textafter = xmldoc.xpath("//preface//*") & x.xpath("./following::*")
203
+ def endofpreface_clausebefore(xml, ins)
204
+ xml.xpath("//preface//*[@beforeclauses = 'true']").reverse.each do |x|
205
+ textafter = xml.xpath("//preface//*") & x.xpath("./following::*")
209
206
  textafter.text.strip.empty? or break
210
207
  x.delete("beforeclauses")
211
208
  ins.previous = x.remove
@@ -241,9 +238,8 @@ module Metanorma
241
238
  def floating_title_preface2sections(xmldoc)
242
239
  t = xmldoc.at("//preface/floating-title") or return
243
240
  s = xmldoc.at("//sections")
244
- unless t.next_element
241
+ t.next_element or
245
242
  s.children.first.previous = t.remove
246
- end
247
243
  end
248
244
  end
249
245
  end
@@ -84,15 +84,15 @@ module Metanorma
84
84
 
85
85
  def section_names_terms1_cleanup(xml)
86
86
  auto_name_terms(xml) or return
87
- replace_title(xml, "//terms#{SYMnoABBR} | //clause[.//terms]#{SYMnoABBR}",
87
+ replace_title(xml, "//terms#{SYMnoABBR} | //clause[@type = 'terms']#{SYMnoABBR}",
88
88
  @i18n&.termsdefsymbols, true)
89
- replace_title(xml, "//terms#{ABBRnoSYM} | //clause[.//terms]#{ABBRnoSYM}",
89
+ replace_title(xml, "//terms#{ABBRnoSYM} | //clause[@type = 'terms']#{ABBRnoSYM}",
90
90
  @i18n&.termsdefabbrev, true)
91
- replace_title(xml, "//terms#{SYMABBR} | //clause[.//terms]#{SYMABBR}",
91
+ replace_title(xml, "//terms#{SYMABBR} | //clause[@type = 'terms']#{SYMABBR}",
92
92
  @i18n&.termsdefsymbolsabbrev, true)
93
- replace_title(xml, "//terms#{NO_SYMABBR} | //clause[.//terms]#{NO_SYMABBR}",
93
+ replace_title(xml, "//terms#{NO_SYMABBR} | //clause[@type = 'terms']#{NO_SYMABBR}",
94
94
  @i18n&.termsdefsymbolsabbrev, true)
95
- replace_title(xml, "//terms[not(.//definitions)] | //clause[.//terms][not(.//definitions)]",
95
+ replace_title(xml, "//terms[not(.//definitions)] | //clause[@type = 'terms'][not(.//definitions)]",
96
96
  @i18n&.termsdef, true)
97
97
  end
98
98
 
@@ -74,7 +74,10 @@ module Metanorma
74
74
  end
75
75
 
76
76
  def term_children_cleanup(xmldoc)
77
- xmldoc.xpath("//terms[terms][not(term)]").each { |t| t.name = "clause" }
77
+ xmldoc.xpath("//terms[terms][not(term)]").each do |t|
78
+ t.name = "clause"
79
+ t["type"] = "terms"
80
+ end
78
81
  xmldoc.xpath("//term").each do |t|
79
82
  %w(termnote termexample termsource term).each do |w|
80
83
  t.xpath("./#{w}").each { |n| t << n.remove }
@@ -122,8 +125,7 @@ module Metanorma
122
125
  end
123
126
 
124
127
  def term_index_cleanup(xmldoc)
125
- return unless @index_terms
126
-
128
+ @index_terms or return
127
129
  xmldoc.xpath("//preferred").each do |p|
128
130
  index_cleanup1(p.at("./expression/name | ./letter-symbol/name"),
129
131
  p.xpath("./field-of-application | ./usage-info")
@@ -135,8 +137,7 @@ module Metanorma
135
137
  end
136
138
 
137
139
  def index_cleanup1(term, fieldofappl)
138
- return unless term
139
-
140
+ term or return
140
141
  idx = term.children.dup
141
142
  fieldofappl.empty? or idx << ", &#x3c;#{fieldofappl}&#x3e;"
142
143
  term << "<index><primary>#{idx.to_xml}</primary></index>"
@@ -95,10 +95,9 @@ module Metanorma
95
95
  elem.xpath("./localityStack").size < 2 and return
96
96
  elem.xpath("./localityStack[not(@connective)]").each do |l|
97
97
  n = l.next_element
98
- l["connective"] = if n && n.name == "localityStack" &&
99
- n["connective"] == "to"
100
- "from"
101
- else "and" end
98
+ l["connective"] = "and"
99
+ n && n.name == "localityStack" && n["connective"] == "to" and
100
+ l["connective"] = "from"
102
101
  end
103
102
  end
104
103
 
@@ -111,8 +110,7 @@ module Metanorma
111
110
  elem.name = name
112
111
  elem["bibitemid"] = elem["target"]
113
112
  if ref = @anchors&.dig(elem["target"], :xref)
114
- t = @anchors.dig(elem["target"], :id, elem["style"]) and
115
- ref = t
113
+ t = @anchors.dig(elem["target"], :id, elem["style"]) and ref = t
116
114
  elem["citeas"] = @c.decode(ref)
117
115
  else xref_to_eref1(elem)
118
116
  end
@@ -141,9 +139,7 @@ module Metanorma
141
139
  e.name = "erefstack"
142
140
  e.delete("bibitemid")
143
141
  e.delete("citeas")
144
- e.xpath("./eref").each do |e1|
145
- e1["type"] = e["type"]
146
- end
142
+ e.xpath("./eref").each { |e1| e1["type"] = e["type"] }
147
143
  e.delete("type")
148
144
  end
149
145
  end
@@ -219,7 +215,7 @@ module Metanorma
219
215
  unless a.size < 2 || a[0].empty? || a[1].empty?
220
216
  elem["target"] = "#{a[0]}_#{a[1]}"
221
217
  a.size > 2 and
222
- elem.children = %{anchor="#{a[2..-1].join}",#{elem.children&.text}}
218
+ elem.children = %{anchor="#{a[2..].join}",#{elem.children&.text}}
223
219
  elem["type"] = a[0]
224
220
  @internal_eref_namespaces << a[0]
225
221
  xref_to_eref(elem, "eref")
@@ -67,6 +67,7 @@ module Metanorma
67
67
  inline_macro Metanorma::Standoc::ToCInlineMacro
68
68
  inline_macro Metanorma::Standoc::PassInlineMacro
69
69
  inline_macro Metanorma::Standoc::StdLinkInlineMacro
70
+ inline_macro Metanorma::Standoc::NumberInlineMacro
70
71
  block Metanorma::Standoc::ToDoAdmonitionBlock
71
72
  block Metanorma::Standoc::EditorAdmonitionBlock
72
73
  treeprocessor Metanorma::Standoc::EditorInlineAdmonitionBlock
@@ -1,3 +1,5 @@
1
+ require_relative "utils"
2
+
1
3
  module Metanorma
2
4
  module Standoc
3
5
  module Base
@@ -10,6 +12,7 @@ module Metanorma
10
12
  init_output(node) # feeds init_biblio
11
13
  init_i18n(node)
12
14
  init_biblio(node)
15
+ init_math(node)
13
16
  @metadata_attrs = metadata_attrs(node)
14
17
  end
15
18
 
@@ -42,12 +45,11 @@ module Metanorma
42
45
  def init_processing(node)
43
46
  @novalid = node.attr("novalid")
44
47
  @smartquotes = node.attr("smartquotes") != "false"
45
- @keepasciimath = node.attr("mn-keep-asciimath") &&
46
- node.attr("mn-keep-asciimath") != "false"
47
48
  @sourcecode_markup_start = node.attr("sourcecode-markup-start") || "{{{"
48
49
  @sourcecode_markup_end = node.attr("sourcecode-markup-end") || "}}}"
49
50
  @datauriimage = node.attr("data-uri-image") != "false"
50
51
  @datauriattachment = node.attr("data-uri-attachment") != "false"
52
+ @dataurimaxsize = node.attr("data-uri-maxsize")&.to_i || 13981013
51
53
  @blockunnumbered = (node.attr("block-unnumbered") || "").split(",")
52
54
  .map(&:strip)
53
55
  end
@@ -101,6 +103,7 @@ module Metanorma
101
103
  def init_biblio(node)
102
104
  @no_isobib_cache = node.attr("no-isobib-cache")
103
105
  @no_isobib = node.attr("no-isobib")
106
+ init_bib_log
104
107
  @bibdb = nil
105
108
  init_bib_caches(node)
106
109
  init_iev_caches(node)
@@ -108,6 +111,24 @@ module Metanorma
108
111
  ::Metanorma::Standoc::LocalBiblio.new(node, @localdir, self)
109
112
  end
110
113
 
114
+ def init_bib_log
115
+ @relaton_log = StringIO.new
116
+ relaton_logger = Relaton::Logger::Log
117
+ .new(@relaton_log, levels: %i(info warn error fatal unknown),
118
+ formatter: Relaton::Logger::FormatterJSON)
119
+ Relaton.logger_pool[:my_logger] = relaton_logger
120
+ end
121
+
122
+ def init_math(node)
123
+ @keepasciimath = node.attr("mn-keep-asciimath") &&
124
+ node.attr("mn-keep-asciimath") != "false"
125
+ @numberfmt_default = kv_parse(node.attr("number-presentation"))
126
+ @numberfmt_prof = node.attributes.each_with_object({}) do |(k, v), m|
127
+ p = /^number-presentation-profile-(.*)$/.match(k) or next
128
+ m[p[1]] = kv_parse(v)
129
+ end
130
+ end
131
+
111
132
  def requirements_processor
112
133
  Metanorma::Requirements
113
134
  end
@@ -43,21 +43,21 @@ module Metanorma
43
43
  if /&lt;([^:>&]+:)?math(\s+[^>&]+)?&gt; |
44
44
  <([^:>&]+:)?math(\s+[^>&]+)?>/x.match? text
45
45
  math = xml_encode(text)
46
- xml.stem type: "MathML", block: block do |s|
46
+ xml.stem(type: "MathML", block:) do |s|
47
47
  s << math
48
48
  end
49
49
  elsif style == :latexmath then latex_parse(text, xml, block)
50
50
  else
51
- xml.stem text&.gsub("&amp;#", "&#"), type: "AsciiMath", block: block
51
+ xml.stem text&.gsub("&amp;#", "&#"), type: "AsciiMath", block:
52
52
  end
53
53
  end
54
54
 
55
55
  def latex_parse(text, xml, block)
56
56
  latex = latex_parse1(text, block) or
57
- return xml.stem type: "MathML", block: block
58
- xml.stem type: "MathML", block: block do |s|
57
+ return xml.stem(type: "MathML", block:)
58
+ xml.stem(type: "MathML", block:) do |s|
59
59
  math = Nokogiri::XML.fragment(latex.sub(/<\?[^>]+>/, ""))
60
- .elements[0]
60
+ .elements[0]
61
61
  math.delete("alttext")
62
62
  s.parent.children = math
63
63
  s << "<latexmath>#{text}</latexmath>"
@@ -17,7 +17,7 @@
17
17
  these elements; we just want one namespace for any child grammars
18
18
  of this.
19
19
  -->
20
- <!-- VERSION v1.3.2 -->
20
+ <!-- VERSION v1.3.3 -->
21
21
  <grammar xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
22
22
  <include href="reqt.rng"/>
23
23
  <include href="basicdoc.rng">
@@ -331,9 +331,9 @@
331
331
  <zeroOrMore>
332
332
  <ref name="table-note"/>
333
333
  </zeroOrMore>
334
- <optional>
334
+ <zeroOrMore>
335
335
  <ref name="source"/>
336
- </optional>
336
+ </zeroOrMore>
337
337
  </define>
338
338
  <define name="FigureAttr">
339
339
  <optional>
@@ -380,9 +380,9 @@
380
380
  <zeroOrMore>
381
381
  <ref name="note"/>
382
382
  </zeroOrMore>
383
- <optional>
383
+ <zeroOrMore>
384
384
  <ref name="source"/>
385
- </optional>
385
+ </zeroOrMore>
386
386
  </define>
387
387
  <define name="source">
388
388
  <element name="source">