Skip to content

Commit e1bd9cb

Browse files
authored
Make _prepend_prologue() and _append_epilogue() private (#13658)
1 parent 6b136f9 commit e1bd9cb

File tree

4 files changed

+80
-74
lines changed

4 files changed

+80
-74
lines changed

sphinx/parsers.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from docutils.transforms.universal import SmartQuotes
1212

1313
from sphinx.deprecation import _deprecation_warning
14-
from sphinx.util.rst import append_epilog, prepend_prolog
14+
from sphinx.util.rst import _append_epilogue, _prepend_prologue
1515

1616
if TYPE_CHECKING:
1717
from docutils import nodes
@@ -100,9 +100,9 @@ def parse(self, inputstring: str | StringList, document: nodes.document) -> None
100100
self.finish_parse()
101101

102102
def decorate(self, content: StringList) -> None:
103-
"""Preprocess reST content before parsing."""
104-
prepend_prolog(content, self.config.rst_prolog)
105-
append_epilog(content, self.config.rst_epilog)
103+
"""Preprocess reStructuredText content before parsing."""
104+
_prepend_prologue(content, self._config.rst_prolog)
105+
_append_epilogue(content, self._config.rst_epilog)
106106

107107

108108
def setup(app: Sphinx) -> ExtensionMetadata:

sphinx/util/rst.py

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
"""reST helper functions."""
1+
"""reStructuredText helper functions."""
22

33
from __future__ import annotations
44

55
import re
66
from collections import defaultdict
77
from contextlib import contextmanager
8-
from typing import TYPE_CHECKING, cast
8+
from typing import TYPE_CHECKING
99
from unicodedata import east_asian_width
1010

1111
from docutils.parsers.rst import roles
@@ -25,7 +25,7 @@
2525

2626
logger = logging.getLogger(__name__)
2727

28-
FIELD_NAME_RE = re.compile(Body.patterns['field_marker'])
28+
_FIELD_NAME_RE = re.compile(Body.patterns['field_marker'])
2929
symbols_re = re.compile(r'([!-\-/:-@\[-`{-~])') # symbols without dot(0x2e)
3030
SECTIONING_CHARS = ['=', '-', '~']
3131

@@ -77,39 +77,39 @@ def default_role(docname: str, name: str) -> Iterator[None]:
7777
docutils.unregister_role('')
7878

7979

80-
def prepend_prolog(content: StringList, prolog: str) -> None:
81-
"""Prepend a string to content body as prolog."""
82-
if prolog:
83-
pos = 0
84-
for line in content:
85-
if FIELD_NAME_RE.match(line):
86-
pos += 1
87-
else:
88-
break
89-
90-
if pos > 0:
91-
# insert a blank line after docinfo
92-
content.insert(pos, '', '<generated>', 0)
80+
def _prepend_prologue(content: StringList, prologue: str) -> None:
81+
"""Prepend a string to content body as a prologue."""
82+
if not prologue:
83+
return
84+
pos = 0
85+
for line in content:
86+
if _FIELD_NAME_RE.match(line):
9387
pos += 1
88+
else:
89+
break
9490

95-
# insert prolog (after docinfo if exists)
96-
lineno = 0
97-
for lineno, line in enumerate(prolog.splitlines()):
98-
content.insert(pos + lineno, line, '<rst_prolog>', lineno)
91+
if pos > 0:
92+
# insert a blank line after docinfo
93+
content.insert(pos, '', '<generated>', 0)
94+
pos += 1
9995

100-
content.insert(pos + lineno + 1, '', '<generated>', 0)
96+
# insert prologue (after docinfo if exists)
97+
lineno = 0
98+
for lineno, line in enumerate(prologue.splitlines()):
99+
content.insert(pos + lineno, line, '<rst_prologue>', lineno)
101100

101+
content.insert(pos + lineno + 1, '', '<generated>', 0)
102102

103-
def append_epilog(content: StringList, epilog: str) -> None:
104-
"""Append a string to content body as epilog."""
105-
if epilog:
106-
if len(content) > 0:
107-
source, lineno = content.info(-1)
108-
# lineno will never be None, since len(content) > 0
109-
lineno = cast('int', lineno)
110-
else:
111-
source = '<generated>'
112-
lineno = 0
113-
content.append('', source, lineno + 1)
114-
for lineno, line in enumerate(epilog.splitlines()):
115-
content.append(line, '<rst_epilog>', lineno)
103+
104+
def _append_epilogue(content: StringList, epilogue: str) -> None:
105+
"""Append a string to content body as an epilogue."""
106+
if not epilogue:
107+
return
108+
if len(content) > 0:
109+
source, lineno = content.items[-1]
110+
else:
111+
source = '<generated>'
112+
lineno = 0
113+
content.append('', source, lineno + 1)
114+
for lineno, line in enumerate(epilogue.splitlines()):
115+
content.append(line, '<rst_epilogue>', lineno)

tests/test_markup/test_parser.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ def test_RSTParser_prolog_epilog(RSTStateMachine, app):
3434
parser.parse(text, document)
3535
(content, _), _ = RSTStateMachine().run.call_args
3636
assert list(content.xitems()) == [
37-
('<rst_prolog>', 0, 'this is rst_prolog'),
38-
('<rst_prolog>', 1, 'hello reST!'),
37+
('<rst_prologue>', 0, 'this is rst_prolog'),
38+
('<rst_prologue>', 1, 'hello reST!'),
3939
('<generated>', 0, ''),
4040
('dummy.rst', 0, 'hello Sphinx world'),
4141
('dummy.rst', 1, 'Sphinx is a document generator'),
@@ -50,8 +50,8 @@ def test_RSTParser_prolog_epilog(RSTStateMachine, app):
5050
('dummy.rst', 0, 'hello Sphinx world'),
5151
('dummy.rst', 1, 'Sphinx is a document generator'),
5252
('dummy.rst', 2, ''),
53-
('<rst_epilog>', 0, 'this is rst_epilog'),
54-
('<rst_epilog>', 1, 'good-bye reST!'),
53+
('<rst_epilogue>', 0, 'this is rst_epilog'),
54+
('<rst_epilogue>', 1, 'good-bye reST!'),
5555
]
5656

5757
# expandtabs / convert whitespaces

tests/test_util/test_util_rst.py

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@
55
from docutils.statemachine import StringList
66
from jinja2 import Environment
77

8-
from sphinx.util.rst import append_epilog, escape, heading, prepend_prolog, textwidth
8+
from sphinx.util.rst import (
9+
_append_epilogue,
10+
_prepend_prologue,
11+
escape,
12+
heading,
13+
textwidth,
14+
)
915

1016

1117
def test_escape() -> None:
@@ -15,25 +21,25 @@ def test_escape() -> None:
1521
assert escape('.. toctree::') == r'\.. toctree\:\:'
1622

1723

18-
def test_append_epilog() -> None:
24+
def test_append_epilogue() -> None:
1925
epilog = 'this is rst_epilog\ngood-bye reST!'
2026
content = StringList(
2127
['hello Sphinx world', 'Sphinx is a document generator'],
2228
'dummy.rst',
2329
)
24-
append_epilog(content, epilog)
30+
_append_epilogue(content, epilog)
2531

2632
assert list(content.xitems()) == [
2733
('dummy.rst', 0, 'hello Sphinx world'),
2834
('dummy.rst', 1, 'Sphinx is a document generator'),
2935
('dummy.rst', 2, ''),
30-
('<rst_epilog>', 0, 'this is rst_epilog'),
31-
('<rst_epilog>', 1, 'good-bye reST!'),
36+
('<rst_epilogue>', 0, 'this is rst_epilog'),
37+
('<rst_epilogue>', 1, 'good-bye reST!'),
3238
]
3339

3440

35-
def test_prepend_prolog() -> None:
36-
prolog = 'this is rst_prolog\nhello reST!'
41+
def test_prepend_prologue() -> None:
42+
prologue = 'this is rst_prolog\nhello reST!'
3743
content = StringList(
3844
[
3945
':title: test of SphinxFileInput',
@@ -44,14 +50,14 @@ def test_prepend_prolog() -> None:
4450
],
4551
'dummy.rst',
4652
)
47-
prepend_prolog(content, prolog)
53+
_prepend_prologue(content, prologue)
4854

4955
assert list(content.xitems()) == [
5056
('dummy.rst', 0, ':title: test of SphinxFileInput'),
5157
('dummy.rst', 1, ':author: Sphinx team'),
5258
('<generated>', 0, ''),
53-
('<rst_prolog>', 0, 'this is rst_prolog'),
54-
('<rst_prolog>', 1, 'hello reST!'),
59+
('<rst_prologue>', 0, 'this is rst_prolog'),
60+
('<rst_prologue>', 1, 'hello reST!'),
5561
('<generated>', 0, ''),
5662
('dummy.rst', 2, ''),
5763
('dummy.rst', 3, 'hello Sphinx world'),
@@ -60,43 +66,43 @@ def test_prepend_prolog() -> None:
6066

6167

6268
def test_prepend_prolog_with_CR() -> None:
63-
# prolog having CR at tail
64-
prolog = 'this is rst_prolog\nhello reST!\n'
69+
# prologue having CR at tail
70+
prologue = 'this is rst_prolog\nhello reST!\n'
6571
content = StringList(
6672
['hello Sphinx world', 'Sphinx is a document generator'],
6773
'dummy.rst',
6874
)
69-
prepend_prolog(content, prolog)
75+
_prepend_prologue(content, prologue)
7076

7177
assert list(content.xitems()) == [
72-
('<rst_prolog>', 0, 'this is rst_prolog'),
73-
('<rst_prolog>', 1, 'hello reST!'),
78+
('<rst_prologue>', 0, 'this is rst_prolog'),
79+
('<rst_prologue>', 1, 'hello reST!'),
7480
('<generated>', 0, ''),
7581
('dummy.rst', 0, 'hello Sphinx world'),
7682
('dummy.rst', 1, 'Sphinx is a document generator'),
7783
]
7884

7985

8086
def test_prepend_prolog_without_CR() -> None:
81-
# prolog not having CR at tail
82-
prolog = 'this is rst_prolog\nhello reST!'
87+
# prologue not having CR at tail
88+
prologue = 'this is rst_prolog\nhello reST!'
8389
content = StringList(
8490
['hello Sphinx world', 'Sphinx is a document generator'],
8591
'dummy.rst',
8692
)
87-
prepend_prolog(content, prolog)
93+
_prepend_prologue(content, prologue)
8894

8995
assert list(content.xitems()) == [
90-
('<rst_prolog>', 0, 'this is rst_prolog'),
91-
('<rst_prolog>', 1, 'hello reST!'),
96+
('<rst_prologue>', 0, 'this is rst_prolog'),
97+
('<rst_prologue>', 1, 'hello reST!'),
9298
('<generated>', 0, ''),
9399
('dummy.rst', 0, 'hello Sphinx world'),
94100
('dummy.rst', 1, 'Sphinx is a document generator'),
95101
]
96102

97103

98104
def test_prepend_prolog_with_roles_in_sections() -> None:
99-
prolog = 'this is rst_prolog\nhello reST!'
105+
prologue = 'this is rst_prolog\nhello reST!'
100106
content = StringList(
101107
[
102108
':title: test of SphinxFileInput',
@@ -109,14 +115,14 @@ def test_prepend_prolog_with_roles_in_sections() -> None:
109115
],
110116
'dummy.rst',
111117
)
112-
prepend_prolog(content, prolog)
118+
_prepend_prologue(content, prologue)
113119

114120
assert list(content.xitems()) == [
115121
('dummy.rst', 0, ':title: test of SphinxFileInput'),
116122
('dummy.rst', 1, ':author: Sphinx team'),
117123
('<generated>', 0, ''),
118-
('<rst_prolog>', 0, 'this is rst_prolog'),
119-
('<rst_prolog>', 1, 'hello reST!'),
124+
('<rst_prologue>', 0, 'this is rst_prolog'),
125+
('<rst_prologue>', 1, 'hello reST!'),
120126
('<generated>', 0, ''),
121127
('dummy.rst', 2, ''),
122128
('dummy.rst', 3, ':mod:`foo`'),
@@ -128,13 +134,13 @@ def test_prepend_prolog_with_roles_in_sections() -> None:
128134

129135
def test_prepend_prolog_with_roles_in_sections_with_newline() -> None:
130136
# prologue with trailing line break
131-
prolog = 'this is rst_prolog\nhello reST!\n'
137+
prologue = 'this is rst_prolog\nhello reST!\n'
132138
content = StringList([':mod:`foo`', '-' * 10, '', 'hello'], 'dummy.rst')
133-
prepend_prolog(content, prolog)
139+
_prepend_prologue(content, prologue)
134140

135141
assert list(content.xitems()) == [
136-
('<rst_prolog>', 0, 'this is rst_prolog'),
137-
('<rst_prolog>', 1, 'hello reST!'),
142+
('<rst_prologue>', 0, 'this is rst_prolog'),
143+
('<rst_prologue>', 1, 'hello reST!'),
138144
('<generated>', 0, ''),
139145
('dummy.rst', 0, ':mod:`foo`'),
140146
('dummy.rst', 1, '----------'),
@@ -145,13 +151,13 @@ def test_prepend_prolog_with_roles_in_sections_with_newline() -> None:
145151

146152
def test_prepend_prolog_with_roles_in_sections_without_newline() -> None:
147153
# prologue with no trailing line break
148-
prolog = 'this is rst_prolog\nhello reST!'
154+
prologue = 'this is rst_prolog\nhello reST!'
149155
content = StringList([':mod:`foo`', '-' * 10, '', 'hello'], 'dummy.rst')
150-
prepend_prolog(content, prolog)
156+
_prepend_prologue(content, prologue)
151157

152158
assert list(content.xitems()) == [
153-
('<rst_prolog>', 0, 'this is rst_prolog'),
154-
('<rst_prolog>', 1, 'hello reST!'),
159+
('<rst_prologue>', 0, 'this is rst_prolog'),
160+
('<rst_prologue>', 1, 'hello reST!'),
155161
('<generated>', 0, ''),
156162
('dummy.rst', 0, ':mod:`foo`'),
157163
('dummy.rst', 1, '----------'),

0 commit comments

Comments
 (0)