
    A6i                     6    d Z ddlmZ ddlmZ  G d de      Zy)z
.. module:: lesscpy.lessc.scope
    :synopsis: Scope class.


    Copyright (c)
    See LICENSE for details.
.. moduleauthor:: Johann T. Mariusson <jtm@robot.is>
    )string_types   )utilityc                        e Zd ZdZd fd	Zd Zed        Zej                  d        Zed        Z	d Z
ddZd	 Zd
 Zd Zd Zd Zd Zd ZddZd Z xZS )Scopez* Scope class. A stack implementation.
    c                 x    t         t        |           i | _        |r| j	                          d| _        g | _        y)zDScope
        Args:
            init (bool): Initiate scope
        FN)superr   __init___mixinspushdeferredreal)selfinit	__class__s     V/home/azureuser/techstart-app/venv/lib/python3.12/site-packages/lesscpy/lessc/scope.pyr
   zScope.__init__   s3    
 	eT#%IIK	    c                 0    | j                  i g g dd       y)zPush level on scope
        N)__variables__
__blocks__	__names____current__)appendr   s    r   r   z
Scope.push   s!     		
 	r   c                     | d   d   S Nr    r   s    r   currentzScope.current)   s    Bx&&r   c                     || d   d<   y r   r   )r   values     r   r   zScope.current-   s    "'Rr   c                 >    | D cg c]  }|d   s	|d    c}S c c}w )zECurrent scope name as list
        Returns:
            list
        r   r   )r   rs     r   	scopenamezScope.scopename1   s$     +/CQ!M2B- CCCs   
c                 |    | d   d   j                  |       | d   d   j                  |j                                y)zYAdd block element to scope
        Args:
            block (Block): Block object
        r   r   r   N)r   raw)r   blocks     r   	add_blockzScope.add_block9   s8    
 	R%%e,R$$UYY[1r   c                 |    | |   d   j                  |       | |   d   j                  |j                                y)z^Remove block element from scope
        Args:
            block (Block): Block object
        r   r   N)remover&   )r   r'   indexs      r   remove_blockzScope.remove_blockA   s8    
 	UL!((/UK ''		4r   c                     |j                   d   d   j                         }|| j                  v r| j                  |   j                  |       y|g| j                  |<   y)zQAdd mixin to scope
        Args:
            mixin (Mixin): Mixin object
        r   N)tokensr&   r   r   )r   mixinr&   s      r   	add_mixinzScope.add_mixinI   sR    
 ll1oa $$&$,,LL$$U+!&DLLr   c                 .    || d   d   |j                   <   y)z]Add variable to scope
        Args:
            variable (Variable): Variable object
        r   r   N)name)r   variables     r   add_variablezScope.add_variableT   s    
 4<R!(--0r   c                     t        |t              r|d   }|j                  d      rd|dd z   }t        |       }|dk\  r |dz  }|| |   d   v r| |   d   |   S |dk\  r y)	zSearch for variable by name. Searches scope top down
        Args:
            name (string): Search term
        Returns:
            Variable object OR False
        r   @{@   r   r   r   F)
isinstancetuple
startswithlen)r   r2   is      r   	variableszScope.variables[   s     dE"7D??4 a#DI1fFAtAw//Aw/55 1f r   c                 n    | j                  |      }|r|S | j                  |j                  dd            S )z Search mixins for name.
        Allow '>' to be ignored. '.a .b()' == '.a > .b()'
        Args:
            name (string): Search term
        Returns:
            Mixin object list OR False
        ?>? )_smixinsreplace)r   r2   ms      r   mixinszScope.mixinsm   s4     MM$H}}T\\%566r   c                 @    || j                   v r| j                   |   S dS )z4Inner wrapper to search for mixins by name.
        F)r   )r   r2   s     r   rB   zScope._smixinsz   s#     &*T\\%9t||D!DuDr   c                 n    | j                  |      }|r|S | j                  |j                  dd            S )z
        Search for defined blocks recursively.
        Allow '>' to be ignored. '.a .b' == '.a > .b'
        Args:
            name (string): Search term
        Returns:
            Block object OR False
        r@   rA   )_blocksrC   )r   r2   bs      r   blockszScope.blocks   s4     LLH||DLL455r   c                 >   t        |       }|dk\  r|dz  }|| |   d   v r*| |   d   D ]  }|j                         }|s||k(  s|c S  nN| |   d   D ]C  }|j                         }|s|j                  |      s(t        j                  ||      }|sA|c S  |dk\  ry)z4Inner wrapper to search for blocks by name.
        r   r   r   r   F)r<   r&   r;   r   blocksearch)r   r2   r=   rI   r#   s        r   rH   zScope._blocks   s     I1fFAtAw{++a. !AAQ$Y !
 a. %AAT__Q/#//48#$H% 1f r   c                    t        |d      r'|s%| j                  j                  |j                         | |   d   j                  ||   d          | |   d   j                  ||   d          | |   d   j                  ||   d          y)zUpdate scope. Add another scope to this one.
        Args:
            scope (Scope): Scope object
        Kwargs:
            at (int): Level to update
        r   r   r   r   N)hasattrr   updateextend)r   scopeats      r   rO   zScope.update   s     5)$RLL.R!((r?)CDR%%eBi&=>R$$U2Y{%;<r   c                    |j                  d      rz| j                  |dd       }|du rt        d|z        dt        j                  |j
                  d         z   }| j                  |      }|du rt        d|z        |j
                  S |j                  d      r| j                  d|d	d
 z         }|du rt        d|z        t        |j
                  d   t              r/t        j                  |j
                  d         |j
                  d<   |j
                  S | j                  |      }|du rt        d|z        |j
                  S )z Swap variable name for variable value
        Args:
            name (str): Variable name
        Returns:
            Variable value (Mixed)
        z@@r   NFzUnknown variable %sr7   r   r6   r8   r   zUnknown escaped variable %s)r;   r>   SyntaxErrorr   destringr!   r9   r   )r   r2   vars      r   swapz
Scope.swap   s:    ??4 ..ab*Ce|!"7$">??))#))A,77D..&Ce|!"7$">?? yy __T"..tAbz!12Ce|!"?$"FGG#))A,5&//		!=		!
 yy ..&Ce|!"7$">??yyr   )F)z-1)r   )__name__
__module____qualname____doc__r
   r   propertyr   setterr$   r(   r,   r0   r4   r>   rE   rB   rJ   rH   rO   rW   __classcell__)r   s   @r   r   r      s    
 ' ' ^^( ( D D25	(<$7E
6(=r   r   N)r[   sixr    r   listr   r   r   r   <module>rb      s      xD xr   