U
    =g                     @  s   d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
ZddlmZ ddlmZ d	d
 Zdd ZG dd dZG dd dZG dd deZdd ZG dd dZdS )a.  
CSS-2.1 parser.

Copyright (C) 2002-2004 TechGame Networks, LLC.

This library is free software; you can redistribute it and/or
modify it under the terms of the BSD style License as found in the
LICENSE file included with this distribution.

Modified by Dirk Holtwick <holtwick@web.de>, 2007-2008

The CSS 2.1 Specification this parser was derived from can be found at http://www.w3.org/TR/CSS21/

Primary Classes:
    * CSSParser
        Parses CSS source forms into results using a Builder Pattern.  Must
        provide concrete implementation of CSSBuilderAbstract.

    * CSSBuilderAbstract
        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.

Dependencies:
    re
    )annotationsN)abstractmethod)ClassVar)	landscape)getSize)
cssSpecialc                 C  s   t d| d | S )Nz^@z\s*)rematch)srcident r   ;/tmp/pip-unpacked-wheel-d1lgvatt/xhtml2pdf/w3c/cssParser.pyisAtRuleIdent.   s    r   c                 C  s   t dd| S )Nz^@[a-z\-]+\s* )r   subr
   r   r   r   stripAtRuleIdent2   s    r   c                   @  sX   e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	e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 S NNotImplementedError)selfZhashIdr   r   r   	addHashId@   s    zCSSSelectorAbstract.addHashIdc                 C  s   t d S r   r   )r   class_r   r   r   addClassD   s    zCSSSelectorAbstract.addClassc                 C  s   t d S r   r   )r   attrNamer   r   r   addAttributeH   s    z CSSSelectorAbstract.addAttributec                 C  s   t d S r   r   )r   r   op
attr_valuer   r   r   addAttributeOperationL   s    z)CSSSelectorAbstract.addAttributeOperationc                 C  s   t d S r   r   r   namer   r   r   	addPseudoP   s    zCSSSelectorAbstract.addPseudoc                 C  s   t d S r   r   r   r!   valuer   r   r   addPseudoFunctionT   s    z%CSSSelectorAbstract.addPseudoFunctionN)__name__
__module____qualname____doc__r   r   r   r   r   r"   r%   r   r   r   r   r   6   s   	




r   c                   @  sh  e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	edd Z
edd Zedd Zedd Zedd Zedd Zedd Zeddddddd Zed!d" Zed#d$ Zed%d& Zed'd( Zed)d*d+d,Zed-d. Zed/d0 Zed@d2d3Zed4d5 Zed6d7 Zed8d9 Zed:d; Zed<d= Zed>d? Zd1S )A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 S r   r   r   r   r   r   beginStylesheetd   s    z"CSSBuilderAbstract.beginStylesheetc                 C  s   t d S r   r   )r   elementsr   r   r   
stylesheeth   s    zCSSBuilderAbstract.stylesheetc                 C  s   t d S r   r   r+   r   r   r   endStylesheetl   s    z CSSBuilderAbstract.endStylesheetc                 C  s   t d S r   r   r+   r   r   r   beginInlinep   s    zCSSBuilderAbstract.beginInlinec                 C  s   t d S r   r   r   declarationsr   r   r   inlinet   s    zCSSBuilderAbstract.inlinec                 C  s   t d S r   r   r+   r   r   r   	endInlinex   s    zCSSBuilderAbstract.endInlinec                 C  s   t d S r   r   )r   	selectorsr2   r   r   r   ruleset|   s    zCSSBuilderAbstract.rulesetc                 C  s   t d S r   r   )r   nsPrefixr!   r   r   r   resolveNamespacePrefix   s    z)CSSBuilderAbstract.resolveNamespacePrefixc                 C  s   t d S r   r   )r   charsetr   r   r   	atCharset   s    zCSSBuilderAbstract.atCharsetc                 C  s   t d S r   r   )r   import_mediums	cssParserr   r   r   atImport   s    zCSSBuilderAbstract.atImportc                 C  s   t d S r   r   )r   r7   urir   r   r   atNamespace   s    zCSSBuilderAbstract.atNamespacec                 C  s   t d S r   r   )r   r<   r6   r   r   r   atMedia   s    zCSSBuilderAbstract.atMediastrz
str | Nonedictbool)r!   
pseudopagedataisLandscapec                C  s   t d S r   r   )r   r!   rE   rF   rG   
pageBorderr   r   r   atPage   s    
zCSSBuilderAbstract.atPagec                 C  s   t d S r   r   r1   r   r   r   
atFontFace   s    zCSSBuilderAbstract.atFontFacec                 C  s   |t fS r   )NotImplemented)r   atIdentr=   r
   r   r   r   rL      s    zCSSBuilderAbstract.atIdentc                 C  s   t dS z0Return value must implement CSSSelectorAbstract.Nr   )r   Z	selectorAcombiner	selectorBr   r   r   combineSelectors   s    z#CSSBuilderAbstract.combineSelectorsc                 C  s   t dS rM   r   r    r   r   r   selector   s    zCSSBuilderAbstract.selectorF	importantc                C  s   t d S r   r   )r   r!   r$   rS   r   r   r   property   s    zCSSBuilderAbstract.propertyc                 C  s   t d S r   r   )r   ZtermArN   ZtermBr   r   r   combineTerms   s    zCSSBuilderAbstract.combineTermsc                 C  s   t d S r   r   r   r$   r   r   r   	termIdent   s    zCSSBuilderAbstract.termIdentNc                 C  s   t d S r   r   )r   r$   unitsr   r   r   
termNumber   s    zCSSBuilderAbstract.termNumberc                 C  s   t d S r   r   rV   r   r   r   termRGB   s    zCSSBuilderAbstract.termRGBc                 C  s   t d S r   r   rV   r   r   r   termURI   s    zCSSBuilderAbstract.termURIc                 C  s   t d S r   r   rV   r   r   r   
termString   s    zCSSBuilderAbstract.termStringc                 C  s   t d S r   r   rV   r   r   r   termUnicodeRange   s    z#CSSBuilderAbstract.termUnicodeRangec                 C  s   t d S r   r   r#   r   r   r   termFunction   s    zCSSBuilderAbstract.termFunctionc                 C  s   t d S r   r   )r   Z_srcr   r   r   termUnknown   s    zCSSBuilderAbstract.termUnknown)N) r&   r'   r(   r)   r   r,   r.   r/   r0   r3   r4   r6   r8   r:   r>   r@   rA   rI   rJ   rL   rP   rQ   rT   rU   rW   rY   rZ   r[   r\   r]   r^   r_   r   r   r   r   r*   Y   sn   























r*   c                      s   e Zd ZU dZded< dZded< dZded< dZded	< d
Zded< d
Z	ded< d
Z
ded< ddd fddZdd fddZddddZ  ZS )CSSParseErrorr   rB   r
   ctxsrczbytes | strfullsrcFrD   r3   Nz
int | None	srcCtxIdx
srcFullIdxctxsrcFullIdxNonereturnc                   sD   t  | || _|p|| _| jr@| j| j| _| jdk r@| `d S )Nr   )super__init__r
   ra   findrc   )r   msgr
   ra   	__class__r   r   rj      s    

zCSSParseError.__init__c                   sx   | j rX| jrXt  d tt| j d | j  d tt| j | j| jd   d S t  d t| jd d  S )Nz:: (z,    )z:: (   )ra   rc   ri   __str__rB   reprr
   r+   rm   r   r   rr      s    zCSSParseError.__str__r3   c                C  sp   || _ t| j tr t| j d| _ |r*|| _| j rl| j | j| _| jdk rN| `| j | j| _	| j	dk rl| `	d S )Nutf-8r   )
rb   
isinstancebytesrB   r3   rk   r
   rd   ra   re   )r   rb   r3   r   r   r   setFullCSSSource  s    

zCSSParseError.setFullCSSSource)N)r&   r'   r(   r
   __annotations__ra   rb   r3   rc   rd   re   rj   rr   rx   __classcell__r   r   rm   r   r`      s   
	r`   c                  G  s
   d | S )z&Small helper to join regex expressions|)join)argsr   r   r   regex_or  s    r~   c                   @  s  e Zd ZU dZeZdddddddgZd	ed
< dZded< ddgZ	d	ed< dZ
ded< 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 de d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   d!Z ee eZ!dedd   d"Z"ee"eZ#d#e Z$ee$eZ%d$e Z&ee&eZ'd%e d&e d'e d(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Z0d.1e/ed/eeZ2ee2eZ3d0Z4ee4eZ5d1e Z6ee6eZ7ed2 Z8ee8eZ9d3e8 Z:ee:eZ;d4e d5e d6Z<d7Z=e<Z>ee>eZ?d8Z@ee@eZAd9ZBeeBeZCdd;d<d=d>ZDd?d@ ZEdAdB ZFeGeEeFZHdCdD ZIdEdF ZJdGdH ZKddIdJZLdKdL ZMdMdN ZNeOdOdP ZPdQdR ZQdSdT ZRdUdV ZSdWdX ZTdYdZ ZUd[d\ ZVd]d^ ZWd_d` ZXdadb ZYdcdd ZZdedf Z[dgdh Z\didj Z]dkdl Z^dmdn Z_dodpdqdrZ`dsdt Zadudv ZbdwdxdydzZcd{d| Zddd}d~ZedddZfdd ZgeOdddZhd: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<>zClassVar[list[str]]AttributeOperators)#.[:zClassVar[tuple[str, ...]]SelectorQualifiers+>SelectorCombiners)/r   ,ExpressionOperatorsz[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((?:z)(?:z)*)z([^\u0000-\u007f]+)z(\'[^\u0000-\u007f]+\')z(\"[^\u0000-\u007f]+\")   z)|\*)z)|\*|)\|(?!=)z\.z
#((?:%s)+)z(#z{8}|#z{6}|#z{3})z
|
||z\\(?:%s)z[	 !#$%&(-~]z"((?:%s|')*)"z'((?:%s|")*)'z!url\(\s*(?:(?:{})|((?:{})+))\s*\)z
[!#$%&*-~]z,(([-+]?[0-9]+(?:\.[0-9]+)?)|([-+]?\.[0-9]+))z(%%|%s)?z\(z[-+]?z(?:U\+z{1,6}-z{1,6})zO(?:U\+\?{1,6}|{h}(\?{0,5}|{h}(\?{0,4}|{h}(\?{0,3}|{h}(\?{0,2}|{h}(\??|{h}))))))z"(?:\/\*[^*]*\*+([^/*][^*]*\*+)*\/)z!\s*(important)Nrf   rg   c                 C  s   |  | d S r   )setCSSBuilderr   
cssBuilderr   r   r   rj     s    zCSSParser.__init__c                 C  s   | j S )4A 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d}| }W 5 Q R X | |S )zr
        Parses CSS file-like objects using the current cssBuilder.
        Use for external stylesheets.
        ru   )encoding)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 )zn
        Parses CSS string source using the current cssBuilder.
        Use for embedded stylesheets.
        N)r   r,   r/   r   Z
cleanupCSS_parseStylesheet
ParseErrorrx   )r   r
   r.   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 )z
        Parses CSS inline source string using the current cssBuilder.
        Use to parse a tag's 'style'-like attribute.
        FbracesTrt   N)r   r0   r4   _parseDeclarationGroupstripr   rx   r3   )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
        NTrt   )updater   r0   r4   items_parseDeclarationPropertyr   appendr   rx   r3   )	r   
attributesZkwAttributesr   property_namer
   single_propertyr   r   r   r   r   parseAttributes  s&    

 zCSSParser.parseAttributesc                 C  s0   | j |d}d|d k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r| }| jd|}| |}| |}| |\}}| |}g }|r|	dr| 
|\}}|dk	r|tkr|| n| |\}}|| | |}qP| 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)rv   rw   decode
re_commentr   _parseAtCharset_parseSCDOCDC_parseAtImports_parseAtNamespace
startswith_parseAtKeywordrK   extend_parseRulesetr   r   r.   )r   r
   ZstylesheetImportsstylesheetElements	atResultsr6   r.   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   ?  s    

zCSSParser._parseSCDOCDCc                 C  sl   t |drht|}| |\}}| }|dd dkrLd}| ||| j|dd  }| j| |S )z"[ CHARSET_SYM S* STRING S* ';' ]?.r9   Nr   ;z#@charset expected a terminating ';')r   r   
_getStringr   r   ra   r   r:   )r   r
   r9   rl   r   r   r   r   N  s    
zCSSParser._parseAtCharsetc           	      C  s  g }t |dr
|}t|}| |\}}|dkrDd}| |||g }| | \}}|dk	r|| |dd dkr|dd  }| |\}}qZqqZ|sdg}|dd dkrd}| ||||dd  }| j||| }|dk	r|| | 	|}q||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   r>   r   )	r   r
   r   ra   r;   rl   r<   mediumr.   r   r   r   r   \  s6    

zCSSParser._parseAtImportsc                 C  s   |  |}t|dr|}t|}| |\}}|dkr| |\}}|dkr^d}| |||| | \}}|dkrd}| |||nd}| }|dd dkrd}| ||||dd  }| j|| |  |}q
|S )zW
        Namespace :

        @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
   ra   r   r7   rl   r   r   r   r     s.    

zCSSParser._parseAtNamespacec                 C  s   |}t |dr| |\}}nt |dr8| |\}}nzt |drR| |\}}n`t |drl| |\}}nFt |dr| |\}}n,|dr| |\}}nd}| |||||fS )z-[media | page | font_face | unknown_keyword].Zmediapagez	font-facer   framer   zUnknown state in atKeyword)	r   _parseAtMedia_parseAtPage_parseAtFontFacer   _parseAtFramer   _parseAtIdentr   )r   r
   ra   r   rl   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  n| }q|	dsd
}| 
||||dd  }g }|rH|	dsH|	dr&| |\}}	|	dk	r>||	 n| |\}}
||
 | }q|	dsfd}| 
||||dd  }| j||}||fS )zi
        media
        : MEDIA_SYM S* medium [ ',' S* medium ]* '{' S* ruleset* '}' S*
        ;
        z@media Nr   {>   andNr   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   rA   )r   r
   ra   r<   r   patternr	   rl   r   r   r6   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sd}
| |
|||dd  }|r|d	s|d
r| |\}}|dk	r|| n| j| dd\}}|	|7 }	i }d}|	rr| j	| j
dg|	}z|d  d }W n& tk
rd   |d  d }Y nX |dd}d|krtjjt|d  | jj| j_d}d|kr||d }t|ts|g}g }|D ]z}t| }t|tr|t| nL|dkrd}n<|dkrd}n,|tjjkr<tjj| | j_nd}
t|
qt |dkrft|| j_|r|t| jj| j_| }q| jj|||||dg}|dd  |fS )z
        page
        : PAGE_SYM S* IDENT? pseudo_page? S*
            '{' S* declaration [ ';' S* declaration ]* '}' S*
        ;
        NFz@pager   r   _r   r   r   r   r   *r   z-pdf-frame-borderz-pdf-page-sizesizer   TZportraitzUnknown size value for @page   )rG   rH   )r   r   r   r   r   r   r   r   r   r6   rQ   values	Exceptionpopitemget	xhtml2pdfdefaultZPML_PAGESIZESrB   lowercZpageSizerv   listtupler   r   RuntimeErrorr   rI   )r   r
   rF   rH   rG   ra   r   rE   r   r   rl   r   Znpropertiesr   r   ZsizeListr$   ZvalueStrr   r   r   r     s    

 
 
 



    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   W  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  s2  |}|  |dd  \}}|d kr4d}| |||| j|| |\}}|tkr&|d}|dk rhd }|d | d}|dk rd }|d k	r||k r||d d   }nz|d kr|dd }nd|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   rL   rK   rk   r   r   r   ZParserError)
r   r
   ra   rL   rl   r   ZsemiIdxZblockIdxr2   r.   r   r   r   r   e  s4    


zCSSParser._parseAtIdentc                 C  s6   |  |\}}| | \}}| j||}||fS )z
        ruleset
        : selector [ ',' S* selector ]*
            '{' S* declaration [ ';' S* declaration ]* '}' S*
        ;
        )_parseSelectorGroupr   r   r   r6   )r   r
   r5   r   r   r   r   r   r     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   rp   ]r   r   (r   )_parseSelectorr   r   r   )r   r
   r5   rQ   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 )z^
        selector
        : simple_selector [ combinator simple_selector ]*
        ;
        Nr   >	   r   r   r   rp   r   r   r   r   r    )_parseSimpleSelectorr   r   r   r   r   rP   )r   r
   rQ   ZsrcLenrN   rO   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|
| qv| | j|\}}|dk	r|| qv|dr| ||\}}qv|dr| ||\}}qvqqv|  |fS )z
        simple_selector
        : [ namespace_selector ]? element_name? [ HASH | class | attrib | pseudo ]* S*
        ;
        Nr   r   z#Selector name or qualifier expectedr   r   )r   _getMatchResultre_namespace_selectorre_element_namer   r   r   r8   rQ   re_hashr   re_classr   r   _parseSelectorAttribute_parseSelectorPseudo)	r   r
   ra   r7   r!   rl   rQ   Zhash_r   r   r   r   r     s4    


zCSSParser._parseSimpleSelectorc           	      C  sT  |}| ds d}| ||||dd  }| | j|\}}| |\}}| }|dkrrd}| ||||dk	r| j||}| jD ]}| |r qqd}|t	|d  }|r| |\}}|dkr| 
|\}}|dkrd}| |||nd}| ds d	}| ||||dd }|rB|||| n
|| ||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   r8   r   r   r   r   r   )	r   r
   rQ   ra   rl   r7   r   r   r   r   r   r   r     sD    



z!CSSParser._parseSelectorAttributec                 C  s   |}| ds d}| |||td|tjtjB d}| |\}}|s`d}| |||| dr|dd  }| j	|dd	\}}| d
sd}| ||||dd }|
|| n
|| ||fS )zE
        pseudo
        : ':' [ IDENT | function ]
        ;
        r   zSelector Pseudo ':' not foundz^:{1,2}(.*)r   z$Selector Pseudo identifier not foundr   NTreturn_listrp   z.Selector Pseudo Function closing ')' not found)r   r   r   searchMSgroupr   r   _parseExpressionr%   r"   )r   r
   rQ   ra   rl   r!   termr   r   r   r   !  s&    



zCSSParser._parseSelectorPseudoTr   c                C  s   |}| dr"|dd  d }}n|r8d}| |||g }| }|d d dkr| |\}}| dr~d|dd   }qD|d kr|dd   }q|| | dr|dd   }qDqqD|r| d	sd
}| ||||dd  }| |fS )Nr   r   Tz'Declaration group opening '{' not found>	   r   r   r   rp   r   r   r   r   r   r   z	-nothing-r   r   z'Declaration group closing '}' not found)r   r   r   _parseDeclarationr   )r   r
   r   ra   rl   r   r   r   r   r   r   B  s4    




z CSSParser._parseDeclarationGroupc                 C  s\   |  |\}}|dk	rP| }|dd dkr>|dd  }| ||\}}nd}||fS )zb
        declaration
        : ident S* ':' S* expr prio?
        | /* empty */
        ;
        Nr   >   r   r   )r   r   r   )r   r
   r   r   r   r   r   r   e  s    zCSSParser._parseDeclarationc                 C  sB   |  |\}}| | j|\}}| }| jj|||d}||fS )NrR   )r   r   re_importantr   r   rT   )r   r
   r   exprrS   r   r   r   r   r   ~  s      z#CSSParser._parseDeclarationPropertyFr   c                C  s   |  |\}}d}|dd dkr~| jD ]"}||r(|t|d } qPq(d}|  | \}}|tkrlq~| j|||}q|dkr|r| j|dd}||fS ||fS )zB
        expr
        : term [ operator term ]*
        ;
        Nr   >   r   r   rp   r   r   r   r   r   )_parseExpressionTermr   r   r   r   rK   r   rU   )r   r
   r   r   operatorZterm2r   r   r   r     s     

zCSSParser._parseExpressionc           	      C  sR  |}|  | 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| j|dd\}}|d dkrd}| ||||dd  }| j||}||fS |  | j|\}}|dk	rP| 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	rF| j	|}| |fS | j|S )a  
        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   r   rp   z1Terminal function expression expected closing ')'r   )r   re_numre_unitr   rY   r   r   re_urir[   r\   re_functiontermr   r   r^   re_rgbcolorrZ   re_unicoderanger]   r   r   r8   rW   re_unicodeidre_unicodestrr_   )	r   r
   ra   r   rX   r   paramsrl   r7   r   r   r   r     s^    	






zCSSParser._parseExpressionTermc                 C  s   |  | j||S r   )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 )Nr   r   )	re_stringr	   r   filtergroupsr   r   )r   r
   rexpressionr   r   Zstrresr   r   r   r     s    
zCSSParser._getStringc                 C  s0   |  || j\}}|d kr(|  |\}}||fS r   )r   r  )r   r
   r   r   r   r   r     s    zCSSParser._getStringOrURIc                 C  s0   |  |}|r(|||| d  fS ||fS r   )r	   r   r   )r  r
   r   r   r   r   r   r   r     s    
zCSSParser._getMatchResult)N)N)N)NN)Nr   )ir&   r'   r(   r)   r`   r   r   ry   r   r   r   r   Ir   UZ_reflagsZi_hexZ
i_nonasciiZ	i_unicoder~   Z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
  formatZ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   rj   r   r   rT   r   r   r   r   r   r   r   staticmethodr   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     s   
5
  

 



-
&#9d*'4!#F

r   )r)   
__future__r   r   abcr   typingr   Zreportlab.lib.pagesizesr   Zxhtml2pdf.defaultr   Zxhtml2pdf.utilr   Zxhtml2pdf.w3cr   r   r   r   r*   r   r`   r~   r   r   r   r   r   <module>   s    # 0