metanorma-standoc 2.9.6 → 2.9.7

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.
@@ -20,7 +20,7 @@ module Metanorma
20
20
  def asciimath2mathml_indiv(elem)
21
21
  elem["type"] = "MathML"
22
22
  expr = @c.decode(elem.text)
23
- ret = asciimath_parse(expr, elem)
23
+ ret = asciimath_parse(expr, elem)&.strip
24
24
  ret += "<asciimath>#{@c.encode(expr, :basic)}</asciimath>"
25
25
  elem.children = ret
26
26
  rescue StandardError => e
@@ -102,7 +102,7 @@ module Metanorma
102
102
  ins
103
103
  end
104
104
 
105
- def mathml_unitsML(xmldoc)
105
+ def mathml_unitsml(xmldoc)
106
106
  xmldoc.at(".//m:*", "m" => UNITSML_NS) or return
107
107
  misc = add_misc_container(xmldoc)
108
108
  unitsml = misc.add_child("<UnitsML xmlns='#{UNITSML_NS}'/>").first
@@ -131,7 +131,7 @@ module Metanorma
131
131
  profile = mathml_mn_profile(m)
132
132
  attr = profile.each_with_object([]) do |(k, v), acc|
133
133
  v == "nil" and next
134
- acc << "#{k}='#{v}'"
134
+ acc << "#{k}='#{@c.decode v}'"
135
135
  end.join(",")
136
136
  attr.empty? or m["data-metanorma-numberformat"] = attr
137
137
  end
@@ -152,10 +152,10 @@ module Metanorma
152
152
  f = mathml_stem_format_attr(stem) or return
153
153
  attr = quoted_csv_split(f, ",").map do |x|
154
154
  m = /^(.+?)=(.+)?$/.match(x) or next
155
- "#{m[1]}='#{m[2]}'"
155
+ "#{m[1]}='#{@c.decode m[2]}'"
156
156
  end.join(",")
157
157
  stem.xpath(".//m:mn", "m" => MATHML_NS).each do |m|
158
- m["data-metanorma-numberformat"] = attr
158
+ attr.empty? or m["data-metanorma-numberformat"] = attr
159
159
  end
160
160
  end
161
161
 
@@ -168,7 +168,7 @@ module Metanorma
168
168
  f == "default" or return f
169
169
  if @numberfmt_default.empty?
170
170
  "notation='basic'"
171
- else @numberfmt_default&.map { |k, v| "#{k}=#{v}" }&.join(",")
171
+ else @numberfmt_default&.map { |k, v| "#{k}='#{v}'" }&.join(",")
172
172
  end
173
173
  end
174
174
 
@@ -179,15 +179,16 @@ module Metanorma
179
179
  end
180
180
 
181
181
  def mathml_cleanup(xmldoc)
182
- unitsml = Asciimath2UnitsML::Conv.new(asciimath2unitsml_options)
182
+ a2u = Asciimath2UnitsML::Conv.new(asciimath2unitsml_options)
183
183
  xmldoc.xpath("//stem[@type = 'MathML'][not(@validate = 'false')]")
184
184
  .each do |x|
185
185
  mathml_xml_cleanup(x)
186
- unitsml.MathML2UnitsML(x)
186
+ a2u.MathML2UnitsML(x)
187
187
  mathml_mathvariant(x)
188
- mathml_number_format(x)
189
188
  end
190
- mathml_unitsML(xmldoc)
189
+ xmldoc.xpath("//stem[@type = 'MathML']")
190
+ .each { |x| mathml_number_format(x) }
191
+ mathml_unitsml(xmldoc)
191
192
  end
192
193
  end
193
194
  end
@@ -40,14 +40,21 @@ module Metanorma
40
40
  def linebreak_cleanup_block(block)
41
41
  block.each_with_index do |e, i|
42
42
  e[:skip] and next
43
- lines = e[:text].lines.map(&:rstrip)
44
- e[:last] or lines << block[i + 1][:text].lines.first # next token context
43
+ lines = lines_strip_textspan(e, block[i + 1])
45
44
  out = Metanorma::Utils.line_sanitise(lines)
46
45
  e[:last] or out.pop
47
46
  e[:elem].replace(out.join)
48
47
  end
49
48
  end
50
49
 
50
+ def lines_strip_textspan(span, nextspan)
51
+ lines = span[:text].lines[0..-2].map(&:rstrip) <<
52
+ span[:text].lines[-1]&.sub(/\n$/, "")
53
+ # no final line rstrip: can be space linking to next line
54
+ span[:last] or lines << nextspan[:text].lines.first # next token context
55
+ lines
56
+ end
57
+
51
58
  def gather_text_for_linebreak_cleanup(block)
52
59
  x = block.xpath(".//text()").map do |e|
53
60
  { elem: e, text: e.text,
@@ -25,6 +25,7 @@ module Metanorma
25
25
  preprocessor Metanorma::Plugin::Lutaml::LutamlPreprocessor
26
26
  preprocessor Metanorma::Plugin::Lutaml::LutamlUmlAttributesTablePreprocessor
27
27
  preprocessor Metanorma::Plugin::Lutaml::LutamlUmlDatamodelDescriptionPreprocessor
28
+ preprocessor Metanorma::Plugin::Lutaml::LutamlEaXmiPreprocessor
28
29
  preprocessor Metanorma::Plugin::Lutaml::LutamlUmlClassPreprocessor
29
30
  inline_macro Metanorma::Plugin::Lutaml::LutamlFigureInlineMacro
30
31
  inline_macro Metanorma::Plugin::Lutaml::LutamlTableInlineMacro
@@ -33,6 +34,7 @@ module Metanorma
33
34
  block Metanorma::Plugin::Lutaml::LutamlDiagramBlock
34
35
  block_macro Metanorma::Plugin::Lutaml::LutamlGmlDictionaryBlockMacro
35
36
  block Metanorma::Plugin::Lutaml::LutamlGmlDictionaryBlock
37
+ block_macro Metanorma::Plugin::Lutaml::LutamlKlassTableBlockMacro
36
38
  preprocessor Metanorma::Standoc::EmbedIncludeProcessor
37
39
  preprocessor Metanorma::Standoc::LinkProtectPreprocessor
38
40
  preprocessor Metanorma::Standoc::Datamodel::AttributesTablePreprocessor
@@ -7,6 +7,8 @@ module Metanorma
7
7
  init_vars
8
8
  init_misc(node)
9
9
  init_processing(node)
10
+ init_log(node)
11
+ init_image(node)
10
12
  init_reqt(node)
11
13
  init_toc(node)
12
14
  init_output(node) # feeds init_biblio
@@ -47,11 +49,22 @@ module Metanorma
47
49
  @smartquotes = node.attr("smartquotes") != "false"
48
50
  @sourcecode_markup_start = node.attr("sourcecode-markup-start") || "{{{"
49
51
  @sourcecode_markup_end = node.attr("sourcecode-markup-end") || "}}}"
52
+ @blockunnumbered = (node.attr("block-unnumbered") || "").split(",")
53
+ .map(&:strip)
54
+ end
55
+
56
+ def init_log(node)
57
+ @log or return
58
+ severity = node.attr("log-filter-severity")&.to_i || 4
59
+ category = node.attr("log-filter-category") || ""
60
+ category = category.split(",").map(&:strip)
61
+ @log.suppress_log = { severity:, category: }
62
+ end
63
+
64
+ def init_image(node)
50
65
  @datauriimage = node.attr("data-uri-image") != "false"
51
66
  @datauriattachment = node.attr("data-uri-attachment") != "false"
52
67
  @dataurimaxsize = node.attr("data-uri-maxsize")&.to_i || 13981013
53
- @blockunnumbered = (node.attr("block-unnumbered") || "").split(",")
54
- .map(&:strip)
55
68
  end
56
69
 
57
70
  def init_reqt(node)
@@ -123,15 +136,15 @@ module Metanorma
123
136
  def init_math(node)
124
137
  @keepasciimath = node.attr("mn-keep-asciimath") &&
125
138
  node.attr("mn-keep-asciimath") != "false"
126
- @numberfmt_default = kv_parse(node.attr("number-presentation"))
127
- @numberfmt_formula = node.attr("number-presentation-formula")
139
+ @numberfmt_default = kv_parse(@c.decode(node.attr("number-presentation")))
140
+ @numberfmt_formula = @c.decode(node.attr("number-presentation-formula"))
128
141
  @numberfmt_formula == "number-presentation" and
129
- @numberfmt_formula = node.attr("number-presentation")
142
+ @numberfmt_formula = @c.decode(node.attr("number-presentation"))
130
143
  @numberfmt_formula == "default" and
131
144
  @numberfmt_formula = "notation='basic'"
132
145
  @numberfmt_prof = node.attributes.each_with_object({}) do |(k, v), m|
133
146
  p = /^number-presentation-profile-(.*)$/.match(k) or next
134
- m[p[1]] = kv_parse(v)
147
+ m[p[1]] = kv_parse(@c.decode(v))
135
148
  end
136
149
  end
137
150
 
@@ -40,21 +40,29 @@ module Metanorma
40
40
  end
41
41
 
42
42
  def stem_parse(text, xml, style, node)
43
- attr = stem_attrs(node)
43
+ attrs, text = stem_attrs(node, text)
44
44
  if /&lt;([^:>&]+:)?math(\s+[^>&]+)?&gt; |
45
45
  <([^:>&]+:)?math(\s+[^>&]+)?>/x.match? text
46
- xml.stem **attr.merge(type: "MathML") do |s|
46
+ xml.stem **attrs.merge(type: "MathML") do |s|
47
47
  s << xml_encode(text)
48
48
  end
49
- elsif style == :latexmath then latex_parse(text, xml, attr)
49
+ elsif style == :latexmath then latex_parse(text, xml, attrs)
50
50
  else
51
- xml.stem text&.gsub("&amp;#", "&#"), **attr.merge(type: "AsciiMath")
51
+ xml.stem text&.gsub("&amp;#", "&#"), **attrs.merge(type: "AsciiMath")
52
52
  end
53
53
  end
54
54
 
55
- def stem_attrs(node)
56
- n = node.attr("number-format")
57
- { block: node.block?, "number-format": n }.compact
55
+ STEM_ATTRS = "number-format".freeze
56
+
57
+ def stem_attrs(node, text)
58
+ attrs = STEM_ATTRS.split("|").each_with_object({}) do |k, m|
59
+ n = node.attr(k) and m[k.to_sym] = n
60
+ end
61
+ while m = /^(#{STEM_ATTRS})(=[^%]+)?%(.*)$/o.match(text)
62
+ text = m[3]
63
+ attrs[m[1].to_sym] = m[2]&.sub(/^=/, "")
64
+ end
65
+ [{ block: node.block? }.merge(attrs), text]
58
66
  end
59
67
 
60
68
  def latex_parse(text, xml, attr)