Diff for /ECHO_content/ECHO_xslt.py between versions 1.7 and 1.10

version 1.7, 2006/09/09 10:52:35 version 1.10, 2006/09/11 14:43:23
Line 7  from ECHO_Nav import ECHO_pageTemplate Line 7  from ECHO_Nav import ECHO_pageTemplate
 from threading import Thread,Timer  from threading import Thread,Timer
 import threading  import threading
 from ECHO_helpers import *  from ECHO_helpers import *
   import ECHO_language
 import sys  import sys
 import urllib  import urllib
 import urlparse  import urlparse
 from Ft.Xml.Domlette import Print, PrettyPrint  from Ft.Xml.Domlette import Print, PrettyPrint
 from StringIO import StringIO  from StringIO import StringIO
   from types import *
 from Globals import package_home  from Globals import package_home
   import transaction
   
 import os.path  import os.path
   
Line 23  import urllib Line 24  import urllib
 try:  try:
     from Ft.Xml.Xslt.Processor import Processor      from Ft.Xml.Xslt.Processor import Processor
     from Ft.Xml import InputSource, EMPTY_NAMESPACE,Parse      from Ft.Xml import InputSource, EMPTY_NAMESPACE,Parse
       from Ft.Xml.Domlette import NonvalidatingReader
 except:  except:
     print "4suite has to be installed"      print "4suite has to be installed"
   
Line 60  class getXML(Implicit): Line 62  class getXML(Implicit):
     def run(self):      def run(self):
         """call it"""          """call it"""
         xml=""          xml=""
         print "X",self._v_qs  
         try:          try:
       
             urlH=urllib.urlopen(self._v_qs)              urlH=urllib.urlopen(self._v_qs)
Line 93  class getXML(Implicit): Line 95  class getXML(Implicit):
   
         return self.result          return self.result
   
   from ZODB import DB
   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()
       
       def deleteObject(self,name,pn=None):
           """delete an object from cache"""
           fileStore=self.root.get(name,None)
           if fileStore:
               if not pn:
                   del(self.root[name])
               else:
                   if self.root[name].get(pn,None):
                       del(self.root[name][pn])
                       
           
       def storeObject(self,name,pn,object):
           """store an object"""
           
           if not self.root.get(name,None):
               self.root[name]={}
               
   
           #following is necessary to make clear that object has really changed for ZODB
           tmp=self.root[name]
           tmp[pn]=object
           self.root[name]=tmp
           transaction.get().commit()
           return True
      
       def retrieveObject(self,name,pn):
           """retrieve it"""
           
           fileStore=self.root.get(name,None)
           if not fileStore:
               return None
           else:
               return self.root[name].get(pn,None)
   
           
 class ECHO_xslt(ECHO_pageTemplate):  class ECHO_xslt(ECHO_pageTemplate,ECHO_language.ECHO_language):
     """ECHO_xslt classe"""      """ECHO_xslt classe"""
   
     meta_type="ECHO_xslt"      meta_type="ECHO_xslt"
           
       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={}      results={}
     manage_options=ECHO_pageTemplate.manage_options+(      manage_options=ECHO_pageTemplate.manage_options+(
      {'label':'Change xml-ressource','action':'change_ECHO_xsltForm'},)       {'label':'Change xml-ressource','action':'change_ECHO_xsltForm'},)
Line 118  class ECHO_xslt(ECHO_pageTemplate): Line 171  class ECHO_xslt(ECHO_pageTemplate):
         pt=zptFile(self, 'zpt/ChangeECHO_xsltForm.zpt')          pt=zptFile(self, 'zpt/ChangeECHO_xsltForm.zpt')
         return pt()          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"""          """change the xslt, ueberschriebt addChanges in ECHO_PageTemplate"""
       
         if urlparse.urlparse(cgiUrl)[0]=="":#relative url in absolute          if urlparse.urlparse(cgiUrl)[0]=="":#relative url in absolute
             self.cgiUrl=urlparse.urljoin(self.absolute_url(), cgiUrl)              self.cgiUrl=urlparse.urljoin(self.absolute_url(), cgiUrl)
         else:          else:
             self.cgiUrl=cgiUrl              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:          if RESPONSE:
             RESPONSE.redirect("manage_main")              RESPONSE.redirect("manage_main")
                   
Line 172  class ECHO_xslt(ECHO_pageTemplate): Line 242  class ECHO_xslt(ECHO_pageTemplate):
                 return self._v_xmltrans.getResult()                  return self._v_xmltrans.getResult()
   
           
     def getPage(self,_pn,REQUEST=None):      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=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":
             
               txt = fromCache
           else:
               txt=self.tagLex(nr=_pn)   
            
               self.cache.storeObject(fn,_pn,txt[0:])
           
          
           xsl=self.xslt()
           
           xsltproc=Processor()
           if type(txt)==UnicodeType:
               document = InputSource.DefaultFactory.fromString(txt.encode('utf-8'))
           else:
               document = InputSource.DefaultFactory.fromString(txt)
           stylesheet = InputSource.DefaultFactory.fromString(xsl)
           xsltproc.appendStylesheet(stylesheet)
           tmp=xsltproc.run(document)
           
           return tmp[0:]
               
       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"""          """get a page from an xml"""
           
           if not _caching:
               _caching=self.caching
               
         pn=int(_pn)-1          pn=int(_pn)-1
         if pn<0:          if pn<0:
             if REQUEST:              if REQUEST:
                 return "Sorry, pagenumbers have to be greater than 0"                  return "Sorry, pagenumbers have to be greater than 0"
             else:              else:
                 return None                  return None
         impl=xml.dom.getDOMImplementation()  
         newDoc=impl.createDocument(EMPTY_NAMESPACE,None,None  
                                    )  
         root=newDoc.createElement('page')  
         newDoc.appendChild(root)  
         qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING'])  
         print qs  
         xmlt=urllib.urlopen(qs).read()  
         dom=Parse(xmlt)  
                 
           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)
           
           dom=NonvalidatingReader.parseString(txt,self.baseUri)
           
           #pb should have a namespache
           
           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")          pbs=dom.xpath("//pb")
   
         if pn > len(pbs):          if pn > len(pbs):
             if REQUEST:              if REQUEST:
                 return "Sorry, pagenumber %s does not exit"%pn+1                  return "Sorry, pagenumber %s does not exit"%(pn+1)
             else:              else:
                 return None                  return None
                           
Line 204  class ECHO_xslt(ECHO_pageTemplate): Line 356  class ECHO_xslt(ECHO_pageTemplate):
         else:          else:
             endNode=None              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()')          deleteNodes=beginNode.xpath('preceding::node()')
         if endNode:          if endNode:
             deleteNodes+=endNode.xpath('following::node()')              deleteNodes+=endNode.xpath('following::node()')
Line 242  class ECHO_xslt(ECHO_pageTemplate): Line 370  class ECHO_xslt(ECHO_pageTemplate):
         strio = StringIO()          strio = StringIO()
         PrettyPrint(dom,strio)           PrettyPrint(dom,strio) 
         xmlstr = strio.getvalue()          xmlstr = strio.getvalue()
           
         return xmlstr          return xmlstr
   
   

Removed from v.1.7  
changed lines
  Added in v.1.10


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>