Changeset 130:5c779d7b5f71 in documentViewer


Ignore:
Timestamp:
Jun 17, 2010, 4:48:14 PM (14 years ago)
Author:
casties
Branch:
default
Message:

more modular version with separate object MpdlXmlTextServer?

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • __init__.py

    r21 r130  
    11import documentViewer
    2 
     2import MpdlXmlTextServer
    33
    44def initialize(context):
     
    1919          )
    2020        )
     21
     22    context.registerClass(
     23        MpdlXmlTextServer.MpdlXmlTextServer,
     24        constructors = (
     25          MpdlXmlTextServer.manage_addMpdlXmlTextServerForm,
     26          MpdlXmlTextServer.manage_addMpdlXmlTextServer
     27          )
     28        )
    2129   
  • documentViewer.py

    r128 r130  
    33from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
    44from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    5 from Products.PythonScripts.standard import url_quote
    65from AccessControl import ClassSecurityInfo
    76from AccessControl import getSecurityManager
    87from Globals import package_home
    98
    10 from Ft.Xml.Domlette import NonvalidatingReader
     9from Ft.Xml import EMPTY_NAMESPACE, Parse
    1110from Ft.Xml.Domlette import PrettyPrint, Print
    12 from Ft.Xml import EMPTY_NAMESPACE, Parse
    13 
    14 from xml.dom.minidom import parse, parseString
    15 
    16 
    17 
    18 import Ft.Xml.XPath
    19 import cStringIO
    20 import xmlrpclib
    2111import os.path
    2212import sys
    23 import cgi
    2413import urllib
     14import urllib2
    2515import logging
    2616import math
    27 
    2817import urlparse
    29 from types import *
     18import cStringIO
    3019
    3120def logger(txt,method,txt2):
     
    6655       
    6756
    68 import socket
    69 
    70 def urlopen(url,timeout=2):
    71         """urlopen mit timeout"""
    72         socket.setdefaulttimeout(timeout)
    73         ret=urllib.urlopen(url)
    74         socket.setdefaulttimeout(5)
    75         return ret
     57def getHttpData(url, data=None, num_tries=3, timeout=10):
     58    """returns result from url+data HTTP request"""
     59    # we do GET (by appending data to url)
     60    if isinstance(data, str) or isinstance(data, unicode):
     61        # if data is string then append
     62        url = "%s?%s"%(url,data)
     63    elif isinstance(data, dict) or isinstance(data, list) or isinstance(data, tuple):
     64        # urlencode
     65        url = "%s?%s"%(url,urllib.urlencode(data))
     66   
     67    response = None
     68    errmsg = None
     69    for cnt in range(num_tries):
     70        try:
     71            logging.debug("getHttpData(#%s %ss) url=%s"%(cnt+1,timeout,url))
     72            if sys.version_info < (2, 6):
     73                # set timeout on socket -- ugly :-(
     74                import socket
     75                socket.setdefaulttimeout(float(timeout))
     76                response = urllib2.urlopen(url)
     77            else:
     78                response = urllib2.urlopen(url,timeout=float(timeout))
     79            # check result?
     80            break
     81        except urllib2.HTTPError, e:
     82            logging.error("getHttpData: HTTP error(%s): %s"%(e.code,e))
     83            errmsg = str(e)
     84            # stop trying
     85            break
     86        except urllib2.URLError, e:
     87            logging.error("getHttpData: URLLIB error(%s): %s"%(e.reason,e))
     88            errmsg = str(e)
     89            # stop trying
     90            #break
     91
     92    if response is not None:
     93        data = response.read()
     94        response.close()
     95        return data
     96   
     97    raise IOError("ERROR fetching HTTP data from %s: %s"%(url,errmsg))
     98    #return None
     99
    76100
    77101
     
    81105class documentViewer(Folder):
    82106    """document viewer"""
    83     #textViewerUrl="http://127.0.0.1:8080/HFQP/testXSLT/getPage?"
    84    
    85107    meta_type="Document viewer"
    86108   
     
    102124    docuviewer_css = PageTemplateFile('css/docuviewer.css', globals())
    103125    info_xml = PageTemplateFile('zpt/info_xml', globals())
    104 
     126   
     127   
    105128    thumbs_main_rss = PageTemplateFile('zpt/thumbs_main_rss', globals())
    106129    security.declareProtected('View management screens','changeDocumentViewerForm')   
     
    122145        self._setObject('template',templateFolder) # old style
    123146        try:
    124             from Products.XMLRpcTools.XMLRpcTools import XMLRpcServerProxy
    125             xmlRpcClient = XMLRpcServerProxy(id='fulltextclient', serverUrl=textServerName, use_xmlrpc=False)
     147            import MpdlXmlTextServer
     148            textServer = MpdlXmlTextServer(id='fulltextclient')
    126149            #templateFolder['fulltextclient'] = xmlRpcClient
    127             templateFolder._setObject('fulltextclient',xmlRpcClient)
     150            templateFolder._setObject('fulltextclient',textServer)
    128151        except Exception, e:
    129             logging.error("Unable to create XMLRpcTools for fulltextclient: "+str(e))
     152            logging.error("Unable to create MpdlXmlTextServer for fulltextclient: "+str(e))
    130153        try:
    131154            from Products.zogiLib.zogiLib import zogiLib
     
    136159            logging.error("Unable to create zogiLib for zogilib: "+str(e))
    137160       
    138 
     161       
     162    # proxy text server methods to fulltextclient
     163    def getTextPage(self, **args):
     164        """get page"""
     165        return self.template.fulltextclient.getTextPage(**args)
     166
     167    def getQuery(self, **args):
     168        """get query"""
     169        return self.template.fulltextclient.getQuery(**args)
     170
     171    def getSearch(self, **args):
     172        """get search"""
     173        return self.template.fulltextclient.getSearch(**args)
     174
     175    def getNumPages(self, **args):
     176        """get numpages"""
     177        return self.template.fulltextclient.getNumPages(**args)
     178
     179    def getTranslate(self, **args):
     180        """get translate"""
     181        return self.template.fulltextclient.getTranslate(**args)
     182
     183    def getLemma(self, **args):
     184        """get lemma"""
     185        return self.template.fulltextclient.getLemma(**args)
     186
     187    def getToc(self, **args):
     188        """get toc"""
     189        return self.template.fulltextclient.getToc(**args)
     190
     191    def getTocPage(self, **args):
     192        """get tocpage"""
     193        return self.template.fulltextclient.getTocPage(**args)
     194
     195   
    139196    security.declareProtected('View','thumbs_rss')
    140197    def thumbs_rss(self,mode,url,viewMode="auto",start=None,pn=1):
     
    161218       
    162219        if viewMode=="auto": # automodus gewaehlt
    163             if docinfo.get("textURL",'') and self.textViewerUrl: #texturl gesetzt und textViewer konfiguriert
     220            if docinfo.has_key("textURL") or docinfo.has_key('textURLPath'): #texturl gesetzt und textViewer konfiguriert
    164221                viewMode="text"
    165222            else:
     
    197254           
    198255        if viewMode=="auto": # automodus gewaehlt
    199             if docinfo.get("textURL",''): #texturl gesetzt und textViewer konfiguriert
     256            if docinfo.has_key("textURL") or docinfo.has_key('textURLPath'): #texturl gesetzt und textViewer konfiguriert
    200257                viewMode="text_dict"
    201258            else:
     
    265322               
    266323        # quote values and assemble into query string
    267         logging.info("XYXXXXX: %s"%repr(params.items()))
     324        logging.debug("XYXXXXX: %s"%repr(params.items()))
    268325        ps = "&amp;".join(["%s=%s"%(k,urllib.quote(v)) for (k, v) in params.items()])
    269326        url=self.REQUEST['URL1']+"?"+ps
     
    284341        """returns if access to the resource is granted"""
    285342        access = docinfo.get('accessType', None)
    286         logger("documentViewer (accessOK)", logging.INFO, "access type %s"%access)
     343        logging.debug("documentViewer (accessOK) access type %s"%access)
    287344        if access is not None and access == 'free':
    288             logger("documentViewer (accessOK)", logging.INFO, "access is free")
     345            logging.debug("documentViewer (accessOK) access is free")
    289346            return True
    290347        elif access is None or access in self.authgroups:
     
    297354                return False
    298355       
    299         logger("documentViewer (accessOK)", logging.INFO, "unknown access type %s"%access)
     356        logging.debug("documentViewer (accessOK) unknown access type %s"%access)
    300357        return False
    301358   
     
    303360    def getDirinfoFromDigilib(self,path,docinfo=None,cut=0):
    304361        """gibt param von dlInfo aus"""
    305         num_retries = 3
    306362        if docinfo is None:
    307363            docinfo = {}
     
    313369        infoUrl=self.digilibBaseUrl+"/dirInfo-xml.jsp?mo=dir&fn="+path
    314370   
    315         logger("documentViewer (getparamfromdigilib)", logging.INFO, "dirInfo from %s"%(infoUrl))
    316        
    317         for cnt in range(num_retries):
    318             try:
    319                 # dom = NonvalidatingReader.parseUri(imageUrl)
    320                 txt=urllib.urlopen(infoUrl).read()
    321                 dom = Parse(txt)
    322                 break
    323             except:
    324                 logger("documentViewer (getdirinfofromdigilib)", logging.ERROR, "error reading %s (try %d)"%(infoUrl,cnt))
    325         else:
     371        logging.debug("documentViewer (getparamfromdigilib) dirInfo from %s"%(infoUrl))
     372       
     373        txt = getHttpData(infoUrl)
     374        if txt is None:
    326375            raise IOError("Unable to get dir-info from %s"%(infoUrl))
    327        
     376
     377        dom = Parse(txt)
    328378        sizes=dom.xpath("//dir/size")
    329         logger("documentViewer (getparamfromdigilib)", logging.INFO, "dirInfo:size"%sizes)
     379        logging.debug("documentViewer (getparamfromdigilib) dirInfo:size"%sizes)
    330380       
    331381        if sizes:
     
    341391    def getIndexMeta(self, url):
    342392        """returns dom of index.meta document at url"""
    343         num_retries = 3
    344393        dom = None
    345394        metaUrl = None
     
    353402            if not metaUrl.endswith("index.meta"):
    354403                metaUrl += "/index.meta"
    355         logging.debug("METAURL: %s"%metaUrl)
    356         for cnt in range(num_retries):
    357             try:
    358                 # patch dirk encoding fehler treten dann nicht mehr auf
    359                 # dom = NonvalidatingReader.parseUri(metaUrl)
    360                 txt=urllib.urlopen(metaUrl).read()
    361                 dom = Parse(txt)
    362                 break
    363             except:
    364                 logger("ERROR documentViewer (getIndexMeta)", logging.INFO,"%s (%s)"%sys.exc_info()[0:2])
    365404               
    366         if dom is None:
     405        logging.debug("(getIndexMeta): METAURL: %s"%metaUrl)
     406        txt=getHttpData(metaUrl)
     407        if txt is None:
    367408            raise IOError("Unable to read index meta from %s"%(url))
    368                  
     409       
     410        dom = Parse(txt)
    369411        return dom
    370412   
    371413    def getPresentationInfoXML(self, url):
    372414        """returns dom of info.xml document at url"""
    373         num_retries = 3
    374415        dom = None
    375416        metaUrl = None
     
    382423            metaUrl=server+url.replace("/mpiwg/online","")
    383424       
    384         for cnt in range(num_retries):
    385             try:
    386                 # patch dirk encoding fehler treten dann nicht mehr auf
    387                 # dom = NonvalidatingReader.parseUri(metaUrl)
    388                 txt=urllib.urlopen(metaUrl).read()
    389                 dom = Parse(txt)
    390                 break
    391             except:
    392                 logger("ERROR documentViewer (getPresentationInfoXML)", logging.INFO,"%s (%s)"%sys.exc_info()[0:2])
    393                
    394         if dom is None:
     425        txt=getHttpData(metaUrl)
     426        if txt is None:
    395427            raise IOError("Unable to read infoXMLfrom %s"%(url))
    396                  
     428           
     429        dom = Parse(txt)
    397430        return dom
    398431                       
     
    400433    def getAuthinfoFromIndexMeta(self,path,docinfo=None,dom=None,cut=0):
    401434        """gets authorization info from the index.meta file at path or given by dom"""
    402         logger("documentViewer (getauthinfofromindexmeta)", logging.INFO,"path: %s"%(path))
     435        logging.debug("documentViewer (getauthinfofromindexmeta) path: %s"%(path))
    403436       
    404437        access = None
     
    476509    def getDocinfoFromTextTool(self, url, dom=None, docinfo=None):
    477510        """parse texttool tag in index meta"""
    478         logger("documentViewer (getdocinfofromtexttool)", logging.INFO, "url: %s" % (url))
     511        logging.debug("documentViewer (getdocinfofromtexttool) url: %s" % (url))
    479512        if docinfo is None:
    480513           docinfo = {}
     
    491524            archiveName = getTextFromNode(archiveNames[0])
    492525        else:
    493             logger("documentViewer (getdocinfofromtexttool)", logging.WARNING, "resource/name missing in: %s" % (url))
     526            logging.warning("documentViewer (getdocinfofromtexttool) resource/name missing in: %s" % (url))
    494527       
    495528        archivePaths = dom.xpath("//resource/archive-path")
     
    503536        else:
    504537            # try to get archive-path from url
    505             logger("documentViewer (getdocinfofromtexttool)", logging.WARNING, "resource/archive-path missing in: %s" % (url))
     538            logging.warning("documentViewer (getdocinfofromtexttool) resource/archive-path missing in: %s" % (url))
    506539            if (not url.startswith('http')):
    507540                archivePath = url.replace('index.meta', '')
     
    536569            viewerUrl = getTextFromNode(viewerUrls[0])
    537570            docinfo['viewerURL'] = viewerUrl
    538                    
     571       
     572        # old style text URL
    539573        textUrls = dom.xpath("//texttool/text")
    540574        if textUrls and (len(textUrls) > 0):
     
    548582            docinfo['textURL'] = textUrl
    549583   
     584        # new style text-url-path
    550585        textUrls = dom.xpath("//texttool/text-url-path")
    551586        if textUrls and (len(textUrls) > 0):
     
    595630    def getDocinfoFromImagePath(self,path,docinfo=None,cut=0):
    596631        """path ist the path to the images it assumes that the index.meta file is one level higher."""
    597         logger("documentViewer (getdocinfofromimagepath)", logging.INFO,"path: %s"%(path))
     632        logging.debug("documentViewer (getdocinfofromimagepath) path: %s"%(path))
    598633        if docinfo is None:
    599634            docinfo = {}
     
    605640        for x in range(cut):       
    606641                path=getParentDir(path)
    607         logging.error("PATH:"+path)
     642        logging.debug("documentViewer (getdocinfofromimagepath) PATH:"+path)
    608643        imageUrl=self.digilibBaseUrl+"/servlet/Scaler?fn="+path
    609644        docinfo['imageURL'] = imageUrl
     
    617652    def getDocinfo(self, mode, url):
    618653        """returns docinfo depending on mode"""
    619         logger("documentViewer (getdocinfo)", logging.INFO,"mode: %s, url: %s"%(mode,url))
     654        logging.debug("documentViewer (getdocinfo) mode: %s, url: %s"%(mode,url))
    620655        # look for cached docinfo in session
    621656        if self.REQUEST.SESSION.has_key('docinfo'):
     
    623658            # check if its still current
    624659            if docinfo is not None and docinfo.get('mode') == mode and docinfo.get('url') == url:
    625                 logger("documentViewer (getdocinfo)", logging.INFO,"docinfo in session: %s"%docinfo)
     660                logging.debug("documentViewer (getdocinfo) docinfo in session: %s"%docinfo)
    626661                return docinfo
    627662        # new docinfo
     
    634669            docinfo = self.getDocinfoFromImagePath(url, docinfo=docinfo,cut=1)
    635670        else:
    636             logger("documentViewer (getdocinfo)", logging.ERROR,"unknown mode!")
     671            logging.error("documentViewer (getdocinfo) unknown mode: %s!"%mode)
    637672            raise ValueError("Unknown mode %s! Has to be one of 'texttool','imagepath','filepath'."%(mode))
    638673                       
    639         logger("documentViewer (getdocinfo)", logging.INFO,"docinfo: %s"%docinfo)
     674        logging.debug("documentViewer (getdocinfo) docinfo: %s"%docinfo)
    640675        self.REQUEST.SESSION['docinfo'] = docinfo
    641676        return docinfo
     
    687722        pageinfo['sn'] =self.REQUEST.get('sn','')
    688723        return pageinfo
    689                
    690     def getSearch(self, pn=1, pageinfo=None,  docinfo=None, query=None, queryType=None, lemma=None):
    691         """get search list"""
    692         docpath = docinfo['textURLPath']
    693         url = docinfo['url']
    694         logging.debug("documentViewer (gettoc) docpath: %s"%(docpath))
    695         logging.debug("documentViewer (gettoc) url: %s"%(url))
    696         pagesize = pageinfo['queryPageSize']
    697         pn = pageinfo['searchPN']
    698         sn = pageinfo['sn']
    699         highlightQuery = pageinfo['highlightQuery']
    700         query =pageinfo['query']
    701         queryType =pageinfo['queryType']
    702         viewMode=  pageinfo['viewMode']
    703         tocMode = pageinfo['tocMode']
    704         tocPN = pageinfo['tocPN']
    705         selfurl = self.absolute_url()
    706         page=self.template.fulltextclient.eval("/mpdl/interface/doc-query.xql","document=%s&mode=%s&queryType=%s&query=%s&queryResultPageSize=%s&queryResultPN=%s&sn=%s&viewMode=%s&highlightQuery=%s"%(docpath, 'text', queryType, query, pagesize, pn, sn, viewMode,highlightQuery) ,outputUnicode=False)               
    707         pagexml = page.replace('?document=%s'%str(docpath),'?url=%s'%url)
    708         pagedom = Parse(pagexml)
    709         if (queryType=="fulltext")or(queryType=="xpath")or(queryType=="xquery")or(queryType=="fulltextMorphLemma"):   
    710             pagedivs = pagedom.xpath("//div[@class='queryResultPage']")
    711             if len(pagedivs)>0:
    712                 pagenode=pagedivs[0]
    713                 links=pagenode.xpath("//a")
    714                 for l in links:
    715                     hrefNode = l.getAttributeNodeNS(None, u"href")
    716                     if hrefNode:
    717                         href = hrefNode.nodeValue
    718                         if href.startswith('page-fragment.xql'):
    719                             selfurl = self.absolute_url()           
    720                             pagexml=href.replace('mode=text','mode=texttool&viewMode=%s&queryType=%s&query=%s&queryResultPageSize=%s&queryResultPN=%s&tocMode=%s&searchPN=%s&tocPN=%s'%(viewMode,queryType,query,pagesize,pn,tocMode,pn,tocPN))
    721                             hrefNode.nodeValue = pagexml.replace('page-fragment.xql','%s'%selfurl)                                           
    722                 return serializeNode(pagenode)       
    723         if (queryType=="fulltextMorph"):
    724             pagedivs = pagedom.xpath("//div[@class='queryResult']")
    725             if len(pagedivs)>0:
    726                 pagenode=pagedivs[0]
    727                 links=pagenode.xpath("//a")
    728                 for l in links:
    729                     hrefNode = l.getAttributeNodeNS(None, u"href")
    730                     if hrefNode:
    731                         href = hrefNode.nodeValue
    732                         if href.startswith('page-fragment.xql'):
    733                             selfurl = self.absolute_url()       
    734                             pagexml=href.replace('mode=text','mode=texttool&viewMode=%s&queryType=%s&query=%s&queryResultPageSize=%s&queryResultPN=%s&tocMode=%s&searchPN=%s&tocPN=%s'%(viewMode,queryType,query,pagesize,pn,tocMode,pn,tocPN))
    735                             hrefNode.nodeValue = pagexml.replace('page-fragment.xql','%s'%selfurl) 
    736                         if href.startswith('../lt/lemma.xql'):
    737                             hrefNode.nodeValue = href.replace('../lt/lemma.xql','%s/template/head_main_lemma_New'%(selfurl))       
    738                             l.setAttributeNS(None, 'target', '_blank')
    739                             l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=400, scrollbars=1'); return false;")
    740                             l.setAttributeNS(None, 'onDblclick', 'popupWin.focus();') 
    741                 pagedivs = pagedom.xpath("//div[@class='queryResultMorphExpansion']")               
    742                 return serializeNode(pagenode)       
    743         if (queryType=="ftIndex")or(queryType=="ftIndexMorph"):
    744             pagedivs= pagedom.xpath("//div[@class='queryResultPage']")
    745             if len(pagedivs)>0:
    746                 pagenode=pagedivs[0]
    747                 links=pagenode.xpath("//a")
    748                 for l in links:
    749                     hrefNode = l.getAttributeNodeNS(None, u"href")
    750                     if hrefNode:
    751                         href = hrefNode.nodeValue
    752                         hrefNode.nodeValue=href.replace('mode=text','mode=texttool&viewMode=%s&tocMode=%s&tocPN=%s&pn=%s'%(viewMode,tocMode,tocPN,pn))             
    753                         if href.startswith('../lt/lex.xql'):
    754                             hrefNode.nodeValue = href.replace('../lt/lex.xql','%s/template/head_main_voc'%selfurl)         
    755                             l.setAttributeNS(None, 'target', '_blank')
    756                             l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=400, scrollbars=1'); return false;")
    757                             l.setAttributeNS(None, 'onDblclick', 'popupWin.focus();')
    758                         if href.startswith('../lt/lemma.xql'):
    759                             hrefNode.nodeValue = href.replace('../lt/lemma.xql','%s/template/head_main_lemma'%selfurl)       
    760                             l.setAttributeNS(None, 'target', '_blank')
    761                             l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=400, scrollbars=1'); return false;")
    762                             l.setAttributeNS(None, 'onDblclick', 'popupWin.focus();')
    763                 return serializeNode(pagenode)     
    764         return "no text here"   
    765                        
    766     def getNumPages(self,docinfo=None):
    767         """get list of pages from fulltext and put in docinfo"""
    768         xquery = '//pb'
    769         text = self.template.fulltextclient.eval("/mpdl/interface/xquery.xql", "document=%s&xquery=%s"%(docinfo['textURLPath'],xquery))
    770         # TODO: better processing of the page list. do we need the info somewhere else also?
    771         docinfo['numPages'] = text.count("<pb ")
    772         return docinfo
    773        
    774     def getTextPage(self, mode="text", pn=1, docinfo=None, pageinfo=None, highlightQuery=None,sn=None, viewMode=None, tocMode=None, tocPN=None):
    775         """returns single page from fulltext"""
    776         docpath = docinfo['textURLPath']
    777         path = docinfo['textURLPath']
    778         url = docinfo['url']
    779         viewMode= pageinfo['viewMode']
    780         tocMode = pageinfo['tocMode']
    781         tocPN = pageinfo['tocPN']
    782         selfurl = self.absolute_url()   
    783         if mode == "text_dict":
    784             textmode = "textPollux"
    785         else:
    786             textmode = mode
    787        
    788         textParam = "document=%s&mode=%s&pn=%s"%(docpath,textmode,pn)
    789         if highlightQuery is not None:
    790             textParam +="&highlightQuery=%s&sn=%s"%(highlightQuery,sn)           
    791         pagexml=self.template.fulltextclient.eval("/mpdl/interface/page-fragment.xql", textParam, outputUnicode=False)
    792         pagedom = Parse(pagexml)
    793         # plain text mode
    794         if mode == "text":
    795             # first div contains text
    796             pagedivs = pagedom.xpath("/div")
    797             if len(pagedivs) > 0:     
    798                 pagenode = pagedivs[0]
    799                 links = pagenode.xpath("//a")
    800                 for l in links:
    801                     hrefNode = l.getAttributeNodeNS(None, u"href")
    802                     if hrefNode:
    803                         href= hrefNode.nodeValue
    804                         if href.startswith('#note-'):
    805                             hrefNode.nodeValue = href.replace('#note-',"?url=%s&viewMode=%s&tocMode=%s&tocPN=%s&pn=%s#note-"%(url,viewMode,tocMode,tocPN,pn))
    806                 return serializeNode(pagenode)
    807         if mode == "xml":
    808               # first div contains text
    809               pagedivs = pagedom.xpath("/div")
    810               if len(pagedivs) > 0:
    811                   pagenode = pagedivs[0]
    812                   return serializeNode(pagenode)
    813         if mode == "pureXml":
    814               # first div contains text
    815               pagedivs = pagedom.xpath("/div")
    816               if len(pagedivs) > 0:
    817                   pagenode = pagedivs[0]
    818                   return serializeNode(pagenode)     
    819         # text-with-links mode
    820         if mode == "text_dict":
    821             # first div contains text
    822             pagedivs = pagedom.xpath("/div")
    823             if len(pagedivs) > 0:
    824                 pagenode = pagedivs[0]
    825                 # check all a-tags
    826                 links = pagenode.xpath("//a")
    827                 for l in links:
    828                     hrefNode = l.getAttributeNodeNS(None, u"href")
    829                     if hrefNode:
    830                         # is link with href
    831                         href = hrefNode.nodeValue
    832                         if href.startswith('lt/lex.xql'):
    833                             # is pollux link
    834                             selfurl = self.absolute_url()
    835                             # change href
    836                             hrefNode.nodeValue = href.replace('lt/lex.xql','%s/template/head_main_voc'%selfurl)
    837                             # add target
    838                             l.setAttributeNS(None, 'target', '_blank')
    839                             l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=700, scrollbars=1'); return false;")
    840                             l.setAttributeNS(None, 'onDblclick', 'popupWin.focus();')     
    841                         if href.startswith('lt/lemma.xql'):   
    842                             selfurl = self.absolute_url()
    843                             hrefNode.nodeValue = href.replace('lt/lemma.xql','%s/template/head_main_lemma'%selfurl)
    844                             l.setAttributeNS(None, 'target', '_blank')
    845                             l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=700, scrollbars=1'); return false;")
    846                             l.setAttributeNS(None, 'onDblclick', 'popupWin.focus();')   
    847                         if href.startswith('#note-'):
    848                             hrefNode.nodeValue = href.replace('#note-',"?url=%s&viewMode=%s&tocMode=%s&tocPN=%s&pn=%s#note-"%(url,viewMode,tocMode,tocPN,pn))   
    849                 return serializeNode(pagenode)
    850         return "no text here"
    851 
    852     def getTranslate(self, query=None, language=None):
    853         """translate into another languages"""
    854         pagexml=self.template.fulltextclient.eval("/mpdl/interface/lt/lex.xql","document=&language="+str(language)+"&query="+url_quote(str(query)))
    855         return pagexml
    856    
    857     def getLemma(self, lemma=None, language=None):
    858         """simular words lemma """
    859         pagexml=self.template.fulltextclient.eval("/mpdl/interface/lt/lemma.xql","document=&language="+str(language)+"&lemma="+url_quote(str(lemma)))
    860         return pagexml
    861    
    862     def getLemmaNew(self, query=None, language=None):
    863         """simular words lemma """
    864         pagexml=self.template.fulltextclient.eval("/mpdl/interface/lt/lemma.xql","document=&language="+str(language)+"&lemma="+url_quote(str(query)))
    865         return pagexml
    866 
    867     def getQuery (self,  docinfo=None, pageinfo=None, query=None, queryType=None, pn=1):
    868          """number of"""
    869          docpath = docinfo['textURLPath']
    870          pagesize = pageinfo['queryPageSize']
    871          pn = pageinfo['searchPN']
    872          query =pageinfo['query']
    873          queryType =pageinfo['queryType']
    874          tocSearch = 0
    875          tocDiv = None
    876          pagexml=self.template.fulltextclient.eval("/mpdl/interface/doc-query.xql","document=%s&mode=%s&queryType=%s&query=%s&queryResultPageSize=%s&queryResultPN=%s"%(docpath, 'text', queryType, query, pagesize, pn) ,outputUnicode=False)
    877          pagedom = Parse(pagexml)
    878          numdivs = pagedom.xpath("//div[@class='queryResultHits']")
    879          tocSearch = int(getTextFromNode(numdivs[0]))
    880          tc=int((tocSearch/10)+1)
    881          logging.debug("documentViewer (gettoc) tc: %s"%(tc))
    882          return tc
    883 
    884     def getToc(self, mode="text", docinfo=None):
    885         """loads table of contents and stores in docinfo"""
    886         logging.debug("documentViewer (gettoc) mode: %s"%(mode))
    887         if mode == "none":
    888             return docinfo       
    889         if 'tocSize_%s'%mode in docinfo:
    890             # cached toc
    891             return docinfo
    892        
    893         docpath = docinfo['textURLPath']
    894         # we need to set a result set size
    895         pagesize = 1000
    896         pn = 1
    897         if mode == "text":
    898             queryType = "toc"
    899         else:
    900             queryType = mode
    901         # number of entries in toc
    902         tocSize = 0
    903         tocDiv = None
    904         pagexml=self.template.fulltextclient.eval("/mpdl/interface/doc-query.xql", "document=%s&queryType=%s&queryResultPageSize=%s&queryResultPN=%s"%(docpath,queryType,pagesize,pn), outputUnicode=False)
    905         # post-processing downloaded xml
    906         pagedom = Parse(pagexml)
    907         # get number of entries
    908         numdivs = pagedom.xpath("//div[@class='queryResultHits']")
    909         if len(numdivs) > 0:
    910             tocSize = int(getTextFromNode(numdivs[0]))
    911         docinfo['tocSize_%s'%mode] = tocSize
    912         return docinfo
    913    
    914 def getTocPage(self, mode="text", pn=1, pageinfo=None, docinfo=None):
    915         """returns single page from the table of contents"""
    916         # TODO: this should use the cached TOC
    917         if mode == "text":
    918             queryType = "toc"
    919         else:
    920             queryType = mode
    921         docpath = docinfo['textURLPath']
    922         path = docinfo['textURLPath']       
    923         pagesize = pageinfo['tocPageSize']
    924         pn = pageinfo['tocPN']
    925         url = docinfo['url']
    926         selfurl = self.absolute_url() 
    927         viewMode=  pageinfo['viewMode']
    928         tocMode = pageinfo['tocMode']
    929         tocPN = pageinfo['tocPN']   
    930         pagexml=self.template.fulltextclient.eval("/mpdl/interface/doc-query.xql", "document=%s&queryType=%s&queryResultPageSize=%s&queryResultPN=%s"%(docpath,queryType, pagesize, pn), outputUnicode=False)
    931         page = pagexml.replace('page-fragment.xql?document=%s'%str(path),'%s?url=%s&viewMode=%s&tocMode=%s&tocPN=%s'%(selfurl,url, viewMode, tocMode, tocPN))
    932         text = page.replace('mode=image','mode=texttool')
    933         return text
    934724   
    935725def changeDocumentViewer(self,title="",digilibBaseUrl=None,thumbrows=2,thumbcols=5,authgroups='mpiwg',RESPONSE=None):
  • version.txt

    r85 r130  
    1 DocumentViewer 0.3.0
     1DocumentViewer 0.5.1
Note: See TracChangeset for help on using the changeset viewer.