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.
Files changed (175) hide show
  1. pptx2/__init__.py +152 -0
  2. pptx2/_color.py +75 -0
  3. pptx2/_slide_importer.py +597 -0
  4. pptx2/_svg.py +155 -0
  5. pptx2/_template_applier.py +292 -0
  6. pptx2/_textstyle.py +187 -0
  7. pptx2/accessibility.py +365 -0
  8. pptx2/action.py +270 -0
  9. pptx2/animation.py +2237 -0
  10. pptx2/api.py +49 -0
  11. pptx2/audit.py +258 -0
  12. pptx2/chart/__init__.py +0 -0
  13. pptx2/chart/analytics.py +381 -0
  14. pptx2/chart/axis.py +543 -0
  15. pptx2/chart/category.py +200 -0
  16. pptx2/chart/chart.py +670 -0
  17. pptx2/chart/data.py +864 -0
  18. pptx2/chart/datalabel.py +406 -0
  19. pptx2/chart/legend.py +86 -0
  20. pptx2/chart/marker.py +70 -0
  21. pptx2/chart/palettes.py +129 -0
  22. pptx2/chart/plot.py +462 -0
  23. pptx2/chart/point.py +101 -0
  24. pptx2/chart/quick_layouts.py +325 -0
  25. pptx2/chart/series.py +334 -0
  26. pptx2/chart/xlsx.py +272 -0
  27. pptx2/chart/xmlwriter.py +1845 -0
  28. pptx2/compose/__init__.py +28 -0
  29. pptx2/compose/from_spec.py +1094 -0
  30. pptx2/design/__init__.py +8 -0
  31. pptx2/design/components.py +607 -0
  32. pptx2/design/figures.py +389 -0
  33. pptx2/design/layout.py +370 -0
  34. pptx2/design/recipes.py +1967 -0
  35. pptx2/design/style.py +209 -0
  36. pptx2/design/tokens.py +915 -0
  37. pptx2/diagrams.py +754 -0
  38. pptx2/dml/__init__.py +0 -0
  39. pptx2/dml/chtfmt.py +40 -0
  40. pptx2/dml/color.py +496 -0
  41. pptx2/dml/effect.py +909 -0
  42. pptx2/dml/fill.py +691 -0
  43. pptx2/dml/line.py +287 -0
  44. pptx2/dml/picture.py +212 -0
  45. pptx2/dml/three_d.py +381 -0
  46. pptx2/enum/__init__.py +0 -0
  47. pptx2/enum/action.py +71 -0
  48. pptx2/enum/animation.py +31 -0
  49. pptx2/enum/base.py +218 -0
  50. pptx2/enum/chart.py +574 -0
  51. pptx2/enum/dml.py +740 -0
  52. pptx2/enum/lang.py +685 -0
  53. pptx2/enum/presentation.py +133 -0
  54. pptx2/enum/shapes.py +1029 -0
  55. pptx2/enum/text.py +230 -0
  56. pptx2/exc.py +42 -0
  57. pptx2/formats.py +139 -0
  58. pptx2/geometry.py +420 -0
  59. pptx2/inherit.py +109 -0
  60. pptx2/lint.py +2256 -0
  61. pptx2/math.py +177 -0
  62. pptx2/media.py +197 -0
  63. pptx2/opc/__init__.py +0 -0
  64. pptx2/opc/constants.py +332 -0
  65. pptx2/opc/oxml.py +188 -0
  66. pptx2/opc/package.py +762 -0
  67. pptx2/opc/packuri.py +109 -0
  68. pptx2/opc/serialized.py +296 -0
  69. pptx2/opc/shared.py +20 -0
  70. pptx2/opc/spec.py +45 -0
  71. pptx2/oxml/__init__.py +555 -0
  72. pptx2/oxml/action.py +53 -0
  73. pptx2/oxml/chart/__init__.py +0 -0
  74. pptx2/oxml/chart/axis.py +337 -0
  75. pptx2/oxml/chart/chart.py +481 -0
  76. pptx2/oxml/chart/datalabel.py +253 -0
  77. pptx2/oxml/chart/legend.py +72 -0
  78. pptx2/oxml/chart/marker.py +61 -0
  79. pptx2/oxml/chart/plot.py +365 -0
  80. pptx2/oxml/chart/series.py +425 -0
  81. pptx2/oxml/chart/shared.py +220 -0
  82. pptx2/oxml/coreprops.py +288 -0
  83. pptx2/oxml/dml/__init__.py +0 -0
  84. pptx2/oxml/dml/color.py +135 -0
  85. pptx2/oxml/dml/effect.py +213 -0
  86. pptx2/oxml/dml/fill.py +316 -0
  87. pptx2/oxml/dml/line.py +12 -0
  88. pptx2/oxml/dml/three_d.py +110 -0
  89. pptx2/oxml/ns.py +135 -0
  90. pptx2/oxml/presentation.py +313 -0
  91. pptx2/oxml/shapes/__init__.py +19 -0
  92. pptx2/oxml/shapes/autoshape.py +467 -0
  93. pptx2/oxml/shapes/connector.py +107 -0
  94. pptx2/oxml/shapes/graphfrm.py +347 -0
  95. pptx2/oxml/shapes/groupshape.py +329 -0
  96. pptx2/oxml/shapes/picture.py +270 -0
  97. pptx2/oxml/shapes/shared.py +577 -0
  98. pptx2/oxml/simpletypes.py +1027 -0
  99. pptx2/oxml/slide.py +563 -0
  100. pptx2/oxml/table.py +650 -0
  101. pptx2/oxml/text.py +815 -0
  102. pptx2/oxml/theme.py +36 -0
  103. pptx2/oxml/xmlchemy.py +717 -0
  104. pptx2/package.py +222 -0
  105. pptx2/parts/__init__.py +0 -0
  106. pptx2/parts/chart.py +95 -0
  107. pptx2/parts/coreprops.py +167 -0
  108. pptx2/parts/diagram.py +37 -0
  109. pptx2/parts/embeddedpackage.py +93 -0
  110. pptx2/parts/image.py +275 -0
  111. pptx2/parts/media.py +37 -0
  112. pptx2/parts/presentation.py +136 -0
  113. pptx2/parts/slide.py +371 -0
  114. pptx2/presentation.py +408 -0
  115. pptx2/py.typed +0 -0
  116. pptx2/render.py +586 -0
  117. pptx2/section.py +272 -0
  118. pptx2/shapes/__init__.py +26 -0
  119. pptx2/shapes/autoshape.py +442 -0
  120. pptx2/shapes/base.py +1078 -0
  121. pptx2/shapes/connector.py +297 -0
  122. pptx2/shapes/freeform.py +337 -0
  123. pptx2/shapes/graphfrm.py +316 -0
  124. pptx2/shapes/group.py +264 -0
  125. pptx2/shapes/picture.py +422 -0
  126. pptx2/shapes/placeholder.py +468 -0
  127. pptx2/shapes/shapetree.py +2027 -0
  128. pptx2/shared.py +82 -0
  129. pptx2/skill/SKILL.md +450 -0
  130. pptx2/skill/__init__.py +78 -0
  131. pptx2/skill/__main__.py +64 -0
  132. pptx2/skill/references/animations.md +189 -0
  133. pptx2/skill/references/basics.md +421 -0
  134. pptx2/skill/references/charts.md +254 -0
  135. pptx2/skill/references/compose.md +234 -0
  136. pptx2/skill/references/design.md +366 -0
  137. pptx2/skill/references/effects.md +249 -0
  138. pptx2/skill/references/end-to-end-deck.md +231 -0
  139. pptx2/skill/references/geometry-and-arrows.md +334 -0
  140. pptx2/skill/references/lint.md +275 -0
  141. pptx2/skill/references/math.md +86 -0
  142. pptx2/skill/references/picture-effects.md +129 -0
  143. pptx2/skill/references/render.md +151 -0
  144. pptx2/skill/references/smart-art.md +75 -0
  145. pptx2/skill/references/space-aware-authoring.md +249 -0
  146. pptx2/skill/references/tables.md +244 -0
  147. pptx2/skill/references/theme.md +127 -0
  148. pptx2/skill/references/three-d.md +109 -0
  149. pptx2/skill/references/transitions.md +100 -0
  150. pptx2/slide.py +1244 -0
  151. pptx2/smart_art.py +220 -0
  152. pptx2/spec.py +633 -0
  153. pptx2/table.py +1181 -0
  154. pptx2/table_styles.py +184 -0
  155. pptx2/templates/default.pptx +0 -0
  156. pptx2/templates/docx-icon.emf +0 -0
  157. pptx2/templates/generic-icon.emf +0 -0
  158. pptx2/templates/notes.xml +23 -0
  159. pptx2/templates/notesMaster.xml +352 -0
  160. pptx2/templates/pptx-icon.emf +0 -0
  161. pptx2/templates/theme.xml +321 -0
  162. pptx2/templates/xlsx-icon.emf +0 -0
  163. pptx2/text/__init__.py +0 -0
  164. pptx2/text/fonts.py +482 -0
  165. pptx2/text/layout.py +374 -0
  166. pptx2/text/text.py +1272 -0
  167. pptx2/theme.py +721 -0
  168. pptx2/types.py +36 -0
  169. pptx2/util.py +263 -0
  170. python_pptx2-2.13.0.dist-info/METADATA +351 -0
  171. python_pptx2-2.13.0.dist-info/RECORD +175 -0
  172. python_pptx2-2.13.0.dist-info/WHEEL +5 -0
  173. python_pptx2-2.13.0.dist-info/entry_points.txt +3 -0
  174. python_pptx2-2.13.0.dist-info/licenses/LICENSE +22 -0
  175. python_pptx2-2.13.0.dist-info/top_level.txt +1 -0
pptx2/enum/base.py ADDED
@@ -0,0 +1,218 @@
1
+ """Base classes and other objects used by enumerations."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import enum
6
+ import textwrap
7
+ import warnings
8
+ from typing import TYPE_CHECKING, Any, Type, TypeVar
9
+
10
+ if TYPE_CHECKING:
11
+ from typing_extensions import Self
12
+
13
+ _T = TypeVar("_T", bound="BaseXmlEnum")
14
+
15
+
16
+ class _DeprecatingEnumMeta(enum.EnumMeta):
17
+ """Metaclass that issues a `DeprecationWarning` for accesses to deprecated aliases.
18
+
19
+ Enum subclasses opt in by declaring a `__deprecated_aliases__` class attribute
20
+ mapping the deprecated name to the canonical name (e.g.
21
+ `__deprecated_aliases__ = {"ERCENT_40": "PERCENT_40"}`). The deprecated alias
22
+ must still be defined as a Python `enum` alias of the canonical member so that
23
+ user code keeps working; the metaclass simply emits the warning when the alias
24
+ name is used to look up the member.
25
+ """
26
+
27
+ def __getattribute__(cls, name: str):
28
+ # -- bypass for dunders to avoid recursion and keep overhead off the hot path --
29
+ if not (name.startswith("_") and name.endswith("_")):
30
+ try:
31
+ aliases = enum.EnumMeta.__getattribute__(cls, "__deprecated_aliases__")
32
+ except AttributeError:
33
+ aliases = None
34
+ if aliases and name in aliases:
35
+ canonical = aliases[name]
36
+ warnings.warn(
37
+ f"{cls.__name__}.{name} is a deprecated alias for "
38
+ f"{cls.__name__}.{canonical}; use the canonical name.",
39
+ DeprecationWarning,
40
+ stacklevel=2,
41
+ )
42
+ name = canonical
43
+ return enum.EnumMeta.__getattribute__(cls, name)
44
+
45
+
46
+ class BaseEnum(int, enum.Enum, metaclass=_DeprecatingEnumMeta):
47
+ """Base class for Enums that do not map XML attr values.
48
+
49
+ The enum's value will be an integer, corresponding to the integer assigned the
50
+ corresponding member in the MS API enum of the same name.
51
+ """
52
+
53
+ def __new__(cls, ms_api_value: int, docstr: str):
54
+ self = int.__new__(cls, ms_api_value)
55
+ self._value_ = ms_api_value
56
+ self.__doc__ = docstr.strip()
57
+ return self
58
+
59
+ def __str__(self):
60
+ """The symbolic name and string value of this member, e.g. 'MIDDLE (3)'."""
61
+ return f"{self.name} ({self.value})"
62
+
63
+
64
+ class BaseXmlEnum(int, enum.Enum, metaclass=_DeprecatingEnumMeta):
65
+ """Base class for Enums that also map XML attr values.
66
+
67
+ The enum's value will be an integer, corresponding to the integer assigned the
68
+ corresponding member in the MS API enum of the same name.
69
+ """
70
+
71
+ xml_value: str | None
72
+
73
+ def __new__(cls, ms_api_value: int, xml_value: str | None, docstr: str):
74
+ self = int.__new__(cls, ms_api_value)
75
+ self._value_ = ms_api_value
76
+ self.xml_value = xml_value
77
+ self.__doc__ = docstr.strip()
78
+ return self
79
+
80
+ def __str__(self):
81
+ """The symbolic name and string value of this member, e.g. 'MIDDLE (3)'."""
82
+ return f"{self.name} ({self.value})"
83
+
84
+ @classmethod
85
+ def from_xml(cls, xml_value: str) -> Self:
86
+ """Enumeration member corresponding to XML attribute value `xml_value`.
87
+
88
+ Raises `ValueError` if `xml_value` is the empty string ("") or is not an XML attribute
89
+ value registered on the enumeration. Note that enum members that do not correspond to one
90
+ of the defined values for an XML attribute have `xml_value == ""`. These
91
+ "return-value only" members cannot be automatically mapped from an XML attribute value and
92
+ must be selected explicitly by code, based on the appropriate conditions.
93
+
94
+ Example::
95
+
96
+ >>> WD_PARAGRAPH_ALIGNMENT.from_xml("center")
97
+ WD_PARAGRAPH_ALIGNMENT.CENTER
98
+
99
+ """
100
+ # -- the empty string never maps to a member --
101
+ member = (
102
+ next((member for member in cls if member.xml_value == xml_value), None)
103
+ if xml_value
104
+ else None
105
+ )
106
+
107
+ # -- legacy/alternate spellings: map a read-only alias to its canonical
108
+ # -- xml_value so files written by older versions still load. Opt in by
109
+ # -- declaring `__xml_read_aliases__ = {"legacyValue": "canonicalValue"}`
110
+ # -- on the enum. Aliases are read-only; `to_xml` always emits canonical.
111
+ if member is None and xml_value:
112
+ aliases = getattr(cls, "__xml_read_aliases__", None)
113
+ if aliases and xml_value in aliases:
114
+ canonical = aliases[xml_value]
115
+ member = next(
116
+ (m for m in cls if m.xml_value == canonical), None
117
+ )
118
+
119
+ if member is None:
120
+ raise ValueError(f"{cls.__name__} has no XML mapping for {repr(xml_value)}")
121
+
122
+ return member
123
+
124
+ @classmethod
125
+ def to_xml(cls: Type[_T], value: int | _T) -> str:
126
+ """XML value of this enum member, generally an XML attribute value."""
127
+ # -- presence of multi-arg `__new__()` method fools type-checker, but getting a
128
+ # -- member by its value using EnumCls(val) works as usual.
129
+ member = cls(value)
130
+ xml_value = member.xml_value
131
+ if not xml_value:
132
+ raise ValueError(f"{cls.__name__}.{member.name} has no XML representation")
133
+ return xml_value
134
+
135
+ @classmethod
136
+ def validate(cls: Type[_T], value: _T):
137
+ """Raise |ValueError| if `value` is not an assignable value."""
138
+ if value not in cls:
139
+ raise ValueError(f"{value} not a member of {cls.__name__} enumeration")
140
+
141
+
142
+ class DocsPageFormatter(object):
143
+ """Formats a reStructuredText documention page (string) for an enumeration."""
144
+
145
+ def __init__(self, clsname: str, clsdict: dict[str, Any]):
146
+ self._clsname = clsname
147
+ self._clsdict = clsdict
148
+
149
+ @property
150
+ def page_str(self):
151
+ """
152
+ The RestructuredText documentation page for the enumeration. This is
153
+ the only API member for the class.
154
+ """
155
+ tmpl = ".. _%s:\n\n%s\n\n%s\n\n----\n\n%s"
156
+ components = (
157
+ self._ms_name,
158
+ self._page_title,
159
+ self._intro_text,
160
+ self._member_defs,
161
+ )
162
+ return tmpl % components
163
+
164
+ @property
165
+ def _intro_text(self):
166
+ """
167
+ The docstring of the enumeration, formatted for use at the top of the
168
+ documentation page
169
+ """
170
+ try:
171
+ cls_docstring = self._clsdict["__doc__"]
172
+ except KeyError:
173
+ cls_docstring = ""
174
+
175
+ if cls_docstring is None:
176
+ return ""
177
+
178
+ return textwrap.dedent(cls_docstring).strip()
179
+
180
+ def _member_def(self, member: BaseEnum | BaseXmlEnum):
181
+ """Return an individual member definition formatted as an RST glossary entry.
182
+
183
+ Output is wrapped to fit within 78 columns.
184
+ """
185
+ member_docstring = textwrap.dedent(member.__doc__ or "").strip()
186
+ member_docstring = textwrap.fill(
187
+ member_docstring,
188
+ width=78,
189
+ initial_indent=" " * 4,
190
+ subsequent_indent=" " * 4,
191
+ )
192
+ return "%s\n%s\n" % (member.name, member_docstring)
193
+
194
+ @property
195
+ def _member_defs(self):
196
+ """
197
+ A single string containing the aggregated member definitions section
198
+ of the documentation page
199
+ """
200
+ members = self._clsdict["__members__"]
201
+ member_defs = [self._member_def(member) for member in members if member.name is not None]
202
+ return "\n".join(member_defs)
203
+
204
+ @property
205
+ def _ms_name(self):
206
+ """
207
+ The Microsoft API name for this enumeration
208
+ """
209
+ return self._clsdict["__ms_name__"]
210
+
211
+ @property
212
+ def _page_title(self):
213
+ """
214
+ The title for the documentation page, formatted as code (surrounded
215
+ in double-backtics) and underlined with '=' characters
216
+ """
217
+ title_underscore = "=" * (len(self._clsname) + 4)
218
+ return "``%s``\n%s" % (self._clsname, title_underscore)