comment out the unused legacy code

This commit is contained in:
Damien Elmes 2020-01-17 10:51:36 +10:00
parent d3cc63efb0
commit b1c2d271d3
2 changed files with 198 additions and 204 deletions

View File

@ -2,198 +2,208 @@
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
"""
This file contains code that is no longer used by Anki, but left around
for the benefit of add-ons. It may go away in the future, so please copy
any routines you need into your own add-on instead of using them directly
from this module.
If your add-on was previously calling anki.template.render(), you now
need to call anki.template.render_template(), passing col in as the first
argument.
This file contains code that is no longer used by Anki. It is left around
for now as an example of how the stock field filters can be implemented using
the legacy addHook() API.
"""
from __future__ import annotations
import re
from typing import Any, Callable
from anki.lang import _
from anki.template import (
CLOZE_REGEX_MATCH_GROUP_CONTENT,
CLOZE_REGEX_MATCH_GROUP_HINT,
CLOZE_REGEX_MATCH_GROUP_TAG,
clozeReg,
)
from anki.utils import stripHTML
# Cloze filter
##########################################################################
def _clozeText(txt: str, ord: str, type: str) -> str:
"""Process the given Cloze deletion within the given template."""
reg = clozeReg
currentRegex = clozeReg % ord
if not re.search(currentRegex, txt):
# No Cloze deletion was found in txt.
return ""
txt = _removeFormattingFromMathjax(txt, ord)
def repl(m):
# replace chosen cloze with type
if type == "q":
if m.group(CLOZE_REGEX_MATCH_GROUP_HINT):
buf = "[%s]" % m.group(CLOZE_REGEX_MATCH_GROUP_HINT)
else:
buf = "[...]"
else:
buf = m.group(CLOZE_REGEX_MATCH_GROUP_CONTENT)
# uppercase = no formatting
if m.group(CLOZE_REGEX_MATCH_GROUP_TAG) == "c":
buf = "<span class=cloze>%s</span>" % buf
return buf
txt = re.sub(currentRegex, repl, txt)
# and display other clozes normally
return re.sub(reg % r"\d+", "\\2", txt)
def _removeFormattingFromMathjax(txt, ord) -> str:
"""Marks all clozes within MathJax to prevent formatting them.
Active Cloze deletions within MathJax should not be wrapped inside
a Cloze <span>, as that would interfere with MathJax.
This method finds all Cloze deletions number `ord` in `txt` which are
inside MathJax inline or display formulas, and replaces their opening
'{{c123' with a '{{C123'. The clozeText method interprets the upper-case
C as "don't wrap this Cloze in a <span>".
"""
creg = clozeReg.replace("(?si)", "")
# Scan the string left to right.
# After a MathJax opening - \( or \[ - flip in_mathjax to True.
# After a MathJax closing - \) or \] - flip in_mathjax to False.
# When a Cloze pattern number `ord` is found and we are in MathJax,
# replace its '{{c' with '{{C'.
#
# TODO: Report mismatching opens/closes - e.g. '\(\]'
# TODO: Report errors in this method better than printing to stdout.
# flags in middle of expression deprecated
in_mathjax = False
def replace(match):
nonlocal in_mathjax
if match.group("mathjax_open"):
if in_mathjax:
print("MathJax opening found while already in MathJax")
in_mathjax = True
elif match.group("mathjax_close"):
if not in_mathjax:
print("MathJax close found while not in MathJax")
in_mathjax = False
elif match.group("cloze"):
if in_mathjax:
return match.group(0).replace(
"{{c{}::".format(ord), "{{C{}::".format(ord)
)
else:
print("Unexpected: no expected capture group is present")
return match.group(0)
# The following regex matches one of:
# - MathJax opening
# - MathJax close
# - Cloze deletion number `ord`
return re.sub(
r"(?si)"
r"(?P<mathjax_open>\\[([])|"
r"(?P<mathjax_close>\\[\])])|"
r"(?P<cloze>" + (creg % ord) + ")",
replace,
txt,
)
def _cloze_filter(field_text: str, filter_args: str, q_or_a: str):
return _clozeText(field_text, filter_args, q_or_a)
def cloze_qfilter(field_text: str, filter_args: str, *args):
return _cloze_filter(field_text, filter_args, "q")
def cloze_afilter(field_text: str, filter_args: str, *args):
return _cloze_filter(field_text, filter_args, "a")
# from __future__ import annotations
#
# import re
# from typing import Any, Callable
#
# from anki.lang import _
# from anki.template import (
# CLOZE_REGEX_MATCH_GROUP_CONTENT,
# CLOZE_REGEX_MATCH_GROUP_HINT,
# CLOZE_REGEX_MATCH_GROUP_TAG,
# clozeReg,
# )
# from anki.utils import stripHTML
#
# # Cloze filter
# ##########################################################################
#
#
# def _clozeText(txt: str, ord: str, type: str) -> str:
# """Process the given Cloze deletion within the given template."""
# reg = clozeReg
# currentRegex = clozeReg % ord
# if not re.search(currentRegex, txt):
# # No Cloze deletion was found in txt.
# return ""
# txt = _removeFormattingFromMathjax(txt, ord)
#
# def repl(m):
# # replace chosen cloze with type
# if type == "q":
# if m.group(CLOZE_REGEX_MATCH_GROUP_HINT):
# buf = "[%s]" % m.group(CLOZE_REGEX_MATCH_GROUP_HINT)
# else:
# buf = "[...]"
# else:
# buf = m.group(CLOZE_REGEX_MATCH_GROUP_CONTENT)
# # uppercase = no formatting
# if m.group(CLOZE_REGEX_MATCH_GROUP_TAG) == "c":
# buf = "<span class=cloze>%s</span>" % buf
# return buf
#
# txt = re.sub(currentRegex, repl, txt)
# # and display other clozes normally
# return re.sub(reg % r"\d+", "\\2", txt)
#
#
# def _removeFormattingFromMathjax(txt, ord) -> str:
# """Marks all clozes within MathJax to prevent formatting them.
#
# Active Cloze deletions within MathJax should not be wrapped inside
# a Cloze <span>, as that would interfere with MathJax.
#
# This method finds all Cloze deletions number `ord` in `txt` which are
# inside MathJax inline or display formulas, and replaces their opening
# '{{c123' with a '{{C123'. The clozeText method interprets the upper-case
# C as "don't wrap this Cloze in a <span>".
# """
# creg = clozeReg.replace("(?si)", "")
#
# # Scan the string left to right.
# # After a MathJax opening - \( or \[ - flip in_mathjax to True.
# # After a MathJax closing - \) or \] - flip in_mathjax to False.
# # When a Cloze pattern number `ord` is found and we are in MathJax,
# # replace its '{{c' with '{{C'.
# #
# # TODO: Report mismatching opens/closes - e.g. '\(\]'
# # TODO: Report errors in this method better than printing to stdout.
# # flags in middle of expression deprecated
# in_mathjax = False
#
# def replace(match):
# nonlocal in_mathjax
# if match.group("mathjax_open"):
# if in_mathjax:
# print("MathJax opening found while already in MathJax")
# in_mathjax = True
# elif match.group("mathjax_close"):
# if not in_mathjax:
# print("MathJax close found while not in MathJax")
# in_mathjax = False
# elif match.group("cloze"):
# if in_mathjax:
# return match.group(0).replace(
# "{{c{}::".format(ord), "{{C{}::".format(ord)
# )
# else:
# print("Unexpected: no expected capture group is present")
# return match.group(0)
#
# # The following regex matches one of:
# # - MathJax opening
# # - MathJax close
# # - Cloze deletion number `ord`
# return re.sub(
# r"(?si)"
# r"(?P<mathjax_open>\\[([])|"
# r"(?P<mathjax_close>\\[\])])|"
# r"(?P<cloze>" + (creg % ord) + ")",
# replace,
# txt,
# )
#
# def test_remove_formatting_from_mathjax():
# assert _removeFormattingFromMathjax(r"\(2^{{c3::2}}\)", 3) == r"\(2^{{C3::2}}\)"
#
# txt = (
# r"{{c1::ok}} \(2^2\) {{c2::not ok}} \(2^{{c3::2}}\) \(x^3\) "
# r"{{c4::blah}} {{c5::text with \(x^2\) jax}}"
# )
# # Cloze 2 is not in MathJax, so it should not get protected against
# # formatting.
# assert _removeFormattingFromMathjax(txt, 2) == txt
#
# txt = r"\(a\) {{c1::b}} \[ {{c1::c}} \]"
# assert _removeFormattingFromMathjax(txt, 1) == (r"\(a\) {{c1::b}} \[ {{C1::c}} \]")
#
#
#
# def _cloze_filter(field_text: str, filter_args: str, q_or_a: str):
# return _clozeText(field_text, filter_args, q_or_a)
#
#
# def cloze_qfilter(field_text: str, filter_args: str, *args):
# return _cloze_filter(field_text, filter_args, "q")
#
#
# def cloze_afilter(field_text: str, filter_args: str, *args):
# return _cloze_filter(field_text, filter_args, "a")
#
#
# addHook("fmod_cq", cloze_qfilter)
# addHook("fmod_ca", cloze_afilter)
# Other filters
##########################################################################
def hint_filter(txt: str, args, context, tag: str, fullname) -> str:
if not txt.strip():
return ""
# random id
domid = "hint%d" % id(txt)
return """
<a class=hint href="#"
onclick="this.style.display='none';document.getElementById('%s').style.display='block';return false;">
%s</a><div id="%s" class=hint style="display: none">%s</div>
""" % (
domid,
_("Show %s") % tag,
domid,
txt,
)
FURIGANA_RE = r" ?([^ >]+?)\[(.+?)\]"
RUBY_REPL = r"<ruby><rb>\1</rb><rt>\2</rt></ruby>"
def replace_if_not_audio(repl: str) -> Callable[[Any], Any]:
def func(match):
if match.group(2).startswith("sound:"):
# return without modification
return match.group(0)
else:
return re.sub(FURIGANA_RE, repl, match.group(0))
return func
def without_nbsp(s: str) -> str:
return s.replace("&nbsp;", " ")
def kanji_filter(txt: str, *args) -> str:
return re.sub(FURIGANA_RE, replace_if_not_audio(r"\1"), without_nbsp(txt))
def kana_filter(txt: str, *args) -> str:
return re.sub(FURIGANA_RE, replace_if_not_audio(r"\2"), without_nbsp(txt))
def furigana_filter(txt: str, *args) -> str:
return re.sub(FURIGANA_RE, replace_if_not_audio(RUBY_REPL), without_nbsp(txt))
def text_filter(txt: str, *args) -> str:
return stripHTML(txt)
def type_answer_filter(txt: str, filter_args: str, context, tag: str, dummy) -> str:
# convert it to [[type:...]] for the gui code to process
if filter_args:
return f"[[type:{filter_args}:{tag}]]"
else:
return f"[[type:{tag}]]"
#
# # Other filters
# ##########################################################################
#
#
# def hint_filter(txt: str, args, context, tag: str, fullname) -> str:
# if not txt.strip():
# return ""
# # random id
# domid = "hint%d" % id(txt)
# return """
# <a class=hint href="#"
# onclick="this.style.display='none';document.getElementById('%s').style.display='block';return false;">
# %s</a><div id="%s" class=hint style="display: none">%s</div>
# """ % (
# domid,
# _("Show %s") % tag,
# domid,
# txt,
# )
#
#
# FURIGANA_RE = r" ?([^ >]+?)\[(.+?)\]"
# RUBY_REPL = r"<ruby><rb>\1</rb><rt>\2</rt></ruby>"
#
#
# def replace_if_not_audio(repl: str) -> Callable[[Any], Any]:
# def func(match):
# if match.group(2).startswith("sound:"):
# # return without modification
# return match.group(0)
# else:
# return re.sub(FURIGANA_RE, repl, match.group(0))
#
# return func
#
#
# def without_nbsp(s: str) -> str:
# return s.replace("&nbsp;", " ")
#
#
# def kanji_filter(txt: str, *args) -> str:
# return re.sub(FURIGANA_RE, replace_if_not_audio(r"\1"), without_nbsp(txt))
#
#
# def kana_filter(txt: str, *args) -> str:
# return re.sub(FURIGANA_RE, replace_if_not_audio(r"\2"), without_nbsp(txt))
#
#
# def furigana_filter(txt: str, *args) -> str:
# return re.sub(FURIGANA_RE, replace_if_not_audio(RUBY_REPL), without_nbsp(txt))
#
#
# def text_filter(txt: str, *args) -> str:
# return stripHTML(txt)
#
#
# def type_answer_filter(txt: str, filter_args: str, context, tag: str, dummy) -> str:
# # convert it to [[type:...]] for the gui code to process
# if filter_args:
# return f"[[type:{filter_args}:{tag}]]"
# else:
# return f"[[type:{tag}]]"
#
#
# addHook("fmod_text", text_filter)
# addHook("fmod_type", type_answer_filter)
# addHook("fmod_hint", hint_filter)

View File

@ -1,22 +1,6 @@
from anki.template_legacy import _removeFormattingFromMathjax
from tests.shared import getEmptyCol
def test_remove_formatting_from_mathjax():
assert _removeFormattingFromMathjax(r"\(2^{{c3::2}}\)", 3) == r"\(2^{{C3::2}}\)"
txt = (
r"{{c1::ok}} \(2^2\) {{c2::not ok}} \(2^{{c3::2}}\) \(x^3\) "
r"{{c4::blah}} {{c5::text with \(x^2\) jax}}"
)
# Cloze 2 is not in MathJax, so it should not get protected against
# formatting.
assert _removeFormattingFromMathjax(txt, 2) == txt
txt = r"\(a\) {{c1::b}} \[ {{c1::c}} \]"
assert _removeFormattingFromMathjax(txt, 1) == (r"\(a\) {{c1::b}} \[ {{C1::c}} \]")
def test_deferred_frontside():
d = getEmptyCol()
m = d.models.current()