mathjax_renderer 0.0.3

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 120524d70818d34b045f2c75816b6860a0474840
4
+ data.tar.gz: 19643b73af755486f2618c815cf9c3ec685c423b
5
+ SHA512:
6
+ metadata.gz: 858804a8a2c34283ac0785abcecbaa1b456a075fd0a88b24bf3ae0ed3b87e94b1efd9eaf38ed22753ee12e4bd2ad818f643b911f367a1ac92dc81794aa7b119f
7
+ data.tar.gz: ee4de8b37e89be37dff7ca0e6614accdc62f18d227c9db2387c8f722c5edb5c73bc38b67f2c0b35aa84dceac24f6edb8b669205fe1083326a99bff304d82e1ec
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+ source 'https://rails-assets.org'
3
+
4
+ # Specify your gem's dependencies in mathjax_renderer-renderer.gemspec
5
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 sashee
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,31 @@
1
+ # Mathjax::Renderer
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'mathjax-renderer'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install mathjax-renderer
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it ( https://github.com/[my-github-username]/mathjax-renderer/fork )
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,21 @@
1
+ Feature: The renderer can generate the HTML content that displays the mathml
2
+
3
+ Scenario: The renderer generates the HTML from MathML
4
+ When the renderer is invoked with
5
+ """
6
+ <math xmlns="http://www.w3.org/1998/Math/MathML">
7
+ <mi>a</mi><msup><mi>x</mi><mn>2</mn></msup>
8
+ <mo>+</mo> <mi>b</mi><mi>x</mi>
9
+ <mo>+</mo> <mi>c</mi> <mo>=</mo> <mn>0</mn>
10
+ </math>
11
+ """
12
+ Then the result text is "ax2+bx+c=0"
13
+ And the contains more than 10 HTML tags
14
+
15
+ Scenario: The renderer generates HTML from TeX
16
+ When the renderer is invoked with
17
+ """
18
+ \(ax^2 + bx + c = 0\)
19
+ """
20
+ Then the result text is "ax2+bx+c=0"
21
+ And the contains more than 10 HTML tags
@@ -0,0 +1,19 @@
1
+ Feature: The renderer can render PNG images from math
2
+
3
+ Scenario: When an image path is supplied, the generated image is put there
4
+ Given the image path is set
5
+ When the renderer is invoked with a valid expression
6
+ Then the image is generated in the directory
7
+
8
+ Scenario: When there is no image path supplied, then an image is not generated
9
+ Given the image path is not set
10
+ When getting the image path
11
+ Then an Exception occurs
12
+
13
+ Scenario: The generated image contains the expression
14
+ Given an image is generated for the formulae
15
+ """
16
+ \(ax^2 + bx + c = 0\)
17
+ """
18
+ Then it's width is at least 120px
19
+ And it's height is at least 10px
@@ -0,0 +1,23 @@
1
+ Feature: Padding, min width and additional styles can be set for image generation
2
+
3
+ Scenario: If a padding is set, then the generated image is bigger
4
+ When an image is generated with 10px padding
5
+ Then it's size increases by 20px in every dimension
6
+
7
+ Scenario: If min width is set, then no image will be smaller than that
8
+ When an image is generated with 300px min width for
9
+ """
10
+ \(ax^2 + bx + c = 0\)
11
+ """
12
+ Then it's width is 300px
13
+
14
+ Scenario: If additional styles are supplied, they will be applied to the image
15
+ Given an image is generated for the formulae
16
+ """
17
+ \(ax^2 + bx + c = 0\)
18
+ """
19
+ And the additional styles are
20
+ """
21
+ body{background-color:blue;}
22
+ """
23
+ Then the generated image is mostly blue
@@ -0,0 +1,11 @@
1
+ When(/^the renderer is invoked with$/) do |string|
2
+ @renderer = Mathjax_Renderer::Renderer.new(string)
3
+ end
4
+
5
+ Then(/^the result text is "(.*?)"$/) do |arg1|
6
+ expect(@renderer.html.inner_text).to eq arg1
7
+ end
8
+
9
+ Then(/^the contains more than (\d+) HTML tags$/) do |arg1|
10
+ expect(@renderer.html.xpath('.//*').size).to be >= arg1.to_i
11
+ end
@@ -0,0 +1,80 @@
1
+ Given(/^the image path is set$/) do
2
+ @img_path = $tmpdir
3
+ end
4
+
5
+ When(/^the renderer is invoked with a valid expression$/) do
6
+ @renderer = Mathjax_Renderer::Renderer.new('\(ax^2 + bx + c = 0\)', @img_path)
7
+ end
8
+
9
+ Then(/^the image is generated in the directory$/) do
10
+ img_name = @renderer.image_name
11
+ expect(File.exists? @img_path + '/' +img_name).to be
12
+ end
13
+
14
+ Given(/^the image path is not set$/) do
15
+ @img_path = nil
16
+ end
17
+
18
+ Then(/^an Exception occurs$/) do
19
+ expect(@exception).to be
20
+ end
21
+
22
+ When(/^getting the image path$/) do
23
+ begin
24
+ @renderer.image_name
25
+ rescue => @exception
26
+ end
27
+ end
28
+
29
+ Given(/^an image is generated for the formulae$/) do |string|
30
+ @expression = string
31
+ renderer = Mathjax_Renderer::Renderer.new(@expression, $tmpdir)
32
+ @image = ChunkyPNG::Image.from_file("#{$tmpdir}/#{renderer.image_name}")
33
+ end
34
+
35
+ Then(/^it's width is at least (\d+)px$/) do |arg1|
36
+ expect(@image.width).to be >= arg1.to_i
37
+ end
38
+
39
+ Then(/^it's height is at least (\d+)px$/) do |arg1|
40
+ expect(@image.height).to be >= arg1.to_i
41
+ end
42
+
43
+ When(/^an image is generated with (\d+)px padding$/) do |arg1|
44
+ original_renderer = Mathjax_Renderer::Renderer.new('\(ax^2 + bx + c = 0\)', $tmpdir)
45
+ padded_renderer = Mathjax_Renderer::Renderer.new('\(ax^2 + bx + c = 0\)', $tmpdir, padding: arg1.to_i)
46
+ @original_image = ChunkyPNG::Image.from_file("#{$tmpdir}/#{original_renderer.image_name}")
47
+ @padded_image = ChunkyPNG::Image.from_file("#{$tmpdir}/#{padded_renderer.image_name}")
48
+ end
49
+
50
+ Then(/^it's size increases by (\d+)px in every dimension$/) do |arg1|
51
+ expect(@padded_image.width).to eq @original_image.width + arg1.to_i
52
+ expect(@padded_image.height).to eq @original_image.height + arg1.to_i
53
+ end
54
+
55
+ When(/^an image is generated with (\d+)px min width for$/) do |arg1, string|
56
+ renderer = Mathjax_Renderer::Renderer.new(string, $tmpdir, min_width:arg1.to_i)
57
+ @image = ChunkyPNG::Image.from_file("#{$tmpdir}/#{renderer.image_name}")
58
+ end
59
+
60
+ Then(/^it's width is (\d+)px$/) do |arg1|
61
+ expect(@image.width).to eq arg1.to_i
62
+ end
63
+
64
+ Given(/^the additional styles are$/) do |string|
65
+ renderer = Mathjax_Renderer::Renderer.new(@expression, $tmpdir, additional_styles:string)
66
+ @image = ChunkyPNG::Image.from_file("#{$tmpdir}/#{renderer.image_name}")
67
+ end
68
+
69
+ Then(/^the generated image is mostly blue$/) do
70
+ blue = 0
71
+ @image.width.times do |x|
72
+ @image.height.times do |y|
73
+ blue+=1 if ChunkyPNG::Color.b(@image[1,1])==255
74
+ end
75
+ end
76
+
77
+ all_pixels = @image.width * @image.height
78
+
79
+ expect(blue).to be >= all_pixels / 2
80
+ end
@@ -0,0 +1,9 @@
1
+ require 'mathjax_renderer/renderer'
2
+ require 'chunky_png'
3
+
4
+ Around do |scenario, block|
5
+ Dir.mktmpdir{|tmpdir|
6
+ $tmpdir = tmpdir
7
+ block.call
8
+ }
9
+ end
@@ -0,0 +1,207 @@
1
+ module Mathjax_Renderer
2
+ class Renderer
3
+ require 'capybara'
4
+ require 'capybara/dsl'
5
+ require 'headless'
6
+
7
+ include Capybara::DSL
8
+
9
+ def initialize(mathml, image_base_url = nil, options = {})
10
+ @mathml = mathml
11
+ @image_base_url = image_base_url
12
+ @options = {min_width: 0, extra_style:'', padding:0}.merge options
13
+ end
14
+
15
+ def image_name
16
+ raise ArgumentError if @image_base_url.nil?
17
+ render! unless File.exist?(image_path)
18
+ _image_name
19
+ end
20
+
21
+ def render!
22
+ server = RendererServer.new
23
+ server.ensure_started!
24
+
25
+ added_margin = [@options[:padding],@options[:min_width]].max
26
+
27
+ url = server.add_content(@mathml, added_margin, @options[:extra_style])
28
+
29
+ Headless.ly do
30
+
31
+ Capybara.register_driver :chrome do |app|
32
+ Capybara::Selenium::Driver.new(app, :browser => :chrome)
33
+ end
34
+
35
+ Capybara.default_driver = :chrome
36
+ Capybara.app_host = "http://localhost:#{server.port}"
37
+
38
+ visit url
39
+
40
+ def mathjax_ready?(page)
41
+ html = Nokogiri::HTML(page.html)
42
+ !html.css('.MathJax').empty? && html.css('.MathJax_Processing').empty? && html.css('.MathJax_Processed').empty?
43
+ end
44
+
45
+ sleep 0.1 until mathjax_ready?(page)
46
+
47
+ unless @image_base_url.nil?
48
+ require 'chunky_png'
49
+ driver = page.driver
50
+
51
+ require 'fileutils'
52
+ FileUtils.mkpath @image_base_url
53
+
54
+ driver.save_screenshot(image_path)
55
+
56
+ el= page.find('.MathJax .math').native
57
+
58
+ image = ChunkyPNG::Image.from_file(image_path)
59
+
60
+ correction = [(@options[:min_width] -(el.size.width + 2 * @options[:padding])) / 2,0].max
61
+
62
+ x = el.location.x + 1 - @options[:padding]-correction
63
+ y = el.location.y + 1 - @options[:padding]
64
+ width = [el.size.width + 2 * @options[:padding],@options[:min_width]].max
65
+ height = el.size.height+ 2 * @options[:padding]
66
+
67
+ image.crop!(x, y, width, height)
68
+ image.save(image_path)
69
+ end
70
+ result = Nokogiri::HTML(page.html).css('.MathJax')[0]
71
+
72
+ put_cache!(params_hash,result)
73
+
74
+ page.driver.quit
75
+
76
+ @html = result
77
+ end
78
+ end
79
+
80
+ def html
81
+ return cached(params_hash) if cached? params_hash
82
+
83
+ render! if @html.nil?
84
+
85
+ @html
86
+ end
87
+
88
+ private
89
+
90
+ def params_hash
91
+ Digest::SHA1.hexdigest(@mathml+@options.to_s)
92
+ end
93
+
94
+ def image_path
95
+ "#{@image_base_url}/#{_image_name}"
96
+ end
97
+
98
+ def _image_name
99
+ "#{params_hash}.png"
100
+ end
101
+
102
+ @@cache={}
103
+
104
+ def cache
105
+ @@cache
106
+ end
107
+
108
+ def cached?(mathml)
109
+ cache.has_key?(mathml)
110
+ end
111
+
112
+ def cached(mathml)
113
+ cache[mathml]
114
+ end
115
+
116
+ def put_cache!(mathml,result)
117
+ cache[mathml]=result
118
+ end
119
+ end
120
+
121
+ class RendererServer
122
+ require 'concurrent/atomic/atomic_boolean'
123
+ require 'digest'
124
+
125
+ def add_content(content, added_margin, extra_style = '')
126
+ digest = Digest::SHA1.hexdigest(content)
127
+ path = "/#{digest}.html"
128
+ server.mount_proc path do |_, res|
129
+ res.body = response(content, added_margin, extra_style)
130
+ end
131
+
132
+ path
133
+ end
134
+
135
+ def port
136
+ server.config[:Port]
137
+ end
138
+
139
+ def response(content, added_margin, extra_style)
140
+ "
141
+ <html><head>
142
+ <script type='text/x-mathjax_renderer-config'>
143
+ MathJax.Hub.Config({
144
+ messageStyle: 'none',
145
+ showMathMenu:false
146
+ });
147
+ </script>
148
+ <script type='text/javascript'
149
+ src='javascripts/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script>
150
+ <style>.MathJax{position:absolute!important;margin:#{added_margin}px!important;}
151
+ #{extra_style}</style>
152
+ </head><body>#{content}</body></html>"
153
+ end
154
+
155
+ def ensure_started!
156
+ if start!
157
+ Thread.start do
158
+ require 'webrick'
159
+ mathjax_dir = Gem::Specification.find_by_name("rails-assets-MathJax").gem_dir
160
+
161
+ self.server = WEBrick::HTTPServer.new(:Port => 0, :DocumentRoot => "#{mathjax_dir}/app/assets",:AccessLog => [], :Logger => WEBrick::Log::new('/dev/null', 7))
162
+
163
+ server.mount '/javascripts/MathJax/fonts', WEBrick::HTTPServlet::FileHandler, "#{mathjax_dir}/app/assets/fonts/MathJax/fonts"
164
+
165
+ begin
166
+ server.start
167
+ ensure
168
+ server.shutdown
169
+ end
170
+ end
171
+ end
172
+ def server_started?
173
+ require 'net/http'
174
+ uri = URI("http://localhost:#{port}/javascripts/MathJax/MathJax.js")
175
+
176
+ req = Net::HTTP::Get.new(uri)
177
+ res = Net::HTTP.start(uri.hostname, uri.port) {|http|
178
+ http.read_timeout = 1
179
+ http.request(req)
180
+ }
181
+
182
+ res.is_a?(Net::HTTPSuccess)
183
+ rescue
184
+ false
185
+ end
186
+
187
+ sleep 0.1 until server_started?
188
+ end
189
+
190
+ private
191
+
192
+ def server
193
+ @@server
194
+ end
195
+
196
+ def server=(server)
197
+ @@server = server
198
+ end
199
+
200
+ @@started=Concurrent::AtomicBoolean.new
201
+
202
+ def start!
203
+ @@started.make_true
204
+ end
205
+
206
+ end
207
+ end
@@ -0,0 +1,3 @@
1
+ module Mathjax_Renderer
2
+ VERSION = "0.0.3"
3
+ end
data/lib/renderer.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'mathjax_renderer/version'
2
+ require 'mathjax_renderer/renderer'
3
+
4
+ module Mathjax_Renderer
5
+ end
@@ -0,0 +1,35 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mathjax_renderer/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "mathjax_renderer"
8
+ spec.version = Mathjax_Renderer::VERSION
9
+ spec.authors = ["sashee"]
10
+ spec.email = ["gsashee@gmail.com"]
11
+ spec.summary = %q{Summary}
12
+ spec.description = %q{Description}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+
24
+ spec.add_development_dependency "cucumber"
25
+ spec.add_development_dependency "rspec-expectations"
26
+
27
+ spec.add_dependency "rails-assets-MathJax"
28
+ spec.add_dependency "nokogiri"
29
+ spec.add_dependency "concurrent-ruby"
30
+ spec.add_dependency "selenium-webdriver"
31
+ spec.add_dependency "capybara"
32
+ spec.add_dependency "chromedriver-helper"
33
+ spec.add_dependency "chunky_png"
34
+ spec.add_dependency "headless"
35
+ end
metadata ADDED
@@ -0,0 +1,233 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mathjax_renderer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - sashee
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: cucumber
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-expectations
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rails-assets-MathJax
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: nokogiri
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: concurrent-ruby
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: selenium-webdriver
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: capybara
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: chromedriver-helper
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: chunky_png
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: headless
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ description: Description
182
+ email:
183
+ - gsashee@gmail.com
184
+ executables: []
185
+ extensions: []
186
+ extra_rdoc_files: []
187
+ files:
188
+ - ".gitignore"
189
+ - Gemfile
190
+ - LICENSE.txt
191
+ - README.md
192
+ - Rakefile
193
+ - features/generate_html.feature
194
+ - features/generate_image.feature
195
+ - features/options.feature
196
+ - features/step_definitions/html_steps.rb
197
+ - features/step_definitions/image_steps.rb
198
+ - features/support/env.rb
199
+ - lib/mathjax_renderer/renderer.rb
200
+ - lib/mathjax_renderer/version.rb
201
+ - lib/renderer.rb
202
+ - mathjax-renderer.gemspec
203
+ homepage: ''
204
+ licenses:
205
+ - MIT
206
+ metadata: {}
207
+ post_install_message:
208
+ rdoc_options: []
209
+ require_paths:
210
+ - lib
211
+ required_ruby_version: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ required_rubygems_version: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - ">="
219
+ - !ruby/object:Gem::Version
220
+ version: '0'
221
+ requirements: []
222
+ rubyforge_project:
223
+ rubygems_version: 2.4.3
224
+ signing_key:
225
+ specification_version: 4
226
+ summary: Summary
227
+ test_files:
228
+ - features/generate_html.feature
229
+ - features/generate_image.feature
230
+ - features/options.feature
231
+ - features/step_definitions/html_steps.rb
232
+ - features/step_definitions/image_steps.rb
233
+ - features/support/env.rb