Visitar URL original
Fix rendered page break fragments adjacent to hyperlinks by kokotatan · Pull Request #1625 · python-openxml/python-docx · GitHub
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/docx/oxml/text/pagebreak.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,11 @@ def follows_all_content(self) -> bool:
return bool(
# -- XPath will match zero-or-one w:lastRenderedPageBreak element --
self._enclosing_p.xpath(
# -- in first run of paragraph --
f"(./w:r)[last()]"
# -- in last run or hyperlink of paragraph --
f"(./w:r | ./w:hyperlink)[last()]"
# -- all page-breaks --
f"/w:lastRenderedPageBreak"
# -- that are not preceded by any content-bearing elements --
# -- that are not followed by any content-bearing elements --
f"[not(following-sibling::*[{self._run_inner_content_xpath}])]"
)
)
Expand All @@ -89,8 +89,8 @@ def precedes_all_content(self) -> bool:
return bool(
# -- XPath will match zero-or-one w:lastRenderedPageBreak element --
self._enclosing_p.xpath(
# -- in first run of paragraph --
f"./w:r[1]"
# -- in first run or hyperlink of paragraph --
f"(./w:r | ./w:hyperlink)[1]"
# -- all page-breaks --
f"/w:lastRenderedPageBreak"
# -- that are not preceded by any content-bearing elements --
Expand Down
40 changes: 40 additions & 0 deletions tests/text/test_pagebreak.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,46 @@ def it_produces_None_for_preceding_fragment_when_page_break_is_leading(

assert preceding_fragment is None

@pytest.mark.parametrize("prefix", ["", "w:pPr/w:ind,w:bookmarkStart{w:id=0,w:name=bookmark},"])
def it_preserves_a_hyperlink_before_a_page_break_in_the_first_run(
self, prefix: str, fake_parent: t.ProvidesStoryPart
):
p_cxml = (
f"w:p/({prefix}"
'w:hyperlink{w:anchor=bookmark}/w:r/w:t"link",'
'w:r/(w:lastRenderedPageBreak,w:t"after"))'
)
p = cast(CT_P, element(p_cxml))
original_xml = p.xml
page_break = RenderedPageBreak(p.lastRenderedPageBreaks[0], fake_parent)

fragment = page_break.preceding_paragraph_fragment

assert fragment is not None
assert fragment.text == "link"
assert fragment.hyperlinks[0].fragment == "bookmark"
assert p.xml == original_xml

@pytest.mark.parametrize("suffix", ["", ",w:bookmarkEnd{w:id=0}"])
def it_preserves_a_hyperlink_after_a_page_break_in_the_last_run(
self, suffix: str, fake_parent: t.ProvidesStoryPart
):
p_cxml = (
'w:p/(w:r/(w:t"before",w:lastRenderedPageBreak),'
'w:hyperlink{w:anchor=bookmark}/w:r/w:t"link"'
f"{suffix})"
)
p = cast(CT_P, element(p_cxml))
original_xml = p.xml
page_break = RenderedPageBreak(p.lastRenderedPageBreaks[0], fake_parent)

fragment = page_break.following_paragraph_fragment

assert fragment is not None
assert fragment.text == "link"
assert fragment.hyperlinks[0].fragment == "bookmark"
assert p.xml == original_xml

def it_can_split_off_the_preceding_paragraph_content_when_in_a_run(
self, fake_parent: t.ProvidesStoryPart
):
Expand Down