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