ó ÈÏRc @sºdZddlmZddlmZmZddlmZmZddl m Z m Z e dddd d d d d ddg ƒZ e ddddddgƒZdefd„ƒYZdS(s¨ jinja2.parser ~~~~~~~~~~~~~ Implements the template parser. :copyright: (c) 2010 by the Jinja Team. :license: BSD, see LICENSE for more details. iÿÿÿÿ(tnodes(tTemplateSyntaxErrortTemplateAssertionError(tdescribe_tokentdescribe_token_expr(tnexttimaptfortiftblocktextendstprinttmacrotincludetfromtimporttsetteqtnetlttlteqtgttgteqtParsercBs$eZdZd5d5d5d„Zd5ed„Zd„Zd5d„Zd5d5d„Z d5d„Z d5d„Z d„Z e d „Zd „Zd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zee d5d„Zed„Zd„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,ed'„Z-d(„Z.e ed5e d)„Z/d*„Z0d+„Z1d,„Z2d-„Z3d.„Z4d/„Z5d0„Z6e d1„Z7d2„Z8d5d3„Z9d4„Z:RS(6s†This is the central parsing class Jinja2 uses. It's passed to extensions and can be used to parse expressions or statements. cCs¢||_|j||||ƒ|_||_||_t|_i|_x8|jƒD]*}x!|j D]}|j |j|;siÿÿÿÿsUnexpected end of template.sEncountered 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.s4The innermost block that needs to be closed is '%s'.t (textendRRtjoinR,tappendR$R1(R&Rtend_token_stackR.texpectedtexprstcurrently_lookingtmessage((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt _fail_ut_eof5s*          cCs|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&RR.((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytfail_unknown_tagTscCs>t|jƒ}|dk r+|j|ƒn|jd||ƒS(s9Like fail_unknown_tag but for end of template situations.N(tlistR%R,R7R=(R&t end_tokensR.tstack((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytfail_eof[s cCs<|jjjdkrtS|dk r8|jjj|ƒStS(sAre we at the end of a tuple?t variable_endt block_endtrparen(RCRDREN(RR-ttypetTrueR,ttest_anyR(R&textra_end_rules((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt is_tuple_endbs  cCsE|jd7_tjtjƒ}tjj|d|jd|ƒ|S(sDReturn a new free identifier as :class:`~jinja2.nodes.InternalName`.isfi%dR.(R#tobjectt__new__Rt InternalNametNodeR+(R&R.trv((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytfree_identifierjs cCs|jj}|jdkr1|jd|jƒn|jj|jƒt}z¶|jt kryt |d|jjjƒƒS|jdkr’|j ƒS|jdkr«|j ƒS|j j|jƒ}|dk rÖ||ƒS|jjƒt}|j|j|jƒWd|r|jjƒnXdS(sParse a single statement.Rstag name expectedtparse_tcalltfilterN(RR-RFR1R.R$R7tvalueRGt_statement_keywordstgetattrtparse_call_blocktparse_filter_blockRtgetR,tpopRR>(R&ttokentpop_tagtext((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytparse_statementqs(      cCsn|jjdƒ|jjdƒ|j|ƒ}|jjjdkrT|j|ƒn|rjt|jƒn|S(sRParse 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. tcolonRDteof(Rtskip_iftexpecttsubparseR-RFRBR(R&R@t drop_needletresult((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytparse_statementss cCsPt|jƒj}|jƒ}|jjdƒ|jƒ}tj||d|ƒS(sParse an assign statement.tassignR.(RRR.tparse_assign_targetRbt parse_tupleRtAssign(R&R.ttargetR3((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_set¨s   c Csï|jjdƒj}|jdd ƒ}|jjdƒ|jdtdd ƒ}d}|jjdƒrv|jƒ}n|jjdƒ}|j dƒ}t |jƒj d kr¸g}n|j dd t ƒ}t j||||||d |ƒS(sParse a for loop.sname:forRIsname:int with_condexprsname:recursivesname:ifs name:endfors name:elsetendforRdR.(sname:in(sname:recursiveN(s name:endfors name:else(s name:endfor(RRbR.RhRiRR,Ratparse_expressionRfRRTRGRtFor(R&R.Rktiterttestt recursivetbodytelse_((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_for°s  cCsÛtjd|jjdƒjƒ}}x¯|jdtƒ|_|jdƒ|_ t |jƒ}|jdƒr tjd|jj jƒ}|g|_ |}q(n3|jdƒrÊ|jd dt ƒ|_ n g|_ Pq(|S( sParse an if construct.R.sname:ifRms name:elifs name:elses name:endifRd(s name:elifs name:elses name:endif(s name:endif(RtIfRRbR.RiRRrRfRtRR-RuRG(R&tnodeReR[tnew_node((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytparse_ifÃs"%    cCs£tjdt|jƒjƒ}|jjdƒj|_|jjdƒ|_ |jj j dkrp|j dƒn|j d dtƒ|_|jjd|jƒ|S( NR.Rs name:scopedtsubspBlock names in Jinja have to be valid Python identifiers and may not contain hyphens, use an underscore instead.s name:endblockRdsname:(s name:endblock(RtBlockRRR.RbRTRRatscopedR-RFR1RfRGRt(R&Rx((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_blockØscCs1tjdt|jƒjƒ}|jƒ|_|S(NR.(RtExtendsRRR.Rottemplate(R&Rx((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_extendséscCsh|jjjddƒr[|jjƒjdƒr[t|jƒjdk|_|jjƒn ||_|S(Ns name:withs name:withouts name:contexttwith( RR-RHtlookRrRRTt with_contexttskip(R&Rxtdefault((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytparse_import_contextîs  cCstjdt|jƒjƒ}|jƒ|_|jjjdƒrv|jj ƒjdƒrvt |_ |jj dƒn t |_ |j|t ƒS(NR.s name:ignores name:missingi(RtIncludeRRR.RoR€R-RrRƒRGtignore_missingR…RR‡(R&Rx((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_include÷s  cCsetjdt|jƒjƒ}|jƒ|_|jjdƒ|jdt ƒj |_ |j |t ƒS(NR.sname:ast name_only(RtImportRRR.RoR€RbRhRGRRkR‡R(R&Rx((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_imports cs‡tjdtˆjƒjƒ‰ˆjƒˆ_ˆjjdƒgˆ_‡‡fd†}xýˆjrwˆjjdƒnˆjj j dkrT|ƒr™Pnˆj dt ƒ}|j jdƒrÙˆjd|jd tƒnˆjjd ƒrˆj dt ƒ}ˆjj|j |j fƒnˆjj|j ƒ|ƒsMˆjj j dkrUPqUq[Pq[tˆd ƒsƒtˆ_ˆjjdƒnˆS( NR.s name:importcs]ˆjjjdkrYˆjjƒjdƒrYtˆjƒjdkˆ_ˆjjƒtSt S(NR‚twithouts name:context(swithRŽ( RR-RTRƒRrRR„R…RGR((RxR&(s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_contexts  tcommaRR‹t_s4names starting with an underline can not be importedR0sname:asR„(Rt FromImportRRR.RoR€RbtnamesR-RFRhRGRt startswithR1RRaR7thasattrRR„(R&RRktalias((RxR&s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_from s6       cCsÇg|_}g|_}|jjdƒx†|jjjdkr²|r[|jjdƒn|jdtƒ}|jdƒ|jj dƒr¢|j |j ƒƒn|j |ƒq-W|jjdƒdS(NtlparenRERR‹tparamRg( targstdefaultsRRbR-RFRhRGtset_ctxRaR7Ro(R&RxRšR›targ((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytparse_signature0s   cCs«tjdt|jƒjƒ}|jjjdkrC|j|ƒng|_g|_ |j ƒ|_ t |j tj ƒs|jd|jƒn|jddtƒ|_|S(NR.R˜s expected calls name:endcallRd(s name:endcall(Rt CallBlockRRR.R-RFRžRšR›RoRRt isinstancetCallR1RfRGRt(R&Rx((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRW>s  cCsRtjdt|jƒjƒ}|jddtƒ|_|j ddtƒ|_ |S(NR.t start_inlinesname:endfilterRd(sname:endfilter( Rt FilterBlockRRR.t parse_filterR,RGRSRfRt(R&Rx((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRXLs   cCs_tjdt|jƒjƒ}|jdtƒj|_|j|ƒ|j ddtƒ|_ |S(NR.R‹s name:endmacroRd(s name:endmacro( RtMacroRRR.RhRGRRžRfRt(R&Rx((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_macroSs    cCsytjdt|jƒjƒ}g|_xK|jjjdkrt|jr[|jjdƒn|jj|j ƒƒq*W|S(NR.RDR( RtOutputRRR.R-RFRbR7Ro(R&Rx((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_print[s  cCs©|r9|jjdƒ}tj|jdd|jƒ}n:|rZ|jdtd|ƒ}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. RtstoreR.t simplifiedRIscan't assign to %r(RRbRtNameRTR.RiRGt parse_primaryRœt can_assignR1t __class__t__name__tlower(R&t with_tupleR‹RIR[Rk((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRhds !     cCs|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. (tparse_condexprtparse_or(R&Rm((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRo|s cCs•|jjj}|jƒ}xs|jjdƒr|jƒ}|jjdƒr]|jƒ}nd}tj|||d|ƒ}|jjj}qW|S(Nsname:ifs name:elseR.( RR-R.R³RaR²R,RtCondExpr(R&R.texpr1texpr2texpr3((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR²…s  cCsk|jjj}|jƒ}xI|jjdƒrf|jƒ}tj||d|ƒ}|jjj}qW|S(Nsname:orR.(RR-R.t parse_andRaRtOr(R&R.tlefttright((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR³’s  cCsk|jjj}|jƒ}xI|jjdƒrf|jƒ}tj||d|ƒ}|jjj}qW|S(Nsname:andR.(RR-R.t parse_notRaRtAnd(R&R.RºR»((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR¸›s  cCsJ|jjjdƒr@t|jƒj}tj|jƒd|ƒS|jƒS(Nsname:notR.( RR-RrRR.RtNotR¼t parse_compare(R&R.((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR¼¤scCs4|jjj}|jƒ}g}xð|jjj}|tkrnt|jƒ|jtj ||jƒƒƒn”|jj dƒr¢|jtj d|jƒƒƒn`|jjj dƒr|jj ƒj dƒr|jj dƒ|jtj d|jƒƒƒnP|jjj}q$|s|Stj||d|ƒS(Nsname:intinsname:notitnotinR.(RR-R.t parse_addRFt_compare_operatorsRR7RtOperandRaRrRƒR…tCompare(R&R.R3topst token_type((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR¿ªs&   """cCs{|jjj}|jƒ}xY|jjjdkrvt|jƒ|jƒ}tj||d|ƒ}|jjj}qW|S(NtaddR.(RR-R.t parse_subRFRRtAdd(R&R.RºR»((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRÂÀs   cCs{|jjj}|jƒ}xY|jjjdkrvt|jƒ|jƒ}tj||d|ƒ}|jjj}qW|S(NR{R.(RR-R.t parse_concatRFRRtSub(R&R.RºR»((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRÉÊs   cCs‡|jjj}|jƒg}x9|jjjdkrYt|jƒ|j|jƒƒq!Wt|ƒdkrt|dStj |d|ƒS(NttildeiiR.( RR-R.t parse_mulRFRR7tlenRtConcat(R&R.Rš((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRËÔs cCs{|jjj}|jƒ}xY|jjjdkrvt|jƒ|jƒ}tj||d|ƒ}|jjj}qW|S(NtmulR.(RR-R.t parse_divRFRRtMul(R&R.RºR»((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRÎÞs   cCs{|jjj}|jƒ}xY|jjjdkrvt|jƒ|jƒ}tj||d|ƒ}|jjj}qW|S(NtdivR.(RR-R.tparse_floordivRFRRtDiv(R&R.RºR»((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRÒès   cCs{|jjj}|jƒ}xY|jjjdkrvt|jƒ|jƒ}tj||d|ƒ}|jjj}qW|S(NtfloordivR.(RR-R.t parse_modRFRRtFloorDiv(R&R.RºR»((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRÕòs   cCs{|jjj}|jƒ}xY|jjjdkrvt|jƒ|jƒ}tj||d|ƒ}|jjj}qW|S(NtmodR.(RR-R.t parse_powRFRRtMod(R&R.RºR»((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRØüs   cCs{|jjj}|jƒ}xY|jjjdkrvt|jƒ|jƒ}tj||d|ƒ}|jjj}qW|S(NtpowR.(RR-R.t parse_unaryRFRRtPow(R&R.RºR»((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRÛs   cCsÉ|jjj}|jjj}|dkrXt|jƒtj|jtƒd|ƒ}nF|dkr’t|jƒtj |jtƒd|ƒ}n |j ƒ}|j |ƒ}|rÅ|j |ƒ}n|S(NR{R.RÈ( RR-RFR.RRtNegRÞRtPosR¬t parse_postfixtparse_filter_expr(R&t with_filterRÇR.Rx((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRÞs  !  ! cCs|jj}|jdkr¦|jdkrNtj|jdkd|jƒ}nH|jdkrxtjdd|jƒ}ntj|jd d|jƒ}t |jƒne|jd kr7t |jƒ|jg}|j}x<|jjjd kr|j |jjjƒt |jƒqÚWtjd j |ƒd|ƒ}nÔ|jdkrqt |jƒtj|jd|jƒ}nš|jdkr²t |jƒ|j dt ƒ}|jjdƒnY|jdkrÐ|jƒ}n;|jdkrî|jƒ}n|jdt|ƒ|jƒ|S(NRttruetfalseRGRR.tnoneR,tloadtstringttintegertfloatR˜texplicit_parenthesesREtlbrackettlbracesunexpected '%s'(RåRæsTruesFalse(RåsTrue(RçsNone(Rësfloat(RR-RFRTRtConstR.R,R«RR7R6RiRGRbt parse_listt parse_dictR1R(R&R[RxtbufR.((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR¬ s<    !  c sˆjjj}|r!ˆj}n!|r3ˆj}n‡fd†}g}t}xm|rjˆjjdƒnˆj|ƒr}Pn|j|ƒƒˆjjj dkr«t }nPˆjjj}qQ|sû|rÒ|dS|sûˆj dt ˆjjƒƒqûnt j|dd|ƒ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. csˆjdtƒS(NRm(RoR((R&(s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt\sRis Expected an expression, got '%s'RèR.(RR-R.R¬RoRRbRJR7RFRGR1RRtTuple( R&RªRmRIRíR.R"Rštis_tuple((R&s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRiBs2    cCsŸ|jjdƒ}g}x^|jjjdkrx|rI|jjdƒn|jjjdkrbPn|j|jƒƒqW|jjdƒtj|d|jƒS(NRîtrbracketRR.( RRbR-RFR7RoRtListR.(R&R[titems((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRñyscCsÖ|jjdƒ}g}x•|jjjdkr¯|rI|jjdƒn|jjjdkrbPn|jƒ}|jjdƒ|jƒ}|jtj||d|jƒƒqW|jjdƒtj |d|jƒS(NRïtrbraceRR_R.( RRbR-RFRoR7RtPairR.tDict(R&R[RùtkeyRT((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRò…s  &cCsbx[|jjj}|dks*|dkr<|j|ƒ}q|dkrZ|j|ƒ}qPq|S(NtdotRîR˜(RR-RFtparse_subscriptt parse_call(R&RxRÇ((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRâ”s cCs‰x‚|jjj}|dkr0|j|ƒ}q|dkrc|jjjdkrc|j|ƒ}q|dkr|j|ƒ}qPq|S(NtpipeRtisR˜(RR-RFR¤RTt parse_testR(R&RxRÇ((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRã¡s ! cCs›t|jƒ}|jdkrÁ|jj}t|jƒ|jdkretj||jdd|jƒS|jdkrŠ|jd|jƒntj |jd|jƒ}tj ||dd|jƒS|jdkr„g}xE|jjjdkr|r|jj d ƒn|j |j ƒƒqÙW|jj dƒt|ƒd krM|d }ntj|dd|jƒ}tj ||dd|jƒS|jd |jƒdS( NRþRRèR.Rësexpected name or numberRîR÷Riisexpected subscript expression(RRRFR-RtGetattrRTR.R1RðtGetitemRbR7tparse_subscribedRÏRõ(R&RxR[t attr_tokenRRš((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRÿ°s.    cCsR|jjj}|jjjdkr=t|jƒdg}n;|jƒ}|jjjdkrb|St|jƒ|g}|jjjdkr|jdƒn8|jjjdkrÈ|j|jƒƒn |jdƒ|jjjdkr2t|jƒ|jjjdkr"|j|jƒƒq?|jdƒn |jdƒtj d||ŒS(NR_R÷RR.(srbracketscomma(srbracketscomma( RR-R.RFRR,RoR7RtSlice(R&R.RšRx((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRÊs*        c s'ˆjjdƒ‰g}g}d}}t}‡‡fd†}x–ˆjjjdkrØ|rŠˆjjdƒˆjjjdkrŠPqŠnˆjjjdkr×||dko·|dkƒtˆjƒˆjƒ}nøˆjjjdkr||dkƒtˆjƒˆjƒ}n·||dko0|dkƒˆjjjdkr±ˆjjƒjdkr±ˆjjj }ˆjj d ƒˆjƒ} |j t j || d | jƒƒn|| ƒ|j ˆjƒƒt}qCWˆjjdƒ|dkr||||fSt j|||||d ˆjƒS( NR˜cs |sˆjdˆjƒndS(Ns+invalid syntax for function call expression(R1R.(R3(R&R[(s1/usr/lib/python2.7/site-packages/jinja2/parser.pytensureðs RERRÑRÝRRgiR.(RRbR,RR-RFRRoRƒRTR…R7RtKeywordR.RGR¡( R&RxRštkwargstdyn_argst dyn_kwargst require_commaR RýRT((R&R[s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRésF       c Csx |jjjdks|r|s4t|jƒn|jjdƒ}|j}xC|jjjdkr”t|jƒ|d|jjdƒj7}qRW|jjjdkrÈ|jdƒ\}}}}ng}g}d}}tj ||||||d|j ƒ}t }qW|S(NRRRþt.R˜R.( RR-RFRRbRTRR,RtFilterR.R( R&RxR¢R[RRšR R R ((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR¤s"  !  c Cs˜t|jƒ}|jjjdƒr:t|jƒt}nt}|jjdƒj}xC|jjjdkršt|jƒ|d|jjdƒj7}qXWd}}g}|jjjdkrÞ|j dƒ\}}}}nn|jjjdkrF|jjj d d d ƒ rF|jjjdƒr4|j dƒn|j ƒg}ng}tj||||||d|jƒ}|r”tj|d|jƒ}n|S(Nsname:notRRþRR˜RéRëRìRîRïs name:elsesname:orsname:andsname:iss'You cannot chain multiple tests with isR.(snamesstringsintegersfloatslparenslbracketslbrace(RRR-RrRGRRbRTRFR,RRHR1RoRtTestR.R¾( R&RxR[tnegatedRR R R Rš((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR,s6   !    cs¿g‰g‰ˆj}|dk r4|jj|ƒn‡‡fd†}zUxG|jr’|jj}|jdkr«|jr›|tj|jd|j ƒƒnt |jƒqL|jdkrðt |jƒ||j dt ƒƒ|jj dƒqL|jdkrƒ|ƒt |jƒ|dk r8|jjj|Œr8ˆS|jƒ}t|tƒrcˆj|ƒn ˆj|ƒ|jj dƒqLtd ƒ‚qLW|ƒWd|dk rº|jjƒnXˆS( Ncs;ˆr7ˆdj}ˆjtjˆd|ƒƒˆ2ndS(NiR.(R.R7RR§(R.(Rtt data_buffer(s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt flush_dataSs tdataR.tvariable_beginRmRCt block_beginRDsinternal parsing error(R7R,R%RR-RFRTRt TemplateDataR.RRiRGRbRHR^R R?R5tAssertionErrorRZ(R&R@tadd_dataRR[RO((RtRs1/usr/lib/python2.7/site-packages/jinja2/parser.pyRcKsD            cCs/tj|jƒddƒ}|j|jƒ|S(s0Parse the whole template into a `Template` node.R.i(RtTemplateRctset_environmentR(R&Re((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR"{sN(;R¯t __module__t__doc__R,R+RR1R=R>RBRJRPR^RRfRlRvRzR~RR‡RŠRR—RžRWRXR¦R¨RGRhRoR²R³R¸R¼R¿RÂRÉRËRÎRÒRÕRØRÛRÞR¬RiRñRòRâRãRÿRRR¤RRcR"(((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRsp              '          "6     /   0N(Rtjinja2Rtjinja2.exceptionsRRt jinja2.lexerRRtjinja2._compatRRt frozensetRURÃRKR(((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt s