
    Vh$                        d Z ddlmZ  G d de      Z G d d      Z G d d      Z G d	 d
      Z G d d      Zd Z	 G d d      Z
 G d d      Z G d d      Z G d d      Z G d d      Zi Zd Zd Zd Zd Zd Zy)z
XPath query support.

This module provides L{XPathQuery} to match
L{domish.Element<twisted.words.xish.domish.Element>} instances against
XPath-like expressions.
    )StringIOc                       e Zd Zd Zy)LiteralValuec                     | S N selfelems     H/home/dcms/DCMS/lib/python3.12/site-packages/twisted/words/xish/xpath.pyvaluezLiteralValue.value   s        N)__name__
__module____qualname__r   r   r   r   r   r      s    r   r   c                       e Zd Zd Zd Zy)
IndexValuec                 *    t        |      dz
  | _        y )N   )intindex)r
   r   s     r   __init__zIndexValue.__init__   s    Z!^
r   c                 4    |j                   | j                     S r   )childrenr   r	   s     r   r   zIndexValue.value   s    }}TZZ((r   N)r   r   r   r   r   r   r   r   r   r      s    $)r   r   c                       e Zd Zd Zd Zd Zy)AttribValuec                 T    || _         | j                   dk(  r| j                  | _        y y )Nxmlns)
attribnamevalue_nsr   )r
   r   s     r   r   zAttribValue.__init__    s%    $??g%DJ &r   c                     |j                   S r   )urir	   s     r   r    zAttribValue.value_ns%   s    xxr   c                 f    | j                   |j                  v r|j                  | j                      S y r   )r   
attributesr	   s     r   r   zAttribValue.value(   s(    ??doo-??4??33r   N)r   r   r   r   r    r   r   r   r   r   r      s    '
r   r   c                       e Zd Zd Zd Zd Zy)CompareValuec                 p    || _         || _        |dk(  r| j                  | _        y | j                  | _        y )N=)lhsrhs_compareEqualr   _compareNotEqualr
   r)   opr*   s       r   r   zCompareValue.__init__0   s1    9++DJ..DJr   c                 p    | j                   j                  |      | j                  j                  |      k(  S r   r)   r   r*   r	   s     r   r+   zCompareValue._compareEqual8   '    xx~~d#txx~~d';;;r   c                 p    | j                   j                  |      | j                  j                  |      k7  S r   r0   r	   s     r   r,   zCompareValue._compareNotEqual;   r1   r   N)r   r   r   r   r+   r,   r   r   r   r&   r&   /   s    /<<r   r&   c                   "    e Zd ZdZd Zd Zd Zy)BooleanValuea^  
    Provide boolean XPath expression operators.

    @ivar lhs: Left hand side expression of the operator.
    @ivar op: The operator. One of C{'and'}, C{'or'}.
    @ivar rhs: Right hand side expression of the operator.
    @ivar value: Reference to the method that will calculate the value of
                 this expression given an element.
    c                 p    || _         || _        |dk(  r| j                  | _        y | j                  | _        y )Nand)r)   r*   _booleanAndr   
_booleanOrr-   s       r   r   zBooleanValue.__init__J   s/    ;))DJDJr   c                 r    | j                   j                  |      xr | j                  j                  |      S )z
        Calculate boolean and of the given expressions given an element.

        @param elem: The element to calculate the value of the expression from.
        r0   r	   s     r   r7   zBooleanValue._booleanAndR   s)     xx~~d#<t(<<r   c                 r    | j                   j                  |      xs | j                  j                  |      S )z
        Calculate boolean or of the given expressions given an element.

        @param elem: The element to calculate the value of the expression from.
        r0   r	   s     r   r8   zBooleanValue._booleanOrZ   s)     xx~~d#;txx~~d';;r   N)r   r   r   __doc__r   r7   r8   r   r   r   r4   r4   ?   s    )=<r   r4   c                 4    d| z  } t               |          }|S )z;
    Internal method which selects the function object
    z_%s_Function)globals)fname	klassnamecs      r   FunctionrA   c   s$     &I	)AHr   c                       e Zd Zd Zd Zd Zy)_not_Functionc                     d | _         y r   	baseValuer
   s    r   r   z_not_Function.__init__m   s	    r   c                     || _         y r   rE   )r
   rF   s     r   	setParamsz_not_Function.setParamsp   s	    "r   c                 :    | j                   j                  |       S r   )rF   r   r	   s     r   r   z_not_Function.values   s    >>''---r   N)r   r   r   r   rI   r   r   r   r   rC   rC   l   s    #.r   rC   c                       e Zd Zd Zd Zy)_text_Functionc                      y r   r   rG   s    r   rI   z_text_Function.setParamsx   s    r   c                     t        |      S r   )strr	   s     r   r   z_text_Function.value{   s    4yr   N)r   r   r   rI   r   r   r   r   rL   rL   w   s    r   rL   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)	_Locationc                 .    g | _         d | _        d | _        y r   
predicateselementNamechildLocationrG   s    r   r   z_Location.__init__       !r   c                     | j                   d k7  r| j                   |j                  k7  ry| j                  D ]  }|j                  |      r y yNr   r   )rU   namerT   r   r
   r   ps      r   matchesPredicatesz_Location.matchesPredicates   sJ    t#(8(8DII(E 	A774=	 r   c                     | j                  |      sy| j                  d k7  r3|j                         D ]  }| j                  j                  |      s y yyrY   )r]   rV   elementsmatchesr
   r   r@   s      r   r`   z_Location.matches   sW    %%d+%]]_ %%--a0  r   c                     | j                  |      sy | j                  d k7  r2|j                         D ]  }| j                  j                  ||         y |j	                  t        |             y r   )r]   rV   r_   queryForStringwriterO   )r
   r   	resultbufr@   s       r   rc   z_Location.queryForString   s`    %%d+%]]_ @""11!Y?@ OOCI&r   c                     | j                  |      sy | j                  d k7  r2|j                         D ]  }| j                  j                  ||         y |j	                  |       y r   )r]   rV   r_   queryForNodesappendr
   r   
resultlistr@   s       r   rg   z_Location.queryForNodes   s^    %%d+%]]_ @""00J?@ d#r   c                    | j                  |      sy | j                  d k7  r2|j                         D ]  }| j                  j                  ||         y |j                  D ]$  }t        |t              s|j                  |       & y r   )r]   rV   r_   queryForStringListr   
isinstancerO   rh   ri   s       r   rl   z_Location.queryForStringList   s{    %%d+%]]_ E""55aDE ]] )a%%%a()r   N)	r   r   r   r   r]   r`   rc   rg   rl   r   r   r   rQ   rQ      s     "
'$
)r   rQ   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)_AnyLocationc                 .    g | _         d | _        d | _        y r   rS   rG   s    r   r   z_AnyLocation.__init__   rW   r   c                 L    | j                   D ]  }|j                  |      r y yrY   )rT   r   r[   s      r   r]   z_AnyLocation.matchesPredicates   s(     	A774=	 r   c                     |j                   d k7  r| j                  |j                   |       |j                  |j                         y r   )parentlistParentsrh   rZ   )r
   r   
parentlists      r   rt   z_AnyLocation.listParents   s4    ;;$T[[*5$))$r   c                     | j                   d k(  s| j                   |j                  k(  rT| j                  |      rC| j                  d k7  r3|j	                         D ]  }| j                  j                  |      s y yyyNTFrU   rZ   r]   rV   r_   r`   ra   s      r   isRootMatchz_AnyLocation.isRootMatch   sv    $(8(8DII(E$$T*!!T) $A))11!4#$
  r   c                 V   | j                   d k(  s| j                   |j                  k(  rW| j                  |      rF| j                  d k7  r5|j	                         D ]!  }| j                  j                  |      s|c S  y |S |j	                         D ]  }| j                  |      s|c S  y r   rx   ra   s      r   findFirstRootMatchz_AnyLocation.findFirstRootMatch   s    $(8(8DII(E$$T*
 !!T) !A))11!4 !  
 ]]_ <<?H r   c                 x    | j                  |      ry|j                         D ]  }| j                  |      s y yrw   )ry   r_   r`   ra   s      r   r`   z_AnyLocation.matches   s=    D!
 ]]_  <<?  r   c                     t        d      )Nz2queryForString is not implemented for any location)NotImplementedError)r
   r   re   s      r   rc   z_AnyLocation.queryForString  s    !"VWWr   c                     | j                  |      r|j                  |       |j                         D ]  }| j                  ||        y r   )ry   rh   r_   rg   ri   s       r   rg   z_AnyLocation.queryForNodes  sE    D!d#  	.Aq*-	.r   c                     | j                  |      r3|j                  D ]$  }t        |t              s|j	                  |       & |j                         D ]  }| j                  ||        y r   )ry   r   rm   rO   rh   r_   rl   ri   s       r   rl   z_AnyLocation.queryForStringList  sb    D!]] )a%%%a()  	3A##Az2	3r   N)r   r   r   r   r]   rt   ry   r{   r`   rc   rg   rl   r   r   r   ro   ro      s0    "
%

4X.3r   ro   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)
XPathQueryc                 j    || _         ddlm}m}  | ||            } t	        |d             | _        y )Nr   )XPathParserXPathParserScannerXPATH)queryStrtwisted.words.xish.xpathparserr   r   getattrbaseLocation)r
   r   r   r   parsers        r   r   zXPathQuery.__init__  s0     R/9:4GFG46r   c                 6    | j                   j                         S r   )r   __hash__rG   s    r   r   zXPathQuery.__hash__  s    }}%%''r   c                 8    | j                   j                  |      S r   )r   r`   r	   s     r   r`   zXPathQuery.matches"  s      ((..r   c                 n    t               }| j                  j                  ||       |j                         S r   )r   r   rc   getvaluer
   r   results      r   rc   zXPathQuery.queryForString%  s,    ((v6  r   c                 `    g }| j                   j                  ||       t        |      dk(  ry |S Nr   )r   rg   lenr   s      r   rg   zXPathQuery.queryForNodes*  s1    ''f5v;!Mr   c                 `    g }| j                   j                  ||       t        |      dk(  ry |S r   )r   rl   r   r   s      r   rl   zXPathQuery.queryForStringList2  s1    ,,T6:v;!Mr   N)	r   r   r   r   r   r`   rc   rg   rl   r   r   r   r   r     s     7(/!
r   r   c                 H    | t         vrt        |       t         | <   t         |    S r   )__internedQueriesr   )queryStrings    r   internQueryr   >  s&    ++)3K)@+&[))r   c                 6    t        |       j                  |      S r   )r   r`   xpathstrr   s     r   r`   r`   D  s    x ((..r   c                 6    t        |       j                  |      S r   )r   rl   r   s     r   rl   rl   H  s    x 33D99r   c                 6    t        |       j                  |      S r   )r   rc   r   s     r   rc   rc   L  s    x //55r   c                 6    t        |       j                  |      S r   )r   rg   r   s     r   rg   rg   P  s    x ..t44r   N)r;   ior   rO   r   r   r   r&   r4   rA   rC   rL   rQ   ro   r   r   r   r`   rl   rc   rg   r   r   r   <module>r      s    3 
) )  < < !< !<H. . ;) ;)|V3 V3r" "J  */:65r   