1: import re
2: import string
3: import socket
4: import urllib
5: import string
6: import xml.dom.minidom
7: from types import *
8: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
9: from OFS.SimpleItem import SimpleItem
10: from Globals import package_home
11: import Globals
12: from AccessControl import ClassSecurityInfo
13: import os.path
14:
15: displayTypes = ['ZSQLExtendFolder','ZSQLBibliography','ECHO_group','ECHO_collection','ECHO_resource','ECHO_link','ECHO_sqlElement','ECHO_pageTemplate','ECHO_externalLink','ImageCollectionIFrame','VLP_resource','VLP_essay','ECHO_ZCatalogElement','ImageCollection','versionedFileFolder']
16:
17: def content_html(self,type):
18: """template fuer content"""
19: #templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"])
20: #
21: #if templates:
22: # return templates[0][1]()
23:
24: if hasattr(self,type+"_template"):
25: obj=getattr(self,type+"_template")
26: return obj()
27: else:
28: pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_%s_template_standard.zpt'%type).__of__(self)
29: pt.content_type="text/html"
30: return pt()
31:
32:
33:
34: class ECHO_basis:
35: """basis eigenschaften fuer echo objekte"""
36: def showRDF(self):
37: """showrdf"""
38: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
39: ret="""<?xml version="1.0" encoding="utf-8"?>\n<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ECHONAVIGATION="http://www.echo.eu/rdf#">\n"""
40: ret+=self.getRDF(urn="echo:colllectionroot")+"\n"
41:
42: ret+="""</RDF:RDF>"""
43: return ret
44:
45:
46:
47: def createSubElementRDF(self,urn=None):
48: """rdf list"""
49: if not urn:
50: urn=self.absolute_url()
51: ret=""
52:
53: rettemp="""<RDF:Seq RDF:about="%s">\n"""%urn
54: flag=0
55:
56: li="""<RDF:li RDF:resource="%s" />\n"""
57: if not ('<error>' in self.getFullTextXML(noredirect='Yes')):
58: nurn=self.absolute_url()+'/getFullTextXML'
59: rettemp+=li%nurn
60: flag=1
61: if not ('<error>' in self.getImageView(noredirect='Yes')):
62: nurn=self.absolute_url()+'/getImageView'
63: rettemp+=li%nurn
64: flag=1
65:
66:
67: if not ('<error>' in self.showMetaDataXML()):
68: nurn=self.absolute_url()+'/showMetaDataXML'
69: rettemp+=li%nurn
70: flag=1
71:
72: rettemp+="</RDF:Seq>"
73:
74: if flag==1:
75: ret+=rettemp
76:
77: if not ('<error>' in self.getFullTextXML(noredirect='Yes')):
78: nurn=self.absolute_url()+'/getFullTextXML'
79: ret+=getRDFDescription(self,self.absolute_url()+'/getFullTextXML',urn=nurn,nameDef="Fulltext",typeName="ECHO_fulltext")
80:
81: if not ('<error>' in self.getImageView(noredirect='Yes')):
82: nurn=self.absolute_url()+'/getImageView'
83: ret+=getRDFDescription(self,self.absolute_url()+'/getImageView',urn=nurn,nameDef="Image View",typeName="ECHO_imageview")
84:
85: if not ('<error>' in self.showMetaDataXML()):
86: nurn=self.absolute_url()+'/showMetaDataXML'
87: ret+=getRDFDescription(self,self.absolute_url()+'/showMetaDataXML',urn=nurn,nameDef="Metadata",typeName="ECHO_metaData")
88:
89: return ret
90:
91: def content_html(self,type="collection"):
92: """template fuer content bei einbau und ECHO_Umgebung"""
93:
94: return content_html(self,type)
95:
96: def getTitle(self):
97: """title"""
98: try:
99: return self.title.encode('utf-8','ignore')
100: except:
101: self.title=self.title.decode('iso-8859-1','ignore')[0:] #correnct conding error
102: return self.title.encode('utf-8','ignore')
103:
104: def getLabel(self):
105: """title"""
106: try:
107: return self.label.encode('utf-8','ignore')
108: except:
109: self.label=self.label.decode('iso-8859-1','ignore')[0:] #correnct conding error
110: return self.label.encode('utf-8','ignore')
111:
112:
113: def changeECHOEntriesForm(self):
114: """change Entries for the ECHO Navigation environment"""
115: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHOEntriesForm')).__of__(self)
116: return pt()
117:
118: def changeECHOEntries(self,label,weight,description,queryString,RESPONSE=None):
119: """change Entries for the ECHO Navigation environment
120: @param label: label fuer die Navigation"""
121: self.label=label
122: self.weight=weight
123: self.description=description
124: self.queryString=queryString
125:
126: if RESPONSE:
127: RESPONSE.redirect("manage_main")
128:
129: manage_options=({'label':'change ECHO Navigation Entries','action':'changeECHOEntriesForm'},)
130:
131:
132: def hasOverview(self):
133: """returns if there is an overview graphics"""
134: return hasattr(self, 'overview')
135:
136: def hasParentOverview(self):
137: """returns if the parent has an overview graphics"""
138: return hasattr(self.aq_parent, 'overview')
139:
140: def getOverview(self):
141: """map overview graphics"""
142: #return self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['overview'])[0][1]
143: if self.hasOverview():
144: return getattr(self, 'overview')
145: return None
146:
147: def getMapAreas(self):
148: """returns the list of MapAreas"""
149: # get all contained MapAreas
150: areas = [res[1] for res in self.ZopeFind(self, obj_metatypes=('MapArea'))]
151: return areas
152:
153: def addMapArea(self, newarea):
154: """add a map area to this object"""
155: if (newarea.id is None):
156: # create new id
157: areas = self.getMapAreas()
158: newarea.id = "a%02d"%len(areas)
159: self._setObject(newarea.id, newarea)
160:
161: def ECHO_graphicEntry(self):
162: """change map coordinates"""
163: if self.hasParentOverview():
164: pt=zptFile(self, 'zpt/ECHO_draw.zpt')
165: return pt()
166: else:
167: return "NO OVERVIEW GRAPHICS"
168:
169: def ECHO_addCoords(self,RESPONSE=None):
170: """change or add MapArea"""
171: #return self.REQUEST
172: # change existing areas
173: for area in self.getMapAreas():
174: id = area.getId()
175: if self.REQUEST.has_key('del.'+id):
176: # delete this area
177: self._delObject(id)
178: # return to same menu
179: if RESPONSE is not None:
180: RESPONSE.redirect('ECHO_graphicEntry')
181: return
182: # modify this area
183: coordstring = self.REQUEST.get('coords.'+id, '')
184: coords = string.split(coordstring, ',')
185: angle = self.REQUEST.get('angle.'+id, '0')
186: type = self.REQUEST.get('type.'+id, 'area')
187: if len(coords) == 4:
188: area.setCoordString(coordstring)
189: area.setAngle(angle)
190: area.setType(type)
191: # add new area
192: if self.REQUEST.has_key('add'):
193: coordstring = self.REQUEST.get('coords.new', '')
194: coords = string.split(coordstring, ',')
195: angle = self.REQUEST.get('angle.new', '0')
196: type = self.REQUEST.get('type.new', 'area')
197: if len(coords) == 4:
198: coords.append(angle)
199: area = MapArea(None, coords, type=type)
200: self.addMapArea(area)
201: # return to edit area menu
202: if RESPONSE is not None:
203: RESPONSE.redirect('ECHO_graphicEntry')
204:
205: def createJSAreas(self, areas):
206: """create area calls for JavaScript"""
207: dynamical="\n"
208: for ob in areas:
209: if ob.isTypeArrow():
210: dynamical+="""addArea('%s', 'overview', %s, 'arrow');\n"""%(ob.getFullId(),ob.getCoordString())
211: else:
212: dynamical+="""addArea('%s', 'overview', %s, 'area');\n"""%(ob.getFullId(),ob.getCoordString())
213: return dynamical
214:
215: def createMapHead(self):
216: """create javascript include and script tags for head"""
217: pt=zptFile(self, 'zpt/ECHO_content_map_frag_js')
218: return pt()
219:
220: def createMapImg(self):
221: """generate img-tag for map"""
222: bt = BrowserCheck(self)
223: tag = ""
224: #src = self.REQUEST['URL1'] + "/overview"
225: src = self.getOverview().absolute_url()
226: if bt.isN4:
227: tag += '<ilayer id="overview" visibility="show"><img src="%s"></ilayer>'%src
228: else:
229: tag += '<img id="overview" src="%s" />'%src
230: return tag
231:
232: def createParentMapImg(self):
233: """generate img-tag for map of parent"""
234: return self.aq_parent.createMapImg()
235:
236: def createMapLink(self, ob, text=None):
237: """generate map link"""
238: bt = BrowserCheck(self)
239: id = ob.getFullId()
240: link = ob.getLinkId()
241: if text is None:
242: text = ob.getLabel()
243: if text is None:
244: text = "link"
245: tag = ""
246: if bt.isN4:
247: tag += '<ilayer id="a.%s"><a onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank"'%(id,id,id,link)
248: tag += ">" + text + "</a></ilayer>"
249: else:
250: tag = '<a id="a.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank"'%(id,id,id,link)
251: if ob.text:
252: tag += ' title="%s"'%ob.text
253: tag += ">" + text + "</a>"
254: return tag
255:
256: def createMapAux(self, ob, arrowsrc="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?dw=15&fn=icons/pfeil"):
257: """generate map link image, text and other stuff"""
258: bt = BrowserCheck(self)
259: id = ob.getFullId()
260: link = ob.getLinkId()
261: tiptext = ob.getText()
262: tag = ""
263:
264: if bt.isN4:
265: tag += '<layer id="i.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)">'%(id,id,id)
266: if ob.isTypeArrow():
267: rot = ob.angle
268: tag += '<a href="%s"><img border="0" src="%s&rot=%s" /></a>'%(link,arrowsrc,rot)
269: else:
270: tag += '<a href="%s"><img border="0" width="1000" height="1000" src="trans_img"'%(link)
271: if tiptext:
272: tag += ' alt="%s"'%tiptext
273: tag += ' /></a>'
274: tag += '</layer>'
275: else:
276: tag = '<a id="b.%s" onmouseover="highlightPair(\'%s\', true)" onmouseout="highlightPair(\'%s\', false)" href="%s" target="_blank">'%(id,id,id,link)
277: if ob.isTypeArrow():
278: rot = ob.angle
279: if bt.isIEWin and bt.versIE > 5:
280: tag += '<span id="i.%s" style="position:absolute; top:-100px; left:-100px; border-style:none; border-width=1px; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'%s&rot=%s\');"><img style="visibility:hidden" src="%s&rot=%s" /></span>'%(id,arrowsrc,rot,arrowsrc,rot)
281: else:
282: tag += '<img id="i.%s" src="%s&rot=%s" border="1" style="position:absolute; top:-100px; left:-100px; border-style:none;" />'%(id,arrowsrc,rot)
283: else:
284: if bt.isIEWin:
285: tag += '<div id="i.%s" style="position:absolute; top:-100px; left:-100px;background:url(area_img)"'%(id)
286: else:
287: tag += '<div id="i.%s" style="position:absolute; top:-100px; left:-100px;"'%(id)
288: if tiptext:
289: tag += ' title="%s"'%tiptext
290: tag += '> </div>'
291: tag += '</a>'
292: return tag
293:
294:
295: #ende der echo erweiterungen
296:
297:
298: def toList(field):
299: """Einzelfeld in Liste umwandeln"""
300: if type(field)==StringType:
301: return [field]
302: else:
303: return field
304:
305: def getText(nodelist):
306:
307: rc = ""
308: for node in nodelist:
309: if node.nodeType == node.TEXT_NODE:
310: rc = rc + node.data
311: return rc
312:
313: def getTextFromNode(nodename):
314: nodelist=nodename.childNodes
315: rc = ""
316: for node in nodelist:
317: if node.nodeType == node.TEXT_NODE:
318: rc = rc + node.data
319: return rc
320:
321:
322: def readFieldFromXML(meta_url,parent,field):
323: """lesespezifisches metadatum"""
324:
325: try:
326: dom=xml.dom.minidom.parse(meta_url)
327:
328: except:
329: try:
330: fh=urllib.urlopen(meta_url)
331: dom=xml.dom.minidom.parse(fh)
332: except:
333: return None
334: if not dom: return None
335:
336: parent=dom.getElementsByTagName(parent)
337: if not parent: return None
338:
339: field=parent[0].getElementsByTagName(field)
340:
341: if not field: return None
342:
343: return getText(field[0].childNodes)
344:
345:
346:
347: def urlopen(url):
348: """urlopen mit timeout"""
349: socket.setdefaulttimeout(2)
350: ret=urllib.urlopen(url)
351: socket.setdefaulttimeout(5)
352: return ret
353: # urlopener = urllib.URLopener()
354: #
355: # try:
356: # con = urlopener.open(url)
357: # return con
358: # except timeoutsocket.Timeout:
359: # return None
360:
361:
362:
363:
364:
365: def checkOnlyOneInGroup(object):
366: """check if object is a group and if it containt only one element it return this element"""
367: displayedObjects=object.ZopeFind(object,obj_metatypes=displayTypes)
368: if len(displayedObjects)==1: # nur ein Object dann redirect auf dieses Object
369:
370: return displayedObjects[0][1]
371: else: return object
372:
373: def getSubCols(self,sortfield="weight",subColTypes= displayTypes,sortFieldMD=None):
374:
375: def sortfnc(sortfield,x,y):
376: xa=x[1].getMDValue(sortfield)
377: ya=y[1].getMDValue(sortfield)
378: print xa,ya
379: return cmp(xa,ya)
380:
381: sortWithMD = lambda sortfield : (lambda x,y : sortfnc(sortfield,x,y))
382: ids=[]
383: displayedObjects=self.ZopeFind(self,obj_metatypes=subColTypes)
384:
385:
386: for entry in displayedObjects:
387:
388: object=entry[1]
389: ids.append(object)
390:
391: try:
392: sortfield=self.sortfield
393: except:
394: """nothing"""
395:
396: tmplist=[]
397: for x in ids:
398: if hasattr(x,sortfield):
399: try:
400:
401: x=int(x)
402: except:
403: """nothing"""
404: tmp=getattr(x,sortfield)
405: else:
406: tmp=10000000
407: tmplist.append((tmp,x))
408:
409: if not sortFieldMD:
410: tmplist.sort()
411: else:
412: tmplist.sort(sortWithMD(sortFieldMD))
413:
414: return [x for (key,x) in tmplist]
415:
416: def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']):
417: """Rerender all Links"""
418: ret=""
419:
420: if not obj:
421: obj = self
422:
423: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource'],search_sub=1)
424:
425: for entry in entries:
426: if entry[1].meta_type == 'ECHO_resource':
427: try:
428: entry[1].ECHO_getResourceMD(template="no")
429: if "title" in types:
430: entry[1].generate_title()
431: if "label" in types:
432: entry[1].generate_label()
433: ret+="OK:"+entry[0]+"-- "+entry[1].getTitle().decode('utf-8')+"-- "+entry[1].getTitle().decode('utf-8')+"<br>"
434: except:
435: ret+="Error:"+entry[0]+"<br>"
436:
437:
438:
439:
440: return "<html><body>"+ret+"Rerenderd all links to resources in: "+self.title+"</html></body>"
441:
442: def reloadMetaDataFromStorage(self,RESPONSE=None):
443: """copy metadata from the storage to ECHO"""
444: ret=""
445: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
446:
447: for resource in resources:
448: x=str(resource[1].copyIndex_meta2echo_resource())+"<br>"
449: ret+=x
450: #print x
451:
452:
453: if RESPONSE is not None:
454: #RESPONSE.redirect('./manage_main')
455: return "<html><body>"+ret+"</html></body>"
456:
457: return ret
458:
459: def getRDFDescription(self,linkURL,urn=None,nameDef=None,typeName=None):
460: """rdf"""
461:
462: ret=""
463: about="""<RDF:Description RDF:about="%s">"""
464: name="""<ECHONAVIGATION:name>%s</ECHONAVIGATION:name>"""
465: link="""<ECHONAVIGATION:link xlink:href="%s">%s</ECHONAVIGATION:link>"""
466: clickable="""<ECHONAVIGATION:linkClickable>%s</ECHONAVIGATION:linkClickable>"""
467: #link="""<ECHONAVIGATION:link RDF:about="%s"/>"""
468: type="""<ECHONAVIGATION:type>%s</ECHONAVIGATION:type>"""
469: #xlink="""<ECHONAVIGATION:xlink xlink:href="%s"/>"""
470: if not urn:
471: #urn="urn:"+re.sub('/',':',self.absolute_url())
472: urn=self.absolute_url()
473: about2=about%urn
474: if not nameDef:
475: if hasattr(self,'label') and not (self.label==""):
476: name2=name%self.label
477: elif not self.title=="":
478: name2=name%self.title
479: else:
480: name2=name%self.getId()
481:
482: name2=re.sub('&','&',name2)
483: else:
484: name2=name%nameDef
485:
486: linkURL=re.sub('http:','',linkURL)
487: linkURL2=re.sub('&','&',linkURL)
488: link2=link%(("http:"+linkURL2),("http:"+urllib.quote(linkURL)))
489: clickable2=clickable%"true"
490:
491: if not typeName:
492: type2=type%self.meta_type
493: else:
494: type2=type%typeName
495:
496: #ret=about2+"\n"+name2+"\n"+link2+"\n"+type2+"\n"+clickable2+"\n</RDF:Description>"
497: ret=about2+"\n"+name2+"\n"+type2+"\n"+clickable2+"\n</RDF:Description>"
498: return ret
499:
500: def getCopyrightsFromForm(self,argv):
501: medias={}
502: partners={}
503: copyrights={}
504:
505: copyrightsFinal=[]
506: for arg in argv.keys():
507:
508: if arg[0:5]=='media':
509: nm=int(arg[5:])
510: medias[nm]=argv[arg]
511: elif arg[0:5]=='partn':
512: nm=int(arg[5:])
513: partners[nm]=argv[arg]
514: elif arg[0:5]=='copyr':
515: nm=int(arg[5:])
516: copyrights[nm]=argv[arg]
517:
518:
519:
520: copyrightsList=[(medias[nm],partners[nm],copyrights[nm]) for nm in medias.keys()]
521: for copyright in copyrightsList:
522:
523: if copyright[2]=='institution0000':
524: copyrightsFinal.append((copyright[0],copyright[1],self.getPartnerCopyright(copyright[1],'')))
525: else:
526: if not copyright[0]=='':
527: copyrightsFinal.append(copyright)
528:
529:
530: return copyrightsFinal
531:
532: #List of different types for the graphical linking viewer
533: viewClassificationListMaster=['view point','area']
534:
535:
536: def checkDiffs(self,metadict):
537: """check differences"""
538:
539:
540:
541:
542: def NoneToEmpty(obj):
543: if obj:
544: return obj
545: else:
546: return ""
547:
548:
549:
550: diffs={}
551:
552: tags=self.findTagsFromMapping(self.contentType)
553: self.referencetypes=tags[2]
554: self.fields=tags[3]
555:
556:
557: for field in tags[1]:
558: try:
559: if (NoneToEmpty(self.getFieldValue(self.getFieldTag(tags,field)))==metadict[self.getFieldTag(tags,field)]):
560: diffs[self.getFieldTag(tags,field)]=1
561: else:
562:
563: diffs[self.getFieldTag(tags,field)]=0
564: except:
565: diffs[self.getFieldTag(tags,field)]=0
566:
567: return diffs
568:
569:
570: def zptFile(self, path):
571: """returns a page template file from the product"""
572: pt=PageTemplateFile(os.path.join(package_home(globals()), path)).__of__(self)
573: return pt
574:
575:
576: def sendFile(self, filename, type):
577: """sends an object or a local file (in the product) as response"""
578: paths = filename.split('/')
579: object = self
580: # look for an object called filename
581: for path in paths:
582: if hasattr(object, path):
583: object = getattr(object, path)
584: else:
585: object = None
586: break
587: if object:
588: # if the object exists then send it
589: return object.index_html(self.REQUEST.REQUEST, self.REQUEST.RESPONSE)
590: else:
591: # send a local file with the given content-type
592: fn = os.path.join(package_home(globals()), filename)
593: self.REQUEST.RESPONSE.setHeader("Content-Type", type)
594: self.REQUEST.RESPONSE.write(file(fn).read())
595: return
596:
597:
598: class BrowserCheck:
599: """check the browsers request to find out the browser type"""
600:
601: def __init__(self, zope):
602: """initialisiere"""
603: self.ua = zope.REQUEST.get_header("HTTP_USER_AGENT")
604: self.isN4 = False
605: self.isIE = False
606: if string.find(self.ua, 'MSIE') > -1:
607: self.isIE = True
608: else:
609: self.isN4 = string.find(self.ua, 'Mozilla/4.') > -1
610: try:
611: self.nav = self.ua[string.find(self.ua, '('):]
612: ie = string.split(self.nav, "; ")[1]
613: if string.find(ie, "MSIE") > -1:
614: self.versIE = string.split(ie, " ")[1]
615: except: pass
616: self.isMac = string.find(self.ua, 'Macintosh') > -1
617: self.isWin = string.find(self.ua, 'Windows') > -1
618: self.isIEWin = self.isIE and self.isWin
619: self.isIEMac = self.isIE and self.isMac
620:
621:
622: def writeMetadata(url,metadict,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,xmlfrag=None,digiliburlprefix=None):
623: """Einlesen der Metadaten und und erstellen des geaenderten XML file"""
624:
625: def updateTextToolNode(tag,value):
626: #print dom,tag,value
627: metanode=dom.getElementsByTagName('texttool')[0]
628: try:
629: nodeOld=metanode.getElementsByTagName(tag)
630: except:
631: nodeOld=None
632:
633: if nodeOld:
634: metanode.removeChild(nodeOld[0]).unlink()
635:
636: node=dom.createElement(tag)
637: nodetext=dom.createTextNode(value)
638: node.appendChild(nodetext)
639: metanode.appendChild(node)
640:
641: if xmlfrag:
642: geturl="""<?xml version="1.0" ?>
643: <resource type="MPIWG">
644: <meta>
645: <bib type="Book">
646: </bib>
647: </meta>
648: </resource>"""
649: dom=xml.dom.minidom.parseString(geturl)
650: else:
651: try:
652: geturl=""
653: for line in urlopen(url).readlines():
654: geturl=geturl+line
655:
656:
657: except:
658: return (None,"XCannot open: "+url)
659:
660: try:
661: dom=xml.dom.minidom.parseString(geturl)
662: except:
663: return (None,"Cannot parse: "+url+"<br>"+geturl)
664:
665:
666:
667: metanodes=dom.getElementsByTagName('bib')
668:
669: if not metanodes:
670: metanodes=dom.getElementsByTagName('archimedes')
671:
672: metanode=metanodes[0]
673:
674: for metaData in metadict.keys():
675:
676: try:
677: nodeOld=metanode.getElementsByTagName(metaData)
678: except:
679: nodeOld=None
680:
681: if nodeOld:
682: metanode.removeChild(nodeOld[0]).unlink()
683: else:
684: # try also old writing rule - instead of _:
685: try:
686: nodeOld=metanode.getElementsByTagName(re.sub('_','-',metaData))
687: except:
688: nodeOld=None
689:
690: if nodeOld:
691: metanode.removeChild(nodeOld[0]).unlink()
692:
693: metanodeneu=dom.createElement(metaData)
694: metanodetext=dom.createTextNode(metadict[metaData])
695: #try:
696: #metanodetext=dom.createTextNode(unicode(metadict[metaData],"utf-8"))
697: #except:
698: #metanodetext=dom.createTextNode(metadict[metaData].encode('utf-8'))
699: metanodeneu.appendChild(metanodetext)
700: metanode.appendChild(metanodeneu)
701:
702:
703:
704:
705:
706: if project:
707: updateTextToolNode('project',project)
708:
709: if startpage:
710: updateTextToolNode('startpage',startpage)
711:
712: if topbar:
713: updateTextToolNode('toptemplate',topbar)
714:
715: if thumbtemplate:
716: updateTextToolNode('thumbtemplate',thumbtemplate)
717:
718: if xslt:
719: updateTextToolNode('xslt',xslt)
720:
721:
722: if digiliburlprefix:
723: updateTextToolNode('digiliburlprefix',digiliburlprefix)
724:
725: try:
726: return dom.toxml().encode('utf-8')
727: except:
728: return dom.toxml('utf-8')
729:
730:
731:
732: def readMetadata(url):
733: """Methode zum Auslesen der Metadateninformation zu einer Resource
734: Vorerst noch Typ bib"""
735:
736: metadict={}
737:
738: try:
739: geturl=""
740: for line in urlopen(url).readlines():
741: geturl=geturl+line
742:
743:
744: except:
745: return (None,"Cannot open: "+url)
746:
747: try:
748: dom=xml.dom.minidom.parseString(geturl)
749: except:
750: return (None,"Cannot parse: "+url+"<br>"+geturl)
751:
752: metanode=dom.getElementsByTagName('bib')
753: metadict['bib_type']='Book'
754: if len(metanode)==0:
755: metanode=dom.getElementsByTagName('archimedes')
756: metadict['bib_type']='Archimedes'
757:
758:
759: if not len(metanode)==0:
760: metacontent=metanode[0].childNodes
761:
762: try:
763: metadict['bib_type']=getText(dom.getElementsByTagName('bib')[0].attributes['type'].childNodes)
764: except:
765: """nothing"""
766:
767: for node in metacontent:
768: try:
769: #print urllib.unquote(getText(node.childNodes)),getText(node.childNodes)
770: metadict[re.sub('-','_',node.tagName.lower())]=urllib.unquote(getText(node.childNodes))
771: except:
772: """nothing"""
773:
774:
775: return metadict,""
776:
777:
778: class MapArea(SimpleItem):
779: """simple class to hold coordinates"""
780:
781: meta_type = 'MapArea'
782: # Create a SecurityInfo for this class.
783: security = ClassSecurityInfo()
784: security.setDefaultAccess("allow")
785: # type constants
786: TYPE_AREA = 'area'
787: TYPE_ARROW = 'arrow'
788:
789: def __init__(self, id, coords, label=None, type=None, text=None):
790: """init"""
791: self.coords = coords[0:4]
792: if len(coords) > 4:
793: self.angle = coords[4]
794: else:
795: self.angle = 0
796: self.id = id
797: self.label = label
798: self.setType(type)
799: self.text = text
800:
801: def setCoords(self, coords):
802: """sets the coords"""
803: self.coords = coords
804:
805: def getCoordString(self):
806: """returns coordinates as a string"""
807: return string.join(self.coords, ',')
808:
809: def setCoordString(self, coordstring):
810: """sets coordinates from a string"""
811: coords = string.split(coordstring, ',')
812: self.coords = [c.strip() for c in coords]
813:
814: def getFullId(self, prefix=None):
815: """returns the id with prefixed parent id"""
816: if prefix is None:
817: if hasattr(self, 'aq_parent'):
818: prefix = self.aq_parent.id
819: else:
820: prefix = "id"
821: fid = prefix + "." + self.id
822: return fid
823:
824: def getType(self):
825: """returns the type"""
826: return self.type
827:
828: def setType(self, type):
829: """sets the type"""
830: if type == MapArea.TYPE_ARROW:
831: self.type = MapArea.TYPE_ARROW
832: elif type == MapArea.TYPE_AREA:
833: self.type = MapArea.TYPE_AREA
834: else:
835: self.type = MapArea.TYPE_AREA
836:
837: def isTypeArea(self):
838: """returns if the type is area"""
839: return self.type == MapArea.TYPE_AREA
840:
841: def isTypeArrow(self):
842: """returns if the type is arrow"""
843: return self.type == MapArea.TYPE_ARROW
844:
845: def getAngle(self):
846: """returns the angle"""
847: return self.angle
848:
849: def setAngle(self, angle):
850: """sets the angle"""
851: self.angle = angle
852:
853: def getText(self):
854: """returns the popup text"""
855: if self.text is None:
856: if hasattr(self, 'aq_parent'):
857: parent = self.aq_parent
858: if parent.contentType == 'text-popup':
859: return parent.description
860: return self.text
861:
862: def setText(self, text):
863: """sets the text"""
864: self.text = text
865:
866: def getLabel(self):
867: """returns the link label"""
868: if self.label is None:
869: if hasattr(self, 'aq_parent'):
870: return self.aq_parent.label or self.aq_parent.id
871: return self.label
872:
873: def setLabel(self, label):
874: """sets the label"""
875: self.label = label
876:
877: def getLinkId(self):
878: if hasattr(self, 'aq_parent'):
879: return self.aq_parent.id
880: return self.id
881:
882:
883: # call this to initialize framework classes, which
884: # does the right thing with the security assertions.
885: Globals.InitializeClass(MapArea)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>