Skip to content

Commit 2b8f6da

Browse files
authored
Make parsing more explicit in sphinx.testing.restructuredtext (#13671)
1 parent 616faf8 commit 2b8f6da

File tree

1 file changed

+59
-24
lines changed

1 file changed

+59
-24
lines changed

sphinx/testing/restructuredtext.py

Lines changed: 59 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,77 @@
11
from __future__ import annotations
22

3+
import warnings
34
from typing import TYPE_CHECKING
45

5-
from docutils.core import publish_doctree
6+
from docutils import nodes
7+
from docutils.frontend import OptionParser
68

7-
from sphinx.io import SphinxStandaloneReader
9+
from sphinx.io import SphinxBaseReader
810
from sphinx.parsers import RSTParser
9-
from sphinx.util.docutils import sphinx_domains
11+
from sphinx.transforms import SphinxTransformer
12+
from sphinx.util.docutils import LoggingReporter, sphinx_domains
1013

1114
if TYPE_CHECKING:
12-
from docutils import nodes
15+
from docutils.frontend import Values
1316

1417
from sphinx.application import Sphinx
1518

1619

1720
def parse(app: Sphinx, text: str, docname: str = 'index') -> nodes.document:
18-
"""Parse a string as reStructuredText with Sphinx application."""
21+
"""Parse a string as reStructuredText with Sphinx."""
22+
config = app.config
1923
env = app.env
24+
registry = app.registry
25+
srcdir = app.srcdir
26+
27+
source_path = str(srcdir / f'{docname}.rst')
28+
29+
# Get settings
30+
settings_overrides = {
31+
'gettext_compact': True,
32+
'input_encoding': 'utf-8',
33+
'output_encoding': 'unicode',
34+
'traceback': True,
35+
}
36+
with warnings.catch_warnings():
37+
warnings.filterwarnings('ignore', category=DeprecationWarning)
38+
option_parser = OptionParser(
39+
components=(RSTParser, SphinxBaseReader), defaults=settings_overrides
40+
)
41+
settings: Values = option_parser.get_default_values() # type: ignore[assignment]
42+
settings._source = source_path
43+
settings.env = env
44+
45+
# Create parser
46+
parser = RSTParser()
47+
parser._config = config
48+
parser._env = env
49+
50+
# Create root document node
51+
reporter = LoggingReporter(
52+
source_path,
53+
settings.report_level,
54+
settings.halt_level,
55+
settings.debug,
56+
settings.error_encoding_error_handler,
57+
)
58+
document = nodes.document(settings, reporter, source=source_path)
59+
document.note_source(source_path, -1)
60+
61+
# substitute transformer
62+
document.transformer = transformer = SphinxTransformer(document)
63+
transformer.add_transforms(SphinxBaseReader().get_transforms())
64+
transformer.add_transforms(registry.get_transforms())
65+
transformer.add_transforms(parser.get_transforms())
66+
67+
env.current_document.docname = docname
2068
try:
21-
app.env.current_document.docname = docname
22-
reader = SphinxStandaloneReader()
23-
reader._setup_transforms(app.registry.get_transforms())
24-
parser = RSTParser()
25-
parser._config = app.config
26-
parser._env = app.env
2769
with sphinx_domains(env):
28-
return publish_doctree(
29-
text,
30-
str(app.srcdir / f'{docname}.rst'),
31-
reader=reader,
32-
parser=parser,
33-
settings_overrides={
34-
'env': env,
35-
'gettext_compact': True,
36-
'input_encoding': 'utf-8',
37-
'output_encoding': 'unicode',
38-
'traceback': True,
39-
},
40-
)
70+
parser.parse(text, document)
71+
document.current_source = document.current_line = None
72+
73+
transformer.apply_transforms()
4174
finally:
4275
env.current_document.docname = ''
76+
77+
return document

0 commit comments

Comments
 (0)