texmath-ruby 0.0.1
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 +7 -0
- data/.gitignore +22 -0
- data/.travis.yml +15 -0
- data/Gemfile +13 -0
- data/LICENSE.txt +22 -0
- data/README.md +89 -0
- data/Rakefile +11 -0
- data/lib/texmath.rb +9 -0
- data/lib/texmath/converter.rb +78 -0
- data/lib/texmath/errors.rb +22 -0
- data/lib/texmath/version.rb +3 -0
- data/test/support/formats.rb +84 -0
- data/test/test_helper.rb +11 -0
- data/test/texmath/converter_test.rb +75 -0
- data/texmath-ruby.gemspec +18 -0
- metadata +62 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 58d0d834d41e8dedcde7b731f4aaadb325c2c3b5
|
4
|
+
data.tar.gz: 4f56df014bc172c78ed1c2ce8de6e400f67903fa
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 68bc2a4a95ced0348f1ddf8be62ec1caaac43a0de3cebf2e59e573e490592c32f898abb9c137395149b9fbb407273026c829f9ae24c38d0e1335fa857e490669
|
7
|
+
data.tar.gz: 1b79da5a96331ead2c38f5738ddfd74880443b8cadb1ddc510491d4b4824f49d0d8a4eb34511e4f9af81a4e1b655b43cab1fdcafa991f7ab6747c62228f27ef7
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
data/.travis.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 2.0.0
|
4
|
+
- 2.1.2
|
5
|
+
- ruby-head
|
6
|
+
- jruby-20mode # JRuby in 1.9 mode
|
7
|
+
- rbx
|
8
|
+
matrix:
|
9
|
+
allow_failures:
|
10
|
+
- rvm: ruby-head
|
11
|
+
cache: bundler
|
12
|
+
before_install:
|
13
|
+
- sudo apt-get install haskell-platform
|
14
|
+
- cabal update
|
15
|
+
- cabal install texmath
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Casper Hollingberry
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
# texmath-ruby
|
2
|
+
|
3
|
+
A wrapper for [TeXMath](https://github.com/jgm/texmath), a Haskell library for
|
4
|
+
converting between formats used to represent mathematics.
|
5
|
+
|
6
|
+
TeXMath can convert between LaTeX, presentation MathML, and OMML (Office Math
|
7
|
+
Markup Language). This wrapper uses the command line program for
|
8
|
+
texmath for all operations (rather than interface directly with the
|
9
|
+
Haskell library) and is heavily based on
|
10
|
+
[William Melody's wrapper](https://github.com/alphabetum/pandoc-ruby)
|
11
|
+
for [Pandoc](https://github.com/jgm/pandoc).
|
12
|
+
|
13
|
+
## Installation
|
14
|
+
|
15
|
+
First, make sure [texmath](https://github.com/jgm/texmath) is installed. If you
|
16
|
+
already have [The Haskell Platform](https://www.haskell.org/platform/), you can
|
17
|
+
install texmath with Cabal:
|
18
|
+
|
19
|
+
```shell
|
20
|
+
$ cabal install texmath
|
21
|
+
```
|
22
|
+
|
23
|
+
If you use [Bundler](http://bundler.io), then add this line to your
|
24
|
+
application's Gemfile:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
gem 'texmath-ruby', require: 'texmath'
|
28
|
+
```
|
29
|
+
|
30
|
+
And then execute:
|
31
|
+
|
32
|
+
```shell
|
33
|
+
$ bundle
|
34
|
+
```
|
35
|
+
|
36
|
+
Or install it yourself as:
|
37
|
+
|
38
|
+
```shell
|
39
|
+
$ gem install texmath-ruby
|
40
|
+
```
|
41
|
+
|
42
|
+
## Usage
|
43
|
+
|
44
|
+
Once everything is installed correctly, using TeXMath is incredibly easy.
|
45
|
+
|
46
|
+
For example, converting from LaTeX to MathML looks like this:
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
TeXMath.convert('\sqrt{x^3}', from: :tex, to: :mathml)
|
50
|
+
# => '<math display="block" xmlns=...'
|
51
|
+
```
|
52
|
+
|
53
|
+
TeXMath can convert between LaTeX, MathML, and OMML, in any
|
54
|
+
direction. By default (if either the source or destination format
|
55
|
+
isn't explicitly specified), TeXMath will try to convert from LaTeX to
|
56
|
+
MathML. So to convert from LaTeX (the default source format) to OMML:
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
TeXMath.convert('\sqrt{x^3}', to: :omml)
|
60
|
+
# => '<m:oMathPara>...'
|
61
|
+
```
|
62
|
+
|
63
|
+
Or from OMML to MathML (the default destination format):
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
TeXMath.convert('<m:oMathPara>...', from: :omml)
|
67
|
+
# => '<math display="block" xmlns=...'
|
68
|
+
```
|
69
|
+
|
70
|
+
TeXMath also comes with writers for XHTML and Pandoc's native format.
|
71
|
+
|
72
|
+
## Supported formats
|
73
|
+
|
74
|
+
| Format | Symbol | Reader | Writer |
|
75
|
+
|-------------------------------|--------------|----------|----------|
|
76
|
+
| LaTeX | `:tex` | ✔ | ✔ |
|
77
|
+
| MathML | `:mathml` | ✔ | ✔ |
|
78
|
+
| Office Math Markup Language | `:omml` | ✔ | ✔ |
|
79
|
+
| TeXMath native | `:native` | ✔ | ✔ |
|
80
|
+
| XHTML | `:xhtml` | | ✔ |
|
81
|
+
| Pandoc native | `:pandoc` | | ✔ |
|
82
|
+
|
83
|
+
## Contributing
|
84
|
+
|
85
|
+
1. Fork it ( https://github.com/hollingberry/texmath-ruby/fork )
|
86
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
87
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
88
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
89
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/lib/texmath.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'texmath/errors'
|
2
|
+
require 'open3'
|
3
|
+
|
4
|
+
module TeXMath
|
5
|
+
##
|
6
|
+
# A `Converter` represents a single `texmath` command to which data
|
7
|
+
# can be piped. For example, a `Converter` that converts LaTeX to
|
8
|
+
# MathML can be reused for different input expressions, although all
|
9
|
+
# would have to be valid LaTeX.
|
10
|
+
class Converter
|
11
|
+
##
|
12
|
+
# The available readers and their corresponding names.
|
13
|
+
READERS = {
|
14
|
+
'tex' => 'LaTeX',
|
15
|
+
'mathml' => 'MathML',
|
16
|
+
'omml' => 'Office Math Markup Language',
|
17
|
+
'native' => 'texmath native'
|
18
|
+
}
|
19
|
+
|
20
|
+
##
|
21
|
+
# The available writers and their corresponding names.
|
22
|
+
WRITERS = {
|
23
|
+
'tex' => 'LaTeX',
|
24
|
+
'mathml' => 'MathML',
|
25
|
+
'omml' => 'Office Math Markup Language',
|
26
|
+
'xhtml' => 'XHTML',
|
27
|
+
'pandoc' => 'pandoc native',
|
28
|
+
'native' => 'texmath native'
|
29
|
+
}
|
30
|
+
|
31
|
+
##
|
32
|
+
# Create a new Converter.
|
33
|
+
# @param executable [String] the executable path
|
34
|
+
# @param from [Symbol] the source format
|
35
|
+
# @param to [Symbol] the destination format
|
36
|
+
def initialize(executable = 'texmath', from: :tex, to: :mathml)
|
37
|
+
@executable = executable
|
38
|
+
self.reader = from
|
39
|
+
self.writer = to
|
40
|
+
end
|
41
|
+
|
42
|
+
attr_reader :executable
|
43
|
+
|
44
|
+
##
|
45
|
+
# Convert `data` between formats.
|
46
|
+
# @return [String] the converted data
|
47
|
+
def convert(data)
|
48
|
+
Open3.popen3(command) do |stdin, stdout, stderr|
|
49
|
+
stdin.puts(data)
|
50
|
+
stdin.close
|
51
|
+
output = stdout.read
|
52
|
+
error = stderr.read
|
53
|
+
raise ConversionError.new(error) unless error.empty?
|
54
|
+
return output.strip
|
55
|
+
end
|
56
|
+
rescue Errno::ENOENT
|
57
|
+
raise NoExecutableError.new("Can't find the '#{executable}' executable.")
|
58
|
+
end
|
59
|
+
|
60
|
+
attr_reader :reader, :writer
|
61
|
+
|
62
|
+
def reader=(format)
|
63
|
+
return @reader = format if READERS.has_key?(format.to_s)
|
64
|
+
raise InvalidReaderError.new("Can't find '#{format}' reader.")
|
65
|
+
end
|
66
|
+
|
67
|
+
def writer=(format)
|
68
|
+
return @writer = format if WRITERS.has_key?(format.to_s)
|
69
|
+
raise InvalidWriterError.new("Can't find '#{format}' writer.")
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def command
|
75
|
+
"#{executable} -f #{reader} -t #{writer}"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module TeXMath
|
2
|
+
##
|
3
|
+
# Error raised when the underlying Haskell library writes to
|
4
|
+
# /dev/stderr. This usually occurs when the input was malformed.
|
5
|
+
class ConversionError < StandardError; end
|
6
|
+
|
7
|
+
##
|
8
|
+
# Error raised when the `texmath` executable can't be found.
|
9
|
+
class NoExecutableError < StandardError; end
|
10
|
+
|
11
|
+
##
|
12
|
+
# Error raised when an invalid reader or writer format is specified.
|
13
|
+
class InvalidFormatError < StandardError; end
|
14
|
+
|
15
|
+
##
|
16
|
+
# Error raised when an invalid reader format is specified.
|
17
|
+
class InvalidReaderError < InvalidFormatError; end
|
18
|
+
|
19
|
+
##
|
20
|
+
# Error raised when an invalid writer format is specified.
|
21
|
+
class InvalidWriterError < InvalidFormatError; end
|
22
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Formats
|
2
|
+
def tex
|
3
|
+
'\sqrt{x^{3}}'
|
4
|
+
end
|
5
|
+
|
6
|
+
def mathml
|
7
|
+
<<-XML.gsub(/^ /, '').strip
|
8
|
+
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
|
9
|
+
<msqrt>
|
10
|
+
<msup>
|
11
|
+
<mi>x</mi>
|
12
|
+
<mn>3</mn>
|
13
|
+
</msup>
|
14
|
+
</msqrt>
|
15
|
+
</math>
|
16
|
+
XML
|
17
|
+
end
|
18
|
+
|
19
|
+
def omml
|
20
|
+
<<-XML.gsub(/^ /, '').strip
|
21
|
+
<m:oMathPara>
|
22
|
+
<m:oMathParaPr>
|
23
|
+
<m:jc m:val="center" />
|
24
|
+
</m:oMathParaPr>
|
25
|
+
<m:oMath>
|
26
|
+
<m:rad>
|
27
|
+
<m:radPr>
|
28
|
+
<m:degHide m:val="on" />
|
29
|
+
</m:radPr>
|
30
|
+
<m:deg />
|
31
|
+
<m:e>
|
32
|
+
<m:sSup>
|
33
|
+
<m:e>
|
34
|
+
<m:r>
|
35
|
+
<m:rPr>
|
36
|
+
<m:sty m:val="p" />
|
37
|
+
</m:rPr>
|
38
|
+
<m:t>x</m:t>
|
39
|
+
</m:r>
|
40
|
+
</m:e>
|
41
|
+
<m:sup>
|
42
|
+
<m:r>
|
43
|
+
<m:rPr>
|
44
|
+
<m:sty m:val="p" />
|
45
|
+
</m:rPr>
|
46
|
+
<m:t>3</m:t>
|
47
|
+
</m:r>
|
48
|
+
</m:sup>
|
49
|
+
</m:sSup>
|
50
|
+
</m:e>
|
51
|
+
</m:rad>
|
52
|
+
</m:oMath>
|
53
|
+
</m:oMathPara>
|
54
|
+
XML
|
55
|
+
end
|
56
|
+
|
57
|
+
def xhtml
|
58
|
+
<<-XML.gsub(/^ /, '').strip
|
59
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
60
|
+
<head>
|
61
|
+
<meta content="application/xhtml+xml; charset=UTF-8" http-equiv="Content-Type" />
|
62
|
+
</head>
|
63
|
+
<body>
|
64
|
+
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">
|
65
|
+
<msqrt>
|
66
|
+
<msup>
|
67
|
+
<mi>x</mi>
|
68
|
+
<mn>3</mn>
|
69
|
+
</msup>
|
70
|
+
</msqrt>
|
71
|
+
</math>
|
72
|
+
</body>
|
73
|
+
</html>
|
74
|
+
XML
|
75
|
+
end
|
76
|
+
|
77
|
+
def pandoc
|
78
|
+
'[Math DisplayMath "\\\\sqrt{x^{3}}"]'
|
79
|
+
end
|
80
|
+
|
81
|
+
def native
|
82
|
+
'[ESqrt (ESuper (EIdentifier "x") (ENumber "3"))]'
|
83
|
+
end
|
84
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'support/formats'
|
3
|
+
|
4
|
+
class ConverterTest < Minitest::Test
|
5
|
+
include Formats
|
6
|
+
include TeXMath
|
7
|
+
|
8
|
+
Converter::READERS.each_key do |reader|
|
9
|
+
Converter::WRITERS.each_key do |writer|
|
10
|
+
define_method "test_#{reader}_to_#{writer}" do
|
11
|
+
assert_converts reader, writer
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_symbol_reader_and_writer
|
17
|
+
assert_converts :tex, :mathml
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_string_reader_and_writer
|
21
|
+
assert_converts 'tex', 'mathml'
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_default_reader
|
25
|
+
assert_equal :tex, Converter.new(to: :mathml).reader
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_default_writer
|
29
|
+
assert_equal :mathml, Converter.new(from: :tex).writer
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_invalid_input
|
33
|
+
assert_raises ConversionError do
|
34
|
+
Converter.new.convert('\sqrt{3')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_executable_not_found
|
39
|
+
assert_raises NoExecutableError, "Can't find the 'ogremath' executable." do
|
40
|
+
Converter.new('ogremath').convert('\sqrt{3}')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_string_reader_not_found
|
45
|
+
assert_raises InvalidReaderError, "Can't find 'pears' reader." do
|
46
|
+
Converter.new(from: 'pears', to: :mathml)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_string_writer_not_found
|
51
|
+
assert_raises InvalidWriterError, "Can't find 'pears' writer." do
|
52
|
+
Converter.new(from: :tex, to: 'pears')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_symbol_reader_not_found
|
57
|
+
assert_raises InvalidReaderError, "Can't find 'pears' reader." do
|
58
|
+
Converter.new(from: :pears, to: :mathml)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_symbol_writer_not_found
|
63
|
+
assert_raises InvalidWriterError, "Can't find 'pears' writer." do
|
64
|
+
Converter.new(from: :tex, to: :pears)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def assert_converts(from, to)
|
71
|
+
input, expected_output = send(from), send(to)
|
72
|
+
actual_output = TeXMath.convert(input, from: from, to: to)
|
73
|
+
assert_equal expected_output, actual_output
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
2
|
+
|
3
|
+
require 'texmath/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'texmath-ruby'
|
7
|
+
spec.version = TeXMath::VERSION
|
8
|
+
spec.authors = ['Casper Hollingberry']
|
9
|
+
spec.email = ['hollingberry7@gmail.com']
|
10
|
+
spec.summary = 'Convert math markup between LaTeX, MathML, and OMML.'
|
11
|
+
spec.description = 'Convert math markup between LaTeX, MathML, and OMML using Ruby. A wrapper for TeXMath, a Haskell library written by the creator of Pandoc.'
|
12
|
+
spec.homepage = 'http://github.com/hollingberry/texmath-ruby'
|
13
|
+
spec.license = 'MIT'
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.test_files = spec.files.grep(/^test/)
|
17
|
+
spec.require_paths = ['lib']
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: texmath-ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Casper Hollingberry
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-02-10 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Convert math markup between LaTeX, MathML, and OMML using Ruby. A wrapper
|
14
|
+
for TeXMath, a Haskell library written by the creator of Pandoc.
|
15
|
+
email:
|
16
|
+
- hollingberry7@gmail.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- ".gitignore"
|
22
|
+
- ".travis.yml"
|
23
|
+
- Gemfile
|
24
|
+
- LICENSE.txt
|
25
|
+
- README.md
|
26
|
+
- Rakefile
|
27
|
+
- lib/texmath.rb
|
28
|
+
- lib/texmath/converter.rb
|
29
|
+
- lib/texmath/errors.rb
|
30
|
+
- lib/texmath/version.rb
|
31
|
+
- test/support/formats.rb
|
32
|
+
- test/test_helper.rb
|
33
|
+
- test/texmath/converter_test.rb
|
34
|
+
- texmath-ruby.gemspec
|
35
|
+
homepage: http://github.com/hollingberry/texmath-ruby
|
36
|
+
licenses:
|
37
|
+
- MIT
|
38
|
+
metadata: {}
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubyforge_project:
|
55
|
+
rubygems_version: 2.2.2
|
56
|
+
signing_key:
|
57
|
+
specification_version: 4
|
58
|
+
summary: Convert math markup between LaTeX, MathML, and OMML.
|
59
|
+
test_files:
|
60
|
+
- test/support/formats.rb
|
61
|
+
- test/test_helper.rb
|
62
|
+
- test/texmath/converter_test.rb
|