diff options
| author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2020-02-24 01:23:07 +0900 |
|---|---|---|
| committer | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2020-03-14 16:49:16 +0900 |
| commit | 89c446eaf74b0f6cadb7fb42b9bcc29e9eab7e15 (patch) | |
| tree | 1a0fbfc1c120e0b99b1d4a204b61a5891f9bbd39 /sphinx/transforms | |
| parent | f85b870ad59f39c8637160a4cd4d865ce1e1628e (diff) | |
| download | sphinx-git-89c446eaf74b0f6cadb7fb42b9bcc29e9eab7e15.tar.gz | |
Add desc_sig_element and inherited nodes
Diffstat (limited to 'sphinx/transforms')
| -rw-r--r-- | sphinx/transforms/post_transforms/__init__.py | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/sphinx/transforms/post_transforms/__init__.py b/sphinx/transforms/post_transforms/__init__.py index 6d7c3b0eb..48f5dc248 100644 --- a/sphinx/transforms/post_transforms/__init__.py +++ b/sphinx/transforms/post_transforms/__init__.py @@ -8,7 +8,7 @@ :license: BSD, see LICENSE for details. """ -from typing import Any, Dict, List, Tuple +from typing import Any, Dict, List, Tuple, Type from typing import cast from docutils import nodes @@ -22,6 +22,7 @@ from sphinx.errors import NoUri from sphinx.locale import __ from sphinx.transforms import SphinxTransform from sphinx.util import logging +from sphinx.util.docutils import SphinxTranslator from sphinx.util.nodes import process_only_nodes @@ -186,9 +187,41 @@ class OnlyNodeTransform(SphinxPostTransform): process_only_nodes(self.document, self.app.builder.tags) +class SigElementFallbackTransform(SphinxPostTransform): + """Fallback desc_sig_element nodes to inline if translator does not supported them.""" + default_priority = 200 + + SIG_ELEMENTS = [addnodes.desc_sig_name, + addnodes.desc_sig_operator, + addnodes.desc_sig_punctuation] + + def run(self, **kwargs: Any) -> None: + def has_visitor(translator: Type[nodes.NodeVisitor], node: Type[Element]) -> bool: + return hasattr(translator, "visit_%s" % node.__name__) + + translator = self.app.builder.get_translator_class() + if isinstance(translator, SphinxTranslator): + # subclass of SphinxTranslator supports desc_sig_element nodes automatically. + return + + if all(has_visitor(translator, node) for node in self.SIG_ELEMENTS): + # the translator supports all desc_sig_element nodes + return + else: + self.fallback() + + def fallback(self): + for node in self.document.traverse(addnodes.desc_sig_element): + newnode = nodes.inline() + newnode.update_all_atts(node) + newnode.extend(node) + node.replace_self(newnode) + + def setup(app: Sphinx) -> Dict[str, Any]: app.add_post_transform(ReferencesResolver) app.add_post_transform(OnlyNodeTransform) + app.add_post_transform(SigElementFallbackTransform) return { 'version': 'builtin', |
