Diff for /documentViewer/documentViewer.py between versions 1.175.2.15 and 1.175.2.27

version 1.175.2.15, 2011/08/02 16:29:15 version 1.175.2.27, 2011/08/16 16:27:08
Line 1 Line 1
 from OFS.Folder import Folder  from OFS.Folder import Folder
   from OFS.Image import File
 from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate  from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
 from Products.PageTemplates.PageTemplateFile import PageTemplateFile   from Products.PageTemplates.PageTemplateFile import PageTemplateFile 
 from AccessControl import ClassSecurityInfo  from AccessControl import ClassSecurityInfo
Line 122  class documentViewer(Folder): Line 123  class documentViewer(Folder):
     """MetaDataFolder instance"""      """MetaDataFolder instance"""
   
     # templates and forms      # templates and forms
       viewer_text = PageTemplateFile('zpt/viewer_text', globals())
     viewer_main = PageTemplateFile('zpt/viewer_main', globals())      viewer_main = PageTemplateFile('zpt/viewer_main', globals())
     toc_thumbs = PageTemplateFile('zpt/toc_thumbs', globals())      toc_thumbs = PageTemplateFile('zpt/toc_thumbs', globals())
     toc_text = PageTemplateFile('zpt/toc_text', globals())      toc_text = PageTemplateFile('zpt/toc_text', globals())
Line 134  class documentViewer(Folder): Line 136  class documentViewer(Folder):
     page_main_xml = PageTemplateFile('zpt/page_main_xml', globals())      page_main_xml = PageTemplateFile('zpt/page_main_xml', globals())
     page_main_pureXml = PageTemplateFile('zpt/page_main_pureXml', globals())      page_main_pureXml = PageTemplateFile('zpt/page_main_pureXml', globals())
     head_main = PageTemplateFile('zpt/head_main', globals())      head_main = PageTemplateFile('zpt/head_main', globals())
     docuviewer_css = PageTemplateFile('css/docuviewer.css', globals())  
     info_xml = PageTemplateFile('zpt/info_xml', globals())      info_xml = PageTemplateFile('zpt/info_xml', globals())
       # TODO: can this be nicer?
       docuviewer_css = File('docuviewer_css','',open(os.path.join(package_home(globals()),'css/docuviewer.css')), content_type='text/css')
           
           
     thumbs_main_rss = PageTemplateFile('zpt/thumbs_main_rss', globals())      thumbs_main_rss = PageTemplateFile('zpt/thumbs_main_rss', globals())
Line 176  class documentViewer(Folder): Line 179  class documentViewer(Folder):
         except Exception, e:          except Exception, e:
             logging.error("Unable to find MetaDataFolder 'metadata': "+str(e))              logging.error("Unable to find MetaDataFolder 'metadata': "+str(e))
                           
           if digilibBaseUrl is not None:
               self.digilibBaseUrl = digilibBaseUrl
               
                   
     # proxy text server methods to fulltextclient      # proxy text server methods to fulltextclient
     def getTextPage(self, **args):      def getTextPage(self, **args):
Line 206  class documentViewer(Folder): Line 212  class documentViewer(Folder):
         """get all gis places """          """get all gis places """
         return self.template.fulltextclient.getAllGisPlaces(**args)          return self.template.fulltextclient.getAllGisPlaces(**args)
                 
     def getTranslate(self, **args):      def getWordInfo(self, **args):
         """get translate"""          """get translate"""
         return self.template.fulltextclient.getTranslate(**args)          return self.template.fulltextclient.getWordInfo(**args)
   
     def getLemma(self, **args):      def getLemma(self, **args):
         """get lemma"""          """get lemma"""
Line 266  class documentViewer(Folder): Line 272  class documentViewer(Folder):
   
       
     security.declareProtected('View','index_html')      security.declareProtected('View','index_html')
     def index_html(self,url,mode="texttool",viewMode="auto",tocMode="thumbs",start=None,pn=1,mk=None):      def index_html(self,url,mode="texttool",viewMode="auto",viewType=None,tocMode="thumbs",start=1,pn=1):
         """          """
         view it          view page
         @param mode: defines how to access the document behind url   
         @param url: url which contains display information          @param url: url which contains display information
         @param viewMode: if images display images, if text display text, default is auto (text,images or auto)          @param mode: defines how to access the document behind url 
           @param viewMode: 'images': display images, 'text': display text, default is 'auto'
           @param viewType: sub-type of viewMode, e.g. 'dict' for viewMode='text'
         @param tocMode: type of 'table of contents' for navigation (thumbs, text, figures, none)          @param tocMode: type of 'table of contents' for navigation (thumbs, text, figures, none)
         """          """
                   
         logging.debug("documentViewer (index) mode: %s url:%s start:%s pn:%s"%(mode,url,start,pn))          logging.debug("documentViewer(index_html) mode=%s url=%s viewMode=%s viewType=%s start=%s pn=%s"%(mode,url,viewMode,viewType,start,pn))
                   
         if not hasattr(self, 'template'):          if not hasattr(self, 'template'):
             # this won't work              # this won't work
Line 291  class documentViewer(Folder): Line 298  class documentViewer(Folder):
             # get table of contents              # get table of contents
             docinfo = self.getToc(mode=tocMode, docinfo=docinfo)              docinfo = self.getToc(mode=tocMode, docinfo=docinfo)
   
         # auto viewMode: text_dict if text else images          # auto viewMode: text if there is a text else images
         if viewMode=="auto":           if viewMode=="auto": 
             if docinfo.get('textURL', None) or docinfo.get('textURLPath', None):               if docinfo.get('textURL', None) or docinfo.get('textURLPath', None): 
                 viewMode="text_dict"                  viewMode = "text"
                   viewType = "dict"
             else:              else:
                 viewMode="images"                  viewMode="images"
                                   
         pageinfo = self.getPageinfo(start=start, current=pn, docinfo=docinfo, viewMode=viewMode, tocMode=tocMode)          elif viewMode == "text_dict":
               # legacy fix
               viewMode = "text"
               viewType = "dict"
                   
         if viewMode != 'images' and docinfo.get('textURLPath', None):          # stringify viewType
             # get full text page          if isinstance(viewType, list):
             page = self.getTextPage(mode=viewMode, pn=pn, docinfo=docinfo, pageinfo=pageinfo)              logging.debug("index_html: viewType is list:%s"%viewType)
             pageinfo['textPage'] = page              viewType = ','.join([t for t in viewType if t])
                           
           pageinfo = self.getPageinfo(start=start, current=pn, docinfo=docinfo, viewMode=viewMode, viewType=viewType, tocMode=tocMode)
                       
           # get template /template/viewer_$viewMode
           pt = getattr(self.template, 'viewer_%s'%viewMode, None)
           if pt is None:
               logging.error("No template for viewMode=%s!"%viewMode)
               # TODO: error page?
               return "No template for viewMode=%s!"%viewMode
                           
         # get template /template/viewer_main  
         pt = getattr(self.template, 'viewer_main')  
         # and execute with parameters          # and execute with parameters
         return pt(docinfo=docinfo, pageinfo=pageinfo, viewMode=viewMode, mk=self.generateMarks(mk))          return pt(docinfo=docinfo, pageinfo=pageinfo)
       
     def generateMarks(self,mk):      def generateMarks(self,mk):
         ret=""          ret=""
Line 332  class documentViewer(Folder): Line 350  class documentViewer(Folder):
         url = self.template.zogilib.getDLBaseUrl()          url = self.template.zogilib.getDLBaseUrl()
         return url          return url
   
       def getScalerUrl(self, fn=None, pn=None, dw=100, dh=100, docinfo=None):
           """returns URL to digilib Scaler with params"""
           url = None
           if docinfo is not None:
               url = docinfo.get('imageURL', None)
               
           if url is None:
               url = "%s/servlet/Scaler?"%self.digilibBaseUrl
               if fn is None and docinfo is not None:
                   fn = docinfo.get('imagePath','')
               
               url += "fn=%s"%fn
               
           if pn:
               url += "&pn=%s"%pn
               
           url += "&dw=%s&dh=%s"%(dw,dh)
           return url
   
     def getDocumentViewerURL(self):      def getDocumentViewerURL(self):
         """returns the URL of this instance"""          """returns the URL of this instance"""
         return self.absolute_url()          return self.absolute_url()
           
     def getStyle(self, idx, selected, style=""):      def getStyle(self, idx, selected, style=""):
         """returns a string with the given style and append 'sel' if path == selected."""          """returns a string with the given style and append 'sel' if idx == selected."""
         #logger("documentViewer (getstyle)", logging.INFO, "idx: %s selected: %s style: %s"%(idx,selected,style))          #logger("documentViewer (getstyle)", logging.INFO, "idx: %s selected: %s style: %s"%(idx,selected,style))
         if idx == selected:          if idx == selected:
             return style + 'sel'              return style + 'sel'
         else:          else:
             return style              return style
           
     def getLink(self, param=None, val=None, params=None, baseUrl=None, paramSep='&'):      def getParams(self, param=None, val=None, params=None, duplicates=None):
         """returns URL to documentviewer with parameter param set to val or from dict params"""          """returns dict with URL parameters.
           
           Takes URL parameters and additionally param=val or dict params.
           Deletes key if value is None."""
         # copy existing request params          # copy existing request params
         urlParams=self.REQUEST.form.copy()          newParams=self.REQUEST.form.copy()
         # change single param          # change single param
         if param is not None:          if param is not None:
             if val is None:              if val is None:
                 if urlParams.has_key(param):                  if newParams.has_key(param):
                     del urlParams[param]                      del newParams[param]
             else:              else:
                 urlParams[param] = str(val)                  newParams[param] = str(val)
                                   
         # change more params          # change more params
         if params is not None:          if params is not None:
             for k in params.keys():              for (k, v) in params.items():
                 v = params[k]  
                 if v is None:                  if v is None:
                     # val=None removes param                      # val=None removes param
                     if urlParams.has_key(k):                      if newParams.has_key(k):
                         del urlParams[k]                          del newParams[k]
                                                   
                 else:                  else:
                     urlParams[k] = v                      newParams[k] = v
   
           if duplicates:
               # eliminate lists (coming from duplicate keys)
               for (k,v) in newParams.items():
                   if isinstance(v, list):
                       if duplicates == 'comma':
                           # make comma-separated list of non-empty entries
                           newParams[k] = ','.join([t for t in v if t])
                       elif duplicates == 'first':
                           # take first non-empty entry
                           newParams[k] = [t for t in v if t][0]
   
         # FIXME: does this belong here?          return newParams
         if urlParams.get("mode", None) == "filepath": #wenn beim erst Aufruf filepath gesetzt wurde aendere das nun zu imagepath  
                 urlParams["mode"] = "imagepath"  
                 urlParams["url"] = getParentPath(urlParams["url"])  
                                   
       def getLink(self, param=None, val=None, params=None, baseUrl=None, paramSep='&', duplicates='comma'):
           """returns URL to documentviewer with parameter param set to val or from dict params"""
           urlParams = self.getParams(param=param, val=val, params=params, duplicates=duplicates)
         # quote values and assemble into query string (not escaping '/')          # quote values and assemble into query string (not escaping '/')
         ps = paramSep.join(["%s=%s"%(k,urllib.quote_plus(v,'/')) for (k, v) in urlParams.items()])          ps = paramSep.join(["%s=%s"%(k,urllib.quote_plus(unicode(v),'/')) for (k, v) in urlParams.items()])
         #ps = urllib.urlencode(urlParams)  
         if baseUrl is None:          if baseUrl is None:
             baseUrl = self.REQUEST['URL1']              baseUrl = self.getDocumentViewerURL()
                           
         url = "%s?%s"%(baseUrl, ps)          url = "%s?%s"%(baseUrl, ps)
         return url          return url
   
       def getLinkAmp(self, param=None, val=None, params=None, baseUrl=None, duplicates='comma'):
     def getLinkAmp(self, param=None, val=None, params=None, baseUrl=None):  
         """link to documentviewer with parameter param set to val"""          """link to documentviewer with parameter param set to val"""
         return self.getLink(param, val, params, baseUrl, '&')          return self.getLink(param=param, val=val, params=params, baseUrl=baseUrl, paramSep='&', duplicates=duplicates)
       
           
     def getInfo_xml(self,url,mode):      def getInfo_xml(self,url,mode):
         """returns info about the document as XML"""          """returns info about the document as XML"""
Line 434  class documentViewer(Folder): Line 483  class documentViewer(Folder):
         docinfo = {'mode': mode, 'url': url}          docinfo = {'mode': mode, 'url': url}
         # add self url          # add self url
         docinfo['viewerUrl'] = self.getDocumentViewerURL()          docinfo['viewerUrl'] = self.getDocumentViewerURL()
           docinfo['digilibBaseUrl'] = self.digilibBaseUrl
         # get index.meta DOM          # get index.meta DOM
         docUrl = None          docUrl = None
         metaDom = None          metaDom = None
Line 462  class documentViewer(Folder): Line 512  class documentViewer(Folder):
                   
         docinfo['documentUrl'] = docUrl          docinfo['documentUrl'] = docUrl
         # process index.meta contents          # process index.meta contents
         if metaDom is not None:          if metaDom is not None and metaDom.tag == 'resource':
             # document directory name and path              # document directory name and path
             logging.debug("RESOURCE: %s"%repr(self.metadataService.resource.meta.getData(dom=metaDom, all=True, recursive=2)))  
             resource = self.metadataService.getResourceData(dom=metaDom)              resource = self.metadataService.getResourceData(dom=metaDom)
             if resource:              if resource:
                 docinfo = self.getDocinfoFromResource(docinfo, resource)                  docinfo = self.getDocinfoFromResource(docinfo, resource)
Line 503  class documentViewer(Folder): Line 552  class documentViewer(Folder):
   
         # image path          # image path
         if mode != 'texttool':          if mode != 'texttool':
             # override image path from texttool              # override image path from texttool with url
             docinfo['imagePath'] = url.replace('/mpiwg/online/', '', 1)              docinfo['imagePath'] = url.replace('/mpiwg/online/', '', 1)
   
         # number of images from digilib          # number of images from digilib
Line 570  class documentViewer(Folder): Line 619  class documentViewer(Folder):
         docinfo['pageFlow'] = texttool.get('page-flow', 'ltr')          docinfo['pageFlow'] = texttool.get('page-flow', 'ltr')
                           
         # odd pages are left          # odd pages are left
         docinfo['oddPage'] = texttool.get('odd-scan-orientation', 'left')          docinfo['oddPage'] = texttool.get('odd-scan-position', 'left')
                           
         # number of title page          # number of title page (0: not defined)
         docinfo['titlePage'] = texttool.get('title-scan-no', 0)          docinfo['titlePage'] = texttool.get('title-scan-no', 0)
                           
         # old presentation stuff          # old presentation stuff
Line 668  class documentViewer(Folder): Line 717  class documentViewer(Folder):
         return docinfo          return docinfo
           
   
     def getPageinfo(self, current, start=None, rows=None, cols=None, docinfo=None, viewMode=None, tocMode=None):      def getPageinfo(self, current=None, start=None, rows=None, cols=None, docinfo=None, viewMode=None, viewType=None, tocMode=None):
         """returns pageinfo with the given parameters"""          """returns pageinfo with the given parameters"""
           logging.debug("getPageInfo(current=%s, start=%s, rows=%s, cols=%s, viewMode=%s, viewType=%s, tocMode=%s)"%(current,start,rows,cols,viewMode,viewType,tocMode))
         pageinfo = {}          pageinfo = {}
         current = getInt(current)          pageinfo['viewMode'] = viewMode
           pageinfo['viewType'] = viewType
           pageinfo['tocMode'] = tocMode
           
           current = getInt(current)
         pageinfo['current'] = current          pageinfo['current'] = current
           pageinfo['pn'] = current
         rows = int(rows or self.thumbrows)          rows = int(rows or self.thumbrows)
         pageinfo['rows'] = rows          pageinfo['rows'] = rows
         cols = int(cols or self.thumbcols)          cols = int(cols or self.thumbcols)
         pageinfo['cols'] = cols          pageinfo['cols'] = cols
         grpsize = cols * rows          grpsize = cols * rows
         pageinfo['groupsize'] = grpsize          pageinfo['groupsize'] = grpsize
         # what does this do?          # is start is empty use one around current
         start = getInt(start, default=(math.ceil(float(current)/float(grpsize))*grpsize-(grpsize-1)))          start = getInt(start, default=(math.ceil(float(current)/float(grpsize))*grpsize-(grpsize-1)))
         # int(current / grpsize) * grpsize +1))          # int(current / grpsize) * grpsize +1))
         pageinfo['start'] = start          pageinfo['start'] = start
         pageinfo['end'] = start + grpsize          
         if (docinfo is not None) and ('numPages' in docinfo):          np = int(docinfo.get('numPages', 0))
             np = int(docinfo['numPages'])          if np == 0:
             pageinfo['end'] = min(pageinfo['end'], np)              # numPages unknown - maybe we can get it from text page
               if docinfo.get('textURLPath', None):
                   # cache text page as well
                   pageinfo['textPage'] = self.getTextPage(mode=viewType, pn=current, docinfo=docinfo, pageinfo=pageinfo)
                   np = int(docinfo.get('numPages', 0))
                   
             pageinfo['numgroups'] = int(np / grpsize)              pageinfo['numgroups'] = int(np / grpsize)
             if np % grpsize > 0:              if np % grpsize > 0:
                 pageinfo['numgroups'] += 1                  pageinfo['numgroups'] += 1
                                   
         pageinfo['viewMode'] = viewMode          pageFlowLtr = docinfo.get('pageFlow', 'ltr') != 'rtl'
         pageinfo['tocMode'] = tocMode          oddScanLeft = docinfo.get('oddPage', 'left') != 'right'
           # add zeroth page for two columns
           pageZero = (cols == 2 and (pageFlowLtr != oddScanLeft))
           pageinfo['pageZero'] = pageZero
           pageinfo['pageBatch'] = self.getPageBatch(start=start, rows=rows, cols=cols, pageFlowLtr=pageFlowLtr, pageZero=pageZero, minIdx=1, maxIdx=np)
                   
           # TODO: do we need this here?
         pageinfo['characterNormalization'] = self.REQUEST.get('characterNormalization','reg')          pageinfo['characterNormalization'] = self.REQUEST.get('characterNormalization','reg')
         #pageinfo['optionToggle'] = self.REQUEST.get('optionToggle','1')  
         pageinfo['query'] = self.REQUEST.get('query','')           pageinfo['query'] = self.REQUEST.get('query','') 
         pageinfo['queryType'] = self.REQUEST.get('queryType','')          pageinfo['queryType'] = self.REQUEST.get('queryType','')
         pageinfo['querySearch'] =self.REQUEST.get('querySearch', 'fulltext')          pageinfo['querySearch'] =self.REQUEST.get('querySearch', 'fulltext')
         pageinfo['textPN'] = self.REQUEST.get('textPN','1')  
         pageinfo['highlightQuery'] = self.REQUEST.get('highlightQuery','')          pageinfo['highlightQuery'] = self.REQUEST.get('highlightQuery','')
         pageinfo['tocPageSize'] = self.REQUEST.get('tocPageSize', '30')          pageinfo['tocPageSize'] = getInt(self.REQUEST.get('tocPageSize', 30))
         pageinfo['queryPageSize'] =self.REQUEST.get('queryPageSize', '10')          pageinfo['queryPageSize'] = getInt(self.REQUEST.get('queryPageSize', 10))
         pageinfo['tocPN'] = self.REQUEST.get('tocPN', '1')          pageinfo['tocPN'] = getInt(self.REQUEST.get('tocPN', '1'))
         # WTF?:          pageinfo['searchPN'] = getInt(self.REQUEST.get('searchPN','1'))
         toc = int(pageinfo['tocPN'])  
         pageinfo['textPages'] =int(toc)  
                   
         # What does this do?          # limit tocPN
         if 'tocSize_%s'%tocMode in docinfo:          if 'tocSize_%s'%tocMode in docinfo:
             tocSize = int(docinfo['tocSize_%s'%tocMode])              tocSize = docinfo['tocSize_%s'%tocMode]
             tocPageSize = int(pageinfo['tocPageSize'])              tocPageSize = pageinfo['tocPageSize']
             # cached toc                         # cached toc           
             if tocSize%tocPageSize>0:              if tocSize%tocPageSize>0:
                 tocPages=tocSize/tocPageSize+1                  tocPages=tocSize/tocPageSize+1
             else:              else:
                 tocPages=tocSize/tocPageSize                  tocPages=tocSize/tocPageSize
                                   
             pageinfo['tocPN'] = min(tocPages,toc)              pageinfo['tocPN'] = min(tocPages,pageinfo['tocPN'])
                           
         pageinfo['searchPN'] =self.REQUEST.get('searchPN','1')  
         pageinfo['sn'] =self.REQUEST.get('sn','')  
         return pageinfo          return pageinfo
   
   
       def getPageBatch(self, start=1, rows=10, cols=2, pageFlowLtr=True, pageZero=False, minIdx=1, maxIdx=0):
           """returns dict with array of page informations for one screenfull of thumbnails"""
           batch = {}
           grpsize = rows * cols
           if maxIdx == 0:
               maxIdx = start + grpsize
   
           nb = int(math.ceil(maxIdx / float(grpsize)))
           # list of all batch start and end points
           batches = []
           if pageZero:
               ofs = 0
           else:
               ofs = 1
               
           for i in range(nb):
               s = i * grpsize + ofs
               e = min((i + 1) * grpsize + ofs - 1, maxIdx)
               batches.append({'start':s, 'end':e})
               
           batch['batches'] = batches
   
           pages = []
           if pageZero and start == 1:
               # correct beginning
               idx = 0
           else:
               idx = start
               
           for r in range(rows):
               row = []
               for c in range(cols):
                   if idx < minIdx or idx > maxIdx:
                       page = {'idx':None}
                   else:
                       page = {'idx':idx}
                       
                   idx += 1
                   if pageFlowLtr:
                       row.append(page)
                   else:
                       row.insert(0, page) 
                   
               pages.append(row)
               
           if start > 1:
               batch['prevStart'] = max(start - grpsize, 1)
           else:
               batch['prevStart'] = None
               
           if start + grpsize < maxIdx:
               batch['nextStart'] = start + grpsize
           else:
               batch['nextStart'] = None
   
           batch['pages'] = pages
           return batch
           
       def getBatch(self, start=1, size=10, end=0, data=None, fullData=True):
           """returns dict with information for one screenfull of data."""
           batch = {}
           if end == 0:
               end = start + size                    
               
           nb = int(math.ceil(end / float(size)))
           # list of all batch start and end points
           batches = []
           for i in range(nb):
               s = i * size + 1
               e = min((i + 1) * size, end)
               batches.append({'start':s, 'end':e})
               
           batch['batches'] = batches
           # list of elements in this batch
           this = []
           j = 0
           for i in range(start, min(start+size, end)):
               if data:
                   if fullData:
                       d = data[i]
                   else:
                       d = data[j]
                       j += 1
               
               else:
                   d = i+1
                   
               this.append(d)
               
           batch['this'] = this
           if start > 1:
               batch['prevStart'] = max(start - size, 1)
           else:
               batch['prevStart'] = None
               
           if start + size < end:
               batch['nextStart'] = start + size
           else:
               batch['nextStart'] = None
           
           return batch
           
   
     security.declareProtected('View management screens','changeDocumentViewerForm')          security.declareProtected('View management screens','changeDocumentViewerForm')    
     changeDocumentViewerForm = PageTemplateFile('zpt/changeDocumentViewer', globals())      changeDocumentViewerForm = PageTemplateFile('zpt/changeDocumentViewer', globals())
           

Removed from v.1.175.2.15  
changed lines
  Added in v.1.175.2.27


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