9
9
__docformat__ = 'restructuredtext'
11
import re, tempfile, os, sys, subprocess, stat, time
11
import re, tempfile, os, sys, subprocess, stat, time, shutil
12
12
from anki.utils import genID, checksum
13
from anki.media import copyToMedia
14
13
from htmlentitydefs import entitydefs
16
15
latexPreamble = ("\\documentclass[12pt]{article}\n"
78
77
def latexImgFile(deck, latexCode):
79
78
key = checksum(latexCode)
80
return deck.s.scalar("select filename from media where originalPath = :k",
83
def latexImgPath(deck, file):
84
"Return the path to the cache file in system encoding format."
85
path = os.path.join(deck.mediaDir(create=True), file)
86
return path.encode(sys.getfilesystemencoding())
79
return "latex-%s.png" % key
88
81
def mungeLatex(latex):
89
82
"Convert entities, fix newlines, and convert to utf8."
97
90
def deleteAllLatexImages(deck):
98
for f in deck.s.column0(
99
"select filename from media where description = 'latex'"):
100
path = latexImgPath(deck, f)
103
except (OSError, IOError):
105
deck.s.statement("delete from media where description = 'latex'")
91
mdir = deck.mediaDir()
95
for c, f in enumerate(os.listdir(mdir)):
96
if f.startswith("latex-"):
97
os.unlink(os.path.join(mdir, f))
100
deck.finishProgress()
108
102
def cacheAllLatexImages(deck):
109
104
fields = deck.s.column0("select value from fields")
105
for c, field in enumerate(fields):
107
deck.updateProgress()
111
108
renderLatex(deck, field)
109
deck.finishProgress()
113
111
def buildImg(deck, latex):
114
112
log = open(os.path.join(tmpdir, "latex_log.txt"), "w+")
119
117
texfile.write(latexPostamble + "\n")
121
119
texpath = texpath.encode(sys.getfilesystemencoding())
120
# make sure we have a valid mediaDir
121
deck.mediaDir(create=True)
122
122
oldcwd = os.getcwd()
123
123
if sys.platform == "win32":
124
124
si = subprocess.STARTUPINFO()
131
"Error executing 'latex' or 'dvipng'.\n"
130
errmsg = _("Error executing %s.\n") + _(
132
131
"A log file is available here:\n%s") % tmpdir
133
132
if call(["latex", "-interaction=nonstopmode",
134
133
texpath], stdout=log, stderr=log, startupinfo=si):
135
return (False, errmsg)
134
return (False, errmsg % "latex")
136
135
if call(latexDviPngCmd + ["tmp.dvi", "-o", "tmp.png"],
137
136
stdout=log, stderr=log, startupinfo=si):
138
return (False, errmsg)
137
return (False, errmsg % "dvipng")
140
path = copyToMedia(deck, "tmp.png", latex=checksum(latex))
139
target = latexImgFile(deck, latex)
140
shutil.copy2("tmp.png", os.path.join(deck.mediaDir(), target))
141
return (True, target)
145
145
def imageForLatex(deck, latex, build=True):
146
146
"Return an image that represents 'latex', building if necessary."
147
147
imageFile = latexImgFile(deck, latex)
149
path = latexImgPath(deck, imageFile)
151
if build and (not imageFile or not os.path.exists(path)):
149
if build and (not imageFile or not os.path.exists(imageFile)):
152
150
(ok, imageFile) = buildImg(deck, latex)
154
152
return (False, imageFile)