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

version 1.6, 2006/09/09 00:10:01 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 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])
   
           
 class ECHO_xslt(ECHO_pageTemplate):      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,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):      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"""
         pn=int(pn)  
         impl=xml.dom.getDOMImplementation()  
         newDoc=impl.createDocument(EMPTY_NAMESPACE,None,None  
                                    )  
         root=newDoc.createElement('page')  
         newDoc.appendChild(root)  
         
         xmlt=urllib.urlopen("%s"%self.cgiUrl).read()          if not _caching:
         dom=Parse(xmlt)              _caching=self.caching
               
           pn=int(_pn)-1
           if pn<0:
               if REQUEST:
                   return "Sorry, pagenumbers have to be greater than 0"
               else:
                   return None
                 
           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 REQUEST:
                   return "Sorry, pagenumber %s does not exit"%(pn+1)
               else:
                   return None
               
         beginNode=pbs[pn] #take the n'th pb          beginNode=pbs[pn] #take the n'th pb
   
           if not (pn==len(pbs)-1): # nicht die letzte Seite
         endNode=pbs[pn+1]          endNode=pbs[pn+1]
         follower=beginNode.xpath('following::node()')          else:
         #root.appendChild(beginNode)              endNode=None
         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)          deleteNodes=beginNode.xpath('preceding::node()')
           if endNode:
               deleteNodes+=endNode.xpath('following::node()')
           for node in deleteNodes:
               try:
                   parent=node.xpath("..")
                                 
                     del(found[nr])                  if parent:
                       parent[0].removeChild(node)
                 except:                  except:
                     pass                  zLOG.LOG("ECHO_Resource (getAccessRightMD)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
           strio = StringIO()
         found.append(endNode)          PrettyPrint(dom,strio) 
           xmlstr = strio.getvalue()
                 
         for x in found:          return xmlstr
             PrettyPrint(x)  
   
   
                   

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


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