;ò x!bCc@sDdZdZdddgZdkTdklZdklZlZlZdk l Z l Z l Z d k lZd kl Z lZd klZlZd klZd kZd kZdklZdklZdZdfd„ƒYZd„Zdfd„ƒYZdefd„ƒYZdfd„ƒYZ dfd„ƒYZ!dfd„ƒYZ"de fd„ƒYZ#d e fd!„ƒYZ$d"e fd#„ƒYZ%dd$d%„Z&eed&Z'eed'Z(d(„Z)defd)„ƒYZ*d*e*fd+„ƒYZ+d,fd-„ƒYZ,e-d.d/„Z.dfd0„ƒYZ/de/fd1„ƒYZ0d2e/fd3„ƒYZ1e2d4joßd5Z3d6d7GHd8fd9„ƒYZ4d:fd;„ƒYZ5d kZd<fd=„ƒYZ6d>e6e5fd?„ƒYZ7yOd kZe3Z8d@Z9e5ƒi:e8dAƒe4ƒi:e8d@ƒe7ƒi:e8ƒWq@e;j oZ<e<GHdBGHq@Xnd S(Cst # # pso.parser.py - Python Service Objects Parser # # Author: Thanos Vassilakis thanos@0x01.com # # Copyright (c) thanos vassilakis 2000,2001, 2002 # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public License # as published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # or FITNESS FOR A PARTICULAR PURPOSE. # See the GNU Lesser General Public License for more details. # # See terms of license at gnu.org. # # $Id: parser.py,v 1.18 2004/07/12 04:04:43 thanos Exp $ # SYNOPSIS Senario One First you make a template - this is just a normal HTML file with a few extra tags: For example, test.tmpl: My Email: thanos@0x01.com

My Name: Now create the mypanel package, mypanel.py from pso.parser import Tag class Email(Tag): "renders email as a uri" def render(self, cdata): return '%s' % ( cdata, cdata) class Name(Tag): "renders name as a uri" def render(self, cdata=''): return '%(name)s' % self.getAttrs() Save it in the python path. Now write the script: from pso.parser import Parser psoParser = Parser() psoTree = psoParser.parseFile("test.tmpl") print psoTree.render() Running this script should generate: My Email: thanos@0x01.com

My Name: Thanos Vassilakis Senario Two Now you might want to just extract the tags and document them... class TagDocumentor: def document(self, object, cdata=''): if object: self.documentation += ' %s

%s

' % (object.__class__, object.__class__.__doc__) def do(self, infile): self.documentation ='' psoParser = Parser() psoTree = psoParser.parseFile(infile, noCache=1) psoTree.render(self.document) print "
%s
" TagDocumentor().do(test.tmpl) And you will get:
mypanel.Email
renders email as a uri
mypanel.Name
renders name as a uri
Senario Three You want to write a robot (this is simplistic - beware): class a(Tag): def getUrl(self, cdata): return self.getAttrs()['href'], cdata class A(a): pass class Robot: def process(self, object, cdata=''): if object: url, linkText = object.getUrl(cdata) if url not in self.links: self.links[url] = linkText self.do(url) def do(self, url): psoParser = Parser() psoTree = psoParser.parseFile(self.getPage(url), allTags=1) psoTree.render(self.process) def run(self, startUrl): self.links = {} self.do(startUrl) for url, linkText in self.link.items(): print '%s' % (url, linkText) s$Revision: 1.18 $sTagsParsers CachedParser(s*(stime(sletterssdigitss whitespace(ssplitsjoinsexists(sST_MTIME(sstatsforget(sdumpsload(scopyN(slog(sCIMapisPSOPartscBs/tZeddddded„Zd„ZRS(NsicCs5|i|||||||ƒg|_ ||_dS(N( sselfssetupsparentsnames classNamesstartsendstexts attributeschildren(sselfsparentsnames classNamesstartsendstexts attribute((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys__init__ s cCsC||_||_||_||_||_||_||_dS(N(sparentsselfsnames classNamestextsstartsends attribute(sselfsparentsnames classNamesstartsendstexts attribute((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pyssetup¥s      (s__name__s __module__sNones__init__ssetup(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysPSOPartsŸscCs[t|tƒo&|ii|||||||ƒn"t |||||||ƒ|_dS(N( s isinstancesobjectsPSOspsoPartsssetupsparentsnames classNamesstartsendstexts attributesPSOParts(sobjectsparentsnames classNamesstartsendstexts attribute((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pyspsoSetup®s&sPSOcBsVtZd„Zd„Zd„Zd„Zd„Zd„Zed„Z ed„Z RS( NcKs)t|ƒ|_|iƒtƒ|_dS(sO @param kw: the kew word argumenst match the tags set attributes N(sCIMapskwsselfsattrssinitsPSOPartsspsoParts(sselfskw((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys__init__¹s cCsdS(s1 Overide to setup the tags values. N((sself((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysinitÂscCs |iSdS(N(sselfsattrs(sself((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysgetAttrsÇscCst|||||ƒ|_dS(s Sets up a tag with its: @param name: the tags name. has name="A" @param start: character start position of tag in template. @param end: character end position of tag in template. @param text: the actuals tags text n the template before rendering. N(sPSOPartssparentsnamesstartsendstextsselfspsoParts(sselfsparentsnamesstartsendstext((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pyssetupÊscCs|iiSdS(sD @return a list of the tags nested within this one.A N(sselfspsoPartsschildren(sself((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys getChildrenÔscCsb|ii}|o't|dƒtjot|ƒtjo|dc|7 s s%s (sselfs preProcesssrenderersim_selfsresultspsoPartsschildrenschildstypes StringTypesNonesretvalsstrstraverssparents Exceptionsesnamesjoins tracebacksformat_exceptionssyssexc_info(sselfsrenderersesretvalschildsresult((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pystraversés"  51( s__name__s __module__s__init__sinitsgetAttrsssetups getChildrensappendsNones preProcessstravers(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysPSO¸s     sPSOTreecBs tZdd„Zed„ZRS(NscCs$| o|Sn|i||ƒSdS(N(sobjectscdatasrendersself(sselfsobjectscdata((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysrendererscCs&| o |i}n|i|ƒSdS(N(srenderersselfstravers(sselfsrenderer((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysrenders (s__name__s __module__srenderersNonesrender(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysPSOTrees sTokencBstZRS(N(s__name__s __module__(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysTokenssCDatacBstZRS(N(s__name__s __module__(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysCDatassCommentcBstZRS(N(s__name__s __module__(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysCommentssStartTagcBstZRS(N(s__name__s __module__(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysStartTagss SingleTagcBstZRS(N(s__name__s __module__(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys SingleTagssEndTagcBstZdZRS(Ni(s__name__s __module__sposstart(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysEndTagsscCsp|o|Sn||}|idƒ}|djo|| }n&d|jo|d }n |d }|SdS(Ns iÿÿÿÿs/iþÿÿÿ(soldnamestextsstartsfindsindsname(stextsstartsoldnamesindsname((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysgetNames    s_s_.-cCsG|idƒ}|djot|ƒ|djo||d!}nhSh}| o|Snd}xØ|o»|d}|d}|djoCd}}|t joqgn|t jod}||7}q%qg|djoY|t jod}||7}q%|t jo d }q%|d jod }d}q%qg|d jo`|t joqgq%|d jod }d}q%|t jod|||iio t||iiƒ||ƒSn|||ƒSdS(N(sselfspsoPartss attributesgetattrsrendererscdata(sselfsrendererscdata((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysrenderƒs  cCs|SdS(s? Override to render tag. Here is where everything happens! N(scdata(sselfsrendererscdata((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys__call__ˆs(s__name__s __module__s processAttrss buildAttrLists buildAttrssrenders__call__(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysTages    sPSOTagcBstZRS(N(s__name__s __module__(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysPSOTagŽss TokenizercBsStZdZdZdZdZdd„Zd„Zhhd„Zhhd„Z RS( NiiiicCs2||_||_t|iƒ|_|iƒdS(N(stextsselfsallTagsslens textLengthsreset(sselfstextsallTags((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys__init__˜s  cCs|i|_d|_dS(Ni(sselfs TagToFindsstatesindex(sself((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysresetŸs cCsÞ|i} d}xµ|i|ijo¡y@|i|ijoŽ|iid|iƒ|_|i|id}|djo"d} |i|i| d}nd} |djp |djoŸ|i|i| d}|djp |d joi|i|i| d }|d jp |d jo3|i |_t d | |i|i| |i!fSqTqXn|io |d jo3|i|_t d | |i|i| |i!fSn|iid|idƒd|_nœ|i|i |ifjo|i}|iid|ƒd|_|i||i!}|ddjotdf\}} n:|ddjotdf\}} ntdf\}} |i|i jo0|tj ot|ƒ}qhdd<}nXt|| ƒ} | idƒdjo#|o|d| } qd}nhd| <}| o|i|dƒ o||||i|fSn|i|_d}nWqtj oN| } |i|_t |iƒ|_t d | |i|i| |i!fSqXqWt!d ddd fSdS(Nisiþÿÿÿspsos:("sselfsindexs blockstarts rejectTags textLengthsstates TagToFindstextsch1sdifsch2sch3s PsoTagFoundsCDatasallTagssTagFoundstagstarts SingleTagstagsstartpossEndTagsStartTagsgetAttrssattrssgetNamesnamesfinds defaultModulesrejectshas_keys ValueErrorsstartslensNone(sselfs defaultModulesrejectsacceptstextstagsattrsstagstarts rejectTagsstartsstartposs blockstartsnamesdifsch1sch2sch3((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys getToken2¤sh   / ''     -c Cs®|i} x‹|i|ijowy|i|ijo�|iid|iƒ|_|i|iddjo3|i|_td| |i|i| |i!fSn|iid|idƒd|_np|i|ijo\|i}|iid|ƒd|_|i|_|i||i!}|ddjot df\}} n:|ddjot df\}} ntdf\}} t|| ƒ} h}| d jp | d jo/hd d <d | <}|it|ƒƒn,hd | <d | <}|it|ƒƒ|i| ƒ o||||i|fSq4nWq tj oN| }|i|_t|iƒ|_td||i|i||i!fSq Xq Wtdd d dfSdS( Nsiþÿÿÿs/ispsos/psostagnamei(sselfsindexs blockstarts textLengthsstates TagToFindstextsTagFoundsCDatastagstarts SingleTagstagsstartpossEndTagsStartTagsgetNamesnamesattrssupdatesgetAttrssrejectshas_keys ValueErrorsstartslensNone( sselfs defaultModulesrejectsacceptstextstagstartsstartstagsattrss blockstartsstartpossname((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysgetTokenásF  ''  " -( s__name__s __module__s TagToFinds PsoTagFoundsTagFoundsTagStarts__init__sresets getToken2sgetToken(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys Tokenizer�s  =ic CsÝy°| o^t|ƒ}|ot|ƒntidƒ}x!|dD]}t ||ƒ}qFW|}nCt|t ƒt ƒ|gƒ}|ot|ƒnt ||ƒ}|SWn&t odk}|iƒqÙnXdS(Ns.i(sobjects __import__smodulesmodsdoReloadsreloadsnamessplitscompsscsgetattrsobjsglobalsslocalssmssilents tracebacks print_exc( smodulesobjectsdoReloadscs tracebacksobjscompssmsmod((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys PSOimport s&    cBshtZdZhZdd„Zd„Zddddd„Zddd„Zd„Zd „Z d „Z RS( s2 pso.Parser(defaultModule) - Creates a new parser. The default module is the actual parser module unless its given. When a parser is created with pso.Parser("mytags") tags such as or will be treated as if they were writen or . scCs+tƒ|_h|_h|_||_dS(N(sPSOTreesselfs tokenTrees sTagsAccepteds sTagsRejecteds defaultModule(sselfs defaultModule((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys__init__&s   cCs"h|_h|_h|i_dS(N(sselfs sTagsAccepteds sTagsRejecteds __class__ssShared(sself((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysclear,s  iicCs®|o)t|ƒ}|i|iƒ||ƒntt |ƒt } |o%t |ƒ\} }t||ƒ} n8|idƒ} | djo|| d} n |d} yit | ƒt }|| jo d‚ntt| ƒƒ\} }|_|ii| ƒ|ii|ƒWn‰t odk}|iƒnt|ƒ}|i|iƒ||ƒ| o,t|i|i|ift| dƒƒnt | ƒnXt |ƒ|iSdS(Ns.iÿÿÿÿs.psosdo parseswb(!snoCachesopensfilePathsfsselfsparsesreadsreloadsallTagssstatsST_MTIMEsttimesoPathssplitspathsfilesjoins ofilePathsrindexsidxsotimesloads tagsAccepteds tagsRejecteds tokenTrees sTagsAcceptedsupdates sTagsRejectedssilents tracebacks print_excsdumpsforget(sselfsfilePathsoPathsnoCachesreloadsallTagssfiles tagsRejectedsotimesttimes ofilePaths tagsAcceptedspathsidxsfs traceback((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys parseFile3s:       , cCs/||_t||ƒ|_|i|iƒSdS(N(sreloadsselfs TokenizerstextsallTagss tokenizers processNodes tokenTree(sselfstextsreloadsallTags((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysparseYs c Cst|\}} }}}| d}t} |i i |ƒo|Snt} |i i |ƒo|i |\} } n|i|ƒ\} } | oÍt| ƒ} | tjovt| ƒdjo| it|ƒƒn| | f}| | �} t| || d||||| ƒ||i |%s
%s

(sobjectsselfs documentations __class__s__doc__(sselfsobjectscdata((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysrenderÐscCsXd|_tƒ}|i|ddƒ}|i|iƒt|dƒi d|iƒdS(NssnoCacheisws
%s
( sselfs documentationsParsers psoParsers parseFilesinfilespsoTreesrendersopensoutfileswrite(sselfsinfilesoutfilespsoTrees psoParser((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysdoÔs   (s__name__s __module__srendersdo(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys TagDocumentorÏs s TagIndexercBs#tZdZdd„Zd„ZRS(NiscCsO|o@|id7_|i}|od|||fSnd|Sn|SdS(Nis :<%s>%s:s:<%s />:(sobjectsselfsindexscdata(sselfsobjectscdatasindex((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysrenderÝs  cCsGd|_tƒ}|i|ƒ}t|dƒi |i |i ƒƒdS(Nisw( sselfsindexsParsers psoParsers parseFilesinfilespsoTreesopensoutfileswritesrender(sselfsinfilesoutfilespsoTrees psoParser((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysdoçs  (s__name__s __module__sindexsrendersdo(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys TagIndexerÛs sTagTimercBstZdd„Zd„ZRS(NscCs^|oCtiƒ}|i||ƒ}tiƒ||i|ii <|Sn|i||ƒSdS(N( sobjectstimestsselfsrenderscdatasrstagTimess __class__s__name__(sselfsobjectscdatasrst((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pystimerðs  cCs_h|_tƒ}|i|ƒ}|i|iƒGHx&|ii ƒD]\}}|G|GHqBWdS(N( sselfstagTimessParsers psoParsers parseFilesinfilespsoTreesrenderstimersitemssksv(sselfsinfileskspsoTreesvs psoParser((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysdoøs   (s__name__s __module__stimersdo(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pysTagTimerïs s IndexerTimercBstZRS(N(s__name__s __module__(((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys IndexerTimerssr3sr2s; usage parser.py template_file output_file (=s__doc__s __version__s__all__stypesstimesstringsletterssdigitss whitespacesos.pathssplitsjoinsexistssstatsST_MTIMEs statcachesforgetscPicklesdumpsloadscopys tracebackssyssutilslogstablesCIMapssilentsPSOPartsspsoSetupsPSOsPSOTreesTokensCDatasCommentsStartTags SingleTagsEndTagsgetNames firstKeyCharskeyCharssgetAttrssTagsPSOTags TokenizersNones PSOimportsParsers CachedParsers PSOParsers__name__sfile1s TagDocumentors TagIndexersTagTimers IndexerTimersinfilesoutfilesdos Exceptionse(1sloadsST_MTIMEsParsersletterssforgetsdumpsEndTagsTagTimerspsoSetups TagIndexersCDatasgetAttrssexistssStartTags whitespaces__all__sgetNames PSOimports CachedParserssilentssplitsPSOPartss __version__skeyCharssinfilesCommentsstats firstKeyChars SingleTagsPSOTrees TagDocumentorssyssoutfilesTokensPSOTagscopys PSOParserslogsdigitssjoinsPSOs TokenizersCIMaps tracebacks IndexerTimersTagstimesfile1se((s9/home/groups/p/ps/pso/htdocs/tutorial/Login/pso/parser.pys?…sl        H ;)y¡