Diff for /documentViewer/MpdlXmlTextServer.py between versions 1.238.2.1 and 1.238.2.14

version 1.238.2.1, 2011/07/14 17:43:56 version 1.238.2.14, 2011/08/16 16:27:08
Line 1 Line 1
   
 from OFS.SimpleItem import SimpleItem  from OFS.SimpleItem import SimpleItem
 from Products.PageTemplates.PageTemplateFile import PageTemplateFile   from Products.PageTemplates.PageTemplateFile import PageTemplateFile 
   
 from Ft.Xml import EMPTY_NAMESPACE, Parse  from Ft.Xml import EMPTY_NAMESPACE, Parse
 from Ft.Xml.Domlette import NonvalidatingReader  from Ft.Xml.Domlette import NonvalidatingReader
 import Ft.Xml.Domlette  import Ft.Xml.Domlette
Line 8  import cStringIO Line 8  import cStringIO
   
 import xml.etree.ElementTree as ET  import xml.etree.ElementTree as ET
   
 import md5  import re
 import sys  
 import logging  import logging
 import urllib  import urllib
 import documentViewer  
 #from documentViewer import getTextFromNode, serializeNode  
   
 def getText(node):  from SrvTxtUtils import getInt, getText, getHttpData
     """get the cdata content of a node"""  
     if node is None:  
         return ""  
     # ET:  
     text = node.text or ""  
     for e in node:  
         text += gettext(e)  
         if e.tail:  
             text += e.tail  
   
     return text  
   
 def serialize(node):  def serialize(node):
     """returns a string containing an XML snippet of node"""      """returns a string containing an XML snippet of node"""
Line 43  def getTextFromNode(node): Line 29  def getTextFromNode(node):
     """get the cdata content of a node"""      """get the cdata content of a node"""
     if node is None:      if node is None:
         return ""          return ""
     # ET:  
     #text = node.text or ""  
     #for e in node:  
     #    text += gettext(e)  
     #    if e.tail:  
     #        text += e.tail  
   
     # 4Suite:      # 4Suite:
     nodelist=node.childNodes      nodelist=node.childNodes
Line 82  class MpdlXmlTextServer(SimpleItem): Line 62  class MpdlXmlTextServer(SimpleItem):
           
     manage_changeMpdlXmlTextServerForm = PageTemplateFile("zpt/manage_changeMpdlXmlTextServer", globals())      manage_changeMpdlXmlTextServerForm = PageTemplateFile("zpt/manage_changeMpdlXmlTextServer", globals())
                   
     def __init__(self,id,title="",serverUrl="http://mpdl-system.mpiwg-berlin.mpg.de/mpdl/interface/", serverName=None, timeout=40):      def __init__(self,id,title="",serverUrl="http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/interface/", serverName=None, timeout=40):
     #def __init__(self,id,title="",serverUrl="http://mpdl-text.mpiwg-berlin.mpg.de:30030/mpdl/interface/", serverName=None, timeout=40):      
           
         """constructor"""          """constructor"""
         self.id=id          self.id=id
         self.title=title          self.title=title
Line 96  class MpdlXmlTextServer(SimpleItem): Line 74  class MpdlXmlTextServer(SimpleItem):
                   
     def getHttpData(self, url, data=None):      def getHttpData(self, url, data=None):
         """returns result from url+data HTTP request"""          """returns result from url+data HTTP request"""
         return documentViewer.getHttpData(url,data,timeout=self.timeout)          return getHttpData(url,data,timeout=self.timeout)
           
     def getServerData(self, method, data=None):      def getServerData(self, method, data=None):
         """returns result from text server for method+data"""          """returns result from text server for method+data"""
         url = self.serverUrl+method          url = self.serverUrl+method
         return documentViewer.getHttpData(url,data,timeout=self.timeout)          return getHttpData(url,data,timeout=self.timeout)
   
       # WTF: what does this really do? can it be integrated in getPage?
     def getSearch(self, pageinfo=None,  docinfo=None):      def getSearch(self, pageinfo=None,  docinfo=None):
         """get search list"""          """get search list"""
           logging.debug("getSearch()")
         docpath = docinfo['textURLPath']           docpath = docinfo['textURLPath'] 
         url = docinfo['url']          url = docinfo['url']
         pagesize = pageinfo['queryPageSize']          pagesize = pageinfo['queryPageSize']
         pn = pageinfo.get('searchPN',1)          pn = pageinfo.get('searchPN',1)
         sn = pageinfo['sn']          sn = pageinfo.get('sn',None) #TODO: is this s now?
         highlightQuery = pageinfo['highlightQuery']          highlightQuery = pageinfo['highlightQuery']
         query =pageinfo['query']          query =pageinfo['query']
         queryType =pageinfo['queryType']          queryType =pageinfo['queryType']
Line 201  class MpdlXmlTextServer(SimpleItem): Line 181  class MpdlXmlTextServer(SimpleItem):
         if not docpath:          if not docpath:
             return None              return None
   
         url = docinfo['url']  
         selfurl = self.absolute_url()  
         pn = pageinfo['current']          pn = pageinfo['current']
         hrefList=[]          hrefList=[]
         myList= ""          myList= ""
         text=self.getServerData("xpath.xql", "document=%s&xpath=%s&pn=%s"%(docinfo['textURLPath'],xpath,pn))          text=self.getServerData("xpath.xql", "document=%s&xpath=%s&pn=%s"%(docinfo['textURLPath'],xpath,pn))
         dom = Parse(text)          dom = ET.fromstring(text)
         result = dom.xpath("//result/resultPage/place")          result = dom.findall(".//result/resultPage/place")
         for l in result:          for l in result:
             hrefNode= l.getAttributeNodeNS(None, u"id")              href = l.get("id")
             href= hrefNode.nodeValue  
             hrefList.append(href)              hrefList.append(href)
               # WTF: what does this do?
             myList = ",".join(hrefList)              myList = ",".join(hrefList)
         #logging.debug("getGisPlaces :%s"%(myList))                                       #logging.debug("getGisPlaces :%s"%(myList))                             
         return myList          return myList
Line 220  class MpdlXmlTextServer(SimpleItem): Line 198  class MpdlXmlTextServer(SimpleItem):
     def getAllGisPlaces (self, docinfo=None, pageinfo=None):      def getAllGisPlaces (self, docinfo=None, pageinfo=None):
         """Show all Gis Places of whole Book """          """Show all Gis Places of whole Book """
         xpath ='//echo:place'          xpath ='//echo:place'
         docpath =docinfo['textURLPath']  
         url = docinfo['url']  
         selfurl =self.absolute_url()  
         pn =pageinfo['current']  
         hrefList=[]          hrefList=[]
         myList=""          myList=""
         text=self.getServerData("xpath.xql", "document=%s&xpath=%s"%(docinfo['textURLPath'],xpath))          text=self.getServerData("xpath.xql", "document=%s&xpath=%s"%(docinfo['textURLPath'],xpath))
         dom =Parse(text)          dom = ET.fromstring(text)
         result = dom.xpath("//result/resultPage/place")          result = dom.findall(".//result/resultPage/place")
                   
         for l in result:          for l in result:
             hrefNode = l.getAttributeNodeNS(None, u"id")              href = l.get("id")
             href= hrefNode.nodeValue  
             hrefList.append(href)              hrefList.append(href)
               # WTF: what does this do?
             myList = ",".join(hrefList)              myList = ",".join(hrefList)
             #logging.debug("getALLGisPlaces :%s"%(myList))              #logging.debug("getALLGisPlaces :%s"%(myList))
         return myList          return myList
                       
       def processPageInfo(self, dom, docinfo, pageinfo):
           """processes page info divs from dom and stores in docinfo and pageinfo"""
           # assume first second level div is pageMeta
           alldivs = dom.find("div")
           
           if alldivs is None or alldivs.get('class', '') != 'pageMeta':
               logging.error("processPageInfo: pageMeta div not found!")
               return
                         
     def getTextPage(self, mode="text_dict", pn=1, docinfo=None, pageinfo=None):          for div in alldivs:
               dc = div.get('class')
               
               # pageNumberOrig  
               if dc == 'pageNumberOrig':
                   pageinfo['pageNumberOrig'] = div.text
                   
               # pageNumberOrigNorm
               elif dc == 'pageNumberOrigNorm':
                   pageinfo['pageNumberOrigNorm'] = div.text
                   
               # pageHeaderTitle
               elif dc == 'pageHeaderTitle':
                   pageinfo['pageHeaderTitle'] = div.text
                   
               # numFigureEntries
               elif dc == 'countFigureEntries':
                   docinfo['numFigureEntries'] = getInt(div.text)
                   
               # numTocEntries
               elif dc == 'countTocEntries':
                   # WTF: s1 = int(s)/30+1
                   docinfo['numTocEntries'] = getInt(div.text)
                   
               # numPlaces
               elif dc == 'countPlaces':
                   docinfo['numPlaces'] = getInt(div.text)
                   
               # numTextPages
               elif dc == 'countPages':
                   np = getInt(div.text)                    
                   if np > 0:
                       docinfo['numTextPages'] = np
                       if docinfo.get('numPages', 0) == 0:
                           # seems to be text-only - update page count
                           docinfo['numPages'] = np
                           #pageinfo['end'] = min(pageinfo['end'], np)
                           pageinfo['numgroups'] = int(np / pageinfo['groupsize'])
                           if np % pageinfo['groupsize'] > 0:
                               pageinfo['numgroups'] += 1
           
           #logging.debug("processPageInfo: pageinfo=%s"%repr(pageinfo))
           return
            
              
       def getTextPage(self, mode="text", pn=1, docinfo=None, pageinfo=None):
         """returns single page from fulltext"""          """returns single page from fulltext"""
           logging.debug("getTextPage mode=%s, pn=%s"%(mode,pn))
           # check for cached text -- but ideally this shouldn't be called twice
           if pageinfo.has_key('textPage'):
               logging.debug("getTextPage: using cached text")
               return pageinfo['textPage']
           
         docpath = docinfo['textURLPath']          docpath = docinfo['textURLPath']
         path = docinfo['textURLPath']          # just checking
         url = docinfo.get('url',None)          if pageinfo['current'] != pn:
         name = docinfo.get('name',None)              logging.warning("getTextPage: current!=pn!")
         pn =pageinfo['current']              
         sn = pageinfo['sn']          # stuff for constructing full urls
         #optionToggle =pageinfo ['optionToggle']          url = docinfo['url']
         highlightQuery = pageinfo['highlightQuery']          urlmode = docinfo['mode']
         #mode = pageinfo ['viewMode']          sn = pageinfo.get('sn', None)
         tocMode = pageinfo['tocMode']          highlightQuery = pageinfo.get('highlightQuery', None)
         characterNormalization=pageinfo['characterNormalization']          tocMode = pageinfo.get('tocMode', None)
         tocPN = pageinfo['tocPN']          tocPN = pageinfo.get('tocPN',None)
         selfurl = self.absolute_url()             characterNormalization = pageinfo.get('characterNormalization', None)
         if mode == "text_dict":          
           selfurl = docinfo['viewerUrl']
           
           if mode == "dict" or mode == "text_dict":
               # dict is called textPollux in the backend
             textmode = "textPollux"              textmode = "textPollux"
           elif not mode:
               # default is text
               mode = "text"
               textmode = "text"
         else:          else:
             textmode = mode              textmode = mode
                   
         textParam = "document=%s&mode=%s&pn=%s&characterNormalization=%s"%(docpath,textmode,pn,characterNormalization)          textParam = "document=%s&mode=%s&pn=%s&characterNormalization=%s"%(docpath,textmode,pn,characterNormalization)
         if highlightQuery is not None:          if highlightQuery:
             textParam +="&highlightQuery=%s&sn=%s"%(urllib.quote(highlightQuery),sn)                         textParam +="&highlightQuery=%s&sn=%s"%(urllib.quote(highlightQuery),sn)           
                   
           # fetch the page
         pagexml = self.getServerData("page-fragment.xql",textParam)          pagexml = self.getServerData("page-fragment.xql",textParam)
         dom = ET.fromstring(pagexml)          dom = ET.fromstring(pagexml)
         #dom = NonvalidatingReader.parseStream(pagexml)          # extract additional info
                   self.processPageInfo(dom, docinfo, pageinfo)
         #original Pages          # page content is in <div class="pageContent">
         #pagedivs = dom.xpath("//div[@class='pageNumberOrig']")         
           
         """if pagedivs == dom.xpath("//div[@class='pageNumberOrig']"):  
             if len(pagedivs)>0:  
                 docinfo['pageNumberOrig']= getTextFromNode(pagedivs[0])  
                 logging.debug("ORIGINAL PAGE: %s"%(docinfo['pageNumberOrig']))  
           
         #original Pages Norm  
         pagedivs = dom.xpath("//div[@class='pageNumberOrigNorm']")  
         if pagedivs == dom.xpath("//div[@class='pageNumberOrigNorm']"):  
             if len(pagedivs)>0:  
                 docinfo['pageNumberOrigNorm']= getTextFromNode(pagedivs[0])  
                 logging.debug("ORIGINAL PAGE NORM: %s"%(docinfo['pageNumberOrigNorm']))  
         """  
         #figureEntries  
 #        pagedivs = dom.xpath("//div[@class='countFigureEntries']")  
 #        if pagedivs == dom.xpath("//div[@class='countFigureEntries']"):  
 #            if len(pagedivs)>0:  
 #                docinfo['countFigureEntries'] = getTextFromNode(pagedivs[0])  
 #                s = getTextFromNode(pagedivs[0])  
 #                if s=='0':  
 #                    try:  
 #                        docinfo['countFigureEntries'] = int(s)  
 #                    except:  
 #                        docinfo['countFigureEntries'] = 0  
 #                else:  
 #                    s1 = int(s)/30+1  
 #                    try:  
 #                        docinfo['countFigureEntries'] = int(s1)  
 #                    except:  
 #                        docinfo['countFigureEntries'] = 0        
 #          
 #        #allPlaces  
 #        pagedivs = dom.xpath("//div[@class='countPlaces']")  
 #        if pagedivs == dom.xpath("//div[@class='countPlaces']"):  
 #            if len(pagedivs)>0:  
 #                docinfo['countPlaces']= getTextFromNode(pagedivs[0])  
 #                s = getTextFromNode(pagedivs[0])  
 #                try:  
 #                    docinfo['countPlaces'] = int(s)  
 #                except:  
 #                    docinfo['countPlaces'] = 0  
 #          
 #        #tocEntries  
 #        pagedivs = dom.xpath("//div[@class='countTocEntries']")  
 #        if pagedivs == dom.xpath("//div[@class='countTocEntries']"):  
 #            if len(pagedivs)>0:  
 #                docinfo['countTocEntries'] = int(getTextFromNode(pagedivs[0]))  
 #                s = getTextFromNode(pagedivs[0])  
 #                if s=='0':  
 #                    try:  
 #                        docinfo['countTocEntries'] = int(s)  
 #                    except:  
 #                        docinfo['countTocEntries'] = 0  
 #                else:  
 #                    s1 = int(s)/30+1  
 #                    try:  
 #                        docinfo['countTocEntries'] = int(s1)  
 #                    except:  
 #                        docinfo['countTocEntries'] = 0  
           
         #numTextPages  
         #pagedivs = dom.xpath("//div[@class='countPages']")  
         alldivs = dom.findall(".//div")  
         pagediv = None          pagediv = None
           # ElementTree 1.2 in Python 2.6 can't do div[@class='pageContent']
           # so we look at the second level divs
           alldivs = dom.findall("div")
         for div in alldivs:          for div in alldivs:
             dc = div.get('class')              dc = div.get('class')
               # page content div
             if dc == 'pageContent':              if dc == 'pageContent':
                 pagediv = div                  pagediv = div
                   
             if dc == 'countPages':  
                 try:  
                     np = int(div.text)                      
                     docinfo['numPages'] = np  
                     pageinfo['end'] = min(pageinfo['end'], np)  
                     pageinfo['numgroups'] = int(np / pageinfo['groupsize'])  
                     if np % pageinfo['groupsize'] > 0:  
                         pageinfo['numgroups'] += 1  
                                  
                 except:  
                     docinfo['numPages'] = 0  
   
                 break                  break
                                       
 # ROC: why?                    
 #            else:  
 #                #no full text -- init to 0  
 #                docinfo['pageNumberOrig'] = 0  
 #                docinfo['countFigureEntries'] = 0  
 #                docinfo['countPlaces'] = 0  
 #                docinfo['countTocEntries'] = 0  
 #                docinfo['numPages'] = 0  
 #                docinfo['pageNumberOrigNorm'] = 0  
 #                #return docinfo  
           
         # plain text mode          # plain text mode
         if mode == "text":          if mode == "text":
             #pagedivs = dom.xpath("/div")              # get full url assuming documentViewer is parent
             if pagediv:              selfurl = self.getLink()
               if pagediv is not None:
                 links = pagediv.findall(".//a")                  links = pagediv.findall(".//a")
                 for l in links:                  for l in links:
                     href = l.get('href')                      href = l.get('href')
                     if href and href.startswith('#note-'):                      if href and href.startswith('#note-'):
                         href = href.replace('#note-',"?url=%s&viewMode=text&tocMode=%s&tocPN=%s&pn=%s#note-"%(url,tocMode,tocPN,pn))                          href = href.replace('#note-',"%s#note-"%selfurl)
                         l.set('href', href)                          l.set('href', href)
                 logging.debug("page=%s"%ET.tostring(pagediv, 'UTF-8'))  
                 return serialize(pagediv)  
               
         if mode == "xml":  
             if pagediv:  
                 return serialize(pagediv)  
                           
         if mode == "pureXml":  
             if pagediv:  
                 return serialize(pagediv)                  return serialize(pagediv)
                                       
         if mode == "gis":  
             if pagediv:  
                 # check all a-tags  
                 links = pagediv.findall(".//a")  
                 for l in links:  
                     href = l.get('href')  
                     if href:  
                         if href.startswith('http://chinagis.mpiwg-berlin.mpg.de'):  
                             l.set('href', href.replace('chinagis_REST/REST/db/chgis/mpdl','chinagis/REST/db/mpdl/%s'%name))  
                             l.set('target', '_blank')   
                               
                 return serialize(pagenode)  
                       
         # text-with-links mode          # text-with-links mode
         if mode == "text_dict":          elif mode == "dict":
             if pagediv:              if pagediv is not None:
                   viewerurl = docinfo['viewerUrl']
                   selfurl = self.getLink()
                 # check all a-tags                  # check all a-tags
                 links = pagediv.findall(".//a")                  links = pagediv.findall(".//a")
                 for l in links:                  for l in links:
Line 408  class MpdlXmlTextServer(SimpleItem): Line 348  class MpdlXmlTextServer(SimpleItem):
                     if href:                      if href:
                         # is link with href                          # is link with href
                         if href.startswith('http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/interface/lt/wordInfo.xql'):                          if href.startswith('http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/interface/lt/wordInfo.xql'):
                             # is pollux link                              # is dictionary link - change href (keeping parameters)
                             selfurl = self.absolute_url()                              l.set('href', href.replace('http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/interface/lt/wordInfo.xql','%s/template/viewer_wordinfo'%viewerurl))
                             # change href                              # add target to open new page
                             l.set('href', href.replace('http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/interface/lt/wordInfo.xql','%s/head_main_voc'%selfurl))  
                             # add target  
                             l.set('target', '_blank')                              l.set('target', '_blank')
                                                                                                                       
                           # TODO: is this needed?
                         if href.startswith('http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/lt/lemma.xql'):                              if href.startswith('http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/lt/lemma.xql'):    
                             selfurl = self.absolute_url()                              selfurl = self.absolute_url()
                             l.set('href', href.replace('http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/lt/lemma.xql','%s/head_main_lemma'%selfurl))                              l.set('href', href.replace('http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/lt/lemma.xql','%s/head_main_lemma'%selfurl))
Line 423  class MpdlXmlTextServer(SimpleItem): Line 362  class MpdlXmlTextServer(SimpleItem):
                             l.set('ondblclick', 'popupWin.focus();')                                 l.set('ondblclick', 'popupWin.focus();')   
                                           
                         if href.startswith('#note-'):                          if href.startswith('#note-'):
                             l.set('href', href.replace('#note-',"?url=%s&viewMode=text_dict&tocMode=%s&tocPN=%s&pn=%s#note-"%(url,tocMode,tocPN,pn)))                              # note link
                               l.set('href', href.replace('#note-',"%s#note-"%selfurl))
                                                               
                 return serialize(pagediv)                  return serialize(pagediv)
                           
         return "no text here"          # xml mode
           elif mode == "xml":
               if pagediv is not None:
                   return serialize(pagediv)
           
     def getOrigPages(self, docinfo=None, pageinfo=None):          # pureXml mode
         docpath = docinfo['textURLPath']          elif mode == "pureXml":
         pn =pageinfo['current']              if pagediv is not None:
         selfurl = self.absolute_url()                     return serialize(pagediv)
         pagexml = self.getServerData("page-fragment.xql","document=%s&pn=%s"%(docpath, pn))  
         dom = Parse(pagexml)  
         pagedivs = dom.xpath("//div[@class='pageNumberOrig']")  
         if pagedivs == dom.xpath("//div[@class='pageNumberOrig']"):  
             if len(pagedivs)>0:  
                 docinfo['pageNumberOrig']= getTextFromNode(pagedivs[0])          
                 return docinfo['pageNumberOrig']  
           
     def getOrigPagesNorm(self, docinfo=None, pageinfo=None):          # gis mode
         docpath = docinfo['textURLPath']          elif mode == "gis":
         pn =pageinfo['current']              name = docinfo['name']
         selfurl = self.absolute_url()                 if pagediv is not None:
         pagexml = self.getServerData("page-fragment.xql","document=%s&pn=%s"%(docpath, pn))                  # check all a-tags
         dom = Parse(pagexml)                  links = pagediv.findall(".//a")
         pagedivs = dom.xpath("//div[@class='pageNumberOrigNorm']")                  for l in links:
         if pagedivs == dom.xpath("//div[@class='pageNumberOrigNorm']"):                      href = l.get('href')
             if len(pagedivs)>0:                      if href:
                 docinfo['pageNumberOrigNorm']= getTextFromNode(pagedivs[0])                                  if href.startswith('http://chinagis.mpiwg-berlin.mpg.de'):
                 return docinfo['pageNumberOrigNorm']                              l.set('href', href.replace('chinagis_REST/REST/db/chgis/mpdl','chinagis/REST/db/mpdl/%s'%name))
                               l.set('target', '_blank') 
                               
                   return serialize(pagediv)
   
           return "no text here"
                                   
     def getTranslate(self, word=None, language=None):      # TODO: should be getWordInfo
         """translate into another languages"""      def getWordInfo(self, word='', language='', display=''):
         data = self.getServerData("lt/wordInfo.xql","language="+str(language)+"&word="+urllib.quote(word)+"&output=html")          """show information (like dictionaries) about word"""
         #pagexml=self.template.fulltextclient.eval("/mpdl/interface/lt/lex.xql","document=&language="+str(language)+"&query="+url_quote(str(query)))          data = self.getServerData("lt/wordInfo.xql","language=%s&word=%s&display=%s&output=html"%(language,urllib.quote(word),urllib.quote(display)))
         return data          return data
           
       # WTF: what does this do?
     def getLemma(self, lemma=None, language=None):      def getLemma(self, lemma=None, language=None):
         """simular words lemma """          """simular words lemma """
         data = self.getServerData("lt/lemma.xql","language="+str(language)+"&lemma="+urllib.quote(lemma)+"&output=html")          data = self.getServerData("lt/lemma.xql","language="+str(language)+"&lemma="+urllib.quote(lemma)+"&output=html")
         return data          return data
           
       # WTF: what does this do?
     def getLemmaQuery(self, query=None, language=None):      def getLemmaQuery(self, query=None, language=None):
         """simular words lemma """          """simular words lemma """
         data = self.getServerData("lt/lemma.xql","language="+str(language)+"&query="+urllib.quote(query)+"&output=html")          data = self.getServerData("lt/lemma.xql","language="+str(language)+"&query="+urllib.quote(query)+"&output=html")
         return data          return data
           
       # WTF: what does this do?
     def getLex(self, query=None, language=None):      def getLex(self, query=None, language=None):
         #simular words lemma          #simular words lemma
         data = self.getServerData("lt/lex.xql","document=&language="+str(language)+"&query="+urllib.quote(query))          data = self.getServerData("lt/lex.xql","document=&language="+str(language)+"&query="+urllib.quote(query))
         return data          return data
           
       # WTF: what does this do?
     def getQuery (self,  docinfo=None, pageinfo=None, query=None, queryType=None, pn=1):      def getQuery (self,  docinfo=None, pageinfo=None, query=None, queryType=None, pn=1):
          #number of           #number of
          docpath = docinfo['textURLPath']            docpath = docinfo['textURLPath'] 
Line 493  class MpdlXmlTextServer(SimpleItem): Line 437  class MpdlXmlTextServer(SimpleItem):
          return tc           return tc
           
     def getToc(self, mode="text", docinfo=None):      def getToc(self, mode="text", docinfo=None):
         """loads table of contents and stores in docinfo"""          """loads table of contents and stores XML in docinfo"""
           logging.debug("getToc mode=%s"%mode)
         if mode == "none":          if mode == "none":
             return docinfo                      return docinfo        
                 
         if 'tocSize_%s'%mode in docinfo:          if 'tocSize_%s'%mode in docinfo:
             # cached toc              # cached toc
             return docinfo              return docinfo
Line 511  class MpdlXmlTextServer(SimpleItem): Line 457  class MpdlXmlTextServer(SimpleItem):
         # number of entries in toc          # number of entries in toc
         tocSize = 0          tocSize = 0
         tocDiv = None          tocDiv = None
                   # fetch full toc
         pagexml = self.getServerData("doc-query.xql","document=%s&queryType=%s&queryResultPageSize=%s&queryResultPN=%s"%(docpath,queryType, pagesize, pn))          pagexml = self.getServerData("doc-query.xql","document=%s&queryType=%s&queryResultPageSize=%s&queryResultPN=%s"%(docpath,queryType, pagesize, pn))
           dom = ET.fromstring(pagexml)
           # page content is in <div class="queryResultPage">
           pagediv = None
           # ElementTree 1.2 in Python 2.6 can't do div[@class='queryResultPage']
           alldivs = dom.findall("div")
           for div in alldivs:
               dc = div.get('class')
               # page content div
               if dc == 'queryResultPage':
                   pagediv = div
                   
               elif dc == 'queryResultHits':
                   docinfo['tocSize_%s'%mode] = getInt(div.text)
   
           if pagediv:
               # store XML in docinfo
               docinfo['tocXML_%s'%mode] = ET.tostring(pagediv, 'UTF-8')
                   
         # post-processing downloaded xml  
         pagedom = Parse(pagexml)  
         # get number of entries  
         numdivs = pagedom.xpath("//div[@class='queryResultHits']")  
         if len(numdivs) > 0:  
             tocSize = int(getTextFromNode(numdivs[0]))  
         docinfo['tocSize_%s'%mode] = tocSize  
         return docinfo          return docinfo
           
     def getTocPage(self, mode="text", pn=1, pageinfo=None, docinfo=None):      def getTocPage(self, mode="text", pn=None, start=None, size=None, pageinfo=None, docinfo=None):
         """returns single page from the table of contents"""          """returns single page from the table of contents"""
         # TODO: this should use the cached TOC          logging.debug("getTocPage mode=%s, pn=%s"%(mode,pn))
         if mode == "text":          if mode == "text":
             queryType = "toc"              queryType = "toc"
         else:          else:
             queryType = mode              queryType = mode
         docpath = docinfo['textURLPath']  
         path = docinfo['textURLPath']         
         pagesize = pageinfo['tocPageSize']  
         pn = pageinfo['tocPN']  
         url = docinfo['url']  
         selfurl = self.absolute_url()    
         viewMode=  pageinfo['viewMode']  
         characterNormalization = pageinfo ['characterNormalization']  
         #optionToggle =pageinfo ['optionToggle']  
         tocMode = pageinfo['tocMode']  
         tocPN = pageinfo['tocPN']    
                   
         data = self.getServerData("doc-query.xql","document=%s&queryType=%s&queryResultPageSize=%s&queryResultPN=%s&characterNormalization=regPlusNorm"%(docpath,queryType, pagesize, pn))            # check for cached TOC
         page = data.replace('page-fragment.xql?document=%s'%str(path),'%s?url=%s&viewMode=%s&tocMode=%s&tocPN=%s'%(selfurl,url, viewMode, tocMode, tocPN))          if not docinfo.has_key('tocXML_%s'%mode):
         text = page.replace('mode=image','mode=texttool')              self.getToc(mode=mode, docinfo=docinfo)
         return text              
           tocxml = docinfo.get('tocXML_%s'%mode, None)
           if not tocxml:
               logging.error("getTocPage: unable to find tocXML")
               return "Error: no table of contents!"
           
           if size is None:
               size = pageinfo.get('tocPageSize', 30)
               
           if start is None:
               start = (pn - 1) * size
   
           fulltoc = ET.fromstring(tocxml)
           
           if fulltoc:
               # paginate
               first = (start - 1) * 2
               len = size * 2
               del fulltoc[:first]
               del fulltoc[len:]
               tocdivs = fulltoc
               
               # check all a-tags
               links = tocdivs.findall(".//a")
               for l in links:
                   href = l.get('href')
                   if href:
                       # take pn from href
                       m = re.match(r'page-fragment\.xql.*pn=(\d+)', href)
                       if m is not None:
                           # and create new url (assuming parent is documentViewer)
                           url = self.getLink('pn', m.group(1))
                           l.set('href', url)
                       else:
                           logging.warning("getTocPage: Problem with link=%s"%href)
                           
               # fix two-divs-per-row with containing div
               newtoc = ET.Element('div', {'class':'queryResultPage'})
               for (d1,d2) in zip(tocdivs[::2],tocdivs[1::2]):
                   e = ET.Element('div',{'class':'tocline'})
                   e.append(d1)
                   e.append(d2)
                   newtoc.append(e)
                   
               return serialize(newtoc)
           
           return "ERROR: no table of contents!"
       
           
     def manage_changeMpdlXmlTextServer(self,title="",serverUrl="http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/interface/",timeout=40,RESPONSE=None):      def manage_changeMpdlXmlTextServer(self,title="",serverUrl="http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/interface/",timeout=40,RESPONSE=None):
     #def manage_changeMpdlXmlTextServer(self,title="",serverUrl="http://mpdl-text.mpiwg-berlin.mpg.de:30030/mpdl/interface/",timeout=40,RESPONSE=None):  
         """change settings"""          """change settings"""
         self.title=title          self.title=title
         self.timeout = timeout          self.timeout = timeout
Line 569  def manage_addMpdlXmlTextServer(self,id, Line 560  def manage_addMpdlXmlTextServer(self,id,
     self.Destination()._setObject(id, newObj)      self.Destination()._setObject(id, newObj)
     if RESPONSE is not None:      if RESPONSE is not None:
         RESPONSE.redirect('manage_main')          RESPONSE.redirect('manage_main')
   
           
           
   

Removed from v.1.238.2.1  
changed lines
  Added in v.1.238.2.14


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