mirror of
https://github.com/ankitects/anki.git
synced 2025-09-24 16:56:36 -04:00
Adding support for chained modifiers. One can now write e.g. {{cloze:text:Field}} or {{text:cloze:Field}}, it's order independent.
This commit is contained in:
parent
3b20de173f
commit
7e3597fb8e
3 changed files with 32 additions and 33 deletions
|
@ -510,13 +510,11 @@ where c.nid = n.id and c.id in %s group by nid""" % ids2str(cids)):
|
|||
afmt = afmt or template['afmt']
|
||||
for (type, format) in (("q", qfmt), ("a", afmt)):
|
||||
if type == "q":
|
||||
format = format.replace("{{cloze:", "{{cq:%d:" % (
|
||||
data[4]+1))
|
||||
format = re.sub("{{(.*?)cloze:", r"{{\1cq-%d:" % (data[4]+1), format)
|
||||
format = format.replace("<%cloze:", "<%%cq:%d:" % (
|
||||
data[4]+1))
|
||||
else:
|
||||
format = format.replace("{{cloze:", "{{ca:%d:" % (
|
||||
data[4]+1))
|
||||
format = re.sub("{{(.*?)cloze:", r"{{\1ca-%d:" % (data[4]+1), format)
|
||||
format = format.replace("<%cloze:", "<%%ca:%d:" % (
|
||||
data[4]+1))
|
||||
fields['FrontSide'] = stripSounds(d['q'])
|
||||
|
|
|
@ -569,7 +569,7 @@ select id from notes where mid = ?)""" % " ".join(map),
|
|||
sflds = splitFields(flds)
|
||||
map = self.fieldMap(m)
|
||||
ords = set()
|
||||
matches = re.findall("{{cloze:(.+?)}}", m['tmpls'][0]['qfmt'])
|
||||
matches = re.findall("{{[^}]*?cloze:(?:.*?:)*(.+?)}}", m['tmpls'][0]['qfmt'])
|
||||
matches += re.findall("<%cloze:(.+?)%>", m['tmpls'][0]['qfmt'])
|
||||
for fname in matches:
|
||||
if fname not in map:
|
||||
|
|
|
@ -158,40 +158,41 @@ class Template(object):
|
|||
return txt
|
||||
|
||||
# field modifiers
|
||||
parts = tag_name.split(':',2)
|
||||
parts = tag_name.split(':')
|
||||
extra = None
|
||||
if len(parts) == 1 or parts[0] == '':
|
||||
return '{unknown field %s}' % tag_name
|
||||
elif len(parts) == 2:
|
||||
(mod, tag) = parts
|
||||
elif len(parts) == 3:
|
||||
(mod, extra, tag) = parts
|
||||
else:
|
||||
mods, tag = parts[:-1], parts[-1] #py3k has *mods, tag = parts
|
||||
|
||||
txt = get_or_attr(context, tag)
|
||||
|
||||
# built-in modifiers
|
||||
if mod == 'text':
|
||||
# strip html
|
||||
if txt:
|
||||
return stripHTML(txt)
|
||||
return ""
|
||||
elif mod == 'type':
|
||||
# type answer field; convert it to [[type:...]] for the gui code
|
||||
# to process
|
||||
return "[[%s]]" % tag_name
|
||||
elif mod == 'cq' or mod == 'ca':
|
||||
# cloze deletion
|
||||
if txt and extra:
|
||||
return self.clozeText(txt, extra, mod[1])
|
||||
|
||||
#Since 'text:' and oths mods can affect html on which Anki relies to
|
||||
#process Clozes and Types, we need to make sure cloze/type are always
|
||||
#treated after all the other mods, regardless of how they're specified
|
||||
#in the template, so that {{cloze:text: == {{text:cloze:
|
||||
mods.sort(key=lambda s: s.startswith("cq-") or s.startswith("ca-") or s=="type")
|
||||
|
||||
for mod in mods:
|
||||
# built-in modifiers
|
||||
if mod == 'text':
|
||||
# strip html
|
||||
txt = stripHTML(txt) if txt else ""
|
||||
elif mod == 'type':
|
||||
# type answer field; convert it to [[type:...]] for the gui code
|
||||
# to process
|
||||
txt = "[[%s]]" % tag_name
|
||||
elif mod.startswith('cq-') or mod.startswith('ca-'):
|
||||
# cloze deletion
|
||||
mod, extra = mod.split("-")
|
||||
txt = self.clozeText(txt, extra, mod[1]) if txt and extra else ""
|
||||
else:
|
||||
return ""
|
||||
else:
|
||||
# hook-based field modifier
|
||||
txt = runFilter('fmod_' + mod, txt or '', extra, context,
|
||||
tag, tag_name);
|
||||
if txt is None:
|
||||
return '{unknown field %s}' % tag_name
|
||||
return txt
|
||||
# hook-based field modifier
|
||||
txt = runFilter('fmod_' + mod, txt or '', extra, context,
|
||||
tag, tag_name);
|
||||
if txt is None:
|
||||
return '{unknown field %s}' % tag_name
|
||||
return txt
|
||||
|
||||
def clozeText(self, txt, ord, type):
|
||||
reg = clozeReg
|
||||
|
|
Loading…
Reference in a new issue