
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
ǁaW\                 @   s>  d Z ddlZddlZddlZejd dk r4eZeZne	Ze
Zdd ZG dd deZG dd	 d	e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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ejdZejdZejd Zd!d" Zd#d$ Z d%d& Z!dNd(d)Z"d*d+ Z#d,d- Z$d.d/ Z%G d0d1 d1e&Z'G d2d3 d3e'Z(G d4d5 d5Z)d6d7 Z*e*d8Z+e*d9Z,e*d:Z-e*d;Z.e*d<e*d=d>Z/ejd?j0Z1eje)j2ej3j0Z4ejd@j0Z5e6edAr
ej7dBdCZ8ndDdE Z8dFdG Z9dHdI Z:dJdK Z;G dLdM dMeZ<dS )Oa  
    cssselect.parser
    ================

    Tokenizer, parser and parsed objects for CSS selectors.


    :copyright: (c) 2007-2012 Ian Bicking and contributors.
                See AUTHORS for more details.
    :license: BSD, see LICENSE for more details.

    N   c             C   s   | j dj jdS )z(Lower-case, but only in the ASCII range.utf8)encodelowerdecode)string r   /usr/lib/python3.6/parser.pyascii_lower   s    r
   c               @   s   e Zd ZdZdS )SelectorErrorzCommon parent for :class:`SelectorSyntaxError` and
    :class:`ExpressionError`.

    You can just use ``except SelectorError:`` when calling
    :meth:`~GenericTranslator.css_to_xpath` and handle both exceptions types.

    N)__name__
__module____qualname____doc__r   r   r   r	   r   !   s   r   c               @   s   e Zd ZdZdS )SelectorSyntaxErrorz3Parsing a selector that does not match the grammar.N)r   r   r   r   r   r   r   r	   r   *   s   r   c               @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
Selectoru"  
    Represents a parsed selector.

    :meth:`~GenericTranslator.selector_to_xpath` accepts this object,
    but ignores :attr:`pseudo_element`. It is the user’s responsibility
    to account for pseudo-elements and reject selectors with unknown
    or unsupported pseudo-elements.

    Nc             C   s,   || _ |d k	r"t|t r"t|}|| _d S )N)parsed_tree
isinstanceFunctionalPseudoElementr
   pseudo_element)selfZtreer   r   r   r	   __init__:   s
    

zSelector.__init__c             C   sB   t | jtrt| j}n| jr*d| j }nd}d| jj| j|f S )Nz::%s z%s[%r%s])r   r   r   repr	__class__r   r   )r   r   r   r   r	   __repr__U   s    zSelector.__repr__c             C   s(   | j j \}}}| jr|d7 }|||fS )zReturn the specificity_ of this selector as a tuple of 3 integers.

        .. _specificity: http://www.w3.org/TR/selectors/#specificity

           )r   specificityr   )r   abcr   r   r	   r   _   s    zSelector.specificity)N)r   r   r   r   r   r   r   r   r   r   r	   r   0   s   	

r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Classz(
    Represents selector.class_name
    c             C   s   || _ || _d S )N)selector
class_name)r   r"   r#   r   r   r	   r   o   s    zClass.__init__c             C   s   d| j j| j| jf S )Nz	%s[%r.%s])r   r   r"   r#   )r   r   r   r	   r   s   s    zClass.__repr__c             C   s"   | j j \}}}|d7 }|||fS )Nr   )r"   r   )r   r   r   r    r   r   r	   r   w   s    zClass.specificityN)r   r   r   r   r   r   r   r   r   r   r	   r!   k   s   r!   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )r   ax  
    Represents selector::name(arguments)

    .. attribute:: name

        The name (identifier) of the pseudo-element, as a string.

    .. attribute:: arguments

        The arguments of the pseudo-element, as a list of tokens.

        **Note:** tokens are not part of the public API,
        and may change between cssselect versions.
        Use at your own risks.

    c             C   s   t || _|| _d S )N)r
   name	arguments)r   r$   r%   r   r   r	   r      s    
z FunctionalPseudoElement.__init__c             C   s    d| j j| jdd | jD f S )Nz%s[::%s(%r)]c             S   s   g | ]
}|j qS r   )value).0tokenr   r   r	   
<listcomp>   s    z4FunctionalPseudoElement.__repr__.<locals>.<listcomp>)r   r   r$   r%   )r   r   r   r	   r      s    
z FunctionalPseudoElement.__repr__c             C   s   dd | j D S )Nc             S   s   g | ]
}|j qS r   )type)r'   r(   r   r   r	   r)      s    z:FunctionalPseudoElement.argument_types.<locals>.<listcomp>)r%   )r   r   r   r	   argument_types   s    z&FunctionalPseudoElement.argument_typesc             C   s"   | j j \}}}|d7 }|||fS )Nr   )r"   r   )r   r   r   r    r   r   r	   r      s    z#FunctionalPseudoElement.specificityN)r   r   r   r   r   r   r+   r   r   r   r   r	   r   }   s
   r   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Functionz(
    Represents selector:name(expr)
    c             C   s   || _ t|| _|| _d S )N)r"   r
   r$   r%   )r   r"   r$   r%   r   r   r	   r      s    
zFunction.__init__c             C   s$   d| j j| j| jdd | jD f S )Nz%s[%r:%s(%r)]c             S   s   g | ]
}|j qS r   )r&   )r'   r(   r   r   r	   r)      s    z%Function.__repr__.<locals>.<listcomp>)r   r   r"   r$   r%   )r   r   r   r	   r      s    zFunction.__repr__c             C   s   dd | j D S )Nc             S   s   g | ]
}|j qS r   )r*   )r'   r(   r   r   r	   r)      s    z+Function.argument_types.<locals>.<listcomp>)r%   )r   r   r   r	   r+      s    zFunction.argument_typesc             C   s"   | j j \}}}|d7 }|||fS )Nr   )r"   r   )r   r   r   r    r   r   r	   r      s    zFunction.specificityN)r   r   r   r   r   r   r+   r   r   r   r   r	   r,      s
   r,   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Pseudoz#
    Represents selector:ident
    c             C   s   || _ t|| _d S )N)r"   r
   ident)r   r"   r.   r   r   r	   r      s    zPseudo.__init__c             C   s   d| j j| j| jf S )Nz	%s[%r:%s])r   r   r"   r.   )r   r   r   r	   r      s    zPseudo.__repr__c             C   s"   | j j \}}}|d7 }|||fS )Nr   )r"   r   )r   r   r   r    r   r   r	   r      s    zPseudo.specificityN)r   r   r   r   r   r   r   r   r   r   r	   r-      s   r-   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Negationz.
    Represents selector:not(subselector)
    c             C   s   || _ || _d S )N)r"   subselector)r   r"   r0   r   r   r	   r      s    zNegation.__init__c             C   s   d| j j| j| jf S )Nz%s[%r:not(%r)])r   r   r"   r0   )r   r   r   r	   r      s    zNegation.__repr__c             C   s6   | j j \}}}| jj \}}}|| || || fS )N)r"   r   r0   )r   a1b1c1a2b2c2r   r   r	   r      s    zNegation.specificityN)r   r   r   r   r   r   r   r   r   r   r	   r/      s   r/   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Attribz>
    Represents selector[namespace|attrib operator value]
    c             C   s"   || _ || _|| _|| _|| _d S )N)r"   	namespaceattriboperatorr&   )r   r"   r8   r9   r:   r&   r   r   r	   r      s
    zAttrib.__init__c             C   s\   | j rd| j | jf }n| j}| jdkr<d| jj| j|f S d| jj| j|| j| jf S d S )Nz%s|%sexistsz
%s[%r[%s]]z%s[%r[%s %s %r]])r8   r9   r:   r   r   r"   r&   )r   r9   r   r   r	   r      s    
zAttrib.__repr__c             C   s"   | j j \}}}|d7 }|||fS )Nr   )r"   r   )r   r   r   r    r   r   r	   r      s    zAttrib.specificityN)r   r   r   r   r   r   r   r   r   r   r	   r7      s   r7   c               @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
ElementzU
    Represents namespace|element

    `None` is for the universal selector '*'

    Nc             C   s   || _ || _d S )N)r8   element)r   r8   r=   r   r   r	   r      s    zElement.__init__c             C   s.   | j pd}| jrd| j|f }d| jj|f S )N*z%s|%sz%s[%s])r=   r8   r   r   )r   r=   r   r   r	   r     s    
zElement.__repr__c             C   s   | j r
dS dS d S )Nr   r   )r   r   r   )r   r   r   )r=   )r   r   r   r	   r   
  s    zElement.specificity)NN)r   r   r   r   r   r   r   r   r   r   r	   r<      s   
r<   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Hashz 
    Represents selector#id
    c             C   s   || _ || _d S )N)r"   id)r   r"   r@   r   r   r	   r     s    zHash.__init__c             C   s   d| j j| j| jf S )Nz	%s[%r#%s])r   r   r"   r@   )r   r   r   r	   r     s    zHash.__repr__c             C   s"   | j j \}}}|d7 }|||fS )Nr   )r"   r   )r   r   r   r    r   r   r	   r     s    zHash.specificityN)r   r   r   r   r   r   r   r   r   r   r	   r?     s   r?   c               @   s$   e Zd Zdd Zdd Zdd ZdS )CombinedSelectorc             C   s"   |d k	st || _|| _|| _d S )N)AssertionErrorr"   
combinatorr0   )r   r"   rC   r0   r   r   r	   r   $  s    zCombinedSelector.__init__c             C   s.   | j dkrd}n| j }d| jj| j|| jf S )N z
<followed>z%s[%r %s %r])rC   r   r   r"   r0   )r   Zcombr   r   r	   r   *  s
    
zCombinedSelector.__repr__c             C   s6   | j j \}}}| jj \}}}|| || || fS )N)r"   r   r0   )r   r1   r2   r3   r4   r5   r6   r   r   r	   r   2  s    zCombinedSelector.specificityN)r   r   r   r   r   r   r   r   r   r	   rA   #  s   rA   z%^[ \t\r\n\f]*([a-zA-Z]+)[ \t\r\n\f]*$z6^[ \t\r\n\f]*([a-zA-Z]*)#([a-zA-Z0-9_-]+)[ \t\r\n\f]*$z?^[ \t\r\n\f]*([a-zA-Z]*)\.([a-zA-Z][a-zA-Z0-9_-]*)[ \t\r\n\f]*$c             C   s   t j| }|r$tt|jddgS tj| }|dk	r\ttt|jdpHdd|jdgS tj| }|dk	rttt|jdpdd|jdgS t	t
| }| |_tt|S )a  Parse a CSS *group of selectors*.

    If you don't care about pseudo-elements or selector specificity,
    you can skip this and use :meth:`~GenericTranslator.css_to_xpath`.

    :param css:
        A *group of selectors* as an Unicode string.
    :raises:
        :class:`SelectorSyntaxError` on invalid selectors.
    :returns:
        A list of parsed :class:`Selector` objects, one for each
        selector in the comma-separated group.

    r   )r=   N   )_el_rematchr   r<   group_id_rer?   	_class_rer!   TokenStreamtokenizesourcelistparse_selector_group)ZcssrG   streamr   r   r	   parseE  s    


rQ   c             c   s@   | j   x2tt|  V  | j dkr6| j  | j   q
P q
W d S )NDELIM,)rR   rS   )skip_whitespacer   parse_selectorpeeknext)rP   r   r   r	   rO   o  s    
rO   c             C   s   t | \}}xl| j  | j }|dkr(P |r8td| |jdddrZ| j j}| j  nd}t | \}}t|||}qW ||fS )NEOFrR   rS   z4Got pseudo-element ::%s not at the end of a selector+>~rD   rX   NrR   rS   )r\   r]   )parse_simple_selectorrT   rV   r   is_delimrW   r&   rA   )rP   resultr   rV   rC   Znext_selectorr   r   r	   rU   y  s"    

rU   Fc             C   s  | j   t| j}| j }|jdks,|dkrv|jdkrB| j j}n| j  d }| j dkrl| j  | j }q~|}d }nd  }}t||}d }x| j }|jdks|j	ddd	d
s|r|d krP |rt
d| |jdkrt|| j j}q|d!kr| j  t|| j }q|d"kr,| j  t|| }q|d#krL| j  | j d$kr| j  | j }| j d%kr| j  t|t| }q| j }|j d&krt|}q| j d'krt||}q| j  | j   |j dkr:|rt
dt| dd\}	}
| j }|
rt
d|
|jf |d(kr.t
d|f t||	}nt||t| }qt
d|f qW t| j|krt
d| j f ||fS ))NIDENTrR   r>   |SrX   rS   rY   rZ   r[   )z4Got pseudo-element ::%s not at the end of a selectorHASH.[:(
first-linefirst-letterbeforeafternotzGot nested :not()T)inside_negationz+Got pseudo-element ::%s inside :not() at %szExpected ')', got %szExpected selector, got %s)rR   r>   )rR   rb   )rc   rX   )rR   rd   )rR   rf   )rR   rg   )rR   rh   )rR   rh   )rR   ri   )rj   rk   rl   rm   )rR   ri   )rR   rd   )rT   lenusedrV   r*   rW   r&   next_ident_or_starr<   r_   r   r?   r!   
next_identparse_attribr   parse_argumentsr   _unicoder-   r^   posr/   r,   )rP   ro   Zselector_startrV   r8   r=   r`   r   r.   ZargumentZargument_pseudo_elementrW   r   r   r	   r^     s    









r^   c             C   sV   g }xL| j   | j }|jd	ks(|dkr4|j| q|dkr@|S td|f qW d S )Nra   STRINGNUMBERrR   rY   -rd   zExpected an argument, got %s)ra   rx   ry   rR   rY   rR   rz   )r{   r|   )rR   rd   )rT   rW   r*   appendr   )rP   r%   rW   r   r   r	   ru     s    ru   c             C   sj  |j   |j }|d kr6|j dkr6td|j f |j dkrz|j  |j dkrhd }|j  d}q|}|j }d }nd  }}|d kr|j   |j }|dkrt| ||dd S |dkrd}nD|jdd	d
dddo|j dk r|jd }|j  ntd|f |j   |j }|j	dkr0td|f |j   |j }|dkrXtd|f t| ||||jS )NrR   rb   zExpected '|', got %s=z|=]r;   ^$r>   r[   !zOperator expected, got %sra   rx   z Expected string or ident, got %szExpected ']', got %s)rR   rb   )rR   rb   )rR   r~   )rR   r   )rR   r~   )rR   r~   )ra   rx   )rR   r   )
rT   rr   rV   r   rW   rs   r7   r_   r&   r*   )r"   rP   r9   r8   oprW   r&   r   r   r	   rt     sN    



rt   c             C   s   x| D ]}|j dkrtdqW djdd | D j }|dkrDdS |d	krPdS |dkr\dS d|krpd
t|fS |jdd\}}|sd}n&|dks|dkrt|d }nt|}|sd
}nt|}||fS )zv
    Parses the arguments for :nth-child() and friends.

    :raises: A list of tokens
    :returns: :``(a, b)``

    rx   z$String tokens not allowed in series.r   c             s   s   | ]}|j V  qd S )N)r&   )r'   r(   r   r   r	   	<genexpr>+  s    zparse_series.<locals>.<genexpr>ZoddrE   r   Zevenr   nrz   rY   1)rE   r   )rE   r   )r   r   )r*   
ValueErrorjoinstripintsplit)tokensr(   sr   r   r   r   r	   parse_series   s,    

r   c               @   s@   e Zd Zdd Zdd Zdd ZeejdZ	eejdZ
d	S )
Tokenc             C   s   t j| ||f}||_|S )N)tuple__new__rw   )clsZtype_r&   rw   objr   r   r	   r   F  s    zToken.__new__c             C   s   d| j | j| jf S )Nz<%s '%s' at %i>)r*   r&   rw   )r   r   r   r	   r   K  s    zToken.__repr__c             G   s   | j dko| j|kS )NrR   )r*   r&   )r   valuesr   r   r	   r_   N  s    zToken.is_delimr   r   N)r   r   r   r   r   r_   propertyr:   
itemgetterr*   r&   r   r   r   r	   r   E  s
   r   c               @   s   e Zd Zdd Zdd ZdS )EOFTokenc             C   s   t j| dd |S )NrX   )r   r   )r   rw   r   r   r	   r   V  s    zEOFToken.__new__c             C   s   d| j | jf S )Nz
<%s at %i>)r*   rw   )r   r   r   r	   r   Y  s    zEOFToken.__repr__N)r   r   r   r   r   r   r   r   r	   r   U  s   r   c               @   s<   e Zd ZdZed Zde ZdZdeef Zdeef ZdS )TokenMacrosz&\\([0-9a-f]{1,6})(?:\r\n|[ \n\r\t\f])?z|\\[^\n\r\f0-9a-f]z\\(?:\n|\r\n|\r|\f)|z
[^\0-\177]z[_a-z0-9-]|%s|%sz[_a-z]|%s|%sN)	r   r   r   unicode_escapeescapeZstring_escapeZnonasciiZnmcharZnmstartr   r   r   r	   r   `  s   r   c             C   s   t j| tt t jjS )N)recompilevarsr   
IGNORECASErG   )patternr   r   r	   _compileh  s    r   z[ \t\r\n\f]+z[+-]?(?:[0-9]*\.[0-9]+|[0-9]+)z#(?:%(nmchar)s)+z -?(?:%(nmstart)s)(?:%(nmchar)s)*z!([^\n\r\f\\']|%(string_escape)s)*z!([^\n\r\f\\"]|%(string_escape)s)*)'"z\\(.)z\\(?:\n|\r\n|\r|\f)methodcallerrH   r   c             C   s
   | j dS )Nr   )rH   )rG   r   r   r	   _replace_simple}  s    r   c             C   s&   t | jdd}|tjkrd}t|S )Nr      i  )r   rH   sys
maxunicode_unichr)rG   Z	codepointr   r   r	   _replace_unicode  s    
r   c             C   s   t t| } tt| } | S )N)_sub_unicode_escaper   _sub_simple_escaper   )r&   r   r   r	   unescape_ident  s    

r   c             c   s
  d}t | }x||k rt| |d}|rBtdd|V  |j }qt| |d}|r~tttt|j	 }td||V  |j }qt
| |d}|rtttt|j	 dd  }td||V  |j }q| | }|tkr^t| | |d d}|std|j }||krtd	| | | |kr,td
| tttttd|j	 }td||V  |d }qt| |d}|r|j	 }td||V  |j }q|d }| || dkr| jd|}|dkr|}q|d7 }qtd| | |V  |d7 }qW ||kstt|V  d S )Nr   )rw   rc   rD   ra   r   re   z)Should have found at least an empty matchzUnclosed string at %szInvalid string at %sr   rx   ry   rE   z/*z*/rR   )rp   _match_whitespacer   end_match_identr   r   r   r   rH   _match_hash_match_string_by_quoterB   r   _sub_newline_escape_match_numberfindr   )r   rw   Zlen_srG   r&   ZquoteZend_posZpos2r   r   r	   rL     sl    


rL   c               @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )rK   Nc             C   sT   g | _ t|| _|| _d | _d| _y| jj| _W n tk
rN   | jj	| _Y nX d S )NF)
rq   iterr   rM   peeked_peekingrW   
next_tokenAttributeError__next__)r   r   rM   r   r   r	   r     s    
zTokenStream.__init__c             C   s<   | j r d| _ | jj| j | jS | j }| jj| |S d S )NF)r   rq   r}   r   r   )r   rW   r   r   r	   rW     s    zTokenStream.nextc             C   s   | j s| j | _d| _ | jS )NT)r   r   r   )r   r   r   r	   rV     s    
zTokenStream.peekc             C   s&   | j  }|jdkr td|f |jS )Nra   zExpected ident, got %s)rW   r*   r   r&   )r   rW   r   r   r	   rs     s    
zTokenStream.next_identc             C   s6   | j  }|jdkr|jS |dkr$d S td|f d S )Nra   rR   r>   zExpected ident or '*', got %s)rR   r>   )rW   r*   r&   r   )r   rW   r   r   r	   rr     s    
zTokenStream.next_ident_or_starc             C   s   | j  }|jdkr| j  d S )Nrc   )rV   r*   rW   )r   rV   r   r   r	   rT     s    
zTokenStream.skip_whitespace)N)	r   r   r   r   rW   rV   rs   rr   rT   r   r   r   r	   rK     s   


rK   )F)=r   r   r   r:   version_infoZunicoderv   Zunichrr   strchrr
   	Exceptionr   SyntaxErrorr   objectr   r!   r   r,   r-   r/   r7   r<   r?   rA   r   rF   rI   rJ   rQ   rO   rU   r^   ru   rt   r   r   r   r   r   r   r   r   r   r   r   subr   r   Ir   r   hasattrr   r   r   r   rL   rK   r   r   r   r	   <module>   sh   	;#

*

S-%A