o
    P+ i"                     @  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mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ er`ddlmZ ddlmZ ddlmZ ddlmZ G dd dZ G dd dZ!dS )z8Objects that implement reading and writing OPC packages.    )annotations)IOTYPE_CHECKINGIteratorcast)RELATIONSHIP_TYPE)PACKAGE_URIPackURI)PartFactory)CorePropertiesPart)PackageReader)PackageWriter)Relationships)lazyproperty)Self)CoreProperties)Part)_Relationshipc                   @  s   e Zd ZdZdd Zed4ddZd5d	d
Zd6ddZd7d8ddZ	edd Z
d9ddZed:d!d"Zd;d$d%Zed<d'd(Zd=d*d+Zed,d- Zd>d.d/Zed?d1d2Zd3S )@
OpcPackagezMain API class for |python-opc|.

    A new instance is constructed by calling the :meth:`open` class method with a path
    to a package file or file-like object containing one.
    c                 C  s   dS )zEntry point for any post-unmarshaling processing.

        May be overridden by subclasses without forwarding call to super.
        N selfr   r   \/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/docx/opc/package.pyafter_unmarshal   s   zOpcPackage.after_unmarshalreturnr   c                 C  s   | j jS )zl|CoreProperties| object providing read/write access to the Dublin Core
        properties for this document.)_core_properties_partcore_propertiesr   r   r   r   r   (   s   zOpcPackage.core_propertiesIterator[_Relationship]c                 #  s,    	d
d fdd	  | D ]}|V  qdS )zGenerate exactly one reference to each relationship in the package by
        performing a depth-first traversal of the rels graph.NsourceOpcPackage | Partvisitedlist[Part] | Noner   r   c                 3  sh    |d u rg n|}| j  D ]#}|V  |jrq|j}||v rq|| |} ||D ]}|V  q+qd S Nrelsvaluesis_externalZtarget_partappendr   r    relpartZ
new_source	walk_relsr   r   r,   2   s   
z'OpcPackage.iter_rels.<locals>.walk_relsr"   )r   r   r    r!   r   r   r   )r   r)   r   r+   r   	iter_rels.   s   zOpcPackage.iter_relsIterator[Part]c                 #  s*    g f fdd	  | D ]}|V  qdS )zGenerate exactly one reference to each of the parts in the package by
        performing a depth-first traversal of the rels graph.c                 3  sX    | j  D ]#}|jrq|j}||v rq|| |V  |} ||D ]}|V  q#qd S r"   r#   r(   
walk_partsr   r   r0   I   s   
z)OpcPackage.iter_parts.<locals>.walk_partsNr   )r   r*   r   r/   r   
iter_partsE   s
   zOpcPackage.iter_partsFreltypestrtarget
Part | strrIdr&   boolc                 C  s   | j ||||S )a}  Return newly added |_Relationship| instance of `reltype` between this part
        and `target` with key `rId`.

        Target mode is set to ``RTM.EXTERNAL`` if `is_external` is |True|. Intended for
        use during load from a serialized package, where the rId is well known. Other
        methods exist for adding a new relationship to the package during processing.
        )r$   Zadd_relationship)r   r2   r4   r6   r&   r   r   r   load_relY   s   zOpcPackage.load_relc                 C  s   |  tjS )a  Return a reference to the main document part for this package.

        Examples include a document part for a WordprocessingML package, a presentation
        part for a PresentationML package, or a workbook part for a SpreadsheetML
        package.
        )part_related_byRTZOFFICE_DOCUMENTr   r   r   r   main_document_partc   s   zOpcPackage.main_document_parttemplater	   c                 C  sJ   dd |   D }tdt|d D ]}|| }||vr"t|  S qdS )a  Return a |PackURI| instance representing partname matching `template`.

        The returned part-name has the next available numeric suffix to distinguish it
        from other parts of its type. `template` is a printf (%)-style template string
        containing a single replacement item, a '%d' to be used to insert the integer
        portion of the partname. Example: "/word/header%d.xml"
        c                 S  s   h | ]}|j qS r   )partname).0r*   r   r   r   	<setcomp>u   s    z+OpcPackage.next_partname.<locals>.<setcomp>      N)r1   rangelenr	   )r   r<   Z	partnamesnZcandidate_partnamer   r   r   next_partnamem   s   zOpcPackage.next_partnamepkg_filestr | IO[bytes]r   c                 C  s"   t |}|  }t||t |S )zGReturn an |OpcPackage| instance loaded with the contents of `pkg_file`.)r   	from_fileUnmarshaller	unmarshalr
   )clsrF   
pkg_readerpackager   r   r   open{   s   
zOpcPackage.openr   c                 C  s   | j |S )zReturn part to which this package has a relationship of `reltype`.

        Raises |KeyError| if no such relationship is found and |ValueError| if more than
        one such relationship is found.
        )r$   Zpart_with_reltype)r   r2   r   r   r   r9      s   zOpcPackage.part_related_by
list[Part]c                 C  s   t |  S )zJReturn a list containing a reference to each of the parts in this package.)listr1   r   r   r   r   parts   s   zOpcPackage.partsr*   c                 C  s   | j ||}|jS )zReturn rId key of new or existing relationship to `part`.

        If a relationship of `reltype` to `part` already exists, its rId is returned. Otherwise a
        new relationship is created and that rId is returned.
        )r$   Z
get_or_addr6   )r   r*   r2   r)   r   r   r   	relate_to   s   zOpcPackage.relate_toc                 C  s
   t tjS )ztReturn a reference to the |Relationships| instance holding the collection of
        relationships for this package.)r   r   ZbaseURIr   r   r   r   r$      s   
zOpcPackage.relsc                 C  s*   | j D ]}|  qt|| j| j  dS )znSave this package to `pkg_file`.

        `pkg_file` can be either a file-path or a file-like object.
        N)rQ   Zbefore_marshalr   writer$   )r   rF   r*   r   r   r   save   s   

zOpcPackage.saver   c                 C  sD   z
t t| tjW S  ty!   t| }| |tj | Y S w )z|CorePropertiesPart| object related to this package.

        Creates a default core properties part if one is not present (not common).
        )r   r   r9   r:   ZCORE_PROPERTIESKeyErrordefaultrR   )r   Zcore_properties_partr   r   r   r      s   
z OpcPackage._core_properties_partN)r   r   )r   r   )r   r.   )F)r2   r3   r4   r5   r6   r3   r&   r7   )r<   r3   r   r	   )rF   rG   r   r   )r2   r3   r   r   )r   rO   )r*   r   r2   r3   )rF   rG   )r   r   )__name__
__module____qualname____doc__r   propertyr   r-   r1   r8   r;   rE   classmethodrN   r9   rQ   rR   r   r$   rT   r   r   r   r   r   r      s,    	




	

	

	r   c                   @  s4   e Zd ZdZedd Zedd Zedd ZdS )	rI   zHHosts static methods for unmarshalling a package from a |PackageReader|.c                 C  s>   t | ||}t | || | D ]}|  q|  dS )zConstruct graph of parts and realized relationships based on the contents of
        `pkg_reader`, delegating construction of each part to `part_factory`.

        Package relationships are added to `pkg`.
        N)rI   _unmarshal_parts_unmarshal_relationshipsr%   r   )rL   rM   part_factoryrQ   r*   r   r   r   rJ      s
   
zUnmarshaller.unmarshalc                 C  s2   i }|   D ]\}}}}||||||||< q|S )zReturn a dictionary of |Part| instances unmarshalled from `pkg_reader`, keyed
        by partname.

        Side-effect is that each part in `pkg_reader` is constructed using
        `part_factory`.
        )Ziter_sparts)rL   rM   r_   rQ   r=   content_typer2   Zblobr   r   r   r]      s   zUnmarshaller._unmarshal_partsc                 C  sV   |   D ]$\}}|dkr|n|| }|jr|jn||j }||j||j|j qdS )zAdd a relationship to the source object corresponding to each of the
        relationships in `pkg_reader` with its target_part set to the actual target part
        in `parts`./N)Z
iter_srelsr&   Z
target_refZtarget_partnamer8   r2   r6   )rL   rM   rQ   Z
source_uriZsrelr   r4   r   r   r   r^      s
   z%Unmarshaller._unmarshal_relationshipsN)rW   rX   rY   rZ   staticmethodrJ   r]   r^   r   r   r   r   rI      s    

rI   N)"rZ   
__future__r   typingr   r   r   r   Zdocx.opc.constantsr   r:   Zdocx.opc.packurir   r	   Zdocx.opc.partr
   Zdocx.opc.parts.corepropsr   Zdocx.opc.pkgreaderr   Zdocx.opc.pkgwriterr   Zdocx.opc.relr   Zdocx.sharedr   Ztyping_extensionsr   Zdocx.opc.corepropsr   r   r   r   rI   r   r   r   r   <module>   s&     