o
    †e¤  ã                   @   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   úBD:\Projects\ConvertPro\env\Lib\site-packages\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   s2   |   ¡  t| ¡ ƒD ]\}}|r|  ||¡ q
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   €   s     z'Preferences.__str__.<locals>.<listcomp>)r(   r)   r*   r   r+   Úidr'   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Ú	validOnlyr'   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)r4   r5   r9   r:   r;   r<   r=   r>   r?   r@   rB   rC   rD   rE   rG   rH   rI   r'   r   r   r   ÚuseMinified    s"   
zPreferences.useMinifiedN)	r*   Ú
__module__Ú__qualname__Ú__doc__r!   r,   r/   r   rK   r   r   r   r   r      s    Pc                   @   s6   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   rQ   r   r   r   r!   ¼   s   
zOut.__init__c                 C   s(   | j r| j d  ¡ s| j d= d S d S d S )Néÿÿÿÿ)rR   Ústripr'   r   r   r   Ú_remove_last_if_SÀ   s   þzOut._remove_last_if_SNTFc                 C   sÊ  | j jj}|s|dv rUd|kr| j jjr|j}nZdS d|kr#|s#dS d|kr,|r,d}nGd|krB|du r6dS t |¡}|sA|  ¡  n1d|krLt |¡}n'd|krW| j  	|¡}nt
|d	ƒr`|j}nt
|d
ƒri|j}n
|dv rs|ss|  ¡  |s~|dkrŽ| j jjrŽ| j | j  || j jd ¡¡ n| d¡r—|  ¡  | j |¡ |r«|dv r«| j d¡ dS |dv rÄ| j d| j jj¡ | j | j jj¡ dS d|krÒ|sÒ| j d¡ dS d|krá| j | j jj¡ dS d|krð| j | j jj¡ dS d|kr
| j d| j jj¡ | j | j jj¡ dS d|ksd|kr| j | j jj¡ dS |dvrW|rY|dkr[| j | j jj¡ |dkr]| j jjs_| jra| jd  d¡sc| j d¡ dS dS dS dS dS dS dS dS 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-   rV   rW   ÚHASHÚcssTextÚ	mediaTextz+>~,:{;)]/=}Ú}r   ú-+*/z+>~rS   ú)ú,ú:Ú{ú;Ú	styletextz}[]()/=ÚFUNCTION)rQ   ÚprefsrH   r9   r[   r   rJ   rU   ÚuriÚ_hashÚhasattrr\   r6   rR   ÚappendÚ_indentblockÚ_levelÚendswithÚinsertrG   r?   rE   rD   r>   )r   ÚvalÚtype_ÚspaceÚkeepSr5   ÚalwaysSZ	prefspacer   r   r   rj   Å   sz   


€

 


ÿþý¹?z
Out.appendr   c                 C   s(   |s|   ¡  |r| j |¡ | | j¡S )z!returns all items joined by delim)rU   rR   rj   r   )r   Údelimr   rr   r   r   r   r    )  s
   z	Out.value)NTFFF)r   NF)r*   rL   rM   rN   r!   rU   rj   r    r   r   r   r   rO   ¹   s    
ÿdrO   c                   @   sF  e Zd ZdZdMdd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZdMd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	1dNd2d3„Zd4d5„ Zd6d7„ ZdOd9d:„Zd;d<„ ZdMd=d>„Z dOd?d@„Z!dOdAdB„Z"dOdCdD„Z#dOdEdF„Z$dOdGdH„Z%dIdJ„ Z&dKdL„ Z'dS )Pr   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   rf   rl   Ú
_selectorsÚ_selectorlevel)r   rf   r   r   r   r!   9  s   
zCSSSerializer.__init__c                 C   s   | j jr|jS |jS )z6returns default or source atkeyword depending on prefs)rf   r1   Ú	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   )rf   r5   )r   Úline©Úlevelr   r   r   r   V  s    ÿÿz.CSSSerializer._indentblock.<locals>.<listcomp>)rf   r>   r   Úsplit)r   Útextr}   r   r|   r   rk   N  s   þÿzCSSSerializer._indentblockc                 C   s   | j jr| j js|jS |S )z¡
        used by all styledeclarations to get the propertyname used
        dependent on prefs setting defaultPropertyName and
        keepAllProperties
        )rf   r2   r8   Úname)r   ÚpropertyÚactualr   r   r   Ú_propertyname\  s   zCSSSerializer._propertynamec                 C   sl   | j jr4tt| | j j¡d ƒƒ}g }t| | j j¡ƒD ]\}}| d||d |f ¡ q| j j 	|¡}|S )Nr   z%*i: %s)
rf   r=   Úlenr	   Úcountr>   Ú	enumerater~   rj   r   )r   r   ÚpadrR   Úir{   r   r   r   Ú_linenumnbersg  s   zCSSSerializer._linenumnbersc                 C   sf   | j jr1t|ƒdkr1|d |d kr1|d |d kr1|d |d kr1d|d › |d › |d › S |S )	zB
        Short form of hash, e.g. #123 instead of #112233
        é   r   r   é   é   é   é   ú#)rf   r@   r„   )r   ro   rp   r   r   r   rh   p  s   ÿzCSSSerializer._hashc                 C   s   | j j p| j jo|jS )z/checks items valid property and prefs.validOnly)rf   rI   Zvalid)r   r   r   r   r   Ú_valid~  s   zCSSSerializer._validc              	   C   s¦   |  ¡ }g }|jD ]#}| jjr"|j|jkr"|j|vr"|js!d|vr"q	|j}|r,| 	|¡ q	|  
| jj |¡¡}z|jd j}W n ttfyL   d}Y nw | |d¡S )z#serializes a complete CSSStyleSheetNr   zUTF-8r   )Z_getUsedURIsÚcssRulesrf   r<   ZNAMESPACE_RULEÚtypeÚnamespaceURIÚprefixr[   rj   r‰   r>   r   ÚencodingÚ
IndexErrorÚAttributeErrorÚencode)r   Ú
stylesheetZusedurisrR   ry   r[   r   r•   r   r   r   Údo_CSSStyleSheet‚  s,   
ÿ
ÿ
€ÿzCSSSerializer.do_CSSStyleSheetc                 C   s   |j r
| jjr
|j S dS )zJ
        serializes CSSComment which consists only of commentText
        r   )Z_cssTextrf   r9   rx   r   r   r   Údo_CSSComment  s   zCSSSerializer.do_CSSCommentc                 C   s   |j rdt |j¡ S dS )z–
        serializes CSSCharsetRule
        encoding: string

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

        media
            TODO
        variables
            CSSStyleDeclaration

        + CSSComments
        rb   r]   r   ©r5   r   )Ú	variablesr[   rœ   rf   rF   rO   rj   rz   Úseqr    r’   r>   )r   ry   ZvariablesTextrR   Úitemr   r   r   Údo_CSSVariablesRule³  s   

z!CSSSerializer.do_CSSVariablesRulec                 C   s|   |   |j¡}|r<|jr<t| ƒ}| |  |¡¡ |jD ]
}| |j|j¡ q| d¡ |j|› | j	j
› ddd | ¡ S dS )zr
        serializes CSSFontFaceRule

        style
            CSSStyleDeclaration

        + CSSComments
        rb   r]   r   rž   r   )Údo_css_CSSStyleDeclarationÚstylerœ   rO   rj   rz   r    r    r’   rf   r>   )r   ry   Ú	styleTextrR   r¡   r   r   r   Údo_CSSFontFaceRuleÌ  s   	


z CSSSerializer.do_CSSFontFaceRulec                 C   sÚ   |j rkt| ƒ}| |  |¡¡ |jD ]R}|j|j}}d|kr>| jjdks0| jjdkr7|j	dkr7| |d¡ q| |d¡ qd|krS|  
|¡}|rR|dkrR| |¡ qd|kr^| |d¡ q| ||¡ q|jd	d
S dS )z×
        serializes CSSImportRule

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

        + CSSComments
        ÚhrefrJ   rg   rV   rW   ÚmediaÚallr€   rc   ©r   r   )rœ   rO   rj   rz   r    r’   r    rf   r4   ZhreftypeÚdo_stylesheets_medialist)r   ry   rR   r¡   rp   ro   r\   r   r   r   Údo_CSSImportRuleã  s*   



€zCSSSerializer.do_CSSImportRulec                 C   sj   |j r3t| ƒ}| |  |¡¡ |jD ]}|j|j}}d|kr&| |d¡ q| ||¡ q|jddS dS )z†
        serializes CSSNamespaceRule

        uri
            string
        prefix
            string

        + CSSComments
        r“   rV   rc   rª   r   )rœ   rO   rj   rz   r    r’   r    )r   ry   rR   r¡   rp   ro   r   r   r   Údo_CSSNamespaceRule  s   
z!CSSSerializer.do_CSSNamespaceRulec                 C   s`  |j jsdS |  |¡g}t| jjƒs| d¡ n| | jj¡ | |  |j ¡¡ |jrT| | jj¡ t	| ƒ}| t
 |j¡¡ |jD ]
}| |j|j¡ qB| | ¡ ¡ | | jj¡ | d¡ | | jj¡ g }|jD ]}|j}|r†| |  || jd ¡¡ | | jj¡ ql| jjs”d |¡ ¡ s”dS | |¡ | d| jt| jjƒ | jj  ¡ d |¡S )z@
        serializes CSSMediaRule

        + CSSComments
        r   r-   rb   r   z%s})r¨   rœ   rz   r„   rf   rH   rj   r«   r€   rO   r   rJ   r    r    r’   rD   r>   r‘   r[   rk   rl   r:   r   rT   ÚextendÚintr6   r5   )r   ry   rR   Znameoutr¡   ÚrulesoutÚrÚrtextr   r   r   Údo_CSSMediaRule&  sB   	


€
ÿÿ
zCSSSerializer.do_CSSMediaRulec                 C   s  g }|j D ]}|j}|r| |¡ | | jj¡ qd |¡}| j|j| d}|s+|r€|jr€t	| ƒ}| |  
|¡¡ | |j¡ | d¡ |r`|sW|j|› | jj› dd n	|j|dddd |ri|j|dd |  jd8  _| d	¡ |  jd7  _| ¡ S dS )
zÕ
        serializes CSSPageRule

        selectorText
            string
        style
            CSSStyleDeclaration
        cssRules
            CSSRuleList of MarginRule objects

        + CSSComments
        r   )Úomitrb   r   rž   rd   F)rp   r5   rq   r]   )r‘   r[   rj   rf   r>   r   r£   r¤   rœ   rO   rz   ÚselectorTextrl   r    )r   ry   r°   r±   r²   Z	rulesTextr¥   rR   r   r   r   Údo_CSSPageRule^  s2   

€


zCSSSerializer.do_CSSPageRulec                 C   sJ   t | ƒ}|D ]}|jdkr|j|j|jdd q| |j|j¡ q| ¡ S )z#Serialize selector of a CSSPageRuleÚIDENTF©rq   )rO   r’   rj   r    )r   r    rR   r¡   r   r   r   Údo_CSSPageRuleSelector  s   
z$CSSSerializer.do_CSSPageRuleSelectorc                 C   s|   |j r<|  |j¡}|r<|jr<t| ƒ}|j|  |¡dd | d¡ | d|  || jd ¡| j	j
f ¡ | d¡ | ¡ S dS )z’
        serializes MarginRule

        atkeyword
            string
        style
            CSSStyleDeclaration

        + CSSComments
        Z	ATKEYWORD)rp   rb   z%s%sr   r]   r   )rw   r£   r¤   rœ   rO   rj   rz   rk   rl   rf   r>   r    )r   ry   r¥   rR   r   r   r   Údo_MarginRule™  s    

þÿÿ
zCSSSerializer.do_MarginRulec                 C   sÞ   |j rm| jjrmt| ƒ}| |j¡ g }|jD ]R}|j|j}}d|krL| 	¡  ¡ }|r?|  
|| jj | tdt|ƒd ƒ¡}n|  
|tdt|ƒd ƒ¡}|rW|d  ||¡ n| ||¡ d|krh| t| ƒ¡ q| ¡ S dS )zg
        serializes CSSUnknownRule
        anything until ";" or "{...}"
        + CSSComments
        r]   r   rS   rb   r   )rœ   rf   r;   rO   rj   rw   r    r’   r    Úpoprk   r>   Úminr„   )r   ry   rR   Ústacksr¡   rp   ro   Z
stackblockr   r   r   Údo_CSSUnknownRuleÄ  s,   
þ€zCSSSerializer.do_CSSUnknownRulec           	      C   sn  | j jrQdd„ |jD ƒ}dd„ |jD ƒ}| jD ]/}dd„ |D ƒ}| |¡r:dd„ |D ƒ}||kr9|  jd7  _ nq| jdkrF|  jd8  _q| j |j¡ d| _|  |j¡}|r\|js^d	S |  j	d7  _	d	}z|  
|j¡}W |  j	d8  _	n|  j	d8  _	w |s| j jrŽ|› | j j› d
S dS |  d|| j j| j j|  || j	d ¡| j j| j	t| j jƒ | j j f | j¡S )zd
        serializes CSSStyleRule

        selectorList
        style

        + CSSComments
        c                 S   ó   h | ]}|j ’qS r   ©Úelement©r   r   r   r   r   Ú	<setcomp>ú  ó    z0CSSSerializer.do_CSSStyleRule.<locals>.<setcomp>c                 S   ó   g | ]}|j ‘qS r   ©ZspecificityrÂ   r   r   r   r   û  rÄ   z1CSSSerializer.do_CSSStyleRule.<locals>.<listcomp>c                 S   r¿   r   rÀ   rÂ   r   r   r   rÃ   ý  rÄ   c                 S   rÅ   r   rÆ   rÂ   r   r   r   r      rÄ   r   r   r   z{}z%s%s{%s%s%s%s}N)rf   r7   ZselectorListru   Úissubsetrv   rj   Údo_css_SelectorListrœ   rl   r£   r¤   r:   rD   rk   r>   r¯   r6   r5   )	r   ry   ÚelementsZspecitivitiesÚselectorZlastelementsZlastspecitivitiesrµ   r¥   r   r   r   Údo_CSSStyleRuleë  sT   

þ
€
 ÿÿúÿ
õzCSSSerializer.do_CSSStyleRulec                 C   sV   |j r)g }|jD ]}t|tjjƒr| |j¡ q| |¡ qd| jj	 }| 
|¡S dS )z!comma-separated list of Selectorsz,%sr   )rœ   r    Ú
isinstanceÚcssutilsÚcssZSelectorrj   rµ   rf   r?   r   )r   ZselectorlistrR   ÚpartÚsepr   r   r   rÈ   (  s   

z!CSSSerializer.do_css_SelectorListc           
   	   C   sà   |j rnt| ƒ}|j dd¡}|jD ]X}|j|j}}t|tƒr`|\}}||ks-|s6|du r6|j	||dd q|t
jkr>d}	nz|j |¡}	W n tyQ   d}	Y nw |j	|	› d|› |dd q|j	||ddd q| ¡ 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   NFr¸   Ú*ú|T)rq   rr   )rœ   rO   Z_namespacesÚgetr    r’   r    rÌ   Útuplerj   rÍ   Z_ANYNSZprefixForNamespaceURIr–   )
r   rÊ   rR   Z
DEFAULTURIr¡   rp   ro   r“   r€   r”   r   r   r   Údo_css_Selector7  s2   

ÿ
ÿÿzCSSSerializer.do_css_Selectorc           
      C   sø   t |jƒdkrzt| ƒ}t |jƒd }t|jƒD ]\\}}|j|j}}d|krP|\}}	| jjr2t|ƒ}| 	|¡ | 	d¡ | 	|	j
¡ ||k sJ| jjsO| 	d¡ qt|tjjƒre| 	|d¡ | 	| jj¡ q| 	|j
|¡ | 	| jj¡ q| ¡  ¡ S dS )zVariables of CSSVariableRule.r   r   Úvarra   rc   rX   r   )r„   r    rO   r†   r’   r    rf   rA   r   rj   r[   rB   rÌ   rÍ   rÎ   Ú
CSSCommentr>   rT   )
r   rŸ   rR   Zlastitemrˆ   r¡   rp   ro   r€   Úcssvaluer   r   r   Údo_css_CSSVariablesDeclarationb  s,   


€z,CSSSerializer.do_css_CSSVariablesDeclarationTc           
         sH  t |jƒdkr¢|du r| jj}| jjr|j}n| ¡ ‰ ‡ fdd„|jD ƒ}g }|o,| jj}t|ƒD ]`\}}|j}	t	|	t
jjƒrO| jjrN| |	j¡ | |¡ q1t	|	t
jjƒrt|	jrs| |	j¡ |ri|t |ƒd ksn| d¡ | |¡ q1t	|	t
jjƒr‡| |	j¡ | |¡ q1| |	¡ | |¡ q1|r|d |kr|d= d |¡S dS )	z3
        Style declaration of CSSStyleRule
        r   Nc                    s:   g | ]}t |jtjjƒr|jˆ v st |jtjjƒs|‘qS r   )rÌ   r    rÍ   rÎ   ÚProperty)r   r¡   ©Z
_effectiver   r   r   ”  s    ü
þüz<CSSSerializer.do_css_CSSStyleDeclaration.<locals>.<listcomp>r   rc   rS   r   )r„   r    rf   r>   r8   ZgetPropertiesrB   r†   r    rÌ   rÍ   rÎ   r×   r9   rj   r[   rÚ   ZCSSUnknownRuler   )
r   r¤   Ú	separatorr´   r    rR   rB   rˆ   r¡   ro   r   rÛ   r   r£     sD   	
þ

€

€

z(CSSSerializer.do_css_CSSStyleDeclarationc                 C   s  g }|j d r†|jr†|  |¡r†|j \}}}|D ]"}t|dƒr%| |j¡ q|j|kr4| |  ||¡¡ q| |¡ q|rQ|jrE|jrQ|jrQ| d¡ | | j	j
¡ | |j¡ |r†|r†| d¡ |D ]#}t|dƒrp| |j¡ qb||jkr€| j	jr€| |j¡ qb| |¡ qbd |¡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   r[   ra   r-   r   )Zseqsrœ   r   ri   rj   r[   Zliteralnamerƒ   Z_mediaQueryrf   rE   Zliteralpriorityr3   Úpriorityr   )r   r   rR   Znameseqr    ÚpriorityseqrÏ   r   r   r   Údo_PropertyÀ  s<   	

ÿÿÿ



ÿ
zCSSSerializer.do_Propertyc                 C   sR   g }|D ]}t |dƒr| d¡ | |j¡ | d¡ q| |¡ qd |¡ ¡ S )z:
        a Properties priority "!" S* "important"
        r[   r-   r   )ri   rj   r[   r   rT   )r   rÞ   rR   rÏ   r   r   r   Údo_Property_priorityñ  s   

z"CSSSerializer.do_Property_priorityFc                 C   sœ   |sdS t | ƒ}|jD ]>}|j|j}}|r|tjjkrqt|dƒr*| |j	|¡ q|rC|d |d krC|d dv rCt
 |dd… ¡}| ||¡ q| ¡ S )zSerializes a PropertyValuer   r[   r   rS   z'"r   )rO   r    r’   r    rÍ   rÎ   r×   ri   rj   r[   r   rJ   )r   r    Ú
valuesOnlyrR   r¡   rp   ro   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v r‰|jpd}|jdkr!d}|jdv r d}nJ|jt|jƒkr1tt|jƒƒ}n:| jjrcd|j  k r@dk rcn n!|  d|j ¡}|}|j	d	kr\|d |d
d…  }n|dd… }n|  d|j ¡}|jdkrx|j	dkrxd}nd}| 
|| | |j¡ | ¡ S | 
|j|j¡ | ¡ S )z)Serializes a Value, valuesOnly is ignoredr   )Z	DIMENSIONÚNUMBERZ
PERCENTAGEr   rä   )ÚcmÚmmÚinZpxZpcÚptZemÚexrS   r   z%fú-r   Nú+)rO   r’   Ú	dimensionr    r¯   r	   rf   rC   ré   Z_signrj   )r   r    rá   rR   Údimro   ÚvÚsignr   r   r   Údo_css_Value  s4   




€"
þzCSSSerializer.do_css_Valuec                 C   s8   z| j | j| jdœ|j ||dW S  ty   Y dS w )z7Serialize a ColorValue, a HASH simple value or FUNCTION)re   rZ   r·   )rá   r   )Údo_css_CSSFunctionrö   Z	colorTypeÚKeyError)r   r    rá   r   r   r   Údo_css_ColorValueK  s   ýüüÿzCSSSerializer.do_css_ColorValuec                 C   sP   |sdS t | ƒ}|jD ]}|j|j}}|r|tjjkrq| ||¡ q| ¡ S )zSerialize a CSS function valuer   )rO   r    r’   r    rÍ   rÎ   r×   rj   ©r   rØ   rá   rR   r¡   rp   ro   r   r   r   r÷   V  s   
z CSSSerializer.do_css_CSSFunctionc                 C   sŒ   |sdS t | ƒ}|jD ]6}|j|j}}|r|tjjkrqt|dƒr*| |j	|¡ q|dkr;|dv r;|j||dd q| ||¡ q| ¡ S )zSerialize a CSS calc valuer   r[   ÚCHARr^   T)rs   )
rO   r    r’   r    rÍ   rÎ   r×   ri   rj   r[   rú   r   r   r   Údo_css_CSSCalcc  s   

zCSSSerializer.do_css_CSSCalcc                 C   s:   |sdS t | ƒ}|jD ]}|j}|j|ddd q| ¡ S )zXSerialize an ExpressionValue (IE only),
        should at least keep the original syntaxr   NFr¸   )rO   r    r    rj   )r   rØ   rá   rR   r¡   ro   r   r   r   Údo_css_MSValuex  s   
zCSSSerializer.do_css_MSValuec                 C   s†   |r|j sdS t| ƒ}|j}| jjr|r| |¡ | ¡ S | dd¡ | |j d¡ |jr:| dd¡ | |jj¡ | d¡ | ¡ S )zSerializes a CSSVariabler   zvar(re   r·   r`   ÚCOMMAr_   )r€   rO   r    rf   rF   rj   Úfallbackr[   )r   ÚvariableZIGNOREDrR   rô   r   r   r   Údo_css_CSSVariableˆ  s   

ù
z CSSSerializer.do_css_CSSVariablec                 C   sd   t |ƒdkrdS |j}t| ƒ}d}|D ]}|jdkr%|r#| dd¡ nd}| |j|j¡ q| ¡ 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û   T)r„   r    rO   r’   rj   r    )r   Z	medialistr    rR   Z	firstdoner¡   r   r   r   r«   ž  s   
z&CSSSerializer.do_stylesheets_medialistc           
      C   s„   |j sdS g }d}|jD ] }|j|j}}|dkr#|r#| d¡ d}nd}| ||f¡ qt| ƒ}|D ]
\}}	| |	|¡ q3| ¡ S )z2
        a single media used in medialist
        r   Fr  )rû   r`   T)rœ   r    r’   r    rj   rO   )
r   Z
mediaqueryZwithsemiZnextmqr¡   rp   ro   rR   Útrô   r   r   r   Údo_stylesheets_mediaquery·  s$   

ýz'CSSSerializer.do_stylesheets_mediaqueryrP   )NT)F)(r*   rL   rM   rN   r!   rz   rk   rƒ   r‰   rh   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  sN    

		*81
+'=+ 
ÿ?1


0



)rN   Ú__all__Zcssutils.helperr   ÚcodecsrÍ   r   r   r   Úregister_errorr   rO   r   r   r   r   r   Ú<module>   s     y