metanorma-standoc 2.9.5 → 2.9.7

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/lib/isodoc/html/htmlstyle.css +4 -1
  3. data/lib/metanorma/standoc/base.rb +8 -8
  4. data/lib/metanorma/standoc/basicdoc.rng +909 -464
  5. data/lib/metanorma/standoc/biblio-standoc.rng +87 -20
  6. data/lib/metanorma/standoc/biblio.rng +884 -325
  7. data/lib/metanorma/standoc/blocks.rb +1 -1
  8. data/lib/metanorma/standoc/cleanup.rb +4 -2
  9. data/lib/metanorma/standoc/cleanup_bibitem.rb +18 -6
  10. data/lib/metanorma/standoc/cleanup_boilerplate.rb +9 -93
  11. data/lib/metanorma/standoc/cleanup_inline.rb +1 -1
  12. data/lib/metanorma/standoc/cleanup_maths.rb +51 -101
  13. data/lib/metanorma/standoc/cleanup_mathvariant.rb +88 -0
  14. data/lib/metanorma/standoc/cleanup_terms.rb +4 -1
  15. data/lib/metanorma/standoc/cleanup_terms_boilerplate.rb +106 -0
  16. data/lib/metanorma/standoc/cleanup_terms_designations.rb +1 -2
  17. data/lib/metanorma/standoc/cleanup_text.rb +11 -4
  18. data/lib/metanorma/standoc/cleanup_xref.rb +1 -1
  19. data/lib/metanorma/standoc/converter.rb +2 -0
  20. data/lib/metanorma/standoc/datamodel/plantuml_renderer.rb +1 -1
  21. data/lib/metanorma/standoc/init.rb +23 -4
  22. data/lib/metanorma/standoc/inline.rb +27 -14
  23. data/lib/metanorma/standoc/isodoc.rng +1031 -912
  24. data/lib/metanorma/standoc/localbib.rb +1 -1
  25. data/lib/metanorma/standoc/macros.rb +1 -1
  26. data/lib/metanorma/standoc/macros_inline.rb +11 -9
  27. data/lib/metanorma/standoc/macros_plantuml.rb +1 -1
  28. data/lib/metanorma/standoc/ref.rb +1 -1
  29. data/lib/metanorma/standoc/ref_queue.rb +1 -1
  30. data/lib/metanorma/standoc/ref_utility.rb +7 -6
  31. data/lib/metanorma/standoc/reqt.rng +94 -72
  32. data/lib/metanorma/standoc/section.rb +2 -2
  33. data/lib/metanorma/standoc/term_lookup_cleanup.rb +2 -2
  34. data/lib/metanorma/standoc/utils.rb +4 -2
  35. data/lib/metanorma/standoc/version.rb +1 -1
  36. metadata +4 -2
@@ -156,8 +156,7 @@ module Metanorma
156
156
  while %w(domain subject).include? p&.name
157
157
  p = p.previous_element
158
158
  end
159
- DESIGNATOR.include?(p&.name) or
160
- next
159
+ DESIGNATOR.include?(p&.name) or next
161
160
  related2pref(p) << t.remove
162
161
  end
163
162
  end
@@ -2,8 +2,8 @@ module Metanorma
2
2
  module Standoc
3
3
  module Cleanup
4
4
  def textcleanup(result)
5
- text = result.flatten.map { |l| l.sub(/\s*\Z/, "") } * "\n"
6
- text = text.gsub(/\s+<fn /, "<fn ")
5
+ text = result.flatten.map(&:rstrip) * "\n"
6
+ text = text.gsub(/(?<!\s)\s+<fn /, "<fn ")
7
7
  %w(passthrough passthrough-inline).each do |v|
8
8
  text.gsub!(%r{<#{v}\s+formats="metanorma">([^<]*)
9
9
  </#{v}>}mx) { @c.decode($1) }
@@ -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,
@@ -176,7 +176,7 @@ module Metanorma
176
176
 
177
177
  def xref_compound_cleanup1(xref, locations)
178
178
  xref.children.empty? and xref.children = "<sentinel/>"
179
- xref_parse_compound_locations(locations).reverse.each do |y|
179
+ xref_parse_compound_locations(locations).reverse_each do |y|
180
180
  xref.children.first.previous =
181
181
  "<xref target='#{y[1]}' connective='#{y[0]}'/>"
182
182
  end
@@ -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
@@ -15,7 +15,7 @@ module Metanorma
15
15
  end
16
16
 
17
17
  def join_as_plantuml(*ary)
18
- ary.compact.join("\n").sub(/\s+\Z/, "")
18
+ ary.compact.join("\n").sub(/(?<!\s)\s+\Z/, "")
19
19
  end
20
20
 
21
21
  def render
@@ -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)
@@ -103,6 +116,7 @@ module Metanorma
103
116
  def init_biblio(node)
104
117
  @no_isobib_cache = node.attr("no-isobib-cache")
105
118
  @no_isobib = node.attr("no-isobib")
119
+ @flush_caches = node.attr("flush-caches")
106
120
  init_bib_log
107
121
  @bibdb = nil
108
122
  init_bib_caches(node)
@@ -122,10 +136,15 @@ module Metanorma
122
136
  def init_math(node)
123
137
  @keepasciimath = node.attr("mn-keep-asciimath") &&
124
138
  node.attr("mn-keep-asciimath") != "false"
125
- @numberfmt_default = kv_parse(node.attr("number-presentation"))
139
+ @numberfmt_default = kv_parse(@c.decode(node.attr("number-presentation")))
140
+ @numberfmt_formula = @c.decode(node.attr("number-presentation-formula"))
141
+ @numberfmt_formula == "number-presentation" and
142
+ @numberfmt_formula = @c.decode(node.attr("number-presentation"))
143
+ @numberfmt_formula == "default" and
144
+ @numberfmt_formula = "notation='basic'"
126
145
  @numberfmt_prof = node.attributes.each_with_object({}) do |(k, v), m|
127
146
  p = /^number-presentation-profile-(.*)$/.match(k) or next
128
- m[p[1]] = kv_parse(v)
147
+ m[p[1]] = kv_parse(@c.decode(v))
129
148
  end
130
149
  end
131
150
 
@@ -39,25 +39,38 @@ module Metanorma
39
39
  results.sub(%r{<math ([^>]+ )?display="block"}, "<math \\1")
40
40
  end
41
41
 
42
- def stem_parse(text, xml, style, block)
42
+ def stem_parse(text, xml, style, node)
43
+ attrs, text = stem_attrs(node, text)
43
44
  if /&lt;([^:>&]+:)?math(\s+[^>&]+)?&gt; |
44
45
  <([^:>&]+:)?math(\s+[^>&]+)?>/x.match? text
45
- math = xml_encode(text)
46
- xml.stem(type: "MathML", block:) do |s|
47
- s << math
46
+ xml.stem **attrs.merge(type: "MathML") do |s|
47
+ s << xml_encode(text)
48
48
  end
49
- elsif style == :latexmath then latex_parse(text, xml, block)
49
+ elsif style == :latexmath then latex_parse(text, xml, attrs)
50
50
  else
51
- xml.stem text&.gsub("&amp;#", "&#"), type: "AsciiMath", block:
51
+ xml.stem text&.gsub("&amp;#", "&#"), **attrs.merge(type: "AsciiMath")
52
52
  end
53
53
  end
54
54
 
55
- def latex_parse(text, xml, block)
56
- latex = latex_parse1(text, block) or
57
- return xml.stem(type: "MathML", block:)
58
- xml.stem(type: "MathML", block:) do |s|
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]
66
+ end
67
+
68
+ def latex_parse(text, xml, attr)
69
+ latex = latex_parse1(text, attr[:block]) or
70
+ return xml.stem **attr.merge(type: "MathML")
71
+ xml.stem **attr.merge(type: "MathML") do |s|
59
72
  math = Nokogiri::XML.fragment(latex.sub(/<\?[^>]+>/, ""))
60
- .elements[0]
73
+ .elements[0]
61
74
  math.delete("alttext")
62
75
  s.parent.children = math
63
76
  s << "<latexmath>#{text}</latexmath>"
@@ -78,8 +91,8 @@ module Metanorma
78
91
  when :single then xml << "'#{node.text}'"
79
92
  when :superscript then xml.sup { |s| s << node.text }
80
93
  when :subscript then xml.sub { |s| s << node.text }
81
- when :asciimath then stem_parse(node.text, xml, :asciimath, false)
82
- when :latexmath then stem_parse(node.text, xml, :latexmath, false)
94
+ when :asciimath then stem_parse(node.text, xml, :asciimath, node)
95
+ when :latexmath then stem_parse(node.text, xml, :latexmath, node)
83
96
  when :mark then highlight_parse(node.text, xml)
84
97
  else
85
98
  case node.role
@@ -123,7 +136,7 @@ module Metanorma
123
136
  end
124
137
  uri = node.image_uri (nodetarget)
125
138
  if Gem.win_platform? && /^\/[a-zA-Z]:/.match?(uri)
126
- uri = uri[1..-1]
139
+ uri = uri[1..]
127
140
  end
128
141
  types = if /^data:/.match?(uri) then Vectory::Utils::datauri2mime(uri)
129
142
  else MIME::Types.type_for(uri)