o
    3[œ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   úM/var/www/chikooza/env/lib/python3.10/site-packages/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)ÚselfÚ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   r1   r   r   r   ÚendStylesheetq   r   z CSSBuilderAbstract.endStylesheetc                 C   r   r   r   r1   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   r1   r   r   r   Ú	endInline}   r   zCSSBuilderAbstract.endInlinec                 C   r   r   r   )r   Ú	selectorsr8   r   r   r   Úruleset   r   zCSSBuilderAbstract.rulesetc                 C   r   r   r   )r   ÚnsPrefixr$   r   r   r   ÚresolveNamespacePrefix‡   r   z)CSSBuilderAbstract.resolveNamespacePrefixc                 C   r   r   r   r.   r   r   r   Ú	atCharset   r   zCSSBuilderAbstract.atCharsetc                 C   r   r   r   )r   Úimport_ÚmediumsÚ	cssParserr   r   r   ÚatImport‘   r   zCSSBuilderAbstract.atImportc                 C   r   r   r   )r   r=   Úurir   r   r   ÚatNamespace•   r   zCSSBuilderAbstract.atNamespacec                 C   r   r   r   )r   rA   r<   r   r   r   ÚatMedia™   r   zCSSBuilderAbstract.atMediac                 C   r   r   r   )r   ÚpageÚ
pseudopager8   r   r   r   ÚatPage   r   zCSSBuilderAbstract.atPagec                 C   r   r   r   r7   r   r   r   Ú
atFontFace¡   r   zCSSBuilderAbstract.atFontFacec                 C   s   |t fS ©N)ÚNotImplemented)r   ÚatIdentrB   r	   r   r   r   rM   ¥   r   zCSSBuilderAbstract.atIdentc                 C   r   ©z/Return value must implement CSSSelectorAbstractr   r   )r   Ú	selectorAÚcombinerÚ	selectorBr   r   r   ÚcombineSelectors«   ó   z#CSSBuilderAbstract.combineSelectorsc                 C   r   rN   r   r#   r   r   r   Úselector°   rS   zCSSBuilderAbstract.selectorFc                 C   r   r   r   )r   r$   r'   Ú	importantr   r   r   Úproperty·   r   zCSSBuilderAbstract.propertyc                 C   r   r   r   )r   ÚtermArP   ÚtermBr   r   r   ÚcombineTerms»   r   zCSSBuilderAbstract.combineTermsc                 C   r   r   r   ©r   r'   r   r   r   Ú	termIdent¿   r   zCSSBuilderAbstract.termIdentNc                 C   r   r   r   )r   r'   Úunitsr   r   r   Ú
termNumberÃ   r   zCSSBuilderAbstract.termNumberc                 C   r   r   r   rZ   r   r   r   ÚtermRGBÇ   r   zCSSBuilderAbstract.termRGBc                 C   r   r   r   rZ   r   r   r   ÚtermURIË   r   zCSSBuilderAbstract.termURIc                 C   r   r   r   rZ   r   r   r   Ú
termStringÏ   r   zCSSBuilderAbstract.termStringc                 C   r   r   r   rZ   r   r   r   ÚtermUnicodeRangeÓ   r   z#CSSBuilderAbstract.termUnicodeRangec                 C   r   r   r   r&   r   r   r   ÚtermFunction×   r   zCSSBuilderAbstract.termFunctionc                 C   r   r   r   ©r   r	   r   r   r   ÚtermUnknownÛ   r   zCSSBuilderAbstract.termUnknown©FrK   ) r)   r*   r+   r,   r0   r2   r4   r5   r6   r9   r:   r<   r>   r?   rC   rE   rF   rI   rJ   rM   rR   rT   rV   rY   r[   r]   r^   r_   r`   ra   rb   rd   r   r   r   r   r-   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	   ri   r   r   r   rh   ì   s   

ýzCSSParseError.__init__c                 C   sj   | j r%t | ¡d t| j d | j… ƒ d t| j | j| jd … ƒ d S t | ¡d t| jd d… ƒ S )Nz:: (z, é   ú)z:: é(   )ri   rg   Ú__str__Úreprrk   r	   r1   r   r   r   rp   ö   s   &ÿÿ zCSSParseError.__str__c                 C   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Ústrr9   rj   r	   Ú
srcFullIdxri   ÚctxsrcFullIdx)r   rr   r9   r   r   r   ÚsetFullCSSSourceþ   s   

úzCSSParseError.setFullCSSSourcerK   re   )r)   r*   r+   r	   ri   rr   r9   rk   rv   rw   rh   rp   rx   r   r   r   r   rf   â   s    

rf   c                   @   sT  e Zd ZdZeZg d¢ZdZddgZdZ		 dd	„ Z
ejejB ejB Zd
ZdZde Ze
edƒZe
deeƒZe
deeƒZdeef Ze ee¡ZdZe ee¡ZdZdZe
eeƒZe ee¡Zdedd… f Ze ee¡Z dedd… f Z!e e!e¡Z"de Z#e e#e¡Z$de Z%e e%e¡Z&dee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<>)ú#Ú.ú[ú:ú+ú>)ú/r   ú,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 rK   )ÚsetCSSBuilder©r   Ú
cssBuilderr   r   r   rh   ‘  r   zCSSParser.__init__c                 C   s   | j S )ú3A concrete instance implementing CSSBuilderAbstract©Ú_cssBuilderr1   r   r   r   ÚgetCSSBuilder—  s   zCSSParser.getCSSBuilderc                 C   s
   || _ dS )r‹   NrŒ   r‰   r   r   r   rˆ   œ  s   
zCSSParser.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   ÚsrcFileÚfile_handlerÚ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Š   r2   r   Ú
cleanupCSSÚ_parseStylesheetÚ
ParseErrorrx   r5   )r   r	   r4   Úerrr   r   r   r’   °  s   


€þÿ
ÿzCSSParser.parsec              
   C   sz   | j  ¡  z1z| j| ¡ dd\}}W n | jy( } z|j|dd ‚ d}~ww | j  |¡}W | j  ¡  |S | j  ¡  w )zrParses CSS inline source string using the current cssBuilder.
        Use to parse a tag's 'sytle'-like attribute.F©ÚbracesT©r9   N)rŠ   r6   Ú_parseDeclarationGroupÚstripr™   rx   r9   r:   )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Š   r6   ÚitemsÚ_parseDeclarationPropertyrŸ   Úappendr™   rx   r9   r:   )	r   Ú
attributesÚ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   )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)rs   rt   ÚdecodeÚ
re_commentr   Ú_parseAtCharsetÚ_parseSCDOCDCÚ_parseAtImportsÚ_parseAtNamespaceÚ
startswithÚ_parseAtKeywordrL   ÚextendÚ_parseRulesetr¦   rŠ   r4   )r   r	   ÚstylesheetImportsÚstylesheetElementsÚ	atResultsr<   r4   r   r   r   r˜     s(   




€

ôzCSSParser._parseStylesheetc                 C   sB   	 |  ¡ }| d¡r|dd… }n| d¡r|dd… }n	 |S q)z[S|CDO|CDC]*r   z<!--é   Nz-->é   )Úlstripr¶   rc   r   r   r   r³   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™   ri   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n|dus.|sUdg}|dd… dkrd|  d||¡‚|dd…  ¡ }| j ||| ¡}|dur}| |¡ |  	|¡}t |dƒs||fS )	z[ import [S|CDO|CDC]* ]*ÚimportNzImport expecting string or urlr   r‚   ÚallrÀ   z"@import expected a terminating ';')
r   r   Ú_getStringOrURIr™   Ú	_getIdentr¿   r¦   rŠ   rC   r³   )r   r	   r¡   ri   r@   rA   Úmediumr4   r   r   r   r´   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Š   rE   )r   r	   ri   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]ÚmediarG   z	font-facerÂ   Úframer¯   zUnknown state in atKeyword)	r   Ú_parseAtMediaÚ_parseAtPageÚ_parseAtFontFacer´   Ú_parseAtFramer¶   Ú_parseAtIdentr™   )r   r	   ri   r¡   r   r   r   r·   “  s(   

ó
õ

ø
ú
üÿzCSSParser._parseAtKeywordc                 C   s’  |}|t dƒd…  ¡ }g }|r`|d dkr`|  |¡\}}|dv r@|du r*| d¡ t d¡}t ||¡}|| ¡ d d… }n | |¡ |d d	krT|dd…  ¡ }n| ¡ }|r`|d dks| d¡sl|  	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   Úcompiler   Úendr¶   r™   r·   r¸   r¹   rŠ   rF   )r   r	   ri   rA   rÆ   Úpatternr   r»   r¼   r<   r¡   r   r   r   rÊ   ¨  sH   


ð


€
ö
zCSSParser._parseAtMediac                 C   s¢  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   r~   Ú_rÏ   rÑ   rÒ   r¯   r›   Ú*r   z-pdf-frame-borderz-pdf-page-sizeÚsizer   TÚportraitzUnknown size value for @pageé   )rÓ   r¿   rÅ   r¶   r™   r·   r¸   rž   rŠ   r<   rT   Úvaluesrg   ÚpopitemÚgetÚ	xhtml2pdfÚdefaultÚPML_PAGESIZESru   ÚlowerÚcÚpageSizeÚ
isinstanceÚlistÚtupler¦   r   ÚRuntimeErrorr   rI   )r   r	   ÚdataÚ
pageBorderÚisLandscaperi   rG   rH   r»   r    r¼   Únpropertiesr¡   rÙ   ÚsizeListr'   Ú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Š   ÚatFrame)r   r	   Úboxr    r¡   r   r   r   rÍ   =  s
   zCSSParser._parseAtFramec                 C   s8   |t dƒd …  ¡ }|  |¡\}}| j |¡g}||fS )Nz
@font-face)rÓ   r¿   rž   rŠ   rJ   )r   r	   r    r¡   r   r   r   rÌ   H  s   zCSSParser._parseAtFontFacec           	      C   s   |}|   |dd … ¡\}}|d u r|  d||¡‚| j || |¡\}}|tu rŠ| d¡}|dk r1d }|d |…  d¡}|dk r@d }|d urS||k rS||d d …  ¡ }n7|d u r^|dd… }n,|d urƒ||d … }z	|  |¡\}}W n | jy‚   |  |¡\}}Y nw |  	d||¡‚| ¡ |fS )Nr   z+At-rule expected an identifier for the rulerÀ   r   rÏ   r‡   zUnable to ignore @-rule block)
rÅ   r™   rŠ   rM   rL   rj   r¿   rž   r˜   ÚParserError)	r   r	   ri   rM   r¡   ÚsemiIdxÚblockIdxr8   r4   r   r   r   rÎ   O  s2   
þzCSSParser._parseAtIdentc                 C   s6   |   |¡\}}|  | ¡ ¡\}}| j ||¡}||fS )z€ruleset
        : selector [ ',' S* selector ]*
            '{' S* declaration [ ';' S* declaration ]* '}' S*
        ;
        )Ú_parseSelectorGrouprž   r¿   rŠ   r<   )r   r	   r;   r    r¡   r   r   r   r¹   x  s   zCSSParser._parseRulesetc                 C   sp   g }|d d… dvr4|   |¡\}}|d u r	 ||fS | |¡ | d¡r,|dd …  ¡ }|d d… dvs
||fS )Nr   )rÏ   rÒ   ú]ú(rn   rÀ   r   r‚   )Ú_parseSelectorr¦   r¶   r¿   )r   r	   r;   rT   r   r   r   rô   †  s   
ý
úzCSSParser._parseSelectorGroupc                 C   sê   |   |¡\}}t|ƒ}|dd… dvro| jD ]}| |¡r)|t|ƒd…  ¡ } nqd}|   |¡\}}t|ƒ|kr_|dd… }|rY|dd… dvrY|dd… }|rY|dd… dvsI| ¡ dfS | j |||¡}|dd… dvs| ¡ |fS )zUselector
        : simple_selector [ combinator simple_selector ]*
        ;
        Nr   )	r   r‚   rÀ   rÏ   rÒ   r}   rõ   rö   rn   ú )Ú_parseSimpleSelectorrÓ   ÚSelectorCombinersr¶   r¿   rŠ   rR   )r   r	   rT   ÚsrcLenrP   rQ   r   r   r   r÷   ’  s&   

þÿðzCSSParser._parseSelectorc                 C   s0  |  ¡ }|  | j|¡\}}|  | j|¡\}}|rn|dd… | jv r%d}n|  d||¡‚| j ||¡}| j |¡}|r’|dd… | jv r’|  | j	|¡\}}|durW| 
|¡ q9|  | j|¡\}}|durj| |¡ q9| d¡rx|  ||¡\}}n| d¡r†|  ||¡\}}nn|r’|dd… | jv sD|  ¡ |fS )zysimple_selector
        : [ namespace_selector ]? element_name? [ HASH | class | attrib | pseudo ]* S*
        ;
        Nr   rØ   z#Selector name or qualifier expectedr}   r~   )r¿   Ú_getMatchResultÚre_namespace_selectorÚre_element_nameÚSelectorQualifiersr™   rŠ   r>   rT   Úre_hashr   Úre_classr   r¶   Ú_parseSelectorAttributeÚ_parseSelectorPseudo)r   r	   ri   r=   r$   rT   Úhash_r   r   r   r   rù   ®  s4   



ðzCSSParser._parseSimpleSelectorc                 C   sF  |}|  d¡s|  d||¡‚|dd…  ¡ }|  | j|¡\}}|  |¡\}}| ¡ }|du r5|  d||¡‚|dur@| j ||¡}| jD ]	}|  |¡rL nqCd}|t	|ƒd…  ¡ }|ry|  |¡\}}|du rx|  
|¡\}}|du rx|  d||¡‚nd}|  d¡s‡|  d	||¡‚|dd… }|rš| |||¡ ||fS | |¡ ||fS )
z˜attrib
        : '[' S* [ namespace_selector ]? IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
            [ IDENT | STRING ] S* ]? ']'
        ;
        r}   z(Selector Attribute opening '[' not foundr   Nz"Expected a selector attribute namer   z#Expected a selector attribute valuerõ   z(Selector Attribute closing ']' not found)r¶   r™   r¿   rü   rý   rÅ   rŠ   r>   ÚAttributeOperatorsrÓ   rÁ   r"   r   )r   r	   rT   ri   r=   r   r    r!   r   r   r   r  Ô  sB   


ÿ€

ÿz!CSSParser._parseSelectorAttributec                 C   sÌ   |}|  d¡s|  d||¡‚t d|tjtjB ¡ d¡}|  |¡\}}|s,|  d||¡‚|  d¡r]|dd…  ¡ }|  	|d¡\}}|  d	¡sM|  d
||¡‚|dd… }| 
||¡ ||fS | |¡ ||fS )z<pseudo
        : ':' [ IDENT | function ]
        ;
        r~   zSelector Pseudo ':' not foundz^:{1,2}(.*)r   z$Selector Pseudo identifier not foundrö   NTrn   z.Selector Pseudo Function closing ')' not found)r¶   r™   r   ÚsearchÚMÚSÚgrouprÅ   r¿   Ú_parseExpressionr(   r%   )r   r	   rT   ri   r$   Útermr   r   r   r    s"   



þzCSSParser._parseSelectorPseudoc                 C   s   |}|  d¡r|dd … d}}n	|r|  d||¡‚g }| ¡ }|d d… dvrf|  |¡\}}|  d¡r=d|dd …  }q |d u rJ|dd …  ¡ }n| |¡ |  d¡r]|dd …  ¡ }nn|d d… dvs(|rz|  d	¡st|  d
||¡‚|dd … }| ¡ |fS )NrÏ   r   Tz'Declaration group opening '{' not found)	r   r‚   rÏ   rÒ   r}   rõ   rö   rn   r¯   rØ   z	-nothing-rÀ   rÒ   z'Declaration group closing '}' not found)r¶   r™   r¿   Ú_parseDeclarationr¦   )r   r	   rœ   ri   r    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   )r~   rz   )rÅ   r¿   r¥   )r   r	   r©   rª   r   r   r   r  E  s   þzCSSParser._parseDeclarationc                 C   s@   |   |¡\}}|  | j|¡\}}| ¡ }| j |||¡}||fS rK   )r
  rü   Úre_importantr¿   rŠ   rV   )r   r	   r©   ÚexprrU   rª   r   r   r   r¥   ^  s
   z#CSSParser._parseDeclarationPropertyFc                 C   s¸   |   |¡\}}d}|dd… dvrF| jD ]}| |¡r%|t|ƒd… } nqd}|   | ¡ ¡\}}|tu r6n| j |||¡}|dd… dvs|du rX|rX| j |dd¡}||fS ||fS )zB
        expr
        : term [ operator term ]*
        ;
        Nr   )r   rÀ   rÏ   rÒ   r}   rõ   rn   rø   )Ú_parseExpressionTermÚExpressionOperatorsr¶   rÓ   r¿   rL   rŠ   rY   )r   r	   Ú
returnListr  ÚoperatorÚterm2r   r   r   r
  j  s$   

þõzCSSParser._parseExpressionc                 C   sB  |}|   | j|¡\}}|dur%|   | j|¡\}}| j ||¡}| ¡ |fS |  || j¡\}}|dur>| j |¡}| ¡ |fS |  |¡\}}|durU| j 	|¡}| ¡ |fS |   | j
|¡\}}|durŠ|  |d¡\}}|d dkrw|  d||¡‚|dd…  ¡ }| j ||¡}||fS |   | j|¡\}}|dur£| j |¡}| ¡ |fS |   | j|¡\}}|dur¼| j |¡}| ¡ |fS |   | j|¡\}}|  |¡\}}|durç|durÛ| j ||¡}| j |¡}| ¡ |fS |   | j|¡\}}|dur| j |¡}| ¡ |fS |   | j|¡\}}|dur| j 	|¡}| ¡ |fS | j |¡S )zýterm
        : unary_operator?
            [ NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* | ANGLE S* |
            TIME S* | FREQ S* | function ]
        | STRING S* | IDENT S* | URI S* | RGB S* | UNICODERANGE S* | hexcolor
        ;
        NTr   rn   z1Terminal function expression expected closing ')'r   )rü   Úre_numÚre_unitrŠ   r]   r¿   rÁ   Úre_urir_   r`   Úre_functiontermr
  r™   rb   Úre_rgbcolorr^   Úre_unicoderangera   rý   rÅ   r>   r[   Úre_unicodeidÚre_unicodestrrd   )r   r	   ri   r¡   r\   r  Úparamsr=   r   r   r   r  †  s\   

zCSSParser._parseExpressionTermc                 C   s   |   | j||¡S rK   )rü   Úre_ident)r   r	   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   Úgroupsrg   rÕ   )r   r	   Úrexpressionrà   r¡   Ústrresr   r   r   rÁ   Ï  s   
ÿzCSSParser._getStringc                 C   s0   |   || j¡\}}|d u r|   |¡\}}||fS rK   )rÁ   r  )r   r	   r¡   r   r   r   rÄ   á  s   zCSSParser._getStringOrURIc                 C   s0   |  |¡}|r| |¡|| ¡ d … fS ||fS rK   )r   r	  rÕ   )r   r   r	   rà   r	  r¡   r   r   r   rü   è  s   
zCSSParser._getMatchResultrK   )Tre   )NN)Nr   )fr)   r*   r+   r,   rf   r™   r  rÿ   rú   r  Ú_orRuler   ÚIr  ÚUÚ_reflagsÚi_hexÚ
i_nonasciiÚ	i_unicodeÚi_escapeÚ	i_nmstartÚi_nmcharÚi_identrÔ   r  Úi_unicodeidr  Úi_unicodestr1Úi_unicodestr2Úi_unicodestrr  Úi_element_namerþ   Úi_namespace_selectorrý   Úi_classr  Úi_hashr   Ú
i_rgbcolorr  Úi_nlÚi_escape_nlÚi_string_contentÚ	i_string1Ú	i_string2Úi_stringr  Úi_urir  Úi_numr  Úi_unitr  Ú
i_functionÚre_functionÚi_functiontermr  Úi_unicoderange1Úi_unicoderange2Úi_unicoderanger  Ú	i_commentr±   Úi_importantr  rh   rŽ   rˆ   rV   rŠ   r–   r’   r¢   r«   r®   r˜   r³   r²   r´   rµ   r·   rÊ   rË   rÍ   rÌ   rÎ   r¹   rô   r÷   rù   r  r  rž   r  r¥   r
  r  rÅ   rÁ   rÄ   rü   r   r   r   r   ry     sÆ    4
ÿ

ÿ

	
-%!:[)&1
"

E
ry   )Úreportlab.lib.pagesizesr   Úxhtml2pdf.defaultrß   Úxhtml2pdf.utilr   Úfuture_builtinsr   ÚImportErrorr   r   r   r   r   Úobjectr   r-   rg   rf   ry   r   r   r   r   Ú<module>   s$   
ÿ" 	,