۶eTc@sdZddlZddlZddlZddlmZmZddlZddlZddlm Z ddl Z ddl Z ddl m Z ddlmZddlmZddlmZdd lmZiZd Zejd d Zd ZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$e$dZ%dZ&dddfZ'dddddfZ(ddfZ)d d!d"fZ*d#Z+d$d%d&d'd(d)d*d+d,d-d.f Z,e+fe,Z-d/d0d1d2d3d4d5d6d7f Z.d8d9d:fZ/e&fe'e(e)e*e-e.e/Z0d;d<d=d>d?d@dAdBdCdDd#dEf e,Z1d8dFdGd6dHdIdJdKdLdMdNdOdPd:dQdRdSdTd9dUdVdWdXdYdZd[d7d\fZ2d]Z3d^Z4d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdnfZ5ie3d]6e4d^6e3d_6e4d`6e3dc6e4dd6e3dg6e4dh6e3da6e4db6e3de6e4df6e3dk6e4dl6e3di6e4dj6e3dm6e4dn6Z6id;d<6d?d@6d=d>6Z7id<d;6d@d?6d>d=6Z8iZ9doZ:x-e6j;D]\Z<Z=e:e<e=e9e<dqZ?e?drZ@edsdtZAduZBejdvZCejdwZDejdxZEejdyejZFejdzejZGejd{ZHi1eIdX6eIdK6d|d}6d~d6dd6dd6dd6dd6dd6dd6eId6eId6dd6dd6dd6dd6dd6ddZ6dd6dd6dd6dd6dd6eIdF6ddT6eIdU6eIdG6eIdO6eIdJ6eIdY6eIdN6eIdV6eId6eIdM6eId6eId6eId6eIdI6eIdH6eIdQ6eIdS6eId[6dd6dd6dd6dd6dd6dd6dd6ZJiddZ6eId6eId6eId6eId6eId6eId6eId6eIdU6eIdG6eIdT6eIdQ6eId6eId6ZKdeLfdYZMdeMfdYZNdeNfdYZOdeNfdYZPdeQfdYZRdeRfdYZSdeQfdYZTde fdYZUdeUfdYZVeVZWdS(s Parser classes for Cheetah's Compiler Classes: ParseError( Exception ) _LowLevelParser( Cheetah.SourceReader.SourceReader ), basically a lexer _HighLevelParser( _LowLevelParser ) Parser === _HighLevelParser (an alias) iN(tDOTALLt MULTILINE(t pseudoprog(t SourceReader(tFilters(t ErrorCatchers(t Unspecified(tI18ncCs*|tkr"tj|t|RR(R(tnameR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt namedGroup,scGst|dS(Nt*(R(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytany-scGst|dS(Nt?(R(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytmaybe.siiit5abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_t 0123456789s**t+t-t~t/s//t%s>>s<>=s<<=s&=s|=t=s<>tistintandtortnotRRt{t}t[t]t,t.t:t;t`tdeltfortraisetassertteliftfromtlambdatreturntbreaktelsetglobalttrytclasstexcepttiftwhiletcontinuetexectimporttpasstdeftfinallytprints'''s"""sr'''sr"""sR'''sR"""su'''su"""sU'''sU"""sur'''sur"""sUr'''sUr"""suR'''suR"""sUR'''sUR"""cCs?t|}t|}tjd|dd|dtjS(Ns(?:s).*?R(RR R R(tstarttend((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytmakeTripleQuoteRe{s  s[ \f\t]*s \r\n|\n|\rs|\Zs(?<=\A)s(?Yscss|]}|jVqdS(N(R(Rta((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pys Zs(RtlisttmapRR(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytmergeXscCst|jS(N(tstrR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyR\s( RRt__doc__RRRRRR(((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRCs     t_LowLevelParsercBseZdZdAZdZedZdZdZ dZ dZ dZ dZ d Zd Zd Zd Zd ZdAdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$d Z%d!Z&d"Z'e(d#d$Z)d%Z*d&Z+d'Z,d(Z-d)Z.d*Z/d+Z0d,Z1d-Z2d.Z3d/Z4d0Z5d1Z6d2Z7d3Z8d4Z9d5Z:d6Z;e<e<d7Z=e<d8Z>d9Z?ged:Z@dAe<d;ZAe<dAdAed<ZBe<dAdAed=ZCd>ZDd?ZEe<e<e<d@ZFRS(BsThis class implements the methods to match or extract ('get*') the basic elements of Cheetah's grammar. It does NOT handle any code generation or state management. cCs ||_dS(N(t_settingsManager(RtsettingsManager((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytsetSettingsManagergscCs6|tkr|jj|S|jj|d|SdS(Ntdefault(RRtsetting(RtkeyR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRjs cCs|jj||dS(N(Rt setSetting(RRtval((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRpscCs |jjS(N(Rtsettings(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRsscCs|jj|dS(N(RtupdateSettings(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRvscCs|jjdS(N(Rt_initializeSettings(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRyscCs|j|j|j|j|jdd|jdd|jdd|jdd|jdd|_|j|j|j|j |j |j |j g|_ dS(sIs called by the Compiler instance after the parser has had a settingsManager assigned with self.setSettingsManager() tcommentStartTokenitmultiLineCommentStartTokentcheetahVarStartTokentdirectiveStartTokent PSPStartTokenN(t_makeCheetahVarREst_makeCommentREst_makeDirectiveREst _makePspREsRt_possibleNonStrConstantCharstmatchCommentStartTokentmatchMultiLineCommentStartTokentmatchVariablePlaceholderStarttmatchExpressionPlaceholderStarttmatchDirectivetmatchPSPStartTokentmatchEOLSlurpTokent_nonStrConstMatchers(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytconfigureParser|s    CcCsd}d|d|d|d|d|d|d}d d |d d d d dd}t||_dtddd dd}t||_ttdt|jddd|dd|ddd|_d}|jd|_ttt|jd||_tt|jdd|_ ttdt|jddd|ddd|_ |jdrtt|jddd t d|_ n d|_ dS(s*Setup the regexs for Cheetah $var parsing.s[0-9\.]+s (?Pss|sm|sh|sd|sw|Rs(?:s(?P\*s\*)Rs(?P\*)s(?P)s (?Pt!s(?P)s(?PRs(?Ps(?Ps((?P|(?:(?:\{|\(|\[)[ \t\f]*))s (?=[A-Za-z_])s(?=[A-Za-z_\*!\{\(\[])s(?:\{|\(|\[)[ \t\f]*s (?=[^\)\}\]])t EOLSlurpTokens[ \t\f]*Ns(?:(?P(R t cacheTokenRERtsilentPlaceholderTokenREtescCharLookBehindRtcheetahVarStartRERtcheetahVarStartTokenREt"cheetahVarInExpressionStartTokenREtexpressionPlaceholderStartREtEOLt EOLSlurpRER(RtnumtintervalRtsilentPlaceholderTokentvalidCharsLookAhead((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs06: # ;.cCst|jd}tt||_~t|jd}t|jd}tt||_tt||_dS(s:Construct the regex bits that are used in comment parsing.RRtmultiLineCommentEndTokenN(RRR RtcommentStartTokenREtmultiLineCommentTokenStartREtmultiLineCommentEndTokenRE(Rt startTokenEsct endTokenEsc((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs cCs|jd}|jd}t|}t|}d}t|g}|jdrg|jdn|j|tdj||_tt||_dS(s8Construct the regexs that are used in directive parsing.RtdirectiveEndTokens(?=[A-Za-z_@])t'allowWhitespaceAfterDirectiveStartTokens[ ]*RN(RRRRR RtdirectiveStartTokenREtdirectiveEndTokenRE(Rt startTokentendTokenRRtvalidSecondCharsLookAheadtreParts((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs    cCs`|jd}t|}tt||_|jd}t|}tt||_dS(s!Setup the regexs for PSP parsing.Rt PSPEndTokenN(RRR RtPSPStartTokenREt PSPEndTokenRE(RRRRR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs   cCs#|jd}|jd||S(s;Unescape any escaped Cheetah \$vars in the string. Rs\(Rtreplace(Rt theStringR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt_unescapeCheetahVarsscCs#|jd}|jd||S(s?Unescape any escaped Cheetah directives in the string. Rs\(RR(RR R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt_unescapeDirectivesscCs |j|S(N(tisLineClearToPos(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytisLineClearToStartTokenscCsId}|j|jkrEx'|jD]}|}|r%Pq%q%Wn|S(sReturns the first match found from the following methods: self.matchCommentStartToken self.matchMultiLineCommentStartToken self.matchVariablePlaceholderStart self.matchExpressionPlaceholderStart self.matchDirective self.matchPSPStartToken self.matchEOLSlurpToken Returns None if no match. N(RtpeekRR(Rtmatchtmatcher((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytmatchTopLevelTokens   cCsotj|j|j}|rk|jtkrkt|jj|j|j}|rk|Sn|S(N(RRtsrcRRttripleQuotedStringStartsttripleQuotedStringREs(RRtTQSmatch((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt matchPyToken&s (cCsa|j}|dkr't|n'|jtkrNt|ddn|j|jS(NRsMalformed triple-quoted string(RRRRRtreadToRP(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt getPyToken/s   cCs,|jr(|jj|j|jSdS(N(RRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyR7s cCs:|j}|s't|ddn|j|jS(NRsInvalid EOL slurp token(RRRRP(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytgetEOLSlurpToken;s cCs|jj|j|jS(N(RRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRAscCs:|j}|s't|ddn|j|jS(NRs'Invalid single-line comment start token(RRRRP(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytgetCommentStartTokenDs cCs|jj|j|jS(N(RRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRJscCs:|j}|s't|ddn|j|jS(NRs&Invalid multi-line comment start token(RRRRP(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytgetMultiLineCommentStartTokenMs cCs|jj|j|jS(N(RRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytmatchMultiLineCommentEndTokenSscCs:|j}|s't|ddn|j|jS(NRs$Invalid multi-line comment end token(RRRRP(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytgetMultiLineCommentEndTokenVs cCsIt|}g}g}|jtkr9t|nx|j|kr%|j}|tkr|j}|j|q<|dkr|jd|kr|jdtkr|j|jq"Pq<|dkr|j|jdj |g}q<|dkr!|jq<Pq<W|rE|jdj |n|S(si Loosely based on getDottedName to pull out comma separated named chunks R4iR3RRs (Rs ( RRt identcharsRRt namecharst getIdentifierRtgetcR(RtsrcLentpiecesRtct nameChunk((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytgetCommaSeparatedSymbols\s0     +     cCst|}g}|jtkr3t|nx|j|kr|j}|tkr||j}|j|q6|dkr|jd|kr|jdtkr|j|jqPq6Pq6Wdj |S(NR4iR( RRRRRRR RR!R(RR"RR$R%((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt getDottedNames     +cCstj|j|jS(N(tidentRERRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytmatchIdentifierscCs:|j}|s't|ddn|j|jS(NRsInvalid identifier(R)RRRP(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyR s cCs1|j}|r-|jtkr-d}n|S(N(RRt operatorsR(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt matchOperators  cCs:|j}|s't|ddn|j|jS(NRsExpected operator(R+RRRP(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt getOperators cCs1|j}|r-|jtkr-d}n|S(N(RRt assignmentOpsR(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytmatchAssignmentOperators  cCs:|j}|s't|ddn|j|jS(NRsExpected assignment operator(R.RRRP(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytgetAssignmentOperators cCsC|j}|jstS|j|j}|j||S(s<Returns False or the name of the directive matched. (RtmatchDirectiveStartTokentFalsetgetDirectiveStartTokentmatchDirectiveNameR(RtstartPost directiveName((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs     s 0123456789-@cCs|j}|jj}d}d}x|js|j}||krRPn||7}|dkr|j r|jtkrd}nPng|D]}|j|r|^q}|sPq*||kr*|js|j|kr*|}Pq*q*W|j ||S(NRRr( Rt_directiveNamesAndParserstkeysRtatEndR!RRt startswithR(RtdirectiveNameCharsR4tpossibleMatchesRRR$tdn((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyR3s*      (* cCs|jj|j|jS(N(RRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyR0scCs:|j}|s't|ddn|j|jS(NRsInvalid directive start token(R0RRRP(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyR2s cCs|jj|j|jS(N(RRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytmatchDirectiveEndTokenscCs:|j}|s't|ddn|j|jS(NRsInvalid directive end token(R=RRRP(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytgetDirectiveEndTokens cCss|j ro|jdkro||jd|j!}|j}|sRtS|jj|rhtStSntS(NR5i( R8RRtfindEOLRR1RRR(Rt restOfLine((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt)matchColonForSingleLineShortFormDirectives cCs|jj|j|jS(N(RRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRscCs|jj|j|jS(N(RRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytmatchPSPEndTokenscCs:|j}|s't|ddn|j|jS(NRsInvalid psp start token(RRRRP(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytgetPSPStartTokens cCs:|j}|s't|ddn|j|jS(NRsInvalid psp end token(RBRRRP(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytgetPSPEndTokens cCs|jj|j|jS(s&includes the enclosure and cache token(RRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytmatchCheetahVarStart scCs|jj|j|jS(s&includes the enclosure and cache token(RRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytmatchCheetahVarStartTokenscCs|jj|j|jS(s%no enclosures or cache tokens allowed(RRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt%matchCheetahVarInExpressionStartTokenscCs|jj|j|jS(s&includes the enclosure and cache token(RRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRscCs|jj|j|jS(s&includes the enclosure and cache token(RRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRscCs:|j}|s't|ddn|j|jS(s6just the start token, not the enclosure or cache tokenRs!Expected Cheetah $var start token(RFRRRP(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytgetCheetahVarStartToken s cCsbyB|jj|j|j}|j|j|jSWnt|ddnXdS(NRsExpected cache token(RRRRRRPRR(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt getCacheToken(s !cCsbyB|jj|j|j}|j|j|jSWnt|ddnXdS(NRs!Expected silent placeholder token(RRRRRRPRR(RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytgetSilentPlaceholderToken0s !cCsg}x|js|jdkr4|jq |jdkrJPq |jdrf|jq |jds|jdrPq |jr|j|j|j|j |j q |j r|j |j q Pq W|S(Ns s R3sin sin ( R8Rt getWhiteSpaceR9tadvanceRGRHRJRIRR'R)(Rtvarnames((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytgetTargetVarsList:s&       cCs7|s|jn|j|j|jd|S(sThis is called when parsing inside expressions. Cache tokens are only valid in placeholders so this method discards any cache tokens found. tplain(RHRJRItgetCheetahVarBody(RROtskipStartToken((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt getCheetahVarQs    cCs|jj|jd|S(NRO(t _compilert genCheetahVartgetCheetahVarNameChunks(RRO((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRP[scCsg}xu|jt|kr}d}t}|jtdkrGPnT|jdkr|jdt|kr|jdtkr|jqPn|j}|j rd|jdkrd|jdkr|j}n|j dt}t |j dd}|rB|j || |df||d}n|rd|ddkrdt }qdn|j |||fq W|S(s nameChunks = list of Cheetah $var subcomponents represented as tuples [ (namemapperPart,autoCall,restOfName), ] where: namemapperPart = the dottedName base autocall = where NameMapper should use autocalling on namemapperPart restOfName = any arglist, index, or slice If restOfName contains a call arglist (e.g. '(1234)') then autocall is False, otherwise it defaults to True. EXAMPLE ------------------------------------------------------------------------ if the raw CheetahVar is $a.b.c[1].d().x.y.z nameChunks is the list [ ('a.b.c',True,'[1]'), ('d',False,'()'), ('x.y.z',True,''), ] RR4is([Rtenclosedi(RRRRRRLR'R8tgetCallArgStringt getExpressiontmaxtrfindRR1(RtchunkstresttautoCallt dottedNametperiod((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRU_s.1   cCs |tk r.|jd}|jd|n|r7nL|jdks^t|ddn|j}|jd|fg}dg}|j}xEtr|j r|dd}t |}|j |ddt|dd|d |d n|j} | d krz|s)t|n|j} t | }|dd|krk|j |d Pqt|q| d kr||jq|jra|j}|j} |j} |j rP|jdkrP|j} | dkr;|j} |j ||jdt} |j | n|| | | q|| | q|jrz|jq|j}|j}|dkr|j|jdt}n|j||}||qW|tk r|jd|ndj|S(sf Get a method/function call argument string. This method understands *arg, and **kw RRRs Expected '('iiis#EOF was reached before a matching 's' was found for the 't's)}]Rs R(ROR/R1RVR(R/RR1(RRRRRRR!RRR8tclosurePairsRevRt closurePairsRRGRRRKRREt-_raiseErrorAboutInvalidCheetahVarSyntaxInExprtrevRXttransformTokenR(Rt enclosuresRtuseNameMapper_origR4t argStringBitstaddBittopentcloseR$tcodeFor1stTokentWSt nextTokentendPostbeforeTokenPosR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRWst                              c Cs|jdkr|jn |j}t}t}|jd}|jd|xytr|jrt |dddn|j |krPn|j}|dks|j rPq\|dkrPq\|dkr|r|j |n|jq\|d kr#t}|jq\|d krL|j t}|jq\|j|jr~| r~|jt|jq\|jr| r|j|jq\|rF|jr|j}nn|jr|jnU|j }|j}|dkr$|j|jd t}n|j||}|j |q\|dkr| r|j} |jdkr| |j7} n|jst |n| |j7} |j| q\t |q\W|jd||jS(s, Get an argument list. Can be used for method/function definition argument lists or for #directive argument lists. Returns a list of tuples in the form (argName, defVal=None) with one tuple for each arg name. These defVals are always strings, so (argName, defVal=None) is safe even with a case like (arg1, arg2=None, arg3=1234*2), which would be returned as [('arg1', None), ('arg2', 'None'), ('arg3', '1234*2'), ] This method understands *arg, and **kw RRRs%EOF was reached before a matching ')'s was found for the '('RR5s R(R3R/R1RVR(R/RR1(RRLR?RR1RRRR8RRR=RRR9RRR)RR RGRRRERcRRdRXReR!R( RtexitPosRtargListtonDefValRgR$RRptvarName((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt getDefArgListsr                         c CsB|tk r.|jd}|jd|n|dkrCg}nt|}g}xtr|jr|r|dd}t|} |j|ddt |dd| d|dqPn|j } | d kr|j | |j | |j f|j qX|r"| r"PqX| d kr |sCt |nt| }|dd|kr{|j|j | n|dd}t|} |j\} } |j|ddt |dd | d t| d t| d| d|d|j qX| dkr/|j |jqX|jrF| rFPqX| dkr|j d|krtj|j|j d} | s|j t |ddn|j| jqX| dkr|r|j qPqX|jr|j}|j |qX|jr)|jqX|j }|j}| rk|rk||krk|j|Pn|j||}|j |tj|rX|dkr|jdt ddg}|j |q|j |j|j r|j dkr|j |j!qqXqXW|tk r>|jd|n|S(s Get a Cheetah expression that includes $CheetahVars and break at directive end tokens, the end of an enclosure, or at a specified pyToken. RiiiRs#EOF was reached before a matching 's' was found for the 'R`s{([s])}sA 's' was found at line s, col s before a matching 's' was found for the 's s\sLine ending expecteds R9tpyTokensToBreakAtR+RN("RRRRRRR8RaRRRRRRLRbRt getRowColRRKR=tEOLreRRRPRGRRRERcRReR(RXR1RW(RRVRfRvRRgR"texprBitsRjRkR$RRteolMatchtexprRpR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytgetExpressionPartsDs                =  ""              c Cs+dj|jd|d|d|d|S(spReturns the output of self.getExpressionParts() as a concatenated string rather than as a list. RRVRfRvR(RR|(RRVRfRvR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRXs  c Cs|dkr|j r|jdkr|j}|j}t|}|j}|sedS|jts|jtrd}nd}|j ||dg}d}x|j||kr=|j s|j r*|r|j t |d}n|j} |j d| dq||j7}qW|j ||rg|j t |nd d j|d }n|S( sTakes a token from the expression being parsed and performs and special transformations required by Cheetah. At the moment only Cheetah's c'$placeholder strings' are transformed. R$s'"NiiRsstr(Rs ''.join([R3s])(R8RRtuppertevalRR9tsingle3tdouble3RRERRtreprtgetPlaceholderR!R( RRRpRnttheStrRot startPosIdxt outputExprststrConsttplaceholderExpr((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRes4+        cCsv|j}|j}|jdr<t|ddn6|jdr`t|ddnt|dddS(NRRsXCache tokens are not valid inside expressions. Use them in top-level $placeholders only.t enclosuresxLong-form placeholders - ${}, $(), $[], etc. are not valid inside expressions. Use them in top-level $placeholders only.s3This form of $placeholder syntax is not valid here.(REt groupdicttgetR(RRR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRcs    cCsx$|jdD]}|d|qW|j}|j|}|j}|j}|rit} nt} |r|j} |jj | j } ni} |j dkr|j} |j } | | fg}|j ng}d}|jr|j}|jj|d|}d}|r|j }||7}|jdr|j dkr|jd|dd !}q|j t| kr|j q|jd td|}|d t| kr|d }n||7}n|||j!}nL|jd td|}|d t| kr<|d }n|||j!}|j|d d |d |}x$|jdD]}|d|q}W|r|||| || fS|SdS(NtpreparsePlaceholderHookstparsers({[ROtallowPlaceholderFilterArgsR3RfiiRVt placeholdertrawExprR4tpostparsePlaceholderHooks(RRRwRHRJRR1RIRRRRR!RKRR)RURSRTRWRaRXt_applyExpressionFilters(RtallowCacheTokensROtreturnEverythingtcallbackR4tlineColRRtisSilentPlaceholderRtcacheTokenPartsRtenclosureOpenCharRft filterArgsRR{t restOfExprRmtrawPlaceholder((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs`            !      N(GRRRRRRRRRRRRRRRRRR R R RRRRRRRRRRRR&R'R)R R+R,R.R/RRR3R0R2R=R>RARRBRCRDRERFRGRRRHRIRJRNR1RRRPRURWRuR|RXReRcR(((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyR_s        E                $                          < QX g $ t_HighLevelParsercBs>eZdZd<d<d<dZdZdZdZdZd<d<dZ dZ d<e dZ d Z d Zd Zd Zd ZdjZdjZidd6dd6ZdZdZdZe dZedZdZdZdZdZdZ dZ!dZ"dZ#d Z$d!Z%d"Z&d#Z'ed$Z(d%Z)d&Z*d'Z+d(Z,d)Z-d*Z.d+Z/d,Z0d-Z1d.Z2d/Z3d0Z4d1Z5d2Z6d3Z7d4Z8d5Z9d6Z:d7Z;d8Z<d9Z=d:Z>d;Z?RS(=sThis class is a StateMachine for parsing Cheetah source and sending state dependent code generation commands to Cheetah.Compiler.Compiler. cCsPtt|j|d|d||j|||_|j|jdS(NRt breakPoint(RWRRRRSt setupStateR(RRRRR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyR;s "   cCsi|_i|_g|_dS(N(t_macrost _macroDetailst_openDirectivesStack(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRBs  cCsQ|jjx0|jjD]\}}|jj|`qW|jjdS(s8Cleanup to remove any possible reference cycles N(RtclearRtitemsttemplatetshutdown(Rt macronamet macroDetails((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytcleanupGs    cCs!tt|j|jdS(N(RWRRt_initDirectives(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRPsc sfd}|}tj}jdi}|j|tj}jdi}|j|i_xE|jD]7\}|tdfkrqn||j|jdD]-}|d|d|d|d|d|}qW|S(s=Pipes cheetah expressions through a set of optional filter hooks. The filters are functions which may modify the expressions or raise a ForbiddenExpression exception if the expression is not allowed. They are defined in the compiler setting 'expressionFilterHooks'. Some intended use cases: - to implement 'restricted execution' safeguards in cases where you can't trust the author of the template. - to enforce style guidelines filter call signature: (parser, expr, exprType, rawExpr=None, startPos=None) - parser is the Cheetah parser - expr is the expression to filter. In some cases the parser will have already modified it from the original source code form. For example, placeholders will have been translated into namemapper calls. If you need to work with the original source, see rawExpr. - exprType is the name of the directive, 'psp', or 'placeholder'. All lowercase. @@TR: These will eventually be replaced with a set of constants. - rawExpr is the original source string that Cheetah parsed. This might be None in some cases. - startPos is the character position in the source string/file where the parser started parsing the current expression. @@TR: I realize this use of the term 'expression' is a bit wonky as many of the 'expressions' are actually statements, but I haven't thought of a better name yet. Suggestions? texpressionFilterHooksRR{texprTypeRR4(R(RR{RRR4R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs cCs|j}||jdksE|jdr||jdkrx*|jdD]}|d|d|qUWt|dd|ndS(NtdisabledDirectivestenabledDirectivestdisabledDirectiveHooksRR5RsThis %r directive is disabled(tlowerRR(RR5R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt_filterDisabledDirectivess cCs!|r(|j}|j|t}nx|js|jrP|jq+|jri|jq+|jr|j q+|j r|j q+|j r|j q+|j r|jq+|jr|jq+|jq+W|r|jn|r|j|ndS(N(Rt setBreakPointR1R8Rt eatCommentRteatMultiLineCommentRteatPlaceholderRRt eatDirectiveRteatPSPRteatEOLSlurpTokent eatPlainTexttassertEmptyOpenDirectivesStack(RRtassertEmptyStacktorigBP((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pytparses0                  cCs|j}d}x0|jsD|j}|r7Pq|jqW|j|jd|}|j|}|j|}|jj ||S(NRO( RRR8RRLRR R RSt addStrConst(RR4RR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs  cCsR|j}|r"|jjn|j|jd|}|jj|dS(Ntgobble(R RSthandleWSBeforeDirectiveRt readToEOLt addComment(RR tcomm((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs   cCs|j}|j}|j|j}}d}xtr|j}|jr]Pn|jr|j|d7}n#|jr|j|d8}n|sPn|j q;W|j |d|}|js|jn|j rt|j drt||j|j!}|j s=|j d|n|rt|jsa|j|krt|jjqtn|jj|dS(NiROt'gobbleWhitespaceAroundMultiLineCommentsR(R R?RRRR8RRRRLRRRRRSRR(RR tendOfFirstLineRoR4tlevelRR@((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs8               $c Cs\|jdtdt\}}}}}}|jj|d|d|d|d|d|dS(NRRRRRRt silentMode(RRRStaddPlaceholder(RR{RRRRR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs ! cCs|jdd|j|jd}|j}xC|jsz|j|dkrm|jrmPqmn|jq8W|j|jd|j }|j |dd|}|j j ||j dS(NR5tpspRiROR4(RRCRRR8RRBRLRRRRStaddPSPRD(RRR4t pspString((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyR(s   !s9 else elif for while repeat unless try except finallysc pass continue stop return yield break del assert raise silent echo import fromtaddImportStatementRJR=cCs|j}|j|x*|jdD]}|d|d|q)W|jj|}|rh|n||jkr|jj|}|sd|j}nt|j |}|j |d|n||j krS|jj|}|sd|j}nt|j |}|d kr+t }nt }|j|d|}||nx*|jd D]}|d|d|qcWdS( NtpreparseDirectiveHooksRR5taddRRcRbtincludeDirectiveNameInExprtpostparseDirectiveHooks(RcRb(RRRR6Rt_simpleIndentingDirectivest_directiveHandlerNamest capitalizeRRSteatSimpleIndentingDirectivet_simpleExprDirectivesR1RteatSimpleExprDirective(RR5RtdirectiveParsert handlerNameRRR{((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRBs6       cCst}|jrd|j}|j|jsT|j|t}|jqd|j|n| r|jr|j n8|r|j r|j dkr|j dtn|r|j s|j|kr|j jndS(Ns R(R1RRRLRRRRR=R>R8RRRSR(RR tendOfFirstLinePost foundCommentR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt_eatRestOfDirectiveTages       %$c Cs|j}}}|jdd}t}x|js|j|kr|jdkr|j}|j|jtd|j |j |r|j |rt }|j |}n|jt||j |j}Pqqn|j|j}}q0W|j|d|}|j||j}|jra|jn8|r|j r|jdkr|jdt n|r|j|kr|jjn|S(NRiRPROs R(RRR1R8RRR2RLRRKR9R RtfindBOLRRR?R=R>RRSR( RR5tfinalPost endRawPosR4t directiveCharR t textEatenR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt_eatToThisEndDirectivezs<           %cCs|j}|j}|j|s>|jt|n|j}|jj}|jd}|j ||d|}||j kr|j |n|j |||S(NiR4( R R?R2RLRRRXRtsplitRRtpushToOpenDirectivesStackR(RR5RR RR4R{((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs    c Cs|j}|j}|j}|j|djkrV|jt|n|j}|j|j ddg}|j ||d|}|j r3|j|djkr||dt d|n||d||jdd |j d |jd t|jj|jjnh|jdkrR|jn|j|j||||jkr|j|n||d|dS( Ns&else elif for while try except finallyRvR5R4selse elif except finallytdedentRRYiRR(R R?RwR2RRLRRRKRXRRAR1RRRStcommitStrConstRRRRR( RR5RRR RRR4R{((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs4           cCs0|j}|j|jd|j|j}t}x9|jjD](}|j|||krO|}PqOqOW|st |ddn|j }|j |j ||||j kr|j|n|jj|r|j|}|n(|djkr|dkr2|jjq,|dkrN|jjq,|dkrj|jjq,|dkr|jjq,|d kr|jjq,|d kr,|jjq,nk|d jkr|jj|jjn<|d kr,|jj|jj|jd |jndS(NiRsInvalid end directives,block capture cache call filter errorCatcherRpRkR_RgRaRswhile for if try repeat unlessRvt useSearchList(R R2RLRKRR1RR7tfindRR?RXRRtpopFromOpenDirectivesStackRRRSt closeBlocktendCaptureRegiontendCacheRegiont endCallRegiontcloseFilterBlocktturnErrorCatcherOffRRRt_useSearchList_orig(RR RR5RRR((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRsP                   cCs|j|jdS(sTells the parser to stop parsing at this point and completely ignore everything else. This is a debugging tool. N(RR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRscCsq|j|jtd|j|j}|j}|j|dd|}|jj|j dS(NRtshbangR4( R2RLRRKRRRRSt setShBangR(RR4R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyR s    cCsq|j|jtd|j|j}|j}|j|dd|}|jj|j dS(NRR4( R2RLRRKRRRRStsetModuleEncodingR(RR4R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs    cCs|j}|j}|j}|j|jtd|j|j}|j}|jdkr|j |j |||j |j dS|j|j dkr|jn t||j }|j}|jd||fdd||j ||y|jj||Wnetjjdtjjdtjjd|||!tjjdtjjd nXdS( NRtresetR(s%s=%rR4sFAn error occurred while processing the following #compiler directive. sG---------------------------------------------------------------------- s%s s,Please check the syntax of these settings. (R R?RR2RLRRKR RRXRRRRRRRStsetCompilerSettingtsyststderrtwrite(RR RR4t settingNamet valueExprRo((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs@                cCs=|j}|j}|j|jtd|j}|j|j||d|kr|jj |j dS|j }|j d}|j |dd|}y|jjd|d|Wndtjjdtjjdtjjd |jtjjdtjjd nXdS( Nscompiler-settingsRtcompilerSettingsR4tkeywordst settingsStrsDAn error occurred while processing the following compiler settings. sG---------------------------------------------------------------------- s%s s,Please check the syntax of these settings. (R R?R2RLRRNRXRRSRRRRRtsetCompilerSettingsR R R R(RR RRR4R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRLs0          cCs|j}|j}|j}|j|jtd|j|j}|jrp|jn|j }|j|j |j }|j |dd|}|j j|||j||dS(NRmR4(R R?RR2RLRRKRERHR R/RXRRSt addAttributeR(RR RR4t attribNameR{((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRlms             cCs|j}|j}|j}|j|j}|j}|j|dd|}|jj||j|||j |j }| s|d krt |ddn|j dS( Nt decoratorR4RLRpRvRrRs5Expected #def, #block, #closure or another @decorator(sdefsblocksclosureRr( R R?RR2RXRRSt addDecoratorRRKRRR(RR RR4t decoratorExprR5((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRqs        cCs|jddS(NRL(t_eatDefOrBlock(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRnscCsL|j}|jd\}}i|d6|j|d6|jj|                     cCs=|jr|jjn|jj|jdtdS(NR(R RSRRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRX|s  cCs=|jr|jjn|jj|jdtdS(NR(R RSRRRR(R((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRs  cCs|j}|j}|j|jtd|j|jrz|j|jdd|jdt}nH|j dkr|jn|j|j |||j d}|j j |dS(NR[RYiRR5(R R?R2RLRRKRARR1RRRRSt addRawText(RR RtrawBlock((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRZs        cCs4|j}|j}|j|jtd|jd}t}|jdrp|jdt}n|j|jdr|jtdd}|j|j dkst |n|jn|j }|j }|j |dd|}|j|||jj|||dS( NR]tfileR[itsourceRR(R4(R R?R2RLRRKR1R9RRRRRXRRRSt addInclude(RR Rt includeFromtisRawR4t sourceExpr((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyR\s.           c CsJ|j}|j}|j|jtd|j|jrX|jn|j}|j|j dkr|j dt }|j|r|dddkr|d=qng}|j dd'|jd(|jd)|jd*|jd+|jd,|jd-|jd.|jr|j|jdd|jdt }|jdtnH|j dkr|jn|j|j|||jd}djddjg|D](\}}|rd||fp|^qd|dg}ddlm} |jdd| } |jddi} |jddg} t| } | ji|jd 6|d6|jd 6| j| dd d!d"| jd#|d | } d$d/d%Y}|}||_||_| d&| |_||j |<|jj!|j|<|j"|j#||jd=n#t|dd||jdfdS(NRs#end found, but nothing to endis#end %s found, expected #end %s(RR(RR5((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyRR s    cCs8|jr4ddj|j}t|d|ndS(NsASome #directives are missing their corresponding #end ___ tag: %ss, R(RRR(RterrorMsg((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyR\ s N(@RRRRRRRRRRRRRRRRRRRRRRRRRRR1RRRRRRRRlRqRnRoRuRR#R!RRRTRVRwRXRRZR\RsRR^RfRhR`RdR~RjRyRRRR(((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyR6sv   =%    #       #  %  " 1  - !     A      %     P X  $     /  (XRtosR R RRRcttimettokenizeRRft tracebacktCheetah.SourceReaderRtCheetahRRtCheetah.UnspecifiedRtCheetah.Macros.I18nRRR R RRRRRRtNO_CACHEt STATIC_CACHEt REFRESH_CACHER4R5R6RRtpowerOpt unaryArithOpstbinaryArithOpstshiftOpst bitwiseOpstassignOpt augAssignOpsR-tcompOpst booleanOpsR*t delimetersRRRRttripleQuotedStringPairsRbRaRRQRRORPRmRtEOLZRtnameCharLookAheadR(Rxt specialVarREtunicodeDirectiveREtencodingDirectiveREtescapedNewlineRERRRt ValueErrorRRRRtobjectRRRRRtParser(((s=/opt/freeware/lib64/python2.7/site-packages/Cheetah/Parser.pyt sP                !%        >4