![]() ![]() | ![]() |
more cleanup (before reversing macro order)
1: from OFS.Folder import Folder 2: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate 3: from Products.PageTemplates.PageTemplateFile import PageTemplateFile 4: from AccessControl import ClassSecurityInfo 5: from AccessControl import getSecurityManager 6: from Globals import package_home 7: 8: #from Ft.Xml import EMPTY_NAMESPACE, Parse 9: #import Ft.Xml.Domlette 10: 11: import xml.etree.ElementTree as ET 12: 13: import os.path 14: import sys 15: import urllib 16: import logging 17: import math 18: import urlparse 19: import re 20: import string 21: 22: from SrvTxtUtils import getInt, getText, getHttpData 23: 24: def logger(txt,method,txt2): 25: """logging""" 26: logging.info(txt+ txt2) 27: 28: 29: def serializeNode(node, encoding="utf-8"): 30: """returns a string containing node as XML""" 31: s = ET.tostring(node) 32: 33: # 4Suite: 34: # stream = cStringIO.StringIO() 35: # Ft.Xml.Domlette.Print(node, stream=stream, encoding=encoding) 36: # s = stream.getvalue() 37: # stream.close() 38: return s 39: 40: def browserCheck(self): 41: """check the browsers request to find out the browser type""" 42: bt = {} 43: ua = self.REQUEST.get_header("HTTP_USER_AGENT") 44: bt['ua'] = ua 45: bt['isIE'] = False 46: bt['isN4'] = False 47: bt['versFirefox']="" 48: bt['versIE']="" 49: bt['versSafariChrome']="" 50: bt['versOpera']="" 51: 52: if string.find(ua, 'MSIE') > -1: 53: bt['isIE'] = True 54: else: 55: bt['isN4'] = (string.find(ua, 'Mozilla/4.') > -1) 56: # Safari oder Chrome identification 57: try: 58: nav = ua[string.find(ua, '('):] 59: nav1=ua[string.find(ua,')'):] 60: nav2=nav1[string.find(nav1,'('):] 61: nav3=nav2[string.find(nav2,')'):] 62: ie = string.split(nav, "; ")[1] 63: ie1 =string.split(nav1, " ")[2] 64: ie2 =string.split(nav3, " ")[1] 65: ie3 =string.split(nav3, " ")[2] 66: if string.find(ie3, "Safari") >-1: 67: bt['versSafariChrome']=string.split(ie2, "/")[1] 68: except: pass 69: # IE identification 70: try: 71: nav = ua[string.find(ua, '('):] 72: ie = string.split(nav, "; ")[1] 73: if string.find(ie, "MSIE") > -1: 74: bt['versIE'] = string.split(ie, " ")[1] 75: except:pass 76: # Firefox identification 77: try: 78: nav = ua[string.find(ua, '('):] 79: nav1=ua[string.find(ua,')'):] 80: if string.find(ie1, "Firefox") >-1: 81: nav5= string.split(ie1, "/")[1] 82: logging.debug("FIREFOX: %s"%(nav5)) 83: bt['versFirefox']=nav5[0:3] 84: except:pass 85: #Opera identification 86: try: 87: if string.find(ua,"Opera") >-1: 88: nav = ua[string.find(ua, '('):] 89: nav1=nav[string.find(nav,')'):] 90: bt['versOpera']=string.split(nav1,"/")[2] 91: except:pass 92: 93: bt['isMac'] = string.find(ua, 'Macintosh') > -1 94: bt['isWin'] = string.find(ua, 'Windows') > -1 95: bt['isIEWin'] = bt['isIE'] and bt['isWin'] 96: bt['isIEMac'] = bt['isIE'] and bt['isMac'] 97: bt['staticHTML'] = False 98: 99: return bt 100: 101: def getParentPath(path, cnt=1): 102: """returns pathname shortened by cnt""" 103: # make sure path doesn't end with / 104: path = path.rstrip('/') 105: # split by /, shorten, and reassemble 106: return '/'.join(path.split('/')[0:-cnt]) 107: 108: 109: ## 110: ## documentViewer class 111: ## 112: class documentViewer(Folder): 113: """document viewer""" 114: meta_type="Document viewer" 115: 116: security=ClassSecurityInfo() 117: manage_options=Folder.manage_options+( 118: {'label':'main config','action':'changeDocumentViewerForm'}, 119: ) 120: 121: metadataService = None 122: """MetaDataFolder instance""" 123: 124: # templates and forms 125: viewer_main = PageTemplateFile('zpt/viewer_main', globals()) 126: toc_thumbs = PageTemplateFile('zpt/toc_thumbs', globals()) 127: toc_text = PageTemplateFile('zpt/toc_text', globals()) 128: toc_figures = PageTemplateFile('zpt/toc_figures', globals()) 129: page_main_images = PageTemplateFile('zpt/page_main_images', globals()) 130: page_main_double = PageTemplateFile('zpt/page_main_double', globals()) 131: page_main_text = PageTemplateFile('zpt/page_main_text', globals()) 132: page_main_text_dict = PageTemplateFile('zpt/page_main_text_dict', globals()) 133: page_main_gis =PageTemplateFile ('zpt/page_main_gis', globals()) 134: page_main_xml = PageTemplateFile('zpt/page_main_xml', globals()) 135: page_main_pureXml = PageTemplateFile('zpt/page_main_pureXml', globals()) 136: head_main = PageTemplateFile('zpt/head_main', globals()) 137: docuviewer_css = PageTemplateFile('css/docuviewer.css', globals()) 138: info_xml = PageTemplateFile('zpt/info_xml', globals()) 139: 140: 141: thumbs_main_rss = PageTemplateFile('zpt/thumbs_main_rss', globals()) 142: 143: 144: def __init__(self,id,imageScalerUrl=None,textServerName=None,title="",digilibBaseUrl=None,thumbcols=2,thumbrows=5,authgroups="mpiwg"): 145: """init document viewer""" 146: self.id=id 147: self.title=title 148: self.thumbcols = thumbcols 149: self.thumbrows = thumbrows 150: # authgroups is list of authorized groups (delimited by ,) 151: self.authgroups = [s.strip().lower() for s in authgroups.split(',')] 152: # create template folder so we can always use template.something 153: 154: templateFolder = Folder('template') 155: #self['template'] = templateFolder # Zope-2.12 style 156: self._setObject('template',templateFolder) # old style 157: try: 158: import MpdlXmlTextServer 159: textServer = MpdlXmlTextServer.MpdlXmlTextServer(id='fulltextclient',serverName=textServerName) 160: #templateFolder['fulltextclient'] = xmlRpcClient 161: templateFolder._setObject('fulltextclient',textServer) 162: except Exception, e: 163: logging.error("Unable to create MpdlXmlTextServer for fulltextclient: "+str(e)) 164: 165: try: 166: from Products.zogiLib.zogiLib import zogiLib 167: zogilib = zogiLib(id="zogilib", title="zogilib for docuviewer", dlServerURL=imageScalerUrl, layout="book") 168: #templateFolder['zogilib'] = zogilib 169: templateFolder._setObject('zogilib',zogilib) 170: except Exception, e: 171: logging.error("Unable to create zogiLib for zogilib: "+str(e)) 172: 173: try: 174: # assume MetaDataFolder instance is called metadata 175: self.metadataService = getattr(self, 'metadata') 176: except Exception, e: 177: logging.error("Unable to find MetaDataFolder 'metadata': "+str(e)) 178: 179: 180: # proxy text server methods to fulltextclient 181: def getTextPage(self, **args): 182: """get page""" 183: return self.template.fulltextclient.getTextPage(**args) 184: 185: def getOrigPages(self, **args): 186: """get page""" 187: return self.template.fulltextclient.getOrigPages(**args) 188: 189: def getOrigPagesNorm(self, **args): 190: """get page""" 191: return self.template.fulltextclient.getOrigPagesNorm(**args) 192: 193: def getQuery(self, **args): 194: """get query in search""" 195: return self.template.fulltextclient.getQuery(**args) 196: 197: def getSearch(self, **args): 198: """get search""" 199: return self.template.fulltextclient.getSearch(**args) 200: 201: def getGisPlaces(self, **args): 202: """get gis places""" 203: return self.template.fulltextclient.getGisPlaces(**args) 204: 205: def getAllGisPlaces(self, **args): 206: """get all gis places """ 207: return self.template.fulltextclient.getAllGisPlaces(**args) 208: 209: def getTranslate(self, **args): 210: """get translate""" 211: return self.template.fulltextclient.getTranslate(**args) 212: 213: def getLemma(self, **args): 214: """get lemma""" 215: return self.template.fulltextclient.getLemma(**args) 216: 217: def getLemmaQuery(self, **args): 218: """get query""" 219: return self.template.fulltextclient.getLemmaQuery(**args) 220: 221: def getLex(self, **args): 222: """get lex""" 223: return self.template.fulltextclient.getLex(**args) 224: 225: def getToc(self, **args): 226: """get toc""" 227: return self.template.fulltextclient.getToc(**args) 228: 229: def getTocPage(self, **args): 230: """get tocpage""" 231: return self.template.fulltextclient.getTocPage(**args) 232: 233: 234: security.declareProtected('View','thumbs_rss') 235: def thumbs_rss(self,mode,url,viewMode="auto",start=None,pn=1): 236: ''' 237: view it 238: @param mode: defines how to access the document behind url 239: @param url: url which contains display information 240: @param viewMode: if images display images, if text display text, default is images (text,images or auto) 241: 242: ''' 243: logging.debug("HHHHHHHHHHHHHH:load the rss") 244: logging.debug("documentViewer (index) mode: %s url:%s start:%s pn:%s"%(mode,url,start,pn)) 245: 246: if not hasattr(self, 'template'): 247: # create template folder if it doesn't exist 248: self.manage_addFolder('template') 249: 250: if not self.digilibBaseUrl: 251: self.digilibBaseUrl = self.findDigilibUrl() or "http://nausikaa.mpiwg-berlin.mpg.de/digitallibrary" 252: 253: docinfo = self.getDocinfo(mode=mode,url=url) 254: #pageinfo = self.getPageinfo(start=start,current=pn,docinfo=docinfo) 255: pageinfo = self.getPageinfo(start=start,current=pn, docinfo=docinfo) 256: ''' ZDES ''' 257: pt = getattr(self.template, 'thumbs_main_rss') 258: 259: if viewMode=="auto": # automodus gewaehlt 260: if docinfo.has_key("textURL") or docinfo.get('textURLPath',None): #texturl gesetzt und textViewer konfiguriert 261: viewMode="text" 262: else: 263: viewMode="images" 264: 265: return pt(docinfo=docinfo,pageinfo=pageinfo,viewMode=viewMode) 266: 267: 268: security.declareProtected('View','index_html') 269: def index_html(self,url,mode="texttool",viewMode="auto",viewType=None,tocMode="thumbs",start=1,pn=1): 270: """ 271: view page 272: @param url: url which contains display information 273: @param mode: defines how to access the document behind url 274: @param viewMode: 'images': display images, 'text': display text, default is 'auto' 275: @param viewType: sub-type of viewMode, e.g. 'dict' for viewMode='text' 276: @param tocMode: type of 'table of contents' for navigation (thumbs, text, figures, none) 277: """ 278: 279: logging.debug("documentViewer (index) mode: %s url:%s start:%s pn:%s"%(mode,url,start,pn)) 280: 281: if not hasattr(self, 'template'): 282: # this won't work 283: logging.error("template folder missing!") 284: return "ERROR: template folder missing!" 285: 286: if not getattr(self, 'digilibBaseUrl', None): 287: self.digilibBaseUrl = self.findDigilibUrl() or "http://digilib.mpiwg-berlin.mpg.de/digitallibrary" 288: 289: docinfo = self.getDocinfo(mode=mode,url=url) 290: 291: if tocMode != "thumbs": 292: # get table of contents 293: docinfo = self.getToc(mode=tocMode, docinfo=docinfo) 294: 295: # auto viewMode: text if there is a text else images 296: if viewMode=="auto": 297: if docinfo.get('textURL', None) or docinfo.get('textURLPath', None): 298: viewMode = "text" 299: viewType = "dict" 300: else: 301: viewMode = "images" 302: 303: elif viewMode == "text_dict": 304: # legacy fix 305: viewMode = "text" 306: viewType = "dict" 307: 308: 309: pageinfo = self.getPageinfo(start=start, current=pn, docinfo=docinfo, viewMode=viewMode, viewType=viewType, tocMode=tocMode) 310: 311: # get template /template/viewer_main 312: pt = getattr(self.template, 'viewer_main') 313: # and execute with parameters 314: return pt(docinfo=docinfo, pageinfo=pageinfo) 315: 316: def generateMarks(self,mk): 317: ret="" 318: if mk is None: 319: return "" 320: if not isinstance(mk, list): 321: mk=[mk] 322: for m in mk: 323: ret+="mk=%s"%m 324: return ret 325: 326: 327: def getBrowser(self): 328: """getBrowser the version of browser """ 329: bt = browserCheck(self) 330: logging.debug("BROWSER VERSION: %s"%(bt)) 331: return bt 332: 333: def findDigilibUrl(self): 334: """try to get the digilib URL from zogilib""" 335: url = self.template.zogilib.getDLBaseUrl() 336: return url 337: 338: def getDocumentViewerURL(self): 339: """returns the URL of this instance""" 340: return self.absolute_url() 341: 342: def getStyle(self, idx, selected, style=""): 343: """returns a string with the given style and append 'sel' if path == selected.""" 344: #logger("documentViewer (getstyle)", logging.INFO, "idx: %s selected: %s style: %s"%(idx,selected,style)) 345: if idx == selected: 346: return style + 'sel' 347: else: 348: return style 349: 350: def getParams(self, param=None, val=None, params=None): 351: """returns dict with URL parameters. 352: 353: Takes URL parameters and additionally param=val or dict params. 354: Deletes key if value is None.""" 355: # copy existing request params 356: newParams=self.REQUEST.form.copy() 357: # change single param 358: if param is not None: 359: if val is None: 360: if newParams.has_key(param): 361: del newParams[param] 362: else: 363: newParams[param] = str(val) 364: 365: # change more params 366: if params is not None: 367: for k in params.keys(): 368: v = params[k] 369: if v is None: 370: # val=None removes param 371: if newParams.has_key(k): 372: del newParams[k] 373: 374: else: 375: newParams[k] = v 376: 377: return newParams 378: 379: def getLink(self, param=None, val=None, params=None, baseUrl=None, paramSep='&'): 380: """returns URL to documentviewer with parameter param set to val or from dict params""" 381: urlParams = self.getParams(param=param, val=val, params=params) 382: # quote values and assemble into query string (not escaping '/') 383: ps = paramSep.join(["%s=%s"%(k,urllib.quote_plus(v,'/')) for (k, v) in urlParams.items()]) 384: if baseUrl is None: 385: baseUrl = self.getDocumentViewerURL() 386: 387: url = "%s?%s"%(baseUrl, ps) 388: return url 389: 390: def getLinkAmp(self, param=None, val=None, params=None, baseUrl=None): 391: """link to documentviewer with parameter param set to val""" 392: return self.getLink(param, val, params, baseUrl, '&') 393: 394: 395: def getInfo_xml(self,url,mode): 396: """returns info about the document as XML""" 397: if not self.digilibBaseUrl: 398: self.digilibBaseUrl = self.findDigilibUrl() or "http://nausikaa.mpiwg-berlin.mpg.de/digitallibrary" 399: 400: docinfo = self.getDocinfo(mode=mode,url=url) 401: pt = getattr(self.template, 'info_xml') 402: return pt(docinfo=docinfo) 403: 404: def isAccessible(self, docinfo): 405: """returns if access to the resource is granted""" 406: access = docinfo.get('accessType', None) 407: logging.debug("documentViewer (accessOK) access type %s"%access) 408: if access == 'free': 409: logging.debug("documentViewer (accessOK) access is free") 410: return True 411: 412: elif access is None or access in self.authgroups: 413: # only local access -- only logged in users 414: user = getSecurityManager().getUser() 415: logging.debug("documentViewer (accessOK) user=%s ip=%s"%(user,self.REQUEST.getClientAddr())) 416: if user is not None: 417: #print "user: ", user 418: return (user.getUserName() != "Anonymous User") 419: else: 420: return False 421: 422: logging.error("documentViewer (accessOK) unknown access type %s"%access) 423: return False 424: 425: 426: 427: def getDocinfo(self, mode, url): 428: """returns docinfo depending on mode""" 429: logging.debug("getDocinfo: mode=%s, url=%s"%(mode,url)) 430: # look for cached docinfo in session 431: if self.REQUEST.SESSION.has_key('docinfo'): 432: docinfo = self.REQUEST.SESSION['docinfo'] 433: # check if its still current 434: if docinfo is not None and docinfo.get('mode', None) == mode and docinfo.get('url', None) == url: 435: logging.debug("getDocinfo: docinfo in session. keys=%s"%docinfo.keys()) 436: return docinfo 437: 438: # new docinfo 439: docinfo = {'mode': mode, 'url': url} 440: # add self url 441: docinfo['viewerUrl'] = self.getDocumentViewerURL() 442: # get index.meta DOM 443: docUrl = None 444: metaDom = None 445: if mode=="texttool": 446: # url points to document dir or index.meta 447: metaDom = self.metadataService.getDomFromPathOrUrl(url) 448: docUrl = url.replace('/index.meta', '') 449: if metaDom is None: 450: raise IOError("Unable to find index.meta for mode=texttool!") 451: 452: elif mode=="imagepath": 453: # url points to folder with images, index.meta optional 454: # asssume index.meta in parent dir 455: docUrl = getParentPath(url) 456: metaDom = self.metadataService.getDomFromPathOrUrl(docUrl) 457: 458: elif mode=="filepath": 459: # url points to image file, index.meta optional 460: # asssume index.meta is two path segments up 461: docUrl = getParentPath(url, 2) 462: metaDom = self.metadataService.getDomFromPathOrUrl(docUrl) 463: 464: else: 465: logging.error("documentViewer (getdocinfo) unknown mode: %s!"%mode) 466: raise ValueError("Unknown mode %s! Has to be one of 'texttool','imagepath','filepath'."%(mode)) 467: 468: docinfo['documentUrl'] = docUrl 469: # process index.meta contents 470: if metaDom is not None and metaDom.tag == 'resource': 471: # document directory name and path 472: resource = self.metadataService.getResourceData(dom=metaDom) 473: if resource: 474: docinfo = self.getDocinfoFromResource(docinfo, resource) 475: 476: # texttool info 477: texttool = self.metadataService.getTexttoolData(dom=metaDom) 478: if texttool: 479: docinfo = self.getDocinfoFromTexttool(docinfo, texttool) 480: 481: # bib info 482: bib = self.metadataService.getBibData(dom=metaDom) 483: if bib: 484: docinfo = self.getDocinfoFromBib(docinfo, bib) 485: else: 486: # no bib - try info.xml 487: docinfo = self.getDocinfoFromPresentationInfoXml(docinfo) 488: 489: # auth info 490: access = self.metadataService.getAccessData(dom=metaDom) 491: if access: 492: docinfo = self.getDocinfoFromAccess(docinfo, access) 493: 494: # attribution info 495: attribution = self.metadataService.getAttributionData(dom=metaDom) 496: if attribution: 497: logging.debug("getDocinfo: attribution=%s"%repr(attribution)) 498: docinfo['attribution'] = attribution 499: #docinfo = self.getDocinfoFromAccess(docinfo, access) 500: 501: # copyright info 502: copyright = self.metadataService.getCopyrightData(dom=metaDom) 503: if copyright: 504: logging.debug("getDocinfo: copyright=%s"%repr(copyright)) 505: docinfo['copyright'] = copyright 506: #docinfo = self.getDocinfoFromAccess(docinfo, access) 507: 508: # image path 509: if mode != 'texttool': 510: # override image path from texttool 511: docinfo['imagePath'] = url.replace('/mpiwg/online/', '', 1) 512: 513: # number of images from digilib 514: if docinfo.get('imagePath', None): 515: docinfo['imageURL'] = self.digilibBaseUrl + "/servlet/Scaler?fn=" + docinfo['imagePath'] 516: docinfo = self.getDocinfoFromDigilib(docinfo, docinfo['imagePath']) 517: 518: logging.debug("documentViewer (getdocinfo) docinfo: keys=%s"%docinfo.keys()) 519: #logging.debug("documentViewer (getdocinfo) docinfo: %s"%docinfo) 520: # store in session 521: self.REQUEST.SESSION['docinfo'] = docinfo 522: return docinfo 523: 524: def getDocinfoFromResource(self, docinfo, resource): 525: """reads contents of resource element into docinfo""" 526: docName = resource.get('name', None) 527: docinfo['documentName'] = docName 528: docPath = resource.get('archive-path', None) 529: if docPath: 530: # clean up document path 531: if docPath[0] != '/': 532: docPath = '/' + docPath 533: 534: if docName and (not docPath.endswith(docName)): 535: docPath += "/" + docName 536: 537: else: 538: # use docUrl as docPath 539: docUrl = docinfo['documentURL'] 540: if not docUrl.startswith('http:'): 541: docPath = docUrl 542: if docPath: 543: # fix URLs starting with /mpiwg/online 544: docPath = docPath.replace('/mpiwg/online', '', 1) 545: 546: docinfo['documentPath'] = docPath 547: return docinfo 548: 549: def getDocinfoFromTexttool(self, docinfo, texttool): 550: """reads contents of texttool element into docinfo""" 551: # image dir 552: imageDir = texttool.get('image', None) 553: docPath = docinfo.get('documentPath', None) 554: if imageDir and docPath: 555: #print "image: ", imageDir, " archivepath: ", archivePath 556: imageDir = os.path.join(docPath, imageDir) 557: imageDir = imageDir.replace('/mpiwg/online', '', 1) 558: docinfo['imagePath'] = imageDir 559: 560: # old style text URL 561: textUrl = texttool.get('text', None) 562: if textUrl and docPath: 563: if urlparse.urlparse(textUrl)[0] == "": #keine url 564: textUrl = os.path.join(docPath, textUrl) 565: 566: docinfo['textURL'] = textUrl 567: 568: # new style text-url-path 569: textUrl = texttool.get('text-url-path', None) 570: if textUrl: 571: docinfo['textURLPath'] = textUrl 572: 573: # page flow 574: docinfo['pageFlow'] = texttool.get('page-flow', 'ltr') 575: 576: # odd pages are left 577: docinfo['oddPage'] = texttool.get('odd-scan-orientation', 'left') 578: 579: # number of title page (0: not defined) 580: docinfo['titlePage'] = texttool.get('title-scan-no', 0) 581: 582: # old presentation stuff 583: presentation = texttool.get('presentation', None) 584: if presentation and docPath: 585: if presentation.startswith('http:'): 586: docinfo['presentationUrl'] = presentation 587: else: 588: docinfo['presentationUrl'] = os.path.join(docPath, presentation) 589: 590: 591: return docinfo 592: 593: def getDocinfoFromBib(self, docinfo, bib): 594: """reads contents of bib element into docinfo""" 595: logging.debug("getDocinfoFromBib bib=%s"%repr(bib)) 596: # put all raw bib fields in dict "bib" 597: docinfo['bib'] = bib 598: bibtype = bib.get('@type', None) 599: docinfo['bibType'] = bibtype 600: # also store DC metadata for convenience 601: dc = self.metadataService.getDCMappedData(bib) 602: docinfo['creator'] = dc.get('creator',None) 603: docinfo['title'] = dc.get('title',None) 604: docinfo['date'] = dc.get('date',None) 605: return docinfo 606: 607: def getDocinfoFromAccess(self, docinfo, acc): 608: """reads contents of access element into docinfo""" 609: #TODO: also read resource type 610: logging.debug("getDocinfoFromAccess acc=%s"%repr(acc)) 611: try: 612: acctype = acc['@attr']['type'] 613: if acctype: 614: access=acctype 615: if access in ['group', 'institution']: 616: access = acc['name'].lower() 617: 618: docinfo['accessType'] = access 619: 620: except: 621: pass 622: 623: return docinfo 624: 625: def getDocinfoFromDigilib(self, docinfo, path): 626: infoUrl=self.digilibBaseUrl+"/dirInfo-xml.jsp?mo=dir&fn="+path 627: # fetch data 628: txt = getHttpData(infoUrl) 629: if not txt: 630: logging.error("Unable to get dir-info from %s"%(infoUrl)) 631: return docinfo 632: 633: dom = ET.fromstring(txt) 634: size = getText(dom.find("size")) 635: logging.debug("getDocinfoFromDigilib: size=%s"%size) 636: if size: 637: docinfo['numPages'] = int(size) 638: else: 639: docinfo['numPages'] = 0 640: 641: # TODO: produce and keep list of image names and numbers 642: return docinfo 643: 644: 645: def getDocinfoFromPresentationInfoXml(self,docinfo): 646: """gets DC-like bibliographical information from the presentation entry in texttools""" 647: url = docinfo.get('presentationUrl', None) 648: if not url: 649: logging.error("getDocinfoFromPresentation: no URL!") 650: return docinfo 651: 652: dom = None 653: metaUrl = None 654: if url.startswith("http://"): 655: # real URL 656: metaUrl = url 657: else: 658: # online path 659: 660: server=self.digilibBaseUrl+"/servlet/Texter?fn=" 661: metaUrl=server+url 662: 663: txt=getHttpData(metaUrl) 664: if txt is None: 665: logging.error("Unable to read info.xml from %s"%(url)) 666: return docinfo 667: 668: dom = ET.fromstring(txt) 669: docinfo['creator']=getText(dom.find(".//author")) 670: docinfo['title']=getText(dom.find(".//title")) 671: docinfo['date']=getText(dom.find(".//date")) 672: return docinfo 673: 674: 675: def getPageinfo(self, current, start=None, rows=None, cols=None, docinfo=None, viewMode=None, viewType=None, tocMode=None): 676: """returns pageinfo with the given parameters""" 677: pageinfo = {} 678: pageinfo['viewMode'] = viewMode 679: pageinfo['viewType'] = viewType 680: pageinfo['tocMode'] = tocMode 681: 682: current = getInt(current) 683: pageinfo['current'] = current 684: rows = int(rows or self.thumbrows) 685: pageinfo['rows'] = rows 686: cols = int(cols or self.thumbcols) 687: pageinfo['cols'] = cols 688: grpsize = cols * rows 689: pageinfo['groupsize'] = grpsize 690: # what does this do? 691: start = getInt(start, default=(math.ceil(float(current)/float(grpsize))*grpsize-(grpsize-1))) 692: # int(current / grpsize) * grpsize +1)) 693: pageinfo['start'] = start 694: pageinfo['end'] = start + grpsize 695: pn = self.REQUEST.get('pn','1') 696: pageinfo['pn'] = pn 697: np = int(docinfo.get('numPages', 0)) 698: if np == 0: 699: # numPages unknown - maybe we can get it from text page 700: if docinfo.get('textURLPath', None): 701: # cache text page as well 702: pageinfo['textPage'] = self.getTextPage(mode=viewType, pn=pn, docinfo=docinfo, pageinfo=pageinfo) 703: np = int(docinfo.get('numPages', 0)) 704: 705: pageinfo['end'] = min(pageinfo['end'], np) 706: pageinfo['numgroups'] = int(np / grpsize) 707: if np % grpsize > 0: 708: pageinfo['numgroups'] += 1 709: 710: pageinfo['characterNormalization'] = self.REQUEST.get('characterNormalization','reg') 711: pageinfo['query'] = self.REQUEST.get('query','') 712: pageinfo['queryType'] = self.REQUEST.get('queryType','') 713: pageinfo['querySearch'] =self.REQUEST.get('querySearch', 'fulltext') 714: pageinfo['highlightQuery'] = self.REQUEST.get('highlightQuery','') 715: pageinfo['tocPageSize'] = self.REQUEST.get('tocPageSize', '30') 716: pageinfo['queryPageSize'] =self.REQUEST.get('queryPageSize', '10') 717: pageinfo['tocPN'] = self.REQUEST.get('tocPN', '1') 718: # WTF?: 719: toc = int(pageinfo['tocPN']) 720: pageinfo['textPages'] = int(toc) 721: 722: # What does this do? 723: if 'tocSize_%s'%tocMode in docinfo: 724: tocSize = int(docinfo['tocSize_%s'%tocMode]) 725: tocPageSize = int(pageinfo['tocPageSize']) 726: # cached toc 727: if tocSize%tocPageSize>0: 728: tocPages=tocSize/tocPageSize+1 729: else: 730: tocPages=tocSize/tocPageSize 731: 732: pageinfo['tocPN'] = min(tocPages,toc) 733: 734: pageinfo['searchPN'] =self.REQUEST.get('searchPN','1') 735: return pageinfo 736: 737: 738: security.declareProtected('View management screens','changeDocumentViewerForm') 739: changeDocumentViewerForm = PageTemplateFile('zpt/changeDocumentViewer', globals()) 740: 741: def changeDocumentViewer(self,title="",digilibBaseUrl=None,thumbrows=2,thumbcols=5,authgroups='mpiwg',RESPONSE=None): 742: """init document viewer""" 743: self.title=title 744: self.digilibBaseUrl = digilibBaseUrl 745: self.thumbrows = thumbrows 746: self.thumbcols = thumbcols 747: self.authgroups = [s.strip().lower() for s in authgroups.split(',')] 748: try: 749: # assume MetaDataFolder instance is called metadata 750: self.metadataService = getattr(self, 'metadata') 751: except Exception, e: 752: logging.error("Unable to find MetaDataFolder 'metadata': "+str(e)) 753: 754: if RESPONSE is not None: 755: RESPONSE.redirect('manage_main') 756: 757: def manage_AddDocumentViewerForm(self): 758: """add the viewer form""" 759: pt=PageTemplateFile('zpt/addDocumentViewer', globals()).__of__(self) 760: return pt() 761: 762: def manage_AddDocumentViewer(self,id,imageScalerUrl="",textServerName="",title="",RESPONSE=None): 763: """add the viewer""" 764: newObj=documentViewer(id,imageScalerUrl=imageScalerUrl,title=title,textServerName=textServerName) 765: self._setObject(id,newObj) 766: 767: if RESPONSE is not None: 768: RESPONSE.redirect('manage_main') 769: 770: ## DocumentViewerTemplate class 771: class DocumentViewerTemplate(ZopePageTemplate): 772: """Template for document viewer""" 773: meta_type="DocumentViewer Template" 774: 775: 776: def manage_addDocumentViewerTemplateForm(self): 777: """Form for adding""" 778: pt=PageTemplateFile('zpt/addDocumentViewerTemplate', globals()).__of__(self) 779: return pt() 780: 781: def manage_addDocumentViewerTemplate(self, id='viewer_main', title=None, text=None, 782: REQUEST=None, submit=None): 783: "Add a Page Template with optional file content." 784: 785: self._setObject(id, DocumentViewerTemplate(id)) 786: ob = getattr(self, id) 787: txt=file(os.path.join(package_home(globals()),'zpt/viewer_main.zpt'),'r').read() 788: logging.info("txt %s:"%txt) 789: ob.pt_edit(txt,"text/html") 790: if title: 791: ob.pt_setTitle(title) 792: try: 793: u = self.DestinationURL() 794: except AttributeError: 795: u = REQUEST['URL1'] 796: 797: u = "%s/%s" % (u, urllib.quote(id)) 798: REQUEST.RESPONSE.redirect(u+'/manage_main') 799: return '' 800: 801: 802: