Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e16bee4

Browse files
committed
added extended props and table caption/description
1 parent da75fcf commit e16bee4

File tree

14 files changed

+421
-2
lines changed

14 files changed

+421
-2
lines changed

.idea/inspectionProfiles/Project_Default.xml

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/inspectionProfiles/profiles_settings.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/modules.xml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/python-docx.iml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docx/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22

33
from docx.api import Document # noqa
44

5-
__version__ = '0.8.10'
5+
__version__ = '0.9.0'
66

77

88
# register custom Part classes with opc package reader
99

1010
from docx.opc.constants import CONTENT_TYPE as CT, RELATIONSHIP_TYPE as RT
1111
from docx.opc.part import PartFactory
1212
from docx.opc.parts.coreprops import CorePropertiesPart
13+
from docx.opc.parts.extendedprops import ExtendedPropertiesPart
1314

1415
from docx.parts.document import DocumentPart
1516
from docx.parts.hdrftr import FooterPart, HeaderPart
@@ -33,6 +34,7 @@ def part_class_selector(content_type, reltype):
3334
PartFactory.part_type_for[CT.WML_NUMBERING] = NumberingPart
3435
PartFactory.part_type_for[CT.WML_SETTINGS] = SettingsPart
3536
PartFactory.part_type_for[CT.WML_STYLES] = StylesPart
37+
PartFactory.part_type_for[CT.OFC_EXTENDED_PROPERTIES] = ExtendedPropertiesPart
3638

3739
del (
3840
CT,

docx/document.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,14 @@ def core_properties(self):
101101
"""
102102
return self._part.core_properties
103103

104+
@property
105+
def extended_properties(self):
106+
"""
107+
A |ExtendedProperties| object providing read/write access to the extended
108+
properties of this document.
109+
"""
110+
return self._part.extended_properties
111+
104112
@property
105113
def inline_shapes(self):
106114
"""
@@ -191,6 +199,7 @@ class _Body(BlockItemContainer):
191199
Proxy for ``<w:body>`` element in this document, having primarily a
192200
container role.
193201
"""
202+
194203
def __init__(self, body_elm, parent):
195204
super(_Body, self).__init__(body_elm, parent)
196205
self._body = body_elm

docx/enum/section.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,6 @@ class WD_SECTION_START(XmlEnumeration):
101101
'ODD_PAGE', 4, 'oddPage', 'Section begins on next odd page.'
102102
),
103103
)
104+
105+
106+
WD_SECTION = WD_SECTION_START

docx/opc/extendedprops.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# encoding: utf-8
2+
3+
"""
4+
"""
5+
6+
from __future__ import (
7+
absolute_import, division, print_function, unicode_literals
8+
)
9+
from lxml.etree import tostring
10+
11+
12+
class ExtendedProperties(object):
13+
"""
14+
Corresponds to part named ``/docProps/app.xml``, containing the extended
15+
document properties for this document package.
16+
"""
17+
def __init__(self, element):
18+
self._element = element
19+
self.extended_properties = {}
20+
for s in self._element:
21+
self.extended_properties.update({s.tag.split('}')[1]: s.text})
22+
# print("extended properties list:", self.extended_properties)
23+
self.template = self.extended_properties["Template"] if "Template" in self.extended_properties else ""
24+
self.total_time = self.extended_properties["TotalTime"] if "TotalTime" in self.extended_properties else ""
25+
self.pages = self.extended_properties["Pages"] if "Pages" in self.extended_properties else ""
26+
self.words = self.extended_properties["Words"] if "Words" in self.extended_properties else ""
27+
self.characters = self.extended_properties["Characters"] if "Characters" in self.extended_properties else ""
28+
self.application = self.extended_properties["Application"] if "Application" in self.extended_properties else ""
29+
self.doc_security = self.extended_properties["DocSecurity"] if "DocSecurity" in self.extended_properties else ""
30+
self.lines = self.extended_properties["Lines"] if "Lines" in self.extended_properties else ""
31+
self.paragraphs = self.extended_properties["Paragraphs"] if "Paragraphs" in self.extended_properties else ""
32+
self.scale_crop = self.extended_properties["ScaleCrop"] if "ScaleCrop" in self.extended_properties else ""
33+
self.total_time = self.extended_properties["TotalTime"] if "TotalTime" in self.extended_properties else ""
34+
# TODO: HeadingPairs and TitlesOfParts
35+
self.manager = self.extended_properties["Manager"] if "Manager" in self.extended_properties else ""
36+
self.company = self.extended_properties["Company"] if "Company" in self.extended_properties else ""
37+
self.links_up_to_date = self.extended_properties["LinksUpToDate"] if "LinksUpToDate" in self.extended_properties else ""
38+
self.characters_with_spaces = self.extended_properties["CharactersWithSpaces"] if "CharactersWithSpaces" in self.extended_properties else ""
39+
self.shared_doc = self.extended_properties["SharedDoc"] if "SharedDoc" in self.extended_properties else ""
40+
self.hyperlink_base = self.extended_properties["HyperlinkBase"] if "HyperlinkBase" in self.extended_properties else ""
41+
self.hyperlinks_changed = self.extended_properties["HyperlinksChanged"] if "HyperlinksChanged" in self.extended_properties else ""
42+
self.app_version = self.extended_properties["AppVersion"] if "AppVersion" in self.extended_properties else ""
43+
44+

docx/opc/package.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from docx.opc.packuri import PACKAGE_URI, PackURI
99
from docx.opc.part import PartFactory
1010
from docx.opc.parts.coreprops import CorePropertiesPart
11+
from docx.opc.parts.extendedprops import ExtendedPropertiesPart
1112
from docx.opc.pkgreader import PackageReader
1213
from docx.opc.pkgwriter import PackageWriter
1314
from docx.opc.rel import Relationships
@@ -41,6 +42,14 @@ def core_properties(self):
4142
"""
4243
return self._core_properties_part.core_properties
4344

45+
@property
46+
def extended_properties(self):
47+
"""
48+
|ExtendedProperties| object providing read/write access to the Dublin
49+
Extended properties for this document.
50+
"""
51+
return self._extended_properties_part.extended_properties
52+
4453
def iter_rels(self):
4554
"""
4655
Generate exactly one reference to each relationship in the package by
@@ -184,6 +193,19 @@ def _core_properties_part(self):
184193
self.relate_to(core_properties_part, RT.CORE_PROPERTIES)
185194
return core_properties_part
186195

196+
@property
197+
def _extended_properties_part(self):
198+
"""
199+
|ExtendedPropertiesPart| object related to this package. Creates
200+
a default extended properties part if one is not present (not common).
201+
"""
202+
try:
203+
return self.part_related_by(RT.EXTENDED_PROPERTIES)
204+
except KeyError:
205+
extended_properties_part = ExtendedPropertiesPart.default(self)
206+
self.relate_to(extended_properties_part, RT.EXTENDED_PROPERTIES)
207+
return extended_properties_part
208+
187209

188210
class Unmarshaller(object):
189211
"""Hosts static methods for unmarshalling a package from a |PackageReader|."""

docx/opc/parts/extendedprops.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# encoding: utf-8
2+
3+
"""
4+
Core properties part, corresponds to ``/docProps/core.xml`` part in package.
5+
"""
6+
7+
from __future__ import (
8+
absolute_import, division, print_function, unicode_literals
9+
)
10+
11+
from datetime import datetime
12+
13+
from ..constants import CONTENT_TYPE as CT
14+
from ..extendedprops import ExtendedProperties
15+
from ...oxml.extendedprops import CT_ExtendedProperties
16+
from ..packuri import PackURI
17+
from ..part import XmlPart
18+
19+
20+
class ExtendedPropertiesPart(XmlPart):
21+
"""
22+
Corresponds to part named ``/docProps/app.xml``, containing the extended
23+
document properties for this document package.
24+
"""
25+
26+
@classmethod
27+
def default(cls, package):
28+
"""
29+
Return a new |CorePropertiesPart| object initialized with default
30+
values for its base properties.
31+
"""
32+
extended_properties_part = cls._new(package)
33+
extended_properties = extended_properties_part.extended_properties
34+
extended_properties.template = 'Normal.dotm'
35+
extended_properties.total_time = 0
36+
extended_properties.pages = 1
37+
extended_properties.words = 0
38+
extended_properties.characters = 0
39+
extended_properties.application = "python-docx"
40+
extended_properties.doc_security = 0
41+
extended_properties.lines = 1
42+
extended_properties.paragraphs = 1
43+
extended_properties.scale_crop = False
44+
# TODO: heading_pairs and titles_of_parts
45+
extended_properties.manager = "The Boss"
46+
extended_properties.company = ""
47+
extended_properties.links_up_to_date = False
48+
extended_properties.characters_with_spaces = 0
49+
extended_properties.shared_doc = False
50+
extended_properties.hyperlink_base = ""
51+
extended_properties.hyperlinks_changed = False
52+
extended_properties.app_version = "0.8.10"
53+
return extended_properties_part
54+
55+
@property
56+
def extended_properties(self):
57+
"""
58+
A |ExtendedProperties| object providing read/write access to the extended
59+
properties contained in this extended properties part.
60+
"""
61+
return ExtendedProperties(self.element)
62+
63+
@classmethod
64+
def _new(cls, package):
65+
partname = PackURI('/docProps/app.xml')
66+
content_type = CT.OFC_EXTENDED_PROPERTIES
67+
extendedProperties = CT_ExtendedProperties.new()
68+
return ExtendedPropertiesPart(
69+
partname, content_type, extendedProperties, package
70+
)

0 commit comments

Comments
 (0)