B
    ¦5¥d¤  ã               @   sv   d Z ddgZddlmZ ddlZddlZddlmZ dd	„ Ze 	d
e¡ G dd„ dƒZ
G dd„ dƒZG dd„ dƒZdS )zcssutils serializerÚCSSSerializerÚPreferencesé    )Ú	normalizeNé   )Úhelperc             C   s,   | j | j| j… }d dd„ |D ƒ¡| jfS )u»   
    Escapes characters not allowed in the current encoding the CSS way
    with a backslash followed by a uppercase hex code point

    E.g. the german umlaut 'Ã¤' is escaped as \E4
    Ú c             S   s,   g | ]$}d t tt|ƒƒƒdd…  ¡  ‘qS )z\%s é   N)ÚstrÚhexÚordÚupper)Ú.0Úx© r   ú6/tmp/pip-unpacked-wheel-v2oh4n0p/cssutils/serialize.pyú
<listcomp>   s    z_escapecss.<locals>.<listcomp>)ÚobjectÚstartÚendÚjoin)ÚeÚsr   r   r   Ú
_escapecss
   s    r   Ú	escapecssc               @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )r   a´  Control output of CSSSerializer.

    defaultAtKeyword = True
        Should the literal @keyword from src CSS be used or the default
        form, e.g. if ``True``: ``@import`` else: ``@i\mport``
    defaultPropertyName = True
        Should the normalized propertyname be used or the one given in
        the src file, e.g. if ``True``: ``color`` else: ``c\olor``

        Only used if ``keepAllProperties==False``.

    defaultPropertyPriority = True
        Should the normalized or literal priority be used, e.g. ``!important``
        or ``!Im\portant``

    importHrefFormat = None
        Uses hreftype if ``None`` or format ``"URI"`` if ``'string'`` or
        format ``url(URI)`` if ``'uri'``
    indent = 4 * ' '
        Indentation of e.g Properties inside a CSSStyleDeclaration
    indentClosingBrace = True
        Defines if closing brace of block is indented to match indentation
        of the block (default) oder match indentation of selector.
    indentSpecificities = False (**EXPERIMENTAL**)
        Indent rules with subset of Selectors and higher Specitivity

    keepAllProperties = True
        If ``True`` all properties set in the original CSSStylesheet
        are kept meaning even properties set twice with the exact same
        same name are kept!
    keepComments = True
        If ``False`` removes all CSSComments
    keepEmptyRules = False
        defines if empty rules like e.g. ``a {}`` are kept in the resulting
        serialized sheet
    keepUnknownAtRules = True
        defines if unknown @rules like e.g. ``@three-dee {}`` are kept in the
        serialized sheet
    keepUsedNamespaceRulesOnly = False
        if True only namespace rules which are actually used are kept

    lineNumbers = False
        Only used if a complete CSSStyleSheet is serialized.
    lineSeparator = u'\\n'
        How to end a line. This may be set to e.g. u'' for serializing of
        CSSStyleDeclarations usable in HTML style attribute.
    listItemSpacer = u' '
        string which is used in ``css.SelectorList``, ``css.CSSValue`` and
        ``stylesheets.MediaList`` after the comma
    minimizeColorHash = True
        defines if colorhash should be minimized from full size to shorthand
        e.g minimize #FFFFFF to #FFF
    normalizedVarNames = True
        defines if variable names should be serialized normalized (they are
        used as being normalized anyway)
    omitLastSemicolon = True
        If ``True`` omits ; after last property of CSSStyleDeclaration
    omitLeadingZero = False
        defines if values between -1 and 1 should omit the 0, like ``.5px``
    paranthesisSpacer = u' '
        string which is used before an opening paranthesis like in a
        ``css.CSSMediaRule`` or ``css.CSSStyleRule``
    propertyNameSpacer = u' '
        string which is used after a Property name colon
    resolveVariables = True
        if ``True`` all variable references are tried to resolved and
        all CSSVariablesRules are removed from the output.
        Any variable reference not resolvable is simply kept untouched.
    selectorCombinatorSpacer = u' '
        string which is used before and after a Selector combinator like +, > or ~.
        CSSOM defines a single space for this which is also the default in cssutils.
    spacer = u' '
        general spacer, used e.g. by CSSUnknownRule

    validOnly = False
        if True only valid (Properties) are output

        A Property is valid if it is a known Property with a valid value.
    c             K   s6   |   ¡  x(t| ¡ ƒD ]\}}|r|  ||¡ qW dS )z2Always use named instead of positional parameters.N)ÚuseDefaultsÚlistÚitemsÚ__setattr__)ÚselfZinitialsÚkeyÚvaluer   r   r   Ú__init__n   s    zPreferences.__init__c                s&   d  ˆ jjd ‡ fdd„ˆ jD ƒ¡¡S )Nzcssutils.css.{}({})z, c                s"   g | ]}d |› dˆ   |¡›‘qS )z
    ú=)Ú__getattribute__)r   Úp)r   r   r   r   y   s    z(Preferences.__repr__.<locals>.<listcomp>)ÚformatÚ	__class__Ú__name__r   Ú__dict__)r   r   )r   r   Ú__repr__u   s    zPreferences.__repr__c                s,   d  ˆ jjd ‡ fdd„ˆ jD ƒ¡tˆ ƒ¡S )Nz$<cssutils.css.{} object {} at 0x{:x}ú c                s    g | ]}|› d ˆ   |¡›‘qS )r"   )r#   )r   r$   )r   r   r   r   €   s    z'Preferences.__str__.<locals>.<listcomp>)r%   r&   r'   r   r(   Úid)r   r   )r   r   Ú__str__}   s    zPreferences.__str__c             C   sš   d| _ d| _d| _d| _d| _d| _d| _d| _d| _d| _	d| _
d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _dS )z4Reset all preference options to their default value.TNz    FÚ
r*   )ÚdefaultAtKeywordÚdefaultPropertyNameÚdefaultPropertyPriorityÚimportHrefFormatÚindentÚindentClosingBraceÚindentSpecificitiesÚkeepAllPropertiesÚkeepCommentsÚkeepEmptyRulesÚkeepUnknownAtRulesÚkeepUsedNamespaceRulesOnlyÚlineNumbersÚlineSeparatorÚlistItemSpacerÚminimizeColorHashÚnormalizedVarNamesÚomitLastSemicolonÚomitLeadingZeroÚparanthesisSpacerÚpropertyNameSpacerÚresolveVariablesÚselectorCombinatorSpacerÚspacerÚ	validOnly)r   r   r   r   r   „   s2    zPreferences.useDefaultsc             C   sj   d| _ d| _d| _d| _d| _d| _d| _d| _d| _d| _	d| _
d| _d| _d| _d| _d| _d| _dS )zÃSet options resulting in a minified stylesheet.

        You may want to set preferences with this convenience method
        and override specific settings you want adjusted afterwards.
        Ústringr   FTN)r1   r2   r6   r7   r8   r9   r:   r;   r<   r=   r?   r@   rA   rB   rD   rE   rF   )r   r   r   r   ÚuseMinified    s"    zPreferences.useMinifiedN)	r'   Ú
__module__Ú__qualname__Ú__doc__r!   r)   r,   r   rH   r   r   r   r   r      s   Oc               @   s4   e Zd ZdZdd„ Zdd„ Zdd	d
„Zddd„ZdS )ÚOutzHA simple class which makes appended items available as a combined stringc             C   s   || _ g | _d S )N)ÚserÚout)r   rM   r   r   r   r!   ¼   s    zOut.__init__c             C   s    | j r| j d  ¡ s| j d= d S )Néÿÿÿÿ)rN   Ústrip)r   r   r   r   Ú_remove_last_if_SÀ   s    zOut._remove_last_if_SNTFc             C   s¸  | j jj}|s|dkr´d|kr8| j jjr2|j}qèdS n°d|krH|sHdS d|krZ|rZd}nŽd|kr†|dkrndS t |¡}|sè|  ¡  nbd|kršt |¡}nNd|kr°| j  	|¡}n8t
|d	ƒrÂ|j}n&t
|d
ƒrÔ|j}n|dkrè|sè|  ¡  |s|dkr$| j jjr$| j | j  || j jd ¡¡ n | d¡r8|  ¡  | j |¡ |rd|dkrd| j d¡ nP|dkr˜| j d| j jj¡ | j | j jj¡ nd|kr¶|s¶| j d¡ nþd|krÔ| j | j jj¡ nàd|krò| j | j jj¡ nÂd|kr$| j d| j jj¡ | j | j jj¡ nd|ks8d|krL| j | j jj¡ nh|dkr´|r´|dkr´| j | j jj¡ |dkr´| j jjs´| jr´| jd  d¡s´| j d¡ dS )aè  Appends val. Adds a single S after each token except as follows:

        - typ COMMENT
            uses cssText depending on self.ser.prefs.keepComments
        - typ "Property", cssutils.css.CSSRule.UNKNOWN_RULE
            uses cssText
        - typ STRING
            escapes helper.string
        - typ S
            ignored except ``keepS=True``
        - typ URI
            calls helper.uri
        - val ``{``
            adds LF after
        - val ``;``, typ 'styletext'
            removes S before and adds LF after
        - val ``, :``
            removes S before
        - val ``+ > ~``
            encloses in prefs.selectorCombinatorSpacer
        - some other vals
            add ``*spacer`` except ``space=False``
        )ÚSTRINGÚURIÚCOMMENTNÚSr*   rR   rS   ÚHASHÚcssTextÚ	mediaTextz+>~,:{;)]/=}Ú}r   z-+*/z+>~rO   ú)ú,ú:Ú{ú;Ú	styletextz}[]()/=ÚFUNCTION)rM   ÚprefsrE   r6   rW   r   rG   rQ   ÚuriÚ_hashÚhasattrrX   r3   rN   ÚappendÚ_indentblockÚ_levelÚendswithÚinsertrD   r<   rB   rA   r;   )r   ÚvalÚtype_ÚspaceÚkeepSr2   ÚalwaysSZ	prefspacer   r   r   re   Å   sl    





 




z
Out.appendr   c             C   s(   |s|   ¡  |r| j |¡ | | j¡S )z!returns all items joined by delim)rQ   rN   re   r   )r   Údelimr   rm   r   r   r   r    )  s
    z	Out.value)NTFFF)r   NF)r'   rI   rJ   rK   r!   rQ   re   r    r   r   r   r   rL   ¹   s
   
crL   c               @   sD  e Zd ZdZdMdd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZdNd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'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ ZdOd2d3„Zd4d5„ Zd6d7„ ZdPd9d:„Zd;d<„ ZdQd=d>„Z dRd?d@„Z!dSdAdB„Z"dTdCdD„Z#dUdEdF„Z$dVdGdH„Z%dIdJ„ Z&dKdL„ Z'dS )Wr   z´Serialize a CSSStylesheet and its parts.

    To use your own serializing method the easiest is to subclass CSS
    Serializer and overwrite the methods you like to customize.
    Nc             C   s&   |s
t ƒ }|| _d| _g | _d| _dS )zC
        :param prefs:
            instance of Preferences
        r   N)r   ra   rg   Ú
_selectorsÚ_selectorlevel)r   ra   r   r   r   r!   9  s    zCSSSerializer.__init__c             C   s   | j jr|jS |jS dS )z6returns default or source atkeyword depending on prefsN)ra   r.   Ú	atkeywordZ_keyword)r   Úruler   r   r   Ú
_atkeywordG  s    zCSSSerializer._atkeywordc                s4   ˆj js|S ˆj j ‡ ‡fdd„| ˆj j¡D ƒ¡S )zš
        indent a block like a CSSStyleDeclaration to the given level
        which may be higher than self._level (e.g. for CSSStyleDeclaration)
        c                s    g | ]}ˆ ˆj j › |› ‘qS r   )ra   r2   )r   Úline)Úlevelr   r   r   r   W  s   z.CSSSerializer._indentblock.<locals>.<listcomp>)ra   r;   r   Úsplit)r   Útextrv   r   )rv   r   r   rf   N  s
    zCSSSerializer._indentblockc             C   s   | j jr| j js|jS |S dS )z¡
        used by all styledeclarations to get the propertyname used
        dependent on prefs setting defaultPropertyName and
        keepAllProperties
        N)ra   r/   r5   Úname)r   ÚpropertyÚactualr   r   r   Ú_propertyname\  s    zCSSSerializer._propertynamec             C   sp   | j jrltt| | j j¡d ƒƒ}g }x6t| | j j¡ƒD ] \}}| d||d |f ¡ q:W | j j 	|¡}|S )Nr   z%*i: %s)
ra   r:   Úlenr	   Úcountr;   Ú	enumeraterw   re   r   )r   rx   ÚpadrN   Úiru   r   r   r   Ú_linenumnbersg  s    zCSSSerializer._linenumnbersc             C   sf   | j jrbt|ƒdkrb|d |d krb|d |d krb|d |d krbd|d › |d › |d › S |S )	zB
        Short form of hash, e.g. #123 instead of #112233
        é   r   r   é   é   é   é   ú#)ra   r=   r}   )r   rj   rk   r   r   r   rc   p  s    zCSSSerializer._hashc             C   s   | j j p| j jo|jS )z/checks items valid property and prefs.validOnly)ra   rF   Úvalid)r   r   r   r   r   Ú_valid~  s    zCSSSerializer._validc          	   C   s¬   |  ¡ }g }xP|jD ]F}| jjrF|j|jkrF|j|krF|jsd|krFq|j}|r| 	|¡ qW |  
| jj |¡¡}y|jd j}W n ttfk
rž   d}Y nX | |d¡S )z#serializes a complete CSSStyleSheetNr   zUTF-8r   )Z_getUsedURIsÚcssRulesra   r9   ZNAMESPACE_RULEÚtypeÚnamespaceURIÚprefixrW   re   r‚   r;   r   ÚencodingÚ
IndexErrorÚAttributeErrorÚencode)r   Z
stylesheetZusedurisrN   rs   rW   rx   r   r   r   r   Údo_CSSStyleSheet‚  s"    

zCSSSerializer.do_CSSStyleSheetc             C   s   |j r| jjr|j S dS dS )zJ
        serializes CSSComment which consists only of commentText
        r   N)Z_cssTextra   r6   )r   rs   r   r   r   Údo_CSSComment  s    zCSSSerializer.do_CSSCommentc             C   s   |j rdt |j¡ S dS dS )z–
        serializes CSSCharsetRule
        encoding: string

        always @charset "encoding";
        no comments or other things allowed!
        z@charset %s;r   N)Ú
wellformedr   rG   r   )r   rs   r   r   r   Údo_CSSCharsetRule¦  s    zCSSSerializer.do_CSSCharsetRulec             C   sˆ   |j j}|r€|jr€| jjs€t| ƒ}| |  |¡¡ x|jD ]}| |j	|j
¡ q:W | d¡ |j|› | jj› ddd | 	¡ S dS dS )z–
        serializes CSSVariablesRule

        media
            TODO
        variables
            CSSStyleDeclaration

        + CSSComments
        r]   rY   r   )r2   r   N)Ú	variablesrW   r•   ra   rC   rL   re   rt   Úseqr    rŒ   r;   )r   rs   ZvariablesTextrN   Úitemr   r   r   Údo_CSSVariablesRule³  s    
z!CSSSerializer.do_CSSVariablesRulec             C   s„   |   |j¡}|r||jr|t| ƒ}| |  |¡¡ x|jD ]}| |j|j¡ q6W | d¡ |j|› | j	j
› ddd | ¡ S dS dS )zr
        serializes CSSFontFaceRule

        style
            CSSStyleDeclaration

        + CSSComments
        r]   rY   r   )r2   r   N)Údo_css_CSSStyleDeclarationÚstyler•   rL   re   rt   r˜   r    rŒ   ra   r;   )r   rs   Ú	styleTextrN   r™   r   r   r   Údo_CSSFontFaceRuleÌ  s    	

z CSSSerializer.do_CSSFontFaceRulec             C   sâ   |j rÚt| ƒ}| |  |¡¡ x®|jD ]¤}|j|j }}d|kr~| jjdksb| jjdkrp|j	dkrp| |d¡ qÊ| |d¡ q&d|kr¨|  
|¡}|rÊ|dkrÊ| |¡ q&d|kr¾| |d¡ q&| ||¡ q&W |jd	d
S dS dS )z×
        serializes CSSImportRule

        href
            string
        media
            optional cssutils.stylesheets.medialist.MediaList
        name
            optional string

        + CSSComments
        ÚhrefrG   rb   rR   rS   ÚmediaÚallry   r^   )r   r   N)r•   rL   re   rt   r˜   rŒ   r    ra   r1   ZhreftypeÚdo_stylesheets_medialist)r   rs   rN   r™   rk   rj   rX   r   r   r   Údo_CSSImportRuleã  s(    

zCSSSerializer.do_CSSImportRulec             C   sr   |j rjt| ƒ}| |  |¡¡ x>|jD ]4}|j|j }}d|krN| |d¡ q&| ||¡ q&W |jddS dS dS )z†
        serializes CSSNamespaceRule

        uri
            string
        prefix
            string

        + CSSComments
        r   rR   r^   )r   r   N)r•   rL   re   rt   r˜   rŒ   r    )r   rs   rN   r™   rk   rj   r   r   r   Údo_CSSNamespaceRule  s    z!CSSSerializer.do_CSSNamespaceRulec             C   sl  |j jsdS |  |¡g}t| jjƒs0| d¡ n| | jj¡ | |  |j ¡¡ |jr¬| | jj¡ t	| ƒ}| t
 |j¡¡ x|jD ]}| |j|j¡ q†W | | ¡ ¡ | | jj¡ | d¡ | | jj¡ g }x>|jD ]4}|j}|rÞ| |  || jd ¡¡ | | jj¡ qÞW | jjs4d |¡ ¡ s4dS | |¡ | d| jt| jjƒ | jj  ¡ d |¡S )z@
        serializes CSSMediaRule

        + CSSComments
        r   r*   r]   r   z%s})r    r•   rt   r}   ra   rE   re   r¢   ry   rL   r   rG   r˜   r    rŒ   rA   r;   r‹   rW   rf   rg   r7   r   rP   ÚextendÚintr3   r2   )r   rs   rN   Znameoutr™   ÚrulesoutÚrÚrtextr   r   r   Údo_CSSMediaRule&  s<    	

zCSSSerializer.do_CSSMediaRulec             C   s  g }x0|j D ]&}|j}|r| |¡ | | jj¡ qW d |¡}| j|j| d}|s\|r|jrt	| ƒ}| |  
|¡¡ | |j¡ | d¡ |rÈ|s¶|j|› | jj› dd n|j|dddd |rÚ|j|dd |  jd8  _| d	¡ |  jd7  _| ¡ S dS d
S )zÕ
        serializes CSSPageRule

        selectorText
            string
        style
            CSSStyleDeclaration
        cssRules
            CSSRuleList of MarginRule objects

        + CSSComments
        r   )Úomitr]   r   )r2   r_   F)rk   r2   rl   rY   N)r‹   rW   re   ra   r;   r   r›   rœ   r•   rL   rt   ÚselectorTextrg   r    )r   rs   r§   r¨   r©   Z	rulesTextr   rN   r   r   r   Údo_CSSPageRule^  s0    



zCSSSerializer.do_CSSPageRulec             C   sN   t | ƒ}x<|D ]4}|jdkr2|j|j|jdd q| |j|j¡ qW | ¡ S )z#Serialize selector of a CSSPageRuleÚIDENTF)rl   )rL   rŒ   re   r    )r   r˜   rN   r™   r   r   r   Údo_CSSPageRuleSelector  s    

z$CSSSerializer.do_CSSPageRuleSelectorc             C   s|   |j rx|  |j¡}|rx|jrxt| ƒ}|j|  |¡dd | d¡ | d|  || jd ¡| j	j
f ¡ | d¡ | ¡ S dS )z’
        serializes MarginRule

        atkeyword
            string
        style
            CSSStyleDeclaration

        + CSSComments
        Z	ATKEYWORD)rk   r]   z%s%sr   rY   r   )rr   r›   rœ   r•   rL   re   rt   rf   rg   ra   r;   r    )r   rs   r   rN   r   r   r   Údo_MarginRule™  s    


zCSSSerializer.do_MarginRulec             C   sæ   |j rÞ| jjrÞt| ƒ}| |j¡ g }x®|jD ]¤}|j|j }}d|krš| 	¡  ¡ }|r€|  
|| jj | tdt|ƒd ƒ¡}n|  
|tdt|ƒd ƒ¡}|r°|d  ||¡ n| ||¡ d|kr.| t| ƒ¡ q.W | ¡ S dS dS )zg
        serializes CSSUnknownRule
        anything until ";" or "{...}"
        + CSSComments
        rY   r   rO   r]   r   N)r•   ra   r8   rL   re   rr   r˜   rŒ   r    Úpoprf   r;   Úminr}   )r   rs   rN   Zstacksr™   rk   rj   Z
stackblockr   r   r   Údo_CSSUnknownRuleÄ  s(    zCSSSerializer.do_CSSUnknownRulec       	      C   sh  | j jr¤dd„ |jD ƒ}dd„ |jD ƒ}xz| jD ]\}dd„ |D ƒ}| |¡rtdd„ |D ƒ}||krŒ|  jd7  _P q0| jdkr0|  jd8  _q0W | j |j¡ d| _|  |j¡}|rº|js¾d	S |  j	d7  _	d	}z|  
|j¡}W d
|  j	d8  _	X |s| j jrd|› | j j› dS nN|  d|| j j| j j|  || j	d ¡| j j| j	t| j jƒ | j j f | j¡S d
S )zd
        serializes CSSStyleRule

        selectorList
        style

        + CSSComments
        c             S   s   h | ]
}|j ’qS r   )Úelement)r   r   r   r   r   ú	<setcomp>ú  s    z0CSSSerializer.do_CSSStyleRule.<locals>.<setcomp>c             S   s   g | ]
}|j ‘qS r   )Úspecificity)r   r   r   r   r   r   û  s    z1CSSSerializer.do_CSSStyleRule.<locals>.<listcomp>c             S   s   h | ]
}|j ’qS r   )r´   )r   r   r   r   r   rµ   ý  s    c             S   s   g | ]
}|j ‘qS r   )r¶   )r   r   r   r   r   r      s    r   r   r   Nz{}z%s%s{%s%s%s%s})ra   r4   ZselectorListrp   Úissubsetrq   re   Údo_css_SelectorListr•   rg   r›   rœ   r7   rA   rf   r;   r¦   r3   r2   )	r   rs   ÚelementsZspecitivitiesÚselectorZlastelementsZlastspecitivitiesr¬   r   r   r   r   Údo_CSSStyleRuleë  sF    



zCSSSerializer.do_CSSStyleRulec             C   s^   |j rVg }x4|jD ]*}t|tjjƒr2| |j¡ q| |¡ qW d| jj	 }| 
|¡S dS dS )z!comma-separated list of Selectorsz,%sr   N)r•   r˜   Ú
isinstanceÚcssutilsÚcssZSelectorre   r¬   ra   r<   r   )r   ZselectorlistrN   ÚpartÚsepr   r   r   r¸   (  s    
z!CSSSerializer.do_css_SelectorListc       
   	   C   sê   |j rât| ƒ}|j dd¡}x¼|jD ]²}|j|j }}t|tƒrÄ|\}}||ks\|sn|dkrn|j	||dd qÖ|t
jkr~d}	n*y|j |¡}	W n tk
r¦   d}	Y nX |j	|	› d|› |dd q$|j	||ddd q$W | ¡ S dS dS )	a  
        a single Selector including comments

        an element has syntax (namespaceURI, name) where namespaceURI may be:

        - cssutils._ANYNS => ``*|name``
        - None => ``name``
        - u'' => ``|name``
        - any other value: => ``prefix|name``
        r   NF)rl   Ú*ú|T)rl   rm   )r•   rL   Ú_namespacesÚgetr˜   rŒ   r    r¼   Útuplere   r½   Z_ANYNSZprefixForNamespaceURIr   )
r   rº   rN   Z
DEFAULTURIr™   rk   rj   r   ry   rŽ   r   r   r   Údo_css_Selector7  s*    



zCSSSerializer.do_css_Selectorc       
      C   s   t |jƒdkrøt| ƒ}t |jƒd }xÆt|jƒD ]¸\}}|j|j }}d|kr¢|\}}	| jjrft|ƒ}| 	|¡ | 	d¡ | 	|	j
¡ ||k s–| jjsè| 	d¡ q0t|tjjƒrÌ| 	|d¡ | 	| jj¡ q0| 	|j
|¡ | 	| jj¡ q0W | ¡  ¡ S dS dS )	zVariables of CSSVariableRule.r   r   Úvarr\   r^   rT   r   N)r}   r˜   rL   r   rŒ   r    ra   r>   r   re   rW   r?   r¼   r½   r¾   Ú
CSSCommentr;   rP   )
r   r—   rN   Zlastitemr   r™   rk   rj   ry   Úcssvaluer   r   r   Údo_css_CSSVariablesDeclarationb  s*    

z,CSSSerializer.do_css_CSSVariablesDeclarationTc       
         sX  t |jƒdkrP|dkr | jj}| jjr0|j}n| ¡ ‰ ‡ fdd„|jD ƒ}g }|oZ| jj}xÎt|ƒD ]Â\}}|j}	t	|	t
jjƒr¢| jjr | |	j¡ | |¡ qft	|	t
jjƒrì|	jrê| |	j¡ |rÖ|t |ƒd ksà| d¡ | |¡ qft	|	t
jjƒr| |	j¡ | |¡ qf| |	¡ | |¡ qfW |rF|d |krF|d= d |¡S dS dS )	z3
        Style declaration of CSSStyleRule
        r   Nc                s:   g | ]2}t |jtjjƒr"|jˆ ks2t |jtjjƒs|‘qS r   )r¼   r    r½   r¾   ÚProperty)r   r™   )Ú
_effectiver   r   r   •  s   
z<CSSSerializer.do_css_CSSStyleDeclaration.<locals>.<listcomp>r   r^   rO   r   )r}   r˜   ra   r;   r5   ZgetPropertiesr?   r   r    r¼   r½   r¾   rÈ   r6   re   rW   rË   ZCSSUnknownRuler   )
r   rœ   Ú	separatorr«   r˜   rN   r?   r   r™   rj   r   )rÌ   r   r›     s>    	




z(CSSSerializer.do_css_CSSStyleDeclarationc             C   s,  g }|j d r"|jr"|  |¡r"|j \}}}xL|D ]D}t|dƒrR| |j¡ q6|j|krp| |  ||¡¡ q6| |¡ q6W |r¬|jr”|jr¬|jr¬| d¡ | | j	j
¡ | |j¡ |r"|r"| d¡ xR|D ]J}t|dƒrð| |j¡ qÔ||jkr| j	jr| |j¡ qÔ| |¡ qÔW d |¡S )z¬
        Style declaration of CSSStyleRule

        Property has a seqs attribute which contains seq lists for
        name, a CSSvalue and a seq list for priority
        r   rW   r\   r*   r   )Zseqsr•   rŠ   rd   re   rW   Zliteralnamer|   Z_mediaQueryra   rB   Zliteralpriorityr0   Úpriorityr   )r   rz   rN   Znameseqr    Úpriorityseqr¿   r   r   r   Údo_PropertyÀ  s0    	 







zCSSSerializer.do_Propertyc             C   sV   g }xB|D ]:}t |dƒr:| d¡ | |j¡ | d¡ q
| |¡ q
W d |¡ ¡ S )z:
        a Properties priority "!" S* "important"
        rW   r*   r   )rd   re   rW   r   rP   )r   rÏ   rN   r¿   r   r   r   Údo_Property_priorityñ  s    


z"CSSSerializer.do_Property_priorityFc             C   s¦   |sdS t | ƒ}xˆ|jD ]~}|j|j }}|r>|tjjkr>qqt|dƒrX| |j	|¡ q|rŠ|d |d krŠ|d dkrŠt
 |dd… ¡}| ||¡ qW | ¡ S dS )zSerializes a PropertyValuer   rW   r   rO   z'"r   N)rL   r˜   rŒ   r    r½   r¾   rÈ   rd   re   rW   r   rG   )r   r    Ú
valuesOnlyrN   r™   rk   rj   r   r   r   Údo_css_PropertyValue   s    
 z"CSSSerializer.do_css_PropertyValuec             C   s>   |  d¡d }|d|… ||t|ƒ…  }}| d¡}|| S )NÚ.r   r   Ú0)Úindexr}   Úrstrip)r   r   r   ÚaÚbr   r   r   Ú_strip_zeros  s    
zCSSSerializer._strip_zerosc             C   s&  |sdS t | ƒ}|jdkr|jp$d}|jdkrDd}|jdkrØd}n”|jt|jƒkrdtt|jƒƒ}nt| jjrÈd|j  k r‚dk rÈn nB|  d|j ¡}|}|j	d	krº|d |d
d…  }qØ|dd… }n|  d|j ¡}|jdkrò|j	dkròd}nd}| 
|| | |j¡ n| 
|j|j¡ | ¡ S )z)Serializes a Value, valuesOnly is ignoredr   )Z	DIMENSIONÚNUMBERZ
PERCENTAGEr   rÕ   )ÚcmÚmmÚinZpxZpcÚptÚemÚexrO   r   z%fú-r   Nú+)rL   rŒ   Z	dimensionr    r¦   r	   ra   r@   rÚ   Z_signre   )r   r    rÒ   rN   Zdimrj   ÚvÚsignr   r   r   Údo_css_Value  s2    

	"
zCSSSerializer.do_css_Valuec             C   s:   y | j | j| jdœ|j ||dS  tk
r4   dS X dS )z7Serialize a ColorValue, a HASH simple value or FUNCTION)r`   rV   r®   )rÒ   r   N)Údo_css_CSSFunctionræ   Z	colorTypeÚKeyError)r   r    rÒ   r   r   r   Údo_css_ColorValueK  s    zCSSSerializer.do_css_ColorValuec             C   sX   |sdS t | ƒ}x:|jD ]0}|j|j }}|r<|tjjkr<q| ||¡ qW | ¡ S dS )zSerialize a CSS function valuer   N)rL   r˜   rŒ   r    r½   r¾   rÈ   re   )r   rÉ   rÒ   rN   r™   rk   rj   r   r   r   rç   V  s    z CSSSerializer.do_css_CSSFunctionc             C   s–   |sdS t | ƒ}xx|jD ]n}|j|j }}|r>|tjjkr>qqt|dƒrX| |j	|¡ q|dkrz|dkrz|j||dd q| ||¡ qW | ¡ S dS )zSerialize a CSS calc valuer   rW   ÚCHARz-+*/T)rn   N)
rL   r˜   rŒ   r    r½   r¾   rÈ   rd   re   rW   )r   rÉ   rÒ   rN   r™   rk   rj   r   r   r   Údo_css_CSSCalcc  s    
zCSSSerializer.do_css_CSSCalcc             C   sB   |sdS t | ƒ}x$|jD ]}|j}|j|ddd qW | ¡ S dS )zXSerialize an ExpressionValue (IE only),
        should at least keep the original syntaxr   NF)rl   )rL   r˜   r    re   )r   rÉ   rÒ   rN   r™   rj   r   r   r   Údo_css_MSValuex  s    zCSSSerializer.do_css_MSValuec             C   s„   |r
|j sdS t| ƒ}|j}| jjr4|r4| |¡ nD| dd¡ | |j d¡ |jrn| dd¡ | |jj¡ | d¡ | ¡ S dS )	zSerializes a CSSVariabler   zvar(r`   r®   r[   ÚCOMMArZ   N)ry   rL   r    ra   rC   re   ÚfallbackrW   )r   ÚvariableZIGNOREDrN   rä   r   r   r   Údo_css_CSSVariableˆ  s    

z CSSSerializer.do_css_CSSVariablec             C   sl   t |ƒdkrdS |j}t| ƒ}d}x<|D ]4}|jdkrL|rH| dd¡ nd}| |j|j¡ q(W | ¡ S dS )	zÓ
        comma-separated list of media, default is 'all'

        If "all" is in the list, every other media *except* "handheld" will
        be stripped. This is because how Opera handles CSS for PDAs.
        r   r¡   FÚ
MediaQueryr[   rê   TN)r}   r˜   rL   rŒ   re   r    )r   Z	medialistr˜   rN   Z	firstdoner™   r   r   r   r¢   ž  s    

z&CSSSerializer.do_stylesheets_medialistc       
      C   s   |j s
dS g }d}xJ|jD ]@}|j|j }}|dkrH|rH| d¡ d}nd}| ||f¡ qW t| ƒ}x|D ]\}}	| |	|¡ qlW | ¡ S dS )z2
        a single media used in medialist
        r   Frñ   )rê   r[   TN)r•   r˜   rŒ   r    re   rL   )
r   Z
mediaqueryZwithsemiZnextmqr™   rk   rj   rN   Úträ   r   r   r   Údo_stylesheets_mediaquery·  s     
z'CSSSerializer.do_stylesheets_mediaquery)N)N)NT)F)N)F)F)F)F)F)(r'   rI   rJ   rK   r!   rt   rf   r|   r‚   rc   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ð   r¢   ró   r   r   r   r   r   2  sJ   
	
	*81
+'=+ 
>1

0




)rK   Ú__all__Zcssutils.helperr   Úcodecsr½   r   r   r   Úregister_errorr   rL   r   r   r   r   r   Ú<module>   s    y