From 0c20da106904da0f415f288919919a1a184f35c3 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Thu, 30 Jun 2016 22:23:31 +1000 Subject: [PATCH] fix conditional templates --- anki/template/template.py | 20 +++++--------------- tests/test_models.py | 9 +++++++++ 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/anki/template/template.py b/anki/template/template.py index 8a61c2867..397f5427c 100644 --- a/anki/template/template.py +++ b/anki/template/template.py @@ -84,30 +84,20 @@ class Template(object): section_name = section_name.strip() # check for cloze + val = None m = re.match("c[qa]:(\d+):(.+)", section_name) if m: # get full field text txt = get_or_attr(context, m.group(2), None) m = re.search(clozeReg%m.group(1), txt) if m: - it = m.group(1) - else: - it = None + val = m.group(1) else: - it = get_or_attr(context, section_name, None) + val = get_or_attr(context, section_name, None) replacer = '' - if isinstance(it, str): - it = stripHTMLMedia(it).strip() - elif it and hasattr(it, 'keys') and hasattr(it, '__getitem__'): - if section[2] != '^': - replacer = self.render(inner, it) - elif it: - insides = [] - for item in it: - insides.append(self.render(inner, item)) - replacer = ''.join(insides) - elif not it and section[2] == '^': + inverted = section[2] == "^" + if (val and not inverted) or (not val and inverted): replacer = inner template = template.replace(section, replacer) diff --git a/tests/test_models.py b/tests/test_models.py index 7eb43ccb3..bbab7f7c0 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -2,6 +2,7 @@ from tests.shared import getEmptyCol from anki.utils import stripHTML, joinFields +import anki.template def test_modelDelete(): deck = getEmptyCol() @@ -283,6 +284,14 @@ def test_modelChange(): deck.models.change(cloze, [f.id], basic, map, map) assert deck.db.scalar("select count() from cards where nid = ?", f.id) == 1 +def test_templates(): + d = dict(Foo="x", Bar="y") + assert anki.template.render("{{Foo}}", d) == "x" + assert anki.template.render("{{#Foo}}{{Foo}}{{/Foo}}", d) == "x" + assert anki.template.render("{{#Foo}}{{Foo}}{{/Foo}}", d) == "x" + assert anki.template.render("{{#Bar}}{{#Foo}}{{Foo}}{{/Foo}}{{/Bar}}", d) == "x" + assert anki.template.render("{{#Baz}}{{#Foo}}{{Foo}}{{/Foo}}{{/Baz}}", d) == "" + def test_availOrds(): d = getEmptyCol() m = d.models.current(); mm = d.models