File:  [Repository] / documentViewer / documentViewer.py
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Sun Dec 18 12:35:02 2005 UTC (18 years, 6 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
fist

    1: 
    2: genericDigilib="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/"
    3: 
    4: from OFS.Folder import Folder
    5: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
    6: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    7: from AccessControl import ClassSecurityInfo
    8: from Globals import package_home
    9: 
   10: from Ft.Xml.Domlette import NonvalidatingReader
   11: from Ft.Xml.Domlette import PrettyPrint, Print
   12: from Ft.Xml import EMPTY_NAMESPACE
   13: 
   14: import Ft.Xml.XPath
   15: 
   16: import os.path
   17: import cgi
   18: import urllib
   19: 
   20: def getTextFromNode(nodename):
   21:     nodelist=nodename.childNodes
   22:     rc = ""
   23:     for node in nodelist:
   24:         if node.nodeType == node.TEXT_NODE:
   25:            rc = rc + node.data
   26:     return rc
   27: 
   28: import socket
   29: 
   30: def urlopen(url):
   31:         """urlopen mit timeout"""
   32:         socket.setdefaulttimeout(2)
   33:         ret=urllib.urlopen(url)
   34:         socket.setdefaulttimeout(5)
   35:         return ret
   36:     
   37: def getParamFromDigilib(path,param):
   38:     """gibt param von dlInfo aus"""
   39:     imageUrl=genericDigilib+"/dlInfo-xml.jsp?fn="+path
   40: 
   41:     try:
   42:         dom = NonvalidatingReader.parseUri(imageUrl)
   43:     except:
   44:         return None
   45:     
   46:     
   47:     params=dom.xpath("//document-parameters/parameter[@name='%s']/@value"%param)
   48:     
   49:     if params:
   50:         return params[0].value
   51:     
   52: def parseUrlTextTool(url):
   53:    """parse index meta"""
   54:     
   55:    try:
   56:        dom = NonvalidatingReader.parseUri(url)
   57:    except:
   58:        zLOG.LOG("documentViewer (parseUrlTexttool)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
   59:        return (None,None,None)
   60:    
   61:    archivePaths=dom.xpath("//resource/archive-path")
   62:    
   63:    if archivePaths and (len(archivePaths)>0):
   64:        archivePath=getTextFromNode(archivePaths[0])
   65:    else:
   66:        archivePath=None
   67:    
   68:     
   69:    images=dom.xpath("//texttool/image")
   70:    
   71:    if images and (len(images)>0):
   72:        image=getTextFromNode(images[0])
   73:    else:
   74:        image=None
   75:        
   76:    if image and archivePath:
   77:        image=os.path.join(archivePath,image)
   78:        image=image.replace("/mpiwg/online",'')
   79:        pt=getParamFromDigilib(image,'pt')
   80: 
   81:    else:
   82:        image=None
   83:        
   84:    viewerUrls=dom.xpath("//texttool/digiliburlprefix")
   85:    
   86:    if viewerUrls and (len(viewerUrls)>0):
   87:        viewerUrl=getTextFromNode(viewerUrls[0])
   88:    else:
   89:        viewerUrl=None
   90:    
   91:    
   92:    textUrls=dom.xpath("//texttool/text")
   93:    
   94:    if textUrls and (len(textUrls)>0):
   95:        textUrl=getTextFromNode(textUrls[0])
   96:    else:
   97:        textUrl=None
   98:    return viewerUrl,(image,pt),textUrl
   99: 
  100: 
  101: class documentViewer(ZopePageTemplate):
  102:     """document viewer"""
  103: 
  104:     meta_type="Document viewer"
  105:     
  106:     security=ClassSecurityInfo()
  107:     manage_options=ZopePageTemplate.manage_options+(
  108:         {'label':'main config','action':'changeDocumentViewerForm'},
  109:         )
  110: 
  111:     _default_content_fn = os.path.join(package_home(globals()),'zpt','documentViewer_template.zpt')
  112:     
  113:     def __init__(self,id,imageViewerUrl,title=""):
  114:         """init document viewer"""
  115:         self.id=id
  116:         self.title=title
  117:         self.imageViewerUrl=imageViewerUrl
  118:         
  119:     security.declareProtected('View management screens','changeDocumentViewerForm')    
  120:     def changeDocumentViewerForm(self):
  121:         """change it"""
  122:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeDocumentViewer.zpt')).__of__(self)
  123:         return pt()
  124:   
  125:   
  126:     def changeDocumentViewer(self,imageViewerUrl,title="",RESPONSE=None):
  127:         """init document viewer"""
  128:         self.title=title
  129:         self.imageViewerUrl=imageViewerUrl
  130:         
  131:         if RESPONSE is not None:
  132:             RESPONSE.redirect('manage_main')
  133:     
  134:     
  135:     def imageLink(self,nr):
  136:         """link hinter den images"""
  137:         paramsTmp=cgi.parse_qs(self.REQUEST['QUERY_STRING'])
  138:         params={}
  139:         for x in paramsTmp.iteritems():
  140:                 params[x[0]]=x[1][0]
  141:     
  142:         params['pn']=nr
  143:         newUrl=self.REQUEST['URL']+"?"+urllib.urlencode(params)
  144:         return newUrl
  145:         
  146:         
  147:     def thumbruler(self,cols,rows,start,maximum):
  148:         """ruler for thumbs"""
  149:         ret=""
  150:         paramsTmp=cgi.parse_qs(self.REQUEST['QUERY_STRING'])
  151:         params={}
  152:         for x in paramsTmp.iteritems():
  153: 
  154:             if not x[0]=="start":
  155:                 params[x[0]]=x[1][0]
  156: 
  157:         newUrlSelect=self.REQUEST['URL']+"?"+urllib.urlencode(params)    
  158:         if start>0:
  159:             newStart=max(start-cols*rows,0)
  160:             params['start']=newStart
  161:             newUrl=self.REQUEST['URL']+"?"+urllib.urlencode(params)
  162:             ret+="""<a href="%s">prev</a>"""%newUrl
  163: 
  164: 
  165:         ret+="""<select onChange="location.href='%s&start='+this.options[this.selectedIndex].value" """%newUrlSelect
  166:         nr,rest=divmod(maximum,cols*rows)
  167:         if rest > 0:
  168:             nr+=1
  169:         for i in range(nr):
  170:             nr=i*cols*rows
  171:            
  172:             if (start >= nr) and (start < nr+cols*rows):  
  173:                 ret+="""<option value="%s" selected>%s</option>"""%(nr,nr)
  174:             else:
  175:                 ret+="""<option value="%s">%s</option>"""%(nr,nr)
  176:         ret+="</select>"
  177:         
  178:         if start<maximum:
  179:             newStart=min(start+cols*rows,maximum)
  180:             params['start']=newStart
  181:             newUrl=self.REQUEST['URL']+"?"+urllib.urlencode(params)
  182:             ret+="""<a href="%s">next</a>"""%newUrl
  183:         
  184:         return ret
  185:         
  186:     def textToolThumb(self,url,start=0):
  187:         """understands the texttool format
  188:         @param url: url to index.meta with texttool tag
  189:         """
  190:         (viewerUrl,imagepath,textpath)=parseUrlTextTool(url)
  191:         
  192:         imageUrl=genericDigilib+"/servlet/Scaler?fn=%s"%imagepath[0]
  193:         
  194:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbs.zpt')).__of__(self)
  195:         return pt(imageUrl=imageUrl,pt=imagepath[1],start=start)
  196:     
  197:     def text(self,mode,url,pn):
  198:         """give text"""
  199:         if mode=="texttool": #index.meta with texttool information
  200:             (viewerUrl,imagepath,textpath)=parseUrlTextTool(url)
  201:         
  202:         print textpath
  203:         try:
  204:             dom = NonvalidatingReader.parseUri(textpath)
  205:         except:
  206:             return None
  207:     
  208:         list=[]
  209:         nodes=dom.xpath("//pb")
  210: 
  211:         node=nodes[int(pn)-1]
  212:         
  213:         p=node
  214:         
  215:         while p.tagName!="p":
  216:             p=p.parentNode
  217:         
  218:         
  219:         endNode=nodes[int(pn)]
  220:         
  221:         
  222:         e=endNode
  223:         
  224:         while e.tagName!="p":
  225:             e=e.parentNode
  226:         
  227:         
  228:         next=node.parentNode
  229:         
  230:         #sammle s
  231:         while next and (next!=endNode.parentNode):
  232:             list.append(next)    
  233:             next=next.nextSibling    
  234:         list.append(endNode.parentNode)
  235:         
  236:         if p==e:# beide im selben paragraphen
  237:         
  238:     else:
  239:             next=p
  240:             while next!=e:
  241:                 print next,e
  242:                 list.append(next)
  243:                 next=next.nextSibling
  244:             
  245:         for x in list:
  246:             PrettyPrint(x)
  247: 
  248:         return list
  249:     
  250:     def image(self,mode,url,pn):
  251:         """give image out"""
  252:         if mode=="texttool": #index.meta with texttool information
  253:             (viewerUrl,imagepath,textpath)=parseUrlTextTool(url)
  254:             url=viewerUrl+"pn=%s&fn=%s"%(pn,imagepath[0])
  255:             ret="""<iframe height="100%%" width="100%%" src="%s"/>"""%url
  256:             return url
  257:         
  258:     def thumbs(self,mode,url,start):
  259:         """give thumbs out"""
  260:         if mode=="texttool": #index.meta with texttool information
  261:             return self.textToolThumb(url,int(start))
  262:         
  263:     security.declareProtected('View','index_html')
  264:     
  265:     
  266:     def index_html(self,mode,url,start=0,pn=0):
  267:         '''
  268:         view it
  269:         @param mode: defines which type of document is behind url
  270:         @param url: url which contains display information
  271:         '''
  272:         
  273:     
  274:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','documentViewer_template.zpt')).__of__(self)
  275:         return pt(mode=mode,url=url,start=start,pn=pn)
  276:         
  277:         
  278:         
  279: #    security.declareProtected('View management screens','renameImageForm')
  280: 
  281: def manage_AddDocumentViewerForm(self):
  282:     """add the viewer form"""
  283:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addDocumentViewer.zpt')).__of__(self)
  284:     return pt()
  285:   
  286: def manage_AddDocumentViewer(self,id,imageViewerUrl="",title="",RESPONSE=None):
  287:     """add the viewer"""
  288:     newObj=documentViewer(id,imageViewerUrl,title)
  289:     self._setObject(id,newObj)
  290:     
  291:     if RESPONSE is not None:
  292:         RESPONSE.redirect('manage_main')
  293:     

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