Skip to content

Commit 2afbbb6

Browse files
ondrej-111scanny
authored andcommitted
hdr: add _Header._add_header_part()
1 parent d5a03da commit 2afbbb6

File tree

5 files changed

+48
-1
lines changed

5 files changed

+48
-1
lines changed

docx/oxml/section.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
BaseOxmlElement,
1313
OptionalAttribute,
1414
RequiredAttribute,
15+
ZeroOrMore,
1516
ZeroOrOne,
1617
)
1718

@@ -56,11 +57,22 @@ class CT_SectPr(BaseOxmlElement):
5657
'w:noEndnote', 'w:titlePg', 'w:textDirection', 'w:bidi', 'w:rtlGutter',
5758
'w:docGrid', 'w:printerSettings', 'w:sectPrChange',
5859
)
60+
headerReference = ZeroOrMore("w:headerReference", successors=_tag_seq)
5961
type = ZeroOrOne("w:type", successors=_tag_seq[3:])
6062
pgSz = ZeroOrOne("w:pgSz", successors=_tag_seq[4:])
6163
pgMar = ZeroOrOne("w:pgMar", successors=_tag_seq[5:])
6264
del _tag_seq
6365

66+
def add_headerReference(self, type_, rId):
67+
"""Return newly added CT_HdrFtrRef element of *type_* with *rId*.
68+
69+
The element tag is `w:headerReference`.
70+
"""
71+
headerReference = self._add_headerReference()
72+
headerReference.type_ = type_
73+
headerReference.rId = rId
74+
return headerReference
75+
6476
@property
6577
def bottom_margin(self):
6678
"""

docx/parts/document.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ class DocumentPart(XmlPart):
2424
objects provides access to this part object for that purpose.
2525
"""
2626

27+
def add_header_part(self):
28+
"""Return (header_part, rId) pair for newly-created header part."""
29+
raise NotImplementedError
30+
2731
@property
2832
def core_properties(self):
2933
"""

docx/parts/hdrftr.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# encoding: utf-8
2+
3+
"""Header and footer part objects"""
4+
5+
from __future__ import absolute_import, division, print_function, unicode_literals
6+
7+
from docx.opc.part import XmlPart
8+
9+
10+
class HeaderPart(XmlPart):
11+
"""Definition of a section header."""

docx/section.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,9 @@ def is_linked_to_previous(self, value):
253253

254254
def _add_header_part(self):
255255
"""Return newly-added header part."""
256-
raise NotImplementedError
256+
header_part, rId = self._document_part.add_header_part()
257+
self._sectPr.add_headerReference(WD_HEADER_FOOTER.PRIMARY, rId)
258+
return header_part
257259

258260
def _drop_header_part(self):
259261
"""Remove header definition associated with this section."""

tests/test_section.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from docx.enum.section import WD_ORIENT, WD_SECTION
1010
from docx.parts.document import DocumentPart
11+
from docx.parts.hdrftr import HeaderPart
1112
from docx.section import _Footer, _Header, Section, Sections
1213
from docx.shared import Inches
1314

@@ -386,6 +387,19 @@ def it_can_change_whether_it_is_linked_to_previous_header(
386387
assert _drop_header_part_.call_args_list == [call(header)] * drop_calls
387388
assert _add_header_part_.call_args_list == [call(header)] * add_calls
388389

390+
def it_can_add_a_header_part_to_help(self, document_part_, header_part_):
391+
sectPr = element("w:sectPr{r:a=b}")
392+
document_part_.add_header_part.return_value = header_part_, "rId3"
393+
header = _Header(sectPr, document_part_)
394+
395+
header_part = header._add_header_part()
396+
397+
document_part_.add_header_part.assert_called_once_with()
398+
assert sectPr.xml == xml(
399+
"w:sectPr{r:a=b}/w:headerReference{w:type=default,r:id=rId3}"
400+
)
401+
assert header_part is header_part_
402+
389403
def it_can_drop_the_related_header_part_to_help(self, document_part_):
390404
sectPr = element("w:sectPr{r:a=b}/w:headerReference{w:type=default,r:id=rId42}")
391405
header = _Header(sectPr, document_part_)
@@ -449,3 +463,7 @@ def _drop_header_part_(self, request):
449463
@pytest.fixture
450464
def _has_header_part_prop_(self, request):
451465
return property_mock(request, _Header, "_has_header_part")
466+
467+
@pytest.fixture
468+
def header_part_(self, request):
469+
return instance_mock(request, HeaderPart)

0 commit comments

Comments
 (0)