3
(h\                 @   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   7/tmp/pip-install-q3hcpn_q/cssselect/cssselect/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)self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#   r1   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#   r1   )r   r   r   r	   r      s    zNegation.__repr__c             C   s6   | j j \}}}| jj \}}}|| || || fS )N)r#   r   r1   )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	   r0      s   r0   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#   r9   r:   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]])r9   r:   r;   r   r   r#   r'   )r   r:   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	   r8      s   r8   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)r9   element)r   r9   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>   r9   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#   rA   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#   rA   )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#   
combinatorr1   )r   r#   rD   r1   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])rD   r   r   r#   r1   )r   Zcombr   r   r	   r   *  s
    
zCombinedSelector.__repr__c             C   s6   | j j \}}}| jj \}}}|| || || fS )N)r#   r   r1   )r   r2   r3   r4   r5   r6   r7   r   r   r	   r   2  s    zCombinedSelector.specificityN)r   r   r   r   r   r   r   r   r   r	   rB   #  s   rB   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)cssrH   streamr   r   r	   parseE  s    


rS   c             c   s@   | j   x2tt|  V  | j dkr6| j  | j   q
P q
W d S )NDELIM,)rT   rU   )skip_whitespacer   parse_selectorpeeknext)rR   r   r   r	   rP   o  s    
rP   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EOFrT   rU   z4Got pseudo-element ::%s not at the end of a selector+>~rE   rZ   NrT   rU   )r^   r_   )parse_simple_selectorrV   rX   r   is_delimrY   r'   rB   )rR   resultr   rX   rD   Znext_selectorr   r   r	   rW   y  s"    

rW   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IDENTrT   r?   |SrZ   rU   r[   r\   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)rT   r?   )rT   rd   )re   rZ   )rT   rf   )rT   rh   )rT   ri   )rT   rj   )rT   rj   )rT   rk   )rl   rm   rn   ro   )rT   rk   )rT   rf   )rV   lenusedrX   r+   rY   r'   next_ident_or_starr=   ra   r   r@   r"   
next_identparse_attribr   parse_argumentsr   _unicoder.   r`   posr0   r-   )rR   rq   Zselector_startrX   r9   r>   rb   r   r/   argumentZargument_pseudo_elementrY   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 )Nrc   STRINGNUMBERrT   r[   -rf   zExpected an argument, got %s)rc   r{   r|   rT   r[   rT   r}   )r~   r   )rT   rf   )rV   rY   r+   appendr   )rR   r&   rY   r   r   r	   rw     s    rw   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 )NrT   rd   zExpected '|', got %s=z|=]r<   ^$r?   r]   !zOperator expected, got %src   r{   z Expected string or ident, got %szExpected ']', got %s)rT   rd   )rT   rd   )rT   r   )rT   r   )rT   r   )rT   r   )rc   r{   )rT   r   )
rV   rt   rX   r   rY   ru   r8   ra   r'   r+   )r#   rR   r:   r9   oprY   r'   r   r   r	   rv     sN    



rv   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)``

    r{   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oddrF   r   Zevenr   nr}   r[   1)rF   r   )rF   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__ry   )clstype_r'   ry   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'   ry   )r   r   r   r	   r   K  s    zToken.__repr__c             G   s   | j dko| j|kS )NrT   )r+   r'   )r   valuesr   r   r	   ra   N  s    zToken.is_delimr   r   N)r   r   r   r   r   ra   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 )NrZ   )r   r   )r   ry   r   r   r	   r   V  s    zEOFToken.__new__c             C   s   d| j | jf S )Nz
<%s at %i>)r+   ry   )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   
IGNORECASErH   )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)methodcallerrI   r   c             C   s
   | j dS )Nr   )rI   )rH   r   r   r	   _replace_simple}  s    r   c             C   s&   t | jdd}|tjkrd}t|S )Nr      i  )r   rI   sys
maxunicode_unichr)rH   	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   )ry   re   rE   rc   r   rg   z)Should have found at least an empty matchzUnclosed string at %szInvalid string at %sr   r{   r|   rF   z/*z*/rT   )rr   _match_whitespacer   end_match_identr   r   r   r   rI   _match_hash_match_string_by_quoterC   r   _sub_newline_escape_match_numberfindr   )r   ry   Zlen_srH   r'   quoteZend_pospos2r   r   r	   rM     sl    


rM   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 )rL   Nc             C   sT   g | _ t|| _|| _d | _d| _y| jj| _W n tk
rN   | jj	| _Y nX d S )NF)
rs   iterr   rN   peeked_peekingrY   
next_tokenAttributeError__next__)r   r   rN   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   rs   r   r   r   )r   rY   r   r   r	   rY     s    zTokenStream.nextc             C   s   | j s| j | _d| _ | jS )NT)r   r   r   )r   r   r   r	   rX     s    
zTokenStream.peekc             C   s&   | j  }|jdkr td|f |jS )Nrc   zExpected ident, got %s)rY   r+   r   r'   )r   rY   r   r   r	   ru     s    
zTokenStream.next_identc             C   s6   | j  }|jdkr|jS |dkr$d S td|f d S )Nrc   rT   r?   zExpected ident or '*', got %s)rT   r?   )rY   r+   r'   r   )r   rY   r   r   r	   rt     s    
zTokenStream.next_ident_or_starc             C   s   | j  }|jdkr| j  d S )Nre   )rX   r+   rY   )r   rX   r   r   r	   rV     s    
zTokenStream.skip_whitespace)N)	r   r   r   r   rY   rX   ru   rt   rV   r   r   r   r	   rL     s   


rL   )F)=r   r   r   r;   version_infounicoderx   unichrr   strchrr
   	Exceptionr   SyntaxErrorr   objectr   r"   r   r-   r.   r0   r8   r=   r@   rB   r   rG   rJ   rK   rS   rP   rW   r`   rw   rv   r   r   r   r   r   r   r   r   r   r   r   subr   r   Ir   r   hasattrr   r   r   r   rM   rL   r   r   r   r	   <module>   sh   	;#

*

S-%A