mirror of
https://github.com/ankitects/anki.git
synced 2025-09-20 23:12:21 -04:00
change template replacement behaviour
Previously {{field}} wrapped the field in a span with the field's font properties. This wasn't obvious, and caused frequent problems with people trying to combine field and template text, or use field content in dictionary links. Now that AnkiWeb has a wizard for configuring the front & back layout, we can just put the formatting in the template instead.
This commit is contained in:
parent
770f402905
commit
c76c08069e
4 changed files with 38 additions and 9 deletions
|
@ -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] = '<span class="fm%s-%s">%s</span>' % (
|
||||
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])
|
||||
|
|
|
@ -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("^<span.+?>(.*)</span>", "\\1", raw)
|
||||
return raw
|
||||
|
||||
@modifier('!')
|
||||
def render_comment(self, tag_name=None, context=None):
|
||||
|
@ -188,7 +188,7 @@ class Template(object):
|
|||
ans = ["<span class=cloze>"+a[0]+"</span>" for a in ans]
|
||||
ans = ", ".join(ans)
|
||||
# but we want to preserve the outer field styling
|
||||
return re.sub("(^<span.+?>)(.*)</span>", "\\1"+ans+"</span>", txt)
|
||||
return ans
|
||||
# and display other clozes normally
|
||||
return re.sub(reg%".*?", "\\1", txt)
|
||||
|
||||
|
|
|
@ -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']] = '<span style="%s">\n{{%s}}\n</span>' % (
|
||||
";".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']
|
||||
|
|
|
@ -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())
|
||||
|
|
Loading…
Reference in a new issue