Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/mwlib/rendermath.py
diff options
context:
space:
mode:
Diffstat (limited to 'mwlib/rendermath.py')
-rwxr-xr-xmwlib/rendermath.py144
1 files changed, 144 insertions, 0 deletions
diff --git a/mwlib/rendermath.py b/mwlib/rendermath.py
new file mode 100755
index 0000000..10d6cdd
--- /dev/null
+++ b/mwlib/rendermath.py
@@ -0,0 +1,144 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import os
+import re
+try:
+ from hashlib import md5
+except ImportError:
+ from md5 import md5
+
+from mwlib import texmap
+import mwlib.log
+
+log = mwlib.log.Log("rendermath")
+
+latex = r"""
+%% %(ident)s
+\documentclass[%(fontsize)spt]{article}
+%(extra_header)s
+\usepackage{ucs}
+\usepackage{amsmath}
+\usepackage{amsfonts}
+\usepackage{amssymb}
+
+%% \newcommand{\R}[0]{\mathbb{R}}
+
+\def\Alpha{{A{}}}
+\def\Beta{{B{}}}
+\def\Epsilon{{E{}}}
+\def\Zeta{{Z{}}}
+\def\Eta{{H{}}}
+\def\Iota{{I{}}}
+\def\Kappa{{K{}}}
+\def\Mu{{M{}}}
+\def\Nu{{N{}}}
+\def\Rho{{P{}}}
+\def\Tau{{T{}}}
+\def\Chi{{C{}}}
+
+\usepackage[utf8x]{inputenc}
+\usepackage[dvips]{graphicx}
+\pagestyle{empty}
+\begin{document}
+%(source)s
+\end{document}
+"""
+
+
+
+
+
+
+def mysystem(cmd):
+ err=os.system(cmd)
+ if err:
+ raise RuntimeError("exit code %s while running %r" % (err, cmd))
+
+class Renderer(object):
+ basedir = os.path.expanduser("~/pngmath/")
+
+ def __init__(self, basedir=None, lazy=True):
+ if basedir:
+ self.basedir = os.path.realpath(os.path.join(basedir, 'pngmath/'))
+ if not os.path.exists(self.basedir):
+ #os.makedirs(self.basedir)
+ pass
+ self.lazy = lazy
+
+ def _render_file(self, name, format):
+ assert format in ('pdf', 'png', 'eps'), "rendermath: format %r not supported" % format
+
+ texfile = os.path.join(self.basedir, name+'.tex')
+ srcbase = os.path.join(self.basedir, name)
+
+ cwd = os.getcwd()
+ os.chdir(self.basedir)
+ try:
+ mysystem("latex -interaction=batchmode %s" % texfile)
+ mysystem("dvips -E %s.dvi -o %s.ps" % (srcbase, srcbase))
+ if format=='png':
+ mysystem("convert +adjoin -transparent white -density 300x300 %s.ps %s.png" % (srcbase, srcbase))
+ elif format=='pdf':
+ mysystem("epstopdf %s.ps" % srcbase)
+ elif format=='eps':
+ os.rename("%s.ps" % srcbase, "%s.eps" % srcbase)
+ finally:
+ for x in ['.dvi', '.aux', '.log', '.ps']:
+ p = os.path.join(self.basedir, name+x)
+ try:
+ os.unlink(p)
+ except OSError, err:
+ pass
+
+ os.chdir(cwd)
+
+ def _normalizeLatex(self, latexsource):
+ latexsource = re.compile("\n+").sub("\n", latexsource)
+ return latexsource
+
+ def convert(self, latexsource, lazy=True, format='pdf', addMathEnv=True):
+ assert format in ('pdf', 'png', 'eps'), "rendermath: format %r not supported" % format
+ latexsource = self._normalizeLatex(latexsource)
+ if addMathEnv:
+ latexsource = '$' + latexsource + '$'
+ if format in ('pdf', 'eps'):
+ extra_header = '\usepackage{geometry}\n\geometry{textwidth=3.0in}\n'
+ fontsize = 10
+ else:
+ fontsize = 12
+ extra_header = ''
+
+ latexsource = texmap.convertSymbols(latexsource)
+
+ source = latex % dict(source=latexsource,
+ ident=format,
+ fontsize=fontsize,
+ extra_header=extra_header)
+
+ m=md5()
+ m.update(source)
+ name = m.hexdigest()
+
+ srcbase = os.path.join(self.basedir, name)
+ texfile = os.path.join(self.basedir, name+'.tex')
+ outfile = os.path.join(self.basedir, name+'.'+format)
+
+ if os.path.exists(outfile):
+ return outfile # FIXME
+
+ open(texfile, 'w').write(source)
+
+ if not lazy:
+ self._render_file(name, format)
+
+
+ return outfile
+
+ def render(self, latexsource, lazy=None, addMathEnv=True):
+ if lazy is None:
+ lazy = self.lazy
+ return self.convert(latexsource, lazy=lazy, format='png', addMathEnv=addMathEnv)
+