o
    &zhum                     @  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
mZmZ dd	 ZejZG d
d dZG dd dZG dd d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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#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 )0a  
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:
    sets, cssParser, re (via cssParser)
    )annotationsN)abstractmethod)Path)ClassVar)	cssParser
cssSpecialc                 C  s   t |  N)StopIterationvalue r   L/var/www/html/kangema/venv/lib/python3.10/site-packages/xhtml2pdf/w3c/css.pystopIter.      r   c                   @  sj   e Zd ZeefddZdd Zdd Zedd Zed	d
 Z	edddZ
edd Zedd ZdS )CSSElementInterfaceAbstractc                 C     t r   NotImplementedError)selfnamedefaultr   r   r   getAttr?      z#CSSElementInterfaceAbstract.getAttrc                 C     |  ddS )Nid r   r   r   r   r   	getIdAttrC      z%CSSElementInterfaceAbstract.getIdAttrc                 C  r   )Nclassr   r   r   r   r   r   getClassAttrF   r   z(CSSElementInterfaceAbstract.getClassAttrc                 C  r   r   r   r   r   r   r   getInlineStyleI   r   z*CSSElementInterfaceAbstract.getInlineStylec                 C  r   r   r   r   r   r   r   matchesNodeM   r   z'CSSElementInterfaceAbstract.matchesNoder   c                 C  r   r   r   r   r   paramsr   r   r   inPseudoStateQ   r   z)CSSElementInterfaceAbstract.inPseudoStatec                 C  r   )z<Results must be compatible with CSSElementInterfaceAbstract.r   r   r   r   r   iterXMLParentsU   s   z*CSSElementInterfaceAbstract.iterXMLParentsc                 C  r   r   r   r   r   r   r   getPreviousSiblingZ   r   z.CSSElementInterfaceAbstract.getPreviousSiblingNr   )__name__
__module____qualname__r   NotImplementedr   r   r!   r"   r#   r&   r'   r(   r   r   r   r   r   >   s    


r   c                   @  sp   e Zd ZdZdZdZd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e	fddZdS )CSSCascadeStrategyNreturnNonec                 C  s2   |d ur|| _ |d ur|| _|d ur|| _d S d S r   )authoruser	userAgenrr   r1   r2   	userAgentr   r   r   __init__g   s   
zCSSCascadeStrategy.__init__c                 C  s:   |d u r| j }|d u r| j}|d u r| j}t| |||S r   )r1   r2   r3   typer4   r   r   r   copyWithUpdateo   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      )r3   r2   r1   )r   inliner   r   r   iterCSSRulesetsz   s   





z"CSSCascadeStrategy.iterCSSRulesetsc                 C  s   |  ||}| |||S )V  
        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 )r=   c                   s"   g | ]\}}| || fqS r   )r?   ).0rA   rB   r   r   r   r   
<listcomp>   s    z8CSSCascadeStrategy.findStylesForEach.<locals>.<listcomp>)findCSSRulesForEachitems)r   r@   	attrNamesr   rulesr   rE   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 r9   )r"   r3   findCSSRuleForr2   r1   sort)r   r@   rA   rJ   r;   r   r   r   r>      s"   



z"CSSCascadeStrategy.findCSSRulesForc                 C  sb   dd |D }|  }| |D ]}| D ]\}}||||7 }qq| D ]}|  q(|S )Nc                 S  s   i | ]}|g qS r   r   )rD   r   r   r   r   
<dictcomp>   s    z:CSSCascadeStrategy.findCSSRulesForEach.<locals>.<dictcomp>)r"   r<   rH   rL   rM   )r   r@   rI   rJ   r;   rulesetrA   	attrRulesr   r   r   rG      s   
z&CSSCascadeStrategy.findCSSRulesForEachc                 C  s<   | r| d d }|| S |t ur|S d| d| }t|)Nr:   zCould not find style for 'z' in )r-   LookupError)rB   rA   r   stylemsgr   r   r   r?      s   z'CSSCascadeStrategy._extractStyleForRule)NNNr/   r0   r   )r*   r+   r,   r1   r2   r3   r6   r8   r<   r-   rC   rK   r>   rG   staticmethodr?   r   r   r   r   r.   b   s    

r.   c                   @  s   e Zd ZdZdZdZd'd(ddZdd	 Zd
d Ze	dd Z
e	dd Ze	dd Ze	dd Zd)ddZd)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*r/   r0   c                 C  s   t |ts
d d|f}|| _d S NrX   )
isinstancetuplecompleteName)r   r\   r   r   r   r6      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   )ra   object__hash__r   r   r   r   rd         

zCSSSelectorBase.__hash__c                 C  
   | j d S )Nr   r\   r   r   r   r   nsPrefix      
zCSSSelectorBase.nsPrefixc                 C  rf   )N   rg   r   r   r   r   r      ri   zCSSSelectorBase.namec                 C  rf   )Nr:   rg   r   r   r   r   	namespace  ri   zCSSSelectorBase.namespacec                 C  s   | j dd S )Nr:      rg   r   r   r   r   r^        zCSSSelectorBase.fullNamestrc                 C  s&   t | jg|  |  R }d| S )Nz<%s %d:%d:%d:%d %s >)r7   r*   r_   asString)r   strArgsr   r   r   __repr__
  s   zCSSSelectorBase.__repr__c                 C     |   S r   ro   r   r   r   r   __str__  r   zCSSSelectorBase.__str__c                 C  s   |   | j| jfS r   )r_   r^   r`   r   r   r   r   _as_comparison_key     z"CSSSelectorBase._as_comparison_keyc                 C  s   |   |  kS r   ru   r   otherr   r   r   __eq__     zCSSSelectorBase.__eq__c                 C  s   |   |  k S r   rw   rx   r   r   r   __lt__  r{   zCSSSelectorBase.__lt__c                 C  s   | j d u r
|  | _ | j S r   )_specificity_calcSpecificityr   r   r   r   r_     re   zCSSSelectorBase.specificityc           	      C  s   d}d}t | jdk}| jD ]:}| r|d7 }q| s!| r&|d7 }q| r/|d7 }q| rH|j	 \}}}}||7 }||7 }||7 }q| j
|||fS )z9From http://www.w3.org/TR/CSS21/cascade.html#specificity.r   rX   r:   )intr   r`   isHashisClassisAttrisPseudo
isCombinerselectorr_   r;   )	r   	hashCountqualifierCountelementCount	qualifierihqer   r   r   r~     s"   



z CSSSelectorBase._calcSpecificityc                   sb    d u rdS | j d d jjhvrdS | j d dvr%| j d  jjkr%dS t fdd| jD S )NFr:   rX   r   >   Nr   rX   c                 3  s    | ]}|  V  qd S r   matches)rD   r   r@   r   r   	<genexpr>?      z*CSSSelectorBase.matches.<locals>.<genexpr>)r^   
domElementtagNamenamespaceURIallr`   r   r@   r   r   r   r   2  s   zCSSSelectorBase.matchesc                 C  sr   g }| j d ur|| j  d| j  n|| j | jD ]}| r,|d|  q||  qd|S )N|r   r   )rh   appendr   r`   r   insertro   join)r   resultr   r   r   r   ro   A  s   


zCSSSelectorBase.asString)rX   rU   r/   rn   r   )r*   r+   r,   r;   ra   r}   r6   rb   rd   propertyrh   r   rk   r^   rq   rt   ru   rz   r|   r_   r~   r   ro   r   r   r   r   rW      s0    






rW   c                   @  s   e Zd ZdZdS )CSSInlineSelectorTN)r*   r+   r,   r;   r   r   r   r   r   S  s    r   c                   @  sn   e Zd ZU g Zded< dd Ze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S )CSSMutableSelectorzClassVar[list]r`   c                 C  s   t | jdd | jD S )Nc                 S  s   g | ]}|  qS r   asImmutable)rD   r   r   r   r   rF   _  s    z2CSSMutableSelector.asImmutable.<locals>.<listcomp>)CSSImmutableSelectorr\   r`   r   r   r   r   r   ]  s   zCSSMutableSelector.asImmutablec                 C  s   | ||  |S r   )addCombination)	selectorAop	selectorBr   r   r   combineSelectorsb  s   z#CSSMutableSelector.combineSelectorsc                 C     |  t|| d S r   )_addQualifierCSSSelectorCombinationQualifier)r   r   ry   r   r   r   r   g     z!CSSMutableSelector.addCombinationc                 C     |  t| d S r   )r   CSSSelectorHashQualifierr   hashIdr   r   r   	addHashIdj  rv   zCSSMutableSelector.addHashIdc                 C  r   r   )r   CSSSelectorClassQualifier)r   class_r   r   r   addClassm  rv   zCSSMutableSelector.addClassc                 C  r   r   r   CSSSelectorAttributeQualifier)r   rA   r   r   r   addAttributep  rv   zCSSMutableSelector.addAttributec                 C  s   |  t||| d S r   r   r   rA   r   
attr_valuer   r   r   addAttributeOperations     z(CSSMutableSelector.addAttributeOperationc                 C  r   r   r   CSSSelectorPseudoQualifierr   r   r   r   r   	addPseudov  rv   zCSSMutableSelector.addPseudoc                 C  r   r   r   r$   r   r   r   addPseudoFunctiony  r   z$CSSMutableSelector.addPseudoFunctionc                 C  s"   | j r| j | d S |g| _ d S r   )r`   r   )r   r   r   r   r   r   ~  s   z CSSMutableSelector._addQualifierN)r*   r+   r,   r`   __annotations__r   rV   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z  s   
 
r   c                      s,   e Zd Zd	d
 fddZedd Z  ZS )r   rX   r   r/   r0   c                   s"   t || _t | |   d S r   )r[   r`   superr6   rb   )r   r\   r`   	__class__r   r   r6     s   
zCSSImmutableSelector.__init__c                 C  s   | |j |jS r   )r\   r`   )clsr   r   r   r   fromSelector  rm   z!CSSImmutableSelector.fromSelector)rX   r   rU   )r*   r+   r,   r6   classmethodr   __classcell__r   r   r   r   r     s    r   c                   @  sf   e Zd Zedd Zedd Zedd Zedd Zed	d
 Zdd Z	e
dd ZdddZdS )CSSSelectorQualifierBasec                   C     dS NFr   r   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 r   r   r   r   r   r   r        z$CSSSelectorQualifierBase.asImmutablec                 C  r   r   r   r   r   r   r   ro     r   z!CSSSelectorQualifierBase.asStringr/   rn   c                 C  rr   r   rs   r   r   r   r   rt     r   z CSSSelectorQualifierBase.__str__Nr   )r*   r+   r,   rV   r   r   r   r   r   r   r   ro   rt   r   r   r   r   r     s    





r   c                   @  J   e Zd ZdddZedd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )r   r/   r0   c                 C  
   || _ d S r   r   r   r   r   r   r6        
z!CSSSelectorHashQualifier.__init__c                   C  r   NTr   r   r   r   r   r     r   zCSSSelectorHashQualifier.isHashc                 C     t | jfS r   )r]   r   r   r   r   r   rd     r   z!CSSSelectorHashQualifier.__hash__c                 C     d| j  S )N#r   r   r   r   r   ro     r   z!CSSSelectorHashQualifier.asStringc                 C  s   |  | jkS r   )r   r   r   r   r   r   r        z CSSSelectorHashQualifier.matchesc                 C     | j |j kS r   r   rx   r   r   r   rz     r   zCSSSelectorHashQualifier.__eq__c                 C     | j |j k S r   r   rx   r   r   r   r|     r   zCSSSelectorHashQualifier.__lt__NrU   )r*   r+   r,   r6   rV   r   rd   ro   r   rz   r|   r   r   r   r   r     s    

r   c                   @  r   )r   r/   r0   c                 C  r   r   classId)r   r   r   r   r   r6     r   z"CSSSelectorClassQualifier.__init__c                   C  r   r   r   r   r   r   r   r     r   z!CSSSelectorClassQualifier.isClassc                 C  r   r   )r]   r   r   r   r   r   rd     r   z"CSSSelectorClassQualifier.__hash__c                 C  r   )N.r   r   r   r   r   ro     r   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   r   r   rx   r   r   r   rz     r   z CSSSelectorClassQualifier.__eq__c                 C  r   r   r   rx   r   r   r   r|     r   z CSSSelectorClassQualifier.__lt__NrU   )r*   r+   r,   r6   rV   r   rd   ro   r   rz   r|   r   r   r   r   r     s    

r   c                   @  sP   e Zd ZddeZZZdefdddZedd Z	dd	 Z
d
d Zdd ZdS )r   Nr/   r0   c                 C  s.   || _ || jur|| _|| jur|| _d S d S r   )r   r   r   r   r   r   r   r6     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   )r]   r   r   r   r   r   r   r   rd     r   z&CSSSelectorAttributeQualifier.__hash__c                 C  s2   | j tu rd| j dS d| j | j | j  dS )N[])r   r-   r   r   r   r   r   r   ro      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 d| j d| }t	|)N=z~=Fz|=-zUnknown operator z for )
r   r   r   r-   r   r   r   r   r   RuntimeError)r   r@   r   rT   r   r   r   r     s    



z%CSSSelectorAttributeQualifier.matchesrU   )r*   r+   r,   r-   r   r   r   r6   rV   r   rd   ro   r   r   r   r   r   r     s    
r   c                   @  s<   e Zd ZddddZedd Zdd	 Zd
d Zdd ZdS )r   r   r/   r0   c                 C  s   || _ t|| _d S r   )r   r[   r%   )r   rA   r%   r   r   r   r6     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   )r]   r   r%   r   r   r   r   rd   #  r{   z#CSSSelectorPseudoQualifier.__hash__c                 C  s(   | j r	d| j S d| j d| j  dS )N:())r%   r   r   r   r   r   ro   &  s   z#CSSSelectorPseudoQualifier.asStringc                 C  s   | | j| jS r   )r&   r   r%   r   r   r   r   r   +  r{   z"CSSSelectorPseudoQualifier.matchesNr)   rU   )	r*   r+   r,   r6   rV   r   rd   ro   r   r   r   r   r   r     s    
r   c                   @  sB   e Zd ZdddZedd Zdd Zd	d
 Zdd Zdd Z	dS )r   r/   r0   c                 C  s   || _ || _d S r   )r   r   )r   r   r   r   r   r   r6   0  s   
z(CSSSelectorCombinationQualifier.__init__c                   C  r   r   r   r   r   r   r   r   4  r   z*CSSSelectorCombinationQualifier.isCombinerc                 C  r   r   )r]   r   r   r   r   r   r   rd   8  r{   z(CSSSelectorCombinationQualifier.__hash__c                 C  s   t | | j| j S r   )r7   r   r   r   r   r   r   r   r   ;  r   z+CSSSelectorCombinationQualifier.asImmutablec                 C  s   | j   | j S r   )r   ro   r   r   r   r   r   ro   >  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   )rD   parentr   r   r   r   D  r   z:CSSSelectorCombinationQualifier.matches.<locals>.<genexpr>>F+)r   r   anyr'   nextr   r(   )r   r@   r   r   r   r   r   r   A  s   
z'CSSSelectorCombinationQualifier.matchesNrU   )
r*   r+   r,   r6   rV   r   rd   r   ro   r   r   r   r   r   r   /  s    

r   c                   @  s    e Zd Zd	ddZd
ddZdS )CSSTerminalFunctionr/   r0   c                 C  s   || _ dd |D | _d S )Nc                 S  s"   g | ]}t |tr|nt|qS r   )rZ   rn   )rD   paramr   r   r   rF   W  s    z0CSSTerminalFunction.__init__.<locals>.<listcomp>)r   r%   r$   r   r   r   r6   U  s   zCSSTerminalFunction.__init__rn   c                 C  s   d | jd| jS )Nz<CSS function: {}({})>z, )formatr   r   r%   r   r   r   r   rq   [  r   zCSSTerminalFunction.__repr__NrU   r   )r*   r+   r,   r6   rq   r   r   r   r   r   T  s    
r   c                   @  s"   e Zd ZdZdd Zd	ddZdS )
CSSTerminalOperatorr   c                 G  s   t | |S r   )r[   __new__)r   argsr   r   r   r   b  r   zCSSTerminalOperator.__new__r/   rn   c                 C  s   dt |  S )Nr   )r[   rq   r   r   r   r   rq   e  r   zCSSTerminalOperator.__repr__Nr   )r*   r+   r,   	__slots__r   rq   r   r   r   r   r   _  s    r   c                   @     e Zd Zdd Zdd ZdS )CSSDeclarationsc                 C  r   r   r   rx   r   r   r   rz   o  r   zCSSDeclarations.__eq__c                 C  r   r   r   rx   r   r   r   r|   r  r   zCSSDeclarations.__lt__N)r*   r+   r,   rz   r|   r   r   r   r   r   n  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   )rD   
nodeFilterdeclarationsrA   r@   r   r   rF   x  s
    z.CSSRuleset.findCSSRulesFor.<locals>.<listcomp>)rH   rM   )r   r@   rA   ruleResultsr   r   r   r>   w  s
   zCSSRuleset.findCSSRulesForc                 C  s   |  ||dd  S NrQ   r>   r   r@   rA   r   r   r   rL     s   zCSSRuleset.findCSSRuleForc                 C  sP   |  D ]!\}}|| v r!| | r!t| | | |< | | | q|| |< qdS )zXXX Bugfix for use in PISA.N)rH   copyupdate)r   styleskvr   r   r   mergeStyles  s   
zCSSRuleset.mergeStylesN)r*   r+   r,   r>   rL   r  r   r   r   r   r   v  s    	r   c                   @  r   )CSSInlineRulesetc                 C  s   || v r
t  | fgS g S r   )r   r   r   r   r   r>     s   z CSSInlineRuleset.findCSSRulesForc                 O  s   | j |i |dd  S r   r   )r   r   kwr   r   r   rL     s   zCSSInlineRuleset.findCSSRuleForN)r*   r+   r,   r>   rL   r   r   r   r   r    s    r  c                   @  s  e Zd ZU eZeZeZe	Z
eZeZi Zded< dZdZdZeefd`ddZd	d
 Zdd Zdd Zdd Zdd ZddddZdd Zdd ZdaddZdd Zdd Zd d! Z d"d# Z!d$d% Z"d&d' Z#e$d(d) Z%d*d+ Z&d,d- Z'd.d/ Z(d0d1 Z)d2d3 Z*d4d5 Z+d6d7 Z,dbd@dAZ-dBdC Z.e$dDdE Z/dFdG Z0dHdI Z1dJdKdLdMZ2dNdO Z3e$dPdQ Z4e$dadRdSZ5e$dTdU Z6e$dVdW Z7e$dXdY Z8e$dZd[ Z9d\d] Z:e$d^d_ Z;dS )c
CSSBuilderzClassVar[dict]xmlnsSynonymsNTr/   r0   c                 C  s   |  | | j|d d S )NtrackImportance)setMediumSetsetTrackImportance)r   	mediumSetr  r   r   r   r6     s   
zCSSBuilder.__init__c                 C  s0   |sdS d|v r
dS |  |}t|  |S )NFr   T)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  rv   zCSSBuilder.updateMediumSetc                 C  r  r   r
  r   r   r   r   getTrackImportance  r  zCSSBuilder.getTrackImportancer
  c                C  r   r   r
  )r   r  r   r   r   r    r   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   )r	  r   )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   r2    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   specialRules  ri   zCSSBuilder.specialRulesc                 C  s   |  |}| |tS r   )r8  r#  r  r   r   r   r   r   r;     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   )rD   sr7  r   r   rF     s    z&CSSBuilder.ruleset.<locals>.<listcomp>)r8  r  r#  r+  r   )	r   	selectorsr   
normalDeclimportantDeclr   r!  r:  r   r   r7  r   rO     s   


zCSSBuilder.rulesetc                 C  s4   |dkr	|d|fS | j |d }| |}|||fS rY   )r  r   r%  )r   rh   r   xmlnsr   r   r   resolveNamespacePrefix!  s
   


z!CSSBuilder.resolveNamespacePrefixc                 C  r   r   )charset)r   r@  r   r   r   	atCharset*  r   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   atNamespace2  r   zCSSBuilder.atNamespacec                 C  s   |  |r|S d S r   )r  )r   r  rO   r   r   r   atMedia5  s   
zCSSBuilder.atMediar   rn   
pseudopage
str | NonedatadictisLandscaper  c                C  r   )7This is overridden by xhtml2pdf.context.pisaCSSBuilder.r   )r   r   rH  rJ  rL  
pageBorderr   r   r   atPage:  s   
zCSSBuilder.atPagec                 C  s   |  | dg|S )rM  rX   )rO   r   r9  r   r   r   
atFontFaceF  s   zCSSBuilder.atFontFacec                 C  s   |t fS r   r-   )_atIdent
_cssParsersrcr   r   r   atIdentJ     zCSSBuilder.atIdentc                 C  s
   |  |S r   )SelectorFactoryr   r   r   r   r   P  r   zCSSBuilder.selectorc                 C  s   | j |||S r   )rW  r   )r   r   r   r   r   r   r   r   S  r{   zCSSBuilder.combineSelectorsF)r!  c                C  s   | j r|||fS ||fS r   r
  )r   r   r   r!  r   r   r   r   X  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   ,rQ   )rZ   listr   combineTermsTermOperatorFactory)r   termAr   termBr   r   r   rZ  ]  s   


zCSSBuilder.combineTermsc                 C  r   r   r   r
   r   r   r   	termIdentl  r   zCSSBuilder.termIdentc                 C  s   |r| |fS | S r   r   )r   unitsr   r   r   
termNumberp  s   zCSSBuilder.termNumberc                 C  r   r   r   r
   r   r   r   termRGBv  r   zCSSBuilder.termRGBc                 C  r   r   r   r
   r   r   r   termURIz  r   zCSSBuilder.termURIc                 C  r   r   r   r
   r   r   r   
termString~  r   zCSSBuilder.termStringc                 C  r   r   r   r
   r   r   r   termUnicodeRange  r   zCSSBuilder.termUnicodeRangec                 C  s   |  ||S r   )TermFunctionFactory)r   r   r   r   r   r   termFunction  r   zCSSBuilder.termFunctionc                 C  s   | t fS r   rQ  )rT  r   r   r   termUnknown  rV  zCSSBuilder.termUnknownrU   r   )r   rn   rH  rI  rJ  rK  rL  r  )<r*   r+   r,   r   r+  r   rW  setr  r   r  r   re  r   r[  r	  r   r  r  r@  r6   r  r  r  r  r  r  r  r  r#  r%  r(  r*  r2  r4  r5  rV   r8  r;   rO   r?  rA  rD  rF  rG  rO  rP  rU  r   r   r   rZ  r^  r`  ra  rb  rc  rd  rf  rg  r   r   r   r   r    sv   
 	

	






r  c                      s:   e Zd ZeZdddd fddZdd	 Zd
d Z  ZS )	CSSParserNT)creater/   r0   c                  s4   |s|r|d u s
J | j di |}t | d S Nr   )createCSSBuilderr   r6   )r   
cssBuilderrj  r  r   r   r   r6     s   zCSSParser.__init__c                 K  s   | j di |S rk  )CSSBuilderFactory)r   r  r   r   r   rl    r{   zCSSParser.createCSSBuilderc                 C  s"   t | r| |S td| )Nz&Cannot resolve external CSS file: "%s")r   is_file	parseFiler   )r   cssResourceNamer   r   r   rB    s   
zCSSParser.parseExternalr   rU   )	r*   r+   r,   r  rn  r6   rl  rB  r   r   r   r   r   ri    s
    ri  )&__doc__
__future__r   r   abcr   pathlibr   typingr   xhtml2pdf.w3cr   r   r   CSSParseErrorr   r.   rW   r   CSSSelectorAbstractr   r   r   r   r   r   r   r   r   r[   r   rK  r   r   r  CSSBuilderAbstractr  ri  r   r   r   r   <module>   s<   $ k. +% t