diff --git a/anki/latex.py b/anki/latex.py
index da8109134..14593ae13 100644
--- a/anki/latex.py
+++ b/anki/latex.py
@@ -74,6 +74,10 @@ def _buildImg(deck, latex, fname, model):
latex = (model["latexPre"] + "\n" +
latex + "\n" +
model["latexPost"])
+ # it's only really secure if run in a jail, but these are the most common
+ for bad in ("write18", "\\readline", "\\input", "\\include", "\\catcode",
+ "\\openout", "\\write", "\\loop", "\\def", "\\shipout"):
+ assert bad not in latex
# write into a temp file
log = open(namedtmp("latex_log.txt"), "w")
texfile = file(namedtmp("tmp.tex"), "w")
@@ -101,7 +105,7 @@ def _buildImg(deck, latex, fname, model):
def _errMsg(type):
msg = (_("Error executing %s.") % type) + "
"
try:
- log = open(namedtmp("latex_log.txt")).read()
+ log = open(namedtmp("latex_log.txt", rm=False)).read()
if not log:
raise Exception()
msg += "" + cgi.escape(log) + "
"
diff --git a/anki/media.py b/anki/media.py
index a50b0df30..2aaa2698c 100644
--- a/anki/media.py
+++ b/anki/media.py
@@ -9,6 +9,7 @@ from anki.utils import checksum, intTime, namedtmp, isWin
from anki.lang import _
from anki.db import DB
from anki.consts import *
+from anki.latex import mungeQA
class MediaManager(object):
@@ -83,8 +84,13 @@ If the same name exists, compare checksums."""
# String manipulation
##########################################################################
- def mediaFiles(self, string, includeRemote=False):
+ def files(self, mid, string, includeRemote=False):
l = []
+ # convert latex first
+ model = self.deck.models.get(mid)
+ string = mungeQA(string, None, None, model, None, self.deck)
+ print string
+ # extract filenames
for reg in self.regexps:
for (full, fname) in re.findall(reg, string):
isLocal = not re.match("(https?|ftp)://", fname.lower())
diff --git a/anki/models.py b/anki/models.py
index 7db161975..546985de7 100644
--- a/anki/models.py
+++ b/anki/models.py
@@ -22,7 +22,7 @@ defaultModel = {
'latexPre': """\
\\documentclass[12pt]{article}
\\special{papersize=3in,5in}
-\\usepackage[utf8x]{inputenc}
+% \\usepackage[utf8x]{inputenc} % uncomment this for foreign characters
\\usepackage{amssymb,amsmath}
\\pagestyle{empty}
\\setlength{\\parindent}{0in}
diff --git a/anki/upgrade.py b/anki/upgrade.py
index fd5c94bb5..4df470f6e 100644
--- a/anki/upgrade.py
+++ b/anki/upgrade.py
@@ -461,6 +461,11 @@ order by ordinal""", mid)):
new = fld
# rewrite reference in template
t[key] = t[key].replace(all, "{{{%s}}}" % new)
+ regexps = deck.media.regexps + (
+ r"(\[latex\](.+?)\[/latex\])",
+ r"(\[\$\](.+?)\[/\$\])",
+ r"(\[\$\$\](.+?)\[/\$\$\])")
+ # process each model
for m in deck.models.all():
state = dict(mflds={}, fields=0)
for t in m['tmpls']:
@@ -469,7 +474,8 @@ order by ordinal""", mid)):
rewriteRef('qfmt')
for match in re.findall(r, t['afmt']):
rewriteRef('afmt')
-
+ if state['fields']:
+ deck.models.save(m)
# Upgrading deck
######################################################################
diff --git a/anki/utils.py b/anki/utils.py
index 4593430d7..2a60dfdc3 100644
--- a/anki/utils.py
+++ b/anki/utils.py
@@ -242,13 +242,14 @@ def tmpfile(prefix="", suffix=""):
os.close(fd)
return name
-def namedtmp(name):
+def namedtmp(name, rm=True):
"Return tmpdir+name. Deletes any existing file."
path = os.path.join(tmpdir(), name)
- try:
- os.unlink(path)
- except (OSError, IOError):
- pass
+ if rm:
+ try:
+ os.unlink(path)
+ except (OSError, IOError):
+ pass
return path
# Cmd invocation