python-pptx2 2.13.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pptx2/__init__.py +152 -0
- pptx2/_color.py +75 -0
- pptx2/_slide_importer.py +597 -0
- pptx2/_svg.py +155 -0
- pptx2/_template_applier.py +292 -0
- pptx2/_textstyle.py +187 -0
- pptx2/accessibility.py +365 -0
- pptx2/action.py +270 -0
- pptx2/animation.py +2237 -0
- pptx2/api.py +49 -0
- pptx2/audit.py +258 -0
- pptx2/chart/__init__.py +0 -0
- pptx2/chart/analytics.py +381 -0
- pptx2/chart/axis.py +543 -0
- pptx2/chart/category.py +200 -0
- pptx2/chart/chart.py +670 -0
- pptx2/chart/data.py +864 -0
- pptx2/chart/datalabel.py +406 -0
- pptx2/chart/legend.py +86 -0
- pptx2/chart/marker.py +70 -0
- pptx2/chart/palettes.py +129 -0
- pptx2/chart/plot.py +462 -0
- pptx2/chart/point.py +101 -0
- pptx2/chart/quick_layouts.py +325 -0
- pptx2/chart/series.py +334 -0
- pptx2/chart/xlsx.py +272 -0
- pptx2/chart/xmlwriter.py +1845 -0
- pptx2/compose/__init__.py +28 -0
- pptx2/compose/from_spec.py +1094 -0
- pptx2/design/__init__.py +8 -0
- pptx2/design/components.py +607 -0
- pptx2/design/figures.py +389 -0
- pptx2/design/layout.py +370 -0
- pptx2/design/recipes.py +1967 -0
- pptx2/design/style.py +209 -0
- pptx2/design/tokens.py +915 -0
- pptx2/diagrams.py +754 -0
- pptx2/dml/__init__.py +0 -0
- pptx2/dml/chtfmt.py +40 -0
- pptx2/dml/color.py +496 -0
- pptx2/dml/effect.py +909 -0
- pptx2/dml/fill.py +691 -0
- pptx2/dml/line.py +287 -0
- pptx2/dml/picture.py +212 -0
- pptx2/dml/three_d.py +381 -0
- pptx2/enum/__init__.py +0 -0
- pptx2/enum/action.py +71 -0
- pptx2/enum/animation.py +31 -0
- pptx2/enum/base.py +218 -0
- pptx2/enum/chart.py +574 -0
- pptx2/enum/dml.py +740 -0
- pptx2/enum/lang.py +685 -0
- pptx2/enum/presentation.py +133 -0
- pptx2/enum/shapes.py +1029 -0
- pptx2/enum/text.py +230 -0
- pptx2/exc.py +42 -0
- pptx2/formats.py +139 -0
- pptx2/geometry.py +420 -0
- pptx2/inherit.py +109 -0
- pptx2/lint.py +2256 -0
- pptx2/math.py +177 -0
- pptx2/media.py +197 -0
- pptx2/opc/__init__.py +0 -0
- pptx2/opc/constants.py +332 -0
- pptx2/opc/oxml.py +188 -0
- pptx2/opc/package.py +762 -0
- pptx2/opc/packuri.py +109 -0
- pptx2/opc/serialized.py +296 -0
- pptx2/opc/shared.py +20 -0
- pptx2/opc/spec.py +45 -0
- pptx2/oxml/__init__.py +555 -0
- pptx2/oxml/action.py +53 -0
- pptx2/oxml/chart/__init__.py +0 -0
- pptx2/oxml/chart/axis.py +337 -0
- pptx2/oxml/chart/chart.py +481 -0
- pptx2/oxml/chart/datalabel.py +253 -0
- pptx2/oxml/chart/legend.py +72 -0
- pptx2/oxml/chart/marker.py +61 -0
- pptx2/oxml/chart/plot.py +365 -0
- pptx2/oxml/chart/series.py +425 -0
- pptx2/oxml/chart/shared.py +220 -0
- pptx2/oxml/coreprops.py +288 -0
- pptx2/oxml/dml/__init__.py +0 -0
- pptx2/oxml/dml/color.py +135 -0
- pptx2/oxml/dml/effect.py +213 -0
- pptx2/oxml/dml/fill.py +316 -0
- pptx2/oxml/dml/line.py +12 -0
- pptx2/oxml/dml/three_d.py +110 -0
- pptx2/oxml/ns.py +135 -0
- pptx2/oxml/presentation.py +313 -0
- pptx2/oxml/shapes/__init__.py +19 -0
- pptx2/oxml/shapes/autoshape.py +467 -0
- pptx2/oxml/shapes/connector.py +107 -0
- pptx2/oxml/shapes/graphfrm.py +347 -0
- pptx2/oxml/shapes/groupshape.py +329 -0
- pptx2/oxml/shapes/picture.py +270 -0
- pptx2/oxml/shapes/shared.py +577 -0
- pptx2/oxml/simpletypes.py +1027 -0
- pptx2/oxml/slide.py +563 -0
- pptx2/oxml/table.py +650 -0
- pptx2/oxml/text.py +815 -0
- pptx2/oxml/theme.py +36 -0
- pptx2/oxml/xmlchemy.py +717 -0
- pptx2/package.py +222 -0
- pptx2/parts/__init__.py +0 -0
- pptx2/parts/chart.py +95 -0
- pptx2/parts/coreprops.py +167 -0
- pptx2/parts/diagram.py +37 -0
- pptx2/parts/embeddedpackage.py +93 -0
- pptx2/parts/image.py +275 -0
- pptx2/parts/media.py +37 -0
- pptx2/parts/presentation.py +136 -0
- pptx2/parts/slide.py +371 -0
- pptx2/presentation.py +408 -0
- pptx2/py.typed +0 -0
- pptx2/render.py +586 -0
- pptx2/section.py +272 -0
- pptx2/shapes/__init__.py +26 -0
- pptx2/shapes/autoshape.py +442 -0
- pptx2/shapes/base.py +1078 -0
- pptx2/shapes/connector.py +297 -0
- pptx2/shapes/freeform.py +337 -0
- pptx2/shapes/graphfrm.py +316 -0
- pptx2/shapes/group.py +264 -0
- pptx2/shapes/picture.py +422 -0
- pptx2/shapes/placeholder.py +468 -0
- pptx2/shapes/shapetree.py +2027 -0
- pptx2/shared.py +82 -0
- pptx2/skill/SKILL.md +450 -0
- pptx2/skill/__init__.py +78 -0
- pptx2/skill/__main__.py +64 -0
- pptx2/skill/references/animations.md +189 -0
- pptx2/skill/references/basics.md +421 -0
- pptx2/skill/references/charts.md +254 -0
- pptx2/skill/references/compose.md +234 -0
- pptx2/skill/references/design.md +366 -0
- pptx2/skill/references/effects.md +249 -0
- pptx2/skill/references/end-to-end-deck.md +231 -0
- pptx2/skill/references/geometry-and-arrows.md +334 -0
- pptx2/skill/references/lint.md +275 -0
- pptx2/skill/references/math.md +86 -0
- pptx2/skill/references/picture-effects.md +129 -0
- pptx2/skill/references/render.md +151 -0
- pptx2/skill/references/smart-art.md +75 -0
- pptx2/skill/references/space-aware-authoring.md +249 -0
- pptx2/skill/references/tables.md +244 -0
- pptx2/skill/references/theme.md +127 -0
- pptx2/skill/references/three-d.md +109 -0
- pptx2/skill/references/transitions.md +100 -0
- pptx2/slide.py +1244 -0
- pptx2/smart_art.py +220 -0
- pptx2/spec.py +633 -0
- pptx2/table.py +1181 -0
- pptx2/table_styles.py +184 -0
- pptx2/templates/default.pptx +0 -0
- pptx2/templates/docx-icon.emf +0 -0
- pptx2/templates/generic-icon.emf +0 -0
- pptx2/templates/notes.xml +23 -0
- pptx2/templates/notesMaster.xml +352 -0
- pptx2/templates/pptx-icon.emf +0 -0
- pptx2/templates/theme.xml +321 -0
- pptx2/templates/xlsx-icon.emf +0 -0
- pptx2/text/__init__.py +0 -0
- pptx2/text/fonts.py +482 -0
- pptx2/text/layout.py +374 -0
- pptx2/text/text.py +1272 -0
- pptx2/theme.py +721 -0
- pptx2/types.py +36 -0
- pptx2/util.py +263 -0
- python_pptx2-2.13.0.dist-info/METADATA +351 -0
- python_pptx2-2.13.0.dist-info/RECORD +175 -0
- python_pptx2-2.13.0.dist-info/WHEEL +5 -0
- python_pptx2-2.13.0.dist-info/entry_points.txt +3 -0
- python_pptx2-2.13.0.dist-info/licenses/LICENSE +22 -0
- python_pptx2-2.13.0.dist-info/top_level.txt +1 -0
pptx2/chart/category.py
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"""Category-related objects.
|
|
2
|
+
|
|
3
|
+
The |category.Categories| object is returned by ``Plot.categories`` and contains zero or
|
|
4
|
+
more |category.Category| objects, each representing one of the category labels
|
|
5
|
+
associated with the plot. Categories can be hierarchical, so there are members allowing
|
|
6
|
+
discovery of the depth of that hierarchy and providing means to navigate it.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from collections.abc import Sequence
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Categories(Sequence):
|
|
15
|
+
"""
|
|
16
|
+
A sequence of |category.Category| objects, each representing a category
|
|
17
|
+
label on the chart. Provides properties for dealing with hierarchical
|
|
18
|
+
categories.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, xChart):
|
|
22
|
+
super(Categories, self).__init__()
|
|
23
|
+
self._xChart = xChart
|
|
24
|
+
|
|
25
|
+
def __getitem__(self, idx):
|
|
26
|
+
pt = self._xChart.cat_pts[idx]
|
|
27
|
+
return Category(pt, idx)
|
|
28
|
+
|
|
29
|
+
def __iter__(self):
|
|
30
|
+
cat_pts = self._xChart.cat_pts
|
|
31
|
+
for idx, pt in enumerate(cat_pts):
|
|
32
|
+
yield Category(pt, idx)
|
|
33
|
+
|
|
34
|
+
def __len__(self):
|
|
35
|
+
# a category can be "null", meaning the Excel cell for it is empty.
|
|
36
|
+
# In this case, there is no c:pt element for it. The "empty" category
|
|
37
|
+
# will, however, be accounted for in c:cat//c:ptCount/@val, which
|
|
38
|
+
# reflects the true length of the categories collection.
|
|
39
|
+
return self._xChart.cat_pt_count
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def depth(self):
|
|
43
|
+
"""
|
|
44
|
+
Return an integer representing the number of hierarchical levels in
|
|
45
|
+
this category collection. Returns 1 for non-hierarchical categories
|
|
46
|
+
and 0 if no categories are present (generally meaning no series are
|
|
47
|
+
present).
|
|
48
|
+
"""
|
|
49
|
+
cat = self._xChart.cat
|
|
50
|
+
if cat is None:
|
|
51
|
+
return 0
|
|
52
|
+
if cat.multiLvlStrRef is None:
|
|
53
|
+
return 1
|
|
54
|
+
return len(cat.lvls)
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def flattened_labels(self):
|
|
58
|
+
"""
|
|
59
|
+
Return a sequence of tuples, each containing the flattened hierarchy
|
|
60
|
+
of category labels for a leaf category. Each tuple is in parent ->
|
|
61
|
+
child order, e.g. ``('US', 'CA', 'San Francisco')``, with the leaf
|
|
62
|
+
category appearing last. If this categories collection is
|
|
63
|
+
non-hierarchical, each tuple will contain only a leaf category label.
|
|
64
|
+
If the plot has no series (and therefore no categories), an empty
|
|
65
|
+
tuple is returned.
|
|
66
|
+
"""
|
|
67
|
+
cat = self._xChart.cat
|
|
68
|
+
if cat is None:
|
|
69
|
+
return ()
|
|
70
|
+
|
|
71
|
+
if cat.multiLvlStrRef is None:
|
|
72
|
+
return tuple([(category.label,) for category in self])
|
|
73
|
+
|
|
74
|
+
return tuple(
|
|
75
|
+
[
|
|
76
|
+
tuple([category.label for category in reversed(flat_cat)])
|
|
77
|
+
for flat_cat in self._iter_flattened_categories()
|
|
78
|
+
]
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def levels(self):
|
|
83
|
+
"""
|
|
84
|
+
Return a sequence of |CategoryLevel| objects representing the
|
|
85
|
+
hierarchy of this category collection. The sequence is empty when the
|
|
86
|
+
category collection is not hierarchical, that is, contains only
|
|
87
|
+
leaf-level categories. The levels are ordered from the leaf level to
|
|
88
|
+
the root level; so the first level will contain the same categories
|
|
89
|
+
as this category collection.
|
|
90
|
+
"""
|
|
91
|
+
cat = self._xChart.cat
|
|
92
|
+
if cat is None:
|
|
93
|
+
return []
|
|
94
|
+
return [CategoryLevel(lvl) for lvl in cat.lvls]
|
|
95
|
+
|
|
96
|
+
def _iter_flattened_categories(self):
|
|
97
|
+
"""
|
|
98
|
+
Generate a ``tuple`` object for each leaf category in this
|
|
99
|
+
collection, containing the leaf category followed by its "parent"
|
|
100
|
+
categories, e.g. ``('San Francisco', 'CA', 'USA'). Each tuple will be
|
|
101
|
+
the same length as the number of levels (excepting certain edge
|
|
102
|
+
cases which I believe always indicate a chart construction error).
|
|
103
|
+
"""
|
|
104
|
+
levels = self.levels
|
|
105
|
+
if not levels:
|
|
106
|
+
return
|
|
107
|
+
leaf_level, remaining_levels = levels[0], levels[1:]
|
|
108
|
+
for category in leaf_level:
|
|
109
|
+
yield self._parentage((category,), remaining_levels)
|
|
110
|
+
|
|
111
|
+
def _parentage(self, categories, levels):
|
|
112
|
+
"""
|
|
113
|
+
Return a tuple formed by recursively concatenating *categories* with
|
|
114
|
+
its next ancestor from *levels*. The idx value of the first category
|
|
115
|
+
in *categories* determines parentage in all levels. The returned
|
|
116
|
+
sequence is in child -> parent order. A parent category is the
|
|
117
|
+
Category object in a next level having the maximum idx value not
|
|
118
|
+
exceeding that of the leaf category.
|
|
119
|
+
"""
|
|
120
|
+
# exhausting levels is the expected recursion termination condition
|
|
121
|
+
if not levels:
|
|
122
|
+
return tuple(categories)
|
|
123
|
+
|
|
124
|
+
# guard against edge case where next level is present but empty. That
|
|
125
|
+
# situation is not prohibited for some reason.
|
|
126
|
+
if not levels[0]:
|
|
127
|
+
return tuple(categories)
|
|
128
|
+
|
|
129
|
+
parent_level, remaining_levels = levels[0], levels[1:]
|
|
130
|
+
leaf_node = categories[0]
|
|
131
|
+
|
|
132
|
+
# Make the first parent the default. A possible edge case is where no
|
|
133
|
+
# parent is defined for one or more leading values, e.g. idx > 0 for
|
|
134
|
+
# the first parent.
|
|
135
|
+
parent = parent_level[0]
|
|
136
|
+
for category in parent_level:
|
|
137
|
+
if category.idx > leaf_node.idx:
|
|
138
|
+
break
|
|
139
|
+
parent = category
|
|
140
|
+
|
|
141
|
+
extended_categories = tuple(categories) + (parent,)
|
|
142
|
+
return self._parentage(extended_categories, remaining_levels)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class Category(str):
|
|
146
|
+
"""
|
|
147
|
+
An extension of `str` that provides the category label as its string
|
|
148
|
+
value, and additional attributes representing other aspects of the
|
|
149
|
+
category.
|
|
150
|
+
"""
|
|
151
|
+
|
|
152
|
+
def __new__(cls, pt, *args):
|
|
153
|
+
category_label = "" if pt is None else pt.v.text
|
|
154
|
+
return str.__new__(cls, category_label)
|
|
155
|
+
|
|
156
|
+
def __init__(self, pt, idx=None):
|
|
157
|
+
"""
|
|
158
|
+
*idx* is a required attribute of a c:pt element, but must be
|
|
159
|
+
specified when pt is None, as when a "placeholder" category is
|
|
160
|
+
created to represent a missing c:pt element.
|
|
161
|
+
"""
|
|
162
|
+
self._element = self._pt = pt
|
|
163
|
+
self._idx = idx
|
|
164
|
+
|
|
165
|
+
@property
|
|
166
|
+
def idx(self):
|
|
167
|
+
"""
|
|
168
|
+
Return an integer representing the index reference of this category.
|
|
169
|
+
For a leaf node, the index identifies the category. For a parent (or
|
|
170
|
+
other ancestor) category, the index specifies the first leaf category
|
|
171
|
+
that ancestor encloses.
|
|
172
|
+
"""
|
|
173
|
+
if self._pt is None:
|
|
174
|
+
return self._idx
|
|
175
|
+
return self._pt.idx
|
|
176
|
+
|
|
177
|
+
@property
|
|
178
|
+
def label(self):
|
|
179
|
+
"""
|
|
180
|
+
Return the label of this category as a string.
|
|
181
|
+
"""
|
|
182
|
+
return str(self)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class CategoryLevel(Sequence):
|
|
186
|
+
"""
|
|
187
|
+
A sequence of |category.Category| objects representing a single level in
|
|
188
|
+
a hierarchical category collection. This object is only used when the
|
|
189
|
+
categories are hierarchical, meaning they have more than one level and
|
|
190
|
+
higher level categories group those at lower levels.
|
|
191
|
+
"""
|
|
192
|
+
|
|
193
|
+
def __init__(self, lvl):
|
|
194
|
+
self._element = self._lvl = lvl
|
|
195
|
+
|
|
196
|
+
def __getitem__(self, offset):
|
|
197
|
+
return Category(self._lvl.pt_lst[offset])
|
|
198
|
+
|
|
199
|
+
def __len__(self):
|
|
200
|
+
return len(self._lvl.pt_lst)
|