source: documentViewer/MpdlXmlTextServer.py @ 427:70db19d7b3b1

Last change on this file since 427:70db19d7b3b1 was 427:70db19d7b3b1, checked in by abukhman, 13 years ago

* empty log message *

File size: 23.4 KB
Line 
1
2from OFS.SimpleItem import SimpleItem
3from Products.PageTemplates.PageTemplateFile import PageTemplateFile
4from Ft.Xml import EMPTY_NAMESPACE, Parse
5
6import md5
7import sys
8import logging
9import urllib
10import documentViewer
11from documentViewer import getTextFromNode, serializeNode
12
13class MpdlXmlTextServer(SimpleItem):
14    """TextServer implementation for MPDL-XML eXist server"""
15    meta_type="MPDL-XML TextServer"
16
17    manage_options=(
18        {'label':'Config','action':'manage_changeMpdlXmlTextServerForm'},
19       )+SimpleItem.manage_options
20   
21    manage_changeMpdlXmlTextServerForm = PageTemplateFile("zpt/manage_changeMpdlXmlTextServer", globals())
22       
23    def __init__(self,id,title="",serverUrl="http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/interface/", serverName=None, timeout=40):
24        """constructor"""
25        self.id=id
26        self.title=title
27        self.timeout = timeout
28        if serverName is None:
29            self.serverUrl = serverUrl
30        else:
31            self.serverUrl = "http://%s/mpdl/interface/"%serverName
32       
33    def getHttpData(self, url, data=None):
34        """returns result from url+data HTTP request"""
35        return documentViewer.getHttpData(url,data,timeout=self.timeout)
36   
37    def getServerData(self, method, data=None):
38        """returns result from text server for method+data"""
39        url = self.serverUrl+method
40        return documentViewer.getHttpData(url,data,timeout=self.timeout)
41
42    def getSearch(self, pageinfo=None,  docinfo=None,   lemma=None):
43        """get search list"""
44        docpath = docinfo['textURLPath'] 
45        url = docinfo['url']
46        pagesize = pageinfo['queryPageSize']
47        pn = pageinfo.get('searchPN',1)
48        sn = pageinfo['sn']
49        highlightQuery = pageinfo['highlightQuery']
50        query =pageinfo['query']
51        queryType =pageinfo['queryType']
52        viewMode=  pageinfo['viewMode']
53        tocMode = pageinfo['tocMode']
54        characterNormalization = pageinfo['characterNormalization']
55        optionToggle = pageinfo['optionToggle']
56        tocPN = pageinfo['tocPN']
57        selfurl = self.absolute_url()
58        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)))
59        pagexml = data.replace('?document=%s'%str(docpath),'?url=%s'%url)
60        pagedom = Parse(pagexml)
61       
62        """
63        pagedivs = pagedom.xpath("//div[@class='queryResultHits']")
64        if (pagedivs == pagedom.xpath("//div[@class='queryResultHits']")):
65            if len(pagedivs)>0:
66                docinfo['queryResultHits'] = int(getTextFromNode(pagedivs[0]))
67                s = getTextFromNode(pagedivs[0])
68                s1 = int(s)/10+1
69                try:
70                    docinfo['queryResultHits'] = int(s1)
71                    logging.debug("SEARCH ENTRIES: %s"%(s1))
72                except:
73                    docinfo['queryResultHits'] = 0
74        """
75        if (queryType=="fulltext")or(queryType=="xpath")or(queryType=="xquery")or(queryType=="fulltextMorphLemma"):   
76            pagedivs = pagedom.xpath("//div[@class='queryResultPage']")
77            if len(pagedivs)>0:
78                pagenode=pagedivs[0]
79                links=pagenode.xpath("//a")
80                for l in links:
81                    hrefNode = l.getAttributeNodeNS(None, u"href")
82                    if hrefNode:
83                        href = hrefNode.nodeValue
84                        if href.startswith('page-fragment.xql'):
85                            selfurl = self.absolute_url()           
86                            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))
87                            hrefNode.nodeValue = pagexml.replace('page-fragment.xql','%s'%selfurl)                                           
88                return serializeNode(pagenode)       
89        if (queryType=="fulltextMorph"):
90            pagedivs = pagedom.xpath("//div[@class='queryResult']")
91            if len(pagedivs)>0:
92                pagenode=pagedivs[0]
93                links=pagenode.xpath("//a")
94                for l in links:
95                    hrefNode = l.getAttributeNodeNS(None, u"href")
96                    if hrefNode:
97                        href = hrefNode.nodeValue
98                        if href.startswith('page-fragment.xql'):
99                            selfurl = self.absolute_url()       
100                            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))
101                            hrefNode.nodeValue = pagexml.replace('page-fragment.xql','%s'%selfurl) 
102                        if href.startswith('../lt/lemma.xql'):
103                            hrefNode.nodeValue = href.replace('../lt/lemma.xql','%s/template/head_main_lemma_New'%(selfurl))       
104                            l.setAttributeNS(None, 'target', '_blank')
105                            l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=400, scrollbars=1'); return false;")
106                            l.setAttributeNS(None, 'onClick', 'popupWin.focus();') 
107                pagedivs = pagedom.xpath("//div[@class='queryResultMorphExpansion']")               
108                return serializeNode(pagenode)       
109        if (queryType=="ftIndex")or(queryType=="ftIndexMorph"):
110            pagedivs= pagedom.xpath("//div[@class='queryResultPage']")
111            if len(pagedivs)>0:
112                pagenode=pagedivs[0]
113                links=pagenode.xpath("//a")
114                for l in links:
115                    hrefNode = l.getAttributeNodeNS(None, u"href")
116                    if hrefNode:
117                        href = hrefNode.nodeValue
118                        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))             
119                        if href.startswith('../lt/lex.xql'):
120                            hrefNode.nodeValue = href.replace('../lt/lex.xql','%s/template/head_main_voc'%selfurl)         
121                            l.setAttributeNS(None, 'target', '_blank')
122                            l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=400, scrollbars=1'); return false;")
123                            l.setAttributeNS(None, 'onClick', 'popupWin.focus();')
124                        if href.startswith('../lt/lemma.xql'):
125                            hrefNode.nodeValue = href.replace('../lt/lemma.xql','%s/template/head_main_lemma'%selfurl)       
126                            l.setAttributeNS(None, 'target', '_blank')
127                            l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=400, scrollbars=1'); return false;")
128                            l.setAttributeNS(None, 'onClick', 'popupWin.focus();')
129                return serializeNode(pagenode)     
130        return "no text here"   
131                       
132           
133    def getGisPlaces(self, docinfo=None, pageinfo=None):
134        """ Show all Gis Places of whole Page"""
135        xpath='//place'
136        docpath = docinfo.get('textURLPath',None)
137        if not docpath:
138            return None
139
140        url = docinfo['url']
141        selfurl = self.absolute_url()
142        pn = pageinfo['current']
143        hrefList=[]
144        myList= ""
145        text=self.getServerData("xpath.xql", "document=%s&xpath=%s&pn=%s"%(docinfo['textURLPath'],xpath,pn))
146        dom = Parse(text)
147        result = dom.xpath("//result/resultPage/place")
148        for l in result:
149            hrefNode= l.getAttributeNodeNS(None, u"id")
150            href= hrefNode.nodeValue
151            hrefList.append(href)
152            myList = ",".join(hrefList)
153        logging.debug("getGisPlaces :%s"%(myList))                             
154        return myList
155   
156    def getAllGisPlaces (self, docinfo=None, pageinfo=None):
157        """Show all Gis Places of whole Book """
158        xpath ='//echo:place'
159        docpath =docinfo['textURLPath']
160        url = docinfo['url']
161        selfurl =self.absolute_url()
162        pn =pageinfo['current']
163        hrefList=[]
164        myList=""
165        text=self.getServerData("xpath.xql", "document=%s&xpath=%s"%(docinfo['textURLPath'],xpath))
166        dom =Parse(text)
167        result = dom.xpath("//result/resultPage/place")
168       
169        for l in result:
170            hrefNode = l.getAttributeNodeNS(None, u"id")
171            href= hrefNode.nodeValue
172            hrefList.append(href)
173            myList = ",".join(hrefList)
174            logging.debug("getALLGisPlaces :%s"%(myList))
175        return myList
176         
177           
178    def getTextPage(self, docinfo=None, pageinfo=None):
179        """returns single page from fulltext"""
180        docpath = docinfo['textURLPath']
181        path = docinfo['textURLPath']
182        url = docinfo.get('url',None)
183        name = docinfo.get('name',None)
184        pn =pageinfo['current']
185        viewMode= pageinfo['viewMode']
186        sn = pageinfo['sn']
187        highlightQuery = pageinfo['highlightQuery']
188        mode = pageinfo ['viewMode']
189        tocMode = pageinfo['tocMode']
190        characterNormalization=pageinfo['characterNormalization']
191        tocPN = pageinfo['tocPN']
192        selfurl = self.absolute_url()   
193        if mode == "text_dict":
194            textmode = "textPollux"
195        else:
196            textmode = mode
197       
198        textParam = "document=%s&mode=%s&pn=%s&characterNormalization=%s"%(docpath,textmode,pn,characterNormalization)
199        if highlightQuery is not None:
200            textParam +="&highlightQuery=%s&sn=%s"%(urllib.quote(highlightQuery),sn)           
201       
202        pagexml = self.getServerData("page-fragment.xql",textParam)
203        dom = Parse(pagexml)
204       
205        #original Pages
206        pagedivs = dom.xpath("//div[@class='pageNumberOrig']")
207        if pagedivs == dom.xpath("//div[@class='pageNumberOrig']"):
208            if len(pagedivs)>0:
209                docinfo['pageNumberOrig']= getTextFromNode(pagedivs[0])
210                logging.debug("ORIGINAL PAGES: %s"%(docinfo['pageNumberOrig']))
211                         
212        #figureEntries
213        pagedivs = dom.xpath("//div[@class='countFigureEntries']")
214        if pagedivs == dom.xpath("//div[@class='countFigureEntries']"):
215            if len(pagedivs)>0:
216                docinfo['countFigureEntries'] = getTextFromNode(pagedivs[0])
217                s = getTextFromNode(pagedivs[0])
218                if s=='0':
219                    try:
220                        docinfo['countFigureEntries'] = int(s)
221                        logging.debug("FIGURE ENTRIES: %s"%(s))
222                    except:
223                        docinfo['countFigureEntries'] = 0
224                else:
225                    s1 = int(s)/30+1
226                    try:
227                        docinfo['countFigureEntries'] = int(s1)
228                        logging.debug("FIGURE ENTRIES: %s"%(s1))
229                    except:
230                        docinfo['countFigureEntries'] = 0     
231       
232        #allPlaces
233        pagedivs = dom.xpath("//div[@class='countPlaces']")
234        if pagedivs == dom.xpath("//div[@class='countPlaces']"):
235            if len(pagedivs)>0:
236                docinfo['countPlaces']= getTextFromNode(pagedivs[0])
237                s = getTextFromNode(pagedivs[0])
238                try:
239                    docinfo['countPlaces'] = int(s)
240                    logging.debug("PLACES HERE: %s"%(s))
241                except:
242                    docinfo['countPlaces'] = 0
243       
244        #tocEntries
245        pagedivs = dom.xpath("//div[@class='countTocEntries']")
246        if pagedivs == dom.xpath("//div[@class='countTocEntries']"):
247            if len(pagedivs)>0:
248                docinfo['countTocEntries'] = int(getTextFromNode(pagedivs[0]))
249                s = getTextFromNode(pagedivs[0])
250                if s=='0':
251                    try:
252                        docinfo['countTocEntries'] = int(s)
253                        logging.debug("TEXT ENTRIES: %s"%(s))
254                    except:
255                        docinfo['countTocEntries'] = 0
256                else:
257                    s1 = int(s)/30+1
258                    try:
259                        docinfo['countTocEntries'] = int(s1)
260                        logging.debug("TEXT ENTRIES: %s"%(s1))
261                    except:
262                        docinfo['countTocEntries'] = 0
263       
264        #numTextPages
265        pagedivs = dom.xpath("//div[@class='countPages']")
266        if pagedivs == dom.xpath("//div[@class='countPages']"):
267            if len(pagedivs)>0:
268                docinfo['numPages'] = getTextFromNode(pagedivs[0])
269                s = getTextFromNode(pagedivs[0])
270               
271                try:
272                    docinfo['numPages'] = int(s)
273                    logging.debug("PAGE NUMBER: %s"%(s))
274               
275                    np = docinfo['numPages']
276                    pageinfo['end'] = min(pageinfo['end'], np)
277                    pageinfo['numgroups'] = int(np / pageinfo['groupsize'])
278                    if np % pageinfo['groupsize'] > 0:
279                        pageinfo['numgroups'] += 1               
280                except:
281                    docinfo['numPages'] = 0
282                 
283        else:
284         #no full text -- init to 0
285            docinfo['pageNumberOrig'] = 0
286            docinfo['countFigureEntries'] = 0
287            docinfo['countPlaces'] = 0
288            docinfo['countTocEntries'] = 0
289            docinfo['numPages'] = 0
290        #return docinfo
291       
292        # plain text mode
293        if mode == "text":
294            # first div contains text
295            pagedivs = dom.xpath("/div")
296            if len(pagedivs) > 0:     
297                pagenode = pagedivs[0]
298                links = pagenode.xpath("//a")
299                for l in links:
300                    hrefNode = l.getAttributeNodeNS(None, u"href")
301                    if hrefNode:
302                        href= hrefNode.nodeValue
303                        if href.startswith('#note-'):
304                            hrefNode.nodeValue = href.replace('#note-',"?url=%s&viewMode=%s&tocMode=%s&tocPN=%s&pn=%s#note-"%(url,viewMode,tocMode,tocPN,pn))
305                return serializeNode(pagenode)
306        if mode == "xml":
307              # first div contains text
308              pagedivs = dom.xpath("/div")
309              if len(pagedivs) > 0:
310                  pagenode = pagedivs[0]
311                  return serializeNode(pagenode)
312        if mode == "gis":
313              # first div contains text
314              pagedivs = dom.xpath("/div")
315              if len(pagedivs) > 0:
316                  pagenode = pagedivs[0]
317                  links =pagenode.xpath("//a")
318                  for l in links:
319                      hrefNode =l.getAttributeNodeNS(None, u"href")
320                      if hrefNode:
321                          href=hrefNode.nodeValue
322                          if href.startswith('http://chinagis.mpiwg-berlin.mpg.de'):
323                              hrefNode.nodeValue =href.replace('chinagis_REST/REST/db/chgis/mpdl','chinagis/REST/db/mpdl/%s'%name)
324                              l.setAttributeNS(None, 'target', '_blank') 
325                  return serializeNode(pagenode)
326                   
327        if mode == "pureXml":
328              # first div contains text
329              pagedivs = dom.xpath("/div")
330              if len(pagedivs) > 0:
331                  pagenode = pagedivs[0]
332                  return serializeNode(pagenode)     
333        # text-with-links mode
334        if mode == "text_dict":
335            # first div contains text
336            pagedivs = dom.xpath("/div")
337            if len(pagedivs) > 0:
338                pagenode = pagedivs[0]
339                # check all a-tags
340                links = pagenode.xpath("//a")
341                for l in links:
342                    hrefNode = l.getAttributeNodeNS(None, u"href")
343                    if hrefNode:
344                        # is link with href
345                        href = hrefNode.nodeValue
346                        if href.startswith('lt/lex.xql'):
347                            # is pollux link
348                            selfurl = self.absolute_url()
349                            # change href
350                            hrefNode.nodeValue = href.replace('lt/lex.xql','%s/template/head_main_voc'%selfurl)
351                            # add target
352                            l.setAttributeNS(None, 'target', '_blank')
353                            l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=700, scrollbars=1'); return false;")
354                            l.setAttributeNS(None, 'onClick', 'popupWin.focus();')     
355                        if href.startswith('lt/lemma.xql'):   
356                            selfurl = self.absolute_url()
357                            hrefNode.nodeValue = href.replace('lt/lemma.xql','%s/template/head_main_lemma'%selfurl)
358                            l.setAttributeNS(None, 'target', '_blank')
359                            l.setAttributeNS(None, 'onClick',"popupWin = window.open(this.href, 'contacts', 'location,width=500,height=600,top=180, left=700, scrollbars=1'); return false;")
360                            l.setAttributeNS(None, 'onClick', 'popupWin.focus();')   
361                        if href.startswith('#note-'):
362                            hrefNode.nodeValue = href.replace('#note-',"?url=%s&viewMode=%s&tocMode=%s&tocPN=%s&pn=%s#note-"%(url,viewMode,tocMode,tocPN,pn))   
363                return serializeNode(pagenode)
364        return "no text here"
365
366    def getTranslate(self, query=None, language=None):
367        """translate into another languages"""
368        data = self.getServerData("lt/lex.xql","document=&language="+str(language)+"&query="+urllib.quote(query))
369        #pagexml=self.template.fulltextclient.eval("/mpdl/interface/lt/lex.xql","document=&language="+str(language)+"&query="+url_quote(str(query)))
370        return data
371   
372    def getLemma(self, lemma=None, language=None):
373        """simular words lemma """
374        data = self.getServerData("lt/lemma.xql","document=&language="+str(language)+"&lemma="+urllib.quote(lemma))
375        #pagexml=self.template.fulltextclient.eval("/mpdl/interface/lt/lemma.xql","document=&language="+str(language)+"&lemma="+url_quote(str(lemma)))
376        return data
377   
378    def getLemmaNew(self, query=None, language=None):
379        """simular words lemma """
380        data = self.getServerData("lt/lemma.xql","document=&language="+str(language)+"&lemma="+urllib.quote(query))
381        #pagexml=self.template.fulltextclient.eval("/mpdl/interface/lt/lemma.xql","document=&language="+str(language)+"&lemma="+url_quote(str(query)))
382        return data
383   
384    def getQuery (self,  docinfo=None, pageinfo=None, query=None, queryType=None, pn=1, optionToggle=None):
385         #number of
386         docpath = docinfo['textURLPath'] 
387         pagesize = pageinfo['queryPageSize']
388         pn = pageinfo['searchPN']
389         query =pageinfo['query']
390         queryType =pageinfo['queryType']
391         tocSearch = 0
392         tocDiv = None
393         
394         pagexml = self.getServerData("doc-query.xql","document=%s&mode=%s&queryType=%s&query=%s&queryResultPageSize=%s&queryResultPN=%s"%(docpath, 'text', queryType, urllib.quote(query), pagesize, pn))
395         pagedom = Parse(pagexml)
396         numdivs = pagedom.xpath("//div[@class='queryResultHits']")
397         tocSearch = int(getTextFromNode(numdivs[0]))
398         logging.debug("documentViewer (gettoc) tocSearch: %s"%(tocSearch))
399         tc=int((tocSearch/10)+1)
400         logging.debug("documentViewer (gettoc) tc: %s"%(tc))
401         return tc
402   
403    def getToc(self, mode="text", docinfo=None):
404        """loads table of contents and stores in docinfo"""
405        logging.debug("documentViewer (gettoc) mode: %s"%(mode))
406        if mode == "none":
407            return docinfo       
408        if 'tocSize_%s'%mode in docinfo:
409            # cached toc
410            return docinfo
411       
412        docpath = docinfo['textURLPath']
413        # we need to set a result set size
414        pagesize = 1000
415        pn = 1
416        if mode == "text":
417            queryType = "toc"
418        else:
419            queryType = mode
420        # number of entries in toc
421        tocSize = 0
422        tocDiv = None
423       
424        pagexml = self.getServerData("doc-query.xql","document=%s&queryType=%s&queryResultPageSize=%s&queryResultPN=%s"%(docpath,queryType, pagesize, pn))
425       
426        # post-processing downloaded xml
427        pagedom = Parse(pagexml)
428        # get number of entries
429        numdivs = pagedom.xpath("//div[@class='queryResultHits']")
430        if len(numdivs) > 0:
431            tocSize = int(getTextFromNode(numdivs[0]))
432        docinfo['tocSize_%s'%mode] = tocSize
433        return docinfo
434   
435    def getTocPage(self, mode="text", pn=1, pageinfo=None, docinfo=None):
436        """returns single page from the table of contents"""
437        # TODO: this should use the cached TOC
438        if mode == "text":
439            queryType = "toc"
440        else:
441            queryType = mode
442        docpath = docinfo['textURLPath']
443        path = docinfo['textURLPath']       
444        pagesize = pageinfo['tocPageSize']
445        pn = pageinfo['tocPN']
446        url = docinfo['url']
447        selfurl = self.absolute_url() 
448        viewMode=  pageinfo['viewMode']
449        characterNormalization = pageinfo ['characterNormalization']
450        optionToggle =pageinfo ['optionToggle']
451        tocMode = pageinfo['tocMode']
452        tocPN = pageinfo['tocPN'] 
453       
454        data = self.getServerData("doc-query.xql","document=%s&queryType=%s&queryResultPageSize=%s&queryResultPN=%s&characterNormalization=regPlusNorm&optionToggle=1"%(docpath,queryType, pagesize, pn)) 
455        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))
456        text = page.replace('mode=image','mode=texttool')
457        #logging.debug("documentViewer (characterNormalization) characterNormalization: %s"%(characterNormalization))
458       
459        return text
460   
461    def manage_changeMpdlXmlTextServer(self,title="",serverUrl="http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/interface/",timeout=40,RESPONSE=None):
462        """change settings"""
463        self.title=title
464        self.timeout = timeout
465        self.serverUrl = serverUrl
466        if RESPONSE is not None:
467            RESPONSE.redirect('manage_main')
468       
469# management methods
470def manage_addMpdlXmlTextServerForm(self):
471    """Form for adding"""
472    pt = PageTemplateFile("zpt/manage_addMpdlXmlTextServer", globals()).__of__(self)
473    return pt()
474
475def manage_addMpdlXmlTextServer(self,id,title="",serverUrl="http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/interface/",timeout=40,RESPONSE=None):
476    """add zogiimage"""
477    newObj = MpdlXmlTextServer(id,title,serverUrl,timeout)
478    self.Destination()._setObject(id, newObj)
479    if RESPONSE is not None:
480        RESPONSE.redirect('manage_main')
Note: See TracBrowser for help on using the repository browser.