diff documentViewer.py @ 526:3f375a048402

moved search and dict into separate layers. removed search_template. added tocMode=concordance. fixed bug with paging tocs.
author casties
date Tue, 10 Apr 2012 19:41:44 +0200
parents 70c3ae5eac7c
children f8a5f63eafc0
line wrap: on
line diff
--- a/documentViewer.py	Thu Apr 05 19:29:50 2012 +0200
+++ b/documentViewer.py	Tue Apr 10 19:41:44 2012 +0200
@@ -16,6 +16,7 @@
 import urlparse 
 import re
 import string
+import json
 
 from SrvTxtUtils import getInt, utf8ify, getText, getHttpData, refreshingImageFileIndexHtml
     
@@ -123,19 +124,22 @@
     viewer_images = PageTemplateFile('zpt/viewer_images', globals())
     viewer_index = PageTemplateFile('zpt/viewer_index', globals())
     # available layer types
-    availableLayers = {'text': ['dict','search','gis','annotator'],
-                       'xml': None, 'images': None, 'index': None}
+    builtinLayers = {'text': ['dict','search','gis','annotator'],
+                     'xml': None, 'images': None, 'index': None}
+    availableLayers = builtinLayers;
     # layer templates
+    layer_text_dict = PageTemplateFile('zpt/layer_text_dict', globals())
+    layer_text_search = PageTemplateFile('zpt/layer_text_search', globals())
     layer_text_annotator = PageTemplateFile('zpt/layer_text_annotator', globals())
     layer_text_gis = PageTemplateFile('zpt/layer_text_gis', globals())
     # toc templates
     toc_thumbs = PageTemplateFile('zpt/toc_thumbs', globals())
     toc_text = PageTemplateFile('zpt/toc_text', globals())
     toc_figures = PageTemplateFile('zpt/toc_figures', globals())
+    toc_concordance = PageTemplateFile('zpt/toc_concordance', globals())
     toc_none = PageTemplateFile('zpt/toc_none', globals())
     # other templates
     common_template = PageTemplateFile('zpt/common_template', globals())
-    search_template = PageTemplateFile('zpt/search_template', globals())
     info_xml = PageTemplateFile('zpt/info_xml', globals())
     docuviewer_css = ImageFile('css/docuviewer.css',globals())
     # make ImageFile better for development
@@ -408,6 +412,45 @@
         """link to documentviewer with parameter param set to val"""
         return self.getLink(param=param, val=val, params=params, baseUrl=baseUrl, paramSep='&', duplicates=duplicates)
     
+
+    def setAvailableLayers(self, newLayerString=None):
+        """sets availableLayers to newLayerString or tries to autodetect available layers.
+        assumes layer templates have the form layer_{m}_{l} for layer l in mode m.
+        newLayerString is parsed as JSON."""
+        if newLayerString is not None:
+            try:
+                layers = json.loads(newLayerString)
+                if 'text' in layers and 'images' in layers:
+                    self.availableLayers = layers
+                    return
+            except:
+                pass
+
+            logging.error("invalid layers=%s! autodetecting..."%repr(newLayerString))
+            
+        # start with builtin layers
+        self.availableLayers = self.builtinLayers.copy()
+        # add layers from templates
+        for t in self.template:
+            if t.startswith('layer_'):
+                try:
+                    (x, m, l) = t.split('_', 3)
+                    if m not in self.availableLayers:
+                        # mode m doesn't exist -> new list
+                        self.availableLayers[m] = [l]
+                        
+                    else:
+                        # m exists -> append
+                        if l not in self.availableLayers[m]:
+                            self.availableLayers[m].append()
+                            
+                except:
+                    pass
+
+    def getAvailableLayersJson(self):
+        """returns available layers as JSON string."""
+        return json.dumps(self.availableLayers)
+    
     
     def getInfo_xml(self,url,mode):
         """returns info about the document as XML"""
@@ -837,7 +880,7 @@
         else:
             batch['prevStart'] = None
             
-        if start + grpsize < maxIdx:
+        if start + grpsize <= maxIdx:
             batch['nextStart'] = start + grpsize
         else:
             batch['nextStart'] = None
@@ -863,12 +906,12 @@
         # list of elements in this batch
         this = []
         j = 0
-        for i in range(start, min(start+size, end)):
+        for i in range(start, min(start+size, end+1)):
             if data:
                 if fullData:
-                    d = data[i]
+                    d = data.get(i, None)
                 else:
-                    d = data[j]
+                    d = data.get(j, None)
                     j += 1
             
             else:
@@ -887,13 +930,14 @@
         else:
             batch['nextStart'] = None
         
+        logging.debug("getBatch start=%s size=%s end=%s batch=%s"%(start,size,end,repr(batch)))
         return batch
         
 
     security.declareProtected('View management screens','changeDocumentViewerForm')    
     changeDocumentViewerForm = PageTemplateFile('zpt/changeDocumentViewer', globals())
     
-    def changeDocumentViewer(self,title="",digilibBaseUrl=None,thumbrows=2,thumbcols=5,authgroups='mpiwg',RESPONSE=None):
+    def changeDocumentViewer(self,title="",digilibBaseUrl=None,thumbrows=2,thumbcols=5,authgroups='mpiwg',availableLayers=None,RESPONSE=None):
         """init document viewer"""
         self.title=title
         self.digilibBaseUrl = digilibBaseUrl
@@ -905,6 +949,8 @@
             self.metadataService = getattr(self, 'metadata')
         except Exception, e:
             logging.error("Unable to find MetaDataFolder 'metadata': "+str(e))
+            
+        self.setAvailableLayers(availableLayers)
 
         if RESPONSE is not None:
             RESPONSE.redirect('manage_main')