; ybCc@sDdZdZdddgZdkTdklZdklZlZlZdk l Z l Z l Z d k lZd kl Z lZd klZlZd klZd kZd kZdklZdklZdZdfdYZdZdfdYZdefdYZdfdYZ dfdYZ!dfdYZ"de fdYZ#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.dfd0YZ/de/fd1YZ0d2e/fd3YZ1e2d4jod5Z3d6d7GHd8fd9YZ4d:fd;YZ5d kZd<fd=YZ6d>e6e5fd?YZ7yOd kZe3Z8d@Z9e5i:e8dAe4i:e8d@e7i:e8Wq@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/tZedddddedZdZRS(NsicCs5|i|||||||g|_ ||_dS(N( sselfssetupsparentsnames classNamesstartsendstexts attributeschildren(sselfsparentsnames classNamesstartsendstexts attribute((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pys__init__s cCsC||_||_||_||_||_||_||_dS(N(sparentsselfsnames classNamestextsstartsends attribute(sselfsparentsnames classNamesstartsendstexts attribute((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pyssetups      (s__name__s __module__sNones__init__ssetup(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysPSOPartsscCs[t|to&|ii|||||||n"t ||||||||_dS(N( s isinstancesobjectsPSOspsoPartsssetupsparentsnames classNamesstartsendstexts attributesPSOParts(sobjectsparentsnames classNamesstartsendstexts attribute((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pyspsoSetups&sPSOcBsVtZdZdZdZdZdZdZedZ edZ RS( NcKs)t||_|it|_dS(sO @param kw: the kew word argumenst match the tags set attributes N(sCIMapskwsselfsattrssinitsPSOPartsspsoParts(sselfskw((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pys__init__s cCsdS(s1 Overide to setup the tags values. N((sself((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysinitscCs |iSdS(N(sselfsattrs(sself((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysgetAttrsscCst||||||_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((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pyssetupscCs|iiSdS(sD @return a list of the tags nested within this one.A N(sselfspsoPartsschildren(sself((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pys getChildrenscCsb|ii}|o't|dtjot|tjo|dc|7 s s%s (sselfs preProcesssrenderersim_selfsresultspsoPartsschildrenschildstypes StringTypesNonesretvalsstrstraverssparents Exceptionsesnamesjoins tracebacksformat_exceptionssyssexc_info(sselfsrenderersesretvalschildsresult((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pystraverss"  51( s__name__s __module__s__init__sinitsgetAttrsssetups getChildrensappendsNones preProcessstravers(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysPSOs     sPSOTreecBs tZddZedZRS(NscCs$| o|Sn|i||SdS(N(sobjectscdatasrendersself(sselfsobjectscdata((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysrendererscCs&| o |i}n|i|SdS(N(srenderersselfstravers(sselfsrenderer((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysrenders (s__name__s __module__srenderersNonesrender(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysPSOTrees sTokencBstZRS(N(s__name__s __module__(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysTokenssCDatacBstZRS(N(s__name__s __module__(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysCDatassCommentcBstZRS(N(s__name__s __module__(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysCommentssStartTagcBstZRS(N(s__name__s __module__(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysStartTagss SingleTagcBstZRS(N(s__name__s __module__(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pys SingleTagssEndTagcBstZdZRS(Ni(s__name__s __module__sposstart(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysEndTagsscCsp|o|Sn||}|id}|djo|| }n&d|jo|d }n |d }|SdS(Ns is/i(soldnamestextsstartsfindsindsname(stextsstartsoldnamesindsname((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/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((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysrenders  cCs|SdS(s? Override to render tag. Here is where everything happens! N(scdata(sselfsrendererscdata((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pys__call__s(s__name__s __module__s processAttrss buildAttrLists buildAttrssrenders__call__(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysTages    sPSOTagcBstZRS(N(s__name__s __module__(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysPSOTagss TokenizercBsStZdZdZdZdZddZdZhhdZhhdZ RS( NiiiicCs2||_||_t|i|_|idS(N(stextsselfsallTagsslens textLengthsreset(sselfstextsallTags((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pys__init__s  cCs|i|_d|_dS(Ni(sselfs TagToFindsstatesindex(sself((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysresets cCs|i} d}x|i|ijoy@|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|idd|_n|i|i |ifjo|i}|iid|d|_|i||i!}|ddjotdf\}} n:|ddjotdf\}} ntdf\}} |i|i jo0|tj ot|}qhdd<}nXt|| } | iddjo#|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(Nisispsos:("sselfsindexs blockstarts rejectTags textLengthsstates TagToFindstextsch1sdifsch2sch3s PsoTagFoundsCDatasallTagssTagFoundstagstarts SingleTagstagsstartpossEndTagsStartTagsgetAttrssattrssgetNamesnamesfinds defaultModulesrejectshas_keys ValueErrorsstartslensNone(sselfs defaultModulesrejectsacceptstextstagsattrsstagstarts rejectTagsstartsstartposs blockstartsnamesdifsch1sch2sch3((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pys getToken2sh   / ''     -c Cs|i} x|i|ijowy|i|ijo|iid|i|_|i|iddjo3|i|_td| |i|i| |i!fSn|iid|idd|_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( Nsis/ispsos/psostagnamei(sselfsindexs blockstarts textLengthsstates TagToFindstextsTagFoundsCDatastagstarts SingleTagstagsstartpossEndTagsStartTagsgetNamesnamesattrssupdatesgetAttrssrejectshas_keys ValueErrorsstartslensNone( sselfs defaultModulesrejectsacceptstextstagstartsstartstagsattrss blockstartsstartpossname((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysgetTokensF  ''  " -( s__name__s __module__s TagToFinds PsoTagFoundsTagFoundsTagStarts__init__sresets getToken2sgetToken(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pys Tokenizers  =ic Csy| o^t|}|ot|ntid}x!|dD]}t ||}qFW|}nCt|t t |g}|ot|nt ||}|SWn&t odk}|iqnXdS(Ns.i(sobjects __import__smodulesmodsdoReloadsreloadsnamessplitscompsscsgetattrsobjsglobalsslocalssmssilents tracebacks print_exc( smodulesobjectsdoReloadscs tracebacksobjscompssmsmod((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pys PSOimport s&    cBshtZdZhZddZdZdddddZdddZdZd 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((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pys__init__&s   cCs"h|_h|_h|i_dS(N(sselfs sTagsAccepteds sTagsRejecteds __class__ssShared(sself((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysclear,s  iicCs|o)t|}|i|i||ntt |t } |o%t |\} }t||} n8|id} | djo|| d} n |d} yit | t }|| jo dntt| \} }|_|ii| |ii|Wnt odk}|int|}|i|i||| o,t|i|i|ift| dnt | nXt ||iSdS(Ns.is.psosdo parseswb(!snoCachesopensfilePathsfsselfsparsesreadsreloadsallTagssstatsST_MTIMEsttimesoPathssplitspathsfilesjoins ofilePathsrindexsidxsotimesloads tagsAccepteds tagsRejecteds tokenTrees sTagsAcceptedsupdates sTagsRejectedssilents tracebacks print_excsdumpsforget(sselfsfilePathsoPathsnoCachesreloadsallTagssfiles tagsRejectedsotimesttimes ofilePaths tagsAcceptedspathsidxsfs traceback((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pys parseFile3s:       , cCs/||_t|||_|i|iSdS(N(sreloadsselfs TokenizerstextsallTagss tokenizers processNodes tokenTree(sselfstextsreloadsallTags((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysparseYs c Cst|\}} }}}| d}t} |i i |o|Snt} |i i |o|i |\} } n|i|\} } | ot| } | tjovt| djo| it|n| | f}| | } t| || d||||| ||i |%s
%s

(sobjectsselfs documentations __class__s__doc__(sselfsobjectscdata((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysrenderscCsXd|_t}|i|dd}|i|it|di d|idS(NssnoCacheisws
%s
( sselfs documentationsParsers psoParsers parseFilesinfilespsoTreesrendersopensoutfileswrite(sselfsinfilesoutfilespsoTrees psoParser((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysdos   (s__name__s __module__srendersdo(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pys TagDocumentors s TagIndexercBs#tZdZddZdZRS(NiscCsO|o@|id7_|i}|od|||fSnd|Sn|SdS(Nis :<%s>%s:s:<%s />:(sobjectsselfsindexscdata(sselfsobjectscdatasindex((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysrenders  cCsGd|_t}|i|}t|di |i |i dS(Nisw( sselfsindexsParsers psoParsers parseFilesinfilespsoTreesopensoutfileswritesrender(sselfsinfilesoutfilespsoTrees psoParser((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysdos  (s__name__s __module__sindexsrendersdo(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pys TagIndexers sTagTimercBstZddZdZRS(NscCs^|oCti}|i||}ti||i|ii <|Sn|i||SdS(N( sobjectstimestsselfsrenderscdatasrstagTimess __class__s__name__(sselfsobjectscdatasrst((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pystimers  cCs_h|_t}|i|}|i|iGHx&|ii D]\}}|G|GHqBWdS(N( sselfstagTimessParsers psoParsers parseFilesinfilespsoTreesrenderstimersitemssksv(sselfsinfileskspsoTreesvs psoParser((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysdos   (s__name__s __module__stimersdo(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pysTagTimers s IndexerTimercBstZRS(N(s__name__s __module__(((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/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((s=/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/parser.pys?sl        H ;)y