1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 import os
31 import random
32 from tempfile import gettempdir
33 from subprocess import Popen, PIPE
34
35 import logging
36 log = logging.getLogger('gajim.c.latex')
37
38 import gajim
39 from exceptions import LatexError
40 import helpers
41
42
43 blacklist = ['\\def', '\\let', '\\futurelet',
44 '\\newcommand', '\\renewcomment', '\\else', '\\fi', '\\write',
45 '\\input', '\\include', '\\chardef', '\\catcode', '\\makeatletter',
46 '\\noexpand', '\\toksdef', '\\every', '\\errhelp', '\\errorstopmode',
47 '\\scrollmode', '\\nonstopmode', '\\batchmode', '\\read', '\\csname',
48 '\\newhelp', '\\relax', '\\afterground', '\\afterassignment',
49 '\\expandafter', '\\noexpand', '\\special', '\\command', '\\loop',
50 '\\repeat', '\\toks', '\\output', '\\line', '\\mathcode', '\\name',
51 '\\item', '\\section', '\\mbox', '\\DeclareRobustCommand', '\\[',
52 '\\]']
53
55 for word in blacklist:
56 if word in str_:
57 return True
58 return False
59
61 random.seed()
62 int_ = random.randint(0, 100)
63 return os.path.join(gettempdir(), 'gajimtex_' + int_.__str__())
64
66 texstr = '\\documentclass[12pt]{article}\\usepackage[dvips]{graphicx}'
67 texstr += '\\usepackage{amsmath}\\usepackage{amssymb}'
68 texstr += '\\pagestyle{empty}'
69 texstr += '\\begin{document}\\begin{large}\\begin{gather*}'
70 texstr += str_
71 texstr += '\\end{gather*}\\end{large}\\end{document}'
72
73 file_ = open(filename, "w+")
74 file_.write(texstr)
75 file_.flush()
76 file_.close()
77
78
79
80
82 if os.name == 'nt':
83
84 return Popen(command, creationflags=0x08000000, cwd=gettempdir(), stdout=PIPE)
85 else:
86 return Popen(command, cwd=gettempdir(), stdout=PIPE)
87
89 """
90 Check if latex is available and if it can create a picture
91 """
92 try:
93 filename = latex_to_image("test")
94 if filename:
95
96 os.remove(filename)
97 return True
98 return False
99 except LatexError:
100 return False
101
103 try:
104 p = popen_nt_friendly(argv)
105 out = p.communicate()[0]
106 log.info(out)
107 return p.wait()
108 except Exception, e:
109 return _('Error executing "%(command)s": %(error)s') % {
110 'command': " ".join(argv),
111 'error': helpers.decode_string(str(e))}
112
113
115 result = None
116 exitcode = 0
117
118 try:
119 bg_str, fg_str = gajim.interface.get_bg_fg_colors()
120 except:
121
122 bg_str, fg_str = 'rgb 1.0 1.0 1.0', 'rgb 0.0 0.0 0.0'
123
124
125 if check_blacklist(str_):
126
127 return None
128
129 tmpfile = get_tmpfile_name()
130
131
132 write_latex(os.path.join(tmpfile + '.tex'), str_)
133
134
135 exitcode = try_run(['latex', '--interaction=nonstopmode',
136 tmpfile + '.tex'])
137
138 if exitcode == 0:
139
140 latex_png_dpi = gajim.config.get('latex_png_dpi')
141 exitcode = try_run(['dvipng', '-bg', bg_str, '-fg', fg_str, '-T',
142 'tight', '-D', latex_png_dpi, tmpfile + '.dvi', '-o',
143 tmpfile + '.png'])
144
145
146 extensions = ['.tex', '.log', '.aux', '.dvi']
147 for ext in extensions:
148 try:
149 os.remove(tmpfile + ext)
150 except Exception:
151 pass
152
153 if isinstance(exitcode, (unicode, str)):
154 raise LatexError(exitcode)
155
156 if exitcode == 0:
157 result = tmpfile + '.png'
158
159 return result
160