o
    3[cl                     @   sx  d Z ddlZddlZddlmZ ddlmZ dd ZejZG dd	 d	eZ	G d
d deZ
G dd deZG dd deZG dd deejZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG d d! d!eZG d"d# d#eZG d$d% d%eZG d&d' d'eZG d(d) d)eeZG d*d+ d+ejZG d,d- d-ejZdS ).a  CSS-2.1 engine

Primary classes:
    * CSSElementInterfaceAbstract
        Provide a concrete implementation for the XML element model used.

    * CSSCascadeStrategy
        Implements the CSS-2.1 engine's attribute lookup rules.

    * CSSParser
        Parses CSS source forms into usable results using CSSBuilder and
        CSSMutableSelector.  You may want to override parseExternal()

    * CSSBuilder (and CSSMutableSelector)
        A concrete implementation for cssParser.CSSBuilderAbstract (and
        cssParser.CSSSelectorAbstract) to provide usable results to
        CSSParser requests.

Dependencies:
    python 2.3 (or greater)
    sets, cssParser, re (via cssParser)
    N   )	cssParser)
cssSpecialc                 C   s   t |  N)StopIteration)value r   G/var/www/chikooza/env/lib/python3.10/site-packages/xhtml2pdf/w3c/css.pystopIter-      r
   c                   @   sR   e Zd ZefddZdd Zdd Zdd Zd	d
 ZdddZ	dd Z
dd ZdS )CSSElementInterfaceAbstractc                 C      t dNSubclass responsibilityNotImplementedError)selfnamedefaultr   r   r	   getAttr=   r   z#CSSElementInterfaceAbstract.getAttrc                 C      |  ddS )Nid r   r   r   r   r	   	getIdAttr@      z%CSSElementInterfaceAbstract.getIdAttrc                 C   r   )Nclassr   r   r   r   r   r	   getClassAttrC   r   z(CSSElementInterfaceAbstract.getClassAttrc                 C   r   r   r   r   r   r   r	   getInlineStyleF   r   z*CSSElementInterfaceAbstract.getInlineStylec                 C   r   r   r   r   r   r   r	   matchesNodeI   r   z'CSSElementInterfaceAbstract.matchesNoder   c                 C   r   r   r   r   r   paramsr   r   r	   inPseudoStateL   r   z)CSSElementInterfaceAbstract.inPseudoStatec                 C   r   )z;Results must be compatible with CSSElementInterfaceAbstractr   r   r   r   r   r	   iterXMLParentsO   s   z*CSSElementInterfaceAbstract.iterXMLParentsc                 C   r   r   r   r   r   r   r	   getPreviousSiblingS   r   z.CSSElementInterfaceAbstract.getPreviousSiblingNr   )__name__
__module____qualname__NotImplementedr   r   r   r   r    r#   r$   r%   r   r   r   r	   r   <   s    
r   c                   @   sj   e Zd ZdZdZdZdddZdddZdddZe	fdd	Z
e	fd
dZdd Zdd Ze	fddZdS )CSSCascadeStrategyNc                 C   s2   |d ur|| _ |d ur|| _|d ur|| _d S d S r   )authoruser	userAgenrr   r,   r-   	userAgentr   r   r	   __init__^   s   
zCSSCascadeStrategy.__init__c                 C   s8   |d u r| j }|d u r| j}|d u r| j}| |||S r   )r,   r-   r.   	__class__r/   r   r   r	   copyWithUpdatef   s   z!CSSCascadeStrategy.copyWithUpdatec                 c   s    | j d ur| j d V  | j d V  | jd ur| jd V  | jd ur.| jd V  | jd V  |r:|d V  |d V  | jd urG| jd V  d S d S Nr   r   )r.   r-   r,   )r   inliner   r   r	   iterCSSRulesetsq   s   





z"CSSCascadeStrategy.iterCSSRulesetsc                 C   s   |  ||}| |||S )M  Attempts to find the style setting for attrName in the CSSRulesets.

        Note: This method does not attempt to resolve rules that return
        "inherited", "default", or values that have units (including "%").
        This is left up to the client app to re-query the CSS in order to
        implement these semantics.
        )findCSSRulesFor_extractStyleForRule)r   elementattrNamer   ruler   r   r	   findStyleFor   s   zCSSCascadeStrategy.findStyleForc                    s$    ||} fdd| D S )r7   c                    s"   g | ]\}}| || fqS r   )r9   ).0r;   r<   r   r   r   r	   
<listcomp>   s    z8CSSCascadeStrategy.findStylesForEach.<locals>.<listcomp>)findCSSRulesForEachitems)r   r:   	attrNamesr   rulesr   r?   r	   findStylesForEach   s   z$CSSCascadeStrategy.findStylesForEachc                 C   s   g }|  }| jd ur!|| jd ||7 }|| jd ||7 }| jd ur1|| jd ||7 }| jd urL|| jd ||7 }|| jd ||7 }|rb||d ||7 }||d ||7 }| jd urr|| jd ||7 }|  |S r4   )r   r.   findCSSRuleForr-   r,   sort)r   r:   r;   rD   r5   r   r   r	   r8      s"   



z"CSSCascadeStrategy.findCSSRulesForc                 C   sf   t dd |D }| }| |D ]}| D ]\}}||||7 }qq| D ]}|  q*|S )Nc                 s   s    | ]}|g fV  qd S r   r   )r>   r   r   r   r	   	<genexpr>   s    z9CSSCascadeStrategy.findCSSRulesForEach.<locals>.<genexpr>)dictr   r6   rB   rF   rG   )r   r:   rC   rD   r5   rulesetr;   	attrRulesr   r   r	   rA      s   
z&CSSCascadeStrategy.findCSSRulesForEachc                 C   s4   |r|d d }|| S |t ur|S td||f )Nr   z#Could not find style for '%s' in %r)r*   LookupError)r   r<   r;   r   styler   r   r	   r9      s   z'CSSCascadeStrategy._extractStyleForRule)NNNr   )r'   r(   r)   r,   r-   r.   r1   r3   r6   r*   r=   rE   r8   rA   r9   r   r   r   r	   r+   Y   s    


r+   c                   @   s   e Zd ZdZdZdZd$ddZdd Zdd	 Zd
d Z	e
e	Zdd Ze
eZdd Ze
eZdd Ze
eZdd Zdd Zdd Zdd Zdd Zdd Zdd Zd%d d!Zd"d# ZdS )&CSSSelectorBaseFN*c                 C   s   t |ts
d d|f}|| _d S NrP   )
isinstancetuplecompleteName)r   rT   r   r   r	   r1      s   


zCSSSelectorBase.__init__c                 C   s   t | j|  | jf| _d S r   )hashfullNamespecificity
qualifiers_hashr   r   r   r	   _updateHash   s   zCSSSelectorBase._updateHashc                 C   s   | j d u r
t| S | j S r   )rY   object__hash__r   r   r   r	   r\         

zCSSSelectorBase.__hash__c                 C   
   | j d S )Nr   rT   r   r   r   r	   getNSPrefix      
zCSSSelectorBase.getNSPrefixc                 C   r^   )N   r_   r   r   r   r	   getName   ra   zCSSSelectorBase.getNamec                 C   r^   )Nr   r_   r   r   r   r	   getNamespace   ra   zCSSSelectorBase.getNamespacec                 C   s   | j dd S )Nr      r_   r   r   r   r	   getFullName      zCSSSelectorBase.getFullNamec                 C   s$   | j jf|   |  f }d| S )Nz<%s %d:%d:%d:%d %s >)r2   r'   rW   asString)r   strArgsr   r   r	   __repr__   s   zCSSSelectorBase.__repr__c                 C      |   S r   rh   r   r   r   r	   __str__  r   zCSSSelectorBase.__str__c                 C   s   |   | j| jfS r   )rW   rV   rX   r   r   r   r	   _as_comparison_key     z"CSSSelectorBase._as_comparison_keyc                 C   s   |   |  kS Python 3rn   r   otherr   r   r	   __eq__     zCSSSelectorBase.__eq__c                 C   s   |   |  k S rp   rr   rs   r   r   r	   __lt__  rv   zCSSSelectorBase.__lt__c                 C   s   | j d u r
|  | _ | j S r   )_specificity_calcSpecificityr   r   r   r	   rW     r]   zCSSSelectorBase.specificityc                 C   s   d}d}t | jdk}| jD ]?}| r|d7 }q| r"|d7 }q| r+|d7 }q| r4|d7 }q| rM|j	 \}}}}||7 }||7 }||7 }q| j
|||fS )z8from http://www.w3.org/TR/CSS21/cascade.html#specificityr   rP   r   )intr   rX   isHashisClassisAttrisPseudo
isCombinerselectorrW   r5   )r   	hashCountqualifierCountelementCountqiher   r   r	   ry     s&   




z CSSSelectorBase._calcSpecificityc                 C   sj   |d u rdS | j d d|jjfvrdS | j d dvr%| j d |jjkr%dS | jD ]
}||s2 dS q(dS )NFr   rP   r   )Nr   rP   T)rV   
domElementtagNamenamespaceURIrX   matches)r   r:   	qualifierr   r   r	   r   *  s    

zCSSSelectorBase.matchesc                 C   sp   g }| j d ur|d| j | jf  n|| j | jD ]}| r+|d|  q||  qd|S )Nz%s|%sr   r   )nsPrefixappendr   rX   r   insertrh   join)r   resultr   r   r   r	   rh   :  s   


zCSSSelectorBase.asString)rP   r   )r'   r(   r)   r5   rY   rx   r1   rZ   r\   r`   propertyr   rc   r   rd   	namespacerf   rV   rj   rm   rn   ru   rw   rW   ry   r   rh   r   r   r   r	   rO      s0    

rO   c                   @   s   e Zd ZdZdS )CSSInlineSelectorTN)r'   r(   r)   r5   r   r   r   r	   r   K  s    r   c                   @   sh   e Zd Zg Zdd Zdd ZeeZdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd ZdS )CSSMutableSelectorc                 C   s   t | jdd | jD S )Nc                 S   s   g | ]}|  qS r   asImmutable)r>   r   r   r   r	   r@   U  s    z2CSSMutableSelector.asImmutable.<locals>.<listcomp>)CSSImmutableSelectorrT   rX   r   r   r   r	   r   T  s   zCSSMutableSelector.asImmutablec                 C   s   | || |S r   )addCombination)klass	selectorAop	selectorBr   r   r	   combineSelectorsW  s   z#CSSMutableSelector.combineSelectorsc                 C      |  t|| d S r   )_addQualifierCSSSelectorCombinationQualifier)r   r   rt   r   r   r	   r   ]     z!CSSMutableSelector.addCombinationc                 C      |  t| d S r   )r   CSSSelectorHashQualifierr   hashIdr   r   r	   	addHashId`  ro   zCSSMutableSelector.addHashIdc                 C   r   r   )r   CSSSelectorClassQualifier)r   class_r   r   r	   addClassc  ro   zCSSMutableSelector.addClassc                 C   r   r   r   CSSSelectorAttributeQualifier)r   r;   r   r   r	   addAttributef  ro   zCSSMutableSelector.addAttributec                 C   s   |  t||| d S r   r   r   r;   r   	attrValuer   r   r	   addAttributeOperationi     z(CSSMutableSelector.addAttributeOperationc                 C   r   r   r   CSSSelectorPseudoQualifierr   r   r   r   r	   	addPseudol  ro   zCSSMutableSelector.addPseudoc                 C   r   r   r   r!   r   r   r	   addPseudoFunctiono  r   z$CSSMutableSelector.addPseudoFunctionc                 C   s"   | j r| j | d S |g| _ d S r   )rX   r   )r   r   r   r   r	   r   t  s   z CSSMutableSelector._addQualifierN)r'   r(   r)   rX   r   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r	   r   Q  s    r   c                   @   s&   e Zd ZdddZdd ZeeZdS )	r   rP   r   c                 C   s"   t || _t| | |   d S r   )rS   rX   rO   r1   rZ   )r   rT   rX   r   r   r	   r1   ~  s   
zCSSImmutableSelector.__init__c                 C   s   | |j |jS r   )rT   rX   )r   r   r   r   r	   fromSelector  rg   z!CSSImmutableSelector.fromSelectorN)rP   r   )r'   r(   r)   r1   r   r   r   r   r   r	   r   }  s    
r   c                   @   D   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )CSSSelectorQualifierBasec                 C      dS NFr   r   r   r   r	   r{        zCSSSelectorQualifierBase.isHashc                 C   r   r   r   r   r   r   r	   r|     r   z CSSSelectorQualifierBase.isClassc                 C   r   r   r   r   r   r   r	   r}     r   zCSSSelectorQualifierBase.isAttrc                 C   r   r   r   r   r   r   r	   r~     r   z!CSSSelectorQualifierBase.isPseudoc                 C   r   r   r   r   r   r   r	   r     r   z#CSSSelectorQualifierBase.isCombinerc                 C   s   | S r   r   r   r   r   r	   r     r   z$CSSSelectorQualifierBase.asImmutablec                 C   rk   r   rl   r   r   r   r	   rm     r   z CSSSelectorQualifierBase.__str__N)
r'   r(   r)   r{   r|   r}   r~   r   r   rm   r   r   r   r	   r     s    r   c                   @   r   )r   c                 C   
   || _ d S r   r   r   r   r   r	   r1     ra   z!CSSSelectorHashQualifier.__init__c                 C   r   NTr   r   r   r   r	   r{     r   zCSSSelectorHashQualifier.isHashc                 C      t | jfS r   )rU   r   r   r   r   r	   r\     r   z!CSSSelectorHashQualifier.__hash__c                 C   
   d| j  S )N#r   r   r   r   r	   rh     ra   z!CSSSelectorHashQualifier.asStringc                 C   s   |  | jkS r   )r   r   r   r:   r   r   r	   r     rg   z CSSSelectorHashQualifier.matchesc                 C      | j |j kS rp   r   rs   r   r   r	   ru        zCSSSelectorHashQualifier.__eq__c                 C      | j |j k S rp   r   rs   r   r   r	   rw     r   zCSSSelectorHashQualifier.__lt__N)
r'   r(   r)   r1   r{   r\   rh   r   ru   rw   r   r   r   r	   r     s    r   c                   @   r   )r   c                 C   r   r   classId)r   r   r   r   r	   r1     ra   z"CSSSelectorClassQualifier.__init__c                 C   r   r   r   r   r   r   r	   r|     r   z!CSSSelectorClassQualifier.isClassc                 C   r   r   )rU   r   r   r   r   r	   r\     r   z"CSSSelectorClassQualifier.__hash__c                 C   r   )N.r   r   r   r   r	   rh     ra   z"CSSSelectorClassQualifier.asStringc                 C   s*   |j jd}|d ur| j|j v S dS )Nr   F)r   
attributesgetr   r   splitr   r:   r   r   r   r	   r     s   z!CSSSelectorClassQualifier.matchesc                 C   r   rp   r   rs   r   r   r	   ru     r   z CSSSelectorClassQualifier.__eq__c                 C   r   rp   r   rs   r   r   r	   rw     r   z CSSSelectorClassQualifier.__lt__N)
r'   r(   r)   r1   r|   r\   rh   r   ru   rw   r   r   r   r	   r     s    r   c                   @   sJ   e Zd ZddeZZZdefddZdd Zdd Z	dd	 Z
d
d ZdS )r   Nc                 C   s.   || _ || jur|| _|| jur|| _d S d S r   )r   r   r   r   r   r   r	   r1     s   


z&CSSSelectorAttributeQualifier.__init__c                 C   r   r   r   r   r   r   r	   r}     r   z$CSSSelectorAttributeQualifier.isAttrc                 C   s   t | j| j| jfS r   )rU   r   r   r   r   r   r   r	   r\     r   z&CSSSelectorAttributeQualifier.__hash__c                 C   s*   | j tu rd| jf S d| j| j| j f S )Nz[%s]z[%s%s%s])r   r*   r   r   r   r   r   r	   rh     s   
z&CSSSelectorAttributeQualifier.asStringc                 C   s   | j d u r|| jttkS | j dkr| j|| jtkS | j dkr8|jj| j}|d ur6| j|j v S dS | j dkrT|jj| j}|d urR| j|jdv S dS t	d| j | f )N=z~=Fz|=-zUnknown operator %r for %r)
r   r   r   r*   r   r   r   r   r   RuntimeErrorr   r   r   r	   r     s   



z%CSSSelectorAttributeQualifier.matches)r'   r(   r)   r*   r   r   r   r1   r}   r\   rh   r   r   r   r   r	   r     s    r   c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )r   r   c                 C   s   || _ t|| _d S r   )r   rS   r"   )r   r;   r"   r   r   r	   r1     s   z#CSSSelectorPseudoQualifier.__init__c                 C   r   r   r   r   r   r   r	   r~     r   z#CSSSelectorPseudoQualifier.isPseudoc                 C      t | j| jfS r   )rU   r   r"   r   r   r   r	   r\        z#CSSSelectorPseudoQualifier.__hash__c                 C   s    | j rd| j S d| j| j f S )N:z:%s(%s))r"   r   r   r   r   r	   rh     s   
z#CSSSelectorPseudoQualifier.asStringc                 C   s   | | j| jS r   )r#   r   r"   r   r   r   r	   r     r   z"CSSSelectorPseudoQualifier.matchesNr&   )r'   r(   r)   r1   r~   r\   rh   r   r   r   r   r	   r     s    
r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )r   c                 C   s   || _ || _d S r   )r   r   )r   r   r   r   r   r	   r1     s   
z(CSSSelectorCombinationQualifier.__init__c                 C   r   r   r   r   r   r   r	   r      r   z*CSSSelectorCombinationQualifier.isCombinerc                 C   r   r   )rU   r   r   r   r   r   r	   r\   #  r   z(CSSSelectorCombinationQualifier.__hash__c                 C   s   |  | j| j S r   )r2   r   r   r   r   r   r   r	   r   &  r   z+CSSSelectorCombinationQualifier.asImmutablec                 C   s   d| j  | jf S )Nz%s%s)r   rh   r   r   r   r   r	   rh   )  r   z(CSSSelectorCombinationQualifier.asStringc                    sv   | j | j} |dkrt fdd| D S |dkr.t| d }|d u r)dS  |S |dkr9 | S d S )N c                 3   s    | ]}  |V  qd S r   r   )r>   parentr   r   r	   rH   /  s    z:CSSSelectorCombinationQualifier.matches.<locals>.<genexpr>>F+)r   r   anyr$   nextr   r%   )r   r:   r   r   r   r   r	   r   ,  s   
z'CSSSelectorCombinationQualifier.matchesN)	r'   r(   r)   r1   r   r\   r   rh   r   r   r   r   r	   r     s    r   c                   @      e Zd Zdd Zdd ZdS )CSSTerminalFunctionc                 C   s   || _ dd |D | _d S )Nc                 S   s"   g | ]}t |tr|nt|qS r   )rR   str)r>   paramr   r   r	   r@   @  s   " z0CSSTerminalFunction.__init__.<locals>.<listcomp>)r   r"   r!   r   r   r	   r1   >  s   zCSSTerminalFunction.__init__c                 C   s   d| j d| jf S )Nz<CSS function: %s(%s)>z, )r   r   r"   r   r   r   r	   rj   B  r   zCSSTerminalFunction.__repr__N)r'   r(   r)   r1   rj   r   r   r   r	   r   =  s    r   c                   @   r   )CSSTerminalOperatorc                 G   s   t | |S r   )rS   __new__)r   argsr   r   r	   r   G  r   zCSSTerminalOperator.__new__c                 C   s   dt |  S )Nr   )rS   rj   r   r   r   r	   rj   J  rg   zCSSTerminalOperator.__repr__N)r'   r(   r)   r   rj   r   r   r   r	   r   F  s    r   c                   @   s   e Zd Z	 dd Zdd ZdS )CSSDeclarationsc                 C   r   rq   Fr   rs   r   r   r	   ru   U     zCSSDeclarations.__eq__c                 C   r   r   r   rs   r   r   r	   rw   Y  r   zCSSDeclarations.__lt__N)r'   r(   r)   ru   rw   r   r   r   r	   r   R  s    r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )
CSSRulesetc                    s$    fdd|   D }|  |S )Nc                    s*   g | ]\}} |v r| r||fqS r   r   )r>   
nodeFilterdeclarationsr;   r:   r   r	   r@   `  s
    z.CSSRuleset.findCSSRulesFor.<locals>.<listcomp>)rB   rG   )r   r:   r;   ruleResultsr   r   r	   r8   _  s   zCSSRuleset.findCSSRulesForc                 C   s   |  ||dd  S NrL   r8   r   r:   r;   r   r   r	   rF   e  s   zCSSRuleset.findCSSRuleForc                 C   sP   |  D ]!\}}|| v r!| | r!t| | | |< | | | q|| |< qdS )z XXX Bugfix for use in PISA N)rB   copyupdate)r   styleskvr   r   r	   mergeStylesj  s   
zCSSRuleset.mergeStylesN)r'   r(   r)   r8   rF   r   r   r   r   r	   r   ^  s    r   c                   @   r   )CSSInlineRulesetc                 C   s   || v r
t  | fgS g S r   )r   r   r   r   r	   r8   u  s   z CSSInlineRuleset.findCSSRulesForc                 O   s   | j |i |dd  S r   r   )r   r   kwr   r   r	   rF   z  s   zCSSInlineRuleset.findCSSRuleForN)r'   r(   r)   r8   rF   r   r   r   r	   r   t  s    r   c                   @   sz  e Zd ZeZeZeZe	Z
eZeZi ZdZdZdZeefddZdd Zdd Zd	d
 Zdd Zdd ZdRddZdd Zdd ZdSddZdd Zdd Zdd Zdd Z dd  Z!d!d" Z"d#d$ Z#d%d& Z$d'd( Z%d)d* Z&d+d, Z'd-d. Z(d/d0 Z)d1d2 Z*d3d4 Z+d5d6 Z,d7d8 Z-d9d: Z.d;d< Z/dTd>d?Z0d@dA Z1dBdC Z2dSdDdEZ3dFdG Z4dHdI Z5dJdK Z6dLdM Z7dNdO Z8dPdQ Z9dS )U
CSSBuilderNTc                 C   s   |  | | | d S r   )setMediumSetsetTrackImportance)r   	mediumSettrackImportancer   r   r	   r1     s   
zCSSBuilder.__init__c                 C   s0   |sdS d|v r
dS |  |}t|  |S )NFallT)MediumSetFactoryboolgetMediumSetintersection)r   mediumsr   r   r	   isValidMedium  s   
zCSSBuilder.isValidMediumc                 C      | j S r   )r   r   r   r   r	   r        zCSSBuilder.getMediumSetc                 C   s   |  || _d S r   )r   r   r   r   r   r   r	   r     r   zCSSBuilder.setMediumSetc                 C   s   |   | d S r   )r   r   r  r   r   r	   updateMediumSet  ro   zCSSBuilder.updateMediumSetc                 C   r  r   r   r   r   r   r	   getTrackImportance  r  zCSSBuilder.getTrackImportancec                 C   r   r   r  )r   r   r   r   r	   r     ra   zCSSBuilder.setTrackImportancec                 C   s"   | j }| j  | _ || _i | _d S r   )__dict__r   _restoreState
namespaces)r   r
  r   r   r	   
_pushState  s   
zCSSBuilder._pushStatec                 C   s   | j | _d S r   )r
  r	  r   r   r   r	   	_popState  r   zCSSBuilder._popStatec                 C   sj   |p| j }| jr1g g }}|D ]}|d r||d d  q||d d  q||||fS ||S r   )DeclarationsFactoryr   r   )r   r   r  normal	importantdr   r   r	   _declarations  s   

zCSSBuilder._declarationsc                 C   s   | j |pd |p
d S r   )xmlnsSynonymsr   )r   urir   r   r	   _xmlnsGetSynonym  s   zCSSBuilder._xmlnsGetSynonymc                 C      |    d S r   r  r   r   r   r	   beginStylesheet  r   zCSSBuilder.beginStylesheetc                 C   r  r   r  r   r   r   r	   endStylesheet  r   zCSSBuilder.endStylesheetc                 C   s   | j r2|  |  }}|D ]\}}|| || q|D ]\}}|| || q||fS |  }	|D ]}
|	|
 q8|D ]}|	| qB|	S r   )r   RulesetFactoryr   )r   stylesheetElementsstylesheetImportsr  r  normalStylesheetimportantStylesheetnormalStyleElementimportantStyleElementr   
stylesheetstyleElementr   r   r	   r"    s   

zCSSBuilder.stylesheetc                 C   r  r   r  r   r   r   r	   beginInline  r   zCSSBuilder.beginInlinec                 C   r  r   r  r   r   r   r	   	endInline  r   zCSSBuilder.endInlinec                 C   s
   t |S r   )r   parseSpecialRulesr   r   r   r   r	   specialRules  ra   zCSSBuilder.specialRulesc                 C   s   |  |}| |tS r   )r(  r  r   r'  r   r   r	   r5     s   
zCSSBuilder.inlinec           	         s   |    | jr1|  \}}|  |  }}|D ]}| }|r&|||< |r,|||< q||fS |    fdd|D }| |S )Nc                    s   g | ]}|   fqS r   r   )r>   sr   r   r	   r@     s    z&CSSBuilder.ruleset.<locals>.<listcomp>)r(  r   r  r  r   )	r   	selectorsr   
normalDeclimportantDeclr  r  r)  r   r   r*  r	   rJ     s   


zCSSBuilder.rulesetc                 C   s4   |dkr	|d|fS | j |d }| |}|||fS rQ   )r  r   r  )r   r   r   xmlnsr   r   r	   resolveNamespacePrefix  s
   


z!CSSBuilder.resolveNamespacePrefixc                 C   r   r   )charset)r   r0  r   r   r	   	atCharset  ra   zCSSBuilder.atCharsetc                 C   s   |  |r
||S d S r   )r  parseExternal)r   import_r  r   r   r   r	   atImport  s   

zCSSBuilder.atImportc                 C   s   || j |< d S r   )r  )r   nsprefixr  r   r   r	   atNamespace  rg   zCSSBuilder.atNamespacec                 C   s   |  |r|S d S r   )r  )r   r  rJ   r   r   r	   atMedia  s   
zCSSBuilder.atMediac                 C   s   |  | dg|S zG
        This is overriden by xhtml2pdf.context.pisaCSSBuilder
        rP   rJ   r   )r   page
pseudopager   r   r   r	   atPage!     zCSSBuilder.atPagec                 C   s   |  | dg|S r8  r9  r'  r   r   r	   
atFontFace'  r=  zCSSBuilder.atFontFacec                 C   s   |t fS r   r*   )r   atIdentr   srcr   r   r	   r@  -  r   zCSSBuilder.atIdentc                 C   s
   |  |S r   )SelectorFactoryr   r   r   r	   r   2  ra   zCSSBuilder.selectorc                 C   s   | j |||S r   )rB  r   )r   r   r   r   r   r   r	   r   5  r   zCSSBuilder.combineSelectorsFc                 C   s   | j r|||fS ||fS r   r  )r   r   r   r  r   r   r	   r   :  s   
zCSSBuilder.propertyc                 C   sp   |dv rt |tr|| |S ||gS |d u r|d u r|gS t |tr1| |d |||d< |S | |||S )N),r   rL   )rR   listr   combineTermsTermOperatorFactory)r   termAr   termBr   r   r	   rE  ?  s   


zCSSBuilder.combineTermsc                 C      |S r   r   r   r   r   r   r	   	termIdentO  r   zCSSBuilder.termIdentc                 C   s   |r||fS |S r   r   )r   r   unitsr   r   r	   
termNumberR  s   zCSSBuilder.termNumberc                 C   rI  r   r   rJ  r   r   r	   termRGBW  r   zCSSBuilder.termRGBc                 C   rI  r   r   rJ  r   r   r	   termURIZ  r   zCSSBuilder.termURIc                 C   rI  r   r   rJ  r   r   r	   
termString]  r   zCSSBuilder.termStringc                 C   rI  r   r   rJ  r   r   r	   termUnicodeRange`  r   zCSSBuilder.termUnicodeRangec                 C   s   |  ||S r   )TermFunctionFactory)r   r   r   r   r   r	   termFunctionc  r   zCSSBuilder.termFunctionc                 C   s   |t fS r   r?  )r   rA  r   r   r	   termUnknownf  r   zCSSBuilder.termUnknown)Tr   )F):r'   r(   r)   r   r  r   rB  setr   r   r  r   rR  r   rF  r  r   r   r0  r1   r  r   r   r  r  r   r  r  r  r  r  r  r"  r$  r%  r(  r5   rJ   r/  r1  r4  r6  r7  r<  r>  r@  r   r   r   rE  rK  rM  rN  rO  rP  rQ  rS  rT  r   r   r   r	   r     sd    	

	

r   c                   @   s*   e Zd ZeZd	ddZdd Zdd ZdS )
	CSSParserNTc                 K   s6   |s|r|d u s
J | j di |}tj| | d S Nr   )createCSSBuilderr   rV  r1   )r   
cssBuildercreater   r   r   r	   r1   q  s   zCSSParser.__init__c                 K   s   | j di |S rW  )CSSBuilderFactory)r   r   r   r   r	   rX  w  r   zCSSParser.createCSSBuilderc                 C   s"   t j|r| |S td| )Nz&Cannot resolve external CSS file: "%s")ospathisfile	parseFiler   )r   cssResourceNamer   r   r	   r2  z  s   
zCSSParser.parseExternalr   )r'   r(   r)   r   r[  r1   rX  r2  r   r   r   r	   rV  n  s
    
rV  ) __doc__r   r\  r   r   r   r
   CSSParseErrorr[   r   r+   rO   r   CSSSelectorAbstractr   r   r   r   r   r   r   r   r   rS   r   rI   r   r   r   CSSBuilderAbstractr   rV  r   r   r   r	   <module>   s6   
s,)"	 k