o
    å/œhþ£  ã                   @   sv   d Z ddgZddlZddlZddlm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é    N)Ú	normalizeé   )Ú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   úF/var/www/html/myenv/lib/python3.10/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__)ÚselfÚinitialsÚkeyÚvaluer   r   r   Ú__init__q   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   {   s    ÿz(Preferences.__repr__.<locals>.<listcomp>)ÚformatÚ	__class__Ú__name__r   Ú__dict__r(   r   r(   r   Ú__repr__x   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)r5   r6   r:   r;   r<   r=   r>   r?   r@   rA   rC   rD   rE   rF   rH   rI   rJ   r(   r   r   r   ÚuseMinified£   s"   
zPreferences.useMinifiedN)	r+   Ú
__module__Ú__qualname__Ú__doc__r"   r-   r0   r   rL   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   rR   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éÿÿÿÿ)rS   Ú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.   rW   rX   ÚHASHÚcssTextÚ	mediaTextz+>~,:{;)]/=}Ú}r   ú-+*/z+>~rT   ú)ú,ú:Ú{ú;Ú	styletextz}[]()/=ÚFUNCTION)rR   ÚprefsrI   r:   r\   r   rK   rV   ÚuriÚ_hashÚhasattrr]   r7   rS   ÚappendÚ_indentblockÚ_levelÚendswithÚinsertrH   r@   rF   rE   r?   )r   ÚvalÚtype_ÚspaceÚkeepSr6   ÚalwaysSÚ	prefspacer   r   r   rk   È   sz   


€

 


ÿþý¹?z
Out.appendr   c                 C   s(   |s|   ¡  |r| j |¡ | | j¡S )z!returns all items joined by delim)rV   rS   rk   r   )r   Údelimr   rs   r   r   r   r!   ,  s
   z	Out.value)NTFFF)r   NF)r+   rM   rN   rO   r"   rV   rk   r!   r   r   r   r   rP   ¼   s    
ÿdrP   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   rg   rm   Ú
_selectorsÚ_selectorlevel)r   rg   r   r   r   r"   <  s   
zCSSSerializer.__init__c                 C   s   | j jr|jS |jS )z6returns default or source atkeyword depending on prefs)rg   r2   Ú	atkeywordÚ_keyword©r   Úruler   r   r   Ú
_atkeywordJ  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   )rg   r6   )r   Úline©Úlevelr   r   r   r   X  s    ÿÿz.CSSSerializer._indentblock.<locals>.<listcomp>)rg   r?   r   Úsplit)r   Útextr€   r   r   r   rl   Q  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
        )rg   r3   r9   Ú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)
rg   r>   Úlenr	   Úcountr?   Ú	enumerater   rk   r   )r   r‚   ÚpadrS   Úir~   r   r   r   Ú_linenumnbersh  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   é   é   é   é   ú#)rg   rA   r‡   )r   rp   rq   r   r   r   ri   q  s   ÿzCSSSerializer._hashc                 C   s   | j j p| j jo|jS )z/checks items valid property and prefs.validOnly)rg   rJ   Ú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   )Ú_getUsedURIsÚcssRulesrg   r=   ÚNAMESPACE_RULEÚtypeÚnamespaceURIÚprefixr\   rk   rŒ   r?   r   ÚencodingÚ
IndexErrorÚAttributeErrorÚencode)r   Ú
stylesheetÚusedurisrS   r|   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   )Ú_cssTextrg   r:   r{   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   rK   r›   r{   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
        rc   r^   r   ©r6   r   )Ú	variablesr\   r¤   rg   rG   rP   rk   r}   Úseqr!   r˜   r?   )r   r|   ÚvariablesTextrS   Ú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
        rc   r^   r   r¦   r   )Údo_css_CSSStyleDeclarationÚstyler¤   rP   rk   r}   r¨   r!   r˜   rg   r?   )r   r|   Ú	styleTextrS   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
        ÚhrefrK   rh   rW   rX   ÚmediaÚallrƒ   rd   ©r   r   )r¤   rP   rk   r}   r¨   r˜   r!   rg   r5   ÚhreftypeÚdo_stylesheets_medialist)r   r|   rS   rª   rq   rp   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™   rW   rd   r³   r   )r¤   rP   rk   r}   r¨   r˜   r!   )r   r|   rS   rª   rq   rp   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.   rc   r   z%s})r±   r¤   r}   r‡   rg   rI   rk   rµ   rƒ   rP   r   rK   r¨   r!   r˜   rE   r?   r–   r\   rl   rm   r;   r   rU   ÚextendÚintr7   r6   )r   r|   rS   Ú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   )Úomitrc   r   r¦   re   F)rq   r6   rr   r^   )r–   r\   rk   rg   r?   r   r¬   r­   r¤   rP   r}   ÚselectorTextrm   r!   )r   r|   r»   r¼   r½   Ú	rulesTextr®   rS   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©rr   )rP   r˜   rk   r!   )r   r¨   rS   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
        Ú	ATKEYWORD)rq   rc   z%s%sr   r^   r   )ry   r¬   r­   r¤   rP   rk   r}   rl   rm   rg   r?   r!   )r   r|   r®   rS   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   rT   rc   r   )r¤   rg   r<   rP   rk   ry   r¨   r˜   r!   Úpoprl   r?   Úminr‡   )r   r|   rS   Ústacksrª   rq   rp   Ú
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   ©Ú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)rg   r8   ÚselectorListrw   Úissubsetrx   rk   Údo_css_SelectorListr¤   rm   r¬   r­   r;   rE   rl   r?   r¹   r7   r6   )	r   r|   ÚelementsÚspecitivitiesÚselectorÚlastelementsÚ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ÚcssÚSelectorrk   rÀ   rg   r@   r   )r   ÚselectorlistrS   Ú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)rr   rs   )r¤   rP   Ú_namespacesÚgetr¨   r˜   r!   rß   Útuplerk   rà   Ú_ANYNSÚprefixForNamespaceURIrœ   )
r   rÛ   rS   Ú
DEFAULTURIrª   rq   rp   r™   rƒ   rš   r   r   r   Údo_css_Selector8  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   Úvarrb   rd   rY   r   )r‡   r¨   rP   r‰   r˜   r!   rg   rB   r   rk   r\   rC   rß   rà   rá   Ú
CSSCommentr?   rU   )
r   r§   rS   Úlastitemr‹   rª   rq   rp   rƒ   Úcssvaluer   r   r   Údo_css_CSSVariablesDeclarationc  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ª   ©Ú
_effectiver   r   r   •  s    ü
þüz<CSSSerializer.do_css_CSSStyleDeclaration.<locals>.<listcomp>r   rd   rT   r   )r‡   r¨   rg   r?   r9   ÚgetPropertiesrC   r‰   r!   rß   rà   rá   rð   r:   rk   r\   rô   ÚCSSUnknownRuler   )
r   r­   Ú	separatorr¿   r¨   rS   rC   r‹   rª   rp   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\   rb   r.   r   )Úseqsr¤   r”   rj   rk   r\   Úliteralnamer†   Ú_mediaQueryrg   rF   Úliteralpriorityr4   Úpriorityr   )r   r„   rS   Ú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   )rj   rk   r\   r   rU   )r   r   rS   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   rT   z'"r   )rP   r¨   r˜   r!   rà   rá   rð   rj   rk   r\   r   rK   )r   r!   Ú
valuesOnlyrS   rª   rq   rp   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   )Ú	DIMENSIONÚNUMBERÚ
PERCENTAGEr   r  )ÚcmÚmmÚinÚpxÚpcÚptÚemÚexrT   r   z%fú-r   Nú+)rP   r˜   Ú	dimensionr!   r¹   r	   rg   rD   r  Ú_signrk   )r   r!   r  rS   Údimrp   Ú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)rf   r[   rÃ   )r  r   )Údo_css_CSSFunctionr  Ú	colorTypeÚKeyError)r   r!   r  r   r   r   Údo_css_ColorValueL  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   )rP   r¨   r˜   r!   rà   rá   rð   rk   ©r   rò   r  rS   rª   rq   rp   r   r   r   r  W  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)rt   )
rP   r¨   r˜   r!   rà   rá   rð   rj   rk   r\   r#  r   r   r   Údo_css_CSSCalcd  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Ä   )rP   r¨   r!   rk   )r   rò   r  rS   rª   rp   r   r   r   Údo_css_MSValuey  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(rf   rÃ   ra   ÚCOMMAr`   )rƒ   rP   r!   rg   rG   rk   Úfallbackr\   )r   ÚvariableÚIGNOREDrS   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Ú
MediaQueryra   r$  T)r‡   r¨   rP   r˜   rk   r!   )r   Ú	medialistr¨   rS   Ú	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$  ra   T)r¤   r¨   r˜   r!   rk   rP   )
r   Ú
mediaqueryÚwithsemiÚnextmqrª   rq   rp   rS   Útr  r   r   r   Údo_stylesheets_mediaquery¸  s$   

ýz'CSSSerializer.do_stylesheets_mediaqueryrQ   )NT)F)(r+   rM   rN   rO   r"   r}   rl   r†   rŒ   ri   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µ   r3  r   r   r   r   r   5  sN    

		*81
+'=+ 
ÿ?1


0



)rO   Ú__all__Úcodecsrà   Úcssutils.helperr   r   r   r   Úregister_errorr   rP   r   r   r   r   r   Ú<module>   s     y