diff --git a/anki/deck.py b/anki/deck.py
index 07bcbb244..de9cb80d5 100644
--- a/anki/deck.py
+++ b/anki/deck.py
@@ -413,11 +413,6 @@ select id from facts where id in %s and id not in (select fid from cards)""" %
model = self.models.get(data[2])
for (name, (idx, conf)) in self.models.fieldMap(model).items():
fields[name] = flist[idx]
- if fields[name]:
- fields[name] = '%s' % (
- hexifyID(data[2]), hexifyID(idx), fields[name])
- else:
- fields[name] = ""
fields['Tags'] = data[5]
fields['Model'] = model['name']
fields['Group'] = self.groups.name(data[3])
diff --git a/anki/template/template.py b/anki/template/template.py
index bc433e1d6..a165b4799 100644
--- a/anki/template/template.py
+++ b/anki/template/template.py
@@ -135,13 +135,13 @@ class Template(object):
return template
+ # {{{ functions just like {{ in anki
@modifier('{')
def render_tag(self, tag_name, context):
- """Given a tag name and context, finds, escapes, and renders the tag."""
raw = get_or_attr(context, tag_name, '')
if not raw and raw is not 0:
return ''
- return re.sub("^(.*)", "\\1", raw)
+ return raw
@modifier('!')
def render_comment(self, tag_name=None, context=None):
@@ -188,7 +188,7 @@ class Template(object):
ans = [""+a[0]+"" for a in ans]
ans = ", ".join(ans)
# but we want to preserve the outer field styling
- return re.sub("(^)(.*)", "\\1"+ans+"", txt)
+ return ans
# and display other clozes normally
return re.sub(reg%".*?", "\\1", txt)
diff --git a/anki/upgrade.py b/anki/upgrade.py
index 9a5ddd5de..ee3d14af9 100644
--- a/anki/upgrade.py
+++ b/anki/upgrade.py
@@ -416,6 +416,39 @@ order by ordinal""", mid)):
tmpls.append(conf)
return tmpls
+ # Template upgrading
+ ######################################################################
+ # {{field}} no longer inserts an implicit span, so we make the span
+ # explicit on upgrade.
+ def _upgradeTemplates(self):
+ d = self.deck
+ for m in d.models.all():
+ # cache field styles
+ styles = {}
+ for f in m['flds']:
+ attrs = [
+ "font-family:%s" % f['font'],
+ "font-size:%spx" % f['qsize'],
+ "color:%s" % f['qcol']]
+ if f['rtl']:
+ attrs.append("direction:rtl;unicode-bidi:embed")
+ if f['pre']:
+ attrs.append("white-space:pre-wrap")
+ styles[f['name']] = '\n{{%s}}\n' % (
+ ";".join(attrs), f['name'])
+ # then for each template
+ for t in m['tmpls']:
+ def repl(match):
+ field = match.group(1)
+ if field in styles:
+ return styles[field]
+ # special or non-existant field; leave alone
+ return match.group(0)
+ for k in 'qfmt', 'afmt':
+ t[k] = re.sub("(?:^|[^{]){{([^{}]+)?}}", repl, t[k])
+ # save model
+ d.models.save(m)
+
# Media references
######################################################################
# In 2.0 we drop support for media and latex references in the template,
@@ -519,6 +552,8 @@ and ord = ? limit 1""", m['id'], t['ord']):
self._removeInactive()
# rewrite media references in card template
self._rewriteMediaRefs()
+ # template handling has changed
+ self._upgradeTemplates()
# regenerate css, and set new card order
for m in deck.models.all():
m['newOrder'] = deck.conf['oldNewOrder']
diff --git a/tests/test_upgrade.py b/tests/test_upgrade.py
index 353bc95e0..6f6df08ef 100644
--- a/tests/test_upgrade.py
+++ b/tests/test_upgrade.py
@@ -19,7 +19,6 @@ def test_upgrade():
dst = getUpgradeDeckPath()
csum = checksum(open(dst).read())
u = Upgrader()
- print "upgrade to", dst
deck = u.upgrade(dst)
# src file must not have changed
assert csum == checksum(open(dst).read())