class Mathjax_Renderer::Renderer
Public Class Methods
new(mathml, image_base_url = nil, options = {})
click to toggle source
# File lib/mathjax_renderer/renderer.rb, line 9 def initialize(mathml, image_base_url = nil, options = {}) @mathml = mathml @image_base_url = image_base_url @options = {min_width: 0, extra_style:'', padding:0}.merge options end
Public Instance Methods
html()
click to toggle source
# File lib/mathjax_renderer/renderer.rb, line 80 def html return cached(params_hash) if cached? params_hash render! if @html.nil? @html end
image_name()
click to toggle source
# File lib/mathjax_renderer/renderer.rb, line 15 def image_name raise ArgumentError if @image_base_url.nil? render! unless File.exist?(image_path) _image_name end
mathjax_ready?(page)
click to toggle source
# File lib/mathjax_renderer/renderer.rb, line 40 def mathjax_ready?(page) html = Nokogiri::HTML(page.html) !html.css('.MathJax').empty? && html.css('.MathJax_Processing').empty? && html.css('.MathJax_Processed').empty? end
render!()
click to toggle source
# File lib/mathjax_renderer/renderer.rb, line 21 def render! server = RendererServer.new server.ensure_started! added_margin = [@options[:padding],@options[:min_width]].max url = server.add_content(@mathml, added_margin, @options[:extra_style]) Headless.ly do Capybara.register_driver :chrome do |app| Capybara::Selenium::Driver.new(app, :browser => :chrome) end Capybara.default_driver = :chrome 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 sleep 0.1 until mathjax_ready?(page) unless @image_base_url.nil? require 'chunky_png' driver = page.driver require 'fileutils' FileUtils.mkpath @image_base_url driver.save_screenshot(image_path) el= page.find('.MathJax .math').native image = ChunkyPNG::Image.from_file(image_path) correction = [(@options[:min_width] -(el.size.width + 2 * @options[:padding])) / 2,0].max x = el.location.x + 1 - @options[:padding]-correction y = el.location.y + 1 - @options[:padding] width = [el.size.width + 2 * @options[:padding],@options[:min_width]].max height = el.size.height+ 2 * @options[:padding] image.crop!(x, y, width, height) image.save(image_path) end result = Nokogiri::HTML(page.html).css('.MathJax')[0] put_cache!(params_hash,result) page.driver.quit @html = result end end
Private Instance Methods
_image_name()
click to toggle source
# File lib/mathjax_renderer/renderer.rb, line 98 def _image_name "#{params_hash}.png" end
cache()
click to toggle source
# File lib/mathjax_renderer/renderer.rb, line 104 def cache @@cache end
cached(mathml)
click to toggle source
# File lib/mathjax_renderer/renderer.rb, line 112 def cached(mathml) cache[mathml] end
cached?(mathml)
click to toggle source
# File lib/mathjax_renderer/renderer.rb, line 108 def cached?(mathml) cache.has_key?(mathml) end
image_path()
click to toggle source
# File lib/mathjax_renderer/renderer.rb, line 94 def image_path "#{@image_base_url}/#{_image_name}" end
params_hash()
click to toggle source
# File lib/mathjax_renderer/renderer.rb, line 90 def params_hash Digest::SHA1.hexdigest(@mathml+@options.to_s) end
put_cache!(mathml,result)
click to toggle source
# File lib/mathjax_renderer/renderer.rb, line 116 def put_cache!(mathml,result) cache[mathml]=result end