Diff for /documentViewer/documentViewer.py between versions 1.42 and 1.43

version 1.42, 2010/03/08 15:02:33 version 1.43, 2010/03/19 11:42:40
Line 12  from Ft.Xml import EMPTY_NAMESPACE, Pars Line 12  from Ft.Xml import EMPTY_NAMESPACE, Pars
   
   
 import Ft.Xml.XPath  import Ft.Xml.XPath
   import cStringIO
 import xmlrpclib  import xmlrpclib
 import os.path  import os.path
 import sys  import sys
Line 22  import math Line 23  import math
   
 import urlparse   import urlparse 
 from types import *  from types import *
   
 def logger(txt,method,txt2):  def logger(txt,method,txt2):
     """logging"""      """logging"""
     logging.info(txt+ txt2)      logging.info(txt+ txt2)
Line 45  def getTextFromNode(nodename): Line 47  def getTextFromNode(nodename):
            rc = rc + node.data             rc = rc + node.data
     return rc      return rc
   
   def serializeNode(node, encoding='utf-8'):
       """returns a string containing node as XML"""
       buf = cStringIO.StringIO()
       Print(node, stream=buf, encoding=encoding)
       s = buf.getvalue()
       buf.close()
       return s
   
                   
 def getParentDir(path):  def getParentDir(path):
     """returns pathname shortened by one"""      """returns pathname shortened by one"""
Line 78  class documentViewer(Folder): Line 88  class documentViewer(Folder):
     # templates and forms      # templates and forms
     viewer_main = PageTemplateFile('zpt/viewer_main', globals())      viewer_main = PageTemplateFile('zpt/viewer_main', globals())
     thumbs_main = PageTemplateFile('zpt/thumbs_main', globals())      thumbs_main = PageTemplateFile('zpt/thumbs_main', globals())
     image_main = PageTemplateFile('zpt/image_main', globals())      image_main = PageTemplateFile('zpt/image_main', globals()) # obsolete!
       page_main_images = PageTemplateFile('zpt/page_main_images', globals())
       page_main_text = PageTemplateFile('zpt/page_main_text', globals())
     head_main = PageTemplateFile('zpt/head_main', globals())      head_main = PageTemplateFile('zpt/head_main', globals())
     docuviewer_css = PageTemplateFile('css/docuviewer.css', globals())      docuviewer_css = PageTemplateFile('css/docuviewer.css', globals())
     info_xml = PageTemplateFile('zpt/info_xml', globals())      info_xml = PageTemplateFile('zpt/info_xml', globals())
Line 88  class documentViewer(Folder): Line 100  class documentViewer(Folder):
     changeDocumentViewerForm = PageTemplateFile('zpt/changeDocumentViewer', globals())      changeDocumentViewerForm = PageTemplateFile('zpt/changeDocumentViewer', globals())
   
           
     def __init__(self,id,imageViewerUrl,textViewerUrl=None,title="",digilibBaseUrl=None,thumbcols=2,thumbrows=10,authgroups="mpiwg"):      def __init__(self,id,imageScalerUrl=None,textServerName=None,title="",digilibBaseUrl=None,thumbcols=2,thumbrows=10,authgroups="mpiwg"):
         """init document viewer"""          """init document viewer"""
         self.id=id          self.id=id
         self.title=title          self.title=title
         self.imageViewerUrl=imageViewerUrl  
         self.textViewerUrl=textViewerUrl  
           
         if not digilibBaseUrl:  
             self.digilibBaseUrl = self.findDigilibUrl()  
         else:  
             self.digilibBaseUrl = digilibBaseUrl  
         self.thumbcols = thumbcols          self.thumbcols = thumbcols
         self.thumbrows = thumbrows          self.thumbrows = thumbrows
         # authgroups is list of authorized groups (delimited by ,)          # authgroups is list of authorized groups (delimited by ,)
         self.authgroups = [s.strip().lower() for s in authgroups.split(',')]          self.authgroups = [s.strip().lower() for s in authgroups.split(',')]
         # add template folder so we can always use template.something          # create template folder so we can always use template.something
         self.manage_addFolder('template')          
           templateFolder = Folder('template')
           #self['template'] = templateFolder # Zope-2.12 style
           self._setObject('template',templateFolder) # old style
           try:
               from Products.XMLRpcTools.XMLRpcTools import XMLRpcServerProxy
               xmlRpcClient = XMLRpcServerProxy(id='fulltextclient', serverUrl=textServerName, use_xmlrpc=False)
               #templateFolder['fulltextclient'] = xmlRpcClient
               templateFolder._setObject('fulltextclient',xmlRpcClient)
           except Exception, e:
               logging.error("Unable to create XMLRpcTools for fulltextclient: "+str(e))
           try:
               from Products.zogiLib.zogiLib import zogiLib
               zogilib = zogiLib(id="zogilib", title="zogilib for docuviewer", dlServerURL=imageScalerUrl, layout="book")
               #templateFolder['zogilib'] = zogilib
               templateFolder._setObject('zogilib',zogilib)
           except Exception, e:
               logging.error("Unable to create zogiLib for zogilib: "+str(e))
   
   
     security.declareProtected('View','thumbs_rss')      security.declareProtected('View','thumbs_rss')
Line 116  class documentViewer(Folder): Line 138  class documentViewer(Folder):
         @param viewMode: if images display images, if text display text, default is images (text,images or auto)          @param viewMode: if images display images, if text display text, default is images (text,images or auto)
                   
         '''          '''
         logging.info("HHHHHHHHHHHHHH:load the rss")          logging.debug("HHHHHHHHHHHHHH:load the rss")
         logger("documentViewer (index)", logging.INFO, "mode: %s url:%s start:%s pn:%s"%(mode,url,start,pn))          logger("documentViewer (index)", logging.INFO, "mode: %s url:%s start:%s pn:%s"%(mode,url,start,pn))
                   
         if not hasattr(self, 'template'):          if not hasattr(self, 'template'):
Line 139  class documentViewer(Folder): Line 161  class documentViewer(Folder):
         return pt(docinfo=docinfo,pageinfo=pageinfo,viewMode=viewMode)          return pt(docinfo=docinfo,pageinfo=pageinfo,viewMode=viewMode)
       
     security.declareProtected('View','index_html')      security.declareProtected('View','index_html')
     def index_html(self,mode,url,viewMode="auto",start=None,pn=1,mk=None):      def index_html(self,url,mode="texttool",viewMode="auto",start=None,pn=1,mk=None):
         '''          '''
         view it          view it
         @param mode: defines how to access the document behind url           @param mode: defines how to access the document behind url 
Line 148  class documentViewer(Folder): Line 170  class documentViewer(Folder):
                   
         '''          '''
                   
         logger("documentViewer (index)", logging.INFO, "mode: %s url:%s start:%s pn:%s"%(mode,url,start,pn))          logging.debug("documentViewer (index) mode: %s url:%s start:%s pn:%s"%(mode,url,start,pn))
                   
         if not hasattr(self, 'template'):          if not hasattr(self, 'template'):
             # create template folder if it doesn't exist              # this won't work
             self.manage_addFolder('template')              logging.error("template folder missing!")
               return "ERROR: template folder missing!"
                           
         if not self.digilibBaseUrl:          if not getattr(self, 'digilibBaseUrl', None):
             self.digilibBaseUrl = self.findDigilibUrl() or "http://nausikaa.mpiwg-berlin.mpg.de/digitallibrary"              self.digilibBaseUrl = self.findDigilibUrl() or "http://nausikaa.mpiwg-berlin.mpg.de/digitallibrary"
                           
         docinfo = self.getDocinfo(mode=mode,url=url)          docinfo = self.getDocinfo(mode=mode,url=url)
Line 162  class documentViewer(Folder): Line 185  class documentViewer(Folder):
         pt = getattr(self.template, 'viewer_main')          pt = getattr(self.template, 'viewer_main')
                   
         if viewMode=="auto": # automodus gewaehlt          if viewMode=="auto": # automodus gewaehlt
             if docinfo.get("textURL",'') and self.textViewerUrl: #texturl gesetzt und textViewer konfiguriert              if docinfo.get("textURL",''): #texturl gesetzt und textViewer konfiguriert
                 viewMode="text"                  viewMode="text"
             else:              else:
                 viewMode="images"                  viewMode="images"
Line 180  class documentViewer(Folder): Line 203  class documentViewer(Folder):
             ret+="mk=%s"%m              ret+="mk=%s"%m
         return ret          return ret
           
       def findDigilibUrl(self):
           """try to get the digilib URL from zogilib"""
           url = self.template.zogilib.getDLBaseUrl()
           return url
       
       def getStyle(self, idx, selected, style=""):
           """returns a string with the given style and append 'sel' if path == selected."""
           #logger("documentViewer (getstyle)", logging.INFO, "idx: %s selected: %s style: %s"%(idx,selected,style))
           if idx == selected:
               return style + 'sel'
           else:
               return style
       
     def getLink(self,param=None,val=None):      def getLink(self,param=None,val=None):
         """link to documentviewer with parameter param set to val"""          """link to documentviewer with parameter param set to val"""
         params=self.REQUEST.form.copy()          params=self.REQUEST.form.copy()
Line 189  class documentViewer(Folder): Line 225  class documentViewer(Folder):
                     del params[param]                      del params[param]
             else:              else:
                 params[param] = str(val)                  params[param] = str(val)
         if params["mode"] == "filepath": #wenn beim erst Aufruf filepath gesetzt wurde aendere das nun zu imagepath                  
           if params.get("mode", None) == "filepath": #wenn beim erst Aufruf filepath gesetzt wurde aendere das nun zu imagepath
                 params["mode"] = "imagepath"                  params["mode"] = "imagepath"
                 params["url"] = getParentDir(params["url"])                  params["url"] = getParentDir(params["url"])
                                   
Line 225  class documentViewer(Folder): Line 262  class documentViewer(Folder):
         return pt(docinfo=docinfo)          return pt(docinfo=docinfo)
   
           
     def getStyle(self, idx, selected, style=""):  
         """returns a string with the given style and append 'sel' if path == selected."""  
         #logger("documentViewer (getstyle)", logging.INFO, "idx: %s selected: %s style: %s"%(idx,selected,style))  
         if idx == selected:  
             return style + 'sel'  
         else:  
             return style  
   
     def getTextLanguage(self,url,docinfo):  
         docinfo['lang']=getTextFromNode(dom.xpath("//bib/lang")[0])  
         lang = urlencode({'':docinfo['lang']})  
         return lang  
           
           
     def isAccessible(self, docinfo):      def isAccessible(self, docinfo):
         """returns if access to the resource is granted"""          """returns if access to the resource is granted"""
         access = docinfo.get('accessType', None)          access = docinfo.get('accessType', None)
Line 292  class documentViewer(Folder): Line 315  class documentViewer(Folder):
         else:          else:
             docinfo['numPages'] = 0              docinfo['numPages'] = 0
                                                   
           # TODO: produce and keep list of image names and numbers
                           
         return docinfo          return docinfo
           
                           
Line 431  class documentViewer(Folder): Line 456  class documentViewer(Folder):
         return docinfo          return docinfo
           
           
     def getNumPages(self, xquery, docinfo=None): #New Method 24.02.2010  
        text=self.viewerTemplates.query.eval("/mpdl/interface/xquery.xql","document="+ docinfo['textURLPath'] +"&xquery="+str(xquery))  
        docinfo['numPages'] = text.count("<pb ")  
        return docinfo  
          
           
     def getDocinfoFromTextTool(self,url,dom=None,docinfo=None):      def getDocinfoFromTextTool(self,url,dom=None,docinfo=None):
        """parse texttool tag in index meta"""         """parse texttool tag in index meta"""
        logger("documentViewer (getdocinfofromtexttool)", logging.INFO,"url: %s"%(url))         logger("documentViewer (getdocinfofromtexttool)", logging.INFO,"url: %s"%(url))
Line 528  class documentViewer(Folder): Line 547  class documentViewer(Folder):
                presentationUrl=url.replace('index.meta',presentationPath)                 presentationUrl=url.replace('index.meta',presentationPath)
            else:             else:
                presentationUrl=url + "/" + presentationPath                 presentationUrl=url + "/" + presentationPath
            docinfo=self.getNumPages('//pb', docinfo) #im moment einfach auf eins setzen, navigation ueber die thumbs geht natuerlich nicht                  docinfo = self.getNumPages(docinfo) #im moment einfach auf eins setzen, navigation ueber die thumbs geht natuerlich nicht    
            docinfo = self.getBibinfoFromTextToolPresentation(presentationUrl,docinfo=docinfo,dom=dom)             docinfo = self.getBibinfoFromTextToolPresentation(presentationUrl,docinfo=docinfo,dom=dom)
   
        docinfo = self.getAuthinfoFromIndexMeta(url,docinfo=docinfo,dom=dom)   # get access info         docinfo = self.getAuthinfoFromIndexMeta(url,docinfo=docinfo,dom=dom)   # get access info
Line 536  class documentViewer(Folder): Line 555  class documentViewer(Folder):
        return docinfo         return docinfo
         
         
   
      
      
     def getBibinfoFromTextToolPresentation(self,url,docinfo=None,dom=None):      def getBibinfoFromTextToolPresentation(self,url,docinfo=None,dom=None):
         """gets the bibliographical information from the preseantion entry in texttools          """gets the bibliographical information from the preseantion entry in texttools
         """          """
Line 619  class documentViewer(Folder): Line 641  class documentViewer(Folder):
         pageinfo['start'] = start          pageinfo['start'] = start
         pageinfo['end'] = start + grpsize          pageinfo['end'] = start + grpsize
         if docinfo is not None:          if docinfo is not None:
               
             np = int(docinfo['numPages'])              np = int(docinfo['numPages'])
             pageinfo['end'] = min(pageinfo['end'], np)              pageinfo['end'] = min(pageinfo['end'], np)
             pageinfo['numgroups'] = int(np / grpsize)              pageinfo['numgroups'] = int(np / grpsize)
Line 628  class documentViewer(Folder): Line 649  class documentViewer(Folder):
   
         return pageinfo          return pageinfo
                                   
     def text(self,mode,url,pn):  
         """give text"""  
         if mode=="texttool": #index.meta with texttool information  
             (viewerUrl,imagepath,textpath)=parseUrlTextTool(url)  
           
         #print textpath  
         try:  
             dom = NonvalidatingReader.parseUri(textpath)  
         except:  
             return None  
       
         list=[]  
         nodes=dom.xpath("//pb")  
   
         node=nodes[int(pn)-1]  
           
         p=node  
                   
         while p.tagName!="p":  
             p=p.parentNode  
                   
       def getNumPages(self,docinfo=None):
           """get list of pages from fulltext and put in docinfo"""
           xquery = '//pb'
           text = self.template.fulltextclient.eval("/mpdl/interface/xquery.xql", "document=%s&xquery=%s"%(docinfo['textURLPath'],xquery))
           # TODO: better processing of the page list. do we need the info somewhere else also?
           docinfo['numPages'] = text.count("<pb ")
           return docinfo
                   
         endNode=nodes[int(pn)]      def getTextPage(self, mode="text", pn=1, docinfo=None):
                   """returns single page from fulltext"""
                   pagexml=self.template.fulltextclient.eval("/mpdl/interface/page-fragment.xql", "document=%s&mode=%s&pn=%s"%(docinfo['textURLPath'],mode,pn), outputUnicode=False)
         e=endNode          # post-processing downloaded xml
                   pagedom = Parse(pagexml)
         while e.tagName!="p":          # plain text mode
             e=e.parentNode          if mode == "text":
                       # first div contains text
                       pagedivs = pagedom.xpath("/div")
         next=node.parentNode              if len(pagedivs) > 0:
                           pagenode = pagedivs[0]
         #sammle s                  return serializeNode(pagenode)
         while next and (next!=endNode.parentNode):  
             list.append(next)              # text-with-links mode
             next=next.nextSibling              if mode == "textPollux":
         list.append(endNode.parentNode)              # first div contains text
                       pagedivs = pagedom.xpath("/div")
         if p==e:# beide im selben paragraphen              if len(pagedivs) > 0:
             pass                  pagenode = pagedivs[0]
 #    else:                  # check all a-tags
 #            next=p                  links = pagenode.xpath("//a")
 #            while next!=e:                  for l in links:
 #                print next,e                      hrefNode = l.getAttributeNodeNS(None, u"href")
 #                list.append(next)                      if hrefNode:
 #                next=next.nextSibling                          # is link with href
 #                                      href = hrefNode.nodeValue
 #        for x in list:                          if href.startswith('lt/lex.xql'):
 #            PrettyPrint(x)                              # is pollux link
 #                              selfurl = self.absolute_url()
 #        return list                              # change href
 #                              hrefNode.nodeValue = href.replace('lt/lex.xql','%s/head_main_voc'%selfurl)
                               # add target
     def findDigilibUrl(self):                              l.setAttributeNS(None, 'target', '_blank')
         """try to get the digilib URL from zogilib"""                  return serializeNode(pagenode)
         url = self.imageViewerUrl[:-1] + "/getScalerUrl"  
         #print urlparse.urlparse(url)[0]  
         #print urlparse.urljoin(self.absolute_url(),url)  
         logging.info("finddigiliburl: %s"%urlparse.urlparse(url)[0])  
         logging.info("finddigiliburl: %s"%urlparse.urljoin(self.absolute_url(),url))  
                   
         try:          return "no text here"
             if urlparse.urlparse(url)[0]=='': #relative path  
                 url=urlparse.urljoin(self.absolute_url()+"/",url)  
                                   
             scaler = urlopen(url).read()  
             return scaler.replace("/servlet/Scaler?", "")  
         except:  
             return None  
           
     def changeDocumentViewer(self,imageViewerUrl,textViewerUrl,title="",digilibBaseUrl=None,thumbrows=2,thumbcols=10,authgroups='mpiwg',RESPONSE=None):      def changeDocumentViewer(self,title="",digilibBaseUrl=None,thumbrows=2,thumbcols=10,authgroups='mpiwg',RESPONSE=None):
         """init document viewer"""          """init document viewer"""
         self.title=title          self.title=title
         self.imageViewerUrl=imageViewerUrl  
         self.textViewerUrl=textViewerUrl  
         self.digilibBaseUrl = digilibBaseUrl          self.digilibBaseUrl = digilibBaseUrl
         self.thumbrows = thumbrows          self.thumbrows = thumbrows
         self.thumbcols = thumbcols          self.thumbcols = thumbcols
Line 713  class documentViewer(Folder): Line 709  class documentViewer(Folder):
           
           
                   
           
 #    security.declareProtected('View management screens','renameImageForm')  
   
 def manage_AddDocumentViewerForm(self):  def manage_AddDocumentViewerForm(self):
     """add the viewer form"""      """add the viewer form"""
     pt=PageTemplateFile('zpt/addDocumentViewer', globals()).__of__(self)      pt=PageTemplateFile('zpt/addDocumentViewer', globals()).__of__(self)
     return pt()      return pt()
       
 def manage_AddDocumentViewer(self,id,imageViewerUrl="",textViewerUrl="",title="",RESPONSE=None):  def manage_AddDocumentViewer(self,id,imageScalerUrl="",textServerName="",title="",RESPONSE=None):
     """add the viewer"""      """add the viewer"""
     newObj=documentViewer(id,imageViewerUrl,title=title,textViewerUrl=textViewerUrl)      newObj=documentViewer(id,imageScalerUrl=imageScalerUrl,title=title,textServerName=textServerName)
     self._setObject(id,newObj)      self._setObject(id,newObj)
           
     if RESPONSE is not None:      if RESPONSE is not None:

Removed from v.1.42  
changed lines
  Added in v.1.43


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