summaryrefslogtreecommitdiff
path: root/sphinx/transforms
diff options
context:
space:
mode:
authorTakeshi KOMIYA <i.tkomiya@gmail.com>2020-02-24 01:23:07 +0900
committerTakeshi KOMIYA <i.tkomiya@gmail.com>2020-03-14 16:49:16 +0900
commit89c446eaf74b0f6cadb7fb42b9bcc29e9eab7e15 (patch)
tree1a0fbfc1c120e0b99b1d4a204b61a5891f9bbd39 /sphinx/transforms
parentf85b870ad59f39c8637160a4cd4d865ce1e1628e (diff)
downloadsphinx-git-89c446eaf74b0f6cadb7fb42b9bcc29e9eab7e15.tar.gz
Add desc_sig_element and inherited nodes
Diffstat (limited to 'sphinx/transforms')
-rw-r--r--sphinx/transforms/post_transforms/__init__.py35
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',