From 604f88939efc7f9f78dbdc22d1d75fc018842f48 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Mon, 24 Oct 2011 15:50:02 -0500 Subject: [PATCH] Render tex formulas to images --- lib/gollum.rb | 1 + lib/gollum/frontend/app.rb | 8 ++++- lib/gollum/markup.rb | 9 ++--- lib/gollum/tex.rb | 73 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 lib/gollum/tex.rb diff --git a/lib/gollum.rb b/lib/gollum.rb index 1d9d595a..648adc50 100644 --- a/lib/gollum.rb +++ b/lib/gollum.rb @@ -17,6 +17,7 @@ require File.expand_path('../gollum/page', __FILE__) require File.expand_path('../gollum/file', __FILE__) require File.expand_path('../gollum/markup', __FILE__) require File.expand_path('../gollum/sanitization', __FILE__) +require File.expand_path('../gollum/tex', __FILE__) module Gollum VERSION = '1.3.1' diff --git a/lib/gollum/frontend/app.rb b/lib/gollum/frontend/app.rb index 0026a329..f14eb4d0 100644 --- a/lib/gollum/frontend/app.rb +++ b/lib/gollum/frontend/app.rb @@ -144,6 +144,12 @@ module Precious mustache :compare end + get '/_tex.png' do + content_type 'image/png' + formula = Base64.decode64(params[:data]) + Gollum::Tex.render_formula(formula) + end + get %r{^/(javascript|css|images)} do halt 404 end @@ -199,7 +205,7 @@ module Precious end def update_wiki_page(wiki, page, content, commit_message, name = nil, format = nil) - return if !page || + return if !page || ((!content || page.raw_data == content) && page.format == format) name ||= page.name format = (format || page.format).to_sym diff --git a/lib/gollum/markup.rb b/lib/gollum/markup.rb index 59f51a22..049730af 100644 --- a/lib/gollum/markup.rb +++ b/lib/gollum/markup.rb @@ -1,6 +1,7 @@ require 'digest/sha1' require 'cgi' require 'pygments' +require 'base64' module Gollum @@ -97,13 +98,7 @@ module Gollum def process_tex(data) @texmap.each do |id, spec| type, tex = *spec - out = - case type - when :block - %{} - when :inline - %{} - end + out = %{#{CGI.escapeHTML(tex)}} data.gsub!(id, out) end data diff --git a/lib/gollum/tex.rb b/lib/gollum/tex.rb new file mode 100644 index 00000000..df774226 --- /dev/null +++ b/lib/gollum/tex.rb @@ -0,0 +1,73 @@ +require 'fileutils' +require 'shellwords' +require 'tmpdir' + +module Gollum + module Tex + Template = <<-EOS +\\documentclass[12pt]{article} +\\usepackage{color} +\\usepackage[dvips]{graphicx} +\\pagestyle{empty} +\\pagecolor{white} +\\begin{document} +{\\color{black} +\\begin{eqnarray*} +%s +\\end{eqnarray*}} +\\end{document} + EOS + + class << self + attr_accessor :latex_path, :dvips_path, :convert_path + end + + self.latex_path = 'latex' + self.dvips_path = 'dvips' + self.convert_path = 'convert' + + def self.check_dependencies! + if `which latex` == "" + raise "`latex` command not found" + end + + if `which dvips` == "" + raise "`dvips` command not found" + end + + if `which convert` == "" + raise "`convert` command not found" + end + end + + def self.render_formula(formula) + check_dependencies! + + Dir.mktmpdir('tex') do |path| + tex_path = ::File.join(path, 'formula.tex') + dvi_path = ::File.join(path, 'formula.dvi') + eps_path = ::File.join(path, 'formula.eps') + png_path = ::File.join(path, 'formula.png') + + ::File.open(tex_path, 'w') { |f| f.write(Template % formula) } + + sh latex_path, '-interaction=batchmode', 'formula.tex', :cwd => path + sh dvips_path, '-o', eps_path, '-E', dvi_path + sh convert_path, '+adjoin', + '-antialias', + '-transparent', 'white', + '-density', '150x150', + eps_path, png_path + + ::File.read(png_path) + end + end + + private + def self.sh(*args) + options = args.last.is_a?(Hash) ? args.pop : {} + cwd = "cd \"#{options[:cwd]}\" && " if options[:cwd] + `#{cwd}#{Shellwords.join(args)} 2>&1` + end + end +end