
     hΦ                         d dl mZ d dlZd dlmZ 	 d dlmZ n# e$ r Y nw xY w	 d dl	Z	ddl
mZ d Zd Z G d	 d
e          Z G d de          Z G d de          Z G d de          ZdS )    )	landscapeN)getSize)filter   )
cssSpecialc                 8    t          j        d|z   dz   |           S )Nz^@z\s*)rematch)srcidents     S/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/xhtml2pdf/w3c/cssParser.pyisAtRuleIdentr   0   s    8EEMF*C000    c                 .    t          j        dd|           S )Nz^@[a-z\-]+\s* )r	   sub)r   s    r   stripAtRuleIdentr   4   s    6"B,,,r   c                   6    e Zd ZdZd Zd Zd Zd Zd Z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                      t          d          NSubclass responsibilityNotImplementedError)selfhashIds     r   	addHashIdzCSSSelectorAbstract.addHashIdB       !";<<<r   c                      t          d          r   r   )r   class_s     r   addClasszCSSSelectorAbstract.addClassF   r   r   c                      t          d          r   r   )r   attrNames     r   addAttributez CSSSelectorAbstract.addAttributeJ   r   r   c                      t          d          r   r   )r   r#   op	attrValues       r   addAttributeOperationz)CSSSelectorAbstract.addAttributeOperationN   r   r   c                      t          d          r   r   r   names     r   	addPseudozCSSSelectorAbstract.addPseudoR   r   r   c                      t          d          r   r   r   r+   values      r   addPseudoFunctionz%CSSSelectorAbstract.addPseudoFunctionV   r   r   N)
__name__
__module____qualname____doc__r   r!   r$   r(   r,   r0    r   r   r   r   8   sx         = = == = == = == = == = == = = = =r   r   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd dZd Zd Zd!dZd Zd Zd Zd Zd Zd ZdS )"CSSBuilderAbstractzOutlines 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                      t          d          r   r   r   charsets     r   
setCharsetzCSSBuilderAbstract.setCharsetc   r   r   c                      t          d          r   r   r   s    r   beginStylesheetz"CSSBuilderAbstract.beginStylesheeti   r   r   c                      t          d          r   r   )r   elementss     r   
stylesheetzCSSBuilderAbstract.stylesheetm   r   r   c                      t          d          r   r   r=   s    r   endStylesheetz CSSBuilderAbstract.endStylesheetq   r   r   c                      t          d          r   r   r=   s    r   beginInlinezCSSBuilderAbstract.beginInlineu   r   r   c                      t          d          r   r   r   declarationss     r   inlinezCSSBuilderAbstract.inliney   r   r   c                      t          d          r   r   r=   s    r   	endInlinezCSSBuilderAbstract.endInline}   r   r   c                      t          d          r   r   )r   	selectorsrH   s      r   rulesetzCSSBuilderAbstract.ruleset   r   r   c                      t          d          r   r   )r   nsPrefixr+   s      r   resolveNamespacePrefixz)CSSBuilderAbstract.resolveNamespacePrefix   r   r   c                      t          d          r   r   r9   s     r   	atCharsetzCSSBuilderAbstract.atCharset   r   r   c                      t          d          r   r   )r   import_mediums	cssParsers       r   atImportzCSSBuilderAbstract.atImport   r   r   c                      t          d          r   r   )r   rP   uris      r   atNamespacezCSSBuilderAbstract.atNamespace   r   r   c                      t          d          r   r   )r   rV   rN   s      r   atMediazCSSBuilderAbstract.atMedia   r   r   c                      t          d          r   r   )r   page
pseudopagerH   s       r   atPagezCSSBuilderAbstract.atPage   r   r   c                      t          d          r   r   rG   s     r   
atFontFacezCSSBuilderAbstract.atFontFace   r   r   c                     |t           fS N)NotImplemented)r   atIdentrW   r   s       r   rg   zCSSBuilderAbstract.atIdent   s    N""r   c                      t          d          z/Return value must implement CSSSelectorAbstractr   r   )r   	selectorAcombiner	selectorBs       r   combineSelectorsz#CSSBuilderAbstract.combineSelectors       !";<<<r   c                      t          d          ri   r   r*   s     r   selectorzCSSBuilderAbstract.selector   rn   r   Fc                      t          d          r   r   )r   r+   r/   	importants       r   propertyzCSSBuilderAbstract.property   r   r   c                      t          d          r   r   )r   termArk   termBs       r   combineTermszCSSBuilderAbstract.combineTerms   r   r   c                      t          d          r   r   r   r/   s     r   	termIdentzCSSBuilderAbstract.termIdent   r   r   Nc                      t          d          r   r   )r   r/   unitss      r   
termNumberzCSSBuilderAbstract.termNumber   r   r   c                      t          d          r   r   ry   s     r   termRGBzCSSBuilderAbstract.termRGB   r   r   c                      t          d          r   r   ry   s     r   termURIzCSSBuilderAbstract.termURI   r   r   c                      t          d          r   r   ry   s     r   
termStringzCSSBuilderAbstract.termString   r   r   c                      t          d          r   r   ry   s     r   termUnicodeRangez#CSSBuilderAbstract.termUnicodeRange   r   r   c                      t          d          r   r   r.   s      r   termFunctionzCSSBuilderAbstract.termFunction   r   r   c                      t          d          r   r   r   r   s     r   termUnknownzCSSBuilderAbstract.termUnknown   r   r   Fre   ) r1   r2   r3   r4   r;   r>   rA   rC   rE   rI   rK   rN   rQ   rS   rX   r[   r]   ra   rc   rg   rm   rp   rs   rw   rz   r}   r   r   r   r   r   r   r5   r   r   r7   r7   Z   s        = = == = == = == = == = == = == = == = == = == = == = == = == = == = == = =# # #= = =
= = == = = == = == = == = = == = == = == = == = == = == = = = =r   r7   c                   @    e Zd ZdZdZdZdZdZdZdZ	ddZ
d ZddZdS )CSSParseErrorNFc                     t                               | |           || _        |p|| _        | j        r3| j                            | j                  | _        | j        dk     r| `d S d S d S )Nr   )	Exception__init__r   ctxsrcfind	srcCtxIdx)r   msgr   r   s       r   r   zCSSParseError.__init__   ss    4%%%m; 	#![--dh77DN~!!NNN	# 	#!!r   c                 b   | j         rot                              |           dz   t          | j         d | j                           z   dz   t          | j         | j        | j        dz                      z   dz   S t                              |           dz   t          | j        d d                   z   S )Nz:: (z,    )z:: (   )r   r   __str__reprr   r   r=   s    r   r   zCSSParseError.__str__   s    ; 	I$$T**V3d4;;W6X6XX[__bfDN4>B+>>?cA cA ACFG G $$T**U2T$(3B3-5H5HHHr   c                 n   || _         t          | j                   t          k    rt          | j         d          | _         |r|| _        | j         rd| j                             | j                  | _        | j        dk     r| `| j                             | j                  | _	        | j	        dk     r| `	d S d S d S )Nzutf-8r   )
fullsrctypebytesstrrI   r   r   
srcFullIdxr   ctxsrcFullIdx)r   r   rI   s      r   setFullCSSSourcezCSSParseError.setFullCSSSource   s    &&t|W55DL 	! DK< 	'"l//99DO""O!%!2!24;!?!?D!A%%&&&	' 	'
 &%r   re   r   )r1   r2   r3   r   r   r   rI   r   r   r   r   r   r   r5   r   r   r   r      sq        
CFGFIJM# # # #I I I' ' ' ' ' 'r   r   c                   T   e Zd ZdZeZg dZdZddgZdZ		 d Z
ej        ej        z  ej        z  Zd	Zd
Zdez  Z e
ed          Z e
dee          Z e
dee          ZdededZ ej        ee          ZdZ ej        ee          ZdZdZ e
ee          Z ej        ee          Zdedd         dZ ej        ee          Z dedd         dZ! ej        e!e          Z"dez   Z# ej        e#e          Z$dez  Z% ej        e%e          Z&dedededZ' ej        e'e          Z(dZ)d e)z  Z* e
d!e*ee          Z+d"e+z  Z,d#e+z  Z- e
e,e-          Z. ej        e.e          Z/d$e.d% e
d&ee          d'Z0 ej        e0e          Z1d(Z2 ej        e2e          Z3d)ez  Z4 ej        e4e          Z5ed*z   Z6 ej        e6e          Z7d+e6z   Z8 ej        e8e          Z9d,ed-ed.Z:d/Z;e:Z< ej        e<e          Z=d0Z> ej        e>e          Z?d1Z@ ej        e@e          ZA[
dVd3ZBd4 ZCd5 ZD eEeCeD          ZFd6 ZGd7 ZHd8 ZIdVd9ZJd: ZKd; ZLd< ZMd= ZNd> ZOd? ZPd@ ZQdA ZRdB ZSdC ZTdD ZUdE ZVdF ZWdG ZXdH ZYdI ZZdJ Z[dK Z\dWdLZ]dM Z^dN Z_dXdPZ`dQ ZadVdRZbdYdSZcdT ZddZdUZed2S )[	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                  ,    d                     |           S )N|)join)argss    r   <lambda>zCSSParser.<lambda>O  s     r   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((?:z)(?:z)*)z([^\u0000-\u007f]+)z(\'[^\u0000-\u007f]+\')z(\"[^\u0000-\u007f]+\")r   z)|\*)z)|\*|)\|(?!=)z\.z
#((?:%s)+)z(#z{8}|#z{6}|#z{3})z
|
||z\\(?:%s)z[	 !#$%&(-~]z"((?:%s|')*)"z'((?:%s|")*)'zurl\(\s*(?:(?:z)|((?:z
[!#$%&*-~]z	)+))\s*\)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)Nc                 0    |                      |           d S re   )setCSSBuilderr   
cssBuilders     r   r   zCSSParser.__init__  s    :&&&&&r   c                     | j         S )3A concrete instance implementing CSSBuilderAbstract_cssBuilderr=   s    r   getCSSBuilderzCSSParser.getCSSBuilder  s    r   c                     || _         dS )r   Nr   r   s     r   r   zCSSParser.setCSSBuilder  s    %r   c                     t          |d          5 }|                                }ddd           n# 1 swxY 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_contents       r   	parseFilezCSSParser.parseFile  s     '3 	/<',,..L	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ zz,'''s   266c                 X   | j                                          	 t          j        |          }	 |                     |          \  }}n(# | j        $ r}|                    |            d}~ww xY w	 | j                                          n# | j                                          w xY w|S )z\Parses CSS string source using the current cssBuilder.
        Use for embedded stylesheets.N)r   r>   r   
cleanupCSS_parseStylesheet
ParseErrorr   rC   )r   r   rA   errs       r   r   zCSSParser.parse  s     	'')))	, ',,C"&"7"7"<"<ZZ?   $$S)))  
 O))++++DO))++++s.   B A	 B 	
A.A))A..B B'c                    | j                                          	 	 |                     |                                d          \  }}n*# | j        $ r}|                    |d            d}~ww xY w| j                             |          }| j                                          n# | j                                          w xY w|S )zrParses CSS inline source string using the current cssBuilder.
        Use to parse a tag's 'sytle'-like attribute.FbracesTrI   N)r   rE   _parseDeclarationGroupstripr   r   rI   rK   )r   r   
propertiesr   results        r   parseInlinezCSSParser.parseInline  s     	##%%%		("&"="=ciikkRW"="X"XZZ?   $$S$666 _++J77FO%%''''DO%%''''s)   ,A	 B' 	
A0A++A00B' 'Cc                 (   ||ni }|r|                     |           | j                                         	 g }	 |                                D ]E\  }}|                     |                                |          \  }}|                    |           Fn*# | j        $ r}|                    |d            d}~ww xY w| j        	                    |          }| j        
                                 n# | j        
                                 w xY w|S )zParses 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   rE   items_parseDeclarationPropertyr   appendr   r   rI   rK   )	r   
attributeskwAttributesr   propertyNamer   single_propertyr   r   s	            r   parseAttributeszCSSParser.parseAttributes  s<    $.#9ZZr
 	,
+++##%%%	(J)5););)=)= 7 7%L#+/+I+I#))++Wc+d+d(C%%o66667 ?   $$S$666 _++J77FO%%''''DO%%''''s/   C4 AB C4 
B= B88B==C4 4Dc                 z    |                      |          }d|d         v r|d         d         S |d         d         S )zParse 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'   resultss      r   parseSingleAttrzCSSParser.parseSingleAttr  sG     &&I&66WQZ1:f%%1:f%%r   c                    t          |          t          k    r|                                }| j                            d|          }|                     |          }|                     |          }|                     |          \  }}|                     |          }g }|r|	                    d          r;| 
                    |          \  }}| |t          k    r|                    |           n-|                     |          \  }}|                    |           |                     |          }|| j                            ||          }||fS )zstylesheet
        : [ CHARSET_SYM S* STRING S* ';' ]?
            [S|CDO|CDC]* [ import [S|CDO|CDC]* ]*
            [ [ ruleset | media | page | font_face ] [S|CDO|CDC]* ]*
        ;
        r   @)r   r   decode
re_commentr   _parseAtCharset_parseSCDOCDC_parseAtImports_parseAtNamespace
startswith_parseAtKeywordrf   extend_parseRulesetr   r   rA   )r   r   stylesheetImportsstylesheetElements	atResultsrN   rA   s          r   r   zCSSParser._parseStylesheet  sb    99

Co!!"c** ""3''   %%!%!5!5c!:!: $$S))  	*~~c"" 3!%!5!5c!:!:Y(Y.-H-H&--i888  $11#66W"))'222 $$S))C  	* _//0BDUVV
Jr   c                     	 |                                 }|                    d          r|dd         }n!|                    d          r|dd         }nnV|S )z[S|CDO|CDC]*r   z<!--   Nz-->   )lstripr   r   s     r   r   zCSSParser._parseSCDOCDC0  si    	**,,C~~f%% !""g&& !""g	 
r   c                 \   t          |d          rt          |          }|                     |          \  }}|                                }|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   r   r   rS   )r   r   r:   s      r   r   zCSSParser._parseAtCharset?  s    i(( 	/"3''C??3//LGS**,,C2A2w#~~oo&MsTXT_```abb'..""CO%%g...
r   c                    g }t          |d          rj|}t          |          }|                     |          \  }}||                     d||          g }|                     |                                          \  }}|[|                    |           |dd         dk    r5|dd                                         }|                     |          \  }}nn|[|sdg}|dd         dk    r|                     d||          |dd                                         }| j                            |||           }||                    |           | 	                    |          }t          |d          j||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   rX   r   )r   r   r   r   rU   rV   mediumrA   s           r   r   zCSSParser._parseAtImportsM  s   C** 	*F"3''C//44LGSoo&FVTTTG..66KFC$v&&&rr7c>>abb'..**C"&.."5"5KFCC $  " '2A2w#~~oo&LcSYZZZabb'..""C11'7DIIJ%j)))$$S))C= C** 	*> F{r   c                    |                      |          }t          |d          r8|}t          |          }|                     |          \  }}|u|                     |          \  }}||                     d||          |                     |                                          \  }}||                     d||          nd}|                                }|dd         dk    r|                     d||          |dd                                         }| j                            ||           |                      |          }t          |d          8|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   rP   s        r   r   zCSSParser._parseAtNamespacer  sh      %%C-- 	*F"3''C!11#66NIs  $s 3 3##//*VX[]cddd!%!5!5cjjll!C!C	3$//*EsFSSS %  **,,C2A2w#~~oo&OQTV\]]]abb'..""CO'')<<<$$S))C- C-- 	*. 
r   c                 2   |}t          |d          r|                     |          \  }}nt          |d          r|                     |          \  }}nt          |d          r|                     |          \  }}nt          |d          r|                     |          \  }}nnt          |d          r|                     |          \  }}nE|                    d          r|                     |          \  }}n|                     d||          ||fS )z,[media | page | font_face | unknown_keyword]mediar_   z	font-facer   framer   zUnknown state in atKeyword)	r   _parseAtMedia_parseAtPage_parseAtFontFacer   _parseAtFramer   _parseAtIdentr   )r   r   r   r   s       r   r   zCSSParser._parseAtKeyword  s2   g&& 	M,,S11KC3'' 	M++C00KC3,, 
	M//44KC3)) 	M..s33KC3(( 	M,,S11KC^^C   	M,,S11KC//">VLLLF{r   c                    |}|t          d          d                                         }g }|r|d         dk    r|                     |          \  }}|dv rk||                    d           t	          j        dt          j                  }t	          j        ||          }||                                dz
  d         }n`|                    |           |d         d	k    r|dd                                         }n|                                }|r|d         dk    |	                    d          s| 
                    d
||          |dd                                         }g }|r|	                    d          s|	                    d          r0|                     |          \  }}||                    |           n-|                     |          \  }}	|                    |	           |                                }|r|	                    d          |	                    d          s| 
                    d||          |dd                                         }| j                            ||          }
||
fS )z`media
        : MEDIA_SYM S* medium [ ',' S* medium ]* '{' S* ruleset* '}' S*
        ;
        z@media Nr   {)Nandr   z.*?[{]r   r   Ruleset opening '{' not found}r   zRuleset closing '}' not found)lenr   r   r   r	   compileDOTALLr
   endr   r   r   r   r   r   r]   )r   r   r   rV   r   patternr
   r   r   rN   r   s              r   r  zCSSParser._parseAtMedia  s   
 #i..//"))++ 	#c!fmm..--KFC&&>NN5)))*Xry99 #..%))++a-..)NN6"""1v}}!""gnn&&jjll%  	#c!fmm( ~~c"" 	R//"CS&QQQ!""gnn  
	#..-- 
	~~c"" 3!%!5!5c!:!:Y(&--i888  $11#66W"))'222**,,C  
	#..-- 
	 ~~c"" 	#//"CS&QQQabb'..""C((2DEEF{r   c                    i }d}d}|}|t          d          d                                         }|                     |          \  }}|dd         dk    r)|                     |dd                   \  }}|dz   |z   }nd}g }|                                }g }	|                    d          s|                     d||          |dd                                         }|r|                    d	          s|                    d
          r1|                     |          \  }}
|
|                    |
           nb|                     |                                d          \  }}|	|z  }	i }d}|	r| j        	                    | j        
                    d          g|	          }	 |d                                         d         }n0# t          $ r# |d                                         d         }Y nw xY w|                    dd          }d|v r^t          j        j                            t%          |d                                                   | j        j                  | j        _        d}d|v r&|d         }t-          |t.                    s|g}g }|D ]}t%          |                                          }t-          |t0                    r#|                    t5          |                     [|dk    rd}d|dk    rd}m|t          j        j        v r"t          j        j        |         | j        _        t7          d          t          |          dk    rt1          |          | j        _        |r#t9          | j        j                  | j        _        |                                }|r|                    d	          | j                            |||||          g}|dd                                         |fS )zpage
        : 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   rN   rp   valuesr   popitemget	xhtml2pdfdefaultPML_PAGESIZESr   lowercpageSize
isinstancelisttupler   r   RuntimeErrorr   ra   )r   r   data
pageBorderisLandscaper   r_   r`   r   r   r   npropertiesr   r  sizeListr/   valueStrs                    r   r  zCSSParser._parseAtPage  s    
#g,,-- ''))NN3''	crr7c>>"nnSW55OJ#:
*DDJ
  jjll
 ~~c"" 	#//"CS&QQQabb'..""C 3	#..-- 3	~~c"" 0E!%!5!5c!:!:Y(&--i888#'#>#>szz||TY#>#Z#Z [k)
 !
 E!_44do6N6Ns6S6S5TV`aaF6%ay//11!4$ 6 6 6%ay0022156!%*=t!D!DJ#t++&/&7&E&I&ID!123399;;TV_'N 'NDFO $T>><D%dD11 & $v!H!% O O#&u::#3#3#5#5%eU33 	O$OOGENN;;;;%44*.KK%33*/KK%):)HHH.7.?.Mh.WDFOO"./M"N"NN8}}))*///" E*3DFO*D*D**,,Cg  3	#..-- 3	j /((z4jYYZ122w~~''s   . G *G<;G<c                 <   |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   s        r   r  zCSSParser._parseAtFrame?  s     #i..//"))++>>#&&S55cjjllCCZ/))#z::;zz||V##r   c                     |t          d          d                                          }|                     |          \  }}| j                            |          g}||fS )Nz
@font-face)r  r   r   r   rc   )r   r   r   r   s       r   r  zCSSParser._parseAtFontFaceJ  s_    #l##$$%,,..55c::Z/,,Z889F{r   c                    |}|                      |dd                    \  }}||                     d||          | j                            || |          \  }}|t          u r|                    d          }|dk     rd }|d |                             d          }|dk     rd }|&||k     r ||dz   d                                          }nr||dd         }ne|L||d          }	 |                     |          \  }}n?# | j        $ r |                     |          \  }}Y nw xY 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   rg   rf   r   r   r   r   ParserError)	r   r   r   rg   r   semiIdxblockIdxrH   rA   s	            r   r  zCSSParser._parseAtIdentQ  s   ~~c!""g..?//"OQTV\]]]o--gtSAAV^## hhsmmG{{8G8}))#..H!||"w'9'9'A+,,'..00!"R%j%())nA(,(C(CC(H(H%C A A A&*&;&;C&@&@OCA &&'FVTTTzz||V##s   (D "D&%D&c                     |                      |          \  }}|                     |                                          \  }}| j                            ||          }||fS )zruleset
        : selector [ ',' S* selector ]*
            '{' S* declaration [ ';' S* declaration ]* '}' S*
        ;
        )_parseSelectorGroupr   r   r   rN   )r   r   rM   r   r   s        r   r   zCSSParser._parseRulesetz  s[     11#66Y55cjjllCCZ((J??F{r   c                     g }|d d         dvrm|                      |          \  }}|nR|                    |           |                    d          r|dd                                          }|d d         dvm||fS )Nr   )r
  r  ](r   r   r   r   )_parseSelectorr   r   r   )r   r   rM   rp   s       r   r5  zCSSParser._parseSelectorGroup  s    	"1"g??? //44MCX&&&~~c"" '!""gnn&& "1"g??? I~r   c                 ^   |                      |          \  }}t          |          }|dd         dvr| j        D ]B}|                    |          r+|t          |          d                                         } nCd}|                      |          \  }}t          |          |k    rF|dd         }|r$|dd         dvr|dd         }|r|dd         dv|                                dfS | j                            |||          }|dd         dv|                                |fS )zUselector
        : simple_selector [ combinator simple_selector ]*
        ;
        Nr   )	r   r   r   r
  r  r   r7  r8  r    )_parseSimpleSelectorr  SelectorCombinersr   r   r   rm   )r   r   rp   srcLenrk   rl   s         r   r9  zCSSParser._parseSelector  sd   
 11#66XS"1"gIII 2  >>(++ c(mmnn-4466CE !66s;;NC 3xx6!!!""g "s2A2w.ZZZabb'C  "s2A2w.ZZZzz||T))77(IVVH! "1"gIII$ zz||X%%r   c                 v   |                                 }|                     | j        |          \  }}|                     | j        |          \  }}|rn+|dd         | j        v rd}n|                     d||          | j                            ||          }| j                            |          }|r|dd         | j        v r|                     | j	        |          \  }}||
                    |           I|                     | j        |          \  }}||                    |           |                    d          r|                     ||          \  }}n0|                    d          r|                     ||          \  }}nn|r|dd         | j        v |                                 |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   rQ   rp   re_hashr   re_classr!   r   _parseSelectorAttribute_parseSelectorPseudo)r   r   r   rP   r+   rp   hash_r    s           r   r<  zCSSParser._parseSimpleSelector  s   
 ,,T-GMM#(()=sCC	c 	V!W///DD//"GfUUU55hEE?++D11 	c"1"g!888--dlC@@JE3 ""5)))..t}cBBKFC!!!&)))~~c""  $ < <S( K KXX$$  $ 9 9#x H HXX!  	c"1"g!888$ zz||X%%r   c                    |}|                     d          s|                     d||          |dd                                         }|                     | j        |          \  }}|                     |          \  }}|                                }||                     d||          || j                            ||          }| j        D ]}|                     |          r nd}|t          |          d                                         }|rL|                     |          \  }}|1| 
                    |          \  }}||                     d||          nd}|                     d          s|                     d	||          |dd         }|r|                    |||           n|                    |           ||fS )
zattrib
        : '[' 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 valuer7  z(Selector Attribute closing ']' not found)r   r   r   r@  rA  r   r   rQ   AttributeOperatorsr  r   r(   r$   )r   r   rp   r   rP   r#   r&   r'   s           r   rF  z!CSSParser._parseSelectorAttribute  s    ~~c"" 	]//"NPSU[\\\!""gnn,,T-GMM#s++#jjll//"FVTTT==hQQH) 	 	B~~b!!  B#b''((m""$$ 	!^^C00NIs !%!5!5	3$//*OQTV\]]]I~~c"" 	//"NPSU[\\\abb'C 	,**8RCCCC!!(+++H}r   c                    |}|                     d          s|                     d||          t          j        d|t          j        t          j        z                                d          }|                     |          \  }}|s|                     d||          |                     d          r|dd                                         }| 	                    |d          \  }}|                     d	          s|                     d
||          |dd         }|
                    ||           n|                    |           ||fS )z<pseudo
        : ':' [ IDENT | function ]
        ;
        r   zSelector Pseudo ':' not foundz^:{1,2}(.*)r   z$Selector Pseudo identifier not foundr8  NTr   z.Selector Pseudo Function closing ')' not found)r   r   r	   searchMSgroupr   r   _parseExpressionr0   r,   )r   r   rp   r   r+   terms         r   rG  zCSSParser._parseSelectorPseudo  sI   
 ~~c"" 	R//"CS&QQQisBD24K88>>qAANN3''	c 	W//"H#vVVV>># 		%abb'..""C--c488IC>>#&& goo&XZ]_efffabb'C&&tT2222t$$$H}r   c                    |}|                     d          r|dd          d}}n|r|                     d||          g }|                                }|d d         dvr|                     |          \  }}|                     d          rd|dd          z   }G||dd                                          }nT|                    |           |                     d          r|dd                                          }nn|d d         dv|r6|                     d	          s|                     d
||          |dd          }|                                |fS )Nr
  r   Tz'Declaration group opening '{' not found)	r   r   r
  r  r   r7  r8  r   r   r  z	-nothing-r   r  z'Declaration group closing '}' not found)r   r   r   _parseDeclarationr   )r   r   r   r   r   r   s         r   r   z CSSParser._parseDeclarationGroup%  s   >># 	\abb'4CC 	\//"MsTZ[[[
jjll"1"gIII#'#9#9##>#> C ~~c"" !CG+&!""gnn&&o...~~c"" !""gnn&& "1"gIII"  	>>#&& `oo&QSVX^___abb'Czz||Z''r   c                     |                      |          \  }}|V|                                }|dd         dv r|dd                                         }|                     ||          \  }}nd}||fS )zYdeclaration
        : ident S* ':' S* expr prio?
        | /* empty */
        ;
        Nr   )r   r   )r   r   r   )r   r   r   r   s       r   rS  zCSSParser._parseDeclarationG  s     !NN3//c#**,,C2A2w*$$ !""gnn&&#'#A#A#|#T#T C"OO##r   c                     |                      |          \  }}|                     | j        |          \  }}|                                }| j                            |||          }||fS re   )rP  r@  re_importantr   r   rs   )r   r   r   exprrr   r   s         r   r   z#CSSParser._parseDeclarationProperty`  sh    ))#..	T --d.?EE	3jjll/22<yQQO##r   Fc                    |                      |          \  }}d}|dd         dvr| j        D ]0}|                    |          r|t          |          d         } n1d}|                      |                                          \  }}|t
          u rn(| j                            |||          }|dd         dv|"|r | j                            |dd          }||fS ||fS )zB
        expr
        : term [ operator term ]*
        ;
        Nr   )r   r   r
  r  r   r7  r   r;  )_parseExpressionTermExpressionOperatorsr   r  r   rf   r   rw   )r   r   
returnListrQ  operatorterm2s         r   rP  zCSSParser._parseExpressionl  s    --c22	T"1"g??? 4  >>(++ c(mmnn-CE 223::<<@@JC&&33D(EJJ "1"g??? 
?//dDAAD99r   c                    |}|                      | j        |          \  }}|O|                      | j        |          \  }}| j                            ||          }|                                |fS |                     || j                  \  }}|0| j                            |          }|                                |fS |                     |          \  }}|0| j        	                    |          }|                                |fS |                      | j
        |          \  }}|w|                     |d          \  }}|d         dk    r|                     d||          |dd                                         }| j                            ||          }||fS |                      | j        |          \  }}|0| j                            |          }|                                |fS |                      | j        |          \  }}|0| j                            |          }|                                |fS |                      | j        |          \  }}|                     |          \  }}|M|| j                            ||          }| j                            |          }|                                |fS |                      | j        |          \  }}|0| j                            |          }|                                |fS |                      | j        |          \  }}|0| j        	                    |          }|                                |fS | j                            |          S )zterm
        : 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   z1Terminal function expression expected closing ')'r   )r@  re_numre_unitr   r}   r   r   re_urir   r   re_functiontermrP  r   r   re_rgbcolorr   re_unicoderanger   rA  r   rQ   rz   re_unicodeidre_unicodestrr   )r   r   r   r   r|   rQ  paramsrP   s           r   rY  zCSSParser._parseExpressionTerm  sL    **4;<<--dlC@@JE3?--fe<<D::<<%%ooc4;77?**622D::<<%%ooc**?--f55D::<<%%**4+?EE//T::KC1v}}oo&[]`bhiiiabb'..""C?//??D9**4+;SAA?**622D::<<%%**4+?EE?33F;;D::<<%%,,T-GMM#nnS))#??&QQ?,,V44D::<<%%**4+<cBB?,,V44D::<<%%**4+=sCC?--f55D::<<%%**3///r   c                 :    |                      | j        ||          S re   )r@  re_ident)r   r   r  s      r   r   zCSSParser._getIdent  s    ##DM3@@@r   c                 T   || j         }|                    |          }|rt          t          d |                                                    }|r4	 |d         }n,# t
          $ r |                                d         }Y nw xY wd}|||                                d          fS ||fS )Nr   r   )	re_stringr
   r$  r   groupsr   r  )r   r   rexpressionr  r   strress         r   r   zCSSParser._getString  s    .K""3'' 	 6$8899F 0#AYFF  0 0 0#]]__Q/FFF0 3vzz||}}---C<s   A $BBc                 z    |                      || j                  \  }}||                      |          \  }}||fS re   )r   ra  )r   r   r   s      r   r   zCSSParser._getStringOrURI  s?    ooc4;77>//#..KFCs{r   c                     |                     |          }|r1|                    |          ||                                d          fS ||fS re   )r
   rO  r  )r   rm  r   r  rO  r   s         r   r@  zCSSParser._getMatchResult  sO    ""3'' 	 <<&&FJJLLMM(:::C<r   re   )Tr   )NN)Nr   )fr1   r2   r3   r4   r   r   rJ  rC  r=  rZ  _orRuler	   IrM  U_reflagsi_hex
i_nonascii	i_unicodei_escape	i_nmstarti_nmchari_identr  ri  i_unicodeidre  i_unicodestr1i_unicodestr2i_unicodestrrf  i_element_namerB  i_namespace_selectorrA  i_classrE  i_hashrD  
i_rgbcolorrc  i_nli_escape_nli_string_content	i_string1	i_string2i_stringrk  i_urira  i_numr_  i_unitr`  
i_functionre_functioni_functiontermrb  i_unicoderange1i_unicoderange2i_unicoderangerd  	i_commentr   i_importantrV  r   r   r   rs   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r5  r9  r<  rF  rG  r   rS  r   rP  rY  r   r   r   r@  r5   r   r   r   r     s       . .h JBBB-c
)=..4"$;%"
'%/	79&9::G1:$& &	7?JAA'0yy(((;2:gx00,!rz+x8822w}m<<"
<::+21R4===:$"*^X>>9@2H *
+? J J'/2:gx00("*VX..16uuuE
 bjX66!D("7?KXVV&)99	&)99	79i00BJx22		HHgglJIIIIK E8,,?E8,,g%"*VX..u_
 bjX66 :-$"*^X>>7<uueeeDl($"*^X>> :	RZ	844
(!rz+x88' ' ' '     
& & &
 -77J( ( (  (  "   8& & &$* * *Z
 
 
  " " "J  B  *9 9 9xX( X( X(v$ $ $  $$ $$ $$R	 	 		 	 	& & &8#& #& #&L. . .b  <( ( ( (D$ $ $2	$ 	$ 	$   8@0 @0 @0JA A A A       $             r   r   )reportlab.lib.pagesizesr   xhtml2pdf.defaultr  xhtml2pdf.utilr   future_builtinsr   ImportErrorr	   r   r   r   r   objectr   r7   r   r   r   r5   r   r   <module>r     sx   . - - - - -     " " " " " "	&&&&&&& 	 	 	D	& 
			      1 1 1- - -= = = = =& = = =DB= B= B= B= B= B= B= B=P(' (' (' (' ('I (' (' ('Xa  a  a  a  a  a  a  a  a  a s    !!