o !b6@sdZddlmZddlZddlmZddlmZddlm Z m Z ddl m Z dgZ d Zd Zed Zd Zed defZdddZddZdS)zString interpolation routines, i.e. the splitting up a given text into some parts that are literal strings, and others that are Python expressions. )chainN) PseudoToken)TEXT)TemplateSyntaxErrorEXPR) Expression interpolatezrestructuredtext en5abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_z .0123456789$z %s|%s(?s)z)[uU]?[rR]?("""|\'\'\')((?|||g}g}d}tt|||dgD]\}} |rd|r,td||fV|dd=d}| rczt| |d|d|d} t| t|fVWn*tyb} zt | ||d|d| j p[dd} ~ wwn | | |durqt|}d| vr| } |dt | d7<|dt | d 7<q|dt | 7<qdS) aParse the given string and extract expressions. This function is a generator that yields `TEXT` events for literal strings, and `EXPR` events for expressions, depending on the results of parsing the string. >>> for kind, data, pos in interpolate("hey ${foo}bar"): ... print('%s %r' % (kind, data)) TEXT 'hey ' EXPR Expression('foo') TEXT 'bar' :param text: the text to parse :param filepath: absolute path to the file in which the text was found (optional) :param lineno: the line number at which the text was found (optional) :param offset: the column number at which the text starts in the source (optional) :param lookup: the variable lookup mechanism; either "lenient" (the default), "strict", or a custom lookup class :return: a list of `TEXT` and `EXPR` events :raise TemplateSyntaxError: when a syntax error in an expression is encountered N)Tr r)lookup r )rlexrjoinrstriprtuple SyntaxErrorroffsetappend splitlineslen) textfilepathlinenorrpostextbuftextposis_exprchunkexprerrlinesr&?/usr/lib/python3/dist-packages/genshi/template/interpolation.pyr's@    ccsd}}t|}d} |r|t|d}d}n|t|}|dks)||dkr*n||d}|dkr||krAd|||fV|d}d}|rt||} | dusW| sdtd|g|ddR| }| jd\} } || | } | dkr~|d7}n| dkr|d8}|sId ||d|dfVnc|t vr||krd|||fV|}|d7}||kr||} | t vrn|d7}||ksd ||d| fVn)|s|tkr||krd|||fVd }|d}nd|||dfV|d}q ||kr d||dfVdSdS) NrFrr{zinvalid syntax}T) rfindPREFIXtoken_rematchgrouprendregs NAMESTART NAMECHARSr)rr rrrr0escapednextlevelr.tstarttendtokencharr&r&r'r_sn         5r)Nr rr )__doc__ itertoolsrretokenizer genshi.corergenshi.template.baserrgenshi.template.evalr__all__ __docformat__r2r3r,compiler-rrr&r&r&r's$      8