Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions rst_to_myst/data/directives.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,19 @@ docutils.parsers.rst.directives.admonitions.Note: parse_content
docutils.parsers.rst.directives.admonitions.Tip: parse_content
docutils.parsers.rst.directives.admonitions.Warning: parse_content

# admonitions (sphinx 8.2+ overrides the docutils classes)
sphinx.directives.admonitions.Admonition: parse_all
sphinx.directives.admonitions.Attention: parse_content
sphinx.directives.admonitions.Caution: parse_content
sphinx.directives.admonitions.Danger: parse_content
sphinx.directives.admonitions.Error: parse_content
sphinx.directives.admonitions.Hint: parse_content
sphinx.directives.admonitions.Important: parse_content
sphinx.directives.admonitions.Note: parse_content
sphinx.directives.admonitions.Tip: parse_content
sphinx.directives.admonitions.Warning: parse_content
sphinx.directives.admonitions.SeeAlso: parse_content

# docutils other (see https://docutils.sourceforge.io/docs/ref/rst/directives.html#figure)
docutils.parsers.rst.directives.body.CodeBlock: direct
docutils.parsers.rst.directives.body.Compound: eval_rst
Expand Down
43 changes: 43 additions & 0 deletions tests/test_admonitions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
"""Sphinx 8.2+ replaces docutils admonition classes; they must still convert."""

from docutils import nodes
from docutils.parsers.rst.directives.admonitions import BaseAdmonition

from rst_to_myst.markdownit import MarkdownItRenderer
from rst_to_myst.mdformat_render import from_tokens
from rst_to_myst.namespace import compile_namespace
from rst_to_myst.parser import to_docutils_ast


class Warning(BaseAdmonition):
"""Stand-in for ``sphinx.directives.admonitions.Warning``."""

node_class = nodes.warning


Warning.__module__ = "sphinx.directives.admonitions"


def _convert(text: str) -> str:
namespace = compile_namespace(use_sphinx=False)
namespace.directives["warning"] = Warning
document, warning_stream = to_docutils_ast(
text, use_sphinx=False, namespace=namespace
)
assert warning_stream.getvalue() == ""
tokens = MarkdownItRenderer(
document,
warning_stream=warning_stream,
colon_fences=True,
dollar_math=True,
).to_tokens()
return from_tokens(tokens, warning_stream=warning_stream)


def test_sphinx_overridden_warning_is_not_eval_rst():
# Issue #97: ``.. warning:: This is a warning`` became an eval-rst fence
# after Sphinx started registering its own admonition classes.
text = _convert(".. warning:: This is a warning\n")
assert "{eval-rst}" not in text
assert "This is a warning" in text
assert "{warning}" in text