Skip to content
Merged
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
20 changes: 4 additions & 16 deletions src/sphinxnotes/render/ctxnodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
26 changes: 21 additions & 5 deletions src/sphinxnotes/render/markup.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,21 @@
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

from .template import Host

if TYPE_CHECKING:
from docutils.nodes import Node, system_message
from sphinx.parsers import Parser as SphinxParser

logger = logging.getLogger(__name__)


@dataclass
Expand Down Expand Up @@ -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('<generated text>', 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
Expand All @@ -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
Expand Down Expand Up @@ -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