o
    ‚ØcÎ¦  ã                   @   s®   d dl mZ d dl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
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 )é    )Ú	landscapeN)ÚgetSize)Úfilteré   )Ú
cssSpecialc                 C   s   t  d| d | ¡S )Nz^@z\s*)ÚreÚmatch)ÚsrcÚident© r   ú/xhtml2pdf/w3c/cssParser.pyÚisAtRuleIdent0   s   r   c                 C   s   t  dd| ¡S )Nz^@[a-z\-]+\s*Ú )r   Úsub)r	   r   r   r   ÚstripAtRuleIdent4   ó   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)ÚselfZhashIdr   r   r   Ú	addHashIdB   ó   zCSSSelectorAbstract.addHashIdc                 C   r   r   r   )r   Úclass_r   r   r   ÚaddClassF   r   zCSSSelectorAbstract.addClassc                 C   r   r   r   )r   ÚattrNamer   r   r   ÚaddAttributeJ   r   z CSSSelectorAbstract.addAttributec                 C   r   r   r   )r   r   ÚopÚ	attrValuer   r   r   ÚaddAttributeOperationN   r   z)CSSSelectorAbstract.addAttributeOperationc                 C   r   r   r   ©r   Únamer   r   r   Ú	addPseudoR   r   zCSSSelectorAbstract.addPseudoc                 C   r   r   r   ©r   r#   Úvaluer   r   r   ÚaddPseudoFunctionV   r   z%CSSSelectorAbstract.addPseudoFunctionN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r!   r$   r'   r   r   r   r   r   8   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   Ú
setCharsetc   r   zCSSBuilderAbstract.setCharsetc                 C   r   r   r   ©r   r   r   r   ÚbeginStylesheeti   r   z"CSSBuilderAbstract.beginStylesheetc                 C   r   r   r   )r   Úelementsr   r   r   Ú
stylesheetm   r   zCSSBuilderAbstract.stylesheetc                 C   r   r   r   r0   r   r   r   ÚendStylesheetq   r   z CSSBuilderAbstract.endStylesheetc                 C   r   r   r   r0   r   r   r   ÚbeginInlineu   r   zCSSBuilderAbstract.beginInlinec                 C   r   r   r   ©r   Údeclarationsr   r   r   Úinliney   r   zCSSBuilderAbstract.inlinec                 C   r   r   r   r0   r   r   r   Ú	endInline}   r   zCSSBuilderAbstract.endInlinec                 C   r   r   r   )r   Ú	selectorsr7   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<   Zurir   r   r   ÚatNamespace•   r   zCSSBuilderAbstract.atNamespacec                 C   r   r   r   )r   r@   r;   r   r   r   ÚatMedia™   r   zCSSBuilderAbstract.atMediac                 C   r   r   r   )r   ÚpageÚ
pseudopager7   r   r   r   ÚatPage   r   zCSSBuilderAbstract.atPagec                 C   r   r   r   r6   r   r   r   Ú
atFontFace¡   r   zCSSBuilderAbstract.atFontFacec                 C   s   |t fS ©N)ÚNotImplemented)r   ÚatIdentrA   r	   r   r   r   rK   ¥   r   zCSSBuilderAbstract.atIdentc                 C   r   ©z/Return value must implement CSSSelectorAbstractr   Nr   )r   Z	selectorAÚcombinerÚ	selectorBr   r   r   ÚcombineSelectors«   ó   z#CSSBuilderAbstract.combineSelectorsc                 C   r   rL   r   r"   r   r   r   Úselector°   rP   zCSSBuilderAbstract.selectorFc                 C   r   r   r   )r   r#   r&   Ú	importantr   r   r   Úproperty·   r   zCSSBuilderAbstract.propertyc                 C   r   r   r   )r   ZtermArM   Z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   rU   r   r   r   ÚtermRGBÇ   r   zCSSBuilderAbstract.termRGBc                 C   r   r   r   rU   r   r   r   ÚtermURIË   r   zCSSBuilderAbstract.termURIc                 C   r   r   r   rU   r   r   r   Ú
termStringÏ   r   zCSSBuilderAbstract.termStringc                 C   r   r   r   rU   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©FrI   ) r(   r)   r*   r+   r/   r1   r3   r4   r5   r8   r9   r;   r=   r>   rB   rC   rD   rG   rH   rK   rO   rQ   rS   rT   rV   rX   rY   rZ   r[   r\   r]   r_   r   r   r   r   r,   Z   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	   rd   r   r   r   rc   ì   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:: é(   )rd   rb   Ú__str__Úreprrf   r	   r0   r   r   r   rk   ö   s   &ÿÿ zCSSParseError.__str__c                 C   sz   || _ t| j ƒtkrt| j dƒ| _ |r|| _| j r9| j  | j¡| _| jdk r(| `| j  | j¡| _	| j	dk r;| `	d S d S d S )Nzutf-8r   )
ÚfullsrcÚtypeÚbytesÚstrr8   re   r	   Ú
srcFullIdxrd   ÚctxsrcFullIdx)r   rm   r8   r   r   r   ÚsetFullCSSSourceþ   s   

úzCSSParseError.setFullCSSSourcerI   r`   )r(   r)   r*   r	   rd   rm   r8   rf   rq   rr   rc   rk   rs   r   r   r   r   ra   â   s    

ra   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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ƒZFd1d2„ ZGd3d4„ ZHd5d6„ ZIdpd7d8„ZJd9d:„ ZKd;d<„ ZLd=d>„ ZMd?d@„ ZNdAdB„ ZOdCdD„ ZPdEdF„ ZQdGdH„ ZRdIdJ„ ZSdKdL„ ZTdMdN„ ZUdOdP„ ZVdQdR„ ZWdSdT„ ZXdUdV„ ZYdWdX„ ZZdYdZ„ Z[d[d\„ Z\dqd]d^„Z]d_d`„ Z^dadb„ Z_drddde„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<>)ú#Ú.ú[ú:ú+ú>)ú/rz   ú,Tc                  G   s
   d  | ¡S )Nú|)Újoin)Úargsr   r   r   Ú<lambda>O  s   
 zCSSParser.<lambda>z[0-9a-fA-F]u   [Â€-Ã¿]z\\(?:%s){1,6}\s?z\\[ -~\200-\377]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{8}|#%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 rI   )ÚsetCSSBuilder©r   Ú
cssBuilderr   r   r   rc   ‘  r   zCSSParser.__init__c                 C   s   | j S ©z3A concrete instance implementing CSSBuilderAbstractN©Z_cssBuilderr0   r   r   r   ÚgetCSSBuilder—  s   zCSSParser.getCSSBuilderc                 C   s
   || _ dS r†   r‡   r„   r   r   r   rƒ   œ  s   
zCSSParser.setCSSBuilderc                 C   s<   t |dƒ}| ¡ }W d  ƒ n1 sw   Y  |  |¡S )z`Parses CSS file-like objects using the current cssBuilder.
        Use for external stylesheets.ÚrN)ÚopenÚreadÚparse)r   ZsrcFileZfile_handlerZfile_contentr   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…   r1   r   Z
cleanupCSSÚ_parseStylesheetÚ
ParseErrorrs   r4   )r   r	   r3   Ú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©r8   N)r…   r5   Ú_parseDeclarationGroupÚstripr   rs   r8   r9   )r   r	   Ú
propertiesr   Úresultr   r   r   ÚparseInlineÄ  s   
€þ
ÿzCSSParser.parseInlinec           	   
   K   s¶   |dur|ni }|r|  |¡ | j ¡  z@g }z| ¡ D ]\}}|  | ¡ |¡\}}| |¡ qW n | jyF } 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…   r5   ÚitemsÚ_parseDeclarationPropertyr•   Úappendr   rs   r8   r9   )	r   Z
attributesZkwAttributesr–   ÚpropertyNamer	   Úsingle_propertyr   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   N)rŸ   )r   r    Úresultsr   r   r   ÚparseSingleAttrñ  s   zCSSParser.parseSingleAttrc                 C   sÆ   t |ƒtkr
| ¡ }| j d|¡}|  |¡}|  |¡}|  |¡\}}|  |¡}g }|rX| 	d¡rE|  
|¡\}}|durD|tkrD| |¡ 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)rn   ro   ÚdecodeÚ
re_commentr   Ú_parseAtCharsetÚ_parseSCDOCDCÚ_parseAtImportsÚ_parseAtNamespaceÚ
startswithÚ_parseAtKeywordrJ   ÚextendÚ_parseRulesetrœ   r…   r3   )r   r	   ZstylesheetImportsÚstylesheetElementsÚ	atResultsr;   r3   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ª   r^   r   r   r   r§   0  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   rd   r…   r>   )r   r	   r.   r   r   r   r¦   ?  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qP|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…   rB   r§   )r   r	   r—   rd   r?   r@   Úmediumr3   r   r   r   r¨   M  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…   rC   )r   r	   rd   rº   r<   r   r   r   r©   r  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]ZmediarE   z	font-facerµ   Úframer£   zUnknown state in atKeywordN)	r   Ú_parseAtMediaÚ_parseAtPageÚ_parseAtFontFacer¨   Ú_parseAtFramerª   Ú_parseAtIdentr   )r   r	   rd   r—   r   r   r   r«   “  s(   

ó
õ

ø
ú
üÿzCSSParser._parseAtKeywordc                 C   s–  |}|t dƒd…  ¡ }g }|rb|d dkrb|  |¡\}}|dv rB|du r*| d¡ t dtj¡}t ||¡}|| ¡ d d… }qb| |¡ |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   Ú{)NÚandr¶   z.*?[{]r   r}   úRuleset opening '{' not foundÚ}r£   zRuleset closing '}' not found)Úlenr²   r¸   rœ   r   ÚcompileÚDOTALLr   Úendrª   r   r«   r¬   r­   r…   rD   )r   r	   rd   r@   r¹   Úpatternr   r®   r¯   r;   r—   r   r   r   r¼   ¨  sH   

î


€
ö
zCSSParser._parseAtMediac                 C   s¢  i }d}d}|}|t dƒd…  ¡ }|  |¡\}}|dd… dkr3|  |dd… ¡\}}|d | }nd}g }| ¡ }g }	| d¡sI|  d||¡‚|dd…  ¡ }|r<| d	¡s<| d
¡rp|  |¡\}}
|
duro| |
¡ nÀ| j| ¡ dd\}}|	|7 }	i }d}|	r³| j 	| j 
d¡g|	¡}z
|d  ¡ d }W n ty¬   |d  ¡ d }Y nw | dd¡}d|v rÉtjj t|d ƒ ¡ | jj¡| j_d}d|v r0|d }t|tƒsÜ|g}g }|D ]7}t|ƒ ¡ }t|tƒrõ| t|ƒ¡ qà|dkrüd}qà|dkrd}qà|tjjv rtjj| | j_qàtdƒ‚t |ƒdkr%t|ƒ| j_|r0t| jjƒ| j_| ¡ }|r<| d	¡rZ| j |||||¡g}|dd…  ¡ |fS )z‚page
        : PAGE_SYM S* IDENT? pseudo_page? S*
            '{' S* declaration [ ';' S* declaration ]* '}' S*
        ;
        NFz@pager   ry   Ú_rÁ   rÃ   rÄ   r£   r‘   Ú*r   z-pdf-frame-borderz-pdf-page-sizeÚsizer   TZportraitzUnknown size value for @pageé   )rÅ   r²   r¸   rª   r   r«   r¬   r”   r…   r;   rQ   Úvaluesrb   ÚpopitemÚgetÚ	xhtml2pdfÚdefaultZPML_PAGESIZESrp   ÚlowerÚcZpageSizeÚ
isinstanceÚlistÚtuplerœ   r   ÚRuntimeErrorr   rG   )r   r	   ÚdataZ
pageBorderZisLandscaperd   rE   rF   r®   r–   r¯   Znpropertiesr—   rÌ   ZsizeListr&   ZvalueStrr   r   r   r½   ä  s~   


€ÿÿ



Í5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…   ZatFrame)r   r	   Z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…   rH   )r   r	   r–   r—   r   r   r   r¾   J  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…   rK   rJ   re   r²   r”   rŽ   ZParserError)	r   r	   rd   rK   r—   ZsemiIdxZblockIdxr7   r3   r   r   r   rÀ   Q  s2   
þzCSSParser._parseAtIdentc                 C   s6   |   |¡\}}|  | ¡ ¡\}}| j ||¡}||fS )z€ruleset
        : selector [ ',' S* selector ]*
            '{' S* declaration [ ';' S* declaration ]* '}' S*
        ;
        N)Ú_parseSelectorGroupr”   r²   r…   r;   )r   r	   r:   r–   r—   r   r   r   r­   z  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Ä   ú]ú(ri   r³   r   r}   )Ú_parseSelectorrœ   rª   r²   )r   r	   r:   rQ   r   r   r   rÚ   ˆ  s   
ý
úzCSSParser._parseSelectorGroupc                 C   sê   |   |¡\}}t|ƒ}|dd… dvro| jD ]}| |¡r)|t|ƒd…  ¡ } q,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Ä   rx   rÛ   rÜ   ri   ú )Ú_parseSimpleSelectorrÅ   ÚSelectorCombinersrª   r²   r…   rO   )r   r	   rQ   ZsrcLenrM   rN   r   r   r   rÝ   ”  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q’|r’|dd… | jv sD|  ¡ |fS )zysimple_selector
        : [ namespace_selector ]? element_name? [ HASH | class | attrib | pseudo ]* S*
        ;
        Nr   rË   z#Selector name or qualifier expectedrx   ry   )r²   Ú_getMatchResultÚre_namespace_selectorÚre_element_nameÚSelectorQualifiersr   r…   r=   rQ   Úre_hashr   Úre_classr   rª   Ú_parseSelectorAttributeÚ_parseSelectorPseudo)r   r	   rd   r<   r#   rQ   Z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 qOqCd}|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* ]? ']'
        ;
        rx   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	   rQ   rd   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 ]
        ;
        ry   zSelector Pseudo ':' not foundz^:{1,2}(.*)r   z$Selector Pseudo identifier not foundrÜ   NTri   z.Selector Pseudo Function closing ')' not found)rª   r   r   ÚsearchÚMÚSÚgroupr¸   r²   Ú_parseExpressionr'   r$   )r   r	   rQ   rd   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 …  ¡ }qf| |¡ |  d¡r]|dd …  ¡ }nqf|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Ä   rx   rÛ   rÜ   ri   r£   rË   z	-nothing-r³   rÄ   z'Declaration group closing '}' not found)rª   r   r²   Ú_parseDeclarationrœ   )r   r	   r’   rd   r–   rž   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   )ry   ru   )r¸   r²   r›   )r   r	   r   rž   r   r   r   rð   G  s   þzCSSParser._parseDeclarationc                 C   s@   |   |¡\}}|  | j|¡\}}| ¡ }| j |||¡}||fS rI   )rî   rá   Úre_importantr²   r…   rS   )r   r	   r   ÚexprrR   rž   r   r   r   r›   `  s
   z#CSSParser._parseDeclarationPropertyFc                 C   s¸   |   |¡\}}d}|dd… dvrF| jD ]}| |¡r%|t|ƒd… } q(qd}|   | ¡ ¡\}}|tu r6qF| 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Ä   rx   rÛ   ri   rÞ   )Ú_parseExpressionTermÚExpressionOperatorsrª   rÅ   r²   rJ   r…   rT   )r   r	   Z
returnListrï   ÚoperatorZterm2r   r   r   rî   l  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   ri   z1Terminal function expression expected closing ')'r   )rá   Úre_numÚre_unitr…   rX   r²   r´   Úre_urirZ   r[   Úre_functiontermrî   r   r]   Úre_rgbcolorrY   Úre_unicoderanger\   râ   r¸   r=   rV   Úre_unicodeidÚre_unicodestrr_   )r   r	   rd   r—   rW   rï   Úparamsr<   r   r   r   ró   ˆ  s\   

zCSSParser._parseExpressionTermc                 C   s   |   | j||¡S rI   )rá   Úre_ident)r   r	   rÒ   r   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   r×   r   Úgroupsrb   rÈ   )r   r	   ÚrexpressionrÒ   r—   Zstrresr   r   r   r´   Ñ  s   
ÿzCSSParser._getStringc                 C   s0   |   || j¡\}}|d u r|   |¡\}}||fS rI   )r´   rø   )r   r	   r—   r   r   r   r·   ã  s   zCSSParser._getStringOrURIc                 C   s0   |  |¡}|r| |¡|| ¡ d … fS ||fS rI   )r   rí   rÈ   )r   r  r	   rÒ   rí   r—   r   r   r   rá   ê  s   
zCSSParser._getMatchResultrI   )Tr`   )NN)Nr   )fr(   r)   r*   r+   ra   r   ré   rä   rà   rô   Z_orRuler   ÚIrë   ÚUZ_reflagsZi_hexZ
i_nonasciiZ	i_unicodeZi_escapeZ	i_nmstartZi_nmcharZi_identrÆ   rÿ   Zi_unicodeidrü   Zi_unicodestr1Zi_unicodestr2Zi_unicodestrrý   Zi_element_namerã   Zi_namespace_selectorrâ   Zi_classræ   Zi_hashrå   Z
i_rgbcolorrú   Zi_nlZi_escape_nlZi_string_contentZ	i_string1Z	i_string2Zi_stringr   Zi_urirø   Zi_numrö   Zi_unitr÷   Z
i_functionZre_functionZi_functiontermrù   Zi_unicoderange1Zi_unicoderange2Zi_unicoderangerû   Z	i_commentr¥   Zi_importantrñ   rc   rˆ   rƒ   rS   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   rt     sÆ    4
ÿ

ÿ

	
-%!<[)&1
"

E
rt   )Zreportlab.lib.pagesizesr   Zxhtml2pdf.defaultrÑ   Zxhtml2pdf.utilr   Zfuture_builtinsr   ÚImportErrorr   r   r   r   r   Úobjectr   r,   rb   ra   rt   r   r   r   r   Ú<module>   s$   
ÿ" 	,