
    Xwg                        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	 Zd
 Z G d d      Z G d d      Z G d de      Zd Z G d d      Zy)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 implemenation 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                :    t        j                  d|z   dz   |       S )Nz^@z\s*)rematch)srcidents     N/var/www/horilla/myenv/lib/python3.12/site-packages/xhtml2pdf/w3c/cssParser.pyisAtRuleIdentr   .   s    88EEMF*C00    c                0    t        j                  dd|       S )Nz^@[a-z\-]+\s* )r
   subr   s    r   stripAtRuleIdentr   2   s    66"B,,r   c                  p    e Zd ZdZed        Zed        Zed        Zed        Zed        Z	ed        Z
y)	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         NNotImplementedError)selfhashIds     r   	addHashIdzCSSSelectorAbstract.addHashId@       !!r   c                    t         r   r   )r   class_s     r   addClasszCSSSelectorAbstract.addClassD   r   r   c                    t         r   r   )r   attrNames     r   addAttributez CSSSelectorAbstract.addAttributeH   r   r   c                    t         r   r   )r   r$   op
attr_values       r   addAttributeOperationz)CSSSelectorAbstract.addAttributeOperationL   r   r   c                    t         r   r   r   names     r   	addPseudozCSSSelectorAbstract.addPseudoP   r   r   c                    t         r   r   r   r,   values      r   addPseudoFunctionz%CSSSelectorAbstract.addPseudoFunctionT   r   r   N)__name__
__module____qualname____doc__r   r   r"   r%   r)   r-   r1    r   r   r   r   6   s     " " " " " " " " " " " "r   r   c                     e Zd ZdZed        Zed        Zed        Zed        Zed        Z	ed        Z
ed        Zed	        Zed
        Zed        Zed        Zed        Ze	 	 	 	 	 	 	 	 d d       Zed        Zed        Zed        Zed        Zeddd       Zed        Zed        Zed!d       Zed        Zed        Zed        Zed        Zed        Zed        Zy)"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                    t         r   r   r   s    r   beginStylesheetz"CSSBuilderAbstract.beginStylesheetd   r   r   c                    t         r   r   )r   elementss     r   
stylesheetzCSSBuilderAbstract.stylesheeth   r   r   c                    t         r   r   r:   s    r   endStylesheetz CSSBuilderAbstract.endStylesheetl   r   r   c                    t         r   r   r:   s    r   beginInlinezCSSBuilderAbstract.beginInlinep   r   r   c                    t         r   r   r   declarationss     r   inlinezCSSBuilderAbstract.inlinet   r   r   c                    t         r   r   r:   s    r   	endInlinezCSSBuilderAbstract.endInlinex   r   r   c                    t         r   r   )r   	selectorsrE   s      r   rulesetzCSSBuilderAbstract.ruleset|   r   r   c                    t         r   r   )r   nsPrefixr,   s      r   resolveNamespacePrefixz)CSSBuilderAbstract.resolveNamespacePrefix   r   r   c                    t         r   r   )r   charsets     r   	atCharsetzCSSBuilderAbstract.atCharset   r   r   c                    t         r   r   )r   import_mediums	cssParsers       r   atImportzCSSBuilderAbstract.atImport   r   r   c                    t         r   r   )r   rM   uris      r   atNamespacezCSSBuilderAbstract.atNamespace   r   r   c                    t         r   r   )r   rT   rK   s      r   atMediazCSSBuilderAbstract.atMedia   r   r   c                   t         r   r   )r   r,   
pseudopagedataisLandscape
pageBorders         r   atPagezCSSBuilderAbstract.atPage   s
     "!r   c                    t         r   r   rD   s     r   
atFontFacezCSSBuilderAbstract.atFontFace   r   r   c                    |t         fS r   )NotImplemented)r   atIdentrU   r   s       r   rf   zCSSBuilderAbstract.atIdent   s    N""r   c                    t         z0Return value must implement CSSSelectorAbstract.r   )r   	selectorAcombiner	selectorBs       r   combineSelectorsz#CSSBuilderAbstract.combineSelectors   
     "!r   c                    t         rh   r   r+   s     r   selectorzCSSBuilderAbstract.selector   rm   r   F	importantc                   t         r   r   )r   r,   r0   rq   s       r   propertyzCSSBuilderAbstract.property   r   r   c                    t         r   r   )r   termArj   termBs       r   combineTermszCSSBuilderAbstract.combineTerms   r   r   c                    t         r   r   r   r0   s     r   	termIdentzCSSBuilderAbstract.termIdent   r   r   Nc                    t         r   r   )r   r0   unitss      r   
termNumberzCSSBuilderAbstract.termNumber   r   r   c                    t         r   r   ry   s     r   termRGBzCSSBuilderAbstract.termRGB   r   r   c                    t         r   r   ry   s     r   termURIzCSSBuilderAbstract.termURI   r   r   c                    t         r   r   ry   s     r   
termStringzCSSBuilderAbstract.termString   r   r   c                    t         r   r   ry   s     r   termUnicodeRangez#CSSBuilderAbstract.termUnicodeRange   r   r   c                    t         r   r   r/   s      r   termFunctionzCSSBuilderAbstract.termFunction   r   r   c                    t         r   r   )r   _srcs     r   termUnknownzCSSBuilderAbstract.termUnknown   r   r   )r,   strr]   z
str | Noner^   dictr_   boolr   ) r2   r3   r4   r5   r   r;   r>   r@   rB   rF   rH   rK   rN   rQ   rV   rY   r[   ra   rc   rf   rl   ro   rs   rw   rz   r}   r   r   r   r   r   r   r6   r   r   r8   r8   Y   sL    " " " " " " " " " " " " " "
 " "
 " " " " " " " " 	"	" 	" 		" 	" 	" " " # #
 " " " " 16 " " " " " " " " " " " " " " " " " " " "r   r8   c                       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 fdZd fdZdddZ xZS )CSSParseErrorr   r   r   ctxsrczbytes | strfullsrcFr   rF   Nz
int | None	srcCtxIdx
srcFullIdxctxsrcFullIdxc                    t         |   |       || _        |xs || _        | j                  r=| j                  j	                  | j                        | _        | j
                  dk  r| `y y y )Nr   )super__init__r   r   findr   )r   msgr   r   	__class__s       r   r   zCSSParseError.__init__   s^    m;;![[--dhh7DN~~!N " r   c           	        | j                   r| j                  r|t        |          dz   t	        t        | j                   d | j                               z   dz   t	        t        | j                   | j                  | j                  dz                z   dz   S t        |          dz   t        | j                  d d       z   S )Nz:: (z,    )z:: (   )r   r   r   __str__r   reprr   )r   r   s    r   r   zCSSParseError.__str__   s    ;;4>>!d4;;'789:;  d4;;t~~8KLMN	O
  w 5(4"+>>>r   rF   c                  || _         t        | j                   t              rt        | j                   d      | _         |r|| _        | j                   rx| j                   j                  | j                        | _        | j                  dk  r| `| j                   j                  | j                        | _	        | j                  dk  r| `	y y y )Nzutf-8r   )
r   
isinstancebytesr   rF   r   r   r   r   r   )r   r   rF   s      r   setFullCSSSourcezCSSParseError.setFullCSSSource  s    dllE*t||W5DL DK<<"ll//9DO"O!%!2!24;;!?D!!A%& & r   r   returnNone)r   r   )r2   r3   r4   r   __annotations__r   r   rF   r   r   r   r   r   r   __classcell__)r   s   @r   r   r      sa    CMFCG[FD Iz !J
! $M:$#
? 38 ' 'r   r   c                 $    dj                  |       S )z&Small helper to join regex expressions|)join)argss    r   regex_orr     s    88D>r   c                     e Zd ZU dZeZg d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                  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j0                  ee      ZdZ ej0                  ee      ZdZdZ eee      Z ej0                  ee      Zdedd  dZ  ej0                  e e      Z!dedd  dZ" ej0                  e"e      Z#dez   Z$ ej0                  e$e      Z%dez  Z& ej0                  e&e      Z'de d e d!e d"Z( ej0                  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j0                  e/e      Z0d(jc                  e/ ed)ee            Z2 ej0                  e2e      Z3d*Z4 ej0                  e4e      Z5d+ez  Z6 ej0                  e6e      Z7ed,z   Z8 ej0                  e8e      Z9d-e8z   Z: ej0                  e:e      Z;d.e d/e d0Z<d1Z=e<Z> ej0                  e>e      Z?d2Z@ ej0                  e@e      ZAd3ZB ej0                  eBe      ZCd[d\d5ZDd6 ZEd7 ZF eGeEeF      ZHd8 ZId9 ZJd: ZKd[d;ZLd< ZMd= ZNeOd>        ZPd? ZQd@ ZRdA ZSdB ZTdC ZUdD ZVdE ZWdF ZXdG ZYdH ZZdI Z[dJ Z\dK Z]dL Z^dM Z_dNdOdPZ`dQ ZadR ZbdSdTdUZcdV Zdd[dWZed]dXZfdY ZgeOd^dZ       Zhy4)_	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)Nc                &    | j                  |       y r   )setCSSBuilderr   
cssBuilders     r   r   zCSSParser.__init__  s    :&r   c                    | j                   S )4A concrete instance implementing CSSBuilderAbstract._cssBuilderr:   s    r   getCSSBuilderzCSSParser.getCSSBuilder  s    r   c                    || _         y)r   Nr   r   s     r   r   zCSSParser.setCSSBuilder  s
    %r   c                    t        |      5 }|j                         }ddd       | j                        S # 1 sw Y   xY w)zr
        Parses CSS file-like objects using the current cssBuilder.
        Use for external stylesheets.
        N)openreadparse)r   srcFilefile_handlerfile_contents       r   	parseFilezCSSParser.parseFile  sA    
 '] 	/l',,.L	/ zz,''	/ 	/s   6?c                V   | j                   j                          	 t        j                  |      }	 | j	                  |      \  }}	 | j                   j                          |S # | j
                  $ r}|j                  |        d}~ww xY w# | j                   j                          w xY w)zn
        Parses CSS string source using the current cssBuilder.
        Use for embedded stylesheets.
        N)r   r;   r   
cleanupCSS_parseStylesheet
ParseErrorr   r@   )r   r   r>   errs       r   r   zCSSParser.parse  s    
 	'')
	,'',C"&"7"7"<Z
 OO))+ ?? $$S) OO))+s(   B A# #B	2BB		B B(c                   | j                   j                          	 	 | j                  |j                         d      \  }}| j                   j                  |      }| j                   j                          |S # | j                  $ r}|j                  |d        d}~ww xY w# | j                   j                          w xY w)z
        Parses CSS inline source string using the current cssBuilder.
        Use to parse a tag's 'sytle'-like attribute.
        FbracesTr   N)r   rB   _parseDeclarationGroupstripr   r   rF   rH   )r   r   
propertiesr   results        r   parseInlinezCSSParser.parseInline  s    
 	##%		("&"="=ciikRW"="XZ
 __++J7FOO%%' ?? $$S$6 OO%%'s)   $A8 B# 8B BB  B# #B?c                   ||ni }|r|j                  |       | j                  j                          	 g }	 |j                         D ]9  \  }}| j	                  |j                         |      \  }}|j                  |       ; 	 | j                  j                  |      }| j                  j                          |S # | j                  $ r}|j                  d        d}~ww xY w# | j                  j                          w xY 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   rB   items_parseDeclarationPropertyr   appendr   r   rF   rH   )	r   
attributeskwAttributesr   property_namer   single_propertyr   r   s	            r   parseAttributeszCSSParser.parseAttributes  s     $.#9Zr

+##%	(J	*6*<*<*> 7&M3+/+I+I		],(C %%o6	7 __++J7FOO%%' ?? $$S$6 OO%%'s/   C' AB< C' <C$CC$$C' 'Dc                T    | j                  |      }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(   resultss      r   parseSingleAttrzCSSParser.parseSingleAttr  sA     &&J&7WQZ1:f%%qz&!!r   c                F   t        |t              r|j                         }| j                  j	                  d|      }| j                  |      }| j                  |      }| j                  |      \  }}| j                  |      }g }|r{|j                  d      r1| j                  |      \  }}|@|t        k7  r7|j                  |       n%| j                  |      \  }}|j                  |       | j                  |      }|r{| j                  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   @)r   r   decode
re_commentr   _parseAtCharset_parseSCDOCDC_parseAtImports_parseAtNamespace
startswith_parseAtKeywordre   extend_parseRulesetr   r   r>   )r   r   stylesheetImportsstylesheetElements	atResultsrK   r>   s          r   r   zCSSParser._parseStylesheet  s     c5!**,Coo!!"c* ""3'   %!%!5!5c!: $$S) ~~c"!%!5!5c!:Y(Y.-H&--i8  $11#6W"))'2 $$S)C  __//0BDUV
Jr   c                    	 | j                         } | j                  d      r| dd } n| j                  d      r| dd } n	 | S B)z[S|CDO|CDC]*.z<!--   Nz-->   )lstripr   r   s    r   r   zCSSParser._parseSCDOCDC?  sM     **,C~~f%!"g&!"g
 r   c                &   t        |d      rt        |      }| j                  |      \  }}|j                         }|dd dk7  rd}| j	                  ||| j
                        |dd j                         }| j                  j                  |       |S )z"[ CHARSET_SYM S* STRING S* ';' ]?.rP   Nr   ;z#@charset expected a terminating ';')r   r   
_getStringr   r   r   r   rQ   )r   r   rP   r   s       r   r   zCSSParser._parseAtCharsetN  s    i("3'C??3/LGS**,C2Aw#~;ooc3<<ab'.."COO%%g.
r   c                v   g }t        |d      r'|}t        |      }| j                  |      \  }}|d}| j                  |||      g }| j	                  |j                               \  }}|E|j                  |       |dd dk(  r(|dd j                         }| j	                  |      \  }}nn|E|sdg}|dd dk7  rd}| j                  |||      |dd j                         }| j                  j                  |||       }||j                  |       | j                  |      }t        |d      r'||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   rV   r   )	r   r   r   r   rS   r   rT   mediumr>   s	            r   r   zCSSParser._parseAtImports\  sS   C*F"3'C//4LGS6ooc377G..6KFC$v&r7c>ab'..*C"&.."5KFC $  '2Aw#~:ooc377ab'.."C11'7DIJ%j)$$S)CA C*B F{r   c                J   | j                  |      }t        |d      r|}t        |      }| j                  |      \  }}|d| j	                  |      \  }}|d}| j                  |||      | j                  |j                               \  }}|d}| j                  |||      d}|j                         }|dd dk7  rd}| j                  |||      |dd j                         }| j                  j                  ||       | j                  |      }t        |d      r|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   rY   )r   r   r   r  rM   r   s         r   r   zCSSParser._parseAtNamespace  s-      %C-F"3'C!11#6NIs  $s 3##FC//#sF;;!%!5!5cjjl!C	3$5C//#sF;;**,C2Aw#~=ooc377ab'.."COO'')<$$S)C3 C-4 
r   c                   |}t        |d      r| j                  |      \  }}||fS t        |d      r| j                  |      \  }}||fS t        |d      r| j                  |      \  }}||fS t        |d      r| j	                  |      \  }}||fS t        |d      r| j                  |      \  }}||fS |j                  d      r| j                  |      \  }}||fS d}| j                  |||      )z-[media | page | font_face | unknown_keyword].mediapagez	font-facer  framer   zUnknown state in atKeyword)	r   _parseAtMedia_parseAtPage_parseAtFontFacer   _parseAtFramer   _parseAtIdentr   )r   r   r   r   r   s        r   r   zCSSParser._parseAtKeyword  s)   g&,,S1KC F{ 3'++C0KC F{ 3,//4KC F{ 3)..s3KC F{ 3(,,S1KC F{ ^^C ,,S1KC F{ /C//#sF33r   c                .   |}|t        d      d j                         }g }|r|d   dk7  r| j                  |      \  }}|dv rd||j                  d       t	        j
                  dt        j                        }t	        j                  ||      }||j                         dz
  d }nG|j                  |       |d   d	k(  r|dd j                         n|j                         }|r	|d   dk7  r|j                  d      sd
}| j                  |||      |dd j                         }g }|r|j                  d      s|j                  d      r(| j                  |      \  }}	|	7|j                  |	       n%| j                  |      \  }}
|j                  |
       |j                         }|r|j                  d      s|j                  d      sd}| j                  |||      |dd j                         }| j                  j                  ||      }||fS )zi
        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   rT   r	  patternr   r   r   r   rK   r   s               r   r  zCSSParser._parseAtMedia  s    #i."#**,c!fm..-KFC&>NN5)**Xryy9#.%))+/+,NN6"&)!fm#ab'.."C c!fm  ~~c"1C//#sF33!"gnn #..-~~c"!%!5!5c!:Y(&--i8  $11#6W"))'2**,C #..- ~~c"1C//#sF33!"gnn((2DEF{r   c                F   i }d}d}|}|t        d      d j                         }| j                  |      \  }}|dd dk(  r | j                  |dd       \  }}|dz   |z   }nd}g }|j                         }g }	|j                  d      sd}
| j	                  |
||      |dd j                         }|r|j                  d	      s|j                  d
      r*| j                  |      \  }}|5|j                  |       n"| j                  |j                         d      \  }}|	|z  }	i }d}|	r_| j                  j                  | j                  j                  d      g|	      }	 |d   j                         d   }|j                  dd      }d|v rgt        j                   j"                  j                  t%        |d         j'                         | j(                  j*                        | j(                  _        d}d|v r"|d   }t-        |t.              s|g}g }|D ]  }t%        |      j'                         }t-        |t0              r|j3                  t5        |             G|dk(  rd}O|dk(  rd}W|t        j                   j"                  v r-t        j                   j"                  |   | j(                  _        d}
t7        |
       t        |      dk(  rt1        |      | j(                  _        |r.t9        | j(                  j*                        | j(                  _        |j                         }|r|j                  d	      s| j                  j;                  |||||      g}|dd j                         |fS # t        $ r |d   j                         d   }Y #w xY w)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   r   rK   ro   values	Exceptionpopitemget	xhtml2pdfdefaultPML_PAGESIZESr   lowercpageSizer   listtupler   r   RuntimeErrorr   ra   )r   r   r^   r`   r_   r   r  r]   r   r   r   r   npropertiesr   r"  sizeListr0   valueStrs                     r   r  zCSSParser._parseAtPage  sw    
#g,.!((*NN3'	cr7c>"nnSW5OJ#:
*DJ
  jjl
 ~~c"1C//#sF33!"gnn#..-~~c"!%!5!5c!:Y(&--i8#'#>#>JJL $? $ [ k)
 !
!__4411#67F6%ay//1!4 "&*=t!DJ#t+&/&7&7&E&E&I&ID!12399;TVV__'DFFO $T><D%dD1 $v!H!% 4#&u:#3#3#5%eU3$OOGEN;%4*.K%3*/K%):):)H)HH.7.?.?.M.Mh.WDFFO"@C".s"334 8})*//"*3DFFOO*D**,Cs #..-x OO""j$KJ # 
 12w~~''W % 6%ay002156s   &M= =N N c                   |t        d      d j                         }| j                  |      \  }}| j                  |j                               \  }}| j                  j                  ||      g}|j                         |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._parseAtFrameW  sr    #i."#**,>>#&S55cjjlCZ//))#z:;zz|V##r   c                    |t        d      d  j                         }| j                  |      \  }}| j                  j	                  |      g}||fS )Nz
@font-face)r  r   r   r   rc   )r   r   r   r   s       r   r  zCSSParser._parseAtFontFace_  sR    #l#%&--/55c:Z//,,Z89F{r   c                >   |}| j                  |dd        \  }}|d}| j                  |||      | j                  j                  || |      \  }}|t        u r|j                  d      }|dk  rd }|d | j                  d      }|dk  rd }|||k  r||dz   d  j                         }n:||dd }n2|||d  }	 | j                  |      \  }}nd}| j                  |||      |j                         |fS # | j                  $ r | j                  |      \  }}	Y 7w xY w)Nr   z+At-rule expected an identifier for the ruler  r   r  r   zUnable to ignore @-rule block)
r  r   r   rf   re   r   r   r   r   ParserError)
r   r   r   rf   r   r   semiIdxblockIdxrE   r>   s
             r   r  zCSSParser._parseAtIdente  sX   ~~c!"g.??C//#sF33oo--gtSAV^# hhsmG{8G}))#.H!|"w'9'A+-(//1!"Rj%()nA(,(C(CC(H%C
 6&&sC88zz|V##  A&*&;&;C&@OCAs   :C6 6#DDc                    | j                  |      \  }}| j                  |j                               \  }}| j                  j	                  ||      }||fS )z
        ruleset
        : selector [ ',' S* selector ]*
            '{' S* declaration [ ';' S* declaration ]* '}' S*
        ;
        )_parseSelectorGroupr   r   r   rK   )r   r   rJ   r   r   s        r   r   zCSSParser._parseRuleset  sR     11#6Y55cjjlCZ((J?F{r   c                    g }|d d dvrX| j                  |      \  }}|	 ||fS |j                  |       |j                  d      r|dd  j                         }|d d dvrX||fS )Nr   )r  r  ](r   r  r   r   )_parseSelectorr   r   r   )r   r   rJ   ro   s       r   r>  zCSSParser._parseSelectorGroup  s    	"1g?? //4MC I~ X&~~c"!"gnn& "1g?? I~r   c                   | j                  |      \  }}t        |      }|dd dvr| j                  D ]1  }|j                  |      s|t        |      d j	                         } n d}| j                  |      \  }}t        |      |k\  r/|dd }|r|dd dvr|dd }|r|dd dvr|j	                         dfS | j
                  j                  |||      }|dd dvr|j	                         |fS )z^
        selector
        : simple_selector [ combinator simple_selector ]*
        ;
        Nr   )	r   r   r  r  r  r   r@  rA  r    )_parseSimpleSelectorr  r   r   r   r   rl   )r   r   ro   srcLenrj   rk   s         r   rB  zCSSParser._parseSelector  s!    11#6XS"1gII 22 >>(+c(mo.557C
 !66s;NC 3x6!!"gG#OOab'C G#OO zz|T))77(IVH% "1gII( zz|X%%r   c                @   |j                         }| j                  | j                  |      \  }}| j                  | j                  |      \  }}|rn)|dd | j                  v rd}nd}| j                  |||      | j                  j                  ||      }| j                  j                  |      }|r|dd | j                  v r| j                  | j                  |      \  }}||j                  |       F| j                  | j                  |      \  }}||j                  |       y|j                  d      r| j                  ||      \  }}n(|j                  d      r| j                  ||      \  }}nn|r|dd | j                  v r|j                         |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   rN   ro   re_hashr   re_classr"   r   _parseSelectorAttribute_parseSelectorPseudo)	r   r   r   rM   r,   r   ro   hash_r!   s	            r   rE  zCSSParser._parseSimpleSelector  s    ,,T-G-GM#(()=)=sC	c!W///D7C//#sF3355hE??++D1c"1g!8!88--dllC@JE3 ""5)..t}}cBKFC!!!&)~~c" $ < <S( KX$ $ 9 9#x HX! c"1g!8!88$ zz|X%%r   c                (   |}|j                  d      sd}| j                  |||      |dd j                         }| j                  | j                  |      \  }}| j                  |      \  }}|j                         }|d}| j                  |||      || j                  j                  ||      }| j                  D ]  }|j                  |      s n d}|t        |      d j                         }|rA| j                  |      \  }}|-| j                  |      \  }}|d}| j                  |||      d}|j                  d      sd	}| j                  |||      |dd }|r|j                  |||       ||fS |j                  |       ||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   rH  rI  r  r   rN   r   r  r  r)   r%   )	r   r   ro   r   r   rM   r$   r'   r(   s	            r   rM  z!CSSParser._parseSelectorAttribute  s    ~~c"<C//#sF33!"gnn,,T-G-GM#s+#jjl6C//#sF33==hQH)) 	B~~b!	 B#b')n##%"nnS1OJ!"&//#"6
C%?C//#sF;;J~~c"<C//#sF33!"g**8RD H} !!(+H}r   c                R   |}|j                  d      sd}| j                  |||      t        j                  d|t        j                  t        j
                  z        j                  d      }| j                  |      \  }}|sd}| j                  |||      |j                  d      rj|dd j                         }| j                  |d	      \  }}|j                  d
      sd}| j                  |||      |dd }|j                  ||       ||fS |j                  |       ||fS )zE
        pseudo
        : ':' [ IDENT | function ]
        ;
        r   zSelector Pseudo ':' not foundz^:{1,2}(.*)r   z$Selector Pseudo identifier not foundrA  NTreturn_listr   z.Selector Pseudo Function closing ')' not found)r   r   r
   searchMSgroupr  r   _parseExpressionr1   r-   )r   r   ro   r   r   r,   terms          r   rN  zCSSParser._parseSelectorPseudo!  s    ~~c"1C//#sF33iisBDD244K8>>qANN3'	c8C//#sF33>>#ab'.."C--ct-DIC>>#&Fooc377ab'C&&tT2 H} t$H}r   Tr   c                  |}|j                  d      r|dd  d}}n|rd}| j                  |||      g }|j                         }|d d dvr| j                  |      \  }}|j                  d      r	d|dd  z   }5||dd  j                         }n?|j	                  |       |j                  d      r|dd  j                         }nn|d d dvr|r+|j                  d	      sd
}| j                  |||      |dd  }|j                         |fS )Nr  r   Tz'Declaration group opening '{' not found)	r   r   r  r  r   r@  rA  r   r   r!  z	-nothing-r  r  z'Declaration group closing '}' not found)r   r   r   _parseDeclarationr   )r   r   r   r   r   r   r   s          r   r   z CSSParser._parseDeclarationGroupB  s2   >>#ab'4C;C//#sF33
jjl"1gII#'#9#9##> C ~~c"!CG+&!"gnn&o.~~c"!"gnn& "1gII" >>#&?ooc377ab'Czz|Z''r   c                    | j                  |      \  }}|C|j                         }|dd dv r|dd j                         }| j                  ||      \  }}||fS d}||fS )zb
        declaration
        : ident S* ':' S* expr prio?
        | /* empty */
        ;
        Nr   )r   r   )r  r   r   )r   r   r   r   s       r   r[  zCSSParser._parseDeclaratione  s     "^^C0s$**,C2Aw*$ !"gnn&#'#A#A#}#U C O## #OO##r   c                    | j                  |      \  }}| j                  | j                  |      \  }}|j                         }| j                  j                  |||      }||fS )Nrp   )rX  rH  re_importantr   r   rs   )r   r   r   exprrq   r   s         r   r   z#CSSParser._parseDeclarationProperty~  sl    ))#.	T --d.?.?E	3jjl//2249 3 
 O##r   FrR  c                  | j                  |      \  }}d}|dd dvr| j                  D ]#  }|j                  |      s|t        |      d } n d}| j                  |j	                               \  }}|t
        u rn%| j                  j                  |||      }|dd dvr|#|r!| j                  j                  |dd      }||fS ||fS )zB
        expr
        : term [ operator term ]*
        ;
        Nr   )r   r  r  r  r   r@  r   rD  )_parseExpressionTermr   r   r  r   re   r   rw   )r   r   rS  rY  operatorterm2s         r   rX  zCSSParser._parseExpression  s     --c2	T"1g?? 44 >>(+c(mo.C
 223::<@JC&??//hFD "1g?? ??//dDAD9Dyr   c                   |}| j                  | j                  |      \  }}|M| j                  | j                  |      \  }}| j                  j	                  ||      }|j                         |fS | j                  || j                        \  }}|-| j                  j                  |      }|j                         |fS | j                  |      \  }}|-| j                  j                  |      }|j                         |fS | j                  | j                  |      \  }}|f| j                  |d      \  }}|d   dk7  rd}| j                  |||      |dd j                         }| j                  j                  ||      }||fS | j                  | j                  |      \  }}|-| j                  j                  |      }|j                         |fS | j                  | j                   |      \  }}|-| j                  j#                  |      }|j                         |fS | j                  | j$                  |      \  }}| j'                  |      \  }}|K|| j                  j)                  ||      }| j                  j+                  |      }|j                         |fS | j                  | j,                  |      \  }}|-| j                  j+                  |      }|j                         |fS | j                  | j.                  |      \  }}|-| j                  j                  |      }|j                         |fS | j                  j1                  |      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
        ;
        NTrR  r   r   z1Terminal function expression expected closing ')'r   )rH  re_numre_unitr   r}   r   r  re_urir   r   re_functiontermrX  r   r   re_rgbcolorr   re_unicoderanger   rI  r  rN   rz   re_unicodeidre_unicodestrr   )	r   r   r   r   r|   rY  paramsr   rM   s	            r   ra  zCSSParser._parseExpressionTerm  s     **4;;<--dllC@JE3??--fe<D::<%%ooc4;;7??**62D::<%%ooc*??--f5D::<%%**4+?+?E///FKC1v}Iooc377ab'.."C??//?D9**4+;+;SA??**62D::<%%**4+?+?E??33F;D::<%%,,T-G-GM#nnS)#??&Q??,,V4D::<%%**4+<+<cB??,,V4D::<%%**4+=+=sC??--f5D::<%%**3//r   c                <    | j                  | j                  ||      S r   )rH  re_ident)r   r   r*  s      r   r  zCSSParser._getIdent  s    ##DMM3@@r   c                   || j                   }|j                  |      }|rCt        t        d |j	                                     }|r	 |d   }nd}|||j                         d  fS ||fS # t
        $ r |j	                         d   }Y 7w xY w)Nr   r   )	re_stringr   r0  filtergroupsr&  r  )r   r   rexpressionr*  r   strress         r   r  zCSSParser._getString  s    ..K""3'6$89F0#AYF 3vzz|~...| ! 0#]]_Q/F0s   A) )BBc                t    | j                  || j                        \  }}|| j                  |      \  }}||fS r   )r  rg  )r   r   r   s      r   r  zCSSParser._getStringOrURI  s;    ooc4;;7>//#.KFCs{r   c                x    | j                  |      }|r$|j                  |      ||j                         d  fS ||fS r   )r   rW  r  )rt  r   r*  rW  r   s        r   rH  zCSSParser._getMatchResult  s@    ""3'<<&FJJLN(;;;|r   r   r   )NN)Nr   )ir2   r3   r4   r5   r   r   r   r   r   r   r   r
   IrU  U_reflagsi_hex
i_nonascii	i_unicoder   i_escape	i_nmstarti_nmchari_identr  ro  i_unicodeidrk  i_unicodestr1i_unicodestr2i_unicodestrrl  i_element_namerJ  i_namespace_selectorrI  i_classrL  i_hashrK  
i_rgbcolorri  i_nli_escape_nli_string_content	i_string1	i_string2i_stringrq  formati_urirg  i_numre  i_unitrf  
i_functionre_functioni_functiontermrh  i_unicoderange1i_unicoderange2i_unicoderangerj  	i_commentr   i_importantr^  r   r   r   rs   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r  r  r  r  r  r   r>  rB  rE  rM  rN  r   r[  r   rX  ra  r  r  r  rH  r6   r   r   r   r     s   /j J.W+W4H1H.13Z*75D2D ttbdd{RTT!HEJ#e+I	#67Hz8I X>HYKtH:S1Grzz'8,H(K2::k84L.M.MM=9LBJJ|X6MWQr]O51N bjj:O"71R=/?&BJJ';XFgoGrzz'8,HH$Fbjj*GeWGE7'%?J"**Z2KD$Kj(S #33I #33I	9-H

8X.I077(<X>E
 RZZx(F7 
 RZZx(F'!Fbjj*G5J"**Z2Kz)N bjj:OwhugX>OhO$N bjj:O 6IIx0J$K2::k84L'
 & -7J(&$<
" +Z 
 
$L!F*7rb(H$&$T
	&<%&N2hB 59 !(F$2$ 49 2B0LA   r   r   )r5   
__future__r   r
   abcr   typingr   reportlab.lib.pagesizesr   xhtml2pdf.defaultr)  xhtml2pdf.utilr   xhtml2pdf.w3cr   r   r   r   r8   r&  r   r   r   r6   r   r   <module>r     sd   8 # 	   -  " $1- "  "FG" G"^*'I *'`
k kr   