Annotation of ECHO_content/ECHO_xslt.py, revision 1.8

1.1       dwinter     1: ### XSLT Class ###
                      2: ### setzt 4 suite vorraus ###
1.4       dwinter     3: from Acquisition import Implicit
1.1       dwinter     4: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
                      5: from Globals import DTMLFile
                      6: from ECHO_Nav import ECHO_pageTemplate
1.2       dwinter     7: from threading import Thread,Timer
1.4       dwinter     8: import threading
                      9: from ECHO_helpers import *
1.8     ! dwinter    10: import ECHO_language
1.4       dwinter    11: import sys
                     12: import urllib
                     13: import urlparse
1.6       dwinter    14: from Ft.Xml.Domlette import Print, PrettyPrint
1.7       dwinter    15: from StringIO import StringIO
1.1       dwinter    16: 
                     17: from Globals import package_home
                     18: 
1.4       dwinter    19: 
1.1       dwinter    20: import os.path
                     21: 
                     22: import urllib
                     23: 
                     24: try:
                     25:     from Ft.Xml.Xslt.Processor import Processor
1.6       dwinter    26:     from Ft.Xml import InputSource, EMPTY_NAMESPACE,Parse
1.1       dwinter    27: except:
                     28:     print "4suite has to be installed"
                     29: 
                     30: 
1.4       dwinter    31: class getXML(Implicit):
1.2       dwinter    32:     """get XML thread"""
                     33: 
1.4       dwinter    34:     def set(self,qs,xsl,result):
                     35:         """set"""
                     36:    
                     37:         self._v_qs=qs
1.2       dwinter    38:         self.xsl=xsl
1.4       dwinter    39:         self.result=None        
1.2       dwinter    40: 
1.4       dwinter    41: #    def acquireLock(self):
                     42: #    
                     43: #         lock=getattr(self, "_v_lock", None)
                     44: #         if not lock:
                     45: #             self._v_lock=threading.Lock()
                     46: #             lock=self._v_lock
                     47: #         lock.acquire()
                     48: #
                     49: #    def releaseLock(self):
                     50: #         # acquire() should have been called
                     51: #         # about one second before. This means the volatile lock
                     52: #         # should still be there
                     53: #    
                     54: #         self._v_lock.release()
                     55: #        
                     56:   
1.2       dwinter    57:     def __call__(self):
1.4       dwinter    58:         """wait"""
                     59:         return True
                     60:     
                     61:     def run(self):
                     62:         """call it"""
                     63:         xml=""
1.6       dwinter    64:         print "X",self._v_qs
1.3       dwinter    65:         try:
1.5       dwinter    66:   
1.4       dwinter    67:             urlH=urllib.urlopen(self._v_qs)
                     68:             xml=urlH.read()
                     69:             urlH.close()
                     70:             xsltproc=Processor()
                     71:             document = InputSource.DefaultFactory.fromString(xml)
                     72:             
                     73:             stylesheet = InputSource.DefaultFactory.fromUri(self.xsl)
                     74:             
                     75:             xsltproc.appendStylesheet(stylesheet)
                     76:             
                     77:         
                     78:             #print self.xsl
                     79:             #print xsltproc.run(document)
                     80:             tmp=xsltproc.run(document)
                     81:             
                     82:             self.result=tmp[0:]
                     83:             
1.3       dwinter    84:         
                     85:            except:
1.4       dwinter    86:                
                     87:                self.result="<html>error: %s %s<br>"%sys.exc_info()[0:2]
                     88:                self.result+=xml
                     89:                self.result+="</html>"
1.2       dwinter    90:         
1.4       dwinter    91:         
                     92:     
1.2       dwinter    93:     def getResult(self):
1.4       dwinter    94: 
1.2       dwinter    95:         return self.result
                     96: 
                     97: 
                     98:     
1.8     ! dwinter    99: class ECHO_xslt(ECHO_pageTemplate,ECHO_language.ECHO_language):
1.1       dwinter   100:     """ECHO_xslt classe"""
                    101: 
                    102:     meta_type="ECHO_xslt"
1.4       dwinter   103:     
                    104:     results={}
                    105:     manage_options=ECHO_pageTemplate.manage_options+(
                    106:      {'label':'Change xml-ressource','action':'change_ECHO_xsltForm'},)
                    107:      
1.2       dwinter   108:     def refreshTxt(self):
                    109:         """txt fuer refresh"""
                    110:         return """ 2;url=%s?repeat=%s """%(self.absolute_url(),self.threadName)
1.1       dwinter   111: 
                    112:     def xslt(self):
1.2       dwinter   113:         """xslt"""
1.1       dwinter   114: 
1.4       dwinter   115:         return self.document_src()
1.1       dwinter   116: 
1.4       dwinter   117:     def change_ECHO_xsltForm(self):
                    118:         """change form"""
                    119:         pt=zptFile(self, 'zpt/ChangeECHO_xsltForm.zpt')
                    120:         return pt()
                    121: 
                    122:     def addChanges(self,cgiUrl,RESPONSE=None):
                    123:         """change the xslt, ueberschriebt addChanges in ECHO_PageTemplate"""
                    124:         if urlparse.urlparse(cgiUrl)[0]=="":#relative url in absolute
                    125:             self.cgiUrl=urlparse.urljoin(self.absolute_url(), cgiUrl)
                    126:         else:
                    127:             self.cgiUrl=cgiUrl
                    128:             
                    129:         if RESPONSE:
                    130:             RESPONSE.redirect("manage_main")
1.2       dwinter   131:         
                    132:     def index_html(self,repeat=None):
                    133:         """standard ausgabe"""
1.4       dwinter   134: 
1.2       dwinter   135:         threadName=repeat
                    136:         
                    137:         if not threadName or threadName=="":
1.4       dwinter   138:             
                    139:             #abwaertskompatibilitŠt mit altem nivht konfigurierbaren prototypen
                    140:             
                    141:             if getattr(self,'cgiUrl','')=='':
                    142:                 self.cgiUrl="http://medea.mpiwg-berlin.mpg.de/cgi-bin/search/q1"
                    143:                 
1.6       dwinter   144:             qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING'])
1.2       dwinter   145:             xsl=self.absolute_url()+"/xslt"
1.4       dwinter   146:             self._v_xmltrans=getXML().__of__(self)
                    147:             #self._xmltrans.start()
                    148:             thread=Thread(target=self._v_xmltrans)
                    149:             thread.start()
                    150:             self._v_xmltrans.set(qs,xsl,None)
                    151:             self._v_xmltrans.run()
1.2       dwinter   152:             
                    153:             
                    154:             self.threadName=thread.getName()[0:]
                    155:             wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
                    156:             if wait_template:
                    157:                 return wait_template[0][1]()
                    158:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self)
                    159:             return pt()
1.4       dwinter   160:             #_v_xmltrans.run()
1.2       dwinter   161:         
                    162:         else:
                    163:             
1.4       dwinter   164:             if (self._v_xmltrans.getResult()==None):
1.3       dwinter   165: 
1.5       dwinter   166:                 wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
                    167:                 if wait_template:
                    168:                         return wait_template[0][1]()
1.2       dwinter   169:                 
                    170:                 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self)
                    171:                 return pt()
                    172:             else:
1.4       dwinter   173:                 return self._v_xmltrans.getResult()
1.2       dwinter   174: 
                    175:     
1.8     ! dwinter   176:     def getPageLex(self,_pn="1"):
        !           177:         """getpage with linkss to lexicon"""
        !           178:         return self.tagLex(nr=_pn)
        !           179:     
1.7       dwinter   180:     def getPage(self,_pn,REQUEST=None):
1.6       dwinter   181:         """get a page from an xml"""
1.7       dwinter   182:         pn=int(_pn)-1
                    183:         if pn<0:
                    184:             if REQUEST:
                    185:                 return "Sorry, pagenumbers have to be greater than 0"
                    186:             else:
                    187:                 return None
1.6       dwinter   188:         impl=xml.dom.getDOMImplementation()
                    189:         newDoc=impl.createDocument(EMPTY_NAMESPACE,None,None
                    190:                                    )
                    191:         root=newDoc.createElement('page')
                    192:         newDoc.appendChild(root)
1.7       dwinter   193:         qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING'])
                    194:         print qs
                    195:         xmlt=urllib.urlopen(qs).read()
1.6       dwinter   196:         dom=Parse(xmlt)
                    197:        
                    198:         pbs=dom.xpath("//pb")
1.7       dwinter   199:         if pn > len(pbs):
                    200:             if REQUEST:
                    201:                 return "Sorry, pagenumber %s does not exit"%pn+1
                    202:             else:
                    203:                 return None
                    204:             
1.6       dwinter   205:         beginNode=pbs[pn] #take the n'th pb
1.7       dwinter   206: 
                    207:         if not (pn==len(pbs)-1): # nicht die letzte Seite
                    208:             endNode=pbs[pn+1]
                    209:         else:
                    210:             endNode=None
                    211:         
                    212:            
                    213: #        follower=beginNode.xpath('following::node()')
                    214: #        #root.appendChild(beginNode)
                    215: #        found=[]
                    216: #       
                    217: #        for node in endNode.xpath('preceding::node()'):
                    218: #            if node in follower:
                    219: #                found.append(node)
                    220: #    
                    221:         
                    222:    
1.6       dwinter   223:         #rempove all children of parents which are also in the list
1.7       dwinter   224: #        for x in found:
                    225: #            for child in x.xpath(".//*"):
                    226: #                try:
                    227: #                  
                    228: #                    nr=found.index(child)
                    229: #               
                    230: #                    del(found[nr])
                    231: #                except:
                    232: #                    pass
                    233: #
                    234: #        found.append(endNode)
                    235: #       
                    236:         deleteNodes=beginNode.xpath('preceding::node()')
                    237:         if endNode:
                    238:             deleteNodes+=endNode.xpath('following::node()')
                    239:         for node in deleteNodes:
                    240:             try:
                    241:                 parent=node.xpath("..")
                    242:            
                    243:                 if parent:
                    244:                     parent[0].removeChild(node)
                    245:             except:
                    246:                 zLOG.LOG("ECHO_Resource (getAccessRightMD)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
                    247:         strio = StringIO()
                    248:         PrettyPrint(dom,strio) 
                    249:         xmlstr = strio.getvalue()
                    250:         return xmlstr
1.6       dwinter   251: 
                    252: 
                    253:         
1.1       dwinter   254: def manage_addECHO_xsltForm(self):
                    255:     """Form for adding"""
                    256:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_xslt.zpt')).__of__(self)
                    257:     return pt()
                    258: 
                    259: from urllib import quote
                    260: 
                    261: 
1.4       dwinter   262: def manage_addECHO_xslt(self, id, label, weight= 0,contentType=0,title=None, text=None, cgiUrl=None,
1.1       dwinter   263:                            REQUEST=None, submit=None):
                    264:     "Add a Page Template with optional file content."
                    265: 
                    266:     
                    267:     id = str(id)
                    268:     if REQUEST is None:
                    269:         self._setObject(id, ECHO_xslt(id, text))
                    270:         ob = getattr(self, id)
                    271:         setattr(ob,'weight',weight)
                    272:         setattr(ob,'label',label)
                    273:         setattr(ob,'contentType',contentType)
                    274:         if title:
                    275:             ob.pt_setTitle(title)
                    276:         return ob
1.4       dwinter   277:         setattr(ob,'cgiUrl',cgiUrl)
1.1       dwinter   278:     else:
                    279:         file = REQUEST.form.get('file')
                    280:         headers = getattr(file, 'headers', None)
                    281:         if headers is None or not file.filename:
                    282:             zpt = ECHO_xslt(id)
                    283:         else:
                    284:             zpt = ECHO_xslt(id, file, headers.get('contentType'))
                    285: 
                    286:         self._setObject(id, zpt)
                    287:         ob = getattr(self, id)
                    288:         setattr(ob,'weight',weight)
                    289:         setattr(ob,'label',label)
1.4       dwinter   290:         setattr(ob,'cgiUrl',cgiUrl)
1.1       dwinter   291:         if title:
                    292:             ob.pt_setTitle(title)
                    293:         
                    294:         try:
                    295:             u = self.DestinationURL()
                    296:         except AttributeError:
                    297:             u = REQUEST['URL1']
                    298: 
                    299:         if submit == " Add and Edit ":
                    300:             u = "%s/%s" % (u, quote(id))
                    301:         REQUEST.RESPONSE.redirect(u+'/manage_main')
                    302:     return ''
                    303: 

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