diff --git a/anki/latex.py b/anki/latex.py index 039215025..521fae620 100644 --- a/anki/latex.py +++ b/anki/latex.py @@ -74,16 +74,27 @@ def call(*args, **kwargs): break return ret -def imgLink(deck, latex): - "Parse LATEX and return a HTML image representing the output." +def generatedFile(latexCode): + return "%s.png" % md5(latexCode).hexdigest() + +def generatedPath(deck, latexCode): + "Return the path to the cache file in system encoding format." + path = os.path.join(deck.mediaDir(create=True), + generatedFile(latexCode)) + return path.encode(sys.getfilesystemencoding()) + +def mungeLatex(latex): + "Convert entities, fix newlines, and convert to utf8." for match in re.compile("&([a-z]+);", re.IGNORECASE).finditer(latex): if match.group(1) in entitydefs: latex = latex.replace(match.group(), entitydefs[match.group(1)]) latex = re.sub("", "\n", latex) latex = latex.encode("utf-8") - imageFile = "latex-%s.png" % md5(latex).hexdigest() - imagePath = os.path.join(deck.mediaDir(create=True), imageFile) - imagePath = imagePath.encode(sys.getfilesystemencoding()) + return latex + +def imageForLatex(deck, latex): + "Return an image that represents 'latex', building if necessary." + imagePath = generatedPath(deck, latex) if not os.path.exists(imagePath): log = open(os.path.join(tmpdir, "latex_log.txt"), "w+") texpath = os.path.join(tmpdir, "tmp.tex") @@ -101,13 +112,24 @@ def imgLink(deck, latex): si = None try: os.chdir(tmpdir) - errmsg = _("Error executing 'latex' or 'dvipng' - are they installed?") + errmsg = _( + "Error executing 'latex' or 'dvipng'.\n" + "A log file is available here:\n%s") % tmpdir if call(["latex", "-interaction=nonstopmode", texpath], stdout=log, stderr=log, startupinfo=si): - return errmsg + return (False, errmsg) if call(latexDviPngCmd + ["tmp.dvi", "-o", imagePath], stdout=log, stderr=log, startupinfo=si): - return errmsg + return (False, errmsg) finally: os.chdir(oldcwd) - return '' % imageFile + return (True, imagePath) + +def imgLink(deck, latex): + "Parse LATEX and return a HTML image representing the output." + latex = mungeLatex(latex) + (ok, img) = imageForLatex(deck, latex) + if ok: + return '' % img + else: + return img