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