Skip to content

Commit 452b856

Browse files
authored
Merge pull request #18 from sphinx-notes/fix/docutils-settings
fix: Get correct docutils settings (Sphinx9 only)
2 parents 31ab84c + c323c10 commit 452b856

2 files changed

Lines changed: 25 additions & 21 deletions

File tree

src/sphinxnotes/render/ctxnodes.py

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from docutils import nodes
77
from docutils.parsers.rst.states import Inliner
88

9-
from .data import ValueWrapper, ParsedData
109
from .template import Template, Phase
1110
from .ctx import (
1211
UnresolvedContext,
@@ -252,27 +251,16 @@ def hook_rendered_nodes(self, hook: RenderedNodesHook) -> None:
252251
@override
253252
def copy(self) -> Any:
254253
# NOTE: pending_node is no supposed to be copy as it does not make sense.
255-
#
256-
# For example: ablog extension may copy this node.
257254
if self.inline:
258-
return nodes.Text('')
255+
return nodes.literal(self.rawsource, self.rawsource)
259256
else:
260-
return nodes.paragraph()
257+
return nodes.literal_block(self.rawsource, self.rawsource)
261258

262259
@override
263260
def deepcopy(self) -> Any:
264-
# NOTE: Same to :meth:`copy`.
261+
# NOTE: Copy children is not allowed, so simply forward to self.copy.
265262
return self.copy()
266263

267264
@override
268265
def astext(self) -> str:
269-
ctx = self.ctx
270-
if isinstance(ctx, UnresolvedContext):
271-
try:
272-
ctx = ctx.resolve()
273-
except Exception:
274-
return ''
275-
if isinstance(ctx, ParsedData):
276-
return ValueWrapper(ctx.content).as_str() or ''
277-
else:
278-
return ''
266+
return self.rawsource

src/sphinxnotes/render/markup.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,21 @@
1313
from typing import TYPE_CHECKING
1414

1515
from docutils import nodes
16+
from docutils.frontend import Values # pyright: ignore[reportDeprecated]
1617
from docutils.parsers.rst.states import Struct
17-
from docutils.utils import new_document
1818
from sphinx import version_info
19-
from sphinx.util.docutils import SphinxDirective, SphinxRole
19+
from sphinx.util import logging
20+
from sphinx.util.docutils import SphinxDirective, SphinxRole, new_document
2021
from sphinx.transforms import SphinxTransform
2122
from sphinx.environment.collectors.asset import ImageCollector
2223

2324
from .template import Host
2425

2526
if TYPE_CHECKING:
2627
from docutils.nodes import Node, system_message
28+
from sphinx.parsers import Parser as SphinxParser
29+
30+
logger = logging.getLogger(__name__)
2731

2832

2933
@dataclass
@@ -51,8 +55,7 @@ def _render(self, text: str) -> list[Node]:
5155
parser = self.host.app.registry.create_source_parser(
5256
self.host.app, 'rst'
5357
)
54-
settings = self.host.document.settings
55-
doc = new_document('<generated text>', settings=settings)
58+
doc = new_document(self.host.env.docname, settings=self._get_settings(parser, self.host.document))
5659
parser.parse(text, doc)
5760

5861
# 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]]:
7477
reporter=inliner.reporter,
7578
language=inliner.language,
7679
)
77-
7880
return inliner.parse(text, self.host.lineno, memo, inliner.parent)
7981
elif isinstance(self.host, SphinxTransform):
8082
# Fallback to normal non-inline render then extract inline
@@ -120,3 +122,17 @@ def _fix_image_candidates(self, node: nodes.image) -> None:
120122

121123
# Update `node['uri']` to a relative path from srcdir.
122124
node['uri'], _ = self.host.env.relfn2path(node['uri'])
125+
126+
def _get_settings(self, parser: SphinxParser, doctree: nodes.document) -> Values:
127+
settings = None
128+
if version_info[0] >= 9:
129+
try:
130+
from sphinx.util.docutils import _get_settings
131+
settings = _get_settings(parser,
132+
defaults=self.host.env.settings, read_config_files=True
133+
)
134+
except Exception as e:
135+
logger.warning(
136+
f'Failed to get settings from sphinx.util.docutils._get_settings: {e}'
137+
)
138+
return settings or doctree.settings

0 commit comments

Comments
 (0)