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