3
՛gY%K                 @   sT  d Z ddlmZmZmZmZmZ ddl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G dd de	ZG dd de	ZG dd deZG dd deje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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dS )(z5defines the parse tree components for Mako templates.    )
exceptionsastutilfilterscompatNc               @   s4   e Zd ZdZdd Zedd Zdd Zdd	 Zd
S )Nodez(base class for a Node in the parse tree.c             C   s   || _ || _|| _|| _d S )N)sourcelinenoposfilename)selfr   r	   r
   r    r   0/usr/lib/python3/dist-packages/mako/parsetree.py__init__   s    zNode.__init__c             C   s   | j | j| j| jdS )N)r   r	   r
   r   )r   r	   r
   r   )r   r   r   r   exception_kwargs   s    zNode.exception_kwargsc             C   s   g S )Nr   )r   r   r   r   get_children   s    zNode.get_childrenc                s,    fdd}t  d| jj |}||  d S )Nc                s    x| j  D ]}|j  q
W d S )N)r   accept_visitor)Znoden)visitorr   r   traverse    s    z%Node.accept_visitor.<locals>.traverseZvisit)getattr	__class____name__)r   r   r   methodr   )r   r   r      s    zNode.accept_visitorN)	r   
__module____qualname____doc__r   propertyr   r   r   r   r   r   r   r      s
   r   c                   s0   e Zd ZdZ fddZdd Zdd Z  ZS )TemplateNodez?a 'container' node that stores the overall collection of nodes.c                s&   t t| jddd| g | _i | _d S )N r   )superr   r   nodespage_attributes)r   r   )r   r   r   r   ,   s    zTemplateNode.__init__c             C   s   | j S )N)r!   )r   r   r   r   r   1   s    zTemplateNode.get_childrenc             C   s   dt j| j| jf S )NzTemplateNode(%s, %r))r   sorted_dict_reprr"   r!   )r   r   r   r   __repr__4   s    
zTemplateNode.__repr__)r   r   r   r   r   r   r$   __classcell__r   r   )r   r   r   (   s   r   c                   sL   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	dd Z
  ZS )ControlLinezdefines a control line, a line-oriented python line or end tag.

    e.g.::

        % if foo:
            (markup)
        % endif

    Fc                sl   t t| jf | || _|| _|| _|dk| _g | _| jrHg | _g | _	n t
j|f| j}|j| _|j| _	d S )Nforifwhiletrywith)r'   r(   r)   r*   r+   )r    r&   r   textkeywordisendZ
is_primaryr!   _declared_identifiers_undeclared_identifiersr   ZPythonFragmentr   declared_identifiersundeclared_identifiers)r   r-   r.   r,   kwargscode)r   r   r   r   H   s    
zControlLine.__init__c             C   s   | j S )N)r!   )r   r   r   r   r   W   s    zControlLine.get_childrenc             C   s   | j S )N)r/   )r   r   r   r   r1   Z   s    z ControlLine.declared_identifiersc             C   s   | j S )N)r0   )r   r   r   r   r2   ]   s    z"ControlLine.undeclared_identifiersc             C   s0   |t ddgt ddgt dgdj| jg kS )zRreturn true if the given keyword is a ternary keyword
        for this ControlLineelseelifexceptfinally)r(   r*   r'   )setgetr-   )r   r-   r   r   r   
is_ternary`   s
    

zControlLine.is_ternaryc             C   s   d| j | j| j| j| jff S )NzControlLine(%r, %r, %r, %r))r-   r,   r.   r	   r
   )r   r   r   r   r$   j   s
    zControlLine.__repr__)r   r   r   r   Zhas_loop_contextr   r   r1   r2   r;   r$   r%   r   r   )r   r   r&   :   s   

r&   c                   s(   e Zd ZdZ fddZdd Z  ZS )Textz#defines plain text in the template.c                s   t t| jf | || _d S )N)r    r<   r   content)r   r=   r3   )r   r   r   r   w   s    zText.__init__c             C   s   d| j | j| jff S )NzText(%r, %r))r=   r	   r
   )r   r   r   r   r$   {   s    zText.__repr__)r   r   r   r   r   r$   r%   r   r   )r   r   r<   s   s   r<   c                   s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
Codezdefines a Python code block, either inline or module level.

    e.g.::

        inline:
        <%
            x = 12
        %>

        module level:
        <%!
            import logger
        %>

    c                s4   t t| jf | || _|| _tj|f| j| _d S )N)	r    r>   r   r,   ismoduler   
PythonCoder   r4   )r   r,   r?   r3   )r   r   r   r      s    zCode.__init__c             C   s   | j jS )N)r4   r1   )r   r   r   r   r1      s    zCode.declared_identifiersc             C   s   | j jS )N)r4   r2   )r   r   r   r   r2      s    zCode.undeclared_identifiersc             C   s   d| j | j| j| jff S )NzCode(%r, %r, %r))r,   r?   r	   r
   )r   r   r   r   r$      s    zCode.__repr__)	r   r   r   r   r   r1   r2   r$   r%   r   r   )r   r   r>      s
   r>   c                   s(   e Zd ZdZ fddZdd Z  ZS )Commentz6defines a comment line.

    # this is a comment

    c                s   t t| jf | || _d S )N)r    rA   r   r,   )r   r,   r3   )r   r   r   r      s    zComment.__init__c             C   s   d| j | j| jff S )NzComment(%r, %r))r,   r	   r
   )r   r   r   r   r$      s    zComment.__repr__)r   r   r   r   r   r$   r%   r   r   )r   r   rA      s   rA   c                   s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )

Expressionz/defines an inline expression.

    ${x+y}

    c                sF   t t| jf | || _|| _tj|f| j| _tj	|f| j| _
d S )N)r    rB   r   r,   escapesr   ArgumentListr   escapes_coder@   r4   )r   r,   rC   r3   )r   r   r   r      s
    zExpression.__init__c             C   s   g S )Nr   )r   r   r   r   r1      s    zExpression.declared_identifiersc             C   s,   | j jj| jjjttjj j| j j	S )N)
r4   r2   unionrE   
differencer9   r   DEFAULT_ESCAPESkeysr1   )r   r   r   r   r2      s    z!Expression.undeclared_identifiersc             C   s   d| j | jj| j| jff S )NzExpression(%r, %r, %r))r,   rE   argsr	   r
   )r   r   r   r   r$      s    zExpression.__repr__)	r   r   r   r   r   r1   r2   r$   r%   r   r   )r   r   rB      s
   rB   c                   s,   e Zd ZdZi Z fddZdd Z  ZS )_TagMetazImetaclass to allow Tag to produce a subclass according to
    its keywordc                s4   t | dd d k	r| | j| j< tt| j||| d S )N__keyword__)r   	_classmaprL   r    rK   r   )clsZclsnamebasesdict)r   r   r   r      s    z_TagMeta.__init__c             K   s   d|kr*|j d\}}tjt|||f|S ytj| } W n< tk
rt   tjd| |d |d |d |d dY nX tj| ||f|S )N:zNo such tag: '%s'r   r	   r
   r   )r   r	   r
   r   )	splittype__call__CallNamespaceTagrK   rM   KeyErrorr   CompileException)rN   r-   
attributesr3   nsdefnamer   r   r   rT      s    

z_TagMeta.__call__)r   r   r   r   rM   r   rT   r%   r   r   )r   r   rK      s   rK   c                   sT   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	dd Z
dd Z  ZS )Tagzlabstract base class for tags.

    <%sometag/>

    <%someothertag>
        stuff
    </%someothertag>

    Nc                sx   t t jf | | _| _ j||  fdd|D }t|rhtjddj	dd |D  f j
d _g  _dS )aV  construct a new Tag instance.

        this constructor not called directly, and is only called
        by subclasses.

        :param keyword: the tag keyword

        :param attributes: raw dictionary of attribute key/value pairs

        :param expressions: a set of identifiers that are legal attributes,
         which can also contain embedded expressions

        :param nonexpressions: a set of identifiers that are legal
         attributes, which cannot contain embedded expressions

        :param \**kwargs:
         other arguments passed to the Node superclass (lineno, pos)

        c                s   g | ]}| j kr|qS r   )parsed_attributes).0r)r   r   r   
<listcomp>  s    z Tag.__init__.<locals>.<listcomp>zMissing attribute(s): %s,c             S   s   g | ]}t |qS r   )repr)r]   mr   r   r   r_      s    N)r    r[   r   r-   rX   _parse_attributeslenr   rW   joinr   parentr!   )r   r-   rX   expressionsnonexpressionsZrequiredr3   Zmissing)r   )r   r   r     s    zTag.__init__c             C   s
   | j d kS )N)rf   )r   r   r   r   is_root%  s    zTag.is_rootc             C   s   | j S )N)r!   )r   r   r   r   r   (  s    zTag.get_childrenc       	      C   sB  t  }i | _x(| jD ]}||krg }xtjdtjj| j| D ]j}tjdtjj|}|rtj	|j
dj f| j}|j|j}|jd|j
d  qD|rD|jt| qDW dj|ptd| j|< q||krtjd| j| rtjd|| jf f| jt| j| | j|< qtjd	| j|f f| jqW || _d S )
Nz	(\${.+?})z^\${(.+?)}$   z(%s)z + r   z\${.+?}z=Attibute '%s' in tag '%s' does not allow embedded expressionsz$Invalid attribute for tag '%s': '%s')r9   r\   rX   recompileSrR   matchr   r@   grouprstripr   rF   r2   appendra   re   searchr   rW   r-   !expression_undeclared_identifiers)	r   rg   rh   r2   keyexprxrb   r4   r   r   r   rc   +  s:    
zTag._parse_attributesc             C   s   g S )Nr   )r   r   r   r   r1   Q  s    zTag.declared_identifiersc             C   s   | j S )N)rs   )r   r   r   r   r2   T  s    zTag.undeclared_identifiersc             C   s*   d| j j| jtj| j| j| jf| jf S )Nz%s(%r, %s, %r, %r))	r   r   r-   r   r#   rX   r	   r
   r!   )r   r   r   r   r$   W  s
    

zTag.__repr__)r   r   r   r   rL   r   ri   r   rc   r1   r2   r$   r%   r   r   )r   r   r[      s   
"&r[   c                   s4   e Zd ZdZ fddZdd Z fddZ  ZS )
IncludeTagincludec                s>   t t| j||df df| tjd|jdd f| j| _d S )NfileimportrJ   z__DUMMY(%s)r   )ry   rz   rJ   )ry   )r    rw   r   r   r@   r:   r   	page_args)r   r-   rX   r3   )r   r   r   r   c  s    
zIncludeTag.__init__c             C   s   g S )Nr   )r   r   r   r   r1   m  s    zIncludeTag.declared_identifiersc                s2   | j jjtdgj| j j}|jtt| j S )NZ__DUMMY)r{   r2   rG   r9   r1   rF   r    rw   )r   Zidentifiers)r   r   r   r2   p  s    
z!IncludeTag.undeclared_identifiers)r   r   r   rL   r   r1   r2   r%   r   r   )r   r   rw   `  s   
rw   c                   s(   e Zd ZdZ fddZdd Z  ZS )NamespaceTag	namespacec                sz   t t| j||d	d
f f| |jddttt|  | _d|krXd|krXtj	d| j
d|krvd|krvtj	d| j
d S )Nry   nameinheritablerz   modulez	__anon_%s?'name' and/or 'import' attributes are required for <%namespace>4<%namespace> may only have one of 'file' or 'module')ry   )r~   r   rz   r   )r   )r   )r    r|   r   r:   hexabsidr~   r   rW   r   )r   r-   rX   r3   )r   r   r   r   {  s    
 
zNamespaceTag.__init__c             C   s   g S )Nr   )r   r   r   r   r1     s    z!NamespaceTag.declared_identifiers)r   r   r   rL   r   r1   r%   r   r   )r   r   r|   x  s   r|   c                   s(   e Zd ZdZ fddZdd Z  ZS )TextTagr,   c                s:   t t| j||f df f| tj|jddf| j| _d S )Nfilterr   )r    r   r   r   rD   r:   r   filter_args)r   r-   rX   r3   )r   r   r   r     s    
zTextTag.__init__c             C   s   | j jjtjj j| jS )N)r   r2   rG   r   rH   rI   rF   rs   )r   r   r   r   r2     s    zTextTag.undeclared_identifiers)r   r   r   rL   r   r2   r%   r   r   )r   r   r     s   	r   c                   sL   e Zd ZdZ fddZdZdZedd Zdd Z	d	d
 Z
dd Z  ZS )DefTagdefc                s   ddgdd |D  }t t| j|||ddf| |d }tjd|rTtjd| jtj	d
| d f| j| _
| j
j| _|jdd| _tj|jddf| j| _d S )Nbufferedcachedc             S   s   g | ]}|j d r|qS )cache_)
startswith)r]   cr   r   r   r_     s    z#DefTag.__init__.<locals>.<listcomp>r~   r   	decoratorz^[\w_]+$Missing parenthesis in %defzdef z:passr   )r~   r   r   )r~   )r   )r    r   r   rk   rn   r   rW   r   r   ZFunctionDeclfunction_declfuncnamer~   r:   r   rD   r   )r   r-   rX   r3   rg   r~   )r   r   r   r     s*    


zDefTag.__init__Fc             C   s   | j jS )N)r   r   )r   r   r   r   r     s    zDefTag.funcnamec             K   s   | j jf |S )N)r   get_argument_expressions)r   kwr   r   r   r     s    zDefTag.get_argument_expressionsc             C   s   | j jS )N)r   allargnames)r   r   r   r   r1     s    zDefTag.declared_identifiersc             C   s`   g }x*| j jD ]}|ttj|f| jj7 }qW t|j| j	jj
tjj j| jj
| j jS )N)r   Zdefaultslistr   r@   r   r2   r9   rF   r   rG   r   rH   rI   rs   r   )r   resr   r   r   r   r2     s    zDefTag.undeclared_identifiers)r   r   r   rL   r   is_anonymousis_blockr   r   r   r1   r2   r%   r   r   )r   r   r     s   r   c                   sT   e Zd ZdZ fddZdZedd Zedd Zd	d
 Z	dd Z
dd Z  ZS )BlockTagblockc                s   dddgdd |D  }t t| j|||df f| |jd}|r^tjd	| r^tjd| j| r~|jdd r~tjd| jt	j
|jddf| j| _|| _|jdd| _t	j|jddf| j| _d S )Nr   r   rJ   c             S   s   g | ]}|j d r|qS )r   )r   )r]   r   r   r   r   r_     s    z%BlockTag.__init__.<locals>.<listcomp>r~   r   r   z^[\w_]+$,%block may not specify an argument signature#Only named %blocks may specify argsr   )r~   r   r   )r   )r   )r    r   r   r:   rk   rn   r   rW   r   r   FunctionArgs	body_declr~   r   rD   r   )r   r-   rX   r3   rg   r~   )r   r   r   r     s2    


zBlockTag.__init__Tc             C   s
   | j d kS )N)r~   )r   r   r   r   r     s    zBlockTag.is_anonymousc             C   s   | j pd| jf S )Nz__M_anon_%d)r~   r	   )r   r   r   r   r     s    zBlockTag.funcnamec             K   s   | j jf |S )N)r   r   )r   r   r   r   r   r   
  s    z!BlockTag.get_argument_expressionsc             C   s   | j jS )N)r   r   )r   r   r   r   r1     s    zBlockTag.declared_identifiersc             C   s   | j jjtjj j| jS )N)r   r2   rG   r   rH   rI   rF   rs   )r   r   r   r   r2     s    zBlockTag.undeclared_identifiers)r   r   r   rL   r   r   r   r   r   r   r1   r2   r%   r   r   )r   r   r     s   r   c                   s0   e Zd ZdZ fddZdd Zdd Z  ZS )CallTagcallc                sX   t t| j||dddf| |d | _tj| jf| j| _tj|j	ddf| j| _
d S )NrJ   ru   r   )ru   )ru   )r    r   r   
expressionr   r@   r   r4   r   r:   r   )r   r-   rX   r3   )r   r   r   r     s    
zCallTag.__init__c             C   s   | j jj| jjS )N)r4   r1   rF   r   r   )r   r   r   r   r1   "  s    zCallTag.declared_identifiersc             C   s   | j jj| j jS )N)r4   r2   rG   r1   )r   r   r   r   r2   %  s    zCallTag.undeclared_identifiers)r   r   r   rL   r   r1   r2   r%   r   r   )r   r   r     s   r   c                   s,   e Zd Z fddZdd Zdd Z  ZS )rU   c                s   t t| j|d | |t|j d f f f| d||djdd | jj D f | _t	j
| jf| j| _t	j|jddf| j| _d S )	NrQ   rJ   z	%s.%s(%s)r`   c             S   s$   g | ]\}}|d krd||f qS )rJ   z%s=%sr   )r]   kvr   r   r   r_   8  s    z-CallNamespaceTag.__init__.<locals>.<listcomp>r   )rJ   )r    rU   r   tuplerI   re   r\   itemsr   r   r@   r   r4   r   r:   r   )r   r}   rZ   rX   r3   )r   r   r   r   ,  s     


zCallNamespaceTag.__init__c             C   s   | j jj| jjS )N)r4   r1   rF   r   r   )r   r   r   r   r1   A  s    z%CallNamespaceTag.declared_identifiersc             C   s   | j jj| j jS )N)r4   r2   rG   r1   )r   r   r   r   r2   D  s    z'CallNamespaceTag.undeclared_identifiers)r   r   r   r   r1   r2   r%   r   r   )r   r   rU   *  s   rU   c                   s    e Zd ZdZ fddZ  ZS )
InheritTagZinheritc                s    t t| j||df df| d S )Nry   )ry   )ry   )r    r   r   )r   r-   rX   r3   )r   r   r   r   L  s    
zInheritTag.__init__)r   r   r   rL   r   r%   r   r   )r   r   r   I  s   r   c                   s(   e Zd ZdZ fddZdd Z  ZS )PageTagZpagec                sn   ddddgdd |D  }t t| j|||f f f| tj|jddf| j| _tj|jddf| j| _	d S )Nr   rJ   Zexpression_filterZenable_loopc             S   s   g | ]}|j d r|qS )r   )r   )r]   r   r   r   r   r_   X  s    z$PageTag.__init__.<locals>.<listcomp>r   )
r    r   r   r   r   r:   r   r   rD   r   )r   r-   rX   r3   rg   )r   r   r   r   U  s    


zPageTag.__init__c             C   s   | j jS )N)r   r   )r   r   r   r   r1   g  s    zPageTag.declared_identifiers)r   r   r   rL   r   r1   r%   r   r   )r   r   r   R  s   r   )r   Zmakor   r   r   r   r   rk   objectr   r   r&   r<   r>   rA   rB   rS   rK   Zwith_metaclassr[   rw   r|   r   r   r   r   rU   r   r   r   r   r   r   <module>   s(   9&"j88	