Decl styling, update writers

Add test objects so all builders gets exposed to the new nodes.
Make the fallback node post-transform change desc_inline as well.
Make the html4, latex, and text writers handle desc_inline.
This commit is contained in:
Jakob Lykke Andersen
2021-03-25 19:42:50 +01:00
parent c0ef6a9265
commit 7126503eeb
6 changed files with 101 additions and 40 deletions

View File

@@ -206,7 +206,7 @@ class OnlyNodeTransform(SphinxPostTransform):
class SigElementFallbackTransform(SphinxPostTransform): class SigElementFallbackTransform(SphinxPostTransform):
"""Fallback desc_sig_element nodes to inline if translator does not supported them.""" """Fallback various desc_* nodes to inline if translator does not supported them."""
default_priority = 200 default_priority = 200
def run(self, **kwargs: Any) -> None: def run(self, **kwargs: Any) -> None:
@@ -218,14 +218,15 @@ class SigElementFallbackTransform(SphinxPostTransform):
# subclass of SphinxTranslator supports desc_sig_element nodes automatically. # subclass of SphinxTranslator supports desc_sig_element nodes automatically.
return return
if all(has_visitor(translator, node) for node in addnodes.SIG_ELEMENTS): # for the leaf elements (desc_sig_element), the translator should support _all_
# the translator supports all desc_sig_element nodes if not all(has_visitor(translator, node) for node in addnodes.SIG_ELEMENTS):
return self.fallback(addnodes.desc_sig_element)
else:
self.fallback()
def fallback(self) -> None: if not has_visitor(translator, addnodes.desc_inline):
for node in self.document.traverse(addnodes.desc_sig_element): self.fallback(addnodes.desc_inline)
def fallback(self, nodeType: Any) -> None:
for node in self.document.traverse(nodeType):
newnode = nodes.inline() newnode = nodes.inline()
newnode.update_all_atts(node) newnode.update_all_atts(node)
newnode.extend(node) newnode.extend(node)

View File

@@ -146,6 +146,12 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
def depart_desc_content(self, node: Element) -> None: def depart_desc_content(self, node: Element) -> None:
self.body.append('</dd>') self.body.append('</dd>')
def visit_desc_inline(self, node: Element) -> None:
self.body.append(self.starttag(node, 'span', ''))
def depart_desc_inline(self, node: Element) -> None:
self.body.append('</span>')
# Nodes for high-level structure in signatures # Nodes for high-level structure in signatures
############################################## ##############################################

View File

@@ -698,6 +698,13 @@ class LaTeXTranslator(SphinxTranslator):
def depart_subtitle(self, node: Element) -> None: def depart_subtitle(self, node: Element) -> None:
self.body.append(self.context.pop()) self.body.append(self.context.pop())
#############################################################
# Domain-specific object descriptions
#############################################################
# Top-level nodes for descriptions
##################################
def visit_desc(self, node: Element) -> None: def visit_desc(self, node: Element) -> None:
if self.config.latex_show_urls == 'footnote': if self.config.latex_show_urls == 'footnote':
self.body.append(BLANKLINE) self.body.append(BLANKLINE)
@@ -750,6 +757,31 @@ class LaTeXTranslator(SphinxTranslator):
def depart_desc_signature_line(self, node: Element) -> None: def depart_desc_signature_line(self, node: Element) -> None:
self._depart_signature_line(node) self._depart_signature_line(node)
def visit_desc_content(self, node: Element) -> None:
if node.children and not isinstance(node.children[0], nodes.paragraph):
# avoid empty desc environment which causes a formatting bug
self.body.append('~')
def depart_desc_content(self, node: Element) -> None:
pass
def visit_desc_inline(self, node: Element) -> None:
self.body.append(r'\sphinxcode{\sphinxupquote{')
def depart_desc_inline(self, node: Element) -> None:
self.body.append('}}')
# Nodes for high-level structure in signatures
##############################################
def visit_desc_name(self, node: Element) -> None:
self.body.append(r'\sphinxbfcode{\sphinxupquote{')
self.literal_whitespace += 1
def depart_desc_name(self, node: Element) -> None:
self.body.append('}}')
self.literal_whitespace -= 1
def visit_desc_addname(self, node: Element) -> None: def visit_desc_addname(self, node: Element) -> None:
self.body.append(r'\sphinxcode{\sphinxupquote{') self.body.append(r'\sphinxcode{\sphinxupquote{')
self.literal_whitespace += 1 self.literal_whitespace += 1
@@ -770,14 +802,6 @@ class LaTeXTranslator(SphinxTranslator):
def depart_desc_returns(self, node: Element) -> None: def depart_desc_returns(self, node: Element) -> None:
self.body.append(r'}') self.body.append(r'}')
def visit_desc_name(self, node: Element) -> None:
self.body.append(r'\sphinxbfcode{\sphinxupquote{')
self.literal_whitespace += 1
def depart_desc_name(self, node: Element) -> None:
self.body.append('}}')
self.literal_whitespace -= 1
def visit_desc_parameterlist(self, node: Element) -> None: def visit_desc_parameterlist(self, node: Element) -> None:
# close name, open parameterlist # close name, open parameterlist
self.body.append('}{') self.body.append('}{')
@@ -811,13 +835,7 @@ class LaTeXTranslator(SphinxTranslator):
def depart_desc_annotation(self, node: Element) -> None: def depart_desc_annotation(self, node: Element) -> None:
self.body.append('}}') self.body.append('}}')
def visit_desc_content(self, node: Element) -> None: ##############################################
if node.children and not isinstance(node.children[0], nodes.paragraph):
# avoid empty desc environment which causes a formatting bug
self.body.append('~')
def depart_desc_content(self, node: Element) -> None:
pass
def visit_seealso(self, node: Element) -> None: def visit_seealso(self, node: Element) -> None:
self.body.append(BLANKLINE) self.body.append(BLANKLINE)

View File

@@ -120,6 +120,13 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator):
def depart_start_of_file(self, node: Element) -> None: def depart_start_of_file(self, node: Element) -> None:
pass pass
#############################################################
# Domain-specific object descriptions
#############################################################
# Top-level nodes for descriptions
##################################
def visit_desc(self, node: Element) -> None: def visit_desc(self, node: Element) -> None:
self.visit_definition_list(node) self.visit_definition_list(node)
@@ -139,6 +146,21 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator):
def depart_desc_signature_line(self, node: Element) -> None: def depart_desc_signature_line(self, node: Element) -> None:
self.body.append(' ') self.body.append(' ')
def visit_desc_content(self, node: Element) -> None:
self.visit_definition(node)
def depart_desc_content(self, node: Element) -> None:
self.depart_definition(node)
# Nodes for high-level structure in signatures
##############################################
def visit_desc_name(self, node: Element) -> None:
pass
def depart_desc_name(self, node: Element) -> None:
pass
def visit_desc_addname(self, node: Element) -> None: def visit_desc_addname(self, node: Element) -> None:
pass pass
@@ -157,12 +179,6 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator):
def depart_desc_returns(self, node: Element) -> None: def depart_desc_returns(self, node: Element) -> None:
pass pass
def visit_desc_name(self, node: Element) -> None:
pass
def depart_desc_name(self, node: Element) -> None:
pass
def visit_desc_parameterlist(self, node: Element) -> None: def visit_desc_parameterlist(self, node: Element) -> None:
self.body.append('(') self.body.append('(')
self.first_param = 1 self.first_param = 1
@@ -191,11 +207,7 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator):
def depart_desc_annotation(self, node: Element) -> None: def depart_desc_annotation(self, node: Element) -> None:
pass pass
def visit_desc_content(self, node: Element) -> None: ##############################################
self.visit_definition(node)
def depart_desc_content(self, node: Element) -> None:
self.depart_definition(node)
def visit_versionmodified(self, node: Element) -> None: def visit_versionmodified(self, node: Element) -> None:
self.visit_paragraph(node) self.visit_paragraph(node)

View File

@@ -536,6 +536,13 @@ class TextTranslator(SphinxTranslator):
def depart_attribution(self, node: Element) -> None: def depart_attribution(self, node: Element) -> None:
pass pass
#############################################################
# Domain-specific object descriptions
#############################################################
# Top-level nodes
#################
def visit_desc(self, node: Element) -> None: def visit_desc(self, node: Element) -> None:
pass pass
@@ -555,6 +562,22 @@ class TextTranslator(SphinxTranslator):
def depart_desc_signature_line(self, node: Element) -> None: def depart_desc_signature_line(self, node: Element) -> None:
self.add_text('\n') self.add_text('\n')
def visit_desc_content(self, node: Element) -> None:
self.new_state()
self.add_text(self.nl)
def depart_desc_content(self, node: Element) -> None:
self.end_state()
def visit_desc_inline(self, node: Element) -> None:
pass
def depart_desc_inline(self, node: Element) -> None:
pass
# Nodes for high-level structure in signatures
##############################################
def visit_desc_name(self, node: Element) -> None: def visit_desc_name(self, node: Element) -> None:
pass pass
@@ -606,12 +629,7 @@ class TextTranslator(SphinxTranslator):
def depart_desc_annotation(self, node: Element) -> None: def depart_desc_annotation(self, node: Element) -> None:
pass pass
def visit_desc_content(self, node: Element) -> None: ##############################################
self.new_state()
self.add_text(self.nl)
def depart_desc_content(self, node: Element) -> None:
self.end_state()
def visit_figure(self, node: Element) -> None: def visit_figure(self, node: Element) -> None:
self.new_state() self.new_state()

View File

@@ -213,3 +213,9 @@ CPP domain
.. cpp:function:: T& operator[]( unsigned j ) .. cpp:function:: T& operator[]( unsigned j )
const T& operator[]( unsigned j ) const const T& operator[]( unsigned j ) const
.. cpp:function:: template<typename T1, typename T2> \
requires A<T1, T2> \
void f()
- :cpp:expr:`a + b`