Skip to content

Commit a460f3b

Browse files
committed
wip
1 parent 90e453c commit a460f3b

File tree

7 files changed

+96
-9
lines changed

7 files changed

+96
-9
lines changed

docx/document.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@
88
absolute_import, division, print_function, unicode_literals
99
)
1010

11-
from .opc.constants import RELATIONSHIP_TYPE as RT
11+
from .oxml import OxmlElement
12+
from .oxml.header import CT_Header
13+
from .oxml.ns import qn
14+
from .parts.header import HeaderPart
15+
from .opc.constants import RELATIONSHIP_TYPE as RT, CONTENT_TYPE as CT
16+
from .opc.packuri import PackURI
1217
from .blkcntnr import BlockItemContainer
1318
from .enum.section import WD_SECTION
1419
from .enum.text import WD_BREAK
@@ -208,7 +213,39 @@ def __init__(self, body_elm, parent):
208213
self._body = body_elm
209214

210215
def add_header(self, text):
211-
return text
216+
rel_id = 'rId9'
217+
target = 'header1.xml'
218+
219+
# make header_ref_elm
220+
header_ref_elm_tag = 'w:headerReference'
221+
header_attrs = {
222+
qn('r:id'): rel_id,
223+
qn('w:type'): "default"
224+
}
225+
header_ref_elm = OxmlElement(header_ref_elm_tag, attrs=header_attrs)
226+
227+
# make header_elm
228+
header_elm_tag = 'w:hdr'
229+
# WRITE THE NEW METHOD YO WITH header_elm_tag
230+
header_elm = CT_Header.new(partname, content_type)
231+
232+
# make header instance (wrapper around elm)
233+
header = BlockItemContainer(header_elm, self)
234+
header.add_paragraph(text)
235+
236+
# make target part
237+
partname = PackURI('/word/header1.xml')
238+
content_type = CT.WML_HEADER
239+
target = HeaderPart(partname, content_type, header_elm, self._parent._part.package)
240+
241+
# TODO figure out nicer way to get this
242+
RELATIONSHIPS_SCHEMA = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'
243+
reltype = '%s/header' % RELATIONSHIPS_SCHEMA
244+
rel = self._parent.part.rels.add_relationship(reltype, target, rel_id)
245+
246+
sentinel_sectPr = self._body.get_or_add_sectPr()
247+
sentinel_sectPr.append(header_ref_elm)
248+
return rel
212249

213250
def remove_headers(self):
214251
"""

docx/header.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from .blkcntnr import BlockItemContainer
2+
3+
4+
# TODO figure out if this needed?
5+
6+
7+
class Header(BlockItemContainer):
8+
"""
9+
Proxy object wrapping ``<w:p>`` element.
10+
"""
11+
def __init__(self, header_elm, parent):
12+
super(Header, self).__init__(header_elm, parent)
13+
14+
# add paragraph inherited from parent
15+
# add image needs to be added I think?

docx/oxml/header.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from .xmlchemy import BaseOxmlElement, ZeroOrMore
2+
3+
4+
class CT_Header(BaseOxmlElement):
5+
"""
6+
``<w:body>``, the container element for the main document story in
7+
``document.xml``.
8+
"""
9+
p = ZeroOrMore('w:p', successors=())
10+
11+
# TODO DO THIS METHOD!
12+
@staticmethod
13+
def new(partname, content_type):
14+
"""
15+
Return a new ``<Override>`` element with attributes set to parameter
16+
values.
17+
"""
18+
pass
19+
# xml = '<Override xmlns="%s"/>' % nsmap['ct']
20+
# override = parse_xml(xml)
21+
# override.set('PartName', partname)
22+
# override.set('ContentType', content_type)
23+
# return override

docx/oxml/section.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@
1313
from .xmlchemy import BaseOxmlElement, OptionalAttribute, ZeroOrOne
1414

1515

16+
class CT_HeaderReference(BaseOxmlElement):
17+
"""
18+
``<w:headerReference>``, the element for the header reference
19+
"""
20+
21+
1622
class CT_PageMar(BaseOxmlElement):
1723
"""
1824
``<w:pgMar>`` element, defining page margins.

docx/oxml/xmlchemy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
from . import OxmlElement
1515
from ..compat import Unicode
1616
from .exceptions import InvalidXmlError
17-
from .ns import NamespacePrefixedTag, nsmap, qn
1817
from ..shared import lazyproperty
18+
from .ns import NamespacePrefixedTag, nsmap, qn
1919

2020

2121
def serialize_for_reading(element):

docx/parts/header.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,6 @@
33

44
class HeaderPart(XmlPart):
55
pass
6+
# def __init__(self, partname, content_type, blob, package):
7+
# super(HeaderPart, self).__init__(partname, content_type, blob)
8+
# self._header = header

tests/test_header.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,16 @@ def it_adds_a_header(self):
5050
document.remove_headers()
5151

5252
header = document.add_header('foobar')
53+
header_elm_tag = 'w:headerReference'
54+
sentinel_sectPr = document._body._body.get_or_add_sectPr()
55+
header_elms = sentinel_sectPr.findall(qn(header_elm_tag))
56+
assert len(header_elms) == 1
5357

5458
assert header
55-
assert header != 'foobar'
56-
# import uuid
57-
# random_name = uuid.uuid4().hex
58-
# finish_path = '{}.docx'.format(random_name)
59-
# document.save(finish_path)
60-
# print 'file {} header removed!'.format(finish_path)
59+
import uuid
60+
random_name = uuid.uuid4().hex
61+
finish_path = '{}.docx'.format(random_name)
62+
document.save(finish_path)
63+
print 'file {} header removed!'.format(finish_path)
6164

6265
# class DescribeHeaderAdd(object):

0 commit comments

Comments
 (0)