Skip to content

Commit 97f946a

Browse files
authored
Refactor and simplify sphinx.io._create_publisher() (#13642)
1 parent 9f5e803 commit 97f946a

File tree

4 files changed

+19
-24
lines changed

4 files changed

+19
-24
lines changed

sphinx/io.py

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@
2323
from docutils.parsers import Parser
2424
from docutils.transforms import Transform
2525

26-
from sphinx.application import Sphinx
2726
from sphinx.environment import BuildEnvironment
28-
from sphinx.registry import SphinxComponentRegistry
2927

3028

3129
logger = logging.getLogger(__name__)
@@ -70,8 +68,8 @@ def new_document(self) -> nodes.document:
7068
class SphinxStandaloneReader(SphinxBaseReader):
7169
"""A basic document reader for Sphinx."""
7270

73-
def _setup_transforms(self, *, registry: SphinxComponentRegistry) -> None:
74-
self.transforms = self.transforms + registry.get_transforms()
71+
def _setup_transforms(self, transforms: list[type[Transform]], /) -> None:
72+
self.transforms = self.transforms + transforms
7573

7674
def read(self, source: Input, parser: Parser, settings: Values) -> nodes.document: # type: ignore[type-arg]
7775
self.source = source
@@ -114,21 +112,11 @@ def __init__(self, *args: Any, **kwargs: Any) -> None:
114112
super().__init__(*args, **kwargs)
115113

116114

117-
def create_publisher(app: Sphinx, filetype: str) -> Publisher:
115+
def _create_publisher(
116+
*, env: BuildEnvironment, parser: Parser, transforms: list[type[Transform]]
117+
) -> Publisher:
118118
reader = SphinxStandaloneReader()
119-
reader._setup_transforms(registry=app.registry)
120-
121-
parser = app.registry.create_source_parser(filetype, config=app.config, env=app.env)
122-
if parser.__class__.__name__ == 'CommonMarkParser' and parser.settings_spec == ():
123-
# a workaround for recommonmark
124-
# If recommonmark.AutoStrictify is enabled, the parser invokes reST parser
125-
# internally. But recommonmark-0.4.0 does not provide settings_spec for reST
126-
# parser. As a workaround, this copies settings_spec for RSTParser to the
127-
# CommonMarkParser.
128-
from docutils.parsers.rst import Parser as RSTParser
129-
130-
parser.settings_spec = RSTParser.settings_spec # type: ignore[misc]
131-
119+
reader._setup_transforms(transforms)
132120
pub = Publisher(
133121
reader=reader,
134122
parser=parser,
@@ -137,7 +125,7 @@ def create_publisher(app: Sphinx, filetype: str) -> Publisher:
137125
destination=NullOutput(),
138126
)
139127
# Propagate exceptions by default when used programmatically:
140-
defaults = {'traceback': True, **app.env.settings}
128+
defaults = {'traceback': True, **env.settings}
141129
# Set default settings
142130
pub.get_settings(**defaults)
143131
return pub

sphinx/registry.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from sphinx.domains.std import GenericObject, Target
1313
from sphinx.errors import ExtensionError, SphinxError, VersionRequirementError
1414
from sphinx.extension import Extension
15-
from sphinx.io import create_publisher
15+
from sphinx.io import _create_publisher
1616
from sphinx.locale import __
1717
from sphinx.parsers import Parser as SphinxParser
1818
from sphinx.roles import XRefRole
@@ -601,7 +601,9 @@ def get_publisher(self, app: Sphinx, filetype: str) -> Publisher:
601601
return self.publishers[filetype]
602602
except KeyError:
603603
pass
604-
publisher = create_publisher(app, filetype)
604+
parser = self.create_source_parser(filetype, config=app.config, env=app.env)
605+
transforms = self.get_transforms()
606+
publisher = _create_publisher(env=app.env, parser=parser, transforms=transforms)
605607
self.publishers[filetype] = publisher
606608
return publisher
607609

sphinx/testing/restructuredtext.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def parse(app: Sphinx, text: str, docname: str = 'index') -> nodes.document:
2020
try:
2121
app.env.current_document.docname = docname
2222
reader = SphinxStandaloneReader()
23-
reader._setup_transforms(registry=app.registry)
23+
reader._setup_transforms(app.registry.get_transforms())
2424
parser = RSTParser()
2525
parser.config = app.config
2626
parser.env = app.env

tests/test_directives/test_directive_object_description.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from docutils import nodes
1010

1111
from sphinx import addnodes
12-
from sphinx.io import create_publisher
12+
from sphinx.io import _create_publisher
1313
from sphinx.testing import restructuredtext
1414
from sphinx.util.docutils import sphinx_domains
1515

@@ -22,8 +22,13 @@
2222
def _doctree_for_test(
2323
app: Sphinx, env: BuildEnvironment, docname: str
2424
) -> nodes.document:
25+
config = app.config
26+
registry = app.registry
2527
env.prepare_settings(docname)
26-
publisher = create_publisher(app, 'restructuredtext')
28+
parser = registry.create_source_parser('restructuredtext', config=config, env=env)
29+
publisher = _create_publisher(
30+
env=env, parser=parser, transforms=registry.get_transforms()
31+
)
2732
with sphinx_domains(env):
2833
publisher.set_source(source_path=str(env.doc2path(docname)))
2934
publisher.publish()

0 commit comments

Comments
 (0)