mathml2asciimath 0.0.8 → 0.0.9
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/.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
|