version 1.238.2.2, 2011/07/15 19:34:41
|
version 1.238.2.14, 2011/08/16 16:27:08
|
Line 1
|
Line 1
|
|
|
from OFS.SimpleItem import SimpleItem |
from OFS.SimpleItem import SimpleItem |
from Products.PageTemplates.PageTemplateFile import PageTemplateFile |
from Products.PageTemplates.PageTemplateFile import PageTemplateFile |
|
|
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=None, start=None, size=None, pageinfo=None, docinfo=None): |
"""returns single page from the table of contents""" |
"""returns single page from the table of contents""" |
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 535 class MpdlXmlTextServer(SimpleItem):
|
Line 494 class MpdlXmlTextServer(SimpleItem):
|
tocxml = docinfo.get('tocXML_%s'%mode, None) |
tocxml = docinfo.get('tocXML_%s'%mode, None) |
if not tocxml: |
if not tocxml: |
logging.error("getTocPage: unable to find tocXML") |
logging.error("getTocPage: unable to find tocXML") |
return "No ToC" |
return "Error: no table of contents!" |
|
|
pagesize = int(pageinfo['tocPageSize']) |
if size is None: |
url = docinfo['url'] |
size = pageinfo.get('tocPageSize', 30) |
urlmode = docinfo['mode'] |
|
selfurl = docinfo['viewerUrl'] |
if start is None: |
viewMode= pageinfo['viewMode'] |
start = (pn - 1) * size |
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 |
first = (start - 1) * 2 |
#end = start + pagesize * 2 |
len = size * 2 |
#tocdivs = fulltoc[start:end] |
del fulltoc[:first] |
|
del fulltoc[len:] |
tocdivs = fulltoc |
tocdivs = fulltoc |
|
|
# check all a-tags |
# check all a-tags |
Line 562 class MpdlXmlTextServer(SimpleItem):
|
Line 520 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) |
|
|
return serialize(tocdivs) |
# fix two-divs-per-row with containing div |
|
newtoc = ET.Element('div', {'class':'queryResultPage'}) |
|
for (d1,d2) in zip(tocdivs[::2],tocdivs[1::2]): |
|
e = ET.Element('div',{'class':'tocline'}) |
|
e.append(d1) |
|
e.append(d2) |
|
newtoc.append(e) |
|
|
|
return serialize(newtoc) |
|
|
|
return "ERROR: no table of contents!" |
|
|
|
|
def manage_changeMpdlXmlTextServer(self,title="",serverUrl="http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/interface/",timeout=40,RESPONSE=None): |
def manage_changeMpdlXmlTextServer(self,title="",serverUrl="http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/interface/",timeout=40,RESPONSE=None): |