mirror of
https://github.com/ankitects/anki.git
synced 2025-09-20 23:12:21 -04:00

- the local deck name must now match the online deck - syncName is a hash of the current deck's path or None - the hash is checked on deck load, and if it is different (because the deck was copied or moved), syncing is disabled. This should prevent people from accidentally clobbering their online decks
65 lines
1.8 KiB
Python
65 lines
1.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright: Damien Elmes <anki@ichi2.net>
|
|
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html
|
|
|
|
"""\
|
|
Hooks - hook management and tools for extending Anki
|
|
==============================================================================
|
|
|
|
To find available hooks, grep for runHook in the source code.
|
|
|
|
Instrumenting allows you to modify functions that don't have hooks available.
|
|
If you call wrap() with pos='around', the original function will not be called
|
|
automatically but can be called with _old().
|
|
"""
|
|
|
|
# Hooks
|
|
##############################################################################
|
|
|
|
_hooks = {}
|
|
|
|
def runHook(hook, *args):
|
|
"Run all functions on hook."
|
|
hook = _hooks.get(hook, None)
|
|
if hook:
|
|
for func in hook:
|
|
func(*args)
|
|
|
|
def runFilter(hook, arg, *args):
|
|
hook = _hooks.get(hook, None)
|
|
if hook:
|
|
for func in hook:
|
|
arg = func(arg, *args)
|
|
return arg
|
|
|
|
def addHook(hook, func):
|
|
"Add a function to hook. Ignore if already on hook."
|
|
if not _hooks.get(hook, None):
|
|
_hooks[hook] = []
|
|
if func not in _hooks[hook]:
|
|
_hooks[hook].append(func)
|
|
|
|
def removeHook(hook, func):
|
|
"Remove a function if is on hook."
|
|
hook = _hooks.get(hook, [])
|
|
if func in hook:
|
|
hook.remove(func)
|
|
|
|
def hookEmpty(hook):
|
|
return not _hooks.get(hook)
|
|
|
|
# Instrumenting
|
|
##############################################################################
|
|
|
|
def wrap(old, new, pos="after"):
|
|
"Override an existing function."
|
|
def repl(*args, **kwargs):
|
|
if pos == "after":
|
|
old(*args, **kwargs)
|
|
return new(*args, **kwargs)
|
|
elif pos == "before":
|
|
new(*args, **kwargs)
|
|
return old(*args, **kwargs)
|
|
else:
|
|
return new(_old=old, *args, **kwargs)
|
|
return repl
|