summaryrefslogtreecommitdiffstats
path: root/src/pallets_sphinx_themes/theme_check.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/pallets_sphinx_themes/theme_check.py')
-rw-r--r--src/pallets_sphinx_themes/theme_check.py50
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