Annotation of ECHO_content/ECHO_xslt.py, revision 1.14

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.9       dwinter    16: from types import *
1.1       dwinter    17: from Globals import package_home
1.9       dwinter    18: import transaction
1.4       dwinter    19: 
1.1       dwinter    20: import os.path
                     21: 
1.14    ! dwinter    22: import urllib,cgi
1.1       dwinter    23: 
                     24: try:
                     25:     from Ft.Xml.Xslt.Processor import Processor
1.6       dwinter    26:     from Ft.Xml import InputSource, EMPTY_NAMESPACE,Parse
1.10      dwinter    27:     from Ft.Xml.Domlette import NonvalidatingReader
1.1       dwinter    28: except:
                     29:     print "4suite has to be installed"
                     30: 
                     31: 
1.4       dwinter    32: class getXML(Implicit):
1.2       dwinter    33:     """get XML thread"""
                     34: 
1.4       dwinter    35:     def set(self,qs,xsl,result):
                     36:         """set"""
                     37:    
                     38:         self._v_qs=qs
1.2       dwinter    39:         self.xsl=xsl
1.4       dwinter    40:         self.result=None        
1.2       dwinter    41: 
1.4       dwinter    42: #    def acquireLock(self):
                     43: #    
                     44: #         lock=getattr(self, "_v_lock", None)
                     45: #         if not lock:
                     46: #             self._v_lock=threading.Lock()
                     47: #             lock=self._v_lock
                     48: #         lock.acquire()
                     49: #
                     50: #    def releaseLock(self):
                     51: #         # acquire() should have been called
                     52: #         # about one second before. This means the volatile lock
                     53: #         # should still be there
                     54: #    
                     55: #         self._v_lock.release()
                     56: #        
                     57:   
1.2       dwinter    58:     def __call__(self):
1.4       dwinter    59:         """wait"""
                     60:         return True
                     61:     
                     62:     def run(self):
                     63:         """call it"""
                     64:         xml=""
1.9       dwinter    65: 
1.3       dwinter    66:         try:
1.5       dwinter    67:   
1.4       dwinter    68:             urlH=urllib.urlopen(self._v_qs)
                     69:             xml=urlH.read()
                     70:             urlH.close()
                     71:             xsltproc=Processor()
                     72:             document = InputSource.DefaultFactory.fromString(xml)
                     73:             
                     74:             stylesheet = InputSource.DefaultFactory.fromUri(self.xsl)
                     75:             
                     76:             xsltproc.appendStylesheet(stylesheet)
                     77:             
                     78:         
                     79:             #print self.xsl
1.13      dwinter    80:             #< xsltproc.run(document)
1.4       dwinter    81:             tmp=xsltproc.run(document)
                     82:             
                     83:             self.result=tmp[0:]
                     84:             
1.3       dwinter    85:         
                     86:            except:
1.4       dwinter    87:                
                     88:                self.result="<html>error: %s %s<br>"%sys.exc_info()[0:2]
                     89:                self.result+=xml
                     90:                self.result+="</html>"
1.2       dwinter    91:         
1.4       dwinter    92:         
                     93:     
1.2       dwinter    94:     def getResult(self):
1.4       dwinter    95: 
1.2       dwinter    96:         return self.result
                     97: 
1.9       dwinter    98: from ZODB import DB
                     99: from ZODB.FileStorage import FileStorage
                    100: class ECHO_cache:
                    101:     def __init__(self):
                    102:         """init the storage"""
                    103:         self.storage=FileStorage("/var/tmp/echo_cache.fs")
                    104:         self.db=DB(self.storage)    
                    105:         self.connection=self.db.open()
                    106:         self.root=self.connection.root()
                    107:     
                    108:     def deleteObject(self,name,pn=None):
                    109:         """delete an object from cache"""
                    110:         fileStore=self.root.get(name,None)
                    111:         if fileStore:
                    112:             if not pn:
                    113:                 del(self.root[name])
                    114:             else:
                    115:                 if self.root[name].get(pn,None):
                    116:                     del(self.root[name][pn])
                    117:                     
                    118:         
                    119:     def storeObject(self,name,pn,object):
                    120:         """store an object"""
                    121:         
                    122:         if not self.root.get(name,None):
                    123:             self.root[name]={}
                    124:             
                    125: 
                    126:         #following is necessary to make clear that object has really changed for ZODB
                    127:         tmp=self.root[name]
                    128:         tmp[pn]=object
                    129:         self.root[name]=tmp
                    130:         transaction.get().commit()
                    131:         return True
                    132:    
                    133:     def retrieveObject(self,name,pn):
                    134:         """retrieve it"""
                    135:         
                    136:         fileStore=self.root.get(name,None)
                    137:         if not fileStore:
                    138:             return None
                    139:         else:
1.12      dwinter   140:            
1.9       dwinter   141:             return self.root[name].get(pn,None)
                    142:         
1.2       dwinter   143: 
1.8       dwinter   144: class ECHO_xslt(ECHO_pageTemplate,ECHO_language.ECHO_language):
1.1       dwinter   145:     """ECHO_xslt classe"""
                    146: 
                    147:     meta_type="ECHO_xslt"
1.4       dwinter   148:     
1.10      dwinter   149:     cache=ECHO_cache() # cache for analysed pages
                    150:     caching="yes"
                    151:     
                    152:     appendQueryString=True # add query string to the cgiUrl can be changed with addChanges
                    153:     
                    154:     passURL=False #use url from querystring parameter fn to retrieve the text and not the url in cgi-url can be changed with addChanges
                    155:         
1.9       dwinter   156:     
1.4       dwinter   157:     results={}
                    158:     manage_options=ECHO_pageTemplate.manage_options+(
                    159:      {'label':'Change xml-ressource','action':'change_ECHO_xsltForm'},)
                    160:      
1.2       dwinter   161:     def refreshTxt(self):
                    162:         """txt fuer refresh"""
                    163:         return """ 2;url=%s?repeat=%s """%(self.absolute_url(),self.threadName)
1.1       dwinter   164: 
                    165:     def xslt(self):
1.2       dwinter   166:         """xslt"""
1.1       dwinter   167: 
1.4       dwinter   168:         return self.document_src()
1.1       dwinter   169: 
1.4       dwinter   170:     def change_ECHO_xsltForm(self):
                    171:         """change form"""
                    172:         pt=zptFile(self, 'zpt/ChangeECHO_xsltForm.zpt')
                    173:         return pt()
                    174: 
1.10      dwinter   175:     def addChanges(self,cgiUrl,appendQueryString=False,passURL=False,caching=False,RESPONSE=None):
1.4       dwinter   176:         """change the xslt, ueberschriebt addChanges in ECHO_PageTemplate"""
1.10      dwinter   177:     
1.4       dwinter   178:         if urlparse.urlparse(cgiUrl)[0]=="":#relative url in absolute
                    179:             self.cgiUrl=urlparse.urljoin(self.absolute_url(), cgiUrl)
                    180:         else:
                    181:             self.cgiUrl=cgiUrl
1.10      dwinter   182:         
                    183:         if appendQueryString: 
                    184:             self.appendQueryString=True
                    185:         else:
                    186:             self.appendQueryString=False
                    187:         
                    188:         if passURL:
                    189:             self.passURL=True
                    190:         else:
                    191:             self.passURL=False
                    192:        
                    193:         if caching:
                    194:             self.caching="yes"
                    195:         else:
                    196:             self.caching="No"
                    197:         
                    198: 
1.4       dwinter   199:         if RESPONSE:
                    200:             RESPONSE.redirect("manage_main")
1.2       dwinter   201:         
                    202:     def index_html(self,repeat=None):
                    203:         """standard ausgabe"""
1.4       dwinter   204: 
1.2       dwinter   205:         threadName=repeat
                    206:         
                    207:         if not threadName or threadName=="":
1.4       dwinter   208:             
                    209:             #abwaertskompatibilitŠt mit altem nivht konfigurierbaren prototypen
                    210:             
                    211:             if getattr(self,'cgiUrl','')=='':
                    212:                 self.cgiUrl="http://medea.mpiwg-berlin.mpg.de/cgi-bin/search/q1"
                    213:                 
1.6       dwinter   214:             qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING'])
1.2       dwinter   215:             xsl=self.absolute_url()+"/xslt"
1.4       dwinter   216:             self._v_xmltrans=getXML().__of__(self)
                    217:             #self._xmltrans.start()
                    218:             thread=Thread(target=self._v_xmltrans)
                    219:             thread.start()
                    220:             self._v_xmltrans.set(qs,xsl,None)
                    221:             self._v_xmltrans.run()
1.2       dwinter   222:             
                    223:             
                    224:             self.threadName=thread.getName()[0:]
                    225:             wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
                    226:             if wait_template:
                    227:                 return wait_template[0][1]()
                    228:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self)
                    229:             return pt()
1.4       dwinter   230:             #_v_xmltrans.run()
1.2       dwinter   231:         
                    232:         else:
                    233:             
1.4       dwinter   234:             if (self._v_xmltrans.getResult()==None):
1.3       dwinter   235: 
1.5       dwinter   236:                 wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
                    237:                 if wait_template:
                    238:                         return wait_template[0][1]()
1.2       dwinter   239:                 
                    240:                 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self)
                    241:                 return pt()
                    242:             else:
1.4       dwinter   243:                 return self._v_xmltrans.getResult()
1.2       dwinter   244: 
                    245:     
1.10      dwinter   246:     def getText(self):
                    247:         """print nur den text"""
                    248:         qs,baseUri=self.getTextInput()
                    249:         self.REQUEST.RESPONSE.redirect(qs)
1.9       dwinter   250: 
                    251:     def deleteCache(self):
                    252:         """deletefrom cache"""
                    253:         fn=self.REQUEST['fn']
                    254:         self.cache.deleteObject(fn)
                    255:         
1.13      dwinter   256:     
                    257:     def createLinkNode(self,url,dom):
                    258:         """createa a link node"""
                    259:         txt=dom.createTextNode("<XMLLink>")
                    260:         node=dom.createElementNS("http://test.de","a")
                    261:         node.setAttributeNS("http://test.de","href",url)
                    262:         node.appendChild(txt)
                    263:         return node
                    264:       
                    265:     def forwardLink(self,linkid,url,type="target",RESPONSE=None):
                    266:         """forward to link"""
                    267:         if RESPONSE:
                    268:             RESPONSE.redirect(self.getLink(linkid,url,type=type))
                    269:             
                    270:         else:
                    271:             return self.getLink(linkid,url,type=type)
                    272:     def getLink(self,linkid,url,type="target"):
                    273:         """get target for linkid"""
                    274:         dom=NonvalidatingReader.parseUri(url)
                    275:         
                    276:         masterurl=dom.xpath("//mpiwg:masterurl/@ref",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
                    277:         slaveurl=dom.xpath("//mpiwg:slaveurl/@ref",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
                    278:         
                    279:         #check now if there are in the link file
                    280:      
                    281:         xp="//mpiwg:link[@id='%s']"%linkid
                    282:         
                    283:         if type=="target":
                    284:             for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
                    285:                 fn=link.xpath("mpiwg:target/@filename",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
1.14    ! dwinter   286:                 
        !           287:                 if urlparse.urlparse(urllib.unquote(fn))[0]=="http": # fn ist eine url
        !           288:                     return urllib.unquote(fn)  # dann gibt diese zurueck 
        !           289:                 
1.13      dwinter   290:                 ref=link.xpath("mpiwg:target/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
                    291:                 
                    292:                 ref2=link.xpath("mpiwg:target/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
                    293:                 selectionNodeIndex=link.xpath("mpiwg:target/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
1.14    ! dwinter   294:                   
        !           295:               
        !           296:                 
        !           297:                 lstr=slaveurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'target')
        !           298:                 lstr+="&_links="+urllib.quote(url)
1.13      dwinter   299:                 
                    300:         else:
                    301:             for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
                    302:                 fn=link.xpath("mpiwg:source/@filename",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
1.14    ! dwinter   303:                 if urlparse.urlparse(urllib.unquote(fn))[0]=="http": # fn ist eine url
        !           304:                     return urllib.unquote(fn)  # dann gibt diese zurueck 
        !           305:                 
1.13      dwinter   306:                 ref=link.xpath("mpiwg:source/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
                    307:                 
                    308:                 ref2=link.xpath("mpiwg:source/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
                    309:                 selectionNodeIndex=link.xpath("mpiwg:source/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
                    310:                              
1.14    ! dwinter   311:                 lstr=masterurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'source')
        !           312:                 lstr+="&_links="+urllib.quote(url)
1.13      dwinter   313:         return lstr
                    314:    
1.14    ! dwinter   315:     def addLinksUrl(self,txt,url):
        !           316:         """add reference to links to  url"""
        !           317:         ret=[]
        !           318:         dom=NonvalidatingReader.parseUri(url)
        !           319:         textDom=NonvalidatingReader.parseString(txt)
        !           320: 
        !           321:         #find ids in txt
        !           322:         ids=textDom.xpath("//*[@id]")
        !           323:         
        !           324:         for textid in ids:
        !           325:             xp="//mpiwg:link[mpiwg:source/@refid='%s']"%textid.xpath("@id")[0].value
        !           326:             for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
        !           327:                 ref2=link.xpath("mpiwg:source/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
        !           328:                 selectionNodeIndex=link.xpath("mpiwg:source/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
        !           329:                 linkid=link.xpath("@id")[0].value         
        !           330:                 ret.append('%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'source'))
        !           331:            
        !           332:             xp="//mpiwg:link[mpiwg:target/@refid='%s']"%textid.xpath("@id")[0].value
        !           333:             for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
        !           334:                 ref2=link.xpath("mpiwg:target/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
        !           335:                 selectionNodeIndex=link.xpath("mpiwg:target/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
        !           336:                 linkid=link.xpath("@id")[0].value         
        !           337:                 ret.append('%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'target'))
        !           338:            
        !           339:            
        !           340:         return ret
        !           341:           
1.13      dwinter   342:     def addLinks(self,txt,url="http://127.0.0.1:8080/HFQP/linkCreator/getCollectionXML?collection=commentary2"):
                    343:         """add links to a page from xml linkfile"""
                    344:         
                    345:         dom=NonvalidatingReader.parseUri(url)
                    346:         textDom=NonvalidatingReader.parseString(txt)
                    347: 
                    348:         #find ids in txt
                    349:         ids=textDom.xpath("//*[@id]")
                    350:         masterurl=dom.xpath("//mpiwg:masterurl/@ref",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
                    351:         slaveurl=dom.xpath("//mpiwg:slaveurl/@ref",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
                    352:         
                    353:         #check now if there are in the link file
                    354:         for textid in ids:
                    355:             xp="//mpiwg:link[mpiwg:source/@refid='%s']"%textid.xpath("@id")[0].value
                    356:             for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
                    357:                 fn=link.xpath("mpiwg:target/@filename",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
1.14    ! dwinter   358:                 print fn
        !           359:                 if urlparse.urlparse(urllib.unquote(fn))[0]=="http": # fn ist eine url
        !           360:                     lstr=urllib.unquote(fn)  # dann gibt diese zurueck 
        !           361:                 else:
        !           362:                     try:
        !           363:                         ref=link.xpath("mpiwg:target/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
        !           364:                     
        !           365:                         ref2=link.xpath("mpiwg:target/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
        !           366:                         selectionNodeIndex=link.xpath("mpiwg:target/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
        !           367:                         linkid=link.xpath("@id")[0].value         
        !           368:                         lstr=slaveurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'target')
        !           369:                         lstr+="&_links="+urllib.quote(url)
        !           370:                     except:
        !           371:                         lstr=""
1.13      dwinter   372:                 node=self.createLinkNode(lstr,textDom)
                    373:                 textid.parentNode.insertBefore(node,textid)
                    374:               
                    375:           
                    376:             xp="//mpiwg:link[mpiwg:target/@refid='%s']"%textid.xpath("@id")[0].value
                    377:             for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
                    378:                 fn=link.xpath("mpiwg:source/@filename",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
1.14    ! dwinter   379:                 if urlparse.urlparse(urllib.unquote(fn))[0]=="http": # fn ist eine url
        !           380:                     lstr=urllib.unquote(fn)  # dann gibt diese zurueck 
        !           381:                 else:
1.13      dwinter   382:                 
1.14    ! dwinter   383:                     ref=link.xpath("mpiwg:source/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
        !           384:                     
        !           385:                     ref2=link.xpath("mpiwg:source/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
        !           386:                     selectionNodeIndex=link.xpath("mpiwg:source/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
        !           387:                     linkid=link.xpath("@id")[0].value                    
        !           388:                     lstr=masterurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,"source")
        !           389:                     lstr+="&_links="+urllib.quote(url)
        !           390:                     
1.13      dwinter   391:                 node=self.createLinkNode(lstr,textDom)
                    392:                 textid.parentNode.insertBefore(node,textid)
                    393:               
                    394:             
                    395:         
                    396:         strio = StringIO()
                    397:         PrettyPrint(textDom,strio) 
                    398:         xmlstr = strio.getvalue()
                    399:         
                    400:         return xmlstr
                    401: 
                    402:             
                    403:         
1.14    ! dwinter   404:     def getPageLex(self,_pn="1",_id=None,_caching=None,_links=None,_showall="no"):
1.9       dwinter   405:         """getpage mit lexikalischer analyse und xslt transform
                    406:         if _caching=yes dann wird die lwxikalisch analysierte seite in einem cache abgespeichert
                    407:         """
1.14    ! dwinter   408:         def encode(hash):
        !           409:             ret=[]
        !           410:             for x in hash.keys():
        !           411:                 value=hash[x]
        !           412:                 
        !           413:                 if type(value) is ListType:
        !           414:                     for z in value:
        !           415:                         ret.append("%s=%s"%(x,z))
        !           416:                 else:
        !           417:                     ret.append("%s=%s"%(x,value))
        !           418:             return "&".join(ret)
        !           419:                     
        !           420:                         
        !           421:             
1.10      dwinter   422:         if not _caching:
                    423:             _caching=self.caching
                    424:             
1.9       dwinter   425:         fn=self.REQUEST['fn']
                    426: 
1.11      dwinter   427:         if not _id:
1.12      dwinter   428:            
1.11      dwinter   429:             fromCache=self.cache.retrieveObject(fn,_pn)
                    430:      
                    431:             if fromCache and _caching=="yes":
                    432:               
                    433:                 txt = fromCache
                    434:             else:
                    435:                 txt=self.tagLex(nr=_pn)   
1.13      dwinter   436:               
1.11      dwinter   437:                 self.cache.storeObject(fn,_pn,txt[0:])
                    438:             
1.9       dwinter   439:         else:
1.11      dwinter   440:            txt=self.tagLex(id=_id)
1.13      dwinter   441:       
1.14    ! dwinter   442:         if _showall=="yes":
        !           443:            params=cgi.parse_qs(self.REQUEST['QUERY_STRING'])
        !           444:            
        !           445:            params['_pagelink']=self.addLinksUrl(txt,url=_links)
        !           446:            params['_showall']='no'
        !           447:           
        !           448:            print self.absolute_url()+"?"+encode(params)
        !           449:            self.REQUEST.RESPONSE.redirect(self.absolute_url()+"/getPageLex?"+encode(params))
        !           450:            
        !           451:            
1.9       dwinter   452:         xsl=self.xslt()
                    453:         
                    454:         xsltproc=Processor()
                    455:         if type(txt)==UnicodeType:
                    456:             document = InputSource.DefaultFactory.fromString(txt.encode('utf-8'))
                    457:         else:
                    458:             document = InputSource.DefaultFactory.fromString(txt)
                    459:         stylesheet = InputSource.DefaultFactory.fromString(xsl)
                    460:         xsltproc.appendStylesheet(stylesheet)
                    461:         tmp=xsltproc.run(document)
1.13      dwinter   462:         
                    463:         if _links:
                    464:             _links=urllib.unquote(_links)
                    465:             tmp=self.addLinks(tmp,url=_links)
                    466:             
1.11      dwinter   467:         #bugfix for digilib images which doesn't accept &amp;
                    468:         tmp=tmp.replace("&amp;","&")
1.12      dwinter   469:         
                    470: 
1.9       dwinter   471:         return tmp[0:]
                    472:             
1.10      dwinter   473:     def getTextInput(self):
                    474:         """get the text
                    475:         wie der text geholt wird liegt an der konfiguration,
                    476:         is appendQueryString gesetzt, dann wir jeweils der Querystring an vorgebenen url gesetzt, erwartet wird fn=
                    477:         fŸr den Pfad, is passURL gesetzt, dann wird falls fn= eine vollstŠndige url enthŠlt, diese anstelle der in cgiurl definierten genommen.
                    478:         """
                    479:         
                    480:         if getattr(self,'passURL',False) and self.REQUEST.has_key('fn') and (urlparse.urlparse(self.REQUEST['fn'])[0]=='http'):
                    481:             qs=self.REQUEST['fn']
                    482:             baseUri=qs
                    483:         elif getattr(self,'pappendQueryString',True):
                    484:             qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING'])
                    485:             baseUri=self.cgiUrl
                    486:         else:
                    487:             qs="%s"%(self.cgiUrl)
                    488:             baseUri=self.cgiUrl
                    489:         
                    490:         #fact= InputSource.DefaultFactory.fromUri(qs)
                    491:         return qs,baseUri
                    492:         #return InputSource.InputSource(fact)
                    493:         #xmlt=urllib.urlopen(qs).read()
                    494:         
1.11      dwinter   495:     def getPage(self,_pn="-1",_id=None,REQUEST=None,_caching=None):
1.6       dwinter   496:         """get a page from an xml"""
1.10      dwinter   497:         
                    498:         if not _caching:
                    499:             _caching=self.caching
                    500:             
1.7       dwinter   501:         pn=int(_pn)-1
1.11      dwinter   502:         if pn<0 and (not _id):
1.7       dwinter   503:             if REQUEST:
                    504:                 return "Sorry, pagenumbers have to be greater than 0"
                    505:             else:
                    506:                 return None
1.10      dwinter   507:        
                    508:         xmlt,self.baseUri=self.getTextInput()
1.9       dwinter   509:         
1.10      dwinter   510:         #get the text from cache, if existing
                    511:         fromCache=self.cache.retrieveObject(self.baseUri,"-1")
                    512:         if fromCache and _caching=="yes":
                    513:           
                    514:             txt = fromCache
                    515:         else:
                    516: 
                    517:             txt=urllib.urlopen(xmlt).read()
                    518:             
                    519:             self.cache.storeObject(self.baseUri,"-1",txt)
1.9       dwinter   520:         
1.12      dwinter   521:         
1.10      dwinter   522:         dom=NonvalidatingReader.parseString(txt,self.baseUri)
1.9       dwinter   523:         
1.10      dwinter   524:         #pb should have a namespache
1.11      dwinter   525: 
                    526:         pbs=dom.xpath("//mpiwg:pb",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})
1.9       dwinter   527:         
1.10      dwinter   528:         if len(pbs)==0: # versuche nochmal ohne
                    529:             pbs=dom.xpath("//pb")
                    530: 
1.11      dwinter   531:         if _id:
                    532:             #suche wieviele pb for der id
                    533:             
                    534:             
                    535:             idpb=dom.xpath("//*[@id='%s']/preceding::node()/mpiwg:pb"%_id,explicitNss={'html':'http://test.de','mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})
                    536:             if len(idpb)==0:
                    537:                 idpb=dom.xpath("//*[@id='%s']/preceding::node()/pb"%_id)
                    538:          
                    539:             if len(idpb)==0:
                    540:                         k=0
                    541:                         for node in dom.xpath("//*[@id='%s']//preceding::node()"%_id,explicitNss={'html':'http://test.de','mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
                    542:                             if getattr(node,'tagName',"")=="mpiwg:pb":
                    543:                                 k+=1
                    544:             else:
                    545:                 k=len(idpb)
                    546:             pn=k-1 #-1 wegen Seitenzahlzaehlung startet mit 0
                    547:             
1.7       dwinter   548:         if pn > len(pbs):
                    549:             if REQUEST:
1.10      dwinter   550:                 return "Sorry, pagenumber %s does not exit"%(pn+1)
1.7       dwinter   551:             else:
                    552:                 return None
                    553:             
1.6       dwinter   554:         beginNode=pbs[pn] #take the n'th pb
1.7       dwinter   555: 
                    556:         if not (pn==len(pbs)-1): # nicht die letzte Seite
                    557:             endNode=pbs[pn+1]
                    558:         else:
                    559:             endNode=None
                    560:         
                    561:         deleteNodes=beginNode.xpath('preceding::node()')
                    562:         if endNode:
                    563:             deleteNodes+=endNode.xpath('following::node()')
                    564:         for node in deleteNodes:
                    565:             try:
                    566:                 parent=node.xpath("..")
                    567:            
                    568:                 if parent:
                    569:                     parent[0].removeChild(node)
                    570:             except:
                    571:                 zLOG.LOG("ECHO_Resource (getAccessRightMD)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
                    572:         strio = StringIO()
                    573:         PrettyPrint(dom,strio) 
                    574:         xmlstr = strio.getvalue()
1.10      dwinter   575:         
1.7       dwinter   576:         return xmlstr
1.6       dwinter   577: 
                    578: 
                    579:         
1.1       dwinter   580: def manage_addECHO_xsltForm(self):
                    581:     """Form for adding"""
                    582:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_xslt.zpt')).__of__(self)
                    583:     return pt()
                    584: 
                    585: from urllib import quote
                    586: 
                    587: 
1.4       dwinter   588: def manage_addECHO_xslt(self, id, label, weight= 0,contentType=0,title=None, text=None, cgiUrl=None,
1.1       dwinter   589:                            REQUEST=None, submit=None):
                    590:     "Add a Page Template with optional file content."
                    591: 
                    592:     
                    593:     id = str(id)
                    594:     if REQUEST is None:
                    595:         self._setObject(id, ECHO_xslt(id, text))
                    596:         ob = getattr(self, id)
                    597:         setattr(ob,'weight',weight)
                    598:         setattr(ob,'label',label)
                    599:         setattr(ob,'contentType',contentType)
                    600:         if title:
                    601:             ob.pt_setTitle(title)
                    602:         return ob
1.4       dwinter   603:         setattr(ob,'cgiUrl',cgiUrl)
1.1       dwinter   604:     else:
                    605:         file = REQUEST.form.get('file')
                    606:         headers = getattr(file, 'headers', None)
                    607:         if headers is None or not file.filename:
                    608:             zpt = ECHO_xslt(id)
                    609:         else:
                    610:             zpt = ECHO_xslt(id, file, headers.get('contentType'))
                    611: 
                    612:         self._setObject(id, zpt)
                    613:         ob = getattr(self, id)
                    614:         setattr(ob,'weight',weight)
                    615:         setattr(ob,'label',label)
1.4       dwinter   616:         setattr(ob,'cgiUrl',cgiUrl)
1.1       dwinter   617:         if title:
                    618:             ob.pt_setTitle(title)
                    619:         
                    620:         try:
                    621:             u = self.DestinationURL()
                    622:         except AttributeError:
                    623:             u = REQUEST['URL1']
                    624: 
                    625:         if submit == " Add and Edit ":
                    626:             u = "%s/%s" % (u, quote(id))
                    627:         REQUEST.RESPONSE.redirect(u+'/manage_main')
                    628:     return ''
                    629: 

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