Skip to content

Instantly share code, notes, and snippets.

@attakei
Created March 12, 2022 16:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save attakei/ed8a4be8b961ae2c9b188a6ecc0b48e6 to your computer and use it in GitHub Desktop.
Save attakei/ed8a4be8b961ae2c9b188a6ecc0b48e6 to your computer and use it in GitHub Desktop.
Render message(message-header, message-body) from admonitions of reStructuredText
from typing import Optional
from docutils import nodes
from sphinx.application import Sphinx
from sphinx.locale import admonitionlabels
from sphinx.writers.html5 import HTML5Translator
def visit_admonition(name: Optional[str] = None):
class_ = "message" if name is None else f"message is-{name}"
label_ = admonitionlabels.get(name, "note")
def _visit_admonition(self: HTML5Translator, node: nodes.Admonition):
self.body.append(f'<div class="{class_}">')
self.body.append(f'<div class="message-header"><p>{label_}</p></div>')
self.body.append('<div class="message-body">')
return _visit_admonition
def depart_admonition(self: HTML5Translator, node: nodes.Admonition = None):
self.body.append("</div></div>")
def visit_paragraph(self: HTML5Translator, node: nodes.paragraph):
if issubclass(type(node.parent), nodes.Admonition):
return
return super(HTML5Translator, self).visit_paragraph(node)
def depart_paragraph(self: HTML5Translator, node: nodes.paragraph):
self.depart_paragraph(node)
def setup(app: Sphinx):
app.add_node(nodes.paragraph, override=True, html=(visit_paragraph, depart_admonition))
app.add_node(nodes.note, override=True, html=(visit_admonition(), depart_admonition))
app.add_node(nodes.warning, override=True, html=(visit_admonition("warning"), depart_admonition))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment