aboutsummaryrefslogtreecommitdiff
path: root/.venv/lib/python3.12/site-packages/docx/parts/story.py
diff options
context:
space:
mode:
authorS. Solomon Darnell2025-03-28 21:52:21 -0500
committerS. Solomon Darnell2025-03-28 21:52:21 -0500
commit4a52a71956a8d46fcb7294ac71734504bb09bcc2 (patch)
treeee3dc5af3b6313e921cd920906356f5d4febc4ed /.venv/lib/python3.12/site-packages/docx/parts/story.py
parentcc961e04ba734dd72309fb548a2f97d67d578813 (diff)
downloadgn-ai-master.tar.gz
two version of R2R are hereHEADmaster
Diffstat (limited to '.venv/lib/python3.12/site-packages/docx/parts/story.py')
-rw-r--r--.venv/lib/python3.12/site-packages/docx/parts/story.py95
1 files changed, 95 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/docx/parts/story.py b/.venv/lib/python3.12/site-packages/docx/parts/story.py
new file mode 100644
index 00000000..7482c91a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/docx/parts/story.py
@@ -0,0 +1,95 @@
+"""|StoryPart| and related objects."""
+
+from __future__ import annotations
+
+from typing import IO, TYPE_CHECKING, Tuple, cast
+
+from docx.opc.constants import RELATIONSHIP_TYPE as RT
+from docx.opc.part import XmlPart
+from docx.oxml.shape import CT_Inline
+from docx.shared import Length, lazyproperty
+
+if TYPE_CHECKING:
+ from docx.enum.style import WD_STYLE_TYPE
+ from docx.image.image import Image
+ from docx.parts.document import DocumentPart
+ from docx.styles.style import BaseStyle
+
+
+class StoryPart(XmlPart):
+ """Base class for story parts.
+
+ A story part is one that can contain textual content, such as the document-part and
+ header or footer parts. These all share content behaviors like `.paragraphs`,
+ `.add_paragraph()`, `.add_table()` etc.
+ """
+
+ def get_or_add_image(self, image_descriptor: str | IO[bytes]) -> Tuple[str, Image]:
+ """Return (rId, image) pair for image identified by `image_descriptor`.
+
+ `rId` is the str key (often like "rId7") for the relationship between this story
+ part and the image part, reused if already present, newly created if not.
+ `image` is an |Image| instance providing access to the properties of the image,
+ such as dimensions and image type.
+ """
+ package = self._package
+ assert package is not None
+ image_part = package.get_or_add_image_part(image_descriptor)
+ rId = self.relate_to(image_part, RT.IMAGE)
+ return rId, image_part.image
+
+ 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._document_part.get_style(style_id, style_type)
+
+ def get_style_id(
+ self, style_or_name: BaseStyle | str | None, style_type: WD_STYLE_TYPE
+ ) -> str | None:
+ """Return str style_id for `style_or_name` of `style_type`.
+
+ 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._document_part.get_style_id(style_or_name, style_type)
+
+ def new_pic_inline(
+ self,
+ image_descriptor: str | IO[bytes],
+ width: int | Length | None = None,
+ height: int | Length | None = None,
+ ) -> CT_Inline:
+ """Return a newly-created `w:inline` element.
+
+ The element contains the image specified by `image_descriptor` and is scaled
+ based on the values of `width` and `height`.
+ """
+ rId, image = self.get_or_add_image(image_descriptor)
+ cx, cy = image.scaled_dimensions(width, height)
+ shape_id, filename = self.next_id, image.filename
+ return CT_Inline.new_pic_inline(shape_id, rId, filename, cx, cy)
+
+ @property
+ def next_id(self) -> int:
+ """Next available positive integer id value in this story XML document.
+
+ The value is determined by incrementing the maximum existing id value. Gaps in
+ the existing id sequence are not filled. The id attribute value is unique in the
+ document, without regard to the element type it appears on.
+ """
+ id_str_lst = self._element.xpath("//@id")
+ used_ids = [int(id_str) for id_str in id_str_lst if id_str.isdigit()]
+ if not used_ids:
+ return 1
+ return max(used_ids) + 1
+
+ @lazyproperty
+ def _document_part(self) -> DocumentPart:
+ """|DocumentPart| object for this package."""
+ package = self.package
+ assert package is not None
+ return cast("DocumentPart", package.main_document_part)