mathml2asciimath 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/macos.yml +8 -4
- data/.github/workflows/ubuntu.yml +20 -4
- data/.github/workflows/windows.yml +8 -4
- data/Gemfile.lock +17 -19
- data/README.adoc +3 -2
- data/lib/mathml2asciimath/m2a.rb +172 -138
- data/lib/mathml2asciimath/version.rb +1 -1
- data/mathml2asciimath.gemspec +1 -1
- data/spec/mathml_spec.rb +114 -26
- metadata +7 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43c4f60fbcf9b1119395d0149960d84e16746522ea840e5b57c25578b51a35b3
|
4
|
+
data.tar.gz: 4a5d43531774ad6ed874e023a010b51a2bb0613cbf9ce024ad29d35eb4f91662
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9855d06f3c4dafa65f336ed9f78efd3858d83d30a81a78aee3ba3f9c73d202c1bf772c13394f79940ed5451b171a8a112740d732d1c13cf10ae048b1725cb4f4
|
7
|
+
data.tar.gz: b5f226d83b1418a2427e53527cc7154eff5aadd75563d653f459cb56f2bccbd312b1ce75cdee163d9974b7579112616010f387cf4e1caaf123b8ae0659e41f1c
|
data/.github/workflows/macos.yml
CHANGED
@@ -1,14 +1,18 @@
|
|
1
|
-
# Auto-generated
|
2
|
-
#
|
1
|
+
# Auto-generated by Cimas: Do not edit it manually!
|
2
|
+
# See https://github.com/metanorma/cimas
|
3
3
|
name: macos
|
4
4
|
|
5
|
-
on:
|
5
|
+
on:
|
6
|
+
push:
|
7
|
+
branches: [ master ]
|
8
|
+
pull_request:
|
6
9
|
|
7
10
|
jobs:
|
8
11
|
test-macos:
|
9
12
|
name: Test on Ruby ${{ matrix.ruby }} macOS
|
10
13
|
runs-on: macos-latest
|
11
14
|
strategy:
|
15
|
+
fail-fast: false
|
12
16
|
matrix:
|
13
17
|
ruby: [ '2.6', '2.5', '2.4' ]
|
14
18
|
steps:
|
@@ -20,7 +24,7 @@ jobs:
|
|
20
24
|
architecture: 'x64'
|
21
25
|
- name: Update gems
|
22
26
|
run: |
|
23
|
-
sudo gem install bundler
|
27
|
+
sudo gem install bundler --force
|
24
28
|
bundle install --jobs 4 --retry 3
|
25
29
|
- name: Run specs
|
26
30
|
run: |
|
@@ -1,14 +1,18 @@
|
|
1
|
-
# Auto-generated
|
2
|
-
#
|
1
|
+
# Auto-generated by Cimas: Do not edit it manually!
|
2
|
+
# See https://github.com/metanorma/cimas
|
3
3
|
name: ubuntu
|
4
4
|
|
5
|
-
on:
|
5
|
+
on:
|
6
|
+
push:
|
7
|
+
branches: [ master ]
|
8
|
+
pull_request:
|
6
9
|
|
7
10
|
jobs:
|
8
11
|
test-linux:
|
9
12
|
name: Test on Ruby ${{ matrix.ruby }} Ubuntu
|
10
13
|
runs-on: ubuntu-latest
|
11
14
|
strategy:
|
15
|
+
fail-fast: false
|
12
16
|
matrix:
|
13
17
|
ruby: [ '2.6', '2.5', '2.4' ]
|
14
18
|
steps:
|
@@ -20,8 +24,20 @@ jobs:
|
|
20
24
|
architecture: 'x64'
|
21
25
|
- name: Update gems
|
22
26
|
run: |
|
23
|
-
gem install bundler
|
27
|
+
gem install bundler
|
24
28
|
bundle install --jobs 4 --retry 3
|
25
29
|
- name: Run specs
|
26
30
|
run: |
|
27
31
|
bundle exec rake
|
32
|
+
- name: Trigger dependent repositories
|
33
|
+
if: github.ref == 'refs/heads/master' && matrix.ruby == '2.6'
|
34
|
+
env:
|
35
|
+
GH_USERNAME: ${{ secrets.PAT_USERNAME }}
|
36
|
+
GH_ACCESS_TOKEN: ${{ secrets.PAT_TOKEN }}
|
37
|
+
run: |
|
38
|
+
curl -LO --retry 3 https://raw.githubusercontent.com/metanorma/metanorma-build-scripts/master/trigger-gh-actions.sh
|
39
|
+
[[ -f ".github/workflows/dependent_repos.env" ]] && source .github/workflows/dependent_repos.env
|
40
|
+
for repo in $DEPENDENT_REPOS
|
41
|
+
do
|
42
|
+
sh trigger-gh-actions.sh $ORGANISATION $repo $GH_USERNAME $GH_ACCESS_TOKEN $GITHUB_REPOSITORY
|
43
|
+
done
|
@@ -1,14 +1,18 @@
|
|
1
|
-
# Auto-generated
|
2
|
-
#
|
1
|
+
# Auto-generated by Cimas: Do not edit it manually!
|
2
|
+
# See https://github.com/metanorma/cimas
|
3
3
|
name: windows
|
4
4
|
|
5
|
-
on:
|
5
|
+
on:
|
6
|
+
push:
|
7
|
+
branches: [ master ]
|
8
|
+
pull_request:
|
6
9
|
|
7
10
|
jobs:
|
8
11
|
test-windows:
|
9
12
|
name: Test on Ruby ${{ matrix.ruby }} Windows
|
10
13
|
runs-on: windows-latest
|
11
14
|
strategy:
|
15
|
+
fail-fast: false
|
12
16
|
matrix:
|
13
17
|
ruby: [ '2.6', '2.5', '2.4' ]
|
14
18
|
steps:
|
@@ -21,7 +25,7 @@ jobs:
|
|
21
25
|
- name: Update gems
|
22
26
|
shell: pwsh
|
23
27
|
run: |
|
24
|
-
gem install bundler
|
28
|
+
gem install bundler
|
25
29
|
bundle config --local path vendor/bundle
|
26
30
|
bundle update
|
27
31
|
bundle install --jobs 4 --retry 3
|
data/Gemfile.lock
CHANGED
@@ -13,7 +13,7 @@ GEM
|
|
13
13
|
coderay (1.1.2)
|
14
14
|
diff-lcs (1.3)
|
15
15
|
docile (1.3.2)
|
16
|
-
ffi (1.
|
16
|
+
ffi (1.12.2)
|
17
17
|
formatador (0.2.5)
|
18
18
|
guard (2.16.1)
|
19
19
|
formatador (>= 0.2.4)
|
@@ -30,21 +30,20 @@ GEM
|
|
30
30
|
guard-compat (~> 1.1)
|
31
31
|
rspec (>= 2.99.0, < 4.0)
|
32
32
|
htmlentities (4.3.4)
|
33
|
-
|
34
|
-
listen (3.2.0)
|
33
|
+
listen (3.2.1)
|
35
34
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
36
35
|
rb-inotify (~> 0.9, >= 0.9.10)
|
37
|
-
lumberjack (1.
|
36
|
+
lumberjack (1.2.4)
|
38
37
|
method_source (0.9.2)
|
39
38
|
mini_portile2 (2.4.0)
|
40
39
|
nenv (0.3.0)
|
41
|
-
nokogiri (1.10.
|
40
|
+
nokogiri (1.10.8)
|
42
41
|
mini_portile2 (~> 2.4.0)
|
43
42
|
notiffany (0.1.3)
|
44
43
|
nenv (~> 0.1)
|
45
44
|
shellany (~> 0.0)
|
46
|
-
parallel (1.19.
|
47
|
-
parser (2.
|
45
|
+
parallel (1.19.1)
|
46
|
+
parser (2.7.0.3)
|
48
47
|
ast (~> 2.4.0)
|
49
48
|
powerpack (0.1.2)
|
50
49
|
pry (0.12.2)
|
@@ -53,23 +52,23 @@ GEM
|
|
53
52
|
rainbow (3.0.0)
|
54
53
|
rake (12.3.3)
|
55
54
|
rb-fsevent (0.10.3)
|
56
|
-
rb-inotify (0.10.
|
55
|
+
rb-inotify (0.10.1)
|
57
56
|
ffi (~> 1.0)
|
58
57
|
rspec (3.9.0)
|
59
58
|
rspec-core (~> 3.9.0)
|
60
59
|
rspec-expectations (~> 3.9.0)
|
61
60
|
rspec-mocks (~> 3.9.0)
|
62
|
-
rspec-core (3.9.
|
63
|
-
rspec-support (~> 3.9.
|
61
|
+
rspec-core (3.9.1)
|
62
|
+
rspec-support (~> 3.9.1)
|
64
63
|
rspec-expectations (3.9.0)
|
65
64
|
diff-lcs (>= 1.2.0, < 2.0)
|
66
65
|
rspec-support (~> 3.9.0)
|
67
66
|
rspec-match_fuzzy (0.1.3)
|
68
67
|
rspec (>= 3.2)
|
69
|
-
rspec-mocks (3.9.
|
68
|
+
rspec-mocks (3.9.1)
|
70
69
|
diff-lcs (>= 1.2.0, < 2.0)
|
71
70
|
rspec-support (~> 3.9.0)
|
72
|
-
rspec-support (3.9.
|
71
|
+
rspec-support (3.9.2)
|
73
72
|
rubocop (0.54.0)
|
74
73
|
parallel (~> 1.10)
|
75
74
|
parser (>= 2.5)
|
@@ -79,20 +78,19 @@ GEM
|
|
79
78
|
unicode-display_width (~> 1.0, >= 1.0.1)
|
80
79
|
ruby-progressbar (1.10.1)
|
81
80
|
shellany (0.0.1)
|
82
|
-
simplecov (0.
|
81
|
+
simplecov (0.18.5)
|
83
82
|
docile (~> 1.1)
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
thor (0.20.3)
|
83
|
+
simplecov-html (~> 0.11)
|
84
|
+
simplecov-html (0.12.1)
|
85
|
+
thor (1.0.1)
|
88
86
|
timecop (0.9.1)
|
89
|
-
unicode-display_width (1.6.
|
87
|
+
unicode-display_width (1.6.1)
|
90
88
|
|
91
89
|
PLATFORMS
|
92
90
|
ruby
|
93
91
|
|
94
92
|
DEPENDENCIES
|
95
|
-
bundler
|
93
|
+
bundler
|
96
94
|
byebug (~> 9.1)
|
97
95
|
guard (~> 2.14)
|
98
96
|
guard-rspec (~> 4.7)
|
data/README.adoc
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
= mathml2asciimath
|
2
2
|
|
3
3
|
image:https://img.shields.io/gem/v/mathml2asciimath.svg["Gem Version", link="https://rubygems.org/gems/mathml2asciimath"]
|
4
|
-
image:https://
|
5
|
-
image:https://
|
4
|
+
image:https://github.com/metanorma/mathml2asciimath/workflows/ubuntu/badge.svg["Ubuntu Build Status", link="https://github.com/metanorma/mathml2asciimath/actions?query=workflow%3Aubuntu"]
|
5
|
+
image:https://github.com/metanorma/mathml2asciimath/workflows/macos/badge.svg["OSX Build Status", link="https://github.com/metanorma/mathml2asciimath/actions?query=workflow%3Amacos"]
|
6
|
+
image:https://github.com/metanorma/mathml2asciimath/workflows/windows/badge.svg["Windows Build Status", link="https://github.com/metanorma/mathml2asciimath/actions?query=workflow%3Awindows"]
|
6
7
|
image:https://codeclimate.com/github/metanorma/mathml2asciimath/badges/gpa.svg["Code Climate", link="https://codeclimate.com/github/metanorma/mathml2asciimath"]
|
7
8
|
image:https://img.shields.io/github/issues-pr-raw/metanorma/mathml2asciimath.svg["Pull Requests", link="https://github.com/metanorma/mathml2asciimath/pulls"]
|
8
9
|
image:https://img.shields.io/github/commits-since/metanorma/mathml2asciimath/latest.svg["Commits since latest",link="https://github.com/metanorma/mathml2asciimath/releases"]
|
data/lib/mathml2asciimath/m2a.rb
CHANGED
@@ -12,43 +12,44 @@ module MathML2AsciiMath
|
|
12
12
|
end
|
13
13
|
|
14
14
|
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/, "
|
15
|
+
x.gsub(/\u03b1/, "alpha").
|
16
|
+
gsub(/\u03b2/, "beta").
|
17
|
+
gsub(/\u03b3/, "gamma").
|
18
|
+
gsub(/\u0393/, "Gamma").
|
19
|
+
gsub(/\u03b4/, "delta").
|
20
|
+
gsub(/\u0394/, "Delta").
|
21
|
+
gsub(/\u2206/, "Delta").
|
22
|
+
gsub(/\u03b5/, "epsilon").
|
23
|
+
gsub(/\u025b/, "varepsilon").
|
24
|
+
gsub(/\u03b6/, "zeta").
|
25
|
+
gsub(/\u03b7/, "eta").
|
26
|
+
gsub(/\u03b8/, "theta").
|
27
|
+
gsub(/\u0398/, "Theta").
|
28
|
+
gsub(/\u03d1/, "vartheta").
|
29
|
+
gsub(/\u03b9/, "iota").
|
30
|
+
gsub(/\u03ba/, "kappa").
|
31
|
+
gsub(/\u03bb/, "lambda").
|
32
|
+
gsub(/\u039b/, "Lambda").
|
33
|
+
gsub(/\u03bc/, "mu").
|
34
|
+
gsub(/\u03bd/, "nu").
|
35
|
+
gsub(/\u03be/, "xi").
|
36
|
+
gsub(/\u039e/, "Xi").
|
37
|
+
gsub(/\u03c0/, "pi").
|
38
|
+
gsub(/\u03a0/, "Pi").
|
39
|
+
gsub(/\u03c1/, "rho").
|
40
|
+
gsub(/\u03c2/, "beta").
|
41
|
+
gsub(/\u03c3/, "sigma").
|
42
|
+
gsub(/\u03a3/, "Sigma").
|
43
|
+
gsub(/\u03c4/, "tau").
|
44
|
+
gsub(/\u03c5/, "upsilon").
|
45
|
+
gsub(/\u03c6/, "phi").
|
46
|
+
gsub(/\u03a6/, "Phi").
|
47
|
+
gsub(/\u03d5/, "varphi").
|
48
|
+
gsub(/\u03c7/, "chi").
|
49
|
+
gsub(/\u03c8/, "psi").
|
50
|
+
gsub(/\u03a8/, "Psi").
|
51
|
+
gsub(/\u03c9/, "omega").
|
52
|
+
gsub(/\u03a9/, "omega").
|
52
53
|
gsub(/\u22c5/, "*").
|
53
54
|
gsub(/\u2219/, "*").
|
54
55
|
gsub(/\u00b7/, "*").
|
@@ -163,109 +164,142 @@ module MathML2AsciiMath
|
|
163
164
|
out = ""
|
164
165
|
if node.text?
|
165
166
|
return encodechars(HTMLEntities.new.decode(node.text))
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
#
|
256
|
-
node.children.each { |n| out << parse(n) }
|
257
|
-
out = " #{out} " if /[^a-zA-Z0-9',]|[a-z][a-z]/.match out
|
258
|
-
return out
|
259
|
-
when "mo"
|
260
|
-
node.children.each { |n| out << parse(n) }
|
261
|
-
out = " #{out} " unless node["fence"]
|
262
|
-
return out
|
263
|
-
when "mstyle"
|
264
|
-
node.children.each { |n| out << parse(n) }
|
265
|
-
return out
|
167
|
+
end
|
168
|
+
|
169
|
+
case node.name.sub(/^[^:]*:/, "")
|
170
|
+
when "math"
|
171
|
+
outarr = []
|
172
|
+
node.elements.each { |n| outarr << parse(n).strip }
|
173
|
+
return outarr.join(" ")
|
174
|
+
|
175
|
+
when "annotation"
|
176
|
+
return ""
|
177
|
+
|
178
|
+
when "semantics"
|
179
|
+
outarr = []
|
180
|
+
node.elements.each { |n| outarr << parse(n).strip }
|
181
|
+
return outarr.join(" ")
|
182
|
+
|
183
|
+
when "mrow"
|
184
|
+
outarr = []
|
185
|
+
node.children.each { |n| outarr << parse(n).strip }
|
186
|
+
out = outarr.join(" ")
|
187
|
+
if %w{mfrac msub munder munderover}.include? node.parent.name.sub(/^[^:]*:/, "")
|
188
|
+
out = "(#{out})"
|
189
|
+
end
|
190
|
+
return out
|
191
|
+
|
192
|
+
when "mfenced"
|
193
|
+
outarr = []
|
194
|
+
open = node["open"] || "("
|
195
|
+
close = node["close"] || ")"
|
196
|
+
separator = "," # TODO currently ignore the supplied separators
|
197
|
+
node.elements.each { |n| outarr << parse(n).strip }
|
198
|
+
out = outarr.join(separator)
|
199
|
+
return "#{open}#{out}#{close}"
|
200
|
+
|
201
|
+
when "msqrt"
|
202
|
+
outarr = []
|
203
|
+
node.elements.each { |n| outarr << parse(n).strip }
|
204
|
+
return "sqrt(#{outarr.join(" ")})"
|
205
|
+
|
206
|
+
when "mfrac"
|
207
|
+
return "(#{parse(node.elements[0])})/(#{parse(node.elements[1])})"
|
208
|
+
|
209
|
+
when "msup"
|
210
|
+
sup = parse(node.elements[1])
|
211
|
+
sup = "(#{sup})" unless sup.length == 1
|
212
|
+
op = parse(node.elements[0]).gsub(/ $/, "")
|
213
|
+
return "#{op}^#{sup}"
|
214
|
+
|
215
|
+
when "msub"
|
216
|
+
sub = parse(node.elements[1])
|
217
|
+
sub = "(#{sub})" unless sub.length == 1
|
218
|
+
op = parse(node.elements[0]).gsub(/ $/, "")
|
219
|
+
return "#{op}_#{sub}"
|
220
|
+
|
221
|
+
when "munderover", "msubsup"
|
222
|
+
sub = parse(node.elements[1])
|
223
|
+
sub = "(#{sub})" unless sub.length == 1
|
224
|
+
sup = parse(node.elements[2])
|
225
|
+
sup = "(#{sup})" unless sup.length == 1
|
226
|
+
op = parse(node.elements[0]).gsub(/ $/, "")
|
227
|
+
return "#{op}_#{sub}^#{sup}"
|
228
|
+
|
229
|
+
when "munder"
|
230
|
+
elem1 = parse(node.elements[1]).sub(/^\s+/, "").sub(/\s+$/, "")
|
231
|
+
accent = case elem1
|
232
|
+
when "\u0332" then "ul"
|
233
|
+
when "\u23df" then "ubrace"
|
234
|
+
else
|
235
|
+
"underset"
|
236
|
+
end
|
237
|
+
if accent == "underset"
|
238
|
+
return "underset(#{elem1})(#{parse(node.elements[0])})"
|
239
|
+
else
|
240
|
+
return "#{accent} #{parse(node.elements[0])}"
|
241
|
+
end
|
242
|
+
when "mover"
|
243
|
+
elem1 = parse(node.elements[1]).sub(/^\s+/, "").sub(/\s+$/, "")
|
244
|
+
accent = case elem1
|
245
|
+
when "\u005e" then "hat"
|
246
|
+
when "\u00af" then "bar"
|
247
|
+
#when "\u2192" then "vec"
|
248
|
+
when "->" then "vec"
|
249
|
+
when "." then "dot"
|
250
|
+
when ".." then "ddot"
|
251
|
+
when "\u23de" then "obrace"
|
252
|
+
else
|
253
|
+
"overset"
|
254
|
+
end
|
255
|
+
if accent == "overset"
|
256
|
+
return "overset(#{elem1})(#{parse(node.elements[0])})"
|
266
257
|
else
|
267
|
-
node.
|
258
|
+
return "#{accent} #{parse(node.elements[0])}"
|
268
259
|
end
|
260
|
+
|
261
|
+
when "mtable"
|
262
|
+
outarr = []
|
263
|
+
node.elements.each { |n| outarr << parse(n).strip }
|
264
|
+
return "[#{outarr.join(",")}]"
|
265
|
+
|
266
|
+
when "mtr"
|
267
|
+
outarr = []
|
268
|
+
node.elements.each { |n| outarr << parse(n).strip }
|
269
|
+
return "[#{outarr.join(",")}]"
|
270
|
+
|
271
|
+
when "mtd"
|
272
|
+
outarr = []
|
273
|
+
node.elements.each { |n| outarr << parse(n).strip }
|
274
|
+
return "#{outarr.join(",")}"
|
275
|
+
|
276
|
+
when "mn", "mtext"
|
277
|
+
outarr = []
|
278
|
+
node.children.each { |n| outarr << parse(n).strip }
|
279
|
+
return "#{outarr.join("")}"
|
280
|
+
|
281
|
+
when "mi"
|
282
|
+
# mi is not meant to have space around it, but Word is conflating operators and operands
|
283
|
+
outarr = []
|
284
|
+
node.children.each { |n| outarr << parse(n).strip }
|
285
|
+
out = outarr.join(" ")
|
286
|
+
out = " #{out} " if /[^a-zA-Z0-9',]|[a-z][a-z]/.match out
|
287
|
+
return out
|
288
|
+
|
289
|
+
when "mo"
|
290
|
+
outarr = []
|
291
|
+
node.children.each { |n| outarr << parse(n).strip }
|
292
|
+
out = outarr.join(" ")
|
293
|
+
out = " #{out} " unless node["fence"]
|
294
|
+
return out
|
295
|
+
|
296
|
+
when "mstyle"
|
297
|
+
outarr = []
|
298
|
+
node.children.each { |n| outarr << parse(n).strip }
|
299
|
+
out = outarr.join(" ")
|
300
|
+
else
|
301
|
+
node.to_xml
|
302
|
+
|
269
303
|
end
|
270
304
|
end
|
271
305
|
end
|
data/mathml2asciimath.gemspec
CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.add_dependency "htmlentities", "~> 4.3.4"
|
30
30
|
spec.add_dependency "nokogiri", ">= 1.10.4"
|
31
31
|
|
32
|
-
spec.add_development_dependency "bundler"
|
32
|
+
spec.add_development_dependency "bundler"
|
33
33
|
spec.add_development_dependency "byebug", "~> 9.1"
|
34
34
|
spec.add_development_dependency "rspec-match_fuzzy", "~> 0.1.3"
|
35
35
|
spec.add_development_dependency "guard", "~> 2.14"
|
data/spec/mathml_spec.rb
CHANGED
@@ -13,7 +13,7 @@ RSpec.describe MathML2AsciiMath do
|
|
13
13
|
</mstyle>
|
14
14
|
</math>
|
15
15
|
INPUT
|
16
|
-
a diamond x^2
|
16
|
+
a diamond x^2 + b xx x + c_3
|
17
17
|
OUTPUT
|
18
18
|
end
|
19
19
|
|
@@ -27,7 +27,7 @@ RSpec.describe MathML2AsciiMath do
|
|
27
27
|
</mrow>
|
28
28
|
</math>
|
29
29
|
INPUT
|
30
|
-
a diamond x^(2d)
|
30
|
+
a diamond x^(2d) + b xx x + c_(ab)
|
31
31
|
OUTPUT
|
32
32
|
end
|
33
33
|
|
@@ -105,7 +105,7 @@ RSpec.describe MathML2AsciiMath do
|
|
105
105
|
</munder>
|
106
106
|
</math>
|
107
107
|
INPUT
|
108
|
-
ubrace (
|
108
|
+
ubrace ( x + y + z )
|
109
109
|
OUTPUT
|
110
110
|
end
|
111
111
|
|
@@ -124,7 +124,7 @@ RSpec.describe MathML2AsciiMath do
|
|
124
124
|
</munder>
|
125
125
|
</math>
|
126
126
|
INPUT
|
127
|
-
ul (
|
127
|
+
ul ( x + y + z )
|
128
128
|
OUTPUT
|
129
129
|
end
|
130
130
|
|
@@ -143,7 +143,7 @@ RSpec.describe MathML2AsciiMath do
|
|
143
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
|
|
@@ -159,11 +159,11 @@ RSpec.describe MathML2AsciiMath do
|
|
159
159
|
<mi> z </mi>
|
160
160
|
</mrow>
|
161
161
|
<mo> ⏞</mo>
|
162
|
-
</mover>
|
162
|
+
</mover>
|
163
163
|
|
164
164
|
</math>
|
165
165
|
INPUT
|
166
|
-
obrace
|
166
|
+
obrace x + y + z
|
167
167
|
OUTPUT
|
168
168
|
end
|
169
169
|
|
@@ -179,11 +179,11 @@ RSpec.describe MathML2AsciiMath do
|
|
179
179
|
<mi> z </mi>
|
180
180
|
</mrow>
|
181
181
|
<mo> ^</mo>
|
182
|
-
</mover>
|
182
|
+
</mover>
|
183
183
|
|
184
184
|
</math>
|
185
185
|
INPUT
|
186
|
-
hat
|
186
|
+
hat x + y + z
|
187
187
|
OUTPUT
|
188
188
|
end
|
189
189
|
|
@@ -199,11 +199,11 @@ RSpec.describe MathML2AsciiMath do
|
|
199
199
|
<mi> z </mi>
|
200
200
|
</mrow>
|
201
201
|
<mo> ¯</mo>
|
202
|
-
</mover>
|
202
|
+
</mover>
|
203
203
|
|
204
204
|
</math>
|
205
205
|
INPUT
|
206
|
-
bar
|
206
|
+
bar x + y + z
|
207
207
|
OUTPUT
|
208
208
|
end
|
209
209
|
|
@@ -211,7 +211,7 @@ RSpec.describe MathML2AsciiMath do
|
|
211
211
|
expect(MathML2AsciiMath.m2a(<<~INPUT)).to match_fuzzy <<~OUTPUT
|
212
212
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
213
213
|
<mover accent="true">
|
214
|
-
<mrow>
|
214
|
+
<mrow>
|
215
215
|
<mi> x </mi>
|
216
216
|
<mo> + </mo>
|
217
217
|
<mi> y </mi>
|
@@ -219,11 +219,11 @@ RSpec.describe MathML2AsciiMath do
|
|
219
219
|
<mi> z </mi>
|
220
220
|
</mrow>
|
221
221
|
<mo>→</mo>
|
222
|
-
</mover>
|
222
|
+
</mover>
|
223
223
|
|
224
224
|
</math>
|
225
225
|
INPUT
|
226
|
-
vec
|
226
|
+
vec x + y + z
|
227
227
|
OUTPUT
|
228
228
|
end
|
229
229
|
|
@@ -231,7 +231,7 @@ RSpec.describe MathML2AsciiMath do
|
|
231
231
|
expect(MathML2AsciiMath.m2a(<<~INPUT)).to match_fuzzy <<~OUTPUT
|
232
232
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
233
233
|
<mover accent="true">
|
234
|
-
<mrow>
|
234
|
+
<mrow>
|
235
235
|
<mi> x </mi>
|
236
236
|
<mo> + </mo>
|
237
237
|
<mi> y </mi>
|
@@ -239,11 +239,11 @@ RSpec.describe MathML2AsciiMath do
|
|
239
239
|
<mi> z </mi>
|
240
240
|
</mrow>
|
241
241
|
<mo> .</mo>
|
242
|
-
</mover>
|
242
|
+
</mover>
|
243
243
|
|
244
244
|
</math>
|
245
245
|
INPUT
|
246
|
-
dot
|
246
|
+
dot x + y + z
|
247
247
|
OUTPUT
|
248
248
|
end
|
249
249
|
|
@@ -251,7 +251,7 @@ RSpec.describe MathML2AsciiMath do
|
|
251
251
|
expect(MathML2AsciiMath.m2a(<<~INPUT)).to match_fuzzy <<~OUTPUT
|
252
252
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
253
253
|
<mover accent="true">
|
254
|
-
<mrow>
|
254
|
+
<mrow>
|
255
255
|
<mi> x </mi>
|
256
256
|
<mo> + </mo>
|
257
257
|
<mi> y </mi>
|
@@ -259,11 +259,11 @@ RSpec.describe MathML2AsciiMath do
|
|
259
259
|
<mi> z </mi>
|
260
260
|
</mrow>
|
261
261
|
<mo>..</mo>
|
262
|
-
</mover>
|
262
|
+
</mover>
|
263
263
|
|
264
264
|
</math>
|
265
265
|
INPUT
|
266
|
-
ddot
|
266
|
+
ddot x + y + z
|
267
267
|
OUTPUT
|
268
268
|
end
|
269
269
|
|
@@ -271,7 +271,7 @@ RSpec.describe MathML2AsciiMath do
|
|
271
271
|
expect(MathML2AsciiMath.m2a(<<~INPUT)).to match_fuzzy <<~OUTPUT
|
272
272
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
273
273
|
<mover accent="true">
|
274
|
-
<mrow>
|
274
|
+
<mrow>
|
275
275
|
<mi> x </mi>
|
276
276
|
<mo> + </mo>
|
277
277
|
<mi> y </mi>
|
@@ -279,11 +279,11 @@ RSpec.describe MathML2AsciiMath do
|
|
279
279
|
<mi> z </mi>
|
280
280
|
</mrow>
|
281
281
|
<mo>fred</mo>
|
282
|
-
</mover>
|
282
|
+
</mover>
|
283
283
|
|
284
284
|
</math>
|
285
285
|
INPUT
|
286
|
-
overset(fred)(
|
286
|
+
overset(fred)( x + y + z )
|
287
287
|
OUTPUT
|
288
288
|
end
|
289
289
|
|
@@ -312,12 +312,100 @@ RSpec.describe MathML2AsciiMath do
|
|
312
312
|
OUTPUT
|
313
313
|
end
|
314
314
|
|
315
|
-
|
315
|
+
it "processes <semantics> wrapping element" do
|
316
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to match_fuzzy <<~OUTPUT
|
317
|
+
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
318
|
+
<semantics>
|
319
|
+
<mrow>
|
320
|
+
<mover accent="true">
|
321
|
+
<mi>λ</mi>
|
322
|
+
<mo>¯</mo>
|
323
|
+
</mover>
|
324
|
+
<mo stretchy="false">(</mo>
|
325
|
+
<msub>
|
326
|
+
<mi>t</mi>
|
327
|
+
<mn>1</mn>
|
328
|
+
</msub>
|
329
|
+
<mo>,</mo>
|
330
|
+
<mtext> </mtext>
|
331
|
+
<msub>
|
332
|
+
<mi>t</mi>
|
333
|
+
<mn>2</mn>
|
334
|
+
</msub>
|
335
|
+
<mo stretchy="false">)</mo>
|
336
|
+
</mrow>
|
337
|
+
</semantics>
|
338
|
+
</math>
|
339
|
+
INPUT
|
340
|
+
bar lambda ( t_1 , t_2 )
|
341
|
+
OUTPUT
|
342
|
+
end
|
343
|
+
|
344
|
+
it "processes <math> without xmlns" do
|
345
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to match_fuzzy <<~OUTPUT
|
346
|
+
<math>
|
347
|
+
<semantics>
|
348
|
+
<mrow>
|
349
|
+
<mover accent="true">
|
350
|
+
<mi>z</mi>
|
351
|
+
<mo>¯</mo>
|
352
|
+
</mover>
|
353
|
+
<mo stretchy="false">(</mo>
|
354
|
+
<msub>
|
355
|
+
<mi>t</mi>
|
356
|
+
<mn>1</mn>
|
357
|
+
</msub>
|
358
|
+
<mo>,</mo>
|
359
|
+
<mtext> </mtext>
|
360
|
+
<msub>
|
361
|
+
<mi>t</mi>
|
362
|
+
<mn>2</mn>
|
363
|
+
</msub>
|
364
|
+
<mo stretchy="false">)</mo>
|
365
|
+
</mrow>
|
366
|
+
</semantics>
|
367
|
+
</math>
|
368
|
+
INPUT
|
369
|
+
bar z ( t_1 , t_2 )
|
370
|
+
OUTPUT
|
371
|
+
end
|
372
|
+
|
373
|
+
it "processes and skips <annotation> element" do
|
374
|
+
expect(MathML2AsciiMath.m2a(<<~INPUT)).to match_fuzzy <<~OUTPUT
|
375
|
+
<math>
|
376
|
+
<semantics>
|
377
|
+
<mrow>
|
378
|
+
<mover accent="true">
|
379
|
+
<mi>z</mi>
|
380
|
+
<mo>¯</mo>
|
381
|
+
</mover>
|
382
|
+
<mo stretchy="false">(</mo>
|
383
|
+
<msub>
|
384
|
+
<mi>t</mi>
|
385
|
+
<mn>1</mn>
|
386
|
+
</msub>
|
387
|
+
<mo>,</mo>
|
388
|
+
<mtext> </mtext>
|
389
|
+
<msub>
|
390
|
+
<mi>t</mi>
|
391
|
+
<mn>2</mn>
|
392
|
+
</msub>
|
393
|
+
<mo stretchy="false">)</mo>
|
394
|
+
</mrow>
|
395
|
+
<annotation encoding="MathType-MTEF">MathType@MTEF@5@5@+=feaagCart1ev2aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLnhiov2DGi1BTfMBaeXatLxBI9gBaerbbjxAHXgarqqtubsr4rNCHbGeaGqipG0dh9qqWrVepG0dbbL8F4rqqrVepeea0xe9LqFf0xc9q8qqaqFn0lXdHiVcFbIOFHK8Feea0dXdar=Jb9hs0dXdHuk9fr=xfr=xfrpeWZqaaeqabiGaciGacaqadmaadaqaaqaaaOqaaiqadQhagaqeaiaacIcacaWG0bWaaSbaaSqaaiaaigdaaeqaaOGaaiilaiaaysW7caWG0bWaaSbaaSqaaiaaikdaaeqaaOGaaiykaaaa@3DCE@</annotation>
|
396
|
+
</semantics>
|
397
|
+
</math>
|
398
|
+
INPUT
|
399
|
+
bar z ( t_1 , t_2 )
|
400
|
+
OUTPUT
|
401
|
+
end
|
402
|
+
|
403
|
+
it "processes some unknown MathML" do
|
316
404
|
expect(MathML2AsciiMath.m2a(<<~INPUT)).to match_fuzzy <<~OUTPUT
|
317
405
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
318
406
|
<mrow>
|
319
407
|
<mi> x </mi>
|
320
|
-
<mo> + </mo>
|
408
|
+
<mo> + </mo>
|
321
409
|
<mphantom>
|
322
410
|
<mi> y </mi>
|
323
411
|
<mo> + </mo>
|
@@ -326,7 +414,7 @@ RSpec.describe MathML2AsciiMath do
|
|
326
414
|
</mrow>
|
327
415
|
</math>
|
328
416
|
INPUT
|
329
|
-
x
|
417
|
+
x + <mphantom>\n<mi> y </mi>\n<mo> + </mo>\n</mphantom> z
|
330
418
|
OUTPUT
|
331
419
|
end
|
332
420
|
|
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.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: htmlentities
|
@@ -42,16 +42,16 @@ dependencies:
|
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: byebug
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -227,8 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
227
227
|
- !ruby/object:Gem::Version
|
228
228
|
version: '0'
|
229
229
|
requirements: []
|
230
|
-
|
231
|
-
rubygems_version: 2.7.6
|
230
|
+
rubygems_version: 3.0.3
|
232
231
|
signing_key:
|
233
232
|
specification_version: 4
|
234
233
|
summary: Convert MathML to AsciiMath
|