Mercurial > hg > documentViewer
annotate MpdlXmlTextServer.py @ 523:acdbd82114bb
fixed bug with original page numbers at the end of thumbnail list.
author | root@tuxserve01.mpiwg-berlin.mpg.de |
---|---|
date | Thu, 05 Apr 2012 14:50:00 +0200 |
parents | 9a3cc3732194 |
children | 652cc8d3f1a9 |
rev | line source |
---|---|
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
1 from OFS.SimpleItem import SimpleItem |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
2 from Products.PageTemplates.PageTemplateFile import PageTemplateFile |
455 | 3 |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
4 import xml.etree.ElementTree as ET |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
5 |
455 | 6 import re |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
7 import logging |
134 | 8 import urllib |
511 | 9 import urlparse |
506 | 10 import base64 |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
11 |
458 | 12 from SrvTxtUtils import getInt, getText, getHttpData |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
13 |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
14 def serialize(node): |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
15 """returns a string containing an XML snippet of node""" |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
16 s = ET.tostring(node, 'UTF-8') |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
17 # snip off XML declaration |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
18 if s.startswith('<?xml'): |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
19 i = s.find('?>') |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
20 return s[i+3:] |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
21 |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
22 return s |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
23 |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
24 |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
25 class MpdlXmlTextServer(SimpleItem): |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
26 """TextServer implementation for MPDL-XML eXist server""" |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
27 meta_type="MPDL-XML TextServer" |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
28 |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
29 manage_options=( |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
30 {'label':'Config','action':'manage_changeMpdlXmlTextServerForm'}, |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
31 )+SimpleItem.manage_options |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
32 |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
33 manage_changeMpdlXmlTextServerForm = PageTemplateFile("zpt/manage_changeMpdlXmlTextServer", globals()) |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
34 |
455 | 35 def __init__(self,id,title="",serverUrl="http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/interface/", serverName=None, timeout=40): |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
36 """constructor""" |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
37 self.id=id |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
38 self.title=title |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
39 self.timeout = timeout |
132 | 40 if serverName is None: |
41 self.serverUrl = serverUrl | |
42 else: | |
43 self.serverUrl = "http://%s/mpdl/interface/"%serverName | |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
44 |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
45 def getHttpData(self, url, data=None): |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
46 """returns result from url+data HTTP request""" |
458 | 47 return getHttpData(url,data,timeout=self.timeout) |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
48 |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
49 def getServerData(self, method, data=None): |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
50 """returns result from text server for method+data""" |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
51 url = self.serverUrl+method |
458 | 52 return getHttpData(url,data,timeout=self.timeout) |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
53 |
506 | 54 |
55 def getPlacesOnPage(self, docinfo=None, pn=None): | |
56 """Returns list of GIS places of page pn""" | |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
57 docpath = docinfo.get('textURLPath',None) |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
58 if not docpath: |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
59 return None |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
60 |
506 | 61 places=[] |
62 text=self.getServerData("xpath.xql", "document=%s&xpath=//place&pn=%s"%(docpath,pn)) | |
455 | 63 dom = ET.fromstring(text) |
506 | 64 result = dom.findall(".//resultPage/place") |
236 | 65 for l in result: |
506 | 66 id = l.get("id") |
67 name = l.text | |
68 place = {'id': id, 'name': name} | |
69 places.append(place) | |
70 | |
71 return places | |
307 | 72 |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
73 |
517 | 74 def getTextInfo(self, mode='', docinfo=None): |
516 | 75 """reads document info, including page concordance, from text server""" |
518
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
76 logging.debug("getTextInfo mode=%s"%mode) |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
77 if mode not in ['toc', 'figures', '']: |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
78 mode = '' |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
79 # check cached info |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
80 if mode: |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
81 # cached toc-request? |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
82 if 'full_%s'%mode in docinfo: |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
83 return docinfo |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
84 |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
85 else: |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
86 # no toc-request |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
87 if 'numTextPages' in docinfo: |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
88 return docinfo |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
89 |
516 | 90 docpath = docinfo.get('textURLPath', None) |
91 if docpath is None: | |
92 logging.error("getTextInfo: no textURLPath!") | |
93 return docinfo | |
517 | 94 |
516 | 95 # we need to set a result set size |
96 pagesize = 10000 | |
97 pn = 1 | |
518
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
98 # fetch docinfo |
517 | 99 pagexml = self.getServerData("doc-info.xql","document=%s&info=%s&pageSize=%s&pn=%s"%(docpath,mode,pagesize,pn)) |
516 | 100 dom = ET.fromstring(pagexml) |
101 # all info in tag <document> | |
102 doc = dom.find("document") | |
103 if doc is None: | |
104 logging.error("getTextInfo: unable to find document-tag!") | |
105 else: | |
106 # go through all child elements | |
107 for tag in doc: | |
108 name = tag.tag | |
109 # numTextPages | |
110 if name == 'countPages': | |
111 np = getInt(tag.text) | |
112 if np > 0: | |
113 docinfo['numTextPages'] = np | |
114 | |
115 # numFigureEntries | |
116 elif name == 'countFigureEntries': | |
117 docinfo['numFigureEntries'] = getInt(tag.text) | |
118 | |
119 # numTocEntries | |
120 elif name == 'countTocEntries': | |
121 # WTF: s1 = int(s)/30+1 | |
122 docinfo['numTocEntries'] = getInt(tag.text) | |
123 | |
124 # numPlaces | |
125 elif name == 'countPlaces': | |
126 docinfo['numPlaces'] = getInt(tag.text) | |
127 | |
128 # pageNumbers | |
129 elif name == 'pageNumbers': | |
130 # contains tags with page numbers | |
131 # <pn><n>4</n><no>4</no><non/></pn> | |
132 # n=scan number, no=original page no, non=normalized original page no | |
133 # pageNumbers is a dict indexed by scan number | |
134 pages = {} | |
135 for pn in tag: | |
136 page = {} | |
137 n = 0 | |
138 for p in pn: | |
139 if p.tag == 'n': | |
140 n = getInt(p.text) | |
518
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
141 page['pn'] = n |
516 | 142 elif p.tag == 'no': |
143 page['no'] = p.text | |
144 elif p.tag == 'non': | |
145 page['non'] = p.text | |
146 | |
147 if n > 0: | |
148 pages[n] = page | |
149 | |
150 docinfo['pageNumbers'] = pages | |
517 | 151 #logging.debug("got pageNumbers=%s"%repr(pages)) |
516 | 152 |
517 | 153 # toc |
154 elif name == 'toc': | |
518
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
155 # contains tags with table of contents/figures |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
156 # <toc-entry><page>13</page><level>3</level><content>Chapter I</content><level-string>1.</level-string><real-level>1</real-level></toc-entry> |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
157 tocs = [] |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
158 for te in tag: |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
159 toc = {} |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
160 for t in te: |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
161 if t.tag == 'page': |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
162 toc['pn'] = getInt(t.text) |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
163 elif t.tag == 'level': |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
164 toc['level'] = t.text |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
165 elif t.tag == 'content': |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
166 toc['content'] = t.text |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
167 elif t.tag == 'level-string': |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
168 toc['level-string'] = t.text |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
169 elif t.tag == 'real-level': |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
170 toc['real-level'] = t.text |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
171 |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
172 tocs.append(toc) |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
173 |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
174 # save as full_toc/full_figures |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
175 docinfo['full_%s'%mode] = tocs |
517 | 176 |
516 | 177 return docinfo |
178 | |
179 | |
455 | 180 def processPageInfo(self, dom, docinfo, pageinfo): |
181 """processes page info divs from dom and stores in docinfo and pageinfo""" | |
469 | 182 # assume first second level div is pageMeta |
183 alldivs = dom.find("div") | |
473 | 184 |
185 if alldivs is None or alldivs.get('class', '') != 'pageMeta': | |
186 logging.error("processPageInfo: pageMeta div not found!") | |
187 return | |
188 | |
455 | 189 for div in alldivs: |
190 dc = div.get('class') | |
191 | |
192 # pageNumberOrig | |
469 | 193 if dc == 'pageNumberOrig': |
455 | 194 pageinfo['pageNumberOrig'] = div.text |
195 | |
196 # pageNumberOrigNorm | |
197 elif dc == 'pageNumberOrigNorm': | |
198 pageinfo['pageNumberOrigNorm'] = div.text | |
199 | |
474 | 200 # pageHeaderTitle |
201 elif dc == 'pageHeaderTitle': | |
202 pageinfo['pageHeaderTitle'] = div.text | |
517 | 203 |
473 | 204 #logging.debug("processPageInfo: pageinfo=%s"%repr(pageinfo)) |
455 | 205 return |
206 | |
388 | 207 |
471 | 208 def getTextPage(self, mode="text", pn=1, docinfo=None, pageinfo=None): |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
209 """returns single page from fulltext""" |
508 | 210 |
455 | 211 logging.debug("getTextPage mode=%s, pn=%s"%(mode,pn)) |
478 | 212 # check for cached text -- but ideally this shouldn't be called twice |
455 | 213 if pageinfo.has_key('textPage'): |
214 logging.debug("getTextPage: using cached text") | |
215 return pageinfo['textPage'] | |
216 | |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
217 docpath = docinfo['textURLPath'] |
455 | 218 # just checking |
219 if pageinfo['current'] != pn: | |
220 logging.warning("getTextPage: current!=pn!") | |
221 | |
222 # stuff for constructing full urls | |
478 | 223 selfurl = docinfo['viewerUrl'] |
511 | 224 textParams = {'document': docpath, |
225 'pn': pn} | |
226 if 'characterNormalization' in pageinfo: | |
227 textParams['characterNormalization'] = pageinfo['characterNormalization'] | |
455 | 228 |
508 | 229 if not mode: |
230 # default is dict | |
231 mode = 'text' | |
232 | |
233 modes = mode.split(',') | |
234 # check for multiple layers | |
235 if len(modes) > 1: | |
236 logging.debug("getTextPage: more than one mode=%s"%mode) | |
237 | |
238 # search mode | |
239 if 'search' in modes: | |
240 # add highlighting | |
241 highlightQuery = pageinfo.get('highlightQuery', None) | |
511 | 242 if highlightQuery: |
243 textParams['highlightQuery'] = highlightQuery | |
244 textParams['highlightElement'] = pageinfo.get('highlightElement', '') | |
245 textParams['highlightElementPos'] = pageinfo.get('highlightElementPos', '') | |
508 | 246 |
511 | 247 # ignore mode in the following |
508 | 248 modes.remove('search') |
249 | |
250 # other modes don't combine | |
251 if 'dict' in modes: | |
473 | 252 # dict is called textPollux in the backend |
508 | 253 textmode = 'textPollux' |
254 elif len(modes) == 0: | |
255 # text is default mode | |
256 textmode = 'text' | |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
257 else: |
508 | 258 # just take first mode |
259 textmode = modes[0] | |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
260 |
511 | 261 textParams['mode'] = textmode |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
262 |
455 | 263 # fetch the page |
511 | 264 pagexml = self.getServerData("page-fragment.xql",urllib.urlencode(textParams)) |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
265 dom = ET.fromstring(pagexml) |
455 | 266 # extract additional info |
267 self.processPageInfo(dom, docinfo, pageinfo) | |
268 # page content is in <div class="pageContent"> | |
269 pagediv = None | |
270 # ElementTree 1.2 in Python 2.6 can't do div[@class='pageContent'] | |
469 | 271 # so we look at the second level divs |
272 alldivs = dom.findall("div") | |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
273 for div in alldivs: |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
274 dc = div.get('class') |
455 | 275 # page content div |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
276 if dc == 'pageContent': |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
277 pagediv = div |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
278 break |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
279 |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
280 # plain text mode |
508 | 281 if textmode == "text": |
478 | 282 # get full url assuming documentViewer is parent |
283 selfurl = self.getLink() | |
473 | 284 if pagediv is not None: |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
285 links = pagediv.findall(".//a") |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
286 for l in links: |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
287 href = l.get('href') |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
288 if href and href.startswith('#note-'): |
478 | 289 href = href.replace('#note-',"%s#note-"%selfurl) |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
290 l.set('href', href) |
455 | 291 |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
292 return serialize(pagediv) |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
293 |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
294 # text-with-links mode |
508 | 295 elif textmode == "textPollux": |
473 | 296 if pagediv is not None: |
478 | 297 viewerurl = docinfo['viewerUrl'] |
298 selfurl = self.getLink() | |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
299 # check all a-tags |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
300 links = pagediv.findall(".//a") |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
301 for l in links: |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
302 href = l.get('href') |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
303 |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
304 if href: |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
305 # is link with href |
511 | 306 linkurl = urlparse.urlparse(href) |
307 #logging.debug("getTextPage: linkurl=%s"%repr(linkurl)) | |
308 if linkurl.path.endswith('GetDictionaryEntries'): | |
309 #TODO: replace wordInfo page | |
478 | 310 # is dictionary link - change href (keeping parameters) |
511 | 311 #l.set('href', href.replace('http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/interface/lt/wordInfo.xql','%s/template/viewer_wordinfo'%viewerurl)) |
478 | 312 # add target to open new page |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
313 l.set('target', '_blank') |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
314 |
478 | 315 # TODO: is this needed? |
511 | 316 # if href.startswith('http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/lt/lemma.xql'): |
317 # selfurl = self.absolute_url() | |
318 # l.set('href', href.replace('http://mpdl-proto.mpiwg-berlin.mpg.de/mpdl/lt/lemma.xql','%s/head_main_lemma'%selfurl)) | |
319 # l.set('target', '_blank') | |
320 # 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;") | |
321 # l.set('ondblclick', 'popupWin.focus();') | |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
322 |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
323 if href.startswith('#note-'): |
478 | 324 # note link |
325 l.set('href', href.replace('#note-',"%s#note-"%selfurl)) | |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
326 |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
327 return serialize(pagediv) |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
328 |
455 | 329 # xml mode |
508 | 330 elif textmode == "xml": |
473 | 331 if pagediv is not None: |
455 | 332 return serialize(pagediv) |
333 | |
334 # pureXml mode | |
508 | 335 elif textmode == "pureXml": |
473 | 336 if pagediv is not None: |
455 | 337 return serialize(pagediv) |
338 | |
339 # gis mode | |
508 | 340 elif textmode == "gis": |
473 | 341 if pagediv is not None: |
455 | 342 # check all a-tags |
343 links = pagediv.findall(".//a") | |
506 | 344 # add our URL as backlink |
345 selfurl = self.getLink() | |
346 doc = base64.b64encode(selfurl) | |
455 | 347 for l in links: |
348 href = l.get('href') | |
349 if href: | |
506 | 350 if href.startswith('http://mappit.mpiwg-berlin.mpg.de'): |
351 l.set('href', re.sub(r'doc=[\w+/=]+', 'doc=%s'%doc, href)) | |
352 l.set('target', '_blank') | |
455 | 353 |
354 return serialize(pagediv) | |
355 | |
501 | 356 return None |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
357 |
455 | 358 |
509
9d05befdd462
try to get characterNormalization in search result working.
casties
parents:
508
diff
changeset
|
359 def getSearchResults(self, mode, query=None, pageinfo=None, docinfo=None): |
508 | 360 """loads list of search results and stores XML in docinfo""" |
511 | 361 |
508 | 362 logging.debug("getSearchResults mode=%s query=%s"%(mode, query)) |
363 if mode == "none": | |
364 return docinfo | |
365 | |
511 | 366 cachedQuery = docinfo.get('cachedQuery', None) |
367 if cachedQuery is not None: | |
368 # cached search result | |
369 if cachedQuery == '%s_%s'%(mode,query): | |
370 # same query | |
371 return docinfo | |
372 | |
373 else: | |
374 # different query | |
375 del docinfo['resultSize'] | |
376 del docinfo['resultXML'] | |
508 | 377 |
511 | 378 # cache query |
379 docinfo['cachedQuery'] = '%s_%s'%(mode,query) | |
509
9d05befdd462
try to get characterNormalization in search result working.
casties
parents:
508
diff
changeset
|
380 |
508 | 381 # fetch full results |
511 | 382 docpath = docinfo['textURLPath'] |
508 | 383 params = {'document': docpath, |
384 'mode': 'text', | |
385 'queryType': mode, | |
386 'query': query, | |
387 'queryResultPageSize': 1000, | |
509
9d05befdd462
try to get characterNormalization in search result working.
casties
parents:
508
diff
changeset
|
388 'queryResultPN': 1, |
9d05befdd462
try to get characterNormalization in search result working.
casties
parents:
508
diff
changeset
|
389 'characterNormalization': pageinfo.get('characterNormalization', 'reg')} |
508 | 390 pagexml = self.getServerData("doc-query.xql",urllib.urlencode(params)) |
391 #pagexml = self.getServerData("doc-query.xql","document=%s&mode=%s&queryType=%s&query=%s&queryResultPageSize=%s&queryResultPN=%s&s=%s&viewMode=%s&characterNormalization=%s&highlightElementPos=%s&highlightElement=%s&highlightQuery=%s"%(docpath, 'text', queryType, urllib.quote(query), pagesize, pn, s, viewMode,characterNormalization, highlightElementPos, highlightElement, urllib.quote(highlightQuery))) | |
392 dom = ET.fromstring(pagexml) | |
393 # page content is in <div class="queryResultPage"> | |
394 pagediv = None | |
395 # ElementTree 1.2 in Python 2.6 can't do div[@class='queryResultPage'] | |
396 alldivs = dom.findall("div") | |
397 for div in alldivs: | |
398 dc = div.get('class') | |
399 # page content div | |
400 if dc == 'queryResultPage': | |
401 pagediv = div | |
402 | |
403 elif dc == 'queryResultHits': | |
511 | 404 docinfo['resultSize'] = getInt(div.text) |
508 | 405 |
510 | 406 if pagediv is not None: |
508 | 407 # store XML in docinfo |
511 | 408 docinfo['resultXML'] = ET.tostring(pagediv, 'UTF-8') |
508 | 409 |
410 return docinfo | |
411 | |
412 | |
413 def getResultsPage(self, mode="text", query=None, pn=None, start=None, size=None, pageinfo=None, docinfo=None): | |
414 """returns single page from the table of contents""" | |
415 logging.debug("getResultsPage mode=%s, pn=%s"%(mode,pn)) | |
516 | 416 # get (cached) result |
417 self.getSearchResults(mode=mode, query=query, pageinfo=pageinfo, docinfo=docinfo) | |
508 | 418 |
511 | 419 resultxml = docinfo.get('resultXML', None) |
508 | 420 if not resultxml: |
421 logging.error("getResultPage: unable to find resultXML") | |
422 return "Error: no result!" | |
423 | |
424 if size is None: | |
511 | 425 size = pageinfo.get('resultPageSize', 10) |
508 | 426 |
427 if start is None: | |
428 start = (pn - 1) * size | |
429 | |
430 fullresult = ET.fromstring(resultxml) | |
431 | |
510 | 432 if fullresult is not None: |
508 | 433 # paginate |
511 | 434 first = start-1 |
508 | 435 len = size |
436 del fullresult[:first] | |
437 del fullresult[len:] | |
438 tocdivs = fullresult | |
439 | |
440 # check all a-tags | |
441 links = tocdivs.findall(".//a") | |
442 for l in links: | |
443 href = l.get('href') | |
444 if href: | |
511 | 445 # assume all links go to pages |
446 linkUrl = urlparse.urlparse(href) | |
447 linkParams = urlparse.parse_qs(linkUrl.query) | |
448 # take some parameters | |
449 params = {'pn': linkParams['pn'], | |
450 'highlightQuery': linkParams.get('highlightQuery',''), | |
451 'highlightElement': linkParams.get('highlightElement',''), | |
452 'highlightElementPos': linkParams.get('highlightElementPos','') | |
453 } | |
454 url = self.getLink(params=params) | |
455 l.set('href', url) | |
508 | 456 |
457 return serialize(tocdivs) | |
458 | |
459 return "ERROR: no results!" | |
460 | |
461 | |
518
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
462 def getToc(self, mode='text', docinfo=None): |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
463 """returns list of table of contents from docinfo""" |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
464 logging.debug("getToc mode=%s"%mode) |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
465 if mode == 'text': |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
466 queryType = 'toc' |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
467 else: |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
468 queryType = mode |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
469 |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
470 if not 'full_%s'%queryType in docinfo: |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
471 # get new toc |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
472 docinfo = self.getTextInfo(queryType, docinfo) |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
473 |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
474 return docinfo.get('full_%s'%queryType, []) |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
475 |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
476 def getTocPage(self, mode='text', pn=None, start=None, size=None, pageinfo=None, docinfo=None): |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
477 """returns single page from the table of contents""" |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
478 logging.debug("getTocPage mode=%s, pn=%s start=%s size=%s"%(mode,repr(pn),repr(start),repr(size))) |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
479 fulltoc = self.getToc(mode=mode, docinfo=docinfo) |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
480 if len(fulltoc) < 1: |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
481 logging.error("getTocPage: unable to find toc!") |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
482 return "Error: no table of contents!" |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
483 |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
484 if size is None: |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
485 size = pageinfo.get('tocPageSize', 30) |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
486 |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
487 if start is None: |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
488 start = (pn - 1) * size |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
489 |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
490 # paginate |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
491 first = (start - 1) |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
492 last = first + size |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
493 tocs = fulltoc[first:last] |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
494 tp = '<div>' |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
495 for toc in tocs: |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
496 pageurl = self.getLink('pn', toc['pn']) |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
497 tp += '<div class="tocline">' |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
498 tp += '<div class="toc name">[%s %s]</div>'%(toc['level-string'], toc['content']) |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
499 tp += '<div class="toc float right page"><a href="%s">Page: %s</a></div>'%(pageurl, toc['pn']) |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
500 tp += '</div>\n' |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
501 |
519
9a3cc3732194
uses xml from doc-info.xql for table of contents now.
casties
parents:
518
diff
changeset
|
502 tp += '</div>\n' |
518
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
503 |
91051b36b9cc
uses xml info from doc-info.xql for table of contents now.
casties
parents:
517
diff
changeset
|
504 return tp |
519
9a3cc3732194
uses xml from doc-info.xql for table of contents now.
casties
parents:
518
diff
changeset
|
505 |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
506 |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
507 def manage_changeMpdlXmlTextServer(self,title="",serverUrl="http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/interface/",timeout=40,RESPONSE=None): |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
508 """change settings""" |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
509 self.title=title |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
510 self.timeout = timeout |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
511 self.serverUrl = serverUrl |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
512 if RESPONSE is not None: |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
513 RESPONSE.redirect('manage_main') |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
514 |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
515 # management methods |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
516 def manage_addMpdlXmlTextServerForm(self): |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
517 """Form for adding""" |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
518 pt = PageTemplateFile("zpt/manage_addMpdlXmlTextServer", globals()).__of__(self) |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
519 return pt() |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
520 |
453
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
521 def manage_addMpdlXmlTextServer(self,id,title="",serverUrl="http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/interface/",timeout=40,RESPONSE=None): |
beb7ccb92564
first version using elementtree instead of 4suite xml
casties
parents:
407
diff
changeset
|
522 #def manage_addMpdlXmlTextServer(self,id,title="",serverUrl="http://mpdl-text.mpiwg-berlin.mpg.de:30030/mpdl/interface/",timeout=40,RESPONSE=None): |
129
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
523 """add zogiimage""" |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
524 newObj = MpdlXmlTextServer(id,title,serverUrl,timeout) |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
525 self.Destination()._setObject(id, newObj) |
9404b6c37920
more modular version with separate object MpdlXmlTextServer
casties
parents:
diff
changeset
|
526 if RESPONSE is not None: |
455 | 527 RESPONSE.redirect('manage_main') |
528 | |
529 |