--- ECHO_content/ECHO_xslt.py 2006/09/10 22:57:38 1.9 +++ ECHO_content/ECHO_xslt.py 2006/09/11 14:43:23 1.10 @@ -24,6 +24,7 @@ import urllib try: from Ft.Xml.Xslt.Processor import Processor from Ft.Xml import InputSource, EMPTY_NAMESPACE,Parse + from Ft.Xml.Domlette import NonvalidatingReader except: print "4suite has to be installed" @@ -144,7 +145,13 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l meta_type="ECHO_xslt" - cache=ECHO_cache() + cache=ECHO_cache() # cache for analysed pages + caching="yes" + + appendQueryString=True # add query string to the cgiUrl can be changed with addChanges + + passURL=False #use url from querystring parameter fn to retrieve the text and not the url in cgi-url can be changed with addChanges + results={} manage_options=ECHO_pageTemplate.manage_options+( @@ -164,13 +171,30 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l pt=zptFile(self, 'zpt/ChangeECHO_xsltForm.zpt') return pt() - def addChanges(self,cgiUrl,RESPONSE=None): + def addChanges(self,cgiUrl,appendQueryString=False,passURL=False,caching=False,RESPONSE=None): """change the xslt, ueberschriebt addChanges in ECHO_PageTemplate""" + if urlparse.urlparse(cgiUrl)[0]=="":#relative url in absolute self.cgiUrl=urlparse.urljoin(self.absolute_url(), cgiUrl) else: self.cgiUrl=cgiUrl - + + if appendQueryString: + self.appendQueryString=True + else: + self.appendQueryString=False + + if passURL: + self.passURL=True + else: + self.passURL=False + + if caching: + self.caching="yes" + else: + self.caching="No" + + if RESPONSE: RESPONSE.redirect("manage_main") @@ -218,30 +242,38 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l return self._v_xmltrans.getResult() + def getText(self): + """print nur den text""" + qs,baseUri=self.getTextInput() + self.REQUEST.RESPONSE.redirect(qs) def deleteCache(self): """deletefrom cache""" fn=self.REQUEST['fn'] self.cache.deleteObject(fn) - def getPageLex(self,_pn="1",_caching="yes"): + def getPageLex(self,_pn="1",_caching=None): """getpage mit lexikalischer analyse und xslt transform if _caching=yes dann wird die lwxikalisch analysierte seite in einem cache abgespeichert """ - + + if not _caching: + _caching=self.caching + fn=self.REQUEST['fn'] fromCache=self.cache.retrieveObject(fn,_pn) - + if fromCache and _caching=="yes": - print "retrieve",fn,_pn + txt = fromCache else: txt=self.tagLex(nr=_pn) - print "store",fn,_pn + self.cache.storeObject(fn,_pn,txt[0:]) + xsl=self.xslt() xsltproc=Processor() @@ -255,33 +287,65 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l return tmp[0:] - - def getPage(self,_pn,REQUEST=None): + def getTextInput(self): + """get the text + wie der text geholt wird liegt an der konfiguration, + is appendQueryString gesetzt, dann wir jeweils der Querystring an vorgebenen url gesetzt, erwartet wird fn= + fźr den Pfad, is passURL gesetzt, dann wird falls fn= eine vollstŠndige url enthŠlt, diese anstelle der in cgiurl definierten genommen. + """ + + if getattr(self,'passURL',False) and self.REQUEST.has_key('fn') and (urlparse.urlparse(self.REQUEST['fn'])[0]=='http'): + qs=self.REQUEST['fn'] + baseUri=qs + elif getattr(self,'pappendQueryString',True): + qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING']) + baseUri=self.cgiUrl + else: + qs="%s"%(self.cgiUrl) + baseUri=self.cgiUrl + + #fact= InputSource.DefaultFactory.fromUri(qs) + return qs,baseUri + #return InputSource.InputSource(fact) + #xmlt=urllib.urlopen(qs).read() + + def getPage(self,_pn,REQUEST=None,_caching=None): """get a page from an xml""" + + if not _caching: + _caching=self.caching + pn=int(_pn)-1 if pn<0: if REQUEST: return "Sorry, pagenumbers have to be greater than 0" else: return None - impl=xml.dom.getDOMImplementation() - newDoc=impl.createDocument(EMPTY_NAMESPACE,None,None - ) - root=newDoc.createElement('page') - newDoc.appendChild(root) + + xmlt,self.baseUri=self.getTextInput() + #get the text from cache, if existing + fromCache=self.cache.retrieveObject(self.baseUri,"-1") + if fromCache and _caching=="yes": + + txt = fromCache + else: + + txt=urllib.urlopen(xmlt).read() + + self.cache.storeObject(self.baseUri,"-1",txt) - qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING']) + dom=NonvalidatingReader.parseString(txt,self.baseUri) + #pb should have a namespache - - xmlt=urllib.urlopen(qs).read() - dom=Parse(xmlt) - - pbs=dom.xpath("//pb") + pbs=dom.xpath("//mpiwg:pb",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}) + if len(pbs)==0: # versuche nochmal ohne + pbs=dom.xpath("//pb") + if pn > len(pbs): if REQUEST: - return "Sorry, pagenumber %s does not exit"%pn+1 + return "Sorry, pagenumber %s does not exit"%(pn+1) else: return None @@ -292,30 +356,6 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l else: endNode=None - -# follower=beginNode.xpath('following::node()') -# #root.appendChild(beginNode) -# found=[] -# -# for node in endNode.xpath('preceding::node()'): -# if node in follower: -# found.append(node) -# - - - #rempove all children of parents which are also in the list -# for x in found: -# for child in x.xpath(".//*"): -# try: -# -# nr=found.index(child) -# -# del(found[nr]) -# except: -# pass -# -# found.append(endNode) -# deleteNodes=beginNode.xpath('preceding::node()') if endNode: deleteNodes+=endNode.xpath('following::node()') @@ -330,7 +370,7 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l strio = StringIO() PrettyPrint(dom,strio) xmlstr = strio.getvalue() - + return xmlstr