Skip to content

Commit 9e2b32d

Browse files
committed
hdr: add _Header._prior_header
1 parent ce6afd4 commit 9e2b32d

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

docx/oxml/section.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,13 @@ def page_width(self, value):
250250
pgSz = self.get_or_add_pgSz()
251251
pgSz.w = value
252252

253+
@property
254+
def preceding_sectPr(self):
255+
"""sectPr immediately preceding this one or None if this is the first."""
256+
# ---[1] predicate returns list of zero or one value---
257+
preceding_sectPrs = self.xpath("./preceding::w:sectPr[1]")
258+
return preceding_sectPrs[0] if len(preceding_sectPrs) > 0 else None
259+
253260
@property
254261
def start_type(self):
255262
"""

docx/section.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,4 +300,8 @@ def _header_part(self):
300300
@property
301301
def _prior_header(self):
302302
"""|_Header| proxy on prior sectPr element or None if this is first section."""
303-
raise NotImplementedError
303+
preceding_sectPr = self._sectPr.preceding_sectPr
304+
return (
305+
None if preceding_sectPr is None
306+
else _Header(preceding_sectPr, self._document_part)
307+
)

tests/test_section.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,29 @@ def it_knows_when_it_has_a_header_part_to_help(self, has_header_part_fixture):
471471

472472
assert has_header_part is expected_value
473473

474+
def it_provides_access_to_the_prior_Header_to_help(
475+
self, request, document_part_, header_
476+
):
477+
doc_elm = element("w:document/(w:sectPr,w:sectPr)")
478+
prior_sectPr, sectPr = doc_elm[0], doc_elm[1]
479+
header = _Header(sectPr, document_part_)
480+
# ---mock must occur after construction of "real" header---
481+
_Header_ = class_mock(request, "docx.section._Header", return_value=header_)
482+
483+
prior_header = header._prior_header
484+
485+
_Header_.assert_called_once_with(prior_sectPr, document_part_)
486+
assert prior_header is header_
487+
488+
def but_it_returns_None_when_its_the_first_header(self):
489+
doc_elm = element("w:document/w:sectPr")
490+
sectPr = doc_elm[0]
491+
header = _Header(sectPr, None)
492+
493+
prior_header = header._prior_header
494+
495+
assert prior_header is None
496+
474497
# fixtures -------------------------------------------------------
475498

476499
@pytest.fixture(
@@ -522,6 +545,10 @@ def _get_or_add_header_part_(self, request):
522545
def _has_header_part_prop_(self, request):
523546
return property_mock(request, _Header, "_has_header_part")
524547

548+
@pytest.fixture
549+
def header_(self, request):
550+
return instance_mock(request, _Header)
551+
525552
@pytest.fixture
526553
def header_part_(self, request):
527554
return instance_mock(request, HeaderPart)

0 commit comments

Comments
 (0)