o
    بf                     @   s  d Z G dd dZdd Zdd Zeddd	 ed
dd	 eddd	 eddd	 eddd	 eddd	 eddd	 eddd	 eddd	 eddd	 eddd	 eddd	 eddd	 dZe D ]\ZZee_qfG dd deZ	G dd deZ
e
 Z
G dd  d Zd!S )"z-
Parser and utilities for the smart 'if' tag
c                   @   s@   e Zd ZdZdZdZd ZZdd Zdd Z	dd Z
d	d
 ZdS )	TokenBasezi
    Base class for operators and literals, mainly for debugging and for throwing
    syntax errors.
    Nc                 C   s   | d| j )Nz.Not expecting '%s' in this position in if tag.error_classidselfparser r   O/var/www/dscantool/venv/lib/python3.10/site-packages/django/template/smartif.pynud      zTokenBase.nudc                 C   s   | d| j )Nz/Not expecting '%s' as infix operator in if tag.r   r   leftr   r   r   r	   led   r   zTokenBase.ledc                 C      | j S )zH
        Return what to display in error messages for this node
        )r   r   r   r   r	   display    s   zTokenBase.displayc                 C   s,   dd | j | j| jfD }dd| d S )Nc                 S   s   g | ]
}|d urt |qS N)str).0xr   r   r	   
<listcomp>'   s    z&TokenBase.__repr__.<locals>.<listcomp>( ))r   firstsecondjoin)r   outr   r   r	   __repr__&   s   zTokenBase.__repr__)__name__
__module____qualname____doc__r   valuer   r   r
   r   r   r   r   r   r   r	   r      s    r   c                       G  fdddt }|S )ze
    Create an infix operator, given a binding power and a function that
    evaluates the node.
    c                       (   e Zd Z Z fddZfddZdS )zinfix.<locals>.Operatorc                    s   || _ | | _| S r   )r   
expressionr   r   bpr   r	   r   3   s   zinfix.<locals>.Operator.ledc                    s(   z	 || j | jW S  ty   Y dS w NF)r   r   	Exceptionr   contextfuncr   r	   eval8   s
   zinfix.<locals>.Operator.evalN)r   r    r!   lbpr   r/   r   r(   r.   r   r	   Operator0       r2   r   r(   r.   r2   r   r1   r	   infix+   s   r6   c                    r$   )ze
    Create a prefix operator, given a binding power and a function that
    evaluates the node.
    c                       r%   )zprefix.<locals>.Operatorc                    s   |  | _d | _| S r   )r&   r   r   r   r'   r   r	   r
   L   s   zprefix.<locals>.Operator.nudc                    s$   z || j W S  ty   Y dS w r)   )r   r*   r+   r-   r   r	   r/   Q   s
   zprefix.<locals>.Operator.evalN)r   r    r!   r0   r
   r/   r   r1   r   r	   r2   I   r3   r2   r4   r5   r   r1   r	   prefixD   s   r7      c                 C   s   | | p	| | S r   r/   r,   r   yr   r   r	   <lambda>^       r<      c                 C   s   | | o	| | S r   r9   r:   r   r   r	   r<   _   r=      c                 C   s   | |  S r   r9   )r,   r   r   r   r	   r<   `   s    	   c                 C   s   | | | | v S r   r9   r:   r   r   r	   r<   a   r=   c                 C   s   | | | | vS r   r9   r:   r   r   r	   r<   b   r=   
   c                 C   s   | | | | u S r   r9   r:   r   r   r	   r<   c   r=   c                 C   s   | | | | uS r   r9   r:   r   r   r	   r<   d   r=   c                 C   s   | | | | kS r   r9   r:   r   r   r	   r<   e   r=   c                 C   s   | | | | kS r   r9   r:   r   r   r	   r<   f   r=   c                 C   s   | | | | kS r   r9   r:   r   r   r	   r<   g   r=   c                 C   s   | | | | kS r   r9   r:   r   r   r	   r<   h   r=   c                 C   s   | | | | k S r   r9   r:   r   r   r	   r<   i   r=   c                 C   s   | | | | kS r   r9   r:   r   r   r	   r<   j   r=   )orandnotinnot inisis notz==z!=>z>=<z<=c                   @   s@   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dd Z
dS )LiteralzO
    A basic self-resolvable object similar to a Django template variable.
    literal    c                 C   s
   || _ d S r   r#   r   r#   r   r   r	   __init__|      
zLiteral.__init__c                 C   s
   t | jS r   )reprr#   r   r   r   r	   r      rQ   zLiteral.displayc                 C   s   | S r   r   r   r   r   r	   r
      s   zLiteral.nudc                 C   r   r   rN   r+   r   r   r	   r/      s   zLiteral.evalc                 C   s   d| j | jf S )Nz(%s %r))r   r#   r   r   r   r	   r      s   zLiteral.__repr__N)r   r    r!   r"   r   r0   rP   r   r
   r/   r   r   r   r   r	   rK   r   s    rK   c                   @   s   e Zd ZdZdd ZdS )EndTokenrM   c                 C   s
   | d)Nz'Unexpected end of expression in if tag.)r   r   r   r   r	   r
      rQ   zEndToken.nudN)r   r    r!   r0   r
   r   r   r   r	   rS      s    rS   c                   @   sB   e Zd ZeZdd Zdd Zdd Zdd Zdd
dZ	dd Z
dS )IfParserc                 C   s   t |}g }d}||k rQ|| }|dkr)|d |k r)||d  dkr)d}|d7 }n|dkrA|d |k rA||d  dkrAd}|d7 }|| | |d7 }||k s|| _d| _|  | _d S )NrM   rG      rD   rH   rE   rF   )lenappendtranslate_tokentokenspos
next_tokencurrent_token)r   rY   Z
num_tokensZmapped_tokensitokenr   r   r	   rP      s"   $
$zIfParser.__init__c              	   C   s2   zt | }W | S  ttfy   | | Y S w r   )	OPERATORSKeyError	TypeError
create_var)r   r^   opr   r   r	   rX      s   
zIfParser.translate_tokenc                 C   s2   | j t| jkr
tS | j| j  }|  j d7  _ |S )NrU   )rZ   rV   rY   rS   r   retvalr   r   r	   r[      s
   zIfParser.next_tokenc                 C   s*   |   }| jtur| d| j  |S )Nz$Unused '%s' at end of if expression.)r&   r\   rS   r   r   rd   r   r   r	   parse   s   
zIfParser.parserM   c                 C   sR   | j }|  | _ || }|| j jk r'| j }|  | _ ||| }|| j jk s|S r   )r\   r[   r
   r0   r   )r   Zrbptr   r   r   r	   r&      s   


zIfParser.expressionc                 C   s   t |S r   )rK   rO   r   r   r	   rb      s   zIfParser.create_varN)rM   )r   r    r!   
ValueErrorr   rP   rX   r[   rf   r&   rb   r   r   r   r	   rT      s    

rT   N)r"   r   r6   r7   r_   itemskeyrc   r   rK   rS   rT   r   r   r   r	   <module>   s0    
 