U
    e                     @   s  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 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dKdd
ZdLddZG dd de Z!G dd deZ"G dd deZ#G dd deZ$G d d! d!eZ%e% Z&[%dMd#d$Z'ed%Z(d&d'd(d)d*d+gZ)ed,Z*ed-Z+d.d/ Z,d0d1 Z-dNd2d3Z.dOd5d6Z/d7d8 Z0d9d: Z1d;d< Z2d=d> Z3d?d@ Z4dAdB Z5dCdD Z6dEdF Z7dGZ8dPdHdIZ9e:dJkre9  dS )Qa  
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                   @   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   ;/tmp/pip-unpacked-wheel-7k3cqui1/Cython/Tempita/_tempita.pyr   7   s    zTemplateError.__init__c                 C   sD   d | j}| jr,d|| jd | jd f }| jr@|d| j 7 }|S )N %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   3   s   
c                   @   s   e Zd ZdS )_TemplateContinueNr   r    r!   r   r   r   r   r#   F   s   r#   c                   @   s   e Zd ZdS )_TemplateBreakNr$   r   r   r   r   r%   J   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_templateN   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   sp  || _ |	r*dd l}
|
dt |d kr*|	}|d krH| jd | jd f}n*| jj | _|d | jd< |d | jd< | | _| _t	|| _
|d kr(|d k	r(zt|}W n tk
r   Y njX |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rPi }|| _|| _|d k	rl|| _d S )Nr   zk'delimeters' kwarg is being deprecated in favor of correctly spelled 'delimiters'. Please adjust your code.r.   r/   r   __file__z.pycz.pyor   z<string>z:%sr   line_offset
delimiters)contentwarningswarnDeprecationWarningdefault_namespacer+   copyr5   
delimetersr
   _unicodesys	_getframe
ValueError	f_globalsf_linenoendswithr   parse_parsedr&   r'   default_inherit)r   r6   r   r&   
stacklevelr'   rF   r4   r5   r<   r7   Zcallerglobalslinenor   r   r   r   `   sT    




zTemplate.__init__c              	   C   s>   t |d}| }W 5 Q R X |r,||}| |||||dS )Nrb)r6   r   r&   rF   r'   )openreaddecode)clsfilenamer&   encodingrF   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
_interpretrF   _interpret_inherit)r   r   kwnsresultdefsinheritr   r   r   
substitute   s4    
zTemplate.substitutec                 C   sH   d}g }i }| j | j|||d d|kr4|d}nd }d|||fS )NT)outrb   __inherit__ )_interpret_codesrE   popr   )r   r`   __traceback_hide__partsrb   rc   r   r   r   r]      s    zTemplate._interpretc           
      C   sn   d}| j stdd | jd|  || }t| j}| D ]\}}	t|||	 q8||_| }||d< ||S )NTz:You cannot use inheritance without passing in get_templater   r   r   )	r'   r   r   TemplateObjectrX   setattrbodyr;   rd   )
r   ro   rb   Zinherit_templater`   rj   ZtemplZself_r   valuer   r   r   r^      s     
zTemplate._interpret_inheritc                 C   s8   d}|D ]*}t |tr"|| q| |||| qd S )NT)
isinstancer   append_interpret_code)r   codesr`   re   rb   rj   itemr   r   r   rh      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  }| |||| n4|dkr2|d d}| |d ||}|dd  D ]}| |||}||}q || || n|dkrp|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st
d| d S )NTr   r   pyrS   continuebreakfor      condexpr|defaultrc   rf   def)ro   r`   poscommentzUnknown code: %r)_execr#   r%   _eval_interpret_for_interpret_ifsplitrr   _reprTemplateDefAssertionError)r   coder`   re   rb   rj   r   r   varsr}   r6   rk   basepartfuncvarra   rp   	signaturer   r   r   rs      sR    









zTemplate._interpret_codec              	   C   s   d}|D ]}t |dkr&|||d < nDt |t |krNtdt |t |f t||D ]\}	}
|
||	< qXz| |||| W q tk
r   Y qY q tk
r   Y  qY qX qd S )NTr   r   z&Need %i items to unpack (got %i items))rZ   r@   ziprh   r#   r%   )r   r   r}   r6   r`   re   rb   rj   ru   r   rp   r   r   r   r     s$    
zTemplate._interpret_forc           
      C   sn   d}|D ]`}t |trt|d |d  }}|dkr:d}	n| |d ||}	|	r| |d |||  qjqd S )NTr   r   elserS   rz   )rq   r   r   r   rh   )
r   rk   r`   re   rb   rj   r   r   r   ra   r   r   r   r     s    zTemplate._interpret_ifc              
   C   s   d}zHzt || j|}W n. tk
rF } ztd| W 5 d }~X Y nX |W S  tk
r } z6t|dd rv|jd }nt|}| ||f|_ W 5 d }~X Y nX d S )NTz invalid syntax in expression: %sr   r   )evalr:   SyntaxErrorr   getattrr   r   _add_line_info)r   r   r`   r   rj   rp   eZarg0r   r   r   r   ,  s    zTemplate._evalc              
   C   sn   d}zt || j| W nR tk
rh } z4|jrF| |jd |f|_n| d |f|_ W 5 d }~X Y nX d S )NTr   )execr:   r   r   r   )r   r   r`   r   rj   r   r   r   r   r   =  s    zTemplate._execc                 C   sj  d}zp|d krW dS | j rFzt|}W qr tk
rB   t|}Y qrX n,t|tsXt|}t|rr| jrr|	| j}W n: t
k
r } z| |jd |f|_ W 5 d }~X Y nX | j r0t|tr0| jstd| z|| j}W nF tk
r, } z&t|j|j|j|j|jd|  W 5 d }~X Y nX n2| j sbt|rb| jsVtd| |	| j}|S d S )NTrg   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))r=   r   UnicodeDecodeErrorr   rq   r   r   r
   default_encodingencoder   r   r   rM   rP   objectstartendreasonUnicodeEncodeError)r   rp   r   rj   r   r   r   r   r   H  sX    
zTemplate._reprc                 C   s.   d||d |d f }| j r*|d| j  7 }|S )Nr   r   r   z in file %sr   )r   r   r   r   r   r   r   r  s      zTemplate._add_line_info)NNNNNr   NN)r   r    r!   r   r:   r   rF   r   r-   r,   classmethodrW   rd   r]   r^   rh   rs   r   r   r   r   r   r   r   r   r   r   r   U   s<            
6 
	+*c                 K   s:   | d}d|kr|dnd }t| |||d}||S )NZ__namer<   )r   r5   r<   )getri   r   rd   )r6   r5   r_   r   r<   tmplr   r   r   r   z  s    
c                 C   s   t | |d}||S )Nr   )r   rd   )r6   r   rO   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"   |  D ]\}}t| || qd S r   )rX   rn   )r   r_   r   rp   r   r   r   r     s    zbunch.__init__c                 C   s   || |< d S r   r   )r   r   rp   r   r   r   __setattr__  s    zbunch.__setattr__c                 C   s,   z
| | W S  t k
r&   t|Y nX d S r   )KeyErrorAttributeErrorr   r   r   r   r   __getattr__  s    
zbunch.__getattr__c                 C   sJ   d| kr:zt | |W S  tk
r6   t | d Y S X nt | |S d S )Nr   )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 )N<%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   sortedrX   rV   r   r   r   rW     s    zbunch.__repr__N)r   r    r!   r   r   r   r   rW   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 r   )	_template
_func_name_func_signature_body_ns_pos_bound_self)r   template	func_nameZfunc_signaturero   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   rV   r   r   r   rW     s      zTemplateDef.__repr__c                 C   s   |  S r   r   rV   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   rg   )	_parse_signaturer   r;   r\   r   r   rh   r   r   )r   r   r_   valuesr`   re   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   s@  i }| j \}}}}i }| D ]:\}	}
|s>|	|kr>td|	 |	|krP|
||< q|
||	< qt|}t|}|r|r|d |kr|d qn|r|d}	|d||	< qj|rt|||< qqjtdddd |D  qj| D ](\}	}|	|kr| j|| j	| j
||	< q|D ]}	|	|krtd|	 q|r<|||< |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     s     z0TemplateDef._parse_signature.<locals>.<listcomp>zMissing argument: %s)r   rX   rY   listri   tupler   r   r   r   r   )r   r   r_   r   sig_argsZvar_argsvar_kwdefaultsextra_kwr   rp   Z
value_exprr   r   r   r     sT    


  

zTemplateDef._parse_signature)N)N)	r   r    r!   r   rW   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 )rm   c                 C   s   || _ t| | _d S r   )_TemplateObject__nameTemplateObjectGetterr   r   r   r   r   r     s    zTemplateObject.__init__c                 C   s   d| j j| jf S )Nr   )r+   r   r   rV   r   r   r   rW     s    zTemplateObject.__repr__N)r   r    r!   r   rW   r   r   r   r   rm     s   rm   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r   c                 C   s
   || _ d S r   )#_TemplateObjectGetter__template_obj)r   Ztemplate_objr   r   r   r     s    zTemplateObjectGetter.__init__c                 C   s   t | j|tS r   )r   r   Empty)r   attrr   r   r   r      s    z TemplateObjectGetter.__getattr__c                 C   s   d| j j| jf S )Nz<%s around %r>)r+   r   r   rV   r   r   r   rW     s    zTemplateObjectGetter.__repr__N)r   r    r!   r   r   rW   r   r   r   r   r     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 r   r   )r   r   r_   r   r   r   r     s    z_Empty.__call__c                 C   s   dS Nrg   r   rV   r   r   r   r     s    z_Empty.__str__c                 C   s   dS )Nr   r   rV   r   r   r   rW     s    z_Empty.__repr__c                 C   s   dS r   r   rV   r   r   r   __unicode__  s    z_Empty.__unicode__c                 C   s   t dS )Nr   )iterrV   r   r   r   __iter__  s    z_Empty.__iter__c                 C   s   dS )NFr   rV   r   r   r   __bool__  s    z_Empty.__bool__3N)r   r    r!   r   r   rW   r   r   r   r>   version__nonzero__r   r   r   r   r     s   
r   Tc                 C   sz  |dkrt jd t jd f}d}g }d}|d df}tdt|d t|d f }	|	| 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}|
 }|}qd|rLt	d|d  ||d| |d }|rh|| |rvt|}|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   z%s|%sz%s inside expressionrl   z%s outside expressionTzNo %s to finish last expression)r   r   )r   r:   recompileescapefinditergroupfind_positionr   r   r   rr   trim_lex)sr   Ztrim_whitespacer4   r5   Zin_exprchunkslastlast_posZtoken_rematchr}   r   r   r   r   r   lex%  sX    

 
r   z.^(?:if |elif |for |def |inherit |default |py:)r   endifendforenddefrw   rx   z\n\r?[\t ]*$z	^[\t ]*\nc           	      C   s  d}t | D ]\}}t|tr"q|d }t|s>|tkr>q|sHd}n| |d  }|d t| krjd}n| |d  }t|trt|tsq| pt|}|dkr| sd}|dk	r|d |kr| sd}|r| rt	| s|t| d kr| s|rZ|dkr| r"|dkr0d| |d < n*t|}|d|
 d  }|| |d < |r|}|t| d kr| sd| |d < qt	|}|| d }|| |d < q| 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   rg   r   TrS   r   )	enumeraterq   r   statement_researchsingle_statementsrZ   trail_whitespace_restriplead_whitespace_rer   r   )	tokensZ	last_trimicurrentru   prev
next_chunkZprev_okmr   r   r   r   j  s^    



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index
last_indexr   linescolumnr   r   r   r     s
    r   c                 C   sR   |dkrt jd t jd f}t| |||d}g }|rNt||\}}|| q0|S )a  
    Parses a string into a kind of AST

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

    Some exceptions::

        >>> parse('{{continue}}')
        Traceback (most recent call last):
            ...
        TemplateError: continue outside of for loop at line 1 column 3
        >>> parse('{{if x}}foo')
        Traceback (most recent call last):
            ...
        TemplateError: No {{endif}} at line 1 column 3
        >>> parse('{{else}}')
        Traceback (most recent call last):
            ...
        TemplateError: else outside of an if block at line 1 column 3
        >>> parse('{{if x}}{{for x in y}}{{endif}}{{endfor}}')
        Traceback (most recent call last):
            ...
        TemplateError: Unexpected endif at line 1 column 25
        >>> parse('{{if}}{{endif}}')
        Traceback (most recent call last):
            ...
        TemplateError: if with no expression at line 1 column 3
        >>> parse('{{for x y}}{{endfor}}')
        Traceback (most recent call last):
            ...
        TemplateError: Bad for (no "in") in 'x y' at line 1 column 3
        >>> parse('{{py:x=1\ny=2}}')
        Traceback (most recent call last):
            ...
        TemplateError: Multi-line py blocks must start with a newline at line 1 column 3
    Nr.   r/   r3   )r   r:   r   
parse_exprrr   )r   r   r4   r5   r   ra   r   r   r   r   rD     s    2rD   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   py:rz   z 	r   z
rg   z.Multi-line py blocks must start with a newlinerl   rv   )rw   rx   ry   zcontinue outside of for loopif elif r   z%s outside of an if block)ifelifry   z%s with no expression)r   r   r   zUnexpected %sfor default inherit def #r   r}   )rq   r   r   
startswithlstripreplacer   
parse_condr   	parse_forparse_defaultparse_inherit	parse_def)r   r   contextr}   r   r   r   r   r     sx    


 
  
 
 r   c                 C   s   | d d }g }|d }| s*t d||dt| d trd| d d dkrdd|ft| | dd  fS t| ||\}} || qd S )Nr   r   )r  zMissing {{endif}}rl   r   r|   )r   rq   r   parse_one_condrr   )r   r   r  r   piecesr   r   r   r   r     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 | std||dt| d tr| d d dks| d d ds| d d dkr|| fS t| ||\}} || qd S )Nr   r   :r2   r  r  rz   r  r     r   zUnexpected token %r at %szNo {{endif}}rl   r   )	rC   r  r  r   r   rq   r   r   rr   )r   r   r  firstr   r6   r   r   r   r   r   r  0  s6    


 r  c           
      C   sH  | d \}}| dd  } d| }g }| ds6t||drL|d d }|dd   }t|}|s|td| ||d	|d |  }d
|krtd| ||d	tdd |d |  	dD }||
 d  }| std||d	t| d tr(| d d dkr(d||||f| dd  fS t| ||\}	} ||	 qd S )Nr   r   )ry   r  r  r2   rz   zBad for (no "in") in %rrl   (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   ^  s   zparse_for.<locals>.<listcomp>,zNo {{endfor}}r   ry   )r  r   rC   r   in_rer   r   r   r   r   r   rq   r   rr   )
r   r   r  r  r   r6   r   r   r}   r   r   r   r   r  K  sP    

   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   r  r   =z:Expression must be {{default var=value}}; no = found in %rrl   r  z'{{default x, y = ...}} is not supportedz-Not a valid variable name for {{default}}: %rr   )r  r   r   rZ   r   r   var_rer   )r   r   r  r  r   rk   r   r}   r   r   r   r  n  s6      
 r  c                 C   s@   | d \}}| dst|d dd }d||f| dd  fS )Nr   r	  r   rc   )r  r   r   )r   r   r  r  r   r}   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 }| std||d
t| d tr| d d dkrd||||f| dd  fS t| ||\}	} |	|	 qd S )Nr   r   r
  r  r2   r  r   )z*Function definition doesn't end with ): %srl   )r   zMissing {{enddef}}r   r   )
r  r   r   rC   r   parse_signaturerq   r   r   rr   )
r   r   r  r  r   r   sigsig_textr6   r   r   r   r   r    s>    

  r  c                    sp  t t| j g }d }d }i }d fdd	}d }| \}	}
|	t jkrJqd|	t jkrr|
dksd|
dkrr|
}| \}	}
|	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r.qdq.|d k	r
td|  ||d|	t jkr.|
d	kr.d }d }d
}d  }}g }|d\}	}
}}|d krR|}|}|	t jkrz|rztd|  ||d|s|	t jks|	t jkr|
dkrt	| ||}|||< || q.||	|
f |r|	t jkr|
|kr|d7 }nh|r*|	t jkr*|
|kr*|d8 }|s^d  }}n4|s4|	t jkr4|
dkr4|
}d}dddd| }q4q.||||fS )NFc                    sb   zt  \}}\}}\}}}W n tk
r<   tjdf Y S X | rV||||f||ffS ||fS d S r   )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)rl   r  r  r   Tr   )r  [{r  ]})F)
r$  generate_tokensr   readliner%  OPNAMEr   rr   isolate_expression)r"  r   r   r   Zvar_argr   r   r.  Zvar_arg_typer&  r'  var_nameZ	nest_typeZunnest_typeZ
nest_count	start_posend_posrk   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   Trg   )
splitlinesextendrZ   rr   r   )	r   r:  r;  r(  r)  r*  r+  r   rk   r   r   r   r8    s    
r8  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 |
| \}} t| dk rtd |d | d }| dd  } i }	|jr|	|j | D ]Z}
d|
krtd|
  |d |
dd\}}
|dr$|d d }t|
}
|
|	|< q|dkrH|j }d}nt|d}| }W 5 Q R X t||d}||	}|jrt|jd}|| W 5 Q R X n|j| d S )Nr   r   ZPaste)r   usagez-oz--outputoutputZ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@  actionrB  z!You must give a template filenamerS   r  zBad argument: %rr  rz   -z<stdin>rJ   r   wb)r>   optparsepkg_resourcesr(   argvget_distributionOptionParserr   _fill_command_usage
add_option
parse_argsrZ   printexitrC  r\   environr   r  r   stdinrL   rK   r   rd   r?  writestdout)r   r>   rH  rI  r(   distparseroptionsZtemplate_namer   rp   r   Ztemplate_contentrQ   r   ra   r   r   r   fill_command  sj    
 





rY  __main__)N)N)NTr   N)Nr   N)r   )N);r"   
__future__r   r   r>   r(   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   rm   r   r   r   r   r   r   r   r   r   r   rD   r   r  r  r  r  r  r  r   r8  rM  rY  r   r   r   r   r   <module>   s`    
  '

M

?


:

=
5#L
5
