o !b@@sdZddlmZddlmZmZmZmZddlmZm Z m Z m Z m Z m Z mZddlmZddlmZmZmZmZmZmZmZddlmZddlmZdd lTdd lmZd gZ d Z!Gd d d eZ"dS)zMarkup templating engine.)chain)AttrsMarkup NamespaceStream)STARTENDSTART_NSEND_NSTEXTPICOMMENT) XMLParser)BadDirectiveErrorTemplateTemplateSyntaxError_apply_directivesEXECINCLUDESUB)Suite) interpolate)*)NewTextTemplateMarkupTemplatezrestructuredtext enc @seZdZdZdZdZdefdefdefde fde fd e fd e fd e fd efd efdefdefg ZdZeZ  d'ddZddZddZddZddZddZd(d d!Zd"d#Zd)d%d&ZdS)*raAImplementation of the template language for XML-based templates. >>> tmpl = MarkupTemplate('''''') >>> print(tmpl.generate(items=[1, 2, 3])) zhttp://genshi.edgewall.org/zhttp://www.w3.org/2001/XIncludedefmatchwhen otherwiseforifchoosewithreplacecontentattrsstripxmlNstrictTc Cs,tj||||||||d||j|dS)N)filepathfilenameloaderencodinglookup allow_exec)r__init__add_directivesDIRECTIVE_NAMESPACE)selfsourcer)r*r+r,r-r.r48/usr/lib/python3/dist-packages/genshi/template/markup.pyr/?s zMarkupTemplate.__init__cCs2t||j|j|j|j|jg7_dSN)r _init_filtersfiltersremove_include_match)r2r4r4r5r7Fs zMarkupTemplate._init_filtersc Cs`t|ts t||j|d}g}|D]\}}}|tur8t||j|d|d|jdD] \}}}||||fq)q|t ur|ddkr|j sSt d|jg|ddRzt |d|j|d|jd}Wn$t y}zt ||j|d|jpvdd|d|jpdd}~ww|t||fq|tur|ds||||fq||||fq|S) N)r*r,r-rpythonzPython code blocks not allowed!) isinstancerrr*r rr)r-appendr r.rr SyntaxErrorlinenooffsetrr lstrip startswith) r2r3r,streamkinddatapossuiteerrr4r4r5_parseLsJ    zMarkupTemplate._parsec Csd}i}g}i}|D]h\}} } |tur| \} } g} d}| j|krO|| j}|dur5t| j|j| dtdd| D}| ||||| | fd}g}| D]F\}}|j|kr||j}|durpt|j|j| dt |t urt |dkr|dd}| ||||| | fqS|||fqSt |}| r| jddd | t ||f||| f<||| |f| f|d7}q |tur|d8}||| | f|| f|vr||| f\} }}||d}|r|dd }t| |f| fg||d<q |tur4| \} }||||}t |dkr)|ddtur)|dd\}}| |7} ||| |f| fq |turO| \}}|||<||krN||| | fq |turk|| d}|rj||krj||| | fq ||| | fq |S) NrFr<cSs g|] \}}|js|j|fqSr4) namespace localname).0namevaluer4r4r5 s z6MarkupTemplate._extract_directives..TcSs|dS)Nrr4)xr4r4r5sz4MarkupTemplate._extract_directives..)key)rrO get_directiverPrr)dictrBget_directive_indexcopytypelistlenrsortrpopr_extract_directivesr r )r2rHrOfactorydepthdirmap new_stream ns_prefixrIrJrKtagr% directivesr&clsargs new_attrsrRrSrE substreamadded_directivesprefixurir4r4r5rbos                        z"MarkupTemplate._extract_directivesc Cs0gg}i}g}g}t|j}|D]\}}} |d}|turl|\} } | |vra| jdkrO| d} | s?td|jg| ddR|| | df|gq| jdkr`|g||dq||| | f| fq|tur|r||dkr| } | |dusJq||dkrd}t |t |kr| }| |d}| \}}z t t d|p|j }Wntytd |jg| ddRw|t|||f| fq|||| fq|tur|d|kr|d||d <q|tur||vr| |q|||| fqt |dksJ|d S) NrXincludehrefz(Include misses required attribute "href"r<parsefallback)r'textz.Invalid value for "parse" attribute of includer)rXINCLUDE_NAMESPACErrPgetrr)rBrrar_rr __class__KeyErrorrr r )r2rHstreamsprefixes fallbacksincludes xinclude_nsrIrJrKrhr% include_hreffallback_streamrtrrrsrjr4r4r5_extract_includessx            z MarkupTemplate._extract_includesc cs|D]P\}}}|turM|\}}g}|D]2\}} | r?tt| |j|d|d|jd} t| dkr?| ddtur?| dd} ||| fq|t|f}|||fVqdS)Nr<r=r>r) rr^rr)r-r_r rBr) r2rHrIrJrKrhr%rlrRrSr4r4r5_interpolate_attrs s     z!MarkupTemplate._interpolate_attrscCstj|||||dS)N)inlined)r_preparerr)r2rHrr4r4r5rszMarkupTemplate._preparecCs$|jrJd||j|||_dS)aRegister a custom `DirectiveFactory` for a given namespace. :param namespace: the namespace URI :type namespace: `basestring` :param factory: the directive factory to register :type factory: `DirectiveFactory` :since: version 0.6 z9Too late for adding directives, template already preparedN) _preparedrb_stream)r2rOrcr4r4r5r0$s  zMarkupTemplate.add_directivesrc +sj}dd}|D]}|r|dtur|dtur|Vq t|D]\} \} } } } }| |ks8|dur9| |kr9q"| |durd| vrL|| =| d8} dd || ddDD] } | |dd qY| d}d| vrtd | vrt|d8}g}|||j}|dkr|j|f||d |}|t|g||d | vrtt dgfdd}t |d}t | ||} |j|j | fi|fd| di|D]}|Vq҈dsD]}qdd || dDD] } | |ddd qnq"|Vq dS)z_Internal stream filter that applies any defined match templates to the stream. cssXd} t|}|dtur|d7}n |dtur|d8}|dkr%|Vn||dSq)Nr<r)nextrr)rHrBrdeventr4r4r5_strip8s   z%MarkupTemplate._match.._striprNT match_oncer<cSg|]}|dqSrr4rQmtr4r4r5rT[z)MarkupTemplate._match..) updateonly not_recursive)startend not_bufferedFcsdd<|S)NTrselect)pathr$ctxt namespacesselectedr4r5rpsz%MarkupTemplate._match..selectrrcSrrr4rr4r4r5rTr) _match_templatesrr enumeraterBr;r:rr^rrZr_flatten)r2rHrrrvarsmatch_templatesrridxtestrtemplatehintsripre_endtailinnerrr4rr5r;2sv     :zMarkupTemplate._match)NNNNr(Tr6)rN)__name__ __module__ __qualname____doc__r1rv DefDirectiveMatchDirective WhenDirectiveOtherwiseDirective ForDirective IfDirectiveChooseDirective WithDirectiveReplaceDirectiveContentDirectiveAttrsDirectiveStripDirectiveri serializerr _number_convr/r7rNrbrrrr0r;r4r4r4r5r!s<   #\B N)#r itertoolsr genshi.corerrrrrrr r r r r genshi.inputrgenshi.template.baserrrrrrrgenshi.template.evalrgenshi.template.interpolationrgenshi.template.directivesgenshi.template.textr__all__ __docformat__rr4r4r4r5s $ $