summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES2
-rw-r--r--doc/extdev/appapi.rst7
-rw-r--r--doc/theming.rst70
-rw-r--r--sphinx/application.py5
-rw-r--r--sphinx/theming.py22
5 files changed, 78 insertions, 28 deletions
diff --git a/CHANGES b/CHANGES
index 99e5e2285..f1d7eb741 100644
--- a/CHANGES
+++ b/CHANGES
@@ -162,6 +162,8 @@ Deprecated
removed at 1.7, and already its default value has changed from ``True`` to
``False``.
* #3221: epub2 builder is deprecated
+* #3628: ``sphinx_themes`` entry_point is deprecated. Please use
+ ``sphinx.html_themes`` instead.
Release 1.5.6 (in development)
==============================
diff --git a/doc/extdev/appapi.rst b/doc/extdev/appapi.rst
index 50b2af0f8..151bb2ed9 100644
--- a/doc/extdev/appapi.rst
+++ b/doc/extdev/appapi.rst
@@ -370,6 +370,13 @@ package.
.. versionadded:: 1.4
+.. method:: Sphinx.add_html_theme(name, theme_path)
+
+ Register a HTML Theme. The *name* is a name of theme, and *path* is a
+ full path to the theme (refs: :ref:`distribute-your-theme`).
+
+ .. versionadded:: 1.6
+
.. method:: Sphinx.add_env_collector(collector)
Register an environment collector class (refs: :ref:`collector-api`)
diff --git a/doc/theming.rst b/doc/theming.rst
index 1d895ec19..1236a85bf 100644
--- a/doc/theming.rst
+++ b/doc/theming.rst
@@ -46,34 +46,14 @@ file :file:`blue.zip`, you can put it right in the directory containing
html_theme = "blue"
html_theme_path = ["."]
-The third form provides your theme path dynamically to Sphinx if the
-``setuptools`` package is installed. You can provide an entry point section
-called ``sphinx_themes`` in your setup.py file and write a ``get_path`` function
-that has to return the directory with themes in it::
+The third form is a python package. If a theme you want to use is distributed
+as a python package, you can use it after installing::
- # 'setup.py'
+ # installing theme package
+ $ pip install sphinxjp.themes.dotted
- setup(
- ...
- entry_points = {
- 'sphinx_themes': [
- 'path = your_package:get_path',
- ]
- },
- ...
- )
-
- # 'your_package.py'
-
- from os import path
- package_dir = path.abspath(path.dirname(__file__))
- template_path = path.join(package_dir, 'themes')
-
- def get_path():
- return template_path
-
-.. versionadded:: 1.2
- 'sphinx_themes' entry_points feature.
+ # use it in your conf.py
+ html_theme = "dotted"
.. _builtin-themes:
@@ -310,6 +290,44 @@ Python :mod:`ConfigParser` module) and has the following structure:
and are accessible from all templates as ``theme_<name>``.
+.. _distribute-your-theme:
+
+Distribute your theme as a python package
+-----------------------------------------
+
+As a way to distribute your theme, you can use python package. Python package
+brings to users easy setting up ways.
+
+To distribute your theme as a python package, please define an entry point
+called ``sphinx.html_themes`` in your setup.py file, and write a ``setup()``
+function to register your themes in it::
+
+ # 'setup.py'
+ setup(
+ ...
+ entry_points = {
+ 'sphinx.html_themes': [
+ 'name_of_theme = your_package',
+ ]
+ },
+ ...
+ )
+
+ # 'your_package.py'
+ from os import path
+
+ def setup(app):
+ app.add_html_theme('name_of_theme', path.abspath(path.dirname(__file__)))
+
+.. versionadded:: 1.2
+ 'sphinx_themes' entry_points feature.
+
+.. deprecated:: 1.6
+ ``sphinx_themes`` entry_points has been deprecated.
+
+.. versionadded:: 1.6
+ ``sphinx.html_themes`` entry_points feature.
+
Templating
~~~~~~~~~~
diff --git a/sphinx/application.py b/sphinx/application.py
index 26126fb9c..edac70a99 100644
--- a/sphinx/application.py
+++ b/sphinx/application.py
@@ -800,6 +800,11 @@ class Sphinx(object):
logger.debug('[app] adding environment collector: %r', collector)
collector().enable(self)
+ def add_html_theme(self, name, theme_path):
+ # type: (unicode, unicode) -> None
+ logger.debug('[app] adding HTML theme: %r, %r', name, theme_path)
+ self.html_themes[name] = theme_path
+
class TemplateBridge(object):
"""
diff --git a/sphinx/theming.py b/sphinx/theming.py
index f0c7667d3..5e023e5a1 100644
--- a/sphinx/theming.py
+++ b/sphinx/theming.py
@@ -12,6 +12,7 @@
import os
import shutil
import tempfile
+import warnings
from os import path
from zipfile import ZipFile
@@ -20,7 +21,9 @@ from six import string_types, iteritems
from six.moves import configparser
from sphinx import package_dir
+from sphinx.deprecation import RemovedInSphinx20Warning
from sphinx.errors import ThemeError
+from sphinx.extension import load_extension
from sphinx.locale import _
from sphinx.util import logging
from sphinx.util.osutil import ensuredir
@@ -77,6 +80,8 @@ class Theme(object):
try:
inherit = self.config.get('theme', 'inherit')
+ except configparser.NoSectionError:
+ raise ThemeError(_('theme %r doesn\'t have "theme" setting') % name)
except configparser.NoOptionError:
raise ThemeError(_('theme %r doesn\'t have "inherit" setting') % name)
@@ -161,7 +166,7 @@ class HTMLThemeFactory(object):
def __init__(self, app):
# type: (Sphinx) -> None
- self.confdir = app.confdir
+ self.app = app
self.themes = app.html_themes
self.load_builtin_themes()
if getattr(app.config, 'html_theme_path', None):
@@ -178,7 +183,7 @@ class HTMLThemeFactory(object):
# type: (unicode) -> None
"""Load additional themes placed at specified directories."""
for theme_path in theme_paths:
- abs_theme_path = path.abspath(path.join(self.confdir, theme_path))
+ abs_theme_path = path.abspath(path.join(self.app.confdir, theme_path))
themes = self.find_themes(abs_theme_path)
for name, theme in iteritems(themes):
self.themes[name] = theme
@@ -215,6 +220,16 @@ class HTMLThemeFactory(object):
Sphinx refers to ``sphinx_themes`` entry_points.
"""
+ # look up for new styled entry_points at first
+ entry_points = pkg_resources.iter_entry_points('sphinx.html_themes', name)
+ try:
+ entry_point = next(entry_points)
+ load_extension(self.app, entry_point.module_name)
+ return
+ except StopIteration:
+ pass
+
+ # look up for old styled entry_points
for entry_point in pkg_resources.iter_entry_points('sphinx_themes'):
target = entry_point.load()
if callable(target):
@@ -228,6 +243,9 @@ class HTMLThemeFactory(object):
themes = self.find_themes(themedir)
for entry, theme in iteritems(themes):
if name == entry:
+ warnings.warn('``sphinx_themes`` entry point is now deprecated. '
+ 'Please use ``sphinx.html_themes`` instead.',
+ RemovedInSphinx20Warning)
self.themes[name] = theme
def find_themes(self, theme_path):