U  e˸ @sdZddlZddlZddlZddlmZddlmZddlmZddlmZddlm Z ddl m Z d Z d d hZ d d he Zdddddddddef ddZGdddZGdddZGdddZedZddZGdddZdS)zVprovides functionality for rendering a parsetree constructing into module source code.N)ast) exceptions)filters) parsetree)util) PythonPrinter UNDEFINEDZSTOP_RENDERINGcontextloopTFc Cs<t} t| } t| t||||||||| | | || S)zYGenerate module source code given a parsetree node, uri, and optional source filename)rZFastEncodingBufferr_GenerateRenderMethod_CompileContextgetvalue)nodeurifilenamedefault_filtersbuffer_filtersimportsfuture_importssource_encodinggenerate_magic_commentstrict_undefined enable_loopreserved_namesbufprinterr:/opt/hc_python/lib/python3.8/site-packages/mako/codegen.pycompiles( rc@seZdZddZdS)r c CsF||_||_||_||_||_||_||_||_| |_| |_ | |_ dSN) rrrrrrrrrrr) selfrrrrrrrrrrrrrr__init__Hsz_CompileContext.__init__N)__name__ __module__ __qualname__r"rrrrr Gsr c@seZdZdZddZddZeddZdd Zd d Z d d Z ddZ ddZ d7ddZ ddZddZd8ddZd9ddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6ZdS):r zZA template visitor object which generates the full module source for a template. c Cs||_||_||_dg|_t|tjtjf|_|jrd|j }| }t |j j dk}t|jdd}t|jdd}d} d} |jr|js|dg7}n~|} |jj} d}| dk r| j }| jjs|dg7}t| jdd}|jjpt| jdd|j_n dg}d }d }}|dkr*d g}nd d d g|D}|| pJ||||||| dk rz| D]}t|||qf|js|dS) Nz render_%srbufferedFalsecached **pageargsZ render_bodyrFr cSsg|]}|qSrr.0arrr sz2_GenerateRenderMethod.__init__..)rcompilerridentifier_stack isinstancerDefTagZBlockTagin_deffuncnameget_argument_expressionslen filter_argsargseval attributesgetis_block is_anonymouswrite_toplevelpagetag body_declkwargsrwrite_render_callabler write_metadata_struct) r!rr.rnamer7filteredr&r(defsr>rrrr"jsZ          z_GenerateRenderMethod.__init__cCsRt|jj|jj|jj<|jj|jj|jj|jjd}|jddt |ddS)N)rrrZline_mapz"""Z__M_BEGIN_METADATAz__M_END_METADATA """) maxrZ source_maplinenor.rrr writelinesjsondumps)r!structrrrrBsz+_GenerateRenderMethod.write_metadata_structcCs |jdS)N)r/r!rrr identifierssz!_GenerateRenderMethod.identifiersc sgigdj_Gfddd}|}jjD]}||q:j_t}D]}||}q\t j}||_ jj rjj rj djj jjrȈj ddjjfj dj dj d j d j d j d tj d tj djjj djjj djjj djj jjrd}jjD]}||d7}j |qtj|ddddd}nd}|j} |j} | | j|_|j t|r|j |j|j_j ddd| jDj dt rP!t rt"#dnt r"t$| jS)zxTraverse a template structure for module-level directives and generate the start of module-level code. Ncs<eZdZfddZfddZfddZfddZd S) z:_GenerateRenderMethod.write_toplevel..FindTopLevelcs|dSr )appendsr)inheritrrvisitInheritTagszJ_GenerateRenderMethod.write_toplevel..FindTopLevel.visitInheritTagcs||j<dSr rCrP) namespacesrrvisitNamespaceTagszL_GenerateRenderMethod.write_toplevel..FindTopLevel.visitNamespaceTagcs |j_dSr )r.r>rPrMrr visitPageTagszG_GenerateRenderMethod.write_toplevel..FindTopLevel.visitPageTagcs|jr|dSr )ismodulerOrP) module_coderr visitCodeszD_GenerateRenderMethod.write_toplevel..FindTopLevel.visitCodeN)r#r$r%rSrVrWrZrrRrYrUr!rr FindTopLevels   r\z# -*- coding:%s -*-zfrom __future__ import %s, z(from mako import runtime, filters, cachezUNDEFINED = runtime.UNDEFINEDz'STOP_RENDERING = runtime.STOP_RENDERINGz__M_dict_builtin = dictz__M_locals_builtin = localsz_magic_number = %rz_modified_time = %rz_enable_loop = %rz_template_filename = %rz_template_uri = %rz_source_encoding = %r rztemplate defined imports)sourcerGposrz _exports = %rcSsg|] }|jqSrrT)r+nrrrr-sz8_GenerateRenderMethod.write_toplevel..rL)%r.r>rnodesaccept_visitorrUsetuniondeclared_identifiers _Identifiersdeclaredrrr writelinerjoin MAGIC_NUMBERtimerrrrrZ PythonCodebranch topleveldefsupdateTOPLEVEL_DECLAREDrNvalues write_blanksr5write_module_codewrite_namespaces write_inheritlist) r!r\frbZ module_identZmodule_identifiersrimpZimpcodeZmain_identifiersZmitrr[rr=s                       z$_GenerateRenderMethod.write_toplevelc Csd|jr |j}|r |jd||j|j|jd|d|fdd|sX|sX|rd|jd|j |j j |j |jr|j jrd|kr|jdjd |jst|j jd kst|j jd kr|jd dd d |j jD|j|j dd|j jD]}||q||j ||||jd|jd|r`|j|||||j dddS)znwrite a top-level render callable. this could be the main render() method or that of a top-level def.z@runtime._decorate_toplevel(%s) def %s(%s):,/__M_caller = context.caller_stack._push_frame()try:context._push_buffer()r)rLZpageargsrz!__M_locals = __M_dict_builtin(%s)cSsg|]}d||fqS)%s=%srr+xrrrr-Bsz?_GenerateRenderMethod.write_render_callable..T)toplevelNrc)r2 decoratorrrk start_sourcerGrHrlr/rOr.rNrorr;argument_declaredaddr5locally_assignedwrite_variable_declaresrdrewrite_def_finishrtwrite_cache_decorator) r!rrCr7r&rDr(rrbrrrrAs`      z+_GenerateRenderMethod.write_render_callablecCs"|D]}|jj|j|jdqdS)zewrite module-level template code, i.e. that which is enclosed in <%! %> tags in the template.Zstarting_linenoN)rwrite_indented_blocktextrG)r!rYrbrrrruVsz'_GenerateRenderMethod.write_module_codecCs |jddd|jdddS)z:write the module-level inheritance-determination callable.z%def _mako_inherit(template, context):"_mako_generate_namespaces(context)z8return runtime._inherit_from(context, %s, _template_uri)fileN)rrHparsed_attributesr!rrrrrw\sz#_GenerateRenderMethod.write_inheritc sjddddddddjd|D]t}d|jkrFd j_j|jt |j rjd gjj |d _ Gfd d d }|}|j D]}||qjd djdd_ d}nd}d|jkrjd|j|jdd|fnFd|jkrFjd|j||jddfnjd|j|ft|jddrjd|jjdt|jjdq.t |sjdjddS)z5write the module-level namespace-generating callable.z'def _mako_get_namespace(context, name):r~z+return context.namespaces[(__name__, name)]except KeyError:rNz'def _mako_generate_namespaces(context):importTzdef make_namespace():cs,eZdZddZddZfddZdS)z<_GenerateRenderMethod.write_namespaces..NSDefVisitorcSs||dSr visitDefOrBaserPrrr visitDefTagszH_GenerateRenderMethod.write_namespaces..NSDefVisitor.visitDefTagcSs||dSr rrPrrr visitBlockTagszJ_GenerateRenderMethod.write_namespaces..NSDefVisitor.visitBlockTagcs4|jrtjd|jj|dd|jdS)N.Can't put anonymous blocks inside <%namespace>Fnested)r)r<rCompileExceptionexception_kwargswrite_inline_defrOr3rPexportrNr!rrrszK_GenerateRenderMethod.write_namespaces..NSDefVisitor.visitDefOrBaseNr#r$r%rrrrrrr NSDefVisitorsr return [%s]r|Fzmake_namespace()Nonerzns = runtime.TemplateNamespace(%r, context._clean_inheritance_tokens(), templateuri=%s, callables=%s, calling_uri=_template_uri)modulezyns = runtime.ModuleNamespace(%r, context._clean_inheritance_tokens(), callables=%s, calling_uri=_template_uri, module=%s)zhns = runtime.Namespace(%r, context._clean_inheritance_tokens(), callables=%s, calling_uri=_template_uri) inheritabler'zcontext['self'].%s = nsz'context.namespaces[(__name__, %s)] = nspass)rrHrkrsr9r.has_ns_importsrrGr5rdrNror2rerlrrCr:r8reprrt)r!rUrrvisrbZ callable_namerrrrvgsz               z&_GenerateRenderMethod.write_namespacesFNc CsRdd|jD}t}||j}|dd|jD}||j}||j}|j j rpd|k}| dnd}|dk r| |}|rt |j ddr|jd d |j _|j jD]4\}}d |jkr|jd |td |jd fq|r|jd|D]<}||krt||} | jrJ| js8|| |n|j| |d dn(| rb|| |n|j| |d dn||j jkr|jd||fnt |j ddr|j jr|jd||fd|dd||fdd|ddn|jd|||fn@|j jr*|jdd||fdd|dn|jd||fq|jddS)awrite variable declarations at the top of a function. the variable declarations are in the form of callable definitions for defs and/or name lookup within the function's context argument. the names declared are based on the names that are referenced in the function body, which don't otherwise have any explicit assignment operation. names that are assigned within the body are assumed to be locally-scoped variables and are not separately declared. for def callable definitions, if the def is a top-level callable then a 'stub' callable is generated which wraps the current Context into a closure. if the def is not top-level, it is fully rendered as a local closure. cSsi|] }|j|qSrr3r+crrr szA_GenerateRenderMethod.write_variable_declares..cSsg|] }|jqSrrrrrrr-szA_GenerateRenderMethod.write_variable_declares..r FNrz_import_ns = {}Trz:_mako_get_namespace(context, %r)._populate(_import_ns, %r)z\s*,\s*z%loop = __M_loop = runtime.LoopStack()rz%%s = _mako_get_namespace(context, %r)z"%s = _import_ns.get(%r, UNDEFINED)zif %s is UNDEFINED:r~z%s = context[%r]rz&raise NameError("'%s' is not defined")z3%s = _import_ns.get(%r, context.get(%r, UNDEFINED))z%s = context.get(%r, UNDEFINED)z__M_writer = context.writer())rErfrg undeclared closuredefsrs differencerlocally_declaredr.rdiscard intersectiongetattrrrkZ has_importsrUitemsr9resplitr;r<write_def_declris_rootrrH) r!rNrlimitZ comp_identsZto_writeZhas_loopidentnscomprrrrs                   z-_GenerateRenderMethod.write_variable_declarescCs|j}|}|jdd}|jsNt|jjdks@t|jjdkrN|ddn |dd|j d|d |f|j d|d |f|j d d S) z>write a locally-available callable referencing a top-level defTZas_callrzcontext._locals(__M_locals)r r{r|zreturn render_%s(%s)N) r3r4r2r5rNrrinsertrrkrl)r!rrNr3 namedeclsnameargsrrrrBs  z$_GenerateRenderMethod.write_def_declc Cs|}|j}|r"|jd||jd|jd|ft|jjdk}t |j dd}t |j dd}|j dd |s|s|r|j d |j ||d }|||j||jD]} | |q|j||||||jd |r|j||j|d |dd dd S)z?write a locally-available def callable inside an enclosing def.z&@runtime._decorate_inline(context, %s)r{r|rr&r'r(r}r~rrNFT)inliner)r4rrrkr3rlr5r6r7r8r9r:rHrorr/rOrdrepoprr) r!rrNrrrrDr&r(rbrrrrUsH        z&_GenerateRenderMethod.write_inline_defTcCs|s,|s,|s,|jd|r,|jddd|s8|s8|r|s@|rP|jddn|jdd|rn|jdd}|r||jj|d}|jd|r|s||jj|d}|s|r|jd |n|jd |ddS) aJwrite the end section of a rendering function, either outermost or inline. this takes into account if the rendering function was filtered, buffered, etc. and closes the corresponding try: block if any, and writes code to retrieve captured content, apply filters, send proper return value. return ''finally:z!context.caller_stack._pop_frame()Nz__M_buf = context._pop_buffer()6__M_buf, __M_writer = context._pop_buffer_and_writer()__M_buf.getvalue()Fz return %s__M_writer(%s))rrkrHcreate_filter_callabler6r7r.r)r!rr&rDr( callstackrQrrrrsJ     z&_GenerateRenderMethod.write_def_finishc sZjd||fjdt|}i} jjdk rT| fddjjjD| fddjDd| krtt | d| d<jd|d |fd d |D} j || d |rd ||d | d dd | D|f} jj| d} jd| dn8jd||d | d dd | D|fdddS)zhwrite a post-function decorator to replace a rendering callable with a cached version of itself.z __M_%s = %s cache_keyNc3s:|]2}|dr|dkr|ddjjj|fVqdSZcache_rN) startswithr.r>rr+parMrr s z>_GenerateRenderMethod.write_cache_decorator..c3s6|].}|dr|dkr|ddj|fVqdSr)rrr)node_or_pagetagrrrs timeoutr{r|cSs0g|](}d|kr(d|ddfdn|qS)=rrrc)rr*rrrr-sz?_GenerateRenderMethod.write_cache_decorator..)rrz`context.get('local').cache._ctx_get_or_create(%s, lambda:__M_%s(%s), context, %s__M_defname=%r)r^cSsg|]\}}d||fqSz%s=%s, rr+kvrrrr-sFzreturn zk__M_writer(context.get('local').cache._ctx_get_or_create(%s, lambda:__M_%s(%s), context, %s__M_defname=%r))cSsg|]\}}d||fqSrrrrrrr-sr)rrkrr:rr.r>rqintr8rlrundeclared_identifiersrrrrH) r!rrCr7r&rNrrZcachekeyZ cache_argsZ pass_argsrQr)rr!rrsp   z+_GenerateRenderMethod.write_cache_decoratorc Csdd}d|krH|rH|jjr,|jjjj|}|jjrHd|krH|jj|}|D]`}|dkrZqLtd|}|r|dd\}}||} | |}n||}|dk std||f}qL|S) zwrite a filter-applying expression based on the filters present in the given filter names, adjusting for the global 'default' filter aliases as needed.cSs&td|rd|Stj||SdS)Nz decode\..+zfilters.)rmatchrZDEFAULT_ESCAPESr:rTrrr locate_encodes zC_GenerateRenderMethod.create_filter_callable..locate_encoderbz (.+?)(\(.*\))rrcNz%s(%s)) r.r>r6r7rrrgroupAssertionError) r!r7targetZ is_expressionremrZfargsryrrrr s&    z,_GenerateRenderMethod.create_filter_callablecCs|j|jt|js@|jjdk r4t|jjjjs@t|jj rj| |j jd|j d}|j d|n|j d|j dS)Nz%sTr)rrrGr5escapesr.r>r6r7rrZ escapes_coderrk)r!rrQrrrvisitExpression)s   z%_GenerateRenderMethod.visitExpressioncsjr>|jdjr|jd|jd|jdn|jj|jjrljdkrlt |j}nj }|j| }|rt dd|Drt fdd|Dr|jddS)Nrzloop = __M_loop._exit()forcss |]}t|tjtjfVqdSr )r0rComment ControlLinerrrrrOsz9_GenerateRenderMethod.visitControlLine..c3s,|]$}t|tjr|jp"|jVqdSr )r0rrZ is_ternarykeywordisendrrrrrSs r) rrrkhas_loop_contextrrGr.rrmangle_mako_loopr get_childrenall)r!rrchildrenrrrvisitControlLine:s,      z&_GenerateRenderMethod.visitControlLinecCs(|j|j|jdt|jdS)Nr)rrrGrkrcontentrrrr visitText[sz_GenerateRenderMethod.visitTextc Csdt|jjdk}|r"|jdd|jD]}||q(|r`|jddd||jjddddS) Nrz#__M_writer = context._push_writer()r~rrrrF)r5r6r7rrHrdrer)r!rrDrbrrr visitTextTag_s*  z"_GenerateRenderMethod.visitTextTagcCsd|js`|jj|j|jd|js`t|jjdkr`|j d|j dd dd| DdS)Nrrz0__M_locals_builtin_stored = __M_locals_builtin()z__M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin_stored[__M_key]) for __M_key in [%s] if __M_key in __M_locals_builtin_stored]))r|cSsg|] }t|qSr)rrrrrr-sz3_GenerateRenderMethod.visitCode..) rXrrrrGr2r5rNrrkrlrhrrrrrZrsz_GenerateRenderMethod.visitCodecCsT|j|j|jd}|r:|jd|jd|fn|jd|jddS)Nr7z5runtime._include_file(context, %s, _template_uri, %s)rz1runtime._include_file(context, %s, _template_uri))rrrGr9r:rkr)r!rr7rrrvisitIncludeTags  z%_GenerateRenderMethod.visitIncludeTagcCsdSr rrrrrrVsz'_GenerateRenderMethod.visitNamespaceTagcCsdSr rrrrrrsz!_GenerateRenderMethod.visitDefTagcCsn|jr|jd|jnP|jdd}|dg7}|jd|j|jd|jd|f|jddS) Nz%s()Trr)zOif 'parent' not in context._data or not hasattr(context._data['parent'], '%s'):zcontext['self'].%s(%s)r|r_)r<rrkr3r4rl)r!rrrrrrs  z#_GenerateRenderMethod.visitBlockTagcCs||dSr  visitCallTagrrrrvisitCallNamespaceTagsz+_GenerateRenderMethod.visitCallNamespaceTagcs`jddgjj|ddj|dddjGfddd}|}|jD]}||qjj |j }jd d |d}|rj d d j|jD]}|qֈj j||dddd j ddd dj dd j|jj dg|jdddddS)Nzdef ccall(caller):bodyTrFZcallercs.eZdZddZddZfddZdS)z6_GenerateRenderMethod.visitCallTag..DefVisitorcSs||dSr rrPrrrrszB_GenerateRenderMethod.visitCallTag..DefVisitor.visitDefTagcSs||dSr rrPrrrrszD_GenerateRenderMethod.visitCallTag..DefVisitor.visitBlockTagcs<j|dd|js"|j|jjkr8j|j=dS)NFr)rr<rOr3rrPZbody_identifiersZcallable_identifiersrr!rrrs   zE_GenerateRenderMethod.visitCallTag..DefVisitor.visitDefOrBaseNrrrrr DefVisitorsrz def body(%s):r|rr~)rrzccontext.caller_stack.nextcaller = runtime.Namespace('caller', context, callables=ccall(__M_caller))rrz&context.caller_stack.nextcaller = None)rrkrNro add_declaredr/rOrdrerr?r4rlrHrrrrGrZ expression)r!rrrrbZbodyargsr&rrrrsH            z"_GenerateRenderMethod.visitCallTag)FN)T)FF)r#r$r%__doc__r"rBpropertyrNr=rArurwrvrrrrrrrrrrrZrrVrrrrrrrrr cs<1 m9 ] ~/ : S !r c@seZdZdZd(ddZddZedd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'ZdS))rizCtracks the status of identifier names as template code is rendered.NFcCs|dk rt|tjr(t|_t|_qt|jdd|j D|j |j |_|rn|j|j |_tjf|j|_nt|_t|_||_t|_ t|_ t|_t|_ t|_ ||_|dk r|||jj|j }|rtdd|dS)NcSsg|] }|jqSrrTrrrrr-sz)_Identifiers.__init__..z'Reserved words declared in template: %sr])r0rZ NamespaceTagrfrjrZ SetLikeDictrprgrrsrrrr.rrrerrrZNameConflictErrorrl)r!r.rparentrZ illegal_namesrrrr"sF       z_Identifiers.__init__cKst|j||f|S)zUcreate a new Identifiers for a new Node, with this Identifiers as the parent.)rir.)r!rr@rrrro<sz_Identifiers.branchcCst|j|jSr )rfrprgrrsrMrrrrEBsz_Identifiers.defscCsHdt|jt|jt|jdd|jDdd|jD|jfS)NzrIdentifiers(declared=%r, locally_declared=%r, undeclared=%r, topleveldefs=%r, closuredefs=%r, argumentdeclared=%r)cSsg|] }|jqSrrTrrrrr-Osz)_Identifiers.__repr__..cSsg|] }|jqSrrTrrrrr-Ps)rxrjrrrprsrrrMrrr__repr__Fsz_Identifiers.__repr__cCsR|D]*}|dkr||j|jkr|j|q|D]}|j|q||j|j kr>|j |q>||jkr| D]}|j |q||jD]}||qdSNr )rr<rrprrrrjrgrrrrhrrdrer!rrrbrrrrs     z_Identifiers.visitDefTagcCs||jk rj|jsjt|jtjr>tjd|j|jjff|jn,t|jtj tj frjtjd|jff|j| D]*}|dkrr||j |jkrr|j|qr|js||j||j|jn||jk r||j||D]}|j|q|jD]}||qdS)Nz/Named block '%s' not allowed inside of def '%s'z3Named block '%s' not allowed inside of <%%call> tagr )rr<r0rr1rrrCrZCallTagZCallNamespaceTagrrjrgrrrrrpr3rrhrrdrer rrrrsD      z_Identifiers.visitBlockTagcCs8|D]*}|dkr||j|jkr|j|qdSr)rrjrgrrrrrrrrs  z_Identifiers.visitTextTagcCs||dSr rrrrrrsz_Identifiers.visitIncludeTagcCs(|D]}|j|q||dSr )rhrrrrrrrrWs z_Identifiers.visitPageTagcCs||dSr rrrrrrsz"_Identifiers.visitCallNamespaceTagcCs||jkrp|D]*}|dkr||j|jkr|j|q|D]}|j|qF|j D]}| |q^n4|D]*}|dkrx||j|jkrx|j|qxdSr) rrrjrgrrrrhrrdrer rrrrs     z_Identifiers.visitCallTag)NNF)r#r$r%rr"rorrErrrrrrZrVrrrrrrWrrrrrrris( C  !riz^for\s+((?:\(?)\s*(?:\(?)\s*[A-Za-z_][A-Za-z_0-9]*(?:\s*,\s*(?:[A-Za-z_][A-Za-z_0-9]*),??)*\s*(?:\)?)(?:\s*,\s*(?:(?:\(?)\s*[A-Za-z_][A-Za-z_0-9]*(?:\s*,\s*(?:[A-Za-z_][A-Za-z_0-9]*),??)*\s*(?:\)?)),??)*\s*(?:\)?))\s+in\s+(.*):cCsrt}|||jrhd|jd_t|j}|rX|d| ddd| d}qnt d|jn|j}|S) zconverts a for loop into a context manager wrapped around a for loop when access to the `loop` variable has been detected in the for loop body TrLzloop = __M_loop._enter(%s)rcr~zfor %s in loop:rzCouldn't apply loop context: %s) LoopVariableredetectedrdr _FOR_LOOPrrrHr SyntaxError)rrZ loop_variablerrrrrrs    rc@s8eZdZdZddZddZddZdd Zd d Zd S) r zQA node visitor which looks for the name 'loop' within undeclared identifiers.cCs d|_dS)NF)r rMrrrr" szLoopVariable.__init__cCs0d|krd|_n|D]}||qdS)Nr T)rr rrerrrr_loop_reference_detected s  z%LoopVariable._loop_reference_detectedcCs||dSr rrrrrrszLoopVariable.visitControlLinecCs||dSr rrrrrrZszLoopVariable.visitCodecCs||dSr rrrrrrszLoopVariable.visitExpressionN) r#r$r%rr"rrrZrrrrrr s r )rrIrrnmakorrrrrZ mako.pygenrrmrrrgZRESERVED_NAMES frozensetrr r rir rr rrrrsN       (o