From f2f48f5d59a7a5d247786e4a5e19ed05c4f751dc Mon Sep 17 00:00:00 2001 From: Marcin Koziej Date: Wed, 30 Oct 2013 11:58:39 +0100 Subject: [PATCH 1/1] Render LaTeX elements using l2p command, and embed as images (used in epub) --- librarian/latex.py | 70 +++++++++++++++++++++++++++++++++++++++++++++ tests/test_latex.py | 19 ++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 librarian/latex.py create mode 100644 tests/test_latex.py diff --git a/librarian/latex.py b/librarian/latex.py new file mode 100644 index 0000000..bfc2f7c --- /dev/null +++ b/librarian/latex.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +# +# This file is part of Librarian, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# + +from os import path, system, popen2, unlink, rename +from tempfile import NamedTemporaryFile +import sys + +class LatexFragment(object): + def __init__(self, code, image_format='png', dirname="/tmp", resize=None): + self.code = code + self.temp = None + self.format = image_format + self.dirname = dirname + self.resize = resize + + def generate(self): + if self.temp is not None: + return + self.temp = NamedTemporaryFile('r', + suffix='.'+self.format, + prefix=path.join(self.dirname,'librarian-latex-'), + delete=False) + try: + (processor, _out) = popen2("l2p -o '%(out)s' -d 1200" + % {'out': self.temp.name}, + "w") + + processor.write(isinstance(self.code, unicode) and \ + self.code.encode('utf-8') or\ + self.code) + print "LATEX: %s" % isinstance(self.code, unicode) and \ + self.code.encode('utf-8') or\ + self.code + processor.close() + _out.read() # waits for the process to finish + + # Resize the image if needed + if self.resize: + n, e = path.splitext(self.path) + aside_name = n + "_orig" + e + rename(self.path, aside_name) + system("convert -resize x%d %s %s" % (self.resize, aside_name, self.path)) + + except Exception as e: + import pdb; pdb.set_trace() + if path.exists(self.temp.name): + unlink(self.temp.name) + raise e + + @property + def filename(self, splitext=False): + self.generate() + n = path.basename(self.temp.name) + if splitext: + return path.splitext(n) + return n + + @property + def path(self): + return path.join(self.dirname, self.filename) + + def remove(self): + if self.temp: + unlink(self.temp.name) + self.temp = None + + __del__ = remove diff --git a/tests/test_latex.py b/tests/test_latex.py new file mode 100644 index 0000000..22db615 --- /dev/null +++ b/tests/test_latex.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# +# This file is part of Librarian, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# + +from nose.tools import * +from librarian.latex import LatexFragment +import os + +def test_latex_to_png(): + lf = LatexFragment("$ \sum_{i = 0}^{123} n_i^{3}$") + name1 = lf.filename + assert_equal(name1.find("/"), -1) + name = lf.path + assert_true(os.path.exists(name)) + print os.stat(name) + assert_true(os.stat(name).st_size > 0) + lf.remove() -- 2.20.1