mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
refactor: Store enumerable_nodes to registry
This commit is contained in:
parent
1ffa537b1c
commit
18efa1a63a
@ -56,7 +56,7 @@ if TYPE_CHECKING:
|
||||
from sphinx.extension import Extension # NOQA
|
||||
from sphinx.roles import XRefRole # NOQA
|
||||
from sphinx.theming import Theme # NOQA
|
||||
from sphinx.util.typing import RoleFunction # NOQA
|
||||
from sphinx.util.typing import RoleFunction, TitleGetter # NOQA
|
||||
|
||||
builtin_extensions = (
|
||||
'sphinx.builders.applehelp',
|
||||
@ -132,7 +132,6 @@ class Sphinx(object):
|
||||
self.builder = None # type: Builder
|
||||
self.env = None # type: BuildEnvironment
|
||||
self.registry = SphinxComponentRegistry()
|
||||
self.enumerable_nodes = {} # type: Dict[nodes.Node, Tuple[unicode, Callable]] # NOQA
|
||||
self.html_themes = {} # type: Dict[unicode, unicode]
|
||||
|
||||
# validate provided directories
|
||||
@ -252,8 +251,6 @@ class Sphinx(object):
|
||||
self._init_env(freshenv)
|
||||
# set up the builder
|
||||
self._init_builder()
|
||||
# set up the enumerable nodes
|
||||
self._init_enumerable_nodes()
|
||||
|
||||
def _init_i18n(self):
|
||||
# type: () -> None
|
||||
@ -323,11 +320,6 @@ class Sphinx(object):
|
||||
self.builder.init()
|
||||
self.emit('builder-inited')
|
||||
|
||||
def _init_enumerable_nodes(self):
|
||||
# type: () -> None
|
||||
for node, settings in iteritems(self.enumerable_nodes):
|
||||
self.env.get_domain('std').enumerable_nodes[node] = settings # type: ignore
|
||||
|
||||
# ---- main "build" method -------------------------------------------------
|
||||
|
||||
def build(self, force_all=False, filenames=None):
|
||||
@ -661,7 +653,7 @@ class Sphinx(object):
|
||||
setattr(translator, 'depart_' + node.__name__, depart)
|
||||
|
||||
def add_enumerable_node(self, node, figtype, title_getter=None, **kwds):
|
||||
# type: (nodes.Node, unicode, Callable, Any) -> None
|
||||
# type: (nodes.Node, unicode, TitleGetter, Any) -> None
|
||||
"""Register a Docutils node class as a numfig target.
|
||||
|
||||
Sphinx numbers the node automatically. And then the users can refer it
|
||||
@ -685,9 +677,17 @@ class Sphinx(object):
|
||||
|
||||
.. versionadded:: 1.4
|
||||
"""
|
||||
self.enumerable_nodes[node] = (figtype, title_getter)
|
||||
self.registry.add_enumerable_node(node, figtype, title_getter)
|
||||
self.add_node(node, **kwds)
|
||||
|
||||
@property
|
||||
def enumerable_nodes(self):
|
||||
# type: () -> Dict[nodes.Node, Tuple[unicode, TitleGetter]]
|
||||
warnings.warn('app.enumerable_nodes() is deprecated. '
|
||||
'Use app.get_domain("std").enumerable_nodes instead.',
|
||||
RemovedInSphinx30Warning)
|
||||
return self.registry.enumerable_nodes
|
||||
|
||||
def add_directive(self, name, obj, content=None, arguments=None, **options):
|
||||
# type: (unicode, Any, bool, Tuple[int, int, bool], Any) -> None
|
||||
"""Register a Docutils directive.
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
import re
|
||||
import unicodedata
|
||||
from copy import copy
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from docutils import nodes
|
||||
@ -522,6 +523,15 @@ class StandardDomain(Domain):
|
||||
nodes.container: ('code-block', None),
|
||||
} # type: Dict[nodes.Node, Tuple[unicode, Callable]]
|
||||
|
||||
def __init__(self, env):
|
||||
# type: (BuildEnvironment) -> None
|
||||
super(StandardDomain, self).__init__(env)
|
||||
|
||||
# set up enumerable nodes
|
||||
self.enumerable_nodes = copy(self.enumerable_nodes) # create a copy for this instance
|
||||
for node, settings in iteritems(env.app.registry.enumerable_nodes):
|
||||
self.enumerable_nodes[node] = settings
|
||||
|
||||
def clear_doc(self, docname):
|
||||
# type: (unicode) -> None
|
||||
for key, (fn, _l) in list(self.data['progoptions'].items()):
|
||||
|
@ -40,7 +40,7 @@ if TYPE_CHECKING:
|
||||
from sphinx.domains import Domain, Index # NOQA
|
||||
from sphinx.environment import BuildEnvironment # NOQA
|
||||
from sphinx.ext.autodoc import Documenter # NOQA
|
||||
from sphinx.util.typing import RoleFunction # NOQA
|
||||
from sphinx.util.typing import RoleFunction, TitleGetter # NOQA
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@ -82,6 +82,10 @@ class SphinxComponentRegistry(object):
|
||||
#: a dict of domain name -> dict of role name -> role impl.
|
||||
self.domain_roles = {} # type: Dict[unicode, Dict[unicode, Union[RoleFunction, XRefRole]]] # NOQA
|
||||
|
||||
#: additional enumerable nodes
|
||||
#: a dict of node class -> tuple of figtype and title_getter function
|
||||
self.enumerable_nodes = {} # type: Dict[nodes.Node, Tuple[unicode, TitleGetter]]
|
||||
|
||||
#: LaTeX packages; list of package names and its options
|
||||
self.latex_packages = [] # type: List[Tuple[unicode, unicode]]
|
||||
|
||||
@ -349,6 +353,11 @@ class SphinxComponentRegistry(object):
|
||||
logger.debug('[app] adding latex package: %r', name)
|
||||
self.latex_packages.append((name, options))
|
||||
|
||||
def add_enumerable_node(self, node, figtype, title_getter=None):
|
||||
# type: (nodes.Node, unicode, TitleGetter) -> None
|
||||
logger.debug('[app] adding enumerable node: (%r, %r, %r)', node, figtype, title_getter)
|
||||
self.enumerable_nodes[node] = (figtype, title_getter)
|
||||
|
||||
def load_extension(self, app, extname):
|
||||
# type: (Sphinx, unicode) -> None
|
||||
"""Load a Sphinx extension."""
|
||||
|
@ -22,3 +22,6 @@ if PY3:
|
||||
# common role functions
|
||||
RoleFunction = Callable[[unicode, unicode, unicode, int, Inliner, Dict, List[unicode]],
|
||||
Tuple[List[nodes.Node], List[nodes.Node]]]
|
||||
|
||||
# title getter functions for enumerable nodes (see sphinx.domains.std)
|
||||
TitleGetter = Callable[[nodes.Node], unicode]
|
||||
|
@ -17,6 +17,7 @@ from sphinx.domains.std import StandardDomain
|
||||
|
||||
def test_process_doc_handle_figure_caption():
|
||||
env = mock.Mock(domaindata={})
|
||||
env.app.registry.enumerable_nodes = {}
|
||||
figure_node = nodes.figure(
|
||||
'',
|
||||
nodes.caption('caption text', 'caption text'),
|
||||
@ -40,6 +41,7 @@ def test_process_doc_handle_figure_caption():
|
||||
|
||||
def test_process_doc_handle_table_title():
|
||||
env = mock.Mock(domaindata={})
|
||||
env.app.registry.enumerable_nodes = {}
|
||||
table_node = nodes.table(
|
||||
'',
|
||||
nodes.title('title text', 'title text'),
|
||||
@ -63,6 +65,7 @@ def test_process_doc_handle_table_title():
|
||||
|
||||
def test_get_full_qualified_name():
|
||||
env = mock.Mock(domaindata={})
|
||||
env.app.registry.enumerable_nodes = {}
|
||||
domain = StandardDomain(env)
|
||||
|
||||
# normal references
|
||||
|
Loading…
Reference in New Issue
Block a user