more hook tweaks, and merge the pre-render field and template hooks

This commit is contained in:
Damien Elmes 2020-01-15 17:18:11 +10:00
parent cab572b63c
commit 237c0791f8
9 changed files with 73 additions and 85 deletions

View file

@ -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)

View file

@ -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:

View file

@ -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

View file

@ -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",

View file

@ -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

View file

@ -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

View file

@ -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:

View file

@ -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")

View file

@ -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",
),