B
    \                 @   s  d Z ddlmZ ddlZddlZddlZyddlmZ W n  e	k
rX   ddl
mZ Y nX 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 d	d
dddddgZedZedejZG dd	 d	eZG dd deZG dd deZ dd Z!G dd
 d
e"Z#dXddZ$dYddZ%G dd de&Z'G dd de"Z(dZd d!Z)d"d# Z*d$d% Z+G d&d de#Z,d'd Z-G d(d) d)e"Z.G d*d+ d+e"Z/G d,d- d-e"Z0G d.d/ d/e"Z1e1 Z2[1d[d0d1Z3ed2Z4d3d4d5d6d7d8gZ5ed9Z6ed:Z7d;d< Z8d=d> Z9d\d?d@Z:d]dBdCZ;dDdE Z<dFdG Z=dHdI Z>dJdK Z?dLdM Z@dNdO ZAdPdQ ZBdRdS ZCdTZDd^dUdVZEeFdWkr|eE  dS )_a  
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)quote)StringIO   )looper)bytesunicode_basestring_next
is_unicodecoerce_textTemplateErrorTemplatesubHTMLTemplatesub_htmlhtmlbunchz\s+in\s+z^[a-z_][a-z0-9_]*$c               @   s"   e Zd ZdZdddZdd ZdS )r   z.Exception raised while parsing a template
    Nc             C   s   t | | || _|| _d S )N)	Exception__init__positionname)selfmessager   r    r   6lib/python3.7/site-packages/Cython/Tempita/_tempita.pyr   ;   s    zTemplateError.__init__c             C   sD   d | j}| jr,d|| jd | jd f }| jr@|d| j 7 }|S )N z%s at line %s column %sr   r   z in %s)joinargsr   r   )r   msgr   r   r   __str__@   s    zTemplateError.__str__)N)__name__
__module____qualname____doc__r   r    r   r   r   r   r   7   s   
c               @   s   e Zd ZdS )_TemplateContinueN)r!   r"   r#   r   r   r   r   r%   J   s   r%   c               @   s   e Zd ZdS )_TemplateBreakN)r!   r"   r#   r   r   r   r   r&   N   s   r&   c             C   s.   t jt j|j| }|jj||j|jdS )N)	namespaceget_template)	ospathr   dirnamer   	__class__from_filenamer'   r(   )r   Zfrom_templater*   r   r   r   get_file_templateR   s    r.   c               @   s   e Zd ZddedZdZdZd#ddZdddefd	d
Z	e
e	Z	dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" ZdS )$r   z{{z}})start_braces
end_bracesr   utf8Nr   c	             C   s>  || _ |d kr$| jd | jd f}n*| jj | _|d | jd< |d | jd< || _t|| _|d kr|d k	ryt|}	W n t	k
r   Y nfX |	j
}
|	j}d|
kr|
d }|ds|dr|d d }nd	|
kr|
d	 }nd
}|r|d| 7 }|| _t|||| jd| _|d kri }|| _|| _|d k	r:|| _d S )Nr/   r0   r   r   __file__z.pycz.pyor!   z<string>z:%s)r   line_offset
delimeters)contentdefault_namespacer,   copyr5   r   _unicodesys	_getframe
ValueError	f_globalsf_linenoendswithr   parse_parsedr'   r(   default_inherit)r   r6   r   r'   
stacklevelr(   rB   r4   r5   Zcallerglobalslinenor   r   r   r   d   sB    



zTemplate.__init__c             C   s:   t |d}| }|  |r(||}| |||||dS )Nrb)r6   r   r'   rB   r(   )openreadclosedecode)clsfilenamer'   encodingrB   r(   fcr   r   r   r-      s    

zTemplate.from_filenamec             C   s$   d| j jtt| dd  | jf S )Nz<%s %s name=%r>   )r,   r!   hexidr   )r   r   r   r   __repr__   s    zTemplate.__repr__c             O   s   |rL|rt dt|dkr$t dt|d dsDt d|d f |d }|}| j|d< | jrl|| j | |\}}}|s| j}|r| ||||}|S )Nz3You can only give positional *or* keyword argumentsr   z)You can only give one positional argumentr   itemszqIf you pass in a single argument, you must pass in a dictionary-like object (with a .items() method); you gave %rZ__template_name__)		TypeErrorlenhasattrr   r'   update
_interpretrB   _interpret_inherit)r   r   kwnsresultdefsinheritr   r   r   
substitute   s,    
zTemplate.substitutec             C   sH   d}g }i }| j | j|||d d|kr4|d}nd }d|||fS )NT)outr^   __inherit__ )_interpret_codesrA   popr   )r   r\   __traceback_hide__partsr^   r_   r   r   r   rY      s    zTemplate._interpretc       
      C   sr   d}| j stdd | jd|  || }t| j}x | D ]\}}	t|||	 q:W ||_| }||d< ||S )NTz:You cannot use inheritance without passing in get_template)r   r   r   )	r(   r   r   TemplateObjectrT   setattrbodyr8   r`   )
r   rj   r^   Zinherit_templater\   rf   ZtemplZself_r   valuer   r   r   rZ      s    
zTemplate._interpret_inheritc             C   s<   d}x2|D ]*}t |tr$|| q
| |||| q
W d S )NT)
isinstancer	   append_interpret_code)r   Zcodesr\   ra   r^   rf   itemr   r   r   rd      s
    

zTemplate._interpret_codesc             C   s  d}|d |d  }}|dkr4|  |d || n|dkrFt n|dkrXt n|dkr|d |d	 |d
   }}	}
| |	||}	| ||	|
||| n`|dkr|dd  }| |||| n8|dkr6|d d}| |d ||}x,|dd  D ]}| |||}||}qW || || n|dkrt|d |d	  }}	||kr| |	||}|||< n|dkr|d }	| |	||}||d< nd|dkr|d }|d	 }|d
 }t	| |||||d ||< ||< n |dkrd S dst
d| d S )NTr   r   pyrP   continuebreakfor      condexpr|defaultr_   rb   def)rj   r\   poscommentzUnknown code: %r)_execr%   r&   _eval_interpret_for_interpret_ifsplitrm   _reprTemplateDefAssertionError)r   coder\   ra   r^   rf   r   r{   varsrw   r6   rg   basepartfuncvarr]   rk   Z	signaturer   r   r   rn      sP    









zTemplate._interpret_codec          	   C   s   d}x|D ]}t |dkr(|||d < nHt |t |krPtdt |t |f xt||D ]\}	}
|
||	< q\W y| |||| W q
 tk
r   w
Y q
 tk
r   P Y q
X q
W d S )NTr   r   z&Need %i items to unpack (got %i items))rV   r<   ziprd   r%   r&   )r   r   rw   r6   r\   ra   r^   rf   ro   r   rk   r   r   r   r     s     
zTemplate._interpret_forc       
      C   sp   d}xf|D ]^}t |trt|d |d  }}|dkr<d}	n| |d ||}	|	r
| |d ||| P q
W d S )NTr   r   elserP   rt   )rl   r	   r   r~   rd   )
r   rg   r\   ra   r^   rf   r   r   r{   r]   r   r   r   r     s    
zTemplate._interpret_ifc          
   C   s   d}yFyt || j|}W n. tk
rF } ztd| W d d }~X Y nX |S  tk
r } z6t|dd rt|jd }nt|}| ||f|_ W d d }~X Y nX d S )NTz invalid syntax in expression: %sr   r   )evalr7   SyntaxErrorr   getattrr   r   _add_line_info)r   r   r\   r{   rf   rk   eZarg0r   r   r   r~   (  s    zTemplate._evalc          
   C   sn   d}yt || j| W nR tk
rh } z4|jrF| |jd |f|_n| d |f|_ W d d }~X Y nX d S )NTr   )execr7   r   r   r   )r   r   r\   r{   rf   r   r   r   r   r}   9  s    zTemplate._execc             C   sh  d}yn|d krdS | j rDyt|}W qp tk
r@   t|}Y qpX n,t|tsVt|}t|rp| jrp|	| j}W n: t
k
r } z| |jd |f|_ W d d }~X Y nX | j r.t|tr.| jstd| y|| j}W nF tk
r* } z&t|j|j|j|j|jd|  W d d }~X Y nX n2| j s`t|r`| jsTtd| |	| j}|S d S )NTrc   r   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))r9   r   UnicodeDecodeErrorr   rl   r	   r   r   default_encodingencoder   r   r   rJ   rM   objectstartendreasonUnicodeEncodeError)r   rk   r{   rf   r   r   r   r   r   D  sL    
$zTemplate._reprc             C   s.   d||d |d f }| j r*|d| j  7 }|S )Nz%s at line %s column %sr   r   z in file %s)r   )r   r   r{   r   r   r   r   n  s
    zTemplate._add_line_info)NNNNNr   N)r!   r"   r#   r   r7   r   rB   r   r.   r-   classmethodrS   r`   rY   rZ   rd   rn   r   r   r~   r}   r   r   r   r   r   r   r   Y   s.     
+	+*c             K   s"   | d}t| ||d}||S )N__name)r   r5   )getr   r`   )r6   r5   r[   r   tmplr   r   r   r   v  s    
c             C   s   t | |d}||S )N)r   )r   r`   )r6   r   rL   r   r   r   r   paste_script_template_renderer|  s    r   c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )r   c             K   s&   x |  D ]\}}t| || q
W d S )N)rT   ri   )r   r[   r   rk   r   r   r   r     s    zbunch.__init__c             C   s   || |< d S )Nr   )r   r   rk   r   r   r   __setattr__  s    zbunch.__setattr__c             C   s*   y| | S  t k
r$   t|Y nX d S )N)KeyErrorAttributeError)r   r   r   r   r   __getattr__  s    zbunch.__getattr__c             C   sD   d| kr4yt | |S  tk
r0   t | dS X nt | |S d S )Nry   )dict__getitem__r   )r   keyr   r   r   r     s    zbunch.__getitem__c             C   s(   d| j jddd t|  D f S )Nz<%s %s>r   c             S   s   g | ]\}}d ||f qS )z%s=%rr   ).0kvr   r   r   
<listcomp>  s    z"bunch.__repr__.<locals>.<listcomp>)r,   r!   r   sortedrT   )r   r   r   r   rS     s    zbunch.__repr__N)r!   r"   r#   r   r   r   r   rS   r   r   r   r   r     s
   	c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r   c             C   s
   || _ d S )N)rk   )r   rk   r   r   r   r     s    zhtml.__init__c             C   s   | j S )N)rk   )r   r   r   r   r      s    zhtml.__str__c             C   s   | j S )N)rk   )r   r   r   r   __html__  s    zhtml.__html__c             C   s   d| j j| jf S )Nz<%s %r>)r,   r!   rk   )r   r   r   r   rS     s    zhtml.__repr__N)r!   r"   r#   r   r    r   rS   r   r   r   r   r     s   Tc             C   s   |st | dr|  S | d kr"dS t| ts4t| } tjdkrft| trft	| 
dd} | d} nt	| d} tjdk rt| r| dd} | S )Nr   rc   3latin1r   asciixmlcharrefreplace)rW   r   rl   r	   r   r:   versionr   cgiescaperJ   r   r   )rk   Zforcer   r   r   
html_quote  s    

r   c             C   s"   t | } t| r| d} t| S )Nr1   )r   r   r   	url_quote)r   r   r   r   url  s    
r   c              K   sf   g }xRt |  D ]B\}}|d kr$q|dr:|d d }|dt|t|f  qW td|S )N_r3   z%s="%s"r   )r   rT   r?   rm   r   r   r   )r[   rg   r   rk   r   r   r   attr  s    
r   c               @   s4   e Zd Zej Zeeee	e
ed dd ZdS )r   )r   r   r   r   c             C   s>   t |dr| }d}nd}t| ||}|r6t|S |S d S )Nr   FT)rW   r   r   r   r   )r   rk   r{   r   Zplainr   r   r   r     s    
zHTMLTemplate._reprN)r!   r"   r#   r   r7   r8   rX   r   r   r   r   r   r   r   r   r   r   r     s   

c             K   s    | d}t| |d}||S )Nr   )r   )r   r   r`   )r6   r[   r   r   r   r   r   r     s    
c               @   s@   e Zd ZdddZdd Zdd Zdd	 Zdd
dZdd ZdS )r   Nc             C   s.   || _ || _|| _|| _|| _|| _|| _d S )N)	_template
_func_name_func_signature_body_ns_pos_bound_self)r   template	func_nameZfunc_signaturerj   r\   r{   
bound_selfr   r   r   r     s    zTemplateDef.__init__c             C   s   d| j | j| jj| jf S )Nz"<tempita function %s(%s) at %s:%s>)r   r   r   r   r   )r   r   r   r   rS     s    zTemplateDef.__repr__c             C   s   |  S )Nr   )r   r   r   r   r      s    zTemplateDef.__str__c             O   sZ   |  ||}| j }|| | jd k	r4| j|d< g }i }| j| j||| d|S )Nr   rc   )	_parse_signaturer   r8   rX   r   r   rd   r   r   )r   r   r[   valuesr\   ra   Zsubdefsr   r   r   __call__  s    



zTemplateDef.__call__c          	   C   s0   |d kr| S | j | j| j| j| j| j| j|dS )N)r   )r,   r   r   r   r   r   r   )r   objtyper   r   r   __get__  s
    zTemplateDef.__get__c             C   sT  i }| j \}}}}i }xF| D ]:\}	}
|s@|	|kr@td|	 |	|krR|
||< q |
||	< q W t|}t|}xv|rx|r|d |kr|d qvW |r|d}	|d||	< qp|rt|||< P qptdddd |D  qpW x4| D ](\}	}|	|kr| j|| j	| j
||	< qW x$|D ]}	|	|kr"td|	 q"W |rP|||< |S )NzUnexpected argument %sr   zExtra position arguments: %sz, c             S   s   g | ]}t |qS r   )repr)r   r   r   r   r   r   3  s    z0TemplateDef._parse_signature.<locals>.<listcomp>zMissing argument: %s)r   rT   rU   listre   tupler   r   r~   r   r   )r   r   r[   r   sig_argsZvar_argsvar_kwdefaultsZextra_kwr   rk   Z
value_exprr   r   r   r     sF    




zTemplateDef._parse_signature)N)N)	r!   r"   r#   r   rS   r    r   r   r   r   r   r   r   r     s   
	
r   c               @   s   e Zd Zdd Zdd ZdS )rh   c             C   s   || _ t| | _d S )N)_TemplateObject__nameTemplateObjectGetterr   )r   r   r   r   r   r   C  s    zTemplateObject.__init__c             C   s   d| j j| jf S )Nz<%s %s>)r,   r!   r   )r   r   r   r   rS   G  s    zTemplateObject.__repr__N)r!   r"   r#   r   rS   r   r   r   r   rh   A  s   rh   c               @   s$   e Zd Zdd Zdd Zdd ZdS )r   c             C   s
   || _ d S )N)#_TemplateObjectGetter__template_obj)r   Ztemplate_objr   r   r   r   M  s    zTemplateObjectGetter.__init__c             C   s   t | j|tS )N)r   r   Empty)r   r   r   r   r   r   P  s    z TemplateObjectGetter.__getattr__c             C   s   d| j j| jf S )Nz<%s around %r>)r,   r!   r   )r   r   r   r   rS   S  s    zTemplateObjectGetter.__repr__N)r!   r"   r#   r   r   rS   r   r   r   r   r   K  s   r   c               @   sJ   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Ze	j
dk rFeZdS )_Emptyc             O   s   | S )Nr   )r   r   r[   r   r   r   r   X  s    z_Empty.__call__c             C   s   dS )Nrc   r   )r   r   r   r   r    [  s    z_Empty.__str__c             C   s   dS )Nr   r   )r   r   r   r   rS   ^  s    z_Empty.__repr__c             C   s   dS )Nrc   r   )r   r   r   r   __unicode__a  s    z_Empty.__unicode__c             C   s   t dS )Nr   )iter)r   r   r   r   __iter__d  s    z_Empty.__iter__c             C   s   dS )NFr   )r   r   r   r   __bool__g  s    z_Empty.__bool__r   N)r!   r"   r#   r   r    rS   r   r   r   r:   r   Z__nonzero__r   r   r   r   r   W  s   
r   c             C   s  |dkrt jd t jd f}d}g }d}|d df}tdt|d t|d f }	x|	| D ]}
|
d}t| |
 ||}||d kr|rt	d|d  ||d	n&||d kr|st	d
|d  ||d	||d kr| ||

  }|r|| d}n|| ||

  |f d}|
 }|}qfW |rRt	d|d  ||d| |d }|rn|| |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/   r0   Fr   r   z%s|%sz%s inside expression)r   r   z%s outside expressionTzNo %s to finish last expression)r   r   )r   r7   recompiler   finditergroupfind_positionr   r   r   rm   trim_lex)sr   Ztrim_whitespacer4   r5   Zin_exprZchunkslastlast_posZtoken_rematchrw   r{   r   r   r   r   lexu  sL    




r   z.^(?:if |elif |for |def |inherit |default |py:)r   endifendforenddefrq   rr   z\n\r?[\t ]*$z	^[\t ]*\nc       	      C   s  d}xt | D ]\}}t|tr&q|d }t|sB|tkrBq|sLd}n| |d  }|d t| krnd}n| |d  }t|trt|tsq| pt|}|dkr| sd}|dk	r|d |kr| sd}|r|rt	|s|t| d kr| s|r^|dkr| r&|dkr4d| |d < n*t|}|d|
 d  }|| |d < |r|}|t| d kr| sd| |d < qt	|}|| d }|| |d < qW | 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   rc   r   TrP   r   )	enumeraterl   r	   statement_researchsingle_statementsrV   trail_whitespace_restriplead_whitespace_rer   r   )	tokensZ	last_trimiZcurrentro   prev
next_chunkZprev_okmr   r   r   r     sN    





r   c             C   sJ   |  d||}|dkr*|| d|| }n|d ||  }|d | |fS )z/Given a string and index, return (line, column)
r   r   )countrfind)stringindexZ
last_indexr   linescolumnr   r   r   r     s
    r   c             C   sV   |dkrt jd t jd f}t| |||d}g }x |rPt||\}}|| q2W |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/   r0   )r   r4   r5   )r   r7   r   
parse_exprrm   )r   r   r4   r5   r   r]   r   r   r   r   r@     s    2r@   r   c             C   s(  t | d tr"| d | dd  fS | d \}}| }|dr|dd  d}|dsf|dr|d}d|kr|dd}|dd	}|d7 }nd|krtd
||dd||f| dd  fS |dk rd|krtd||d||f| dd  fS |drt| ||S |ds(|dkrDtd| d  ||dn|dkrbtd| ||dn|dkrtd| ||dn|drt	| ||S |drt
| ||S |drt| ||S |drt| ||S |dr
d|| d d f| dd  fS d|| d d f| dd  fS )Nr   r   zpy:rt   z 	r   z
rc   z.Multi-line py blocks must start with a newline)r   r   rp   )rq   rr   rs   zcontinue outside of for loopzif zelif r   z%s outside of an if block)ifelifrs   z%s with no expression)r   r   r   zUnexpected %szfor zdefault zinherit zdef #r|   rw   )rl   r	   r   
startswithlstripreplacer   
parse_condr   	parse_forparse_defaultparse_inherit	parse_def)r   r   contextrw   r{   r   r   r   r   ;  sb    








r   c             C   s   | d d }g }|d }xj| s,t d||dt| d trf| d d dkrfd|ft| | dd  fS t| ||\}} || qW d S )Nr   r   )r   zMissing {{endif}})r   r   r   rv   )r   rl   r   parse_one_condrm   )r   r   r  r   piecesr   r   r   r   r  p  s    
r  c             C   s,  | d | dd   \}}} g }| dr4|d d }|drXd||dd   |f}nN|dr|d	||d
d   |f}n*|dkrd|d |f}ndstd||f x| std||dt| d tr
| d d dks| d d ds| d d dkr
|| fS t| ||\}} || qW d S )Nr   r   :r3   zif r   rt   zelif r      r   zUnexpected token %r at %szNo {{endif}})r   r   r   )	r?   r   r   r   r   rl   r   r   rm   )r   r   r  firstr{   r6   r   r   r   r   r   r    s.    



r  c       
      C   sH  | d \}}| dd  } d| }g }| ds2t|drH|d d }|dd   }t|}|sxtd| ||d	|d |  }d
|krtd| ||d	tdd |d |  	dD }||
 d  }xl| std||d	t| d tr&| d d dkr&d||||f| dd  fS t| ||\}	} ||	 qW d S )Nr   r   )rs   zfor r	  r3   rt   zBad for (no "in") in %r)r   r   (z=You cannot have () in the variable section of a for loop (%r)c             S   s   g | ]}|  r|  qS r   )r   )r   r   r   r   r   r     s    zparse_for.<locals>.<listcomp>,zNo {{endfor}}r   rs   )r   r   r?   r   in_rer   r   r   r   r   r   rl   r   rm   )
r   r   r  r  r{   r6   r   r   rw   r   r   r   r   r    s>    


"
r  c             C   s   | d \}}| dst|d dd }|dd}t|dkrTtd| ||d|d  }d|krvtd||dt|std	| ||d|d  }d
|||f| dd  fS )Nr   zdefault r   =z:Expression must be {{default var=value}}; no = found in %r)r   r   r  z'{{default x, y = ...}} is not supportedz-Not a valid variable name for {{default}}: %rry   )r   r   r   rV   r   r   var_rer   )r   r   r  r  r{   rg   r   rw   r   r   r   r    s&    


r  c             C   s@   | d \}}| dst|d dd }d||f| dd  fS )Nr   zinherit r   r_   )r   r   r   )r   r   r  r  r{   rw   r   r   r   r    s    r  c       
      C   s*  | d \}}| dd  } | ds&t|d dd }|drL|d d }d|krf|}dd d i f}nF|dstd	| ||d
n(|d d }|dd\}}t|||}|d }g }xl| std||d
t| d tr| d d dkrd||||f| dd  fS t| ||\}	} |	|	 qW d S )Nr   r   zdef r	  r3   r  r   )z*Function definition doesn't end with ): %s)r   r   )rz   zMissing {{enddef}}r   rz   )
r   r   r   r?   r   parse_signaturerl   r   r   rm   )
r   r   r  r  r   r   Zsigsig_textr6   r   r   r   r   r    s6    


r  c                sx  t t| j g }d }d }i }d fdd	}x:d }| \}	}
|	t jkrLP |	t jkrt|
dksf|
dkrt|
}| \}	}
|	t jkrtd|  ||d|
}| \}	}
|	t jks|	t jkr|
dkr|dkr|}n|dkr|}n
|| |	t jkr2P q2|d k	r
td|  ||d|	t jkr2|
d	kr2d }d }d
}d  }}g }x0|d\}	}
}}|d krV|}|}|	t jkr~|r~td|  ||d|s|	t jks|	t jkr|
dkrt	| ||}|||< || P ||	|
f |r|	t jkr|
|kr|d7 }nh|r.|	t jkr.|
|kr.|d8 }|sbd  }}n4|s8|	t jkr8|
dkr8|
}d}dddd| }q8W q2W ||||fS )NFc                s^   yt  \}}\}}\}}}W n tk
r8   tjdfS X | rR||||f||ffS ||fS d S )Nrc   )r
   StopIterationtokenize	ENDMARKER)r{   tok_type
tok_stringsrowscolerowecolline)r   r   r   	get_token  s    z"parse_signature.<locals>.get_token*z**zInvalid signature: (%s))r   r   r  r  r   Tr   )r  [{r  ]})F)
r  generate_tokensr   readliner  OPNAMEr   rm   isolate_expression)r  r   r{   r   Zvar_argr   r   r  Zvar_arg_typer  r  Zvar_nameZ	nest_typeZunnest_typeZ
nest_count	start_posend_posrg   r   r   Zdefault_exprr   )r   r   r    s~    	











"


r  c       	      C   s   |\}}|d8 }|\}}|d8 }|  d}||krB|| || S || |d  g}|||d |  |t|k r||| d |  d|S )Nr   Trc   )
splitlinesextendrV   rm   r   )	r   r)  r*  r  r  r  r  r   rg   r   r   r   r(  F  s    
r(  zn%prog [OPTIONS] TEMPLATE arg=value

Use py:arg=value to set a Python value; otherwise all values are
strings.
c             C   s  dd l }dd l}dd l}dd l}| d kr6|jdd  } |d}|jt|td}|j	ddddd	d
 |j	ddddd |j	ddddd |
| \}} t| dk rtd |d | d }| dd  } i }	|jr|	|j xd| D ]\}
d|
kr
td|
  |d |
dd\}}
|dr:|d d }t|
}
|
|	|< qW |dkr`|j }d}nt|d}| }|  |jrt}nt}|||d}||	}|jrt|jd}|| |  n|j| d S )Nr   r   ZPaste)r   Zusagez-oz--outputoutputZFILENAMEz(File to write output to (default stdout))destmetavarhelpz--htmluse_html
store_truez9Use HTML style filling (including automatic HTML quoting))r.  actionr0  z--envuse_envz-Put the environment in as top-level variablesz!You must give a template filenamerP   r  zBad argument: %rzpy:rt   -z<stdin>rF   )r   wb)r:   optparsepkg_resourcesr)   argvZget_distributionZOptionParserr   _fill_command_usageZ
add_option
parse_argsrV   printexitr4  rX   environr   r   r   stdinrH   rG   rI   r1  r   r   r`   r-  writestdout)r   r:   r7  r8  r)   ZdistparserZoptionsZtemplate_namer   rk   r   Ztemplate_contentrN   ZTemplateClassr   r]   r   r   r   fill_command]  sv    










rC  __main__)N)N)T)NTr   N)Nr   N)r   )N)Gr$   Z
__future__r   r   r:   r   Zurllibr   r   ImportErrorZurllib.parser)   r  ior   Z_looperr   Zcompat3r   r   r	   r
   r   r   __all__r   r  Ir  r   r   r%   r&   r.   r   r   r   r   r   r   r   r   r   r   r   r   r   rh   r   r   r   r   r   r   r   r   r   r   r@   r   r  r  r  r  r  r  r  r(  r:  rC  r!   r   r   r   r   <module>   sx    

  

"
M

?


:

=
5#L
@
