a Ã`ìã @sBdZddlmZddlmZddlmZddlmZ ddl m Z ddl m Z dd l mZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddl m!Z!ddl"m#Z#ddl$m%Z%dddddd d!d"d#œZ&e'e(d$ƒrLd$Z)nd%Z)d&gZ*ze+d'ƒe* ,d(¡Wne-y€Yn0z e+d)ƒWne-y¦d*Z.Yn0d+Z.d,d-„Z/dCd/d0„Z0d1d2„Z1d3d4„Z2Gd5d6„d6e3ƒZ4Gd7d8„d8e3ƒZ5Gd9d:„d:e6ƒZ7Gd;d<„d„d>e%ƒZ9Gd?d@„d@e:ƒZ;GdAdB„dBe%ƒZz>=ú.new_funcr)r/r2r0r.r1Ú optimizeconstBs r3NcCsHt|tjƒstdƒ‚| ||||||¡}| |¡|durD|j ¡SdS)z+Generate the python source for a node tree.z Can't compile non template nodesN)Ú isinstancer ZTemplateÚ TypeErrorZcode_generator_classr)ÚstreamÚgetvalue)r+Ú environmentÚnameÚfilenamer6Ú defer_initr%Ú generatorr0r0r1ÚgenerateNs  ÿ r=cCs®|dus|tus|turdSt|ƒttttttft vrd?„Zd@dA„Z dBdC„Z!dDdE„Z"dFdG„Z#dHdI„Z$dJdK„Z%dÐdLdM„Z&dNdO„Z'dPdQ„Z(dRdS„Z)dTdU„Z*dVdW„Z+dXdY„Z,dZd[„Z-d\d]„Z.d^d_„Z/d`da„Z0dbdc„Z1ddde„Z2e3dfdgƒZ4e5Z6dZ7dhdi„Z8djdk„Z9dldm„Z:dndo„Z;dpdq„Zdvdw„Z?dxdy„Z@dzd{„ZAd|d}„ZBd~d„ZCd€d„ZDd‚dƒ„ZEd„d…„ZFdÑd†d‡„ZGdÒdˆd‰„ZHeGdŠƒZIeGd‹ƒZJeGdŒƒZKeGdƒZLeGdŽƒZMeGdƒZNeGdƒZOeGd‘dd’ZPeGd“dd’ZQeHdŠƒZReHd‹ƒZSeHd”dd’ZT[G[HeUd•d–„ƒZVeUd—d˜„ƒZWd™dš„ZXeUd›dœ„ƒZYeUddž„ƒZZdŸd „Z[eUd¡d¢„ƒZ\eUd£d¤„ƒZ]eUd¥d¦„ƒZ^eUdÓd§d¨„ƒZ_d©dª„Z`d«d¬„Zad­d®„Zbd¯d°„Zcd±d²„Zdd³d´„Zedµd¶„Zfd·d¸„Zgd¹dº„Zhd»d¼„Zid½d¾„Zjd¿dÀ„ZkdÁd„ZldÃdÄ„ZmdÅdÆ„ZndS)ÔÚ CodeGeneratorNFTcCs²|durtƒ}||_||_||_||_d|_||_||_|rFt|ƒ|_ i|_ i|_ d|_ d|_ d|_i|_i|_g|_d|_d|_d|_d|_d|_d|_g|_g|_dg|_dS)NFrr TÚcontext)rr8r9r:r6Zcreated_block_contextr;r%rr(Úimport_aliasesÚblocksÚextends_so_farÚhas_known_extendsÚ code_linenorwrvÚ debug_infoÚ_write_debug_infoÚ _new_linesÚ _last_lineÚ _first_writeÚ_last_identifierÚ _indentationÚ _assign_stackÚ_param_def_blockÚ_context_reference_stack)r*r8r9r:r6r;r%r0r0r1rYøs8 zCodeGenerator.__init__cCst|||j|jƒ‚dS)z*Fail with a :exc:`TemplateAssertionError`.N)rr9r:)r*ÚmsgÚlinenor0r0r1Úfail<szCodeGenerator.failcCs|jd7_d|jS)zGet a new unique identifier.r zt_%d)rrxr0r0r1Útemporary_identifier@sz"CodeGenerator.temporary_identifiercCs| ¡|_| d|j¡dS)z7Enable buffering for the frame from that point onwards.z%s = []N)r—rdÚ writeline©r*r,r0r0r1rdEs zCodeGenerator.buffercCs”|s€|jjrd| d¡| ¡| d|j¡| ¡| d¡| ¡| d|j¡| ¡dS|jjr€| d|j¡dS| d|j¡dS)z(Return the buffer contents of the frame.zif context.eval_ctx.autoescape:zreturn Markup(concat(%s))úelse:zreturn concat(%s)N)r&r'r˜ÚindentrdÚoutdentÚ autoescape)r*r,Úforce_unescapedr0r0r1Úreturn_buffer_contentsJs  z$CodeGenerator.return_buffer_contentscCs|jd7_dS)zIndent by one.r N©rrxr0r0r1r›\szCodeGenerator.indentr cCs|j|8_dS)zOutdent by step.Nr )r*Ústepr0r0r1rœ`szCodeGenerator.outdentcCs.|jdur| d|¡n| d|j|¡dS)z%Yield or write into the frame buffer.Núyield ú %s.append()rdr˜)r*r,r+r0r0r1Ú start_writeds zCodeGenerator.start_writecCs|jdur| d¡dS)z1End the writing process started by `start_write`.Nú))rdÚwriter™r0r0r1Ú end_writeks zCodeGenerator.end_writecCs$| ||¡| |¡| |¡dS)z4Simple shortcut for start_write + write + end_write.N)r¤r¦r§)r*Úsr,r+r0r0r1Ú simple_writeps  zCodeGenerator.simple_writecCs<z$| d¡|D]}| ||¡qWnty6Yn0dS)z•Visit a list of nodes as block in a frame. If the current frame is no buffer a dummy ``if 0: yield None`` is written automatically. ÚpassN)r˜r)r‚)r*r r,r+r0r0r1Ú blockvisitvs   zCodeGenerator.blockvisitcCs€|jrp|jsR|j d|j¡|j|j7_|jdurR|j |j|jf¡d|_d|_|j d|j¡d|_|j |¡dS)z&Write a string into the output stream.Ú NFz r) rŒrŽr6r¦r‰r‹rŠÚappendr)r*Úxr0r0r1r¦s zCodeGenerator.writercCs| ||¡| |¡dS)z!Combination of newline and write.N)Únewliner¦)r*r®r+Úextrar0r0r1r˜s zCodeGenerator.writelinecCs:t|jd|ƒ|_|dur6|j|jkr6|j|_|j|_dS)z/Add one or more newlines before the next write.r N)ÚmaxrŒr•rr‹)r*r+r°r0r0r1r¯”szCodeGenerator.newlinec Cs´d}tdd„|jDƒ|pdƒD]}t|ƒrd}q4q|jD]}| d¡| ||¡q:|s¨|jD]}| d¡| ||¡q`|dur¨t|ƒD]\}}| d||f¡qŒ|jrÆ| d ¡| |j|¡|rŒ|jdurâ| d ¡n | d ¡|jD],}| d |j ¡| |j |¡| d¡qò|durPt|ƒD]\}}| d ||f¡q2|jdur€| d¡| |j|¡| d¡n | d¡n$|jdur°| d¡| |j|¡dS)a+Writes a function call to the stream for the current node. A leading comma is added automatically. The extra keyword arguments may not include python keywords otherwise a syntax error could occur. The extra keyword arguments should be given as python dict. Fcss|] }|jVqdSr$)rM©Ú.0r®r0r0r1Ú ¥óz*CodeGenerator.signature..r0Tú, Nz, %s=%sz, *z , **dict({z, **{z%r: z%r: %s, z}, **r¥Ú}z, **) rr-Úis_python_keywordÚargsr¦r)r Zdyn_argsZ dyn_kwargsrMrK) r*r+r,Ú extra_kwargsZkwarg_workaroundÚkwargÚargrMrKr0r0r1Ú signature›sJ                  zCodeGenerator.signaturecCsntƒ}|D]}| |¡q dD]J}t||ƒ}t||ƒD]0}||vrN| ¡||<| d||||f¡q6qdS)zPull all the dependencies.)rvrwz%s = environment.%s[%r]N)rur)Úgetattrr—r˜)r*r rRr+Z dependencyÚmappingr9r0r0r1Úpull_dependenciesÐs   ÿzCodeGenerator.pull_dependenciescCsžg}t|jjƒD]p\}\}}|tkr&q|tkrH| d|| ¡|f¡q|tkrd| d||f¡q|tkrx|  |¡qt dƒ‚q|rš| dd  |¡¡dS)Nz %s = %s(%r)ú%s = %szunknown load instructionú %s = missingú = ) r r`Úloadsrrr˜Úget_resolve_funcrrr­ÚNotImplementedErrorÚjoin)r*r,ÚundefsÚtargetÚactionZparamr0r0r1Ú enter_frameÞs  zCodeGenerator.enter_framecCsD|s@g}t|jjƒD]\}}| |¡q|r@| dd |¡¡dS)NrÂrÃ)r r`rÄr­r˜rÇ)r*r,Úwith_python_scoperÈrÉÚ_r0r0r1Ú leave_frameîs  zCodeGenerator.leave_framecCs|jjrd|Sd|S)Nz async def %szdef %s)r8Úis_async)r*r9r0r0r1ÚfuncöszCodeGenerator.funcc Csˆ| ¡}|j |¡t|ƒ}d}tƒ}g}t|jƒD]@\}}|jdkrJ|}|jdvr`| |j¡|  |j  |j¡¡q4t |j dƒ} d| vræ|durÎz|j |t|jƒWqàtyÊ| d|j¡Yqà0n|  |j d¡¡d|_d| vrd|vr|  |j d¡¡d|_d| vr>d|vr>|  |j d¡¡d|_d |_|j |¡| d | d ¡d  |¡f|¡| ¡| |¡| |¡| |¡t|jƒD]¤\}}|j  |j¡} | d | ¡| ¡z|j |t|jƒ} Wn0ty| d| d|j|jf¡Yn0| d| ¡| | |¡| | ¡|  ¡q | !¡| "|j |¡|j#|dd|j$|dd|  ¡||fS)z/Dump the function def of a macro or call block.NÚcaller)r-Úvarargs)rÑr-rÒzhWhen defining macros or call blocks the special "caller" argument must be omitted or be given a default.Tr-rÒFz%s(%s):Zmacror¶úif %s is missing:z%s = undefined(%r, name=%r)zparameter %r was not providedú%s = )rž©rÌ)%rpr`Ú analyze_noderTrGÚ enumerater¹r9rzr­ÚrefrSÚbodyÚdefaultsÚlenÚ IndexErrorr–r•Údeclare_parameterrUrVrWrcr˜rÐrÇr›rdrËÚpush_parameter_definitionsr)Úmark_parameter_storedrœÚpop_parameter_definitionsr«rŸrÎ) r*r+r,Ú macro_refZexplicit_callerZskip_special_paramsr¹Úidxr¼rPrØÚdefaultr0r0r1Ú macro_bodyûsv      ü      ÿÿ    zCodeGenerator.macro_bodycCs`d dd„|jjDƒ¡}t|jddƒ}t|jjƒdkr>|d7}| d|||j|j|jf¡dS) z.r9Nr ú,zLMacro(environment, macro, %r, (%s), %r, %r, %r, context.eval_ctx.autoescape)) rÇr+r¹r¾rÛr¦rVrWrU)r*rár,Z arg_tupler9r0r0r1Ú macro_defKsûþÿzCodeGenerator.macro_defcCs*d|j}|jdur&|dt|jƒ7}|S)z.Return a human readable position for the node.zline %dNú in )r•r9rå)r*r+rnr0r0r1Úposition]s  zCodeGenerator.positioncCs"dd dd„t|j ¡ƒDƒ¡S)Nz{%s}r¶css|]\}}d||fVqdS©ú%r: %sNr0)r³r9rÉr0r0r1r´esÿz3CodeGenerator.dump_local_context..)rÇr r`Z dump_storesr™r0r0r1Údump_local_contextds  þz CodeGenerator.dump_local_contextcCs,| d¡| d¡| d¡| d¡dS)z·Writes a common preamble that is used by root and block functions. Primarily this sets up common local helpers and enforces a generator through a dead branch. z$resolve = context.resolve_or_missingz!undefined = environment.undefinedzcond_expr_undefined = Undefinedzif 0: yield NoneN©r˜rxr0r0r1Ú write_commonsjs   zCodeGenerator.write_commonscCs|j |j ¡¡dS)aQPushes all parameter targets from the given frame into a local stack that permits tracking of yet to be assigned parameters. In particular this enables the optimization from `visit_Name` to skip undefined expressions for parameters in macros as macros can reference otherwise unbound parameters. N)r’r­r`Zdump_param_targetsr™r0r0r1rÞvsz(CodeGenerator.push_parameter_definitionscCs|j ¡dS)z+Pops the current parameter definitions set.N)r’Úpoprxr0r0r1ràsz'CodeGenerator.pop_parameter_definitionscCs|jr|jd |¡dS)z€Marks a parameter in the current parameter definitions as stored. This will skip the enforced undefined checks. éÿÿÿÿN)r’r€©r*rÉr0r0r1r߃sz#CodeGenerator.mark_parameter_storedcCs|j |¡dSr$)r“r­rñr0r0r1Úpush_context_referenceŠsz$CodeGenerator.push_context_referencecCs|j ¡dSr$)r“rïrxr0r0r1Úpop_context_referencesz#CodeGenerator.pop_context_referencecCs |jdS)Nrð©r“rxr0r0r1Úget_context_refszCodeGenerator.get_context_refcCs|jd}|dkrdSd|S)Nrðr„Úresolvez %s.resolverôrñr0r0r1rÅ“s zCodeGenerator.get_resolve_funccCsd| ¡| |¡fS)Nz%s.derived(%s))rõrìr™r0r0r1Úderive_context™sþzCodeGenerator.derive_contextcCs|js dS||jdvS)z4Checks if a given target is an undeclared parameter.Frð)r’rñr0r0r1Úparameter_is_undeclaredŸsz%CodeGenerator.parameter_is_undeclaredcCs|j tƒ¡dS)z+Pushes a new layer for assignment tracking.N)r‘r­rGrxr0r0r1Úpush_assign_tracking¥sz"CodeGenerator.push_assign_trackingcCsò|j ¡}|jr|sdSdd„|Dƒ}t|ƒdkr^tt|ƒƒ}|j |¡}| d||f¡nR| d¡t |ƒD]4\}}|r†|  d¡|j |¡}|  d||f¡qp|  d ¡|rît|ƒdkrÔ| d |d ¡n| d d  t t |ƒ¡¡dS) zoPops the topmost level for assignment tracking and updates the context variables if necessary. NcSs g|]}|dd…dkr|‘qS)Nr rÍr0r²r0r0r1Ú °rµz5CodeGenerator.pop_assign_tracking..r úcontext.vars[%r] = %szcontext.vars.update({r¶rëz})úcontext.exported_vars.add(%r)rz"context.exported_vars.update((%s)))r‘rïrarÛÚnextÚiterr`rØr˜r×r¦rÇr rå)r*r,ÚvarsZ public_namesr9rØrâr0r0r1Úpop_assign_tracking©s.          ÿÿz!CodeGenerator.pop_assign_trackingcCsæ|dusJdƒ‚t|j|jƒ}ddlm}| dd t¡¡| dd |¡¡|jjrd| d¡|j rpdprd }|  t j ¡du}|  t j¡D]0}|j|jvr´| d |j|j¡||j|j<q|  t j¡D]j}|j|jvrÎ|j} | ¡|j| <} d | vr&|  d d¡\} } | d | | | f¡qÎ| d | | f¡qÎ| d|j¡|jd| d¡|fdd| ¡| ¡t|ƒ}dt|jdƒvrª|j d¡} | d| ¡|j |¡d|_ |_!|oÎ|j" |_#|râ| d¡| $|¡| %|j¡| &|j|¡|j'|dd| (¡|rª|j"s<| ¡| d¡| ¡t)r`|jjs`| d¡n8| d|jjrvdpxd ¡| ¡| d¡| (¡| (d|j" ¡t*|jƒD]è\}}| d| d|¡|f|d¡| ¡| ¡t|ƒ}t|jdƒ}d|vr$|j d¡} | d| ¡d|vrN|j d¡} | d | ||f¡|j |¡||_+| $|¡| %|j¡| &|j|¡|j'|dd| (¡q´|jd!d d"d#„|jDƒ¡dd| d$d% d&d#„|j,Dƒ¡¡dS)'Nzno root frame allowedr )Úexportedzfrom __future__ import %sr¶zfrom jinja2.runtime import zHfrom jinja2.asyncsupport import auto_await, auto_aiter, AsyncLoopContextz, environment=environmentÚzblock %r defined twiceÚ.zfrom %s import %s as %szimport %s as %sz name = %rz%s(context, missing=missing%s):Úroot)r°r*rxz%s = TemplateReference(context)Tzparent_template = NonerÕúif parent_template is not None:z4yield from parent_template.root_render_func(context)z9%sfor event in parent_template.root_render_func(context):zasync z yield eventZblock_)r*Úsuperrz %s = context.super(%r, block_%s)z blocks = {%s}css|]}d||fVqdS)z %r: block_%sNr0r²r0r0r1r´;rµz/CodeGenerator.visit_Template..zdebug_info = %rú&css|]}d|VqdS)z%s=%sNr0r²r0r0r1r´Arµ)-rr8r9Zruntimerr˜rÇÚ code_featuresrÏr;Úfindr ZExtendsÚfind_allZBlockr†r–r•Z ImportedNameÚ importnamer…r—ÚrsplitrÐr›rîr]rSrÙr`rÝrÖrarbrˆrcrËrÀr«rÎrœÚsupports_yield_fromr rerŠ)r*r+r,r&rZenvenvZ have_extendsreÚimport_ÚimpÚaliasÚmoduleÚobjrØr9Ú block_framerPr0r0r1Úvisit_TemplateÈs¶ ÿ   ÿ        þÿ ÿü         þÿzCodeGenerator.visit_TemplatecCsÒd}|jr8|jrdS|jdkr8| d¡| ¡|d7}|jrJ| |¡}n| ¡}tr€|j j s€|j dur€| d|j |f|¡nD|j j rŒdpŽd}| d||j |f|¡| ¡|  d |¡| ¡| |¡dS) z.Call a block and register it for the template.rNúif parent_template is None:r z$yield from context.blocks[%r][0](%s)ú async forÚforz&%s event in context.blocks[%r][0](%s):Úevent)rarˆr‡r˜r›Zscopedr÷rõr r8rÏrdr9r©rœ)r*r+r,r_r„Úloopr0r0r1r}Ds:   ÿþýÿþ zCodeGenerator.visit_BlockcCsÊ|js| d|j¡|jdkrZ|js6| d¡| ¡| dd¡|jrRtƒ‚n| ¡| d|¡|  |j |¡|  d|j ¡| dt ¡| ¡| d ¡| ¡|jr¸d |_|jd 7_d S) zCalls the extender.z,cannot use extend from a non top-level scoperrúraise TemplateRuntimeError(%r)zextended multiple timesz+parent_template = environment.get_template(ú, %r)z6for name, parent_block in parent_template.blocks.%s():z8context.blocks.setdefault(name, []).append(parent_block)Tr N)rar–r•r‡rˆr˜r›r‚rœr)Útemplater¦r9Údict_item_iterrb©r*r+r,r0r0r1Ú visit_Extendsjs,   ÿ zCodeGenerator.visit_ExtendscCs‚|jr| d¡| ¡d}t|jtjƒrVt|jjtƒr>d}qnt|jjt t fƒrnd}nt|jtj tj fƒrnd}| d||¡|  |j|¡| d|j¡|jrà| ¡| d¡| ¡| d¡| ¡| d ¡| ¡d }|jr|jjrød púd }| d || |¡f¡n6|jjr,| d¡n trB| d¡d}n | d¡|sn| ¡| d|¡| ¡|jr~| ¡dS)zHandles includes.ztry:Zget_or_select_templateZ get_templateZselect_templateztemplate = environment.%s(rzexcept TemplateNotFound:rªršFrrzY%s event in template.root_render_func(template.new_context(context.get_all(), True, %s)):zGfor event in (await template._get_default_module_async())._body_stream:z6yield from template._get_default_module()._body_streamTz9for event in template._get_default_module()._body_stream:rN)Zignore_missingr˜r›r4rr ZConstrKrrErFÚTupleÚListr)r¦r9rœÚ with_contextr8rÏrìr r©)r*r+r,Ú func_nameZskip_event_yieldrr0r0r1Ú visit_Include—s\     þÿ ÿ ÿ zCodeGenerator.visit_IncludecCsÚ| d|j |j¡|¡|jr0| d|j¡|jjrB| d¡| d¡| |j |¡| d|j ¡|j r–| d|jjr‚dp„d|  |¡f¡n|jjrª| d ¡n | d ¡|jrÖ|j  d ¡sÖ| d |j¡d S)zVisit regular imports.rÔúcontext.vars[%r] = úawait zenvironment.get_template(ú, %r).ú*make_module%s(context.get_all(), True, %s)Ú_asyncrú_get_default_module_async()ú_get_default_module()rÍú!context.exported_vars.discard(%r)N)r˜r`rØrÉrar¦r8rÏr)rr9r"rìÚ startswithrr0r0r1Ú visit_ImportÑs*  þÿÿ  zCodeGenerator.visit_Importc sê| |¡| d|jjrdpd¡| |jˆ¡| d|j¡|jrn| d|jjrZdp\d| ˆ¡f¡n|jjr‚| d¡n | d¡g}g}|j D]®}t |t ƒr²|\}}n|}|  d ˆj  |¡|f¡|  d ˆj  |¡¡| ¡|  d ˆj  |¡d | |¡t|ƒf|f¡| ¡ˆjrš| |¡| d ¡sš| |¡qš|r¤t|ƒdkr‚|d}|  d|ˆj  |¡f¡n"|  dd ‡fdd„|Dƒ¡¡|ræt|ƒdkrÌ|  d|d¡n|  dd tt|ƒ¡¡dS)zVisit named imports.z/included_template = %senvironment.get_template(r&rr'r(r)r*r+z,%s = getattr(included_template, %r, missing)rÓz9%s = undefined(%r %% included_template.__name__, name=%r)zGthe template %%r (imported on %s) does not export the requested name %srÍr rrûzcontext.vars.update({%s})r¶c3s"|]}d|ˆj |¡fVqdSrê)r`rØ)r³r9©r,r0r1r´(sz1CodeGenerator.visit_FromImport..r,z-context.exported_vars.difference_update((%s))N)r¯r¦r8rÏr)rr9r"rìrQr4rEr˜r`rØr›rérårœrar­r-rÛrÇr )r*r+r,Z var_namesZdiscarded_namesr9rr0r/r1Úvisit_FromImportêsˆ ÿÿþÿÿ     ÿÿ þûýÿ    ÿÿÿÿÿÿzCodeGenerator.visit_FromImportc CsN| ¡}| ¡}| ¡}|jp2dt|jdddƒv}d}|rH|j d¡}|jj|dd|jrn|jj|dd|jrl|  ¡}|jj|dd|  d |  |¡|j¡|  ¡|  |¡|  |jjrÈd pÊd ¡| |j|¡| d ¡| |jjröd pød¡| d¡|  ¡|  d|j¡| |j|¡| d¡|  ¡|  d¡| |j|¡| d¡|j|dd|jr¤|  d|  d¡|¡|  ¡| |¡|j|_|r¸|  d|¡| tj¡D],} | jdkrÄ| jdkrÄ| d| j¡qÄ|jr|  ¡} |  d| ¡|  |jjr$d p&d |¡| |j|¡|rj|jjrZ| d|¡n| d|¡n | d ¡|jrŠ| d|¡|jrž| d¡nB|jjr¸|s¸| d¡| |j|¡|jjrà|sà| d¡|jrò| d¡|jr| d ¡n| |rd!pd¡|  ¡|  |¡| |j|¡|jrR|  d"| ¡| ¡|j||jon|j d|jr¼|  d#| ¡|  ¡|  |¡| |j|¡| |¡| ¡|jrJ|  |¡| ¡| !||¡|jjrö| d$¡| d%¡|jjr| d¡| |j|¡|jjr6| d¡| d&¡| "|¡dS)'Nr)rÙ)Zonly)rrÙ)Z for_branchÚelseÚtestz %s(fiter):z async for zfor rèzauto_aiter(fiter)Zfiterú:úif r¢éTrÕz'%s(reciter, loop_render_func, depth=0):rÂÚstorez8Can't assign to special loop variable in for-loop targetz%s = 1z, %s in AsyncLoopContext(z, %s in LoopContext(z%s(Zreciterz auto_aiter(r¥z&, undefined, loop_render_func, depth):z , undefined):z%s = 0zif %s:r&zloop(z, loop))#rpÚ recursiverSZiter_child_nodesr`rÝrÖÚelse_r2r—r˜rÐr›rËr8rÏr)rÉr¦rœrÎrdr r ÚNamerr9r–r•rþr«rÙrŸr¤r§) r*r+r,Z loop_frameZ test_frameZ else_frameZ extended_loopZloop_refZloop_filter_funcr9Ziteration_indicatorr0r0r1Ú visit_For5sÊ  ÿ       ÿ þ        ÿ            zCodeGenerator.visit_ForcCsÊ| ¡}| d|¡| |j|¡| d¡| ¡| |j|¡| ¡|j D]F}| d|¡| |j|¡| d¡| ¡| |j|¡| ¡qP|j rÆ| d¡| ¡| |j |¡| ¡dS)Nr4r3zelif rš) rqr˜r)r2r¦r›r«rÙrœÚelif_r8)r*r+r,Zif_framer;r0r0r1Úvisit_If»s&       zCodeGenerator.visit_IfcCsr| ||¡\}}| ¡|jrJ|j d¡s:| d|j¡| d|j¡| d|j |j¡¡|  ||¡dS)NrÍrür%rÔ) rär¯rar9r-r¦r˜r`rØrç)r*r+r,Z macro_framerár0r0r1Ú visit_MacroÐs zCodeGenerator.visit_MacrocCsR| ||¡\}}| d¡| ||¡| ||¡|j|j|dd| |¡dS)Nz caller = T)Úforward_caller)rär˜rçr¤Ú visit_CallÚcallr§)r*r+r,Z call_framerár0r0r1Úvisit_CallBlockÚs    zCodeGenerator.visit_CallBlockcCsh| ¡}|j |¡| |¡| |¡| |j|¡| ||¡| |j |¡|  |¡|  |¡dSr$) rpr`rÖrËrdr«rÙr¤r{Úfilterr§rÎ)r*r+r,Z filter_framer0r0r1Úvisit_FilterBlockâs     zCodeGenerator.visit_FilterBlockcCs|| ¡}|j |¡| |¡t|j|jƒD]2\}}| ¡| ||¡|  d¡| ||¡q,|  |j |¡|  |¡dS©NrÃ) rpr`rÖrËr ÚtargetsÚvaluesr¯r)r¦r«rÙrÎ)r*r+r,Z with_framerÉÚexprr0r0r1Ú visit_Withís    zCodeGenerator.visit_WithcCs| |¡| |j|¡dSr$)r¯r)r+rr0r0r1Úvisit_ExprStmtùs zCodeGenerator.visit_ExprStmtÚ _FinalizeInfo)ÚconstÚsrccs¸ˆjdurˆjSˆj}‰d}ˆjjr¤d}ˆjj‰‡‡fdd„}tˆddƒdur^|d7}d}nFtˆd dƒdur||d 7}d}n(tˆd dƒdur¤|d 7}‡‡‡fd d„}ˆ ||¡ˆ_ˆjS)a‰Build the finalize function to be used on constants and at runtime. Cached so it's only created once for all output nodes. Returns a ``namedtuple`` with the following attributes: ``const`` A function to finalize constant data at compile time. ``src`` Source code to output around nodes to be evaluated at runtime. Nzenvironment.finalize(cs ˆˆ|ƒƒSr$r0©rK)rãÚ env_finalizer0r1Úfinalizesz.CodeGenerator._make_finalize..finalizeZcontextfunctionFTú context, Zevalcontextfunctionúcontext.eval_ctx, Zenvironmentfunctionú environment, csˆˆˆj|ƒƒSr$)r8rM©rãrNr*r0r1rO's)Ú _finalizeÚ_default_finalizer8rOr¾rJ)r*rOrLr0rSr1Ú_make_finalizes&  zCodeGenerator._make_finalizecCs tt|ƒƒS)z™Given a group of constant values converted from ``Output`` child nodes, produce a string to write to the template module source. )rår)r*Úgroupr0r0r1Ú_output_const_repr-sz CodeGenerator._output_const_reprcCs:| |j¡}|jjrt|ƒ}t|tjƒr0t|ƒS| |¡S)aCTry to optimize a child of an ``Output`` node by trying to convert it to constant, finalized data at compile time. If :exc:`Impossible` is raised, the node is not constant and will be evaluated at runtime. Any other exception will also be evaluated at runtime for easier debugging. ) Úas_constr&rrr4r Ú TemplateDatarrK)r*r+r,rOrKr0r0r1Ú_output_child_to_const4s   z$CodeGenerator._output_child_to_constcCsL|jjr| d¡n|jjr(| d¡n | d¡|jdurH| |j¡dS)zXOutput extra source code before visiting a child of an ``Output`` node. z7(escape if context.eval_ctx.autoescape else to_string)(zescape(z to_string(N)r&r'r¦rrL©r*r+r,rOr0r0r1Ú_output_child_preGs    zCodeGenerator._output_child_precCs"| d¡|jdur| d¡dS)zWOutput extra source code after visiting a child of an ``Output`` node. r¥N)r¦rLr\r0r0r1Ú_output_child_postUs  z CodeGenerator._output_child_postc Csð|jr"|jrdS| d¡| ¡| ¡}g}|jD]†}z,|jsTt|tjƒsTt  ¡‚|  |||¡}Wn&tj t fyŠ|  |¡Yq4Yn0|r®t|dt ƒr®|d  |¡q4|  |g¡q4|jdurüt|ƒdkrä| d|j¡n| d|j¡| ¡|D]ª}t|t ƒrF| |¡}|jdur6| d|¡n| |d¡nb|jdur`| d|¡n | |¡| |||¡| ||¡| |||¡|jdur| d¡q|jdurÜ| ¡| t|ƒdkrÖdnd ¡|jrì| ¡dS) Nrrðr r£z %s.extend((r¢rær¥ú)))rcrˆr˜r›rVr rKr4rZÚ Impossibler[Ú Exceptionr­rFrdrÛrXr¯r]r)r^r¦rœ) r*r+r,rOrÙÚchildrKrLÚvalr0r0r1Ú visit_Output^sZ  ý ú            zCodeGenerator.visit_OutputcCsF| ¡| |¡| |j|¡| d¡| |j|¡| |¡dSrD)rùr¯r)rÉr¦r+rrr0r0r1Ú visit_Assign­s   zCodeGenerator.visit_AssigncCs²| ¡| ¡}d|_|j |¡| |¡| |¡| |j|¡|  |¡|  |j |¡|  d¡|j dur€| |j |¡n|  d|j¡|  d¡| |¡| |¡dS)NFz9 = (Markup if context.eval_ctx.autoescape else identity)(ú concat(%s)r¥)rùrprcr`rÖrËrdr«rÙr¯r)rÉr¦rBr{rrÎ)r*r+r,rr0r0r1Úvisit_AssignBlockµs         zCodeGenerator.visit_AssignBlockcCs’|jdkr(|jr(|jr(|jd |j¡|j |j¡}|jdkr„|j |¡}|durj|dtkrj|  |¡r„|  d|j||f¡dS|  |¡dS)Nr6rðr~rz-(undefined(name=%r) if %s is missing else %s)) rrar‘rzr9r`rØZ find_loadrrør¦)r*r+r,rØr~r0r0r1rÍs&  ÿ þý ÿÿzCodeGenerator.visit_NamecCsR|j |j¡}| d|¡| ¡| dd¡| ¡| d||jf¡dS)Nz!if not isinstance(%s, Namespace):rz/cannot assign attribute on non-namespace objectz%s[%r])r`rØr9r˜r›rœÚattr)r*r+r,rØr0r0r1Ú visit_NSRefåsÿÿzCodeGenerator.visit_NSRefcCs8| |j¡}t|tƒr&| t|ƒ¡n| t|ƒ¡dSr$)rYr&r4rCr¦Ústrrå)r*r+r,rcr0r0r1Ú visit_Constós  zCodeGenerator.visit_ConstcCsDz| t| |j¡ƒ¡Wn$tjy>| d|j¡Yn0dS)Nz9(Markup if context.eval_ctx.autoescape else identity)(%r))r¦rårYr&r r`Údatarr0r0r1Úvisit_TemplateDataús ÿz CodeGenerator.visit_TemplateDatacCsV| d¡d}t|jƒD]"\}}|r.| d¡| ||¡q| |dkrLdpNd¡dS)Nú(rðr¶rz,)r¥©r¦r×r#r)©r*r+r,rârLr0r0r1Ú visit_Tuples  zCodeGenerator.visit_TuplecCsF| d¡t|jƒD]"\}}|r*| d¡| ||¡q| d¡dS)Nú[r¶ú]rorpr0r0r1Ú visit_List s   zCodeGenerator.visit_ListcCs`| d¡t|jƒD]<\}}|r*| d¡| |j|¡| d¡| |j|¡q| d¡dS)NÚ{r¶z: r·)r¦r×r#r)rMrKrpr0r0r1Ú visit_Dicts   zCodeGenerator.visit_Dictcst‡fdd„ƒ}|S)NcsŒ|jjrJˆ|jjvrJ| dˆ¡| |j|¡| d¡| |j|¡n4| d¡| |j|¡| dˆ¡| |j|¡| d¡dS)Nz$environment.call_binop(context, %r, r¶rnú %s r¥)r8Ú sandboxedZintercepted_binopsr¦r)ÚleftÚrightr©Úoperatorr0r1rRsÿ þ  z$CodeGenerator.binop..visitor©r3©r|Ú interceptablerRr0r{r1ÚbinopszCodeGenerator.binopcst‡fdd„ƒ}|S)Ncs\|jjr2ˆ|jjvr2| dˆ¡| |j|¡n| dˆ¡| |j|¡| d¡dS)Nz#environment.call_unop(context, %r, rnr¥)r8rxZintercepted_unopsr¦r)r+rr{r0r1rR2sÿ þz#CodeGenerator.uaop..visitorr}r~r0r{r1Úuaop1s zCodeGenerator.uaopú+ú-Ú*ú/z//z**ú%Úand)rÚorznot cCs^|jjrd}n|jjrd}nd}| d|¡|jD]}| ||¡| d¡q4| d¡dS)Nz;(context.eval_ctx.volatile and markup_join or unicode_join)Z markup_joinZ unicode_joinz%s((r¶r_)r&r'rr¦r r))r*r+r,r#r¼r0r0r1Ú visit_ConcatOs   zCodeGenerator.visit_ConcatcCs>| d¡| |j|¡|jD]}| ||¡q| d¡dS)Nrnr¥)r¦r)rGÚops)r*r+r,Úopr0r0r1Ú visit_Compare]s   zCodeGenerator.visit_ComparecCs&| dt|j¡| |j|¡dS)Nrw)r¦Ú operatorsr‹r)rGrr0r0r1Ú visit_OperandeszCodeGenerator.visit_OperandcCsP|jjr| d¡| d¡| |j|¡| d|j¡|jjrL| d¡dS)Nú(await auto_await(zenvironment.getattr(rr_)r8rÏr¦r)r+rhrr0r0r1Ú visit_Getattris  zCodeGenerator.visit_GetattrcCs¢t|jtjƒr@| |j|¡| d¡| |j|¡| d¡n^|jjrR| d¡| d¡| |j|¡| d¡| |j|¡| d¡|jjrž| d¡dS)Nrrrsrzenvironment.getitem(r¶r¥r_) r4r¼r ZSlicer)r+r¦r8rÏrr0r0r1Ú visit_Getitemus      zCodeGenerator.visit_GetitemcCs`|jdur| |j|¡| d¡|jdur:| |j|¡|jdur\| d¡| |j|¡dS)Nr3)Ústartr)r¦Ústopr¡rr0r0r1Ú visit_SliceŠs     zCodeGenerator.visit_SlicecCs8|jjr| d¡| |j|jd¡|jj |j¡}|durT| d|j|j¡t|ddƒdurp| d¡n6t|ddƒdurŒ| d ¡nt|d dƒdur¦| d ¡|j durÀ|  |j |¡nJ|j j rà| d |j |j f¡n*|j jrú| d |j ¡n| d|j ¡| ||¡| d¡|jjr4| d¡dS)Núawait auto_await(rnzno filter named %rZ contextfilterFTrPZevalcontextfilterrQZenvironmentfilterrRzB(context.eval_ctx.autoescape and Markup(concat(%s)) or concat(%s))zMarkup(concat(%s))rfr¥)r8rÏr¦rvr9Úgetr–r•r¾r+r)r&r'rdrr½)r*r+r,rÐr0r0r1r{”s6      ÿÿ   zCodeGenerator.visit_FiltercCs`| |j|jd¡|j|jjvr8| d|j|j¡| |j|¡| ||¡| d¡dS)Nrnzno test named %rr¥) r¦rwr9r8r–r•r)r+r½rr0r0r1r|µs  zCodeGenerator.visit_Testcs^‡‡‡fdd„}ˆ d¡ˆ ˆjˆ¡ˆ d¡ˆ ˆjˆ¡ˆ d¡|ƒˆ d¡dS)Ncs4ˆjdurˆ ˆjˆ¡Sˆ ddˆ ˆ¡¡dS)Nzcond_expr_undefined(%r)zRthe inline if-expression on %s evaluated to false and no else section was defined.)Zexpr2r)r¦rér0©r,r+r*r0r1Ú write_expr2Às þþÿz1CodeGenerator.visit_CondExpr..write_expr2rnz if z else r¥)r¦r)Zexpr1r2)r*r+r,r˜r0r—r1Úvisit_CondExpr¾s   zCodeGenerator.visit_CondExprcCs||jjr| d¡|jjr&| d¡n | d¡| |j|¡|rJddipLd}| |||¡| d¡|jjrx| d¡dS)Nr•zenvironment.call(context, z context.call(rÑr¥)r8rÏr¦rxr)r+r½)r*r+r,r>rºr0r0r1r?Ôs    zCodeGenerator.visit_CallcCs"| |jd¡| |j|¡dS)Nú=)r¦rMr)rKrr0r0r1Ú visit_KeywordãszCodeGenerator.visit_KeywordcCs&| d¡| |j|¡| d¡dS)NzMarkup(r¥©r¦r)rGrr0r0r1Úvisit_MarkSafeés zCodeGenerator.visit_MarkSafecCs&| d¡| |j|¡| d¡dS)Nz5(context.eval_ctx.autoescape and Markup or identity)(r¥rœrr0r0r1Úvisit_MarkSafeIfAutoescapeîs z(CodeGenerator.visit_MarkSafeIfAutoescapecCs| d|j¡dS)Nz environment.©r¦r9rr0r0r1Úvisit_EnvironmentAttributeósz(CodeGenerator.visit_EnvironmentAttributecCs| d|j|jf¡dS)Nzenvironment.extensions[%r].%s)r¦Z identifierr9rr0r0r1Úvisit_ExtensionAttributeösz&CodeGenerator.visit_ExtensionAttributecCs| |j|j¡dSr$)r¦r…r rr0r0r1Úvisit_ImportedNameùsz CodeGenerator.visit_ImportedNamecCs| |j¡dSr$rŸrr0r0r1Úvisit_InternalNameüsz CodeGenerator.visit_InternalNamecCs| d¡dS)Nr„)r¦rr0r0r1Úvisit_ContextReferenceÿsz$CodeGenerator.visit_ContextReferencecCs| | |¡¡dSr$)r¦r÷rr0r0r1Úvisit_DerivedContextReferencesz+CodeGenerator.visit_DerivedContextReferencecCs| d|¡dS)NÚcontinuerírr0r0r1Úvisit_ContinueszCodeGenerator.visit_ContinuecCs| d|¡dS)NÚbreakrírr0r0r1Ú visit_BreakszCodeGenerator.visit_BreakcCs:| ¡}|j |¡| |¡| |j|¡| |¡dSr$)rpr`rÖrËr«rÙrÎ)r*r+r,Ú scope_framer0r0r1Ú visit_Scope s   zCodeGenerator.visit_ScopecCsŒ| ¡}| d|| |¡f¡| d|¡| |j|¡| |¡|jdd}|j |¡|  |¡|  |j |¡|  |¡|  ¡dS)NrÁz %s.vars = T)ro)r—r˜r÷r)r„ròrpr`rÖrËr«rÙrÎró)r*r+r,rrªr0r0r1Úvisit_OverlayScopes     z CodeGenerator.visit_OverlayScopec Csn|jD]b}| d|j¡| |j|¡z|j |j¡}WntjyVd|j_ Yq0t |j|j|ƒqdS)Nzcontext.eval_ctx.%s = T) Úoptionsr˜rMr)rKrYr&r r`r'Úsetattr)r*r+r,Úkeywordrcr0r0r1Úvisit_EvalContextModifier s z'CodeGenerator.visit_EvalContextModifiercCsb| ¡}|j ¡}| d|¡| ||¡|jD]}| ||¡q2|j |¡| d|¡dS)Nz%s = context.eval_ctx.save()zcontext.eval_ctx.revert(%s))r—r&Zsaver˜r°rÙr)Zrevert)r*r+r,Z old_ctx_nameZ saved_ctxrbr0r0r1Úvisit_ScopedEvalContextModifier+s    z-CodeGenerator.visit_ScopedEvalContextModifier)NFT)F)r )N)N)Nr)Nr)N)F)N)T)T)F)orZr[r\rYr–r—rdrŸr›rœr¤r§r©r«r¦r˜r¯r½rÀrËrÎrÐrärçrérìrîrÞràrßròrórõrÅr÷rørùrrr}rr$r.r0r:r<r=rArCrHrIrrJrrUrTrVrXr[r]r^rdrergrrirkrmrqrtrvr€rZ visit_AddZ visit_SubZ visit_MulZ visit_DivZvisit_FloorDivZ visit_PowZ visit_ModZ visit_AndZvisit_OrZ visit_PosZ visit_NegZ visit_Notr3r‰rŒrŽrr‘r”r{r|r™r?r›rržr r¡r¢r£r¤r¥r§r©r«r¬r°r±r0r0r0r1rƒ÷sèÿ D        5 P   |&-:K    ) O                rƒ)NFT)=rrÚ collectionsrÚ functoolsrÚ itertoolsrr¯rr¸Z markupsaferrrr Z_compatr r r rrrrÚ exceptionsrZ idtrackingrrrrrrr(rZutilsrrRrrÚhasattrrJrrÚexecr­Ú SyntaxErrorr r3r=rIrSrgrTr]Ú RuntimeErrorrOrurNrar‚rƒr0r0r0r1Úsv                        ø    ÿ  =