U
    ?el                     @   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 |  d S N)StopIteration)value r   5/tmp/pip-unpacked-wheel-35p66c5k/xhtml2pdf/w3c/css.pystopIter-   s    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   s   t dd S NSubclass responsibilityNotImplementedError)selfnamedefaultr   r   r	   getAttr=   s    z#CSSElementInterfaceAbstract.getAttrc                 C   s   |  ddS )Nid r   r   r   r   r	   	getIdAttr@   s    z%CSSElementInterfaceAbstract.getIdAttrc                 C   s   |  ddS )Nclassr   r   r   r   r   r	   getClassAttrC   s    z(CSSElementInterfaceAbstract.getClassAttrc                 C   s   t dd S r   r   r   r   r   r	   getInlineStyleF   s    z*CSSElementInterfaceAbstract.getInlineStylec                 C   s   t dd S r   r   r   r   r   r	   matchesNodeI   s    z'CSSElementInterfaceAbstract.matchesNoder   c                 C   s   t dd S r   r   r   r   paramsr   r   r	   inPseudoStateL   s    z)CSSElementInterfaceAbstract.inPseudoStatec                 C   s   t ddS )z;Results must be compatible with CSSElementInterfaceAbstractr   Nr   r   r   r   r	   iterXMLParentsO   s    z*CSSElementInterfaceAbstract.iterXMLParentsc                 C   s   t dd S r   r   r   r   r   r	   getPreviousSiblingS   s    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   s.   |d k	r|| _ |d k	r|| _|d k	r*|| _d S r   )authoruser	userAgenrr   r'   r(   Z	userAgentr   r   r	   __init__^   s    zCSSCascadeStrategy.__init__c                 C   s8   |d kr| j }|d kr| j}|d kr*| j}| |||S r   )r'   r(   r)   	__class__r*   r   r   r	   copyWithUpdatef   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'   )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 )r1   c                    s"   g | ]\}}| || fqS r   )r3   ).0r5   r6   r   r   r   r	   
<listcomp>   s   z8CSSCascadeStrategy.findStylesForEach.<locals>.<listcomp>)findCSSRulesForEachitems)r   r4   	attrNamesr   rulesr   r9   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 r.   )r   r)   findCSSRuleForr(   r'   sort)r   r4   r5   r>   r/   r   r   r	   r2      s"    



z"CSSCascadeStrategy.findCSSRulesForc                 C   sf   t dd |D }| }| |D ]&}| D ]\}}||||7 }q0q$| D ]}|  qT|S )Nc                 s   s   | ]}|g fV  qd S r   r   )r8   r   r   r   r	   	<genexpr>   s     z9CSSCascadeStrategy.findCSSRulesForEach.<locals>.<genexpr>)dictr   r0   r<   r@   rA   )r   r4   r=   r>   r/   rulesetr5   Z	attrRulesr   r   r	   r;      s    
z&CSSCascadeStrategy.findCSSRulesForEachc                 C   s8   |r|d d }|| S |t k	r$|S td||f d S )Nr   z#Could not find style for '%s' in %r)r%   LookupError)r   r6   r5   r   styler   r   r	   r3      s    z'CSSCascadeStrategy._extractStyleForRule)NNN)NNN)N)r"   r#   r$   r'   r(   r)   r+   r-   r0   r%   r7   r?   r2   r;   r3   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 NrI   )
isinstancetuplecompleteName)r   rM   r   r   r	   r+      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   )rR   object__hash__r   r   r   r	   rU      s    

zCSSSelectorBase.__hash__c                 C   s
   | j d S )Nr   rM   r   r   r   r	   getNSPrefix   s    zCSSSelectorBase.getNSPrefixc                 C   s
   | j d S )N   rV   r   r   r   r	   getName   s    zCSSSelectorBase.getNamec                 C   s
   | j d S )Nr   rV   r   r   r   r	   getNamespace   s    zCSSSelectorBase.getNamespacec                 C   s   | j dd S )Nr      rV   r   r   r   r	   getFullName   s    zCSSSelectorBase.getFullNamec                 C   s$   | j jf|   |  f }d| S )Nz<%s %d:%d:%d:%d %s >)r,   r"   rP   asString)r   ZstrArgsr   r   r	   __repr__   s    zCSSSelectorBase.__repr__c                 C   s   |   S r   r]   r   r   r   r	   __str__  s    zCSSSelectorBase.__str__c                 C   s   |   | j| jfS r   )rP   rO   rQ   r   r   r   r	   _as_comparison_key  s    z"CSSSelectorBase._as_comparison_keyc                 C   s   |   |  kS Python 3ra   r   otherr   r   r	   __eq__  s    zCSSSelectorBase.__eq__c                 C   s   |   |  k S rb   rd   re   r   r   r	   __lt__  s    zCSSSelectorBase.__lt__c                 C   s   | j d kr|  | _ | j S r   )_specificity_calcSpecificityr   r   r   r	   rP     s    

zCSSSelectorBase.specificityc                 C   s   d}d}t | jdk}| jD ]~}| r2|d7 }q| rD|d7 }q| rV|d7 }q| rh|d7 }q| r|j	 \}}}}||7 }||7 }||7 }q| j
|||fS )z8from http://www.w3.org/TR/CSS21/cascade.html#specificityr   rI   r   )intr   rQ   isHashisClassisAttrisPseudo
isCombinerselectorrP   r/   )r   Z	hashCountZqualifierCountZelementCountqiher   r   r	   rj     s$    





z CSSSelectorBase._calcSpecificityc                 C   sj   |d krdS | j d d|jjfkr&dS | j d dkrJ| j d |jjkrJdS | jD ]}||sP dS qPdS )NFr   rI   r   )Nr   rI   T)rO   
domElementZtagNameZnamespaceURIrQ   matches)r   r4   	qualifierr   r   r	   rw   *  s     

zCSSSelectorBase.matchesc                 C   sp   g }| j d k	r&|d| j | jf  n|| j | jD ],}| rV|d|  q8||  q8d|S )Nz%s|%sr   r   )nsPrefixappendr   rQ   rp   insertr]   join)r   resultrr   r   r   r	   r]   :  s    

zCSSSelectorBase.asString)rI   )N)r"   r#   r$   r/   rR   ri   r+   rS   rU   rW   propertyry   rY   r   rZ   	namespacer\   rO   r^   r`   ra   rg   rh   rP   rj   rw   r]   r   r   r   r	   rH      s.   

rH   c                   @   s   e Zd ZdZdS )CSSInlineSelectorTN)r"   r#   r$   r/   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)r8   rr   r   r   r	   r:   U  s     z2CSSMutableSelector.asImmutable.<locals>.<listcomp>)CSSImmutableSelectorrM   rQ   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   s   |  t|| d S r   )_addQualifierCSSSelectorCombinationQualifier)r   r   rf   r   r   r	   r   ]  s    z!CSSMutableSelector.addCombinationc                 C   s   |  t| d S r   )r   CSSSelectorHashQualifierr   hashIdr   r   r	   	addHashId`  s    zCSSMutableSelector.addHashIdc                 C   s   |  t| d S r   )r   CSSSelectorClassQualifier)r   class_r   r   r	   addClassc  s    zCSSMutableSelector.addClassc                 C   s   |  t| d S r   r   CSSSelectorAttributeQualifier)r   r5   r   r   r	   addAttributef  s    zCSSMutableSelector.addAttributec                 C   s   |  t||| d S r   r   r   r5   r   	attrValuer   r   r	   addAttributeOperationi  s    z(CSSMutableSelector.addAttributeOperationc                 C   s   |  t| d S r   r   CSSSelectorPseudoQualifierr   r   r   r   r	   	addPseudol  s    zCSSMutableSelector.addPseudoc                 C   s   |  t|| d S r   r   r   r   r   r	   addPseudoFunctiono  s    z$CSSMutableSelector.addPseudoFunctionc                 C   s    | j r| j | n|g| _ d S r   )rQ   rz   )r   rx   r   r   r	   r   t  s    z CSSMutableSelector._addQualifierN)r"   r#   r$   rQ   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   rI   r   c                 C   s"   t || _t| | |   d S r   )rL   rQ   rH   r+   rS   )r   rM   rQ   r   r   r	   r+   ~  s    
zCSSImmutableSelector.__init__c                 C   s   | |j |jS r   )rM   rQ   )r   rq   r   r   r	   fromSelector  s    z!CSSImmutableSelector.fromSelectorN)rI   r   )r"   r#   r$   r+   r   r   r   r   r   r	   r   }  s   
r   c                   @   sD   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   s   dS NFr   r   r   r   r	   rl     s    zCSSSelectorQualifierBase.isHashc                 C   s   dS r   r   r   r   r   r	   rm     s    z CSSSelectorQualifierBase.isClassc                 C   s   dS r   r   r   r   r   r	   rn     s    zCSSSelectorQualifierBase.isAttrc                 C   s   dS r   r   r   r   r   r	   ro     s    z!CSSSelectorQualifierBase.isPseudoc                 C   s   dS r   r   r   r   r   r	   rp     s    z#CSSSelectorQualifierBase.isCombinerc                 C   s   | S r   r   r   r   r   r	   r     s    z$CSSSelectorQualifierBase.asImmutablec                 C   s   |   S r   r_   r   r   r   r	   r`     s    z CSSSelectorQualifierBase.__str__N)
r"   r#   r$   rl   rm   rn   ro   rp   r   r`   r   r   r   r	   r     s   r   c                   @   sD   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 )r   c                 C   s
   || _ d S r   r   r   r   r   r	   r+     s    z!CSSSelectorHashQualifier.__init__c                 C   s   dS NTr   r   r   r   r	   rl     s    zCSSSelectorHashQualifier.isHashc                 C   s   t | jfS r   )rN   r   r   r   r   r	   rU     s    z!CSSSelectorHashQualifier.__hash__c                 C   s
   d| j  S )N#r   r   r   r   r	   r]     s    z!CSSSelectorHashQualifier.asStringc                 C   s   |  | jkS r   )r   r   r   r4   r   r   r	   rw     s    z CSSSelectorHashQualifier.matchesc                 C   s   | j |j kS rb   r   re   r   r   r	   rg     s    zCSSSelectorHashQualifier.__eq__c                 C   s   | j |j k S rb   r   re   r   r   r	   rh     s    zCSSSelectorHashQualifier.__lt__N)
r"   r#   r$   r+   rl   rU   r]   rw   rg   rh   r   r   r   r	   r     s   r   c                   @   sD   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 )r   c                 C   s
   || _ d S r   classId)r   r   r   r   r	   r+     s    z"CSSSelectorClassQualifier.__init__c                 C   s   dS r   r   r   r   r   r	   rm     s    z!CSSSelectorClassQualifier.isClassc                 C   s   t | jfS r   )rN   r   r   r   r   r	   rU     s    z"CSSSelectorClassQualifier.__hash__c                 C   s
   d| j  S )N.r   r   r   r   r	   r]     s    z"CSSSelectorClassQualifier.asStringc                 C   s*   |j jd}|d k	r&| j|j kS dS )Nr   F)rv   
attributesgetr   r   splitr   r4   r   r   r   r	   rw     s    z!CSSSelectorClassQualifier.matchesc                 C   s   | j |j kS rb   r   re   r   r   r	   rg     s    z CSSSelectorClassQualifier.__eq__c                 C   s   | j |j k S rb   r   re   r   r   r	   rh     s    z CSSSelectorClassQualifier.__lt__N)
r"   r#   r$   r+   rm   rU   r]   rw   rg   rh   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k	r|| _|| jk	r&|| _d S r   )r   r   r   r   r   r   r	   r+     s
    

z&CSSSelectorAttributeQualifier.__init__c                 C   s   dS r   r   r   r   r   r	   rn     s    z$CSSSelectorAttributeQualifier.isAttrc                 C   s   t | j| j| jfS r   )rN   r   r   r   r   r   r   r	   rU     s    z&CSSSelectorAttributeQualifier.__hash__c                 C   s*   | j tk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	   r]     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 t	d| j | f d S )N=z~=Fz|=-zUnknown operator %r for %r)
r   r   r   r%   r   rv   r   r   r   RuntimeErrorr   r   r   r	   rw     s    



z%CSSSelectorAttributeQualifier.matches)r"   r#   r$   r%   r   r   r   r+   rn   rU   r]   rw   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   rL   r   )r   r5   r   r   r   r	   r+     s    z#CSSSelectorPseudoQualifier.__init__c                 C   s   dS r   r   r   r   r   r	   ro     s    z#CSSSelectorPseudoQualifier.isPseudoc                 C   s   t | j| jfS r   )rN   r   r   r   r   r   r	   rU     s    z#CSSSelectorPseudoQualifier.__hash__c                 C   s$   | j rd| j S d| j| j f S d S )N:z:%s(%s))r   r   r   r   r   r	   r]     s    
z#CSSSelectorPseudoQualifier.asStringc                 C   s   | | j| jS r   )r   r   r   r   r   r   r	   rw     s    z"CSSSelectorPseudoQualifier.matchesN)r   )r"   r#   r$   r+   ro   rU   r]   rw   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   rq   )r   r   rq   r   r   r	   r+     s    z(CSSSelectorCombinationQualifier.__init__c                 C   s   dS r   r   r   r   r   r	   rp      s    z*CSSSelectorCombinationQualifier.isCombinerc                 C   s   t | j| jfS r   )rN   r   rq   r   r   r   r	   rU   #  s    z(CSSSelectorCombinationQualifier.__hash__c                 C   s   |  | j| j S r   )r,   r   rq   r   r   r   r   r	   r   &  s    z+CSSSelectorCombinationQualifier.asImmutablec                 C   s   d| j  | jf S )Nz%s%s)rq   r]   r   r   r   r   r	   r]   )  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   rw   )r8   parentrq   r   r	   rB   /  s     z:CSSSelectorCombinationQualifier.matches.<locals>.<genexpr>>F+)r   rq   anyr    nextrw   r!   )r   r4   r   r   r   r   r	   rw   ,  s    
z'CSSSelectorCombinationQualifier.matchesN)	r"   r#   r$   r+   rp   rU   r   r]   rw   r   r   r   r	   r     s   r   c                   @   s   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   )rK   str)r8   paramr   r   r	   r:   @  s     z0CSSTerminalFunction.__init__.<locals>.<listcomp>)r   r   r   r   r   r	   r+   >  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	   r^   B  s    zCSSTerminalFunction.__repr__N)r"   r#   r$   r+   r^   r   r   r   r	   r   =  s   r   c                   @   s   e Zd Zdd Zdd ZdS )CSSTerminalOperatorc                 G   s   t | |S r   )rL   __new__)r   argsr   r   r	   r   G  s    zCSSTerminalOperator.__new__c                 C   s   dt |  S )Nr   )rL   r^   r   r   r   r	   r^   J  s    zCSSTerminalOperator.__repr__N)r"   r#   r$   r   r^   r   r   r   r	   r   F  s   r   c                   @   s   e Zd Zdd Zdd ZdS )CSSDeclarationsc                 C   s   dS rc   Fr   re   r   r   r	   rg   U  s    zCSSDeclarations.__eq__c                 C   s   dS r   r   re   r   r   r	   rh   Y  s    zCSSDeclarations.__lt__N)r"   r#   r$   rg   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S )
CSSRulesetc                    s$    fdd|   D }|  |S )Nc                    s*   g | ]"\}} |kr| r||fqS r   r   )r8   Z
nodeFilterdeclarationsr5   r4   r   r	   r:   `  s     
z.CSSRuleset.findCSSRulesFor.<locals>.<listcomp>)r<   rA   )r   r4   r5   ZruleResultsr   r   r	   r2   _  s    zCSSRuleset.findCSSRulesForc                 C   s   |  ||dd  S NrE   r2   r   r4   r5   r   r   r	   r@   e  s    zCSSRuleset.findCSSRuleForc                 C   sP   |  D ]B\}}|| krB| | rBt| | | |< | | | q|| |< qdS )z XXX Bugfix for use in PISA N)r<   copyupdate)r   Zstyleskvr   r   r	   mergeStylesj  s
    zCSSRuleset.mergeStylesN)r"   r#   r$   r2   r@   r   r   r   r   r	   r   ^  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	   r2   u  s    z CSSInlineRuleset.findCSSRulesForc                 O   s   | j ||dd  S r   r   )r   r   kwr   r   r	   r@   z  s    zCSSInlineRuleset.findCSSRuleForN)r"   r#   r$   r2   r@   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 Z2dUdDdEZ3dFdG Z4dHdI Z5dJdK Z6dLdM Z7dNdO Z8dPdQ Z9dS )V
CSSBuilderNTc                 C   s   |  | | | d S r   )setMediumSetsetTrackImportance)r   	mediumSettrackImportancer   r   r	   r+     s    
zCSSBuilder.__init__c                 C   s0   |sdS d|krdS |  |}t|  |S )NFallT)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.getTrackImportancec                 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   sn   |p| j }| jrbg g  }}|D ]2}|d r>||d d  q||d d  q||||fS ||S d S r   )DeclarationsFactoryr   rz   )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   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 d 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   r	   specialRules  s    zCSSBuilder.specialRulesc                 C   s   |  |}| |tS r   )r   r   r   r   r   r   r	   r/     s    
zCSSBuilder.inlinec           	         s   |    | jrb|  \}}|  |   }}|D ]$}| }|rL|||< |r4|||< q4||fS |    fdd|D }| |S d S )Nc                    s   g | ]}|   fqS r   r   )r8   sr   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	   rD     s    


zCSSBuilder.rulesetc                 C   s4   |dkr|d|fS | j |d }| |}|||fS rJ   )r   r   r   )r   ry   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	   atNamespace  s    zCSSBuilder.atNamespacec                 C   s   |  |r|S d S r   )r   )r   r   rD   r   r   r	   atMedia  s    
zCSSBuilder.atMediac                 C   s   |  | dg|S zG
        This is overriden by xhtml2pdf.context.pisaCSSBuilder
        rI   rD   rq   )r   pageZ
pseudopager   r   r   r	   atPage!  s    zCSSBuilder.atPagec                 C   s   |  | dg|S r  r  r   r   r   r	   
atFontFace'  s    zCSSBuilder.atFontFacec                 C   s   |t fS r   r%   )r   atIdentr   srcr   r   r	   r  -  s    zCSSBuilder.atIdentc                 C   s
   |  |S r   )SelectorFactoryr   r   r   r	   rq   2  s    zCSSBuilder.selectorc                 C   s   | j |||S r   )r
  r   )r   r   r   r   r   r   r	   r   5  s    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   st   |dkr(t |tr || |S ||gS |d kr>|d kr>|gS t |trb| |d |||d< |S | |||S d S )N),r   rE   )rK   listrz   combineTermsTermOperatorFactory)r   ZtermAr   ZtermBr   r   r	   r  ?  s    


zCSSBuilder.combineTermsc                 C   s   |S r   r   r   r   r   r   r	   	termIdentO  s    zCSSBuilder.termIdentc                 C   s   |r||fS |S r   r   )r   r   Zunitsr   r   r	   
termNumberR  s    zCSSBuilder.termNumberc                 C   s   |S r   r   r  r   r   r	   termRGBW  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	   termFunctionc  s    zCSSBuilder.termFunctionc                 C   s   |t fS r   r  )r   r	  r   r   r	   termUnknownf  s    zCSSBuilder.termUnknown)T)N)F)N):r"   r#   r$   r   r   r   r
  setr   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/   rD   r   r   r   r   r  r  r  r  rq   r   r~   r  r  r  r  r  r  r  r  r  r   r   r   r	   r     sb   	

	

r   c                   @   s*   e Zd ZeZd	ddZdd Zdd ZdS )
	CSSParserNTc                 K   s2   |s |r |d kst | jf |}tj| | d S r   )AssertionErrorcreateCSSBuilderr   r  r+   )r   Z
cssBuildercreater   r   r   r	   r+   q  s    zCSSParser.__init__c                 K   s   | j f |S r   )CSSBuilderFactory)r   r   r   r   r	   r  w  s    zCSSParser.createCSSBuilderc                 C   s&   t j|r| |S td| d S )Nz&Cannot resolve external CSS file: "%s")ospathisfile	parseFiler   )r   ZcssResourceNamer   r   r	   r   z  s    
zCSSParser.parseExternal)NT)r"   r#   r$   r   r  r+   r  r   r   r   r   r	   r  n  s   
r  ) __doc__r   r  r   r   r   r
   ZCSSParseErrorrT   r   r&   rH   r   ZCSSSelectorAbstractr   r   r   r   r   r   r   r   r   rL   r   rC   r   r   r   ZCSSBuilderAbstractr   r  r   r   r   r	   <module>   s4   s,)"	 k