From 237c0791f87c203194c85e4430a7311da7d99f99 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Wed, 15 Jan 2020 17:18:11 +1000 Subject: [PATCH] more hook tweaks, and merge the pre-render field and template hooks --- pylib/anki/collection.py | 12 ++--- pylib/anki/hooks.py | 94 ++++++++++++++++++---------------------- pylib/anki/template.py | 2 +- pylib/tools/genhooks.py | 18 ++++---- qt/aqt/browser.py | 2 +- qt/aqt/editor.py | 4 +- qt/aqt/gui_hooks.py | 16 +++---- qt/aqt/main.py | 2 +- qt/tools/genhooks_gui.py | 8 ++-- 9 files changed, 73 insertions(+), 85 deletions(-) diff --git a/pylib/anki/collection.py b/pylib/anki/collection.py index 884494fb5..09cbcb19c 100644 --- a/pylib/anki/collection.py +++ b/pylib/anki/collection.py @@ -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) diff --git a/pylib/anki/hooks.py b/pylib/anki/hooks.py index 78e876137..014596020 100644 --- a/pylib/anki/hooks.py +++ b/pylib/anki/hooks.py @@ -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: diff --git a/pylib/anki/template.py b/pylib/anki/template.py index d991bfbae..b483551a1 100644 --- a/pylib/anki/template.py +++ b/pylib/anki/template.py @@ -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 diff --git a/pylib/tools/genhooks.py b/pylib/tools/genhooks.py index 09ede6153..3a24eb790 100644 --- a/pylib/tools/genhooks.py +++ b/pylib/tools/genhooks.py @@ -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", diff --git a/qt/aqt/browser.py b/qt/aqt/browser.py index eb4363ce0..a420b916c 100644 --- a/qt/aqt/browser.py +++ b/qt/aqt/browser.py @@ -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 diff --git a/qt/aqt/editor.py b/qt/aqt/editor.py index c532db0f9..81dcfab78 100644 --- a/qt/aqt/editor.py +++ b/qt/aqt/editor.py @@ -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 diff --git a/qt/aqt/gui_hooks.py b/qt/aqt/gui_hooks.py index 8f8e9ff8c..bf27cefd9 100644 --- a/qt/aqt/gui_hooks.py +++ b/qt/aqt/gui_hooks.py @@ -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: diff --git a/qt/aqt/main.py b/qt/aqt/main.py index fe9c9811a..af55e0d91 100644 --- a/qt/aqt/main.py +++ b/qt/aqt/main.py @@ -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") diff --git a/qt/tools/genhooks_gui.py b/qt/tools/genhooks_gui.py index 5af72891b..36c635c5a 100644 --- a/qt/tools/genhooks_gui.py +++ b/qt/tools/genhooks_gui.py @@ -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", ),