about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/docx/parts/document.py
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/docx/parts/document.py')
-rw-r--r--.venv/lib/python3.12/site-packages/docx/parts/document.py149
1 files changed, 149 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/docx/parts/document.py b/.venv/lib/python3.12/site-packages/docx/parts/document.py
new file mode 100644
index 00000000..416bb1a2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/docx/parts/document.py
@@ -0,0 +1,149 @@
+"""|DocumentPart| and closely related objects."""
+
+from __future__ import annotations
+
+from typing import IO, TYPE_CHECKING, cast
+
+from docx.document import Document
+from docx.enum.style import WD_STYLE_TYPE
+from docx.opc.constants import RELATIONSHIP_TYPE as RT
+from docx.parts.hdrftr import FooterPart, HeaderPart
+from docx.parts.numbering import NumberingPart
+from docx.parts.settings import SettingsPart
+from docx.parts.story import StoryPart
+from docx.parts.styles import StylesPart
+from docx.shape import InlineShapes
+from docx.shared import lazyproperty
+
+if TYPE_CHECKING:
+    from docx.opc.coreprops import CoreProperties
+    from docx.settings import Settings
+    from docx.styles.style import BaseStyle
+
+
+class DocumentPart(StoryPart):
+    """Main document part of a WordprocessingML (WML) package, aka a .docx file.
+
+    Acts as broker to other parts such as image, core properties, and style parts. It
+    also acts as a convenient delegate when a mid-document object needs a service
+    involving a remote ancestor. The `Parented.part` property inherited by many content
+    objects provides access to this part object for that purpose.
+    """
+
+    def add_footer_part(self):
+        """Return (footer_part, rId) pair for newly-created footer part."""
+        footer_part = FooterPart.new(self.package)
+        rId = self.relate_to(footer_part, RT.FOOTER)
+        return footer_part, rId
+
+    def add_header_part(self):
+        """Return (header_part, rId) pair for newly-created header part."""
+        header_part = HeaderPart.new(self.package)
+        rId = self.relate_to(header_part, RT.HEADER)
+        return header_part, rId
+
+    @property
+    def core_properties(self) -> CoreProperties:
+        """A |CoreProperties| object providing read/write access to the core properties
+        of this document."""
+        return self.package.core_properties
+
+    @property
+    def document(self):
+        """A |Document| object providing access to the content of this document."""
+        return Document(self._element, self)
+
+    def drop_header_part(self, rId: str) -> None:
+        """Remove related header part identified by `rId`."""
+        self.drop_rel(rId)
+
+    def footer_part(self, rId: str):
+        """Return |FooterPart| related by `rId`."""
+        return self.related_parts[rId]
+
+    def get_style(self, style_id: str | None, style_type: WD_STYLE_TYPE) -> BaseStyle:
+        """Return the style in this document matching `style_id`.
+
+        Returns the default style for `style_type` if `style_id` is |None| or does not
+        match a defined style of `style_type`.
+        """
+        return self.styles.get_by_id(style_id, style_type)
+
+    def get_style_id(self, style_or_name, style_type):
+        """Return the style_id (|str|) of the style of `style_type` matching
+        `style_or_name`.
+
+        Returns |None| if the style resolves to the default style for `style_type` or if
+        `style_or_name` is itself |None|. Raises if `style_or_name` is a style of the
+        wrong type or names a style not present in the document.
+        """
+        return self.styles.get_style_id(style_or_name, style_type)
+
+    def header_part(self, rId: str):
+        """Return |HeaderPart| related by `rId`."""
+        return self.related_parts[rId]
+
+    @lazyproperty
+    def inline_shapes(self):
+        """The |InlineShapes| instance containing the inline shapes in the document."""
+        return InlineShapes(self._element.body, self)
+
+    @lazyproperty
+    def numbering_part(self):
+        """A |NumberingPart| object providing access to the numbering definitions for
+        this document.
+
+        Creates an empty numbering part if one is not present.
+        """
+        try:
+            return self.part_related_by(RT.NUMBERING)
+        except KeyError:
+            numbering_part = NumberingPart.new()
+            self.relate_to(numbering_part, RT.NUMBERING)
+            return numbering_part
+
+    def save(self, path_or_stream: str | IO[bytes]):
+        """Save this document to `path_or_stream`, which can be either a path to a
+        filesystem location (a string) or a file-like object."""
+        self.package.save(path_or_stream)
+
+    @property
+    def settings(self) -> Settings:
+        """A |Settings| object providing access to the settings in the settings part of
+        this document."""
+        return self._settings_part.settings
+
+    @property
+    def styles(self):
+        """A |Styles| object providing access to the styles in the styles part of this
+        document."""
+        return self._styles_part.styles
+
+    @property
+    def _settings_part(self) -> SettingsPart:
+        """A |SettingsPart| object providing access to the document-level settings for
+        this document.
+
+        Creates a default settings part if one is not present.
+        """
+        try:
+            return cast(SettingsPart, self.part_related_by(RT.SETTINGS))
+        except KeyError:
+            settings_part = SettingsPart.default(self.package)
+            self.relate_to(settings_part, RT.SETTINGS)
+            return settings_part
+
+    @property
+    def _styles_part(self) -> StylesPart:
+        """Instance of |StylesPart| for this document.
+
+        Creates an empty styles part if one is not present.
+        """
+        try:
+            return cast(StylesPart, self.part_related_by(RT.STYLES))
+        except KeyError:
+            package = self.package
+            assert package is not None
+            styles_part = StylesPart.default(package)
+            self.relate_to(styles_part, RT.STYLES)
+            return styles_part