U
    cqe
e                     @  s  d Z ddlmZ ddlZddlmZmZmZmZm	Z	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mZmZ dd	lmZ erdd
lmZ ddlmZ ddddZG dd de Z!edZ"G dd de#Z$G dd dZ%G dd de%Z&G dd de%Z'G dd dZ(G dd de(Z)G dd  d e(Z*G d!d" d"e(Z+G d#d$ d$e(Z,G d%d& d&e(Z-G d'd( d(e(Z.G d)d* d*eje$d+Z/dS ),z?Enabling declarative definition of lxml custom element classes.    )annotationsN)	TYPE_CHECKINGAnyCallableDictListSequenceTupleTypeTypeVar)etree)ElementBase_Element)InvalidXmlError)NamespacePrefixedTagnsmapqn)lazyproperty)BaseXmlEnum)BaseSimpleTyper   )elementc                 C  s   t j| ddd}t|S )z[Serialize `element` to human-readable XML suitable for tests.

    No XML declaration.
    unicodeT)encodingZpretty_print)r   tostring	XmlString)r   xml r   6/tmp/pip-unpacked-wheel-gx5hpqp3/docx/oxml/xmlchemy.pyserialize_for_reading    s    r   c                   @  sn   e Zd ZdZedZdddddZddddd	Zd
ddddZ	d
d
dddZ
ed
ddddZdS )r   z]Provides string comparison override suitable for serialized XML that is useful
    for tests.z)( *</?[\w:]+)(.*?)(/?>)([^<]*</[\w:]+>)?$objectbool)otherreturnc                 C  s\   t |tsdS |  }| }t|t|kr2dS t||D ]\}}| ||s< dS q<dS )NFT)
isinstancestr
splitlineslenzip_eq_elm_strs)selfr!   linesZlines_otherlineZ
line_otherr   r   r   __eq__5   s    
zXmlString.__eq__c                 C  s   |  | S N)r,   )r)   r!   r   r   r   __ne__A   s    zXmlString.__ne__r$   z	List[str])attrsr"   c                 C  s   |  }| }t|S )zReturn a sequence of attribute strings parsed from `attrs`.

        Each attribute string is stripped of whitespace on both ends.
        )stripsplitsorted)r)   r/   Zattr_lstr   r   r   	_attr_seqD   s    zXmlString._attr_seq)r+   line_2c                 C  sd   |  |\}}}}|  |\}}}	}
||kr0dS | || |krHdS ||	krTdS ||
kr`dS dS )zZReturn True if the element in `line_2` is XML equivalent to the element in
        `line`.FT)_parse_liner3   )r)   r+   r4   frontr/   closetextZfront_2Zattrs_2Zclose_2Ztext_2r   r   r   r(   M   s    zXmlString._eq_elm_strszTuple[str, str, str, str])r+   r"   c                   sD   | j |  dkrdS  fddtddD \}}}}||||fS )zI(front, attrs, close, text) 4-tuple result of parsing XML element `line`.N) r9   r9   r9   c                   s   g | ]}  |qS r   )group).0nmatchr   r   
<listcomp>b   s     z)XmlString._parse_line.<locals>.<listcomp>      )_xml_elm_line_pattr>   range)clsr+   r6   r/   r7   r8   r   r=   r   r5   \   s
     zXmlString._parse_lineN)__name__
__module____qualname____doc__recompilerB   r,   r.   r3   r(   classmethodr5   r   r   r   r   r   )   s   	
	r   _Tc                   @  s"   e Zd ZdZddddddZdS )	MetaOxmlElementzMetaclass for BaseOxmlElement.r$   zTuple[type, ...]zDict[str, Any])clsnamebases	namespacec                 C  s>   t ttttttf}| D ]\}}t||r|	| | qd S r-   )
OneAndOnlyOne	OneOrMoreOptionalAttributeRequiredAttribute
ZeroOrMore	ZeroOrOneZeroOrOneChoiceitemsr#   populate_class_members)rD   rN   rO   rP   Zdispatchablekeyvaluer   r   r   __init__l   s    	
zMetaOxmlElement.__init__N)rE   rF   rG   rH   r\   r   r   r   r   rM   i   s   rM   c                      sr   e Zd ZdZddd fddZdddd	d
dZdd Zedd ZeddddZ	eddddZ
  ZS )BaseAttributezZBase class for OptionalAttribute and RequiredAttribute.

    Provides common methods.
    r$   (Type[BaseXmlEnum] | Type[BaseSimpleType])	attr_namesimple_typec                   s   t t|   || _|| _d S r-   )superr]   r\   
_attr_name_simple_type)r)   r_   r`   	__class__r   r   r\      s    zBaseAttribute.__init__rM   Noneelement_cls	prop_namer"   c                 C  s   || _ || _|   dS z-Add the appropriate methods to `element_cls`.N)_element_cls
_prop_name_add_attr_propertyr)   rh   ri   r   r   r   rY      s    z$BaseAttribute.populate_class_membersc                 C  s$   t | j| jd}t| j| j| dS )zAdd a read/write `.{prop_name}` property to the element class.

        The property returns the interpreted value of this attribute on access and
        changes the attribute value to its ST_* counterpart on assignment.
        N)property_getter_settersetattrrk   rl   r)   	property_r   r   r   rm      s    z BaseAttribute._add_attr_propertyc                 C  s   d| j krt| j S | j S )N:)rb   r   r)   r   r   r   _clark_name   s    

zBaseAttribute._clark_name'Callable[[BaseOxmlElement], Any | None]r"   c                 C  s   d S r-   r   rv   r   r   r   rp      s    zBaseAttribute._getterz-Callable[[BaseOxmlElement, Any | None], None]c                 C  s   d S r-   r   rv   r   r   r   rq      s    zBaseAttribute._setter)rE   rF   rG   rH   r\   rY   rm   ro   rw   rp   rq   __classcell__r   r   rd   r   r]   {   s   	

r]   c                      s\   e Zd ZdZddddd fddZed	d
 ZeddddZeddddZ  Z	S )rS   a  Defines an optional attribute on a custom element class.

    An optional attribute returns a default value when not present for reading. When
    assigned |None|, the attribute is removed, but still returns the default value when
    one is specified.
    Nr$   r^   z#BaseXmlEnum | BaseSimpleType | None)r_   r`   defaultc                   s   t t| || || _d S r-   )ra   rS   r\   _default)r)   r_   r`   r{   rd   r   r   r\      s    zOptionalAttribute.__init__c                 C  s   | j j d| j dS )z;String to use as `__doc__` attribute of attribute property.z type-converted value of ``z`` attribute, or |None| (or specified default value) if not present. Assigning the default value causes the attribute to be removed from the element.rc   rE   rb   rv   r   r   r   
_docstring   s    zOptionalAttribute._docstringrx   ry   c                   s    ddd fdd} j |_|S )zJFunction suitable for `__get__()` method on attribute property descriptor.BaseOxmlElement
Any | Noneobjr"   c                   s&   |   j}|d kr jS  j|S r-   )getrw   r|   rc   from_xmlr   Zattr_str_valuerv   r   r   get_attr_value   s    z1OptionalAttribute._getter.<locals>.get_attr_valuer~   rH   r)   r   r   rv   r   rp      s    zOptionalAttribute._getter&Callable[[BaseOxmlElement, Any], None]c                   s   ddd fdd}|S )zJFunction suitable for `__set__()` method on attribute property descriptor.r   r   r   r[   c                   sl   |d ks| j kr, j| jkr(| j j= d S  j|}|d krZ j| jkrV| j j= d S |  j| d S r-   )r|   rw   attribrc   to_xmlsetr   r[   Z	str_valuerv   r   r   set_attr_value   s    

z1OptionalAttribute._setter.<locals>.set_attr_valuer   r)   r   r   rv   r   rq      s    zOptionalAttribute._setter)N)
rE   rF   rG   rH   r\   ro   r~   rp   rq   rz   r   r   rd   r   rS      s    	
	rS   c                   @  s@   e Zd ZdZedd ZeddddZeddd	d
ZdS )rT   a  Defines a required attribute on a custom element class.

    A required attribute is assumed to be present for reading, so does not have a
    default value; its actual value is always used. If missing on read, an
    |InvalidXmlError| is raised. It also does not remove the attribute if |None| is
    assigned. Assigning |None| raises |TypeError| or |ValueError|, depending on the
    simple type of the attribute.
    c                 C  s   d| j j| jf S )zaReturn the string to use as the ``__doc__`` attribute of the property for
        this attribute.z,%s type-converted value of ``%s`` attribute.r}   rv   r   r   r   r~      s    zRequiredAttribute._docstringz Callable[[BaseOxmlElement], Any]ry   c                   s    ddd fdd} j |_|S )zDfunction object suitable for "get" side of attr property descriptor.r   r   r   c                   s4   |   j}|d kr(td j| jf  j|S )Nz1required '%s' attribute not present on element %s)r   rw   r   rb   tagrc   r   r   rv   r   r   r     s    
z1RequiredAttribute._getter.<locals>.get_attr_valuer   r   r   rv   r   rp      s    	zRequiredAttribute._getterr   c                   s   ddd fdd}|S )zIfunction object suitable for "set" side of attribute property descriptor.r   r   r   c                   s6    j |}|d kr$td| d|  j| d S )Nzcannot assign z to this required attribute)rc   r   
ValueErrorr   rw   r   rv   r   r   r     s    z1RequiredAttribute._setter.<locals>.set_attr_valuer   r   r   rv   r   rq     s    zRequiredAttribute._setterN)rE   rF   rG   rH   ro   r~   rp   rq   r   r   r   r   rT      s   	
rT   c                      s   e Zd ZdZd/ddd fddZddd	d
ddZdd Zdd Zdd Zdd Z	dd Z
edd Zdd ZdddddZedd d!d"Zed#d$ Zed%d& Zed'd( Zed)d* Zed+d, Zed-d. Z  ZS )0_BaseChildElementzBase class for the child-element classes.

    The child-element sub-classes correspond to varying cardinalities, such as ZeroOrOne
    and ZeroOrMore.
    r   r$   Tuple[str, ...])
nsptagname
successorsc                   s   t t|   || _|| _d S r-   )ra   r   r\   _nsptagname_successors)r)   r   r   rd   r   r   r\   "  s    z_BaseChildElement.__init__rM   rf   rg   c                 C  s   || _ || _dS )zFBaseline behavior for adding the appropriate methods to `element_cls`.N)rk   rl   rn   r   r   r   rY   '  s    z(_BaseChildElement.populate_class_membersc                   s2   ddd fdd}d j  |_  j| dS )zGAdd an ``_add_x()`` method to the element class for this child element.r   r   )r   r/   c                   sH   t |  j}| }| D ]\}}t||| qt |  j}|| |S r-   )getattr_new_method_namerX   rr   _insert_method_name)r   r/   Z
new_methodchildrZ   r[   Zinsert_methodrv   r   r   
_add_child1  s    z0_BaseChildElement._add_adder.<locals>._add_childSAdd a new ``<%s>`` child element unconditionally, inserted in the correct sequence.N)r   rH   _add_to_class_add_method_name)r)   r   r   rv   r   
_add_adder.  s    
z_BaseChildElement._add_adderc                 C  s$   | j }d| j |_| | j| dS )zAdd a ``_new_{prop_name}()`` method to the element class that creates a new,
        empty element of the correct type, having no attributes.zYReturn a "loose", newly created ``<%s>`` element having no attributes, text, or children.N)_creatorr   rH   r   r   )r)   Zcreatorr   r   r   _add_creator@  s    z_BaseChildElement._add_creatorc                 C  s"   t | jdd}t| j| j| dS )z]Add a read-only ``{prop_name}`` property to the element class for this child
        element.N)ro   rp   rr   rk   rl   rs   r   r   r   _add_getterJ  s    z_BaseChildElement._add_getterc                   s2   ddd fdd}d j  |_  j| dS )zJAdd an ``_insert_x()`` method to the element class for this child element.r   r   r   c                   s   | j |f j  |S r-   )insert_element_beforer   r   rv   r   r   _insert_childT  s    z6_BaseChildElement._add_inserter.<locals>._insert_childzYReturn the passed ``<%s>`` element after inserting it as a child in the correct sequence.N)r   rH   r   r   )r)   r   r   rv   r   _add_inserterQ  s    z_BaseChildElement._add_inserterc                 C  s*   d| j  }t| jdd}t| j|| dS )zAdd a read-only ``{prop_name}_lst`` property to the element class to retrieve
        a list of child elements matching this type.z%s_lstN)rl   ro   _list_getterrr   rk   )r)   ri   rt   r   r   r   _add_list_getter^  s    
z"_BaseChildElement._add_list_getterc                 C  s
   d| j  S )Nz_add_%srl   rv   r   r   r   r   e  s    z"_BaseChildElement._add_method_namec                   s0   dd fdd}d j  |_  j| dS )z<Add a public ``add_x()`` method to the parent element class.r   r   c                   s   t |  j}| }|S r-   )r   r   )r   Zprivate_add_methodr   rv   r   r   	add_childl  s    z6_BaseChildElement._add_public_adder.<locals>.add_childr   N)r   rH   r   _public_add_method_name)r)   r   r   rv   r   _add_public_adderi  s    z#_BaseChildElement._add_public_adderzCallable[..., Any])namemethodc                 C  s"   t | j|rdS t| j|| dS )zbAdd `method` to the target class as `name`, unless `name` is already defined
        on the class.N)hasattrrk   rr   )r)   r   r   r   r   r   r   w  s    z_BaseChildElement._add_to_classz,Callable[[BaseOxmlElement], BaseOxmlElement]ry   c                   s$   ddl m  dd fdd}|S )zHCallable that creates an empty element of the right type, with no attrs.r   )OxmlElementr   r   c                   s
    j S r-   r   r   r   r)   r   r   new_child_element  s    z5_BaseChildElement._creator.<locals>.new_child_element)Zdocx.oxml.parserr   )r)   r   r   r   r   r   ~  s    z_BaseChildElement._creatorc                   s"   dd fdd}d j  |_|S )zReturn a function object suitable for the "get" side of the property
        descriptor.

        This default getter returns the child element with matching tag name or |None|
        if not present.
        r   r   c                   s   |  t jS r-   )findr   r   r   rv   r   r   get_child_element  s    z4_BaseChildElement._getter.<locals>.get_child_elementz0``<%s>`` child element or |None| if not present.r   rH   r)   r   r   rv   r   rp     s    	z_BaseChildElement._getterc                 C  s
   d| j  S )Nz
_insert_%sr   rv   r   r   r   r     s    z%_BaseChildElement._insert_method_namec                   s"   dd fdd}d j  |_|S )z[Return a function object suitable for the "get" side of a list property
        descriptor.r   r   c                   s   |  t jS r-   )findallr   r   r   rv   r   r   get_child_element_list  s    z>_BaseChildElement._list_getter.<locals>.get_child_element_listzPA list containing each of the ``<%s>`` child elements, in the order they appear.r   )r)   r   r   rv   r   r     s    z_BaseChildElement._list_getterc                 C  s
   d| j  S )a
  add_childElement() is public API for a repeating element, allowing new
        elements to be added to the sequence.

        May be overridden to provide a friendlier API to clients having domain
        appropriate parameter names for required attributes.
        zadd_%sr   rv   r   r   r   r     s    z)_BaseChildElement._public_add_method_namec                 C  s
   d| j  S Nz
_remove_%sr   rv   r   r   r   _remove_method_name  s    z%_BaseChildElement._remove_method_namec                 C  s
   d| j  S )Nz_new_%sr   rv   r   r   r   r     s    z"_BaseChildElement._new_method_name)r   )rE   rF   rG   rH   r\   rY   r   r   r   r   r   r   r   r   r   ro   r   rp   r   r   r   r   r   rz   r   r   rd   r   r     s4   

	



	
r   c                   @  s\   e Zd ZdZedd Zdddddd	d
Zdd Zedd Ze	dd Z
e	dd ZdS )ChoicezZDefines a child element belonging to a group, only one of which may appear as a
    child.c                 C  s   | j S r-   r   rv   r   r   r   r     s    zChoice.nsptagnamerM   r$   r   rf   )rh   group_prop_namer   r"   c                 C  s>   || _ || _|| _|   |   |   |   |   dS rj   )rk   _group_prop_namer   r   r   r   r   _add_get_or_change_to_method)r)   rh   r   r   r   r   r   rY     s    zChoice.populate_class_membersc                   s0   dd fdd}d j  |_  j| dS )zZAdd a ``get_or_change_to_x()`` method to the element class for this child
        element.r   r   c                   s@   t |  j}|d k	r|S t |  j}|  t |  j}| }|S r-   )r   rl   _remove_group_method_namer   )r   r   Zremove_group_method
add_methodrv   r   r   get_or_change_to_child  s    zCChoice._add_get_or_change_to_method.<locals>.get_or_change_to_childzFReturn the ``<%s>`` child, replacing any other group element if found.N)r   rH   r   _get_or_change_to_method_name)r)   r   r   rv   r   r     s
    z#Choice._add_get_or_change_to_methodc                 C  s,   d| j kr| j dd nd}| j |d S )zDProperty name computed from tag name, e.g. a:schemeClr -> schemeClr.ru   r@   r   N)r   index)r)   startr   r   r   rl     s    zChoice._prop_namec                 C  s
   d| j  S )Nzget_or_change_to_%sr   rv   r   r   r   r     s    z$Choice._get_or_change_to_method_namec                 C  s
   d| j  S r   )r   rv   r   r   r   r     s    z Choice._remove_group_method_nameN)rE   rF   rG   rH   ro   r   rY   r   rl   r   r   r   r   r   r   r   r     s   


r   c                      sH   e Zd ZdZdd fddZdddd fd	d
Zedd Z  ZS )rQ   z5Defines a required child element for MetaOxmlElement.r$   r   c                   s   t t| |d d S )Nr   )ra   rQ   r\   )r)   r   rd   r   r   r\     s    zOneAndOnlyOne.__init__rM   rf   rg   c                   s   t t| || |   dS rj   )ra   rQ   rY   r   rn   rd   r   r   rY     s    z$OneAndOnlyOne.populate_class_membersc                   s"   dd fdd}d j  |_|S )XReturn a function object suitable for the "get" side of the property
        descriptor.r   r   c                   s*   |  t j}|d kr&td j |S )Nz+required ``<%s>`` child element not present)r   r   r   r   r   rv   r   r   r     s    z0OneAndOnlyOne._getter.<locals>.get_child_elementz Required ``<%s>`` child element.r   r   r   rv   r   rp     s    	zOneAndOnlyOne._getter)	rE   rF   rG   rH   r\   rY   ro   rp   rz   r   r   rd   r   rQ     s
   rQ   c                      s*   e Zd ZdZdddd fddZ  ZS )rR   zYDefines a repeating child element for MetaOxmlElement that must appear at least
    once.rM   r$   rf   rg   c                   sH   t t| || |   |   |   |   |   t|| dS rj   )	ra   rR   rY   r   r   r   r   r   delattrrn   rd   r   r   rY     s    z OneOrMore.populate_class_membersrE   rF   rG   rH   rY   rz   r   r   rd   r   rR     s   rR   c                      s*   e Zd ZdZdddd fddZ  ZS )rU   z@Defines an optional repeating child element for MetaOxmlElement.rM   r$   rf   rg   c                   sH   t t| || |   |   |   |   |   t|| dS rj   )	ra   rU   rY   r   r   r   r   r   r   rn   rd   r   r   rY   -  s    z!ZeroOrMore.populate_class_membersr   r   r   rd   r   rU   *  s   rU   c                      sF   e Zd ZdZdddd fddZdd	 Zd
d Zedd Z  Z	S )rV   z6Defines an optional child element for MetaOxmlElement.rM   r$   rf   rg   c                   sF   t t| || |   |   |   |   |   |   dS rj   )	ra   rV   rY   r   r   r   r   _add_get_or_adder_add_removerrn   rd   r   r   rY   =  s    z ZeroOrOne.populate_class_membersc                   s0   dd fdd}d j  |_  j| dS )zTAdd a ``get_or_add_x()`` method to the element class for this child
        element.r   r   c                   s*   t |  j}|d kr&t |  j}| }|S r-   )r   rl   r   )r   r   r   rv   r   r   get_or_add_childM  s
    z5ZeroOrOne._add_get_or_adder.<locals>.get_or_add_childz>Return the ``<%s>`` child element, newly added if not present.N)r   rH   r   _get_or_add_method_name)r)   r   r   rv   r   r   I  s
    zZeroOrOne._add_get_or_adderc                   s0   dd fdd}d j  |_  j| dS )zIAdd a ``_remove_x()`` method to the element class for this child element.r   r   c                   s   |   j d S r-   )
remove_allr   r   rv   r   r   _remove_child\  s    z-ZeroOrOne._add_remover.<locals>._remove_childz#Remove all ``<%s>`` child elements.N)r   rH   r   r   )r)   r   r   rv   r   r   Y  s
    zZeroOrOne._add_removerc                 C  s
   d| j  S )Nzget_or_add_%sr   rv   r   r   r   r   d  s    z!ZeroOrOne._get_or_add_method_name)
rE   rF   rG   rH   rY   r   r   r   r   rz   r   r   rd   r   rV   :  s   rV   c                      sp   e Zd ZdZddddddZdd	d
d fddZdd Zdd Zedd Z	e
dd Ze
dd Z  ZS )rW   zeCorrespondes to an ``EG_*`` element group where at most one of its members may
    appear as a child.r   zSequence[Choice]r   )choicesr   c                 C  s   || _ || _d S r-   )_choicesr   )r)   r   r   r   r   r   r\   m  s    zZeroOrOneChoice.__init__rM   r$   rf   rg   c                   sD   t t| || |   | jD ]}||| j| j q |   dS rj   )ra   rW   rY   _add_choice_getterr   rl   r   _add_group_remover)r)   rh   ri   choicerd   r   r   rY   q  s    
  z&ZeroOrOneChoice.populate_class_membersc                 C  s"   t | jdd}t| j| j| dS )zAdd a read-only ``{prop_name}`` property to the element class that returns
        the present member of this group, or |None| if none are present.N)ro   _choice_getterrr   rk   rl   rs   r   r   r   r   }  s    z"ZeroOrOneChoice._add_choice_getterc                   s*   dd fdd}d|_   j| dS )zSAdd a ``_remove_eg_x()`` method to the element class for this choice
        group.r   r   c                   s    j D ]}| | qd S r-   )_member_nsptagnamesr   )r   tagnamerv   r   r   _remove_choice_group  s    
z@ZeroOrOneChoice._add_group_remover.<locals>._remove_choice_groupz9Remove the current choice group child element if present.N)rH   r    _remove_choice_group_method_name)r)   r   r   rv   r   r     s    z"ZeroOrOneChoice._add_group_removerc                   s   dd fdd}d|_ |S )r   r   r   c                   s   | j  j S r-   )first_child_found_inr   r   rv   r   r   get_group_member_element  s    z@ZeroOrOneChoice._choice_getter.<locals>.get_group_member_elementzbReturn the child element belonging to this element group, or |None| if no member child is present.)rH   )r)   r   r   rv   r   r     s    zZeroOrOneChoice._choice_getterc                 C  s   dd | j D S )zjSequence of namespace-prefixed tagnames, one for each of the member elements
        of this choice group.c                 S  s   g | ]
}|j qS r   r   )r;   r   r   r   r   r?     s     z7ZeroOrOneChoice._member_nsptagnames.<locals>.<listcomp>)r   rv   r   r   r   r     s    z#ZeroOrOneChoice._member_nsptagnamesc                 C  s
   d| j  S r   r   rv   r   r   r   r     s    z0ZeroOrOneChoice._remove_choice_group_method_name)r   )rE   rF   rG   rH   r\   rY   r   r   ro   r   r   r   r   rz   r   r   rd   r   rW   i  s   

rW   c                      s   e Zd ZdZdd ZdddddZd	dd
ddZdddddZeddddZ	ddd fddZ
eddddZ  ZS )r   zvEffective base class for all custom element classes.

    Adds standardized behavior to all classes in one place.
    c                 C  s   d| j j| jt| f S )Nz<%s '<%s>' at 0x%0x>)re   rE   _nsptagidrv   r   r   r   __repr__  s
    zBaseOxmlElement.__repr__r$   z_Element | None)tagnamesr"   c                 G  s,   |D ]"}|  t|}|dk	r|  S qdS )z9First child with tag in `tagnames`, or None if not found.N)r   r   )r)   r   r   r   r   r   r   r     s
    
z$BaseOxmlElement.first_child_found_inr   )elmr   c                 G  s,   | j | }|d k	r|| n
| | |S r-   )r   Zaddpreviousappend)r)   r   r   	successorr   r   r   r     s
    

z%BaseOxmlElement.insert_element_beforerf   c                 G  s0   |D ]&}|  t|}|D ]}| | qqdS )z>Remove child elements with tagname (e.g. "a:p") in `tagnames`.N)r   r   remove)r)   r   r   Zmatchingr   r   r   r   r     s    zBaseOxmlElement.remove_allry   c                 C  s   t | S )zXML string for this element, suitable for testing purposes.

        Pretty printed for readability and without an XML declaration at the top.
        )r   rv   r   r   r   r     s    zBaseOxmlElement.xmlr   )	xpath_strr"   c                   s   t  j|tdS )zOverride of `lxml` _Element.xpath() method.

        Provides standard Open XML namespace mapping (`nsmap`) in centralized location.
        )
namespaces)ra   xpathr   )r)   r   rd   r   r   r     s    zBaseOxmlElement.xpathc                 C  s   t | jS r-   )r   Zfrom_clark_namer   rv   r   r   r   r     s    zBaseOxmlElement._nsptag)rE   rF   rG   rH   r   r   r   r   ro   r   r   r   rz   r   r   rd   r   r     s   	r   )	metaclass)0rH   
__future__r   rI   typingr   r   r   r   r   r   r	   r
   r   lxmlr   Z
lxml.etreer   r   Zdocx.oxml.exceptionsr   Zdocx.oxml.nsr   r   r   Zdocx.sharedr   Zdocx.enum.baser   Zdocx.oxml.simpletypesr   r   r$   r   rL   typerM   r]   rS   rT   r   r   rQ   rR   rU   rV   rW   r   r   r   r   r   <module>   s<   ,	=1?0 $; /B
 