changeset 22:b139f9937e97

preliminary version 0.2 - lots of stuff rewritten - new template system - still no access control
author casties
date Thu, 06 Apr 2006 19:13:43 +0200
parents 0af46e75de3c
children a6d39ef1c7cc
files documentViewer.py version.txt zpt/documentViewer_template.zpt zpt/image_main.zpt zpt/thumbs.zpt zpt/thumbs_main.zpt
diffstat 6 files changed, 262 insertions(+), 158 deletions(-) [+]
line wrap: on
line diff
--- a/documentViewer.py	Thu Apr 06 19:13:43 2006 +0200
+++ b/documentViewer.py	Thu Apr 06 19:13:43 2006 +0200
@@ -16,6 +16,7 @@
 import os.path
 import cgi
 import urllib
+import zLOG
 
 def getTextFromNode(nodename):
     nodelist=nodename.childNodes
@@ -36,102 +37,87 @@
     
 def getParamFromDigilib(path,param):
     """gibt param von dlInfo aus"""
-    imageUrl=genericDigilib+"/dlInfo-xml.jsp?fn="+path
+    imageUrl=genericDigilib+"/dirInfo-xml.jsp?mo=dir&fn="+path
 
+    zLOG.LOG("documentViewer (getparamfromdigilib)", zLOG.INFO, "dirInfo (%s) from %s"%(param,imageUrl))
+    
     try:
         dom = NonvalidatingReader.parseUri(imageUrl)
     except:
         return None
     
-    
-    params=dom.xpath("//document-parameters/parameter[@name='%s']/@value"%param)
+    params=dom.xpath("//dir/%s"%param)
+    zLOG.LOG("documentViewer (getparamfromdigilib)", zLOG.INFO, "dirInfo:%s"%params)
     
     if params:
-        return params[0].value
-    
-def parseUrlTextTool(url):
-   """parse index meta"""
-    
-   try:
-       dom = NonvalidatingReader.parseUri(url)
-   except:
-       zLOG.LOG("documentViewer (parseUrlTexttool)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
-       return (None,None,None)
-   
-   archivePaths=dom.xpath("//resource/archive-path")
-   
-   if archivePaths and (len(archivePaths)>0):
-       archivePath=getTextFromNode(archivePaths[0])
-   else:
-       archivePath=None
-   
+        return getTextFromNode(params[0])
+
     
-   images=dom.xpath("//texttool/image")
-   
-   if images and (len(images)>0):
-       image=getTextFromNode(images[0])
-   else:
-       image=None
-       
-   if image and archivePath:
-       image=os.path.join(archivePath,image)
-       image=image.replace("/mpiwg/online",'')
-       pt=getParamFromDigilib(image,'pt')
-
-   else:
-       image=None
-       
-   viewerUrls=dom.xpath("//texttool/digiliburlprefix")
-   
-   if viewerUrls and (len(viewerUrls)>0):
-       viewerUrl=getTextFromNode(viewerUrls[0])
-   else:
-       viewerUrl=None
-   
-   
-   textUrls=dom.xpath("//texttool/text")
-   
-   if textUrls and (len(textUrls)>0):
-       textUrl=getTextFromNode(textUrls[0])
-   else:
-       textUrl=None
-   return viewerUrl,(image,pt),textUrl
 
 
-class documentViewer(ZopePageTemplate):
+##
+## documentViewer class
+##
+class documentViewer(Folder):
     """document viewer"""
 
     meta_type="Document viewer"
     
     security=ClassSecurityInfo()
-    manage_options=ZopePageTemplate.manage_options+(
+    manage_options=Folder.manage_options+(
         {'label':'main config','action':'changeDocumentViewerForm'},
         )
 
-    _default_content_fn = os.path.join(package_home(globals()),'zpt','documentViewer_template.zpt')
+    # templates and forms
+    viewer_main = PageTemplateFile('zpt/viewer_main', globals())
+    thumbs_main = PageTemplateFile('zpt/thumbs_main', globals())
+    image_main = PageTemplateFile('zpt/image_main', globals())
+    head_main = PageTemplateFile('zpt/head_main', globals())
+    docuviewer_css = PageTemplateFile('css/docuviewer.css', globals())
+
+    security.declareProtected('View management screens','changeDocumentViewerForm')    
+    changeDocumentViewerForm = PageTemplateFile('zpt/changeDocumentViewer', globals())
+
     
-    def __init__(self,id,imageViewerUrl,title=""):
+    def __init__(self,id,imageViewerUrl,title="",digilibBaseUrl=None):
         """init document viewer"""
         self.id=id
         self.title=title
         self.imageViewerUrl=imageViewerUrl
+        self.digilibBaseUrl = digilibBaseUrl
+        if not self.digilibBaseUrl:
+            self.digilibBaseUrl = self.findDigilibUrl()
+        # add template folder so we can always use template.something
+        self.manage_addFolder('template')
+
+
+    security.declareProtected('View','index_html')
+    def index_html(self,mode,url,start=0,pn=1):
+        '''
+        view it
+        @param mode: defines which type of document is behind url
+        @param url: url which contains display information
+        '''
         
-    security.declareProtected('View management screens','changeDocumentViewerForm')    
-    def changeDocumentViewerForm(self):
-        """change it"""
-        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeDocumentViewer.zpt')).__of__(self)
-        return pt()
+        zLOG.LOG("documentViewer (index)", zLOG.INFO, "mode: %s url:%s start:%s pn:%s"%(mode,url,start,pn))
+        print "dlbaseurl:", self.digilibBaseUrl
+        
+        if not hasattr(self, 'template'):
+            # create template folder if it doesn't exist
+            print "no template folder -- creating"
+            self.manage_addFolder('template')
+            
+        if not self.digilibBaseUrl:
+            self.digilibBaseUrl = self.findDigilibUrl() or "http://nausikaa.mpiwg-berlin.mpg.de/digitallibrary"
+            
+        print "dlbaseurl:", self.digilibBaseUrl
+
+        docinfo = self.getDocinfo(mode=mode, url=url)
+        pageinfo = self.getPageinfo(start=start,current=pn)
+        pt = getattr(self.template, 'viewer_main')
+        return pt(docinfo=docinfo,pageinfo=pageinfo)
   
   
-    def changeDocumentViewer(self,imageViewerUrl,title="",RESPONSE=None):
-        """init document viewer"""
-        self.title=title
-        self.imageViewerUrl=imageViewerUrl
-        
-        if RESPONSE is not None:
-            RESPONSE.redirect('manage_main')
-    
-    
     def imageLink(self,nr):
         """link hinter den images"""
         paramsTmp=cgi.parse_qs(self.REQUEST['QUERY_STRING'])
@@ -143,7 +129,15 @@
         newUrl=self.REQUEST['URL']+"?"+urllib.urlencode(params)
         return newUrl
         
-        
+    def getStyle(self, idx, selected, style=""):
+        """returns a string with the given style + 'sel' if path == selected."""
+        #zLOG.LOG("documentViewer (getstyle)", zLOG.INFO, "idx: %s selected: %s style: %s"%(idx,selected,style))
+        if idx == selected:
+            return style + 'sel'
+        else:
+            return style    
+
+            
     def thumbruler(self,cols,rows,start,maximum):
         """ruler for thumbs"""
         ret=""
@@ -162,7 +156,7 @@
             ret+="""<a href="%s">prev</a>"""%newUrl
 
 
-        ret+="""<select onChange="location.href='%s&start='+this.options[this.selectedIndex].value" """%newUrlSelect
+        ret+="""<select onChange="location.href='%s&start='+this.options[this.selectedIndex].value">"""%newUrlSelect
         nr,rest=divmod(maximum,cols*rows)
         if rest > 0:
             nr+=1
@@ -182,37 +176,26 @@
             ret+="""<a href="%s">next</a>"""%newUrl
         
         return ret
+    
         
-    def textToolThumb(self,url,start=0):
-        """understands the texttool format
-        @param url: url to index.meta with texttool tag
-        """
-        (viewerUrl,imagepath,textpath)=parseUrlTextTool(url)
         
-        imageUrl=genericDigilib+"/servlet/Scaler?fn=%s"%imagepath[0]
-        
-        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbs.zpt')).__of__(self)
-        return pt(imageUrl=imageUrl,pt=imagepath[1],start=start)
-    
-    def imagePathThumb(self,path,start=0):
-        """path ist the path to the images it is assumes that the index.meta file is one level higher."""
+    def getBibinfoFromIndexMeta(self,path,docinfo=None,dom=None):
+        """gets bibliographical info from the index.meta file at url or given by dom"""
+        zLOG.LOG("documentViewer (getbibinfofromindexmeta)", zLOG.INFO,"path: %s"%(path))
         
-        path=path.replace("/mpiwg/online","")
-        pt=getParamFromDigilib(path,'pt')
-        imageUrl=genericDigilib+"/servlet/Scaler?fn=%s"%path
+        if docinfo is None:
+            docinfo = {}
+            
+        metaData=self.metadata.main.meta.bib
+        if dom is None:
+            server="http://nausikaa.mpiwg-berlin.mpg.de/digitallibrary/servlet/Texter?fn="
+            path="/".join(path.split("/")[0:-1])
+            metaUrl=server+path+"/index.meta"
+            try:
+                dom = NonvalidatingReader.parseUri(metaUrl)
+            except:
+                return docinfo
         
-        pageT=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbs.zpt')).__of__(self)
-        return pageT(imageUrl=imageUrl,pt=pt,start=start)
-    
-    def headerFromIndexMeta(self,path):
-        """gibt header from index meta out"""
-        
-        metaData=self.metadata.main.meta.bib
-        server="http://foxridge.mpiwg-berlin.mpg.de"
-        path="/".join(path.split("/")[0:-1])
-        metaUrl=server+path+"/index.meta"
-        
-        dom = NonvalidatingReader.parseUri(metaUrl)
         type=dom.xpath("//bib/@type")
         if type and (len(type)>0):
             type=type[0].value
@@ -220,13 +203,109 @@
             type="generic"
         type=type.replace("-"," ")# wrong typesiin index meta "-" instead of " "
         hash=metaData.generateMappingForType(type)
+
+        docinfo['author']=getTextFromNode(dom.xpath("//bib/%s"%hash['author'][0])[0])
+        docinfo['title']=getTextFromNode(dom.xpath("//bib/%s"%hash['title'][0])[0])
+        docinfo['year']=getTextFromNode(dom.xpath("//bib/%s"%hash['year'][0])[0])
+        
+        return docinfo
+
+        
+    def getDocinfoFromTextTool(self,url,docinfo=None):
+       """parse texttool tag in index meta"""
+       zLOG.LOG("documentViewer (getdocinfofromtexttool)", zLOG.INFO,"url: %s"%(url))
+       if docinfo is None:
+           docinfo = {}
+           
+       try:
+           dom = NonvalidatingReader.parseUri(url)
+       except:
+           zLOG.LOG("documentViewer (parseUrlTexttool)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
+           return docinfo
+       
+       archivePaths=dom.xpath("//resource/archive-path")
+       
+       if archivePaths and (len(archivePaths)>0):
+           archivePath=getTextFromNode(archivePaths[0])
+       else:
+           archivePath=None
+       
+       images=dom.xpath("//texttool/image")
+       
+       if images and (len(images)>0):
+           image=getTextFromNode(images[0])
+       else:
+           image=None
+           
+       if image and archivePath:
+           image=os.path.join(archivePath,image)
+           image=image.replace("/mpiwg/online",'')
+           pt=getParamFromDigilib(image,'size')
+           docinfo['imagePath'] = image
+           docinfo['numberOfPages'] = pt
+           
+       viewerUrls=dom.xpath("//texttool/digiliburlprefix")
+       
+       if viewerUrls and (len(viewerUrls)>0):
+           viewerUrl=getTextFromNode(viewerUrls[0])
+           docinfo['imageURL'] = viewerURL
+                  
+       textUrls=dom.xpath("//texttool/text")
+       
+       if textUrls and (len(textUrls)>0):
+           textUrl=getTextFromNode(textUrls[0])
+           docinfo['textURL'] = textURL
+                     
+       docinfo = self.getBibinfoFromIndexMeta(url,docinfo=docinfo,dom=dom)
+       return docinfo
+   
+
+    def getDocinfoFromImagePath(self,path,docinfo=None):
+        """path ist the path to the images it assumes that the index.meta file is one level higher."""
+        zLOG.LOG("documentViewer (getdocinfofromimagepath)", zLOG.INFO,"path: %s"%(path))
+        if docinfo is None:
+            docinfo = {}
+        docinfo['imagePath'] = path
+        path=path.replace("/mpiwg/online","")
+        pt=getParamFromDigilib(path,'size')
+        docinfo['numberOfPages'] = pt
+        imageUrl=genericDigilib+"/servlet/Scaler?fn=%s"%path
+        docinfo['imageURL'] = imageUrl
+        
+        docinfo = self.getBibinfoFromIndexMeta(path,docinfo=docinfo)
+        return docinfo
     
-        author=getTextFromNode(dom.xpath("//bib/%s"%hash['author'][0])[0])
-        title=getTextFromNode(dom.xpath("//bib/%s"%hash['title'][0])[0])
-        year=getTextFromNode(dom.xpath("//bib/%s"%hash['year'][0])[0])
+    
+    def getDocinfo(self, mode, url):
+        """returns docinfo depending on mode"""
+        zLOG.LOG("documentViewer (getdocinfo)", zLOG.INFO,"mode: %s, url: %s"%(mode,url))
+        # look for cached docinfo in session
+        if self.REQUEST.SESSION.has_key('docinfo'):
+            docinfo = self.REQUEST.SESSION['docinfo']
+            # check if its still current
+            if docinfo is not None and docinfo.get('mode') == mode and docinfo.get('url') == url:
+                zLOG.LOG("documentViewer (getdocinfo)", zLOG.INFO,"docinfo in session: %s"%docinfo)
+                return docinfo
+        # new docinfo
+        docinfo = {'mode': mode, 'url': url}
+        if mode=="texttool": #index.meta with texttool information
+            docinfo = self.getDocinfoFromTextTool(url, docinfo=docinfo)
+        elif mode=="imagepath":
+            docinfo = self.getDocinfoFromImagePath(url, docinfo=docinfo)
+        else:
+            zLOG.LOG("documentViewer (getdocinfo)", zLOG.ERROR,"unknown mode!")
+        zLOG.LOG("documentViewer (getdocinfo)", zLOG.INFO,"docinfo: %s"%docinfo)
+        self.REQUEST.SESSION['docinfo'] = docinfo
+        return docinfo
         
-        return author,title,year
         
+    def getPageinfo(self, start, current):
+        """returns pageinfo with the given parameters"""
+        pageinfo = {}
+        pageinfo['start'] = start
+        pageinfo['current'] = current
+        return pageinfo
+                
     def text(self,mode,url,pn):
         """give text"""
         if mode=="texttool": #index.meta with texttool information
@@ -279,7 +358,8 @@
 #            PrettyPrint(x)
 #
 #        return list
-#    
+#
+
     def image(self,mode,url,pn):
         """give image out"""
         if mode=="texttool": #index.meta with texttool information
@@ -296,34 +376,32 @@
             return url
             
         
-    def thumbs(self,mode,url,start):
-        """give thumbs out"""
-        if mode=="texttool": #index.meta with texttool information
-            return self.textToolThumb(url,int(start))
-        elif mode=="imagepath":
-            return self.imagePathThumb(url,int(start))
+    def findDigilibUrl(self):
+        """try to get the digilib URL from zogilib"""
+        url = self.imageViewerUrl[:-1] + "/getScalerUrl"
+        try:
+            scaler = urlopen(url).read()
+            return scaler.replace("/servlet/Scaler?", "")
+        except:
+            return None
+    
+    def changeDocumentViewer(self,imageViewerUrl,title="",digilibBaseUrl=None,RESPONSE=None):
+        """init document viewer"""
+        self.title=title
+        self.imageViewerUrl=imageViewerUrl
+        self.digilibBaseUrl = digilibBaseUrl
         
-    security.declareProtected('View','index_html')
+        if RESPONSE is not None:
+            RESPONSE.redirect('manage_main')
     
     
-    def index_html(self,mode,url,start=0,pn=1):
-        '''
-        view it
-        @param mode: defines which type of document is behind url
-        @param url: url which contains display information
-        '''
-        
-    
-        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','documentViewer_template.zpt')).__of__(self)
-        return pt(mode=mode,url=url,start=start,pn=pn)
-        
         
         
 #    security.declareProtected('View management screens','renameImageForm')
 
 def manage_AddDocumentViewerForm(self):
     """add the viewer form"""
-    pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addDocumentViewer.zpt')).__of__(self)
+    pt=PageTemplateFile('zpt/addDocumentViewer', globals()).__of__(self)
     return pt()
   
 def manage_AddDocumentViewer(self,id,imageViewerUrl="",title="",RESPONSE=None):
@@ -333,4 +411,38 @@
     
     if RESPONSE is not None:
         RESPONSE.redirect('manage_main')
+
+
+##
+## DocumentViewerTemplate class
+##
+class DocumentViewerTemplate(ZopePageTemplate):
+    """Template for document viewer"""
+    meta_type="DocumentViewer Template"
+
+
+def manage_addDocumentViewerTemplateForm(self):
+    """Form for adding"""
+    pt=PageTemplateFile('zpt/addDocumentViewerTemplate', globals()).__of__(self)
+    return pt()
+
+def manage_addDocumentViewerTemplate(self, id='viewer_main', title=None, text=None,
+                           REQUEST=None, submit=None):
+    "Add a Page Template with optional file content."
+
+    self._setObject(id, DocumentViewerTemplate(id))
+    ob = getattr(self, id)
+    ob.pt_edit(open(os.path.join(package_home(globals()),'zpt/viewer_main.zpt')).read(),None)
+    if title:
+        ob.pt_setTitle(title)
+    try:
+        u = self.DestinationURL()
+    except AttributeError:
+        u = REQUEST['URL1']
+        
+    u = "%s/%s" % (u, urllib.quote(id))
+    REQUEST.RESPONSE.redirect(u+'/manage_main')
+    return ''
+
+
     
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/version.txt	Thu Apr 06 19:13:43 2006 +0200
@@ -0,0 +1,1 @@
+DocumentViewer 0.2.0a
\ No newline at end of file
--- a/zpt/documentViewer_template.zpt	Thu Apr 06 19:13:43 2006 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-<html>
-<body>
-<tal:x tal:define="header python:here.headerFromIndexMeta(options['url'])">
-
-<b tal:content="python:header[0]"/>,<i tal:content="python:header[1]"/>,<i tal:content="python:header[2]"/>
-</tal:x>
-<table border="0" width="100%" height="100%">
-	<tr>
-		<td width="30%" valign="top">
-		<tal:x replace="structure python:here.thumbs(options['mode'],options['url'],options['start'])"/>
-		</td>
-		<td width="70%">
-		 <iframe height="100%" width="100%" tal:attributes="src python:here.image(options['mode'],options['url'],options['pn'])"/>
-		</td>
-		</tr>
-		</table>
-</body>
-</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/image_main.zpt	Thu Apr 06 19:13:43 2006 +0200
@@ -0,0 +1,3 @@
+<tal:block tal:define="docinfo python:options['docinfo']; pageinfo options/pageinfo">
+ <iframe height="100%" width="100%" tal:attributes="src python:here.imageViewerUrl+'fn=%s&pn=%s'%(docinfo['imagePath'],pageinfo['current'])"/>
+</tal:block>
--- a/zpt/thumbs.zpt	Thu Apr 06 19:13:43 2006 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-<div tal:define="cols python:3; rows python:10; start python:options['start']; end python:min(start+cols*rows,int(options['pt'])); rowsCorrected python:divmod(end-start,cols);">
-<span tal:replace="structure python:here.thumbruler(cols,rows,start,int(options['pt']))"/>
-
-<table>
-	<tr tal:repeat="i python:range(rowsCorrected[0])">
-		<td tal:repeat="j python:range(start+i*cols,start+(i+1)*cols)">
-		<a tal:attributes="href python:here.imageLink(j+1)">
-		 <img tal:attributes="src python:options['imageUrl']+'&pn=%i&dw=100&dh=100'%(j+1)">
-		</a>
-		</td>
-	</tr>
-	<tr tal:condition="python:rowsCorrected[1]>0">
-		<td tal:repeat="j python:range(start+3*rowsCorrected[0],int(options['pt']))">
-		 <img tal:attributes="src python:options['imageUrl']+'&pn=%i&dw=100&dh=100'%(j+1)">
-		</td>
-	</tr>
-</table>
-</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/thumbs_main.zpt	Thu Apr 06 19:13:43 2006 +0200
@@ -0,0 +1,24 @@
+<div tal:define="cols python:2; rows python:10; docinfo python:options['docinfo']; pageinfo python:options['pageinfo']; start python:pageinfo['start']; end python:min(start+cols*rows,int(docinfo['numberOfPages'])); current pageinfo/current; rowsCorrected python:divmod(end-start,cols);">
+<span tal:replace="structure python:here.thumbruler(cols,rows,start,int(docinfo['numberOfPages']))"/>
+
+<table>
+	<tr tal:repeat="i python:range(rowsCorrected[0])">
+		<td align="center" tal:repeat="j python:range(start+i*cols,start+(i+1)*cols)" 
+			tal:attributes="class python:here.getStyle(str(j+1),current,'thumb')">
+		<a tal:attributes="href python:here.imageLink(j+1)">
+		 <img class="thumbimg" border="0" tal:attributes="src python:docinfo['imageURL']+'&pn=%i&dw=100&dh=100'%(j+1)"/>
+		 <div class="thumbcap" tal:content="python:(j+1)"/>
+		</a>
+		</td>
+	</tr>
+	<tr tal:condition="python:rowsCorrected[1]>0">
+		<td align="center" tal:repeat="j python:range(start+cols*rowsCorrected[0],int(docinfo['numberOfPages']))" 
+			tal:attributes="class python:here.getStyle(str(j+1),current,'thumb')">
+		<a tal:attributes="href python:here.imageLink(j+1)">
+		 <img class="thumbimg" border="0" tal:attributes="src python:docinfo['imageURL']+'&pn=%i&dw=100&dh=100'%(j+1)"/>
+		 <div class="thumbcap" tal:content="python:(j+1)"/>
+		 </a>
+		</td>
+	</tr>
+</table>
+</div>