
    A6iT                         d Z ddlmZ ddlZddlZddlZddlZddlmZ 	 ddl	m
Z
 d Zd Zd Zd	 Zd
 ZddZd ZddZddZd Zd Zd Zd Zd ZddZddZd ZddZy# e$ r	 ddlm
Z
 Y Jw xY w)z
.. module:: lesscpy.lessc.utility
    :synopsis: various utility functions

    Copyright (c)
    See LICENSE for details.
.. moduleauthor:: Johann T. Mariusson <jtm@robot.is>
    )print_functionN)string_types)Iterablec              #      K   | D ];  }t        |t              r%t        |t              st        |      D ]  }|  8| = yw)z_Flatten list.
    Args:
        lst (list): List to flatten
    Returns:
        generator
    N)
isinstancer   r   flatten)lstelmsubs      X/home/azureuser/techstart-app/venv/lib/python3.12/site-packages/lesscpy/lessc/utility.pyr   r      sL       c8$Z\.#s| 	 Is   AAc              #   ~   K   | syt        |       }t        |dz
        D ]  }| |   | |dz      f  | d   df yw)z yield item i and item i+1 in lst. e.g.
        (lst[0], lst[1]), (lst[1], lst[2]), ..., (lst[-1], None)
    Args:
        lst (list): List to process
    Returns:
        list
    N   )lenrange)r	   lengthis      r   pairwiser   )   sT      XF6A: !!fc!a%j  !
b'4-s   ;=c                 $   | D ]  }t        ||      s|j                  d   j                  |       |j                  d   s>|j                          |j                  d   |_        t        |j                  d   ||       |j                           y)z Rename all sub-blocks moved under another
        block. (mixins)
    Args:
        lst (list): block list
        scope (object): Scope object
    r   r   N)r   tokensparsepushcurrentrenamepop)blocksscopestypeps       r   r   r   9   ss      aHHQKe$xx{

 !qxx{E51		    c                     t        | d      rG| j                  d   D ]5  }t        |d      r|j                         |k(  r|nt        ||      }|s3|c S  y)z Recursive search for name in block (inner blocks)
    Args:
        name (str): search term
    Returns:
        Block OR False
    r   r   rawF)hasattrr   r"   blocksearch)blocknamebs      r   r$   r$   J   sY     uha 	Aa'AEEGtO4BA		
 r    c                 L    ddddd}| D cg c]  }||v r||   n| c}S c c}w )z Reverse guard expression. not
        (@a > 5) ->  (@a =< 5)
    Args:
        lst (list): Expression
    returns:
        list
    >==<<>)r+   r,   r)   r*    )r	   revls      r   reverse_guardr0   Z   s5     4s#
6C/23!a3hCFA%333s   !c                    dj                  dg|z        }t        |       }|t        u r| D ]  }t        ||        yt	        | d      r8t        ||       t        t        t        | j                              |dz          yy)zj Print scope tree
    args:
        lst (list): parse result
        lvl (int): current nesting level
     z	.r   r   N)jointypelistdebug_printr#   printr   r   )r	   lvlpadtr   s        r   r6   r6   f   su     ''5'C-
 CS	ADy 	 A3	 	h	c1D,-sQw7 
 r    c                 $    | j                  d      S )zU Strip quotes from string
    args:
        value (str)
    returns:
        str
    z"')stripvalues    r   destringr?   v   s     ;;ur    c                     t        |       \  }}t        | t              s| |fS t        |       r| dfS t	        |      rt        |      }||fS t        |      rt        |      }||fS t        |d| d      )z Analyse number for type and split from unit
        1px -> (q, 'px')
    args:
        var (str): number string
    kwargs:
        err (str): Error message
    raises:
        SyntaxError
    returns:
        tuple
    coloru    ´   ´)	
split_unitr   r   is_coloris_intintis_floatfloatSyntaxError)varerrnus       r   analyze_numberrN      s     c?DAqc<(Av}G|ayF
 a4K	 
!!H a4K c233r    c                     t        | t              r| \  } }| dk(  ry|r't        |       } | j                  d      rd| z   } | |S t        | t              r| S t        |       S )zx Return number with unit
    args:
        number (mixed): Number
        unit (str): Unit
    returns:
        str
    r   0.)r   tuplestr
startswithr   )numberunits     r   	with_unitrW      sg     &% {VS!6\F&&56F3v;Fr    c                     | rt        | t              sy| d   dk(  rt        |       dv r	 t        | dd d       yy# t        $ r Y yw xY w)	zY Is string CSS color
    args:
        value (str): string
    returns:
        bool
    Fr   #)         	   r   N   T)r   r   r   rF   
ValueErrorr=   s    r   rD   rD      s]     
5,7Qx33u:5	ab	2   		s   ; 	AAc                     t        | t              r$| j                  d      xs | j                  d      S t        | t              r5dj	                  |       } | j                  d      xs | j                  d      S y)zf Check if string is LESS variable
    args:
        value (str): string
    returns:
        bool
    @z-@r2   F)r   r   rT   rR   r3   r=   s    r   is_variablerb      sj     %&$>(8(8(>>	E5	!$>(8(8(>>r    c                 X    	 t        t        |              y# t        t        f$ r Y yw xY w)zV Is value integer
    args:
        value (str): string
    returns:
        bool
    TF)rF   rS   r_   	TypeErrorr=   s    r   rE   rE      s/    CJ	" s    ))c                 p    t        |       s	 t        t        |              yy# t        t        f$ r Y yw xY w)zT Is value float
    args:
        value (str): string
    returns:
        bool
    TF)rE   rH   rS   r_   rd   r=   s    r   rG   rG      s@     %=	#e*  I& 		s   # 55c                 h    t        j                  dt        |             }|r|j                         S dS )z{ Split a number from its unit
        1px -> (q, 'px')
    Args:
        value (str): input
    returns:
        tuple
    z^(\-?[\d\.]+)(.*)$)r2   r2   )researchrS   groups)r>   rs     r   rC   rC      s,     			&E
3A188:((r    c           	          t         j                  d   dk\  r@d|z  }t        t        j                  | |z  t        j
                  d|       z               |z  S t        | |      S )zBRound half-way away from zero.

    Python2's round() method.
    r      
         ?)sysversion_inforH   mathfloorcopysignround)r>   ndigitsr   s      r   away_from_zero_roundrv      sZ    
 a'MTZZdmmC.G GHIAMMUG$$r    c                     t         j                  d   dk  r[| dk  rt        |         S d}t        | d      \  }}t	        | |dz   z
        |k  r$|dz  |k  r|S |dz   }t        j                  |      S t        | |      S )zZConvergent rounding.

    Round to neareas even, similar to Python3's round() method.
    r   rl   g        gHz>r   rn   g       @)ro   rp   convergent_rounddivmodabsrq   ceilrt   )r>   ru   epsilonintegral_part_nearest_evens         r   rx   rx     s    
 Q3;$eV,,,!%+qu+,-7s"W,$$,s2yy..  r    c                 z    t        | t              r!d| v rt        | j                  d            dz  S t        |       S )z Utility function to process strings that contain either percentiles or floats
    args:
        str: s
    returns:
       float
    %g      Y@)r   r   rH   r<   )ss    r   pc_or_floatr     s5     !\"saxQWWS\"U**8Or    c              #      K   t        |       t              }||n|}t        j                  t	        |      |      D ]  }t        fd|D                yw)zReturn successive r length permutations of elements in the iterable.

    Similar to itertools.permutation but withouth repeated values filtering.
    N)repeatc              3   (   K   | ]	  }|     y wNr-   ).0r   pools     r   	<genexpr>z0permutations_with_replacement.<locals>.<genexpr>0  s     ,q47,s   )rR   r   	itertoolsproductr   r5   )iterablerj   rL   indicesr   s       @r   permutations_with_replacementr   '  sW     
 ?DD	AYAA$$U1Xa8 -,G,,,-s   AA)r   )r2   r   )__doc__
__future__r   r   rq   rg   ro   sixr   collections.abcr   ImportErrorcollectionsr   r   r   r$   r0   r6   r?   rN   rW   rD   rb   rE   rG   rC   rv   rx   r   r   r-   r    r   <module>r      s    &   	 
 %(
  " 	48 4G($ 	)	%!*		-e  %$%s   A# #A10A1