
    oe                     <   d dl mZ d dl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 d dlmZmZmZ erd dlmZ  G d	 d
e          Zerd dlmZ  G d de          Z G d d          Z G d dee          Z G d dee
          Z	 e	            ZdedefdZdS )    )	lru_cache)TYPE_CHECKINGAnyOptional)GenericTranslator)HTMLTranslator)	XPathExpr)ExpressionError)ElementFunctionalPseudoElementPseudoElement)Selfc                        e Zd ZU dZeed<   dZee         ed<   e		 	 dde
dedee         ddfd            Zdef fd	Zd
ddede
dededdf fdZ xZS )r	   FtextnodeN	attributexpathreturnr   c                 \     | |j         |j        |j                  }||_        ||_        |S )N)pathelement	condition)r   r   r   r   r   )clsr   r   r   xs        4lib/python3.11/site-packages/parsel/csstranslator.py
from_xpathzXPathExpr.from_xpath   s<     CU]eo
 
 
 
    c                    t                                                      }| j        r1|dk    rd}n(|                    d          r|d d         dz   }n|dz  }| j        ,|                    d          r
|d d         }|d| j         z  }|S )N*ztext()z::*/*z/text()z/@)super__str__r   endswithr   )selfr   	__class__s     r   r"   zXPathExpr.__str__#   s    ww  = 	"s{{w'' "CRCy8+	!>%}}W%% !CRCy))))Dr   r$   combinerotherargskwargsc                     t          |t                    s't          dt           dt	          |                      t                      j        ||g|R i | |j        | _        |j        | _        | S )NzExpressions of type zO.XPathExpr can ony join expressions of the same type (or its descendants), got )	
isinstancer	   
ValueError__name__typer!   joinr   r   )r$   r&   r'   r(   r)   r%   s        r   r/   zXPathExpr.join4   s     %++ 	Mx M M?CE{{M M   	Xu6t666v666r   )FN)r-   
__module____qualname__r   bool__annotations__r   r   strclassmethodOriginalXPathExprr   r"   r   r/   __classcell__r%   s   @r   r	   r	      s        Hd#Ix}### #'	    C=	
 
   [      " ! 	
  
         r   r	   )Protocolc                   4    e Zd ZdedefdZd	dededefdZdS )
TranslatorProtocolselectorr   c                     d S N )r$   r<   s     r   xpath_elementz TranslatorProtocol.xpath_elementL       Dr   .cssprefixc                     d S r>   r?   )r$   rB   rC   s      r   css_to_xpathzTranslatorProtocol.css_to_xpathO   rA   r   N).)r-   r0   r1   r   r6   r@   r4   rE   r?   r   r   r;   r;   K   se        	' 	6G 	 	 	 		 	C 	 	s 	 	 	 	 	 	r   r;   c                   h     e Zd ZdZdddedef fdZdededefd	Z	ded
e
defdZdedefdZ xZS )TranslatorMixinzThis mixin adds support to CSS pseudo elements via dynamic dispatch.

    Currently supported pseudo-elements are ``::text`` and ``::attr(ATTR_NAME)``.
    r$   r;   r<   r   c                 z    t                                          |          }t                              |          S r>   )r!   r@   r	   r   )r$   r<   r   r%   s      r   r@   zTranslatorMixin.xpath_elementY   s0     %%h//##E***r   r   pseudo_elementc                 t   t          |t                    rWd|j                            dd           d}t	          | |d          }|st          d|j         d           |||          }nKd|                    dd           d}t	          | |d          }|st          d	| d
           ||          }|S )zQ
        Dispatch method that transforms XPath to support pseudo-element
        xpath_-__functional_pseudo_elementNz The functional pseudo-element ::z() is unknown_simple_pseudo_elementzThe pseudo-element ::z is unknown)r+   r   namereplacegetattrr
   )r$   r   rI   method_namemethods        r   xpath_pseudo_elementz$TranslatorMixin.xpath_pseudo_element`   s     n&=>> 	"d>#6#>#>sC#H#HdddKT;55F %Y~7JYYY   F5.11EE[>#9#9#s#C#C[[[KT;55F %GNGGG   F5MMEr   functionc                     |                                 dgdgfvrt          d|j                  t                              ||j        d         j                  S )z@Support selecting attribute values using ::attr() pseudo-elementSTRINGIDENTz4Expected a single string or ident for ::attr(), got r   )r   )argument_typesr
   	argumentsr	   r   value)r$   r   rV   s      r   $xpath_attr_functional_pseudo_elementz4TranslatorMixin.xpath_attr_functional_pseudo_elementx   ss     ""$$hZ',CCC!]xGY]]   ##X/28 $ 
 
 	
r   c                 :    t                               |d          S )z8Support selecting text nodes using ::text pseudo-elementT)r   )r	   r   )r$   r   s     r    xpath_text_simple_pseudo_elementz0TranslatorMixin.xpath_text_simple_pseudo_element   s     ##ED#999r   )r-   r0   r1   __doc__r   r	   r@   r6   r   rU   r   r]   r_   r7   r8   s   @r   rG   rG   S   s         
+"+.5+	+ + + + + +&8E	   0

&

2I

	

 

 

 

:&:	: : : : : : : :r   rG   c                   T     e Zd Z ed          	 ddededef fd            Z xZS )	r      maxsizedescendant-or-self::rB   rC   r   c                 H    t                                          ||          S r>   r!   rE   r$   rB   rC   r%   s      r   rE   zGenericTranslator.css_to_xpath        ww##C000r   re   r-   r0   r1   r   r4   rE   r7   r8   s   @r   r   r      u        Ys&<1 11 #1	1 1 1 1 1 1 1 1 1 1r   r   c                   T     e Zd Z ed          	 ddededef fd            Z xZS )	r   rb   rc   re   rB   rC   r   c                 H    t                                          ||          S r>   rg   rh   s      r   rE   zHTMLTranslator.css_to_xpath   ri   r   rj   rk   r8   s   @r   r   r      rl   r   r   queryr   c                 6    t                               |           S )z4Return translated XPath version of a given CSS query)_translatorrE   )ro   s    r   	css2xpathrr      s    ##E***r   N)	functoolsr   typingr   r   r   	cssselectr   OriginalGenericTranslatorr   OriginalHTMLTranslatorcssselect.xpathr	   r6   r
   cssselect.parserr   r   r   typing_extensionsr   r9   r;   rG   rq   r4   rr   r?   r   r   <module>r{      s         / / / / / / / / / / D D D D D D > > > > > > : : : : : : + + + + + + L L L L L L L L L L  '&&&&&&3 3 3 3 3! 3 3 3l  
    X   5: 5: 5: 5: 5: 5: 5: 5:p1 1 1 1 1)B 1 1 11 1 1 1 1_&< 1 1 1 n+S +S + + + + + +r   