
    Ae                        d Z ddlm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
 ddlmZmZmZmZmZmZ g dZ ej&                  d	      Z ej&                  d
ej*                        Z G d de      Z G d de      Z G d de      Zd Z G d de      Zd4dZd4dZ G d de       Z! G d de      Z" G d de      Z# G d de      Z$ G d de      Z% e%       Z&[%d5d Z' ej&                  d!      Z(g d"Z) ej&                  d#      Z* ej&                  d$      Z+d% Z,d& Z-d6d'Z.d7d(Z/d) Z0d* Z1d+ Z2d, Z3d- Z4d. Z5d/ Z6d0 Z7d1Z8d4d2Z9e:d3k(  r e9        yy)8a  
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.
    )absolute_importN)StringIO   )looper)bytesunicode_basestring_next
is_unicodecoerce_text)TemplateErrorTemplatesubbunchz\s+in\s+z^[a-z_][a-z0-9_]*$c                       e Zd ZdZddZd Zy)r   z.Exception raised while parsing a template
    Nc                 L    t         j                  | |       || _        || _        y N)	Exception__init__positionname)selfmessager   r   s       7lib/python3.12/site-packages/Cython/Tempita/_tempita.pyr   zTemplateError.__init__5   s     4) 	    c                     dj                  | 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   __str__zTemplateError.__str__:   sZ    hhtyy!==T]]1%t}}Q'79C998dii''C
r   r   )__name__
__module____qualname____doc__r   r#    r   r   r   r   1   s    
r   r   c                       e Zd Zy)_TemplateContinueNr$   r%   r&   r(   r   r   r*   r*   D       r   r*   c                       e Zd Zy)_TemplateBreakNr+   r(   r   r   r.   r.   H   r,   r   r.   c                     t         j                  j                  t         j                  j                  |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   L   s[    77<<(:(:;TBD""00//"// 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y)r   z{{z}})start_braces
end_bracesr   utf8Nc	                    || _         || j                  d   | j                  d   f}nM| j                  j                  j                         | _        |d   | j                  d<   |d   | j                  d<   || _        t        |      | _        |x|v	 t        j                  |      }	|	j                  }
|	j                  }d|
v r-|
d   }|j                  d      s|j                  d      r|d d }nd	|
v r|
d	   }nd
}|r	|d|z  z  }	 || _        t        |||| j                        | _        |i }|| _        || _        ||| _        y y # t        $ r Y Mw xY w)Nr:   r;   r   r   __file__z.pycz.pyor$   z<string>z:%sr   line_offset
delimeters)contentdefault_namespacer5   copyrB   r   _unicodesys	_getframe	f_globalsf_linenoendswith
ValueErrorr   parse_parsedr0   r1   default_inherit)r   rC   r   r0   
stacklevelr1   rO   rA   rB   callerglobalslinenos               r   r   zTemplate.__init__^   s     00@00>@J
 &*^^%E%E%J%J%LD"5?]D"">23=a=D""<0$"7+<J2+z2 !**(":.D}}V,f0E#CRy7*":.D%DEFN*D	W4[UYUdUdeI"(&#2D  '+  s   E	 		EEc                     t        |d      5 }|j                         }d d d        |rj                  |      } | ||||      S # 1 sw Y   )xY w)Nrb)rC   r   r0   rO   r1   )openreaddecode)clsfilenamer0   encodingrO   r1   fcs           r   r6   zTemplate.from_filename   sY    (D! 	QA	"A18y#2O 	O		 	s   AA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__   s1    NN##4M!"tyy* 	*r   c                    |rK|rt        d      t        |      dkD  rt        d      t        |d   d      st        d|d         |d   }|}| j                  |d<   | j                  r|j                  | j                         | j                  |      \  }}}|s| j                  }|r| j                  ||||      }|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lenhasattrr   r0   update
_interpretrO   _interpret_inherit)r   r!   kwnsresultdefsinherits          r   
substitutezTemplate.substitute   s    IK K4y1}?A A47G,Aw!" " aB"&))>>IIdnn% $ 3g**G,,VT7BGFr   c                     d}g }i }| j                  | j                  |||       d|v r|j                  d      }nd }dj                  |      ||fS )NT)outrr   __inherit__ )_interpret_codesrN   popr    )r   rp   __traceback_hide__partsrr   rs   s         r   rm   zTemplate._interpret   s]    !dllBEED hh}-GGwwu~tW,,r   c                 @   d}| j                   st        dd | j                        | j                  ||       }t        | j                        }|j	                         D ]  \  }}	t        |||	        ||_        |j                         }||d<   |j                  |      S )NTz:You cannot use inheritance without passing in get_templater   r   r   )	r1   r   r   TemplateObjectrg   setattrbodyrE   rt   )
r   r   rr   inherit_templaterp   r{   templself_r   values
             r   rn   zTemplate._interpret_inherit   s    !  LDII/ / !!"2D9tyy)::< 	(KD%E4'	(
WWY6
##r   c                     d}|D ]8  }t        |t              r|j                  |       %| j                  ||||       : y )NT)
isinstancer	   append_interpret_code)r   codesrp   rv   rr   r{   items          r   ry   zTemplate._interpret_codes   sA    ! 	:D$,

4 $$T2sD9		:r   c                 P   d}|d   |d   }}|dk(  r| j                  |d   ||       y |dk(  r
t               |dk(  r
t               |dk(  r9|d   |d	   |d
   }
}	}| j                  |	||      }	| j	                  ||	|
|||       y |dk(  r|dd  }| j                  ||||       y |dk(  rq|d   j                  d      }| j                  |d   ||      }|dd  D ]  }| j                  |||      } ||      } |j                  | j                  ||             y |dk(  r(|d   |d	   }	}||vr| j                  |	||      }|||<   y y |dk(  r|d   }	| j                  |	||      }||d<   y |dk(  r)|d   }|d	   }|d
   }t        | |||||      x||<   ||<   y |dk(  ry J d|z         )NTr   r   pyr`   continuebreakfor      condexpr|defaultrs   rw   def)r   rp   poscommentzUnknown code: %r)
_execr*   r.   _eval_interpret_for_interpret_ifsplitr   _reprTemplateDef)r   coderp   rv   rr   r{   r   r   varsr   rC   r|   basepartfuncvarrq   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V^HEub#t4V^GMM#&E::eAhC0Dab	 "zz$C0Dz" JJtzz$,-YQaC"}D"c2 3  Y7DJJtR-E"'DU]7DQIGE$/dIEVX47%9 9BtHtDzY/(4//r   c                 F   d}|D ]  }t        |      dk(  r	|||d   <   nRt        |      t        |      k7  r"t        dt        |      t        |      fz        t        ||      D ]
  \  }	}
|
||	<    	 | j                  ||||        y # t        $ r Y t
        $ r Y  y w xY w)NTr   r   z&Need %i items to unpack (got %i items))rj   rL   zipry   r*   r.   )r   r   r   rC   rp   rv   rr   r{   r   r   r   s              r   r   zTemplate._interpret_for   s    ! 	D4yA~"47t9D	)$@t9c$i012 2 $'tT? %KD%$BtH%%%gr3=	 % ! s   2B			B B B c                     d}|D ]W  }t        |t              rJ |d   |d   }}|dk(  rd}	n| j                  |d   ||      }	|	s@| j                  |d   |||        y  y )NTr   r   elser`   r   )r   r	   r   ry   )
r   r|   rp   rv   rr   r{   r   r   r   rq   s
             r   r   zTemplate._interpret_if  su    ! 		D!$44Qa#Dv~DGR5%%d1gr3=		r   c                    d}	 	 t        || j                  |      }|S # t        $ r}t        d|z        d }~ww xY w# t        $ rF}t	        |dd       r|j
                  d   }nt        |      }| j                  ||      f|_         d }~ww xY w)NTz invalid syntax in expression: %sr!   r   )evalrD   SyntaxErrorr   getattrr!   r   _add_line_info)r   r   rp   r   r{   r   earg0s           r   r   zTemplate._eval!  s    !	?T4#9#92> L  ?!6=? ??  	q&$'vvay"1~))$46AF	s*    = 	:5:= 	BABBc                     d}	 t        || j                  |       y # t        $ rP}|j                  r&| j	                  |j                  d   |      f|_         | j	                  d |      f|_         d }~ww xY w)NTr   )execrD   r   r!   r   )r   r   rp   r   r{   r   s         r   r   zTemplate._exec2  sv    !	t--r2 	vv--affQi=?  --dC8:	s    	A5AA00A5c           
      p   d}	 |y| j                   r	 t        |      }nMt	        |t
              st        |      }t        |      r'| j                  r|j                  | j                        }| j                   rHt	        |t              r8| j                  st        d|z        	 |j                  | j                        }|S | j                   s@t        |      r5| j                  st!        d|z        |j                  | j                        }|S # t        $ r t        |      }Y w xY w# t        $ rL}t        |j                  |j                  |j                  |j                  |j                  d|z  z         d }~ww xY w# t"        $ r+}| j%                  |j&                  d   |      f|_         d }~ww xY w)NTrx   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   )rF   r   UnicodeDecodeErrorr   r   r	   r   r   default_encodingencoderX   r[   objectstartendreasonUnicodeEncodeErrorr   r   r!   )r   r   r   r{   r   s        r   r   zTemplate._repr=  s   !&	}}})$UOE "%5'.Eu%--!LL)>)>?E
 }}E5!9,,,9;@AB B<!LL)>)>?E L ]]z%'8,,,9;@AB B T%:%:;LA * )!%LE)& * <,

?U#::< <<  	))!&&)S9;AF	sX   F F D AF $D) D&#F %D&&F )	E>2AE99E>	F5
&F00F5c                 b    |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_infog  s7    QQ!99=499,,C
r   )NNNNNr   N)r$   r%   r&   r   rD   r   rO   r   r8   r6   classmethodre   rt   rm   rn   ry   r   r   r   r   r   r   r   r(   r   r   r   r   S   s     
 OFJFG +3Z 04d&*9JO  .M*
0	-$:)0V&"	(Tr   r   c                 b    |j                  d      }t        | ||      }|j                  |      S )N__name)r   rB   )getr   rt   )rC   rB   ro   r   tmpls        r   r   r   o  s-    66(DG$:>D??2r   c                 >    t        | |      }|j                  |      S )Nr   )r   rt   )rC   r   rZ   r   s       r   paste_script_template_rendererr   u  s    G(+D??4  r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)r   c                 N    |j                         D ]  \  }}t        | ||        y r   )rg   r   )r   ro   r   r   s       r   r   zbunch.__init__|  s'    88: 	'KD%D$&	'r   c                     || |<   y r   r(   )r   r   r   s      r   __setattr__zbunch.__setattr__  s    T
r   c                 >    	 | |   S # t         $ r t        |      w xY wr   )KeyErrorAttributeErrorr   r   s     r   __getattr__zbunch.__getattr__  s+    	': 	' &&	's    c                     d| v r	 t         j                  | |      S t         j                  | |      S # t        $ r t         j                  | d      cY S w xY w)Nr   )dict__getitem__r   )r   keys     r   r   zbunch.__getitem__  s[    9''c22 ##D#..  9''i889s   2 AAc                     d| j                   j                  ddj                  t        | j	                               D cg c]  \  }}|d| c}}      dS c c}}w )Nr_   r   =ra   )r5   r$   r    sortedrg   )r   kvs      r   re   zbunch.__repr__  sI    NN##HH6$**,3GH41aA&HIK 	KHs    AN)r$   r%   r&   r   r   r   r   re   r(   r   r   r   r   z  s    ''/Kr   r   c                   6    e Zd Z	 ddZd Zd Zd ZddZd Zy)	r   Nc                 f    || _         || _        || _        || _        || _        || _        || _        y r   )	_template
_func_name_func_signature_body_ns_pos_bound_self)r   template	func_namefunc_signaturer   rp   r   
bound_selfs           r   r   zTemplateDef.__init__  s5    !#-
	%r   c           	          d| j                   d| j                  d| j                  j                  d| j                  d	S )Nz<tempita function (z) at :ra   )r   r   r   r   r   rd   s    r   re   zTemplateDef.__repr__  s.    OOT11NN, 	,r   c                      |        S r   r(   rd   s    r   r#   zTemplateDef.__str__  s	    vr   c                 ,   | j                  ||      }| j                  j                         }|j                  |       | j                  | j                  |d<   g }i }| j
                  j                  | j                  |||       dj                  |      S )Nr   rx   )	_parse_signaturer   rE   rl   r   r   ry   r   r    )r   r!   ro   valuesrp   rv   subdefss          r   __call__zTemplateDef.__call__  s~    &&tR0XX]]_
		&'))BvJ''

BWEwws|r   c           	          || S | j                  | j                  | j                  | j                  | j                  | j
                  | j                  |      S )N)r   )r5   r   r   r   r   r   r   )r   objtypes      r   __get__zTemplateDef.__get__  sL    ;K~~NNDOOT-A-AJJ$))  = 	=r   c                    i }| j                   \  }}}}i }|j                         D ](  \  }	}
|s|	|vrt        d|	z        |	|v r|
||<   $|
||	<   * t        |      }t        |      }|r|r"|d   |v r|j	                  d       |r|d   |v r|r&|j	                  d      }	|j	                  d      ||	<   nE|rt        |      ||<   n7t        ddj                  |D cg c]  }t        |       c}      z        |r|j                         D ]>  \  }	}|	|vs| j                  j                  || j                  | j                        ||	<   @ |D ]  }	|	|vst        d|	z         |r|||<   |S c c}w )NzUnexpected argument %sr   zExtra position arguments: %sz, zMissing argument: %s)r   rg   ri   listrz   tupler    reprr   r   r   r   )r   r!   ro   r   sig_argsvar_argsvar_kwdefaultsextra_kwr   r   r   
value_exprs                r   r   zTemplateDef._parse_signature  s   /3/C/C,(FH88: 	'KD%d(2,t35 5x#(x !&	' Dz>x{f4Q x{f4||A#xx{t#(;x 2ii$ 7Qa 789: :  !) 0 	5D*6!#~~33$)) 5t	5  	3D6!*T13 3	3 %F6N !8s   E0r   )	r$   r%   r&   r   re   r#   r   r   r   r(   r   r   r   r     s#    +/&,
	=%r   r   c                       e Zd Zd Zd Zy)r   c                 2    || _         t        |       | _        y r   )_TemplateObject__nameTemplateObjectGetterr   r   s     r   r   zTemplateObject.__init__  s    '-r   c                 P    d| j                   j                  d| j                  dS )Nr_   r   ra   )r5   r$   r   rd   s    r   re   zTemplateObject.__repr__  s     NN33T[[AAr   N)r$   r%   r&   r   re   r(   r   r   r   r     s    .Br   r   c                       e Zd Zd Zd Zd Zy)r   c                     || _         y 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8r   c                 P    d| j                   j                  d| j                  dS )Nr_   z around ra   )r5   r$   r  rd   s    r   re   zTemplateObjectGetter.__repr__  s    #'>>#:#:D<O<OPPr   N)r$   r%   r&   r   r   re   r(   r   r   r   r     s    +9Qr   r   c                   T    e Zd Zd Zd Zd Zd Zd Zd Ze	j                  dk  reZyy)	_Emptyc                     | S r   r(   )r   r!   ro   s      r   r   z_Empty.__call__  s    r   c                      yNrx   r(   rd   s    r   r#   z_Empty.__str__  s    r   c                      y)Nr  r(   rd   s    r   re   z_Empty.__repr__  s    r   c                      yr  r(   rd   s    r   __unicode__z_Empty.__unicode__  s    r   c                     t        d      S )Nr(   )iterrd   s    r   __iter__z_Empty.__iter__  s    Bxr   c                      y)NFr(   rd   s    r   __bool__z_Empty.__bool__  s    r   3N)r$   r%   r&   r   r#   re   r  r  r  rG   version__nonzero__r(   r   r   r  r    s8     {{S r   r  c                 B   |&t         j                  d   t         j                  d   f}d}g }d}|dz   df}t        j                  t        j                  |d         dt        j                  |d               }	|	j                  |       D ]  }
|
j                  d      }t        | |
j                         ||      }||d   k(  r|rt        d|d   z  ||	      ||d   k(  r|st        d
|d   z  ||	      ||d   k(  r)| ||
j                          }|r|j                  |       d}n&|j                  | ||
j                          |f       d}|
j                         }|} |rt        d|d   z  ||      | |d }|r|j                  |       |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   rD   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*    s   , 11.A11,?B
GFDa#Hzzbii
1&>&(ii
1&>@ AH""1% {{1~Auyy{D(;:a= W 6A F),%)+ + Z]"7 7*Q- G),%)+ + :a= T%++-(Dd#GMM1T%++-0(;<Gyy{)* =
1M!%: 	:TU8D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        j	                  |      s	|t
        vr;|sd}n| |dz
     }|dz   t        |       k\  rd}n| |dz      }t        |t              rt        |t              s| xs t        j	                  |      }|dk(  r|j                         sd}||dz   |k(  r|j                         sd}|s|r9t        j	                  |      s$|t        |       dz
  k(  s|j                         r|rV|dk(  r|j                         r|dk(  r	d| |dz
  <   n3t        j	                  |      }|d|j                         dz    }|| |dz
  <   |sl|}|t        |       dz
  k(  r|j                         s
d| |dz   <   t        j	                  |      }||j                         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   rx   r   Tr`   r&  )	enumerater   r	   statement_researchsingle_statementsrj   trail_whitespace_restriplead_whitespace_rer   r   )	tokens	last_trimicurrentr   prev
next_chunkprev_okms	            r   r!  r!  ^  s    I' */
7g{+qz""4(T9J-JD!a%=Dq5CKJAJ:{3dK0(>188>6$**,G Y]a%7

G#5#<#<Z#H#f+/)*2B2B2D!VDJJL&($&F1q5M+2248AQ/D$(F1q5M	Fa'
0@0@0B$&F1q5M*11*=A!+AEEGH!5J$.F1q5MU*/V Mr   c                     | j                  d||      }|dkD  r|| j                  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     sY    LLz51EqydJ>>!
 23QK%((r   c                     |&t         j                  d   t         j                  d   f}t        | |||      }g }|r#t        ||      \  }}|j	                  |       |r#|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
    r:   r;   r@   )r   rD   r*  
parse_exprr   )r"  r   rA   rB   r6  rq   r;  s          r   rM   rM     sp    d 11.A11,?B
;:NFF
'5
Fj!  Mr   c                 @   t        | d   t              r
| d   | dd  fS | d   \  }}|j                         }|j                  d      r|dd  j	                  d      }|j                  d      s|j                  d      r?|j	                  d      }d|v r$|j                  dd      }|j                  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 |j                  d      rt        | ||      S |j                  d      s|dk(  r"t        d|j                         d   z  ||      |dv rt        d|z  ||      |dv rt        d|z  ||      |j                  d      rt        | ||      S |j                  d      rt        | ||      S |j                  d      rt        | ||      S |j                  d      rt        | ||      S |j                  d      rd|| d   d   f| dd  fS d|| d   d   f| dd  fS )Nr   r   py:r   z 	r?  z
rx   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+  r,  r-  zUnexpected %sfor default inherit def #r   r   )r   r	   r4  
startswithlstripreplacer   
parse_condr   	parse_forparse_defaultparse_inherit	parse_def)r6  r   contextr   r   s        r   rH  rH    s{   &)[)ay&*$$q	ID#::<DuABxu%??4 DOOD$9;;v&Dt|||FD1||D"-DLDt|#D t- - c4 &*,,	&	&.4) ) c{F12J&&		&$00
//'
"V^'$**,q/9t% 	% 
&	&#d*t% 	% 
.	.d"t% 	% 
	 w//		$VT733		$VT733		 w//		3q	!-vabz99C1&qr
22r   c                     | d   d   }g }|dz   }	 | st        d||      t        | d   t              r | d   d   dk(  rd|ft        |      z   | dd  fS t        | ||      \  }} |j	                  |       e)Nr   r   )rN  zMissing {{endif}}r~   r+  r   )r   r   r   parse_one_condr   )r6  r   r]  r   piecesr;  s         r   rX  rX    s    1IaLEFG
#T+ + vay%(q	!'E?U6]2F12J>>+FD'B
Fj! r   c                    | d   | dd  c\  }}} g }|j                  d      r|d d }|j                  d      rd||dd  j                         |f}nB|j                  d      rd	||d
d  j                         |f}n|dk(  rd|d |f}nJ d|d|       	 | st        d||      t	        | d   t
              r1| d   d   dk(  s"| d   d   j                  d      s| d   d   dk(  r|| fS t        | ||      \  }} |j                  |       v)Nr   r   r   r?   rL  rN  r   rM  rO     r   zUnexpected token z at zNo {{endif}}r~   r+  )rK   rU  rV  r   r   r   rH  r   )r6  r   r]  firstr   rC   r   r;  s           r   r_  r_  $  s?   !!9fQRjLUC&G~~ccr
c59++-w7			'	"U12Y--/9	&T7+<<<
4) ) vay%(1(1IaL++G41IaLF*<'g>
Fz" r   c                    | d   \  }}| dd  } d|z   }g }|j                  d      sJ |j                  d      r|d d }|dd  j                         }t        j	                  |      }|st        d|z  ||	      |d |j                          }d
|v rt        d|z  ||	      t        |d |j                          j                  d      D cg c]"  }|j                         r|j                         $ c}      }||j                         d  }		 | st        d||	      t        | d   t              r| d   d   dk(  rd|||	|f| dd  fS t        | ||      \  }
} |j                  |
       \c c}w )Nr   r   )r   rP  r   r?   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}}r,  r   )rU  rK   r4  in_rer1  r   r   r   r   r   r   rH  r   )r6  r   r]  rc  r   rC   r)  r   r   r   r;  s              r   rY  rY  ?  s   JE3ABZF GGF##~~ccr
!"IOOELLE%-t% 	% %++- D
d{K t- 	-  %++-066s;779 	
	 D D
4) ) vay%(q	!(3dG4fQRj@@'g>
Fz" 	s   
'E(c                    | d   \  }}|j                  d      sJ |j                  d d      d   }|j                  dd      }t        |      dk(  rt        d|z  ||      |d   j	                         }d|v rt        d||      t
        j                  |      st        d	|z  ||      |d   j	                         }d
|||f| dd  fS )Nr   rQ  r   r   z:Expression must be {{default var=value}}; no = found in %rr~   re  z'{{default x, y = ...}} is not supportedz-Not a valid variable name for {{default}}: %rr   )rU  r   rj   r   r4  var_rer1  )r6  r   r]  rc  r   r|   r   r   s           r   rZ  rZ  b  s    JE3J''KKa #EKKQE
5zQH5Pt% 	% (..
C
cz5t% 	% ==;d, 	, 8>>DsC&qr
22r   c                 v    | d   \  }}|j                  d      sJ |j                  d d      d   }d||f| dd  fS )Nr   rR  r   rs   )rU  r   )r6  r   r]  rc  r   r   s         r   r[  r[  x  sM    JE3J'';;tQ"DsD!6!":--r   c                    | d   \  }}| dd  } |j                  d      sJ |j                  d d      d   }|j                  d      r|d d }d|vr	|}dd d i f}nI|j                  d      st        d	|z  ||
      |d d }|j                  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        | ||      \  }	} |j                  |	       \)Nr   r   rS  r   r?   r   r(   )z*Function definition doesn't end with ): %sr~   )r   zMissing {{enddef}}r-  r   )	rU  r   rK   r   parse_signaturer   r   rH  r   )
r6  r   r]  rc  r   r   sigsig_textrC   r;  s
             r   r\  r\    sR   !9LE5ABZFF##KKa #E~~ccr

%	4r"^^C H5P%*7 	7 cr
#kk#q1	8he4 GG
$T+ + vay%(q	!(5)S':F12J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                  k7  rt        d| z  ||      |
} |       \  }	}
|	t         j                  k(  s|	t         j
                  k(  r<|
dk(  r7|dk(  r|}n|dk(  r|}n|j                  |       |	t         j                  k(  rnH|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  ||      |sO|	t         j                  k(  s|	t         j
                  k(  r)|
dk(  r$t        | ||      }|||<   |j                  |       n|j                  |	|
f       |r|	t         j
                  k(  r|
|k(  r|dz  }nL|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|   }#||||fS )Nc                     	 t              \  }}\  }}\  }}}| r
||||f||ffS ||fS # t        $ r t        j                  dfcY S w xY wr  )r
   StopIterationtokenize	ENDMARKER)	r   tok_type
tok_stringsrowscolerowecolliner6  s	           r   	get_tokenz"parse_signature.<locals>.get_token  sm    	*EI&\BHj,4td Z$d|CCZ''  	*%%r))	*s   * AAr   *z**zInvalid signature: (%s)r~   re  r   r   T)r   [{rk  ]})F)
rr  generate_tokensr   readliners  OPNAMEr   r   isolate_expression)rn  r   r   r   var_argr   r   r{  var_arg_typert  ru  var_name	nest_typeunnest_type
nest_count	start_posend_posr|   r"  r   default_exprr6  s                        @r   rl  rl    s   %%hx&8&A&ABFHGFH( ({*x)))x{{"
c(9Z4=O%L#,; Hjx}}$ 9H D),49 9({*x)))h(++.E*X[J[s""%!)8---# 9H D),49 9x{{"zS'8IKJ"&&IE-6t_**a$ !Ix111j'(AH(L144A A"!3!33HKK8OT^beTe#5h	7#SL)5HX&OOH-h
34(hkk"9jI>U!OJH$;
k@Y!OJ%266	K#HKK(?JRaDa *I!"J(+#C"@"KK1 A r Wfh..r   c                    |\  }}|dz  }|\  }}|dz  }| j                  d      }||k(  r||   || S ||   |d  g}|j                  ||dz   |        |t        |      k  r|j                  ||   d |        dj	                  |      S )Nr   Trx   )
splitlinesextendrj   r   r    )	rB  r  r  rv  rw  rx  ry  rE  r|   s	            r   r  r    s    JD$AIDJD$AIDd#Et|T{4%%4[ E	LLtAvd#$c%jU4[$'(775>r   zn%prog [OPTIONS] TEMPLATE arg=value

Use py:arg=value to set a Python value; otherwise all values are
strings.
c                 X   dd l }dd l}dd l}dd l}| |j                  dd  } |j                  d      }|j                  t        |      t              }|j                  ddddd	
       |j                  dddd       |j                  |       \  }} t        |       dk  rt        d        |j                  d       | d   }| dd  } i }	|j                  r|	j                  |j                          | D ]a  }
d|
vr t        d|
z          |j                  d       |
j#                  dd      \  }}
|j%                  d      r|d d }t'        |
      }
|
|	|<   c |dk(  r|j(                  j+                         }d}n%t-        |d      5 }|j+                         }d d d        t/        |      }|j1                  |	      }|j2                  r1t-        |j2                  d      5 }|j5                  |       d d d        y |j6                  j5                  |       y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r   Paste)r  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 filenamer`   r   zBad argument: %rrJ  r   -z<stdin>rU   r   wb)rG   optparsepkg_resourcesr2   argvget_distributionOptionParserr   _fill_command_usage
add_option
parse_argsrj   printexitr  rl   environr   rU  r   stdinrW   rV   r   rt   r  writestdout)r!   rG   r  r  r2   distparseroptionstemplate_namer   r   r   template_contentr\   r   rq   s                   r   fill_commandr    s&   |xx|))'2D""D!! # #F j7	  9
 <	  >
 %%d+MGT
4y1}12GM8DDBJJ e$u,-CHHQKkk#q)e??5!8DKET
 99>>+!-& 	(! vvx	((}=H  &F~~'..$' 	1GGFO	 	 	

 	( 	(
	 	s   HH H H)__main__r   )NTr   N)Nr   N)r(   );r'   
__future__r   r  rG   r2   rr  ior   _looperr   compat3r   r   r	   r
   r   r   __all__r  rf  Irh  r   r   r*   r.   r8   r   r   r   r   r   r   r   r   r   r  r  r*  r0  r2  r3  r5  r!  r   rM   rH  rX  r_  rY  rZ  r[  r\  rl  r  r  r  r$   r(   r   r   <module>r     s  > ' 	 
 	    P P
7

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