mathjax_renderer 0.0.3

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: 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