3 C\j@sdZddlmZddlmZddlmZddlm Z ddl m Z ddl m Z ddlmZdd lmZdd lmZdd lmZmZmZdd lmZmZmZmZmZmZmZdd l m!Z!m"Z"m#Z#m$Z$m%Z%dddddddddZ&e'e(drdZ)ndZ)dgZ*ye+de*j,dWne-k r YnXy e+dWne-k rHdZ.YnXdZ.dd Z/d6d"d#Z0d$d%Z1d&d'Z2Gd(d)d)e3Z4Gd*d+d+e3Z5Gd,d-d-e6Z7Gd.d/d/eZ8Gd0d1d1eZ9Gd2d3d3e:Z;Gd4d5d5eZz>=.new_func)r)r/r2r0)r/r1 optimizeconst?s r3NcCsHt|tjstd|j||||||}|j||dkrD|jjSdS)z+Generate the python source for a node tree.z Can't compile non template nodesN) isinstancerTemplate TypeErrorZcode_generator_classr)streamgetvalue)r+ environmentnamefilenamer7 defer_initr% generatorr0r0r1generateJs   r>cCs|dks|tks|tkrdSt|ttttttft krd?Zd@dAZ dBdCZ!dDdEZ"dFdGZ#dHdIZ$dJdKZ%ddLdMZ&dNdOZ'dPdQZ(dRdSZ)dTdUZ*dVdWZ+dXdYZ,dZd[Z-d\d]Z.d^d_Z/d`daZ0dbdcZ1dddeZ2dfdgZ3dhdiZ4djdkZ5dldmZ6dndoZ7dpdqZ8drdsZ9dtduZ:dvdwZ;dxdyZe=d~Z?e=dZ@e=dZAe=dZBe=dZCe=dZDe=dZEe=dddZFe=dddZGe>d~ZHe>dZIe>dddZJ[=[>eKddZLeKddZMddZNeKddZOeKddZPddZQeKddZReKddZSeKddZTeKdddZUddZVddZWddZXddZYddZZddZ[ddZ\ddZ]ddZ^ddZ_ddZ`ddZaddZbddZcdS) CodeGeneratorNFTcCs|dkrt}||_||_||_||_d|_||_||_|rFt||_ i|_ i|_ d|_ d|_ d|_i|_i|_g|_d|_d|_d|_d|_d|_d|_g|_g|_dg|_dS)NFrrmTcontext)rr9r:r;r7Zcreated_block_contextr<r%r r(import_aliasesblocksextends_so_farhas_known_extends code_linenorurt debug_info_write_debug_info _new_lines _last_line _first_write_last_identifier _indentation _assign_stack_param_def_block_context_reference_stack)r*r9r:r;r7r<r%r0r0r1rYs8 zCodeGenerator.__init__cCst|||j|jdS)z*Fail with a :exc:`TemplateAssertionError`.N)r r:r;)r*msglinenor0r0r1fail9szCodeGenerator.failcCs|jd7_d|jS)zGet a new unique identifier.rmzt_%d)r)r*r0r0r1temporary_identifier=sz"CodeGenerator.temporary_identifiercCs|j|_|jd|jdS)z7Enable buffering for the frame from that point onwards.z%s = []N)rrc writeline)r*r,r0r0r1rcBs zCodeGenerator.buffercCs|s|jjrd|jd|j|jd|j|j|jd|j|jd|j|jdS|jjr|jd|jdS|jd|jdS)z(Return the buffer contents of the frame.zif context.eval_ctx.autoescape:zreturn Markup(concat(%s))zelse:zreturn concat(%s)N)r&r'rindentrcoutdent autoescape)r*r,force_unescapedr0r0r1return_buffer_contentsGs  z$CodeGenerator.return_buffer_contentscCs|jd7_dS)zIndent by one.rmN)r)r*r0r0r1rYszCodeGenerator.indentrmcCs|j|8_dS)zOutdent by step.N)r)r*stepr0r0r1r]szCodeGenerator.outdentcCs.|jdkr|jd|n|jd|j|dS)z%Yield or write into the frame buffer.Nzyield z %s.append()rcr)r*r,r+r0r0r1 start_writeas zCodeGenerator.start_writecCs|jdk r|jddS)z1End the writing process started by `start_write`.N))rcwrite)r*r,r0r0r1 end_writehs zCodeGenerator.end_writecCs$|j|||j||j|dS)z4Simple shortcut for start_write + write + end_write.N)rrr)r*sr,r+r0r0r1 simple_writems  zCodeGenerator.simple_writec CsBy(|jdx|D]}|j||qWWntk r<YnXdS)zVisit 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)rr)r)r*rr,r+r0r0r1 blockvisitss   zCodeGenerator.blockvisitcCs|jrp|jsR|jjd|j|j|j7_|jdk rR|jj|j|jfd|_d|_|jjd|jd|_|jj|dS)z&Write a string into the output stream. NFz r) rrr7rrrrappendr)r*xr0r0r1r~s   zCodeGenerator.writercCs|j|||j|dS)z!Combination of newline and write.N)newliner)r*rr+extrar0r0r1rs zCodeGenerator.writelinecCs:t|jd||_|dk r6|j|jkr6|j|_|j|_dS)z/Add one or more newlines before the next write.rmN)maxrrrr)r*r+rr0r0r1rszCodeGenerator.newlinec Csd}x0tdd|jD|pfD]}t|r d}Pq Wx$|jD]}|jd|j||q>W|sx$|jD]}|jd|j||qhW|dk rx&t|D]\}}|jd||fqW|jr|jd|j|j||r|jdk r|jd n |jd x8|jD].}|jd |j |j|j ||jdqW|dk rhx(t|D]\}}|jd ||fqHW|jdk r|jd |j|j||jdn |jdn$|jdk r|jd|j|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 occour. The extra keyword arguments should be given as python dict. Fcss|] }|jVqdS)N)rN).0rr0r0r1 sz*CodeGenerator.signature..Tz, Nz, %s=%sz, *z , **dict({z, **{z%r: z%r: %s, z}, **r}z, **) rr-is_python_keywordargsrr)rZdyn_argsZ dyn_kwargsrNrL) r*r+r, extra_kwargsZkwarg_workaroundkwargargrNrLr0r0r1 signaturesJ                  zCodeGenerator.signaturecCszt}x|D]}|j|q WxVdD]N}t||}x>t||D]0}||krV|j||<|jd||||fq>Wq$WdS)zPull all the dependencies.rtruz%s = environment.%s[%r]N)rtru)rsr)getattrrr)r*rrSr+ dependencymappingr:r0r0r1pull_dependenciess    zCodeGenerator.pull_dependenciescCsg}xt|jjD]p\}\}}|tkr(q|tkrJ|jd||j|fq|tkrf|jd||fq|tkrz|j |qt dqW|r|jddj |dS)Nz %s = %s(%r)z%s = %szunknown load instructionz %s = missingz = ) rr_loadsrrrget_resolve_funcrrrNotImplementedErrorjoin)r*r,undefstargetactionparamr0r0r1 enter_frames  zCodeGenerator.enter_framecCsH|sDg}x"t|jjD]\}}|j|qW|rD|jddj|dS)Nz %s = missingz = )rr_rrrr)r*r,with_python_scoperr_r0r0r1 leave_frames zCodeGenerator.leave_framecCs|jjrd|Sd|S)Nz async def %szdef %s)r9is_async)r*r:r0r0r1funcszCodeGenerator.funcc Cs|j}|jj|t|}d}t}g}xNt|jD]@\}}|jdkrL|}|jdkrb|j|j|j |jj |jq6Wt |j d} d| kr|dk ry|j |t|jWqtk r|jd|jYqXn|j |jjdd|_d| krd|kr|j |jjdd|_d| krDd|krD|j |jjdd|_d|_|jj||jd|jd d j|f||j|j||j||j|xt|jD]\}}|jj |j} |jd | |jy|j |t|j} Wn2tk r|jd | d |j|jfYnX|jd| |j| ||j| |j qW|j!|j"|j ||j#|dd|j$|dd|j ||fS)z/Dump the function def of a macro or call block.Ncallerr-varargszhWhen defining macros or call blocks the special "caller" argument must be omitted or be given a default.TFz%s(%s):macroz, zif %s is missing:z%s = undefined(%r, name=%r)zparameter %r was not providedz%s = )r)r)r-r)rr-r)%ror_ analyze_noderUrH enumeraterr:rwrrefrTbodydefaultslen IndexErrorrrdeclare_parameterrVrWrXrbrrrrrcrpush_parameter_definitionsr)mark_parameter_storedrpop_parameter_definitionsrrr) r*r+r, macro_refZexplicit_callerZskip_special_paramsridxrrQrdefaultr0r0r1 macro_bodysp            zCodeGenerator.macro_bodycCs`djdd|jjD}t|jdd}t|jjdkr>|d7}|jd|||j|j|jfdS) z.r:Nrm,zLMacro(environment, macro, %r, (%s), %r, %r, %r, context.eval_ctx.autoescape)) rr+rrrrrWrXrV)r*rr,Z arg_tupler:r0r0r1 macro_defFszCodeGenerator.macro_defcCs*d|j}|jdk r&|dt|j7}|S)z.Return a human readable position for the node.zline %dNz in )rr:r)r*r+rlr0r0r1positionQs  zCodeGenerator.positioncCs"ddjddt|jjDS)Nz{%s}z, css|]\}}d||fVqdS)z%r: %sNr0)rr:rr0r0r1rZsz3CodeGenerator.dump_local_context..)rrr_Z dump_stores)r*r,r0r0r1dump_local_contextXsz CodeGenerator.dump_local_contextcCs"|jd|jd|jddS)zWrites 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.undefinedzif 0: yield NoneN)r)r*r0r0r1 write_commons]s  zCodeGenerator.write_commonscCs|jj|jjdS)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)rrr_Zdump_param_targets)r*r,r0r0r1rfsz(CodeGenerator.push_parameter_definitionscCs|jjdS)z+Pops the current parameter definitions set.N)rpop)r*r0r0r1rosz'CodeGenerator.pop_parameter_definitionscCs|jr|jdj|dS)zMarks a parameter in the current parameter definitions as stored. This will skip the enforced undefined checks. rmN)rr})r*rr0r0r1rssz#CodeGenerator.mark_parameter_storedcCs|jj|dS)N)rr)r*rr0r0r1push_context_referencezsz$CodeGenerator.push_context_referencecCs|jjdS)N)rr)r*r0r0r1pop_context_reference}sz#CodeGenerator.pop_context_referencecCs |jdS)Nrmr)r)r*r0r0r1get_context_refszCodeGenerator.get_context_refcCs|jd}|dkrdSd|S)Nrmrresolvez %s.resolver)r)r*rr0r0r1rs zCodeGenerator.get_resolve_funccCsd|j|j|fS)Nz%s.derived(%s))rr)r*r,r0r0r1derive_contextszCodeGenerator.derive_contextcCs|js dS||jdkS)z4Checks if a given target is an undeclared parameter.Frmr)r)r*rr0r0r1parameter_is_undeclaredsz%CodeGenerator.parameter_is_undeclaredcCs|jjtdS)z+Pushes a new layer for assignment tracking.N)rrrH)r*r0r0r1push_assign_trackingsz"CodeGenerator.push_assign_trackingcCs|jj}|j s| rdSdd|D}t|dkrbtt|}|jj|}|jd||fnV|jdx@t |D]4\}}|r|j d|jj|}|j d||fqvW|j d |rt|dkr|jd |d n|jd dj t t |dS) zoPops the topmost level for assignment tracking and updates the context variables if necessary. NcSs g|]}|dddkr|qS)Nrmrr0)rrr0r0r1 sz5CodeGenerator.pop_assign_tracking..rmzcontext.vars[%r] = %szcontext.vars.update({z, z%r: %sz})zcontext.exported_vars.add(%r)rz"context.exported_vars.update((%s)))rrr`rnextiterr_rrrrrrr)r*r,varsZ public_namesr:rrr0r0r1pop_assign_trackings*         z!CodeGenerator.pop_assign_trackingcCs|dkstdt|j|j}ddlm}|jddjt|jddj||jj rd|jd|j rpdprd }|j t j dk }x@|jt jD]0}|j|jkr|jd |j|j||j|j<qWxz|jt jD]j}|j|jkr|j} |j|j| <} d | kr,| jd d \} } |jd | | | fq|jd| | fqW|jd|j|jd|jd|fd d|j|jt|}dt|jd&kr|jjd} |jd| |jj |d|_!|_"|o|j# |_$|r|jd|j%||j&|j|j'|j||j(|dd|j)|r|j#sD|j|jd|jt*rj|jj rj|jdn8|jd|jj rdpd |j|jd|j)|j)d |j# xt+|jD]\}}|jd|jd||f|d |j|jt|}t|jd'}d|kr0|jjd} |jd| d|krZ|jjd} |jd| ||f|jj |||_,|j%||j&|j|j'|j||j(|dd|j)qW|jd djd!d"|jDd d|jd#d$jd%d"|j-DdS)(Nzno root frame allowedr)__all__zfrom __future__ import %sz, zfrom jinja2.runtime import zOfrom jinja2.asyncsupport import auto_await, auto_aiter, make_async_loop_contextz, environment=environmentzblock %r defined twice.rmzfrom %s import %s as %szimport %s as %sz name = %rz%s(context, missing=missing%s):root)rr*z%s = TemplateReference(context)Tzparent_template = None)rzif 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_superz %s = context.super(%r, block_%s)z blocks = {%s}css|]}d||fVqdS)z %r: block_%sNr0)rrr0r0r1r#sz/CodeGenerator.visit_Template..zdebug_info = %r&css|]}d|VqdS)z%s=%sNr0)rrr0r0r1r(s)r*)r*r).AssertionErrorrr9r:Zjinja2.runtimerrr code_featuresrr<findrZExtendsfind_allZBlockrrrZ ImportedName importnamerrrsplitrrrr]rTrr_rrr`rarrbrrrrrsupports_yield_fromrrdr)r*r+r,r&ZexportedZenvenvZ have_extendsrdimport_impaliasmoduleobjrr: block_framerQr0r0r1visit_Templates                       zCodeGenerator.visit_TemplatecCsd}|jr8|jrdS|jdkr8|jd|j|d7}|jrJ|j|}n|j}tr|j j r|j dkr|jd|j |f|nD|j j rdpd}|jd||j |f||j|j d ||j|j|dS) z.Call a block and register it for the template.rNzif parent_template is None:rmz$yield from context.blocks[%r][0](%s)z async forforz&%s event in context.blocks[%r][0](%s):event)r`rrrrscopedrrrr9rrcr:rr)r*r+r,r^rloopr0r0r1rz+s,     zCodeGenerator.visit_BlockcCs|js|jd|j|jdkrZ|js6|jd|j|jdd|jrRtn|j|jd||j |j ||j d|j |jdt |j|jd |j|jrd |_|jd 7_d S) zCalls the extender.z,cannot use extend from a non top-level scoperzif parent_template is not None:zraise TemplateRuntimeError(%r)zextended multiple timesz+parent_template = environment.get_template(z, %r)z6for name, parent_block in parent_template.blocks.%s():z8context.blocks.setdefault(name, []).append(parent_block)TrmN)r`rrrrrrrrr)templaterr:dict_item_iterra)r*r+r,r0r0r1 visit_ExtendsKs.    zCodeGenerator.visit_ExtendscCs|jr|jd|jd}t|jtjrVt|jjtr>d}qnt|jjt t frnd}nt|jtj tj frnd}|jd|||j |j||jd|j|jr|j|jd|j|jd|j|jd |jd }|jr|jjrd pd }|jd ||j|fn6|jjr,|jdn trB|jdd}n |jd|sn|j|jd||j|jr~|jdS)zHandles includes.ztry:Zget_or_select_templateZ get_templateZselect_templateztemplate = environment.%s(z, %r)zexcept TemplateNotFound:rzelse:Fz async forrzY%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_missingrrr4rrZConstrLrrFrGTupleListr)rr:r with_contextr9rrrr)r*r+r, func_nameZskip_event_yieldrr0r0r1 visit_IncludezsN         zCodeGenerator.visit_IncludecCs|jd|jj|j||jr0|jd|j|jjrB|jd|jd|j|j ||jd|j |j r|jd|jjrdpd|j |fn|jjr|jd n |jd |jr|jj d  r|jd |jd S)zVisit regular imports.z%s = zcontext.vars[%r] = zawait zenvironment.get_template(z, %r).z*make_module%s(context.get_all(), True, %s)_asyncrz_get_default_module_async()z_get_default_module()rz!context.exported_vars.discard(%r)N)rr_rrr`rr9rr)rr:rr startswith)r*r+r,r0r0r1 visit_Imports"    zCodeGenerator.visit_Importcs|j||jd|jjrdpd|j|j|jd|j|jrn|jd|jjrZdp\d|jfn|jjr|jdn |jdg}g}x|j D]}t |t r|\}}n|}|j d j j||f|j d j j||j|j d j j|d |j|t|f|f|jjr|j||jd s|j|qW|rt|dkr|d}|j d|j j|fn"|j ddjfdd|D|rt|dkr|j d|dn|j ddjtt|dS)zVisit named imports.z/included_template = %senvironment.get_template(zawait rz, %r).z*make_module%s(context.get_all(), True, %s)r z_get_default_module_async()z_get_default_module()z,%s = getattr(included_template, %r, missing)zif %s is missing:z9%s = undefined(%r %% included_template.__name__, name=%r)zGthe template %%r (imported on %s) does not export the requested name %srrmrzcontext.vars[%r] = %szcontext.vars.update({%s})z, c3s"|]}d|jj|fVqdS)z%r: %sN)r_r)rr:)r,r0r1rsz1CodeGenerator.visit_FromImport..z!context.exported_vars.discard(%r)z-context.exported_vars.difference_update((%s))N)rrr9rr)rr:rrrRr4rFrr_rrrrrr`rr rrr)r*r+r,Z var_namesZdiscarded_namesr:rr0)r,r1visit_FromImports\            zCodeGenerator.visit_FromImportc CsV|j}|j}|j}|jp2dt|jd%dd&k}d}|rH|jjd}|jj|dd|jrn|jj|dd|jrl|j }|jj|dd|j d|j ||j|j |j ||j |jjrdpd |j|j||jd |j|jjrd pd |jd |j |j d|j|j|j||jd |j |j d|j|j||jd|j|dd|jr|j d|j d||j |j||j|_|r|j d|x<|jtjD],} | jdkr| jdkr|jd| jqW|jr|j } |j d| |j |jjr(dp*d ||j|j||rn|jjr^|jd|n|jd|n |jd |jr|jd||jr|jdnF|jjr| r|jd|j|j||jjr| r|jd|jr|jd|jr|jdn|j|rdp d |j |j ||j|j||jrZ|j d | |j|j||jov|j d|jr|j d!| |j |j ||j|j||j||j|jrR|j ||j|j!|||jjr|jd"|jd#|jjr|jd|j|j||jjr>|jd|jd$|j"|dS)'Nrr)only)Z for_branchelsetestz %s(fiter):z async for zfor z in zauto_aiter(fiter)Zfiter:zif zyield T)rz'%s(reciter, loop_render_func, depth=0):z %s = missingstorez8Can't assign to special loop variable in for-loop targetz%s = 1z&, %s in await make_async_loop_context(z, %s in LoopContext(z%s(Zreciterz auto_aiter(rz&, undefined, loop_render_func, depth):z , undefined):z%s = 0zif %s:zawait zloop(z, loop))r)r)#ro recursiverTiter_child_nodesr_rrelse_rrrrrrr9rr)rrrrrcrrNamer|r:rrrrrrrr) r*r+r,Z loop_frameZ test_frameZ else_frameZ extended_loopZloop_refZloop_filter_funcr:Ziteration_indicatorr0r0r1 visit_Fors                             zCodeGenerator.visit_ForcCs|j}|jd||j|j||jd|j|j|j||jxP|j D]F}|jd||j|j||jd|j|j|j||jqRW|j r|jd|j|j|j ||jdS)Nzif rzelif zelse:) rprr)rrrrrrelif_r)r*r+r,Zif_framerr0r0r1visit_Ifs&       zCodeGenerator.visit_IfcCs|j||\}}|j|jrX|jjds:|jd|j|jj|j}|jd|j|jd|jj|j|j ||dS)Nrzcontext.exported_vars.add(%r)zcontext.vars[%r] = z%s = ) rrr`r:r rr_rrr)r*r+r,Z macro_framerrr0r0r1 visit_Macros zCodeGenerator.visit_MacrocCsR|j||\}}|jd|j|||j|||j|j|dd|j|dS)Nz caller = T)forward_caller)rrrr visit_Callcallr)r*r+r,Z call_framerr0r0r1visit_CallBlocks    zCodeGenerator.visit_CallBlockcCsh|j}|jj||j||j||j|j||j|||j|j ||j ||j |dS)N) ror_rrrcrrrrxfilterrr)r*r+r,Z filter_framer0r0r1visit_FilterBlocks     zCodeGenerator.visit_FilterBlockcCs|j}|jj||j|xLtt|j|jD]6\}\}}|j|j |||j d|j ||q2W|j |j ||j |dS)Nz = )ror_rrrrtargetsvaluesrr)rrrr)r*r+r,Z with_framerrexprr0r0r1 visit_Withs     zCodeGenerator.visit_WithcCs|j||j|j|dS)N)rr)r+)r*r+r,r0r0r1visit_ExprStmts zCodeGenerator.visit_ExprStmtcsjr|jrdSd}jjrjjj}t|dds} t| trX| j t| jddn| j d|j | q0Wjdjtt| djx|D]}j|d} |j jrЈjd| d 7} n|j j rjd| d 7} jjdk rdjdtjjddr"jdn:tjjddr@jdntjjddr\jd| d 7} j||jd| dqWjjd|rjdS)"NTZcontextfunctionFZevalcontextfunctionZenvironmentfunctioncstjjj|S)N)rr9finalize)r)r*r0r1sz,CodeGenerator.visit_Output..cstjj|S)N)rr9r()r)r*r0r1r)szif parent_template is None:__html__rmrz %s.append(z %s.extend((zyield rz7(escape if context.eval_ctx.autoescape else to_string)(zescape(z to_string(zenvironment.finalize(z context, rz))%z%%z%sz % (rzcontext.eval_ctx, z environment, z, rr)rrbr9r(rrrrr Impossibleas_constr&rrhasattrr*r Exceptionr4rGrrcrr rr'rr)rreplace)r*r+r,Zallow_constant_finalizerr(Z outdent_laterrchildconstrMvalcloseformat argumentsZargumentr0)r*r1 visit_Outputs                             "                    zCodeGenerator.visit_OutputcCsF|j|j||j|j||jd|j|j||j|dS)Nz = )rrr)rrr+r)r*r+r,r0r0r1 visit_AssignVs   zCodeGenerator.visit_AssigncCs|j|j}d|_|jj||j||j||j|j||j ||j |j ||j d|j dk r|j|j |n|j d|j|j d|j||j|dS)NFz9 = (Markup if context.eval_ctx.autoescape else identity)(z concat(%s)r)rrorbr_rrrcrrrr)rrr!rxrr)r*r+r,rr0r0r1visit_AssignBlock^s         zCodeGenerator.visit_AssignBlockcCs|jdkr(|jr(|jr(|jdj|j|jj|j}|jdkr|jj|}|dk oj|dtkoj|j | s|j d|j||fdS|j |dS)Nrrmr{rz-(undefined(name=%r) if %s is missing else %s)r) r|r`rrwr:r_rZ find_loadrrr)r*r+r,rr{r0r0r1r~ws   zCodeGenerator.visit_NamecCsR|jj|j}|jd||j|jdd|j|jd||jfdS)Nz!if not isinstance(%s, Namespace):zraise TemplateRuntimeError(%r)z/cannot assign attribute on non-namespace objectz%s[%r])r_rr:rrrattr)r*r+r,rr0r0r1 visit_NSRefszCodeGenerator.visit_NSRefcCs8|j|j}t|tr&|jt|n|jt|dS)N)r-r&r4rDrstrr)r*r+r,r3r0r0r1 visit_Consts  zCodeGenerator.visit_Constc CsFy|jt|j|jWn&tjk r@|jd|jYnXdS)Nz9(Markup if context.eval_ctx.autoescape else identity)(%r))rrr-r&rr,data)r*r+r,r0r0r1visit_TemplateDatas z CodeGenerator.visit_TemplateDatacCsZ|jdd}x0t|jD]"\}}|r0|jd|j||qW|j|dkrPdpRddS)N(rmz, rz,)rr)rrr"r))r*r+r,rrMr0r0r1 visit_Tuples  zCodeGenerator.visit_TuplecCsJ|jdx0t|jD]"\}}|r,|jd|j||qW|jddS)N[z, ])rrr"r))r*r+r,rrMr0r0r1 visit_Lists   zCodeGenerator.visit_ListcCsd|jdxJt|jD]<\}}|r,|jd|j|j||jd|j|j|qW|jddS)N{z, z: r)rrr"r)rNrL)r*r+r,rrMr0r0r1 visit_Dicts   zCodeGenerator.visit_Dictcstfdd}|S)Ncs|jjrJ|jjkrJ|jd|j|j||jd|j|j|n4|jd|j|j||jd|j|j||jddS)Nz$environment.call_binop(context, %r, z, r@z %s r)r9 sandboxedZintercepted_binopsrr)leftright)r*r+r,)operatorr0r1rSs   z$CodeGenerator.binop..visitor)r3)rJ interceptablerSr0)rJr1binopszCodeGenerator.binopcstfdd}|S)Ncs\|jjr2|jjkr2|jd|j|j|n|jd|j|j||jddS)Nz#environment.call_unop(context, %r, r@r)r9rGZintercepted_unopsrr)r+)r*r+r,)rJr0r1rSs z#CodeGenerator.uaop..visitor)r3)rJrKrSr0)rJr1uaops zCodeGenerator.uaop+-*/z//z**r+and)rKorznot cCsb|jjrd}n|jjrd}nd}|jd|x$|jD]}|j|||jdq6W|jddS)Nz;(context.eval_ctx.volatile and markup_join or unicode_join)Z markup_joinZ unicode_joinz%s((z, z)))r&r'rrrr))r*r+r,r rr0r0r1 visit_Concats  zCodeGenerator.visit_ConcatcCs.|j|j|x|jD]}|j||qWdS)N)r)r%ops)r*r+r,opr0r0r1 visit_Compares zCodeGenerator.visit_ComparecCs&|jdt|j|j|j|dS)Nz %s )r operatorsrVr)r%)r*r+r,r0r0r1 visit_OperandszCodeGenerator.visit_OperandcCs,|jd|j|j||jd|jdS)Nzenvironment.getattr(z, %r))rr)r+r:)r*r+r,r0r0r1 visit_Getattrs zCodeGenerator.visit_GetattrcCs~t|jtjr@|j|j||jd|j|j||jdn:|jd|j|j||jd|j|j||jddS)NrBrCzenvironment.getitem(z, r)r4rrSlicer)r+r)r*r+r,r0r0r1 visit_Getitem s    zCodeGenerator.visit_GetitemcCs`|jdk r|j|j||jd|jdk r:|j|j||jdk r\|jd|j|j|dS)Nr)startr)rstopr)r*r+r,r0r0r1 visit_Slices     zCodeGenerator.visit_SlicecCs,|jjr|jd|j|j|jd|jjj|j}|dkrT|jd|j|jt|ddrl|jdn.t|ddr|jdnt|d dr|jd |j dk r|j |j |nJ|j j r|jd |j |j fn*|j jr|jd |j n|jd |j |j|||jd|jjr(|jddS)Nzawait auto_await(r@zno filter named %rZ contextfilterFz context, Zevalcontextfilterzcontext.eval_ctx, Zenvironmentfilterz environment, zB(context.eval_ctx.autoescape and Markup(concat(%s)) or concat(%s))zMarkup(concat(%s))z concat(%s)r)r9rrrtr:getrrrr+r)r&r'rcrr)r*r+r,rr0r0r1rx#s0           zCodeGenerator.visit_FiltercCs`|j|j|jd|j|jjkr8|jd|j|j|j|j||j|||jddS)Nr@zno test named %rr) rrur:r9rrr)r+r)r*r+r,r0r0r1ryCs  zCodeGenerator.visit_Testcs^fdd}jdjjjdjjjd|jddS)Ncs4jdk rjjSjddjdS)Nz undefined(%r)zRthe inline if-expression on %s evaluated to false and no else section was defined.)Zexpr2r)rrr0)r,r+r*r0r1 write_expr2Ns z1CodeGenerator.visit_CondExpr..write_expr2r@z if z else r)rr)Zexpr1r)r*r+r,rar0)r,r+r*r1visit_CondExprLs   zCodeGenerator.visit_CondExprcCs||jjr|jd|jjr&|jdn |jd|j|j||rJddipLd}|j||||jd|jjrx|jddS)Nzawait auto_await(zenvironment.call(context, z context.call(rr)r9rrrGr)r+r)r*r+r,rrr0r0r1r]s    zCodeGenerator.visit_CallcCs"|j|jd|j|j|dS)N=)rrNr)rL)r*r+r,r0r0r1 visit_KeywordlszCodeGenerator.visit_KeywordcCs&|jd|j|j||jddS)NzMarkup(r)rr)r%)r*r+r,r0r0r1visit_MarkSafers zCodeGenerator.visit_MarkSafecCs&|jd|j|j||jddS)Nz5(context.eval_ctx.autoescape and Markup or identity)(r)rr)r%)r*r+r,r0r0r1visit_MarkSafeIfAutoescapews z(CodeGenerator.visit_MarkSafeIfAutoescapecCs|jd|jdS)Nz environment.)rr:)r*r+r,r0r0r1visit_EnvironmentAttribute|sz(CodeGenerator.visit_EnvironmentAttributecCs|jd|j|jfdS)Nzenvironment.extensions[%r].%s)r identifierr:)r*r+r,r0r0r1visit_ExtensionAttributesz&CodeGenerator.visit_ExtensionAttributecCs|j|j|jdS)N)rrr)r*r+r,r0r0r1visit_ImportedNamesz CodeGenerator.visit_ImportedNamecCs|j|jdS)N)rr:)r*r+r,r0r0r1visit_InternalNamesz CodeGenerator.visit_InternalNamecCs|jddS)Nr)r)r*r+r,r0r0r1visit_ContextReferencesz$CodeGenerator.visit_ContextReferencecCs|jd|dS)Ncontinue)r)r*r+r,r0r0r1visit_ContinueszCodeGenerator.visit_ContinuecCs|jd|dS)Nbreak)r)r*r+r,r0r0r1 visit_BreakszCodeGenerator.visit_BreakcCs:|j}|jj||j||j|j||j|dS)N)ror_rrrrr)r*r+r, scope_framer0r0r1 visit_Scopes   zCodeGenerator.visit_ScopecCs|j}|jd||j|f|jd||j|j||j||jdd}|jj||j ||j |j ||j ||j dS)Nz%s = %sz %s.vars = T)rn)rrrr)rrror_rrrrrr)r*r+r,r|rqr0r0r1visit_OverlayScopes     z CodeGenerator.visit_OverlayScopec Cstxn|jD]d}|jd|j|j|j|y|jj|j}Wntjk rZd|j_ YqXt |j|j|qWdS)Nzcontext.eval_ctx.%s = T) optionsrrNr)rLr-r&rr,r'setattr)r*r+r,keywordr3r0r0r1visit_EvalContextModifiers z'CodeGenerator.visit_EvalContextModifiercCsf|j}|jj}|jd||j||x|jD]}|j||q4W|jj||jd|dS)Nz%s = context.eval_ctx.save()zcontext.eval_ctx.revert(%s))rr&saverrwrr)revert)r*r+r,Z old_ctx_nameZ saved_ctxr1r0r0r1visit_ScopedEvalContextModifiers    z-CodeGenerator.visit_ScopedEvalContextModifier)NFT)F)rm)N)N)Nr)Nr)N)F)N)T)T)F)drZr[r\rYrrrcrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzrr r rrrrr r"r&r'r7r8r9r~r;r=r?rArDrFrLrMZ visit_AddZ visit_SubZ visit_MulZ visit_DivZvisit_FloorDivZ visit_PowZ visit_ModZ visit_AndZvisit_OrZ visit_PosZ visit_NegZ visit_Notr3rTrWrYrZr\r_rxryrbrrdrerfrgrirjrkrlrnrprrrsrwrzr0r0r0r1rs B        5  M    t /6;                 r)NFT)=rq itertoolsrrkrrvrr functoolsrZjinja2rZ jinja2.nodesrZjinja2.visitorrZjinja2.optimizerr Zjinja2.exceptionsr Z jinja2.utilsr r r Zjinja2._compatrrrrrrrZjinja2.idtrackingrrrrrrXr.rKrrexecr SyntaxErrorrr3r>rJrTrfrUr] RuntimeErrorrPrsrOr/rrr0r0r0r1 s\         $       >