a
    ¬ªbÂ¦  ã                   @   s¬   d dl mZ d dlZd dlmZ zd dlmZ W n eyB   Y n0 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   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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   s   t dƒ‚d S ©NúSubclass responsibility©ÚNotImplementedError)ÚselfZhashIdr   r   r   Ú	addHashIdB   s    zCSSSelectorAbstract.addHashIdc                 C   s   t dƒ‚d S r   r   )r   Úclass_r   r   r   ÚaddClassF   s    zCSSSelectorAbstract.addClassc                 C   s   t dƒ‚d S r   r   )r   ÚattrNamer   r   r   ÚaddAttributeJ   s    z CSSSelectorAbstract.addAttributec                 C   s   t dƒ‚d S r   r   )r   r   ÚopÚ	attrValuer   r   r   ÚaddAttributeOperationN   s    z)CSSSelectorAbstract.addAttributeOperationc                 C   s   t dƒ‚d S r   r   ©r   Únamer   r   r   Ú	addPseudoR   s    zCSSSelectorAbstract.addPseudoc                 C   s   t dƒ‚d S r   r   ©r   r    Úvaluer   r   r   ÚaddPseudoFunctionV   s    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   s   t dƒ‚d S r   r   ©r   Úcharsetr   r   r   Ú
setCharsetc   s    zCSSBuilderAbstract.setCharsetc                 C   s   t dƒ‚d S r   r   ©r   r   r   r   ÚbeginStylesheeti   s    z"CSSBuilderAbstract.beginStylesheetc                 C   s   t dƒ‚d S r   r   )r   Úelementsr   r   r   Ú
stylesheetm   s    zCSSBuilderAbstract.stylesheetc                 C   s   t dƒ‚d S r   r   r-   r   r   r   ÚendStylesheetq   s    z CSSBuilderAbstract.endStylesheetc                 C   s   t dƒ‚d S r   r   r-   r   r   r   ÚbeginInlineu   s    zCSSBuilderAbstract.beginInlinec                 C   s   t dƒ‚d S r   r   ©r   Údeclarationsr   r   r   Úinliney   s    zCSSBuilderAbstract.inlinec                 C   s   t dƒ‚d S r   r   r-   r   r   r   Ú	endInline}   s    zCSSBuilderAbstract.endInlinec                 C   s   t dƒ‚d S r   r   )r   Ú	selectorsr4   r   r   r   Úruleset   s    zCSSBuilderAbstract.rulesetc                 C   s   t dƒ‚d S r   r   )r   ÚnsPrefixr    r   r   r   ÚresolveNamespacePrefix‡   s    z)CSSBuilderAbstract.resolveNamespacePrefixc                 C   s   t dƒ‚d S r   r   r*   r   r   r   Ú	atCharset   s    zCSSBuilderAbstract.atCharsetc                 C   s   t dƒ‚d S r   r   )r   Úimport_ÚmediumsÚ	cssParserr   r   r   ÚatImport‘   s    zCSSBuilderAbstract.atImportc                 C   s   t dƒ‚d S r   r   )r   r9   Zurir   r   r   ÚatNamespace•   s    zCSSBuilderAbstract.atNamespacec                 C   s   t dƒ‚d S r   r   )r   r=   r8   r   r   r   ÚatMedia™   s    zCSSBuilderAbstract.atMediac                 C   s   t dƒ‚d S r   r   )r   ÚpageÚ
pseudopager4   r   r   r   ÚatPage   s    zCSSBuilderAbstract.atPagec                 C   s   t dƒ‚d S r   r   r3   r   r   r   Ú
atFontFace¡   s    zCSSBuilderAbstract.atFontFacec                 C   s   |t fS ©N)ÚNotImplemented)r   ÚatIdentr>   r	   r   r   r   rH   ¥   s    zCSSBuilderAbstract.atIdentc                 C   s   t dƒ‚dS ©z/Return value must implement CSSSelectorAbstractr   Nr   )r   Z	selectorAÚcombinerÚ	selectorBr   r   r   ÚcombineSelectors«   s    z#CSSBuilderAbstract.combineSelectorsc                 C   s   t dƒ‚dS rI   r   r   r   r   r   Úselector°   s    zCSSBuilderAbstract.selectorFc                 C   s   t dƒ‚d S r   r   )r   r    r#   Ú	importantr   r   r   Úproperty·   s    zCSSBuilderAbstract.propertyc                 C   s   t dƒ‚d S r   r   )r   ZtermArJ   ZtermBr   r   r   ÚcombineTerms»   s    zCSSBuilderAbstract.combineTermsc                 C   s   t dƒ‚d S r   r   ©r   r#   r   r   r   Ú	termIdent¿   s    zCSSBuilderAbstract.termIdentNc                 C   s   t dƒ‚d S r   r   )r   r#   Úunitsr   r   r   Ú
termNumberÃ   s    zCSSBuilderAbstract.termNumberc                 C   s   t dƒ‚d S r   r   rQ   r   r   r   ÚtermRGBÇ   s    zCSSBuilderAbstract.termRGBc                 C   s   t dƒ‚d S r   r   rQ   r   r   r   ÚtermURIË   s    zCSSBuilderAbstract.termURIc                 C   s   t dƒ‚d S r   r   rQ   r   r   r   Ú
termStringÏ   s    zCSSBuilderAbstract.termStringc                 C   s   t dƒ‚d S r   r   rQ   r   r   r   ÚtermUnicodeRangeÓ   s    z#CSSBuilderAbstract.termUnicodeRangec                 C   s   t dƒ‚d S r   r   r"   r   r   r   ÚtermFunction×   s    zCSSBuilderAbstract.termFunctionc                 C   s   t dƒ‚d S r   r   ©r   r	   r   r   r   ÚtermUnknownÛ   s    zCSSBuilderAbstract.termUnknown)F)N) r%   r&   r'   r(   r,   r.   r0   r1   r2   r5   r6   r8   r:   r;   r?   r@   rA   rD   rE   rH   rL   rM   rO   rP   rR   rT   rU   rV   rW   rX   rY   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   sD   t  | |¡ || _|p|| _| jr@| j | j¡| _| jdk r@| `d S )Nr   )Ú	ExceptionÚ__init__r	   ÚctxsrcÚfindÚ	srcCtxIdx)r   Úmsgr	   r_   r   r   r   r^   ì   s    

zCSSParseError.__init__c                 C   sn   | j rJt | ¡d t| j d | j… ƒ d t| j | j| jd … ƒ d S t | ¡d t| jd d… ƒ S d S )Nz:: (z, é   ú)z:: é(   )r_   r]   Ú__str__Úreprra   r	   r-   r   r   r   rf   ö   s    &ÿÿzCSSParseError.__str__c                 C   sr   || _ t| j ƒtkr"t| j dƒ| _ |r,|| _| j rn| j  | j¡| _| jdk rP| `| j  | j¡| _	| j	dk rn| `	d S )Nzutf-8r   )
ÚfullsrcÚtypeÚbytesÚstrr5   r`   r	   Ú
srcFullIdxr_   ÚctxsrcFullIdx)r   rh   r5   r   r   r   ÚsetFullCSSSourceþ   s    

zCSSParseError.setFullCSSSource)N)F)r%   r&   r'   r	   r_   rh   r5   ra   rl   rm   r^   rf   rn   r   r   r   r   r\   â   s   

r\   c                   @   sR  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.d/„ ZDeEeCeDƒZFd0d1„ ZGd2d3„ ZHd4d5„ ZIdqd6d7„ZJd8d9„ ZKd:d;„ ZLd<d=„ ZMd>d?„ ZNd@dA„ ZOdBdC„ ZPdDdE„ ZQdFdG„ ZRdHdI„ ZSdJdK„ ZTdLdM„ ZUdNdO„ ZVdPdQ„ ZWdRdS„ ZXdTdU„ ZYdVdW„ ZZdXdY„ Z[dZd[„ Z\drd]d^„Z]d_d`„ Z^dadb„ Z_dsddde„Z`dfdg„ Zadtdhdi„Zbdudjdk„Zcdldm„ Zddvdndo„Zed)S )wÚ	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<>)ú#Ú.ú[ú:ú+ú>)ú/ru   ú,c                  G   s
   d  | ¡S )Nú|)Újoin)Úargsr   r   r   Ú<lambda>O  ó    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 rF   )ÚsetCSSBuilder©r   Ú
cssBuilderr   r   r   r^   ‘  s    zCSSParser.__init__c                 C   s   | j S )ú3A concrete instance implementing CSSBuilderAbstract©Z_cssBuilderr-   r   r   r   ÚgetCSSBuilder—  s    zCSSParser.getCSSBuilderc                 C   s
   || _ dS )r‚   Nrƒ   r€   r   r   r   r   œ  s    zCSSParser.setCSSBuilderc                 C   s<   t |dƒ}| ¡ }W d  ƒ n1 s(0    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   sz   | j  ¡  z^t |¡}z|  |¡\}}W n2 | jyZ } z| |¡ ‚ W Y d}~n
d}~0 0 W | j  ¡  n| j  ¡  0 |S )z\Parses CSS string source using the current cssBuilder.
        Use for embedded stylesheets.N)r   r.   r   Z
cleanupCSSÚ_parseStylesheetÚ
ParseErrorrn   r1   )r   r	   r0   Úerrr   r   r   rˆ   °  s    


zCSSParser.parsec              
   C   sˆ   | j  ¡  zlz| j| ¡ dd\}}W n6 | jy\ } z|j|dd ‚ W Y d}~n
d}~0 0 | j  |¡}W | j  ¡  n| j  ¡  0 |S )zrParses CSS inline source string using the current cssBuilder.
        Use to parse a tag's 'sytle'-like attribute.F©ÚbracesT©r5   N)r   r2   Ú_parseDeclarationGroupÚstripr‹   rn   r5   r6   )r   r	   Ú
propertiesrŒ   Úresultr   r   r   ÚparseInlineÄ  s    
zCSSParser.parseInlinec           	   
   K   sÄ   |dur|ni }|r|  |¡ | j ¡  zŠg }z4| ¡ D ]&\}}|  | ¡ |¡\}}| |¡ q8W n6 | jy˜ } z|j|dd ‚ W Y d}~n
d}~0 0 | j 	|¡}W | j 
¡  n| j 
¡  0 |S )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   r2   ÚitemsÚ_parseDeclarationPropertyr‘   Úappendr‹   rn   r5   r6   )	r   Z
attributesZkwAttributesr’   ÚpropertyNamer	   Úsingle_propertyrŒ   r“   r   r   r   ÚparseAttributesÕ  s     

zCSSParser.parseAttributesc                 C   s4   | j |d}d|d v r$|d d S |d d S 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   Zresultsr   r   r   ÚparseSingleAttrñ  s    zCSSParser.parseSingleAttrc                 C   sÄ   t |ƒtkr| ¡ }| j d|¡}|  |¡}|  |¡}|  |¡\}}|  |¡}g }|r®| 	d¡rŠ|  
|¡\}}|dur¢|tkr¢| |¡ n|  |¡\}}| |¡ |  |¡}qR| 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)ri   rj   ÚdecodeÚ
re_commentr   Ú_parseAtCharsetÚ_parseSCDOCDCÚ_parseAtImportsÚ_parseAtNamespaceÚ
startswithÚ_parseAtKeywordrG   ÚextendÚ_parseRulesetr˜   r   r0   )r   r	   ZstylesheetImportsÚstylesheetElementsÚ	atResultsr8   r0   r   r   r   rŠ     s$    




zCSSParser._parseStylesheetc                 C   s@   |  ¡ }| d¡r |dd… }q | d¡r<|dd… }q q<q |S )z[S|CDO|CDC]*z<!--é   Nz-->é   )Úlstripr¥   rZ   r   r   r   r¢   0  s    

zCSSParser._parseSCDOCDCc                 C   sh   t |dƒrdt|ƒ}|  |¡\}}| ¡ }|dd… dkrH|  d|| j¡‚|dd…  ¡ }| j |¡ |S )z![ CHARSET_SYM S* STRING S* ';' ]?r+   Nr   ú;z#@charset expected a terminating ';')r   r   Ú
_getStringr­   r‹   r_   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rœ| |¡ |dd… dkrœ|dd…  ¡ }|  |¡\}}qVqœqV|s¦dg}|dd… dkrÄ|  d||¡‚|dd…  ¡ }| j ||| ¡}|durö| |¡ |  	|¡}q||fS )	z[ import [S|CDO|CDC]* ]*ÚimportNzImport expecting string or urlr   rx   Úallr®   z"@import expected a terminating ';')
r   r   Ú_getStringOrURIr‹   Ú	_getIdentr­   r˜   r   r?   r¢   )r   r	   r“   r_   r<   r=   Úmediumr0   r   r   r   r£   M  s2    

zCSSParser._parseAtImportsc                 C   sÜ   |   |¡}t|dƒrØ|}t|ƒ}|  |¡\}}|du r„|  |¡\}}|du rZ|  d||¡‚|  | ¡ ¡\}}|du rˆ|  d||¡‚nd}| ¡ }|dd… dkr®|  d||¡‚|dd…  ¡ }| j ||¡ |   |¡}q
|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   r@   )r   r	   r_   rµ   r9   r   r   r   r¤   r  s(    

zCSSParser._parseAtNamespacec                 C   s¶   |}t |dƒr|  |¡\}}nt |dƒr8|  |¡\}}nvt |dƒrR|  |¡\}}n\t |dƒrl|  |¡\}}nBt |dƒr†|  |¡\}}n(| d¡r |  |¡\}}n|  d||¡‚||fS )z,[media | page | font_face | unknown_keyword]ZmediarB   z	font-facer°   Úframerž   zUnknown state in atKeyword)	r   Ú_parseAtMediaÚ_parseAtPageÚ_parseAtFontFacer£   Ú_parseAtFramer¥   Ú_parseAtIdentr‹   )r   r	   r_   r“   r   r   r   r¦   “  s    





zCSSParser._parseAtKeywordc                 C   s„  |}|t dƒd…  ¡ }g }|r²|d dkr²|  |¡\}}|dv r€|du rT| d¡ t d¡}t ||¡}|| ¡ d d… }q²| |¡ |d d	kr¨|dd…  ¡ }q| ¡ }q| d¡sÊ|  	d
||¡‚|dd…  ¡ }g }|rB| d¡sB| d¡r |  
|¡\}}|dur8| |¡ n|  |¡\}}	| |	¡ | ¡ }qÞ| d¡s^|  	d||¡‚n|dd…  ¡ }| j ||¡}
||
fS )z`media
        : MEDIA_SYM S* medium [ ',' S* medium ]* '{' S* ruleset* '}' S*
        ;
        z@media Nr   ú{)NÚandr±   z.*({.*)r   rx   úRuleset opening '{' not foundú}rž   zRuleset closing '}' not found)Úlenr­   r³   r˜   r   Úcompiler   Úendr¥   r‹   r¦   r§   r¨   r   rA   )r   r	   r_   r=   r´   Úpatternr   r©   rª   r8   r“   r   r   r   r·   ¨  sB    







zCSSParser._parseAtMediac                 C   s¨  i }d}d}|}|t dƒd…  ¡ }|  |¡\}}|dd… dkrf|  |dd… ¡\}}|d | }nd}g }| ¡ }g }	| d¡s”|  d||¡‚n|dd…  ¡ }|r~| d	¡s~| d
¡rä|  |¡\}}
|
durà| |
¡ n| j| ¡ dd\}}|	|7 }	i }d}|	rn| j 	| j 
d¡g|	¡}z|d  ¡ d }W n$ ty`   |d  ¡ d }Y n0 | dd¡}d|v rœtjj t|d ƒ ¡ | jj¡| j_d}d|v rt|d }t|tƒsÄ|g}g }|D ]v}t|ƒ ¡ }t|tƒrø| t|ƒ¡ nH|dkrd}n8|dkrd}n(|tjjv r8tjj| | j_ntdƒ‚qÌt |ƒdkr^t|ƒ| j_|rtt| jjƒ| j_| ¡ }q¤| j |||||¡g}|dd…  ¡ |fS )z‚page
        : PAGE_SYM S* IDENT? pseudo_page? S*
            '{' S* declaration [ ';' S* declaration ]* '}' S*
        ;
        NFz@pager   rt   Ú_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   r8   rM   Úvaluesr]   ÚpopitemÚgetÚ	xhtml2pdfÚdefaultZPML_PAGESIZESrk   ÚlowerÚcZpageSizeÚ
isinstanceÚlistÚtupler˜   r   ÚRuntimeErrorr   rD   )r   r	   ÚdataZ
pageBorderZisLandscaper_   rB   rC   r©   r’   rª   Znpropertiesr“   rÆ   ZsizeListr#   ZvalueStrr   r   r   r¸   â  sx    


ÿ



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   rE   )r   r	   r’   r“   r   r   r   r¹   H  s    zCSSParser._parseAtFontFacec           	      C   s(  |}|   |dd … ¡\}}|d u r0|  d||¡‚| j || |¡\}}|tu r| d¡}|dk rdd }|d |…  d¡}|dk r‚d }|d ur¨||k r¨||d d …  ¡ }nt|d u r¾|dd… }n^|d ur||d … }z|  |¡\}}W n$ | jy
   |  |¡\}}Y n0 n|  	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   rH   rG   r`   r­   r   rŠ   ZParserError)	r   r	   r_   rH   r“   ZsemiIdxZblockIdxr4   r0   r   r   r   r»   O  s0    


zCSSParser._parseAtIdentc                 C   s6   |   |¡\}}|  | ¡ ¡\}}| j ||¡}||fS )z€ruleset
        : selector [ ',' S* selector ]*
            '{' S* declaration [ ';' S* declaration ]* '}' S*
        ;
        )Ú_parseSelectorGroupr   r­   r   r8   )r   r	   r7   r’   r“   r   r   r   r¨   x  s    zCSSParser._parseRulesetc                 C   sZ   g }|d d… dvrR|   |¡\}}|d u r,qR| |¡ | d¡r|dd …  ¡ }q||fS )Nr   )r¼   r¿   ú]ú(rd   r®   r   rx   )Ú_parseSelectorr˜   r¥   r­   )r   r	   r7   rM   r   r   r   rÔ   †  s    

zCSSParser._parseSelectorGroupc                 C   sÊ   |   |¡\}}t|ƒ}|dd… dvr¾| jD ]&}| |¡r,|t|ƒd…  ¡ } qXq,d}|   |¡\}}t|ƒ|kr¬|dd… }|r |dd… dvr |dd… }q~| ¡ dfS | j |||¡}q| ¡ |fS )zUselector
        : simple_selector [ combinator simple_selector ]*
        ;
        Nr   )	r   rx   r®   r¼   r¿   rs   rÕ   rÖ   rd   ú )Ú_parseSimpleSelectorrÀ   ÚSelectorCombinersr¥   r­   r   rL   )r   r	   rM   ZsrcLenrJ   rK   r   r   r   r×   ’  s     

zCSSParser._parseSelectorc                 C   s$  |  ¡ }|  | j|¡\}}|  | j|¡\}}|r2n&|dd… | jv rJd}n|  d||¡‚| j ||¡}| j |¡}|r|dd… | jv r|  | j	|¡\}}|dur²| 
|¡ qr|  | j|¡\}}|durØ| |¡ qr| d¡rô|  ||¡\}}qr| d¡r|  ||¡\}}qrqqr|  ¡ |fS )zysimple_selector
        : [ namespace_selector ]? element_name? [ HASH | class | attrib | pseudo ]* S*
        ;
        Nr   rÅ   z#Selector name or qualifier expectedrs   rt   )r­   Ú_getMatchResultÚre_namespace_selectorÚre_element_nameÚSelectorQualifiersr‹   r   r:   rM   Úre_hashr   Úre_classr   r¥   Ú_parseSelectorAttributeÚ_parseSelectorPseudo)r   r	   r_   r9   r    rM   Zhash_r   r   r   r   rÙ   ®  s2    


zCSSParser._parseSimpleSelectorc                 C   sF  |}|  d¡s|  d||¡‚|dd…  ¡ }|  | j|¡\}}|  |¡\}}| ¡ }|du rj|  d||¡‚|dur€| j ||¡}| jD ]}|  |¡r† qžq†d}|t	|ƒd…  ¡ }|rò|  |¡\}}|du rö|  
|¡\}}|du rö|  d||¡‚nd}|  d¡s|  d	||¡‚n|dd… }|r4| |||¡ n
| |¡ ||fS )
z˜attrib
        : '[' S* [ namespace_selector ]? IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
            [ IDENT | STRING ] S* ]? ']'
        ;
        rs   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	   rM   r_   r9   r   r   r   r   r   r   rá   Ô  s<    



z!CSSParser._parseSelectorAttributec                 C   sÆ   |}|  d¡s|  d||¡‚t d|tjtjB ¡ d¡}|  |¡\}}|sX|  d||¡‚|  d¡r´|dd…  ¡ }|  	|d¡\}}|  d	¡sš|  d
||¡‚|dd… }| 
||¡ n
| |¡ ||fS )z<pseudo
        : ':' [ IDENT | function ]
        ;
        rt   zSelector Pseudo ':' not foundz^:{1,2}(.*)r   z$Selector Pseudo identifier not foundrÖ   NTrd   z.Selector Pseudo Function closing ')' not found)r¥   r‹   r   ÚsearchÚMÚSÚgroupr³   r­   Ú_parseExpressionr$   r!   )r   r	   rM   r_   r    Útermr   r   r   râ     s     



zCSSParser._parseSelectorPseudoTc                 C   sò   |}|  d¡r"|dd … d }}n|r4|  d||¡‚g }| ¡ }|d d… dvr¾|  |¡\}}|  d¡rzd|dd …  }q@|d u r”|dd …  ¡ }q¾| |¡ |  d¡r¾|dd …  ¡ }q@q¾q@|ræ|  d	¡sÚ|  d
||¡‚|dd … }| ¡ |fS )Nr¼   r   Tz'Declaration group opening '{' not found)	r   rx   r¼   r¿   rs   rÕ   rÖ   rd   rž   rÅ   z	-nothing-r®   r¿   z'Declaration group closing '}' not found)r¥   r‹   r­   Ú_parseDeclarationr˜   )r   r	   rŽ   r_   r’   rš   r   r   r   r   #  s0    




z CSSParser._parseDeclarationGroupc                 C   s\   |   |¡\}}|durP| ¡ }|dd… dv r>|dd…  ¡ }|  ||¡\}}nd}||fS )zYdeclaration
        : ident S* ':' S* expr prio?
        | /* empty */
        ;
        Nr   )rt   rp   )r³   r­   r—   )r   r	   r™   rš   r   r   r   rê   E  s    zCSSParser._parseDeclarationc                 C   s@   |   |¡\}}|  | j|¡\}}| ¡ }| j |||¡}||fS rF   )rè   rÛ   Úre_importantr­   r   rO   )r   r	   r™   ÚexprrN   rš   r   r   r   r—   ^  s
    z#CSSParser._parseDeclarationPropertyFc                 C   s°   |   |¡\}}d}|dd… dvr€| jD ]"}| |¡r(|t|ƒd… } qPq(d}|   | ¡ ¡\}}|tu rnq€q| j |||¡}q|du r¤|r¤| j |dd¡}||fS ||fS dS )zB
        expr
        : term [ operator term ]*
        ;
        Nr   )r   r®   r¼   r¿   rs   rÕ   rd   rØ   )Ú_parseExpressionTermÚExpressionOperatorsr¥   rÀ   r­   rG   r   rP   )r   r	   Z
returnListré   ÚoperatorZterm2r   r   r   rè   j  s     

zCSSParser._parseExpressionc                 C   sL  |}|   | j|¡\}}|durJ|   | j|¡\}}| j ||¡}| ¡ |fS |  || j¡\}}|dur|| j |¡}| ¡ |fS |  |¡\}}|durª| j 	|¡}| ¡ |fS |   | j
|¡\}}|dur|  |d¡\}}|d dkrð|  d||¡‚|dd…  ¡ }| j ||¡}||fS |   | j|¡\}}|durJ| 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   rd   z1Terminal function expression expected closing ')'r   )rÛ   Úre_numÚre_unitr   rT   r­   r¯   Úre_urirV   rW   Úre_functiontermrè   r‹   rY   Úre_rgbcolorrU   Úre_unicoderangerX   rÜ   r³   r:   rR   Úre_unicodeidÚre_unicodestrr[   )r   r	   r_   r“   rS   ré   Úparamsr9   r   r   r   rí   †  s\    






zCSSParser._parseExpressionTermc                 C   s   |   | j||¡S rF   )rÛ   Úre_ident)r   r	   rÌ   r   r   r   r³   Ë  s    zCSSParser._getIdentc                 C   s„   |d u r| j }| |¡}|rxttd | ¡ ƒƒ}|r`z|d }W qd ty\   | ¡ d }Y qd0 nd}||| ¡ d … fS ||fS d S )Nr   r   )Ú	re_stringr   rÑ   r   Úgroupsr]   rÂ   )r   r	   ÚrexpressionrÌ   r“   Zstrresr   r   r   r¯   Ï  s    
zCSSParser._getStringc                 C   s0   |   || j¡\}}|d u r(|   |¡\}}||fS rF   )r¯   rò   )r   r	   r“   r   r   r   r²   á  s    zCSSParser._getStringOrURIc                 C   s4   |  |¡}|r(| |¡|| ¡ d … fS ||fS d S rF   )r   rç   rÂ   )r   rü   r	   rÌ   rç   r“   r   r   r   rÛ   è  s    
zCSSParser._getMatchResult)N)N)T)F)N)NN)Nr   )fr%   r&   r'   r(   r\   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ë   r^   r„   r   rO   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   ro     sÂ   4
ÿ

ÿ

	
-%!:[)&1
"
E

ro   )Zreportlab.lib.pagesizesr   Zxhtml2pdf.defaultrË   Zxhtml2pdf.utilr   Zfuture_builtinsr   ÚImportErrorr   r   r   r   r   Úobjectr   r)   r]   r\   ro   r   r   r   r   Ú<module>   s   " 	,