diff options
Diffstat (limited to 'src/pallets_sphinx_themes/theme_check.py')
-rw-r--r-- | src/pallets_sphinx_themes/theme_check.py | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/pallets_sphinx_themes/theme_check.py b/src/pallets_sphinx_themes/theme_check.py new file mode 100644 index 0000000..c7c0192 --- /dev/null +++ b/src/pallets_sphinx_themes/theme_check.py @@ -0,0 +1,50 @@ +from functools import wraps + + +def set_is_pallets_theme(app): + """Set the ``is_pallets_theme`` config to ``True`` if the current + theme is a decedent of the ``pocoo`` theme. + """ + if app.config.is_pallets_theme is not None: + return + + theme = getattr(app.builder, "theme", None) + + while theme is not None: + if theme.name == "pocoo": + app.config.is_pallets_theme = True + break + + theme = theme.base + else: + app.config.is_pallets_theme = False + + +def only_pallets_theme(default=None): + """Create a decorator that calls a function only if the + ``is_pallets_theme`` config is ``True``. + + Used to prevent Sphinx event callbacks from doing anything if the + Pallets themes are installed but not used. :: + + @only_pallets_theme() + def inject_value(app): + ... + + app.connect("builder-inited", inject_value) + + :param default: Value to return if a Pallets theme is not in use. + :return: A decorator. + """ + + def decorator(f): + @wraps(f) + def wrapped(app, *args, **kwargs): + if not app.config.is_pallets_theme: + return default + + return f(app, *args, **kwargs) + + return wrapped + + return decorator |