U
    ž¬Nc<  ã                   @   sÒ   d dl Z d dlZd dlmZ ddlmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZ ddlmZmZ e  d¡Ze  d¡Zdd	d
„Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!dd„ Z"dd„ Z#dS )é    N)Úascii_loweré   )ÚAtKeywordTokenÚCommentÚCurlyBracketsBlockÚDimensionTokenÚFunctionBlockÚ	HashTokenÚ
IdentTokenÚLiteralTokenÚNumberTokenÚParenthesesBlockÚ
ParseErrorÚPercentageTokenÚSquareBracketsBlockÚStringTokenÚUnicodeRangeTokenÚURLTokenÚWhitespaceToken)Úserialize_string_valueÚserialize_urlz([-+]?([0-9]*\.)?[0-9]+([eE][+-]?[0-9]+)?z([0-9A-Fa-f]{1,6})[ \n\t]?Fc              	   C   sh  |   dd¡  dd¡  dd¡  dd¡} t| ƒ}d }}d}d	}g  }}d
}	g }
||k rd|  d||¡}|d	kr†|d|  d||¡ 7 }|}|| }|}| | }|dkrä|d7 }|  d|¡rÀ|d7 }qª| ||… }| t|||ƒ¡ qLnð|dkrN|d |k rN| |d  dkrN| |d  dkrNt| |d ƒ\}}}| t||||ƒ¡ qLn†|  d|¡r|| t	||dƒ¡ |d7 }qLnXt
| |ƒrÔt| |ƒ\}}|  d|¡s¸| t|||ƒ¡ qL|d7 }t|ƒdkr¤|}|  d|¡rì|d7 }qÒ||ks| | dkr¤t| |ƒ\}}}|d
k	r„d t|ƒ¡}|d
k	rp|d }|dkrV|d
d… }n|dksdt‚|d
d	… }| t||||ƒ¡ |d
k	rL| t||f|žŽ ¡ qLg }| t||||ƒ¡ |
 ||	f¡ d}	|}qLt | |¡}|r | ¡ }| ||… }t|ƒ}t| ¡ ƒst|ƒnd
}||k rZt
| |ƒrZt| |ƒ\}}| t||||||ƒ¡ nD|  d|¡rˆ|d7 }| t|||||ƒ¡ n| t|||||ƒ¡ qL|dkrþ|d7 }||k rêt
| |ƒrêt| |ƒ\}}| t|||ƒ¡ n| t	||dƒ¡ qL|dkr˜|d7 }||k r„| | dksVt | | ƒdksV| | d kr„|  d!|¡s„t
| |ƒ}t| |ƒ\}}| t!||||ƒ¡ n| t	||dƒ¡ qL|d"krØg }| t"|||ƒ¡ |
 ||	f¡ d#}	|}|d7 }qL|d$krg }| t#|||ƒ¡ |
 ||	f¡ d%}	|}|d7 }qL|dkrXg }| t$|||ƒ¡ |
 ||	f¡ d}	|}|d7 }qL||	krx|
 %¡ \}}	|d7 }qL|d&kr¤| t|||d'| ƒ¡ |d7 }qL|dkr"t&| |ƒ\}}}|d
k	r d( t'|ƒ¡}|d
k	rì|d
d	… }| t(||||ƒ¡ |d
k	rb| t||f|žŽ ¡ qL|  d)|¡r |  )d*|d ¡}|d	krr|sd| t*||| |d d
… ƒ¡ qd|s–| t*||| |d |… ƒ¡ |d7 }qL|  d+|¡rÊ| t	||d+ƒ¡ |d,7 }qL|  d-|¡rô| t	||d-ƒ¡ |d7 }qL|d.krH|d7 }|  d/|¡r4|d7 }| t	|||d/ ƒ¡ n| t	|||ƒ¡ qL| t	|||ƒ¡ |d7 }qL|S )0aw  Parse a list of component values.

    :type css: :obj:`str`
    :param css: A CSS string.
    :type skip_comments: :obj:`bool`
    :param skip_comments:
        Ignore CSS comments.
        The return values (and recursively its blocks and functions)
        will not contain any :class:`~tinycss2.ast.Comment` object.
    :returns: A list of :term:`component values`.

    ú õ   ï¿½z
Ú
úúr   r   éÿÿÿÿNú 
	©ú r   ú	ZUué   ú+z0123456789abcdefABCDEF?z-->é   ú(Zurl©ú"ú'zurl({})úeof-in-stringéþÿÿÿú
eof-in-urlú)ú%ú@ú#z@0123456789abcdefghijklmnopqrstuvwxyz-_ABCDEFGHIJKLMNOPQRSTUVWXYZé   ú\ú\
Ú{Ú}ú[ú]z}])z
Unmatched z"{}"z/*z*/z<!--é   z||z~|^$*ú=)+ÚreplaceÚlenÚrfindÚcountÚ
startswithÚappendr   Ú_consume_unicode_ranger   r   Ú_is_ident_startÚ_consume_identr
   r   Ú_consume_urlÚformatr   ÚAssertionErrorr   r   r   Ú
_NUMBER_REÚmatchÚendÚfloatÚanyÚgroupsÚintr   r   r   r   Úordr	   r   r   r   ÚpopÚ_consume_quoted_stringr   r   Úfindr   )ÚcssZskip_commentsÚlengthZtoken_start_posÚposÚlineZlast_newlineÚrootÚtokensZend_charÚstackÚnewlineÚcolumnÚcÚvalueÚstartrF   Zurl_posÚerrorÚreprZ	error_keyZ	argumentsrE   Úrepr_Z	int_valueZunitZis_identifierZcontent© r^   ú1lib/python3.8/site-packages/tinycss2/tokenizer.pyÚparse_component_value_list   sz    þ þ þ

*ÿ


     ÿ    ÿ    ÿ



ÿý
û
û















ÿÿ




r`   c                 C   s   | | }|dkpt |ƒdkS )z>Return true if the given character is a name-start code point.Z5abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_r/   )rK   )rO   rQ   rX   r^   r^   r_   Ú_is_name_startÌ   s    
þra   c                 C   s|   t | |ƒrdS | | dkr^|d7 }|t| ƒk rDt | |ƒp\| | dkp\|  d|¡o\|  d|¡ S | | dkrx|  d|¡ S dS )zCReturn True if the given position is the start of a CSS identifier.Tú-r   r0   r1   F)ra   r9   r<   )rO   rQ   r^   r^   r_   r?   Õ   s    
ÿûr?   c                 C   sª   g }t | ƒ}|}||k rŠ| | }|dks4t|ƒdkr>|d7 }q|dkrŠ|  d|¡sŠ| | ||… ¡ t| |d ƒ\}}| |¡ |}qqŠq| | ||… ¡ d |¡|fS )ztReturn (unescaped_value, new_pos).

    Assumes pos starts at a valid identifier. See :func:`_is_ident_start`.

    z@abcdefghijklmnopqrstuvwxyz-_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZr/   r   r0   r1   Ú )r9   rK   r<   r=   Ú_consume_escapeÚjoin)rO   rQ   ÚchunksrP   Ú	start_posrX   r^   r^   r_   r@   ç   s"    
ÿ

r@   c                 C   s  d}| | }|dkst ‚|d7 }g }t| ƒ}|}||k rà| | }||krf| | ||… ¡ |d7 }qöq0|dkrÄ| | ||… ¡ |d7 }||k r¾| | dkr¦|d7 }nt| |ƒ\}}| |¡ |}q0|dkrÖd|dfS |d7 }q0d}| | ||… ¡ d |¡||fS )	z"Return (unescaped_value, new_pos).Nr%   r   r0   r   )z
bad-stringzBad string token)r(   zEOF in stringrc   )rC   r9   r=   rd   re   )rO   rQ   r[   Zquoterf   rP   rg   rX   r^   r^   r_   rM     s8    



rM   c                 C   sv   t  | |¡}|rNt| d¡dƒ}d|  k r6tjkrBn nt|ƒnd| ¡ fS |t| ƒk rj| | |d fS d|fS dS )ztReturn (unescaped_char, new_pos).

    Assumes a valid escape: pos is just after '\' and not followed by '\n'.

    r   é   r   r   N)	Ú_HEX_ESCAPE_RErE   rJ   ÚgroupÚsysÚ
maxunicodeÚchrrF   r9   )rO   rQ   Z	hex_matchZ	codepointr^   r^   r_   rd   '  s    $þrd   c                 C   s8  d}t | ƒ}|  d|¡r"|d7 }q||kr4d|dfS | | }|dkrXt| |ƒ\}}}n(|dkrnd|d |fS g }|}||kr | | ||… ¡ d |¡|dfS | | }|dkrÚ| | ||… ¡ |d7 }d |¡||fS |dkr| | ||… ¡ d |¡}|d7 }q€qv|d	krZ|  d
|¡sZ| | ||… ¡ t| |d ƒ\}}| |¡ |}qv|dkrvd}|d7 }q€qv|d7 }qv|dk	rä|  d|¡r¤|d7 }qŠ||k rÌ| | dkrä||d |fS n|dkrÚd}|||fS ||k r.|  d|¡r|d7 }n$| | dkr"|d7 }q.n|d7 }qäd|dfS )zgReturn (unescaped_url, new_pos)

    The given pos is assumed to be just after the '(' of 'url('.

    Nr   r   rc   )r*   z
EOF in URLr%   r+   r   r0   r1   z "'( z\)r!   )zbad-urlzbad URL token)r9   r<   rM   r=   re   rd   )rO   rQ   r[   rP   rX   rY   rf   rg   r^   r^   r_   rA   :  sn    




ÿ






rA   c                 C   s  t | ƒ}|}t|d |ƒ}||k r8| | dkr8|d7 }q| ||… }|}||k rf| | dkrf|d7 }qH|| }|rŒ|d|  }|d|  }nr|d |k rú| | dkrú| |d  dkrú|d7 }|}t|d |ƒ}||k rì| | dkrì|d7 }qÎ| ||… }n|}t|dƒt|dƒ|fS )	zdReturn (range, new_pos)

    The given pos is assume to be just after the '+' of 'U+' or 'u+'.

    é   Z0123456789abcdefABCDEFr   ú?ÚFÚ0rb   rh   )r9   ÚminrJ   )rO   rQ   rP   rg   Zmax_posrZ   Zquestion_marksrF   r^   r^   r_   r>   ‡  s0    

ÿ
r>   )F)$Úrerk   Zwebencodingsr   Zastr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Z
serializerr   r   ÚcompilerD   ri   r`   ra   r?   r@   rM   rd   rA   r>   r^   r^   r^   r_   Ú<module>   s   L


 <	%M