U
    cqeh                     @  s   d Z ddlmZ ddlmZmZmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZmZ ddlmZmZ erdd	lmZ dd
lmZmZ ddlmZ ddlmZ ddlmZ ddlm Z m!Z! ddl"m#Z# ddl$m%Z% G dd deZ&G dd de	Z'dS )z'|Document| and closely related objects.    )annotations)IOTYPE_CHECKINGIteratorList)BlockItemContainer)
WD_SECTION)WD_BREAK)SectionSections)ElementProxyEmu)types)CT_BodyCT_Document)DocumentPart)Settings)Length)ParagraphStyle_TableStyle)Table)	Paragraphc                      sP  e Zd ZdZddd fddZdDd	d
dddZdd ZdEd	dddddZdFddddddZe	j
fddddZdGd
d
dd d!d"Zed#d$ Zed%d& Zd'd(d)d*Zed+d(d,d-Zedd(d.d/Zdd0d1d2Zed3d(d4d5Zed6d(d7d8Zed9d: Zed;d(d<d=Zed>d(d?d@ZedAd(dBdCZ  ZS )HDocumentzWordprocessingML (WML) document.

    Not intended to be constructed directly. Use :func:`docx.Document` to open or create
    a document.
    r   r   )elementpartc                   s&   t t| | || _|| _d | _d S N)superr   __init___element_part_Document__body)selfr   r   	__class__ 1/tmp/pip-unpacked-wheel-gx5hpqp3/docx/document.pyr   "   s    zDocument.__init__    strint)textlevelc                 C  sB   d|  krdks"n t d| |dkr.dnd| }| ||S )a  Return a heading paragraph newly added to the end of the document.

        The heading paragraph will contain `text` and have its paragraph style
        determined by `level`. If `level` is 0, the style is set to `Title`. If `level`
        is 1 (or omitted), `Heading 1` is used. Otherwise the style is set to `Heading
        {level}`. Raises |ValueError| if `level` is outside the range 0-9.
        r   	   z"level must be in range 0-9, got %dZTitlez
Heading %d)
ValueErroradd_paragraph)r!   r*   r+   styler$   r$   r%   add_heading(   s    zDocument.add_headingc                 C  s   |   }| tj |S )z=Return newly |Paragraph| object containing only a page break.)r.   add_runZ	add_breakr	   ZPAGE)r!   Z	paragraphr$   r$   r%   add_page_break5   s    zDocument.add_page_breakNzstr | ParagraphStyle | Noner   )r*   r/   returnc                 C  s   | j ||S )a  Return paragraph newly added to the end of the document.

        The paragraph is populated with `text` and having paragraph style `style`.

        `text` can contain tab (``\t``) characters, which are converted to the
        appropriate XML form for a tab. `text` can also include newline (``\n``) or
        carriage return (``\r``) characters, each of which is converted to a line
        break.
        )_bodyr.   )r!   r*   r/   r$   r$   r%   r.   ;   s    zDocument.add_paragraphzstr | IO[bytes]zint | Length | None)image_path_or_streamwidthheightc                 C  s   |    }||||S )a  Return new picture shape added in its own paragraph at end of the document.

        The picture contains the image at `image_path_or_stream`, scaled based on
        `width` and `height`. If neither width nor height is specified, the picture
        appears at its native size. If only one is specified, it is used to compute a
        scaling factor that is then applied to the unspecified dimension, preserving the
        aspect ratio of the image. The native size of the picture is calculated using
        the dots-per-inch (dpi) value specified in the image file, defaulting to 72 dpi
        if no value is specified, as is often the case.
        )r.   r1   add_picture)r!   r5   r6   r7   runr$   r$   r%   r8   I   s    zDocument.add_picturer   )
start_typec                 C  s   | j j }||_t|| jS )zReturn a |Section| object newly added at the end of the document.

        The optional `start_type` argument must be a member of the :ref:`WdSectionStart`
        enumeration, and defaults to ``WD_SECTION.NEW_PAGE`` if not provided.
        )r   bodyZadd_section_breakr:   r
   r   )r!   r:   Z
new_sectPrr$   r$   r%   add_section\   s    zDocument.add_sectionzstr | _TableStyle | None)rowscolsr/   c                 C  s   | j ||| j}||_|S )zAdd a table having row and column counts of `rows` and `cols` respectively.

        `style` may be a table style object or a table style name. If `style` is |None|,
        the table inherits the default table style of the document.
        )r4   	add_table_block_widthr/   )r!   r=   r>   r/   tabler$   r$   r%   r?   f   s    zDocument.add_tablec                 C  s   | j jS )zGA |CoreProperties| object providing Dublin Core properties of document.)r   core_propertiesr!   r$   r$   r%   rB   p   s    zDocument.core_propertiesc                 C  s   | j jS )zThe |InlineShapes| collection for this document.

        An inline shape is a graphical object, such as a picture, contained in a run of
        text and behaving like a character glyph, being flowed like other text in a
        paragraph.
        )r   inline_shapesrC   r$   r$   r%   rD   u   s    zDocument.inline_shapeszIterator[Paragraph | Table])r3   c                 C  s
   | j  S )zHGenerate each `Paragraph` or `Table` in this document in document order.)r4   iter_inner_contentrC   r$   r$   r%   rE      s    zDocument.iter_inner_contentzList[Paragraph]c                 C  s   | j jS )zThe |Paragraph| instances in the document, in document order.

        Note that paragraphs within revision marks such as ``<w:ins>`` or ``<w:del>`` do
        not appear in this list.
        )r4   
paragraphsrC   r$   r$   r%   rF      s    zDocument.paragraphsc                 C  s   | j S )z+The |DocumentPart| object of this document.)r   rC   r$   r$   r%   r      s    zDocument.part)path_or_streamc                 C  s   | j | dS )zSave this document to `path_or_stream`.

        `path_or_stream` can be either a path to a filesystem location (a string) or a
        file-like object.
        N)r   save)r!   rG   r$   r$   r%   rH      s    zDocument.saver   c                 C  s   t | j| jS )zD|Sections| object providing access to each section in this document.)r   r   r   rC   r$   r$   r%   sections   s    zDocument.sectionsr   c                 C  s   | j jS )zDA |Settings| object providing access to the document-level settings.)r   settingsrC   r$   r$   r%   rJ      s    zDocument.settingsc                 C  s   | j jS )zBA |Styles| object providing access to the styles in this document.)r   stylesrC   r$   r$   r%   rK      s    zDocument.styleszList[Table]c                 C  s   | j jS )aP  All |Table| instances in the document, in document order.

        Note that only tables appearing at the top level of the document appear in this
        list; a table nested inside a table cell does not appear. A table within
        revision marks such as ``<w:ins>`` or ``<w:del>`` will also not appear in the
        list.
        )r4   tablesrC   r$   r$   r%   rL      s    	zDocument.tablesr   c                 C  s    | j d }t|j|j |j S )zGA |Length| object specifying the space between margins in last section.)rI   r   Z
page_widthZleft_marginZright_margin)r!   sectionr$   r$   r%   r@      s    
zDocument._block_width_Bodyc                 C  s    | j dkrt| jj| | _ | j S )z>The |_Body| instance containing the content for this document.N)r    rO   r   r;   rC   r$   r$   r%   r4      s    
zDocument._body)r&   r'   )r&   N)NN)N)__name__
__module____qualname____doc__r   r0   r2   r.   r8   r   ZNEW_PAGEr<   r?   propertyrB   rD   rE   rF   r   rH   rI   rJ   rK   rL   r@   r4   __classcell__r$   r$   r"   r%   r      sD        



	

r   c                      s0   e Zd ZdZddd fddZdd Z  ZS )	rO   zoProxy for `<w:body>` element in this document.

    It's primary role is a container for document content.
    r   zt.ProvidesStoryPart)body_elmparentc                   s   t t| || || _d S r   )r   rO   r   r4   )r!   rV   rW   r"   r$   r%   r      s    z_Body.__init__c                 C  s   | j   | S )zReturn this |_Body| instance after clearing it of all content.

        Section properties for the main document story, if present, are preserved.
        )r4   clear_contentrC   r$   r$   r%   rX      s    
z_Body.clear_content)rP   rQ   rR   rS   r   rX   rU   r$   r$   r"   r%   rO      s   rO   N)(rS   
__future__r   typingr   r   r   r   Zdocx.blkcntnrr   Zdocx.enum.sectionr   Zdocx.enum.textr	   Zdocx.sectionr
   r   Zdocx.sharedr   r   Zdocxr   tZdocx.oxml.documentr   r   Zdocx.parts.documentr   Zdocx.settingsr   r   Zdocx.styles.styler   r   Z
docx.tabler   Zdocx.text.paragraphr   r   rO   r$   r$   r$   r%   <module>   s&    '