mathml2asciimath 0.0.9 → 0.0.10
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/Gemfile.lock +12 -12
- data/bin/m2a.rb +3 -3
- data/lib/mathml2asciimath.rb +2 -2
- data/lib/mathml2asciimath/m2a.rb +192 -194
- data/lib/mathml2asciimath/version.rb +1 -1
- data/spec/mathml_spec.rb +217 -213
- data/spec/spec_helper.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33c1a220449e32db88e0458a39097709a101f72e819830bcf96324aee0747bea
|
4
|
+
data.tar.gz: d8bf9f51b4b4be32c8a77005b956186559b0dc204325eb2d7d0a5fbae2403868
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a4180b45fe10bfed82dc94f3191f89e3ad61761b913962fbf9ba4236785128bbf837658a1e27a16df3d4f252724d8ba78256efa061b50634ded28859d07fef7
|
7
|
+
data.tar.gz: 578be8ba61afb2b70639b458b43daf22fffc9cdee5574f4b8cbf9465d3910dd8b7b52916ac51fc6938c8c48d772b1da227ac0133933d84e645ddec167a7546e6
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
mathml2asciimath (0.0.
|
4
|
+
mathml2asciimath (0.0.9)
|
5
5
|
htmlentities (~> 4.3.4)
|
6
6
|
nokogiri (>= 1.10.4)
|
7
7
|
|
@@ -15,7 +15,7 @@ GEM
|
|
15
15
|
docile (1.3.2)
|
16
16
|
ffi (1.12.2)
|
17
17
|
formatador (0.2.5)
|
18
|
-
guard (2.16.
|
18
|
+
guard (2.16.2)
|
19
19
|
formatador (>= 0.2.4)
|
20
20
|
listen (>= 2.7, < 4.0)
|
21
21
|
lumberjack (>= 1.0.12, < 2.0)
|
@@ -34,21 +34,21 @@ GEM
|
|
34
34
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
35
35
|
rb-inotify (~> 0.9, >= 0.9.10)
|
36
36
|
lumberjack (1.2.4)
|
37
|
-
method_source (0.
|
37
|
+
method_source (1.0.0)
|
38
38
|
mini_portile2 (2.4.0)
|
39
39
|
nenv (0.3.0)
|
40
|
-
nokogiri (1.10.
|
40
|
+
nokogiri (1.10.9)
|
41
41
|
mini_portile2 (~> 2.4.0)
|
42
42
|
notiffany (0.1.3)
|
43
43
|
nenv (~> 0.1)
|
44
44
|
shellany (~> 0.0)
|
45
45
|
parallel (1.19.1)
|
46
|
-
parser (2.7.
|
46
|
+
parser (2.7.1.1)
|
47
47
|
ast (~> 2.4.0)
|
48
48
|
powerpack (0.1.2)
|
49
|
-
pry (0.
|
50
|
-
coderay (~> 1.1
|
51
|
-
method_source (~>
|
49
|
+
pry (0.13.1)
|
50
|
+
coderay (~> 1.1)
|
51
|
+
method_source (~> 1.0)
|
52
52
|
rainbow (3.0.0)
|
53
53
|
rake (12.3.3)
|
54
54
|
rb-fsevent (0.10.3)
|
@@ -60,7 +60,7 @@ GEM
|
|
60
60
|
rspec-mocks (~> 3.9.0)
|
61
61
|
rspec-core (3.9.1)
|
62
62
|
rspec-support (~> 3.9.1)
|
63
|
-
rspec-expectations (3.9.
|
63
|
+
rspec-expectations (3.9.1)
|
64
64
|
diff-lcs (>= 1.2.0, < 2.0)
|
65
65
|
rspec-support (~> 3.9.0)
|
66
66
|
rspec-match_fuzzy (0.1.3)
|
@@ -81,10 +81,10 @@ GEM
|
|
81
81
|
simplecov (0.18.5)
|
82
82
|
docile (~> 1.1)
|
83
83
|
simplecov-html (~> 0.11)
|
84
|
-
simplecov-html (0.12.
|
84
|
+
simplecov-html (0.12.2)
|
85
85
|
thor (1.0.1)
|
86
86
|
timecop (0.9.1)
|
87
|
-
unicode-display_width (1.
|
87
|
+
unicode-display_width (1.7.0)
|
88
88
|
|
89
89
|
PLATFORMS
|
90
90
|
ruby
|
@@ -103,4 +103,4 @@ DEPENDENCIES
|
|
103
103
|
timecop (~> 0.9)
|
104
104
|
|
105
105
|
BUNDLED WITH
|
106
|
-
2.
|
106
|
+
2.1.4
|
data/bin/m2a.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require 'mathml2asciimath'
|
2
2
|
|
3
|
-
STDIN.set_encoding(
|
3
|
+
STDIN.set_encoding('UTF-8')
|
4
4
|
while a = gets
|
5
5
|
matches = a.split(%r{(<math.*?</math>)})
|
6
|
-
out =
|
6
|
+
out = ''
|
7
7
|
matches.each do |x|
|
8
8
|
if /<math/.match x
|
9
9
|
out += MathML2AsciiMath.m2a(x)
|
data/lib/mathml2asciimath.rb
CHANGED
data/lib/mathml2asciimath/m2a.rb
CHANGED
@@ -5,203 +5,206 @@ require "pp"
|
|
5
5
|
module MathML2AsciiMath
|
6
6
|
|
7
7
|
def self.m2a(x)
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
normalized = x
|
9
|
+
|
10
|
+
# &:noblanks skips non-significant whitespaces in MathML
|
11
|
+
docxml = Nokogiri::XML.parse(normalized, &:noblanks)
|
12
|
+
|
13
|
+
# Get rid of things like
|
14
|
+
# <mtext> </mtext>
|
15
|
+
parse(docxml.root).gsub(/[[:blank:]]/, ' ').unicode_normalize.squeeze(' ')
|
12
16
|
end
|
13
17
|
|
14
18
|
def self.encodechars(x)
|
15
|
-
x.gsub(/\u03b1/,
|
16
|
-
gsub(/\u03b2/,
|
17
|
-
gsub(/\u03b3/,
|
18
|
-
gsub(/\u0393/,
|
19
|
-
gsub(/\u03b4/,
|
20
|
-
gsub(/\u0394/,
|
21
|
-
gsub(/\u2206/,
|
22
|
-
gsub(/\u03b5/,
|
23
|
-
gsub(/\u025b/,
|
24
|
-
gsub(/\u03b6/,
|
25
|
-
gsub(/\u03b7/,
|
26
|
-
gsub(/\u03b8/,
|
27
|
-
gsub(/\u0398/,
|
28
|
-
gsub(/\u03d1/,
|
29
|
-
gsub(/\u03b9/,
|
30
|
-
gsub(/\u03ba/,
|
31
|
-
gsub(/\u03bb/,
|
32
|
-
gsub(/\u039b/,
|
33
|
-
gsub(/\u03bc/,
|
34
|
-
gsub(/\u03bd/,
|
35
|
-
gsub(/\u03be/,
|
36
|
-
gsub(/\u039e/,
|
37
|
-
gsub(/\u03c0/,
|
38
|
-
gsub(/\u03a0/,
|
39
|
-
gsub(/\u03c1/,
|
40
|
-
gsub(/\u03c2/,
|
41
|
-
gsub(/\u03c3/,
|
42
|
-
gsub(/\u03a3/,
|
43
|
-
gsub(/\u03c4/,
|
44
|
-
gsub(/\u03c5/,
|
45
|
-
gsub(/\u03c6/,
|
46
|
-
gsub(/\u03a6/,
|
47
|
-
gsub(/\u03d5/,
|
48
|
-
gsub(/\u03c7/,
|
49
|
-
gsub(/\u03c8/,
|
50
|
-
gsub(/\u03a8/,
|
51
|
-
gsub(/\u03c9/,
|
52
|
-
gsub(/\u03a9/,
|
53
|
-
gsub(/\u22c5/,
|
54
|
-
gsub(/\u2219/,
|
55
|
-
gsub(/\u00b7/,
|
56
|
-
gsub(/\u2217/,
|
57
|
-
gsub(/\u22c6/,
|
58
|
-
gsub(/\//,
|
19
|
+
x.gsub(/\u03b1/, 'alpha').
|
20
|
+
gsub(/\u03b2/, 'beta').
|
21
|
+
gsub(/\u03b3/, 'gamma').
|
22
|
+
gsub(/\u0393/, 'Gamma').
|
23
|
+
gsub(/\u03b4/, 'delta').
|
24
|
+
gsub(/\u0394/, 'Delta').
|
25
|
+
gsub(/\u2206/, 'Delta').
|
26
|
+
gsub(/\u03b5/, 'epsilon').
|
27
|
+
gsub(/\u025b/, 'varepsilon').
|
28
|
+
gsub(/\u03b6/, 'zeta').
|
29
|
+
gsub(/\u03b7/, 'eta').
|
30
|
+
gsub(/\u03b8/, 'theta').
|
31
|
+
gsub(/\u0398/, 'Theta').
|
32
|
+
gsub(/\u03d1/, 'vartheta').
|
33
|
+
gsub(/\u03b9/, 'iota').
|
34
|
+
gsub(/\u03ba/, 'kappa').
|
35
|
+
gsub(/\u03bb/, 'lambda').
|
36
|
+
gsub(/\u039b/, 'Lambda').
|
37
|
+
gsub(/\u03bc/, 'mu').
|
38
|
+
gsub(/\u03bd/, 'nu').
|
39
|
+
gsub(/\u03be/, 'xi').
|
40
|
+
gsub(/\u039e/, 'Xi').
|
41
|
+
gsub(/\u03c0/, 'pi').
|
42
|
+
gsub(/\u03a0/, 'Pi').
|
43
|
+
gsub(/\u03c1/, 'rho').
|
44
|
+
gsub(/\u03c2/, 'beta').
|
45
|
+
gsub(/\u03c3/, 'sigma').
|
46
|
+
gsub(/\u03a3/, 'Sigma').
|
47
|
+
gsub(/\u03c4/, 'tau').
|
48
|
+
gsub(/\u03c5/, 'upsilon').
|
49
|
+
gsub(/\u03c6/, 'phi').
|
50
|
+
gsub(/\u03a6/, 'Phi').
|
51
|
+
gsub(/\u03d5/, 'varphi').
|
52
|
+
gsub(/\u03c7/, 'chi').
|
53
|
+
gsub(/\u03c8/, 'psi').
|
54
|
+
gsub(/\u03a8/, 'Psi').
|
55
|
+
gsub(/\u03c9/, 'omega').
|
56
|
+
gsub(/\u03a9/, 'omega').
|
57
|
+
gsub(/\u22c5/, '*').
|
58
|
+
gsub(/\u2219/, '*').
|
59
|
+
gsub(/\u00b7/, '*').
|
60
|
+
gsub(/\u2217/, '**').
|
61
|
+
gsub(/\u22c6/, '***').
|
62
|
+
gsub(/\//, '//').
|
59
63
|
gsub(/\\/, "\\\\").
|
60
|
-
gsub(/\u00d7/,
|
61
|
-
gsub(/\u22c9/,
|
62
|
-
gsub(/\u22ca/,
|
63
|
-
gsub(/\u22c8/,
|
64
|
-
gsub(/\u00f7/,
|
65
|
-
gsub(/\u2218/,
|
66
|
-
gsub(/\u2295/,
|
67
|
-
gsub(/\u2a01/,
|
68
|
-
gsub(/\u2297/,
|
69
|
-
gsub(/\u2299/,
|
70
|
-
gsub(/\u2211/,
|
71
|
-
gsub(/\u220f/,
|
72
|
-
gsub(/\u2227/,
|
73
|
-
gsub(/\u22c0/,
|
74
|
-
gsub(/\u2228/,
|
75
|
-
gsub(/\u22c1/,
|
76
|
-
gsub(/\u2229/,
|
77
|
-
gsub(/\u22c2/,
|
78
|
-
gsub(/\u222a/,
|
79
|
-
gsub(/\u22c3/,
|
80
|
-
gsub(/\u2260/,
|
81
|
-
gsub(/\u2264/,
|
82
|
-
gsub(/\u2265/,
|
83
|
-
gsub(/\u227a/,
|
84
|
-
gsub(/\u227b/,
|
85
|
-
gsub(/\u2aaf/,
|
86
|
-
gsub(/\u2ab0/,
|
87
|
-
gsub(/\u2208/,
|
88
|
-
gsub(/\u2209/,
|
89
|
-
gsub(/\u2282/,
|
90
|
-
gsub(/\u2283/,
|
91
|
-
gsub(/\u2286/,
|
92
|
-
gsub(/\u2287/,
|
93
|
-
gsub(/\u2261/,
|
94
|
-
gsub(/\u2245/,
|
95
|
-
gsub(/\u2248/,
|
96
|
-
gsub(/\u221d/,
|
97
|
-
gsub(/\u00ac/,
|
98
|
-
gsub(/\u21d2/,
|
99
|
-
gsub(/\u21d4/,
|
100
|
-
gsub(/\u2200/,
|
101
|
-
gsub(/\u2203/,
|
102
|
-
gsub(/\u22a5/,
|
103
|
-
gsub(/\u22a4/,
|
104
|
-
gsub(/\u22a2/,
|
105
|
-
gsub(/\u22a8/,
|
106
|
-
gsub(/\u22a8/,
|
107
|
-
gsub(/\u2329/,
|
108
|
-
gsub(/\u232a/,
|
109
|
-
gsub(/\u2329/,
|
110
|
-
gsub(/\u27e8/,
|
111
|
-
gsub(/\u232a/,
|
112
|
-
gsub(/\u27e9/,
|
113
|
-
gsub(/\
|
114
|
-
gsub(/\
|
115
|
-
gsub(/\
|
116
|
-
gsub(/\
|
64
|
+
gsub(/\u00d7/, 'xx').
|
65
|
+
gsub(/\u22c9/, '|><').
|
66
|
+
gsub(/\u22ca/, '><|').
|
67
|
+
gsub(/\u22c8/, '|><|').
|
68
|
+
gsub(/\u00f7/, '-:').
|
69
|
+
gsub(/\u2218/, '@').
|
70
|
+
gsub(/\u2295/, 'o+').
|
71
|
+
gsub(/\u2a01/, 'o+').
|
72
|
+
gsub(/\u2297/, 'ox').
|
73
|
+
gsub(/\u2299/, 'o.').
|
74
|
+
gsub(/\u2211/, 'sum').
|
75
|
+
gsub(/\u220f/, 'prod').
|
76
|
+
gsub(/\u2227/, '^^').
|
77
|
+
gsub(/\u22c0/, '^^^').
|
78
|
+
gsub(/\u2228/, 'vv').
|
79
|
+
gsub(/\u22c1/, 'vvv').
|
80
|
+
gsub(/\u2229/, 'nn').
|
81
|
+
gsub(/\u22c2/, 'nnn').
|
82
|
+
gsub(/\u222a/, 'uu').
|
83
|
+
gsub(/\u22c3/, 'uuu').
|
84
|
+
gsub(/\u2260/, '!=').
|
85
|
+
gsub(/\u2264/, '<=').
|
86
|
+
gsub(/\u2265/, '>=').
|
87
|
+
gsub(/\u227a/, '-<').
|
88
|
+
gsub(/\u227b/, '>-').
|
89
|
+
gsub(/\u2aaf/, '-<=').
|
90
|
+
gsub(/\u2ab0/, '>-=').
|
91
|
+
gsub(/\u2208/, 'in').
|
92
|
+
gsub(/\u2209/, '!in').
|
93
|
+
gsub(/\u2282/, 'sub').
|
94
|
+
gsub(/\u2283/, 'sup').
|
95
|
+
gsub(/\u2286/, 'sube').
|
96
|
+
gsub(/\u2287/, 'supe').
|
97
|
+
gsub(/\u2261/, '-=').
|
98
|
+
gsub(/\u2245/, '~=').
|
99
|
+
gsub(/\u2248/, '~~').
|
100
|
+
gsub(/\u221d/, 'prop').
|
101
|
+
gsub(/\u00ac/, 'not').
|
102
|
+
gsub(/\u21d2/, '=>').
|
103
|
+
gsub(/\u21d4/, '<=>').
|
104
|
+
gsub(/\u2200/, 'AA').
|
105
|
+
gsub(/\u2203/, 'EE').
|
106
|
+
gsub(/\u22a5/, '_|_').
|
107
|
+
gsub(/\u22a4/, 'TT').
|
108
|
+
gsub(/\u22a2/, '|--').
|
109
|
+
gsub(/\u22a8/, '|==').
|
110
|
+
gsub(/\u22a8/, '|==').
|
111
|
+
gsub(/\u2329/, '(:').
|
112
|
+
gsub(/\u232a/, ':)').
|
113
|
+
gsub(/\u2329/, '<<').
|
114
|
+
gsub(/\u27e8/, '<<').
|
115
|
+
gsub(/\u232a/, '>>').
|
116
|
+
gsub(/\u27e9/, '>>').
|
117
|
+
gsub(/\u222b/, 'int').
|
118
|
+
gsub(/\u222e/, 'oint').
|
119
|
+
gsub(/\u2202/, 'del').
|
120
|
+
gsub(/\u2207/, 'grad').
|
121
|
+
gsub(/\u00b1/, '+-').
|
117
122
|
gsub(/\u2205/, "O/").
|
118
|
-
gsub(/\u221e/,
|
119
|
-
gsub(/\u2135/,
|
120
|
-
gsub(/\u2234/,
|
123
|
+
gsub(/\u221e/, 'oo').
|
124
|
+
gsub(/\u2135/, 'aleph').
|
125
|
+
gsub(/\u2234/, ':.').
|
121
126
|
gsub(/\u2235/, ":'").
|
122
127
|
gsub(/\u2220/, "/_").
|
123
128
|
gsub(/\u25b3/, "/_\\").
|
124
129
|
gsub(/\u2032/, "'").
|
125
|
-
gsub(/~/,
|
126
|
-
gsub(/\u00a0\u00a0\u00a0\u00a0/,
|
127
|
-
gsub(/\u00a0\u00a0/,
|
130
|
+
gsub(/~/, 'tilde').
|
131
|
+
gsub(/\u00a0\u00a0\u00a0\u00a0/, 'qquad').
|
132
|
+
gsub(/\u00a0\u00a0/, 'quad').
|
128
133
|
gsub(/\u00a0/, "\\ ").
|
129
|
-
gsub(/\u2322/,
|
130
|
-
gsub(/\u00a0/,
|
131
|
-
gsub(/\u22ef/,
|
132
|
-
gsub(/\u22ee/,
|
133
|
-
gsub(/\u22f1/,
|
134
|
-
gsub(/\u22c4/,
|
135
|
-
gsub(/\u25a1/,
|
136
|
-
gsub(/\u230a/,
|
137
|
-
gsub(/\u230b/,
|
138
|
-
gsub(/\u2308/,
|
139
|
-
gsub(/\u2309/,
|
140
|
-
gsub(/\u2102/,
|
141
|
-
gsub(/\u2115/,
|
142
|
-
gsub(/\u211a/,
|
143
|
-
gsub(/\u211d/,
|
144
|
-
gsub(/\u2124/,
|
145
|
-
gsub(/\u2191/,
|
146
|
-
gsub(/\u2193/,
|
147
|
-
gsub(/\u2190/,
|
148
|
-
gsub(/\u2194/,
|
149
|
-
gsub(/\u21d2/,
|
150
|
-
gsub(/\u21d0/,
|
151
|
-
gsub(/\u21d4/,
|
152
|
-
gsub(/\u2192/,
|
153
|
-
gsub(/\u21a3/,
|
154
|
-
gsub(/\u21a0/,
|
155
|
-
gsub(/\u2916/,
|
156
|
-
gsub(/\u21a6/,
|
157
|
-
gsub(/\u2026/,
|
158
|
-
gsub(/\u2212/,
|
159
|
-
gsub(/\u2061/,
|
160
|
-
gsub(/\u2751/,
|
134
|
+
gsub(/\u2322/, 'frown').
|
135
|
+
gsub(/\u00a0/, 'quad').
|
136
|
+
gsub(/\u22ef/, 'cdots').
|
137
|
+
gsub(/\u22ee/, 'vdots').
|
138
|
+
gsub(/\u22f1/, 'ddots').
|
139
|
+
gsub(/\u22c4/, 'diamond').
|
140
|
+
gsub(/\u25a1/, 'square').
|
141
|
+
gsub(/\u230a/, '|__').
|
142
|
+
gsub(/\u230b/, '__|').
|
143
|
+
gsub(/\u2308/, '|~').
|
144
|
+
gsub(/\u2309/, '~|').
|
145
|
+
gsub(/\u2102/, 'CC').
|
146
|
+
gsub(/\u2115/, 'NN').
|
147
|
+
gsub(/\u211a/, 'QQ').
|
148
|
+
gsub(/\u211d/, 'RR').
|
149
|
+
gsub(/\u2124/, 'ZZ').
|
150
|
+
gsub(/\u2191/, 'uarr').
|
151
|
+
gsub(/\u2193/, 'darr').
|
152
|
+
gsub(/\u2190/, 'larr').
|
153
|
+
gsub(/\u2194/, 'harr').
|
154
|
+
gsub(/\u21d2/, 'rArr').
|
155
|
+
gsub(/\u21d0/, 'lArr').
|
156
|
+
gsub(/\u21d4/, 'hArr').
|
157
|
+
gsub(/\u2192/, '->').
|
158
|
+
gsub(/\u21a3/, '>->').
|
159
|
+
gsub(/\u21a0/, '->>').
|
160
|
+
gsub(/\u2916/, '>->>').
|
161
|
+
gsub(/\u21a6/, '|->').
|
162
|
+
gsub(/\u2026/, '...').
|
163
|
+
gsub(/\u2212/, '-').
|
164
|
+
gsub(/\u2061/, ''). # function application
|
165
|
+
gsub(/\u2751/, 'square').
|
166
|
+
gsub(/[\u2028\u2029]/, ' ') # normalize thin spaces like \u2009, \u2008
|
167
|
+
end
|
168
|
+
|
169
|
+
def self.join_parsed_children(children, delimiter=' ')
|
170
|
+
children.map do |n|
|
171
|
+
parse(n).strip
|
172
|
+
end.join(delimiter)
|
161
173
|
end
|
162
174
|
|
163
175
|
def self.parse(node)
|
164
|
-
out =
|
176
|
+
out = ''
|
165
177
|
if node.text?
|
166
178
|
return encodechars(HTMLEntities.new.decode(node.text))
|
167
179
|
end
|
168
180
|
|
169
|
-
case node.name.sub(/^[^:]*:/,
|
181
|
+
case node.name.sub(/^[^:]*:/, '')
|
170
182
|
when "math"
|
171
|
-
|
172
|
-
node.elements.each { |n| outarr << parse(n).strip }
|
173
|
-
return outarr.join(" ")
|
183
|
+
return join_parsed_children(node.elements)
|
174
184
|
|
175
185
|
when "annotation"
|
176
|
-
return
|
186
|
+
return ''
|
177
187
|
|
178
188
|
when "semantics"
|
179
|
-
|
180
|
-
node.elements.each { |n| outarr << parse(n).strip }
|
181
|
-
return outarr.join(" ")
|
189
|
+
return join_parsed_children(node.elements)
|
182
190
|
|
183
191
|
when "mrow"
|
184
|
-
|
185
|
-
|
186
|
-
out = outarr.join(" ")
|
187
|
-
if %w{mfrac msub munder munderover}.include? node.parent.name.sub(/^[^:]*:/, "")
|
192
|
+
out = join_parsed_children(node.elements)
|
193
|
+
if %w[mfrac msub munder munderover].include? node.parent.name.sub(/^[^:]*:/, '')
|
188
194
|
out = "(#{out})"
|
189
195
|
end
|
190
196
|
return out
|
191
197
|
|
192
198
|
when "mfenced"
|
193
|
-
|
194
|
-
|
195
|
-
|
199
|
+
sym_open = node["open"] || "("
|
200
|
+
sym_close = node["close"] || ")"
|
201
|
+
|
196
202
|
separator = "," # TODO currently ignore the supplied separators
|
197
|
-
node.elements
|
198
|
-
out
|
199
|
-
return "#{open}#{out}#{close}"
|
203
|
+
out = join_parsed_children(node.elements, separator)
|
204
|
+
return "#{sym_open}#{out}#{sym_close}"
|
200
205
|
|
201
206
|
when "msqrt"
|
202
|
-
|
203
|
-
node.elements.each { |n| outarr << parse(n).strip }
|
204
|
-
return "sqrt(#{outarr.join(" ")})"
|
207
|
+
return "sqrt(#{join_parsed_children(node.elements)})"
|
205
208
|
|
206
209
|
when "mfrac"
|
207
210
|
return "(#{parse(node.elements[0])})/(#{parse(node.elements[1])})"
|
@@ -209,13 +212,13 @@ module MathML2AsciiMath
|
|
209
212
|
when "msup"
|
210
213
|
sup = parse(node.elements[1])
|
211
214
|
sup = "(#{sup})" unless sup.length == 1
|
212
|
-
op = parse(node.elements[0]).gsub(/ $/,
|
215
|
+
op = parse(node.elements[0]).gsub(/ $/, '')
|
213
216
|
return "#{op}^#{sup}"
|
214
217
|
|
215
218
|
when "msub"
|
216
219
|
sub = parse(node.elements[1])
|
217
220
|
sub = "(#{sub})" unless sub.length == 1
|
218
|
-
op = parse(node.elements[0]).gsub(/ $/,
|
221
|
+
op = parse(node.elements[0]).gsub(/ $/, '')
|
219
222
|
return "#{op}_#{sub}"
|
220
223
|
|
221
224
|
when "munderover", "msubsup"
|
@@ -223,24 +226,26 @@ module MathML2AsciiMath
|
|
223
226
|
sub = "(#{sub})" unless sub.length == 1
|
224
227
|
sup = parse(node.elements[2])
|
225
228
|
sup = "(#{sup})" unless sup.length == 1
|
226
|
-
op = parse(node.elements[0]).gsub(/ $/,
|
229
|
+
op = parse(node.elements[0]).gsub(/ $/, '')
|
227
230
|
return "#{op}_#{sub}^#{sup}"
|
228
231
|
|
229
232
|
when "munder"
|
230
|
-
elem1 = parse(node.elements[1]).
|
233
|
+
elem1 = parse(node.elements[1]).strip
|
231
234
|
accent = case elem1
|
232
235
|
when "\u0332" then "ul"
|
233
236
|
when "\u23df" then "ubrace"
|
234
237
|
else
|
235
238
|
"underset"
|
236
239
|
end
|
240
|
+
|
237
241
|
if accent == "underset"
|
238
242
|
return "underset(#{elem1})(#{parse(node.elements[0])})"
|
239
243
|
else
|
240
244
|
return "#{accent} #{parse(node.elements[0])}"
|
241
245
|
end
|
246
|
+
|
242
247
|
when "mover"
|
243
|
-
elem1 = parse(node.elements[1]).
|
248
|
+
elem1 = parse(node.elements[1]).strip
|
244
249
|
accent = case elem1
|
245
250
|
when "\u005e" then "hat"
|
246
251
|
when "\u00af" then "bar"
|
@@ -252,6 +257,7 @@ module MathML2AsciiMath
|
|
252
257
|
else
|
253
258
|
"overset"
|
254
259
|
end
|
260
|
+
|
255
261
|
if accent == "overset"
|
256
262
|
return "overset(#{elem1})(#{parse(node.elements[0])})"
|
257
263
|
else
|
@@ -259,46 +265,38 @@ module MathML2AsciiMath
|
|
259
265
|
end
|
260
266
|
|
261
267
|
when "mtable"
|
262
|
-
|
263
|
-
node.elements.each { |n| outarr << parse(n).strip }
|
264
|
-
return "[#{outarr.join(",")}]"
|
268
|
+
return "[#{join_parsed_children(node.elements, ',')}]"
|
265
269
|
|
266
270
|
when "mtr"
|
267
|
-
|
268
|
-
node.elements.each { |n| outarr << parse(n).strip }
|
269
|
-
return "[#{outarr.join(",")}]"
|
271
|
+
return "[#{join_parsed_children(node.elements, ',')}]"
|
270
272
|
|
271
273
|
when "mtd"
|
272
|
-
|
273
|
-
node.elements.each { |n| outarr << parse(n).strip }
|
274
|
-
return "#{outarr.join(",")}"
|
274
|
+
return join_parsed_children(node.elements, ',')
|
275
275
|
|
276
276
|
when "mn", "mtext"
|
277
|
-
|
278
|
-
node.children.each { |n| outarr << parse(n).strip }
|
279
|
-
return "#{outarr.join("")}"
|
277
|
+
return join_parsed_children(node.children, '')
|
280
278
|
|
281
279
|
when "mi"
|
280
|
+
# FIXME: What does this comment have to do with Word?
|
282
281
|
# mi is not meant to have space around it, but Word is conflating operators and operands
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
out = " #{out} " if /[^a-zA-Z0-9',]|[a-z][a-z]/.match out
|
282
|
+
out = join_parsed_children(node.children)
|
283
|
+
|
284
|
+
# FIXME: Why do we need to add extra spaces?
|
285
|
+
# out = " #{out} " if /[^a-zA-Z0-9',]|[a-z][a-z]/.match out
|
287
286
|
return out
|
288
287
|
|
289
288
|
when "mo"
|
290
|
-
|
291
|
-
|
292
|
-
out = outarr.join(" ")
|
293
|
-
out = " #{out} " unless node["fence"]
|
289
|
+
out = join_parsed_children(node.children)
|
290
|
+
out = " #{out} " unless node['fence']
|
294
291
|
return out
|
295
292
|
|
296
293
|
when "mstyle"
|
297
|
-
|
298
|
-
|
299
|
-
out = outarr.join(" ")
|
294
|
+
return join_parsed_children(node.children)
|
295
|
+
|
300
296
|
else
|
301
|
-
|
297
|
+
"<math xmlns=\"http://www.w3.org/1998/Math/MathML\">" +
|
298
|
+
node.to_xml +
|
299
|
+
"</math>"
|
302
300
|
|
303
301
|
end
|
304
302
|
end
|
data/spec/mathml_spec.rb
CHANGED
@@ -1,319 +1,312 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe MathML2AsciiMath do
|
4
|
-
it
|
5
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
4
|
+
it 'processes mstyle and mrow' do
|
5
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip.strip
|
6
6
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
<mstyle>
|
8
|
+
<mrow>
|
9
|
+
<mi>a</mi> <mo>⋄</mo> <msup><mi>x</mi><mn>2</mn></msup>
|
10
|
+
<mo>+</mo><mi>b</mi><mo>×</mo><mi>x</mi>
|
11
|
+
<mo>+</mo><msub><mi>c</mi><mn>3</mn></msub>
|
12
|
+
</mrow>
|
13
|
+
</mstyle>
|
14
14
|
</math>
|
15
15
|
INPUT
|
16
16
|
a diamond x^2 + b xx x + c_3
|
17
17
|
OUTPUT
|
18
18
|
end
|
19
19
|
|
20
|
-
it
|
21
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
20
|
+
it 'processes mrow' do
|
21
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
22
22
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
<mrow>
|
24
|
+
<mi>a</mi> <mo>⋄</mo> <msup><mi>x</mi><mn>2d</mn></msup>
|
25
|
+
<mo>+</mo><mi>b</mi><mo>×</mo><mi>x</mi>
|
26
|
+
<mo>+</mo><msub><mi>c</mi><mn>ab</mn></msub>
|
27
|
+
</mrow>
|
28
28
|
</math>
|
29
29
|
INPUT
|
30
30
|
a diamond x^(2d) + b xx x + c_(ab)
|
31
31
|
OUTPUT
|
32
32
|
end
|
33
33
|
|
34
|
-
it
|
35
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
34
|
+
it 'processes mfrac' do
|
35
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
36
36
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
</mfrac>
|
37
|
+
<mfrac>
|
38
|
+
<mrow> <mn> 1 </mn> <mo> + </mo> <msqrt> <mn> 5 </mn> </msqrt> </mrow>
|
39
|
+
<mn> 2 </mn>
|
40
|
+
</mfrac>
|
41
41
|
</math>
|
42
42
|
INPUT
|
43
|
-
((
|
43
|
+
((1 + sqrt(5)))/(2)
|
44
44
|
OUTPUT
|
45
45
|
end
|
46
46
|
|
47
|
-
it
|
48
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
47
|
+
it 'processes mfenced default' do
|
48
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
49
49
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
50
|
-
|
50
|
+
<mfenced><mrow><mi> a </mi> <mo> + </mo> <mi> b </mi></mrow></mfenced>
|
51
51
|
</math>
|
52
52
|
INPUT
|
53
|
-
(
|
53
|
+
(a + b)
|
54
54
|
OUTPUT
|
55
55
|
end
|
56
56
|
|
57
|
-
it
|
58
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
57
|
+
it 'processes mfenced with unmatching braces' do
|
58
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.to_s.strip
|
59
59
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
60
|
-
<mfenced open="["> <mn> 0 </mn> <mn> 1 </mn> </mfenced>
|
60
|
+
<mfenced open="["> <mn> 0 </mn> <mn> 1 </mn> </mfenced>
|
61
61
|
</math>
|
62
62
|
INPUT
|
63
|
-
[
|
63
|
+
[0,1)
|
64
64
|
OUTPUT
|
65
65
|
end
|
66
66
|
|
67
|
-
it
|
68
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
67
|
+
it 'processes munderover' do
|
68
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
69
69
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
70
|
-
|
71
|
-
|
72
|
-
|
70
|
+
<munderover>
|
71
|
+
<mo>∫</mo> <mn>0</mn> <mi>∞</mi>
|
72
|
+
</munderover>
|
73
73
|
</math>
|
74
74
|
INPUT
|
75
|
-
|
75
|
+
int_0^(oo)
|
76
76
|
OUTPUT
|
77
77
|
end
|
78
78
|
|
79
|
-
it
|
80
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
79
|
+
it 'processes msubsup' do
|
80
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
81
81
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
82
|
+
<msubsup>
|
83
|
+
<mo>∫</mo>
|
84
|
+
<mn>ab</mn>
|
85
|
+
<mn>ds</mn>
|
86
|
+
</msubsup>
|
87
87
|
</math>
|
88
88
|
INPUT
|
89
|
-
|
89
|
+
int_(ab)^(ds)
|
90
90
|
OUTPUT
|
91
91
|
end
|
92
92
|
|
93
|
-
it
|
94
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
93
|
+
it 'processes ubrace' do
|
94
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
95
95
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
</munder>
|
96
|
+
<munder>
|
97
|
+
<mrow>
|
98
|
+
<mi> x </mi>
|
99
|
+
<mo> + </mo>
|
100
|
+
<mi> y </mi>
|
101
|
+
<mo> + </mo>
|
102
|
+
<mi> z </mi>
|
103
|
+
</mrow>
|
104
|
+
<mo> ⏟</mo>
|
105
|
+
</munder>
|
106
106
|
</math>
|
107
107
|
INPUT
|
108
|
-
ubrace (
|
108
|
+
ubrace (x + y + z)
|
109
109
|
OUTPUT
|
110
110
|
end
|
111
111
|
|
112
|
-
it
|
113
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
112
|
+
it 'processes ul' do
|
113
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
114
114
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
</munder>
|
115
|
+
<munder>
|
116
|
+
<mrow>
|
117
|
+
<mi> x </mi>
|
118
|
+
<mo> + </mo>
|
119
|
+
<mi> y </mi>
|
120
|
+
<mo> + </mo>
|
121
|
+
<mi> z </mi>
|
122
|
+
</mrow>
|
123
|
+
<mo> ̲</mo>
|
124
|
+
</munder>
|
125
125
|
</math>
|
126
126
|
INPUT
|
127
|
-
ul (
|
127
|
+
ul (x + y + z)
|
128
128
|
OUTPUT
|
129
129
|
end
|
130
130
|
|
131
|
-
it
|
132
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
131
|
+
it 'processes underset' do
|
132
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
133
133
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
</munder>
|
134
|
+
<munder>
|
135
|
+
<mrow>
|
136
|
+
<mi> x </mi>
|
137
|
+
<mo> + </mo>
|
138
|
+
<mi> y </mi>
|
139
|
+
<mo> + </mo>
|
140
|
+
<mi> z </mi>
|
141
|
+
</mrow>
|
142
|
+
<mo>fred </mo>
|
143
|
+
</munder>
|
144
144
|
</math>
|
145
145
|
INPUT
|
146
|
-
underset(fred)((
|
146
|
+
underset(fred)((x + y + z))
|
147
147
|
OUTPUT
|
148
148
|
end
|
149
149
|
|
150
|
-
it
|
151
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
150
|
+
it 'processes obrace' do
|
151
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
152
152
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
153
|
-
<mover accent="true">
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
</mover>
|
163
|
-
|
153
|
+
<mover accent="true">
|
154
|
+
<mrow>
|
155
|
+
<mi> x </mi>
|
156
|
+
<mo> + </mo>
|
157
|
+
<mi> y </mi>
|
158
|
+
<mo> + </mo>
|
159
|
+
<mi> z </mi>
|
160
|
+
</mrow>
|
161
|
+
<mo> ⏞</mo>
|
162
|
+
</mover>
|
164
163
|
</math>
|
165
164
|
INPUT
|
166
165
|
obrace x + y + z
|
167
166
|
OUTPUT
|
168
167
|
end
|
169
168
|
|
170
|
-
it
|
171
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
169
|
+
it 'processes hat' do
|
170
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
172
171
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
173
|
-
<mover accent="true">
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
</mover>
|
183
|
-
|
172
|
+
<mover accent="true">
|
173
|
+
<mrow>
|
174
|
+
<mi> x </mi>
|
175
|
+
<mo> + </mo>
|
176
|
+
<mi> y </mi>
|
177
|
+
<mo> + </mo>
|
178
|
+
<mi> z </mi>
|
179
|
+
</mrow>
|
180
|
+
<mo> ^</mo>
|
181
|
+
</mover>
|
184
182
|
</math>
|
185
183
|
INPUT
|
186
184
|
hat x + y + z
|
187
185
|
OUTPUT
|
188
186
|
end
|
189
187
|
|
190
|
-
it
|
191
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
188
|
+
it 'processes bar' do
|
189
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
192
190
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
193
|
-
<mover accent="true">
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
</mover>
|
203
|
-
|
191
|
+
<mover accent="true">
|
192
|
+
<mrow>
|
193
|
+
<mi> x </mi>
|
194
|
+
<mo> + </mo>
|
195
|
+
<mi> y </mi>
|
196
|
+
<mo> + </mo>
|
197
|
+
<mi> z </mi>
|
198
|
+
</mrow>
|
199
|
+
<mo> ¯</mo>
|
200
|
+
</mover>
|
204
201
|
</math>
|
205
202
|
INPUT
|
206
203
|
bar x + y + z
|
207
204
|
OUTPUT
|
208
205
|
end
|
209
206
|
|
210
|
-
it
|
211
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
207
|
+
it 'processes vec' do
|
208
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
212
209
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
213
|
-
<mover accent="true">
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
</mover>
|
223
|
-
|
210
|
+
<mover accent="true">
|
211
|
+
<mrow>
|
212
|
+
<mi> x </mi>
|
213
|
+
<mo> + </mo>
|
214
|
+
<mi> y </mi>
|
215
|
+
<mo> + </mo>
|
216
|
+
<mi> z </mi>
|
217
|
+
</mrow>
|
218
|
+
<mo>→</mo>
|
219
|
+
</mover>
|
224
220
|
</math>
|
225
221
|
INPUT
|
226
222
|
vec x + y + z
|
227
223
|
OUTPUT
|
228
224
|
end
|
229
225
|
|
230
|
-
it
|
231
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
226
|
+
it 'processes dot' do
|
227
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
232
228
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
233
|
-
<mover accent="true">
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
</mover>
|
243
|
-
|
229
|
+
<mover accent="true">
|
230
|
+
<mrow>
|
231
|
+
<mi> x </mi>
|
232
|
+
<mo> + </mo>
|
233
|
+
<mi> y </mi>
|
234
|
+
<mo> + </mo>
|
235
|
+
<mi> z </mi>
|
236
|
+
</mrow>
|
237
|
+
<mo> .</mo>
|
238
|
+
</mover>
|
244
239
|
</math>
|
245
240
|
INPUT
|
246
241
|
dot x + y + z
|
247
242
|
OUTPUT
|
248
243
|
end
|
249
244
|
|
250
|
-
it
|
251
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
245
|
+
it 'processes ddot' do
|
246
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
252
247
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
253
|
-
<mover accent="true">
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
</mover>
|
263
|
-
|
248
|
+
<mover accent="true">
|
249
|
+
<mrow>
|
250
|
+
<mi> x </mi>
|
251
|
+
<mo> + </mo>
|
252
|
+
<mi> y </mi>
|
253
|
+
<mo> + </mo>
|
254
|
+
<mi> z </mi>
|
255
|
+
</mrow>
|
256
|
+
<mo>..</mo>
|
257
|
+
</mover>
|
264
258
|
</math>
|
265
259
|
INPUT
|
266
260
|
ddot x + y + z
|
267
261
|
OUTPUT
|
268
262
|
end
|
269
263
|
|
270
|
-
it
|
271
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
264
|
+
it 'processes overset' do
|
265
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
272
266
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
273
|
-
<mover accent="true">
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
</mover>
|
283
|
-
|
267
|
+
<mover accent="true">
|
268
|
+
<mrow>
|
269
|
+
<mi> x </mi>
|
270
|
+
<mo> + </mo>
|
271
|
+
<mi> y </mi>
|
272
|
+
<mo> + </mo>
|
273
|
+
<mi> z </mi>
|
274
|
+
</mrow>
|
275
|
+
<mo>fred</mo>
|
276
|
+
</mover>
|
284
277
|
</math>
|
285
278
|
INPUT
|
286
|
-
overset(fred)(
|
279
|
+
overset(fred)(x + y + z)
|
287
280
|
OUTPUT
|
288
281
|
end
|
289
282
|
|
290
|
-
it
|
291
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
283
|
+
it 'processes mtable' do
|
284
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
292
285
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
286
|
+
<mi>X</mi>
|
287
|
+
<mo>=</mo>
|
288
|
+
<mtable frame="solid" rowlines="solid" align="axis 3">
|
289
|
+
<mtr>
|
290
|
+
<mtd><mi>A</mi></mtd>
|
291
|
+
<mtd><mi>B</mi></mtd>
|
292
|
+
</mtr>
|
293
|
+
<mtr>
|
294
|
+
<mtd><mi>C</mi></mtd>
|
295
|
+
<mtd><mi>D</mi></mtd>
|
296
|
+
</mtr>
|
297
|
+
<mtr>
|
298
|
+
<mtd><mi>E</mi></mtd>
|
299
|
+
<mtd><mi>F</mi></mtd>
|
300
|
+
</mtr>
|
301
|
+
</mtable>
|
309
302
|
</math>
|
310
303
|
INPUT
|
311
304
|
X = [[A,B],[C,D],[E,F]]
|
312
305
|
OUTPUT
|
313
306
|
end
|
314
307
|
|
315
|
-
it
|
316
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
308
|
+
it 'processes <semantics> wrapping element' do
|
309
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
317
310
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
318
311
|
<semantics>
|
319
312
|
<mrow>
|
@@ -341,8 +334,8 @@ RSpec.describe MathML2AsciiMath do
|
|
341
334
|
OUTPUT
|
342
335
|
end
|
343
336
|
|
344
|
-
it
|
345
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
337
|
+
it 'processes <math> without xmlns' do
|
338
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
346
339
|
<math>
|
347
340
|
<semantics>
|
348
341
|
<mrow>
|
@@ -370,8 +363,8 @@ RSpec.describe MathML2AsciiMath do
|
|
370
363
|
OUTPUT
|
371
364
|
end
|
372
365
|
|
373
|
-
it
|
374
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
366
|
+
it 'processes and skips <annotation> element' do
|
367
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
375
368
|
<math>
|
376
369
|
<semantics>
|
377
370
|
<mrow>
|
@@ -400,21 +393,32 @@ RSpec.describe MathML2AsciiMath do
|
|
400
393
|
OUTPUT
|
401
394
|
end
|
402
395
|
|
403
|
-
it
|
404
|
-
expect(MathML2AsciiMath.m2a(<<~INPUT)).to
|
396
|
+
it 'does not include non-significant whitespaces (spaces between nodes)' do
|
397
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
398
|
+
<math> <semantics> <mrow> <msub> <mi>x</mi> <mn>1</mn> </msub> <mo>,</mo><mtext> </mtext><msub> <mi>x</mi> <mn>2</mn> </msub> <mo>,</mo><mtext> </mtext><mtext> </mtext><mo>…</mo><mtext> </mtext><mtext> </mtext><mtext> </mtext><msub> <mi>x</mi> <mi>n</mi> </msub> </mrow> <annotation encoding='MathType-MTEF'>MathType@MTEF@5@5@+= feaagKart1ev2aqatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbbjxAHX garuavP1wzZbItLDhis9wBH5garmWu51MyVXgarqqtubsr4rNCHbGe aGqipG0dh9qqWrVepG0dbbL8F4rqqrVepeea0xe9LqFf0xc9q8qqaq Fn0lXdHiVcFbIOFHK8Feea0dXdar=Jb9hs0dXdHuk9fr=xfr=xfrpe WZqaaeGaciWaamGadaGadeaabaGaaqaaaOqaaiaadIhadaWgaaWcba GaaGymaaqabaGccaGGSaGaaGjbVlaadIhadaWgaaWcbaGaaGOmaaqa baGccaGGSaGaaGjbVlaaykW7cqWIMaYscaaMc8UaaGPaVlaaysW7ca WG4bWaaSbaaSqaaiaad6gaaeqaaaaa@4713@ </annotation> </semantics> </math>
|
399
|
+
INPUT
|
400
|
+
x_1 , x_2 , ... x_n
|
401
|
+
OUTPUT
|
402
|
+
end
|
403
|
+
|
404
|
+
it 'processes unknown MathML' do
|
405
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to eq <<~OUTPUT.strip
|
405
406
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
</mrow>
|
407
|
+
<mrow>
|
408
|
+
<mi> x </mi>
|
409
|
+
<mo> + </mo>
|
410
|
+
<mphantom>
|
411
|
+
<mi> y </mi>
|
412
|
+
<mo> + </mo>
|
413
|
+
</mphantom>
|
414
|
+
<mi> z </mi>
|
415
|
+
</mrow>
|
415
416
|
</math>
|
416
417
|
INPUT
|
417
|
-
x + <
|
418
|
+
x + <math xmlns="http://www.w3.org/1998/Math/MathML"><mphantom>
|
419
|
+
<mi> y </mi>
|
420
|
+
<mo> + </mo>
|
421
|
+
</mphantom></math> z
|
418
422
|
OUTPUT
|
419
423
|
end
|
420
424
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mathml2asciimath
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04-
|
11
|
+
date: 2020-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: htmlentities
|