U
    ?°eÎ¦  ã                   @   s®   d dl mZ d dlZd dlmZ zd dlmZ W n ek
rD   Y nX 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   ú;/tmp/pip-unpacked-wheel-35p66c5k/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   Ú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   rI   ¥   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 rJ   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termArK   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   rR   r   r   r   ÚtermRGBÇ   s    zCSSBuilderAbstract.termRGBc                 C   s   t dƒ‚d S r   r   rR   r   r   r   ÚtermURIË   s    zCSSBuilderAbstract.termURIc                 C   s   t dƒ‚d S r   r   rR   r   r   r   Ú
termStringÏ   s    zCSSBuilderAbstract.termStringc                 C   s   t dƒ‚d S r   r   rR   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?   rA   rB   rE   rF   rI   rM   rN   rP   rQ   rS   rU   rV   rW   rX   rY   rZ   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__Úreprrb   r	   r-   r   r   r   rg   ö   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   ra   r	   Ú
srcFullIdxr`   ÚctxsrcFullIdx)r   ri   r5   r   r   r   ÚsetFullCSSSourceþ   s    

zCSSParseError.setFullCSSSource)N)F)r%   r&   r'   r	   r`   ri   r5   rb   rm   rn   r_   rg   ro   r   r   r   r   r]   â   s   

r]   c                   @   s\  e Zd ZdZeZdddddddg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[
dvd0d1„ZBd2d3„ ZCd4d5„ ZDeEeCeDƒZFd6d7„ ZGd8d9„ ZHd:d;„ ZIdwd<d=„ZJd>d?„ ZKd@dA„ ZLdBdC„ ZMdDdE„ ZNdFdG„ ZOdHdI„ ZPdJdK„ ZQdLdM„ ZRdNdO„ ZSdPdQ„ ZTdRdS„ ZUdTdU„ ZVdVdW„ ZWdXdY„ ZXdZd[„ ZYd\d]„ ZZd^d_„ Z[d`da„ Z\dxdcdd„Z]dedf„ Z^dgdh„ Z_dydjdk„Z`dldm„ Zadzdndo„Zbd{dpdq„Zcdrds„ Zdd|dtdu„Zed/S )}Ú	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<>)ú#Ú.ú[ú:ú+ú>)ú/rv   ú,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 rG   )Ú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 5 Q R X |  |¡S )z`Parses CSS file-like objects using the current cssBuilder.
        Use for external stylesheets.Úr)ÚopenÚreadÚparse)r   ZsrcFileZfile_handlerZfile_contentr   r   r   Ú	parseFile§  s    zCSSParser.parseFilec              
   C   sn   | j  ¡  zRt |¡}z|  |¡\}}W n0 | jk
rX } z| |¡ ‚ W 5 d}~X Y nX W 5 | j  ¡  X |S )z\Parses CSS string source using the current cssBuilder.
        Use for embedded stylesheets.N)r‚   r.   r1   r   Z
cleanupCSSÚ_parseStylesheetÚ
ParseErrorro   )r   r	   r0   Úerrr   r   r   r‰   °  s    


zCSSParser.parsec              
   C   s|   | j  ¡  z`z| j| ¡ dd\}}W n4 | jk
rZ } z|j|dd ‚ W 5 d}~X Y nX | j  |¡}W 5 | j  ¡  X |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   r6   Ú_parseDeclarationGroupÚstriprŒ   ro   r5   )r   r	   Ú
propertiesr   Úresultr   r   r   ÚparseInlineÄ  s    
zCSSParser.parseInlinec           	   
   K   s¸   |dk	r|ni }|r|  |¡ | j ¡  z~g }z4| ¡ D ]&\}}|  | ¡ |¡\}}| |¡ q8W n4 | jk
r– } z|j	|dd ‚ W 5 d}~X Y nX | j 
|¡}W 5 | j ¡  X |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   r6   ÚitemsÚ_parseDeclarationPropertyr’   ÚappendrŒ   ro   r5   )	r   Ú
attributesZkwAttributesr“   ÚpropertyNamer	   Úsingle_propertyr   r”   r   r   r   ÚparseAttributesÕ  s     

zCSSParser.parseAttributesc                 C   s4   | j |d}d|d k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   Úresultsr   r   r   ÚparseSingleAttrñ  s    zCSSParser.parseSingleAttrc                 C   sÄ   t |ƒtkr| ¡ }| j d|¡}|  |¡}|  |¡}|  |¡\}}|  |¡}g }|r®| 	d¡rŠ|  
|¡\}}|dk	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)rj   rk   ÚdecodeÚ
re_commentr   Ú_parseAtCharsetÚ_parseSCDOCDCÚ_parseAtImportsÚ_parseAtNamespaceÚ
startswithÚ_parseAtKeywordrH   Ú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¨   r[   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kr@|  d||¡‚g }|  | ¡ ¡\}}|dk	rœ| |¡ |dd… dkrœ|dd…  ¡ }|  |¡\}}qVqœqV|s¦dg}|dd… dkrÄ|  d||¡‚|dd…  ¡ }| j ||| ¡}|dk	rö| |¡ |  	|¡}q||fS )	z[ import [S|CDO|CDC]* ]*ÚimportNzImport expecting string or urlr   ry   Ú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kr„|  |¡\}}|dkrZ|  d||¡‚|  | ¡ ¡\}}|dk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‚   rA   )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mediarC   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kr„|dkrT| d¡ t dtj¡}t ||¡}|| ¡ d d… }q¶| |¡ |d d	kr¬|dd…  ¡ }q| ¡ }q| 	d¡sÎ|  
d
||¡‚|dd…  ¡ }g }|rF| 	d¡sF| 	d¡r$|  |¡\}}|dk	r<| |¡ n|  |¡\}}	| |	¡ | ¡ }qâ| 	d¡sb|  
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   ry   úRuleset opening '{' not foundÚ}r¡   zRuleset closing '}' not found)Úlenr°   r¶   r™   r   ÚcompileÚDOTALLr   Úendr¨   rŒ   r©   rª   r«   r‚   rB   )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k	rà| |
¡ n’| j| ¡ dd\}}|	|7 }	i }d}|	rp| j 	| j 
d¡g|	¡}z|d  ¡ d }W n& tk
rb   |d  ¡ d }Y nX | dd¡}d|kržtjj t|d ƒ ¡ | jj¡| j_d}d|krv|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kr:tjj| | j_ntdƒ‚qÎt |ƒdkr`t|ƒ| j_|rvt| 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   ru   Ú_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   rN   Úvaluesr^   ÚpopitemÚgetÚ	xhtml2pdfÚdefaultZPML_PAGESIZESrl   ÚlowerÚcZpageSizeÚ
isinstanceÚlistÚtupler™   r   ÚRuntimeErrorr   rE   )r   r	   ÚdataZ
pageBorderZisLandscaper`   rC   rD   r¬   r“   r­   Znpropertiesr”   rÊ   ZsizeListr#   ZvalueStrr   r   r   r»   ä  sz    


 ÿ



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‚   rF   )r   r	   r“   r”   r   r   r   r¼   J  s    zCSSParser._parseAtFontFacec           	      C   s*  |}|   |dd … ¡\}}|d kr0|  d||¡‚| j || |¡\}}|tkr| d¡}|dk rdd }|d |…  d¡}|dk r‚d }|d k	r¨||k r¨||d d …  ¡ }nv|d kr¾|dd… }n`|d k	r||d … }z|  |¡\}}W n& | jk
r   |  |¡\}}Y nX 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‚   rI   rH   ra   r°   r‘   r‹   ZParserError)	r   r	   r`   rI   r”   ZsemiIdxZblockIdxr4   r0   r   r   r   r¾   Q  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«   z  s    zCSSParser._parseRulesetc                 C   sZ   g }|d d… dkrR|   |¡\}}|d kr,qR| |¡ | d¡r|dd …  ¡ }q||fS )Nr   )r¿   rÂ   ú]ú(re   r±   r   ry   )Ú_parseSelectorr™   r¨   r°   )r   r	   r7   rN   r   r   r   rØ   ˆ  s    

zCSSParser._parseSelectorGroupc                 C   sÊ   |   |¡\}}t|ƒ}|dd… dkr¾| jD ]&}| |¡r,|t|ƒd…  ¡ } qXq,d}|   |¡\}}t|ƒ|kr¬|dd… }|r |dd… dkr |dd… }q~| ¡ dfS | j |||¡}q| ¡ |fS )zUselector
        : simple_selector [ combinator simple_selector ]*
        ;
        Nr   )	r   ry   r±   r¿   rÂ   rt   rÙ   rÚ   re   ú )Ú_parseSimpleSelectorrÃ   ÚSelectorCombinersr¨   r°   r‚   rM   )r   r	   rN   ZsrcLenrK   rL   r   r   r   rÛ   ”  s     

zCSSParser._parseSelectorc                 C   s$  |  ¡ }|  | j|¡\}}|  | j|¡\}}|r2n&|dd… | jkrJd}n|  d||¡‚| j ||¡}| j |¡}|r|dd… | jkr|  | j	|¡\}}|dk	r²| 
|¡ qr|  | j|¡\}}|dk	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 expectedrt   ru   )r°   Ú_getMatchResultÚre_namespace_selectorÚre_element_nameÚSelectorQualifiersrŒ   r‚   r:   rN   Úre_hashr   Úre_classr   r¨   Ú_parseSelectorAttributeÚ_parseSelectorPseudo)r   r	   r`   r9   r    rN   Zhash_r   r   r   r   rÝ   °  s2    


zCSSParser._parseSimpleSelectorc                 C   sF  |}|  d¡s|  d||¡‚|dd…  ¡ }|  | j|¡\}}|  |¡\}}| ¡ }|dkrj|  d||¡‚|dk	r€| j ||¡}| jD ]}|  |¡r† qžq†d}|t	|ƒd…  ¡ }|rò|  |¡\}}|dkrö|  
|¡\}}|dk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* ]? ']'
        ;
        rt   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	   rN   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 ]
        ;
        ru   zSelector Pseudo ':' not foundz^:{1,2}(.*)r   z$Selector Pseudo identifier not foundrÚ   NTre   z.Selector Pseudo Function closing ')' not found)r¨   rŒ   r   ÚsearchÚMÚSÚgroupr¶   r°   Ú_parseExpressionr$   r!   )r   r	   rN   r`   r    Útermr   r   r   ræ     s     



zCSSParser._parseSelectorPseudoTc                 C   sò   |}|  d¡r"|dd … d }}n|r4|  d||¡‚g }| ¡ }|d d… dkr¾|  |¡\}}|  d¡rzd|dd …  }q@|d k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   ry   r¿   rÂ   rt   rÙ   rÚ   re   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k	rP| ¡ }|dd… dkr>|dd…  ¡ }|  ||¡\}}nd}||fS )zYdeclaration
        : ident S* ':' S* expr prio?
        | /* empty */
        ;
        Nr   )ru   rq   )r¶   r°   r˜   )r   r	   r›   rœ   r   r   r   rî   G  s    zCSSParser._parseDeclarationc                 C   s@   |   |¡\}}|  | j|¡\}}| ¡ }| j |||¡}||fS rG   )rì   rß   Úre_importantr°   r‚   rP   )r   r	   r›   ÚexprrO   rœ   r   r   r   r˜   `  s
    z#CSSParser._parseDeclarationPropertyFc                 C   s°   |   |¡\}}d}|dd… dkr€| jD ]"}| |¡r(|t|ƒd… } qPq(d}|   | ¡ ¡\}}|tkrnq€q| j |||¡}q|dkr¤|r¤| j |dd¡}||fS ||fS dS )zB
        expr
        : term [ operator term ]*
        ;
        Nr   )r   r±   r¿   rÂ   rt   rÙ   re   rÜ   )Ú_parseExpressionTermÚExpressionOperatorsr¨   rÃ   r°   rH   r‚   rQ   )r   r	   Z
returnListrí   ÚoperatorZterm2r   r   r   rì   l  s     

zCSSParser._parseExpressionc                 C   sL  |}|   | j|¡\}}|dk	rJ|   | j|¡\}}| j ||¡}| ¡ |fS |  || j¡\}}|dk	r|| j |¡}| ¡ |fS |  |¡\}}|dk	rª| j 	|¡}| ¡ |fS |   | j
|¡\}}|dk	r|  |d¡\}}|d dkrð|  d||¡‚|dd…  ¡ }| j ||¡}||fS |   | j|¡\}}|dk	rJ| j |¡}| ¡ |fS |   | j|¡\}}|dk	r~| j |¡}| ¡ |fS |   | j|¡\}}|  |¡\}}|dk	rØ|dk	rÀ| j ||¡}| j |¡}| ¡ |fS |   | j|¡\}}|dk	r| j |¡}| ¡ |fS |   | j|¡\}}|dk	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   re   z1Terminal function expression expected closing ')'r   )rß   Úre_numÚre_unitr‚   rU   r°   r²   Úre_urirW   rX   Úre_functiontermrì   rŒ   rZ   Úre_rgbcolorrV   Úre_unicoderangerY   rà   r¶   r:   rS   Úre_unicodeidÚre_unicodestrr\   )r   r	   r`   r”   rT   rí   Úparamsr9   r   r   r   rñ   ˆ  s\    






zCSSParser._parseExpressionTermc                 C   s   |   | j||¡S rG   )rß   Úre_ident)r   r	   rÐ   r   r   r   r¶   Í  s    zCSSParser._getIdentc                 C   s†   |d kr| j }| |¡}|rzttd | ¡ ƒƒ}|rbz|d }W qf tk
r^   | ¡ d }Y qfX 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 kr(|   |¡\}}||fS rG   )r²   rö   )r   r	   r”   r   r   r   rµ   ã  s    zCSSParser._getStringOrURIc                 C   s4   |  |¡}|r(| |¡|| ¡ d … fS ||fS d S rG   )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€   rP   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   rp     sÂ   4
ÿ

ÿ

	
-%!<[)&1
"
E

rp   )Zreportlab.lib.pagesizesr   Zxhtml2pdf.defaultrÏ   Zxhtml2pdf.utilr   Zfuture_builtinsr   ÚImportErrorr   r   r   r   r   Úobjectr   r)   r^   r]   rp   r   r   r   r   Ú<module>   s   " 	,