
    A6i                     r    d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ  G d	 d
e      Zy)z
.. module:: lesscpy.plib.mixin
    :synopsis: Mixin node.

    Copyright (c)
    See LICENSE for details.
.. moduleauthor:: Johann T. Mariusson <jtm@robot.is>
    N   )Node)Block)
Expression)Variable)utilityc                   8    e Zd ZdZd Zd Zd Zd Zd Zg fdZ	y)	Mixinz2 Mixin Node. Represents callable mixin types.
    c                    | j                   d   \  | _        }| _        t        j                  |      D cg c]  }|s|	 c}| _        t        d| j                   d   gd      | _        t        t        j                  |D cg c]  }|d   	 c}D cg c]  }t        |j                                c}            | _
        | S c c}w c c}w c c}w )zParse node
        args:
            scope (Scope): current scope
        raises:
            SyntaxError
        returns:
            self
        r   Nr   __variables__)tokensnameguardsr   flattenargsr   bodylistvaluesvars)selfscoper   asvs         U/home/azureuser/techstart-app/venv/lib/python3.12/site-packages/lesscpy/plib/mixin.pyparsezMixin.parse   s     (,{{1~$	4 ' 5;1Q;	4Q0!4	OOGL*M!1_+=*M%&QXXZ  	  < +Ns   CCC	 Cc                 6    | j                   j                         S )z8Raw mixin name
        returns:
            str
        )r   raw)r   s    r   r   z	Mixin.raw*   s    
 yy}}    c           	         |r'|d   r"t        t        |dgt        |      z              nd}t        j                  d   dk(  rt
        j                  nt
        j                  }| j                  rt        j                  | j                        D cg c]  }t        |d      r|n| }}t        |t               r|n|g} ||D cg c]  }| c}|      D 	cg c]  \  }}	| j                  |	||       }
}}	|
D ]  }	|	s|	j                  |        |s|
D cg c]  }|s|j                   }}|sd}t        dd|g      j                  |       yc c}w c c}w c c}	}w c c}w )a  Parse arguments to mixin. Add them to scope
        as variables. Sets upp special variable @arguments
        as well.
        args:
            args (list): arguments
            scope (Scope): current scope
        raises:
            SyntaxError
        r    N   r    z
@arguments)r   ziplensysversion_info	itertoolszip_longestizip_longestr   copyhasattr
isinstance
_parse_argr   valuer   )r   r   r   	argumentszlr   parsedr   argvarr   s              r   
parse_argszMixin.parse_args1   sk    59T!W T!USY.0 1JN 	&)&6&6''Y"""// 	999=4999M45WQ(a/F  &dD14vD !#t#4!A#4f =C S%0D   %IIe$% .28aQWW8	8I,i0177> $5 9s   E	EEE" E"c                    t        |t              r^|rZt        j                  |d         r$|j	                  |d         }|sy|j
                  }n|}t        |j                  dd |gz         }|S t        j                  |      r[|t        d      t        j                  |d         r$|j	                  |d         }|sy|j
                  }n|}t        |d|g      }|S y)z Parse a single argument to mixin.
        args:
            var (Variable object): variable
            arg (mixed): argument
            scope (Scope object): current scope
        returns:
            Variable object or None
        r   NzMissing argument to mixin)r-   r   r   is_variable	variablesr/   r   SyntaxError)r   r4   r3   r   tmpvals         r   r.   zMixin._parse_argQ   s     c8$&&s1v.//#a&1C#))CCszz#2#67  
 ""3';%&ABB((Q0//#a&1C#))CCT3/0 
 r   c                    | j                   r{d| j                   v rdnd}| j                   D ]Z  }t        |t              st        |      dk(  r|d   j	                  |      nt        |      j	                  |      }|r|sU y|rZ y y)zParse guards on mixin.
        args:
            scope (Scope): current scope
        raises:
            SyntaxError
        returns:
            bool (passes guards)
        ,TFr   r   )r   r-   r   r%   r   r   )r   r   corgress        r   parse_guardszMixin.parse_guardsv   s     ;;,$%C[[ %a&!!fk Q4::e,/9!}/B/B5/I #' $% r   c                    d}|rD|D cg c]7  }|r1|D cg c]%  }t        |t              r|j                  |      n|' c}n|9 }}}	 | j                  ||       | j	                  |      rF| j
                  j                         }|j                  d   }|rt        j                  ||t               |S c c}w c c}}w # t        $ r Y |S w xY w)a  Call mixin. Parses a copy of the mixins body
        in the current scope and returns it.
        args:
            scope (Scope): current scope
            args (list): arguments
        raises:
            SyntaxError
        returns:
            list or False
        Fr   )r-   r   r   r5   rB   r   r+   r   r   renamer   r:   )r   r   r   retr3   r   r   s          r   callz
Mixin.call   s      *./"% MPGH*Q
";B /D /		6OOD%(   'yy~~'kk!nNN3u5
 /
  	 
	s'   B:*B5B:
C  5B: 	CCN)
__name__
__module____qualname____doc__r   r   r5   r.   rB   rF    r   r   r
   r
      s,    $?@#J,  " r   r
   )rJ   r&   r+   r(   noder   blockr   
expressionr   variabler   lesscpy.lesscr   r
   rK   r   r   <module>rQ      s2         "  !RD Rr   