B
    raK                 @   st  d Z ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlm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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.    N)ast)compat)
exceptions)filters)utilc               @   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/tmp/pip-install-0_xzzbcd/Mako/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|   D ]}|  q
W d S )N)r   accept_visitor)noden)visitorr   r   traverse)   s    z%Node.accept_visitor.<locals>.traverse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| ddd| g | _i | _d S )N r   )superr    r   nodespage_attributes)r   r   )r   r   r   r   5   s    zTemplateNode.__init__c             C   s   | j S )N)r#   )r   r   r   r   r   :   s    zTemplateNode.get_childrenc             C   s   dt | j| jf S )NzTemplateNode(%s, %r))r   sorted_dict_reprr$   r#   )r   r   r   r   __repr__=   s    
zTemplateNode.__repr__)r   r   r   r   r   r   r&   __classcell__r   r   )r   r   r    1   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   textkeywordisendZ
is_primaryr#   _declared_identifiers_undeclared_identifiersr   ZPythonFragmentr   declared_identifiersundeclared_identifiers)r   r/   r0   r.   kwargscode)r   r   r   r   R   s    
zControlLine.__init__c             C   s   | j S )N)r#   )r   r   r   r   r   a   s    zControlLine.get_childrenc             C   s   | j S )N)r1   )r   r   r   r   r3   d   s    z ControlLine.declared_identifiersc             C   s   | j S )N)r2   )r   r   r   r   r4   g   s    z"ControlLine.undeclared_identifiersc             C   s0   |t ddgt ddgt dgd| 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_ternaryj   s
    

zControlLine.is_ternaryc             C   s   d| j | j| j| j| jff S )NzControlLine(%r, %r, %r, %r))r/   r.   r0   r	   r
   )r   r   r   r   r&   t   s
    zControlLine.__repr__)r   r   r   r   Zhas_loop_contextr   r   r3   r4   r=   r&   r'   r   r   )r   r   r(   D   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?   r5   )r   r   r   r      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   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   r6   )r   r.   rA   r5   )r   r   r   r      s    zCode.__init__c             C   s   | j jS )N)r6   r3   )r   r   r   r   r3      s    zCode.declared_identifiersc             C   s   | j jS )N)r6   r4   )r   r   r   r   r4      s    zCode.undeclared_identifiersc             C   s   d| j | j| j| jff S )NzCode(%r, %r, %r))r.   rA   r	   r
   )r   r   r   r   r&      s    zCode.__repr__)	r   r   r   r   r   r3   r4   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"   rC   r   r.   )r   r.   r5   )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   rC      s   rC   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"   rD   r   r.   escapesr   ArgumentListr   escapes_coderB   r6   )r   r.   rE   r5   )r   r   r   r      s
    zExpression.__init__c             C   s   g S )Nr   )r   r   r   r   r3      s    zExpression.declared_identifiersc             C   s,   | j j| jjttj | j j	S )N)
r6   r4   unionrG   
differencer;   r   DEFAULT_ESCAPESkeysr3   )r   r   r   r   r4      s    z!Expression.undeclared_identifiersc             C   s   d| j | jj| j| jff S )NzExpression(%r, %r, %r))r.   rG   argsr	   r
   )r   r   r   r   r&      s    zExpression.__repr__)	r   r   r   r   r   r3   r4   r&   r'   r   r   )r   r   rD      s
   rD   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| ||| d S )N__keyword__)r   	_classmaprN   r"   rM   r   )clsZclsnamebasesZdict_)r   r   r   r      s    z_TagMeta.__init__c          
   K   s   d|kr*| 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__CallNamespaceTagrM   rO   KeyErrorr   CompileException)rP   r/   
attributesr5   nsdefnamer   r   r   rU      s    z_TagMeta.__call__)r   r   r   r   rO   r   rU   r'   r   r   )r   r   rM      s   rM   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 )Tagzabstract base class for tags.

    e.g.::

        <%sometag/>

        <%someothertag>
            stuff
        </%someothertag>

    Nc                sx   t t jf | | _| _ ||  fdd|D }t|rhtjdd	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>0  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`   4  s    N)r"   r\   r   r/   rY   _parse_attributeslenr   rX   joinr   parentr#   )r   r/   rY   expressionsnonexpressionsrequiredr5   missing)r   )r   r   r     s    zTag.__init__c             C   s
   | j d kS )N)rg   )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dtj| j| D ]j}tdtj|}|rtj	|
d f| j}||j}|d|
d  qD|rD|t| qDW d|ptd| j|< q||krt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')r;   r]   rY   recompileSrS   matchr   rB   grouprstripr   rH   r4   appendrb   rf   searchr   rX   r/   !expression_undeclared_identifiers)	r   rh   ri   r4   keyexprxrc   r6   r   r   r   rd   @  s:    
zTag._parse_attributesc             C   s   g S )Nr   )r   r   r   r   r3   j  s    zTag.declared_identifiersc             C   s   | j S )N)rv   )r   r   r   r   r4   m  s    zTag.undeclared_identifiersc             C   s*   d| j j| jt| j| j| jf| jf S )Nz%s(%r, %s, %r, %r))	r   r   r/   r   r%   rY   r	   r
   r#   )r   r   r   r   r&   p  s    

zTag.__repr__)r   r   r   r   rN   r   rl   r   rd   r3   r4   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ddf| tjd|dd f| j| _d S )N)fileimportrL   r   )r|   z__DUMMY(%s)rL   r!   )r"   rz   r   r   rB   r<   r   	page_args)r   r/   rY   r5   )r   r   r   r   }  s    
zIncludeTag.__init__c             C   s   g S )Nr   )r   r   r   r   r3     s    zIncludeTag.declared_identifiersc                s2   | j jtdg| j j}|tt|  S )NZ__DUMMY)r~   r4   rI   r;   r3   rH   r"   rz   )r   Zidentifiers)r   r   r   r4     s
    
z!IncludeTag.undeclared_identifiers)r   r   r   rN   r   r3   r4   r'   r   r   )r   r   rz   z  s   rz   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df| |ddttt|  | _d|krXd|krXtj	d| j
d|krvd	|krvtj	d| j
d S )N)r|   )nameinheritabler}   moduler   r   z	__anon_%sr}   ?'name' and/or 'import' attributes are required for <%namespace>r|   r   4<%namespace> may only have one of 'file' or 'module')r   )r   )r"   r   r   r<   hexabsidr   r   rX   r   )r   r/   rY   r5   )r   r   r   r     s     
zNamespaceTag.__init__c             C   s   g S )Nr   )r   r   r   r   r3     s    z!NamespaceTag.declared_identifiers)r   r   r   rN   r   r3   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 )TextTagr.   c                s:   t t| j||dddf| tj|ddf| j| _d S )Nr   filterr!   )r"   r   r   r   rF   r<   r   filter_args)r   r/   rY   r5   )r   r   r   r     s    
zTextTag.__init__c             C   s   | j jtj | jS )N)r   r4   rI   r   rJ   rK   rH   rv   )r   r   r   r   r4     s    zTextTag.undeclared_identifiers)r   r   r   rN   r   r4   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d|rTtjd| jtj	d
| d f| j| _
| j
j| _|dd| _tj|ddf| j| _d S )Nbufferedcachedc             S   s   g | ]}| d r|qS )cache_)
startswith)r^   cr   r   r   r`     s    z#DefTag.__init__.<locals>.<listcomp>)r   r   	decorator)r   r   z^[\w_]+$Missing parenthesis in %defzdef z:passr   r!   r   )r   )r"   r   r   rn   rq   r   rX   r   r   ZFunctionDeclfunction_declfuncnamer   r<   r   rF   r   )r   r/   rY   r5   rh   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   r3     s    zDefTag.declared_identifiersc             C   s`   g }x*| j jD ]}|ttj|f| jj7 }qW t|| j	j
tj | j
| j jS )N)r   defaultslistr   rB   r   r4   r;   rH   r   rI   r   rJ   rK   rv   r   )r   resr   r   r   r   r4     s    zDefTag.undeclared_identifiers)r   r   r   rN   r   is_anonymousis_blockr   r   r   r3   r4   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df| |d}|r\td	|s\tjd| j|sz|dd rztjd| jt	j
|ddf| j| _|| _|dd| _t	j|ddf| j| _d S )Nr   r   rL   c             S   s   g | ]}| d r|qS )r   )r   )r^   r   r   r   r   r`   	  s    z%BlockTag.__init__.<locals>.<listcomp>)r   r   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<   rn   rq   r   rX   r   r   FunctionArgs	body_declr   r   rF   r   )r   r/   rY   r5   rh   r   )r   r   r   r     s.    


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   2  s    z!BlockTag.get_argument_expressionsc             C   s   | j jS )N)r   r   )r   r   r   r   r3   5  s    zBlockTag.declared_identifiersc             C   s   | j jtj | jS )N)r   r4   rI   r   rJ   rK   rH   rv   )r   r   r   r   r4   8  s    zBlockTag.undeclared_identifiers)r   r   r   rN   r   r   r   r   r   r   r3   r4   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|	ddf| j| _
d S )NrL   )rx   rx   r!   )r"   r   r   
expressionr   rB   r   r6   r   r<   r   )r   r/   rY   r5   )r   r   r   r   C  s    

zCallTag.__init__c             C   s   | j j| jjS )N)r6   r3   rH   r   r   )r   r   r   r   r3   M  s    zCallTag.declared_identifiersc             C   s   | j j| j jS )N)r6   r4   rI   r3   )r   r   r   r   r4   P  s    zCallTag.undeclared_identifiers)r   r   r   rN   r   r3   r4   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 )rV   c                s   t t| j|d | |t| d ddf| d||ddd | j D f | _t	j
| jf| j| _t	j|dd	f| j| _d S )
NrR   )rL   r   z	%s.%s(%s)ra   c             S   s$   g | ]\}}|d krd||f qS )rL   z%s=%sr   )r^   kvr   r   r   r`   f  s   z-CallNamespaceTag.__init__.<locals>.<listcomp>rL   r!   )r"   rV   r   tuplerK   rf   r]   itemsr   r   rB   r   r6   r   r<   r   )r   r   r[   rY   r5   )r   r   r   r   W  s     

zCallNamespaceTag.__init__c             C   s   | j j| jjS )N)r6   r3   rH   r   r   )r   r   r   r   r3   q  s    z%CallNamespaceTag.declared_identifiersc             C   s   | j j| j jS )N)r6   r4   rI   r3   )r   r   r   r   r4   t  s    z'CallNamespaceTag.undeclared_identifiers)r   r   r   r   r3   r4   r'   r   r   )r   r   rV   V  s   rV   c                   s    e Zd ZdZ fddZ  ZS )
InheritTagZinheritc                s    t t| j||dddf| d S )N)r|   r   )r"   r   r   )r   r/   rY   r5   )r   r   r   r   }  s    
zInheritTag.__init__)r   r   r   rN   r   r'   r   r   )r   r   r   z  s   r   c                   s(   e Zd ZdZ fddZdd Z  ZS )PageTagpagec                sn   ddddgdd |D  }t t| j|||ddf| tj|ddf| j| _tj|ddf| j| _	d S )	Nr   rL   Zexpression_filterZenable_loopc             S   s   g | ]}| d r|qS )r   )r   )r^   r   r   r   r   r`     s    z$PageTag.__init__.<locals>.<listcomp>r   r!   )
r"   r   r   r   r   r<   r   r   rF   r   )r   r/   rY   r5   rh   )r   r   r   r     s    
zPageTag.__init__c             C   s   | j jS )N)r   r   )r   r   r   r   r3     s    zPageTag.declared_identifiers)r   r   r   rN   r   r3   r'   r   r   )r   r   r     s   r   )r   rn   Zmakor   r   r   r   r   objectr   r    r(   r>   r@   rC   rD   rT   rM   with_metaclassr\   rz   r   r   r   r   r   rV   r   r   r   r   r   r   <module>   s0   9&" y?<$	