dbfdg 3 sݨ\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+r.r,)r+r- optimizeconst?s r/NcCsHt|tjstd|j||||||}|j||dkrD|jjSdS)z+Generate the python source for a node tree.z Can't compile non template nodesN) isinstancerZTemplate TypeErrorZcode_generator_classr&streamgetvalue)r( environmentnamefilenamer2 defer_initr" generatorr,r,r-generateJs   r9cCs|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)NFrrhTcontext)rr4r5r6r2Zcreated_block_contextr7r"r r%import_aliasesblocksextends_so_farhas_known_extends code_linenorpro debug_info_write_debug_info _new_lines _last_line _first_write_last_identifier _indentation _assign_stack_param_def_block_context_reference_stack)r'r4r5r6r2r7r"r,r,r-rTs8 zCodeGenerator.__init__cCst|||j|jdS)z*Fail with a :exc:`TemplateAssertionError`.N)r r5r6)r'msglinenor,r,r-fail9szCodeGenerator.failcCs|jd7_d|jS)zGet a new unique identifier.rhzt_%d)r)r'r,r,r-temporary_identifier=sz"CodeGenerator.temporary_identifiercCs|j|_|jd|jdS)z7Enable buffering for the frame from that point onwards.z%s = []N)rr^ writeline)r'r)r,r,r-r^Bs 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$rindentr^outdent autoescape)r'r)force_unescapedr,r,r-return_buffer_contentsGs  z$CodeGenerator.return_buffer_contentscCs|jd7_dS)zIndent by one.rhN)r)r'r,r,r-rYszCodeGenerator.indentrhcCs|j|8_dS)zOutdent by step.N)r)r'stepr,r,r-r]szCodeGenerator.outdentcCs.|jdkr|jd|n|jd|j|dS)z%Yield or write into the frame buffer.Nzyield z %s.append()r^r)r'r)r(r,r,r- start_writeas zCodeGenerator.start_writecCs|jdk r|jddS)z1End the writing process started by `start_write`.N))r^write)r'r)r,r,r- end_writehs zCodeGenerator.end_writecCs$|j|||j||j|dS)z4Simple shortcut for start_write + write + end_write.N)rrr)r'sr)r(r,r,r- 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&rz)r'rr)r(r,r,r- 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) rrr2rrrrappendr)r'xr,r,r-r~s   zCodeGenerator.writercCs|j|||j|dS)z!Combination of newline and write.N)newliner)r'rr(extrar,r,r-rs zCodeGenerator.writelinecCs:t|jd||_|dk r6|j|jkr6|j|_|j|_dS)z/Add one or more newlines before the next write.rhN)maxrrrr)r'r(rr,r,r-rszCodeGenerator.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)rI).0rr,r,r- 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_kwargsrIrG) r'r(r) extra_kwargsZkwarg_workaroundZkwargargrIrGr,r,r- signaturesJ                  zCodeGenerator.signaturecCszt}x|D]}|j|q WxVdD]N}t||}x>t||D]0}||krV|j||<|jd||||fq>Wq$WdS)zPull all the dependencies.rorpz%s = environment.%s[%r]N)rorp)rnr&getattrrr)r'rrNr(Z dependencymappingr5r,r,r-pull_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 = ) rrZloadsrrrget_resolve_funcrrrNotImplementedErrorjoin)r'r)undefstargetactionZparamr,r,r- enter_frames  zCodeGenerator.enter_framecCsH|sDg}x"t|jjD]\}}|j|qW|rD|jddj|dS)Nz %s = missingz = )rrZrrrr)r'r)with_python_scoperr_r,r,r- leave_frames zCodeGenerator.leave_framecCs|jjrd|Sd|S)Nz async def %szdef %s)r4is_async)r'r5r,r,r-funcszCodeGenerator.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):Zmacroz, zif %s is missing:z%s = undefined(%r, name=%r)zparameter %r was not providedz%s = )r)r)r*r)rr*r)%rjrZ analyze_noderPrC enumeraterr5rrrrefrObodyZdefaultslen IndexErrorrrdeclare_parameterrQrRrSr]rrrrr^rpush_parameter_definitionsr&mark_parameter_storedrpop_parameter_definitionsrrr) r'r(r) macro_refZexplicit_callerZskip_special_paramsridxrrLrdefaultr,r,r- macro_bodysp            zCodeGenerator.macro_bodycCs`djdd|jjD}t|jdd}t|jjdkr>|d7}|jd|||j|j|jfdS) z.r5Nrh,zLMacro(environment, macro, %r, (%s), %r, %r, %r, context.eval_ctx.autoescape)) rr(rrrrrRrSrQ)r'rr)Z arg_tupler5r,r,r- macro_defFszCodeGenerator.macro_defcCs*d|j}|jdk r&|dt|j7}|S)z.Return a human readable position for the node.zline %dNz in )rr5r)r'r(rgr,r,r-positionQs  zCodeGenerator.positioncCs"ddjddt|jjDS)Nz{%s}z, css|]\}}d||fVqdS)z%r: %sNr,)rr5rr,r,r-rZsz3CodeGenerator.dump_local_context..)rrrZZ dump_stores)r'r)r,r,r-dump_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'r,r,r- 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)rrrZZdump_param_targets)r'r)r,r,r-rfsz(CodeGenerator.push_parameter_definitionscCs|jjdS)z+Pops the current parameter definitions set.N)rpop)r'r,r,r-rosz'CodeGenerator.pop_parameter_definitionscCs|jr|jdj|dS)zMarks a parameter in the current parameter definitions as stored. This will skip the enforced undefined checks. rhN)rrx)r'rr,r,r-rssz#CodeGenerator.mark_parameter_storedcCs|jj|dS)N)rr)r'rr,r,r-push_context_referencezsz$CodeGenerator.push_context_referencecCs|jjdS)N)rr)r'r,r,r-pop_context_reference}sz#CodeGenerator.pop_context_referencecCs |jdS)Nrhr)r)r'r,r,r-get_context_refszCodeGenerator.get_context_refcCs|jd}|dkrdSd|S)Nrhr|Zresolvez %s.resolver)r)r'rr,r,r-rs zCodeGenerator.get_resolve_funccCsd|j|j|fS)Nz%s.derived(%s))rr)r'r)r,r,r-derive_contextszCodeGenerator.derive_contextcCs|js dS||jdkS)z4Checks if a given target is an undeclared parameter.Frhr)r)r'rr,r,r-parameter_is_undeclaredsz%CodeGenerator.parameter_is_undeclaredcCs|jjtdS)z+Pushes a new layer for assignment tracking.N)rrrC)r'r,r,r-push_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)Nrhrr,)rrr,r,r- sz5CodeGenerator.pop_assign_tracking..rhzcontext.vars[%r] = %szcontext.vars.update({z, z%r: %sz})zcontext.exported_vars.add(%r)rz"context.exported_vars.update((%s)))rrr[rnextiterrZrrrrrrr)r'r)varsZ public_namesr5rrr,r,r-pop_assign_trackings*         z!CodeGenerator.pop_assign_trackingcCst|j|j}ddlm}|jddjt|jddj||jjrT|jd|j r`dpbd}|j t j dk }x@|j t jD]0}|j|jkr|jd |j|j||j|j<qWxz|j t 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"s4|j|jd|jt)rZ|jj rZ|jdn8|jd|jjrpdprd|j|jd|j(|j(d |j" xt*|jD]\}}|jd|jd||f|d |j|jt|}t|jd&}d|kr |jjd} |jd| d|krJ|jjd} |jd| ||f|jj|||_+|j$||j%|j|j&|j||j'|dd|j(qW|jddjd d!|jDd d|jd"d#jd$d!|j,DdS)'Nr)__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.rhzfrom %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_%sNr,)rrr,r,r-r#sz/CodeGenerator.visit_Template..zdebug_info = %r&css|]}d|VqdS)z%s=%sNr,)rrr,r,r-r(s)r')r'r)-rr4r5Zjinja2.runtimerrr code_featuresrr7findrZExtendsfind_allZBlockr~rrZ ImportedName importnamer}rrsplitrrrrXrOrrZrrr[r\rr]rrrrrsupports_yield_fromrr_r)r'r(r)r#ZexportedZenvenvZ have_extendsr_import_Zimpaliasmoduleobjrr5 block_framerLr,r,r-visit_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:rhz$yield from context.blocks[%r][0](%s)z async forforz&%s event in context.blocks[%r][0](%s):event)r[rrrrZscopedrrrr4rr^r5rr)r'r(r)rYr|loopr,r,r-ru+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)TrhN)r[rrrrrrrzrr&templaterr5dict_item_iterr\)r'r(r)r,r,r- 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_missingrrr0rrZConstrGrrArBZTupleZListr&rr5r with_contextr4rrrr)r'r(r) func_nameZskip_event_yieldrr,r,r- 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)rrZrrr[rr4rr&rr5rr startswith)r'r(r)r,r,r- 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)rz_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 %srrhrzcontext.vars[%r] = %szcontext.vars.update({%s})z, c3s"|]}d|jj|fVqdS)z%r: %sN)rZr)rr5)r)r,r-rsz1CodeGenerator.visit_FromImport..z!context.exported_vars.discard(%r)z-context.exported_vars.difference_update((%s))N)rrr4rr&rr5rrrMr0rArrZrrrrrr[rrrrr)r'r(r)Z var_namesZdiscarded_namesr5rr,)r)r-visit_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)Zonly)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)#rj recursiverOZiter_child_nodesrZrrelse_rrrrrrr4rr&rrrrr^rrNamerwr5rrrrrrrr) r'r(r)Z loop_frameZ test_frameZ else_frameZ extended_loopZloop_refZloop_filter_funcr5Ziteration_indicatorr,r,r- 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:) rkrr&rrrrrrelif_r)r'r(r)Zif_framerr,r,r-visit_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[r5rrrZrrr)r'r(r)Z macro_framerrr,r,r- visit_Macros zCodeGenerator.visit_MacrocCsR|j||\}}|jd|j|||j|||j|j|dd|j|dS)Nz caller = T)forward_caller)rrrr visit_CallZcallr)r'r(r)Z call_framerr,r,r-visit_CallBlocks    zCodeGenerator.visit_CallBlockcCsh|j}|jj||j||j||j|j||j|||j|j ||j ||j |dS)N) rjrZrrr^rrrrsfilterrr)r'r(r)Z filter_framer,r,r-visit_FilterBlocks     zCodeGenerator.visit_FilterBlockcCs|j}|jj||j|xLtt|j|jD]6\}\}}|j|j |||j d|j ||q2W|j |j ||j |dS)Nz = )rjrZrrrrZtargetsvaluesrr&rrrr)r'r(r)Z with_framerrexprr,r,r- visit_Withs     zCodeGenerator.visit_WithcCs|j||j|j|dS)N)rr&r()r'r(r)r,r,r-visit_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)rr4finalize)r)r'r,r-sz,CodeGenerator.visit_Output..cstjj|S)N)rr4r)r)r'r,r-rszif parent_template is None:__html__rhrz %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)rr]r4rrrrrr Impossibleas_constr#rrhasattrrr Exceptionr0rBrr^rr rr$rr&rreplace)r'r(r)Zallow_constant_finalizerrZ outdent_laterrchildconstrHvalcloseformatZ argumentsZargumentr,)r'r- visit_Outputs                             "                    zCodeGenerator.visit_OutputcCsF|j|j||j|j||jd|j|j||j|dS)Nz = )rrr&rrr(r)r'r(r)r,r,r- 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)rrjr]rZrrr^rrrr&rrrrsrr)r'r(r)rr,r,r-visit_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)Nrrhrvrz-(undefined(name=%r) if %s is missing else %s)r) rwr[rrrr5rZrZ find_loadrrr)r'r(r)rrvr,r,r-ryws   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])rZrr5rrrattr)r'r(r)rr,r,r- visit_NSRefszCodeGenerator.visit_NSRefcCs8|j|j}t|tr&|jt|n|jt|dS)N)rr#r0r?rstrr)r'r(r)rr,r,r- visit_Consts  zCodeGenerator.visit_Constc CsFy|jt|j|jWn&tjk r@|jd|jYnXdS)Nz9(Markup if context.eval_ctx.autoescape else identity)(%r))rrrr#rrdata)r'r(r)r,r,r-visit_TemplateDatas z CodeGenerator.visit_TemplateDatacCsZ|jdd}x0t|jD]"\}}|r0|jd|j||qW|j|dkrPdpRddS)N(rhz, rz,)rr)rrr!r&)r'r(r)rrHr,r,r- visit_Tuples  zCodeGenerator.visit_TuplecCsJ|jdx0t|jD]"\}}|r,|jd|j||qW|jddS)N[z, ])rrr!r&)r'r(r)rrHr,r,r- visit_Lists   zCodeGenerator.visit_ListcCsd|jdxJt|jD]<\}}|r,|jd|j|j||jd|j|j|qW|jddS)N{z, z: r)rrr!r&rIrG)r'r(r)rrHr,r,r- 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)r4 sandboxedZintercepted_binopsrr&leftright)r'r(r))operatorr,r-rNs   z$CodeGenerator.binop..visitor)r/)r5 interceptablerNr,)r5r-binopszCodeGenerator.binopcstfdd}|S)Ncs\|jjr2|jjkr2|jd|j|j|n|jd|j|j||jddS)Nz#environment.call_unop(context, %r, r+r)r4r2Zintercepted_unopsrr&r()r'r(r))r5r,r-rNs z#CodeGenerator.uaop..visitor)r/)r5r6rNr,)r5r-uaops zCodeGenerator.uaop+-*/z//z**rand)r6orznot 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)rrr,r,r- visit_Concats  zCodeGenerator.visit_ConcatcCs.|j|j|x|jD]}|j||qWdS)N)r&rZops)r'r(r)opr,r,r- visit_Compares zCodeGenerator.visit_ComparecCs&|jdt|j|j|j|dS)Nz %s )r operatorsr@r&r)r'r(r)r,r,r- visit_OperandszCodeGenerator.visit_OperandcCs,|jd|j|j||jd|jdS)Nzenvironment.getattr(z, %r))rr&r(r%)r'r(r)r,r,r- visit_Getattrs zCodeGenerator.visit_GetattrcCs~t|jtjr@|j|j||jd|j|j||jdn:|jd|j|j||jd|j|j||jddS)Nr-r.zenvironment.getitem(z, r)r0rrZSlicer&r(r)r'r(r)r,r,r- 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)r,r,r- 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)r4rrror5getrrrr(r&r#r$r^rr)r'r(r)rr,r,r-rs#s0           zCodeGenerator.visit_FiltercCs`|j|j|jd|j|jjkr8|jd|j|j|j|j||j|||jddS)Nr+zno test named %rr) rrpr5r4rrr&r(r)r'r(r)r,r,r-rtCs  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&rrr,)r)r(r'r,r- write_expr2Ns z1CodeGenerator.visit_CondExpr..write_expr2r+z if z else r)rr&Zexpr1r)r'r(r)rJr,)r)r(r'r-visit_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)r4rrr2r&r(r)r'r(r)r rr,r,r-r ]s    zCodeGenerator.visit_CallcCs"|j|jd|j|j|dS)N=)rrIr&rG)r'r(r)r,r,r- visit_KeywordlszCodeGenerator.visit_KeywordcCs&|jd|j|j||jddS)NzMarkup(r)rr&r)r'r(r)r,r,r-visit_MarkSafers zCodeGenerator.visit_MarkSafecCs&|jd|j|j||jddS)Nz5(context.eval_ctx.autoescape and Markup or identity)(r)rr&r)r'r(r)r,r,r-visit_MarkSafeIfAutoescapews z(CodeGenerator.visit_MarkSafeIfAutoescapecCs|jd|jdS)Nz environment.)rr5)r'r(r)r,r,r-visit_EnvironmentAttribute|sz(CodeGenerator.visit_EnvironmentAttributecCs|jd|j|jfdS)Nzenvironment.extensions[%r].%s)rZ identifierr5)r'r(r)r,r,r-visit_ExtensionAttributesz&CodeGenerator.visit_ExtensionAttributecCs|j|j|jdS)N)rr}r)r'r(r)r,r,r-visit_ImportedNamesz CodeGenerator.visit_ImportedNamecCs|j|jdS)N)rr5)r'r(r)r,r,r-visit_InternalNamesz CodeGenerator.visit_InternalNamecCs|jddS)Nr|)r)r'r(r)r,r,r-visit_ContextReferencesz$CodeGenerator.visit_ContextReferencecCs|jd|dS)Ncontinue)r)r'r(r)r,r,r-visit_ContinueszCodeGenerator.visit_ContinuecCs|jd|dS)Nbreak)r)r'r(r)r,r,r- visit_BreakszCodeGenerator.visit_BreakcCs:|j}|jj||j||j|j||j|dS)N)rjrZrrrrr)r'r(r) scope_framer,r,r- 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)ri)rrrr&r|rrjrZrrrrrr)r'r(r)rwrYr,r,r-visit_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) ZoptionsrrIr&rGrr#rrr$setattr)r'r(r)keywordrr,r,r-visit_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#Zsaverr^rr&Zrevert)r'r(r)Z old_ctx_nameZ saved_ctxrr,r,r-visit_ScopedEvalContextModifiers    z-CodeGenerator.visit_ScopedEvalContextModifier)NFT)F)rh)N)N)Nr)Nr)N)F)N)T)T)F)drUrVrWrTrrr^rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrurrrrrr r r rrrr"r#r$ryr&r(r*r,r/r1r7r8Z visit_AddZ visit_SubZ visit_MulZ visit_DivZvisit_FloorDivZ visit_PowZ visit_ModZ visit_AndZvisit_OrZ visit_PosZ visit_NegZ visit_Notr/r?rArCrDrErHrsrtrKr rMrNrOrPrQrRrSrTrVrXrZr[r^r_r,r,r,r-r{s B        5  M    t /6;                 r{)NFT)=rl itertoolsrrfrr]rr functoolsrZjinja2rZ jinja2.nodesrZjinja2.visitorrZjinja2.optimizerr Zjinja2.exceptionsr Z jinja2.utilsr r r Zjinja2._compatrrrrrrrZjinja2.idtrackingrrrrrrBrrFrrexecr SyntaxErrorrr/r9rErOrarPrX RuntimeErrorrKrnrJrrzr{r,r,r,r- s\         $       >