--- documentViewer/documentViewer.py 2011/08/03 19:04:18 1.175.2.16 +++ documentViewer/documentViewer.py 2011/08/12 14:41:39 1.175.2.24 @@ -176,6 +176,9 @@ class documentViewer(Folder): except Exception, e: logging.error("Unable to find MetaDataFolder 'metadata': "+str(e)) + if digilibBaseUrl is not None: + self.digilibBaseUrl = digilibBaseUrl + # proxy text server methods to fulltextclient def getTextPage(self, **args): @@ -206,9 +209,9 @@ class documentViewer(Folder): """get all gis places """ return self.template.fulltextclient.getAllGisPlaces(**args) - def getTranslate(self, **args): + def getWordInfo(self, **args): """get translate""" - return self.template.fulltextclient.getTranslate(**args) + return self.template.fulltextclient.getWordInfo(**args) def getLemma(self, **args): """get lemma""" @@ -266,16 +269,17 @@ class documentViewer(Folder): 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 - @param mode: defines how to access the document behind url + view page @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) """ - 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'): # this won't work @@ -291,19 +295,35 @@ class documentViewer(Folder): # get table of contents 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 docinfo.get('textURL', None) or docinfo.get('textURLPath', None): - viewMode="text_dict" + viewMode = "text" + viewType = "dict" 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" + + # stringify viewType + if isinstance(viewType, list): + logging.debug("index_html: viewType is list:%s"%viewType) + 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_main - pt = getattr(self.template, 'viewer_main') + # 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 + # 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): ret="" @@ -339,7 +359,7 @@ class documentViewer(Folder): else: return style - def getParams(self, param=None, val=None, params=None): + def getParams(self, param=None, val=None, params=None, duplicates=None): """returns dict with URL parameters. Takes URL parameters and additionally param=val or dict params. @@ -356,8 +376,7 @@ class documentViewer(Folder): # change more params if params is not None: - for k in params.keys(): - v = params[k] + for (k, v) in params.items(): if v is None: # val=None removes param if newParams.has_key(k): @@ -365,23 +384,34 @@ class documentViewer(Folder): else: 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] + return newParams - def getLink(self, param=None, val=None, params=None, baseUrl=None, paramSep='&'): + 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) + urlParams = self.getParams(param=param, val=val, params=params, duplicates=duplicates) # 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()]) if baseUrl is None: baseUrl = self.getDocumentViewerURL() url = "%s?%s"%(baseUrl, ps) return url - def getLinkAmp(self, param=None, val=None, params=None, baseUrl=None): + def getLinkAmp(self, param=None, val=None, params=None, baseUrl=None, duplicates='comma'): """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): @@ -431,6 +461,7 @@ class documentViewer(Folder): docinfo = {'mode': mode, 'url': url} # add self url docinfo['viewerUrl'] = self.getDocumentViewerURL() + docinfo['digilibBaseUrl'] = self.digilibBaseUrl # get index.meta DOM docUrl = None metaDom = None @@ -459,7 +490,7 @@ class documentViewer(Folder): docinfo['documentUrl'] = docUrl # process index.meta contents - if metaDom is not None: + if metaDom is not None and metaDom.tag == 'resource': # document directory name and path resource = self.metadataService.getResourceData(dom=metaDom) if resource: @@ -499,9 +530,11 @@ class documentViewer(Folder): # image path if mode != 'texttool': - # override image path from texttool + # override image path from texttool with url docinfo['imagePath'] = url.replace('/mpiwg/online/', '', 1) + + # number of images from digilib if docinfo.get('imagePath', None): docinfo['imageURL'] = self.digilibBaseUrl + "/servlet/Scaler?fn=" + docinfo['imagePath'] @@ -566,7 +599,7 @@ class documentViewer(Folder): docinfo['pageFlow'] = texttool.get('page-flow', 'ltr') # odd pages are left - docinfo['oddPage'] = texttool.get('odd-scan-orientation', 'left') + docinfo['oddPage'] = texttool.get('odd-scan-position', 'left') # number of title page (0: not defined) docinfo['titlePage'] = texttool.get('title-scan-no', 0) @@ -664,9 +697,14 @@ class documentViewer(Folder): 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""" + 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['viewMode'] = viewMode + pageinfo['viewType'] = viewType + pageinfo['tocMode'] = tocMode + current = getInt(current) pageinfo['current'] = current rows = int(rows or self.thumbrows) @@ -675,11 +713,10 @@ class documentViewer(Folder): pageinfo['cols'] = cols grpsize = cols * rows 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))) # int(current / grpsize) * grpsize +1)) pageinfo['start'] = start - pageinfo['end'] = start + grpsize pn = self.REQUEST.get('pn','1') pageinfo['pn'] = pn np = int(docinfo.get('numPages', 0)) @@ -687,45 +724,77 @@ class documentViewer(Folder): # 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=viewMode, pn=pn, docinfo=docinfo, pageinfo=pageinfo) + pageinfo['textPage'] = self.getTextPage(mode=viewType, pn=pn, docinfo=docinfo, pageinfo=pageinfo) np = int(docinfo.get('numPages', 0)) - pageinfo['end'] = min(pageinfo['end'], np) pageinfo['numgroups'] = int(np / grpsize) if np % grpsize > 0: pageinfo['numgroups'] += 1 + + pageFlowLtr = docinfo.get('pageFlow', 'ltr') != 'rtl' + oddScanLeft = docinfo.get('oddPage', 'left') != 'right' + # add zeroth page for two columns + pageZero = (cols == 2 and (pageFlowLtr != oddScanLeft)) + pageinfo['pageZero'] = pageZero + pageinfo['pageList'] = self.getPageList(start=start, rows=rows, cols=cols, pageFlowLtr=pageFlowLtr, pageZero=pageZero, minIdx=1, maxIdx=np) - pageinfo['viewMode'] = viewMode - pageinfo['tocMode'] = tocMode pageinfo['characterNormalization'] = self.REQUEST.get('characterNormalization','reg') - #pageinfo['optionToggle'] = self.REQUEST.get('optionToggle','1') pageinfo['query'] = self.REQUEST.get('query','') pageinfo['queryType'] = self.REQUEST.get('queryType','') pageinfo['querySearch'] =self.REQUEST.get('querySearch', 'fulltext') pageinfo['highlightQuery'] = self.REQUEST.get('highlightQuery','') - pageinfo['tocPageSize'] = self.REQUEST.get('tocPageSize', '30') - pageinfo['queryPageSize'] =self.REQUEST.get('queryPageSize', '10') - pageinfo['tocPN'] = self.REQUEST.get('tocPN', '1') - # WTF?: - toc = int(pageinfo['tocPN']) - pageinfo['textPages'] =int(toc) + pageinfo['tocPageSize'] = getInt(self.REQUEST.get('tocPageSize', 30)) + pageinfo['queryPageSize'] = getInt(self.REQUEST.get('queryPageSize', 10)) + pageinfo['tocPN'] = getInt(self.REQUEST.get('tocPN', '1')) + pageinfo['searchPN'] = getInt(self.REQUEST.get('searchPN','1')) - # What does this do? + # limit tocPN if 'tocSize_%s'%tocMode in docinfo: - tocSize = int(docinfo['tocSize_%s'%tocMode]) - tocPageSize = int(pageinfo['tocPageSize']) + tocSize = docinfo['tocSize_%s'%tocMode] + tocPageSize = pageinfo['tocPageSize'] # cached toc if tocSize%tocPageSize>0: tocPages=tocSize/tocPageSize+1 else: tocPages=tocSize/tocPageSize - pageinfo['tocPN'] = min(tocPages,toc) + pageinfo['tocPN'] = min(tocPages,pageinfo['tocPN']) - pageinfo['searchPN'] =self.REQUEST.get('searchPN','1') return pageinfo + def getPageList(self, start=None, rows=None, cols=None, pageFlowLtr=True, pageZero=False, minIdx=1, maxIdx=0): + """returns array of page informations for one screenfull of thumbnails""" + if maxIdx == 0: + maxIdx = start + rows * cols + + 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) + + logging.debug("getPageList returns=%s"%(pages)) + return pages + + security.declareProtected('View management screens','changeDocumentViewerForm') changeDocumentViewerForm = PageTemplateFile('zpt/changeDocumentViewer', globals())