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: #abwaertskompatibilitt 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>