
    *g1                        d Z ddlmZ ddlZddlmZmZ ddlZddlm	Z	 ddl
mZ er
ddlmZmZmZ ddZddd	Z G d
 d      Zy)zN
Utilities for interpreting CSS from Stylers for formatting non-HTML outputs.
    )annotationsN)TYPE_CHECKINGCallable)
CSSWarning)find_stack_level)	GeneratorIterableIteratorc                     d f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
    c              3  @  K   |j                         }	 | j                  t        |         }t        | j                  |      D ]  \  }}j                  |      ||   f  y# t        $ r. t	        j
                  d| d| dt        t                      Y yw xY ww)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   zipSIDESformat)selfpropvaluetokensmappingkeyidxprop_fmts          _/var/www/html/articles-backend/trend/venv/lib/python3.12/site-packages/pandas/io/formats/css.pyexpandz_side_expander.<locals>.expand&   s      	**3v;7G DJJ0 	4HC//#&s33	4  	MM$TF"UG15+-
 	s'   BA$ 7B$4BBBBr   strreturn&Generator[tuple[str, str], None, None] )r    r"   s   ` r!   _side_expanderr(      s    44 M    c                (      dk7  rd   d f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
     -c              3    K   |j                         }t        |      dk(  st        |      dkD  r(t        j                  d| dt        t                      d ddd d	d
d ddi}|D ]Y  j                         | j                  v r
|d d	<   )t        fd| j                  D              r
|d d<   Q|d d<   [ | j                  |j                               E d{    y7 w)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              3  B   K   | ]  }|j                         v   y wN)lower).0ratiotokens     r!   	<genexpr>z3_border_expander.<locals>.expand.<locals>.<genexpr>s   s     RUekkm+Rs   N)r   r   r   r   r   r   r6   BORDER_STYLESanyBORDER_WIDTH_RATIOSatomizeitems)r   r   r   r   border_declarationsr9   sides        @r!   r"   z _border_expander.<locals>.expandS   s     v;!s6{QMM/v5EF+- TF&!7TF&!6TF&!8

  	CE{{} 2 22=B#fTF&$9:R9Q9QRR=B#fTF&$9:=B#fTF&$9:	C << 3 9 9 ;<<<s   C)C5-C3.C5r#   r'   )rA   r"   s   ` r!   _border_expanderrB   C   s$     rz4&z'=R Mr)   c                     e Zd ZdZddddddddd	d
ddZej                         Zej                  dddddddddddd       ej                         Zej                  ddi       ej                         Z	e	j                  ddddd       g dZ
g dg d g d!g d"d#Zd$Zi d%D  ci c]  }|rd&| nd't        |       c}}} d(D  ci c]  }d&| t        d)|        c}}}  ed*       ed+      d,Z	 d7	 	 	 	 	 d8d.Z	 	 	 	 	 	 d9d/Z	 	 	 	 	 	 d9d0Zd:d1Zd;d2Zd<d3Zd-efd=d4Zd>d5Zd?d6Zy-c c}}} w c c}}} w )@CSSResolverzH
    A callable for parsing and resolving CSS to atomic properties.
    )pt   )emrF   )rE      )rG         ?)rE   g      ?)rE   H   )ingL&d2?)rK   g
BP(?)mmg      ?)rG   r   )rE   rG   remexpxpcrK   cmrL   q	!!default)rG   g{Gz?)rM   rI   )rM   g      ?)rM   g?)rM   rF   )rM   g      ?)rM   g      ?)rM      )rG   g?)rG   g333333?)%zxx-smallzx-smallsmallr3   largezx-largezxx-largesmallerlargerrS   r1   )rE   r   )rO      )rO   rT   )rO   rF   )r1   thickr3   thin)r1   hiddendotteddashedsoliddoublegrooveridgeinsetoutsetmediumdashdot
dashdotdothairmediumdashdotdotdashdotslantdashdotmediumdashed)r   r   r   r   )r   rF   r   rF   )r   rF   rT   rF   )r   rF   rT   r.   )rF   rT   r.   rZ   )toprightbottomleft)r+   rm   rn   ro   rp   border-r/   )colorstylewidthzborder-{:s}-zmargin-{:s}zpadding-{:s})marginpaddingNc                    t        |t              r| j                  |      }t        | j	                  |            }|i }| j                  ||      }| j                  ||      }| j                  |      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')]
        )
isinstancer$   parsedictr>   _update_initial_update_font_size_update_other_units)r   declarations	inheritedpropss       r!   __call__zCSSResolver.__call__   sp    X lC(::l3LT\\,/0I$$UI6&&ui8''..r)   c                    |j                         D ]  \  }}||vs|||<    |j                         }|j                         D ])  \  }}|dk(  r|j                  |d      }|dv r||= %|||<   + |S )Ninheritinitial)r   N)r?   copyget)r   r   r   r   val	new_propss         r!   r{   zCSSResolver._update_initial  s     #* 	"ID#5 !d	" JJL	 	&ID#immD)4''dO"%	$	& r)   c                    |j                  d      r3| j                  |d   | j                  |      | j                        |d<   |S )N	font-sizeconversions)r   
size_to_pt_get_font_sizeFONT_SIZE_RATIOS)r   r   r   s      r!   r|   zCSSResolver._update_font_size(  sN     99[!!%k"##I. 11 "1 "E+
 r)   c                R    |j                  d      r|d   }| j                  |      S y )Nr   )r   _get_float_font_size_from_pt)r   r   font_size_strings      r!   r   zCSSResolver._get_font_size6  s.    99[!$[1445EFFr)   c                \    |j                  d      sJ t        |j                  d            S )NrE   )endswithfloatrstrip)r   r   s     r!   r   z(CSSResolver._get_float_font_size_from_pt<  s-    ((...%,,T233r)   c                   | j                  |      }| j                  D ]h  }d| d}||v r$| j                  ||   || j                        ||<   d| d| fD ]+  }||v s| j                  ||   || j                        ||<   - j |S )Nrq   r2   )em_ptr   zmargin-zpadding-)r   r   r   r=   MARGIN_RATIOS)r   r   	font_sizerA   r   s        r!   r}   zCSSResolver._update_other_units@  s    ''.	JJ 	DTF&)Du}"oo$K# $ 8 8 . d #4&)XdV+<= 5="&//d'$($6$6 #2 #E$K	" r)   c                     fd}t        j                  d      }| |       S |j                         \  }}|dk(  rd}n	 t        |      }|dk7  r&|dk(  r|d}n||z  }d}	 |   \  }}||z  }|dk7  r&t        |d      }t        |      |k(  rt        |      d	d}	|	S |d
d}	|	S # t        $ r
  |       cY S w xY w# t
        $ r
  |       cY S w xY w)Nc                     t        j                  dt               t        t	                      j                  d       S )NzUnhandled size: r   z
1!!defaultr   )r   r   reprr   r   r   )r   in_valr   s   r!   _errorz&CSSResolver.size_to_pt.<locals>._errorW  s;    MM"4<.1+-
 ??<[?IIr)   z^(\S*?)([a-zA-Z%!].*)r+   rF   rE   rG   rM      df)rematchgroupsr   
ValueErrorr   roundint)
r   r   r   r   r   r   r   unitmulsize_fmts
   `` `      r!   r   zCSSResolver.size_to_ptV  s   	J 16:=8OLLN	T"9C Cj dlt|= D5LCD '-	c 3JC dl Cms8s?c(1R(H  a|H/   x    x s$   B/ )C /CCCCc              #     K   |D ][  \  }}|j                         }|j                         }|| j                  v r"| j                  |   } || ||      E d {    V||f ] y 7 wr5   )r6   CSS_EXPANSIONS)r   r~   r   r   r"   s        r!   r>   zCSSResolver.atomize  sn     ' 	"KD%::<DKKMEt***,,T2!$e444Ek!	"
 5s   AA&A$A&c              #  n  K   |j                  d      D ]  }|j                         s|j                  d      \  }}}|j                         j                         }|j                         j                         }|r||f nt	        j
                  dt        |       t        t                       yw)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	partitionr6   r   r   r   r   r   )r   declarations_strdeclr   sepr   s         r!   ry   zCSSResolver.parse  s      %**3/ 	D::<!^^C0ND#s::<%%'D))+##%CCiCDJ<P/1	s   B3B5r5   )r~   zstr | Iterable[tuple[str, str]]r   zdict[str, str] | Noner%   dict[str, str])r   r   r   r   r%   r   )r   r   r%   zfloat | None)r   r$   r%   r   )r   r   r%   r   )r%   r$   )r~   r	   r%   r&   )r   r$   r%   zIterator[tuple[str, str]])__name__
__module____qualname____doc__UNIT_RATIOSr   r   updater   r=   r;   r   r   rB   r(   r   r   r{   r|   r   r   r}   r   r>   ry   )r7   r   rB   r(   s   0000r!   rD   rD      s   
 K #'')$%! ##"&!"	
   $$&M&),-%**,		
M* 	O /E ?
 
 "&wtf86Ft6LL
 4
 
 dVn~dV-DEE
 !/!.1N  ,04/54/ )4/ 
	4/l " 
	, " 
	4, (, +Z"{

s   'D7
D>
rD   )r    r$   r%   r   )r+   )rA   r$   r%   r   )r   
__future__r   r   typingr   r   r   pandas.errorsr   pandas.util._exceptionsr   collections.abcr   r	   r
   r(   rB   rD   r'   r)   r!   <module>r      sG    # 	  $ 4 (V9xf fr)   