ó
 `¾Tc           @   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
 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   nextt   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(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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$   R1   (   R&   R   t   end_token_stackR.   t   expectedt   exprst   currently_lookingt   message(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt   _fail_ut_eof5   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.   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt   fail_unknown_tagT   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,   R7   R=   (   R&   t
   end_tokensR.   t   stack(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt   fail_eof[   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(   RC   RD   RE   N(   R   R-   t   typet   TrueR,   t   test_anyR   (   R&   t   extra_end_rules(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt   is_tuple_endb   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(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt   free_identifierj   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-   RF   R1   R.   R$   R7   t   valueRG   t   _statement_keywordst   getattrt   parse_call_blockt   parse_filter_blockR   t   getR,   t   popR   R>   (   R&   t   tokent   pop_tagt   ext(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt   parse_statementq   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   colonRD   t   eof(   R   t   skip_ift   expectt   subparseR-   RF   RB   R   (   R&   R@   t   drop_needlet   result(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt   parse_statements   s    c         C   sP   t  |  j ƒ j } |  j ƒ  } |  j j d ƒ |  j ƒ  } t j | | d | ƒS(   s   Parse an assign statement.t   assignR.   (   R   R   R.   t   parse_assign_targetRb   t   parse_tupleR    t   Assign(   R&   R.   t   targetR3   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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:forRI   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   Rb   R.   Rh   Ri   R   R,   Ra   t   parse_expressionRf   R   RT   RG   R    t   For(   R&   R.   Rk   t   itert   testt	   recursivet   bodyt   else_(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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:ifRm   s	   name:elifs	   name:elses
   name:endifRd   (   s	   name:elifs	   name:elses
   name:endif(   s
   name:endif(   R    t   IfR   Rb   R.   Ri   R   Rr   Rf   Rt   R   R-   Ru   RG   (   R&   t   nodeRe   R[   t   new_node(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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   BlockR   R   R.   Rb   RT   R   Ra   t   scopedR-   RF   R1   Rf   RG   Rt   (   R&   Rx   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt   parse_blockØ   s    c         C   s1   t  j d t |  j ƒ j ƒ } |  j ƒ  | _ | S(   NR.   (   R    t   ExtendsR   R   R.   Ro   t   template(   R&   Rx   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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-   RH   t   lookRr   R   RT   t   with_contextt   skip(   R&   Rx   t   default(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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   IncludeR   R   R.   Ro   R€   R-   Rr   Rƒ   RG   t   ignore_missingR…   R   R‡   (   R&   Rx   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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   ImportR   R   R.   Ro   R€   Rb   Rh   RG   R   Rk   R‡   R   (   R&   Rx   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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-   RT   Rƒ   Rr   R   R„   R…   RG   R   (    (   Rx   R&   (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt   parse_context  s    t   commaR   R‹   t   _s4   names starting with an underline can not be importedR0   s   name:asR„   (   R    t
   FromImportR   R   R.   Ro   R€   Rb   t   namesR-   RF   Rh   RG   R   t
   startswithR1   R   Ra   R7   t   hasattrR   R„   (   R&   R   Rk   t   alias(    (   Rx   R&   sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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  | j
 | ƒ q- W|  j j d ƒ d  S(   Nt   lparenRE   R   R‹   t   paramRg   (   t   argst   defaultsR   Rb   R-   RF   Rh   RG   t   set_ctxRa   R7   Ro   (   R&   Rx   Rš   R›   t   arg(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt   parse_signature0  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	   CallBlockR   R   R.   R-   RF   Rž   Rš   R›   Ro   RR   t
   isinstancet   CallR1   Rf   RG   Rt   (   R&   Rx   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyRW   >  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   FilterBlockR   R   R.   t   parse_filterR,   RG   RS   Rf   Rt   (   R&   Rx   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyRX   L  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   MacroR   R   R.   Rh   RG   R   Rž   Rf   Rt   (   R&   Rx   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt   parse_macroS  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.   RD   R   (
   R    t   OutputR   R   R.   R-   RF   Rb   R7   Ro   (   R&   Rx   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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
   simplifiedRI   s   can't assign to %r(   R   Rb   R    t   NameRT   R.   Ri   RG   t   parse_primaryRœ   t
   can_assignR1   t	   __class__t   __name__t   lower(   R&   t
   with_tupleR‹   RI   R[   Rk   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyRh   d  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&   Rm   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyRo   |  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³   Ra   R²   R,   R    t   CondExpr(   R&   R.   t   expr1t   expr2t   expr3(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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_andRa   R    t   Or(   R&   R.   t   leftt   right(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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_notRa   R    t   And(   R&   R.   Rº   R»   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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-   Rr   R   R.   R    t   NotR¼   t   parse_compare(   R&   R.   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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_addRF   t   _compare_operatorsR   R7   R    t   OperandRa   Rr   Rƒ   R…   t   Compare(   R&   R.   R3   t   opst
   token_type(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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_subRF   R   R    t   Add(   R&   R.   Rº   R»   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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_concatRF   R   R    t   Sub(   R&   R.   Rº   R»   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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_mulRF   R   R7   t   lenR    t   Concat(   R&   R.   Rš   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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_divRF   R   R    t   Mul(   R&   R.   Rº   R»   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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_floordivRF   R   R    t   Div(   R&   R.   Rº   R»   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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_modRF   R   R    t   FloorDiv(   R&   R.   Rº   R»   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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_powRF   R   R    t   Mod(   R&   R.   Rº   R»   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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_unaryRF   R   R    t   Pow(   R&   R.   Rº   R»   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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-   RF   R.   R   R    t   NegRÞ   R   t   PosR¬   t   parse_postfixt   parse_filter_expr(   R&   t   with_filterRÇ   R.   Rx   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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   falseRG   R   R.   t   noneR,   t   loadt   stringt    t   integert   floatR˜   t   explicit_parenthesesRE   t   lbrackett   lbraces   unexpected '%s'(   s   trues   falses   Trues   False(   s   trues   True(   Rç   s   None(   Rë   s   float(   R   R-   RF   RT   R    t   ConstR.   R,   R«   R   R7   R6   Ri   RG   Rb   t
   parse_listt
   parse_dictR1   R   (   R&   R[   Rx   t   bufR.   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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(   NRm   (   Ro   R   (    (   R&   (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt   <lambda>\  s    R   i    s    Expected an expression, got '%s'Rè   R.   (   R   R-   R.   R¬   Ro   R   Rb   RJ   R7   RF   RG   R1   R   R    t   Tuple(	   R&   Rª   Rm   RI   Rí   R.   R"   Rš   t   is_tuple(    (   R&   sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyRi   B  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   Rb   R-   RF   R7   Ro   R    t   ListR.   (   R&   R[   t   items(    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyRñ   y  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   Rb   R-   RF   Ro   R7   R    t   PairR.   t   Dict(   R&   R[   Rù   t   keyRT   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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-   RF   t   parse_subscriptt
   parse_call(   R&   Rx   RÇ   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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-   RF   R¤   RT   t
   parse_testR   (   R&   Rx   RÇ   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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(   R   R   RF   R-   R    t   GetattrRT   R.   R1   Rð   t   GetitemRb   R7   t   parse_subscribedRÏ   Rõ   (   R&   Rx   R[   t
   attr_tokenR   Rš   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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.   RF   R   R,   Ro   R7   R    t   Slice(   R&   R.   Rš   Rx   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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(   R1   R.   (   R3   (   R&   R[   (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt   ensureð  s    	RE   R   RÑ   RÝ   R   Rg   i   R.   (   R   Rb   R,   R   R-   RF   R   Ro   Rƒ   RT   R…   R7   R    t   KeywordR.   RG   R¡   (
   R&   Rx   Rš   t   kwargst   dyn_argst
   dyn_kwargst   require_commaR	  Rý   RT   (    (   R&   R[   sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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-   RF   R   Rb   RT   R   R,   R    t   FilterR.   R   (	   R&   Rx   R¢   R[   R   Rš   R  R  R  (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/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(   R   R   R-   Rr   RG   R   Rb   RT   RF   R,   R   RH   R1   Ro   R    t   TestR.   R¾   (	   R&   Rx   R[   t   negatedR   R  R  R  Rš   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyR  ,  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.   R7   R    R§   (   R.   (   Rt   t   data_buffer(    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt
   flush_dataS  s    t   dataR.   t   variable_beginRm   RC   t   block_beginRD   s   internal parsing error(   R7   R,   R%   R   R-   RF   RT   R    t   TemplateDataR.   R   Ri   RG   Rb   RH   R^   R    R?   R5   t   AssertionErrorRZ   (   R&   R@   t   add_dataR  R[   RO   (    (   Rt   R  sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyRc   K  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   TemplateRc   t   set_environmentR   (   R&   Re   (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyR"   {  s    N(;   R¯   t
   __module__t   __doc__R,   R+   R   R1   R=   R>   RB   RJ   RP   R^   R   Rf   Rl   Rv   Rz   R~   R   R‡   RŠ   R   R—   Rž   RW   RX   R¦   R¨   RG   Rh   Ro   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  Rc   R"   (    (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyR      sp   													'															
	
	
	
	
	
	
	
	"6							/	0N(   R  t   jinja2R    t   jinja2.exceptionsR   R   t   jinja2.lexerR   R   t   jinja2._compatR   R   t	   frozensetRU   RÃ   RK   R   (    (    (    sS   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/jinja2/parser.pyt   <module>
   s   