21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
# File 'lib/mathjax_renderer/renderer.rb', line 21
def render!
server = RendererServer.new
server.ensure_started!
url = server.add_content(@mathml, @options[:extra_style], @options[:padding])
require 'phantomjs/poltergeist'
require 'phantomjs'
Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app, :phantomjs => Phantomjs.path)
end
Capybara.default_driver = :poltergeist
Capybara.app_host = "http://localhost:#{server.port}"
visit url
def mathjax_ready?(page)
html = Nokogiri::HTML(page.html)
!html.css('.MathJax').empty? &&
html.css('.MathJax_Processing').empty? &&
html.css('.MathJax_Processed').empty?
end
Timeout.timeout(5) do
sleep 0.1 until mathjax_ready?(page)
end
unless @image_base_url.nil?
require 'chunky_png'
driver = page.driver
require 'fileutils'
FileUtils.mkpath @image_base_url
driver.save_screenshot(image_path)
image = ChunkyPNG::Image.from_file(image_path)
location = page.driver.evaluate_script <<-EOS
function() {
var ele = document.querySelector('.MathJax .math');
var rect = ele.getBoundingClientRect();
return [rect.left, rect.top];
}();
EOS
size = page.driver.evaluate_script <<-EOS
function() {
var ele = document.querySelector('.MathJax .math');
var rect = ele.getBoundingClientRect();
return [rect.width, rect.height];
}();
EOS
correction = [(@options[:min_width] -(size[0] + 2 * @options[:padding])) / 2,0].max
x = location[0] + 1 - @options[:padding]-correction
y = location[1] + 1 - @options[:padding]
width = [size[0].ceil + 2 * @options[:padding],@options[:min_width]].max
height = size[1]+ 2 * @options[:padding]
image.crop!(x, y, width, height)
image.save(image_path)
end
result = Nokogiri::HTML(page.html).css('.MathJax .math')[0]
put_cache!(params_hash,result)
@html = result
end
|