^cVdZddlZddlZddlmZddlmZmZddlm Z m Z m Z m Z mZm Z mZmZmZddlmZmZidd d d d d ddddddddddddddddddd d!d"d#d$d%d&dZdcd'Zddd)Zded+Zdfd,Zd-Zd.Zd/Zd0Zd1Zd2Zd3Zd4Z d5Z!d6Z"d7Z#d8Z$d9Z%d:Z&d;Z'd<Z(d=Z)d>Z*d?Z+d@Z,dAZ-iddBd"dCd dDd$e$dEdFd e'de%d e&dGe*dHe,dIe-ddJddKdLe(ddMddNZ.e./Z0e.d e0d<GdOdPe j1Z2dQZ3dRZ4GdSdTZ5GdUdVe5Z6GdWdXZ7dYZ8dZZ9d[Z:Gd\d]Z;Gd^d_ZdcdbZ?dS)gaSlightly complicated template engine for commands and hgweb This module provides low-level interface to the template engine. See the formatter and cmdutil modules if you are looking for high-level functions such as ``cmdutil.rendertemplate(ctx, tmpl)``. Internal Data Types ------------------- Template keywords and functions take a dictionary of current symbols and resources (a "mapping") and return result. Inputs and outputs must be one of the following data types: bytes a byte string, which is generally a human-readable text in local encoding. generator a lazily-evaluated byte string, which is a possibly nested generator of values of any printable types, and will be folded by ``stringify()`` or ``flatten()``. None sometimes represents an empty value, which can be stringified to ''. True, False, int, float can be stringified as such. wrappedbytes, wrappedvalue a wrapper for the above printable types. date represents a (unixtime, offset) tuple. hybrid represents a list/dict of printable values, which can also be converted to mappings by % operator. hybriditem represents a scalar printable value, also supports % operator. revslist represents a list of revision numbers. mappinggenerator, mappinglist represents mappings (i.e. a list of dicts), which may have default output format. mappingdict represents a single mapping (i.e. a dict), which may have default output format. mappingnone represents None of Optional[mappable], which will be mapped to an empty string by % operation. mappedgenerator a lazily-evaluated list of byte strings, which is e.g. a result of % operation. N)_)FileNotFoundErrorgetattr) configencodingerrorparserpycompattemplatefilters templatefuncs templateutilutil) resourceutil stringutil()N)groupr))funcrrN.)NN)rrN%)NN)rrN|)rNN)rrN*)NN)rrN/)rNN)rrN+)NN)rr N-)r N)negate)r!r N=)NN)keyvaluer%N,)NN)listr(Nr)rNNNNinteger)rr*NNNsymbol)rr+NNNstring)rr,NNNtemplate)rr-NNNendc#hK|}tj|}||kr||}|rn|dvr |d|fVn|dvr(|dz}t||||\}}d||fV|dz}n|dkr|||dzdvrq||dz}|dzx}}||kr5||}|d kr|dz }||krd ||||fVn-|dz }||k5t jt d |n|rF|}||kr(||}|sn |dz }||k(d ||||fV|dz}n|d kr|||dzd vs|dkr|||dzdvr|dkr|dz }d } nd} |||dz} |dzx}}||kr|d||r|dz }#|| ||rStj |||}| dkr$t|dt|d}| ||fV|dz }n-|dz }||kt jt d |n| s|dvrR|}|dz }||kr.||}| s|dksn |dz }||k.|||} d| |fV|dz}n1||kr dd|fVdSt jt d||dz }||k|r"t jt d|dd|fVdS)z^Parse a template expression into a stream of tokens, which must end with term if specifieds (=,).%|+-*/Ns"'rr-rr()sr'sr"\r,unterminated stringr*)s\'s\"r%)sr\'sr\"s\\\r r_r+r.s syntax errorsunterminated template expansion) r bytestrisspace_parsetemplater ParseErrorrisdigit startswithr unescapestrlenisalnum) programstartendtermposcsdatadtokenquotesyms 5/usr/lib/python3/dist-packages/mercurial/templater.pytokenizerJtsm Cw''G )) CL 99;;V <  . dC. &[[aA&w3::ID#a( ( ( ( 1HCC $YY73q=1^CCa AAg A))CL::1HC66$gaena8888q))&q)?'@'@!DDDYY[[> <A))CLyy{{q )) wqu~q1 1 1 1 1HCC JJcAg &*:::DyycAg &*<<<Dyyq!#C#'M*EAg A))%%ic::1HC%%eS#66!-gaen==D ++-dAs4yyAA!D $****1HCq))&q)?'@'@!DDDYY[[ >> _parsetemplate(b'foo{bar}"baz', 0, 12) ([('string', 'foo'), ('symbol', 'bar'), ('string', '"baz')], 12) >>> _parsetemplate(b'foo{bar}"baz', 0, 12, quote=b'"') ([('string', 'foo'), ('symbol', 'bar')], 9) >>> _parsetemplate(b'foo"{bar}', 0, 9, quote=b'"') ([('string', 'foo')], 4) >>> _parsetemplate(br'foo\"bar"baz', 0, 12, quote=b'"') ([('string', 'foo"'), ('string', 'bar')], 9) >>> _parsetemplate(br'foo\\"bar', 0, 10, quote=b'"') ([('string', 'foo\\')], 6) r,r-r.sunexpected type: %s!unterminated scanning of template) _scantemplateappendr ProgrammingError)tmplr>stoprGparsedtypvalrAs rIr6r6sF&tUD%@@GG S# )   MM3* % % % % K   MM#     F]]3;   ()?#)EFF F  !E F FFrKFc#Kd}t|dt||D]\}}}|r||fzV|dkrdS||f}tjd)aScan (type, start, end) positions of outermost elements in template If raw=True, a backslash is not taken as an escape character just like r'' string in Python. Note that this is different from r'' literal in template in that no template fragment can appear in r'', e.g. r'{foo}' is a literal '{foo}', but ('{foo}', raw=True) is a template expression 'foo'. >>> list(scantemplate(b'foo{bar}"baz')) [('string', 0, 3), ('template', 3, 8), ('string', 8, 12)] >>> list(scantemplate(b'outer{"inner"}outer')) [('string', 0, 5), ('template', 5, 14), ('string', 14, 19)] >>> list(scantemplate(b'foo\\{escaped}')) [('string', 0, 5), ('string', 5, 13)] >>> list(scantemplate(b'foo\\{escaped}', raw=True)) [('string', 0, 4), ('template', 4, 13)] Nr)rawr.rM)rNr;r rP)rQrWlastrTrUrAs rI scantemplaterYs$ D&tQD sCCC S#  #-    &== FF:DD  !E F FFrKc# Kd|z}tjtjg|}| tjt} krht fdtj|Dd}|dkrd|  fV n||dz} d} |s0| z t |dz } | d zdkr$d| |dz | z fV|dz | krd| | fV| |kr d d |dzfVd S| t|dzd \} d s"tj td  d| |fV dz kh|r"tj td|n(#tj $r} t| d } ~ wwxYwd d fVd S)zEParse template string into chunks of strings and template expressions{c3FK|]}|VdSN)find).0rBrArRrQs rI z _scantemplate..s3MMQ1c4((MMMMMMrKc|dk|fS)Nr)ns rIz_scantemplate..sq1uajrK)keyrr,rr1r(r.N} invalid tokenr-r2)r r:r identityelementsminr4r;rstripparserJr9r r7r_addparseerrorhint)rQr>rRrGrWsepcharsunescapeprcrBbsparseresinstrAs` ` @rIrNrNse|H"H$56s;H C hA#DjjMMMMMM(2B82L2LMMM((A1uu ((4D>":":C@@@@QQYAB @#gT#a%[%7%7%>%>!?!??Av{{ ((4a!e +<"="="A3GGGG!e3ww ((4A;"7"7====EzztQU++++GGHT1q5$$E$EFFMHc??4-- A&q)9':':C@@@!, , , , 1HC9Djj<  E"1%;#<#BGG>(G99G>c|jdS|j}|d|d}|dd}|dzd|dz|zzzdztdz|_dS)N s\n rs^ shere)locationcountreplacerhint)rsrQlocoffsets rIrmrm<sz } -C$3$Z  e $ $F <<v & &D u tsQw'7885@1W::MDIIIrKclt|ts|S|d}|dkr%|ftd|ddDzSt|dksJtd|dD}|sdSt|dkr|ddd kr|dS|f|zS) a;Expand list of templates to node tuple >>> def f(tree): ... print(pycompat.sysstr(prettyformat(_unnesttemplatelist(tree)))) >>> f((b'template', [])) (string '') >>> f((b'template', [(b'string', b'foo')])) (string 'foo') >>> f((b'template', [(b'string', b'foo'), (b'symbol', b'rev')])) (template (string 'foo') (symbol 'rev')) >>> f((b'template', [(b'symbol', b'rev')])) # template(rev) -> str (template (symbol 'rev')) >>> f((b'template', [(b'template', [(b'string', b'foo')])])) (string 'foo') rr-c34K|]}t|VdSr]_unnesttemplatelistr_xs rIr`z&_unnesttemplatelist..cs+FF033FFFFFFrKrNr(c34K|]}t|VdSr]rrs rIr`z&_unnesttemplatelist..fs+77!"1%%777777rK)r,rKr,) isinstancetupler;)treeopxss rIrrLs& dE " " aB [uuFFT!""XFFFFFFF t99>>>> 77tAw777 7 7B  RA"Q%(i//!u urzrKct|dt|\}}|t|ks Jdtd|fS)zParse template string into treers$unquoted template should be consumedr-)r6r;r)rQrSrAs rIrlrlosP q#d))44KFC #d))   D     V4 5 55rKcr t|S#tj$r}t||d}~wwxYw)a=Parse a template expression into tree >>> parseexpr(b'"foo"') ('string', 'foo') >>> parseexpr(b'foo(bar)') ('func', ('symbol', 'foo'), ('symbol', 'bar')) >>> from . import error >>> from . import pycompat >>> try: ... parseexpr(b'foo(') ... except error.ParseError as e: ... pycompat.sysstr(e.message) ... e.location 'not a prefix: end' 4 >>> try: ... parseexpr(b'"foo" "bar"') ... except error.ParseError as e: ... pycompat.sysstr(e.message) ... e.location 'invalid token' 7 N) _parseexprr r7rm)exprrss rI parseexprrvsJ0$  4&&& s616c $tjt}|t|dt |\}}|t |kr"t jtd|t|S)Nrrg) r rirlrJr;r r7rr)rrprrAs rIrrss hAq#d))4455ID# c$iiq!122C888 t $ $$rKc,tj|dS)N)r*r,r+)r prettyformatrs rIrrs  t%G H HHrKc||s!tjtd|d}||||S)z1Compile parsed template tree to (func, data) pairsmissing argumentrr r7r)expcontext curmethodsts rI compileexprsC 7q!455666 AA :a=g & &&rKc~|ddkr|dStjtd|dz)Nrr+rsexpected a symbol, got '%s'r)rs rI getsymbolrs= 1v1v  1;<  twqt}}!v%% 3JrKc|ddvrt||tS|ddkr||dStjt d)z_Compile given template tree or load named template from map file; returns (func, data) pairr)r-r,r+rsexpected template specifier)rmethods_loadr r7rrrs rI gettemplatersg 1v)))#w000 1v}}SV$$$  1;<< = ==rKcJtjtd|z)Ns$recursive reference '%s' in template)r InputErrorr)rmappingres rI_runrecursivesymbolrs!  1DEEK L LLrKcLfd|ddD}tj|fS)Nc<g|]}t|tSrb)rr)r_ers rI z!buildtemplate..s% > > >Z7G , , > > >rKr)r runtemplate)rrctmpls ` rI buildtemplaters2 > > > >c!""g > > >E  $e ,,rKcrt|d}||jvr9|j|}t|d|t}tj||ffS||jvr4|j|}t|d|t||j}||fStj td|z)Nr(runknown function '%s') r_filtersrrr runfilter_funcs_buildfuncargs_argspecr r7r)rrrcfiltargfargss rI buildfilterrs#a&AG "Q'22&d 44GN N1 c!fgw1:FF4y  1566: ; ;;rKct|d|t}t|d|}tj||ffSNrr()rrrrrunmap)rrdargtargs rIbuildmaprs< c!fgw / /D s1vw ' 'D  $ ..rKct|d|t}t|d}tj||ffSr)rrrr runmember)rrrmembs rI buildmemberrs: c!fgw / /D SV  D  "T4L 11rKcVt|d|t}tj|fSNr)r exprmethodsr runnegate)rrrs rI buildnegaters% SVWk 2 2C  "C ((rKct|d|t}t|d|t}tj|||ffSr)rrr runarithmetic)rrfuncleftrights rIbuildarithmeticrsA c!fg{ 3 3D s1vw 4 4E  &tU(; <>"1%F#G#G!#KLL L  Q &a! 55  1566: ; ;;rKcfd}fd}|s|t|Stj|x\}}} } }tjt|||dd} t j} |r!|| || |<| r!|| | | | <| || | S)aCompile parsed tree of function arguments into list or dict of (func, data) pairs >>> context = engine(lambda t: (templateutil.runsymbol, t)) >>> def fargs(expr, argspec): ... x = _parseexpr(expr) ... n = getsymbol(x[1]) ... return _buildfuncargs(x[2], context, exprmethods, n, argspec) >>> list(fargs(b'a(l=1, k=2)', b'k l m').keys()) ['l', 'k'] >>> args = fargs(b'a(opts=1, k=2)', b'**opts') >>> list(args.keys()), list(args[b'opts'].keys()) (['opts'], ['opts', 'k']) cjtjfd|DS)Nc3DK|]\}}|t|fVdSr]r)r_krrrs rIr`z6_buildfuncargs..compiledict..sI  8<1Q 1gz22 3      rK)rsortdictitemsrrrs rI compiledictz#_buildfuncargs..compiledictsJ}     @B       rKc"fd|DS)Nc2g|]}t|Srbr)r_rrrs rIrz7_buildfuncargs..compilelist..s%???q 1gz22???rKrbrs rI compilelistz#_buildfuncargs..compilelists ?????B????rKr&r+) keyvaluenodekeynode)rr splitargspec buildargsdictrrpopupdate) rrrfuncnamerrr_poskeysvarkey_keysoptkeytreeargscompargss `` rIrrs0       @@@@@@ ){73<<(((170CG0L0LL#HfeVg#   H}H =&;x||F';';<< =&;x||F';';<< OOKK))*** OrKcDtjtd)Ns*can't use a key-value pair in this contextr)rcontents rIbuildkeyvaluepairr1s  1JKK L LLrKcbtjtdtd)Ns can't use a list in this contextscheck place of comma and parensrzrrs rI buildlistr5s4   -.. 1 2 2   rKc*tj|dfSr)r runintegerrrBs rIrdrd>sl5qt<rKc*tj|dfSr)r runstringrs rIrdrd?\3QqT:rKc*tj|dfSr)r runsymbolrs rIrdrd@rrKrc:t|d|tSr)rrrs rIrdrdBs:adA{;;rKrr&r)c&t||dS)Nc ||zSr]rbabs rIrdz..I !a%rKrrs rIrdrdIq!-?-?@@rKc&t||dS)Nc ||z Sr]rbrs rIrdz..JrrKrrs rIrdrdJrrKr"c&t||dS)Nc ||zSr]rbrs rIrdz..LrrKrrs rIrdrdLrrKc&t||dS)Nc ||zSr]rbrs rIrdz..Ms !q&rKrrs rIrdrdMsq!-@-@AArKcTeZdZdZedZeeZedZ dS) _aliasrulesz2Parsing and expansion rule set of template aliasesstemplate aliasc|ddkr5|dddkr#|ddt|dfS|ddkr)|dddkr|dd|dgfSdSdS)zNReturn (name, args) if tree is func(...) or ...|filter; otherwise Nonerrrr+r(rNrrs rI _trygetfuncz_aliasrules._trygetfunc[s 7g  $q'!* "9"971:wtAw/// / 7d??tAwqzY6671:Qy( ( ?66rKN) __name__ __module__ __qualname____doc__r_section staticmethodr_parser rbrKrIr r UsR<<q"##H \* % %F))\)))rKr clt|}t||S)z'Return new tree of aliases are expanded)r rexpand)raliasesaliasmaps rI expandaliasesres+##G,,H   h - --rKcxt|dks|ddvs|d|dkr|S|ddS)z9unwrap quotes if any; otherwise returns unmodified stringr(r'"r)r;)rCs rI unquotestringrnsA 1vvzzQqT''1Q41R5== QrT7NrKceZdZdZejZejdZejdZ ejdZ ejdZ dS)resourcemapperz%Mapper of internal template resourcescdS)BReturn a set of available resource keys based on the given mappingNrbselfrs rI availablekeyszresourcemapper.availablekeyszrKcdS)'Return a set of supported resource keysNrbr!s rI knownkeyszresourcemapper.knownkeys~r#rKcdS)z:Return a resource for the key if available; otherwise NoneNrbr!rres rIlookupzresourcemapper.lookupr#rKcdS)zcReturn a dict of additional mapping items which should be paired with the given new mappingNrbr!r origmapping newmappings rI populatemapzresourcemapper.populatemapr#rKN) r r rrabcABCMeta __metaclass__abstractmethodr"r'r*r/rbrKrIrrus//KMQQQ 666 III &&&&&rKrc&eZdZdZdZdZdZdS)nullresourcemapperctSr]setr s rIr"z nullresourcemapper.availablekeys uu rKctSr]r7r&s rIr'znullresourcemapper.knownkeysr9rKcdSr]rbr)s rIr*znullresourcemapper.lookupstrKciSr]rbr,s rIr/znullresourcemapper.populatemaps rKN)r r rr"r'r*r/rbrKrIr5r5sPrKr5cbeZdZdZddZdZdZdZdZdZ d Z d Z d Z d Z d ZdZdZdS)engineatemplate expansion engine. template expansion works like this. a map file contains key=value pairs. if value is quoted, it is treated as string. otherwise, it is treated as name of template file. templater is asked to expand a key in map. it looks up key, and looks for strings like this: {foo}. it expands {foo} by looking up foo in map, and substituting it. expansion is recursive: it stops when there is no more {foo} to replace. expansion also allows formatting and filtering. format uses key to expand each item in list. syntax is {key%format}. filter uses function to transform value. syntax is {key|filter1|filter2|...}.Nc||_|i}||_tj|_|i}|t }||_||_i|_i|_ dSr]) _loaderrr funcsrr5 _defaults _resources_cache _tmplcache)r!loaderfiltersdefaults resourcess rI__init__zengine.__init__s` ?G #)  H  *,,I!# rKc>jj|fd|D}|||j|||S)zfCreate combined mapping from the original mapping and partial mapping to override the originalcti|]4\}}|vs(|1||5Srb) isdisjoint_defaultrequires)r_rvknownresnewresr!s rI z%engine.overlaymap..sV   1X $$T%:%:1%=%=>> q rK)rCr'r"rrr/)r!r-r.rrPrQs` @@rI overlaymapzengine.overlaymaps ?,,....z::      #))++    z""" O ' 'k: F F   rKc~|j|}|t|sdSt|ddS)z?Resource keys required by the specified default symbol functionNrb _requires)rBgetcallabler)r!rerOs rIrNzengine._defaultrequiress= N  s # # 9HQKK92q+r***rKcd}||jvr||}||j|}|S)z:Resolve symbol to value or function; None if nothing foundN)rCr'rVrBr!rrerOs rIsymbolz engine.symbolsP  do//11 1 1 C  A 9""3''ArKc6|j|S)r)rCr"r s rIavailableresourcekeyszengine.availableresourcekeyss,,W555rKc4|jS)r%)rCr'r&s rIknownresourcekeyszengine.knownresourcekeyss((***rKc|j||}|$tjt d|z|S)zNReturn internal data (e.g. cache) used for keyword/function evaluationNs#template resource not available: %s)rCr*rResourceUnavailablerrYs rIresourcezengine.resourcesM O " "7C 0 0 92899C? rKc||jvrT||}t|f|j|< t||t|j|<n#|j|=xYw|j|S)z!load, parse, and cache a template)rDr@rrr)r!rrs rIrz engine._loadsm DK   QA115DKN !+AtW!=!= A KN{1~s A Ac||jvr-t|}t||t|j|<|j|S)z"Parse and cache a literal template)rErlrrr!rQrs rIrz engine._parses? t & &d A$.q$$@$@DOD !t$$rKc^ ||dS#tj$rYdSwxYw)z:Load, parse, and cache the specified template if availableTF)rrTemplateNotFoundr!rs rIpreloadzengine.preloads@  JJqMMM4,   55 s ,,c`||\}}||||S)zPerform expansion. t is name of map element to expand. mapping contains added elements for use during expansion. Is a generator.)r_expand)r!rrrrDs rIprocesszengine.processs-ZZ]] d||D$000rKc`||\}}||||S)zPerform expansion over a literal template No user aliases will be expanded since this is supposed to be called with an internal template string. )rrj)r!rQrrrDs rIrz engine.expands/ [[&& d||D$000rKc |j|i|}|r|||}tj||||||Sr])rCr/rrflatten)r!rrDr extramappings rIrjzengine._expand sa224WEE  #    ( ( ("G#D'44gt3L3LMMMrK)NNN)r r rrrJrSrNrZr\r^rarrrhrkrrjrbrKrIr>r>s""&    *+++666+++   %%%111111NNNNNrKr>cHt}|stdStj|}g}|D]I}|d}|ddvr"|ddkr||dJdt|S) Ns7no templates found, try `hg debuginstall` for more inforr)sorigsrejrs map-cmdliners, ) templatedirroslistdirsplitrOjoinsorted)pathdirlist stylelistfilerts rIryry+s ==D MKLLLjGI'' 4   9) ) )  8~ % %   U1X & & & ::fY'' ( ((rKctj|rtj|dSt jtd|ztdtz)Nrbsstyle '%s' not foundsavailable styles: %sr) rrrwexistsr posixfiler Abortrry)mapfiles rI _open_mapfiler:si w~~g.~gu--- + !""W, & ' ')++ 5   rKc` tjr4|tj}d|}t j| tj fd| } ||ddii}i}g} dd}|rW|ddvrLt j t j |}t j |st} | t j t j| |} t j| r| }n^t j t j| d } t j| r| }t!|}t#||\}}}dD]\} }|s6t'jt+d d| |ddvr[|d|d kr6t'jt+d d| t/||| <| dkr#t j ||| <|d|||fS)z.Load template elements from the given map filercd}rqtjtj|}tj|rt j|d}|stj|vr+|} tj d|}n#t$rd}YnwxYwt}|rqtjtj||}tj|rt j|d}|r0| }|||| dSdS)Nr|smercurial.templates)sectionsremapinclude)rrrwnormpathruisfilerr~r ossepr open_resourcerrqreadrl) relrr subresourceabsdirrDbaseconfrs rIrz_readmapfile..includeOss  9'""27<<c#:#:;;Cw~~c"" 9"nS%88  A~S(('"."<.##KK)'''"&KKK'"mmA'**27<<S+A+ABBCw~~c**A&*nS%&@&@  ##%%D JJ!        s B B/.B/rK templates)rrs__base__rrNsmaps missing valuersunmatched quotess templatealias)r iswindowsrtrrurrrwdirnamerrrlrVrr}rqrr _readmapfilerr r7rsourcerextend)fpr name_pathsrDcachetmaprrUrwrp2p3rerrrs @@@rIrrCs( ]]8>22 ))J'' 7??7 # #D =??D> 7799DJJwS,$7JIII E DG ((< - -C 6s1vV##w T3 7 788w~~d## "--CW%%bgll3&<&<==7>>"%%"DD))"',,r6*B*BCCBw~~b))"! 4 +B55tWJJ|,, 0 0S ""##T[[s%C%C  q6V  1vR  &)**DKK c,J,J's++E#JJ K   T3//DI NN4::.//000 $ rKc6eZdZdZdZdZdZdZdZdZ dS) rFz2Load template fragments optionally from a map filec|i}||_i|_t||_dSr])copyr_mapr r _aliasmap)r!rrs rIrJzloader.__init__s; =EZZ\\  $--g66rKc&||jvp||jvSr])rrr!res rI __contains__zloader.__contains__sdj 4C49$44rKc8||jvr t|j|\}}||j|<n#t$r4}t jtd|jdzd}~wt$rn}td|j|tj |jdfz}t|jdtj |d}~wwxYw||j|S)?Get parsed tree for the given template name. Use a local cache.s"%s" not in template maprNstemplate file %s: %sr)r open_templaterrKeyErrorrrfrrIOErrorr forcebytestrr strfromlocalr)r!rrrrsreasons rIloadz loader.loads DJ   K+DIaL99  "  1    "3122TYq\A K K K233IaL+DIaL997dilH,A&,I,IJJJ  K {{4:a=)))s$9A C9/A>> C9 A)C44C9crt|}|jr t|j|}|Sr])rlrr rrds rIrz loader._parses3 $KK > 6""4>155ArKc|sdS|d}|dkrl|d}||dvrdS|d|||jvs ||jvr)||||dS|dvrdS|dkrL|dt |d||d|dS|dkrL|dt |d||d|dS|ddD]}|||dS)Nrr+r>r,r*rr(r)addrr_findsymbolsusedrr)r!rsymsrrCrs rIrzloader._findsymbolsusedsh  F !W ??QADG|| GKKNNNDJ!ty..%%diillD999 F ( ( ( F :: GKK $q'** + + +  ! !$q'4 0 0 0 F == GKK $q'** + + +  ! !$q'4 0 0 0 Fabb + +A  ! !!T * * * * + +rKcttf}|||||SzLook up (keywords, filters/functions) referenced from the name template 't' This may load additional templates from the map file. )r8rr)r!rrs rI symbolsusedzloader.symbolsuseds: suu~ diillD111 rKN) r r rrrJrrrrrrbrKrIrFrFst<<777555***$ +++6rKrFceZdZ ddZe ddZdZedZed Z ed Z d Z d Z d Z dZdZdZdS) templaterNrbctj}|r||t |||_t |jj||||_||c|_ |_ dS)agCreate template engine optionally with preloaded template fragments - ``filters``: a dict of functions to transform a value into another. - ``defaults``: a dict of symbol values/functions; may be overridden by a ``mapping`` dict. - ``resources``: a resourcemapper object to look up internal data (e.g. cache), inaccessible from user template. - ``cache``: a dict of preloaded template fragments. - ``aliases``: a list of alias (name, replacement) pairs. self.cache may be updated later to register additional template fragments. N) r rGrrrFr@r>r_proc _minchunk _maxchunk) r!rGrHrIrrminchunkmaxchunk allfilterss rIrJztemplater.__init__ss.%,1133  '   g & & &eW-- DL-z8YOO )18&rKc |||||g||} |st|}t||\}} } | jj|| | j_t | | j_| S)z,Create templater from the specified map file) rrr@rrrr rr) clsrrrGrHrIrrrrrrs rI frommapfileztemplater.frommapfiles C9eR8 L L (w''B+B88tW u%%% )227;; rKc||jvSr])r@rs rIrztemplater.__contains__sdl""rKc|jjSr])r@rr&s rIrztemplater.caches |!!rKc|jjSr])rrr&s rIrztemplater._filters"s z""rKc|jjSr])rrBr&s rIrHztemplater.defaults&s z##rKc6|j|S)r)r@rrgs rIrztemplater.load*s|  ###rKc,|dS)zLook up (keywords, filters/functions) referenced from the default unnamed template This may load additional templates from the map file. rK)rr&s rIsymbolsuseddefaultztemplater.symbolsuseddefault.s $$$rKc6|j|Sr)r@rrgs rIrztemplater.symbolsused6s |''***rKc.|d|S)z?Render the default unnamed template and return result as stringrK)renderr s rI renderdefaultztemplater.renderdefault>s{{3(((rKcTd|||S)z?Render the specified named template and return result as stringrK)rugenerate)r!rrs rIrztemplater.renderBs"xx a11222rKc|j||}|jr!tj||j|j}|S)zVReturn a generator that renders the specified named template and yields chunks)rjmax)rrkrrincreasingchunksr)r!rrstreams rIrztemplater.generateFsN##Aw// > *DNF rK)NNNNrbrr)NNNNNrr)r r rrJ classmethodrrpropertyrrrHrrrrrrrbrKrIrrs0<<<<< [*###""X"##X#$$X$$$$%%%+++)))333rKrctjtjtjd}tj|r|ndS)z6return the directory used for template files, or None.rN)rrrwrrurdatapathisdir)rws rIrqrqQsG 7  BGLL)> MM N ND7==&& 044D0rKcVtj|stj|r|t |dfS|t }|3tj||}|t |dfStjr4| tj }d|}| d}dddg|ddz}|tj ||dfS) a returns a file-like object for the given template, and its full path If the name is a relative path and we're in a frozen binary, the template will be read from the mercurial.templates package instead. The returned path will then be the relative path. rb)modeNrrs mercurialrr) rrrwrisabsopenrqrur rrtrrr)name templatepathrr name_parts package_names rIrrWs w~~d+rw}}T22+T$T*****"}}  GLLt , ,$qt$$$$$% ZZ// yy$$D!!J99lL9JssOKLLL "<B@@ rKcT t||S#ttf$rYdSwxYw)N)NN)rEnvironmentError ImportError)rrs rItry_open_templaterzs>T<000 k *zzs ''r])rK)F)rKF)@rr0rri18nrr rrrrr r r r rrutilsrrrirJr6rYrNrmrrlrrrrrrrrrrrrrrrrrrrrrbasealiasrulesr rrrr5r>ryrrrFrrqrrrbrKrIrs$::z                         C  ,  ,    ,    *   *  *  5  1  -  % 1 / /  3! " '# *aaaaHGGGG4GGGG:****Z N N N   F666>%%%III'''GGG  > > >MMM--- < < </// 222 ))) === < < <+++\MMM<< ::::   ;;   +  + ( Y" Y @ @ @ @{ @ @  A A! (     !),  ) ) ) ) )&' ) ) ) ...&&&&&&&&.        NNNNNNNNNNNNNNNNb ) ) )T T T nHHHHHHHHViiiiiiiiX111    FrK