mathml2asciimath 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d8737530a0a13306fbbae39a18d7eb464905fa9d
4
+ data.tar.gz: fcdcd915ff8319b98cb1dedbb7b3d5b57e8668ad
5
+ SHA512:
6
+ metadata.gz: '08e516b489e48eb8fb9387d42980db48a838cb33c7efb66c3763550bf8b4c62948a3c8135c20b591bad50adb9f79e64bd3fb578849800809f147406f00a90d38'
7
+ data.tar.gz: 0b5b8f8d1cfb0a44d1e98aff1b44368d67a79947311d40cf97387bb3ca2a88ea15ae06e7d465d6e2f6ccc5e14ab3a65ebeaeec071272b9ad30f52235ffcf22b6
data/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ BSD 2-Clause License
2
+
3
+ Copyright (c) 2018, Ribose
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ * Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.adoc ADDED
@@ -0,0 +1,12 @@
1
+ = mathml2asciimath
2
+
3
+ Ruby gem to convert MathML into AsciiMath
4
+
5
+ Ignores style and MathML attributes (other than `mfenced/@open`, `mfenced/@close`, `mo/@fence`).
6
+
7
+ Processes the following MathML tags: `mrow, mfenced, msqrt, mfrac, msup, msub, munderover, msubsup, munder, mover, mi, mn, ntext, mo, mtable, mtr, mtd`.
8
+
9
+ Converts all the Unicode characters MathJax knows about into AsciiMath operators (e.g. `\\beta, xx, oint`)
10
+
11
+ As with the other two MathML to AsciiMath converters available online (Python: https://github.com/rochecompaan/upfront.mathml2asciimath, Node.js: https://github.com/learningobjectsinc/mathml-to-asciimath), this converter is not foolproof, production-ready, or complete, and you will need to post-edit output. It's still a lot better than nothing. (And because it converts Unicode to Ascii, it's a lot better than the other two.)
12
+
data/bin/m2a.rb ADDED
@@ -0,0 +1,17 @@
1
+ require "mathml2asciimath"
2
+
3
+ STDIN.set_encoding("UTF-8")
4
+ while a = gets
5
+ matches = a.split(%r{(<math.*?</math>)})
6
+ out = ""
7
+ matches.each do |x|
8
+ if /<math/.match? x
9
+ out += MathML2AsciiMath.m2a(x)
10
+ else
11
+ out += x
12
+ end
13
+ end
14
+ print out
15
+ end
16
+
17
+
data/bin/rspec ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'rspec' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require "pathname"
10
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
11
+ "../../Gemfile", Pathname.new(__FILE__).realpath
12
+ )
13
+
14
+ require "rubygems"
15
+ require "bundler/setup"
16
+
17
+ load Gem.bin_path("rspec-core", "rspec")
18
+
@@ -0,0 +1,5 @@
1
+ require_relative "mathml2asciimath/version"
2
+ require_relative "mathml2asciimath/m2a"
3
+
4
+ require "nokogiri"
5
+ require "htmlentities"
@@ -0,0 +1,265 @@
1
+ require "nokogiri"
2
+ require "htmlentities"
3
+ require "pp"
4
+
5
+ module MathML2AsciiMath
6
+
7
+ def self.m2a(x)
8
+ docxml = Nokogiri::XML(x)
9
+ parse(docxml.root).gsub(/ /, " ").
10
+ sub(/^\s+/, "").
11
+ sub(/\s+$/, "")
12
+ end
13
+
14
+ def self.encodechars(x)
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(/\u22c5/, "*").
53
+ gsub(/\u2219/, "*").
54
+ gsub(/\u00b7/, "*").
55
+ gsub(/\u2217/, "**").
56
+ gsub(/\u22c6/, "***").
57
+ gsub(/\//, "//").
58
+ gsub(/\\/, "\\\\").
59
+ gsub(/\u00d7/, "xx").
60
+ gsub(/\u22c9/, "|><").
61
+ gsub(/\u22ca/, "><|").
62
+ gsub(/\u22c8/, "|><|").
63
+ gsub(/\u00f7/, "-:").
64
+ gsub(/\u2218/, "@").
65
+ gsub(/\u2295/, "o+").
66
+ gsub(/\u2297/, "ox").
67
+ gsub(/\u2299/, "o.").
68
+ gsub(/\u2211/, "sum").
69
+ gsub(/\u220f/, "prod").
70
+ gsub(/\u2227/, "^^").
71
+ gsub(/\u22c0/, "^^^").
72
+ gsub(/\u2228/, "vv").
73
+ gsub(/\u22c1/, "vvv").
74
+ gsub(/\u2229/, "nn").
75
+ gsub(/\u22c2/, "nnn").
76
+ gsub(/\u222a/, "uu").
77
+ gsub(/\u22c3/, "uuu").
78
+ gsub(/\u2260/, "!=").
79
+ gsub(/\u2264/, "<=").
80
+ gsub(/\u2265/, ">=").
81
+ gsub(/\u227a/, "-<").
82
+ gsub(/\u227b/, ">-").
83
+ gsub(/\u2aaf/, "-<=").
84
+ gsub(/\u2ab0/, ">-=").
85
+ gsub(/\u2208/, "in").
86
+ gsub(/\u2209/, "!in").
87
+ gsub(/\u2282/, "sub").
88
+ gsub(/\u2283/, "sup").
89
+ gsub(/\u2286/, "sube").
90
+ gsub(/\u2287/, "supe").
91
+ gsub(/\u2261/, "-=").
92
+ gsub(/\u2245/, "~=").
93
+ gsub(/\u2248/, "~~").
94
+ gsub(/\u221d/, "prop").
95
+ gsub(/\u00ac/, "not").
96
+ gsub(/\u21d2/, "=>").
97
+ gsub(/\u21d4/, "<=>").
98
+ gsub(/\u2200/, "AA").
99
+ gsub(/\u2203/, "EE").
100
+ gsub(/\u22a5/, "_|_").
101
+ gsub(/\u22a4/, "TT").
102
+ gsub(/\u22a2/, "|--").
103
+ gsub(/\u22a8/, "|==").
104
+ gsub(/\u22a8/, "|==").
105
+ gsub(/\u2329/, "(:").
106
+ gsub(/\u232a/, ":)").
107
+ gsub(/\u2329/, "<<").
108
+ gsub(/\u232a/, ">>").
109
+ gsub(/\u222e/, "oint").
110
+ gsub(/\u2202/, "del").
111
+ gsub(/\u2207/, "grad").
112
+ gsub(/\u00b1/, "+-").
113
+ gsub(/\u2205/, "O/").
114
+ gsub(/\u221e/, "oo").
115
+ gsub(/\u2135/, "aleph").
116
+ gsub(/\u2234/, ":.").
117
+ gsub(/\u2235/, ":'").
118
+ gsub(/\u2220/, "/_").
119
+ gsub(/\u25b3/, "/_\\").
120
+ gsub(/\u2032/, "'").
121
+ gsub(/~/, "tilde").
122
+ gsub(/\u00a0\u00a0\u00a0\u00a0/, "qquad").
123
+ gsub(/\u00a0\u00a0/, "quad").
124
+ gsub(/\u00a0/, "\\ ").
125
+ gsub(/\u2322/, "frown").
126
+ gsub(/\u00a0/, "quad").
127
+ gsub(/\u22ef/, "cdots").
128
+ gsub(/\u22ee/, "vdots").
129
+ gsub(/\u22f1/, "ddots").
130
+ gsub(/\u22c4/, "diamond").
131
+ gsub(/\u25a1/, "square").
132
+ gsub(/\u230a/, "|__").
133
+ gsub(/\u230b/, "__|").
134
+ gsub(/\u2308/, "|~").
135
+ gsub(/\u2309/, "~|").
136
+ gsub(/\u2102/, "CC").
137
+ gsub(/\u2115/, "NN").
138
+ gsub(/\u211a/, "QQ").
139
+ gsub(/\u211d/, "RR").
140
+ gsub(/\u2124/, "ZZ").
141
+ gsub(/\u2191/, "uarr").
142
+ gsub(/\u2193/, "darr").
143
+ gsub(/\u2190/, "larr").
144
+ gsub(/\u2194/, "harr").
145
+ gsub(/\u21d2/, "rArr").
146
+ gsub(/\u21d0/, "lArr").
147
+ gsub(/\u21d4/, "hArr").
148
+ gsub(/\u2192/, "->").
149
+ gsub(/\u21a3/, ">->").
150
+ gsub(/\u21a0/, "->>").
151
+ gsub(/\u2916/, ">->>").
152
+ gsub(/\u21a6/, "|->").
153
+ gsub(/\u2026/, "...").
154
+ gsub(/\u2212/, "-").
155
+ gsub(/\u2061/, ""). # function application
156
+ gsub(/\u2751/, "square")
157
+ end
158
+
159
+ def self.parse(node)
160
+ out = ""
161
+ if node.text?
162
+ return encodechars(HTMLEntities.new.decode(node.text))
163
+ else
164
+ case node.name
165
+ when "math"
166
+ node.elements.each { |n| out << parse(n) }
167
+ return out
168
+ when "mrow"
169
+ outarr = []
170
+ node.children.each { |n| outarr << parse(n) }
171
+ out = outarr.join("")
172
+ if %w{mfrac msub munder munderover}.include? node.parent.name
173
+ out = "(#{out})"
174
+ end
175
+ return out
176
+ when "mfenced"
177
+ outarr = []
178
+ open = node["open"] || "("
179
+ close = node["close"] || ")"
180
+ separator = "," # TODO currently ignore the supplied separators
181
+ node.children.each { |n| outarr << parse(n) }
182
+ out = outarr.join(separator)
183
+ return "#{open}#{out}#{close}"
184
+ when "msqrt"
185
+ node.children.each { |n| out << parse(n) }
186
+ return "sqrt(#{out})"
187
+ when "mfrac"
188
+ return "(#{parse(node.elements[0])})/(#{parse(node.elements[1])})"
189
+ when "msup"
190
+ sup = parse(node.elements[1])
191
+ sup = "(#{sup})" unless sup.length == 1
192
+ op = parse(node.elements[0]).gsub(/ $/, "")
193
+ return "#{op}^#{sup}"
194
+ when "msub"
195
+ sub = parse(node.elements[1])
196
+ sub = "(#{sub})" unless sub.length == 1
197
+ op = parse(node.elements[0]).gsub(/ $/, "")
198
+ return "#{op}_#{sub}"
199
+ when "munderover", "msubsup"
200
+ sub = parse(node.elements[1])
201
+ sub = "(#{sub})" unless sub.length == 1
202
+ sup = parse(node.elements[2])
203
+ sup = "(#{sup})" unless sup.length == 1
204
+ op = parse(node.elements[0]).gsub(/ $/, "")
205
+ return "#{op}_#{sub}^#{sup}"
206
+ when "munder"
207
+ elem1 = parse(node.elements[1]).sub(/^\s+/, "").sub(/\s+$/, "")
208
+ accent = case elem1
209
+ when "\u0332" then "ul"
210
+ when "\u23df" then "ubrace"
211
+ else
212
+ "underset"
213
+ end
214
+ if accent == "underset"
215
+ return "underset(#{elem1})(#{parse(node.elements[0])})"
216
+ else
217
+ return "#{accent} #{parse(node.elements[0])}"
218
+ end
219
+ when "mover"
220
+ elem1 = parse(node.elements[1]).sub(/^\s+/, "").sub(/\s+$/, "")
221
+ accent = case elem1
222
+ when "\u005e" then "hat"
223
+ when "\u00af" then "bar"
224
+ when "\u2192" then "vec"
225
+ when "." then "dot"
226
+ when ".." then "ddot"
227
+ when "\u23de" then "obrace"
228
+ else
229
+ "overset"
230
+ end
231
+ if accent == "overset"
232
+ return "overset(#{elem1})(#{parse(node.elements[0])})"
233
+ else
234
+ return "#{accent} #{parse(node.elements[0])}"
235
+ end
236
+ when "mtable"
237
+ rows = []
238
+ node.children.each { |n| rows << parse(n) }
239
+ return "[#{rows.join(",")}]"
240
+ when "mtr"
241
+ cols = []
242
+ node.children.each { |n| cols << parse(n) }
243
+ return "[#{cols.join(",")}]"
244
+ when "mtd"
245
+ node.children.each { |n| out << parse(n) }
246
+ return "#{out}"
247
+ when "mn", "mtext"
248
+ node.children.each { |n| out << parse(n) }
249
+ return "#{out}"
250
+ when "mi"
251
+ # mi is not meant to have space around it, but Word is conflating operators and operands
252
+ node.children.each { |n| out << parse(n) }
253
+ out = " #{out} " if /[^a-zA-Z0-9',]|[a-z][a-z]/.match? out
254
+ return out
255
+ when "mo"
256
+ node.children.each { |n| out << parse(n) }
257
+ out = " #{out} " unless node["fence"]
258
+ return out
259
+ else
260
+ node.to_xml
261
+ end
262
+ end
263
+ end
264
+
265
+ end
@@ -0,0 +1,4 @@
1
+ module MathML2AsciiMath
2
+ VERSION = "0.0.1".freeze
3
+ end
4
+
@@ -0,0 +1,42 @@
1
+ # coding: utf-8
2
+
3
+ lib = File.expand_path("../lib", __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require "mathml2asciimath/version"
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "mathml2asciimath"
9
+ spec.version = MathML2AsciiMath::VERSION
10
+ spec.authors = ["Ribose Inc."]
11
+ spec.email = ["open.source@ribose.com"]
12
+
13
+ spec.summary = "Convert MathML to AsciiMath "
14
+ spec.description = <<~DESCRIPTION
15
+ Convert MathML to AsciiMath
16
+
17
+ This gem is in active development.
18
+ DESCRIPTION
19
+
20
+ spec.homepage = "https://github.com/riboseinc/mathml2asciimath"
21
+ spec.license = "MIT"
22
+
23
+ spec.bindir = "bin"
24
+ spec.require_paths = ["lib"]
25
+ spec.files = `git ls-files`.split("\n")
26
+ spec.test_files = `git ls-files -- {spec}/*`.split("\n")
27
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
28
+
29
+ spec.add_dependency "htmlentities", "~> 4.3.4"
30
+ spec.add_dependency "nokogiri"
31
+
32
+ spec.add_development_dependency "bundler", "~> 1.15"
33
+ spec.add_development_dependency "byebug", "~> 9.1"
34
+ spec.add_development_dependency "equivalent-xml", "~> 0.6"
35
+ spec.add_development_dependency "guard", "~> 2.14"
36
+ spec.add_development_dependency "guard-rspec", "~> 4.7"
37
+ spec.add_development_dependency "rake", "~> 12.0"
38
+ spec.add_development_dependency "rspec", "~> 3.6"
39
+ spec.add_development_dependency "rubocop", "~> 0.50"
40
+ spec.add_development_dependency "simplecov", "~> 0.15"
41
+ spec.add_development_dependency "timecop", "~> 0.9"
42
+ end
metadata ADDED
@@ -0,0 +1,223 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mathml2asciimath
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ribose Inc.
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-04-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: htmlentities
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 4.3.4
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 4.3.4
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.15'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.15'
55
+ - !ruby/object:Gem::Dependency
56
+ name: byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '9.1'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '9.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: equivalent-xml
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.6'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.6'
83
+ - !ruby/object:Gem::Dependency
84
+ name: guard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.14'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.14'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard-rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '4.7'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '4.7'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '12.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '12.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.6'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.6'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.50'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.50'
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '0.15'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '0.15'
167
+ - !ruby/object:Gem::Dependency
168
+ name: timecop
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '0.9'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '0.9'
181
+ description: |
182
+ Convert MathML to AsciiMath
183
+
184
+ This gem is in active development.
185
+ email:
186
+ - open.source@ribose.com
187
+ executables: []
188
+ extensions: []
189
+ extra_rdoc_files: []
190
+ files:
191
+ - LICENSE
192
+ - README.adoc
193
+ - bin/m2a.rb
194
+ - bin/rspec
195
+ - lib/mathml2asciimath.rb
196
+ - lib/mathml2asciimath/m2a.rb
197
+ - lib/mathml2asciimath/version.rb
198
+ - mathml2asciimath.gemspec
199
+ homepage: https://github.com/riboseinc/mathml2asciimath
200
+ licenses:
201
+ - MIT
202
+ metadata: {}
203
+ post_install_message:
204
+ rdoc_options: []
205
+ require_paths:
206
+ - lib
207
+ required_ruby_version: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: 2.4.0
212
+ required_rubygems_version: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: '0'
217
+ requirements: []
218
+ rubyforge_project:
219
+ rubygems_version: 2.6.12
220
+ signing_key:
221
+ specification_version: 4
222
+ summary: Convert MathML to AsciiMath
223
+ test_files: []