6Ic@sdZddkZddkZddkZddkZddkZddkZddklZddk l Z ddddd d d gZ ei d Z ei d Zei deiZdefdYZdefdYZdefdYZdZdefdYZdZedZd efdYZd efdYZedZdZ dZ!defdYZ"dZ#defd YZ$d!efd"YZ%d#efd$YZ&d%efd&YZ'e'Z(['eed'd(Z)ei d)Z*d*d+d,d-d.gZ+ei d/Z,ei d0Z-d1Z.d2Z/ed'd3Z0fd4Z1d5Z2d6Z3d7Z4d8Z5d9Z6d:Z7d;Z8d<Z9d=Z:ed>Z;e<d?jo e;ndS(@s A small templating language This implements a small templating language. This language implements if/elif/else, for/continue/break, expressions, and blocks of Python code. The syntax is:: {{any expression (function calls etc)}} {{any expression | filter}} {{for x in y}}...{{endfor}} {{if x}}x{{elif y}}y{{else}}z{{endif}} {{py:x=1}} {{py: def foo(bar): return 'baz' }} {{default var = default_value}} {{# comment}} You use this with the ``Template`` class or the ``sub`` shortcut. The ``Template`` class takes the template string and the name of the template (for errors) and a default namespace. Then (like ``string.Template``) you can call the ``tmpl.substitute(**kw)`` method to make a substitution (or ``tmpl.substitute(a_dict)``). ``sub(content, **kw)`` substitutes the template immediately. You can use ``__name='tmpl.html'`` to set the name of the template. If there are syntax errors ``TemplateError`` will be raised. iN(tStringIO(tloopert TemplateErrortTemplatetsubt HTMLTemplatetsub_htmlthtmltbunchs \{\{|\}\}s\s+in\s+s^[a-z_][a-z0-9_]*$cBs#eZdZddZdZRS(s.Exception raised while parsing a template cCs&ti||||_||_dS(N(t Exceptiont__init__tpositiontname(tselftmessageR R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR 4s cCsddi|i}|io%d||id|idf}n|io|d|i7}n|S(Nt s%s at line %s column %siis in %s(tjointargsR R (R tmsg((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyt__str__9s " N(t__name__t __module__t__doc__tNoneR R(((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR0s t_TemplateContinuecBseZRS((RR(((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRBst_TemplateBreakcBseZRS((RR(((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyREscCs:tii|i|}|ii|d|id|iS(Nt namespacet get_template(tostpathRR t __class__t from_filenameRR(R t from_templateR((s4/usr/lib/python2.6/site-packages/tempita/__init__.pytget_file_templateHs cBseZhdd6dd6ed6ZdZdZdddddddZdddedZ e e Z d Z d Z d Z d Zd ZdZdZdZdZdZdZdZRS(s{{t start_bracess}}t end_bracesRtutf8ic Csb||_t|t|_|djo|dj oyti|}Wntj oqX|i} |i } d| jo<| d}|i dp|i do|d }qn"d| jo| d}nd}| o|d| 7}qn||_ t |d|d ||_ |djo h}n||_||_|dj o ||_ndS( Nt__file__s.pycs.pyoiRss:%sR t line_offset(tcontentt isinstancetunicodet_unicodeRtsyst _getframet ValueErrort f_globalstf_linenotendswithR tparset_parsedRRtdefault_inherit( R R'R Rt stacklevelRR3R&tcallertglobalstlineno((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR Ys4             c Csdt|d}|i}|i|o|i|}n|d|d|d|d|d|S(NtrbR'R RR3R(topentreadtclosetdecode(tclstfilenameRtencodingR3Rtftc((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRxs  cCs*d|iitt|d|ifS(Ns<%s %s name=%r>i(RRthextidR (R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyt__repr__s cOs|ow|otdnt|djotdnt|ddptd|dfn|d}n|}|i|d<|io|i|in|i|\}}}|p |i}n|o|i||||}n|S(Ns3You can only give positional *or* keyword argumentsis)You can only give one positional argumentititemssqIf you pass in a single argument, you must pass in a dictionary-like object (with a .items() method); you gave %rt__template_name__( t TypeErrortlenthasattrR Rtupdatet _interpretR3t_interpret_inherit(R Rtkwtnstresulttdefstinherit((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyt substitutes,     cCsmt}g}h}|i|i|d|d|d|jo|id}nd}di|||fS(NtoutRPt __inherit__t(tTruet_interpret_codesR2tpopRR(R RNt__traceback_hide__tpartsRPRQ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRKs c Cst}|iptdddd|in|i||}t|i}x*|iD]\}} t||| q]W||_|i }||d<|i |S(Ns:You cannot use inheritance without passing in get_templateR R R ( RVRRRR tTemplateObjectREtsetattrtbodytcopyRR( R R]RPtinherit_templateRNRYttempltself_R tvalue((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRLs     cCsRt}xE|D]=}t|to|i|q |i||||q WdS(N(RVR(t basestringtappendt_interpret_code(R tcodesRNRSRPRYtitem((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRWs c Cst}|d|d}}|djo|i|d||nU|djo tn;|djo tn!|djoU|d|d|d }} } |i| ||} |i|| | |||n|d jo$|d} |i| |||n|d jo|did } |i| d||} x3| dD]'} |i| ||}|| } qNW|i|i | |n|d joI|d|d}} ||jo#|i| ||}|||d||d|df}|io|d|i7}n|S(Ns%s at line %s column %siis in file %s(R (R RRq((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR_s  N(RRRRRRR3R R!Rt classmethodRDRRRKRLRWReRuRvRtRsRxR(((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRNs.        +    0cKs.|id}t|d|}|i|S(Nt__nameR (tgetRRR(R'RMR ttmpl((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRfscCst|d|}|i|S(NR (RRR(R'R{R>R((s4/usr/lib/python2.6/site-packages/tempita/__init__.pytpaste_script_template_rendererkscBs5eZdZdZdZdZdZRS(cKs1x*|iD]\}}t|||q WdS(N(RER\(R RMR Rb((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR qs cCs|||Rs%s=%r(REtsortRRR(R t_[1]tktvREt_[2]((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRDs 3  (RRR RRRRD(((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRos     cBs,eZdZdZdZdZRS(cCs ||_dS(N(Rb(R Rb((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR scCs|iS(N(Rb(R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRscCs|iS(N(Rb(R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyt__html__scCsd|ii|ifS(Ns<%s %r>(RRRb(R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRDs(RRR RRRD(((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRs   cCs| ot|do |iS|djodSt|tp0t|dot|}qut|}nti|d}t|to|i dd}n|S(NRRURitasciitxmlcharrefreplace( RIRRR(RcR)RtcgitescapeR(Rbtforce((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyt html_quotes  cCspt|tp0t|dot|}q@t|}nt|to|id}nti|S(NRR$(R(RcRIR)RRturllibtquote(R((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyturlscKs|i}|ig}xi|D]a\}}|djoq#n|ido|d }n|idt|t|fq#Wtdi|S(Nt_is%s="%s"R(RERRR0RdRRR(RMRZR Rb((s4/usr/lib/python2.6/site-packages/tempita/__init__.pytattrs    'c BsHeZeiiZeiededede de dZ RS(RRRRcCs[t|do|i}t}nt}ti|||}|o t|S|SdS(NR(RIRtFalseRVRRxR(R RbRqRtplain((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRxs   ( RRRRR^RJRRRRRRx(((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRs  cKs.|id}t|d|}|i|S(NRR (RRRRRO(R'RMR R((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRs RycBsDeZddZdZdZdZddZdZRS(cCsC||_||_||_||_||_||_||_dS(N(t _templatet _func_namet_func_signaturet_bodyt_nst_post _bound_self(R ttemplatet func_nametfunc_signatureR]RNRqt bound_self((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR s      cCs#d|i|i|ii|ifS(Ns"(RRRR R(R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRDs cCs|S(N((R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRscOs|i||}|ii}|i||idj o|i|ds sMissing argument: %s( RRERGtlistRXttupleRRRtRR( R RRMRtsig_argstvar_argstvar_kwtdefaultstextra_kwR Rbt value_expr((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRsP    "   ! N( RRRR RDRRRR(((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRys    R[cBseZdZdZRS(cCs||_t||_dS(N(t_TemplateObject__nametTemplateObjectGetterR(R R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR -s cCsd|ii|ifS(Ns<%s %s>(RRR(R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRD0s(RRR RD(((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR[,s RcBs#eZdZdZdZRS(cCs ||_dS(N(t#_TemplateObjectGetter__template_obj(R t template_obj((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR 4scCst|i|tS(N(RRtEmpty(R R((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR6scCsd|ii|ifS(Ns<%s around %r>(RRR(R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRD8s(RRR RRD(((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR3s  t_EmptycBs>eZdZdZdZdZdZdZRS(cOs|S(N((R RRM((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR<scCsdS(NRU((R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR>scCsdS(NR((R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRD@scCsdS(Nu((R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRBscCs tdS(N((titer(R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyt__iter__DscCstS(N(R(R ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyt __nonzero__Fs(RRRRRDRRR(((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR;s      ic Cst}g}d}d }xti|D]}|id} t||i|} | djo#|otdd| d|n2| djo$| otdd| d|n| djo5|||i!} | o|i| nt }n'|i|||i!|ft}|i}| }q(W|otd d|d|n||} | o|i| n|ot |}n|S( sY Lex a string into chunks: >>> lex('hey') ['hey'] >>> lex('hey {{you}}') ['hey ', ('you', (1, 7))] >>> lex('hey {{') Traceback (most recent call last): ... TemplateError: No }} to finish last expression at line 1 column 7 >>> lex('hey }}') Traceback (most recent call last): ... TemplateError: }} outside expression at line 1 column 7 >>> lex('hey {{ {{') Traceback (most recent call last): ... TemplateError: {{ inside expression at line 1 column 10 iis{{s{{ inside expressionR R s}}s}} outside expressionsNo }} to finish last expression(ii( Rttoken_retfinditertgroupt find_positionRRRRdRVttrim_lex( tsR ttrim_whitespaceR&tin_exprtchunkstlasttlast_postmatchRmRqR}((s4/usr/lib/python2.6/site-packages/tempita/__init__.pytlexPs@         s4^(?:if |elif |else |for |def |inherit |default |py:)tendiftendfortenddefRiRjs \n\r?[\t ]*$s ^[\t ]*\ncCs8x1tt|D]}||}t||toqn|d}ti| o|tjoqn|p d}n||d}|dt|jo d}n||d}t|t pt|t oqn| p+ti|p|djoH|i o| p5t i|p%|t|djo|i o|ob|djo |i od||d>> tokens = lex('{{if x}}\nx\n{{endif}}\ny', trim_whitespace=False) >>> tokens [('if x', (1, 3)), '\nx\n', ('endif', (3, 3)), '\ny'] >>> trim_lex(tokens) [('if x', (1, 3)), 'x\n', ('endif', (3, 3)), 'y'] iRUii( trangeRHR(Rct statement_retsearchtsingle_statementsttrail_whitespace_retstriptlead_whitespace_reRR(ttokenstitcurrentRgtprevtnexttm((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRsD     %%cCs2|| i}t||t|ddfS(s/Given a string and index, return (line, column)ii(t splitlinesRH(tstringtindexR&tleading((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRscCsSt|d|d|}g}x.|o&t||\}}|i|q!W|S(s Parses a string into a kind of AST >>> parse('{{x}}') [('expr', (1, 3), 'x')] >>> parse('foo') ['foo'] >>> parse('{{if x}}test{{endif}}') [('cond', (1, 3), ('if', (1, 3), 'x', ['test']))] >>> parse('series->{{for x in y}}x={{x}}{{endfor}}') ['series->', ('for', (1, 11), ('x',), 'y', ['x=', ('expr', (1, 27), 'x')])] >>> parse('{{for x, y in z:}}{{continue}}{{endfor}}') [('for', (1, 3), ('x', 'y'), 'z', [('continue', (1, 21))])] >>> parse('{{py:x=1}}') [('py', (1, 3), 'x=1')] >>> parse('{{if x}}a{{elif y}}b{{else}}c{{endif}}') [('cond', (1, 3), ('if', (1, 3), 'x', ['a']), ('elif', (1, 12), 'y', ['b']), ('else', (1, 23), None, ['c']))] Some exceptions:: >>> parse('{{continue}}') Traceback (most recent call last): ... TemplateError: continue outside of for loop at line 1 column 3 >>> parse('{{if x}}foo') Traceback (most recent call last): ... TemplateError: No {{endif}} at line 1 column 3 >>> parse('{{else}}') Traceback (most recent call last): ... TemplateError: else outside of an if block at line 1 column 3 >>> parse('{{if x}}{{for x in y}}{{endif}}{{endfor}}') Traceback (most recent call last): ... TemplateError: Unexpected endif at line 1 column 25 >>> parse('{{if}}{{endif}}') Traceback (most recent call last): ... TemplateError: if with no expression at line 1 column 3 >>> parse('{{for x y}}{{endfor}}') Traceback (most recent call last): ... TemplateError: Bad for (no "in") in 'x y' at line 1 column 3 >>> parse('{{py:x=1\ny=2}}') Traceback (most recent call last): ... TemplateError: Multi-line py blocks must start with a newline at line 1 column 3 R R&(Rt parse_exprRd(RR R&RROR((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR1s2cCst|dto|d|dfS|d\}}|i}|ido|did}|idp|idoR|id}d|jo(|idd}|idd }n|d7}n*d|jotd d |d |nd ||f|dfS|d$jo>d|jotdd |d |n||f|dfS|idot|||S|idp |djo*td|idd |d |n|d%jo td|d |d |n|d&jo td|d |d |n|idot |||S|idot |||S|idot |||S|id ot |||S|id!o d"||ddf|dfSd#||ddf|dfS('Niispy:is s s s RUs.Multi-line py blocks must start with a newlineR R RhRiRjRkscontinue outside of for loopsif selif Rs%s outside of an if blocktiftelifs%s with no expressionRRRs Unexpected %ssfor sdefault sinherit sdef t#RrRm(scontinuesbreak(RRsfor(RRR( R(RcRt startswithtlstriptreplaceRt parse_condRwt parse_fort parse_defaultt parse_inheritt parse_def(RR tcontextRmRq((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRsb            cCs|dd}g}|d }x|ptdd|d|nt|dto4|dddjod|ft||dfSt|||\}}|i|q!dS( NiiRsMissing {{endif}}R R RRl(sif(RR(Rtparse_one_condRd(RR RRtpiecesR((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR2s c Csu|d|d\}}}g}|ido|d }n|ido d||di|f}nT|ido d ||d i|f}n$|d jod |d|f}nx|ptd d |d|nt|dtoM|dddjp-|ddidp|ddd jo ||fSt|||\}}|i|qdS(Niit:isif Riselif RiRs No {{endif}}R R R( R0RRRRR(RRRd(RR RtfirstRqR'R}R((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRAs,    c Cs|d\}}|d}d|}g}|ido|d }n|di}ti|}|p td|d|d |n||i }d |jo td |d|d |ntg}||i id D]$} | io|| iqq~}||i} x|ptd d|d |nt |dto3|dddjod||| |f|dfSt |||\} }|i | q/dS(NiiRkR iisBad for (no "in") in %rR R t(s=You cannot have () in the variable section of a for loop (%r)t,s No {{endfor}}R(sfor( R0Rtin_reRRRRRwRR(RRd( RR RR RqR'RR{RRRmR((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR[s>    $*cCs|d\}}|iddd}|idd}t|djo td|d|d|n|di}d|jotdd|d|nti|p td |d|d|n|di}d |||f|dfS( Niit=s:Expression must be {{default var=value}}; no = found in %rR R R s'{{default x, y = ...}} is not supporteds-Not a valid variable name for {{default}}: %rRo(RwRRHRRtvar_reR(RR RR RqRZRRm((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR}s$  cCs=|d\}}|iddd}d||f|dfS(NiiRQ(RwR(RR RR RqRm((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRsc Cs|d\}}|d}|iddd}|ido|d }nd|jo|}d ddhf}ne|idp td|d|d |n5|d }|idd\}}t|||}|d}g}x|ptd d|d |nt|dto3|ddd jod ||||f|dfSt|||\} }|i| qdS(NiiR iR t)s*Function definition doesn't end with ): %sR R RpsMissing {{enddef}}R((sdef( RwRR0Rtparse_signatureR(RRRd( RR RR RRtsigtsig_textR'R((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyRs4     cstit|ig}d}d}h}tfd}x^d}|\} } | tijoPn| tijo3| djp | djo| }|\} } n| tijo t d|d|d|n| } |\} } | tijp| tijod| djoW|djo | }n%|djo | }n|i | | tijoPqEqEn|dj o t d|d|d|n| tijo| djod} d} d }d}}g}x|t \} } }}|djo |}n|}| tijo'|o t d|d|d|n| o[| tijp| tijo;| djo.t |||}||| <|i | Pn|i | | f|o+| tijo| | jo|d 7}q|o@| tijo0| | jo#|d 8}|pd} } qq| oL| tijo<| djo/| } d }hdd 6dd 6dd 6| } qqqEqE||||fS(Ncs}y+i\}}\}}\}}}Wntj otidfSX|o||||f||ffS||fSdS(NRU(Rt StopIterationttokenizet ENDMARKER(Rqttok_typet tok_stringtsrowtscolterowtecoltline(R(s4/usr/lib/python2.6/site-packages/tempita/__init__.pyt get_tokens+t*s**sInvalid signature: (%s)R R R RiiR t[t{Rt]t}(R R R!( Rtgenerate_tokensRtreadlineRRRtOPtNAMERRdRVtisolate_expression(RR RqRtvar_argRRRt var_arg_typeRRtvar_namet nest_typet unnest_typet nest_countt start_postend_posRZRRt default_expr((Rs4/usr/lib/python2.6/site-packages/tempita/__init__.pyRs~ * -           -  $$ %-c Cs|\}}|d8}|\}}|d8}|it}||jo||||!S|||g}|i||d|!|t|jo|i||| ndi|S(NiRU(RRVtextendRHRdR( RR/R0RRRRtlinesRZ((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyR(s     sn%prog [OPTIONS] TEMPLATE arg=value Use py:arg=value to set a Python value; otherwise all values are strings. cCsddk}ddk}ddk}ddk}|djo|id}n|id}|idt|dt }|i dddd d d d d |i dddddd d|i dddddd d|i |\}}t |djodGH|i dn|d}|d}h} |io| i|inx|D]y} d| jod| GH|i dn| idd\} } | ido| d } t| } n| | | R8R twb(R+toptparset pkg_resourcesRRtargvtget_distributiont OptionParserRt_fill_command_usaget add_optiont parse_argsRHtexitR?RJtenvironRwRRtstdinR:R9R;R<RRRRR8twritetstdout(RR+RBRCRtdisttparsertoptionst template_nameR{RbR ttemplate_contentR@t TemplateClassRRO((s4/usr/lib/python2.6/site-packages/tempita/__init__.pyt fill_commandsr0                   t__main__(=RtreR+RRRRt cStringIORttempita._looperRt__all__tcompileRR tIRR RRRR!RRRRRRRRRVRRRRRRyR[RRRRRRRRRRR1RRRRRRRRR(RGRUR(((s4/usr/lib/python2.6/site-packages/tempita/__init__.pytsn          $   L 7 4 9 4   "    K  =