
    h                        S r SSKrSSKrSSKrSSKrSSKJr  SSKJr  / SQr	\R                  " S5      r\R                  " S\R                  5      rS	 r " S
 S\5      r " S S\5      r " S S\5      rS r " S S5      rS3S jrS3S jr " S S\5      r " S S5      r " S S5      r " S S5      r " S S5      r\" 5       rCS4S jr\R                  " S 5      r/ S!Qr \R                  " S"5      r!\R                  " S#5      r"S$ r#S% r$S5S& jr%S6S' jr&S( r'S) r(S* r)S+ r*S, r+S- r,S. r-S/ r.S0r/S3S1 jr0\1S2:X  a  \0" 5         gg)7a  
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                 ~    [        U [        5      (       d'  [        U S5      (       a  [        U 5      $ [        U 5      $ U $ )N__str__)
isinstancestrhasattrbytes)vs    Q/var/www/fran/franai/venv/lib/python3.13/site-packages/Cython/Tempita/_tempita.pycoerce_textr   .   s3    a1i  q6M8OH    c                   (    \ rS rSrSrSS jrS rSrg)r   6   z.Exception raised while parsing a template
    Nc                 F    [         R                  X5        X l        X0l        g N)	Exception__init__positionname)selfmessager   r   s       r   r   TemplateError.__init__:   s    4) 	r   c                     SR                  U R                  5      nU R                  (       a'  U< SU R                  S   < SU R                  S   < 3nU R                  (       a  USU R                  -  -  nU$ )N 	 at line r    column r   z in %s)joinargsr   r   )r   msgs     r   r   TemplateError.__str__?   sZ    hhtyy!==T]]1%t}}Q'79C998dii''C
r   r   r   r   )__name__
__module____qualname____firstlineno____doc__r   r   __static_attributes__ r   r   r   r   6   s    
r   r   c                       \ rS rSrSrg)_TemplateContinueI   r.   Nr(   r)   r*   r+   r-   r.   r   r   r0   r0   I       r   r0   c                       \ rS rSrSrg)_TemplateBreakM   r.   Nr2   r.   r   r   r5   r5   M   r3   r   r5   c                     [         R                  R                  [         R                  R                  UR                  5      U 5      nUR
                  R                  X!R                  UR                  S9$ )N)	namespaceget_template)	ospathr#   dirnamer   	__class__from_filenamer8   r9   )r   from_templater;   s      r   get_file_templater@   Q   sY    77<<(:(:;TBD""00//"// 1 1 1r   c                       \ rS rSrSS\S.rSrSr   SS jrSSS\	4S jr
\" \
5      r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rSrg)r   X   z{{z}})start_braces
end_bracesr   utf8Nc
                 2   Xl         U	(       a  SS Kn
U
R                  S[        5        Uc  U	nUc  U R                  S   U R                  S   4nOMU R
                  R                  R                  5       U l        US   U R                  S'   US   U R                  S'   U=U l        U l        [        U[        5      U l        Uc  Ub   [        R                  " U5      nUR                  nUR                  nSU;   a7  US   nUR!                  S5      (       d  UR!                  S5      (       a  US S	 nOS
U;   a  US
   nOSnU(       a  USU-  -  nX l        ['        XXpR                  S9U l        Uc  0 nX0l        XPl        Ub  X`l        g g ! ["         a     NGf = f)Nr   zk'delimeters' kwarg is being deprecated in favor of correctly spelled 'delimiters'. Please adjust your code.rC   rD   r   __file__z.pycz.pyor(   z<string>z:%sr   line_offset
delimiters)contentwarningswarnDeprecationWarningdefault_namespacer=   copyrK   
delimetersr   r   _unicodesys	_getframe	f_globalsf_linenoendswith
ValueErrorr   parse_parsedr8   r9   default_inherit)r   rL   r   r8   
stacklevelr9   r\   rJ   rK   rR   rM   callerglobalslinenos                 r   r   Template.__init__c   s     MMB"
 !'
00@00>@J
 &*^^%E%E%J%J%LD"5?]D"">23=a=D""<0,66$/"7C0<J2+z2 !**(":.D}}V,,f0E0E#CRy7*":.D%DEFN*D	W[UdUdeI"(&#2  '+  s   F	 	
FFc                     [        US5       nUR                  5       nS S S 5        U(       a  WR                  U5      nU " WXXES9$ ! , (       d  f       N.= f)Nrb)rL   r   r8   r\   r9   )openreaddecode)clsfilenamer8   encodingr\   r9   fcs           r   r>   Template.from_filename   sN    (D!QA ""A18#2O 	O	 "!s   A
Ac                     SU R                   R                  < S[        [        U 5      5      SS  < SU R                  < S3$ )N<r       z name=>)r=   r(   hexidr   r   s    r   __repr__Template.__repr__   s1    NN##4M!"tyy* 	*r   c                    U(       aW  U(       a  [        S5      e[        U5      S:  a  [        S5      e[        US   S5      (       d  [        SUS   < 35      eUS   nUnU R                  US'   U R                  (       a  UR                  U R                  5        U R                  U5      u  pEnU(       d  U R                  nU(       a  U R                  XEXc5      nU$ )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   r8   update
_interpretr\   _interpret_inherit)r   r$   kwnsresultdefsinherits          r   
substituteTemplate.substitute   s    IK K4y1}?A A47G,,Aw!" " aB"&))>>IIdnn% $ 3g**G,,V7GFr   c                     Sn/ n0 nU R                  U R                  XUS9  SU;   a  UR                  S5      nOS nSR                  U5      XE4$ )NT)outr   __inherit__ )_interpret_codesr[   popr#   )r   r   __traceback_hide__partsr   r   s         r   r|   Template._interpret   sY    !dllBED hh}-GGwwu~t,,r   c                 >   SnU R                   (       d  [        SS U R                  S9eU R                  X05      n[        U R                  5      nUR	                  5        H  u  p[        XxU	5        M     Xl        UR                  5       nXtS'   UR                  U5      $ )NTz:You cannot use inheritance without passing in get_templater   r   r   )	r9   r   r   TemplateObjectrw   setattrbodyrQ   r   )
r   r   r   inherit_templater   r   templself_r   values
             r   r}   Template._interpret_inherit   s    !  LDII/ / !!"29tyy)::<KDE' (
WWY6
##r   c                     SnU H=  n[        U[        5      (       a  UR                  U5        M+  U R                  XbX45        M?     g )NT)r   r   append_interpret_code)r   codesr   r   r   r   items          r   r   Template._interpret_codes   s;    !D$$$

4 $$Ts9	 r   c           	      <   SnUS   US   pvUS:X  a  U R                  US   X'5        g US:X  a
  [        5       eUS:X  a
  [        5       eUS:X  a4  US   US	   US
   pnU R                  XU5      n	U R	                  XXX45        g US:X  a  USS  nU R                  XX45        g US:X  ap  US   R                  S5      nU R                  US   X'5      nUSS   H  nU R                  XU5      nU" U5      nM     UR                  U R                  X5      5        g US:X  a&  US   US	   pX;  a  U R                  XU5      nUX/'   g g US:X  a  US   n	U R                  XU5      nUUS'   g US:X  a"  US   nUS	   nUS
   n[        XUXUS9=X&'   XF'   g US:X  a  g  SU-  5       e)NTr   r   pyro   continuebreakfor      condexpr|defaultr   r   def)r   r   poscommentzUnknown code: %r)
_execr0   r5   _eval_interpret_for_interpret_ifsplitr   _reprTemplateDef)r   coder   r   r   r   r   r   varsr   rL   r   basepartfuncvarr   r   	signatures                      r   r   Template._interpret_code   s   !GT!Wc4<JJtAw(Z#%%W_ ""U]"&q'47DGD::d,DGCV^HEu#4V^GMM#&E::eAh0Dab	zz$C0Dz " JJtzz$,-YQa}Dc2   Y7DJJt-E"'DU]7DQIGE$/IE47%9 9BHtzY/(4//1r   c                 L   SnU H  n[        U5      S:X  a  XUS   '   OR[        U5      [        U5      :w  a"  [        S[        U5      [        U5      4-  5      e[        X5       H	  u  pXU	'   M      U R                  X4XV5        M     g ! [         a     M  [
         a       g f = f)NTr   r   z&Need %i items to unpack (got %i items))rz   rY   zipr   r0   r5   )r   r   r   rL   r   r   r   r   r   r   r   s              r   r   Template._interpret_for  s    !D4yA~"47t9D	)$@t9c$i012 2 $'t?KD$tH $3%%g3=  % ! s   2B		
B#	B#"B#c                     SnU H`  n[        U[        5      (       a   eUS   US   pUS:X  a  Sn	OU R                  US   X(5      n	U	(       d  MJ  U R                  US   X#U5          g    g )NTr   r   elsero   r   )r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   s
             r   r   Template._interpret_if!  sr    !D!$,,,,Qa#v~DGR5v%%d1gr= r   c                 (   Sn  [        XR                  U5      nU$ ! [         a  n[        SU-  5      eS nAff = f! [         aJ  n[	        USS 5      (       a  UR
                  S   nO[        U5      nU R                  Xs5      4Ul        e S nAff = f)NTz invalid syntax in expression: %sr$   r   )evalrP   SyntaxErrorr   getattrr$   r   _add_line_info)r   r   r   r   r   r   earg0s           r   r   Template._eval/  s    !	?T#9#92> L  ?!6=? ??  	q&$''vvay"1~))$46AF	s*    = 
:5:= 
BABBc                     Sn [        XR                  U5        g ! [         aU  nUR                  (       a&  U R	                  UR                  S   U5      4Ul        e U R	                  S U5      4Ul        e S nAff = f)NTr   )execrP   r   r$   r   )r   r   r   r   r   r   s         r   r   Template._exec@  st    !	--r2 	vv--affQi=?  --dC8:	s    
A:AA55A:c           
         Sn Uc  gU R                   (       a   [        U5      nOa[	        U[        5      (       d  [        U5      n[	        U[        5      (       a,  U R                  (       a  UR                  U R                  5      nU R                   (       aR  [	        U[        5      (       a=  U R                  (       d  [        SU-  5      e UR                  U R                  5      nU$ U R                   (       dO  [	        U[        5      (       a:  U R                  (       d  [        SU-  5      eUR                  U R                  5      nU$ ! [         a    [        U5      n Nf = f! [         aL  n[        UR                  UR                  UR                  UR                  UR                  SU-  -   5      eS nAff = f! [         a+  nU R!                  UR"                  S   U5      4Ul        e S nAff = f)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   )rS   r   UnicodeDecodeErrorr   r   r   default_encodingencoderf   ri   objectstartendreasonUnicodeEncodeErrorr   r   r$   )r   r   r   r   r   s        r   r   Template._reprK  s   !&	}}})JE "%--'.Euc** 11!LL)>)>?E
 }}E5!9!9,,,9;@AB B<!LL)>)>?E L ]]z%'='=,,,9;@AB B T%:%:;LA * )!%LE)& * <,

?U#::< <<  	))!&&)S9;AF	sX   G  G  E A"G  E' E$!G  #E$$G  '
F=1AF88F= 
G5
&G00G5c                 r    U< SUS   < SUS   < 3nU R                   (       a  USU R                   -  -  nU$ )Nr!   r   r"   r   z in file %sr   )r   r%   r   s      r   r   Template._add_line_infou  s7    QQ!99=499,,C
r   )
r[   rS   rL   r\   rP   rR   rK   r9   r   r8   )NNNNNr   NN)r(   r)   r*   r+   r   rP   r   r\   r   r@   r>   classmethodrt   r   r|   r}   r   r   r   r   r   r   r   r   r-   r.   r   r   r   r   X   s     
 OFJFG-143l 04d&*9JO  .M*
0	-$:)0V&"	(Tr   r   c                     UR                  S5      nSU;   a  UR                  S5      OS n[        XXS9nUR                  U5      $ )N__namerR   )r   rK   rR   )getr   r   r   )rL   rK   r~   r   rR   tmpls         r   r   r   }  sB    66(D)5);%JG:UD??2r   c                 6    [        XS9nUR                  U5      $ )Nr   )r   r   )rL   r   rh   r   s       r   paste_script_template_rendererr     s    G+D??4  r   c                   2    \ rS rSrS rS rS rS rS rSr	g)	r	   i  c                 N    UR                  5        H  u  p#[        XU5        M     g r   )rw   r   )r   r~   r   r   s       r   r   bunch.__init__  s    88:KDD& &r   c                     X U'   g r   r.   )r   r   r   s      r   __setattr__bunch.__setattr__  s	    T
r   c                 >     X   $ ! [          a    [        U5      ef = fr   )KeyErrorAttributeErrorr   r   s     r   __getattr__bunch.__getattr__  s)    	': 	' &&	's    c                     SU ;   a   [         R                  X5      $ [         R                  X5      $ ! [         a    [         R                  U S5      s $ f = f)Nr   )dict__getitem__r   )r   keys     r   r   bunch.__getitem__  sW    9''22 ##D..  9''i889s   2  AAc                     SU R                   R                  < SSR                  [        U R	                  5       5       VVs/ s H  u  pU< SU< 3PM     snn5      < S3$ s  snnf )Nrn   r    =rp   )r=   r(   r#   sortedrw   )r   kr   s      r   rt   bunch.__repr__  sM    NN##HH6$**,3GH3G41A&3GHIK 	KHs   A"r.   N)
r(   r)   r*   r+   r   r   r   r   rt   r-   r.   r   r   r	   r	     s    ''/Kr   r	   c                   B    \ rS rSr S
S jrS rS rS rS
S jrS r	S	r
g)r   i  Nc                 X    Xl         X l        X0l        X@l        XPl        X`l        Xpl        g r   )	_template
_func_name_func_signature_body_ns_pos_bound_self)r   template	func_namefunc_signaturer   r   r   
bound_selfs           r   r   TemplateDef.__init__  s'    !#-
	%r   c           	          SU R                   < SU R                  < SU R                  R                  < SU R                  < S3	$ )Nz<tempita function (z) at :rp   )r   r   r   r   r   rs   s    r   rt   TemplateDef.__repr__  s.    OOT11NN, 	,r   c                     U " 5       $ r   r.   rs   s    r   r   TemplateDef.__str__  s	    vr   c                 *   U R                  X5      nU R                  R                  5       nUR                  U5        U R                  b  U R                  US'   / n0 nU R
                  R                  U R                  XEU5        SR                  U5      $ )Nr   r   )	_parse_signaturer   rQ   r{   r   r   r   r   r#   )r   r$   r~   valuesr   r   subdefss          r   __call__TemplateDef.__call__  sz    &&t0XX]]_
		&'))BvJ''

BWEwws|r   c           
          Uc  U $ U R                  U R                  U R                  U R                  U R                  U R
                  U R                  US9$ )N)r  )r=   r   r   r   r   r   r   )r   objtypes      r   __get__TemplateDef.__get__  sL    ;K~~NNDOOT-A-AJJ$))  = 	=r   c                 N   0 nU R                   u  pEpg0 nUR                  5        H.  u  pU(       d  X;  a  [        SU	-  5      eX;   a  XU'   M*  XU	'   M0     [        U5      n[        U5      nU(       a  U(       a,  US   U;   a#  UR	                  S5        U(       a  US   U;   a  M#  U(       a%  UR	                  S5      n	UR	                  S5      X9'   OLU(       a  [        U5      X5'   O@[        SSR                  U Vs/ s H  n[        U5      PM     sn5      -  5      eU(       a  M  UR                  5        H>  u  pX;  d  M  U R                  R                  XR                  U R                  5      X9'   M@     U H  n	X;  d  M
  [        SU	-  5      e   U(       a  XU'   U$ s  snf )NzUnexpected argument %sr   zExtra position arguments: %sz, zMissing argument: %s)r   rw   ry   listr   tupler#   reprr   r   r   r   )r   r$   r~   r  sig_argsvar_argsvar_kwdefaultsextra_kwr   r   r   
value_exprs                r   r  TemplateDef._parse_signature  s   /3/C/C,F88:KDd2,t35 5#(x !& & Dz>x{f4Q x{f4||A#xx{#(; 2ii$ 7$Qa$ 789: : d !) 0D!#~~33$)) 5 !1 D!*T13 3  %6N !8s   <F")r   r   r   r   r   r   r   r   )r(   r)   r*   r+   r   rt   r   r  r  r  r-   r.   r   r   r   r     s#    +/&,
	=%r   r   c                        \ rS rSrS rS rSrg)r   i  c                 0    Xl         [        U 5      U l        g r   )_TemplateObject__nameTemplateObjectGetterr   r   s     r   r   TemplateObject.__init__  s    '-r   c                 T    SU R                   R                  < SU R                  < S3$ )Nrn   r    rp   )r=   r(   r"  rs   s    r   rt   TemplateObject.__repr__  s     NN33T[[AAr   )r   r   N)r(   r)   r*   r+   r   rt   r-   r.   r   r   r   r     s    .Br   r   c                   &    \ rS rSrS rS rS rSrg)r#  i  c                     Xl         g r   )#_TemplateObjectGetter__template_obj)r   template_objs     r   r   TemplateObjectGetter.__init__   s    *r   c                 8    [        U R                  U[        5      $ r   )r   r)  Empty)r   attrs     r   r    TemplateObjectGetter.__getattr__  s    t**D%88r   c                 T    SU R                   R                  < SU R                  < S3$ )Nrn   z around rp   )r=   r(   r)  rs   s    r   rt   TemplateObjectGetter.__repr__  s    #'>>#:#:D<O<OPPr   )__template_objN)r(   r)   r*   r+   r   r   rt   r-   r.   r   r   r#  r#    s    +9Qr   r#  c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
_Emptyi
  c                     U $ r   r.   )r   r$   r~   s      r   r  _Empty.__call__  s    r   c                     gNr   r.   rs   s    r   r   _Empty.__str__      r   c                     g)Nr-  r.   rs   s    r   rt   _Empty.__repr__  s    r   c                     gr8  r.   rs   s    r   __unicode___Empty.__unicode__  r:  r   c                     [        S5      $ )Nr.   )iterrs   s    r   __iter___Empty.__iter__  s    Bxr   c                     g)NFr.   rs   s    r   __bool___Empty.__bool__  s    r   r.   N)r(   r)   r*   r+   r  r   rt   r>  rB  rE  r-   r.   r   r   r4  r4  
  s     r   r4  c                 p   Uc&  [         R                  S   [         R                  S   4nSn/ nSnUS-   S4n[        R                  " [        R                  " US   5      < S[        R                  " US   5      < 35      n	U	R                  U 5       H  n
U
R                  S5      n[        X
R                  5       Xx5      nXS   :X  a  U(       a  [        SUS   -  UUS	9eXS   :X  a  U(       d  [        S
US   -  UUS	9eXS   :X  a-  XU
R                  5        nU(       a  UR                  U5        SnO%UR                  XU
R                  5        U45        SnU
R                  5       nUnM     U(       a  [        SUS   -  XS9eXS nU(       a  UR                  U5        U(       a  [        U5      nU$ )a  
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

NrC   rD   Fr   r   r   z%s inside expressionr   z%s outside expressionTzNo %s to finish last expressionr'   )r   rP   recompileescapefinditergroupfind_positionr   r   r   r   trim_lex)sr   trim_whitespacerJ   rK   in_exprchunkslastlast_postoken_rematchr   r   r   s                 r   lexrW  %  s   , 11.A11,?B
GFDa#Hzzbii
1&>&(ii
1&>@ AH""1%{{1~Ayy{D;a= W 6A F),%)+ + ]"7 7*Q- G),%)+ + a= %++-(Dd#GMM1%++-0(;<Gyy{) &* =
1M!%: 	:U8Dd&!Mr   z.^(?:if |elif |for |def |inherit |default |py:))r   endifendforenddefr   r   z\n\r?[\t ]*$z	^[\t ]*\nc                 |   Sn[        U 5       GH)  u  p#[        U[        5      (       a  M  US   n[        R	                  U5      (       d  U[
        ;  a  MH  U(       d  SnOXS-
     nUS-   [        U 5      :  a  SnOXS-      n[        U[        5      (       a  [        U[        5      (       d  M  U(       + =(       d    [        R	                  U5      nUS:X  a  UR                  5       (       d  SnUb   US-   U:X  a  UR                  5       (       d  SnU(       d  GM  U(       aG  [        R	                  U5      (       d-  U[        U 5      S-
  :X  d  GMD  UR                  5       (       a  GM\  U(       a[  US:X  a  UR                  5       (       a  US:X  a  SXS-
  '   O2[        R	                  U5      nUSUR                  5       S-    nXPUS-
  '   U(       d  GM  UnU[        U 5      S-
  :X  a  UR                  5       (       d
  SXS-   '   GM  [        R	                  U5      nXhR                  5       S nX`US-   '   GM,     U $ )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   Tro   rS  )	enumerater   r   statement_researchsingle_statementsrz   trail_whitespace_restriplead_whitespace_rer   r   )	tokens	last_trimicurrentr   prev
next_chunkprev_okms	            r   rN  rN  j  s    I'
gs##qz""4((T9J-JDa%=Dq5CKJAJ:s++!$,,(>188>6$**,,G Y]a%7

GG#5#<#<Z#H#H#f+/)*2B2B2D2D!VDJJLL"f,$&Fq5M+2248AQ/D$(1q5Mz	Fa'
0@0@0B0B$&Fq5M*11*=A!+EEGH!5J$.1q5MU (V Mr   c                     U R                  SX!5      nUS:  a  XR                  SX!5      -
  nO
US   X-
  -   nUS   U-   U4$ )z/Given a string and index, return (line, column)
r   r   )countrfind)stringindex
last_indexrT  linescolumns         r   rM  rM    sQ    LLz1EqydJ>>! 23QK%((r   c                     Uc&  [         R                  S   [         R                  S   4n[        XX#S9n/ nU(       a'  [        XA5      u  pdUR	                  U5        U(       a  M'  U$ )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
rC   rD   rI   )r   rP   rW  
parse_exprr   )rO  r   rJ   rK   rc  r   rh  s          r   rZ   rZ     sj    d 11.A11,?B
;NFF
'5
j! & Mr   c                    [        U S   [        5      (       a
  U S   U SS  4$ U S   u  p4UR                  5       nUR                  S5      (       a  USS  R	                  S5      nUR                  S5      (       d  UR                  S5      (       aA  UR	                  S5      nSU;   a$  UR                  SS5      nUR                  SS	5      nUS-  nOSU;   a
  [        S
XAS9eSXC4U SS  4$ US;   a  SU;  a
  [        SXAS9eX44U SS  4$ UR                  S5      (       a  [        XU5      $ UR                  S5      (       d  US:X  a  [        SUR                  5       S   -  XAS9eUS;   a  [        SU-  XAS9eUS;   a  [        SU-  XAS9eUR                  S5      (       a  [        XU5      $ UR                  S5      (       a  [        XU5      $ UR                  S5      (       a  [        XU5      $ UR                  S5      (       a  [        XU5      $ UR                  S5      (       a  SX@S   S   4U SS  4$ SX@S   S   4U SS  4$ )Nr   r   py:r   z 	rl  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)rX  rY  rZ  zUnexpected %sfor default inherit def #r   r   )r   r   ra  
startswithlstripreplacer   
parse_condr   	parse_forparse_defaultparse_inherit	parse_def)rc  r   contextr   r   s        r   ru  ru    s~   &)S!!ay&*$$q	ID::<DuABxu%??4  DOOD$9$9;;v&Dt|||FD1||D"-DLDt|#D - - c &*,,	&	&.) ) {F12J&&			&00
//'
"
"V^'$**,q/9% 	% 
&	&#d*% 	% 
.	.d"% 	% 
	 	 w//		$	$V733		$	$V733		 	 w//			3q	!-vabz99C1&qr
22r   c                     U S   S   n/ nUS-   n U (       d
  [        SX1S9e[        U S   [        5      (       a!  U S   S   S:X  a  SU4[        U5      -   U SS  4$ [        XU5      u  pPUR	                  U5        Mk  )Nr   r   )r{  zMissing {{endif}}r   rX  r   )r   r   r  parse_one_condr   )rc  r   r  r   piecesrh  s         r   r  r     s    1IaLEFG
#+ + vay%((1IaLG+E?U6]2F12J>>+F'B
j! r   c                 F   U S   U SS  su  p4n / nUR                  S5      (       a  US S nUR                  S5      (       a  SXCSS  R                  5       U4nOIUR                  S5      (       a  S	XCS
S  R                  5       U4nOUS:X  a  SUS U4nO SU< SU< 35       e U (       d
  [        SXAS9e[	        U S   [
        5      (       a7  U S   S   S:X  d(  U S   S   R                  S5      (       d  U S   S   S:X  a  X`4$ [        XU5      u  ppUR                  U5        M  )Nr   r   r  rH   ry  r{  r   rz  r|     r   zUnexpected token z at zNo {{endif}}r   rX  )rX   r  r  r   r   r  ru  r   )rc  r   r  firstr   rL   r   rh  s           r   r  r  0  sB   !!9fQRjLU&G~~ccr
c9++-w7			'	"	"12Y--/9	&T7+<<<q
) ) vay%((1(1IaL++G441IaLF*<'g>
z" r   c                    U S   u  p4U SS  n SU-   n/ nUR                  S5      (       d   U5       eUR                  S5      (       a  US S nUSS  R                  5       n[        R	                  U5      nU(       d  [        SU-  XAS	9eUS UR                  5        nS
U;   a  [        SU-  XAS	9e[        US UR                  5        R                  S5       Vs/ s H*  nUR                  5       (       d  M  UR                  5       PM,     sn5      nX6R                  5       S  n	 U (       d
  [        SXAS	9e[        U S   [        5      (       a  U S   S   S:X  a
  SXGX4U SS  4$ [        XU5      u  pUR                  U
5        M`  s  snf )Nr   r   )r   r}  r  rH   r   zBad for (no "in") in %rr   r  z=You cannot have () in the variable section of a for loop (%r),zNo {{endfor}}rY  r   )r  rX   ra  in_rer^  r   r   r  r   r   r   ru  r   )rc  r   r  r  r   rL   rV  r   r   r   rh  s              r   r  r  K  s   JEABZF GGF##*U*#~~ccr
!"IOOELLE%-% 	% %++- D
d{K - 	-  %++-066s;;a779 		; D D
) ) vay%((1IaLH,3d4fQRj@@'g>
z" 	s   F4Fc                    U S   u  p4UR                  S5      (       d   eUR                  S S5      S   nUR                  SS5      n[        U5      S:X  a  [        SU-  XAS9eUS   R	                  5       nSU;   a
  [        SXAS9e[
        R                  U5      (       d  [        S	U-  XAS9eUS   R	                  5       nS
XFU4U SS  4$ )Nr   r~  r   r   z:Expression must be {{default var=value}}; no = found in %rr   r  z'{{default x, y = ...}} is not supportedz-Not a valid variable name for {{default}}: %rr   )r  r   rz   r   ra  var_rer^  )rc  r   r  r  r   r   r   r   s           r   r  r  n  s    JEJ''''KKa #EKKQE
5zQH5P% 	% (..
C
cz5% 	% ==;, 	, 8>>Ds&qr
22r   c                 |    U S   u  p4UR                  S5      (       d   eUR                  S S5      S   nSXE4U SS  4$ )Nr   r  r   r   )r  r   )rc  r   r  r  r   r   s         r   r  r    sO    JEJ'''';;tQ"Ds!6!":--r   c                 (   U S   u  p4U SS  n UR                  S5      (       d   eUR                  S S5      S   nUR                  S5      (       a  US S nSU;  a	  UnSS S 0 4nOHUR                  S5      (       d  [        S	U-  XAS
9eUS S nUR                  SS5      u  pW[	        XqU5      nUS-   n/ n U (       d
  [        SXAS
9e[        U S   [        5      (       a  U S   S   S:X  a
  SXEXh4U SS  4$ [        XU5      u  pUR                  U	5        M`  )Nr   r   r  r  rH   r  r.   )z*Function definition doesn't end with ): %sr   )r   zMissing {{enddef}}rZ  r   )	r  r   rX   r   parse_signaturer   r  ru  r   )
rc  r   r  r  r   r   sigsig_textrL   rh  s
             r   r  r    sO   !9LEABZFF####KKa #E~~ccr

%	4r"^^C  H5P%*7 	7 cr
#kk#q1	he4 GG
$+ + vay%((1IaLH,5S:F12JFF'g>
z" r   c                   ^ [         R                  " [        U 5      R                  5      m/ nS nS n0 nSU4S jjn S nU" 5       u  pU	[         R                  :X  a  GO'U	[         R
                  :X  a  U
S:X  d  U
S:X  a  U
nU" 5       u  pU	[         R                  :w  a  [        SU -  X!S9eU
nU" 5       u  pU	[         R                  :X  d  U	[         R
                  :X  aA  U
S:X  a;  US:X  a  UnOUS:X  a  UnOUR                  U5        U	[         R                  :X  a  GOiM  Ub  [        SU -  X!S9eU	[         R
                  :X  Ga?  U
S:X  Ga8  S nS nS	nS =nn/ n U" S
5      u  pnnUc  UnUnU	[         R                  :X  a  U(       a  [        SU -  X!S9eU(       dP  U	[         R                  :X  d  U	[         R
                  :X  a(  U
S:X  a"  [        XU5      nUXk'   UR                  U5        OUR                  X45        U(       a  U	[         R
                  :X  a  X:X  a  US-  nO^U(       a)  U	[         R
                  :X  a  X:X  a  US-  nU(       d  S =pO.U(       d'  U	[         R
                  :X  a  U
S;   a  U
nSnSSSS.U   nGM+  GMH  X4XV4$ )Nc                    >  [        T5      u  pu  p4u  pVnU (       a  XX44XV44$ X4$ ! [         a    [        R                  S4s $ f = fr8  )nextStopIterationtokenize	ENDMARKER)	r   tok_type
tok_stringsrowscolerowecollinerc  s	           r   	get_token"parse_signature.<locals>.get_token  s_    	*EI&\BH,4d $|CC''  	*%%r))	*s   ( AAr   *z**zInvalid signature: (%s)r   r  r   r   T)r  [{r  ]})F)
r  generate_tokensr   readliner  OPNAMEr   r   isolate_expression)r  r   r   r  var_argr  r  r  var_arg_typer  r  var_name	nest_typeunnest_type
nest_count	start_posend_posr   rO  r   default_exprrc  s                        @r   r  r    s   %%hx&8&A&ABFHGFH( ({x)))x{{"
c(9Z4=O%L#,; Hx}}$ 9H D),9 9({x)))h(++.E*X[J[s""%!)8---# 9H D),9 9x{{"zS'8IKJ"&&IE-6t_*a$ !Ix111j'(AH(L14A A"!X%7%77H<SXbfiXi#5h7#SL)5H&OOH-h34(hkk"9j>U!OJH$;
@Y!OJ%266	#HKK(?JRaDa *I!"J(+#C"@"KK1 A r f..r   c                    Uu  p4US-  nUu  pVUS-  nU R                  S5      nX5:X  a  Xs   XF $ Xs   US  /nUR                  XsS-   U 5        U[        U5      :  a  UR                  Xu   S U 5        SR	                  U5      $ )Nr   Tr   )
splitlinesextendrz   r   r#   )	ro  r  r  r  r  r  r  rr  r   s	            r   r  r    s    JDAIDJDAIDd#E|{4%%[ E	LLAvd#$c%jU[$'(775>r   zn%prog [OPTIONS] TEMPLATE arg=value

Use py:arg=value to set a Python value; otherwise all values are
strings.
c                 z   SS K nSS KnSS KnSS KnU c  UR                  SS  n UR                  S5      nUR                  [        U5      [        S9nUR                  SSSSS	S
9  UR                  SSSSS9  UR                  U 5      u  pp[        U 5      S:  a  [        S5        UR                  " S5        U S   nU SS  n 0 n	UR                  (       a  U	R                  UR                   5        U  Hg  n
SU
;  a   [        SU
-  5        UR                  " S5        U
R#                  SS5      u  pUR%                  S5      (       a  US S n['        U
5      n
XU'   Mi     US:X  a  UR(                  R+                  5       nSnO%[-        US5       nUR+                  5       nS S S 5        [/        WUS9nUR1                  U	5      nUR2                  (       a1  [-        UR2                  S5       nUR5                  U5        S S S 5        g UR6                  R5                  U5        g ! , (       d  f       N= f! , (       d  f       g = f)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 filenamero   r   zBad argument: %rrw  r   -z<stdin>rc   r   wb)rT   optparsepkg_resourcesr:   argvget_distributionOptionParserr   _fill_command_usage
add_option
parse_argsrz   printexitr  r{   environr   r  r   stdinre   rd   r   r   r  writestdout)r$   rT   r  r  r:   distparseroptionstemplate_namer   r   r   template_contentrj   r   r   s                   r   fill_commandr    s
   |xx|))'2D""D!! # #F j7	  9
 <	  >
 %%d+MG
4y1}12GM8DDBJJe$u,-HHQKkk#q)??5!!8DKET
  99>>+!-&! vvx '(}=H  &F~~'..$'1GGFO (' 	

  '&
 ('s   	H$H,
H),
H:__main__r   )NTr   N)Nr   N)r.   )2r,   rH  rT   r:   r  ior   _looperr   __all__rI  r  Ir  r   r   r   r0   r5   r@   r   r   r   r   r	   r   r   r#  r4  r-  rW  r]  r_  r`  rb  rN  rM  rZ   ru  r  r  r  r  r  r  r  r  r  r  r(   r.   r   r   <module>r     st  @ 
 
 	   
7


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