Skip to content

Commit 9dd2851

Browse files
committed
para: add Paragraph.rendered_page_breaks
1 parent 57d93e1 commit 9dd2851

File tree

3 files changed

+43
-1
lines changed

3 files changed

+43
-1
lines changed

features/par-access-inner-content.feature

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ Feature: Access paragraph inner-content including hyperlinks
3232
Then paragraph.iter_inner_content() generates the paragraph runs and hyperlinks
3333

3434

35-
@wip
3635
Scenario Outline: Paragraph.rendered_page_breaks contains paragraph RenderedPageBreaks
3736
Given a paragraph having <zero-or-more> rendered page breaks
3837
Then paragraph.rendered_page_breaks has length <value>

src/docx/text/paragraph.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from docx.shared import Parented
1515
from docx.styles.style import CharacterStyle, ParagraphStyle
1616
from docx.text.hyperlink import Hyperlink
17+
from docx.text.pagebreak import RenderedPageBreak
1718
from docx.text.parfmt import ParagraphFormat
1819
from docx.text.run import Run
1920

@@ -112,6 +113,17 @@ def paragraph_format(self):
112113
for this paragraph, such as line spacing and indentation."""
113114
return ParagraphFormat(self._element)
114115

116+
@property
117+
def rendered_page_breaks(self) -> List[RenderedPageBreak]:
118+
"""All rendered page-breaks in this paragraph.
119+
120+
Most often an empty list, sometimes contains one page-break, but can contain
121+
more than one is rare or contrived cases.
122+
"""
123+
return [
124+
RenderedPageBreak(lrpb, self) for lrpb in self._p.lastRenderedPageBreaks
125+
]
126+
115127
@property
116128
def runs(self) -> List[Run]:
117129
"""Sequence of |Run| instances corresponding to the <w:r> elements in this

tests/text/test_paragraph.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,37 @@ def it_can_change_its_paragraph_style(self, style_set_fixture):
100100
)
101101
assert paragraph._p.xml == expected_xml
102102

103+
@pytest.mark.parametrize(
104+
("p_cxml", "count"),
105+
[
106+
("w:p", 0),
107+
("w:p/w:r", 0),
108+
("w:p/w:r/w:lastRenderedPageBreak", 1),
109+
("w:p/w:hyperlink/w:r/w:lastRenderedPageBreak", 1),
110+
(
111+
"w:p/(w:r/w:lastRenderedPageBreak,"
112+
"w:hyperlink/w:r/w:lastRenderedPageBreak)",
113+
2,
114+
),
115+
(
116+
"w:p/(w:hyperlink/w:r/w:lastRenderedPageBreak,w:r,"
117+
"w:r/w:lastRenderedPageBreak,w:r,w:hyperlink)",
118+
2,
119+
),
120+
],
121+
)
122+
def it_provides_access_to_the_rendered_page_breaks_it_contains(
123+
self, p_cxml: str, count: int, fake_parent: t.StoryChild
124+
):
125+
p = cast(CT_P, element(p_cxml))
126+
paragraph = Paragraph(p, fake_parent)
127+
128+
rendered_page_breaks = paragraph.rendered_page_breaks
129+
130+
actual = [type(item).__name__ for item in rendered_page_breaks]
131+
expected = ["RenderedPageBreak" for _ in range(count)]
132+
assert actual == expected, f"expected: {expected}, got: {actual}"
133+
103134
@pytest.mark.parametrize(
104135
("p_cxml", "expected_value"),
105136
[

0 commit comments

Comments
 (0)