--- zogiLib/zogiLib.py 2004/04/21 08:59:14 1.8 +++ zogiLib/zogiLib.py 2004/06/02 19:01:36 1.20 @@ -1,3 +1,4 @@ + from Products.PageTemplates.PageTemplateFile import PageTemplateFile from Products.PageTemplates.PageTemplate import PageTemplate from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate @@ -19,109 +20,48 @@ def getString(self,key,default=''): except: return default - -class zogiLib_navTemplate(ZopePageTemplate): - """pageTemplate Objekt""" - meta_type="zogiLib_navTemplate" - - _default_content_fn = os.path.join(package_home(globals()), - 'zpt/zogiLib_NavTemplateDefault.zpt') - - manage_options=ZopePageTemplate.manage_options+( - {'label':'Copy to Filesystem','action':'copyContent'}, - ) - - def getPath(self): - """get path""" - return getPath(self,'thumbtemplate.templ') - - - def copyContent(self): - """copycontent to path""" - - return "copied to:"+copyContent(self,'thumbtemplate.templ') - - -def manage_addZogiLib_NavTemplateForm(self): - """Form for adding""" - pt=PageTemplateFile('Products/zogiLib/zpt/AddZogilib_NavTemplate.zpt').__of__(self) - return pt() - - - - -def manage_addZogiLib_NavTemplate(self, id,title=None, text=None, - REQUEST=None, submit=None): - "Add a Page Template with optional file content." - - - id = str(id) - if REQUEST is None: - self._setObject(id, zogilib_NavTemplate(id, text)) - ob = getattr(self, id) - - if title: - ob.pt_setTitle(title) - return ob - else: - file = REQUEST.form.get('file') - headers = getattr(file, 'headers', None) - if headers is None or not file.filename: - zpt = zogilib_NavTemplate(id) - else: - zpt = zogilib_NavTemplate(id, file, headers.get('content_type')) - - self._setObject(id, zpt) - ob = getattr(self, id) - - - try: - u = self.DestinationURL() - except AttributeError: - u = REQUEST['URL1'] - - if submit == " Add and Edit ": - u = "%s/%s" % (u, quote(id)) - REQUEST.RESPONSE.redirect(u+'/manage_main') - return '' - - - -def readNavTemp(fileName): - """navtemp""" - - - if os.path.exists(fileName+"/index.meta"): - dom=xml.dom.minidom.parse(fileName+"/index.meta") +def sendFile(self, filename, type): + """sends an object or a local file (in the product) as response""" + paths = filename.split('/') + object = self + # look for an object called filename + for path in paths: + if hasattr(object, path): + object = getattr(object, path) + else: + object = None + break + if object: + # if the object exists then send it + return object.index_html(self.REQUEST.REQUEST, self.REQUEST.RESPONSE) else: - return None - - - try: - navTag=getText(dom.getElementsByTagName('zogilibtemplate')[0].childNodes) - except: - navTag=None - return navTag - -class zogiLib_mainTemplate(ZopePageTemplate): - """pageTemplate Objekt""" - meta_type="zogiLib_mainTemplate" - - - def __init__(self, id, text=None, content_type=None, version="book"): + # send a local file with the given content-type + fn = os.path.join(package_home(globals()), filename) + self.REQUEST.RESPONSE.setHeader("Content-Type", type) + self.REQUEST.RESPONSE.write(file(fn).read()) + return + +class BrowserCheck: + """check the browsers request to find out the browser type""" + + def __init__(self, zope): + self.ua = zope.REQUEST.get_header("HTTP_USER_AGENT") + self.isIE = string.find(self.ua, 'MSIE') > -1 + self.isN4 = (string.find(self.ua, 'Mozilla/4.') > -1) and not self.isIE + self.nav = self.ua[string.find(self.ua, '('):] + ie = string.split(self.nav, "; ")[1] + if string.find(ie, "MSIE") > -1: + self.versIE = string.split(ie, " ")[1] + self.isMac = string.find(self.ua, 'Macintosh') > -1 + self.isWin = string.find(self.ua, 'Windows') > -1 + self.isIEWin = self.isIE and self.isWin + self.isIEMac = self.isIE and self.isMac - default_content_string="zpt/zogiLibMain_%s.zpt"%version - self._default_content_fn = os.path.join(package_home(globals()),default_content_string) - self.id = str(id) - self.ZBindings_edit(self._default_bindings) - if text is None: - text = open(self._default_content_fn).read() - self.pt_edit(text, content_type) - def manage_addZogiLibMainTemplateForm(self): """Form for adding""" - pt=PageTemplateFile('Products/ECHO_content/zpt/AddOSAS_thumbTemplate.zpt').__of__(self) + #FIXME:??? + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/AddOSAS_thumbTemplate.zpt')).__of__(self) return pt() @@ -130,8 +70,7 @@ def manage_addZogiLibMainTemplateForm(se def manage_addZogiLibMainTemplate(self, id,title=None, text=None, REQUEST=None, submit=None): "Add a Page Template with optional file content." - - + #FIXME:??? id = str(id) if REQUEST is None: self._setObject(id, zogiLib_mainTemplate(id, text)) @@ -167,6 +106,9 @@ class zogiImage(Image): """einzelnes Image""" meta_type="zogiImage" + manage_options=ZopePageTemplate.manage_options+( + {'label':'Main config','action':'changeZogiImageForm'}, + ) def __init__(self,id,title,baseUrl,queryString,content_type='',precondition=''): @@ -184,7 +126,7 @@ class zogiImage(Image): def changeZogiImageForm(self): """Main configuration""" - pt=PageTemplateFile('Products/zogiLib/zpt/changeZogiImageForm.zpt').__of__(self) + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/changeZogiImageForm.zpt')).__of__(self) return pt() def changeZogiImage(self,title,baseUrl, queryString,RESPONSE=None): @@ -196,13 +138,6 @@ class zogiImage(Image): if RESPONSE is not None: RESPONSE.redirect('manage_main') - - manage_options=ZopePageTemplate.manage_options+( - {'label':'Main config','action':'changeZogiImageForm'}, - ) - - - def index_html(self, REQUEST, RESPONSE): """ @@ -470,7 +405,7 @@ class zogiImage(Image): def manage_addZogiImageForm(self): """Form for adding""" - pt=PageTemplateFile('Products/zogiLib/zpt/addZogiImage.zpt').__of__(self) + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/addZogiImage.zpt')).__of__(self) return pt() @@ -488,37 +423,9 @@ class zogiLib(Folder): meta_type="zogiLib" - def getDlInfo(self): - """DLInfo""" - paramH={} - baseUrl=re.sub("servlet/Scaler","dlInfo-xml.jsp",self.digilibBaseUrl) - - url=urllib.urlopen(baseUrl+self.REQUEST['QUERY_STRING']) - dom=xml.dom.minidom.parse(url) - params=dom.getElementsByTagName('parameter') - for param in params: - paramH[param.getAttribute('name')]=param.getAttribute('value') - return paramH - - def getPageNumTotal(self): - """pagenums""" - return self.getDlInfo()['pt'] - - - def generateImageFolder(self): - """images ablegen""" - self.manage_addFolder('images') - pathName=os.path.join(package_home(globals()),'images') - for image in os.listdir(pathName): - try: - - fn=file(os.path.join(pathName,image)) - self.images.manage_addImage(image,fn) - except: - print "ZOGILIB not imported:",image - - - + manage_options = Folder.manage_options+( + {'label':'Main Config','action':'changeZogiLibForm'}, + ) def __init__(self, id,title,digilibBaseUrl, localFileBase,version="book"): """init""" @@ -527,294 +434,374 @@ class zogiLib(Folder): self.title=title self.digilibBaseUrl=digilibBaseUrl self.localFileBase=localFileBase - #self._setObject('topTemplate',zogiLib_navTemplate(id='topTemplate')) - self._setObject('mainTemplate',zogiLib_mainTemplate(id='mainTemplate',version=version)) - self.generateImageFolder() + self.layout=version - manage_options = Folder.manage_options+( - {'label':'Main Config','action':'changeZogiLibForm'}, - ) - - def option_js(self): - """option_js""" - ret="""function setDLParam(e) { - if (document.all) { - s=e.srcElement; - } else { - s=e.target; - } - if (window.opener) { - window.opener.setParameter(s.name, s.value); - window.opener.display(9); - } else { - document.setParameter(s.name, s.value); - document.display(9); - } - }""" - return ret - - - def navigation_js(self): - """Javascript""" - fileName=os.path.join(package_home(globals()),'js/navigation.js') - return file(fileName).read() + def getDLInfo(self): + """get DLInfo from digilib server""" + paramH={} + baseUrl=re.sub("servlet/Scaler","dlInfo-xml.jsp",self.digilibBaseUrl) + try: + url=urllib.urlopen(baseUrl+self.REQUEST['QUERY_STRING']) + dom=xml.dom.minidom.parse(url) + params=dom.getElementsByTagName('parameter') + for param in params: + paramH[param.getAttribute('name')]=param.getAttribute('value') + return paramH + except: + return null - - def generateTopJavaScript(self): - """generate script""" - ret=""" - var baseUrl = '%s'; """% self.REQUEST['URL0'] - ret+=""" - newParameter('fn', '', 1); - newParameter('pn', '1', 1); - newParameter('ws', '1.0', 1); - newParameter('mo', '', 1); - newParameter('mk', '', 3); - newParameter('wx', '0.0', 2); - newParameter('wy', '0.0', 2); - newParameter('ww', '1.0', 2); - newParameter('wh', '1.0', 2); - newParameter('pt', '0', 9); - newParameter('brgt', '0.0', 1); - newParameter('cont', '0.0', 1); - newParameter('rot', '0.0', 1); - newParameter('rgba', '', 1); - newParameter('rgbm', '', 1); - newParameter('ddpix', '', 9); - newParameter('ddpiy', '', 9); - var picsize = new Size(100, 100); - document.id='digilib'; - """ - return ret + def createHeadJS(self): + """generate all javascript tags for head""" + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/zogilib_head_js')).__of__(self) + return pt() + def createParamJS(self): + """generate javascript for parameters only""" + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/zogilib_param_js')).__of__(self) + return pt() - def generateScalerImg(self,requestString): + + def createScalerImg(self, requestString = None): """generate Scaler IMG Tag""" - retStr=self.digilibBaseUrl+requestString - jS=""""""%retStr - return jS + self.checkQuery() + bt = self.REQUEST.SESSION['browserType'] + if not requestString: + requestString = self.REQUEST.QUERY_STRING + url = self.digilibBaseUrl+requestString + tag = "" + if bt.isN4: + tag += '' + else: + tag += '
' + tag += '' + if bt.isN4: + tag += '' + else: + tag += '
' + return tag - def changeZogiLibForm(self): - """Main configuration""" - pt=PageTemplateFile('Products/zogiLib/zpt/changeZogiLibForm.zpt').__of__(self) + def createAuxDiv(self): + """generate other divs""" + self.checkQuery() + bt = self.REQUEST.SESSION['browserType'] + if bt.isN4: + f = 'zpt/zogilib_divsN4.zpt' + else: + f = 'zpt/zogilib_divs.zpt' + pt=PageTemplateFile(os.path.join(package_home(globals()),f)).__of__(self) return pt() - - def changeZogiLib(self,title,digilibBaseUrl, localFileBase,RESPONSE=None): - """change it""" - self.title=title - self.digilibBaseUrl=digilibBaseUrl - self.localFileBase=localFileBase - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - - def nav_html(self,fileName): - """navigations frame""" - ## currently not in use - # suche nach index.meta mit zogilib thumb info - - templ=readNavTemp(self.localFileBase+"/"+fileName) - if not templ: - templ=readNavTemp(self.localFileBase+"/"+fileName.split("/")[0]) - if not templ: - return self.topTemplate.document_src() + def option_js(self): + """option_js""" + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/option_js')).__of__(self) + return pt() - return urllib.urlopen(templ).read() - - + def dl_lib_js(self): + """javascript""" + return sendFile(self, 'js/dl_lib.js', 'text/plain') + + def js_lib_js(self): + """javascript""" + return sendFile(self, 'js/js_lib.js', 'text/plain') + + def optionwindow(self): + """showoptions""" + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/optionwindow.zpt')).__of__(self) + return pt() + + def mark1(self): + """mark image""" + return sendFile(self, 'images/mark1.gif', 'image/gif') + + def mark2(self): + """mark image""" + return sendFile(self, 'images/mark2.gif', 'image/gif') + + def mark3(self): + """mark image""" + return sendFile(self, 'images/mark3.gif', 'image/gif') + + def mark4(self): + """mark image""" + return sendFile(self, 'images/mark4.gif', 'image/gif') + + def mark5(self): + """mark image""" + return sendFile(self, 'images/mark5.gif', 'image/gif') + + def mark6(self): + """mark image""" + return sendFile(self, 'images/mark6.gif', 'image/gif') + + def mark7(self): + """mark image""" + return sendFile(self, 'images/mark7.gif', 'image/gif') + + def mark8(self): + """mark image""" + return sendFile(self, 'images/mark8.gif', 'image/gif') + + def corner1(self): + """mark image""" + return sendFile(self, 'images/olinks.gif', 'image/gif') + + def corner2(self): + """mark image""" + return sendFile(self, 'images/orechts.gif', 'image/gif') + + def corner3(self): + """mark image""" + return sendFile(self, 'images/ulinks.gif', 'image/gif') + + def corner4(self): + """mark image""" + return sendFile(self, 'images/urechts.gif', 'image/gif') + + + + def index_html(self): """main action""" + tp = "zogiLibMainTemplate" + if hasattr(self, tp): + pt = getattr(self, tp) + else: + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/zogiLibMain_%s'%self.layout)).__of__(self) + return pt() - #pt=PageTemplateFile('Products/zogiLib/zpt/zogiLibMain_image.zpt').__of__(self) - #return pt() - return self.mainTemplate() def storeQuery(self): """storeQuery in session""" - self.REQUEST.SESSION['query']={} + dlParams = {} for fm in self.REQUEST.form.keys(): - self.REQUEST.SESSION['query'][fm]=self.REQUEST.form[fm] + dlParams[fm] = self.REQUEST.form[fm] + + if 'mo' in dlParams: + if len(dlParams['mo']) > 0: + modes=dlParams['mo'].split(',') + else: + modes=[] - self.REQUEST.SESSION['dlInfo']=self.getDlInfo() + self.REQUEST.SESSION['query'] = dlParams + self.REQUEST.SESSION['dlModes'] = modes + self.REQUEST.SESSION['dlInfo'] = self.getDLInfo() + self.REQUEST.SESSION['browserType'] = BrowserCheck(self) + + def checkQuery(self): + """check if the query has been stored""" + if not (self.REQUEST.SESSION and 'query' in self.REQUEST.SESSION): + print "ZOGILIB: have to store query!!" + storeQuery(self) - def getParam(self,param): - """Gebe Parameter aus""" + def getDLParam(self,param): + """returns parameter""" try: return self.REQUEST.SESSION['query'][param] except: return None - def getPageNum(self): - """PAgenum""" - pn=self.getParam('pn') - if pn: - return pn - else: - return 1 - - def biggerWS(self): - """ws+1""" - ws=self.getParam('ws') - if ws: - return int(ws)+1 - else: - return 2 - - def options(self): - """showoptions""" - pt=PageTemplateFile('Products/zogiLib/zpt/optionwindow.zpt').__of__(self) - return pt() + def setDLParam(self, param, value): + """sets parameter""" + self.REQUEST.SESSION['query'][param] = value + return + + def getAllDLParams(self): + """parameter string for digilib""" + dlParams = self.REQUEST.SESSION['query'] + # save modes + modes = self.REQUEST.SESSION['dlModes'] + dlParams['mo'] = string.join(modes, ',') + # assemble query string + ret = "" + for param in dlParams.keys(): + val = str(dlParams[param]) + if val != "": + ret += param + "=" + val + "&" + # omit trailing "&" + return ret.rstrip('&') - def smallerWS(self): - """ws-11""" - ws=self.getParam('ws') - if ws: - if int(ws)==1: - return - else: - return int(ws)-1 - else: - return 1 - - - def setParam(self,pn=None,ws=None,rot=None,brgt=None,cont=None): + def setDLParams(self,pn=None,ws=None,rot=None,brgt=None,cont=None): """setze Parameter""" ret="" if brgt: - self.REQUEST.SESSION['query']['brgt']=brgt + self.setDLParam('brgt', brgt) if cont: - self.REQUEST.SESSION['query']['cont']=cont + self.setDLParam('cont', cont) if pn: - self.REQUEST.SESSION['query']['pn']=pn + self.setDLParam('pn', pn) if ws: - self.REQUEST.SESSION['query']['ws']=ws + self.setDLParam('ws', ws) if rot: - self.REQUEST.SESSION['query']['rot']=rot - - for param in self.REQUEST.SESSION['query'].keys(): + self.setDLParam('rot', rot) - ret+=param+"="+str(self.REQUEST.SESSION['query'][param])+"&" - - self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret) + return self.display() - - def mirrorPage(self,mi): - """mirror""" - ret="" - try: - splitted=self.REQUEST.SESSION['query']['mo'].split(',') - except: - splitted=[] - - if mi=="h": - - if 'hmir' in splitted: - splitted.remove('hmir') - else: - splitted.append('hmir') - if mi=="v": + def display(self): + """(re)display page""" + params = self.getAllDLParams() + self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+params) - if 'vmir' in splitted: - splitted.remove('vmir') - else: - splitted.append('vmir') + def getPT(self): + """pagenums""" + di = self.REQUEST.SESSION['dlInfo'] + if di: + return int(di['pt']) + else: + return 1 + + def getPN(self): + """Pagenum""" + pn = self.getDLParam('pn') + if pn: + return int(pn) + else: + return 1 + def getBiggerWS(self): + """ws+1""" + ws=self.getDLParam('ws') + if ws: + return int(ws)+1 + else: + return 2 - self.REQUEST.SESSION['query']['mo']=string.join(splitted,",") - - - - - for param in self.REQUEST.SESSION['query'].keys(): - - ret+=param+"="+str(self.REQUEST.SESSION['query'][param])+"&" - - self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret) - - def decode(self,strR): - """decode &""" - - return re.sub('\&','\&',strR) - - def wholePage(self): - """zoom out""" - ret="" - self.REQUEST.SESSION['query']['ww']=1 - self.REQUEST.SESSION['query']['wh']=1 - self.REQUEST.SESSION['query']['wx']=0 - self.REQUEST.SESSION['query']['wy']=0 - - for param in self.REQUEST.SESSION['query'].keys(): - - ret+=param+"="+str(self.REQUEST.SESSION['query'][param])+"&" - - self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret) - - def prevPage(self,pn=None): - """next page""" - ret="" + def getSmallerWS(self): + """ws-1""" + ws=self.getDLParam('ws') + if ws: + if int(ws)==1: + return 1 + else: + return int(ws)-1 + else: + return 1 - if pn and pn>0: - pn=str(int(pn)-1) - + def hasMode(self, mode): + """returns if mode is in the diglib mo parameter""" + return (mode in self.REQUEST.SESSION['dlModes']) + + def hasNextPage(self): + """returns if there is a next page""" + pn = self.getPN() + pt = self.getPT() + return (pn < pt) + + def hasPrevPage(self): + """returns if there is a previous page""" + pn = self.getPN() + return (pn > 1) - self.REQUEST.form['pn']=pn - - for param in self.REQUEST.form.keys(): - - ret+=param+"="+str(self.REQUEST.form[param])+"&" + - self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret) + def dl_HMirror(self): + """mirror action""" + modes = self.REQUEST.SESSION['dlModes'] + if 'hmir' in modes: + modes.remove('hmir') + else: + modes.append('hmir') - def firstPage(self): - """erste Seite""" - return self.setParam(pn="1") - - def lastPage(self): - """letzte Seite""" + return self.display() + + def dl_VMirror(self): + """mirror action""" + modes = self.REQUEST.SESSION['dlModes'] + if 'vmir' in modes: + modes.remove('vmir') + else: + modes.append('vmir') - - def nextPage(self,pn=None): - """next page""" - ret="" - - try: - pn=str(int(pn)+1) - except: - pn=str(2) + return self.display() + + def dl_WholePage(self): + """zoom out action""" + self.setDLParam('ww', 1) + self.setDLParam('wh', 1) + self.setDLParam('wx', 0) + self.setDLParam('wy', 0) + return self.display() + + def dl_PrevPage(self): + """next page action""" + pn = self.getPN() - 1 + if pn < 1: + pn = 1 + self.setDLParam('pn', pn) + # unmark + self.setDLParam('mk', None) + return self.display() + + def dl_NextPage(self): + """next page action""" + pn = self.getPN() + 1 + pt = self.getPT() + if pn > pt: + pn = pt + self.setDLParam('pn', pn) + # unmark + self.setDLParam('mk', None) + return self.display() + + def dl_FirstPage(self): + """first page action""" + self.setDLParam('pn', 1) + # unmark + self.setDLParam('mk', None) + return self.display() + + def dl_LastPage(self): + """last page action""" + self.setDLParam('pn', self.getPT()) + # unmark + self.setDLParam('mk', None) + return self.display() + + def dl_Unmark(self): + """action to remove last mark""" + mk = self.getDLParam('mk') + if mk: + marks = mk.split(',') + marks.pop() + mk = string.join(marks, ',') + self.setDLParam('mk', mk) + return self.display() - self.REQUEST.form['pn']=pn - - for param in self.REQUEST.form.keys(): - ret+=param+"="+str(self.REQUEST.form[param])+"&" - - self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret) - def generateDivs(self): - """generate divs""" - pt=PageTemplateFile('Products/zogiLib/zpt/zogilib_divs').__of__(self) + + def changeZogiLibForm(self): + """Main configuration""" + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/changeZogiLibForm.zpt')).__of__(self) return pt() + + def changeZogiLib(self,title,digilibBaseUrl, localFileBase, version, RESPONSE=None): + """change it""" + self.title=title + self.digilibBaseUrl=digilibBaseUrl + self.localFileBase=localFileBase + self.layout=version + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') - #divFileName=os.path.join(package_home(globals()),'zpt/zogilib_divs.zpt') - #return open(divFileName).read() def manage_addZogiLibForm(self): """interface for adding zogilib""" - pt=PageTemplateFile('Products/zogiLib/zpt/addZogiLibForm').__of__(self) + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/addZogiLibForm')).__of__(self) return pt() def manage_addZogiLib(self,id,title,digilibBaseUrl, localFileBase,version="book",RESPONSE=None):