Diff for /documentViewer/MpdlXmlTextServer.py between versions 1.226 and 1.238.2.6

version 1.226, 2011/02/15 11:12:39 version 1.238.2.6, 2011/08/03 19:04:18
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
   import Ft.Xml.Domlette
   import cStringIO
   
   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  from SrvTxtUtils import getInt, getText, getHttpData
   
   def serialize(node):
       """returns a string containing an XML snippet of node"""
       s = ET.tostring(node, 'UTF-8')
       # snip off XML declaration
       if s.startswith('<?xml'):
           i = s.find('?>')
           return s[i+3:]
   
       return s
   
   
   def getTextFromNode(node):
       """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
   
       # 4Suite:
       nodelist=node.childNodes
       text = ""
       for n in nodelist:
           if n.nodeType == node.TEXT_NODE:
              text = text + n.data
       
       return text
   
   def serializeNode(node, encoding="utf-8"):
       """returns a string containing node as XML"""
       #s = ET.tostring(node)
       
       # 4Suite:
       stream = cStringIO.StringIO()
       Ft.Xml.Domlette.Print(node, stream=stream, encoding=encoding)
       s = stream.getvalue()
       stream.close()
   
       return s
   
   
 class MpdlXmlTextServer(SimpleItem):  class MpdlXmlTextServer(SimpleItem):
     """TextServer implementation for MPDL-XML eXist server"""      """TextServer implementation for MPDL-XML eXist server"""
Line 20  class MpdlXmlTextServer(SimpleItem): Line 69  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-proto.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):
         """constructor"""          """constructor"""
         self.id=id          self.id=id
         self.title=title          self.title=title
Line 32  class MpdlXmlTextServer(SimpleItem): Line 81  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)
   
     def getSearch(self, pageinfo=None,  docinfo=None,   lemma=None):      # WTF: what does this really do? can it be integrated in getPage?
       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']
Line 52  class MpdlXmlTextServer(SimpleItem): Line 103  class MpdlXmlTextServer(SimpleItem):
         viewMode=  pageinfo['viewMode']          viewMode=  pageinfo['viewMode']
         tocMode = pageinfo['tocMode']          tocMode = pageinfo['tocMode']
         characterNormalization = pageinfo['characterNormalization']          characterNormalization = pageinfo['characterNormalization']
         optionToggle = pageinfo['optionToggle']          #optionToggle = pageinfo['optionToggle']
         tocPN = pageinfo['tocPN']          tocPN = pageinfo['tocPN']
         selfurl = self.absolute_url()          selfurl = self.absolute_url()
         data = self.getServerData("doc-query.xql","document=%s&mode=%s&queryType=%s&query=%s&queryResultPageSize=%s&queryResultPN=%s&sn=%s&viewMode=%s&characterNormalization=%s&optionToggle=%s&highlightQuery=%s"%(docpath, 'text', queryType, urllib.quote(query), pagesize, pn, sn, viewMode,characterNormalization,optionToggle ,urllib.quote(highlightQuery)))          data = self.getServerData("doc-query.xql","document=%s&mode=%s&queryType=%s&query=%s&queryResultPageSize=%s&queryResultPN=%s&sn=%s&viewMode=%s&characterNormalization=%s&highlightQuery=%s"%(docpath, 'text', queryType, urllib.quote(query), pagesize, pn, sn, viewMode,characterNormalization, urllib.quote(highlightQuery)))
         pagexml = data.replace('?document=%s'%str(docpath),'?url=%s'%url)          pagexml = data.replace('?document=%s'%str(docpath),'?url=%s'%url)
         pagedom = Parse(pagexml)          pagedom = Parse(pagexml)
                   
Line 83  class MpdlXmlTextServer(SimpleItem): Line 134  class MpdlXmlTextServer(SimpleItem):
                         href = hrefNode.nodeValue                          href = hrefNode.nodeValue
                         if href.startswith('page-fragment.xql'):                          if href.startswith('page-fragment.xql'):
                             selfurl = self.absolute_url()                                          selfurl = self.absolute_url()            
                             pagexml=href.replace('mode=text','mode=texttool&viewMode=%s&queryType=%s&query=%s&queryResultPageSize=%s&queryResultPN=%s&tocMode=%s&searchPN=%s&tocPN=%s&optionToggle=%s&characterNormalization=%s'%(viewMode,queryType,urllib.quote(query),pagesize,pn,tocMode,pn,tocPN,optionToggle,characterNormalization))                              pagexml=href.replace('mode=text','mode=texttool&viewMode=%s&queryType=%s&query=%s&queryResultPageSize=%s&queryResultPN=%s&tocMode=%s&searchPN=%s&tocPN=%s&characterNormalization=%s'%(viewMode,queryType,urllib.quote(query),pagesize,pn,tocMode,pn,tocPN, characterNormalization))
                             hrefNode.nodeValue = pagexml.replace('page-fragment.xql','%s'%selfurl)                                                                         hrefNode.nodeValue = pagexml.replace('page-fragment.xql','%s'%selfurl)                                           
                 logging.debug("PUREXML :%s"%(serializeNode(pagenode)))                  #logging.debug("PUREXML :%s"%(serializeNode(pagenode)))
                 return serializeNode(pagenode)                          return serializeNode(pagenode)        
         if (queryType=="fulltextMorph"):          if (queryType=="fulltextMorph"):
             pagedivs = pagedom.xpath("//div[@class='queryResult']")              pagedivs = pagedom.xpath("//div[@class='queryResult']")
Line 98  class MpdlXmlTextServer(SimpleItem): Line 149  class MpdlXmlTextServer(SimpleItem):
                         href = hrefNode.nodeValue                          href = hrefNode.nodeValue
                         if href.startswith('page-fragment.xql'):                          if href.startswith('page-fragment.xql'):
                             selfurl = self.absolute_url()                                     selfurl = self.absolute_url()       
                             pagexml=href.replace('mode=text','mode=texttool&viewMode=%s&queryType=%s&query=%s&queryResultPageSize=%s&queryResultPN=%s&tocMode=%s&searchPN=%s&tocPN=%s&optionToggle=%s&characterNormalization=%s'%(viewMode,queryType,urllib.quote(query),pagesize,pn,tocMode,pn,tocPN,optionToggle,characterNormalization))                              pagexml=href.replace('mode=text','mode=texttool&viewMode=%s&queryType=%s&query=%s&queryResultPageSize=%s&queryResultPN=%s&tocMode=%s&searchPN=%s&tocPN=%s&characterNormalization=%s'%(viewMode,queryType,urllib.quote(query),pagesize,pn,tocMode,pn,tocPN,characterNormalization))
                             hrefNode.nodeValue = pagexml.replace('page-fragment.xql','%s'%selfurl)                                hrefNode.nodeValue = pagexml.replace('page-fragment.xql','%s'%selfurl)  
                         if href.startswith('../lt/lemma.xql'):                          if href.startswith('../lt/lemma.xql'):
                             hrefNode.nodeValue = href.replace('../lt/lemma.xql','%s/template/head_main_lemma_New'%(selfurl))                                      hrefNode.nodeValue = href.replace('../lt/lemma.xql','%s/template/head_main_query'%(selfurl))        
                             l.setAttributeNS(None, 'target', '_blank')                              l.setAttributeNS(None, 'target', '_blank')
                             l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=400, scrollbars=1'); return false;")                              l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=400, scrollbars=1'); return false;")
                             l.setAttributeNS(None, 'onClick', 'popupWin.focus();')                                l.setAttributeNS(None, 'onDblclick', 'popupWin.focus();')  
                 pagedivs = pagedom.xpath("//div[@class='queryResultMorphExpansion']")                                  pagedivs = pagedom.xpath("//div[@class='queryResultMorphExpansion']")                
                 return serializeNode(pagenode)                          return serializeNode(pagenode)        
         if (queryType=="ftIndex")or(queryType=="ftIndexMorph"):          if (queryType=="ftIndex")or(queryType=="ftIndexMorph"):
Line 116  class MpdlXmlTextServer(SimpleItem): Line 167  class MpdlXmlTextServer(SimpleItem):
                     hrefNode = l.getAttributeNodeNS(None, u"href")                      hrefNode = l.getAttributeNodeNS(None, u"href")
                     if hrefNode:                      if hrefNode:
                         href = hrefNode.nodeValue                          href = hrefNode.nodeValue
                         hrefNode.nodeValue=href.replace('mode=text','mode=texttool&viewMode=%s&tocMode=%s&tocPN=%s&pn=%s&optionToggle=%s&characterNormalization=%s'%(viewMode,tocMode,tocPN,pn,optionToggle,characterNormalization))                                       hrefNode.nodeValue=href.replace('mode=text','mode=texttool&viewMode=%s&tocMode=%s&tocPN=%s&pn=%s&characterNormalization=%s'%(viewMode,tocMode,tocPN,pn,characterNormalization))             
                         if href.startswith('../lt/lex.xql'):                          if href.startswith('../lt/lex.xql'):
                             hrefNode.nodeValue = href.replace('../lt/lex.xql','%s/template/head_main_voc'%selfurl)                                       hrefNode.nodeValue = href.replace('../lt/lex.xql','%s/template/head_main_lex'%selfurl)         
                             l.setAttributeNS(None, 'target', '_blank')                              l.setAttributeNS(None, 'target', '_blank')
                             l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=400, scrollbars=1'); return false;")                              l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=400, scrollbars=1'); return false;")
                             l.setAttributeNS(None, 'onClick', 'popupWin.focus();')                              l.setAttributeNS(None, 'onDblclick', 'popupWin.focus();')
                         if href.startswith('../lt/lemma.xql'):                          if href.startswith('../lt/lemma.xql'):
                             hrefNode.nodeValue = href.replace('../lt/lemma.xql','%s/template/head_main_lemma'%selfurl)                                      hrefNode.nodeValue = href.replace('../lt/lemma.xql','%s/template/head_main_lemma'%(selfurl))        
                             l.setAttributeNS(None, 'target', '_blank')                              l.setAttributeNS(None, 'target', '_blank')
                             l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=400, scrollbars=1'); return false;")                              l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=400, scrollbars=1'); return false;")
                             l.setAttributeNS(None, 'onClick', 'popupWin.focus();')                              l.setAttributeNS(None, 'onDblclick', 'popupWin.focus();')
                 return serializeNode(pagenode)                        return serializeNode(pagenode)      
         return "no text here"             return "no text here"   
                                                 
              
     def getGisPlaces(self, docinfo=None, pageinfo=None):      def getGisPlaces(self, docinfo=None, pageinfo=None):
         """ Show all Gis Places of whole Page"""          """ Show all Gis Places of whole Page"""
         xpath='//place'          xpath='//place'
Line 144  class MpdlXmlTextServer(SimpleItem): Line 194  class MpdlXmlTextServer(SimpleItem):
         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
           
     def getAllGisPlaces (self, docinfo=None, pageinfo=None):      def getAllGisPlaces (self, docinfo=None, pageinfo=None):
Line 164  class MpdlXmlTextServer(SimpleItem): Line 214  class MpdlXmlTextServer(SimpleItem):
         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")
           for div in alldivs:
               dc = div.get('class')
               
               # pageNumberOrig  
               if dc == 'pageNumberOrig':
                   pageinfo['pageNumberOrig'] = div.text
                   
               # pageNumberOrigNorm
               elif dc == 'pageNumberOrigNorm':
                   pageinfo['pageNumberOrigNorm'] = div.text
                   
               # pageNumberOrigNorm
               elif dc == 'countFigureEntries':
                   docinfo['numFigureEntries'] = getInt(div.text)
                   
               # pageNumberOrigNorm
               elif dc == 'countTocEntries':
                   # WTF: s1 = int(s)/30+1
                   docinfo['numTocEntries'] = getInt(div.text)
                   
               # pageHeaderTitle
               elif dc == 'pageHeaderTitle':
                   docinfo['pageHeaderTitle'] = 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
                               
           return
                         
     def getTextPage(self, mode="text", pn=1, docinfo=None, pageinfo=None):             
       def getTextPage(self, mode="text_dict", 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 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']              
         viewMode= pageinfo['viewMode']          # stuff for constructing full urls
         sn = pageinfo['sn']          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)
           selfurl = docinfo['viewerUrl']   
           
         if mode == "text_dict":          if mode == "text_dict":
               # text_dict is called textPollux in the backend
             textmode = "textPollux"              textmode = "textPollux"
         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 = Parse(pagexml)          dom = ET.fromstring(pagexml)
                   # extract additional info
         #original Pages          self.processPageInfo(dom, docinfo, pageinfo)
         pagedivs = dom.xpath("//div[@class='pageNumberOrig']")          # page content is in <div class="pageContent">
         if pagedivs == dom.xpath("//div[@class='pageNumberOrig']"):          pagediv = None
             if len(pagedivs)>0:          # ElementTree 1.2 in Python 2.6 can't do div[@class='pageContent']
                 docinfo['pageNumberOrig']= getTextFromNode(pagedivs[0])          # so we look at the second level divs
                 logging.debug("ORIGINAL PAGES: %s"%(docinfo['pageNumberOrig']))          alldivs = dom.findall("div")
                   for div in alldivs:
         #original Pages Norm              dc = div.get('class')
         pagedivs = dom.xpath("//div[@class='pageNumberOrigNorm']")              # page content div
         if pagedivs == dom.xpath("//div[@class='pageNumberOrigNorm']"):              if dc == 'pageContent':
             if len(pagedivs)>0:                  pagediv = div
                 docinfo['pageNumberOrigNorm']= getTextFromNode(pagedivs[0])                  break
                 logging.debug("ORIGINAL PAGES: %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)  
                         logging.debug("FIGURE ENTRIES: %s"%(s))  
                     except:  
                         docinfo['countFigureEntries'] = 0  
                 else:  
                     s1 = int(s)/30+1  
                     try:  
                         docinfo['countFigureEntries'] = int(s1)  
                         logging.debug("FIGURE ENTRIES: %s"%(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)  
                     logging.debug("PLACES HERE: %s"%(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)  
                         logging.debug("TEXT ENTRIES: %s"%(s))  
                     except:  
                         docinfo['countTocEntries'] = 0  
                 else:  
                     s1 = int(s)/30+1  
                     try:  
                         docinfo['countTocEntries'] = int(s1)  
                         logging.debug("TEXT ENTRIES: %s"%(s1))  
                     except:  
                         docinfo['countTocEntries'] = 0  
           
         #numTextPages  
         pagedivs = dom.xpath("//div[@class='countPages']")  
         if pagedivs == dom.xpath("//div[@class='countPages']"):  
             if len(pagedivs)>0:  
                 docinfo['numPages'] = getTextFromNode(pagedivs[0])  
                 s = getTextFromNode(pagedivs[0])  
                   
                 try:  
                     docinfo['numPages'] = int(s)  
                     logging.debug("PAGE NUMBER: %s"%(s))  
                   
                     np = docinfo['numPages']  
                     pageinfo['end'] = min(pageinfo['end'], np)  
                     pageinfo['numgroups'] = int(np / pageinfo['groupsize'])  
                     if np % pageinfo['groupsize'] > 0:  
                         pageinfo['numgroups'] += 1                  
                 except:  
                     docinfo['numPages'] = 0  
                     
         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":
             # first div contains text              if pagediv:
             pagedivs = dom.xpath("/div")                  links = pagediv.findall(".//a")
             if len(pagedivs) > 0:        
                 pagenode = pagedivs[0]  
                 links = pagenode.xpath("//a")  
                 for l in links:                  for l in links:
                     hrefNode = l.getAttributeNodeNS(None, u"href")                      href = l.get('href')
                     if hrefNode:                      if href and href.startswith('#note-'):
                         href= hrefNode.nodeValue                          href = href.replace('#note-',"?mode=%s&url=%s&viewMode=text&tocMode=%s&tocPN=%s&pn=%s#note-"%(urlmode,url,tocMode,tocPN,pn))
                         if href.startswith('#note-'):                          l.set('href', href)
                             hrefNode.nodeValue = href.replace('#note-',"?url=%s&viewMode=%s&tocMode=%s&tocPN=%s&pn=%s#note-"%(url,viewMode,tocMode,tocPN,pn))  
                 return serializeNode(pagenode)                  return serialize(pagediv)
         if mode == "xml":  
               # first div contains text  
               pagedivs = dom.xpath("/div")  
               if len(pagedivs) > 0:  
                   pagenode = pagedivs[0]  
                   return serializeNode(pagenode)  
         if mode == "gis":  
               # first div contains text  
               pagedivs = dom.xpath("/div")  
               if len(pagedivs) > 0:  
                   pagenode = pagedivs[0]  
                   links =pagenode.xpath("//a")  
                   for l in links:  
                       hrefNode =l.getAttributeNodeNS(None, u"href")  
                       if hrefNode:  
                           href=hrefNode.nodeValue  
                           if href.startswith('http://chinagis.mpiwg-berlin.mpg.de'):  
                               hrefNode.nodeValue =href.replace('chinagis_REST/REST/db/chgis/mpdl','chinagis/REST/db/mpdl/%s'%name)  
                               l.setAttributeNS(None, 'target', '_blank')   
                   return serializeNode(pagenode)  
                                           
         if mode == "pureXml":  
               # first div contains text  
               pagedivs = dom.xpath("/div")  
               if len(pagedivs) > 0:  
                   pagenode = pagedivs[0]  
                   return serializeNode(pagenode)        
         # text-with-links mode          # text-with-links mode
         if mode == "text_dict":          elif mode == "text_dict":
             # first div contains text              if pagediv:
             pagedivs = dom.xpath("/div")  
             if len(pagedivs) > 0:  
                 pagenode = pagedivs[0]  
                 # check all a-tags                  # check all a-tags
                 links = pagenode.xpath("//a")                  links = pagediv.findall(".//a")
                 for l in links:                  for l in links:
                     hrefNode = l.getAttributeNodeNS(None, u"href")                      href = l.get('href')
                     if hrefNode:                      
                       if href:
                         # is link with href                          # is link with href
                         href = hrefNode.nodeValue                          if href.startswith('http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/interface/lt/wordInfo.xql'):
                         if href.startswith('lt/lex.xql'):  
                             # is pollux link                              # is pollux link
                             selfurl = self.absolute_url()                              selfurl = self.absolute_url()
                             # change href                              # change href
                             hrefNode.nodeValue = href.replace('lt/lex.xql','%s/template/head_main_voc'%selfurl)                              l.set('href', href.replace('http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/interface/lt/wordInfo.xql','%s/head_main_voc'%selfurl))
                             # add target                              # add target
                             l.setAttributeNS(None, 'target', '_blank')                              l.set('target', '_blank')
                             l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=700, scrollbars=1'); return false;")                                                            
                             l.setAttributeNS(None, 'onClick', 'popupWin.focus();')                                if href.startswith('http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/lt/lemma.xql'):    
                         if href.startswith('lt/lemma.xql'):      
                             selfurl = self.absolute_url()                              selfurl = self.absolute_url()
                             hrefNode.nodeValue = href.replace('lt/lemma.xql','%s/template/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))
                             l.setAttributeNS(None, 'target', '_blank')                              l.set('target', '_blank')
                             l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=700, scrollbars=1'); return false;")                              l.set('onclick',"popupWin = window.open(this.href, 'InfoWindow', 'menubar=no, location,width=500,height=600,top=180, left=700, toolbar=no, scrollbars=1'); return false;")
                             l.setAttributeNS(None, 'onClick', 'popupWin.focus();')                                 l.set('ondblclick', 'popupWin.focus();')   
                       
                         if href.startswith('#note-'):                          if href.startswith('#note-'):
                             hrefNode.nodeValue = href.replace('#note-',"?url=%s&viewMode=%s&tocMode=%s&tocPN=%s&pn=%s#note-"%(url,viewMode,tocMode,tocPN,pn))                                  l.set('href', href.replace('#note-',"?mode=%s&url=%s&viewMode=text_dict&tocMode=%s&tocPN=%s&pn=%s#note-"%(urlmode,url,tocMode,tocPN,pn)))
                 return serializeNode(pagenode)                                
                   return serialize(pagediv)
               
           # xml mode
           elif mode == "xml":
               if pagediv:
                   return serialize(pagediv)
               
           # pureXml mode
           elif mode == "pureXml":
               if pagediv:
                   return serialize(pagediv)
                     
           # gis mode
           elif mode == "gis":
               name = docinfo['name']
               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(pagediv)
                       
         return "no text here"          return "no text here"
           
     def getText(self, mode="text", pn=1, docinfo=None, pageinfo=None):      # WTF: is this needed?
         data = self.getTextPage(mode="text", pn=1 ,docinfo=docinfo, pageinfo=pageinfo)      def getOrigPages(self, docinfo=None, pageinfo=None):
         logging.debug("TEXT ALL data: %s"%(data))          logging.debug("CALLED: getOrigPages!")
         return data          if not pageinfo.has_key('pageNumberOrig'):
               logging.warning("getOrigPages: not in pageinfo!")
               return None
           
     def getXML(self, mode="xml", pn=1, docinfo=None, pageinfo=None):          return pageinfo['pageNumberOrig']
         data = self.getTextPage(mode="xml", pn=1 ,docinfo=docinfo, pageinfo=pageinfo)  
         logging.debug("TEXT ALL data: %s"%(data))  
         return data  
           
     def getDictionary(self, mode="text_dict", pn=1, docinfo=None, pageinfo=None):      # WTF: is this needed?
         data = self.getTextPage(mode="text_dict", pn=1 ,docinfo=docinfo, pageinfo=pageinfo)      def getOrigPagesNorm(self, docinfo=None, pageinfo=None):
         logging.debug("TEXT ALL data: %s"%(data))          logging.debug("CALLED: getOrigPagesNorm!")
         return data          if not pageinfo.has_key('pageNumberOrigNorm'):
               logging.warning("getOrigPagesNorm: not in pageinfo!")
               return None
           
           return pageinfo['pageNumberOrigNorm']
           
     def getTranslate(self, query=None, language=None):      # TODO: should be getWordInfo
       def getTranslate(self, word=None, language=None):
         """translate into another languages"""          """translate into another languages"""
         data = self.getServerData("lt/lex.xql","document=&language="+str(language)+"&query="+urllib.quote(query))          data = self.getServerData("lt/wordInfo.xql","language="+str(language)+"&word="+urllib.quote(word)+"&output=html")
         #pagexml=self.template.fulltextclient.eval("/mpdl/interface/lt/lex.xql","document=&language="+str(language)+"&query="+url_quote(str(query)))  
         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","document=&language="+str(language)+"&lemma="+urllib.quote(lemma))          data = self.getServerData("lt/lemma.xql","language="+str(language)+"&lemma="+urllib.quote(lemma)+"&output=html")
         #pagexml=self.template.fulltextclient.eval("/mpdl/interface/lt/lemma.xql","document=&language="+str(language)+"&lemma="+url_quote(str(lemma)))  
         return data          return data
           
     def getLemmaNew(self, query=None, language=None):      # WTF: what does this do?
       def getLemmaQuery(self, query=None, language=None):
         """simular words lemma """          """simular words lemma """
         data = self.getServerData("lt/lemma.xql","document=&language="+str(language)+"&lemma="+urllib.quote(query))          data = self.getServerData("lt/lemma.xql","language="+str(language)+"&query="+urllib.quote(query)+"&output=html")
         #pagexml=self.template.fulltextclient.eval("/mpdl/interface/lt/lemma.xql","document=&language="+str(language)+"&lemma="+url_quote(str(query)))  
         return data          return data
           
     def getQuery (self,  docinfo=None, pageinfo=None, query=None, queryType=None, pn=1, optionToggle=None):      # WTF: what does this do?
       def getLex(self, query=None, language=None):
           #simular words lemma
           data = self.getServerData("lt/lex.xql","document=&language="+str(language)+"&query="+urllib.quote(query))
           return data
   
       # WTF: what does this do?
       def getQuery (self,  docinfo=None, pageinfo=None, query=None, queryType=None, pn=1):
          #number of           #number of
          docpath = docinfo['textURLPath']            docpath = docinfo['textURLPath'] 
          pagesize = pageinfo['queryPageSize']           pagesize = pageinfo['queryPageSize']
Line 420  class MpdlXmlTextServer(SimpleItem): Line 445  class MpdlXmlTextServer(SimpleItem):
          pagedom = Parse(pagexml)           pagedom = Parse(pagexml)
          numdivs = pagedom.xpath("//div[@class='queryResultHits']")           numdivs = pagedom.xpath("//div[@class='queryResultHits']")
          tocSearch = int(getTextFromNode(numdivs[0]))           tocSearch = int(getTextFromNode(numdivs[0]))
          logging.debug("documentViewer (gettoc) tocSearch: %s"%(tocSearch))  
          tc=int((tocSearch/10)+1)           tc=int((tocSearch/10)+1)
          logging.debug("documentViewer (gettoc) tc: %s"%(tc))  
          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("documentViewer (gettoc) mode: %s"%(mode))          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 445  class MpdlXmlTextServer(SimpleItem): Line 469  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=1, 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']                 # check for cached TOC
         pagesize = pageinfo['tocPageSize']          if not docinfo.has_key('tocXML_%s'%mode):
         pn = pageinfo['tocPN']              self.getToc(mode=mode, docinfo=docinfo)
               
           tocxml = docinfo.get('tocXML_%s'%mode, None)
           if not tocxml:
               logging.error("getTocPage: unable to find tocXML")
               return "No ToC"
           
           pagesize = int(pageinfo['tocPageSize'])
         url = docinfo['url']          url = docinfo['url']
         selfurl = self.absolute_url()            urlmode = docinfo['mode']
           selfurl = docinfo['viewerUrl']
         viewMode=  pageinfo['viewMode']          viewMode=  pageinfo['viewMode']
         characterNormalization = pageinfo ['characterNormalization']  
         optionToggle =pageinfo ['optionToggle']  
         tocMode = pageinfo['tocMode']          tocMode = pageinfo['tocMode']
         tocPN = pageinfo['tocPN']            tocPN = int(pageinfo['tocPN'])
           pn = tocPN
                   
         data = self.getServerData("doc-query.xql","document=%s&queryType=%s&queryResultPageSize=%s&queryResultPN=%s&characterNormalization=regPlusNorm&optionToggle=1"%(docpath,queryType, pagesize, pn))            fulltoc = ET.fromstring(tocxml)
         page = data.replace('page-fragment.xql?document=%s'%str(path),'%s?url=%s&viewMode=%s&tocMode=%s&tocPN=%s&optionToggle=1'%(selfurl,url, viewMode, tocMode, tocPN))  
         text = page.replace('mode=image','mode=texttool')  
         #logging.debug("documentViewer (characterNormalization) characterNormalization: %s"%(characterNormalization))  
         logging.debug("TEXT %s"%(text))  
         return text  
           
     def manage_changeMpdlXmlTextServer(self,title="",serverUrl="http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/interface/",timeout=40,RESPONSE=None):          if fulltoc:
               # paginate
               start = (pn - 1) * pagesize * 2
               len = pagesize * 2
               del fulltoc[:start]
               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
                           l.set('href', '%s?mode=%s&url=%s&viewMode=%s&pn=%s&tocMode=%s&tocPN=%s'%(selfurl, urlmode, url, viewMode, m.group(1), tocMode, tocPN))
                       else:
                           logging.warning("getTocPage: Problem with link=%s"%href)
                           
               return serialize(tocdivs)
       
       
       def manage_changeMpdlXmlTextServer(self,title="",serverUrl="http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/interface/",timeout=40,RESPONSE=None):
         """change settings"""          """change settings"""
         self.title=title          self.title=title
         self.timeout = timeout          self.timeout = timeout
Line 497  def manage_addMpdlXmlTextServerForm(self Line 557  def manage_addMpdlXmlTextServerForm(self
     pt = PageTemplateFile("zpt/manage_addMpdlXmlTextServer", globals()).__of__(self)      pt = PageTemplateFile("zpt/manage_addMpdlXmlTextServer", globals()).__of__(self)
     return pt()      return pt()
   
 def manage_addMpdlXmlTextServer(self,id,title="",serverUrl="http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/interface/",timeout=40,RESPONSE=None):  def manage_addMpdlXmlTextServer(self,id,title="",serverUrl="http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/interface/",timeout=40,RESPONSE=None):
   #def manage_addMpdlXmlTextServer(self,id,title="",serverUrl="http://mpdl-text.mpiwg-berlin.mpg.de:30030/mpdl/interface/",timeout=40,RESPONSE=None):    
     """add zogiimage"""      """add zogiimage"""
     newObj = MpdlXmlTextServer(id,title,serverUrl,timeout)      newObj = MpdlXmlTextServer(id,title,serverUrl,timeout)
     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.226  
changed lines
  Added in v.1.238.2.6


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