o
    ôSk[¶Ÿ  ã                   @   s®   d dl mZ d dl mZ zd dlmZ W n	 ey   Y nw 	 d dlZd dlZddlm	Z	 dd„ Z
d	d
„ 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dS )é    )Úabsolute_import)Úunicode_literals)ÚfilterNé   )Ú
cssSpecialc                 C   s   t  d| d | ¡S )Nz^@z\s*)ÚreÚmatch)ÚsrcÚident© r   úI/var/www/html/env/lib/python3.10/site-packages/xhtml2pdf/w3c/cssParser.pyÚisAtRuleIdent4   s   r   c                 C   s   t  dd| ¡S )Nz^@[a-z\-]+\s*Ú )r   Úsub)r	   r   r   r   ÚstripAtRuleIdent8   ó   r   c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚCSSSelectorAbstracta  Outlines the interface between CSSParser and it's rule-builder for selectors.

    CSSBuilderAbstract.selector and CSSBuilderAbstract.combineSelectors must
    return concrete implementations of this abstract.

    See css.CSSMutableSelector for an example implementation.
    c                 C   ó   t dƒ‚©NúSubclass responsibility©ÚNotImplementedError)ÚselfÚhashIdr   r   r   Ú	addHashIdF   ó   zCSSSelectorAbstract.addHashIdc                 C   r   r   r   )r   Úclass_r   r   r   ÚaddClassJ   r   zCSSSelectorAbstract.addClassc                 C   r   r   r   )r   ÚattrNamer   r   r   ÚaddAttributeN   r   z CSSSelectorAbstract.addAttributec                 C   r   r   r   )r   r   ÚopÚ	attrValuer   r   r   ÚaddAttributeOperationR   r   z)CSSSelectorAbstract.addAttributeOperationc                 C   r   r   r   ©r   Únamer   r   r   Ú	addPseudoV   r   zCSSSelectorAbstract.addPseudoc                 C   r   r   r   ©r   r$   Úvaluer   r   r   ÚaddPseudoFunctionZ   r   z%CSSSelectorAbstract.addPseudoFunctionN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__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d	„ Z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d„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd<d'd(„Zd)d*„ Zd+d,„ Zd=d.d/„Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd-S )>ÚCSSBuilderAbstractzîOutlines the interface between CSSParser and it's rule-builder.  Compose
    CSSParser with a concrete implementation of the builder to get usable
    results from the CSS parser.

    See css.CSSBuilder for an example implementation
    c                 C   r   r   r   ©r   Úcharsetr   r   r   Ú
setCharsetg   r   zCSSBuilderAbstract.setCharsetc                 C   r   r   r   ©r   r   r   r   ÚbeginStylesheetm   r   z"CSSBuilderAbstract.beginStylesheetc                 C   r   r   r   )r   Úelementsr   r   r   Ú
stylesheetq   r   zCSSBuilderAbstract.stylesheetc                 C   r   r   r   r1   r   r   r   ÚendStylesheetu   r   z CSSBuilderAbstract.endStylesheetc                 C   r   r   r   r1   r   r   r   ÚbeginInliney   r   zCSSBuilderAbstract.beginInlinec                 C   r   r   r   ©r   Údeclarationsr   r   r   Úinline}   r   zCSSBuilderAbstract.inlinec                 C   r   r   r   r1   r   r   r   Ú	endInline�   r   zCSSBuilderAbstract.endInlinec                 C   r   r   r   )r   Ú	selectorsr8   r   r   r   Úruleset…   r   zCSSBuilderAbstract.rulesetc                 C   r   r   r   )r   ÚnsPrefixr$   r   r   r   ÚresolveNamespacePrefix‹   r   z)CSSBuilderAbstract.resolveNamespacePrefixc                 C   r   r   r   r.   r   r   r   Ú	atCharset‘   r   zCSSBuilderAbstract.atCharsetc                 C   r   r   r   )r   Úimport_ÚmediumsÚ	cssParserr   r   r   ÚatImport•   r   zCSSBuilderAbstract.atImportc                 C   r   r   r   )r   r=   Úurir   r   r   ÚatNamespace™   r   zCSSBuilderAbstract.atNamespacec                 C   r   r   r   )r   rA   r<   r   r   r   ÚatMedia�   r   zCSSBuilderAbstract.atMediac                 C   r   r   r   )r   ÚpageÚ
pseudopager8   r   r   r   ÚatPage¡   r   zCSSBuilderAbstract.atPagec                 C   r   r   r   r7   r   r   r   Ú
atFontFace¥   r   zCSSBuilderAbstract.atFontFacec                 C   s   |t fS ©N)ÚNotImplemented)r   ÚatIdentrB   r	   r   r   r   rM   ©   r   zCSSBuilderAbstract.atIdentc                 C   r   ©z/Return value must implement CSSSelectorAbstractr   r   )r   Ú	selectorAÚcombinerÚ	selectorBr   r   r   ÚcombineSelectors¯   ó   z#CSSBuilderAbstract.combineSelectorsc                 C   r   rN   r   r#   r   r   r   Úselector´   rS   zCSSBuilderAbstract.selectorFc                 C   r   r   r   )r   r$   r'   Ú	importantr   r   r   Úproperty»   r   zCSSBuilderAbstract.propertyc                 C   r   r   r   )r   ÚtermArP   ÚtermBr   r   r   ÚcombineTerms¿   r   zCSSBuilderAbstract.combineTermsc                 C   r   r   r   ©r   r'   r   r   r   Ú	termIdentÃ   r   zCSSBuilderAbstract.termIdentNc                 C   r   r   r   )r   r'   Úunitsr   r   r   Ú
termNumberÇ   r   zCSSBuilderAbstract.termNumberc                 C   r   r   r   rZ   r   r   r   ÚtermRGBË   r   zCSSBuilderAbstract.termRGBc                 C   r   r   r   rZ   r   r   r   ÚtermURIÏ   r   zCSSBuilderAbstract.termURIc                 C   r   r   r   rZ   r   r   r   Ú
termStringÓ   r   zCSSBuilderAbstract.termStringc                 C   r   r   r   rZ   r   r   r   ÚtermUnicodeRange×   r   z#CSSBuilderAbstract.termUnicodeRangec                 C   r   r   r   r&   r   r   r   ÚtermFunctionÛ   r   zCSSBuilderAbstract.termFunctionc                 C   r   r   r   ©r   r	   r   r   r   ÚtermUnknownß   r   zCSSBuilderAbstract.termUnknown©FrK   ) r)   r*   r+   r,   r0   r2   r4   r5   r6   r9   r:   r<   r>   r?   rC   rE   rF   rI   rJ   rM   rR   rT   rV   rY   r[   r]   r^   r_   r`   ra   rb   rd   r   r   r   r   r-   ^   s<    

r-   c                   @   sD   e Zd ZdZdZdZdZdZdZdZ	d	dd„Z
dd„ Zd
dd„ZdS )ÚCSSParseErrorNFc                 C   sL   t  | |¡ || _|p|| _| jr"| j | j¡| _| jdk r$| `d S d S d S )Nr   )Ú	ExceptionÚ__init__r	   ÚctxsrcÚfindÚ	srcCtxIdx)r   Úmsgr	   ri   r   r   r   rh   ð   s   

ýzCSSParseError.__init__c                 C   sj   | j r%t | ¡d t| j d | j… ƒ d t| j | j| jd … ƒ d S t | ¡d t| jd d… ƒ S )Nz:: (z, é   ú)z:: é(   )ri   rg   Ú__str__Úreprrk   r	   r1   r   r   r   rp   ú   s   &ÿÿ zCSSParseError.__str__c                 C   s~   || _ t| j ƒtjkrt | j d¡| _ |r|| _| j r;| j  | j¡| _| jdk r*| `| j  | j	¡| _
| j
dk r=| `
d S d S d S )Nzutf-8r   )ÚfullsrcÚtypeÚsixÚbinary_typeÚ	text_typer9   rj   r	   Ú
srcFullIdxri   ÚctxsrcFullIdx)r   rr   r9   r   r   r   ÚsetFullCSSSource  s   

úzCSSParseError.setFullCSSSourcerK   re   )r)   r*   r+   r	   ri   rr   r9   rk   rw   rx   rh   rp   ry   r   r   r   r   rf   æ   s    

rf   c                   @   sT  e Zd ZdZeZg d¢ZdZddgZdZ		 dd	„ Z
ejejB ejB Zd
ZdZde Ze
edƒZe
deeƒZe
deeƒZdeef Ze ee¡ZdZe ee¡ZdZdZe
eeƒZe ee¡Zdedd… f Ze ee¡Z dedd… f Z!e e!e¡Z"de Z#e e#e¡Z$de Z%e e%e¡Z&deef Z'e e'e¡Z(dZ)de) Z*e
de*eeƒZ+de+ Z,de+ Z-e
e,e-ƒZ.e e.e¡Z/d e.e
d!eeƒf Z0e e0e¡Z1d"Z2e e2e¡Z3d#e Z4e e4e¡Z5ed$ Z6e e6e¡Z7d%e6 Z8e e8e¡Z9d&eef Z:d'Z;e:Z<e e<e¡Z=d(Z>e e>e¡Z?d)Z@e e@e¡ZA[
dpd+d,„ZBd-d.„ ZCd/d0„ ZDeEeCeDƒZFdqd2d3„ZGd4d5„ ZHd6d7„ ZIdpd8d9„ZJd:d;„ ZKd<d=„ ZLd>d?„ ZMd@dA„ ZNdBdC„ ZOdDdE„ ZPdFdG„ ZQdHdI„ ZRdJdK„ ZSdLdM„ ZTdNdO„ ZUdPdQ„ ZVdRdS„ ZWdTdU„ ZXdVdW„ ZYdXdY„ ZZdZd[„ Z[d\d]„ Z\drd^d_„Z]d`da„ Z^dbdc„ Z_dqddde„Z`dfdg„ Zadpdhdi„Zbdsdjdk„Zcdldm„ Zddtdndo„Zed*S )uÚ	CSSParserañ  CSS-2.1 parser dependent only upon the re module.

    Implemented directly from http://www.w3.org/TR/CSS21/grammar.html
    Tested with some existing CSS stylesheets for portability.

    CSS Parsing API:
        * setCSSBuilder()
            To set your concrete implementation of CSSBuilderAbstract

        * parseFile()
            Use to parse external stylesheets using a file-like object

            >>> cssFile = open('test.css', 'r')
            >>> stylesheets = myCSSParser.parseFile(cssFile)

        * parse()
            Use to parse embedded stylesheets using source string

            >>> cssSrc = '''
                body,body.body {
                    font: 110%, "Times New Roman", Arial, Verdana, Helvetica, serif;
                    background: White;
                    color: Black;
                }
                a {text-decoration: underline;}
            '''
            >>> stylesheets = myCSSParser.parse(cssSrc)

        * parseInline()
            Use to parse inline stylesheets using attribute source string

            >>> style = 'font: 110%, "Times New Roman", Arial, Verdana, Helvetica, serif; background: White; color: Black'
            >>> stylesheets = myCSSParser.parseInline(style)

        * parseAttributes()
            Use to parse attribute string values into inline stylesheets

            >>> stylesheets = myCSSParser.parseAttributes(
                    font='110%, "Times New Roman", Arial, Verdana, Helvetica, serif',
                    background='White',
                    color='Black')

        * parseSingleAttr()
            Use to parse a single string value into a CSS expression

            >>> fontValue = myCSSParser.parseSingleAttr('110%, "Times New Roman", Arial, Verdana, Helvetica, serif')
    )ú=z~=z|=z&=z^=z!=z<>)ú#Ú.ú[ú:ú+ú>)ú/r€   ú,Tc                  G   s
   d  | ¡S )Nú|)Újoin)Úargsr   r   r   Ú<lambda>S  s   
 zCSSParser.<lambda>z[0-9a-fA-F]u   [Â€-Ã¿]z\\(?:%s){1,6}\s?u   \\[ -~Â€-Ã¿]z\-[^0-9]|[A-Za-z_]z[-0-9A-Za-z_]z((?:%s)(?:%s)*)z([^\u0000-\u007f]+)z(\'[^\u0000-\u007f]+\')z(\"[^\u0000-\u007f]+\")z((?:%s)|\*)r   éÿÿÿÿz((?:%s)|\*|)\|(?!=)z\.z
#((?:%s)+)z(#%s{6}|#%s{3})z
|
||z\\(?:%s)z[	 !#$%&(-~]z"((?:%s|')*)"z'((?:%s|")*)'z!url\(\s*(?:(?:%s)|((?:%s)+))\s*\)z
[!#$%&*-~]z,(([-+]?[0-9]+(?:\.[0-9]+)?)|([-+]?\.[0-9]+))z(%%|%s)?z\(z[-+]?z(?:U\+%s{1,6}-%s{1,6})zO(?:U\+\?{1,6}|{h}(\?{0,5}|{h}(\?{0,4}|{h}(\?{0,3}|{h}(\?{0,2}|{h}(\??|{h}))))))z"(?:\/\*[^*]*\*+([^/*][^*]*\*+)*\/)z!\s*(important)Nc                 C   s   |   |¡ d S rK   )ÚsetCSSBuilder©r   Ú
cssBuilderr   r   r   rh   •  r   zCSSParser.__init__c                 C   s   | j S )ú3A concrete instance implementing CSSBuilderAbstract©Ú_cssBuilderr1   r   r   r   ÚgetCSSBuilder›  s   zCSSParser.getCSSBuilderc                 C   s
   || _ dS )rŒ   Nr�   rŠ   r   r   r   r‰      s   
zCSSParser.setCSSBuilderFc                 C   s2   z|   | ¡ ¡}W |r| ¡  |S |r| ¡  w w )z`Parses CSS file-like objects using the current cssBuilder.
        Use for external stylesheets.)ÚparseÚreadÚclose)r   ÚsrcFileÚ	closeFileÚresultr   r   r   Ú	parseFile«  s   þ
ÿzCSSParser.parseFilec              
   C   sl   | j  ¡  z*t |¡}z	|  |¡\}}W n | jy' } z| |¡ ‚ d}~ww W | j  ¡  |S | j  ¡  w )z\Parses CSS string source using the current cssBuilder.
        Use for embedded stylesheets.N)r‹   r2   r   Ú
cleanupCSSÚ_parseStylesheetÚ
ParseErrorry   r5   )r   r	   r4   Úerrr   r   r   r�   ·  s   


€þÿ
ÿzCSSParser.parsec              
   C   sz   | j  ¡  z1z| j| ¡ dd�\}}W n | jy( } z|j|dd� ‚ d}~ww | j  |¡}W | j  ¡  |S | j  ¡  w )zrParses CSS inline source string using the current cssBuilder.
        Use to parse a tag's 'sytle'-like attribute.F©ÚbracesT©r9   N)r‹   r6   Ú_parseDeclarationGroupÚstripr™   ry   r9   r:   )r   r	   Ú
propertiesrš   r•   r   r   r   ÚparseInlineË  s   
€þ
ÿzCSSParser.parseInlinec           	   
   K   s¸   |dur|ni }|r|  |¡ | j ¡  zAg }zt |¡D ]\}}|  | ¡ |¡\}}| |¡ qW n | jyG } z|j	|dd� ‚ d}~ww | j 
|¡}W | j ¡  |S | j ¡  w )zºParses CSS attribute source strings, and return as an inline stylesheet.
        Use to parse a tag's highly CSS-based attributes like 'font'.

        See also: parseSingleAttr
        NTr�   )Úupdater‹   r6   rt   Ú	iteritemsÚ_parseDeclarationPropertyrŸ   Úappendr™   ry   r9   r:   )	r   Ú
attributesÚkwAttributesr    ÚpropertyNamer	   rV   rš   r•   r   r   r   ÚparseAttributesÜ  s(   

þ€þ
ÿzCSSParser.parseAttributesc                 C   s0   | j |d�}d|d v r|d d S |d d S )zÃParse a single CSS attribute source string, and returns the built CSS expression.
        Use to parse a tag's highly CSS-based attributes like 'font'.

        See also: parseAttributes
        )Útemprª   r   r   )r©   )r   r!   Úresultsr   r   r   ÚparseSingleAttrø  s   zCSSParser.parseSingleAttrc                 C   sÊ   t |ƒtjkrt |¡}| j d|¡}|  |¡}|  |¡}|  |¡\}}|  	|¡}g }|rZ| 
d¡rG|  |¡\}}|durF|tkrF| |¡ n|  |¡\}}| |¡ |  |¡}|s-| j ||¡}||fS )zÀstylesheet
        : [ CHARSET_SYM S* STRING S* ';' ]?
            [S|CDO|CDC]* [ import [S|CDO|CDC]* ]*
            [ [ ruleset | media | page | font_face ] [S|CDO|CDC]* ]*
        ;
        r   ú@N)rs   rt   ru   rv   Ú
re_commentr   Ú_parseAtCharsetÚ_parseSCDOCDCÚ_parseAtImportsÚ_parseAtNamespaceÚ
startswithÚ_parseAtKeywordrL   ÚextendÚ_parseRulesetr¥   r‹   r4   )r   r	   ÚstylesheetImportsÚstylesheetElementsÚ	atResultsr<   r4   r   r   r   r˜   
  s(   





€

ôzCSSParser._parseStylesheetc                 C   sB   	 |  ¡ }| d¡r|dd… }n| d¡r|dd… }n	 |S q)z[S|CDO|CDC]*r   z<!--é   Nz-->é   )Úlstripr³   rc   r   r   r   r°   7  s   

øzCSSParser._parseSCDOCDCc                 C   sh   t |dƒr2t|ƒ}|  |¡\}}| ¡ }|dd… dkr$|  d|| j¡‚|dd…  ¡ }| j |¡ |S )z![ CHARSET_SYM S* STRING S* ';' ]?r/   Nr   ú;z#@charset expected a terminating ';')r   r   Ú
_getStringr¼   r™   ri   r‹   r?   )r   r	   r/   r   r   r   r¯   F  s   
zCSSParser._parseAtCharsetc                 C   s  g }t |dƒr‡|}t|ƒ}|  |¡\}}|du r|  d||¡‚g }|  | ¡ ¡\}}|durP| |¡ |dd… dkrK|dd…  ¡ }|  |¡\}}nn|dus.|sUdg}|dd… dkrd|  d||¡‚|dd…  ¡ }| j ||| ¡}|dur}| |¡ |  	|¡}t |dƒs||fS )	z[ import [S|CDO|CDC]* ]*ÚimportNzImport expecting string or urlr   rƒ   Úallr½   z"@import expected a terminating ';')
r   r   Ú_getStringOrURIr™   Ú	_getIdentr¼   r¥   r‹   rC   r°   )r   r	   r•   ri   r@   rA   Úmediumr4   r   r   r   r±   T  s6   

ú	


âzCSSParser._parseAtImportsc                 C   sä   |   |¡}t|dƒrp|}t|ƒ}|  |¡\}}|du rB|  |¡\}}|du r-|  d||¡‚|  | ¡ ¡\}}|du rA|  d||¡‚nd}| ¡ }|dd… dkrW|  d||¡‚|dd…  ¡ }| j ||¡ |   |¡}t|dƒs
|S )zNnamespace :

        @namespace S* [IDENT S*]? [STRING|URI] S* ';' S*
        Ú	namespaceNz*@namespace expected an identifier or a URIz@namespace expected a URIr   r½   z%@namespace expected a terminating ';')	r°   r   r   rÁ   rÂ   r™   r¼   r‹   rE   )r   r	   ri   rÄ   r=   r   r   r   r²   y  s,   

ÿ

êzCSSParser._parseAtNamespacec                 C   sÒ   |}t |dƒr|  |¡\}}||fS t |dƒr"|  |¡\}}||fS t |dƒr2|  |¡\}}||fS t |dƒrB|  |¡\}}||fS t |dƒrR|  |¡\}}||fS | d¡rb|  |¡\}}||fS |  d||¡‚)z,[media | page | font_face | unknown_keyword]ÚmediarG   z	font-facer¿   Úframer­   zUnknown state in atKeyword)	r   Ú_parseAtMediaÚ_parseAtPageÚ_parseAtFontFacer±   Ú_parseAtFramer³   Ú_parseAtIdentr™   )r   r	   ri   r•   r   r   r   r´   š  s(   

ó
õ

ø
ú
üÿzCSSParser._parseAtKeywordc                 C   s–  |}|t dƒd…  ¡ }g }|rb|d dkrb|  |¡\}}|du r(|  d||¡‚|dkrBt d¡}t ||¡}|| ¡ d d… }n | |¡ |d d	krV|dd…  ¡ }n| ¡ }|rb|d dks| 	d¡sn|  d
||¡‚|dd…  ¡ }g }|r¬| 	d¡s¬| 	d¡r•|  
|¡\}}|dur”| |¡ n|  |¡\}}	| |	¡ | ¡ }|r¬| 	d¡r| 	d¡s¸|  d||¡‚|dd…  ¡ }| j ||¡}
||
fS )z`media
        : MEDIA_SYM S* medium [ ',' S* medium ]* '{' S* ruleset* '}' S*
        ;
        z@media Nr   ú{z%@media rule expected media identifierÚandz.*({.*)r   rƒ   úRuleset opening '{' not foundú}r­   zRuleset closing '}' not found)Úlenr¼   rÂ   r™   r   Úcompiler   Úendr¥   r³   r´   rµ   r¶   r‹   rF   )r   r	   ri   rA   rÃ   Úpatternr   r¸   r¹   r<   r•   r   r   r   rÇ   ¯  sH   

ñ


€
ö
zCSSParser._parseAtMediac           
      C   s*  |}|t dƒd…  ¡ }|  |¡\}}|dd… dkr-|  |dd… ¡\}}|d | }nd}g }| ¡ }g }| d¡sC|  d||¡‚|dd…  ¡ }|r‚| d¡s‚| d	¡rh|  |¡\}}|durg| |¡ n| j| ¡ d
d�\}}||7 }| ¡ }|r‚| d¡rR| j 	|||¡g}	|dd…  ¡ |	fS )z‚page
        : PAGE_SYM S* IDENT? pseudo_page? S*
            '{' S* declaration [ ';' S* declaration ]* '}' S*
        ;
        z@pageNr   r   Ú_rÌ   rÎ   rÏ   r­   Fr›   )
rÐ   r¼   rÂ   r³   r™   r´   rµ   rž   r‹   rI   )
r   r	   ri   rG   rH   r¸   r    r¹   Únpropertiesr•   r   r   r   rÈ   è  s2   


€÷zCSSParser._parseAtPagec                 C   sP   |t dƒd…  ¡ }|  |¡\}}|  | ¡ ¡\}}| j ||¡g}| ¡ |fS )z)
        XXX Proprietary for PDF
        z@frame N)rÐ   r¼   rÂ   rž   r‹   ÚatFrame)r   r	   Úboxr    r•   r   r   r   rÊ     s
   zCSSParser._parseAtFramec                 C   s8   |t dƒd …  ¡ }|  |¡\}}| j |¡g}||fS )Nz@font-face )rÐ   r¼   rž   r‹   rJ   )r   r	   r    r•   r   r   r   rÉ     s   zCSSParser._parseAtFontFacec           	      C   s   |}|   |dd … ¡\}}|d u r|  d||¡‚| j || |¡\}}|tu rŠ| d¡}|dk r1d }|d |…  d¡}|dk r@d }|d urS||k rS||d d …  ¡ }n7|d u r^|dd… }n,|d urƒ||d … }z	|  |¡\}}W n | jy‚   |  |¡\}}Y nw |  	d||¡‚| ¡ |fS )Nr   z+At-rule expected an identifier for the ruler½   r   rÌ   rˆ   zUnable to ignore @-rule block)
rÂ   r™   r‹   rM   rL   rj   r¼   rž   r˜   ÚParserError)	r   r	   ri   rM   r•   ÚsemiIdxÚblockIdxr8   r4   r   r   r   rË   &  s2   
þzCSSParser._parseAtIdentc                 C   s6   |   |¡\}}|  | ¡ ¡\}}| j ||¡}||fS )z€ruleset
        : selector [ ',' S* selector ]*
            '{' S* declaration [ ';' S* declaration ]* '}' S*
        ;
        )Ú_parseSelectorGrouprž   r¼   r‹   r<   )r   r	   r;   r    r•   r   r   r   r¶   N  s   zCSSParser._parseRulesetc                 C   sp   g }|d d… dvr4|   |¡\}}|d u r	 ||fS | |¡ | d¡r,|dd …  ¡ }|d d… dvs
||fS )Nr   )rÌ   rÏ   ú]ú(rn   r½   r   rƒ   )Ú_parseSelectorr¥   r³   r¼   )r   r	   r;   rT   r   r   r   rÛ   \  s   
ý
úzCSSParser._parseSelectorGroupc                 C   sê   |   |¡\}}t|ƒ}|dd… dvro| jD ]}| |¡r)|t|ƒd…  ¡ } nqd}|   |¡\}}t|ƒ|kr_|dd… }|rY|dd… dvrY|dd… }|rY|dd… dvsI| ¡ dfS | j |||¡}|dd… dvs| ¡ |fS )zUselector
        : simple_selector [ combinator simple_selector ]*
        ;
        Nr   )	r   rƒ   r½   rÌ   rÏ   r~   rÜ   rÝ   rn   ú )Ú_parseSimpleSelectorrÐ   ÚSelectorCombinersr³   r¼   r‹   rR   )r   r	   rT   ÚsrcLenrP   rQ   r   r   r   rÞ   h  s&   

þÿðzCSSParser._parseSelectorc                 C   s0  |  ¡ }|  | j|¡\}}|  | j|¡\}}|rn|dd… | jv r%d}n|  d||¡‚| j ||¡}| j |¡}|r’|dd… | jv r’|  | j	|¡\}}|durW| 
|¡ q9|  | j|¡\}}|durj| |¡ q9| d¡rx|  ||¡\}}n| d¡r†|  ||¡\}}nn|r’|dd… | jv sD|  ¡ |fS )zysimple_selector
        : [ namespace_selector ]? element_name? [ HASH | class | attrib | pseudo ]* S*
        ;
        Nr   Ú*z#Selector name or qualifier expectedr~   r   )r¼   Ú_getMatchResultÚre_namespace_selectorÚre_element_nameÚSelectorQualifiersr™   r‹   r>   rT   Úre_hashr   Úre_classr   r³   Ú_parseSelectorAttributeÚ_parseSelectorPseudo)r   r	   ri   r=   r$   rT   Úhash_r   r   r   r   rà   „  s4   



ðzCSSParser._parseSimpleSelectorc                 C   sF  |}|  d¡s|  d||¡‚|dd…  ¡ }|  | j|¡\}}|  |¡\}}| ¡ }|du r5|  d||¡‚|dur@| j ||¡}| jD ]	}|  |¡rL nqCd}|t	|ƒd…  ¡ }|ry|  |¡\}}|du rx|  
|¡\}}|du rx|  d||¡‚nd}|  d¡s‡|  d	||¡‚|dd… }|rš| |||¡ ||fS | |¡ ||fS )
z˜attrib
        : '[' S* [ namespace_selector ]? IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
            [ IDENT | STRING ] S* ]? ']'
        ;
        r~   z(Selector Attribute opening '[' not foundr   Nz"Expected a selector attribute namer   z#Expected a selector attribute valuerÜ   z(Selector Attribute closing ']' not found)r³   r™   r¼   rä   rå   rÂ   r‹   r>   ÚAttributeOperatorsrÐ   r¾   r"   r   )r   r	   rT   ri   r=   r   r    r!   r   r   r   rê   ª  sB   


ÿ€

ÿz!CSSParser._parseSelectorAttributec                 C   sÌ   |}|  d¡s|  d||¡‚t d|tjtjB ¡ d¡}|  |¡\}}|s,|  d||¡‚|  d¡r]|dd…  ¡ }|  	|d¡\}}|  d	¡sM|  d
||¡‚|dd… }| 
||¡ ||fS | |¡ ||fS )z<pseudo
        : ':' [ IDENT | function ]
        ;
        r   zSelector Pseudo ':' not foundz^:{1,2}(.*)r   z$Selector Pseudo identifier not foundrÝ   NTrn   z.Selector Pseudo Function closing ')' not found)r³   r™   r   ÚsearchÚMÚSÚgrouprÂ   r¼   Ú_parseExpressionr(   r%   )r   r	   rT   ri   r$   Útermr   r   r   rë   Û  s"   



þzCSSParser._parseSelectorPseudoc                 C   s   |}|  d¡r|dd … d}}n	|r|  d||¡‚g }| ¡ }|d d… dvrf|  |¡\}}|  d¡r=d|dd …  }q |d u rJ|dd …  ¡ }n| |¡ |  d¡r]|dd …  ¡ }nn|d d… dvs(|rz|  d	¡st|  d
||¡‚|dd … }| ¡ |fS )NrÌ   r   Tz'Declaration group opening '{' not found)	r   rƒ   rÌ   rÏ   r~   rÜ   rÝ   rn   r­   rã   z	-nothing-r½   rÏ   z'Declaration group closing '}' not found)r³   r™   r¼   Ú_parseDeclarationr¥   )r   r	   rœ   ri   r    rV   r   r   r   rž   ù  s2   



ñ
z CSSParser._parseDeclarationGroupc                 C   sb   |   |¡\}}|dur+| ¡ }|dd… dv r|dd…  ¡ }|  ||¡\}}||fS d}||fS )zYdeclaration
        : ident S* ':' S* expr prio?
        | /* empty */
        ;
        Nr   )r   r{   )rÂ   r¼   r¤   )r   r	   r¨   rV   r   r   r   rô     s   þzCSSParser._parseDeclarationc                 C   s@   |   |¡\}}|  | j|¡\}}| ¡ }| j |||¡}||fS rK   )rò   rä   Úre_importantr¼   r‹   rV   )r   r	   r¨   ÚexprrU   rV   r   r   r   r¤   4  s
   z#CSSParser._parseDeclarationPropertyc                 C   s¸   |   |¡\}}d}|dd… dvrF| jD ]}| |¡r%|t|ƒd… } nqd}|   | ¡ ¡\}}|tu r6n| j |||¡}|dd… dvs|du rX|rX| j |dd¡}||fS ||fS )zB
        expr
        : term [ operator term ]*
        ;
        Nr   )r   r½   rÌ   rÏ   r~   rÜ   rn   rß   )Ú_parseExpressionTermÚExpressionOperatorsr³   rÐ   r¼   rL   r‹   rY   )r   r	   Ú
returnListró   ÚoperatorÚterm2r   r   r   rò   @  s$   

þõzCSSParser._parseExpressionc                 C   sB  |}|   | j|¡\}}|dur%|   | j|¡\}}| j ||¡}| ¡ |fS |  || j¡\}}|dur>| j |¡}| ¡ |fS |  |¡\}}|durU| j 	|¡}| ¡ |fS |   | j
|¡\}}|durŠ|  |d¡\}}|d dkrw|  d||¡‚|dd…  ¡ }| j ||¡}||fS |   | j|¡\}}|dur£| j |¡}| ¡ |fS |   | j|¡\}}|dur¼| j |¡}| ¡ |fS |   | j|¡\}}|  |¡\}}|durç|durÛ| j ||¡}| j |¡}| ¡ |fS |   | j|¡\}}|du�r| j |¡}| ¡ |fS |   | j|¡\}}|du�r| j 	|¡}| ¡ |fS | j |¡S )zýterm
        : unary_operator?
            [ NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* | ANGLE S* |
            TIME S* | FREQ S* | function ]
        | STRING S* | IDENT S* | URI S* | RGB S* | UNICODERANGE S* | hexcolor
        ;
        NTr   rn   z1Terminal function expression expected closing ')'r   )rä   Úre_numÚre_unitr‹   r]   r¼   r¾   Úre_urir_   r`   Úre_functiontermrò   r™   rb   Úre_rgbcolorr^   Úre_unicoderangera   rå   rÂ   r>   r[   Úre_unicodeidÚre_unicodestrrd   )r   r	   ri   r•   r\   ró   Úparamsr=   r   r   r   r÷   \  s\   

zCSSParser._parseExpressionTermc                 C   s   |   | j||¡S rK   )rä   Úre_ident)r   r	   Údefaultr   r   r   rÂ   ¡  s   zCSSParser._getIdentc                 C   s~   |d u r| j }| |¡}|r;ttd | ¡ ƒƒ}|r/z|d }W n ty.   | ¡ d }Y nw d}||| ¡ d … fS ||fS )Nr   r   )Ú	re_stringr   Útupler   Úgroupsrg   rÒ   )r   r	   Úrexpressionr  r•   Ústrresr   r   r   r¾   ¥  s   
ÿzCSSParser._getStringc                 C   s0   |   || j¡\}}|d u r|   |¡\}}||fS rK   )r¾   rþ   )r   r	   r•   r   r   r   rÁ   ·  s   zCSSParser._getStringOrURIc                 C   s0   |  |¡}|r| |¡|| ¡ d … fS ||fS rK   )r   rñ   rÒ   )r   r
  r	   r  rñ   r•   r   r   r   rä   ¾  s   
zCSSParser._getMatchResultrK   re   )T)NN)Nr   )fr)   r*   r+   r,   rf   r™   rí   rç   rá   rø   Ú_orRuler   ÚIrï   ÚUÚ_reflagsÚi_hexÚ
i_nonasciiÚ	i_unicodeÚi_escapeÚ	i_nmstartÚi_nmcharÚi_identrÑ   r  Úi_unicodeidr  Úi_unicodestr1Úi_unicodestr2Úi_unicodestrr  Úi_element_nameræ   Úi_namespace_selectorrå   Úi_classré   Úi_hashrè   Ú
i_rgbcolorr   Úi_nlÚi_escape_nlÚi_string_contentÚ	i_string1Ú	i_string2Úi_stringr  Úi_urirþ   Úi_numrü   Úi_unitrý   Ú
i_functionÚre_functionÚi_functiontermrÿ   Úi_unicoderange1Úi_unicoderange2Úi_unicoderanger  Ú	i_commentr®   Úi_importantrõ   rh   r�   r‰   rV   r‹   r–   r�   r¡   r©   r¬   r˜   r°   r¯   r±   r²   r´   rÇ   rÈ   rÊ   rÉ   rË   r¶   rÛ   rÞ   rà   rê   rë   rž   rô   r¤   rò   r÷   rÂ   r¾   rÁ   rä   r   r   r   r   rz     sÆ    4
ÿ

ÿ



-%!9,(&1
"

E
rz   )Ú
__future__r   r   Úfuture_builtinsr   ÚImportErrorr   rt   r   r   r   r   Úobjectr   r-   rg   rf   rz   r   r   r   r   Ú<module>   s$   ÿ" 	,