ó
~9Vc           @   s´   d  Z  d d l m Z d d l m Z m Z d d l m Z m Z d d l	 m
 Z
 e d d d d	 d
 d d d d d g
 ƒ Z e d d d d d d g ƒ Z d e f d „  ƒ  YZ d S(   s¨   
    jinja2.parser
    ~~~~~~~~~~~~~

    Implements the template parser.

    :copyright: (c) 2010 by the Jinja Team.
    :license: BSD, see LICENSE for more details.
iÿÿÿÿ(   t   nodes(   t   TemplateSyntaxErrort   TemplateAssertionError(   t   describe_tokent   describe_token_expr(   t   imapt   fort   ift   blockt   extendst   printt   macrot   includet   fromt   importt   sett   eqt   net   ltt   lteqt   gtt   gteqt   Parserc           B   s$  e  Z d  Z d5 d5 d5 d „ Z d5 e d „ Z d „  Z d5 d „ Z d5 d5 d „ Z	 d5 d „ Z
 d5 d „ Z d „  Z e d	 „ Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e e d5 d „ Z e d „ Z d „  Z  d „  Z! d „  Z" d „  Z# d „  Z$ d „  Z% d  „  Z& d! „  Z' d" „  Z( d# „  Z) d$ „  Z* d% „  Z+ d& „  Z, e d' „ Z- d( „  Z. e e d5 e d) „ Z/ d* „  Z0 d+ „  Z1 d, „  Z2 d- „  Z3 d. „  Z4 d/ „  Z5 d0 „  Z6 e d1 „ Z7 d2 „  Z8 d5 d3 „ Z9 d4 „  Z: RS(6   s†   This is the central parsing class Jinja2 uses.  It's passed to
    extensions and can be used to parse expressions or statements.
    c         C   s¢   | |  _  | j | | | | ƒ |  _ | |  _ | |  _ t |  _ i  |  _ x8 | j ƒ  D]* } x! | j	 D] } | j
 |  j | <qe WqU Wd |  _ g  |  _ g  |  _ d  S(   Ni    (   t   environmentt	   _tokenizet   streamt   namet   filenamet   Falset   closedt
   extensionst   iter_extensionst   tagst   parset   _last_identifiert
   _tag_stackt   _end_token_stack(   t   selfR   t   sourceR   R   t   statet	   extensiont   tag(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   __init__   s    							c         C   s=   | d k r |  j j j } n  | | | |  j |  j ƒ ‚ d S(   s    Convenience method that raises `exc` with the message, passed
        line number or last line number as well as the current name and
        filename.
        N(   t   NoneR   t   currentt   linenoR   R   (   R%   t   msgR-   t   exc(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   fail+   s    c         C   s  g  } x$ | D] } | j  t t | ƒ ƒ q W| rS d j d „  | d Dƒ ƒ } n d  } | d  k rq d g } n d | g } | rÄ | d  k	 r° | | k r° | j d | ƒ qÄ | j d | ƒ n  |  j rè | j d |  j d ƒ n  |  j d	 j | ƒ | ƒ d  S(
   Ns    or c         s   s   |  ] } d  t  | ƒ Vq d S(   s   '%s'N(   R   (   t   .0t   expr(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pys	   <genexpr>:   s   iÿÿÿÿs   Unexpected end of template.s   Encountered unknown tag '%s'.s_   You probably made a nesting mistake. Jinja is expecting this tag, but currently looking for %s.s-   Jinja was looking for the following tags: %s.s4   The innermost block that needs to be closed is '%s'.t    (   t   extendR   R   t   joinR+   t   appendR#   R0   (   R%   R   t   end_token_stackR-   t   expectedt   exprst   currently_lookingt   message(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   _fail_ut_eof4   s*    				c         C   s   |  j  | |  j | ƒ S(   s¤   Called if the parser encounters an unknown tag.  Tries to fail
        with a human readable error message that could help to identify
        the problem.
        (   R<   R$   (   R%   R   R-   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   fail_unknown_tagS   s    c         C   s>   t  |  j ƒ } | d k	 r+ | j | ƒ n  |  j d | | ƒ S(   s9   Like fail_unknown_tag but for end of template situations.N(   t   listR$   R+   R6   R<   (   R%   t
   end_tokensR-   t   stack(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   fail_eofZ   s    c         C   s<   |  j  j j d k r t S| d k	 r8 |  j  j j | ƒ St S(   s   Are we at the end of a tuple?t   variable_endt	   block_endt   rparen(   RB   RC   RD   N(   R   R,   t   typet   TrueR+   t   test_anyR   (   R%   t   extra_end_rules(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   is_tuple_enda   s
    c         C   sE   |  j  d 7_  t j t j ƒ } t j j | d |  j  d | ƒ| S(   sD   Return a new free identifier as :class:`~jinja2.nodes.InternalName`.i   s   fi%dR-   (   R"   t   objectt   __new__R    t   InternalNamet   NodeR*   (   R%   R-   t   rv(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   free_identifieri   s     c         C   s  |  j  j } | j d k r1 |  j d | j ƒ n  |  j j | j ƒ t } z¶ | j t	 k ry t
 |  d |  j  j j ƒ ƒ  S| j d k r’ |  j ƒ  S| j d k r« |  j ƒ  S|  j j | j ƒ } | d k	 rÖ | |  ƒ S|  j j ƒ  t } |  j | j | j ƒ Wd | r|  j j ƒ  n  Xd S(   s   Parse a single statement.R   s   tag name expectedt   parse_t   callt   filterN(   R   R,   RE   R0   R-   R#   R6   t   valueRF   t   _statement_keywordst   getattrt   parse_call_blockt   parse_filter_blockR   t   getR+   t   popR   R=   (   R%   t   tokent   pop_tagt   ext(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   parse_statementp   s(    


c         C   sn   |  j  j d ƒ |  j  j d ƒ |  j | ƒ } |  j  j j d k rT |  j | ƒ n  | rj t |  j  ƒ n  | S(   sR  Parse multiple statements into a list until one of the end tokens
        is reached.  This is used to parse the body of statements as it also
        parses template data if appropriate.  The parser checks first if the
        current token is a colon and skips it if there is one.  Then it checks
        for the block end and parses until if one of the `end_tokens` is
        reached.  Per default the active token in the stream at the end of
        the call is the matched end token.  If this is not wanted `drop_needle`
        can be set to `True` and the end token is removed.
        t   colonRC   t   eof(   R   t   skip_ift   expectt   subparseR,   RE   RA   t   next(   R%   R?   t   drop_needlet   result(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   parse_statementsŒ   s    c         C   s}   t  |  j ƒ j } |  j ƒ  } |  j j d ƒ rR |  j ƒ  } t j | | d | ƒS|  j d d t	 ƒ} t j
 | | d | ƒS(   s   Parse an assign statement.t   assignR-   s   name:endsetRd   (   s   name:endset(   Rc   R   R-   t   parse_assign_targetR`   t   parse_tupleR    t   AssignRf   RF   t   AssignBlock(   R%   R-   t   targetR2   t   body(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt	   parse_set§   s    	c      	   C   sï   |  j  j d ƒ j } |  j d d ƒ } |  j  j d ƒ |  j d t d d ƒ } d } |  j  j d ƒ rv |  j ƒ  } n  |  j  j d ƒ } |  j	 d ƒ } t
 |  j  ƒ j d	 k r¸ g  } n |  j	 d d
 t ƒ} t j | | | | | | d | ƒS(   s   Parse a for loop.s   name:forRH   s   name:int   with_condexprs   name:recursives   name:ifs   name:endfors	   name:elset   endforRd   R-   (   s   name:in(   s   name:recursiveN(   s   name:endfors	   name:else(   s   name:endfor(   R   Ra   R-   Rh   Ri   R   R+   R`   t   parse_expressionRf   Rc   RS   RF   R    t   For(   R%   R-   Rl   t   itert   testt	   recursiveRm   t   else_(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt	   parse_for²   s    		c         C   sÛ   t  j d |  j j d ƒ j ƒ } } x¯ |  j d t ƒ | _ |  j d ƒ | _	 t
 |  j ƒ } | j d ƒ r  t  j d |  j j j ƒ } | g | _ | } q( n3 | j d ƒ rÊ |  j d	 d t ƒ| _ n	 g  | _ Pq( | S(
   s   Parse an if construct.R-   s   name:ifRo   s	   name:elifs	   name:elses
   name:endifRd   (   s	   name:elifs	   name:elses
   name:endif(   s
   name:endif(   R    t   IfR   Ra   R-   Ri   R   Rt   Rf   Rm   Rc   R,   Rv   RF   (   R%   t   nodeRe   RZ   t   new_node(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   parse_ifÅ   s"    %	c         C   s£   t  j d t |  j ƒ j ƒ } |  j j d ƒ j | _ |  j j d ƒ | _	 |  j j
 j d k rp |  j d ƒ n  |  j d	 d t ƒ| _ |  j j d | j ƒ | S(
   NR-   R   s   name:scopedt   subsp   Block names in Jinja have to be valid Python identifiers and may not contain hyphens, use an underscore instead.s   name:endblockRd   s   name:(   s   name:endblock(   R    t   BlockRc   R   R-   Ra   RS   R   R`   t   scopedR,   RE   R0   Rf   RF   Rm   (   R%   Ry   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   parse_blockÚ   s    c         C   s1   t  j d t |  j ƒ j ƒ } |  j ƒ  | _ | S(   NR-   (   R    t   ExtendsRc   R   R-   Rq   t   template(   R%   Ry   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   parse_extendsë   s    c         C   sh   |  j  j j d d ƒ r[ |  j  j ƒ  j d ƒ r[ t |  j  ƒ j d k | _ |  j  j ƒ  n	 | | _ | S(   Ns	   name:withs   name:withouts   name:contextt   with(	   R   R,   RG   t   lookRt   Rc   RS   t   with_contextt   skip(   R%   Ry   t   default(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   parse_import_contextð   s    	c         C   s   t  j d t |  j ƒ j ƒ } |  j ƒ  | _ |  j j j d ƒ rv |  j j	 ƒ  j d ƒ rv t
 | _ |  j j d ƒ n	 t | _ |  j | t
 ƒ S(   NR-   s   name:ignores   name:missingi   (   R    t   IncludeRc   R   R-   Rq   R   R,   Rt   R„   RF   t   ignore_missingR†   R   Rˆ   (   R%   Ry   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   parse_includeù   s    		c         C   se   t  j d t |  j ƒ j ƒ } |  j ƒ  | _ |  j j d ƒ |  j d t	 ƒ j
 | _ |  j | t ƒ S(   NR-   s   name:ast	   name_only(   R    t   ImportRc   R   R-   Rq   R   Ra   Rh   RF   R   Rl   Rˆ   R   (   R%   Ry   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   parse_import  s
    c            s‡  t  j d t ˆ j ƒ j ƒ ‰  ˆ j ƒ  ˆ  _ ˆ j j d ƒ g  ˆ  _ ‡  ‡ f d †  } xý ˆ  j rw ˆ j j d ƒ n  ˆ j j	 j
 d k rT| ƒ  r™ Pn  ˆ j d t ƒ } | j j d ƒ rÙ ˆ j d | j d	 t ƒn  ˆ j j d
 ƒ rˆ j d t ƒ } ˆ  j j | j | j f ƒ n ˆ  j j | j ƒ | ƒ  sMˆ j j	 j
 d k rUPqUq[ Pq[ t ˆ  d ƒ sƒt ˆ  _ ˆ j j d ƒ n  ˆ  S(   NR-   s   name:importc              s]   ˆ j  j j d k rY ˆ j  j ƒ  j d ƒ rY t ˆ j  ƒ j d k ˆ  _ ˆ j  j ƒ  t St	 S(   NRƒ   t   withouts   name:context(   s   withR   (
   R   R,   RS   R„   Rt   Rc   R…   R†   RF   R   (    (   Ry   R%   (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   parse_context  s    t   commaR   RŒ   t   _s4   names starting with an underline can not be importedR/   s   name:asR…   (   R    t
   FromImportRc   R   R-   Rq   R   Ra   t   namesR,   RE   Rh   RF   R   t
   startswithR0   R   R`   R6   t   hasattrR   R…   (   R%   R   Rl   t   alias(    (   Ry   R%   s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt
   parse_from  s6    					
	c         C   sÝ   g  | _  } g  | _ } |  j j d ƒ xœ |  j j j d k rÈ | r[ |  j j d ƒ n  |  j d t ƒ } | j d ƒ |  j j	 d ƒ r¢ | j
 |  j ƒ  ƒ n | r¸ |  j d ƒ n  | j
 | ƒ q- W|  j j d ƒ d  S(   Nt   lparenRD   R‘   RŒ   t   paramRg   s-   non-default argument follows default argument(   t   argst   defaultsR   Ra   R,   RE   Rh   RF   t   set_ctxR`   R6   Rq   R0   (   R%   Ry   R›   Rœ   t   arg(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   parse_signature2  s    c         C   s«   t  j d t |  j ƒ j ƒ } |  j j j d k rC |  j | ƒ n g  | _ g  | _	 |  j
 ƒ  | _ t | j t  j ƒ s |  j d | j ƒ n  |  j d d t ƒ| _ | S(   NR-   R™   s   expected calls   name:endcallRd   (   s   name:endcall(   R    t	   CallBlockRc   R   R-   R,   RE   RŸ   R›   Rœ   Rq   RQ   t
   isinstancet   CallR0   Rf   RF   Rm   (   R%   Ry   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRV   B  s    		c         C   sR   t  j d t |  j ƒ j ƒ } |  j d  d t ƒ| _ |  j	 d d t ƒ| _
 | S(   NR-   t   start_inlines   name:endfilterRd   (   s   name:endfilter(   R    t   FilterBlockRc   R   R-   t   parse_filterR+   RF   RR   Rf   Rm   (   R%   Ry   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRW   P  s
    c         C   s_   t  j d t |  j ƒ j ƒ } |  j d t ƒ j | _ |  j | ƒ |  j	 d d t ƒ| _
 | S(   NR-   RŒ   s   name:endmacroRd   (   s   name:endmacro(   R    t   MacroRc   R   R-   Rh   RF   R   RŸ   Rf   Rm   (   R%   Ry   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   parse_macroW  s    c         C   sy   t  j d t |  j ƒ j ƒ } g  | _  xK |  j j j d k rt | j  r[ |  j j d ƒ n  | j  j |  j	 ƒ  ƒ q* W| S(   NR-   RC   R‘   (
   R    t   OutputRc   R   R-   R,   RE   Ra   R6   Rq   (   R%   Ry   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   parse_print_  s    		c         C   s©   | r9 |  j  j d ƒ } t j | j d d | j ƒ} n: | rZ |  j d t d | ƒ } n |  j ƒ  } | j	 d ƒ | j
 ƒ  s¥ |  j d | j j j ƒ  | j ƒ n  | S(   s´  Parse an assignment target.  As Jinja2 allows assignments to
        tuples, this function can parse all allowed assignment targets.  Per
        default assignments to tuples are parsed, that can be disable however
        by setting `with_tuple` to `False`.  If only assignments to names are
        wanted `name_only` can be set to `True`.  The `extra_end_rules`
        parameter is forwarded to the tuple parsing function.
        R   t   storeR-   t
   simplifiedRH   s   can't assign to %r(   R   Ra   R    t   NameRS   R-   Ri   RF   t   parse_primaryR   t
   can_assignR0   t	   __class__t   __name__t   lower(   R%   t
   with_tupleRŒ   RH   RZ   Rl   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRh   h  s    	!c         C   s   | r |  j  ƒ  S|  j ƒ  S(   sº   Parse an expression.  Per default all expressions are parsed, if
        the optional `with_condexpr` parameter is set to `False` conditional
        expressions are not parsed.
        (   t   parse_condexprt   parse_or(   R%   Ro   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRq   €  s    
c         C   s•   |  j  j j } |  j ƒ  } xs |  j  j d ƒ r |  j ƒ  } |  j  j d ƒ r] |  j ƒ  } n d  } t j | | | d | ƒ} |  j  j j } q W| S(   Ns   name:ifs	   name:elseR-   (	   R   R,   R-   R´   R`   R³   R+   R    t   CondExpr(   R%   R-   t   expr1t   expr2t   expr3(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyR³   ‰  s    c         C   sk   |  j  j j } |  j ƒ  } xI |  j  j d ƒ rf |  j ƒ  } t j | | d | ƒ} |  j  j j } q W| S(   Ns   name:orR-   (   R   R,   R-   t	   parse_andR`   R    t   Or(   R%   R-   t   leftt   right(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyR´   –  s    c         C   sk   |  j  j j } |  j ƒ  } xI |  j  j d ƒ rf |  j ƒ  } t j | | d | ƒ} |  j  j j } q W| S(   Ns   name:andR-   (   R   R,   R-   t	   parse_notR`   R    t   And(   R%   R-   R»   R¼   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyR¹   Ÿ  s    c         C   sJ   |  j  j j d ƒ r@ t |  j  ƒ j } t j |  j ƒ  d | ƒS|  j ƒ  S(   Ns   name:notR-   (	   R   R,   Rt   Rc   R-   R    t   NotR½   t   parse_compare(   R%   R-   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyR½   ¨  s    c         C   s4  |  j  j j } |  j ƒ  } g  } xð |  j  j j } | t k rn t |  j  ƒ | j t j	 | |  j ƒ  ƒ ƒ n” |  j  j
 d ƒ r¢ | j t j	 d |  j ƒ  ƒ ƒ n` |  j  j j d ƒ r|  j  j ƒ  j d ƒ r|  j  j d ƒ | j t j	 d |  j ƒ  ƒ ƒ n P|  j  j j } q$ | s| St j | | d | ƒS(   Ns   name:int   ins   name:noti   t   notinR-   (   R   R,   R-   t	   parse_addRE   t   _compare_operatorsRc   R6   R    t   OperandR`   Rt   R„   R†   t   Compare(   R%   R-   R2   t   opst
   token_type(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRÀ   ®  s&    """c         C   s{   |  j  j j } |  j ƒ  } xY |  j  j j d k rv t |  j  ƒ |  j ƒ  } t j | | d | ƒ} |  j  j j } q W| S(   Nt   addR-   (   R   R,   R-   t	   parse_subRE   Rc   R    t   Add(   R%   R-   R»   R¼   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRÃ   Ä  s    c         C   s{   |  j  j j } |  j ƒ  } xY |  j  j j d k rv t |  j  ƒ |  j ƒ  } t j | | d | ƒ} |  j  j j } q W| S(   NR|   R-   (   R   R,   R-   t   parse_concatRE   Rc   R    t   Sub(   R%   R-   R»   R¼   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRÊ   Î  s    c         C   s‡   |  j  j j } |  j ƒ  g } x9 |  j  j j d k rY t |  j  ƒ | j |  j ƒ  ƒ q! Wt | ƒ d k rt | d St j	 | d | ƒS(   Nt   tildei   i    R-   (
   R   R,   R-   t	   parse_mulRE   Rc   R6   t   lenR    t   Concat(   R%   R-   R›   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRÌ   Ø  s    c         C   s{   |  j  j j } |  j ƒ  } xY |  j  j j d k rv t |  j  ƒ |  j ƒ  } t j | | d | ƒ} |  j  j j } q W| S(   Nt   mulR-   (   R   R,   R-   t	   parse_divRE   Rc   R    t   Mul(   R%   R-   R»   R¼   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRÏ   â  s    c         C   s{   |  j  j j } |  j ƒ  } xY |  j  j j d k rv t |  j  ƒ |  j ƒ  } t j | | d | ƒ} |  j  j j } q W| S(   Nt   divR-   (   R   R,   R-   t   parse_floordivRE   Rc   R    t   Div(   R%   R-   R»   R¼   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRÓ   ì  s    c         C   s{   |  j  j j } |  j ƒ  } xY |  j  j j d k rv t |  j  ƒ |  j ƒ  } t j | | d | ƒ} |  j  j j } q W| S(   Nt   floordivR-   (   R   R,   R-   t	   parse_modRE   Rc   R    t   FloorDiv(   R%   R-   R»   R¼   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRÖ   ö  s    c         C   s{   |  j  j j } |  j ƒ  } xY |  j  j j d k rv t |  j  ƒ |  j ƒ  } t j | | d | ƒ} |  j  j j } q W| S(   Nt   modR-   (   R   R,   R-   t	   parse_powRE   Rc   R    t   Mod(   R%   R-   R»   R¼   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRÙ      s    c         C   s{   |  j  j j } |  j ƒ  } xY |  j  j j d k rv t |  j  ƒ |  j ƒ  } t j | | d | ƒ} |  j  j j } q W| S(   Nt   powR-   (   R   R,   R-   t   parse_unaryRE   Rc   R    t   Pow(   R%   R-   R»   R¼   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRÜ   
  s    c         C   sÉ   |  j  j j } |  j  j j } | d k rX t |  j  ƒ t j |  j t ƒ d | ƒ} nF | d k r’ t |  j  ƒ t j	 |  j t ƒ d | ƒ} n |  j
 ƒ  } |  j | ƒ } | rÅ |  j | ƒ } n  | S(   NR|   R-   RÉ   (   R   R,   RE   R-   Rc   R    t   NegRß   R   t   PosR­   t   parse_postfixt   parse_filter_expr(   R%   t   with_filterRÈ   R-   Ry   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRß     s    !!c         C   s  |  j  j } | j d k r¦ | j d k rN t j | j d k d | j ƒ} nH | j d k rx t j d  d | j ƒ} n t j | j d	 d | j ƒ} t	 |  j  ƒ ne| j d
 k r7t	 |  j  ƒ | j g } | j } x< |  j  j j d
 k r| j
 |  j  j j ƒ t	 |  j  ƒ qÚ Wt j d j | ƒ d | ƒ} nÔ | j d k rqt	 |  j  ƒ t j | j d | j ƒ} nš | j d k r²t	 |  j  ƒ |  j d t ƒ } |  j  j d ƒ nY | j d k rÐ|  j ƒ  } n; | j d k rî|  j ƒ  } n |  j d t | ƒ | j ƒ | S(   NR   t   truet   falseRF   R   R-   t   noneR+   t   loadt   stringt    t   integert   floatR™   t   explicit_parenthesesRD   t   lbrackett   lbraces   unexpected '%s'(   s   trues   falses   Trues   False(   s   trues   True(   s   nones   None(   s   integers   float(   R   R,   RE   RS   R    t   ConstR-   R+   R¬   Rc   R6   R5   Ri   RF   Ra   t
   parse_listt
   parse_dictR0   R   (   R%   RZ   Ry   t   bufR-   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyR­   $  s<    	!c   	         s  ˆ  j  j j } | r! ˆ  j } n! | r3 ˆ  j } n ‡  f d †  } g  } t } xm | rj ˆ  j  j d ƒ n  ˆ  j | ƒ r} Pn  | j | ƒ  ƒ ˆ  j  j j	 d k r« t
 } n Pˆ  j  j j } qQ | sû | rÒ | d S| sû ˆ  j d t ˆ  j  j ƒ ƒ qû n  t j | d d | ƒS(   s©  Works like `parse_expression` but if multiple expressions are
        delimited by a comma a :class:`~jinja2.nodes.Tuple` node is created.
        This method could also return a regular expression instead of a tuple
        if no commas where found.

        The default parsing mode is a full tuple.  If `simplified` is `True`
        only names and literals are parsed.  The `no_condexpr` parameter is
        forwarded to :meth:`parse_expression`.

        Because tuples do not require delimiters and may end in a bogus comma
        an extra hint is needed that marks the end of a tuple.  For example
        for loops support tuples between `for` and `in`.  In that case the
        `extra_end_rules` is set to ``['name:in']``.

        `explicit_parentheses` is true if the parsing was triggered by an
        expression in parentheses.  This is used to figure out if an empty
        tuple is a valid expression or not.
        c              s   ˆ  j  d t ƒ S(   NRo   (   Rq   R   (    (   R%   (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   <lambda>`  s    R‘   i    s    Expected an expression, got '%s'Ré   R-   (   R   R,   R-   R­   Rq   R   Ra   RI   R6   RE   RF   R0   R   R    t   Tuple(	   R%   R«   Ro   RH   Rî   R-   R!   R›   t   is_tuple(    (   R%   s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRi   F  s2    		c         C   sŸ   |  j  j d ƒ } g  } x^ |  j  j j d k rx | rI |  j  j d ƒ n  |  j  j j d k rb Pn  | j |  j ƒ  ƒ q W|  j  j d ƒ t j | d | j ƒS(   NRï   t   rbracketR‘   R-   (	   R   Ra   R,   RE   R6   Rq   R    t   ListR-   (   R%   RZ   t   items(    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRò   }  s    c         C   sÖ   |  j  j d ƒ } g  } x• |  j  j j d k r¯ | rI |  j  j d ƒ n  |  j  j j d k rb Pn  |  j ƒ  } |  j  j d ƒ |  j ƒ  } | j t j | | d | j ƒƒ q W|  j  j d ƒ t j	 | d | j ƒS(   NRð   t   rbraceR‘   R^   R-   (
   R   Ra   R,   RE   Rq   R6   R    t   PairR-   t   Dict(   R%   RZ   Rú   t   keyRS   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRó   ‰  s    &c         C   sb   x[ |  j  j j } | d k s* | d k r< |  j | ƒ } q | d k rZ |  j | ƒ } q Pq | S(   Nt   dotRï   R™   (   R   R,   RE   t   parse_subscriptt
   parse_call(   R%   Ry   RÈ   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRã   ˜  s    c         C   s‰   x‚ |  j  j j } | d k r0 |  j | ƒ } q | d k rc |  j  j j d k rc |  j | ƒ } q | d k r |  j | ƒ } q Pq | S(   Nt   pipeR   t   isR™   (   R   R,   RE   R¥   RS   t
   parse_testR  (   R%   Ry   RÈ   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRä   ¥  s    !c         C   s›  t  |  j ƒ } | j d k rÁ |  j j } t  |  j ƒ | j d k re t j | | j d d | j ƒS| j d k rŠ |  j d | j ƒ n  t j	 | j d | j ƒ} t j
 | | d d | j ƒS| j d k r„g  } xE |  j j j d k r| r|  j j d	 ƒ n  | j |  j ƒ  ƒ qÙ W|  j j d ƒ t | ƒ d
 k rM| d } n t j | d d | j ƒ} t j
 | | d d | j ƒS|  j d |  j ƒ d  S(   NRÿ   R   Ré   R-   Rì   s   expected name or numberRï   Rø   R‘   i   i    s   expected subscript expression(   Rc   R   RE   R,   R    t   GetattrRS   R-   R0   Rñ   t   GetitemRa   R6   t   parse_subscribedRÐ   Rö   (   R%   Ry   RZ   t
   attr_tokenRž   R›   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyR   ´  s.    
c         C   sR  |  j  j j } |  j  j j d k r= t |  j  ƒ d  g } n; |  j ƒ  } |  j  j j d k rb | St |  j  ƒ | g } |  j  j j d k r | j d  ƒ n8 |  j  j j d k rÈ | j |  j ƒ  ƒ n | j d  ƒ |  j  j j d k r2t |  j  ƒ |  j  j j d k r"| j |  j ƒ  ƒ q?| j d  ƒ n | j d  ƒ t j	 d | | Œ S(   NR^   Rø   R‘   R-   (   s   rbrackets   comma(   s   rbrackets   comma(
   R   R,   R-   RE   Rc   R+   Rq   R6   R    t   Slice(   R%   R-   R›   Ry   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyR  Î  s*    	c   
         s'  ˆ  j  j d ƒ ‰ g  } g  } d  } } t } ‡  ‡ f d †  } x–ˆ  j  j j d k rØ| rŠ ˆ  j  j d ƒ ˆ  j  j j d k rŠ PqŠ n  ˆ  j  j j d k r× | | d  k o· | d  k ƒ t ˆ  j  ƒ ˆ  j ƒ  } nø ˆ  j  j j d k r| | d  k ƒ t ˆ  j  ƒ ˆ  j ƒ  } n· | | d  k o0| d  k ƒ ˆ  j  j j d k r±ˆ  j  j ƒ  j d k r±ˆ  j  j j	 } ˆ  j  j
 d	 ƒ ˆ  j ƒ  }	 | j t j | |	 d
 |	 j ƒƒ n | | ƒ | j ˆ  j ƒ  ƒ t } qC Wˆ  j  j d ƒ | d  k r| | | | f St j | | | | | d
 ˆ j ƒS(   NR™   c            s    |  s ˆ  j  d ˆ j ƒ n  d  S(   Ns+   invalid syntax for function call expression(   R0   R-   (   R2   (   R%   RZ   (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   ensureô  s    	RD   R‘   RÒ   RÞ   R   Rg   i   R-   (   R   Ra   R+   R   R,   RE   Rc   Rq   R„   RS   R†   R6   R    t   KeywordR-   RF   R¢   (
   R%   Ry   R›   t   kwargst   dyn_argst
   dyn_kwargst   require_commaR
  Rþ   RS   (    (   R%   RZ   s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyR  í  sF    

c   	   
   C   s  x|  j  j j d k s | r| s4 t |  j  ƒ n  |  j  j d ƒ } | j } xC |  j  j j d k r” t |  j  ƒ | d |  j  j d ƒ j 7} qR W|  j  j j d k rÈ |  j d  ƒ \ } } } } n g  } g  } d  } } t j	 | | | | | | d | j
 ƒ} t } q W| S(   NR  R   Rÿ   t   .R™   R-   (   R   R,   RE   Rc   Ra   RS   R  R+   R    t   FilterR-   R   (	   R%   Ry   R£   RZ   R   R›   R  R  R  (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyR¥     s"    	!

c   	   
   C   s˜  t  |  j ƒ } |  j j j d ƒ r: t  |  j ƒ t } n t } |  j j d ƒ j } xC |  j j j d k rš t  |  j ƒ | d |  j j d ƒ j 7} qX Wd  } } g  } |  j j j d k rÞ |  j
 d  ƒ \ } } } } nn |  j j j d k rF|  j j j d d d ƒ rF|  j j j d ƒ r4|  j d ƒ n  |  j ƒ  g } n g  } t j | | | | | | d | j ƒ} | r”t j | d | j ƒ} n  | S(   Ns   name:notR   Rÿ   R  R™   Rê   Rì   Rí   Rï   Rð   s	   name:elses   name:ors   name:ands   name:iss'   You cannot chain multiple tests with isR-   (   s   names   strings   integers   floats   lparens   lbrackets   lbrace(   Rc   R   R,   Rt   RF   R   Ra   RS   RE   R+   R  RG   R0   Rq   R    t   TestR-   R¿   (	   R%   Ry   RZ   t   negatedR   R  R  R  R›   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyR  0  s6    	!
 	
c            s¿  g  ‰  g  ‰ ˆ j  } | d  k	 r4 |  j j  | ƒ n  ‡  ‡ f d †  } zUxG|  j r’|  j j } | j d k r« | j r› | t j | j d | j	 ƒƒ n  t
 |  j ƒ qL | j d k rð t
 |  j ƒ | |  j d t ƒ ƒ |  j j d ƒ qL | j d k rƒ| ƒ  t
 |  j ƒ | d  k	 r8|  j j j | Œ  r8ˆ  S|  j ƒ  } t | t ƒ rcˆ  j | ƒ n ˆ  j  | ƒ |  j j d ƒ qL t d	 ƒ ‚ qL W| ƒ  Wd  | d  k	 rº|  j j ƒ  n  Xˆ  S(
   Nc             s;   ˆ r7 ˆ d j  }  ˆ  j t j ˆ d |  ƒƒ ˆ 2n  d  S(   Ni    R-   (   R-   R6   R    R¨   (   R-   (   Rm   t   data_buffer(    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt
   flush_dataW  s    t   dataR-   t   variable_beginRo   RB   t   block_beginRC   s   internal parsing error(   R6   R+   R$   R   R,   RE   RS   R    t   TemplateDataR-   Rc   Ri   RF   Ra   RG   R]   R¡   R>   R4   t   AssertionErrorRY   (   R%   R?   t   add_dataR  RZ   RN   (    (   Rm   R  s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyRb   O  sD    		c         C   s/   t  j |  j ƒ  d d ƒ} | j |  j ƒ | S(   s0   Parse the whole template into a `Template` node.R-   i   (   R    t   TemplateRb   t   set_environmentR   (   R%   Re   (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyR!     s    N(;   R°   t
   __module__t   __doc__R+   R*   R   R0   R<   R=   RA   RI   RO   R]   R   Rf   Rn   Rw   R{   R   R‚   Rˆ   R‹   RŽ   R˜   RŸ   RV   RW   R§   R©   RF   Rh   Rq   R³   R´   R¹   R½   RÀ   RÃ   RÊ   RÌ   RÏ   RÓ   RÖ   RÙ   RÜ   Rß   R­   Ri   Rò   Ró   Rã   Rä   R   R  R  R¥   R  Rb   R!   (    (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyR      sp   													'															
	
	
	
	
	
	
	
	"6							/	0N(   R  t   jinja2R    t   jinja2.exceptionsR   R   t   jinja2.lexerR   R   t   jinja2._compatR   t	   frozensetRT   RÄ   RJ   R   (    (    (    s-   /tmp/pip-build-zHWFj_/Jinja2/jinja2/parser.pyt   <module>
   s   