mathml2asciimath 0.0.10 → 0.0.11
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/rake.yml +32 -0
- data/.gitignore +1 -0
- data/.hound.yml +3 -1
- data/.rubocop.yml +7 -7
- data/Gemfile +1 -2
- data/README.adoc +6 -6
- data/Rakefile +1 -1
- data/bin/m2a.rb +8 -10
- data/bin/rspec +1 -1
- data/lib/mathml2asciimath.rb +2 -2
- data/lib/mathml2asciimath/m2a.rb +186 -186
- data/lib/mathml2asciimath/version.rb +1 -2
- data/mathml2asciimath.gemspec +5 -5
- data/spec/mathml_spec.rb +306 -308
- data/spec/spec_helper.rb +7 -8
- metadata +31 -35
- data/.github/workflows/macos.yml +0 -31
- data/.github/workflows/ubuntu.yml +0 -43
- data/.github/workflows/windows.yml +0 -34
- data/.rubocop.ribose.yml +0 -65
- data/.rubocop.tb.yml +0 -650
- data/Gemfile.lock +0 -106
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aebdecff67a553ed83034b2f6fc90d1e1ec5b6be2225b2b74ae7bd951d1e313e
|
4
|
+
data.tar.gz: 8aea5d20406c5feab2d8a1713bd3928ecf6a4db264a2a1dbe6a3a87118db4f45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27e09923df99f422a42ed234d4a9f0d2504f18f667bba3c45547d76d2852019399bfea08cae791e9bc27e1a946fe71b2ec6dd82492d436116f741f8c3e7b8ab2
|
7
|
+
data.tar.gz: 0b92d2dc4d0a5239a2487c80c27a812214c21de7164539ed4877fa140e9bb903dab8aec608e66bdb17e989c97f5d74385f4fa59de0016df878c3cff5d84d8679
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Auto-generated by Cimas: Do not edit it manually!
|
2
|
+
# See https://github.com/metanorma/cimas
|
3
|
+
name: rake
|
4
|
+
|
5
|
+
on:
|
6
|
+
push:
|
7
|
+
branches: [ master, main ]
|
8
|
+
tags: [ v* ]
|
9
|
+
pull_request:
|
10
|
+
|
11
|
+
jobs:
|
12
|
+
rake:
|
13
|
+
name: Test on Ruby ${{ matrix.ruby }} ${{ matrix.os }}
|
14
|
+
runs-on: ${{ matrix.os }}
|
15
|
+
continue-on-error: ${{ matrix.experimental }}
|
16
|
+
strategy:
|
17
|
+
fail-fast: false
|
18
|
+
matrix:
|
19
|
+
ruby: [ '3.0', '2.7', '2.6', '2.5', '2.4' ]
|
20
|
+
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
21
|
+
experimental: [ false ]
|
22
|
+
steps:
|
23
|
+
- uses: actions/checkout@v2
|
24
|
+
with:
|
25
|
+
submodules: true
|
26
|
+
|
27
|
+
- uses: ruby/setup-ruby@v1
|
28
|
+
with:
|
29
|
+
ruby-version: ${{ matrix.ruby }}
|
30
|
+
bundler-cache: true
|
31
|
+
|
32
|
+
- run: bundle exec rake
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
.rubocop-https--*
|
data/.hound.yml
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
#
|
2
|
-
# https://github.com/
|
3
|
-
# All project-specific additions and overrides should be specified in this file.
|
4
|
-
|
1
|
+
# Auto-generated by Cimas: Do not edit it manually!
|
2
|
+
# See https://github.com/metanorma/cimas
|
5
3
|
inherit_from:
|
6
4
|
- https://raw.githubusercontent.com/riboseinc/oss-guides/master/ci/rubocop.yml
|
5
|
+
|
6
|
+
# local repo-specific modifications
|
7
|
+
# ...
|
8
|
+
|
7
9
|
AllCops:
|
8
|
-
TargetRubyVersion: 2.
|
9
|
-
Rails:
|
10
|
-
Enabled: true
|
10
|
+
TargetRubyVersion: 2.4
|
data/Gemfile
CHANGED
data/README.adoc
CHANGED
@@ -1,12 +1,12 @@
|
|
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://github.com/
|
5
|
-
image:https://github.com/
|
6
|
-
image:https://github.com/
|
7
|
-
image:https://codeclimate.com/github/
|
8
|
-
image:https://img.shields.io/github/issues-pr-raw/
|
9
|
-
image:https://img.shields.io/github/commits-since/
|
4
|
+
image:https://github.com/plurimath/mathml2asciimath/workflows/ubuntu/badge.svg["Ubuntu Build Status", link="https://github.com/plurimath/mathml2asciimath/actions?query=workflow%3Aubuntu"]
|
5
|
+
image:https://github.com/plurimath/mathml2asciimath/workflows/macos/badge.svg["OSX Build Status", link="https://github.com/plurimath/mathml2asciimath/actions?query=workflow%3Amacos"]
|
6
|
+
image:https://github.com/plurimath/mathml2asciimath/workflows/windows/badge.svg["Windows Build Status", link="https://github.com/plurimath/mathml2asciimath/actions?query=workflow%3Awindows"]
|
7
|
+
image:https://codeclimate.com/github/plurimath/mathml2asciimath/badges/gpa.svg["Code Climate", link="https://codeclimate.com/github/plurimath/mathml2asciimath"]
|
8
|
+
image:https://img.shields.io/github/issues-pr-raw/plurimath/mathml2asciimath.svg["Pull Requests", link="https://github.com/plurimath/mathml2asciimath/pulls"]
|
9
|
+
image:https://img.shields.io/github/commits-since/plurimath/mathml2asciimath/latest.svg["Commits since latest",link="https://github.com/plurimath/mathml2asciimath/releases"]
|
10
10
|
|
11
11
|
Ruby gem to convert MathML into AsciiMath
|
12
12
|
|
data/Rakefile
CHANGED
data/bin/m2a.rb
CHANGED
@@ -1,17 +1,15 @@
|
|
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
|
-
if /<math/.match x
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
out += if /<math/.match? x
|
9
|
+
MathML2AsciiMath.m2a(x)
|
10
|
+
else
|
11
|
+
x
|
12
|
+
end
|
13
13
|
end
|
14
14
|
print out
|
15
15
|
end
|
16
|
-
|
17
|
-
|
data/bin/rspec
CHANGED
data/lib/mathml2asciimath.rb
CHANGED
data/lib/mathml2asciimath/m2a.rb
CHANGED
@@ -3,197 +3,197 @@ require "htmlentities"
|
|
3
3
|
require "pp"
|
4
4
|
|
5
5
|
module MathML2AsciiMath
|
6
|
-
|
7
|
-
|
8
|
-
normalized = x
|
6
|
+
def self.m2a(xml)
|
7
|
+
normalized = xml
|
9
8
|
|
10
9
|
# &:noblanks skips non-significant whitespaces in MathML
|
11
10
|
docxml = Nokogiri::XML.parse(normalized, &:noblanks)
|
12
11
|
|
13
12
|
# Get rid of things like
|
14
13
|
# <mtext> </mtext>
|
15
|
-
parse(docxml.root).gsub(/[[:blank:]]/,
|
14
|
+
parse(docxml.root).gsub(/[[:blank:]]/, " ").unicode_normalize.squeeze(" ")
|
16
15
|
end
|
17
16
|
|
18
|
-
def self.encodechars(
|
19
|
-
|
20
|
-
gsub(/\u03b2/,
|
21
|
-
gsub(/\u03b3/,
|
22
|
-
gsub(/\u0393/,
|
23
|
-
gsub(/\u03b4/,
|
24
|
-
gsub(/\u0394/,
|
25
|
-
gsub(/\u2206/,
|
26
|
-
gsub(/\u03b5/,
|
27
|
-
gsub(/\u025b/,
|
28
|
-
gsub(/\u03b6/,
|
29
|
-
gsub(/\u03b7/,
|
30
|
-
gsub(/\u03b8/,
|
31
|
-
gsub(/\u0398/,
|
32
|
-
gsub(/\u03d1/,
|
33
|
-
gsub(/\u03b9/,
|
34
|
-
gsub(/\u03ba/,
|
35
|
-
gsub(/\u03bb/,
|
36
|
-
gsub(/\u039b/,
|
37
|
-
gsub(/\u03bc/,
|
38
|
-
gsub(/\u03bd/,
|
39
|
-
gsub(/\u03be/,
|
40
|
-
gsub(/\u039e/,
|
41
|
-
gsub(/\u03c0/,
|
42
|
-
gsub(/\u03a0/,
|
43
|
-
gsub(/\u03c1/,
|
44
|
-
gsub(/\u03c2/,
|
45
|
-
gsub(/\u03c3/,
|
46
|
-
gsub(/\u03a3/,
|
47
|
-
gsub(/\u03c4/,
|
48
|
-
gsub(/\u03c5/,
|
49
|
-
gsub(/\u03c6/,
|
50
|
-
gsub(/\u03a6/,
|
51
|
-
gsub(/\u03d5/,
|
52
|
-
gsub(/\u03c7/,
|
53
|
-
gsub(/\u03c8/,
|
54
|
-
gsub(/\u03a8/,
|
55
|
-
gsub(/\u03c9/,
|
56
|
-
gsub(/\u03a9/,
|
57
|
-
gsub(/\u22c5/,
|
58
|
-
gsub(/\u2219/,
|
59
|
-
gsub(/\u00b7/,
|
60
|
-
gsub(/\u2217/,
|
61
|
-
gsub(/\u22c6/,
|
62
|
-
gsub(/\//,
|
63
|
-
gsub(/\\/, "\\\\")
|
64
|
-
gsub(/\u00d7/,
|
65
|
-
gsub(/\u22c9/,
|
66
|
-
gsub(/\u22ca/,
|
67
|
-
gsub(/\u22c8/,
|
68
|
-
gsub(/\u00f7/,
|
69
|
-
gsub(/\u2218/,
|
70
|
-
gsub(/\u2295/,
|
71
|
-
gsub(/\u2a01/,
|
72
|
-
gsub(/\u2297/,
|
73
|
-
gsub(/\u2299/,
|
74
|
-
gsub(/\u2211/,
|
75
|
-
gsub(/\u220f/,
|
76
|
-
gsub(/\u2227/,
|
77
|
-
gsub(/\u22c0/,
|
78
|
-
gsub(/\u2228/,
|
79
|
-
gsub(/\u22c1/,
|
80
|
-
gsub(/\u2229/,
|
81
|
-
gsub(/\u22c2/,
|
82
|
-
gsub(/\u222a/,
|
83
|
-
gsub(/\u22c3/,
|
84
|
-
gsub(/\u2260/,
|
85
|
-
gsub(/\u2264/,
|
86
|
-
gsub(/\u2265/,
|
87
|
-
gsub(/\u227a/,
|
88
|
-
gsub(/\u227b/,
|
89
|
-
gsub(/\u2aaf/,
|
90
|
-
gsub(/\u2ab0/,
|
91
|
-
gsub(/\u2208/,
|
92
|
-
gsub(/\u2209/,
|
93
|
-
gsub(/\u2282/,
|
94
|
-
gsub(/\u2283/,
|
95
|
-
gsub(/\u2286/,
|
96
|
-
gsub(/\u2287/,
|
97
|
-
gsub(/\u2261/,
|
98
|
-
gsub(/\u2245/,
|
99
|
-
gsub(/\u2248/,
|
100
|
-
gsub(/\u221d/,
|
101
|
-
gsub(/\u00ac/,
|
102
|
-
gsub(/\u21d2/,
|
103
|
-
gsub(/\u21d4/,
|
104
|
-
gsub(/\u2200/,
|
105
|
-
gsub(/\u2203/,
|
106
|
-
gsub(/\u22a5/,
|
107
|
-
gsub(/\u22a4/,
|
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/,
|
118
|
-
gsub(/\u222e/,
|
119
|
-
gsub(/\u2202/,
|
120
|
-
gsub(/\u2207/,
|
121
|
-
gsub(/\u00b1/,
|
122
|
-
gsub(/\u2205/, "O/")
|
123
|
-
gsub(/\u221e/,
|
124
|
-
gsub(/\u2135/,
|
125
|
-
gsub(/\u2234/,
|
126
|
-
gsub(/\u2235/, ":'")
|
127
|
-
gsub(/\u2220/, "/_")
|
128
|
-
gsub(/\u25b3/, "/_\\")
|
129
|
-
gsub(/\u2032/, "'")
|
130
|
-
gsub(/~/,
|
131
|
-
gsub(/\u00a0\u00a0\u00a0\u00a0/,
|
132
|
-
gsub(/\u00a0\u00a0/,
|
133
|
-
gsub(/\u00a0/, "\\ ")
|
134
|
-
gsub(/\u2322/,
|
135
|
-
gsub(/\u00a0/,
|
136
|
-
gsub(/\u22ef/,
|
137
|
-
gsub(/\u22ee/,
|
138
|
-
gsub(/\u22f1/,
|
139
|
-
gsub(/\u22c4/,
|
140
|
-
gsub(/\u25a1/,
|
141
|
-
gsub(/\u230a/,
|
142
|
-
gsub(/\u230b/,
|
143
|
-
gsub(/\u2308/,
|
144
|
-
gsub(/\u2309/,
|
145
|
-
gsub(/\u2102/,
|
146
|
-
gsub(/\u2115/,
|
147
|
-
gsub(/\u211a/,
|
148
|
-
gsub(/\u211d/,
|
149
|
-
gsub(/\u2124/,
|
150
|
-
gsub(/\u2191/,
|
151
|
-
gsub(/\u2193/,
|
152
|
-
gsub(/\u2190/,
|
153
|
-
gsub(/\u2194/,
|
154
|
-
gsub(/\u21d2/,
|
155
|
-
gsub(/\u21d0/,
|
156
|
-
gsub(/\u21d4/,
|
157
|
-
gsub(/\u2192/,
|
158
|
-
gsub(/\u21a3/,
|
159
|
-
gsub(/\u21a0/,
|
160
|
-
gsub(/\u2916/,
|
161
|
-
gsub(/\u21a6/,
|
162
|
-
gsub(/\u2026/,
|
163
|
-
gsub(/\u2212/,
|
164
|
-
gsub(/\u2061/,
|
165
|
-
gsub(/\u2751/,
|
166
|
-
gsub(/[\u2028\u2029]/,
|
17
|
+
def self.encodechars(xml)
|
18
|
+
xml.gsub(/\u03b1/, "alpha")
|
19
|
+
.gsub(/\u03b2/, "beta")
|
20
|
+
.gsub(/\u03b3/, "gamma")
|
21
|
+
.gsub(/\u0393/, "Gamma")
|
22
|
+
.gsub(/\u03b4/, "delta")
|
23
|
+
.gsub(/\u0394/, "Delta")
|
24
|
+
.gsub(/\u2206/, "Delta")
|
25
|
+
.gsub(/\u03b5/, "epsilon")
|
26
|
+
.gsub(/\u025b/, "varepsilon")
|
27
|
+
.gsub(/\u03b6/, "zeta")
|
28
|
+
.gsub(/\u03b7/, "eta")
|
29
|
+
.gsub(/\u03b8/, "theta")
|
30
|
+
.gsub(/\u0398/, "Theta")
|
31
|
+
.gsub(/\u03d1/, "vartheta")
|
32
|
+
.gsub(/\u03b9/, "iota")
|
33
|
+
.gsub(/\u03ba/, "kappa")
|
34
|
+
.gsub(/\u03bb/, "lambda")
|
35
|
+
.gsub(/\u039b/, "Lambda")
|
36
|
+
.gsub(/\u03bc/, "mu")
|
37
|
+
.gsub(/\u03bd/, "nu")
|
38
|
+
.gsub(/\u03be/, "xi")
|
39
|
+
.gsub(/\u039e/, "Xi")
|
40
|
+
.gsub(/\u03c0/, "pi")
|
41
|
+
.gsub(/\u03a0/, "Pi")
|
42
|
+
.gsub(/\u03c1/, "rho")
|
43
|
+
.gsub(/\u03c2/, "beta")
|
44
|
+
.gsub(/\u03c3/, "sigma")
|
45
|
+
.gsub(/\u03a3/, "Sigma")
|
46
|
+
.gsub(/\u03c4/, "tau")
|
47
|
+
.gsub(/\u03c5/, "upsilon")
|
48
|
+
.gsub(/\u03c6/, "phi")
|
49
|
+
.gsub(/\u03a6/, "Phi")
|
50
|
+
.gsub(/\u03d5/, "varphi")
|
51
|
+
.gsub(/\u03c7/, "chi")
|
52
|
+
.gsub(/\u03c8/, "psi")
|
53
|
+
.gsub(/\u03a8/, "Psi")
|
54
|
+
.gsub(/\u03c9/, "omega")
|
55
|
+
.gsub(/\u03a9/, "omega")
|
56
|
+
.gsub(/\u22c5/, "*")
|
57
|
+
.gsub(/\u2219/, "*")
|
58
|
+
.gsub(/\u00b7/, "*")
|
59
|
+
.gsub(/\u2217/, "**")
|
60
|
+
.gsub(/\u22c6/, "***")
|
61
|
+
.gsub(/\//, "//")
|
62
|
+
.gsub(/\\/, "\\\\")
|
63
|
+
.gsub(/\u00d7/, "xx")
|
64
|
+
.gsub(/\u22c9/, "|><")
|
65
|
+
.gsub(/\u22ca/, "><|")
|
66
|
+
.gsub(/\u22c8/, "|><|")
|
67
|
+
.gsub(/\u00f7/, "-:")
|
68
|
+
.gsub(/\u2218/, "@")
|
69
|
+
.gsub(/\u2295/, "o+")
|
70
|
+
.gsub(/\u2a01/, "o+")
|
71
|
+
.gsub(/\u2297/, "ox")
|
72
|
+
.gsub(/\u2299/, "o.")
|
73
|
+
.gsub(/\u2211/, "sum")
|
74
|
+
.gsub(/\u220f/, "prod")
|
75
|
+
.gsub(/\u2227/, "^^")
|
76
|
+
.gsub(/\u22c0/, "^^^")
|
77
|
+
.gsub(/\u2228/, "vv")
|
78
|
+
.gsub(/\u22c1/, "vvv")
|
79
|
+
.gsub(/\u2229/, "nn")
|
80
|
+
.gsub(/\u22c2/, "nnn")
|
81
|
+
.gsub(/\u222a/, "uu")
|
82
|
+
.gsub(/\u22c3/, "uuu")
|
83
|
+
.gsub(/\u2260/, "!=")
|
84
|
+
.gsub(/\u2264/, "<=")
|
85
|
+
.gsub(/\u2265/, ">=")
|
86
|
+
.gsub(/\u227a/, "-<")
|
87
|
+
.gsub(/\u227b/, ">-")
|
88
|
+
.gsub(/\u2aaf/, "-<=")
|
89
|
+
.gsub(/\u2ab0/, ">-=")
|
90
|
+
.gsub(/\u2208/, "in")
|
91
|
+
.gsub(/\u2209/, "!in")
|
92
|
+
.gsub(/\u2282/, "sub")
|
93
|
+
.gsub(/\u2283/, "sup")
|
94
|
+
.gsub(/\u2286/, "sube")
|
95
|
+
.gsub(/\u2287/, "supe")
|
96
|
+
.gsub(/\u2261/, "-=")
|
97
|
+
.gsub(/\u2245/, "~=")
|
98
|
+
.gsub(/\u2248/, "~~")
|
99
|
+
.gsub(/\u221d/, "prop")
|
100
|
+
.gsub(/\u00ac/, "not")
|
101
|
+
.gsub(/\u21d2/, "=>")
|
102
|
+
.gsub(/\u21d4/, "<=>")
|
103
|
+
.gsub(/\u2200/, "AA")
|
104
|
+
.gsub(/\u2203/, "EE")
|
105
|
+
.gsub(/\u22a5/, "_|_")
|
106
|
+
.gsub(/\u22a4/, "TT")
|
107
|
+
.gsub(/\u22a2/, "|--")
|
108
|
+
.gsub(/\u22a8/, "|==")
|
109
|
+
.gsub(/\u22a8/, "|==")
|
110
|
+
.gsub(/\u2329/, "(:")
|
111
|
+
.gsub(/\u232a/, ":)")
|
112
|
+
.gsub(/\u2329/, "<<")
|
113
|
+
.gsub(/\u27e8/, "<<")
|
114
|
+
.gsub(/\u232a/, ">>")
|
115
|
+
.gsub(/\u27e9/, ">>")
|
116
|
+
.gsub(/\u222b/, "int")
|
117
|
+
.gsub(/\u222e/, "oint")
|
118
|
+
.gsub(/\u2202/, "del")
|
119
|
+
.gsub(/\u2207/, "grad")
|
120
|
+
.gsub(/\u00b1/, "+-")
|
121
|
+
.gsub(/\u2205/, "O/")
|
122
|
+
.gsub(/\u221e/, "oo")
|
123
|
+
.gsub(/\u2135/, "aleph")
|
124
|
+
.gsub(/\u2234/, ":.")
|
125
|
+
.gsub(/\u2235/, ":'")
|
126
|
+
.gsub(/\u2220/, "/_")
|
127
|
+
.gsub(/\u25b3/, "/_\\")
|
128
|
+
.gsub(/\u2032/, "'")
|
129
|
+
.gsub(/~/, "tilde")
|
130
|
+
.gsub(/\u00a0\u00a0\u00a0\u00a0/, "qquad")
|
131
|
+
.gsub(/\u00a0\u00a0/, "quad")
|
132
|
+
.gsub(/\u00a0/, "\\ ")
|
133
|
+
.gsub(/\u2322/, "frown")
|
134
|
+
.gsub(/\u00a0/, "quad")
|
135
|
+
.gsub(/\u22ef/, "cdots")
|
136
|
+
.gsub(/\u22ee/, "vdots")
|
137
|
+
.gsub(/\u22f1/, "ddots")
|
138
|
+
.gsub(/\u22c4/, "diamond")
|
139
|
+
.gsub(/\u25a1/, "square")
|
140
|
+
.gsub(/\u230a/, "|__")
|
141
|
+
.gsub(/\u230b/, "__|")
|
142
|
+
.gsub(/\u2308/, "|~")
|
143
|
+
.gsub(/\u2309/, "~|")
|
144
|
+
.gsub(/\u2102/, "CC")
|
145
|
+
.gsub(/\u2115/, "NN")
|
146
|
+
.gsub(/\u211a/, "QQ")
|
147
|
+
.gsub(/\u211d/, "RR")
|
148
|
+
.gsub(/\u2124/, "ZZ")
|
149
|
+
.gsub(/\u2191/, "uarr")
|
150
|
+
.gsub(/\u2193/, "darr")
|
151
|
+
.gsub(/\u2190/, "larr")
|
152
|
+
.gsub(/\u2194/, "harr")
|
153
|
+
.gsub(/\u21d2/, "rArr")
|
154
|
+
.gsub(/\u21d0/, "lArr")
|
155
|
+
.gsub(/\u21d4/, "hArr")
|
156
|
+
.gsub(/\u2192/, "->")
|
157
|
+
.gsub(/\u21a3/, ">->")
|
158
|
+
.gsub(/\u21a0/, "->>")
|
159
|
+
.gsub(/\u2916/, ">->>")
|
160
|
+
.gsub(/\u21a6/, "|->")
|
161
|
+
.gsub(/\u2026/, "...")
|
162
|
+
.gsub(/\u2212/, "-")
|
163
|
+
.gsub(/\u2061/, "") # function application
|
164
|
+
.gsub(/\u2751/, "square")
|
165
|
+
.gsub(/[\u2028\u2029]/, " ") # normalize thin spaces like \u2009, \u2008
|
167
166
|
end
|
168
167
|
|
169
|
-
def self.join_parsed_children(children, delimiter=
|
168
|
+
def self.join_parsed_children(children, delimiter = " ")
|
170
169
|
children.map do |n|
|
171
170
|
parse(n).strip
|
172
171
|
end.join(delimiter)
|
173
172
|
end
|
174
173
|
|
175
174
|
def self.parse(node)
|
176
|
-
out =
|
175
|
+
out = ""
|
177
176
|
if node.text?
|
178
177
|
return encodechars(HTMLEntities.new.decode(node.text))
|
179
178
|
end
|
180
179
|
|
181
|
-
case node.name.sub(/^[^:]*:/,
|
180
|
+
case node.name.sub(/^[^:]*:/, "")
|
182
181
|
when "math"
|
183
|
-
|
182
|
+
join_parsed_children(node.elements)
|
184
183
|
|
185
184
|
when "annotation"
|
186
|
-
|
185
|
+
""
|
187
186
|
|
188
187
|
when "semantics"
|
189
|
-
|
188
|
+
join_parsed_children(node.elements)
|
190
189
|
|
191
190
|
when "mrow"
|
192
191
|
out = join_parsed_children(node.elements)
|
193
|
-
if %w[mfrac msub munder munderover]
|
192
|
+
if %w[mfrac msub munder munderover]
|
193
|
+
.include? node.parent.name.sub(/^[^:]*:/, "")
|
194
194
|
out = "(#{out})"
|
195
195
|
end
|
196
|
-
|
196
|
+
out
|
197
197
|
|
198
198
|
when "mfenced"
|
199
199
|
sym_open = node["open"] || "("
|
@@ -201,33 +201,33 @@ module MathML2AsciiMath
|
|
201
201
|
|
202
202
|
separator = "," # TODO currently ignore the supplied separators
|
203
203
|
out = join_parsed_children(node.elements, separator)
|
204
|
-
|
204
|
+
"#{sym_open}#{out}#{sym_close}"
|
205
205
|
|
206
206
|
when "msqrt"
|
207
|
-
|
207
|
+
"sqrt(#{join_parsed_children(node.elements)})"
|
208
208
|
|
209
209
|
when "mfrac"
|
210
|
-
|
210
|
+
"(#{parse(node.elements[0])})/(#{parse(node.elements[1])})"
|
211
211
|
|
212
212
|
when "msup"
|
213
213
|
sup = parse(node.elements[1])
|
214
214
|
sup = "(#{sup})" unless sup.length == 1
|
215
|
-
op = parse(node.elements[0]).gsub(/ $/,
|
216
|
-
|
215
|
+
op = parse(node.elements[0]).gsub(/ $/, "")
|
216
|
+
"#{op}^#{sup}"
|
217
217
|
|
218
218
|
when "msub"
|
219
219
|
sub = parse(node.elements[1])
|
220
220
|
sub = "(#{sub})" unless sub.length == 1
|
221
|
-
op = parse(node.elements[0]).gsub(/ $/,
|
222
|
-
|
221
|
+
op = parse(node.elements[0]).gsub(/ $/, "")
|
222
|
+
"#{op}_#{sub}"
|
223
223
|
|
224
224
|
when "munderover", "msubsup"
|
225
225
|
sub = parse(node.elements[1])
|
226
226
|
sub = "(#{sub})" unless sub.length == 1
|
227
227
|
sup = parse(node.elements[2])
|
228
228
|
sup = "(#{sup})" unless sup.length == 1
|
229
|
-
op = parse(node.elements[0]).gsub(/ $/,
|
230
|
-
|
229
|
+
op = parse(node.elements[0]).gsub(/ $/, "")
|
230
|
+
"#{op}_#{sub}^#{sup}"
|
231
231
|
|
232
232
|
when "munder"
|
233
233
|
elem1 = parse(node.elements[1]).strip
|
@@ -239,9 +239,9 @@ module MathML2AsciiMath
|
|
239
239
|
end
|
240
240
|
|
241
241
|
if accent == "underset"
|
242
|
-
|
242
|
+
"underset(#{elem1})(#{parse(node.elements[0])})"
|
243
243
|
else
|
244
|
-
|
244
|
+
"#{accent} #{parse(node.elements[0])}"
|
245
245
|
end
|
246
246
|
|
247
247
|
when "mover"
|
@@ -249,7 +249,7 @@ module MathML2AsciiMath
|
|
249
249
|
accent = case elem1
|
250
250
|
when "\u005e" then "hat"
|
251
251
|
when "\u00af" then "bar"
|
252
|
-
#when "\u2192" then "vec"
|
252
|
+
# when "\u2192" then "vec"
|
253
253
|
when "->" then "vec"
|
254
254
|
when "." then "dot"
|
255
255
|
when ".." then "ddot"
|
@@ -259,44 +259,44 @@ module MathML2AsciiMath
|
|
259
259
|
end
|
260
260
|
|
261
261
|
if accent == "overset"
|
262
|
-
|
262
|
+
"overset(#{elem1})(#{parse(node.elements[0])})"
|
263
263
|
else
|
264
|
-
|
264
|
+
"#{accent} #{parse(node.elements[0])}"
|
265
265
|
end
|
266
266
|
|
267
267
|
when "mtable"
|
268
|
-
|
268
|
+
"[#{join_parsed_children(node.elements, ',')}]"
|
269
269
|
|
270
270
|
when "mtr"
|
271
|
-
|
271
|
+
"[#{join_parsed_children(node.elements, ',')}]"
|
272
272
|
|
273
273
|
when "mtd"
|
274
|
-
|
274
|
+
join_parsed_children(node.elements, ",")
|
275
275
|
|
276
276
|
when "mn", "mtext"
|
277
|
-
|
277
|
+
join_parsed_children(node.children, "")
|
278
278
|
|
279
279
|
when "mi"
|
280
280
|
# FIXME: What does this comment have to do with Word?
|
281
|
-
# mi is not meant to have space around it,
|
282
|
-
|
281
|
+
# mi is not meant to have space around it,
|
282
|
+
# but Word is conflating operators and operands
|
283
|
+
join_parsed_children(node.children)
|
283
284
|
|
284
285
|
# FIXME: Why do we need to add extra spaces?
|
285
286
|
# out = " #{out} " if /[^a-zA-Z0-9',]|[a-z][a-z]/.match out
|
286
|
-
return out
|
287
287
|
|
288
288
|
when "mo"
|
289
289
|
out = join_parsed_children(node.children)
|
290
|
-
out = " #{out} " unless node[
|
291
|
-
|
290
|
+
out = " #{out} " unless node["fence"]
|
291
|
+
out
|
292
292
|
|
293
293
|
when "mstyle"
|
294
|
-
|
294
|
+
join_parsed_children(node.children)
|
295
295
|
|
296
296
|
else
|
297
297
|
"<math xmlns=\"http://www.w3.org/1998/Math/MathML\">" +
|
298
298
|
node.to_xml +
|
299
|
-
|
299
|
+
"</math>"
|
300
300
|
|
301
301
|
end
|
302
302
|
end
|