--- ECHO_content/ECHO_xslt.py 2006/10/12 16:37:33 1.13 +++ ECHO_content/ECHO_xslt.py 2010/02/15 19:03:28 1.23 @@ -7,7 +7,13 @@ from ECHO_Nav import ECHO_pageTemplate from threading import Thread,Timer import threading from ECHO_helpers import * -import ECHO_language +try: + from ECHO_language import * +except: + print "no echo language" + class ECHO_language: + """leere Klasse""" + pass import sys import urllib import urlparse @@ -19,8 +25,8 @@ import transaction import os.path -import urllib - +import urllib,cgi +import logging try: from Ft.Xml.Xslt.Processor import Processor from Ft.Xml import InputSource, EMPTY_NAMESPACE,Parse @@ -29,7 +35,7 @@ except: print "4suite has to be installed" -class getXML(Implicit): +class getXML(Thread): """get XML thread""" def set(self,qs,xsl,result): @@ -57,6 +63,7 @@ class getXML(Implicit): def __call__(self): """wait""" + self.run() return True def run(self): @@ -65,16 +72,17 @@ class getXML(Implicit): try: - urlH=urllib.urlopen(self._v_qs) - xml=urlH.read() - urlH.close() + #urlH=urllib.urlopen(self._v_qs) + #xml=urlH.read() + #urlH.close() xsltproc=Processor() - document = InputSource.DefaultFactory.fromString(xml) + logging.debug("start XML") + document = InputSource.DefaultFactory.fromUri(self._v_qs) stylesheet = InputSource.DefaultFactory.fromUri(self.xsl) - + logging.debug("got all files XML") xsltproc.appendStylesheet(stylesheet) - + logging.debug("got all files do the transform") #print self.xsl #< xsltproc.run(document) @@ -100,11 +108,16 @@ from ZODB.FileStorage import FileStorage class ECHO_cache: def __init__(self): """init the storage""" - self.storage=FileStorage("/var/tmp/echo_cache.fs") - self.db=DB(self.storage) - self.connection=self.db.open() - self.root=self.connection.root() - + + try: + self.storage=FileStorage(os.path.join(INSTANCE_HOME,"var/echo_cache.fs")) + + self.db=DB(self.storage) + self.connection=self.db.open() + self.root=self.connection.root() + except: + pass + def deleteObject(self,name,pn=None): """delete an object from cache""" fileStore=self.root.get(name,None) @@ -141,7 +154,7 @@ class ECHO_cache: return self.root[name].get(pn,None) -class ECHO_xslt(ECHO_pageTemplate,ECHO_language.ECHO_language): +class ECHO_xslt(ECHO_pageTemplate,ECHO_language): """ECHO_xslt classe""" meta_type="ECHO_xslt" @@ -206,22 +219,26 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l if not threadName or threadName=="": - #abwaertskompatibilitŠt mit altem nivht konfigurierbaren prototypen + + # compatibility with old prototype if getattr(self,'cgiUrl','')=='': self.cgiUrl="http://medea.mpiwg-berlin.mpg.de/cgi-bin/search/q1" qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING']) xsl=self.absolute_url()+"/xslt" - self._v_xmltrans=getXML().__of__(self) + #self._v_xmltrans=getXML().__of__(self) + self._v_xmltrans=getXML() #self._xmltrans.start() - thread=Thread(target=self._v_xmltrans) - thread.start() + #thread=Thread(target=self._v_xmltrans) + #thread.start() + logging.debug("Thread prepared") self._v_xmltrans.set(qs,xsl,None) - self._v_xmltrans.run() + self._v_xmltrans.start() + logging.debug("Thread started") - - self.threadName=thread.getName()[0:] + #self.threadName=thread.getName()[0:] + self.threadName=self._v_xmltrans.getName()[0:] wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template']) if wait_template: return wait_template[0][1]() @@ -283,26 +300,62 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l if type=="target": for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}): fn=link.xpath("mpiwg:target/@filename",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value + + if urlparse.urlparse(urllib.unquote(fn))[0]=="http": # fn ist eine url + return urllib.unquote(fn) # dann gibt diese zurueck + ref=link.xpath("mpiwg:target/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value ref2=link.xpath("mpiwg:target/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value selectionNodeIndex=link.xpath("mpiwg:target/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value - - lstr=slaveurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s'%(ref2,selectionNodeIndex) - lstr+="&_links="+urllib.quote(url)+'&_linkid='+linkid+'&_linktype=target' + + + + lstr=slaveurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'target') + lstr+="&_links="+urllib.quote(url) else: for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}): fn=link.xpath("mpiwg:source/@filename",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value + if urlparse.urlparse(urllib.unquote(fn))[0]=="http": # fn ist eine url + return urllib.unquote(fn) # dann gibt diese zurueck + ref=link.xpath("mpiwg:source/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value ref2=link.xpath("mpiwg:source/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value selectionNodeIndex=link.xpath("mpiwg:source/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value - lstr=masterurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s'%(ref2,selectionNodeIndex) - lstr+="&_links="+urllib.quote(url)+'&_linkid='+linkid+'&_linktype=source' + lstr=masterurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'source') + lstr+="&_links="+urllib.quote(url) return lstr + def addLinksUrl(self,txt,url): + """add reference to links to url""" + ret=[] + dom=NonvalidatingReader.parseUri(url) + textDom=NonvalidatingReader.parseString(txt) + + #find ids in txt + ids=textDom.xpath("//*[@id]") + + for textid in ids: + xp="//mpiwg:link[mpiwg:source/@refid='%s']"%textid.xpath("@id")[0].value + for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}): + ref2=link.xpath("mpiwg:source/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value + selectionNodeIndex=link.xpath("mpiwg:source/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value + linkid=link.xpath("@id")[0].value + ret.append('%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'source')) + + xp="//mpiwg:link[mpiwg:target/@refid='%s']"%textid.xpath("@id")[0].value + for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}): + ref2=link.xpath("mpiwg:target/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value + selectionNodeIndex=link.xpath("mpiwg:target/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value + linkid=link.xpath("@id")[0].value + ret.append('%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'target')) + + + return ret + def addLinks(self,txt,url="http://127.0.0.1:8080/HFQP/linkCreator/getCollectionXML?collection=commentary2"): """add links to a page from xml linkfile""" @@ -319,13 +372,20 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l xp="//mpiwg:link[mpiwg:source/@refid='%s']"%textid.xpath("@id")[0].value for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}): fn=link.xpath("mpiwg:target/@filename",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value - ref=link.xpath("mpiwg:target/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value - - ref2=link.xpath("mpiwg:target/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value - selectionNodeIndex=link.xpath("mpiwg:target/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value - linkid=link.xpath("@id")[0].value - lstr=slaveurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s'%(ref2,selectionNodeIndex) - lstr+="&_links="+urllib.quote(url)+'&_url='+url+'&_linkid='+linkid+'&_linktype=target' + print fn + if urlparse.urlparse(urllib.unquote(fn))[0]=="http": # fn ist eine url + lstr=urllib.unquote(fn) # dann gibt diese zurueck + else: + try: + ref=link.xpath("mpiwg:target/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value + + ref2=link.xpath("mpiwg:target/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value + selectionNodeIndex=link.xpath("mpiwg:target/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value + linkid=link.xpath("@id")[0].value + lstr=slaveurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'target') + lstr+="&_links="+urllib.quote(url) + except: + lstr="" node=self.createLinkNode(lstr,textDom) textid.parentNode.insertBefore(node,textid) @@ -333,14 +393,18 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l xp="//mpiwg:link[mpiwg:target/@refid='%s']"%textid.xpath("@id")[0].value for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}): fn=link.xpath("mpiwg:source/@filename",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value - ref=link.xpath("mpiwg:source/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value - - ref2=link.xpath("mpiwg:source/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value - selectionNodeIndex=link.xpath("mpiwg:source/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value - linkid=link.xpath("@id")[0].value - lstr=masterurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s'%(ref2,selectionNodeIndex) - lstr+="&_links="+urllib.quote(url)+'&_linkid='+linkid+'&_linktype=source' + if urlparse.urlparse(urllib.unquote(fn))[0]=="http": # fn ist eine url + lstr=urllib.unquote(fn) # dann gibt diese zurueck + else: + ref=link.xpath("mpiwg:source/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value + + ref2=link.xpath("mpiwg:source/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value + selectionNodeIndex=link.xpath("mpiwg:source/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value + linkid=link.xpath("@id")[0].value + lstr=masterurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,"source") + lstr+="&_links="+urllib.quote(url) + node=self.createLinkNode(lstr,textDom) textid.parentNode.insertBefore(node,textid) @@ -354,11 +418,24 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l - def getPageLex(self,_pn="1",_id=None,_caching=None,_links=None): + def getPageLex(self,_pn="1",_id=None,_caching=None,_links=None,_showall="no",_displaylinks="yes"): """getpage mit lexikalischer analyse und xslt transform if _caching=yes dann wird die lwxikalisch analysierte seite in einem cache abgespeichert """ - + def encode(hash): + ret=[] + for x in hash.keys(): + value=hash[x] + + if type(value) is ListType: + for z in value: + ret.append("%s=%s"%(x,z)) + else: + ret.append("%s=%s"%(x,value)) + return "&".join(ret) + + + if not _caching: _caching=self.caching @@ -379,6 +456,16 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l else: txt=self.tagLex(id=_id) + if _showall=="yes": + params=cgi.parse_qs(self.REQUEST['QUERY_STRING']) + + params['_pagelink']=self.addLinksUrl(txt,url=_links) + params['_showall']='no' + + print self.absolute_url()+"?"+encode(params) + self.REQUEST.RESPONSE.redirect(self.absolute_url()+"/getPageLex?"+encode(params)) + + xsl=self.xslt() xsltproc=Processor() @@ -390,7 +477,7 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l xsltproc.appendStylesheet(stylesheet) tmp=xsltproc.run(document) - if _links: + if _links and (_displaylinks=='yes'): _links=urllib.unquote(_links) tmp=self.addLinks(tmp,url=_links) @@ -404,7 +491,7 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l """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. + fuer den Pfad, is passURL gesetzt, dann wird falls fn= eine vollstaendige url enthaelt, 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'): @@ -438,7 +525,10 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l xmlt,self.baseUri=self.getTextInput() #get the text from cache, if existing - fromCache=self.cache.retrieveObject(self.baseUri,"-1") + try: + fromCache=self.cache.retrieveObject(self.baseUri,"-1") + except: + fromCache=None if fromCache and _caching=="yes": txt = fromCache @@ -448,7 +538,7 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l self.cache.storeObject(self.baseUri,"-1",txt) - + dom=NonvalidatingReader.parseString(txt,self.baseUri) #pb should have a namespache @@ -462,19 +552,19 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l #suche wieviele pb for der id - idpb=dom.xpath("//*[@id='%s']/preceding::node()/mpiwg:pb"%_id,explicitNss={'html':'http://test.de','mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}) + idpb=dom.xpath("//*[@id='%s']/preceding::node()/mpiwg:pb"%_id,explicitNss={'html':'http://www.w3.org/1999/xhtml','mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}) if len(idpb)==0: idpb=dom.xpath("//*[@id='%s']/preceding::node()/pb"%_id) if len(idpb)==0: k=0 - for node in dom.xpath("//*[@id='%s']//preceding::node()"%_id,explicitNss={'html':'http://test.de','mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}): + for node in dom.xpath("//*[@id='%s']//preceding::node()"%_id,explicitNss={'html':'http://www.w3.org/1999/xhtml','mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}): if getattr(node,'tagName',"")=="mpiwg:pb": k+=1 else: k=len(idpb) + #pn=k-1 #-1 wegen Seitenzahlzaehlung startet mit 0 pn=k-1 #-1 wegen Seitenzahlzaehlung startet mit 0 - if pn > len(pbs): if REQUEST: return "Sorry, pagenumber %s does not exit"%(pn+1) @@ -498,7 +588,7 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l if parent: parent[0].removeChild(node) except: - zLOG.LOG("ECHO_Resource (getAccessRightMD)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2]) + logger("ECHO_Resource (getAccessRightMD)", logging.INFO,"%s (%s)"%sys.exc_info()[0:2]) strio = StringIO() PrettyPrint(dom,strio) xmlstr = strio.getvalue() @@ -556,4 +646,3 @@ def manage_addECHO_xslt(self, id, label, u = "%s/%s" % (u, quote(id)) REQUEST.RESPONSE.redirect(u+'/manage_main') return '' -