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

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

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

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

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

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

    * CSSBuilderAbstract
        Outlines the interface between CSSParser and it's rule-builder.
        Compose CSSParser with a concrete implementation of the builder to get
        usable results from the CSS parser.

Dependencies:
    re
    )annotationsN)abstractmethod)ClassVar)	landscape)getSize)
cssSpecialc                 C  s   t d| d | S )Nz^@z\s*)rematch)srcident r   R/var/www/html/kangema/venv/lib/python3.10/site-packages/xhtml2pdf/w3c/cssParser.pyisAtRuleIdent.   s   r   c                 C  s   t dd| S )Nz^@[a-z\-]+\s* )r   subr
   r   r   r   stripAtRuleIdent2      r   c                   @  sX   e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	edd Z
dS )CSSSelectorAbstracta  
    Outlines the interface between CSSParser and it's rule-builder for selectors.

    CSSBuilderAbstract.selector and CSSBuilderAbstract.combineSelectors must
    return concrete implementations of this abstract.

    See css.CSSMutableSelector for an example implementation.
    c                 C     t NNotImplementedError)selfhashIdr   r   r   	addHashId@      zCSSSelectorAbstract.addHashIdc                 C  r   r   r   )r   class_r   r   r   addClassD   r   zCSSSelectorAbstract.addClassc                 C  r   r   r   )r   attrNamer   r   r   addAttributeH   r   z CSSSelectorAbstract.addAttributec                 C  r   r   r   )r   r   op
attr_valuer   r   r   addAttributeOperationL   r   z)CSSSelectorAbstract.addAttributeOperationc                 C  r   r   r   r   namer   r   r   	addPseudoP   r   zCSSSelectorAbstract.addPseudoc                 C  r   r   r   r   r%   valuer   r   r   addPseudoFunctionT   r   z%CSSSelectorAbstract.addPseudoFunctionN)__name__
__module____qualname____doc__r   r   r   r    r#   r&   r)   r   r   r   r   r   6   s    	




r   c                   @  s^  e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	edd Z
edd Zedd Zedd Zedd Zedd Zedd ZedCd"d#Zed$d% Zed&d' Zed(d) Zed*d+ Zed,d-d.d/Zed0d1 Zed2d3 ZedDd5d6Zed7d8 Zed9d: Zed;d< Zed=d> Zed?d@ ZedAdB Zd4S )ECSSBuilderAbstractz
    Outlines the interface between CSSParser and it's rule-builder.  Compose
    CSSParser with a concrete implementation of the builder to get usable
    results from the CSS parser.

    See css.CSSBuilder for an example implementation
    c                 C  r   r   r   r   r   r   r   beginStylesheetd   r   z"CSSBuilderAbstract.beginStylesheetc                 C  r   r   r   )r   elementsr   r   r   
stylesheeth   r   zCSSBuilderAbstract.stylesheetc                 C  r   r   r   r/   r   r   r   endStylesheetl   r   z CSSBuilderAbstract.endStylesheetc                 C  r   r   r   r/   r   r   r   beginInlinep   r   zCSSBuilderAbstract.beginInlinec                 C  r   r   r   r   declarationsr   r   r   inlinet   r   zCSSBuilderAbstract.inlinec                 C  r   r   r   r/   r   r   r   	endInlinex   r   zCSSBuilderAbstract.endInlinec                 C  r   r   r   )r   	selectorsr6   r   r   r   ruleset|   r   zCSSBuilderAbstract.rulesetc                 C  r   r   r   )r   nsPrefixr%   r   r   r   resolveNamespacePrefix   r   z)CSSBuilderAbstract.resolveNamespacePrefixc                 C  r   r   r   )r   charsetr   r   r   	atCharset   r   zCSSBuilderAbstract.atCharsetc                 C  r   r   r   )r   import_mediums	cssParserr   r   r   atImport   r   zCSSBuilderAbstract.atImportc                 C  r   r   r   )r   r;   urir   r   r   atNamespace   r   zCSSBuilderAbstract.atNamespacec                 C  r   r   r   )r   r@   r:   r   r   r   atMedia   r   zCSSBuilderAbstract.atMediar%   str
pseudopage
str | NonedatadictisLandscapeboolc                C  r   r   r   )r   r%   rG   rI   rK   
pageBorderr   r   r   atPage   s   
zCSSBuilderAbstract.atPagec                 C  r   r   r   r5   r   r   r   
atFontFace   r   zCSSBuilderAbstract.atFontFacec                 C  s   |t fS r   )NotImplemented)r   atIdentrA   r
   r   r   r   rQ      s   zCSSBuilderAbstract.atIdentc                 C  r   z0Return value must implement CSSSelectorAbstract.r   )r   	selectorAcombiner	selectorBr   r   r   combineSelectors      z#CSSBuilderAbstract.combineSelectorsc                 C  r   rR   r   r$   r   r   r   selector   rW   zCSSBuilderAbstract.selectorF	importantc                C  r   r   r   )r   r%   r(   rZ   r   r   r   property   r   zCSSBuilderAbstract.propertyc                 C  r   r   r   )r   termArT   termBr   r   r   combineTerms   r   zCSSBuilderAbstract.combineTermsc                 C  r   r   r   r   r(   r   r   r   	termIdent   r   zCSSBuilderAbstract.termIdentNc                 C  r   r   r   )r   r(   unitsr   r   r   
termNumber   r   zCSSBuilderAbstract.termNumberc                 C  r   r   r   r_   r   r   r   termRGB   r   zCSSBuilderAbstract.termRGBc                 C  r   r   r   r_   r   r   r   termURI   r   zCSSBuilderAbstract.termURIc                 C  r   r   r   r_   r   r   r   
termString   r   zCSSBuilderAbstract.termStringc                 C  r   r   r   r_   r   r   r   termUnicodeRange   r   z#CSSBuilderAbstract.termUnicodeRangec                 C  r   r   r   r'   r   r   r   termFunction   r   zCSSBuilderAbstract.termFunctionc                 C  r   r   r   )r   _srcr   r   r   termUnknown   r   zCSSBuilderAbstract.termUnknown)r%   rF   rG   rH   rI   rJ   rK   rL   r   ) r*   r+   r,   r-   r   r0   r2   r3   r4   r7   r8   r:   r<   r>   rB   rD   rE   rN   rO   rQ   rV   rX   r[   r^   r`   rb   rc   rd   re   rf   rg   ri   r   r   r   r   r.   Y   sp    























r.   c                      s   e Zd ZU dZded< dZded< dZded< dZded	< d
Zded< d
Z	ded< d
Z
ded< dd fddZd fddZddddZ  ZS )CSSParseErrorr   rF   r
   ctxsrczbytes | strfullsrcFrL   r7   Nz
int | None	srcCtxIdx
srcFullIdxctxsrcFullIdxreturnNonec                   sL   t  | || _|p|| _| jr"| j| j| _| jdk r$| `d S d S d S )Nr   )super__init__r
   rk   findrm   )r   msgr
   rk   	__class__r   r   rs      s   

zCSSParseError.__init__c                   sx   | j r,| jr,t  d tt| j d | j  d tt| j | j| jd   d S t  d t| jd d  S )Nz:: (z,    )z:: (   )rk   rm   rr   __str__rF   reprr
   r/   rv   r   r   r{      s    zCSSParseError.__str__r7   c                C  sx   || _ t| j trt| j d| _ |r|| _| j r8| j | j| _| jdk r'| `| j | j| _	| j	dk r:| `	d S d S d S )Nutf-8r   )
rl   
isinstancebytesrF   r7   rt   r
   rn   rk   ro   )r   rl   r7   r   r   r   setFullCSSSource  s   

zCSSParseError.setFullCSSSourcer   rp   rq   )rp   rF   )r*   r+   r,   r
   __annotations__rk   rl   r7   rm   rn   ro   rs   r{   r   __classcell__r   r   rv   r   rj      s   
 	rj   c                  G  s
   d | S )z&Small helper to join regex expressions|)join)argsr   r   r   regex_or     
r   c                   @  s  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B ejB ZdZdZde ZeedZedeeZedeeZde de dZeeeZdZeeeZdZdZeeeZeeeZdedd  dZ ee eZ!dedd  dZ"ee"eZ#de Z$ee$eZ%de Z&ee&eZ'de d e d!e d"Z(ee(eZ)d#Z*d$e* Z+ed%e+eeZ,d&e, Z-d'e, Z.ee-e.Z/ee/eZ0d(1e/ed)eeZ2ee2eZ3d*Z4ee4eZ5d+e Z6ee6eZ7ed, Z8ee8eZ9d-e8 Z:ee:eZ;d.e d/e d0Z<d1Z=e<Z>ee>eZ?d2Z@ee@eZAd3ZBeeBeZCddd7d8ZDd9d: ZEd;d< ZFeGeEeFZHd=d> ZId?d@ ZJdAdB ZKddCdDZLdEdF ZMdGdH ZNeOdIdJ ZPdKdL ZQdMdN ZRdOdP ZSdQdR ZTdSdT ZUdUdV ZVdWdX ZWdYdZ ZXd[d\ ZYd]d^ ZZd_d` Z[dadb Z\dcdd Z]dedf Z^dgdh Z_didjdkdlZ`dmdn Zadodp ZbdqdrdsdtZcdudv ZdddwdxZeddydzZfd{d| ZgeOdd}d~Zhd4S )	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)Nrp   rq   c                 C  s   |  | d S r   )setCSSBuilderr   
cssBuilderr   r   r   rs     r   zCSSParser.__init__c                 C  s   | j S )4A concrete instance implementing CSSBuilderAbstract._cssBuilderr/   r   r   r   getCSSBuilder  s   zCSSParser.getCSSBuilderc                 C  s
   || _ dS )r   Nr   r   r   r   r   r     r   zCSSParser.setCSSBuilderc                 C  s>   t |dd}| }W d   n1 sw   Y  | |S )zr
        Parses CSS file-like objects using the current cssBuilder.
        Use for external stylesheets.
        r~   )encodingN)openreadparse)r   srcFilefile_handlerfile_contentr   r   r   	parseFile  s   

zCSSParser.parseFilec              
   C  sl   | j   z*t|}z	| |\}}W n | jy' } z||  d}~ww W | j   |S | j   w )zn
        Parses CSS string source using the current cssBuilder.
        Use for embedded stylesheets.
        N)r   r0   r   
cleanupCSS_parseStylesheet
ParseErrorr   r3   )r   r
   r2   errr   r   r   r     s   



zCSSParser.parsec              
   C  sz   | j   z1z| j| dd\}}W n | jy( } z|j|dd  d}~ww | j |}W | j   |S | j   w )z
        Parses CSS inline source string using the current cssBuilder.
        Use to parse a tag's 'style'-like attribute.
        FbracesTr}   N)r   r4   _parseDeclarationGroupstripr   r   r7   r8   )r   r
   
propertiesr   resultr   r   r   parseInline  s   

zCSSParser.parseInlinec           	   
   K  s   |dur|ni }|r| | | j  z@g }z| D ]\}}| | |\}}|| qW n | jyF } z|j|dd  d}~ww | j	|}W | j
  |S | j
  w )z
        Parses CSS attribute source strings, and return as an inline stylesheet.
        Use to parse a tag's highly CSS-based attributes like 'font'.

        See also: parseSingleAttr
        NTr}   )updater   r4   items_parseDeclarationPropertyr   appendr   r   r7   r8   )	r   
attributeskwAttributesr   property_namer
   single_propertyr   r   r   r   r   parseAttributes  s,   


zCSSParser.parseAttributesc                 C  s0   | j |d}d|d v r|d d S |d d S )z
        Parse a single CSS attribute source string, and returns the built CSS expression.
        Use to parse a tag's highly CSS-based attributes like 'font'.

        See also: parseAttributes
        )tempr   r   r   )r   )r   r"   resultsr   r   r   parseSingleAttr  s   zCSSParser.parseSingleAttrc                 C  s   t |tr	| }| jd|}| |}| |}| |\}}| |}g }|rW|	drD| 
|\}}|durC|tkrC|| n| |\}}|| | |}|s*| j||}||fS )z
        stylesheet
        : [ CHARSET_SYM S* STRING S* ';' ]?
            [S|CDO|CDC]* [ import [S|CDO|CDC]* ]*
            [ [ ruleset | media | page | font_face ] [S|CDO|CDC]* ]*
        ;
        r   @N)r   r   decode
re_commentr   _parseAtCharset_parseSCDOCDC_parseAtImports_parseAtNamespace
startswith_parseAtKeywordrP   extend_parseRulesetr   r   r2   )r   r
   stylesheetImportsstylesheetElements	atResultsr:   r2   r   r   r   r     s(   
	






zCSSParser._parseStylesheetc                 C  sB   	 |   } | dr| dd } n| dr| dd } n	 | S q)z[S|CDO|CDC]*.r   z<!--   Nz-->   )lstripr   r   r   r   r   r   ?  s   

zCSSParser._parseSCDOCDCc                 C  sl   t |dr4t|}| |\}}| }|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   rk   r   r>   )r   r
   r=   ru   r   r   r   r   N  s   
zCSSParser._parseAtCharsetc           	      C  s  g }t |dr|}t|}| |\}}|du r!d}| |||g }| | \}}|durR|| |dd dkrM|dd  }| |\}}nn|dus0|sWdg}|dd dkrhd}| ||||dd  }| j||| }|dur|| | 	|}t |ds||fS )	z[ import [S|CDO|CDC]* ]*.importNzImport expecting string or urlr   r   allr   z"@import expected a terminating ';')
r   r   _getStringOrURIr   	_getIdentr   r   r   rB   r   )	r   r
   r   rk   r?   ru   r@   mediumr2   r   r   r   r   \  s:   

	


!zCSSParser._parseAtImportsc                 C  s   |  |}t|drv|}t|}| |\}}|du rF| |\}}|du r/d}| |||| | \}}|du rEd}| |||nd}| }|dd dkr]d}| ||||dd  }| j|| |  |}t|ds
|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   rD   )r   r
   rk   r   r;   ru   r   r   r   r     s2   



zCSSParser._parseAtNamespacec                 C  s   |}t |dr| |\}}||fS t |dr"| |\}}||fS t |dr2| |\}}||fS t |drB| |\}}||fS t |drR| |\}}||fS |drb| |\}}||fS d}| |||)z-[media | page | font_face | unknown_keyword].mediapagez	font-facer   framer   zUnknown state in atKeyword)	r   _parseAtMedia_parseAtPage_parseAtFontFacer   _parseAtFramer   _parseAtIdentr   )r   r
   rk   r   ru   r   r   r   r     s*   





zCSSParser._parseAtKeywordc                 C  s  |}|t dd  }g }|ra|d dkra| |\}}|dv rB|du r*|d tdtj}t||}|| d d }n|| |d d	krU|dd  n| }|ra|d dks|	dsod
}| 
||||dd  }g }|r|	ds|	dr| |\}}	|	dur||	 n| |\}}
||
 | }|r|	dr|	dsd}| 
||||dd  }| 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   rE   )r   r
   rk   r@   r   patternr	   ru   r   r   r:   r   r   r   r   r     sH   

$




zCSSParser._parseAtMediac                 C  s  i }d}d}|}|t dd  }| |\}}|dd dkr3| |dd \}}|d | }nd}g }| }g }	|dsKd}
| |
|||dd  }|r@|d	s@|d
rr| |\}}|durq|| n| j| dd\}}|	|7 }	i }d}|	r| j	| j
dg|	}z
|d  d }W n ty   |d  d }Y nw |dd}d|v rtjjt|d  | jj| j_d}d|v r4|d }t|ts|g}g }|D ]9}t| }t|tr|t| q|dkrd}q|dkrd}q|tjjv rtjj| | j_qd}
t|
t |dkr)t|| j_|r4t| jj| j_| }|r@|d	r\| jj|||||dg}|dd  |fS )z
        page
        : PAGE_SYM S* IDENT? pseudo_page? S*
            '{' S* declaration [ ';' S* declaration ]* '}' S*
        ;
        NFz@pager   r   _r   r   r   r   r   *r   z-pdf-frame-borderz-pdf-page-sizesizer   TportraitzUnknown size value for @page   )rK   rM   )r   r   r   r   r   r   r   r   r   r:   rX   values	Exceptionpopitemget	xhtml2pdfdefaultPML_PAGESIZESrF   lowercpageSizer   listtupler   r   RuntimeErrorr   rN   )r   r
   rI   rM   rK   rk   r   rG   r   r   ru   r   npropertiesr   r   sizeListr(   valueStrr   r   r   r     s   







<
zCSSParser._parseAtPagec                 C  sP   |t dd  }| |\}}| | \}}| j||g}| |fS )zXXX Proprietary for PDF.z@frame N)r   r   r   r   r   atFrame)r   r
   boxr   r   r   r   r   r   W  s
   zCSSParser._parseAtFramec                 C  s8   |t dd   }| |\}}| j|g}||fS )Nz
@font-face)r   r   r   r   rO   )r   r
   r   r   r   r   r   r   _  s   zCSSParser._parseAtFontFacec           
      C  s(  |}|  |dd  \}}|d u rd}| |||| j|| |\}}|tu r|d}|dk r3d }|d | d}|dk rBd }|d urU||k rU||d d   }n9|d u r`|dd }n.|d ur||d  }z	| |\}}W n | jy   | |\}}	Y n
w d}| 	|||| |fS )Nr   z+At-rule expected an identifier for the ruler   r   r   r   zUnable to ignore @-rule block)
r   r   r   rQ   rP   rt   r   r   r   ParserError)
r   r
   rk   rQ   ru   r   semiIdxblockIdxr6   r2   r   r   r   r   e  s6   
zCSSParser._parseAtIdentc                 C  s6   |  |\}}| | \}}| j||}||fS )z
        ruleset
        : selector [ ',' S* selector ]*
            '{' S* declaration [ ';' S* declaration ]* '}' S*
        ;
        )_parseSelectorGroupr   r   r   r:   )r   r
   r9   r   r   r   r   r   r     s   zCSSParser._parseRulesetc                 C  sp   g }|d d dvr4|  |\}}|d u r	 ||fS || |dr,|dd   }|d d dvs
||fS )Nr   >   r   r   r   (ry   r   ]r   )_parseSelectorr   r   r   )r   r
   r9   rX   r   r   r   r    s   

zCSSParser._parseSelectorGroupc                 C  s   |  |\}}t|}|dd dvro| jD ]}||r)|t|d  } nqd}|  |\}}t||kr_|dd }|rY|dd dvrY|dd }|rY|dd dvsI| dfS | j|||}|dd dvs| |fS )z^
        selector
        : simple_selector [ combinator simple_selector ]*
        ;
        Nr   >	   r   r   r   r  ry   r   r   r   r   )_parseSimpleSelectorr   r   r   r   r   rV   )r   r
   rX   srcLenrT   rU   r   r   r   r    s*   

zCSSParser._parseSelectorc           	      C  s4  |  }| | j|\}}| | j|\}}|rn|dd | jv r%d}n	d}| |||| j||}| j|}|r|dd | jv r| | j	|\}}|durY|
| q;| | j|\}}|durl|| q;|drz| ||\}}n|dr| ||\}}nn|r|dd | jv sF|  |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   r<   rX   re_hashr   re_classr   r   _parseSelectorAttribute_parseSelectorPseudo)	r   r
   rk   r;   r%   ru   rX   hash_r   r   r   r   r	    s6   



zCSSParser._parseSimpleSelectorc           	      C  sV  |}| dsd}| ||||dd  }| | j|\}}| |\}}| }|du r9d}| ||||durD| j||}| jD ]	}| |rP nqGd}|t	|d  }|r| |\}}|du r~| 
|\}}|du r~d}| |||nd}| dsd	}| ||||dd }|r|||| ||fS || ||fS )
z
        attrib
        : '[' S* [ namespace_selector ]? IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
            [ IDENT | STRING ] S* ]? ']'
        ;
        r   z(Selector Attribute opening '[' not foundr   Nz"Expected a selector attribute namer   z#Expected a selector attribute valuer  z(Selector Attribute closing ']' not found)r   r   r   r  r  r   r   r<   r   r   r   r#   r    )	r   r
   rX   rk   ru   r;   r   r!   r"   r   r   r   r    sJ   




z!CSSParser._parseSelectorAttributec                 C  s   |}| dsd}| |||td|tjtjB d}| |\}}|s0d}| |||| drd|dd  }| j	|dd	\}}| d
sTd}| ||||dd }|
|| ||fS || ||fS )zE
        pseudo
        : ':' [ IDENT | function ]
        ;
        r   zSelector Pseudo ':' not foundz^:{1,2}(.*)r   z$Selector Pseudo identifier not foundr  NTreturn_listry   z.Selector Pseudo Function closing ')' not found)r   r   r   searchMSgroupr   r   _parseExpressionr)   r&   )r   r
   rX   rk   ru   r%   termr   r   r   r  !  s(   



zCSSParser._parseSelectorPseudoTr   c                C  s  |}| dr|dd  d}}n|rd}| |||g }| }|d d dvrh| |\}}| dr?d|dd   }q"|d u rL|dd   }n|| | dr_|dd   }nn|d d dvs*|r~| d	sxd
}| ||||dd  }| |fS )Nr   r   Tz'Declaration group opening '{' not found>	   r   r   r   r  ry   r   r   r   r  r   z	-nothing-r   r   z'Declaration group closing '}' not found)r   r   r   _parseDeclarationr   )r   r
   r   rk   ru   r   r   r   r   r   r   B  s6   




z CSSParser._parseDeclarationGroupc                 C  sb   |  |\}}|dur+| }|dd dv r|dd  }| ||\}}||fS d}||fS )zb
        declaration
        : ident S* ':' S* expr prio?
        | /* empty */
        ;
        Nr   >   r   r   )r   r   r   )r   r
   r   r   r   r   r   r  e  s   zCSSParser._parseDeclarationc                 C  sB   |  |\}}| | j|\}}| }| jj|||d}||fS )NrY   )r  r  re_importantr   r   r[   )r   r
   r   exprrZ   r   r   r   r   r   ~  s   z#CSSParser._parseDeclarationPropertyFr  c                C  s   |  |\}}d}|dd dvrF| jD ]}||r%|t|d } nqd}|  | \}}|tu r6n| j|||}|dd dvs|du rX|rX| j|dd}||fS ||fS )zB
        expr
        : term [ operator term ]*
        ;
        Nr   >   r   r   r   ry   r   r   r  r  )_parseExpressionTermr   r   r   r   rP   r   r^   )r   r
   r  r  operatorterm2r   r   r   r    s$   

zCSSParser._parseExpressionc           	      C  sH  |}|  | j|\}}|dur%|  | j|\}}| j||}| |fS | || j\}}|dur>| j|}| |fS | |\}}|durU| j	|}| |fS |  | j
|\}}|dur| j|dd\}}|d dkrzd}| ||||dd  }| j||}||fS |  | j|\}}|dur| j|}| |fS |  | j|\}}|dur| j|}| |fS |  | j|\}}| |\}}|dur|dur| j||}| j|}| |fS |  | j|\}}|dur| j|}| |fS |  | j|\}}|dur| j	|}| |fS | j|S )a  
        term
        : unary_operator?
            [ NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* | ANGLE S* |
            TIME S* | FREQ S* | function ]
        | STRING S* | IDENT S* | URI S* | RGB S* | UNICODERANGE S* | hexcolor
        ;
        NTr  r   ry   z1Terminal function expression expected closing ')'r   )r  re_numre_unitr   rb   r   r   re_urird   re   re_functiontermr  r   rg   re_rgbcolorrc   re_unicoderangerf   r  r   r<   r`   re_unicodeidre_unicodestrri   )	r   r
   rk   r   ra   r  paramsru   r;   r   r   r   r    s^   	

zCSSParser._parseExpressionTermc                 C  s   |  | j||S r   )r  re_ident)r   r
   r   r   r   r   r     s   zCSSParser._getIdentc                 C  s~   |d u r| j }||}|r;ttd | }|r/z|d }W n ty.   | d }Y nw d}||| d  fS ||fS )Nr   r   )	re_stringr	   r   filtergroupsr   r   )r   r
   rexpressionr   r   strresr   r   r   r     s   
zCSSParser._getStringc                 C  s0   |  || j\}}|d u r|  |\}}||fS r   )r   r#  )r   r
   r   r   r   r   r     s   zCSSParser._getStringOrURIc                 C  s0   |  |}|r|||| d  fS ||fS r   )r	   r  r   )r.  r
   r   r  r   r   r   r   r    s   
zCSSParser._getMatchResultr   r   )NN)Nr   )ir*   r+   r,   r-   rj   r   r   r   r   r   r   r   Ir  U_reflagsi_hex
i_nonascii	i_unicoder   i_escape	i_nmstarti_nmchari_identr   r*  i_unicodeidr'  i_unicodestr1i_unicodestr2i_unicodestrr(  i_element_namer  i_namespace_selectorr  i_classr  i_hashr  
i_rgbcolorr%  i_nli_escape_nli_string_content	i_string1	i_string2i_stringr+  formati_urir#  i_numr!  i_unitr"  
i_functionre_functioni_functiontermr$  i_unicoderange1i_unicoderange2i_unicoderanger&  	i_commentr   i_importantr  rs   r   r   r[   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r   r  r  r	  r  r  r   r  r   r  r  r   r   r   r  r   r   r   r   r     s   
 5





-
&#9d*'4!#
F
r   )r-   
__future__r   r   abcr   typingr   reportlab.lib.pagesizesr   xhtml2pdf.defaultr   xhtml2pdf.utilr   xhtml2pdf.w3cr   r   r   r   r.   r   rj   r   r   r   r   r   r   <module>   s"    # 0