1313from typing import TYPE_CHECKING
1414
1515from docutils import nodes
16+ from docutils .frontend import Values # pyright: ignore[reportDeprecated]
1617from docutils .parsers .rst .states import Struct
17- from docutils .utils import new_document
1818from 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
2021from sphinx .transforms import SphinxTransform
2122from sphinx .environment .collectors .asset import ImageCollector
2223
2324from .template import Host
2425
2526if 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