Diff for /documentViewer/MpdlXmlTextServer.py between versions 1.238.2.2 and 1.238.2.13

version 1.238.2.2, 2011/07/15 19:34:41 version 1.238.2.13, 2011/08/12 14:41:39
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 
   
Line 12  import xml.etree.ElementTree as ET Line 11  import xml.etree.ElementTree as ET
 import re  import re
 import logging  import logging
 import urllib  import urllib
 import documentViewer  
 #from documentViewer import getTextFromNode, serializeNode  
   
 def intOr0(s, default=0):  
     """convert s to int or return default"""  
     try:  
         return int(s)  
     except:  
         return default  
   
 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 50  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 90  class MpdlXmlTextServer(SimpleItem): Line 63  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-text.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 102  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?      # 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):
Line 117  class MpdlXmlTextServer(SimpleItem): Line 89  class MpdlXmlTextServer(SimpleItem):
         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 209  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= ""
Line 228  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))
Line 248  class MpdlXmlTextServer(SimpleItem): Line 214  class MpdlXmlTextServer(SimpleItem):
                       
     def processPageInfo(self, dom, docinfo, pageinfo):      def processPageInfo(self, dom, docinfo, pageinfo):
         """processes page info divs from dom and stores in docinfo and pageinfo"""          """processes page info divs from dom and stores in docinfo and pageinfo"""
         # process all toplevel divs          # assume first second level div is pageMeta
         alldivs = dom.findall(".//div")          alldivs = dom.find("div")
         pagediv = None          
           if alldivs is None or alldivs.get('class', '') != 'pageMeta':
               logging.error("processPageInfo: pageMeta div not found!")
               return
           
         for div in alldivs:          for div in alldivs:
             dc = div.get('class')              dc = div.get('class')
                           
             # page content div  
             if dc == 'pageContent':  
                 pagediv = div  
               
             # pageNumberOrig                # pageNumberOrig  
             elif dc == 'pageNumberOrig':              if dc == 'pageNumberOrig':
                 pageinfo['pageNumberOrig'] = div.text                  pageinfo['pageNumberOrig'] = div.text
                                   
             # pageNumberOrigNorm              # pageNumberOrigNorm
             elif dc == 'pageNumberOrigNorm':              elif dc == 'pageNumberOrigNorm':
                 pageinfo['pageNumberOrigNorm'] = div.text                  pageinfo['pageNumberOrigNorm'] = div.text
                                   
             # pageNumberOrigNorm              # pageHeaderTitle
               elif dc == 'pageHeaderTitle':
                   pageinfo['pageHeaderTitle'] = div.text
                   
               # numFigureEntries
             elif dc == 'countFigureEntries':              elif dc == 'countFigureEntries':
                 docinfo['countFigureEntries'] = intOr0(div.text)                  docinfo['numFigureEntries'] = getInt(div.text)
                                   
             # pageNumberOrigNorm              # numTocEntries
             elif dc == 'countTocEntries':              elif dc == 'countTocEntries':
                 # WTF: s1 = int(s)/30+1                  # WTF: s1 = int(s)/30+1
                 docinfo['countTocEntries'] = intOr0(div.text)                  docinfo['numTocEntries'] = getInt(div.text)
                   
               # numPlaces
               elif dc == 'countPlaces':
                   docinfo['numPlaces'] = getInt(div.text)
                                   
             # numTextPages              # numTextPages
             elif dc == 'countPages':              elif dc == 'countPages':
                 np = intOr0(div.text)                                      np = getInt(div.text)                    
                 if np > 0:                  if np > 0:
                     docinfo['numTextPages'] = np                      docinfo['numTextPages'] = np
                     if docinfo.get('numPages', 0) == 0:                      if docinfo.get('numPages', 0) == 0:
                         # seems to be text-only                          # seems to be text-only - update page count
                         docinfo['numTextPages'] = np                          docinfo['numPages'] = np
                         pageinfo['end'] = min(pageinfo['end'], np)                          #pageinfo['end'] = min(pageinfo['end'], np)
                         pageinfo['numgroups'] = int(np / pageinfo['groupsize'])                          pageinfo['numgroups'] = int(np / pageinfo['groupsize'])
                         if np % pageinfo['groupsize'] > 0:                          if np % pageinfo['groupsize'] > 0:
                             pageinfo['numgroups'] += 1                              pageinfo['numgroups'] += 1
                                                           
           #logging.debug("processPageInfo: pageinfo=%s"%repr(pageinfo))
         return          return
                     
                         
     def getTextPage(self, mode="text_dict", pn=1, docinfo=None, pageinfo=None):      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))          logging.debug("getTextPage mode=%s, pn=%s"%(mode,pn))
         # check for cached text -- but this shouldn't be called twice          # check for cached text -- but ideally this shouldn't be called twice
         if pageinfo.has_key('textPage'):          if pageinfo.has_key('textPage'):
             logging.debug("getTextPage: using cached text")              logging.debug("getTextPage: using cached text")
             return pageinfo['textPage']              return pageinfo['textPage']
Line 312  class MpdlXmlTextServer(SimpleItem): Line 287  class MpdlXmlTextServer(SimpleItem):
         tocMode = pageinfo.get('tocMode', None)          tocMode = pageinfo.get('tocMode', None)
         tocPN = pageinfo.get('tocPN',None)          tocPN = pageinfo.get('tocPN',None)
         characterNormalization = pageinfo.get('characterNormalization', None)          characterNormalization = pageinfo.get('characterNormalization', None)
           
         selfurl = docinfo['viewerUrl']             selfurl = docinfo['viewerUrl']   
                   
         if mode == "text_dict":          if mode == "dict" or mode == "text_dict":
             # text_dict is called textPollux in the backend              # 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
                   
Line 332  class MpdlXmlTextServer(SimpleItem): Line 312  class MpdlXmlTextServer(SimpleItem):
         # page content is in <div class="pageContent">          # page content is in <div class="pageContent">
         pagediv = None          pagediv = None
         # ElementTree 1.2 in Python 2.6 can't do div[@class='pageContent']          # ElementTree 1.2 in Python 2.6 can't do div[@class='pageContent']
         alldivs = dom.findall(".//div")          # 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              # page content div
Line 342  class MpdlXmlTextServer(SimpleItem): Line 323  class MpdlXmlTextServer(SimpleItem):
                   
         # plain text mode          # plain text mode
         if mode == "text":          if mode == "text":
             if pagediv:              # get full url assuming documentViewer is parent
               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-',"?mode=%s&url=%s&viewMode=text&tocMode=%s&tocPN=%s&pn=%s#note-"%(urlmode,url,tocMode,tocPN,pn))                          href = href.replace('#note-',"%s#note-"%selfurl)
                         l.set('href', href)                          l.set('href', href)
   
                 return serialize(pagediv)                  return serialize(pagediv)
                           
         # text-with-links mode          # text-with-links mode
         elif 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 363  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 378  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-',"?mode=%s&url=%s&viewMode=text_dict&tocMode=%s&tocPN=%s&pn=%s#note-"%(urlmode,url,tocMode,tocPN,pn)))                              # note link
                               l.set('href', href.replace('#note-',"%s#note-"%selfurl))
                                                               
                 return serialize(pagediv)                  return serialize(pagediv)
                           
         # xml mode          # xml mode
         elif mode == "xml":          elif mode == "xml":
             if pagediv:              if pagediv is not None:
                 return serialize(pagediv)                  return serialize(pagediv)
                           
         # pureXml mode          # pureXml mode
         elif mode == "pureXml":          elif mode == "pureXml":
             if pagediv:              if pagediv is not None:
                 return serialize(pagediv)                  return serialize(pagediv)
                                       
         # gis mode          # gis mode
         elif mode == "gis":          elif mode == "gis":
             name = docinfo['name']              name = docinfo['name']
             if pagediv:              if pagediv is not None:
                 # 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 409  class MpdlXmlTextServer(SimpleItem): Line 394  class MpdlXmlTextServer(SimpleItem):
                                           
         return "no text here"          return "no text here"
           
     # WTF: is this needed?  
     def getOrigPages(self, docinfo=None, pageinfo=None):  
         logging.debug("CALLED: getOrigPages!")  
         if not pageinfo.has_key('pageNumberOrig'):  
             logging.warning("getOrigPages: not in pageinfo!")  
             return None  
           
         return pageinfo['pageNumberOrig']  
       
     # WTF: is this needed?  
     def getOrigPagesNorm(self, docinfo=None, pageinfo=None):  
         logging.debug("CALLED: getOrigPagesNorm!")  
         if not pageinfo.has_key('pageNumberOrigNorm'):  
             logging.warning("getOrigPagesNorm: not in pageinfo!")  
             return None  
           
         return pageinfo['pageNumberOrigNorm']  
                   
     # TODO: should be getWordInfo      # TODO: should be getWordInfo
     def getTranslate(self, word=None, language=None):      def getWordInfo(self, word='', language='', display=''):
         """translate into another languages"""          """show information (like dictionaries) about word"""
         data = self.getServerData("lt/wordInfo.xql","language="+str(language)+"&word="+urllib.quote(word)+"&output=html")          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?      # WTF: what does this do?
Line 504  class MpdlXmlTextServer(SimpleItem): Line 471  class MpdlXmlTextServer(SimpleItem):
                 pagediv = div                  pagediv = div
                                   
             elif dc == 'queryResultHits':              elif dc == 'queryResultHits':
                 docinfo['tocSize_%s'%mode] = intOr0(div.text)                  docinfo['tocSize_%s'%mode] = getInt(div.text)
   
         if pagediv:          if pagediv:
 #            # split xml in chunks  
 #            tocs = []  
 #            tocdivs = pagediv.findall('div')  
 #            for p in zip(tocdivs[::2], tocdivs[1::2]):  
 #                toc = serialize(p[0])  
 #                toc += serialize(p[1])  
 #                tocs.append(toc)  
 #                logging.debug("pair: %s"%(toc))  
             # store XML in docinfo              # store XML in docinfo
             docinfo['tocXML_%s'%mode] = ET.tostring(pagediv, 'UTF-8')              docinfo['tocXML_%s'%mode] = ET.tostring(pagediv, 'UTF-8')
   
         return docinfo          return docinfo
           
     def getTocPage(self, mode="text", pn=1, pageinfo=None, docinfo=None):      def getTocPage(self, mode="text", pn=0, pageinfo=None, docinfo=None):
         """returns single page from the table of contents"""          """returns single page from the table of contents"""
         logging.debug("getTocPage mode=%s, pn=%s"%(mode,pn))          logging.debug("getTocPage mode=%s, pn=%s"%(mode,pn))
         if mode == "text":          if mode == "text":
Line 537  class MpdlXmlTextServer(SimpleItem): Line 496  class MpdlXmlTextServer(SimpleItem):
             logging.error("getTocPage: unable to find tocXML")              logging.error("getTocPage: unable to find tocXML")
             return "No ToC"              return "No ToC"
                   
         pagesize = int(pageinfo['tocPageSize'])          pagesize = pageinfo['tocPageSize']
         url = docinfo['url']          tocPN = pageinfo['tocPN']
         urlmode = docinfo['mode']          if not pn:
         selfurl = docinfo['viewerUrl']              pn = tocPN
         viewMode=  pageinfo['viewMode']  
         tocMode = pageinfo['tocMode']  
         tocPN = int(pageinfo['tocPN'])  
   
         fulltoc = ET.fromstring(tocxml)          fulltoc = ET.fromstring(tocxml)
                   
         if fulltoc:          if fulltoc:
             # paginate              # paginate
             #start = (pn - 1) * pagesize * 2              start = (pn - 1) * pagesize * 2
             #end = start + pagesize * 2              len = pagesize * 2
             #tocdivs = fulltoc[start:end]              del fulltoc[:start]
               del fulltoc[len:]
             tocdivs = fulltoc              tocdivs = fulltoc
                           
             # check all a-tags              # check all a-tags
Line 562  class MpdlXmlTextServer(SimpleItem): Line 519  class MpdlXmlTextServer(SimpleItem):
                     # take pn from href                      # take pn from href
                     m = re.match(r'page-fragment\.xql.*pn=(\d+)', href)                      m = re.match(r'page-fragment\.xql.*pn=(\d+)', href)
                     if m is not None:                      if m is not None:
                         # and create new url                          # and create new url (assuming parent is documentViewer)
                         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))                          url = self.getLink('pn', m.group(1))
                           l.set('href', url)
                     else:                      else:
                         logging.warning("getTocPage: Problem with link=%s"%href)                          logging.warning("getTocPage: Problem with link=%s"%href)
                                                   

Removed from v.1.238.2.2  
changed lines
  Added in v.1.238.2.13


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