Diff for /ECHO_content/ECHO_xslt.py between versions 1.8 and 1.12

version 1.8, 2006/09/10 11:03:07 version 1.12, 2006/10/11 16:55:26
Line 13  import urllib Line 13  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 24  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 61  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 94  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,ECHO_language.ECHO_language):  class ECHO_xslt(ECHO_pageTemplate,ECHO_language.ECHO_language):
Line 101  class ECHO_xslt(ECHO_pageTemplate,ECHO_l Line 146  class ECHO_xslt(ECHO_pageTemplate,ECHO_l
   
     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 119  class ECHO_xslt(ECHO_pageTemplate,ECHO_l Line 172  class ECHO_xslt(ECHO_pageTemplate,ECHO_l
         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 173  class ECHO_xslt(ECHO_pageTemplate,ECHO_l Line 243  class ECHO_xslt(ECHO_pageTemplate,ECHO_l
                 return self._v_xmltrans.getResult()                  return self._v_xmltrans.getResult()
   
           
     def getPageLex(self,_pn="1"):      def getText(self):
         """getpage with linkss to lexicon"""          """print nur den text"""
         return self.tagLex(nr=_pn)          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",_id=None,_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']
   
           if not _id:
              
               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:])
               
           else:
              txt=self.tagLex(id=_id)
              
           xsl=self.xslt()
           
     def getPage(self,_pn,REQUEST=None):          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)
           #bugfix for digilib images which doesn't accept &
           tmp=tmp.replace("&","&")
           
   
           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="-1",_id=None,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 and (not _id):
             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 _id:
               #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'})
               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'}):
                               if getattr(node,'tagName',"")=="mpiwg:pb":
                                   k+=1
               else:
                   k=len(idpb)
               pn=k-1 #-1 wegen Seitenzahlzaehlung startet mit 0
               
         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 209  class ECHO_xslt(ECHO_pageTemplate,ECHO_l Line 382  class ECHO_xslt(ECHO_pageTemplate,ECHO_l
         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 247  class ECHO_xslt(ECHO_pageTemplate,ECHO_l Line 396  class ECHO_xslt(ECHO_pageTemplate,ECHO_l
         strio = StringIO()          strio = StringIO()
         PrettyPrint(dom,strio)           PrettyPrint(dom,strio) 
         xmlstr = strio.getvalue()          xmlstr = strio.getvalue()
           
         return xmlstr          return xmlstr
   
   

Removed from v.1.8  
changed lines
  Added in v.1.12


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