
    h                        S r SSKJr  SSKJrJrJrJr  SSKJ	r	  \(       a  SSK
Jr   " S S\\S4   5      r " S	 S5      rg
)zRelationship-related objects.    )annotations)TYPE_CHECKINGAnyDictcast)CT_Relationships)Partc                     ^  \ rS rSrSrSU 4S jjr S         SS jjrSS jrSS jrSS jr	\
S 5       r\
SS	 j5       r S       SS
 jjrSS jr\
SS j5       rSrU =r$ )Relationships   zGCollection object for |_Relationship| instances, having list semantics.c                D   > [         [        U ]  5         Xl        0 U l        g N)superr   __init___baseURI_target_parts_by_rId)selfbaseURI	__class__s     >/var/www/html/env/lib/python3.13/site-packages/docx/opc/rel.pyr   Relationships.__init__   s    mT+-46!    c                f    [        X1X R                  U5      nXPU'   U(       d  X R                  U'   U$ )z.Return a newly added |_Relationship| instance.)_Relationshipr   r   )r   reltypetargetrIdis_externalrels         r   add_relationshipRelationships.add_relationship   s3     C&--MS	-3%%c*
r   c                j    U R                  X5      nUc  U R                  nU R                  XU5      nU$ )zdReturn relationship of `reltype` to `target_part`, newly added if not already
present in collection.)_get_matching	_next_rIdr    )r   r   target_partr   r   s        r   
get_or_addRelationships.get_or_add   s9       6;..C''cBC
r   c                z    U R                  XSS9nUc  U R                  nU R                  XUSS9nUR                  $ )zsReturn rId of external relationship of `reltype` to `target_ref`, newly added
if not already present in collection.T)r   )r#   r$   r    r   )r   r   
target_refr   r   s        r   get_or_add_ext_rel Relationships.get_or_add_ext_rel(   sG       $ G;..C''Sd'SCwwr   c                <    U R                  U5      nUR                  $ )zReturn target part of rel with matching `reltype`, raising |KeyError| if not
found and |ValueError| if more than one matching relationship is found.)_get_rel_of_typer%   )r   r   r   s      r   part_with_reltypeRelationships.part_with_reltype1   s     ##G,r   c                    U R                   $ )zWDict mapping rIds to target parts for all the internal relationships in the
collection.)r   r   s    r   related_partsRelationships.related_parts7   s     (((r   c                    [         R                  " 5       nU R                  5        H?  nUR                  UR                  UR
                  UR                  UR                  5        MA     UR                  $ )zgSerialize this relationship collection into XML suitable for storage as a
.rels file in an OPC package.)	r   newvaluesadd_relr   r   r)   r   xml)r   rels_elmr   s      r   r8   Relationships.xml=   sP     $'');;=CSWWckk3>>3??S !||r   c                `    SS jnU R                  5        H  nU" XQX#5      (       d  M  Us  $    g)zmReturn relationship of matching `reltype`, `target`, and `is_external` from
collection, or None if not found.c                    U R                   U:w  a  gU R                  U:w  a  gU R                  (       a  U R                  OU R                  nXB:w  a  gg)NFT)r   r   r)   r%   )r   r   r   r   
rel_targets        r   matches,Relationships._get_matching.<locals>.matchesL   sA    {{g%+-+.??J#r   N)r   r   r   strr   
Part | strr   bool)r6   )r   r   r   r   r>   r   s         r   r#   Relationships._get_matchingF   s0    	 ;;=CsV99
 ! r   c                    U R                  5        Vs/ s H  o"R                  U:X  d  M  UPM     nn[        U5      S:X  a  Sn[        XA-  5      e[        U5      S:  a  Sn[	        XA-  5      eUS   $ s  snf )zReturn single relationship of type `reltype` from the collection.

Raises |KeyError| if no matching relationship is found. Raises |ValueError| if
more than one matching relationship is found.
r   z*no relationship of type '%s' in collection   z1multiple relationships of type '%s' in collection)r6   r   lenKeyError
ValueError)r   r   r   matchingtmpls        r   r-   Relationships._get_rel_of_type[   ss     $(;;=K=CKK74JC=Kx=A?D4>**x=1FDT^,,{ Ls
   A3A3c                ^    [        S[        U 5      S-   5       H  nSU-  nX ;  d  M  Us  $    g)zNext available rId in collection, starting from 'rId1' and making use of any
gaps in numbering, e.g. 'rId2' for rIds ['rId1', 'rId3'].rE      zrId%dN)rangerF   )r   nrId_candidates      r   r$   Relationships._next_rIdj   s2     q#d)a-(A#aKM($$ )r   )r   r   )r   r@   F)
r   r@   r   rA   r   r@   r   rB   returnz'_Relationship')r   r@   r%   r	   rS   r   )r   r@   r)   r@   rS   r@   )r   r@   rS   r	   rS   r@   )r   r@   r   rA   r   rB   rS   z_Relationship | None)r   r@   )__name__
__module____qualname____firstlineno____doc__r   r    r&   r*   r.   propertyr2   r8   r#   r-   r$   __static_attributes____classcell__r   s   @r   r   r      s    Q7 OT$.58GK	 ) )
   EJ$.=A	* % %r   r   r   c                     ^  \ rS rSrSr S
         SU 4S jjjr\SS j5       r\SS j5       r\SS j5       r	\SS j5       r
\SS j5       rS	rU =r$ )r   t   z&Value object for relationship to part.c                z   > [         [        U ]  5         Xl        X l        X0l        X@l        [        U5      U l        g r   )	r   r   r   _rId_reltype_targetr   rB   _is_external)r   r   r   r   r   externalr   s         r   r   _Relationship.__init__w   s2     	mT+-	 Nr   c                    U R                   $ r   )rd   r1   s    r   r   _Relationship.is_external   s       r   c                    U R                   $ r   )rb   r1   s    r   r   _Relationship.reltype   s    }}r   c                    U R                   $ r   )ra   r1   s    r   r   _Relationship.rId   s    yyr   c                f    U R                   (       a  [        S5      e[        SU R                  5      $ )NzOtarget_part property on _Relationship is undefined when target mode is Externalr	   )rd   rH   r   rc   r1   s    r   r%   _Relationship.target_part   s.    d  FDLL))r   c                    U R                   (       a  [        [        U R                  5      $ [        SU R                  5      nUR                  R                  U R                  5      $ )Nr	   )rd   r   r@   rc   partnamerelative_refr   )r   r   s     r   r)   _Relationship.target_ref   sE    T\\**&$,,/F??//>>r   )r   rd   ra   rb   rc   rR   )
r   r@   r   r@   r   rA   r   r@   re   rB   )rS   rB   rT   )rS   r	   )rU   rV   rW   rX   rY   r   rZ   r   r   r   r%   r)   r[   r\   r]   s   @r   r   r   t   s    0 Z_++!$+.8+CF+RV+ + ! !     * * ? ?r   N)rY   
__future__r   typingr   r   r   r   docx.opc.oxmlr   docx.opc.partr	   r@   r   r    r   r   <module>rx      s=    # " 1 1 *"d%Do-. d%N'? '?r   