2 runs in creating pdf
[librarian.git] / librarian / latex.py
1 # -*- coding: utf-8 -*-
2 #
3 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
4 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
5 #
6
7 from os import path, system, popen2, unlink, rename
8 from tempfile import NamedTemporaryFile
9 import sys
10
11 class LatexFragment(object):
12     def __init__(self, code, image_format='png', dirname="/tmp", resize=None):
13         self.code = code
14         self.temp = None
15         self.format = image_format
16         self.dirname = dirname
17         self.resize = resize
18         
19     def generate(self):
20         if self.temp is not None: 
21             return
22         self.temp = NamedTemporaryFile('r', 
23                                   suffix='.'+self.format, 
24                                   prefix=path.join(self.dirname,'librarian-latex-'),
25                                   delete=False)
26         try:
27             (processor, _out) = popen2("l2p -o '%(out)s' -d 1200" 
28                                      % {'out': self.temp.name},
29                                      "w")
30             
31             processor.write(isinstance(self.code, unicode) and \
32                             self.code.encode('utf-8') or\
33                             self.code)
34             print "LATEX: %s" % isinstance(self.code, unicode) and \
35                             self.code.encode('utf-8') or\
36                             self.code
37             processor.close()
38             _out.read() # waits for the process to finish
39
40             # Resize the image if needed
41             if self.resize:
42                 n, e =  path.splitext(self.path)
43                 aside_name = n + "_orig" + e
44                 rename(self.path, aside_name)
45                 system("convert -resize x%d %s %s" % (self.resize, aside_name, self.path))
46
47         except Exception as e:
48             import pdb; pdb.set_trace()
49             if path.exists(self.temp.name):
50                 unlink(self.temp.name)
51             raise e
52
53     @property
54     def filename(self, splitext=False):
55         self.generate()
56         n = path.basename(self.temp.name)
57         if splitext: 
58             return path.splitext(n)
59         return n
60
61     @property
62     def path(self):
63         return path.join(self.dirname, self.filename)
64
65     def remove(self):
66         if self.temp:
67             unlink(self.temp.name)
68             self.temp = None
69
70     __del__ = remove