mathjax-renderer 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 108c1668656658f3c89100c86dcbaee043b19343
4
- data.tar.gz: 9635fb1117c4084b4b6480c7ef4b851d3fdca2f8
3
+ metadata.gz: 6e95c5e5f34072effcd51928ee50b719c620e67e
4
+ data.tar.gz: edd581776d9b4e52240cd966d99c2fcad8b78a65
5
5
  SHA512:
6
- metadata.gz: e02966b4f64ab784df3176473320abfb0e2ffb43dc899665383450bc30e91bf271a4f748efd0cf4a7d8391c4298529159e895e6f0c23019761111579d6c0e97e
7
- data.tar.gz: d0f48a885c73debde6bb8b86c65544e3f8b51c5de7dc293dba87356e6703056bdca1d7b9c59360561e6e2fd8021426cffa4ae05954f7be52296f223833cca591
6
+ metadata.gz: 553117673179eb5420f9a52c40bfef53a9cce7a4619ac8e6552ffbd4213bfd304e9aab7f05bae788b0cc181e7b75f9614f89b87750425f256ac0de0cc611a13f
7
+ data.tar.gz: ebed43efddc15f38bb6a303b32ddad25e567506ee761f4e8266675dc8a3a7b54b90fd88fee3cda7abf604befe7172b5828d8007dab427599eef90c72a08e56c7
data/Gemfile CHANGED
@@ -1,5 +1,8 @@
1
1
  source 'https://rubygems.org'
2
2
  source 'https://rails-assets.org'
3
3
 
4
+ gem 'poltergeist'
5
+ gem 'phantomjs', :require => 'phantomjs/poltergeist'
6
+
4
7
  # Specify your gem's dependencies in mathjax_renderer-renderer.gemspec
5
8
  gemspec
data/README.md CHANGED
@@ -7,6 +7,8 @@ generating images from MathJax expressions which can be inserted to the site ins
7
7
  expression, thus making them visible to readers. Also, there is an option to generate the HTML,
8
8
  so you can remove the client-side scripts.
9
9
 
10
+ You can find some background in this blog post: https://advancedweb.hu/2015/03/17/mathjax-processing-on-the-server-side/
11
+
10
12
  ## Installation
11
13
 
12
14
  Add this line to your application's Gemfile:
@@ -29,10 +31,6 @@ mathjax-renderer can generate the HTML from running the MathJax scripts, and it
29
31
  generate an image from the result. It uses a global cache, so it is fast for the second time for the
30
32
  same input.
31
33
 
32
- ### Requirements
33
-
34
- mathjax-renderer uses Chrome with Xvfb, so they need to be installed (sorry, not gonna work on Windows).
35
-
36
34
  ### Generating the HTML
37
35
 
38
36
  To generated the HTML, just call:
@@ -18,6 +18,6 @@ Feature: Padding, min width and additional styles can be set for image generatio
18
18
  """
19
19
  And the additional styles are
20
20
  """
21
- body{background-color:blue;}
21
+ body{background-color:blue;}
22
22
  """
23
- Then the generated image is mostly blue
23
+ Then the generated image is mostly blue
@@ -62,7 +62,7 @@ Then(/^it's width is (\d+)px$/) do |arg1|
62
62
  end
63
63
 
64
64
  Given(/^the additional styles are$/) do |string|
65
- renderer = Mathjax_Renderer::Renderer.new(@expression, $tmpdir, additional_styles:string)
65
+ renderer = Mathjax_Renderer::Renderer.new(@expression, $tmpdir, extra_style:string)
66
66
  @image = ChunkyPNG::Image.from_file("#{$tmpdir}/#{renderer.image_name}")
67
67
  end
68
68
 
@@ -70,11 +70,14 @@ Then(/^the generated image is mostly blue$/) do
70
70
  blue = 0
71
71
  @image.width.times do |x|
72
72
  @image.height.times do |y|
73
- blue+=1 if ChunkyPNG::Color.b(@image[1,1])==255
73
+ b = ChunkyPNG::Color.b(@image[x,y])
74
+ g = ChunkyPNG::Color.g(@image[x,y])
75
+ r = ChunkyPNG::Color.r(@image[x,y])
76
+ blue += 1 if b == 255 && g == 0 && r == 0
74
77
  end
75
78
  end
76
79
 
77
80
  all_pixels = @image.width * @image.height
78
81
 
79
82
  expect(blue).to be >= all_pixels / 2
80
- end
83
+ end
@@ -6,4 +6,4 @@ Around do |scenario, block|
6
6
  $tmpdir = tmpdir
7
7
  block.call
8
8
  }
9
- end
9
+ end
@@ -2,7 +2,6 @@ module Mathjax_Renderer
2
2
  class Renderer
3
3
  require 'capybara'
4
4
  require 'capybara/dsl'
5
- require 'headless'
6
5
  require 'timeout'
7
6
 
8
7
  include Capybara::DSL
@@ -23,61 +22,71 @@ module Mathjax_Renderer
23
22
  server = RendererServer.new
24
23
  server.ensure_started!
25
24
 
26
- url = server.add_content(@mathml, @options[:extra_style])
25
+ url = server.add_content(@mathml, @options[:extra_style], @options[:padding])
27
26
 
28
- Headless.ly do
27
+ require 'phantomjs/poltergeist'
28
+ require 'phantomjs'
29
+ Capybara.register_driver :poltergeist do |app|
30
+ Capybara::Poltergeist::Driver.new(app, :phantomjs => Phantomjs.path)
31
+ end
32
+ Capybara.default_driver = :poltergeist
33
+ Capybara.app_host = "http://localhost:#{server.port}"
29
34
 
30
- Capybara.register_driver :chrome do |app|
31
- Capybara::Selenium::Driver.new(app, :browser => :chrome, :args => ['no-sandbox','no-default-browser-check','no-first-run','disable-default-apps'])
32
- end
35
+ visit url
33
36
 
34
- Capybara.default_driver = :chrome
35
- Capybara.app_host = "http://localhost:#{server.port}"
37
+ def mathjax_ready?(page)
38
+ html = Nokogiri::HTML(page.html)
39
+ !html.css('.MathJax').empty? &&
40
+ html.css('.MathJax_Processing').empty? &&
41
+ html.css('.MathJax_Processed').empty?
42
+ end
36
43
 
37
- visit url
44
+ Timeout.timeout(5) do
45
+ sleep 0.1 until mathjax_ready?(page)
46
+ end
38
47
 
39
- def mathjax_ready?(page)
40
- html = Nokogiri::HTML(page.html)
41
- !html.css('.MathJax').empty? &&
42
- html.css('.MathJax_Processing').empty? &&
43
- html.css('.MathJax_Processed').empty?
44
- end
48
+ unless @image_base_url.nil?
49
+ require 'chunky_png'
50
+ driver = page.driver
45
51
 
46
- Timeout.timeout(5) do
47
- sleep 0.1 until mathjax_ready?(page)
48
- end
52
+ require 'fileutils'
53
+ FileUtils.mkpath @image_base_url
49
54
 
50
- unless @image_base_url.nil?
51
- require 'chunky_png'
52
- driver = page.driver
55
+ driver.save_screenshot(image_path)
53
56
 
54
- require 'fileutils'
55
- FileUtils.mkpath @image_base_url
57
+ image = ChunkyPNG::Image.from_file(image_path)
56
58
 
57
- driver.save_screenshot(image_path)
59
+ location = page.driver.evaluate_script <<-EOS
60
+ function() {
61
+ var ele = document.querySelector('.MathJax .math');
62
+ var rect = ele.getBoundingClientRect();
63
+ return [rect.left, rect.top];
64
+ }();
65
+ EOS
58
66
 
59
- el= page.find('.MathJax .math').native
67
+ size = page.driver.evaluate_script <<-EOS
68
+ function() {
69
+ var ele = document.querySelector('.MathJax .math');
70
+ var rect = ele.getBoundingClientRect();
71
+ return [rect.width, rect.height];
72
+ }();
73
+ EOS
60
74
 
61
- image = ChunkyPNG::Image.from_file(image_path)
75
+ correction = [(@options[:min_width] -(size[0] + 2 * @options[:padding])) / 2,0].max
62
76
 
63
- correction = [(@options[:min_width] -(el.size.width + 2 * @options[:padding])) / 2,0].max
77
+ x = location[0] + 1 - @options[:padding]-correction
78
+ y = location[1] + 1 - @options[:padding]
79
+ width = [size[0].ceil + 2 * @options[:padding],@options[:min_width]].max
80
+ height = size[1]+ 2 * @options[:padding]
64
81
 
65
- x = el.location.x + 1 - @options[:padding]-correction
66
- y = el.location.y + 1 - @options[:padding]
67
- width = [el.size.width + 2 * @options[:padding],@options[:min_width]].max
68
- height = el.size.height+ 2 * @options[:padding]
82
+ image.crop!(x, y, width, height)
83
+ image.save(image_path)
84
+ end
85
+ result = Nokogiri::HTML(page.html).css('.MathJax .math')[0]
69
86
 
70
- image.crop!(x, y, width, height)
71
- image.save(image_path)
72
- end
73
- result = Nokogiri::HTML(page.html).css('.MathJax')[0]
87
+ put_cache!(params_hash,result)
74
88
 
75
- put_cache!(params_hash,result)
76
-
77
- page.driver.quit
78
-
79
- @html = result
80
- end
89
+ @html = result
81
90
  end
82
91
 
83
92
  def html
@@ -125,11 +134,11 @@ module Mathjax_Renderer
125
134
  require 'concurrent/atomic/atomic_boolean'
126
135
  require 'digest'
127
136
 
128
- def add_content(content, extra_style = '')
137
+ def add_content(content, extra_style = '', padding = 0)
129
138
  digest = Digest::SHA1.hexdigest(content)
130
139
  path = "/#{digest}.html"
131
140
  server.mount_proc path do |_, res|
132
- res.body = response(content, extra_style)
141
+ res.body = response(content, extra_style, padding)
133
142
  end
134
143
 
135
144
  path
@@ -139,7 +148,7 @@ module Mathjax_Renderer
139
148
  server.config[:Port]
140
149
  end
141
150
 
142
- def response(content, extra_style)
151
+ def response(content, extra_style, padding)
143
152
  "
144
153
  <html><head>
145
154
  <script type='text/x-mathjax_renderer-config'>
@@ -151,7 +160,11 @@ module Mathjax_Renderer
151
160
  <script type='text/javascript'
152
161
  src='javascripts/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script>
153
162
  <style>body{display: flex;justify-content: center;}
154
- #{extra_style}</style>
163
+ #{extra_style}
164
+ .MathJax{
165
+ left: #{padding}px;
166
+ top: #{padding}px;
167
+ }</style>
155
168
  </head><body>#{content}</body></html>"
156
169
  end
157
170
 
@@ -217,4 +230,4 @@ module Mathjax_Renderer
217
230
  end
218
231
 
219
232
  end
220
- end
233
+ end
@@ -1,3 +1,3 @@
1
1
  module Mathjax_Renderer
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -27,9 +27,8 @@ Gem::Specification.new do |spec|
27
27
  spec.add_dependency "rails-assets-MathJax"
28
28
  spec.add_dependency "nokogiri"
29
29
  spec.add_dependency "concurrent-ruby"
30
- spec.add_dependency "selenium-webdriver"
31
30
  spec.add_dependency "capybara"
32
- spec.add_dependency "chromedriver-helper"
33
31
  spec.add_dependency "chunky_png"
34
- spec.add_dependency "headless"
32
+ spec.add_dependency "phantomjs"
33
+ spec.add_dependency "poltergeist"
35
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mathjax-renderer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - sashee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-06 00:00:00.000000000 Z
11
+ date: 2016-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -108,20 +108,6 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
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
111
  - !ruby/object:Gem::Dependency
126
112
  name: capybara
127
113
  requirement: !ruby/object:Gem::Requirement
@@ -137,7 +123,7 @@ dependencies:
137
123
  - !ruby/object:Gem::Version
138
124
  version: '0'
139
125
  - !ruby/object:Gem::Dependency
140
- name: chromedriver-helper
126
+ name: chunky_png
141
127
  requirement: !ruby/object:Gem::Requirement
142
128
  requirements:
143
129
  - - ">="
@@ -151,7 +137,7 @@ dependencies:
151
137
  - !ruby/object:Gem::Version
152
138
  version: '0'
153
139
  - !ruby/object:Gem::Dependency
154
- name: chunky_png
140
+ name: phantomjs
155
141
  requirement: !ruby/object:Gem::Requirement
156
142
  requirements:
157
143
  - - ">="
@@ -165,7 +151,7 @@ dependencies:
165
151
  - !ruby/object:Gem::Version
166
152
  version: '0'
167
153
  - !ruby/object:Gem::Dependency
168
- name: headless
154
+ name: poltergeist
169
155
  requirement: !ruby/object:Gem::Requirement
170
156
  requirements:
171
157
  - - ">="
@@ -221,7 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
221
207
  version: '0'
222
208
  requirements: []
223
209
  rubyforge_project:
224
- rubygems_version: 2.4.3
210
+ rubygems_version: 2.4.5
225
211
  signing_key:
226
212
  specification_version: 4
227
213
  summary: MathJax expression renderer