about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/docx/enum
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/docx/enum')
-rw-r--r--.venv/lib/python3.12/site-packages/docx/enum/__init__.py0
-rw-r--r--.venv/lib/python3.12/site-packages/docx/enum/base.py146
-rw-r--r--.venv/lib/python3.12/site-packages/docx/enum/dml.py103
-rw-r--r--.venv/lib/python3.12/site-packages/docx/enum/section.py86
-rw-r--r--.venv/lib/python3.12/site-packages/docx/enum/shape.py19
-rw-r--r--.venv/lib/python3.12/site-packages/docx/enum/style.py452
-rw-r--r--.venv/lib/python3.12/site-packages/docx/enum/table.py136
-rw-r--r--.venv/lib/python3.12/site-packages/docx/enum/text.py367
8 files changed, 1309 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/docx/enum/__init__.py b/.venv/lib/python3.12/site-packages/docx/enum/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/docx/enum/__init__.py
diff --git a/.venv/lib/python3.12/site-packages/docx/enum/base.py b/.venv/lib/python3.12/site-packages/docx/enum/base.py
new file mode 100644
index 00000000..bc96ab6a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/docx/enum/base.py
@@ -0,0 +1,146 @@
+"""Base classes and other objects used by enumerations."""
+
+from __future__ import annotations
+
+import enum
+import textwrap
+from typing import TYPE_CHECKING, Any, Dict, Type, TypeVar
+
+if TYPE_CHECKING:
+    from typing_extensions import Self
+
+_T = TypeVar("_T", bound="BaseXmlEnum")
+
+
+class BaseEnum(int, enum.Enum):
+    """Base class for Enums that do not map XML attr values.
+
+    The enum's value will be an integer, corresponding to the integer assigned the
+    corresponding member in the MS API enum of the same name.
+    """
+
+    def __new__(cls, ms_api_value: int, docstr: str):
+        self = int.__new__(cls, ms_api_value)
+        self._value_ = ms_api_value
+        self.__doc__ = docstr.strip()
+        return self
+
+    def __str__(self):
+        """The symbolic name and string value of this member, e.g. 'MIDDLE (3)'."""
+        return f"{self.name} ({self.value})"
+
+
+class BaseXmlEnum(int, enum.Enum):
+    """Base class for Enums that also map XML attr values.
+
+    The enum's value will be an integer, corresponding to the integer assigned the
+    corresponding member in the MS API enum of the same name.
+    """
+
+    xml_value: str
+
+    def __new__(cls, ms_api_value: int, xml_value: str, docstr: str):
+        self = int.__new__(cls, ms_api_value)
+        self._value_ = ms_api_value
+        self.xml_value = xml_value
+        self.__doc__ = docstr.strip()
+        return self
+
+    def __str__(self):
+        """The symbolic name and string value of this member, e.g. 'MIDDLE (3)'."""
+        return f"{self.name} ({self.value})"
+
+    @classmethod
+    def from_xml(cls, xml_value: str | None) -> Self:
+        """Enumeration member corresponding to XML attribute value `xml_value`.
+
+        Example::
+
+            >>> WD_PARAGRAPH_ALIGNMENT.from_xml("center")
+            WD_PARAGRAPH_ALIGNMENT.CENTER
+
+        """
+        member = next((member for member in cls if member.xml_value == xml_value), None)
+        if member is None:
+            raise ValueError(f"{cls.__name__} has no XML mapping for '{xml_value}'")
+        return member
+
+    @classmethod
+    def to_xml(cls: Type[_T], value: int | _T | None) -> str | None:
+        """XML value of this enum member, generally an XML attribute value."""
+        # -- presence of multi-arg `__new__()` method fools type-checker, but getting a
+        # -- member by its value using EnumCls(val) works as usual.
+        return cls(value).xml_value
+
+
+class DocsPageFormatter:
+    """Generate an .rst doc page for an enumeration.
+
+    Formats a RestructuredText documention page (string) for the enumeration class parts
+    passed to the constructor. An immutable one-shot service object.
+    """
+
+    def __init__(self, clsname: str, clsdict: Dict[str, Any]):
+        self._clsname = clsname
+        self._clsdict = clsdict
+
+    @property
+    def page_str(self):
+        """The RestructuredText documentation page for the enumeration.
+
+        This is the only API member for the class.
+        """
+        tmpl = ".. _%s:\n\n%s\n\n%s\n\n----\n\n%s"
+        components = (
+            self._ms_name,
+            self._page_title,
+            self._intro_text,
+            self._member_defs,
+        )
+        return tmpl % components
+
+    @property
+    def _intro_text(self):
+        """Docstring of the enumeration, formatted for documentation page."""
+        try:
+            cls_docstring = self._clsdict["__doc__"]
+        except KeyError:
+            cls_docstring = ""
+
+        if cls_docstring is None:
+            return ""
+
+        return textwrap.dedent(cls_docstring).strip()
+
+    def _member_def(self, member: BaseEnum | BaseXmlEnum):
+        """Return an individual member definition formatted as an RST glossary entry,
+        wrapped to fit within 78 columns."""
+        assert member.__doc__ is not None
+        member_docstring = textwrap.dedent(member.__doc__).strip()
+        member_docstring = textwrap.fill(
+            member_docstring,
+            width=78,
+            initial_indent=" " * 4,
+            subsequent_indent=" " * 4,
+        )
+        return "%s\n%s\n" % (member.name, member_docstring)
+
+    @property
+    def _member_defs(self):
+        """A single string containing the aggregated member definitions section of the
+        documentation page."""
+        members = self._clsdict["__members__"]
+        member_defs = [self._member_def(member) for member in members if member.name is not None]
+        return "\n".join(member_defs)
+
+    @property
+    def _ms_name(self):
+        """The Microsoft API name for this enumeration."""
+        return self._clsdict["__ms_name__"]
+
+    @property
+    def _page_title(self):
+        """The title for the documentation page, formatted as code (surrounded in
+        double-backtics) and underlined with '=' characters."""
+        title_underscore = "=" * (len(self._clsname) + 4)
+        return "``%s``\n%s" % (self._clsname, title_underscore)
diff --git a/.venv/lib/python3.12/site-packages/docx/enum/dml.py b/.venv/lib/python3.12/site-packages/docx/enum/dml.py
new file mode 100644
index 00000000..27c63a28
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/docx/enum/dml.py
@@ -0,0 +1,103 @@
+"""Enumerations used by DrawingML objects."""
+
+from .base import BaseEnum, BaseXmlEnum
+
+
+class MSO_COLOR_TYPE(BaseEnum):
+    """Specifies the color specification scheme.
+
+    Example::
+
+        from docx.enum.dml import MSO_COLOR_TYPE
+
+        assert font.color.type == MSO_COLOR_TYPE.SCHEME
+
+    MS API name: `MsoColorType`
+
+    http://msdn.microsoft.com/en-us/library/office/ff864912(v=office.15).aspx
+    """
+
+    RGB = (1, "Color is specified by an |RGBColor| value.")
+    """Color is specified by an |RGBColor| value."""
+
+    THEME = (2, "Color is one of the preset theme colors.")
+    """Color is one of the preset theme colors."""
+
+    AUTO = (101, "Color is determined automatically by the application.")
+    """Color is determined automatically by the application."""
+
+
+class MSO_THEME_COLOR_INDEX(BaseXmlEnum):
+    """Indicates the Office theme color, one of those shown in the color gallery on the
+    formatting ribbon.
+
+    Alias: ``MSO_THEME_COLOR``
+
+    Example::
+
+        from docx.enum.dml import MSO_THEME_COLOR
+
+        font.color.theme_color = MSO_THEME_COLOR.ACCENT_1
+
+    MS API name: `MsoThemeColorIndex`
+
+    http://msdn.microsoft.com/en-us/library/office/ff860782(v=office.15).aspx
+    """
+
+    NOT_THEME_COLOR = (0, "UNMAPPED", "Indicates the color is not a theme color.")
+    """Indicates the color is not a theme color."""
+
+    ACCENT_1 = (5, "accent1", "Specifies the Accent 1 theme color.")
+    """Specifies the Accent 1 theme color."""
+
+    ACCENT_2 = (6, "accent2", "Specifies the Accent 2 theme color.")
+    """Specifies the Accent 2 theme color."""
+
+    ACCENT_3 = (7, "accent3", "Specifies the Accent 3 theme color.")
+    """Specifies the Accent 3 theme color."""
+
+    ACCENT_4 = (8, "accent4", "Specifies the Accent 4 theme color.")
+    """Specifies the Accent 4 theme color."""
+
+    ACCENT_5 = (9, "accent5", "Specifies the Accent 5 theme color.")
+    """Specifies the Accent 5 theme color."""
+
+    ACCENT_6 = (10, "accent6", "Specifies the Accent 6 theme color.")
+    """Specifies the Accent 6 theme color."""
+
+    BACKGROUND_1 = (14, "background1", "Specifies the Background 1 theme color.")
+    """Specifies the Background 1 theme color."""
+
+    BACKGROUND_2 = (16, "background2", "Specifies the Background 2 theme color.")
+    """Specifies the Background 2 theme color."""
+
+    DARK_1 = (1, "dark1", "Specifies the Dark 1 theme color.")
+    """Specifies the Dark 1 theme color."""
+
+    DARK_2 = (3, "dark2", "Specifies the Dark 2 theme color.")
+    """Specifies the Dark 2 theme color."""
+
+    FOLLOWED_HYPERLINK = (
+        12,
+        "followedHyperlink",
+        "Specifies the theme color for a clicked hyperlink.",
+    )
+    """Specifies the theme color for a clicked hyperlink."""
+
+    HYPERLINK = (11, "hyperlink", "Specifies the theme color for a hyperlink.")
+    """Specifies the theme color for a hyperlink."""
+
+    LIGHT_1 = (2, "light1", "Specifies the Light 1 theme color.")
+    """Specifies the Light 1 theme color."""
+
+    LIGHT_2 = (4, "light2", "Specifies the Light 2 theme color.")
+    """Specifies the Light 2 theme color."""
+
+    TEXT_1 = (13, "text1", "Specifies the Text 1 theme color.")
+    """Specifies the Text 1 theme color."""
+
+    TEXT_2 = (15, "text2", "Specifies the Text 2 theme color.")
+    """Specifies the Text 2 theme color."""
+
+
+MSO_THEME_COLOR = MSO_THEME_COLOR_INDEX
diff --git a/.venv/lib/python3.12/site-packages/docx/enum/section.py b/.venv/lib/python3.12/site-packages/docx/enum/section.py
new file mode 100644
index 00000000..982e1911
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/docx/enum/section.py
@@ -0,0 +1,86 @@
+"""Enumerations related to the main document in WordprocessingML files."""
+
+from .base import BaseXmlEnum
+
+
+class WD_HEADER_FOOTER_INDEX(BaseXmlEnum):
+    """Alias: **WD_HEADER_FOOTER**
+
+    Specifies one of the three possible header/footer definitions for a section.
+
+    For internal use only; not part of the python-docx API.
+
+    MS API name: `WdHeaderFooterIndex`
+    URL: https://docs.microsoft.com/en-us/office/vba/api/word.wdheaderfooterindex
+    """
+
+    PRIMARY = (1, "default", "Header for odd pages or all if no even header.")
+    """Header for odd pages or all if no even header."""
+
+    FIRST_PAGE = (2, "first", "Header for first page of section.")
+    """Header for first page of section."""
+
+    EVEN_PAGE = (3, "even", "Header for even pages of recto/verso section.")
+    """Header for even pages of recto/verso section."""
+
+
+WD_HEADER_FOOTER = WD_HEADER_FOOTER_INDEX
+
+
+class WD_ORIENTATION(BaseXmlEnum):
+    """Alias: **WD_ORIENT**
+
+    Specifies the page layout orientation.
+
+    Example::
+
+        from docx.enum.section import WD_ORIENT
+
+        section = document.sections[-1] section.orientation = WD_ORIENT.LANDSCAPE
+
+    MS API name: `WdOrientation`
+    MS API URL: http://msdn.microsoft.com/en-us/library/office/ff837902.aspx
+    """
+
+    PORTRAIT = (0, "portrait", "Portrait orientation.")
+    """Portrait orientation."""
+
+    LANDSCAPE = (1, "landscape", "Landscape orientation.")
+    """Landscape orientation."""
+
+
+WD_ORIENT = WD_ORIENTATION
+
+
+class WD_SECTION_START(BaseXmlEnum):
+    """Alias: **WD_SECTION**
+
+    Specifies the start type of a section break.
+
+    Example::
+
+        from docx.enum.section import WD_SECTION
+
+        section = document.sections[0] section.start_type = WD_SECTION.NEW_PAGE
+
+    MS API name: `WdSectionStart`
+    MS API URL: http://msdn.microsoft.com/en-us/library/office/ff840975.aspx
+    """
+
+    CONTINUOUS = (0, "continuous", "Continuous section break.")
+    """Continuous section break."""
+
+    NEW_COLUMN = (1, "nextColumn", "New column section break.")
+    """New column section break."""
+
+    NEW_PAGE = (2, "nextPage", "New page section break.")
+    """New page section break."""
+
+    EVEN_PAGE = (3, "evenPage", "Even pages section break.")
+    """Even pages section break."""
+
+    ODD_PAGE = (4, "oddPage", "Section begins on next odd page.")
+    """Section begins on next odd page."""
+
+
+WD_SECTION = WD_SECTION_START
diff --git a/.venv/lib/python3.12/site-packages/docx/enum/shape.py b/.venv/lib/python3.12/site-packages/docx/enum/shape.py
new file mode 100644
index 00000000..ed086c38
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/docx/enum/shape.py
@@ -0,0 +1,19 @@
+"""Enumerations related to DrawingML shapes in WordprocessingML files."""
+
+import enum
+
+
+class WD_INLINE_SHAPE_TYPE(enum.Enum):
+    """Corresponds to WdInlineShapeType enumeration.
+
+    http://msdn.microsoft.com/en-us/library/office/ff192587.aspx.
+    """
+
+    CHART = 12
+    LINKED_PICTURE = 4
+    PICTURE = 3
+    SMART_ART = 15
+    NOT_IMPLEMENTED = -6
+
+
+WD_INLINE_SHAPE = WD_INLINE_SHAPE_TYPE
diff --git a/.venv/lib/python3.12/site-packages/docx/enum/style.py b/.venv/lib/python3.12/site-packages/docx/enum/style.py
new file mode 100644
index 00000000..d2474611
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/docx/enum/style.py
@@ -0,0 +1,452 @@
+"""Enumerations related to styles."""
+
+from .base import BaseEnum, BaseXmlEnum
+
+
+class WD_BUILTIN_STYLE(BaseEnum):
+    """Alias: **WD_STYLE**
+
+    Specifies a built-in Microsoft Word style.
+
+    Example::
+
+        from docx import Document
+        from docx.enum.style import WD_STYLE
+
+        document = Document()
+        styles = document.styles
+        style = styles[WD_STYLE.BODY_TEXT]
+
+
+    MS API name: `WdBuiltinStyle`
+
+    http://msdn.microsoft.com/en-us/library/office/ff835210.aspx
+    """
+
+    BLOCK_QUOTATION = (-85, "Block Text.")
+    """Block Text."""
+
+    BODY_TEXT = (-67, "Body Text.")
+    """Body Text."""
+
+    BODY_TEXT_2 = (-81, "Body Text 2.")
+    """Body Text 2."""
+
+    BODY_TEXT_3 = (-82, "Body Text 3.")
+    """Body Text 3."""
+
+    BODY_TEXT_FIRST_INDENT = (-78, "Body Text First Indent.")
+    """Body Text First Indent."""
+
+    BODY_TEXT_FIRST_INDENT_2 = (-79, "Body Text First Indent 2.")
+    """Body Text First Indent 2."""
+
+    BODY_TEXT_INDENT = (-68, "Body Text Indent.")
+    """Body Text Indent."""
+
+    BODY_TEXT_INDENT_2 = (-83, "Body Text Indent 2.")
+    """Body Text Indent 2."""
+
+    BODY_TEXT_INDENT_3 = (-84, "Body Text Indent 3.")
+    """Body Text Indent 3."""
+
+    BOOK_TITLE = (-265, "Book Title.")
+    """Book Title."""
+
+    CAPTION = (-35, "Caption.")
+    """Caption."""
+
+    CLOSING = (-64, "Closing.")
+    """Closing."""
+
+    COMMENT_REFERENCE = (-40, "Comment Reference.")
+    """Comment Reference."""
+
+    COMMENT_TEXT = (-31, "Comment Text.")
+    """Comment Text."""
+
+    DATE = (-77, "Date.")
+    """Date."""
+
+    DEFAULT_PARAGRAPH_FONT = (-66, "Default Paragraph Font.")
+    """Default Paragraph Font."""
+
+    EMPHASIS = (-89, "Emphasis.")
+    """Emphasis."""
+
+    ENDNOTE_REFERENCE = (-43, "Endnote Reference.")
+    """Endnote Reference."""
+
+    ENDNOTE_TEXT = (-44, "Endnote Text.")
+    """Endnote Text."""
+
+    ENVELOPE_ADDRESS = (-37, "Envelope Address.")
+    """Envelope Address."""
+
+    ENVELOPE_RETURN = (-38, "Envelope Return.")
+    """Envelope Return."""
+
+    FOOTER = (-33, "Footer.")
+    """Footer."""
+
+    FOOTNOTE_REFERENCE = (-39, "Footnote Reference.")
+    """Footnote Reference."""
+
+    FOOTNOTE_TEXT = (-30, "Footnote Text.")
+    """Footnote Text."""
+
+    HEADER = (-32, "Header.")
+    """Header."""
+
+    HEADING_1 = (-2, "Heading 1.")
+    """Heading 1."""
+
+    HEADING_2 = (-3, "Heading 2.")
+    """Heading 2."""
+
+    HEADING_3 = (-4, "Heading 3.")
+    """Heading 3."""
+
+    HEADING_4 = (-5, "Heading 4.")
+    """Heading 4."""
+
+    HEADING_5 = (-6, "Heading 5.")
+    """Heading 5."""
+
+    HEADING_6 = (-7, "Heading 6.")
+    """Heading 6."""
+
+    HEADING_7 = (-8, "Heading 7.")
+    """Heading 7."""
+
+    HEADING_8 = (-9, "Heading 8.")
+    """Heading 8."""
+
+    HEADING_9 = (-10, "Heading 9.")
+    """Heading 9."""
+
+    HTML_ACRONYM = (-96, "HTML Acronym.")
+    """HTML Acronym."""
+
+    HTML_ADDRESS = (-97, "HTML Address.")
+    """HTML Address."""
+
+    HTML_CITE = (-98, "HTML Cite.")
+    """HTML Cite."""
+
+    HTML_CODE = (-99, "HTML Code.")
+    """HTML Code."""
+
+    HTML_DFN = (-100, "HTML Definition.")
+    """HTML Definition."""
+
+    HTML_KBD = (-101, "HTML Keyboard.")
+    """HTML Keyboard."""
+
+    HTML_NORMAL = (-95, "Normal (Web).")
+    """Normal (Web)."""
+
+    HTML_PRE = (-102, "HTML Preformatted.")
+    """HTML Preformatted."""
+
+    HTML_SAMP = (-103, "HTML Sample.")
+    """HTML Sample."""
+
+    HTML_TT = (-104, "HTML Typewriter.")
+    """HTML Typewriter."""
+
+    HTML_VAR = (-105, "HTML Variable.")
+    """HTML Variable."""
+
+    HYPERLINK = (-86, "Hyperlink.")
+    """Hyperlink."""
+
+    HYPERLINK_FOLLOWED = (-87, "Followed Hyperlink.")
+    """Followed Hyperlink."""
+
+    INDEX_1 = (-11, "Index 1.")
+    """Index 1."""
+
+    INDEX_2 = (-12, "Index 2.")
+    """Index 2."""
+
+    INDEX_3 = (-13, "Index 3.")
+    """Index 3."""
+
+    INDEX_4 = (-14, "Index 4.")
+    """Index 4."""
+
+    INDEX_5 = (-15, "Index 5.")
+    """Index 5."""
+
+    INDEX_6 = (-16, "Index 6.")
+    """Index 6."""
+
+    INDEX_7 = (-17, "Index 7.")
+    """Index 7."""
+
+    INDEX_8 = (-18, "Index 8.")
+    """Index 8."""
+
+    INDEX_9 = (-19, "Index 9.")
+    """Index 9."""
+
+    INDEX_HEADING = (-34, "Index Heading")
+    """Index Heading"""
+
+    INTENSE_EMPHASIS = (-262, "Intense Emphasis.")
+    """Intense Emphasis."""
+
+    INTENSE_QUOTE = (-182, "Intense Quote.")
+    """Intense Quote."""
+
+    INTENSE_REFERENCE = (-264, "Intense Reference.")
+    """Intense Reference."""
+
+    LINE_NUMBER = (-41, "Line Number.")
+    """Line Number."""
+
+    LIST = (-48, "List.")
+    """List."""
+
+    LIST_2 = (-51, "List 2.")
+    """List 2."""
+
+    LIST_3 = (-52, "List 3.")
+    """List 3."""
+
+    LIST_4 = (-53, "List 4.")
+    """List 4."""
+
+    LIST_5 = (-54, "List 5.")
+    """List 5."""
+
+    LIST_BULLET = (-49, "List Bullet.")
+    """List Bullet."""
+
+    LIST_BULLET_2 = (-55, "List Bullet 2.")
+    """List Bullet 2."""
+
+    LIST_BULLET_3 = (-56, "List Bullet 3.")
+    """List Bullet 3."""
+
+    LIST_BULLET_4 = (-57, "List Bullet 4.")
+    """List Bullet 4."""
+
+    LIST_BULLET_5 = (-58, "List Bullet 5.")
+    """List Bullet 5."""
+
+    LIST_CONTINUE = (-69, "List Continue.")
+    """List Continue."""
+
+    LIST_CONTINUE_2 = (-70, "List Continue 2.")
+    """List Continue 2."""
+
+    LIST_CONTINUE_3 = (-71, "List Continue 3.")
+    """List Continue 3."""
+
+    LIST_CONTINUE_4 = (-72, "List Continue 4.")
+    """List Continue 4."""
+
+    LIST_CONTINUE_5 = (-73, "List Continue 5.")
+    """List Continue 5."""
+
+    LIST_NUMBER = (-50, "List Number.")
+    """List Number."""
+
+    LIST_NUMBER_2 = (-59, "List Number 2.")
+    """List Number 2."""
+
+    LIST_NUMBER_3 = (-60, "List Number 3.")
+    """List Number 3."""
+
+    LIST_NUMBER_4 = (-61, "List Number 4.")
+    """List Number 4."""
+
+    LIST_NUMBER_5 = (-62, "List Number 5.")
+    """List Number 5."""
+
+    LIST_PARAGRAPH = (-180, "List Paragraph.")
+    """List Paragraph."""
+
+    MACRO_TEXT = (-46, "Macro Text.")
+    """Macro Text."""
+
+    MESSAGE_HEADER = (-74, "Message Header.")
+    """Message Header."""
+
+    NAV_PANE = (-90, "Document Map.")
+    """Document Map."""
+
+    NORMAL = (-1, "Normal.")
+    """Normal."""
+
+    NORMAL_INDENT = (-29, "Normal Indent.")
+    """Normal Indent."""
+
+    NORMAL_OBJECT = (-158, "Normal (applied to an object).")
+    """Normal (applied to an object)."""
+
+    NORMAL_TABLE = (-106, "Normal (applied within a table).")
+    """Normal (applied within a table)."""
+
+    NOTE_HEADING = (-80, "Note Heading.")
+    """Note Heading."""
+
+    PAGE_NUMBER = (-42, "Page Number.")
+    """Page Number."""
+
+    PLAIN_TEXT = (-91, "Plain Text.")
+    """Plain Text."""
+
+    QUOTE = (-181, "Quote.")
+    """Quote."""
+
+    SALUTATION = (-76, "Salutation.")
+    """Salutation."""
+
+    SIGNATURE = (-65, "Signature.")
+    """Signature."""
+
+    STRONG = (-88, "Strong.")
+    """Strong."""
+
+    SUBTITLE = (-75, "Subtitle.")
+    """Subtitle."""
+
+    SUBTLE_EMPHASIS = (-261, "Subtle Emphasis.")
+    """Subtle Emphasis."""
+
+    SUBTLE_REFERENCE = (-263, "Subtle Reference.")
+    """Subtle Reference."""
+
+    TABLE_COLORFUL_GRID = (-172, "Colorful Grid.")
+    """Colorful Grid."""
+
+    TABLE_COLORFUL_LIST = (-171, "Colorful List.")
+    """Colorful List."""
+
+    TABLE_COLORFUL_SHADING = (-170, "Colorful Shading.")
+    """Colorful Shading."""
+
+    TABLE_DARK_LIST = (-169, "Dark List.")
+    """Dark List."""
+
+    TABLE_LIGHT_GRID = (-161, "Light Grid.")
+    """Light Grid."""
+
+    TABLE_LIGHT_GRID_ACCENT_1 = (-175, "Light Grid Accent 1.")
+    """Light Grid Accent 1."""
+
+    TABLE_LIGHT_LIST = (-160, "Light List.")
+    """Light List."""
+
+    TABLE_LIGHT_LIST_ACCENT_1 = (-174, "Light List Accent 1.")
+    """Light List Accent 1."""
+
+    TABLE_LIGHT_SHADING = (-159, "Light Shading.")
+    """Light Shading."""
+
+    TABLE_LIGHT_SHADING_ACCENT_1 = (-173, "Light Shading Accent 1.")
+    """Light Shading Accent 1."""
+
+    TABLE_MEDIUM_GRID_1 = (-166, "Medium Grid 1.")
+    """Medium Grid 1."""
+
+    TABLE_MEDIUM_GRID_2 = (-167, "Medium Grid 2.")
+    """Medium Grid 2."""
+
+    TABLE_MEDIUM_GRID_3 = (-168, "Medium Grid 3.")
+    """Medium Grid 3."""
+
+    TABLE_MEDIUM_LIST_1 = (-164, "Medium List 1.")
+    """Medium List 1."""
+
+    TABLE_MEDIUM_LIST_1_ACCENT_1 = (-178, "Medium List 1 Accent 1.")
+    """Medium List 1 Accent 1."""
+
+    TABLE_MEDIUM_LIST_2 = (-165, "Medium List 2.")
+    """Medium List 2."""
+
+    TABLE_MEDIUM_SHADING_1 = (-162, "Medium Shading 1.")
+    """Medium Shading 1."""
+
+    TABLE_MEDIUM_SHADING_1_ACCENT_1 = (-176, "Medium Shading 1 Accent 1.")
+    """Medium Shading 1 Accent 1."""
+
+    TABLE_MEDIUM_SHADING_2 = (-163, "Medium Shading 2.")
+    """Medium Shading 2."""
+
+    TABLE_MEDIUM_SHADING_2_ACCENT_1 = (-177, "Medium Shading 2 Accent 1.")
+    """Medium Shading 2 Accent 1."""
+
+    TABLE_OF_AUTHORITIES = (-45, "Table of Authorities.")
+    """Table of Authorities."""
+
+    TABLE_OF_FIGURES = (-36, "Table of Figures.")
+    """Table of Figures."""
+
+    TITLE = (-63, "Title.")
+    """Title."""
+
+    TOAHEADING = (-47, "TOA Heading.")
+    """TOA Heading."""
+
+    TOC_1 = (-20, "TOC 1.")
+    """TOC 1."""
+
+    TOC_2 = (-21, "TOC 2.")
+    """TOC 2."""
+
+    TOC_3 = (-22, "TOC 3.")
+    """TOC 3."""
+
+    TOC_4 = (-23, "TOC 4.")
+    """TOC 4."""
+
+    TOC_5 = (-24, "TOC 5.")
+    """TOC 5."""
+
+    TOC_6 = (-25, "TOC 6.")
+    """TOC 6."""
+
+    TOC_7 = (-26, "TOC 7.")
+    """TOC 7."""
+
+    TOC_8 = (-27, "TOC 8.")
+    """TOC 8."""
+
+    TOC_9 = (-28, "TOC 9.")
+    """TOC 9."""
+
+
+WD_STYLE = WD_BUILTIN_STYLE
+
+
+class WD_STYLE_TYPE(BaseXmlEnum):
+    """Specifies one of the four style types: paragraph, character, list, or table.
+
+    Example::
+
+        from docx import Document
+        from docx.enum.style import WD_STYLE_TYPE
+
+        styles = Document().styles
+        assert styles[0].type == WD_STYLE_TYPE.PARAGRAPH
+
+    MS API name: `WdStyleType`
+
+    http://msdn.microsoft.com/en-us/library/office/ff196870.aspx
+    """
+
+    CHARACTER = (2, "character", "Character style.")
+    """Character style."""
+
+    LIST = (4, "numbering", "List style.")
+    """List style."""
+
+    PARAGRAPH = (1, "paragraph", "Paragraph style.")
+    """Paragraph style."""
+
+    TABLE = (3, "table", "Table style.")
+    """Table style."""
diff --git a/.venv/lib/python3.12/site-packages/docx/enum/table.py b/.venv/lib/python3.12/site-packages/docx/enum/table.py
new file mode 100644
index 00000000..eb1eb9dc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/docx/enum/table.py
@@ -0,0 +1,136 @@
+"""Enumerations related to tables in WordprocessingML files."""
+
+from docx.enum.base import BaseEnum, BaseXmlEnum
+
+
+class WD_CELL_VERTICAL_ALIGNMENT(BaseXmlEnum):
+    """Alias: **WD_ALIGN_VERTICAL**
+
+    Specifies the vertical alignment of text in one or more cells of a table.
+
+    Example::
+
+        from docx.enum.table import WD_ALIGN_VERTICAL
+
+        table = document.add_table(3, 3)
+        table.cell(0, 0).vertical_alignment = WD_ALIGN_VERTICAL.BOTTOM
+
+    MS API name: `WdCellVerticalAlignment`
+
+    https://msdn.microsoft.com/en-us/library/office/ff193345.aspx
+    """
+
+    TOP = (0, "top", "Text is aligned to the top border of the cell.")
+    """Text is aligned to the top border of the cell."""
+
+    CENTER = (1, "center", "Text is aligned to the center of the cell.")
+    """Text is aligned to the center of the cell."""
+
+    BOTTOM = (3, "bottom", "Text is aligned to the bottom border of the cell.")
+    """Text is aligned to the bottom border of the cell."""
+
+    BOTH = (
+        101,
+        "both",
+        "This is an option in the OpenXml spec, but not in Word itself. It's not"
+        " clear what Word behavior this setting produces. If you find out please"
+        " let us know and we'll update this documentation. Otherwise, probably best"
+        " to avoid this option.",
+    )
+    """This is an option in the OpenXml spec, but not in Word itself.
+
+    It's not clear what Word behavior this setting produces. If you find out please let
+    us know and we'll update this documentation. Otherwise, probably best to avoid this
+    option.
+    """
+
+
+WD_ALIGN_VERTICAL = WD_CELL_VERTICAL_ALIGNMENT
+
+
+class WD_ROW_HEIGHT_RULE(BaseXmlEnum):
+    """Alias: **WD_ROW_HEIGHT**
+
+    Specifies the rule for determining the height of a table row
+
+    Example::
+
+        from docx.enum.table import WD_ROW_HEIGHT_RULE
+
+        table = document.add_table(3, 3)
+        table.rows[0].height_rule = WD_ROW_HEIGHT_RULE.EXACTLY
+
+    MS API name: `WdRowHeightRule`
+
+    https://msdn.microsoft.com/en-us/library/office/ff193620.aspx
+    """
+
+    AUTO = (
+        0,
+        "auto",
+        "The row height is adjusted to accommodate the tallest value in the row.",
+    )
+    """The row height is adjusted to accommodate the tallest value in the row."""
+
+    AT_LEAST = (1, "atLeast", "The row height is at least a minimum specified value.")
+    """The row height is at least a minimum specified value."""
+
+    EXACTLY = (2, "exact", "The row height is an exact value.")
+    """The row height is an exact value."""
+
+
+WD_ROW_HEIGHT = WD_ROW_HEIGHT_RULE
+
+
+class WD_TABLE_ALIGNMENT(BaseXmlEnum):
+    """Specifies table justification type.
+
+    Example::
+
+        from docx.enum.table import WD_TABLE_ALIGNMENT
+
+        table = document.add_table(3, 3)
+        table.alignment = WD_TABLE_ALIGNMENT.CENTER
+
+    MS API name: `WdRowAlignment`
+
+    http://office.microsoft.com/en-us/word-help/HV080607259.aspx
+    """
+
+    LEFT = (0, "left", "Left-aligned")
+    """Left-aligned"""
+
+    CENTER = (1, "center", "Center-aligned.")
+    """Center-aligned."""
+
+    RIGHT = (2, "right", "Right-aligned.")
+    """Right-aligned."""
+
+
+class WD_TABLE_DIRECTION(BaseEnum):
+    """Specifies the direction in which an application orders cells in the specified
+    table or row.
+
+    Example::
+
+        from docx.enum.table import WD_TABLE_DIRECTION
+
+        table = document.add_table(3, 3)
+        table.direction = WD_TABLE_DIRECTION.RTL
+
+    MS API name: `WdTableDirection`
+
+    http://msdn.microsoft.com/en-us/library/ff835141.aspx
+    """
+
+    LTR = (
+        0,
+        "The table or row is arranged with the first column in the leftmost position.",
+    )
+    """The table or row is arranged with the first column in the leftmost position."""
+
+    RTL = (
+        1,
+        "The table or row is arranged with the first column in the rightmost position.",
+    )
+    """The table or row is arranged with the first column in the rightmost position."""
diff --git a/.venv/lib/python3.12/site-packages/docx/enum/text.py b/.venv/lib/python3.12/site-packages/docx/enum/text.py
new file mode 100644
index 00000000..99e776fe
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/docx/enum/text.py
@@ -0,0 +1,367 @@
+"""Enumerations related to text in WordprocessingML files."""
+
+from __future__ import annotations
+
+import enum
+
+from docx.enum.base import BaseXmlEnum
+
+
+class WD_PARAGRAPH_ALIGNMENT(BaseXmlEnum):
+    """Alias: **WD_ALIGN_PARAGRAPH**
+
+    Specifies paragraph justification type.
+
+    Example::
+
+        from docx.enum.text import WD_ALIGN_PARAGRAPH
+
+        paragraph = document.add_paragraph()
+        paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
+    """
+
+    LEFT = (0, "left", "Left-aligned")
+    """Left-aligned"""
+
+    CENTER = (1, "center", "Center-aligned.")
+    """Center-aligned."""
+
+    RIGHT = (2, "right", "Right-aligned.")
+    """Right-aligned."""
+
+    JUSTIFY = (3, "both", "Fully justified.")
+    """Fully justified."""
+
+    DISTRIBUTE = (
+        4,
+        "distribute",
+        "Paragraph characters are distributed to fill entire width of paragraph.",
+    )
+    """Paragraph characters are distributed to fill entire width of paragraph."""
+
+    JUSTIFY_MED = (
+        5,
+        "mediumKashida",
+        "Justified with a medium character compression ratio.",
+    )
+    """Justified with a medium character compression ratio."""
+
+    JUSTIFY_HI = (
+        7,
+        "highKashida",
+        "Justified with a high character compression ratio.",
+    )
+    """Justified with a high character compression ratio."""
+
+    JUSTIFY_LOW = (8, "lowKashida", "Justified with a low character compression ratio.")
+    """Justified with a low character compression ratio."""
+
+    THAI_JUSTIFY = (
+        9,
+        "thaiDistribute",
+        "Justified according to Thai formatting layout.",
+    )
+    """Justified according to Thai formatting layout."""
+
+
+WD_ALIGN_PARAGRAPH = WD_PARAGRAPH_ALIGNMENT
+
+
+class WD_BREAK_TYPE(enum.Enum):
+    """Corresponds to WdBreakType enumeration.
+
+    http://msdn.microsoft.com/en-us/library/office/ff195905.aspx.
+    """
+
+    COLUMN = 8
+    LINE = 6
+    LINE_CLEAR_LEFT = 9
+    LINE_CLEAR_RIGHT = 10
+    LINE_CLEAR_ALL = 11  # -- added for consistency, not in MS version --
+    PAGE = 7
+    SECTION_CONTINUOUS = 3
+    SECTION_EVEN_PAGE = 4
+    SECTION_NEXT_PAGE = 2
+    SECTION_ODD_PAGE = 5
+    TEXT_WRAPPING = 11
+
+
+WD_BREAK = WD_BREAK_TYPE
+
+
+class WD_COLOR_INDEX(BaseXmlEnum):
+    """Specifies a standard preset color to apply.
+
+    Used for font highlighting and perhaps other applications.
+
+    * MS API name: `WdColorIndex`
+    * URL: https://msdn.microsoft.com/EN-US/library/office/ff195343.aspx
+    """
+
+    INHERITED = (-1, None, "Color is inherited from the style hierarchy.")
+    """Color is inherited from the style hierarchy."""
+
+    AUTO = (0, "default", "Automatic color. Default; usually black.")
+    """Automatic color. Default; usually black."""
+
+    BLACK = (1, "black", "Black color.")
+    """Black color."""
+
+    BLUE = (2, "blue", "Blue color")
+    """Blue color"""
+
+    BRIGHT_GREEN = (4, "green", "Bright green color.")
+    """Bright green color."""
+
+    DARK_BLUE = (9, "darkBlue", "Dark blue color.")
+    """Dark blue color."""
+
+    DARK_RED = (13, "darkRed", "Dark red color.")
+    """Dark red color."""
+
+    DARK_YELLOW = (14, "darkYellow", "Dark yellow color.")
+    """Dark yellow color."""
+
+    GRAY_25 = (16, "lightGray", "25% shade of gray color.")
+    """25% shade of gray color."""
+
+    GRAY_50 = (15, "darkGray", "50% shade of gray color.")
+    """50% shade of gray color."""
+
+    GREEN = (11, "darkGreen", "Green color.")
+    """Green color."""
+
+    PINK = (5, "magenta", "Pink color.")
+    """Pink color."""
+
+    RED = (6, "red", "Red color.")
+    """Red color."""
+
+    TEAL = (10, "darkCyan", "Teal color.")
+    """Teal color."""
+
+    TURQUOISE = (3, "cyan", "Turquoise color.")
+    """Turquoise color."""
+
+    VIOLET = (12, "darkMagenta", "Violet color.")
+    """Violet color."""
+
+    WHITE = (8, "white", "White color.")
+    """White color."""
+
+    YELLOW = (7, "yellow", "Yellow color.")
+    """Yellow color."""
+
+
+WD_COLOR = WD_COLOR_INDEX
+
+
+class WD_LINE_SPACING(BaseXmlEnum):
+    """Specifies a line spacing format to be applied to a paragraph.
+
+    Example::
+
+        from docx.enum.text import WD_LINE_SPACING
+
+        paragraph = document.add_paragraph()
+        paragraph.line_spacing_rule = WD_LINE_SPACING.EXACTLY
+
+
+    MS API name: `WdLineSpacing`
+
+    URL: http://msdn.microsoft.com/en-us/library/office/ff844910.aspx
+    """
+
+    SINGLE = (0, "UNMAPPED", "Single spaced (default).")
+    """Single spaced (default)."""
+
+    ONE_POINT_FIVE = (1, "UNMAPPED", "Space-and-a-half line spacing.")
+    """Space-and-a-half line spacing."""
+
+    DOUBLE = (2, "UNMAPPED", "Double spaced.")
+    """Double spaced."""
+
+    AT_LEAST = (
+        3,
+        "atLeast",
+        "Minimum line spacing is specified amount. Amount is specified separately.",
+    )
+    """Minimum line spacing is specified amount. Amount is specified separately."""
+
+    EXACTLY = (
+        4,
+        "exact",
+        "Line spacing is exactly specified amount. Amount is specified separately.",
+    )
+    """Line spacing is exactly specified amount. Amount is specified separately."""
+
+    MULTIPLE = (
+        5,
+        "auto",
+        "Line spacing is specified as multiple of line heights. Changing font size"
+        " will change line spacing proportionately.",
+    )
+    """Line spacing is specified as multiple of line heights. Changing font size will
+       change the line spacing proportionately."""
+
+
+class WD_TAB_ALIGNMENT(BaseXmlEnum):
+    """Specifies the tab stop alignment to apply.
+
+    MS API name: `WdTabAlignment`
+
+    URL: https://msdn.microsoft.com/EN-US/library/office/ff195609.aspx
+    """
+
+    LEFT = (0, "left", "Left-aligned.")
+    """Left-aligned."""
+
+    CENTER = (1, "center", "Center-aligned.")
+    """Center-aligned."""
+
+    RIGHT = (2, "right", "Right-aligned.")
+    """Right-aligned."""
+
+    DECIMAL = (3, "decimal", "Decimal-aligned.")
+    """Decimal-aligned."""
+
+    BAR = (4, "bar", "Bar-aligned.")
+    """Bar-aligned."""
+
+    LIST = (6, "list", "List-aligned. (deprecated)")
+    """List-aligned. (deprecated)"""
+
+    CLEAR = (101, "clear", "Clear an inherited tab stop.")
+    """Clear an inherited tab stop."""
+
+    END = (102, "end", "Right-aligned.  (deprecated)")
+    """Right-aligned.  (deprecated)"""
+
+    NUM = (103, "num", "Left-aligned.  (deprecated)")
+    """Left-aligned.  (deprecated)"""
+
+    START = (104, "start", "Left-aligned.  (deprecated)")
+    """Left-aligned.  (deprecated)"""
+
+
+class WD_TAB_LEADER(BaseXmlEnum):
+    """Specifies the character to use as the leader with formatted tabs.
+
+    MS API name: `WdTabLeader`
+
+    URL: https://msdn.microsoft.com/en-us/library/office/ff845050.aspx
+    """
+
+    SPACES = (0, "none", "Spaces. Default.")
+    """Spaces. Default."""
+
+    DOTS = (1, "dot", "Dots.")
+    """Dots."""
+
+    DASHES = (2, "hyphen", "Dashes.")
+    """Dashes."""
+
+    LINES = (3, "underscore", "Double lines.")
+    """Double lines."""
+
+    HEAVY = (4, "heavy", "A heavy line.")
+    """A heavy line."""
+
+    MIDDLE_DOT = (5, "middleDot", "A vertically-centered dot.")
+    """A vertically-centered dot."""
+
+
+class WD_UNDERLINE(BaseXmlEnum):
+    """Specifies the style of underline applied to a run of characters.
+
+    MS API name: `WdUnderline`
+
+    URL: http://msdn.microsoft.com/en-us/library/office/ff822388.aspx
+    """
+
+    INHERITED = (-1, None, "Inherit underline setting from containing paragraph.")
+    """Inherit underline setting from containing paragraph."""
+
+    NONE = (
+        0,
+        "none",
+        "No underline.\n\nThis setting overrides any inherited underline value, so can"
+        " be used to remove underline from a run that inherits underlining from its"
+        " containing paragraph. Note this is not the same as assigning |None| to"
+        " Run.underline. |None| is a valid assignment value, but causes the run to"
+        " inherit its underline value. Assigning `WD_UNDERLINE.NONE` causes"
+        " underlining to be unconditionally turned off.",
+    )
+    """No underline.
+
+    This setting overrides any inherited underline value, so can be used to remove
+    underline from a run that inherits underlining from its containing paragraph. Note
+    this is not the same as assigning |None| to Run.underline. |None| is a valid
+    assignment value, but causes the run to inherit its underline value. Assigning
+    ``WD_UNDERLINE.NONE`` causes underlining to be unconditionally turned off.
+    """
+
+    SINGLE = (
+        1,
+        "single",
+        "A single line.\n\nNote that this setting is write-only in the sense that"
+        " |True| (rather than `WD_UNDERLINE.SINGLE`) is returned for a run having"
+        " this setting.",
+    )
+    """A single line.
+
+    Note that this setting is write-only in the sense that |True|
+    (rather than ``WD_UNDERLINE.SINGLE``) is returned for a run having this setting.
+    """
+
+    WORDS = (2, "words", "Underline individual words only.")
+    """Underline individual words only."""
+
+    DOUBLE = (3, "double", "A double line.")
+    """A double line."""
+
+    DOTTED = (4, "dotted", "Dots.")
+    """Dots."""
+
+    THICK = (6, "thick", "A single thick line.")
+    """A single thick line."""
+
+    DASH = (7, "dash", "Dashes.")
+    """Dashes."""
+
+    DOT_DASH = (9, "dotDash", "Alternating dots and dashes.")
+    """Alternating dots and dashes."""
+
+    DOT_DOT_DASH = (10, "dotDotDash", "An alternating dot-dot-dash pattern.")
+    """An alternating dot-dot-dash pattern."""
+
+    WAVY = (11, "wave", "A single wavy line.")
+    """A single wavy line."""
+
+    DOTTED_HEAVY = (20, "dottedHeavy", "Heavy dots.")
+    """Heavy dots."""
+
+    DASH_HEAVY = (23, "dashedHeavy", "Heavy dashes.")
+    """Heavy dashes."""
+
+    DOT_DASH_HEAVY = (25, "dashDotHeavy", "Alternating heavy dots and heavy dashes.")
+    """Alternating heavy dots and heavy dashes."""
+
+    DOT_DOT_DASH_HEAVY = (
+        26,
+        "dashDotDotHeavy",
+        "An alternating heavy dot-dot-dash pattern.",
+    )
+    """An alternating heavy dot-dot-dash pattern."""
+
+    WAVY_HEAVY = (27, "wavyHeavy", "A heavy wavy line.")
+    """A heavy wavy line."""
+
+    DASH_LONG = (39, "dashLong", "Long dashes.")
+    """Long dashes."""
+
+    WAVY_DOUBLE = (43, "wavyDouble", "A double wavy line.")
+    """A double wavy line."""
+
+    DASH_LONG_HEAVY = (55, "dashLongHeavy", "Long heavy dashes.")
+    """Long heavy dashes."""