[IMP] extensions/custom_admonitions: tweak the HTML structure of dfn

The structure of the `dfn` role is changed from its default
`<em class="dfn">text</em>` to
`<span class="dfn"><span>text</span></span>` to ease the styling.

task-3046383

Part-of: odoo/documentation#3264
This commit is contained in:
Antoine Vandevenne (anv) 2023-01-03 13:10:12 +00:00
parent e98cf5f54a
commit 281a893540
2 changed files with 33 additions and 2 deletions

View File

@ -3,6 +3,7 @@
from docutils import nodes from docutils import nodes
from docutils.parsers.rst.directives import admonitions from docutils.parsers.rst.directives import admonitions
from sphinx.locale import admonitionlabels from sphinx.locale import admonitionlabels
from sphinx.util.docutils import SphinxRole
class example(nodes.Admonition, nodes.Element): class example(nodes.Admonition, nodes.Element):
@ -21,6 +22,35 @@ class Exercise(admonitions.BaseAdmonition):
node_class = exercise node_class = exercise
class Dfn(SphinxRole):
""" Overwrite the `dfn` role to use custom HTML. """
def run(self):
""" Process the content of the role.
We use custom node classes to represent the `span`s rather than the corresponding
sphinx.nodes.* class to prevent automatically setting the name of the node as class (e.g.,
"container") on the element.
"""
outer_span = Span(classes=['dfn'])
inner_span = Span()
outer_span.append(inner_span)
text = nodes.Text(self.text)
inner_span.append(text)
return [outer_span], []
class Span(nodes.General, nodes.Element):
@staticmethod
def visit(translator, node):
translator.body.append(translator.starttag(node, 'span').rstrip())
@staticmethod
def depart(translator, node):
translator.body.append('</span>')
def setup(app): def setup(app):
app.add_directive('example', Example) app.add_directive('example', Example)
app.add_node(example, html=( app.add_node(example, html=(
@ -32,6 +62,8 @@ def setup(app):
lambda self, node: self.visit_admonition(node, 'exercise'), lambda self, node: self.visit_admonition(node, 'exercise'),
lambda self, node: self.depart_admonition(node), lambda self, node: self.depart_admonition(node),
)) ))
app.add_role('dfn', Dfn(), override=True)
app.add_node(Span, html=(Span.visit, Span.depart))
return { return {
'parallel_read_safe': True, 'parallel_read_safe': True,

View File

@ -10,7 +10,6 @@ from sphinx.writers.html5 import HTML5Translator
# └── Odoo Translator # └── Odoo Translator
ADMONITION_MAPPING = { ADMONITION_MAPPING = {
# The alert classes have been replaced by default BS classes to reduce number of scss lines.
'note': 'alert-primary', 'note': 'alert-primary',
'tip': 'alert-tip', 'tip': 'alert-tip',
@ -27,7 +26,7 @@ ADMONITION_MAPPING = {
'example': 'alert-success', 'example': 'alert-success',
'exercise': 'alert-dark', 'exercise': 'alert-dark',
} } # The alert classes have been replaced by default BS classes to reduce number of scss lines.
class BootstrapTranslator(HTML5Translator): class BootstrapTranslator(HTML5Translator):