
    wdfL                         d 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	 ddlm
Z
  eg d          Z eg d	          Zej        ej        ej        ej        ej        ej        d
Z G d de          ZdS )z8Parse tokens from the lexer into nodes for the compiler.   )nodes)imap)TemplateAssertionError)TemplateSyntaxError)describe_tokendescribe_token_expr)forifblockextendsprintmacroincludefromimportsetwith
autoescape)eqneltlteqgtgteq)addsubmuldivfloordivmodc                   l   e Zd ZdZd7dZdefdZd Zd8dZd9dZ	d8dZ
d8d	Zd
 Zd:dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z	 	 	 	 d;dZd<dZd  Z d! Z!d" Z"d# Z#d$ Z$d% Z%d& Z&d' Z'd( Z(d<d)Z)d* Z*	 	 	 	 d=d+Z+d, Z,d- Z-d. Z.d/ Z/d0 Z0d1 Z1d2 Z2d:d3Z3d4 Z4d8d5Z5d6 Z6dS )>ParserzThis is the central parsing class Jinja uses.  It's passed to
    extensions and can be used to parse expressions or statements.
    Nc                    || _         |                    ||||          | _        || _        || _        d| _        i | _        |                                D ]}|j        D ]}|j	        | j        |<   d| _
        g | _        g | _        d S )NF    )environment	_tokenizestreamnamefilenameclosed
extensionsiter_extensionstagsparse_last_identifier
_tag_stack_end_token_stack)selfr&   sourcer)   r*   state	extensiontags           R/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/jinja2/parser.py__init__zParser.__init__+   s    &!++FD(EJJ	 $4466 	7 	7I ~ 7 7'0$$7 ! "    c                 X    || j         j        j        } |||| j        | j                  )zConvenience method that raises `exc` with the message, passed
        line number or last line number as well as the current name and
        filename.
        )r(   currentlinenor)   r*   )r3   msgr=   excs       r8   failzParser.fail9   s0    
 >[(/Fc#vty$-888r:   c                    g }|D ]*}|                     t          t          |                     +|r&d                    d |d         D                       }nd }|dg}nd|z  g}|r7|||v r|                    d|z             n|                    d|z             | j        r#|                    d| j        d         z             |                     d	                    |          |           d S )
Nz or c              3   :   K   | ]}d t          |          z  V  dS )z'%s'Nr   ).0exprs     r8   	<genexpr>z&Parser._fail_ut_eof.<locals>.<genexpr>G   sA       , ,7;,T222, , , , , ,r:   zUnexpected end of template.zEncountered unknown tag '%s'.z_You probably made a nesting mistake. Jinja is expecting this tag, but currently looking for %s.z-Jinja was looking for the following tags: %s.z4The innermost block that needs to be closed is '%s'. )extendr   r	   joinappendr1   r@   )r3   r)   end_token_stackr=   expectedexprscurrently_lookingmessages           r8   _fail_ut_eofzParser._fail_ut_eofB   s]   $ 	> 	>EOOD!4e<<==== 	% & , ,?Nr?R, , , ! ! !%<45GG6=>G 	DH$4$4 12    -.  
 ? 	NN"$(OB$78  
 			#((7##V,,,,,r:   c                 :    |                      || j        |          S )zCalled if the parser encounters an unknown tag.  Tries to fail
        with a human readable error message that could help to identify
        the problem.
        )rP   r2   )r3   r)   r=   s      r8   fail_unknown_tagzParser.fail_unknown_tagg   s    
   t'<fEEEr:   c                     t          | j                  }||                    |           |                     d||          S )z9Like fail_unknown_tag but for end of template situations.N)listr2   rJ   rP   )r3   
end_tokensr=   stacks       r8   fail_eofzParser.fail_eofn   sB    T*++!LL$$$  uf555r:   c                 r    | j         j        j        dv rdS || j         j                            |          S dS )zAre we at the end of a tuple?)variable_end	block_endrparenTNF)r(   r<   typetest_any)r3   extra_end_ruless     r8   is_tuple_endzParser.is_tuple_endu   s?    ;#'NNN4(;&//@@@ur:   c                     | xj         dz  c_         t                              t          j                  }t          j                            |d| j         z  |           |S )zDReturn a new free identifier as :class:`~jinja2.nodes.InternalName`.r   zfi%dr=   )r0   object__new__r   InternalNameNoder9   )r3   r=   rvs      r8   free_identifierzParser.free_identifier}   sT    "^^E.//
B)> >vNNN	r:   c                    | j         j        }|j        dk    r|                     d|j                   | j                            |j                   d}	 |j        t          v rF t          | d| j         j        j        z                         |r| j        
                                 S S |j        dk    r0|                                 |r| j        
                                 S S |j        dk    r0|                                 |r| j        
                                 S S | j                            |j                  }|' ||           |r| j        
                                 S S | j        
                                 d}|                     |j        |j                   |r| j        
                                 dS dS # |r| j        
                                 w w xY w)	zParse a single statement.r)   ztag name expectedTparse_callfilterNF)r(   r<   r\   r@   r=   r1   rJ   value_statement_keywordsgetattrpopparse_call_blockparse_filter_blockr,   getrR   )r3   tokenpop_tagexts       r8   parse_statementzParser.parse_statement   s   #:II)5<888u{+++	&{111JwtX0C0I%IJJLL   &##%%%%& {f$$,,..  &##%%%%& {h&&..00  &##%%%%& /%%ek22Cs4yy  &##%%%%&	 O!!!G!!%+u|<<< &##%%%%%& &w &##%%%%&s$   7G )G $G +G ';G GFc                    | j                             d           | j                             d           |                     |          }| j         j        j        dk    r|                     |           |rt          | j                    |S )aR  Parse multiple statements into a list until one of the end tokens
        is reached.  This is used to parse the body of statements as it also
        parses template data if appropriate.  The parser checks first if the
        current token is a colon and skips it if there is one.  Then it checks
        for the block end and parses until if one of the `end_tokens` is
        reached.  Per default the active token in the stream at the end of
        the call is the matched end token.  If this is not wanted `drop_needle`
        can be set to `True` and the end token is removed.
        colonrZ   eof)r(   skip_ifexpectsubparser<   r\   rW   next)r3   rU   drop_needleresults       r8   parse_statementszParser.parse_statements   s     	G$$$ 	;'''z** ;#u,,MM*%%% 	r:   c                 r   t          | j                  j        }|                     d          }| j                            d          r+|                                 }t          j        |||          S |                     d          }| 	                    dd          }t          j
        ||||          S )zParse an assign statement.T)with_namespaceassignra   N)zname:endsetr~   )r}   r(   r=   parse_assign_targetrz   parse_tupler   Assignparse_filterr   AssignBlock)r3   r=   targetrD   filter_nodebodys         r8   	parse_setzParser.parse_set   s    dk""))))>>;x(( 	=##%%D<V<<<<''--$$%54$HH d6JJJJr:   c           	      0   | j                             d          j        }|                     d          }| j                             d           |                     dd          }d}| j                             d	          r|                                 }| j                             d
          }|                     d          }t          | j                   j	        dk    rg }n|                     dd          }t          j        |||||||          S )zParse a for loop.zname:for)name:in)r^   r   F)name:recursive)with_condexprr^   Nname:ifr   )name:endfor	name:elseendfor)r   Tr   ra   )r(   r{   r=   r   r   rz   parse_expressionr   r}   rl   r   For)r3   r=   r   itertest	recursiver   else_s           r8   	parse_forzParser.parse_for   s   ##J//6)),)GG9%%%1D   
 
 ;y)) 	+((**DK''(899	$$%ABB"h..EE))*:)MMEytUD)FSSSSr:   c                 *   t          j        | j                            d          j                  x}}	 |                     d          |_        |                     d          |_        g |_	        g |_
        t          | j                  }|                    d          r?t          j        | j        j        j                  }|j	                            |           |                    d          r|                     d	d
          |_
        	 |S )zParse an if construct.r   ra   r   Fr   )	name:elifr   
name:endifr   r   )r   Tr   )r   Ifr(   r{   r=   r   r   r   r   elif_r   r}   r<   rJ   )r3   noder   rs   s       r8   parse_ifzParser.parse_if   s    (:(:9(E(E(LMMMMv	((u(==DI--.VWWDIDJDJ%%Ezz+&& Xxt{':'ABBB##D)))K(( X#44_RV4WWr:   c                 D   t          j        t          | j                  j                  }g }g }| j        j        j        dk    r|r| j                            d           |                                 }|	                    d           |
                    |           | j                            d           |
                    |                                            | j        j        j        dk    ||_        ||_        |                     dd          |_        |S )	Nra   rZ   commaparamr   )zname:endwithTr   )r   Withr}   r(   r=   r<   r\   r{   r   set_ctxrJ   r   targetsvaluesr   r   )r3   r   r   r   r   s        r8   
parse_withzParser.parse_with   s
   zdk!2!2!9:::k!&+55 ,""7+++--//FNN7###NN6"""Kx(((MM$//11222 k!&+55 ))*;)NN	r:   c                    t          j        t          | j                  j                  }t          j        d|                                           g|_        |                     dd          |_	        t          j
        |g          S )Nra   r   )zname:endautoescapeTr   )r   ScopedEvalContextModifierr}   r(   r=   Keywordr   optionsr   r   Scoper3   r   s     r8   parse_autoescapezParser.parse_autoescape   sq    .d4;6G6G6NOOOlD4I4I4K4KLLM))*At)TT	{D6"""r:   c                    t          j        t          | j                  j                  }| j                            d          j        |_        | j                            d          |_	        | j        j
        j        dk    r|                     d           |                     dd          |_        | j                            d	|j        z              |S )
Nra   r)   zname:scopedr   zpBlock names in Jinja have to be valid Python identifiers and may not contain hyphens, use an underscore instead.)zname:endblockTr   zname:)r   Blockr}   r(   r=   r{   rl   r)   rz   scopedr<   r\   r@   r   r   r   s     r8   parse_blockzParser.parse_block  s    {$t{"3"3":;;;K&&v..4	k))-88
 ;#u,,II&   ))*<$)OO	Gdi/000r:   c                     t          j        t          | j                  j                  }|                                 |_        |S )Nra   )r   Extendsr}   r(   r=   r   templater   s     r8   parse_extendszParser.parse_extends  s9    }D$5$5$<===--//r:   c                 $   | j         j                            dd          rh| j                                                             d          r<t          | j                   j        dk    |_        | j                                          n||_        |S )Nz	name:withzname:withoutname:contextr   )	r(   r<   r]   lookr   r}   rl   with_contextskip)r3   r   defaults      r8   parse_import_contextzParser.parse_import_context  s    ;''
 
 	(k  %%n55	( !%T[ 1 1 76 ADK 'Dr:   c                    t          j        t          | j                  j                  }|                                 |_        | j        j                            d          rN| j        	                                                    d          r"d|_
        | j                            d           nd|_
        |                     |d          S )Nra   zname:ignorezname:missingT   F)r   Includer}   r(   r=   r   r   r<   r   r   ignore_missingr   r   r   s     r8   parse_includezParser.parse_include$  s    }D$5$5$<===--//;##M22 	(t{7G7G7I7I7N7N8
 8
 	( #'DKQ"'D((t444r:   c                 ,   t          j        t          | j                  j                  }|                                 |_        | j                            d           |                     d          j	        |_
        |                     |d          S )Nra   name:asT	name_onlyF)r   Importr}   r(   r=   r   r   r{   r   r)   r   r   r   s     r8   parse_importzParser.parse_import0  s{    |4#4#4#;<<<--//9%%%...>>C((u555r:   c                     t          j        t           j                  j                                                   _         j                            d           g _         fd}	 j        r j                            d            j        j	        j
        dk    r |            rn                     d          }|j                            d	          r"                     d
|j        t                      j                            d          r=                     d          }j                            |j        |j        f           nj                            |j                    |            s j        j	        j
        dk    rnn j                            d           Gt%          d          sd_        S )Nra   zname:importc                      j         j        j        dv rij                                                             d          r=t          j                   j        dk     _        j                                          dS dS )N)r   withoutr   r   TF)r(   r<   rl   r   r   r}   r   r   )r   r3   s   r8   parse_contextz(Parser.parse_from.<locals>.parse_context=  s}    {"( -   +""$$)).99 %)$5$5$;v$E!  """t5r:   r   r   r)   Tr   _z4names starting with an underline can not be imported)r?   r   r   F)r   
FromImportr}   r(   r=   r   r   r{   namesr<   r\   r   r)   
startswithr@   r   rz   rJ   hasattrr   )r3   r   r   aliasr   s   `   @r8   
parse_fromzParser.parse_from7  s   tDK'8'8'?@@@--//=)))
	 	 	 	 	 		+z ,""7+++{"'611 =?? 11D1AA;))#.. IIN2    
 ;&&y11 3 44t4DDEJ%%v{EJ&?@@@@J%%fk222 =?? dk&9&>'&I&I 'J ""6***+	+, t^,, 	& %Dr:   c                 P   g x|_         }g x|_        }| j                            d           | j        j        j        dk    r|r| j                            d           |                     d          }|                    d           | j                            d          r(|	                    | 
                                           n|r|                     d           |	                    |           | j        j        j        dk    | j                            d           d S )	Nlparenr[   r   Tr   r   r   z-non-default argument follows default argument)argsdefaultsr(   r{   r<   r\   r   r   rz   rJ   r   r@   )r3   r   r   r   args        r8   parse_signaturezParser.parse_signaturea  s$   	D#%%8$$$k!&(22 ,""7+++**T*::CKK   {""8,, K 5 5 7 78888 K		IJJJKK k!&(22 	8$$$$$r:   c                    t          j        t          | j                  j                  }| j        j        j        dk    r|                     |           ng |_        g |_	        | 
                                |_        t          |j        t           j                  s|                     d|j                   |                     dd          |_        |S )Nra   r   zexpected call)zname:endcallTr   )r   	CallBlockr}   r(   r=   r<   r\   r   r   r   r   rj   
isinstanceCallr@   r   r   r   s     r8   rp   zParser.parse_call_blockq  s    d4;&7&7&>???;#x//  &&&&DIDM))++	$)UZ00 	4IIot{333))*;)NN	r:   c                     t          j        t          | j                  j                  }|                     d d          |_        |                     dd          |_        |S )Nra   T)start_inline)zname:endfilterr   )	r   FilterBlockr}   r(   r=   r   rk   r   r   r   s     r8   rq   zParser.parse_filter_block  s\     T[(9(9(@AAA''4'@@))*=4)PP	r:   c                     t          j        t          | j                  j                  }|                     d          j        |_        |                     |           |                     dd          |_	        |S )Nra   Tr   )zname:endmacror   )
r   Macror}   r(   r=   r   r)   r   r   r   r   s     r8   parse_macrozParser.parse_macro  sp    {$t{"3"3":;;;,,t,<<A	T"""))*<$)OO	r:   c                 Z   t          j        t          | j                  j                  }g |_         | j        j        j        dk    rb|j         r| j                            d           |j                             | 	                                           | j        j        j        dk    b|S )Nra   rZ   r   )
r   Outputr}   r(   r=   r<   r\   r{   rJ   r   r   s     r8   parse_printzParser.parse_print  s    |4#4#4#;<<<
k!&+55z ,""7+++Jd3355666 k!&+55 r:   Tc                    |r| j                                         j        dk    ro| j                             d          }t	          | j                    | j                             d          }t          j        |j        |j        |j                  }n|r<| j                             d          }t          j	        |j        d|j                  }nC|r| 
                    d|          }n|                                 }|                    d           |                                s:|                     d|j        j                                        z  |j                   |S )a  Parse an assignment target.  As Jinja allows assignments to
        tuples, this function can parse all allowed assignment targets.  Per
        default assignments to tuples are parsed, that can be disable however
        by setting `with_tuple` to `False`.  If only assignments to names are
        wanted `name_only` can be set to `True`.  The `extra_end_rules`
        parameter is forwarded to the tuple parsing function.  If
        `with_namespace` is enabled, a namespace assignment may be parsed.
        dotr)   ra   storeT)
simplifiedr^   zcan't assign to %r)r(   r   r\   r{   r}   r   NSRefrl   r=   Namer   parse_primaryr   
can_assignr@   	__class____name__lower)r3   
with_tupler   r^   r   rs   attrr   s           r8   r   zParser.parse_assign_target  sU     	$dk..005>>K&&v..E;%%f--D[djNNNFF 
	$K&&v..EZWU\JJJFF .))#_ *   ++--NN7###  "" 	II$v'7'@'F'F'H'HH&-   r:   c                 V    |r|                                  S |                                 S )zParse an expression.  Per default all expressions are parsed, if
        the optional `with_condexpr` parameter is set to `False` conditional
        expressions are not parsed.
        )parse_condexprparse_or)r3   r   s     r8   r   zParser.parse_expression  s,    
  	)&&(((}}r:   c                    | j         j        j        }|                                 }| j                             d          r|                                 }| j                             d          r|                                 }nd }t          j        ||||          }| j         j        j        }| j                             d          |S )Nr   r   ra   )r(   r<   r=   r   rz   r   r   CondExpr)r3   r=   expr1expr2expr3s        r8   r   zParser.parse_condexpr  s    $+k!!),, 	0MMOOE{"";// ++--N5%vFFFE[(/F k!!),, 	0 r:   c                 0   | j         j        j        }|                                 }| j                             d          rV|                                 }t          j        |||          }| j         j        j        }| j                             d          V|S )Nname:orra   )r(   r<   r=   	parse_andrz   r   Orr3   r=   leftrights       r8   r   zParser.parse_or  s    $+~~k!!),, 	0NN$$E8D%777D[(/F k!!),, 	0 r:   c                 0   | j         j        j        }|                                 }| j                             d          rV|                                 }t          j        |||          }| j         j        j        }| j                             d          V|S )Nname:andra   )r(   r<   r=   	parse_notrz   r   Andr  s       r8   r  zParser.parse_and  s    $+~~k!!*-- 	0NN$$E9T5888D[(/F k!!*-- 	0 r:   c                     | j         j                            d          rAt          | j                   j        }t          j        |                                 |          S |                                 S )Nname:notra   )	r(   r<   r   r}   r=   r   Notr
  parse_compare)r3   r=   s     r8   r
  zParser.parse_not  s`    ;##J// 	>$+&&-F9T^^--f====!!###r:   c                 l   | j         j        j        }|                                 }g }	 | j         j        j        }|t
          v rOt          | j                    |                    t          j	        ||                                                      n| j         
                    d          r;|                    t          j	        d|                                                      n| j         j                            d          r| j                                                             d          rU| j                             d           |                    t          j	        d|                                                      nn| j         j        j        }r|s|S t          j        |||          S )Nr   r   inr  r   notinra   )r(   r<   r=   parse_math1r\   _compare_operatorsr}   rJ   r   Operandrz   r   r   r   Compare)r3   r=   rD   ops
token_types        r8   r  zParser.parse_compare  s   $+!!	0,1J///T[!!!

5=T5E5E5G5GHHIIII$$Y// 

5=t/?/?/A/ABBCCCC$))*55 $+:J:J:L:L:Q:Q; ;    ###

5=$2B2B2D2DEEFFFF[(/F	0  	K}T3v6666r:   c                 b   | j         j        j        }|                                 }| j         j        j        dv rvt
          | j         j        j                 }t          | j                    |                                 } ||||          }| j         j        j        }| j         j        j        dv v|S )N)r   r   ra   )r(   r<   r=   parse_concatr\   _math_nodesr}   r3   r=   r  clsr  s        r8   r  zParser.parse_math1  s    $+  ""k!&.88dk167C%%''E3tU6222D[(/F k!&.88 r:   c                 z   | j         j        j        }|                                 g}| j         j        j        dk    rPt          | j                    |                    |                                            | j         j        j        dk    Pt          |          dk    r|d         S t          j	        ||          S )Ntilder   r%   ra   )
r(   r<   r=   parse_math2r\   r}   rJ   lenr   Concat)r3   r=   r   s      r8   r  zParser.parse_concat
  s    $+  ""#k!&'11KK((**+++ k!&'11 t99>>7N|D0000r:   c                 b   | j         j        j        }|                                 }| j         j        j        dv rvt
          | j         j        j                 }t          | j                    |                                 } ||||          }| j         j        j        }| j         j        j        dv v|S )N)r   r   r    r!   ra   )r(   r<   r=   	parse_powr\   r  r}   r  s        r8   r   zParser.parse_math2  s    $+~~k!&*KKKdk167CNN$$E3tU6222D[(/F k!&*KKK r:   c                 D   | j         j        j        }|                                 }| j         j        j        dk    ret          | j                    |                                 }t          j        |||          }| j         j        j        }| j         j        j        dk    e|S )Npowra   )r(   r<   r=   parse_unaryr\   r}   r   Powr  s       r8   r$  zParser.parse_pow  s    $+!!k!&%//$$&&E9T5888D[(/F	 k!&%//
 r:   c                    | j         j        j        }| j         j        j        }|dk    r>t	          | j                    t          j        |                     d          |          }nX|dk    r>t	          | j                    t          j        |                     d          |          }n| 	                                }| 
                    |          }|r|                     |          }|S )Nr   Fra   r   )r(   r<   r\   r=   r}   r   Negr'  Posr   parse_postfixparse_filter_expr)r3   with_filterr  r=   r   s        r8   r'  zParser.parse_unary)  s    [(-
$+9T--e44VDDDDD5  9T--e44VDDDDD%%''D!!$'' 	0))$//Dr:   c                    | j         j        }|j        dk    r|j        dv r#t	          j        |j        dv |j                  }nF|j        dv rt	          j        d |j                  }n!t	          j        |j        d|j                  }t          | j                    n|j        dk    rt          | j                    |j        g}|j        }| j         j        j        dk    rM|	                    | j         j        j                   t          | j                    | j         j        j        dk    Mt	          j        d
                    |          |          }n|j        d	v r5t          | j                    t	          j        |j        |j                  }n|j        d
k    rEt          | j                    |                     d          }| j                             d           nk|j        dk    r|                                 }nK|j        dk    r|                                 }n+|                     dt!          |          z  |j                   |S )Nr)   )truefalseTrueFalse)r0  r2  ra   )noneNoneloadstring )integerfloatr   T)explicit_parenthesesr[   lbracketlbracezunexpected '%s')r(   r<   r\   rl   r   Constr=   r   r}   rJ   rI   r   r{   
parse_list
parse_dictr@   r   )r3   rs   r   bufr=   s        r8   r   zParser.parse_primary9  s$   #:{@@@{5;2B#B5<XXX 000{4===z%+velKKKZ8##;-C\F+%*h66

4;.4555T[!!! +%*h66 ;rwws||F;;;DDZ///;u{5<@@@DDZ8#####>>DKx((((Z:%%??$$DDZ8##??$$DDII'.*?*??NNNr:   c                      j         j        j        }|r j        }n|r j        }n fd}g }d}	 |r j                             d                                |          rnH|                     |                        j         j        j        dk    rd}nn j         j        j        }z|s;|r|d         S |s/ 	                    dt           j         j                  z             t          j        |d|	          S )
a  Works like `parse_expression` but if multiple expressions are
        delimited by a comma a :class:`~jinja2.nodes.Tuple` node is created.
        This method could also return a regular expression instead of a tuple
        if no commas where found.

        The default parsing mode is a full tuple.  If `simplified` is `True`
        only names and literals are parsed.  The `no_condexpr` parameter is
        forwarded to :meth:`parse_expression`.

        Because tuples do not require delimiters and may end in a bogus comma
        an extra hint is needed that marks the end of a tuple.  For example
        for loops support tuples between `for` and `in`.  In that case the
        `extra_end_rules` is set to ``['name:in']``.

        `explicit_parentheses` is true if the parsing was triggered by an
        expression in parentheses.  This is used to figure out if an empty
        tuple is a valid expression or not.
        c                  0                          d          S )NFr   )r   )r3   s   r8   r/   z!Parser.parse_tuple.<locals>.parsez  s    ,,5,AAAr:   Fr   r   Tr%   z Expected an expression, got '%s'r6  ra   )r(   r<   r=   r   r   r{   r_   rJ   r\   r@   r   r   Tuple)	r3   r   r   r^   r;  r=   r/   r   is_tuples	   `        r8   r   zParser.parse_tupleZ  sQ   2 $+ 	B&EE 	B)EEB B B B B 
	0 ,""7+++  11 KK   {"'722[(/F
	0  	 Aw ( 		6$T[%899:  
 {47777r:   c                    | j                             d          }g }| j         j        j        dk    rn|r| j                             d           | j         j        j        dk    rn<|                    |                                            | j         j        j        dk    n| j                             d           t          j        ||j                  S )Nr<  rbracketr   ra   )	r(   r{   r<   r\   rJ   r   r   Listr=   )r3   rs   itemss      r8   r?  zParser.parse_list  s    "":..k!&*44 ,""7+++{"':55LL..00111 k!&*44 	:&&&z%5555r:   c                 >   | j                             d          }g }| j         j        j        dk    r|r| j                             d           | j         j        j        dk    rn|                                 }| j                             d           |                                 }|                    t          j        |||j                             | j         j        j        dk    | j                             d           t          j	        ||j                  S )Nr=  rbracer   rx   ra   )
r(   r{   r<   r\   r   rJ   r   Pairr=   Dict)r3   rs   rI  keyrl   s        r8   r@  zParser.parse_dict  s   ""8,,k!&(22 ,""7+++{"'833''))CKw'''))++ELLCszBBBCCC k!&(22 	8$$$z%5555r:   c                     	 | j         j        j        }|dk    s|dk    r|                     |          }n|dk    r|                     |          }nnQ|S )Nr   r   r<  r   )r(   r<   r\   parse_subscript
parse_callr3   r   r  s      r8   r,  zParser.parse_postfix  sm    		,1JU""jJ&>&>++D11 x''t,,		 r:   c                     	 | j         j        j        }|dk    r|                     |          }nN|dk    r+| j         j        j        dk    r|                     |          }n|dk    r|                     |          }nn||S )Nr   piper)   isr   )r(   r<   r\   r   rl   
parse_testrQ  rR  s      r8   r-  zParser.parse_filter_expr  s    	,1JV##((..v%%$+*=*Ct*K*Kt,, x''t,,	 r:   c                    t          | j                  }|j        dk    r| j        j        }t          | j                   |j        dk    r"t	          j        ||j        d|j                  S |j        dk    r|                     d|j                   t	          j	        |j        |j                  }t	          j
        ||d|j                  S |j        dk    rg }| j        j        j        dk    rX|r| j                            d	           |                    |                                            | j        j        j        dk    X| j                            d           t          |          d
k    r	|d         }nt	          j        |d|j                  }t	          j
        ||d|j                  S |                     d|j                   d S )Nr   r)   r6  ra   r9  zexpected name or numberr<  rG  r   r   r%   zexpected subscript expression)r}   r(   r\   r<   r   Getattrrl   r=   r@   r>  Getitemr{   rJ   parse_subscribedr!  rD  )r3   r   rs   
attr_tokenr   r   s         r8   rP  zParser.parse_subscript  s   T[!!:,J&((}**F5<    I--		3Z5FGGG+j.z7HIIIC=sF5<HHHH:##D+%*j88 0K&&w///D1133444 +%*j88 Kz***4yyA~~1gk$u|DDD=sF5<HHHH		15<@@@@@r:   c                 8   | j         j        j        }| j         j        j        dk    rt	          | j                    d g}nB|                                 }| j         j        j        dk    r|S t	          | j                    |g}| j         j        j        dk    r|                    d            nP| j         j        j        dvr(|                    |                                            n|                    d            | j         j        j        dk    ret	          | j                    | j         j        j        dvr(|                    |                                            n+|                    d            n|                    d            t          j        |d|iS )Nrx   )rG  r   r=   )	r(   r<   r=   r\   r}   r   rJ   r   Slice)r3   r=   r   r   s       r8   rZ  zParser.parse_subscribed  s~   $+;#w..6DD((**D{"'7226D;#w..KK[ %-BBBKK--//0000KK;#w..{"'/DDDD11334444D!!!!KK{40&000r:   c                    
  j                             d          
g }g }d x}}d} 
fd} j         j        j        dk    r|r1 j                             d            j         j        j        dk    rn j         j        j        dk    r; ||d u o|d u            t	           j                                                     }n9 j         j        j        dk    r6 ||d u            t	           j                                                     }n j         j        j        dk    r j                                         j        d	k    r| ||d u             j         j        j        } j                             d
                                            }	|	                    t          j        ||	|	j                             n; ||d u o|d u o|            |	                                                                d} j         j        j        dk    ԉ j                             d           |||||fS t          j        |||||
j                  S )Nr   Fc                 F    | s                     dj                   d S d S )Nz+invalid syntax for function call expression)r@   r=   )rD   r3   rs   s    r8   ensurez!Parser.parse_call.<locals>.ensure  s5     W		GVVVVVW Wr:   r[   r   r   r&  r)   r   r   ra   T)r(   r{   r<   r\   r}   r   r   rl   r   rJ   r   r   r=   r   )r3   r   r   kwargsdyn_args
dyn_kwargsrequire_commar`  rN  rl   rs   s   `         @r8   rQ  zParser.parse_call  s   ""8,, $$:	W 	W 	W 	W 	W 	W k!&(22 ""7+++;&+x77{"'500x4'>J$,>???T[!!!0022$)U22zT)***T[!!!!2244

 K',66((**/8;; F:-...+-3CK$$Q''' 1133EMM%-U5<"P"P"PQQQQ F8t+Q
d0BQ6zRRRKK 5 5 7 7888 M= k!&(22> 	8$$$<:55z$fh
5<XXXXr:   c           	      P   | j         j        j        dk    s|r|st          | j                    | j                             d          }|j        }| j         j        j        dk    rNt          | j                    |d| j                             d          j        z   z  }| j         j        j        dk    N| j         j        j        dk    r|                     d           \  }}}}ng }g }d x}}t          j        |||||||j	                  }d}| j         j        j        dk    
||S )NrT  r)   r   .r   ra   F)
r(   r<   r\   r}   r{   rl   rQ  r   Filterr=   )	r3   r   r   rs   r)   r   ra  rb  rc  s	            r8   r   zParser.parse_filter<  s<   k!&&00L0 "T[!!!K&&v..E;D+%*e33T[!!!dk0088>>> +%*e33 {"'83359__T5J5J2fh

(,,:<dD&(Ju|  D !L# k!&&00L0$ r:   c           	         t          | j                  }| j        j                            d          rt          | j                   d}nd}| j                            d          j        }| j        j        j        dk    rNt          | j                   |d| j                            d          j        z   z  }| j        j        j        dk    Nd x}}g }| j        j        j        dk    r|                     d           \  }}}}n| j        j        j        dv r| j        j                            d	d
d          sa| j        j                            d          r| 	                    d           | 
                                }	|                     |	          }	|	g}ng }t          j        |||||||j                  }|rt          j        ||j                  }|S )Nr  TFr)   r   rf  r   )r)   r7  r9  r:  r   r<  r=  r   r  r	  zname:isz'You cannot chain multiple tests with isra   )r}   r(   r<   r   r{   rl   r\   rQ  r]   r@   r   r,  r   Testr=   r  )
r3   r   rs   negatedr)   rb  rc  ra  r   arg_nodes
             r8   rV  zParser.parse_testQ  s   T[!!;##J// 	GGG{!!&))/k!&%//C$+,,V44:::D k!&%// !%$:;#x//151F1F.D&(JJ[ % *
 
 
 +%..{IzRR
 {"''	22 E		CDDD))++H))(33H:DDDz$fh
5<
 
 
  	89T%,777Dr:   c                 6   g g j         }|| j                             |           fd}	 | j        r| j        j        }|j        dk    rF|j        r) |t          j        |j        |j                             t          | j                   n4|j        dk    rNt          | j                    || 
                    d                     | j                            d           n|j        dk    r |             t          | j                   |2 | j        j        j        | r|| j                                         S S |                                 }t          |t                     r                    |           n                     |           | j                            d	           nt%          d
          | j         |             || j                                         n!# || j                                         w w xY wS )Nc                      rEd         j         }                     t          j        d d          |                      d d = d S d S )Nr%   ra   )r=   rJ   r   r   )r=   r   data_buffers    r8   
flush_dataz#Parser.subparse.<locals>.flush_data  sY     #$Q.ELQQQGGGHHHNNN# #r:   datara   variable_beginTr   rY   block_beginrZ   zinternal parsing error)rJ   r2   r(   r<   r\   rl   r   TemplateDatar=   r}   r   r{   r]   ro   rv   r   rT   rH   AssertionError)r3   rU   add_dataro  rs   rf   r   rn  s         @@r8   r|   zParser.subparsew  sU   %!!((444	# 	# 	# 	# 	# 	#	,+ C+:''{ W !3EK!U!U!UVVV%%%%Z#333%%%HT--D-AABBBK&&~6666Z=00JLLL%%%!-2N$+2E2N#3-  $ %%))++++ & --//B!"d++ (BBK&&{3333()ABBB1 + C4 JLLL%%))+++ %%))++++ & s   C>G8 BG8 8Hc                     t          j        |                                 d          }|                    | j                   |S )z0Parse the whole template into a `Template` node.r   ra   )r   Templater|   set_environmentr&   )r3   r   s     r8   r/   zParser.parse  s:    :::t/000r:   )NNN)N)NN)F)TFNF)T)FTNF)7r   
__module____qualname____doc__r9   r   r@   rP   rR   rW   r_   rg   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   rp   rq   r   r   r   r   r   r   r  r
  r  r  r  r   r$  r'  r   r   r?  r@  r,  r-  rP  rZ  rQ  r   rV  r|   r/    r:   r8   r#   r#   &   s        # # # #  $)< 9 9 9 9#- #- #-JF F F F6 6 6 6      & & &8   6	K 	K 	KT T T&  $  "# # #  &  
  
5 
5 
56 6 6( ( (T% % %          # # # #J         $ $ $7 7 7.	 	 	1 1 1	 	 	        F "?8 ?8 ?8 ?8B
6 
6 
66 6 6    A A A61 1 1>.Y .Y .Y`   *$ $ $L. . . .`    r:   r#   N)r{  r8  r   _compatr   
exceptionsr   r   lexerr   r	   	frozensetrm   r  AddSubMulDivFloorDivModr  rb   r#   r|  r:   r8   <module>r     s   > >             . . . . . . + + + + + + ! ! ! ! ! ! & & & & & &i      YGGGHH  99999 E E E E EV E E E E Er:   