U
    =gum                     @  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 |  d S N)StopIterationvalue r   5/tmp/pip-unpacked-wheel-d1lgvatt/xhtml2pdf/w3c/css.pystopIter.   s    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  s   t d S r   NotImplementedError)selfnamedefaultr   r   r   getAttr?   s    z#CSSElementInterfaceAbstract.getAttrc                 C  s   |  ddS )Nid r   r   r   r   r   	getIdAttrC   s    z%CSSElementInterfaceAbstract.getIdAttrc                 C  s   |  ddS )Nclassr   r   r   r   r   r   getClassAttrF   s    z(CSSElementInterfaceAbstract.getClassAttrc                 C  s   t d S r   r   r   r   r   r   getInlineStyleI   s    z*CSSElementInterfaceAbstract.getInlineStylec                 C  s   t d S r   r   r   r   r   r   matchesNodeM   s    z'CSSElementInterfaceAbstract.matchesNoder   c                 C  s   t d S r   r   r   r   paramsr   r   r   inPseudoStateQ   s    z)CSSElementInterfaceAbstract.inPseudoStatec                 C  s   t dS )z<Results must be compatible with CSSElementInterfaceAbstract.Nr   r   r   r   r   iterXMLParentsU   s    z*CSSElementInterfaceAbstract.iterXMLParentsc                 C  s   t d S r   r   r   r   r   r   getPreviousSiblingZ   s    z.CSSElementInterfaceAbstract.getPreviousSiblingN)r   )__name__
__module____qualname__r   NotImplementedr   r   r   r   r   r!   r"   r#   r   r   r   r   r   >   s   


r   c                   @  st   e Zd ZdZdZdZd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Nonereturnc                 C  s.   |d k	r|| _ |d k	r|| _|d k	r*|| _d S r   )authoruser	userAgenrr   r,   r-   Z	userAgentr   r   r   __init__g   s    zCSSCascadeStrategy.__init__c                 C  s:   |d kr| j }|d kr| j}|d kr*| j}t| |||S r   )r,   r-   r.   typer/   r   r   r   copyWithUpdateo   s    z!CSSCascadeStrategy.copyWithUpdatec                 c  s   | j d k	r"| j d V  | j d V  | jd k	r8| jd V  | jd k	rZ| jd V  | jd V  |rr|d V  |d V  | jd k	r| jd V  d S Nr      )r.   r-   r,   )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 )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 k	rB|| jd ||7 }|| jd ||7 }| jd k	rb|| jd ||7 }| jd k	r|| jd ||7 }|| jd ||7 }|r||d ||7 }||d ||7 }| jd k	r|| jd ||7 }|  |S r3   )r   r.   findCSSRuleForr-   r,   sort)r   r:   r;   rD   r5   r   r   r   r8      s"    



z"CSSCascadeStrategy.findCSSRulesForc                 C  sb   dd |D }|  }| |D ]&}| D ]\}}||||7 }q,q | D ]}|  qP|S )Nc                 S  s   i | ]
}|g qS r   r   )r>   r   r   r   r   
<dictcomp>   s      z:CSSCascadeStrategy.findCSSRulesForEach.<locals>.<dictcomp>)r   r6   rB   rF   rG   )r   r:   rC   rD   r5   rulesetr;   Z	attrRulesr   r   r   rA      s    
z&CSSCascadeStrategy.findCSSRulesForEachc                 C  s@   | r| d d }|| S |t k	r$|S d| d| }t|d S )Nr4   zCould not find style for 'z' in )r'   LookupError)r<   r;   r   stylemsgr   r   r   r9      s    z'CSSCascadeStrategy._extractStyleForRule)NNN)NNN)N)r$   r%   r&   r,   r-   r.   r0   r2   r6   r'   r=   rE   r8   rA   staticmethodr9   r   r   r   r   r(   b   s   

r(   c                   @  s   e Zd ZdZdZdZd'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dZd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)   r*   c                 C  s   t |tsd d|f}|| _d S NrP   )
isinstancetuplecompleteName)r   rT   r   r   r   r0      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 krt| S | j S r   )rY   object__hash__r   r   r   r   r\      s    

zCSSSelectorBase.__hash__c                 C  s
   | j d S )Nr   rT   r   r   r   r   nsPrefix   s    zCSSSelectorBase.nsPrefixc                 C  s
   | j d S )N   r]   r   r   r   r   r      s    zCSSSelectorBase.namec                 C  s
   | j d S )Nr4   r]   r   r   r   r   	namespace  s    zCSSSelectorBase.namespacec                 C  s   | j dd S )Nr4      r]   r   r   r   r   rV     s    zCSSSelectorBase.fullNamestrc                 C  s$   t | jf|  |  f}d| S )Nz<%s %d:%d:%d:%d %s >)r1   r$   rW   asString)r   ZstrArgsr   r   r   __repr__
  s    zCSSSelectorBase.__repr__c                 C  s   |   S r   rc   r   r   r   r   __str__  s    zCSSSelectorBase.__str__c                 C  s   |   | j| jfS r   )rW   rV   rX   r   r   r   r   _as_comparison_key  s    z"CSSSelectorBase._as_comparison_keyc                 C  s   |   |  kS r   rg   r   otherr   r   r   __eq__  s    zCSSSelectorBase.__eq__c                 C  s   |   |  k S r   rh   ri   r   r   r   __lt__  s    zCSSSelectorBase.__lt__c                 C  s   | j d kr|  | _ | j S r   )_specificity_calcSpecificityr   r   r   r   rW     s    

zCSSSelectorBase.specificityc           	      C  s   d}d}t | jdk}| jD ]t}| r2|d7 }q| sB| rL|d7 }q| r^|d7 }q| r|j	 \}}}}||7 }||7 }||7 }q| j
|||fS )z9From http://www.w3.org/TR/CSS21/cascade.html#specificity.r   rP   r4   )intr   rX   isHashisClassisAttrisPseudo
isCombinerselectorrW   r5   )	r   Z	hashCountZqualifierCountZelementCount	qualifierihqer   r   r   rn     s     




z CSSSelectorBase._calcSpecificityc                   sb    d krdS | j d d jjhkr&dS | j d dkrJ| j d  jjkrJdS t fdd| jD S )NFr4   rP   r   >   r   NrP   c                 3  s   | ]}|  V  qd S r   matches)r>   rv   r:   r   r   	<genexpr>?  s     z*CSSSelectorBase.matches.<locals>.<genexpr>)rV   
domElementZtagNameZnamespaceURIallrX   r   r:   r   r}   r   r|   2  s    zCSSSelectorBase.matchesc                 C  sr   g }| j d k	r(|| j  d| j  n|| j | jD ],}| rX|d|  q:||  q:d|S )N|r   r   )r^   appendr   rX   rt   insertrc   join)r   resultry   r   r   r   rc   A  s    

zCSSSelectorBase.asString)rP   )N)r$   r%   r&   r5   rY   rm   r0   rZ   r\   propertyr^   r   r`   rV   rd   rf   rg   rk   rl   rW   rn   r|   rc   r   r   r   r   rO      s.   




rO   c                   @  s   e Zd ZdZdS )CSSInlineSelectorTN)r$   r%   r&   r5   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]rX   c                 C  s   t | jdd | jD S )Nc                 S  s   g | ]}|  qS r   asImmutable)r>   ry   r   r   r   r@   _  s     z2CSSMutableSelector.asImmutable.<locals>.<listcomp>)CSSImmutableSelectorrT   rX   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  s   |  t|| d S r   )_addQualifierCSSSelectorCombinationQualifier)r   r   rj   r   r   r   r   g  s    z!CSSMutableSelector.addCombinationc                 C  s   |  t| d S r   )r   CSSSelectorHashQualifierr   hashIdr   r   r   	addHashIdj  s    zCSSMutableSelector.addHashIdc                 C  s   |  t| d S r   )r   CSSSelectorClassQualifier)r   class_r   r   r   addClassm  s    zCSSMutableSelector.addClassc                 C  s   |  t| d S r   r   CSSSelectorAttributeQualifier)r   r;   r   r   r   addAttributep  s    zCSSMutableSelector.addAttributec                 C  s   |  t||| d S r   r   r   r;   r   
attr_valuer   r   r   addAttributeOperations  s    z(CSSMutableSelector.addAttributeOperationc                 C  s   |  t| d S r   r   CSSSelectorPseudoQualifierr   r   r   r   r   	addPseudov  s    zCSSMutableSelector.addPseudoc                 C  s   |  t|| d S r   r   r   r   r   r   addPseudoFunctiony  s    z$CSSMutableSelector.addPseudoFunctionc                 C  s    | j r| j | n|g| _ d S r   )rX   r   )r   rv   r   r   r   r   ~  s    z CSSMutableSelector._addQualifierN)r$   r%   r&   rX   __annotations__r   rN   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z  s   

r   c                      s0   e Zd Zd	dd fddZedd Z  ZS )
r   rP   r   r)   r*   c                   s"   t || _t | |   d S r   )rS   rX   superr0   rZ   )r   rT   rX   	__class__r   r   r0     s    
zCSSImmutableSelector.__init__c                 C  s   | |j |jS r   )rT   rX   )clsru   r   r   r   fromSelector  s    z!CSSImmutableSelector.fromSelector)rP   r   )r$   r%   r&   r0   classmethodr   __classcell__r   r   r   r   r     s   r   c                   @  sj   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dZdS )CSSSelectorQualifierBasec                   C  s   dS NFr   r   r   r   r   rp     s    zCSSSelectorQualifierBase.isHashc                   C  s   dS r   r   r   r   r   r   rq     s    z CSSSelectorQualifierBase.isClassc                   C  s   dS r   r   r   r   r   r   rr     s    zCSSSelectorQualifierBase.isAttrc                   C  s   dS r   r   r   r   r   r   rs     s    z!CSSSelectorQualifierBase.isPseudoc                   C  s   dS r   r   r   r   r   r   rt     s    z#CSSSelectorQualifierBase.isCombinerc                 C  s   | S r   r   r   r   r   r   r     s    z$CSSSelectorQualifierBase.asImmutablec                 C  s   t d S r   r   r   r   r   r   rc     s    z!CSSSelectorQualifierBase.asStringrb   r*   c                 C  s   |   S r   re   r   r   r   r   rf     s    z CSSSelectorQualifierBase.__str__N)r$   r%   r&   rN   rp   rq   rr   rs   rt   r   r   rc   rf   r   r   r   r   r     s   





r   c                   @  sN   e Zd Zd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)   r*   c                 C  s
   || _ d S r   r   r   r   r   r   r0     s    z!CSSSelectorHashQualifier.__init__c                   C  s   dS NTr   r   r   r   r   rp     s    zCSSSelectorHashQualifier.isHashc                 C  s   t | jfS r   )rU   r   r   r   r   r   r\     s    z!CSSSelectorHashQualifier.__hash__c                 C  s   d| j  S )N#r   r   r   r   r   rc     s    z!CSSSelectorHashQualifier.asStringc                 C  s   |  | jkS r   )r   r   r   r   r   r   r|     s    z CSSSelectorHashQualifier.matchesc                 C  s   | j |j kS r   r   ri   r   r   r   rk     s    zCSSSelectorHashQualifier.__eq__c                 C  s   | j |j k S r   r   ri   r   r   r   rl     s    zCSSSelectorHashQualifier.__lt__N)r$   r%   r&   r0   rN   rp   r\   rc   r|   rk   rl   r   r   r   r   r     s   
r   c                   @  sN   e Zd Zd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)   r*   c                 C  s
   || _ d S r   classId)r   r   r   r   r   r0     s    z"CSSSelectorClassQualifier.__init__c                   C  s   dS r   r   r   r   r   r   rq     s    z!CSSSelectorClassQualifier.isClassc                 C  s   t | jfS r   )rU   r   r   r   r   r   r\     s    z"CSSSelectorClassQualifier.__hash__c                 C  s   d| j  S )N.r   r   r   r   r   rc     s    z"CSSSelectorClassQualifier.asStringc                 C  s*   |j jd}|d k	r&| j|j kS dS )Nr   F)r   
attributesgetr   r   split)r   r:   r   r   r   r   r|     s    z!CSSSelectorClassQualifier.matchesc                 C  s   | j |j kS r   r   ri   r   r   r   rk     s    z CSSSelectorClassQualifier.__eq__c                 C  s   | j |j k S r   r   ri   r   r   r   rl     s    z CSSSelectorClassQualifier.__lt__N)r$   r%   r&   r0   rN   rq   r\   rc   r|   rk   rl   r   r   r   r   r     s   
r   c                   @  sT   e Zd Zdde  ZZZdefddddZedd Z	dd	 Z
d
d Zdd ZdS )r   Nr)   r*   c                 C  s*   || _ || jk	r|| _|| jk	r&|| _d S r   )r   r   r   r   r   r   r   r0     s
    

z&CSSSelectorAttributeQualifier.__init__c                   C  s   dS r   r   r   r   r   r   rr     s    z$CSSSelectorAttributeQualifier.isAttrc                 C  s   t | j| j| jfS r   )rU   r   r   r   r   r   r   r   r\     s    z&CSSSelectorAttributeQualifier.__hash__c                 C  s2   | j tkrd| j dS d| j | j | j  dS )N[])r   r'   r   r   r   r   r   r   rc      s    
z&CSSSelectorAttributeQualifier.asStringc                 C  s   | j d kr|| jttkS | j dkr:| j|| jtkS | j dkrp|jj| j}|d k	rl| j|j kS dS | j dkr|jj| j}|d k	r| j|jdkS dS d| j d| }t	|d S )N=z~=Fz|=-zUnknown operator z for )
r   r   r   r'   r   r   r   r   r   RuntimeError)r   r:   r   rM   r   r   r   r|     s     



z%CSSSelectorAttributeQualifier.matches)r$   r%   r&   r'   r   r   r   r0   rN   rr   r\   rc   r|   r   r   r   r   r     s   
r   c                   @  s@   e Zd ZdddddZedd Zdd	 Zd
d Zdd ZdS )r   r   r)   r*   c                 C  s   || _ t|| _d S r   )r   rS   r    )r   r;   r    r   r   r   r0     s    z#CSSSelectorPseudoQualifier.__init__c                   C  s   dS r   r   r   r   r   r   rs     s    z#CSSSelectorPseudoQualifier.isPseudoc                 C  s   t | j| jfS r   )rU   r   r    r   r   r   r   r\   #  s    z#CSSSelectorPseudoQualifier.__hash__c                 C  s(   | j rd| j S d| j d| j  dS )N:())r    r   r   r   r   r   rc   &  s    z#CSSSelectorPseudoQualifier.asStringc                 C  s   | | j| jS r   )r!   r   r    r   r   r   r   r|   +  s    z"CSSSelectorPseudoQualifier.matchesN)r   )	r$   r%   r&   r0   rN   rs   r\   rc   r|   r   r   r   r   r     s   
r   c                   @  sF   e Zd ZddddZedd Zdd Zd	d
 Zdd Zdd Z	dS )r   r)   r*   c                 C  s   || _ || _d S r   )r   ru   )r   r   ru   r   r   r   r0   0  s    z(CSSSelectorCombinationQualifier.__init__c                   C  s   dS r   r   r   r   r   r   rt   4  s    z*CSSSelectorCombinationQualifier.isCombinerc                 C  s   t | j| jfS r   )rU   r   ru   r   r   r   r   r\   8  s    z(CSSSelectorCombinationQualifier.__hash__c                 C  s   t | | j| j S r   )r1   r   ru   r   r   r   r   r   r   ;  s    z+CSSSelectorCombinationQualifier.asImmutablec                 C  s   | j   | j S r   )ru   rc   r   r   r   r   r   rc   >  s    z(CSSSelectorCombinationQualifier.asStringc                   sv   | j | j } |dkr0t fdd| D S |dkr\t| d }|d krRdS  |S |dkrr | S d S )N c                 3  s   | ]}  |V  qd S r   r{   )r>   parentru   r   r   r~   D  s     z:CSSSelectorCombinationQualifier.matches.<locals>.<genexpr>>F+)r   ru   anyr"   nextr|   r#   )r   r:   r   r   r   r   r   r|   A  s    
z'CSSSelectorCombinationQualifier.matchesN)
r$   r%   r&   r0   rN   rt   r\   r   rc   r|   r   r   r   r   r   /  s   
r   c                   @  s(   e Zd ZddddZddddZdS )	CSSTerminalFunctionr)   r*   c                 C  s   || _ dd |D | _d S )Nc                 S  s"   g | ]}t |tr|nt|qS r   )rR   rb   )r>   paramr   r   r   r@   W  s    z0CSSTerminalFunction.__init__.<locals>.<listcomp>)r   r    r   r   r   r   r0   U  s    zCSSTerminalFunction.__init__rb   c                 C  s   d | jd| jS )Nz<CSS function: {}({})>z, )formatr   r   r    r   r   r   r   rd   [  s    zCSSTerminalFunction.__repr__N)r$   r%   r&   r0   rd   r   r   r   r   r   T  s   r   c                   @  s&   e Zd ZdZdd ZddddZdS )	CSSTerminalOperatorr   c                 G  s   t | |S r   )rS   __new__)r   argsr   r   r   r   b  s    zCSSTerminalOperator.__new__rb   r*   c                 C  s   dt |  S )Nr   )rS   rd   r   r   r   r   rd   e  s    zCSSTerminalOperator.__repr__N)r$   r%   r&   	__slots__r   rd   r   r   r   r   r   _  s   r   c                   @  s   e Zd Zdd Zdd ZdS )CSSDeclarationsc                 C  s   dS r   r   ri   r   r   r   rk   o  s    zCSSDeclarations.__eq__c                 C  s   dS r   r   ri   r   r   r   rl   r  s    zCSSDeclarations.__lt__N)r$   r%   r&   rk   rl   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 | ]"\}} |kr| r||fqS r   r{   )r>   Z
nodeFilterdeclarationsr;   r:   r   r   r@   x  s    
z.CSSRuleset.findCSSRulesFor.<locals>.<listcomp>)rB   rG   )r   r:   r;   ZruleResultsr   r   r   r8   w  s
    zCSSRuleset.findCSSRulesForc                 C  s   |  ||dd  S NrJ   r8   r   r:   r;   r   r   r   rF     s    zCSSRuleset.findCSSRuleForc                 C  sP   |  D ]B\}}|| krB| | rBt| | | |< | | | q|| |< qdS )zXXX Bugfix for use in PISA.N)rB   copyupdate)r   Zstyleskvr   r   r   mergeStyles  s
    zCSSRuleset.mergeStylesN)r$   r%   r&   r8   rF   r   r   r   r   r   r   v  s   	r   c                   @  s   e Zd Zdd Zdd ZdS )CSSInlineRulesetc                 C  s   || krt  | fgS g S r   )r   r   r   r   r   r8     s    z CSSInlineRuleset.findCSSRulesForc                 O  s   | j ||dd  S r   r   )r   r   kwr   r   r   rF     s    zCSSInlineRuleset.findCSSRuleForN)r$   r%   r&   r8   rF   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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d]d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,d8d9d:d;d<d=d>Z-d?d@ Z.e$dAdB Z/dCdD Z0dEdF Z1dGdHdIdJZ2dKdL Z3e$dMdN Z4e$d^dOdPZ5e$dQdR Z6e$dSdT Z7e$dUdV Z8e$dWdX Z9dYdZ Z:e$d[d\ Z;dS )_
CSSBuilderzClassVar[dict]xmlnsSynonymsNTr)   r*   c                 C  s   |  | | j|d d S )NtrackImportance)setMediumSetsetTrackImportance)r   	mediumSetr   r   r   r   r0     s    
zCSSBuilder.__init__c                 C  s0   |sdS d|krdS |  |}t|  |S )NFr   T)MediumSetFactoryboolgetMediumSetintersection)r   mediumsr   r   r   isValidMedium  s    
zCSSBuilder.isValidMediumc                 C  s   | j S r   )r   r   r   r   r   r     s    zCSSBuilder.getMediumSetc                 C  s   |  || _d S r   )r   r   r   r   r   r   r   r     s    zCSSBuilder.setMediumSetc                 C  s   |   | d S r   )r   r   r   r   r   r   updateMediumSet  s    zCSSBuilder.updateMediumSetc                 C  s   | j S r   r   r   r   r   r   getTrackImportance  s    zCSSBuilder.getTrackImportancer   c                C  s
   || _ d S r   r   )r   r   r   r   r   r     s    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  s    zCSSBuilder._popStatec                 C  sj   |p| j }| jrbg g  }}|D ]2}|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  s   |    d S r   r   r   r   r   r   beginStylesheet  s    zCSSBuilder.beginStylesheetc                 C  s   |    d S r   r   r   r   r   r   endStylesheet  s    zCSSBuilder.endStylesheetc                 C  s   | j rd|  |   }}|D ]\}}|| || q|D ]\}}|| || q>||fS |  }	|D ]}
|	|
 qp|D ]}|	| q|	S r   )r   RulesetFactoryr   )r   ZstylesheetElementsZstylesheetImportsr   r   ZnormalStylesheetZimportantStylesheetZnormalStyleElementZimportantStyleElementr   
stylesheetZstyleElementr   r   r   r     s    

zCSSBuilder.stylesheetc                 C  s   |    d S r   r   r   r   r   r   beginInline  s    zCSSBuilder.beginInlinec                 C  s   |    d S r   r   r   r   r   r   	endInline  s    zCSSBuilder.endInlinec                 C  s
   t | S r   )r   ZparseSpecialRulesr   r   r   r   specialRules  s    zCSSBuilder.specialRulesc                 C  s   |  |}| |tS r   )r  r   r   r   r   r   r   r   r5     s    
zCSSBuilder.inlinec           	        s   |    | jrb|  \}}|  |   }}|D ]$}| }|rL|||< |r4|||< q4||fS |    fdd|D }| |S )Nc                   s   g | ]}|   fqS r   r   )r>   sr  r   r   r@     s     z&CSSBuilder.ruleset.<locals>.<listcomp>)r  r   r   r   r   )	r   	selectorsr   Z
normalDeclZimportantDeclr   r   r  r   r   r  r   rI     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  s
   || _ d S r   )charset)r   r  r   r   r   	atCharset*  s    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   Znsprefixr   r   r   r   atNamespace2  s    zCSSBuilder.atNamespacec                 C  s   |  |r|S d S r   )r   )r   r   rI   r   r   r   atMedia5  s    
zCSSBuilder.atMediarb   z
str | Nonedictr   )r   
pseudopagedataisLandscapec                C  s   t dS )7This is overridden by xhtml2pdf.context.pisaCSSBuilder.Nr   )r   r   r  r  r  Z
pageBorderr   r   r   atPage:  s    
zCSSBuilder.atPagec                 C  s   |  | dg|S )r  rP   )rI   ru   r  r   r   r   
atFontFaceF  s    zCSSBuilder.atFontFacec                 C  s   |t fS r   r'   )Z_atIdentZ
_cssParsersrcr   r   r   atIdentJ  s    zCSSBuilder.atIdentc                 C  s
   |  |S r   )SelectorFactoryr   r   r   r   ru   P  s    zCSSBuilder.selectorc                 C  s   | j |||S r   )r  r   )r   r   r   r   r   r   r   r   S  s    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kr(t |tr || |S ||gS |d kr>|d kr>|gS t |trb| |d |||d< |S | |||S )N>   ,r   rJ   )rR   listr   combineTermsTermOperatorFactory)r   ZtermAr   ZtermBr   r   r   r  ]  s    


zCSSBuilder.combineTermsc                 C  s   | S r   r   r
   r   r   r   	termIdentl  s    zCSSBuilder.termIdentc                 C  s   |r| |fS | S r   r   )r   Zunitsr   r   r   
termNumberp  s    zCSSBuilder.termNumberc                 C  s   | S r   r   r
   r   r   r   termRGBv  s    zCSSBuilder.termRGBc                 C  s   | S r   r   r
   r   r   r   termURIz  s    zCSSBuilder.termURIc                 C  s   | S r   r   r
   r   r   r   
termString~  s    zCSSBuilder.termStringc                 C  s   | S r   r   r
   r   r   r   termUnicodeRange  s    zCSSBuilder.termUnicodeRangec                 C  s   |  ||S r   )TermFunctionFactory)r   r   r   r   r   r   termFunction  s    zCSSBuilder.termFunctionc                 C  s   | t fS r   r  )r  r   r   r   termUnknown  s    zCSSBuilder.termUnknown)N)N)<r$   r%   r&   r   r   r   r  setr   r   r   r   r$  r   r  r   r   r   r   r  r0   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rN   r  r5   rI   r  r	  r  r  r  r  r  r  ru   r   r   r  r  r  r   r!  r"  r#  r%  r&  r   r   r   r   r     st   
	

	





r   c                      s>   e Zd ZeZddddd fddZdd	 Zd
d Z  ZS )	CSSParserNT)creater)   r*   c                  s0   |s |r |d kst | jf |}t | d S r   )AssertionErrorcreateCSSBuilderr   r0   )r   Z
cssBuilderr)  r   r   r   r   r0     s    zCSSParser.__init__c                 K  s   | j f |S r   )CSSBuilderFactory)r   r   r   r   r   r+    s    zCSSParser.createCSSBuilderc                 C  s&   t | r| |S td| d S )Nz&Cannot resolve external CSS file: "%s")r   is_file	parseFiler   )r   ZcssResourceNamer   r   r   r
    s    
zCSSParser.parseExternal)N)	r$   r%   r&   r   r,  r0   r+  r
  r   r   r   r   r   r(    s   r(  )&__doc__
__future__r   r   abcr   pathlibr   typingr   Zxhtml2pdf.w3cr   r   r   ZCSSParseErrorr   r(   rO   r   ZCSSSelectorAbstractr   r   r   r   r   r   r   r   r   rS   r   r  r   r   r   ZCSSBuilderAbstractr   r(  r   r   r   r   <module>	   s:   $ k. +% t