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 = %{
}
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