
    -Ph                        d 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 g dZ	 ej
        d          Z ej
        dej                  Zd	 Z G d
 de          Z G d de          Z G d de          Zd Z G d d          Zd5dZd5dZ G d de          Z G d d          Z G d d          Z G d d          Z G d d          Z e            Z[d6d Z ej
        d!          Zg d"Z  ej
        d#          Z! ej
        d$          Z"d% Z#d& Z$d7d'Z%d8d)Z&d* Z'd+ Z(d, Z)d- Z*d. Z+d/ Z,d0 Z-d1 Z.d2Z/d5d3Z0e1d4k    r e0             dS dS )9a  
A small templating language

This implements a small templating language.  This language implements
if/elif/else, for/continue/break, expressions, and blocks of Python
code.  The syntax is::

  {{any expression (function calls etc)}}
  {{any expression | filter}}
  {{for x in y}}...{{endfor}}
  {{if x}}x{{elif y}}y{{else}}z{{endif}}
  {{py:x=1}}
  {{py:
  def foo(bar):
      return 'baz'
  }}
  {{default var = default_value}}
  {{# comment}}

You use this with the ``Template`` class or the ``sub`` shortcut.
The ``Template`` class takes the template string and the name of
the template (for errors) and a default namespace.  Then (like
``string.Template``) you can call the ``tmpl.substitute(**kw)``
method to make a substitution (or ``tmpl.substitute(a_dict)``).

``sub(content, **kw)`` substitutes the template immediately.  You
can use ``__name='tmpl.html'`` to set the name of the template.

If there are syntax errors ``TemplateError`` will be raised.
    N)StringIO   )looper)TemplateErrorTemplatesubbunchz\s+in\s+z^[a-z_][a-z0-9_]*$c                     t          | t                    s.t          | d          rt          |           S t          |           S | S )N__str__)
isinstancestrhasattrbytes)vs    W/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/Cython/Tempita/_tempita.pycoerce_textr   .   sA    a 1i   	q66M88OH    c                        e Zd ZdZddZd ZdS )r   z.Exception raised while parsing a template
    Nc                 X    t                               | |           || _        || _        d S N)	Exception__init__positionname)selfmessager   r   s       r   r   zTemplateError.__init__:   s*    4))) 			r   c                     d                     | j                  }| j        r |d| j        d         d| j        d         }| j        r|d| j        z  z  }|S )N 	 at line r    column r   z in %s)joinargsr   r   )r   msgs     r   r   zTemplateError.__str__?   sh    hhty!!= 	9T]1%%%t}Q'7'79C9 	(8di''C
r   r   )__name__
__module____qualname____doc__r   r    r   r   r   r   6   sA            
    r   r   c                       e Zd ZdS )_TemplateContinueNr$   r%   r&   r(   r   r   r*   r*   I           Dr   r*   c                       e Zd ZdS )_TemplateBreakNr+   r(   r   r   r.   r.   M   r,   r   r.   c                     t           j                            t           j                            |j                  |           }|j                            ||j        |j                  S )N)	namespaceget_template)	ospathr!   dirnamer   	__class__from_filenamer0   r1   )r   from_templater3   s      r   get_file_templater8   Q   sV    7<<(:;;TBBD"00/"/ 1 1 1 1r   c                       e Zd ZddedZdZdZ	 	 	 ddZdddefdZ	 e
e	          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S )r   z{{z}})start_braces
end_bracesr   utf8Nr   c
                    || _         |	r#dd l}
|
                    dt                     ||	}|| j        d         | j        d         f}nC| j        j                                        | _        |d         | j        d<   |d         | j        d<   |x| _        | _        t          |t                    | _        ||	 t          j        |          }|j        }|j        }d|v r=|d         }|                    d          s|                    d          r
|d d	         }nd
|v r	|d
         }nd}|r|d|z  z  }n# t"          $ r Y nw xY w|| _        t'          |||| j                  | _        |i }|| _        || _        |	|| _        d S d S )Nr   zk'delimeters' kwarg is being deprecated in favor of correctly spelled 'delimiters'. Please adjust your code.r:   r;   r   __file__z.pycz.pyor$   z<string>z:%sr   line_offset
delimiters)contentwarningswarnDeprecationWarningdefault_namespacer5   copyrB   
delimetersr   r   _unicodesys	_getframe	f_globalsf_linenoendswith
ValueErrorr   parse_parsedr0   r1   default_inherit)r   rC   r   r0   
stacklevelr1   rS   rA   rB   rI   rD   callerglobalslinenos                 r   r   zTemplate.__init__c   s      	(OOOMMB"  
 !'
0@0>@JJ
 &*^%E%J%J%L%LD"5?]D">23=a=D"<0,66$/"7C00<J2+z22 !*((":.D}}V,, )f0E0E )#CRCy7**":.DD%D +EFN*D     	W4[UYUdeeeI"(&#2D    '&s   :D7 7
EEc                     t          |d          5 }|                                }d d d            n# 1 swxY w Y   |r|                    |          } | |||||          S )Nrb)rC   r   r0   rS   r1   )openreaddecode)clsfilenamer0   encodingrS   r1   fcs           r   r6   zTemplate.from_filename   s    (D!! 	QA	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	#""As18y#2O O O 	Os   266c                 |    d| j         j        dt          t          |                     dd          d| j        dS )N<r      z name=>)r5   r$   hexidr   r   s    r   __repr__zTemplate.__repr__   sB     N###4MM!""tyyy* 	*r   c                    |ri|rt          d          t          |          dk    rt          d          t          |d         d          st          d|d                   |d         }|}| j        |d<   | j        r|                    | j                   |                     |          \  }}}|s| j        }|r|                     ||||          }|S )Nz3You can only give positional *or* keyword argumentsr   z)You can only give one positional argumentr   itemszoIf you pass in a single argument, you must pass in a dictionary-like object (with a .items() method); you gave __template_name__)		TypeErrorlenr   r   r0   update
_interpretrS   _interpret_inherit)r   r"   kwnsresultdefsinherits          r   
substitutezTemplate.substitute   s    	 KIK K K4yy1}}?A A A47G,, "iAww!" " " aB"&)> 	&IIdn%%% $ 3 3g 	+*G 	H,,VT7BGGFr   c                     d}g }i }|                      | j        |||           d|v r|                    d          }nd }d                    |          ||fS )NT)outru   __inherit__ )_interpret_codesrR   popr!   )r   rs   __traceback_hide__partsru   rv   s         r   rp   zTemplate._interpret   sk    !dlBEEEED  hh}--GGGwwu~~tW,,r   c                 V   d}| j         st          dd | j                  |                      ||           }t          | j                  }|                                D ]\  }}	t          |||	           ||_        |                                }||d<   |                    |          S )NTz:You cannot use inheritance without passing in get_templater   r   r   )	r1   r   r   TemplateObjectrk   setattrbodyrH   rw   )
r   r   ru   inherit_templaters   r~   templself_r   values
             r   rq   zTemplate._interpret_inherit   s    !  	/LDI/ / / / !!"2D99ty))::<< 	( 	(KD%E4''''
WWYY6
###r   c                     d}|D ]E}t          |t                    r|                    |           -|                     ||||           Fd S )NT)r   r   append_interpret_code)r   codesrs   ry   ru   r~   items          r   r|   zTemplate._interpret_codes   se    ! 	: 	:D$$$ :

4    $$T2sD9999		: 	:r   c                 V   d}|d         |d         }}|dk    r|                      |d         ||           d S |dk    rt                      |dk    rt                      |dk    rK|d         |d	         |d
         }
}	}|                     |	||          }	|                     ||	|
|||           d S |dk    r$|dd          }|                     ||||           d S |dk    r|d                             d          }|                     |d         ||          }|dd          D ]$}|                     |||          } ||          }%|                    |                     ||                     d S |dk    r4|d         |d	         }	}||vr|                     |	||          }|||<   d S d S |dk    r&|d         }	|                     |	||          }||d<   d S |dk    r7|d         }|d	         }|d
         }t          | |||||          x||<   ||<   d S |dk    rd S J d|z              )NTr   r   pyrd   continuebreakfor      condexpr|defaultrv   rz   def)r   rs   poscommentzUnknown code: %r)
_execr*   r.   _eval_interpret_for_interpret_ifsplitr   _reprTemplateDef)r   coders   ry   ru   r~   r   r   varsr   rC   r   basepartfuncvarrt   r   	signatures                      r   r   zTemplate._interpret_code   s   !GT!Wc4<<JJtAwC(((((Z#%%%W__ """U]]"&q'47DG$D::dB,,DdGRdCCCCCV^^HEub#t44444V^^GMM#&&E::eAhC00Dabb	 " "zz$C00tDzzJJtzz$,,-----YQaC"}}D"c22 3 } Y7DJJtR--E"'DU]]7DQIGE$/dIEVX47%9 %9 %9 9BtHtDzzzYF/(4////r   c                    d}|D ]}t          |          dk    r|||d         <   nit          |          t          |          k    r.t          dt          |          t          |          fz            t          ||          D ]
\  }	}
|
||	<   	 |                     ||||           # t          $ r Y t
          $ r Y  d S w xY wd S )NTr   r   z&Need %i items to unpack (got %i items))rn   rP   zipr|   r*   r.   )r   r   r   rC   rs   ry   ru   r~   r   r   r   s              r   r   zTemplate._interpret_for  s	   ! 	 	D4yyA~~"47t99D		))$@t99c$ii012 2 2 $'tT?? % %KD%$BtHH%%gr3====$   !   	 	s   B))
C5	CCc                     d}|D ]r}t          |t                    rJ |d         |d         }}|dk    rd}	n|                     |d         ||          }	|	r!|                     |d         |||            d S sd S )NTr   r   elserd   r   )r   r   r   r|   )
r   r   rs   ry   ru   r~   r   r   r   rt   s
             r   r   zTemplate._interpret_if!  s    ! 		 		D!$,,,,,Qa#Dv~~DGR55 %%d1gr3===		 		r   c                 >   d}	 	 t          || j        |          }n$# t          $ r}t          d|z            d }~ww xY w|S # t          $ rP}t	          |dd           r|j        d         }nt          |          }|                     ||          f|_         d }~ww xY w)NTz invalid syntax in expression: %sr"   r   )evalrG   SyntaxErrorr   getattrr"   r   _add_line_info)r   r   rs   r   r~   r   earg0s           r   r   zTemplate._eval/  s    !	?T4#92>> ? ? ?!6=? ? ?? L 	 	 	q&$'' &vay"1~~))$446AF	s-    A 
=8=A 
BABBc                     d}	 t          || j        |           d S # t          $ rQ}|j        r(|                     |j        d         |          f|_        n|                     d |          f|_         d }~ww xY w)NTr   )execrG   r   r"   r   )r   r   rs   r   r~   r   s         r   r   zTemplate._exec@  s    !	t-r22222 	 	 	v ;--afQi==?--dC88:	s    
A7AA22A7c           
      r   d}	 |dS | j         r0	 t          |          }ny# t          $ r t          |          }Y n^w xY wt	          |t                    st          |          }t	          |t                    r!| j        r|                    | j                  }| j         rt	          |t                    ry| j        st          d|z            	 |                    | j                  }n# t          $ r7}t          |j	        |j
        |j        |j        |j        d|z  z             d }~ww xY w| j         sHt	          |t                    r3| j        st          d|z            |                    | j                  }|S # t          $ r-}|                     |j        d         |          f|_         d }~ww xY w)NTr{   zHCannot decode bytes value %r into unicode (no default_encoding provided)z in string %rzHCannot encode unicode value %r into bytes (no default_encoding provided)r   )rJ   r   UnicodeDecodeErrorr   r   r   default_encodingencoder\   r_   objectstartendreasonUnicodeEncodeErrorr   r   r"   )r   r   r   r~   r   s        r   r   zTemplate._reprK  s   !&	}r} 
@)JJEE) ) ) )!%LLEEE) "%-- /'..Euc** @ 1@!LL)>??E
 } <E5!9!9 <, B,9;@AB B B<!LL)>??EE) < < <,
?U#::< < << ] <z%'='= <, B,9;@AB B B T%:;;L1  	 	 	))!&)S99;AF	sP   E? E?   E? <E? <AE? C* *
D+42D&&D+?
F6	(F11F6c                 Z    |d|d         d|d         }| j         r|d| j         z  z  }|S )Nr   r   r    r   z in file %sr   )r   r#   r   s      r   r   zTemplate._add_line_infou  sB    CCQQ!9 	-=49,,C
r   )NNNNNr   NN)r$   r%   r&   r   rG   r   rS   r   r8   r6   classmethodri   rw   rp   rq   r|   r   r   r   r   r   r   r   r(   r   r   r   r   X   sC        
 
 OFJFG-143 43 43 43l 04d&*9JO O O O  K..M* * *
  0	- 	- 	-$ $ $: : :)0 )0 )0V  &    "	 	 	( ( (T    r   r   c                     |                     d          }d|v r|                    d          nd }t          | |||          }|                    |          S )N__namerI   )r   rB   rI   )getr}   r   rw   )rC   rB   rr   r   rI   tmpls         r   r   r   }  s[    66(D)5););%%%JG$:*UUUD??2r   c                 N    t          | |          }|                    |          S )Nr   )r   rw   )rC   r   r^   r   s       r   paste_script_template_rendererr     s&    G(+++D??4   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )r	   c                 \    |                                 D ]\  }}t          | ||           d S r   )rk   r   )r   rr   r   r   s       r   r   zbunch.__init__  s<    88:: 	' 	'KD%D$&&&&	' 	'r   c                     || |<   d S r   r(   )r   r   r   s      r   __setattr__zbunch.__setattr__  s    T


r   c                 N    	 | |         S # t           $ r t          |          w xY wr   )KeyErrorAttributeErrorr   r   s     r   __getattr__zbunch.__getattr__  s:    	': 	' 	' 	' &&&	's   
 $c                     d| v rG	 t                               | |          S # t          $ r t                               | d          cY S w xY wt                               | |          S )Nr   )dict__getitem__r   )r   keys     r   r   zbunch.__getitem__  sw    9''c222 9 9 9''i888889 ##D#...s   ! %A	A	c           
          d| j         j        dd                    d t          |                                           D                       dS )Nrc   r   c                 "    g | ]\  }}|d |S )=r(   ).0kr   s      r   
<listcomp>z"bunch.__repr__.<locals>.<listcomp>  s'    HHH41aAA&HHHr   re   )r5   r$   r!   sortedrk   rh   s    r   ri   zbunch.__repr__  sR     N###HHHH6$**,,3G3GHHHIIIIK 	Kr   N)r$   r%   r&   r   r   r   r   ri   r(   r   r   r	   r	     sd        ' ' '  ' ' '/ / /K K K K Kr   r	   c                   8    e Zd Z	 ddZd Zd Zd ZddZd ZdS )	r   Nc                 h    || _         || _        || _        || _        || _        || _        || _        d S r   )	_template
_func_name_func_signature_body_ns_pos_bound_self)r   template	func_namefunc_signaturer   rs   r   
bound_selfs           r   r   zTemplateDef.__init__  s;    !#-
	%r   c           	      R    d| j         d| j        d| j        j        d| j        d	S )Nz<tempita function (z) at :re   )r   r   r   r   r   rh   s    r   ri   zTemplateDef.__repr__  s8     OOOT111N, 	,r   c                      |             S r   r(   rh   s    r   r   zTemplateDef.__str__  s    tvvr   c                 "   |                      ||          }| j                                        }|                    |           | j        
| j        |d<   g }i }| j                            | j        |||           d                    |          S )Nr   r{   )	_parse_signaturer   rH   ro   r   r   r|   r   r!   )r   r"   rr   valuesrs   ry   subdefss          r   __call__zTemplateDef.__call__  s    &&tR00X]]__
		&')BvJ''
BWEEEwws||r   c           	      ~    || S |                      | j        | j        | j        | j        | j        | j        |          S )N)r   )r5   r   r   r   r   r   r   )r   objtypes      r   __get__zTemplateDef.__get__  sD    ;K~~NDOT-AJ$)  = = 	=r   c                     i }| j         \  }}}}i }|                                D ],\  }	}
|s|	|vrt          d|	z            |	|v r|
||<   '|
||	<   -t          |          }t          |          }|r|r+|d         |v r!|                    d           |r
|d         |v !|r.|                    d          }	|                    d          ||	<   nD|rt          |          ||<   n1t          dd                    d |D                       z            ||                                D ]2\  }	}|	|vr)| j                            || j	        | j
                  ||	<   3|D ]}	|	|vrt          d|	z            |r|||<   |S )NzUnexpected argument %sr   zExtra position arguments: %sz, c                 ,    g | ]}t          |          S r(   )reprr   r   s     r   r   z0TemplateDef._parse_signature.<locals>.<listcomp>  s     7 7 7Qa 7 7 7r   zMissing argument: %s)r   rk   rm   listr}   tupler!   r   r   r   r   )r   r"   rr   r   sig_argsvar_argsvar_kwdefaultsextra_kwr   r   
value_exprs               r   r   zTemplateDef._parse_signature  s   /3/C,(FH88:: 	' 	'KD% 5d(22,t35 5 5x#(x  !&Dzz>> 	:  x{f44Q   x{f44 	:||A#xx{{t :#(;;x 2ii 7 7$ 7 7 7889: : :  	: !) 0 0 	5 	5D*6!!#~33$) 5  5t 	3 	3D6!!*T13 3 3 "  	&%F6Nr   r   )	r$   r%   r&   r   ri   r   r   r   r   r(   r   r   r   r     s{        +/& & & &, , ,
  	 	 	= = = =% % % % %r   r   c                       e Zd Zd Zd ZdS )r   c                 <    || _         t          |           | _        d S r   )_TemplateObject__nameTemplateObjectGetterr   r   s     r   r   zTemplateObject.__init__  s    '--r   c                 2    d| j         j        d| j        dS )Nrc   r   re   )r5   r$   r  rh   s    r   ri   zTemplateObject.__repr__  s       N333T[[[AAr   N)r$   r%   r&   r   ri   r(   r   r   r   r     s7        . . .B B B B Br   r   c                        e Zd Zd Zd Zd ZdS )r  c                     || _         d S r   )#_TemplateObjectGetter__template_obj)r   template_objs     r   r   zTemplateObjectGetter.__init__   s    *r   c                 8    t          | j        |t                    S r   )r   r
  Empty)r   attrs     r   r   z TemplateObjectGetter.__getattr__  s    t*D%888r   c                 2    d| j         j        d| j        dS )Nrc   z around re   )r5   r$   r
  rh   s    r   ri   zTemplateObjectGetter.__repr__  s#     #'>#:#:#:D<O<O<OPPr   N)r$   r%   r&   r   r   ri   r(   r   r   r  r    sF        + + +9 9 9Q Q Q Q Qr   r  c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )_Emptyc                     | S r   r(   )r   r"   rr   s      r   r   z_Empty.__call__  s    r   c                     dS Nr{   r(   rh   s    r   r   z_Empty.__str__      rr   c                     dS )Nr  r(   rh   s    r   ri   z_Empty.__repr__  s    wr   c                     dS r  r(   rh   s    r   __unicode__z_Empty.__unicode__  r  r   c                      t          d          S )Nr(   )iterrh   s    r   __iter__z_Empty.__iter__  s    Bxxr   c                     dS )NFr(   rh   s    r   __bool__z_Empty.__bool__  s    ur   N)	r$   r%   r&   r   r   ri   r  r  r  r(   r   r   r  r  
  sn                      r   r  Tc                    |$t           j        d         t           j        d         f}d}g }d}|dz   df}t          j        t          j        |d                   dt          j        |d                             }	|	                    |           D ]}
|
                    d          }t          | |
                                ||          }||d         k    r|rt          d|d         z  ||	          ||d         k    r|st          d
|d         z  ||	          ||d         k    r6| ||

                                         }|r|                    |           d}n3|                    | ||

                                         |f           d}|
                                }|}|rt          d|d         z  ||          | |d         }|r|                    |           |rt          |          }|S )aY  
    Lex a string into chunks:

        >>> lex('hey')
        ['hey']
        >>> lex('hey {{you}}')
        ['hey ', ('you', (1, 7))]
        >>> lex('hey {{')
        Traceback (most recent call last):
            ...
        TemplateError: No }} to finish last expression at line 1 column 7
        >>> lex('hey }}')
        Traceback (most recent call last):
            ...
        TemplateError: }} outside expression at line 1 column 7
        >>> lex('hey {{ {{')
        Traceback (most recent call last):
            ...
        TemplateError: {{ inside expression at line 1 column 10

    Nr:   r;   Fr   r   r   z%s inside expressionr   z%s outside expressionTzNo %s to finish last expression)r   r   )r   rG   recompileescapefinditergroupfind_positionr   r   r   r   trim_lex)sr   trim_whitespacerA   rB   in_exprchunkslastlast_postoken_rematchr   r   r   s                 r   lexr.  %  sG   , 1.A1,?B
GFDa#Hzbi
1&>&>&>&>&(i
1&>&>&>@ A AH""1%%  {{1~~Auyy{{D(;;:a=  W  6A F),%)+ + + + Z]""7" 7*Q- G),%)+ + + + :a=  T%++--'(D $d###GGMM1T%++--/0(;<<<Gyy{{ :=
1M!%: : : 	:TUU8D d "&!!Mr   z.^(?:if |elif |for |def |inherit |default |py:))r   endifendforenddefr   r   z\n\r?[\t ]*$z	^[\t ]*\nc                    d}t          |           D ],\  }}t          |t                    r|d         }t                              |          s
|t
          vrH|sd}n| |dz
           }|dz   t          |           k    rd}n| |dz            }t          |t                    rt          |t                    s| pt                              |          }|dk    r|                                sd}||dz   |k    r|                                sd}|r(|rDt                              |          s*|t          |           dz
  k    r|                                s|rj|dk    r|                                r|dk    r	d| |dz
  <   nAt                              |          }|d|
                                dz            }|| |dz
  <   |rt|}|t          |           dz
  k    r|                                s
d| |dz   <   t                              |          }||                                d         }|| |dz   <   .| S )aa  
    Takes a lexed set of tokens, and removes whitespace when there is
    a directive on a line by itself:

       >>> tokens = lex('{{if x}}\nx\n{{endif}}\ny', trim_whitespace=False)
       >>> tokens
       [('if x', (1, 3)), '\nx\n', ('endif', (3, 3)), '\ny']
       >>> trim_lex(tokens)
       [('if x', (1, 3)), 'x\n', ('endif', (3, 3)), 'y']
    Nr   r{   r   Trd   r*  )	enumerater   r   statement_researchsingle_statementsrn   trail_whitespace_restriplead_whitespace_rer   r   )	tokens	last_trimicurrentr   prev
next_chunkprev_okms	            r   r%  r%  j  sh    I'' */ */
7gs## 	qz""4(( 	T9J-J-J 	!DD!a%=Dq5CKKJJAJ:s++ 	!$,,	(>188>>66$**,,6G Y]a%7%7

%7G 	/	/#5#<#<Z#H#H	/#f++/))*2B2B2D2D) )!VVDJJLLV"f,,$&F1q5MM+22488AQ/D$(F1q5M /	Fa''
0@0@0B0B'$&F1q5MM*11*==A!+AEEGGHH!5J$.F1q5MMr   c                     |                      d||          }|dk    r||                     d||          z
  }n|d         ||z
  z   }|d         |z   |fS )z/Given a string and index, return (line, column)
r   r   )countrfind)stringindex
last_indexr+  linescolumns         r   r$  r$    sc    LLz511EqyydJ>>>!
 23QK%((r   c                     |$t           j        d         t           j        d         f}t          | |||          }g }|r*t          ||          \  }}|                    |           |*|S )a  
    Parses a string into a kind of AST

        >>> parse('{{x}}')
        [('expr', (1, 3), 'x')]
        >>> parse('foo')
        ['foo']
        >>> parse('{{if x}}test{{endif}}')
        [('cond', (1, 3), ('if', (1, 3), 'x', ['test']))]
        >>> parse('series->{{for x in y}}x={{x}}{{endfor}}')
        ['series->', ('for', (1, 11), ('x',), 'y', ['x=', ('expr', (1, 27), 'x')])]
        >>> parse('{{for x, y in z:}}{{continue}}{{endfor}}')
        [('for', (1, 3), ('x', 'y'), 'z', [('continue', (1, 21))])]
        >>> parse('{{py:x=1}}')
        [('py', (1, 3), 'x=1')]
        >>> parse('{{if x}}a{{elif y}}b{{else}}c{{endif}}')
        [('cond', (1, 3), ('if', (1, 3), 'x', ['a']), ('elif', (1, 12), 'y', ['b']), ('else', (1, 23), None, ['c']))]

    Some exceptions::

        >>> parse('{{continue}}')
        Traceback (most recent call last):
            ...
        TemplateError: continue outside of for loop at line 1 column 3
        >>> parse('{{if x}}foo')
        Traceback (most recent call last):
            ...
        TemplateError: No {{endif}} at line 1 column 3
        >>> parse('{{else}}')
        Traceback (most recent call last):
            ...
        TemplateError: else outside of an if block at line 1 column 3
        >>> parse('{{if x}}{{for x in y}}{{endif}}{{endfor}}')
        Traceback (most recent call last):
            ...
        TemplateError: Unexpected endif at line 1 column 25
        >>> parse('{{if}}{{endif}}')
        Traceback (most recent call last):
            ...
        TemplateError: if with no expression at line 1 column 3
        >>> parse('{{for x y}}{{endfor}}')
        Traceback (most recent call last):
            ...
        TemplateError: Bad for (no "in") in 'x y' at line 1 column 3
        >>> parse('{{py:x=1\ny=2}}')
        Traceback (most recent call last):
            ...
        TemplateError: Multi-line py blocks must start with a newline at line 1 column 3
    Nr:   r;   r@   )r   rG   r.  
parse_exprr   )r&  r   rA   rB   r:  rt   r?  s          r   rQ   rQ     s    d 1.A1,?B
;:NNNFF
 "'55
Fj!!!  " Mr   r(   c                    t          | d         t                    r| d         | dd          fS | d         \  }}|                                }|                    d          r|dd                              d          }|                    d          s|                    d          rK|                    d          }d|v r,|                    dd          }|                    dd	          }|dz  }nd|v rt          d
||          d||f| dd          fS |dv r$d|vrt          d||          ||f| dd          fS |                    d          rt          | ||          S |                    d          s|dk    r-t          d|                                d         z  ||          |dv rt          d|z  ||          |dv rt          d|z  ||          |                    d          rt          | ||          S |                    d          rt          | ||          S |                    d          rt          | ||          S |                    d          rt          | ||          S |                    d          rd|| d         d         f| dd          fS d|| d         d         f| dd          fS )Nr   r   py:r   z 	rC  z
r{   z.Multi-line py blocks must start with a newliner   r   )r   r   r   zcontinue outside of for loopif elif r   z%s outside of an if block)ifelifr   z%s with no expression)r/  r0  r1  zUnexpected %sfor default inherit def #r   r   )r   r   r8  
startswithlstripreplacer   
parse_condr   	parse_forparse_defaultparse_inherit	parse_def)r:  r   contextr   r   s        r   rL  rL    sD   &)S!! %ay&*$$q	ID#::<<Du ,:ABBxu%%??4   
	-DOOD$9$9 
	-;;v&&Dt||||FD11||D"--DLDDt||#D t- - - - c4 &*,,	&	&	&.4) ) ) ) c{F122J&&			 :&$000
//'
"
" :V^^'$**,,q/9t% % % 	% 
&	&	&#d*t% % % 	% 
.	.	.d"t% % % 	% 
	 	  	:w///		$	$ :VT7333		$	$ :VT7333		 	  :w///			 :3q	!-vabbz99C1&qrr
22r   c                 @   | d         d         }g }|dz   }	 | st          d||          t          | d         t                    r0| d         d         dk    rd|ft          |          z   | dd          fS t          | ||          \  }} |                    |           )Nr   r   )rR  zMissing {{endif}}r   r/  r   )r   r   r   parse_one_condr   )r:  r   ra  r   piecesr?  s         r   r\  r\     s    1IaLEFG	" 	+#T+ + + + vay%(( 	?1IaLG++E?U6]]2F122J>>+FD'BB
Fj!!!	"r   c                    | d         | dd          c\  }}} g }|                     d          r
|d d         }|                    d          r!d||dd                                          |f}nS|                    d          r!d	||d
d                                          |f}n|dk    rd|d |f}nJ d|d|            	 | st          d||          t	          | d         t
                    rI| d         d         dk    s3| d         d                             d          s| d         d         dk    r|| fS t          | ||          \  }} |                    |           )Nr   r   r   r?   rP  rR  r   rQ  rS     r   zUnexpected token z at zNo {{endif}}r   r/  )rO   rY  rZ  r   r   r   rL  r   )r:  r   ra  firstr   rC   r   r?  s           r   rc  rc  0  s   !!9fQRRjLUC&G~~c crc
 =c59++--w7			'	"	" =U122Y--//9	&T7+<<<<<<# 	)4) ) ) ) vay%(( 	 1((1IaL++G44 )1IaLF**<'g>>
Fz"""#r   c                 x   | d         \  }}| dd          } d|z   }g }|                     d          s
J |            |                    d          r
|d d         }|dd                                          }t                              |          }|st          d|z  ||	          |d |                                         }d
|v rt          d|z  ||	          t          d |d |                                                             d          D                       }||	                                d          }	 | st          d||	          t          | d         t                    r#| d         d         dk    rd||||f| dd          fS t          | ||          \  }	} |                    |	           |)Nr   r   )r   rT  r   r?   r   zBad for (no "in") in %rr   r   z=You cannot have () in the variable section of a for loop (%r)c                 ^    g | ]*}|                                 |                                 +S r(   )r8  r   s     r   r   zparse_for.<locals>.<listcomp>^  s>       7799			  r   ,zNo {{endfor}}r0  r   )rY  rO   r8  in_rer5  r   r   r   r   r   r   rL  r   )
r:  r   ra  rg  r   rC   r-  r   r   r?  s
             r   r]  r]  K  s   JE3ABBZF GGF##**U***~~c crc
!""IOOELLE %%-t% % % 	% %++-- D
d{{K t- - - 	-    %++--066s;;    D D	# 	)4) ) ) ) vay%(( 	A1IaLH,,3dG4fQRRj@@'g>>
Fz"""	#r   c                    | d         \  }}|                     d          sJ |                    d d          d         }|                    dd          }t          |          dk    rt          d|z  ||          |d                                         }d|v rt          d||          t
                              |          st          d	|z  ||          |d                                         }d
|||f| dd          fS )Nr   rU  r   r   z:Expression must be {{default var=value}}; no = found in %rr   rj  z'{{default x, y = ...}} is not supportedz-Not a valid variable name for {{default}}: %rr   )rY  r   rn   r   r8  var_rer5  )r:  r   ra  rg  r   r   r   r   s           r   r^  r^  n  s2   JE3J'''''KKa  #EKKQE
5zzQH5Pt% % % 	% (..

C
czz5t% % % 	% == ,;d, , , 	, 8>>DsC&qrr
22r   c                     | d         \  }}|                     d          sJ |                    d d          d         }d||f| dd          fS )Nr   rV  r   rv   )rY  r   )r:  r   ra  rg  r   r   s         r   r_  r_    s[    JE3J''''';;tQ"DsD!6!"":--r   c                    | d         \  }}| dd          } |                     d          sJ |                    d d          d         }|                    d          r
|d d         }d|vr	|}dd d i f}n^|                    d          st          d	|z  ||
          |d d         }|                    dd          \  }}t	          |||          }|dz   }g }	 | st          d||
          t          | d         t                    r#| d         d         dk    rd||||f| dd          fS t          | ||          \  }	} |                    |	           |)Nr   r   rW  r   r?   r   r(   )z*Function definition doesn't end with ): %sr   )r   zMissing {{enddef}}r1  r   )	rY  r   rO   r   parse_signaturer   r   rL  r   )
r:  r   ra  rg  r   r   sigsig_textrC   r?  s
             r   r`  r`    s   !9LE5ABBZFF#####KKa  #E~~c crc

%	4r"^^C   5H5P%*7 7 7 	7 crc
#kk#q11	8he44 GG	# 	+$T+ + + + vay%(( 	G1IaLH,,5)S':F122JFF'g>>
Fz"""	#r   c                    t          j        t          |           j                  g }d }d }i }dfd	}	 d } |            \  }	}
|	t           j        k    rn|	t           j        k    r|
dk    s|
dk    r|
} |            \  }	}
|	t           j        k    rt          d| z  ||          |
} |            \  }	}
|	t           j        k    s|	t           j        k    r@|
dk    r:|dk    r|}n|dk    r|}n|                    |           |	t           j        k    rnQ|t          d| z  ||          |	t           j        k    r&|
d	k    rd }d }d
}d x}}g }	  |d          \  }	}
}}||}|}|	t           j        k    r|rt          d| z  ||          |sR|	t           j        k    s|	t           j        k    r2|
dk    r,t          | ||          }|||<   |                    |           n|                    |	|
f           |r|	t           j        k    r|
|k    r|dz  }nJ|r"|	t           j        k    r|
|k    r|dz  }|sd x}}n&|s$|	t           j        k    r|
dv r|
}d}dddd|         }0||||fS )NFc                     	 t                    \  }}\  }}\  }}}n# t          $ r t          j        dfcY S w xY w| r
||||f||ffS ||fS r  )nextStopIterationtokenize	ENDMARKER)	r   tok_type
tok_stringsrowscolerowecolliner:  s	           r   	get_tokenz"parse_signature.<locals>.get_token  s    	*EI&\\BHj,4tdd 	* 	* 	*%r))))	* 	(Z$d|CCZ''s    ::r   *z**zInvalid signature: (%s)r   rj  r   r   T)r   [{rp  ]})F)
rx  generate_tokensr   readlinery  OPNAMEr   r   isolate_expression)rs  r   r   r   var_argr   r   r  var_arg_typerz  r{  var_name	nest_typeunnest_type
nest_count	start_posend_posr   r&  r   default_exprr:  s                        @r   rq  rq    sd   %hx&8&8&ABBFHGFH( ( ( ( ( (8L(y{{*x)))x{""
c(9(9Z4=O=O%L#,9;; Hjx}$$ 9H D),49 9 9 9(y{{*x)))h(+.E.E*X[J[J[s"""%%!)))8---# 9H D),49 9 9 9x{""zS'8'8IKJ"&&IEL-6Yt__**a$ !Ix111j1'(AH(L144A A A A" !X%777H<S<SXbfiXiXi#5h	7#S#SL)5HX&OOH---h
3444 	L(hk"9"9jI>U>U!OJJ LH$;$;
k@Y@Y!OJ% 7266	K# LHK(?(?JRaDaDa *I!"J(+#C"@"@"KK1LA8Lr Wfh..r   c                 x   |\  }}|dz  }|\  }}|dz  }|                      d          }||k    r||         ||         S ||         |d          g}|                    ||dz   |                    |t          |          k     r#|                    ||         d |                    d                    |          S )Nr   Tr{   )
splitlinesextendrn   r   r!   )	rF  r  r  r|  r}  r~  r  rI  r   s	            r   r  r    s    JD$AIDJD$AIDd##Et||T{49%%4[ E	LLtAvd{#$$$c%jjU4[$'(((775>>r   zn%prog [OPTIONS] TEMPLATE arg=value

Use py:arg=value to set a Python value; otherwise all values are
strings.
c                    dd l }dd l}dd l}dd l}| |j        dd          } |                    d          }|                    t          |          t                    }|	                    ddddd	
           |	                    dddd           |
                    |           \  }} t          |           dk     rt          d            |j        d           | d         }| dd          } i }	|j        r|	                    |j                   | D ]t}
d|
vr"t          d|
z              |j        d           |
                    dd          \  }}
|                    d          r|d d         }t'          |
          }
|
|	|<   u|dk    r|j                                        }d}n<t-          |d          5 }|                                }d d d            n# 1 swxY w Y   t/          ||          }|                    |	          }|j        rEt-          |j        d          5 }|                    |           d d d            d S # 1 swxY w Y   d S |j                            |           d S )Nr   r   Paste)versionusagez-oz--outputoutputFILENAMEz(File to write output to (default stdout))destmetavarhelpz--envuse_env
store_truez-Put the environment in as top-level variables)r  actionr  z!You must give a template filenamerd   r   zBad argument: %rrN  r   -z<stdin>rY   r   wb)rK   optparsepkg_resourcesr2   argvget_distributionOptionParserr   _fill_command_usage
add_option
parse_argsrn   printexitr  ro   environr   rY  r   stdinr[   rZ   r   rw   r  writestdout)r"   rK   r  r  r2   distparseroptionstemplate_namer   r   r   template_contentr`   r   rt   s                   r   fill_commandr    s>   JJJOOOIII|x|))'22D""D!!! # # #F j7	  9 9 9
 <	  > > >
 %%d++MGT
4yy1}}1222GM8DD  BJ  e$u,---CHQKKKkk#q))e??5!! 	 8DKKET

9>>++!-&& 	(! vvxx	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	((}===H  &&F~ !'.$'' 	1GGFOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
     s$   ;GG #G )III__main__r   )NTr   N)Nr   N)r(   )2r'   r  rK   r2   rx  ior   _looperr   __all__r   rk  Irm  r   r   r   r*   r.   r8   r   r   r   r   r	   r   r   r  r  r  r.  r4  r6  r7  r9  r%  r$  rQ   rL  r\  rc  r]  r^  r_  r`  rq  r  r  r  r$   r(   r   r   <module>r     s   @ 
			 



 				             
7
7
7
;	)24	0	0      I   &	 	 	 	 		 	 	 		 	 	 	 	Y 	 	 	1 1 1b b b b b b b bJ	   ! ! ! !
K K K K KD K K K<J J J J J J J JZB B B B B B B B	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q       & 	
= = = =~ rzKLLNNN  bj11 RZ-- 7 7 7t) ) ): : : :z23 23 23 23j" " " # # #6 #  #  #F3 3 3,. . .# # #>I/ I/ I/X   3! 3! 3! 3!j zLNNNNN r   