diff --git a/src/sphinxnotes/render/ctxnodes.py b/src/sphinxnotes/render/ctxnodes.py index d1790d1..e108eb9 100644 --- a/src/sphinxnotes/render/ctxnodes.py +++ b/src/sphinxnotes/render/ctxnodes.py @@ -6,7 +6,6 @@ from docutils import nodes from docutils.parsers.rst.states import Inliner -from .data import ValueWrapper, ParsedData from .template import Template, Phase from .ctx import ( UnresolvedContext, @@ -252,27 +251,16 @@ def hook_rendered_nodes(self, hook: RenderedNodesHook) -> None: @override def copy(self) -> Any: # NOTE: pending_node is no supposed to be copy as it does not make sense. - # - # For example: ablog extension may copy this node. if self.inline: - return nodes.Text('') + return nodes.literal(self.rawsource, self.rawsource) else: - return nodes.paragraph() + return nodes.literal_block(self.rawsource, self.rawsource) @override def deepcopy(self) -> Any: - # NOTE: Same to :meth:`copy`. + # NOTE: Copy children is not allowed, so simply forward to self.copy. return self.copy() @override def astext(self) -> str: - ctx = self.ctx - if isinstance(ctx, UnresolvedContext): - try: - ctx = ctx.resolve() - except Exception: - return '' - if isinstance(ctx, ParsedData): - return ValueWrapper(ctx.content).as_str() or '' - else: - return '' + return self.rawsource diff --git a/src/sphinxnotes/render/markup.py b/src/sphinxnotes/render/markup.py index d648bb2..b2a4608 100644 --- a/src/sphinxnotes/render/markup.py +++ b/src/sphinxnotes/render/markup.py @@ -13,10 +13,11 @@ from typing import TYPE_CHECKING from docutils import nodes +from docutils.frontend import Values # pyright: ignore[reportDeprecated] from docutils.parsers.rst.states import Struct -from docutils.utils import new_document from sphinx import version_info -from sphinx.util.docutils import SphinxDirective, SphinxRole +from sphinx.util import logging +from sphinx.util.docutils import SphinxDirective, SphinxRole, new_document from sphinx.transforms import SphinxTransform from sphinx.environment.collectors.asset import ImageCollector @@ -24,6 +25,9 @@ if TYPE_CHECKING: from docutils.nodes import Node, system_message + from sphinx.parsers import Parser as SphinxParser + +logger = logging.getLogger(__name__) @dataclass @@ -51,8 +55,7 @@ def _render(self, text: str) -> list[Node]: parser = self.host.app.registry.create_source_parser( self.host.app, 'rst' ) - settings = self.host.document.settings - doc = new_document('', settings=settings) + doc = new_document(self.host.env.docname, settings=self._get_settings(parser, self.host.document)) parser.parse(text, doc) # NOTE: Nodes produced by standalone source parser should be fixed @@ -74,7 +77,6 @@ def _render_inline(self, text: str) -> tuple[list[Node], list[system_message]]: reporter=inliner.reporter, language=inliner.language, ) - return inliner.parse(text, self.host.lineno, memo, inliner.parent) elif isinstance(self.host, SphinxTransform): # Fallback to normal non-inline render then extract inline @@ -120,3 +122,17 @@ def _fix_image_candidates(self, node: nodes.image) -> None: # Update `node['uri']` to a relative path from srcdir. node['uri'], _ = self.host.env.relfn2path(node['uri']) + + def _get_settings(self, parser: SphinxParser, doctree: nodes.document) -> Values: + settings = None + if version_info[0] >= 9: + try: + from sphinx.util.docutils import _get_settings + settings = _get_settings(parser, + defaults=self.host.env.settings, read_config_files=True + ) + except Exception as e: + logger.warning( + f'Failed to get settings from sphinx.util.docutils._get_settings: {e}' + ) + return settings or doctree.settings