1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
"""Custom element classes for presentation-related XML elements."""
from __future__ import annotations
from typing import TYPE_CHECKING, Callable, cast
from pptx.oxml.simpletypes import ST_SlideId, ST_SlideSizeCoordinate, XsdString
from pptx.oxml.xmlchemy import BaseOxmlElement, RequiredAttribute, ZeroOrMore, ZeroOrOne
if TYPE_CHECKING:
from pptx.util import Length
class CT_Presentation(BaseOxmlElement):
"""`p:presentation` element, root of the Presentation part stored as `/ppt/presentation.xml`."""
get_or_add_sldSz: Callable[[], CT_SlideSize]
get_or_add_sldIdLst: Callable[[], CT_SlideIdList]
get_or_add_sldMasterIdLst: Callable[[], CT_SlideMasterIdList]
sldMasterIdLst: CT_SlideMasterIdList | None = (
ZeroOrOne( # pyright: ignore[reportAssignmentType]
"p:sldMasterIdLst",
successors=(
"p:notesMasterIdLst",
"p:handoutMasterIdLst",
"p:sldIdLst",
"p:sldSz",
"p:notesSz",
),
)
)
sldIdLst: CT_SlideIdList | None = ZeroOrOne( # pyright: ignore[reportAssignmentType]
"p:sldIdLst", successors=("p:sldSz", "p:notesSz")
)
sldSz: CT_SlideSize | None = ZeroOrOne( # pyright: ignore[reportAssignmentType]
"p:sldSz", successors=("p:notesSz",)
)
class CT_SlideId(BaseOxmlElement):
"""`p:sldId` element.
Direct child of `p:sldIdLst` that contains an `rId` reference to a slide in the presentation.
"""
id: int = RequiredAttribute("id", ST_SlideId) # pyright: ignore[reportAssignmentType]
rId: str = RequiredAttribute("r:id", XsdString) # pyright: ignore[reportAssignmentType]
class CT_SlideIdList(BaseOxmlElement):
"""`p:sldIdLst` element.
Direct child of <p:presentation> that contains a list of the slide parts in the presentation.
"""
sldId_lst: list[CT_SlideId]
_add_sldId: Callable[..., CT_SlideId]
sldId = ZeroOrMore("p:sldId")
def add_sldId(self, rId: str) -> CT_SlideId:
"""Create and return a reference to a new `p:sldId` child element.
The new `p:sldId` element has its r:id attribute set to `rId`.
"""
return self._add_sldId(id=self._next_id, rId=rId)
@property
def _next_id(self) -> int:
"""The next available slide ID as an `int`.
Valid slide IDs start at 256. The next integer value greater than the max value in use is
chosen, which minimizes that chance of reusing the id of a deleted slide.
"""
MIN_SLIDE_ID = 256
MAX_SLIDE_ID = 2147483647
used_ids = [int(s) for s in cast("list[str]", self.xpath("./p:sldId/@id"))]
simple_next = max([MIN_SLIDE_ID - 1] + used_ids) + 1
if simple_next <= MAX_SLIDE_ID:
return simple_next
# -- fall back to search for next unused from bottom --
valid_used_ids = sorted(id for id in used_ids if (MIN_SLIDE_ID <= id <= MAX_SLIDE_ID))
return (
next(
candidate_id
for candidate_id, used_id in enumerate(valid_used_ids, start=MIN_SLIDE_ID)
if candidate_id != used_id
)
if valid_used_ids
else 256
)
class CT_SlideMasterIdList(BaseOxmlElement):
"""`p:sldMasterIdLst` element.
Child of `p:presentation` containing references to the slide masters that belong to the
presentation.
"""
sldMasterId_lst: list[CT_SlideMasterIdListEntry]
sldMasterId = ZeroOrMore("p:sldMasterId")
class CT_SlideMasterIdListEntry(BaseOxmlElement):
"""
``<p:sldMasterId>`` element, child of ``<p:sldMasterIdLst>`` containing
a reference to a slide master.
"""
rId: str = RequiredAttribute("r:id", XsdString) # pyright: ignore[reportAssignmentType]
class CT_SlideSize(BaseOxmlElement):
"""`p:sldSz` element.
Direct child of <p:presentation> that contains the width and height of slides in the
presentation.
"""
cx: Length = RequiredAttribute( # pyright: ignore[reportAssignmentType]
"cx", ST_SlideSizeCoordinate
)
cy: Length = RequiredAttribute( # pyright: ignore[reportAssignmentType]
"cy", ST_SlideSizeCoordinate
)
|