version 1.175.2.14, 2011/08/02 10:35:05
|
version 1.175.2.26, 2011/08/15 19:09: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.getData(dom=metaDom,recursive=1))) |
|
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 |
if docinfo.get('imagePath', None): |
if docinfo.get('imagePath', None): |
docinfo['imageURL'] = self.digilibBaseUrl + "/servlet/Scaler?fn=" + docinfo['imagePath'] |
docinfo['imageURL'] = self.digilibBaseUrl + "/servlet/Scaler?fn=" + docinfo['imagePath'] |
Line 565 class documentViewer(Folder):
|
Line 616 class documentViewer(Folder):
|
textUrl = texttool.get('text-url-path', None) |
textUrl = texttool.get('text-url-path', None) |
if textUrl: |
if textUrl: |
docinfo['textURLPath'] = textUrl |
docinfo['textURLPath'] = textUrl |
#TODO: ugly: |
|
#textUrlkurz = string.split(textUrl, ".")[0] |
# page flow |
#docinfo['textURLPathkurz'] = textUrlkurz |
docinfo['pageFlow'] = texttool.get('page-flow', 'ltr') |
|
|
|
# odd pages are left |
|
docinfo['oddPage'] = texttool.get('odd-scan-position', 'left') |
|
|
|
# number of title page (0: not defined) |
|
docinfo['titlePage'] = texttool.get('title-scan-no', 0) |
|
|
# old presentation stuff |
# old presentation stuff |
presentation = texttool.get('presentation', None) |
presentation = texttool.get('presentation', None) |
Line 577 class documentViewer(Folder):
|
Line 634 class documentViewer(Folder):
|
else: |
else: |
docinfo['presentationUrl'] = os.path.join(docPath, presentation) |
docinfo['presentationUrl'] = os.path.join(docPath, presentation) |
|
|
|
|
return docinfo |
return docinfo |
|
|
def getDocinfoFromBib(self, docinfo, bib): |
def getDocinfoFromBib(self, docinfo, bib): |
Line 661 class documentViewer(Folder):
|
Line 719 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=None, rows=None, cols=None, pageFlowLtr=True, pageZero=False, minIdx=1, maxIdx=0): |
|
"""returns dict with array of page informations for one screenfull of thumbnails""" |
|
grpsize = rows * cols |
|
if maxIdx == 0: |
|
maxIdx = start + grpsize |
|
|
|
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) |
|
|
|
batch = {} |
|
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 |
|
#logging.debug("getPageList returns=%s"%(batch)) |
|
return batch |
|
|
|
|
security.declareProtected('View management screens','changeDocumentViewerForm') |
security.declareProtected('View management screens','changeDocumentViewerForm') |
changeDocumentViewerForm = PageTemplateFile('zpt/changeDocumentViewer', globals()) |
changeDocumentViewerForm = PageTemplateFile('zpt/changeDocumentViewer', globals()) |
|
|