U
    `»{j„1  ã                   @  sŒ   d Z ddlmZ ddlZddlZddlmZmZmZm	Z	 ddl
Z
ddlmZ ddlmZ ddd	œd
d„Zddddœdd„ZG dd„ dƒZdS )zN
Utilities for interpreting CSS from Stylers for formatting non-HTML outputs.
é    )ÚannotationsN)ÚCallableÚ	GeneratorÚIterableÚIterator)Ú
CSSWarning)Úfind_stack_levelÚstrr   )Úprop_fmtÚreturnc                   s   dddœ‡ fdd„}|S )a)  
    Wrapper to expand shorthand property into top, right, bottom, left properties

    Parameters
    ----------
    side : str
        The border side to expand into properties

    Returns
    -------
        function: Return to call when a 'border(-{side}): {value}' string is encountered
    r	   ú&Generator[tuple[str, str], None, None]©Úvaluer   c              	   3  s†   |  ¡ }z| jt|ƒ }W n< tk
rV   tjd|› d|› d�ttt 	¡ ƒd� Y dS X t
| j|ƒD ]\}}ˆ  |¡|| fV  qddS )a<  
        Expand shorthand property into side-specific property (top, right, bottom, left)

        Parameters
        ----------
            prop (str): CSS property name
            value (str): String token for property

        Yields
        ------
            Tuple (str, str): Expanded property, value
        zCould not expand "z: ú"©Ú
stacklevelN)ÚsplitÚSIDE_SHORTHANDSÚlenÚKeyErrorÚwarningsÚwarnr   r   ÚinspectÚcurrentframeÚzipÚSIDESÚformat)ÚselfÚpropr   ÚtokensÚmappingÚkeyÚidx©r
   © úT/var/www/html/bwave/python/venv/lib/python3.8/site-packages/pandas/io/formats/css.pyÚexpand"   s    
ýz_side_expander.<locals>.expandr$   )r
   r&   r$   r#   r%   Ú_side_expander   s    r'   Ú )Úsider   c                   s*   ˆ dkrdˆ › �‰ dddœ‡ fdd„}|S )a.  
    Wrapper to expand 'border' property into border color, style, and width properties

    Parameters
    ----------
    side : str
        The border side to expand into properties

    Returns
    -------
        function: Return to call when a 'border(-{side}): {value}' string is encountered
    r(   ú-r	   r   r   c                 3  sà   |  ¡ }t|ƒdks t|ƒdkr@tjd|› d�ttt ¡ ƒd� dˆ› d�ddˆ› d	�d
dˆ› d�di}|D ]Z‰ ˆ | jkrŒˆ |dˆ› d	�< qlt	‡ fdd„| j
D ƒƒr¶ˆ |dˆ› d�< qlˆ |dˆ› d�< ql|  | ¡ ¡E dH  dS )aV  
        Expand border into color, style, and width tuples

        Parameters
        ----------
            prop : str
                CSS property name passed to styler
            value : str
                Value passed to styler for property

        Yields
        ------
            Tuple (str, str): Expanded property, value
        r   é   zToo many tokens provided to "z" (expected 1-3)r   Úborderz-colorÚblackz-styleÚnoneú-widthÚmediumc                   s   g | ]}|ˆ k‘qS r$   r$   )Ú.0Úratio©Útokenr$   r%   Ú
<listcomp>o   s     z4_border_expander.<locals>.expand.<locals>.<listcomp>N)r   r   r   r   r   r   r   r   ÚBORDER_STYLESÚanyÚBORDER_WIDTH_RATIOSÚatomizeÚitems)r   r   r   r   Zborder_declarations©r)   r3   r%   r&   O   s*    

ý
 
 
 ý
z _border_expander.<locals>.expandr$   )r)   r&   r$   r;   r%   Ú_border_expander?   s    
)r<   c                   @  s”  e Zd ZdZddddddddd	d
ddœZe ¡ Ze ddddddddddddœ¡ e ¡ Ze ddi¡ e ¡ Z	e	 dddddœ¡ dddd d!d"d#d$d%d&g
Z
d'd'd'd'gd'd(d'd(gd'd(d)d(gd'd(d)d*gd+œZd,Zd-d.„ d/D ƒd0d.„ d1D ƒed2ƒed3ƒd4œ–ZdWd6d7d8d9œd:d;„Zd8d8d8d<œd=d>„Zd8d8d8d<œd?d@„Zd8dAdBœdCdD„ZdEdFdGœdHdI„Zd8d8dBœdJdK„Zd5efdLdM„ZdNdOdPœdQdR„ZdEdSdTœdUdV„Zd5S )XÚCSSResolverzH
    A callable for parsing and resolving CSS to atomic properties.
    )Úpté   )Úemr?   )r>   é   )r@   ç      à?)r>   g      è?)r>   éH   )ÚingL&“Éd2Ù?)rD   g
…B¡P(¤?)Úmmg      Ð?)r@   r   )r>   r@   ÚremÚexÚpxZpcrD   ÚcmrE   Úqú	!!default)r@   g{®Gáz„?)rF   rB   )rF   g      ä?)rF   gš™™™™™é?)rF   r?   )rF   g      ò?)rF   g      ø?)rF   é   )r@   g«ªªªªªê?)r@   g333333ó?)ú%zxx-smallzx-smallZsmallr0   Zlargezx-largezxx-largeZsmallerZlargerrK   r.   )r>   r   )rH   é   )rH   rL   )rH   r?   )r.   Zthickr0   ZthinZhiddenZdottedZdashedZsolidÚdoubleZgrooveZridgeZinsetZoutsetr   r?   rL   r+   )r?   rL   r+   rN   )ÚtopÚrightÚbottomÚleftc                 C  s*   i | ]"}d   |rd|gndg¡t|ƒ“qS )r*   r,   )Újoinr<   ©r1   r   r$   r$   r%   Ú
<dictcomp>Å   s   ÿ zCSSResolver.<dictcomp>)r(   rP   rQ   rR   rS   c                 C  s$   i | ]}d   d|g¡td| ƒ“qS )r*   r,   zborder-{:s}-)rT   r'   rU   r$   r$   r%   rV   É   s   ÿ )ÚcolorÚstyleÚwidthzmargin-{:s}zpadding-{:s})ÚmarginÚpaddingNzstr | Iterable[tuple[str, str]]zdict[str, str] | Nonezdict[str, str])ÚdeclarationsÚ	inheritedr   c                 C  sP   t |tƒr|  |¡}t|  |¡ƒ}|dkr.i }|  ||¡}|  ||¡}|  |¡S )a£  
        The given declarations to atomic properties.

        Parameters
        ----------
        declarations_str : str | Iterable[tuple[str, str]]
            A CSS string or set of CSS declaration tuples
            e.g. "font-weight: bold; background: blue" or
            {("font-weight", "bold"), ("background", "blue")}
        inherited : dict, optional
            Atomic properties indicating the inherited style context in which
            declarations_str is to be resolved. ``inherited`` should already
            be resolved, i.e. valid output of this method.

        Returns
        -------
        dict
            Atomic CSS 2.2 properties.

        Examples
        --------
        >>> resolve = CSSResolver()
        >>> inherited = {'font-family': 'serif', 'font-weight': 'bold'}
        >>> out = resolve('''
        ...               border-color: BLUE RED;
        ...               font-size: 1em;
        ...               font-size: 2em;
        ...               font-weight: normal;
        ...               font-weight: inherit;
        ...               ''', inherited)
        >>> sorted(out.items())  # doctest: +NORMALIZE_WHITESPACE
        [('border-bottom-color', 'blue'),
         ('border-left-color', 'red'),
         ('border-right-color', 'red'),
         ('border-top-color', 'blue'),
         ('font-family', 'serif'),
         ('font-size', '24pt'),
         ('font-weight', 'bold')]
        N)Ú
isinstancer	   ÚparseÚdictr9   Ú_update_initialÚ_update_font_sizeÚ_update_other_units)r   r\   r]   Úpropsr$   r$   r%   Ú__call__Ó   s    ,

zCSSResolver.__call__)rd   r]   r   c                 C  sl   |  ¡ D ]\}}||kr|||< q| ¡ }|  ¡ D ]4\}}|dkrN| |d¡}|dkr^||= q2|||< q2|S )NÚinheritÚinitial)rg   N)r:   ÚcopyÚget)r   rd   r]   r   ÚvalZ	new_propsr$   r$   r%   ra   	  s    

zCSSResolver._update_initialc                 C  s.   |  d¡r*| j|d |  |¡| jd�|d< |S )Nú	font-size©Úconversions)ri   Ú
size_to_ptÚ_get_font_sizeÚFONT_SIZE_RATIOS)r   rd   r]   r$   r$   r%   rb     s    
ý
zCSSResolver._update_font_sizezfloat | None)rd   r   c                 C  s    |  d¡r|d }|  |¡S d S )Nrk   )ri   Ú_get_float_font_size_from_pt)r   rd   Úfont_size_stringr$   r$   r%   ro   -  s    

zCSSResolver._get_font_sizer	   Úfloat)rr   r   c                 C  s   |  d¡st‚t| d¡ƒS )Nr>   )ÚendswithÚAssertionErrorrs   Úrstrip)r   rr   r$   r$   r%   rq   3  s    z(CSSResolver._get_float_font_size_from_ptc                 C  s„   |   |¡}| jD ]n}d|› d�}||krB| j|| || jd�||< d|› �d|› �fD ]&}||krV| j|| || jd�||< qVq|S )Nzborder-r/   )Úem_ptrm   zmargin-zpadding-)ro   r   rn   r8   ÚMARGIN_RATIOS)r   rd   Z	font_sizer)   r   r$   r$   r%   rc   7  s"    

ý
ýzCSSResolver._update_other_unitsc           
        s  ‡ ‡‡fdd„}t  dˆ¡}|d kr*|ƒ S | ¡ \}}|dkrDd}n(zt|ƒ}W n tk
rj   |ƒ  Y S X |dkrÎ|dkr˜|d krŠd}ql||9 }d}qlzˆ | \}}W n tk
rÂ   |ƒ  Y S X ||9 }qlt|d	ƒ}t|ƒ|kröt|ƒd
›d�}	n|d›d�}	|	S )Nc                     s0   t jdtˆƒ› �ttt ¡ ƒd� ˆjdˆ d�S )NzUnhandled size: r   z
1!!defaultrl   )r   r   Úreprr   r   r   r   rn   r$   ©rm   Úin_valr   r$   r%   Ú_errorN  s    
ýz&CSSResolver.size_to_pt.<locals>._errorz^(\S*?)([a-zA-Z%!].*)r(   r?   r>   r@   rF   é   ÚdÚf)ÚreÚmatchÚgroupsrs   Ú
ValueErrorr   ÚroundÚint)
r   r{   rw   rm   r|   r�   rj   ÚunitÚmulZsize_fmtr$   rz   r%   rn   M  s8    

zCSSResolver.size_to_ptr   r   )r\   r   c                 c  sT   |D ]J\}}|  ¡ }|  ¡ }|| jkrD| j| }|| ||ƒE d H  q||fV  qd S )N)ÚlowerÚCSS_EXPANSIONS)r   r\   r   r   r&   r$   r$   r%   r9   z  s    

zCSSResolver.atomizezIterator[tuple[str, str]])Údeclarations_strr   c                 c  sx   |  d¡D ]h}| ¡ sq
| d¡\}}}| ¡  ¡ }| ¡  ¡ }|rP||fV  q
tjdt|ƒ› �ttt	 
¡ ƒd� q
dS )zÖ
        Generates (prop, value) pairs from declarations.

        In a future version may generate parsed tokens from tinycss/tinycss2

        Parameters
        ----------
        declarations_str : str
        ú;ú:z-Ill-formatted attribute: expected a colon in r   N)r   ÚstripÚ	partitionrˆ   r   r   ry   r   r   r   r   )r   rŠ   Údeclr   Úseprj   r$   r$   r%   r_   „  s    

ýzCSSResolver.parse)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ZUNIT_RATIOSrh   rp   Úupdaterx   r8   r6   r   r   r'   r‰   re   ra   rb   ro   rq   rc   rn   r9   r_   r$   r$   r$   r%   r=   {   s–   ôõÿüÿö



üþþþ÷ ý6-
r=   )r(   )r”   Ú
__future__r   r   r€   Útypingr   r   r   r   r   Zpandas.errorsr   Zpandas.util._exceptionsr   r'   r<   r=   r$   r$   r$   r%   Ú<module>   s   +<