metanorma-standoc 1.8.1 → 1.8.2
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 +4 -4
- data/lib/asciidoctor/standoc/base.rb +3 -1
- data/lib/asciidoctor/standoc/cleanup.rb +25 -73
- data/lib/asciidoctor/standoc/cleanup_block.rb +2 -4
- data/lib/asciidoctor/standoc/cleanup_maths.rb +86 -0
- data/lib/metanorma/standoc/version.rb +1 -1
- data/spec/asciidoctor-standoc/cleanup_spec.rb +65 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90c09f71739f8d485363ce3a4f950b143c0264f5b4657fd0891df83a00c44f72
|
4
|
+
data.tar.gz: cb0c51236e8c1780aa2a89b7a0c53efeabc2a4af3ef68e6c08aa8936efdea47d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96533136bca911c4f886e6d0aeaa0e86ce94cf754d721af5537c835b744980fef11555e494d5d485a348c1ea911d1394cfb215f9f02cbf095a90bd652cae2916
|
7
|
+
data.tar.gz: 80bd100da6d8d05fdc69f8f52d20e9af182bd3196c42074663241dc8e35bee952eb8bf7ef95fbf444dbcd25f1bd45ac7d864f70c394df372f8d24b1e26a385d7
|
@@ -104,12 +104,14 @@ module Asciidoctor
|
|
104
104
|
@output_dir = outputdir node
|
105
105
|
@no_isobib_cache = node.attr("no-isobib-cache")
|
106
106
|
@no_isobib = node.attr("no-isobib")
|
107
|
+
@sourcecode_markup_start = node.attr("sourcecode-markup-start") || "{{{"
|
108
|
+
@sourcecode_markup_end = node.attr("sourcecode-markup-end") || "}}}"
|
107
109
|
@bibdb = nil
|
108
110
|
@seen_headers = []
|
109
111
|
@datauriimage = node.attr("data-uri-image")
|
110
112
|
@boilerplateauthority = node.attr("boilerplate-authority")
|
111
113
|
@sourcecode_markup_start = node.attr("sourcecode-markup-start") || "{{{"
|
112
|
-
@sourcecode_markup_end = node.attr("sourcecode-markup-
|
114
|
+
@sourcecode_markup_end = node.attr("sourcecode-markup-end") || "}}}"
|
113
115
|
@log = Metanorma::Utils::Log.new
|
114
116
|
init_bib_caches(node)
|
115
117
|
init_iev_caches(node)
|
@@ -11,6 +11,7 @@ require_relative "./cleanup_section.rb"
|
|
11
11
|
require_relative "./cleanup_terms.rb"
|
12
12
|
require_relative "./cleanup_inline.rb"
|
13
13
|
require_relative "./cleanup_amend.rb"
|
14
|
+
require_relative "./cleanup_maths.rb"
|
14
15
|
require "relaton_iev"
|
15
16
|
|
16
17
|
module Asciidoctor
|
@@ -24,25 +25,15 @@ module Asciidoctor
|
|
24
25
|
</passthrough>}mx) { |m| HTMLEntities.new.decode($1) }
|
25
26
|
end
|
26
27
|
|
27
|
-
def asciimath2mathml(text)
|
28
|
-
text = text.gsub(%r{<stem type="AsciiMath">(.+?)</stem>}m) do |m|
|
29
|
-
"<amathstem>#{HTMLEntities.new.decode($1)}</amathstem>"
|
30
|
-
end
|
31
|
-
text = Html2Doc.asciimath_to_mathml(text, ["<amathstem>", "</amathstem>"])
|
32
|
-
x = Nokogiri::XML(text)
|
33
|
-
x.xpath("//*[local-name() = 'math'][not(parent::stem)]").each do |y|
|
34
|
-
y.wrap("<stem type='MathML'></stem>")
|
35
|
-
end
|
36
|
-
x.to_xml
|
37
|
-
end
|
38
|
-
|
39
28
|
def cleanup(xmldoc)
|
40
29
|
element_name_cleanup(xmldoc)
|
41
30
|
sections_cleanup(xmldoc)
|
42
31
|
obligations_cleanup(xmldoc)
|
43
32
|
table_cleanup(xmldoc)
|
44
33
|
formula_cleanup(xmldoc)
|
34
|
+
sourcecode_cleanup(xmldoc)
|
45
35
|
figure_cleanup(xmldoc)
|
36
|
+
element_name_cleanup(xmldoc)
|
46
37
|
ref_cleanup(xmldoc)
|
47
38
|
note_cleanup(xmldoc)
|
48
39
|
clausebefore_cleanup(xmldoc)
|
@@ -83,8 +74,7 @@ module Asciidoctor
|
|
83
74
|
next unless n.text?
|
84
75
|
if @smartquotes
|
85
76
|
/[-'"(<>]|\.\.|\dx/.match(n) or next
|
86
|
-
n.ancestors("pre, tt, sourcecode, bibdata, on, "
|
87
|
-
"stem, figure[@class = 'pseudocode']").empty? or next
|
77
|
+
n.ancestors("pre, tt, sourcecode, bibdata, on, stem, figure[@class = 'pseudocode']").empty? or next
|
88
78
|
n.replace(Metanorma::Utils::smartformat(n.text))
|
89
79
|
else
|
90
80
|
n.replace(n.text.gsub(/(?<=\p{Alnum})\u2019(?=\p{Alpha})/, "'"))#.
|
@@ -148,59 +138,26 @@ module Asciidoctor
|
|
148
138
|
align_callouts_to_annotations(xmldoc)
|
149
139
|
end
|
150
140
|
|
151
|
-
def
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
MATHML_NS = "http://www.w3.org/1998/Math/MathML".freeze
|
160
|
-
|
161
|
-
def mathml_preserve_space(m)
|
162
|
-
m.xpath(".//m:mtext", "m" => MATHML_NS).each do |x|
|
163
|
-
x.children = x.children.to_xml.gsub(/^\s/, " ").gsub(/\s$/, " ")
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
def mathml_namespace(stem)
|
168
|
-
stem.xpath("./math", ).each { |x| x.default_namespace = MATHML_NS }
|
169
|
-
end
|
170
|
-
|
171
|
-
def mathml_mi_italics
|
172
|
-
{ uppergreek: true, upperroman: true,
|
173
|
-
lowergreek: true, lowerroman: true }
|
174
|
-
end
|
175
|
-
|
176
|
-
# presuppose multichar mi upright, singlechar mi MathML default italic
|
177
|
-
def mathml_italicise(x)
|
178
|
-
x.xpath(".//m:mi[not(ancestor::*[@mathvariant])]", "m" => MATHML_NS).each do |i|
|
179
|
-
char = HTMLEntities.new.decode(i.text)
|
180
|
-
i["mathvariant"] = "normal" if mi_italicise?(char)
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
def mi_italicise?(c)
|
185
|
-
return false if c.length > 1
|
186
|
-
if /\p{Greek}/.match(c)
|
187
|
-
/\p{Lower}/.match(c) && !mathml_mi_italics[:lowergreek] ||
|
188
|
-
/\p{Upper}/.match(c) && !mathml_mi_italics[:uppergreek]
|
189
|
-
elsif /\p{Latin}/.match(c)
|
190
|
-
/\p{Lower}/.match(c) && !mathml_mi_italics[:lowerroman] ||
|
191
|
-
/\p{Upper}/.match(c) && !mathml_mi_italics[:upperroman]
|
192
|
-
else
|
193
|
-
false
|
141
|
+
def sourcecode_cleanup(xmldoc)
|
142
|
+
xmldoc.xpath("//sourcecode").each do |x|
|
143
|
+
x.traverse do |n|
|
144
|
+
next unless n.text?
|
145
|
+
next unless /#{Regexp.escape(@sourcecode_markup_start)}/.match(n.text)
|
146
|
+
n.replace(sourcecode_markup(n))
|
147
|
+
end
|
194
148
|
end
|
195
149
|
end
|
196
150
|
|
197
|
-
def
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
151
|
+
def sourcecode_markup(n)
|
152
|
+
acc = []
|
153
|
+
n.text.split(/(#{Regexp.escape(@sourcecode_markup_start)}|#{Regexp.escape(@sourcecode_markup_end)})/).
|
154
|
+
each_slice(4).map do |a|
|
155
|
+
acc << Nokogiri::XML::Text.new(a[0], n.document).
|
156
|
+
to_xml(encoding: "US-ASCII", save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION)
|
157
|
+
next unless a.size == 4
|
158
|
+
acc << Asciidoctor.convert(a[2], backend: (self&.backend&.to_sym || :standoc), doctype: :inline)
|
203
159
|
end
|
160
|
+
acc.join
|
204
161
|
end
|
205
162
|
|
206
163
|
# allows us to deal with doc relation localities,
|
@@ -214,23 +171,18 @@ module Asciidoctor
|
|
214
171
|
|
215
172
|
def img_cleanup(xmldoc)
|
216
173
|
return xmldoc unless @datauriimage
|
217
|
-
xmldoc.xpath("//image").each
|
218
|
-
i["src"] = datauri(i["src"])
|
219
|
-
end
|
174
|
+
xmldoc.xpath("//image").each { |i| i["src"] = datauri(i["src"]) }
|
220
175
|
end
|
221
176
|
|
222
177
|
def variant_cleanup(xmldoc)
|
223
178
|
xmldoc.xpath("//*[variant]").each do |c|
|
224
|
-
c&.next&.text? && c&.next&.next&.name == "variant" &&
|
225
|
-
c.next.
|
179
|
+
c&.next&.text? && c&.next&.next&.name == "variant" && c.next.text.gsub(/\s/, "").empty? and
|
180
|
+
c.next.remove
|
226
181
|
end
|
227
182
|
xmldoc.xpath("//*[variant]").each do |c|
|
228
|
-
next unless c.children.any?
|
229
|
-
n.name != "variant" && (!n.text? || !n.text.gsub(/\s/, "").empty?)
|
230
|
-
end
|
183
|
+
next unless c.children.any? { |n| n.name != "variant" && (!n.text? || !n.text.gsub(/\s/, "").empty?) }
|
231
184
|
c.xpath("./variant").each do |n|
|
232
|
-
if n.at_xpath('preceding-sibling::node()[not(self::text()'
|
233
|
-
'[not(normalize-space())])][1][self::variantwrap]')
|
185
|
+
if n.at_xpath('preceding-sibling::node()[not(self::text()[not(normalize-space())])][1][self::variantwrap]')
|
234
186
|
n.previous_element << n
|
235
187
|
else
|
236
188
|
n.replace('<variantwrap/>').first << n
|
@@ -32,8 +32,7 @@ module Asciidoctor
|
|
32
32
|
def dl2_table_cleanup(xmldoc)
|
33
33
|
q = "//table/following-sibling::*[1][self::p]"
|
34
34
|
xmldoc.xpath(q).each do |s|
|
35
|
-
if s.text =~ /^\s*key[^a-z]*$/i && !s.next_element.nil? &&
|
36
|
-
s.next_element.name == "dl"
|
35
|
+
if s.text =~ /^\s*key[^a-z]*$/i && !s.next_element.nil? && s.next_element.name == "dl"
|
37
36
|
s.next_element["key"] = "true"
|
38
37
|
s.previous_element << s.next_element.remove
|
39
38
|
s.remove
|
@@ -101,8 +100,7 @@ module Asciidoctor
|
|
101
100
|
def formula_cleanup_where2(x)
|
102
101
|
q = "//formula/following-sibling::*[1][self::p]"
|
103
102
|
x.xpath(q).each do |s|
|
104
|
-
if s.text =~ /^\s*where[^a-z]*$/i && !s.next_element.nil? &&
|
105
|
-
s.next_element.name == "dl"
|
103
|
+
if s.text =~ /^\s*where[^a-z]*$/i && !s.next_element.nil? && s.next_element.name == "dl"
|
106
104
|
s.next_element["key"] = "true"
|
107
105
|
s.previous_element << s.next_element.remove
|
108
106
|
s.remove
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require "nokogiri"
|
2
|
+
require "pathname"
|
3
|
+
require "open-uri"
|
4
|
+
require "html2doc"
|
5
|
+
require_relative "./cleanup_block.rb"
|
6
|
+
require_relative "./cleanup_footnotes.rb"
|
7
|
+
require_relative "./cleanup_ref.rb"
|
8
|
+
require_relative "./cleanup_ref_dl.rb"
|
9
|
+
require_relative "./cleanup_boilerplate.rb"
|
10
|
+
require_relative "./cleanup_section.rb"
|
11
|
+
require_relative "./cleanup_terms.rb"
|
12
|
+
require_relative "./cleanup_inline.rb"
|
13
|
+
require_relative "./cleanup_amend.rb"
|
14
|
+
require "relaton_iev"
|
15
|
+
|
16
|
+
module Asciidoctor
|
17
|
+
module Standoc
|
18
|
+
module Cleanup
|
19
|
+
def asciimath2mathml(text)
|
20
|
+
text = text.gsub(%r{<stem type="AsciiMath">(.+?)</stem>}m) do |m|
|
21
|
+
"<amathstem>#{HTMLEntities.new.decode($1)}</amathstem>"
|
22
|
+
end
|
23
|
+
text = Html2Doc.asciimath_to_mathml(text, ["<amathstem>", "</amathstem>"])
|
24
|
+
x = Nokogiri::XML(text)
|
25
|
+
x.xpath("//*[local-name() = 'math'][not(parent::stem)]").each do |y|
|
26
|
+
y.wrap("<stem type='MathML'></stem>")
|
27
|
+
end
|
28
|
+
x.to_xml
|
29
|
+
end
|
30
|
+
|
31
|
+
def xml_unescape_mathml(x)
|
32
|
+
return if x.children.any? { |y| y.element? }
|
33
|
+
math = x.text.gsub(/</, "<").gsub(/>/, ">").gsub(/"/, '"').gsub(/'/, "'").gsub(/&/, "&").
|
34
|
+
gsub(/<[^: \r\n\t\/]+:/, "<").gsub(/<\/[^ \r\n\t:]+:/, "</")
|
35
|
+
x.children = math
|
36
|
+
end
|
37
|
+
|
38
|
+
MATHML_NS = "http://www.w3.org/1998/Math/MathML".freeze
|
39
|
+
|
40
|
+
def mathml_preserve_space(m)
|
41
|
+
m.xpath(".//m:mtext", "m" => MATHML_NS).each do |x|
|
42
|
+
x.children = x.children.to_xml.gsub(/^\s/, " ").gsub(/\s$/, " ")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def mathml_namespace(stem)
|
47
|
+
stem.xpath("./math", ).each { |x| x.default_namespace = MATHML_NS }
|
48
|
+
end
|
49
|
+
|
50
|
+
def mathml_mi_italics
|
51
|
+
{ uppergreek: true, upperroman: true,
|
52
|
+
lowergreek: true, lowerroman: true }
|
53
|
+
end
|
54
|
+
|
55
|
+
# presuppose multichar mi upright, singlechar mi MathML default italic
|
56
|
+
def mathml_italicise(x)
|
57
|
+
x.xpath(".//m:mi[not(ancestor::*[@mathvariant])]", "m" => MATHML_NS).each do |i|
|
58
|
+
char = HTMLEntities.new.decode(i.text)
|
59
|
+
i["mathvariant"] = "normal" if mi_italicise?(char)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def mi_italicise?(c)
|
64
|
+
return false if c.length > 1
|
65
|
+
if /\p{Greek}/.match(c)
|
66
|
+
/\p{Lower}/.match(c) && !mathml_mi_italics[:lowergreek] ||
|
67
|
+
/\p{Upper}/.match(c) && !mathml_mi_italics[:uppergreek]
|
68
|
+
elsif /\p{Latin}/.match(c)
|
69
|
+
/\p{Lower}/.match(c) && !mathml_mi_italics[:lowerroman] ||
|
70
|
+
/\p{Upper}/.match(c) && !mathml_mi_italics[:upperroman]
|
71
|
+
else
|
72
|
+
false
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def mathml_cleanup(xmldoc)
|
77
|
+
xmldoc.xpath("//stem[@type = 'MathML']").each do |x|
|
78
|
+
xml_unescape_mathml(x)
|
79
|
+
mathml_namespace(x)
|
80
|
+
mathml_preserve_space(x)
|
81
|
+
mathml_italicise(x)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -3,6 +3,71 @@ require "relaton_iec"
|
|
3
3
|
require "fileutils"
|
4
4
|
|
5
5
|
RSpec.describe Asciidoctor::Standoc do
|
6
|
+
it "processes markup in sourcecode" do
|
7
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
8
|
+
#{ASCIIDOC_BLANK_HDR}
|
9
|
+
|
10
|
+
[source]
|
11
|
+
----
|
12
|
+
<tag/>
|
13
|
+
----
|
14
|
+
|
15
|
+
[[A]]
|
16
|
+
[source]
|
17
|
+
----
|
18
|
+
var {{{*x*}}} : {{{<<A,recursive>>}}} <tag/>
|
19
|
+
----
|
20
|
+
|
21
|
+
|
22
|
+
INPUT
|
23
|
+
#{BLANK_HDR}
|
24
|
+
<sections>
|
25
|
+
<sourcecode id='_'><tag/></sourcecode>
|
26
|
+
<sourcecode id='A'>
|
27
|
+
var
|
28
|
+
<strong>x</strong>
|
29
|
+
:
|
30
|
+
<xref target='A'>recursive</xref>
|
31
|
+
<tag/>
|
32
|
+
</sourcecode>
|
33
|
+
</sections>
|
34
|
+
</standard-document>
|
35
|
+
OUTPUT
|
36
|
+
end
|
37
|
+
|
38
|
+
it "processes markup in sourcecode with custom delimiters" do
|
39
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
40
|
+
= Document title
|
41
|
+
Author
|
42
|
+
:docfile: test.adoc
|
43
|
+
:nodoc:
|
44
|
+
:novalid:
|
45
|
+
:no-isobib:
|
46
|
+
:sourcecode-markup-start: [[[
|
47
|
+
:sourcecode-markup-end: ]]]
|
48
|
+
|
49
|
+
[[A]]
|
50
|
+
[source]
|
51
|
+
----
|
52
|
+
var [[[*x*]]] : [[[<<A,recursive>>]]]
|
53
|
+
----
|
54
|
+
|
55
|
+
|
56
|
+
INPUT
|
57
|
+
#{BLANK_HDR}
|
58
|
+
<sections>
|
59
|
+
<sourcecode id='A'>
|
60
|
+
var
|
61
|
+
<strong>x</strong>
|
62
|
+
:
|
63
|
+
<xref target='A'>recursive</xref>
|
64
|
+
</sourcecode>
|
65
|
+
</sections>
|
66
|
+
</standard-document>
|
67
|
+
OUTPUT
|
68
|
+
end
|
69
|
+
|
70
|
+
|
6
71
|
it "applies smartquotes by default" do
|
7
72
|
expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
8
73
|
#{ASCIIDOC_BLANK_HDR}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metanorma-standoc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.8.
|
4
|
+
version: 1.8.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
@@ -412,6 +412,7 @@ files:
|
|
412
412
|
- lib/asciidoctor/standoc/cleanup_boilerplate.rb
|
413
413
|
- lib/asciidoctor/standoc/cleanup_footnotes.rb
|
414
414
|
- lib/asciidoctor/standoc/cleanup_inline.rb
|
415
|
+
- lib/asciidoctor/standoc/cleanup_maths.rb
|
415
416
|
- lib/asciidoctor/standoc/cleanup_ref.rb
|
416
417
|
- lib/asciidoctor/standoc/cleanup_ref_dl.rb
|
417
418
|
- lib/asciidoctor/standoc/cleanup_section.rb
|