mirror of
https://github.com/ankitects/anki.git
synced 2025-09-19 06:22:22 -04:00
more hook tweaks, and merge the pre-render field and template hooks
This commit is contained in:
parent
cab572b63c
commit
237c0791f8
9 changed files with 73 additions and 85 deletions
|
@ -664,13 +664,13 @@ where c.nid = n.id and c.id in %s group by nid"""
|
|||
fields["CardFlag"] = self._flagNameFromCardFlags(flag)
|
||||
fields["c%d" % (card_ord + 1)] = "1"
|
||||
|
||||
# allow add-ons to modify the available fields
|
||||
hooks.fields_will_render(fields, model, data)
|
||||
fields = runFilter("mungeFields", fields, model, data, self) # legacy
|
||||
# legacy
|
||||
fields = runFilter("mungeFields", fields, model, data, self)
|
||||
|
||||
# and the template prior to rendering
|
||||
qfmt = hooks.card_template_will_render(qfmt, True)
|
||||
afmt = hooks.card_template_will_render(afmt, False)
|
||||
# allow add-ons to modify the available fields & templates
|
||||
(qfmt, afmt) = hooks.card_template_will_render(
|
||||
(qfmt, afmt), fields, model, data
|
||||
)
|
||||
|
||||
# render fields
|
||||
qatext = render_card(self, qfmt, afmt, fields, card_ord)
|
||||
|
|
|
@ -153,55 +153,48 @@ class _CardTemplateDidRenderFilter:
|
|||
card_template_did_render = _CardTemplateDidRenderFilter()
|
||||
|
||||
|
||||
class _CardTemplateFilterWillApplyFilter:
|
||||
_hooks: List[Callable[[str, str, str, Dict[str, str]], str]] = []
|
||||
class _CardTemplateWillRenderFilter:
|
||||
"""Can modify the available fields and question/answer templates prior to rendering."""
|
||||
|
||||
def append(self, cb: Callable[[str, str, str, Dict[str, str]], str]) -> None:
|
||||
"""(field_text: str, field_name: str, filter_name: str, fields: Dict[str, str])"""
|
||||
_hooks: List[
|
||||
Callable[
|
||||
[Tuple[str, str], Dict[str, str], Dict[str, Any], QAData], Tuple[str, str]
|
||||
]
|
||||
] = []
|
||||
|
||||
def append(
|
||||
self,
|
||||
cb: Callable[
|
||||
[Tuple[str, str], Dict[str, str], Dict[str, Any], QAData], Tuple[str, str]
|
||||
],
|
||||
) -> None:
|
||||
"""(templates: Tuple[str, str], fields: Dict[str, str], notetype: Dict[str, Any], data: QAData)"""
|
||||
self._hooks.append(cb)
|
||||
|
||||
def remove(self, cb: Callable[[str, str, str, Dict[str, str]], str]) -> None:
|
||||
def remove(
|
||||
self,
|
||||
cb: Callable[
|
||||
[Tuple[str, str], Dict[str, str], Dict[str, Any], QAData], Tuple[str, str]
|
||||
],
|
||||
) -> None:
|
||||
if cb in self._hooks:
|
||||
self._hooks.remove(cb)
|
||||
|
||||
def __call__(
|
||||
self, field_text: str, field_name: str, filter_name: str, fields: Dict[str, str]
|
||||
) -> str:
|
||||
self,
|
||||
templates: Tuple[str, str],
|
||||
fields: Dict[str, str],
|
||||
notetype: Dict[str, Any],
|
||||
data: QAData,
|
||||
) -> Tuple[str, str]:
|
||||
for filter in self._hooks:
|
||||
try:
|
||||
field_text = filter(field_text, field_name, filter_name, fields)
|
||||
templates = filter(templates, fields, notetype, data)
|
||||
except:
|
||||
# if the hook fails, remove it
|
||||
self._hooks.remove(filter)
|
||||
raise
|
||||
return field_text
|
||||
|
||||
|
||||
card_template_filter_will_apply = _CardTemplateFilterWillApplyFilter()
|
||||
|
||||
|
||||
class _CardTemplateWillRenderFilter:
|
||||
"""Can modify the the card template used for rendering."""
|
||||
|
||||
_hooks: List[Callable[[str, bool], str]] = []
|
||||
|
||||
def append(self, cb: Callable[[str, bool], str]) -> None:
|
||||
"""(template: str, question_side: bool)"""
|
||||
self._hooks.append(cb)
|
||||
|
||||
def remove(self, cb: Callable[[str, bool], str]) -> None:
|
||||
if cb in self._hooks:
|
||||
self._hooks.remove(cb)
|
||||
|
||||
def __call__(self, template: str, question_side: bool) -> str:
|
||||
for filter in self._hooks:
|
||||
try:
|
||||
template = filter(template, question_side)
|
||||
except:
|
||||
# if the hook fails, remove it
|
||||
self._hooks.remove(filter)
|
||||
raise
|
||||
return template
|
||||
return templates
|
||||
|
||||
|
||||
card_template_will_render = _CardTemplateWillRenderFilter()
|
||||
|
@ -259,36 +252,31 @@ class _ExportersListDidCreateHook:
|
|||
exporters_list_did_create = _ExportersListDidCreateHook()
|
||||
|
||||
|
||||
class _FieldsWillRenderHook:
|
||||
"""Can modify the available fields prior to rendering."""
|
||||
class _FieldWillBeFilteredFilter:
|
||||
_hooks: List[Callable[[str, str, str, Dict[str, str]], str]] = []
|
||||
|
||||
_hooks: List[Callable[[Dict[str, str], Dict[str, Any], QAData], None]] = []
|
||||
|
||||
def append(
|
||||
self, cb: Callable[[Dict[str, str], Dict[str, Any], QAData], None]
|
||||
) -> None:
|
||||
"""(fields: Dict[str, str], notetype: Dict[str, Any], data: QAData)"""
|
||||
def append(self, cb: Callable[[str, str, str, Dict[str, str]], str]) -> None:
|
||||
"""(field_text: str, field_name: str, filter_name: str, fields: Dict[str, str])"""
|
||||
self._hooks.append(cb)
|
||||
|
||||
def remove(
|
||||
self, cb: Callable[[Dict[str, str], Dict[str, Any], QAData], None]
|
||||
) -> None:
|
||||
def remove(self, cb: Callable[[str, str, str, Dict[str, str]], str]) -> None:
|
||||
if cb in self._hooks:
|
||||
self._hooks.remove(cb)
|
||||
|
||||
def __call__(
|
||||
self, fields: Dict[str, str], notetype: Dict[str, Any], data: QAData
|
||||
) -> None:
|
||||
for hook in self._hooks:
|
||||
self, field_text: str, field_name: str, filter_name: str, fields: Dict[str, str]
|
||||
) -> str:
|
||||
for filter in self._hooks:
|
||||
try:
|
||||
hook(fields, notetype, data)
|
||||
field_text = filter(field_text, field_name, filter_name, fields)
|
||||
except:
|
||||
# if the hook fails, remove it
|
||||
self._hooks.remove(hook)
|
||||
self._hooks.remove(filter)
|
||||
raise
|
||||
return field_text
|
||||
|
||||
|
||||
fields_will_render = _FieldsWillRenderHook()
|
||||
field_will_be_filtered = _FieldWillBeFilteredFilter()
|
||||
|
||||
|
||||
class _HttpDataDidReceiveHook:
|
||||
|
|
|
@ -72,7 +72,7 @@ def apply_custom_filters(
|
|||
|
||||
field_text = node.current_text
|
||||
for filter_name in node.filters:
|
||||
field_text = hooks.card_template_filter_will_apply(
|
||||
field_text = hooks.field_will_be_filtered(
|
||||
field_text, node.field_name, filter_name, fields
|
||||
)
|
||||
# legacy hook - the second and fifth argument are no longer used
|
||||
|
|
|
@ -58,16 +58,16 @@ hooks = [
|
|||
legacy_hook="newTag",
|
||||
legacy_no_args=True,
|
||||
),
|
||||
Hook(
|
||||
name="fields_will_render",
|
||||
args=["fields: Dict[str, str]", "notetype: Dict[str, Any]", "data: QAData",],
|
||||
doc="Can modify the available fields prior to rendering.",
|
||||
),
|
||||
Hook(
|
||||
name="card_template_will_render",
|
||||
args=["template: str", "question_side: bool"],
|
||||
return_type="str",
|
||||
doc="Can modify the the card template used for rendering.",
|
||||
args=[
|
||||
"templates: Tuple[str, str]",
|
||||
"fields: Dict[str, str]",
|
||||
"notetype: Dict[str, Any]",
|
||||
"data: QAData",
|
||||
],
|
||||
return_type="Tuple[str, str]",
|
||||
doc="Can modify the available fields and question/answer templates prior to rendering.",
|
||||
),
|
||||
Hook(
|
||||
name="card_template_did_render",
|
||||
|
@ -86,7 +86,7 @@ hooks = [
|
|||
doc="Can modify the resulting text after rendering completes.",
|
||||
),
|
||||
Hook(
|
||||
name="card_template_filter_will_apply",
|
||||
name="field_will_be_filtered",
|
||||
args=[
|
||||
"field_text: str",
|
||||
"field_name: str",
|
||||
|
|
|
@ -639,7 +639,7 @@ class Browser(QMainWindow):
|
|||
self.pgDownCut = QShortcut(QKeySequence("Shift+End"), self)
|
||||
self.pgDownCut.activated.connect(self.onLastCard)
|
||||
# add-on hook
|
||||
gui_hooks.browser_menus_did_setup(self)
|
||||
gui_hooks.browser_menus_did_init(self)
|
||||
self.mw.maybeHideAccelerators(self)
|
||||
|
||||
# context menu
|
||||
|
|
|
@ -141,7 +141,7 @@ class Editor:
|
|||
self._addButton("more", "more"),
|
||||
]
|
||||
)
|
||||
gui_hooks.editor_buttons_did_setup(righttopbtns, self)
|
||||
gui_hooks.editor_buttons_did_init(righttopbtns, self)
|
||||
# legacy filter
|
||||
righttopbtns = runFilter("setupEditorButtons", righttopbtns, self)
|
||||
topbuts = """
|
||||
|
@ -285,7 +285,7 @@ class Editor:
|
|||
("Ctrl+Shift+X", self.onHtmlEdit),
|
||||
("Ctrl+Shift+T", self.onFocusTags, True),
|
||||
]
|
||||
gui_hooks.editor_shortcuts_did_setup(cuts, self)
|
||||
gui_hooks.editor_shortcuts_did_init(cuts, self)
|
||||
for row in cuts:
|
||||
if len(row) == 2:
|
||||
keys, fn = row # pylint: disable=unbalanced-tuple-unpacking
|
||||
|
|
|
@ -101,7 +101,7 @@ class _BrowserContextMenuWillShowHook:
|
|||
browser_context_menu_will_show = _BrowserContextMenuWillShowHook()
|
||||
|
||||
|
||||
class _BrowserMenusDidSetupHook:
|
||||
class _BrowserMenusDidInitHook:
|
||||
_hooks: List[Callable[["aqt.browser.Browser"], None]] = []
|
||||
|
||||
def append(self, cb: Callable[["aqt.browser.Browser"], None]) -> None:
|
||||
|
@ -124,7 +124,7 @@ class _BrowserMenusDidSetupHook:
|
|||
runHook("browser.setupMenus", browser)
|
||||
|
||||
|
||||
browser_menus_did_setup = _BrowserMenusDidSetupHook()
|
||||
browser_menus_did_init = _BrowserMenusDidInitHook()
|
||||
|
||||
|
||||
class _BrowserRowDidChangeHook:
|
||||
|
@ -260,7 +260,7 @@ class _DeckBrowserOptionsMenuWillShowHook:
|
|||
deck_browser_options_menu_will_show = _DeckBrowserOptionsMenuWillShowHook()
|
||||
|
||||
|
||||
class _EditorButtonsDidSetupHook:
|
||||
class _EditorButtonsDidInitHook:
|
||||
_hooks: List[Callable[[List, "aqt.editor.Editor"], None]] = []
|
||||
|
||||
def append(self, cb: Callable[[List, "aqt.editor.Editor"], None]) -> None:
|
||||
|
@ -281,7 +281,7 @@ class _EditorButtonsDidSetupHook:
|
|||
raise
|
||||
|
||||
|
||||
editor_buttons_did_setup = _EditorButtonsDidSetupHook()
|
||||
editor_buttons_did_init = _EditorButtonsDidInitHook()
|
||||
|
||||
|
||||
class _EditorContextMenuWillShowHook:
|
||||
|
@ -418,7 +418,7 @@ class _EditorNoteDidLoadHook:
|
|||
editor_note_did_load = _EditorNoteDidLoadHook()
|
||||
|
||||
|
||||
class _EditorShortcutsDidSetupHook:
|
||||
class _EditorShortcutsDidInitHook:
|
||||
_hooks: List[Callable[[List[Tuple], "aqt.editor.Editor"], None]] = []
|
||||
|
||||
def append(self, cb: Callable[[List[Tuple], "aqt.editor.Editor"], None]) -> None:
|
||||
|
@ -441,7 +441,7 @@ class _EditorShortcutsDidSetupHook:
|
|||
runHook("setupEditorShortcuts", shortcuts, editor)
|
||||
|
||||
|
||||
editor_shortcuts_did_setup = _EditorShortcutsDidSetupHook()
|
||||
editor_shortcuts_did_init = _EditorShortcutsDidInitHook()
|
||||
|
||||
|
||||
class _EditorTagsDidUpdateHook:
|
||||
|
@ -862,7 +862,7 @@ class _StateWillChangeHook:
|
|||
state_will_change = _StateWillChangeHook()
|
||||
|
||||
|
||||
class _StyleDidSetupFilter:
|
||||
class _StyleDidInitFilter:
|
||||
_hooks: List[Callable[[str], str]] = []
|
||||
|
||||
def append(self, cb: Callable[[str], str]) -> None:
|
||||
|
@ -886,7 +886,7 @@ class _StyleDidSetupFilter:
|
|||
return style
|
||||
|
||||
|
||||
style_did_setup = _StyleDidSetupFilter()
|
||||
style_did_init = _StyleDidInitFilter()
|
||||
|
||||
|
||||
class _UndoStateDidChangeHook:
|
||||
|
|
|
@ -847,7 +847,7 @@ QTreeWidget {
|
|||
"""
|
||||
|
||||
# allow addons to modify the styling
|
||||
buf = gui_hooks.style_did_setup(buf)
|
||||
buf = gui_hooks.style_did_init(buf)
|
||||
|
||||
# allow users to extend styling
|
||||
p = os.path.join(aqt.mw.pm.base, "style.css")
|
||||
|
|
|
@ -51,7 +51,7 @@ hooks = [
|
|||
# Browser
|
||||
###################
|
||||
Hook(
|
||||
name="browser_menus_did_setup",
|
||||
name="browser_menus_did_init",
|
||||
args=["browser: aqt.browser.Browser"],
|
||||
legacy_hook="browser.setupMenus",
|
||||
),
|
||||
|
@ -112,7 +112,7 @@ hooks = [
|
|||
),
|
||||
Hook(name="review_did_undo", args=["card_id: int"], legacy_hook="revertedCard"),
|
||||
Hook(
|
||||
name="style_did_setup",
|
||||
name="style_did_init",
|
||||
args=["style: str"],
|
||||
return_type="str",
|
||||
legacy_hook="setupStyle",
|
||||
|
@ -132,11 +132,11 @@ hooks = [
|
|||
# Editing
|
||||
###################
|
||||
Hook(
|
||||
name="editor_buttons_did_setup",
|
||||
name="editor_buttons_did_init",
|
||||
args=["buttons: List", "editor: aqt.editor.Editor"],
|
||||
),
|
||||
Hook(
|
||||
name="editor_shortcuts_did_setup",
|
||||
name="editor_shortcuts_did_init",
|
||||
args=["shortcuts: List[Tuple]", "editor: aqt.editor.Editor"],
|
||||
legacy_hook="setupEditorShortcuts",
|
||||
),
|
||||
|
|
Loading…
Reference in a new issue