o
    G1bl                     @   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   /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   Nr   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-   Z	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.
        N)findCSSRulesFor_extractStyleForRule)r   elementattrNamer   ruler   r   r	   findStyleFor   s   zCSSCascadeStrategy.findStyleForc                    s$    ||} fdd| D S )r6   c                    s"   g | ]\}}| || fqS r   )r8   ).0r:   r;   r   r   r   r	   
<listcomp>   s    z8CSSCascadeStrategy.findStylesForEach.<locals>.<listcomp>N)findCSSRulesForEachitems)r   r9   	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 r3   )r   r.   findCSSRuleForr-   r,   sort)r   r9   r:   rC   r4   r   r   r	   r7      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   r5   rA   rE   rF   )r   r9   rB   rC   r4   rulesetr:   Z	attrRulesr   r   r	   r@      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	   r8      s   z'CSSCascadeStrategy._extractStyleForRule)NNNr   )r'   r(   r)   r,   r-   r.   r0   r2   r5   r*   r<   rD   r7   r@   r8   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 NrN   )
isinstancetuplecompleteName)r   rR   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 u r
t| S | j S r   )rW   object__hash__r   r   r   r	   rZ         

zCSSSelectorBase.__hash__c                 C   
   | j d S )Nr   rR   r   r   r   r	   getNSPrefix      
zCSSSelectorBase.getNSPrefixc                 C   r\   )N   r]   r   r   r   r	   getName   r_   zCSSSelectorBase.getNamec                 C   r\   )Nr   r]   r   r   r   r	   getNamespace   r_   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 >)r1   r'   rU   asString)r   ZstrArgsr   r   r	   __repr__   s   zCSSSelectorBase.__repr__c                 C      |   S r   rf   r   r   r   r	   __str__  r   zCSSSelectorBase.__str__c                 C   s   |   | j| jfS r   )rU   rT   rV   r   r   r   r	   _as_comparison_key     z"CSSSelectorBase._as_comparison_keyc                 C   s   |   |  kS Python 3Nrk   r   otherr   r   r	   __eq__     zCSSSelectorBase.__eq__c                 C   s   |   |  k S rm   ro   rp   r   r   r	   __lt__  rs   zCSSSelectorBase.__lt__c                 C   s   | j d u r
|  | _ | j S r   )_specificity_calcSpecificityr   r   r   r	   rU     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   rN   r   N)intr   rV   isHashisClassisAttrisPseudo
isCombinerselectorrU   r4   )r   Z	hashCountZqualifierCountZelementCountqiher   r   r	   rv     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   rN   r   )Nr   rN   T)rT   
domElementZtagNameZnamespaceURIrV   matches)r   r9   	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   rV   r|   insertrf   join)r   resultr~   r   r   r	   rf   :  s   


zCSSSelectorBase.asString)rN   r   )r'   r(   r)   r4   rW   ru   r0   rX   rZ   r^   propertyr   ra   r   rb   	namespacerd   rT   rg   rj   rk   rr   rt   rU   rv   r   rf   r   r   r   r	   rM      s0    

rM   c                   @   s   e Zd ZdZdS )CSSInlineSelectorTN)r'   r(   r)   r4   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>)CSSImmutableSelectorrR   rV   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   rq   r   r   r	   r   ]     z!CSSMutableSelector.addCombinationc                 C      |  t| d S r   )r   CSSSelectorHashQualifierr   hashIdr   r   r	   	addHashId`  rl   zCSSMutableSelector.addHashIdc                 C   r   r   )r   CSSSelectorClassQualifier)r   class_r   r   r	   addClassc  rl   zCSSMutableSelector.addClassc                 C   r   r   r   CSSSelectorAttributeQualifier)r   r:   r   r   r	   addAttributef  rl   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  rl   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   )rV   r   )r   r   r   r   r	   r   t  s   z CSSMutableSelector._addQualifierN)r'   r(   r)   rV   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   rN   r   c                 C   s"   t || _t| | |   d S r   )rQ   rV   rM   r0   rX   )r   rR   rV   r   r   r	   r0   ~  s   
zCSSImmutableSelector.__init__c                 C   s   | |j |jS r   )rR   rV   )r   r}   r   r   r	   fromSelector  re   z!CSSImmutableSelector.fromSelectorN)rN   r   )r'   r(   r)   r0   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	   rx        zCSSSelectorQualifierBase.isHashc                 C   r   r   r   r   r   r   r	   ry     r   z CSSSelectorQualifierBase.isClassc                 C   r   r   r   r   r   r   r	   rz     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   rh   r   ri   r   r   r   r	   rj     r   z CSSSelectorQualifierBase.__str__N)
r'   r(   r)   rx   ry   rz   r{   r|   r   rj   r   r   r   r	   r     s    r   c                   @   r   )r   c                 C   
   || _ d S r   r   r   r   r   r	   r0     r_   z!CSSSelectorHashQualifier.__init__c                 C   r   NTr   r   r   r   r	   rx     r   zCSSSelectorHashQualifier.isHashc                 C      t | jfS r   )rS   r   r   r   r   r	   rZ     r   z!CSSSelectorHashQualifier.__hash__c                 C   
   d| j  S )N#r   r   r   r   r	   rf     r_   z!CSSSelectorHashQualifier.asStringc                 C   s   |  | jkS r   )r   r   r   r9   r   r   r	   r     re   z CSSSelectorHashQualifier.matchesc                 C      | j |j kS rm   r   rp   r   r   r	   rr        zCSSSelectorHashQualifier.__eq__c                 C      | j |j k S rm   r   rp   r   r   r	   rt     r   zCSSSelectorHashQualifier.__lt__N)
r'   r(   r)   r0   rx   rZ   rf   r   rr   rt   r   r   r   r	   r     s    r   c                   @   r   )r   c                 C   r   r   classId)r   r   r   r   r	   r0     r_   z"CSSSelectorClassQualifier.__init__c                 C   r   r   r   r   r   r   r	   ry     r   z!CSSSelectorClassQualifier.isClassc                 C   r   r   )rS   r   r   r   r   r	   rZ     r   z"CSSSelectorClassQualifier.__hash__c                 C   r   )N.r   r   r   r   r	   rf     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   r9   r   r   r   r	   r     s   z!CSSSelectorClassQualifier.matchesc                 C   r   rm   r   rp   r   r   r	   rr     r   z CSSSelectorClassQualifier.__eq__c                 C   r   rm   r   rp   r   r   r	   rt     r   z CSSSelectorClassQualifier.__lt__N)
r'   r(   r)   r0   ry   rZ   rf   r   rr   rt   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	   r0     s   


z&CSSSelectorAttributeQualifier.__init__c                 C   r   r   r   r   r   r   r	   rz     r   z$CSSSelectorAttributeQualifier.isAttrc                 C   s   t | j| j| jfS r   )rS   r   r   r   r   r   r   r	   rZ     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	   rf     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   r0   rz   rZ   rf   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   rQ   r"   )r   r:   r"   r   r   r	   r0     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   )rS   r   r"   r   r   r   r	   rZ        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	   rf     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)   r0   r{   rZ   rf   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	   r0     s   
z(CSSSelectorCombinationQualifier.__init__c                 C   r   r   r   r   r   r   r	   r|      r   z*CSSSelectorCombinationQualifier.isCombinerc                 C   r   r   )rS   r   r}   r   r   r   r	   rZ   #  r   z(CSSSelectorCombinationQualifier.__hash__c                 C   s   |  | j| j S r   )r1   r   r}   r   r   r   r   r	   r   &  r   z+CSSSelectorCombinationQualifier.asImmutablec                 C   s   d| j  | jf S )Nz%s%s)r}   rf   r   r   r   r   r	   rf   )  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	   rG   /  s    z:CSSSelectorCombinationQualifier.matches.<locals>.<genexpr>>F+)r   r}   anyr$   nextr   r%   )r   r9   r   r   r   r   r	   r   ,  s   
z'CSSSelectorCombinationQualifier.matchesN)	r'   r(   r)   r0   r|   rZ   r   rf   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   )rP   str)r=   paramr   r   r	   r?   @  s   " z0CSSTerminalFunction.__init__.<locals>.<listcomp>)r   r"   r!   r   r   r	   r0   >  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	   rg   B  r   zCSSTerminalFunction.__repr__N)r'   r(   r)   r0   rg   r   r   r   r	   r   =  s    r   c                   @   r   )CSSTerminalOperatorc                 G   s   t | |S r   )rQ   __new__)r   argsr   r   r	   r   G  r   zCSSTerminalOperator.__new__c                 C   s   dt |  S )Nr   )rQ   rg   r   r   r   r	   rg   J  re   zCSSTerminalOperator.__repr__N)r'   r(   r)   r   rg   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   rn   FNr   rp   r   r   r	   rr   U     zCSSDeclarations.__eq__c                 C   r   r   r   rp   r   r   r	   rt   Y  r   zCSSDeclarations.__lt__N)r'   r(   r)   rr   rt   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=   Z
nodeFilterdeclarationsr:   r9   r   r	   r?   `  s
    z.CSSRuleset.findCSSRulesFor.<locals>.<listcomp>)rA   rF   )r   r9   r:   ZruleResultsr   r   r	   r7   _  s   zCSSRuleset.findCSSRulesForc                 C   s   |  ||dd  S NrJ   r7   r   r9   r:   r   r   r	   rE   e  s   zCSSRuleset.findCSSRuleForc                 C   sP   |  D ]!\}}|| v r!| | r!t| | | |< | | | q|| |< qdS )z XXX Bugfix for use in PISA N)rA   copyupdate)r   Zstyleskvr   r   r	   mergeStylesj  s   
zCSSRuleset.mergeStylesN)r'   r(   r)   r7   rE   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	   r7   u  s   z CSSInlineRuleset.findCSSRulesForc                 O   s   | j |i |dd  S r   r   )r   r   kwr   r   r	   rE   z  s   zCSSInlineRuleset.findCSSRuleForN)r'   r(   r)   r7   rE   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	   r0     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  rl   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     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   )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   ZstylesheetElementsZstylesheetImportsr  r  ZnormalStylesheetZimportantStylesheetZnormalStyleElementZimportantStyleElementr   
stylesheetZ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   ZparseSpecialRulesr   r   r   r   r	   specialRules  r_   zCSSBuilder.specialRulesc                 C   s   |  |}| |tS r   )r  r  r   r  r   r   r	   r4     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   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 rO   )r   r   r
  )r   r   r   Z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   Znsprefixr	  r   r   r	   atNamespace  re   zCSSBuilder.atNamespacec                 C   s   |  |r|S d S r   )r   )r   r   rI   r   r   r	   atMedia  s   
zCSSBuilder.atMediac                 C   s   |  | dg|S zG
        This is overriden by xhtml2pdf.context.pisaCSSBuilder
        rN   NrI   r}   )r   ZpageZ
pseudopager   r   r   r	   atPage!     zCSSBuilder.atPagec                 C   s   |  | dg|S r!  r"  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  r_   zCSSBuilder.selectorc                 C   s   | j |||S r   )r)  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   rJ   )rP   listr   combineTermsTermOperatorFactory)r   ZtermAr   ZtermBr   r   r	   r,  ?  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   Zunitsr   r   r	   
termNumberR  s   zCSSBuilder.termNumberc                 C   r.  r   r   r/  r   r   r	   termRGBW  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	   termFunctionc  r   zCSSBuilder.termFunctionc                 C   s   |t fS r   r&  )r   r(  r   r   r	   termUnknownf  r   zCSSBuilder.termUnknown)Tr   )F):r'   r(   r)   r   r  r   r)  setr   r   r  r   r6  r   r-  r  r   r   r  r0   r   r   r   r   r   r   r  r  r  r
  r  r  r  r  r  r  r4   rI   r  r  r  r  r   r#  r%  r'  r}   r   r   r,  r0  r1  r2  r3  r4  r5  r7  r8  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   r:  r0   )r   Z
cssBuildercreater   r   r   r	   r0   q  s   zCSSParser.__init__c                 K   s   | j di |S r;  )CSSBuilderFactory)r   r   r   r   r	   r<  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   ZcssResourceNamer   r   r	   r  z  s   
zCSSParser.parseExternalr   )r'   r(   r)   r   r>  r0   r<  r  r   r   r   r	   r:  n  s
    
r:  ) __doc__r   r?  r   r   r   r
   ZCSSParseErrorrY   r   r+   rM   r   ZCSSSelectorAbstractr   r   r   r   r   r   r   r   r   rQ   r   rH   r   r   r   ZCSSBuilderAbstractr   r:  r   r   r   r	   <module>   s6   
s,)"	 k