# -*- coding: iso-8859-1 -*- """ MoinMoin - EmbedObject Macro PURPOSE: This macro is used to embed an object into a wiki page. Optionally, the size of the object can get adjusted. Further keywords are dependent on the kind of application. CALLING SEQUENCE: [[EmbedObject(attachment[,width=width][,height=height])]] SUPPORTED MIMETYPES: application/x-shockwave-flash application/x-dvi application/postscript application/pdf application/ogg application/vnd.visio image/x-ms-bmp image/svg+xml image/tiff image/x-photoshop audio/mpeg audio/midi audio/x-wav video/fli video/mpeg video/quicktime video/x-msvideo chemical/x-pdb x-world/x-vrml INPUTS: attachment: name of attachment KEYWORD PARAMETERS: Dependent on the mimetype class a different set of keywords is used from the defaults width = "" height = "" type = mime_type play = false loop = false quality = high op = true repeat = false autostart = false menu = true All do use width, height, mime_type in addition: 'video' do use repeat, autostart, menu, op 'audio' do use play, repeat, autostart, op, hidden the default width is 60 and default height is 20 'application' do use play, menu, autostart EXAMPLE: [[EmbedObject]] [[EmbedObject(example.swf)]] [[EmbedObject(example.pdf]] [[EmbedObject(example.svg]] [[EmbedObject(example.mp3]] [[EmbedObject(example.vss]] [[EmbedObject(example.swf,width=637,height=392)]] [[EmbedObject(SlideShow/example.swf,width=637,height=392)]] [[EmbedObject(SlideShow/example.swf,width=637,height=392)]] [[EmbedObject(SlideShow/example.swf,width=637,height=392,play=true,loop=false)]] [[EmbedObject(SlideShow/example.swf,width=637,height=392,quality=low)]] PROCEDURE: If the attachment file isn't uploaded yet the attachment line will be shown. If you give only one size argument, e.g. width only, the other one will be calculated. By the swftools it is possible to get the swf size returned. I don't know if it is possible to get sizes for svg, pdf and others detected too, that's the reason why I haven't added it by now. Please add needed mimetypes as objects. RESTRICTIONS: some mimetypes do ignore all used keywords. May be they do use different names. MODIFICATION HISTORY: @copyright: 2006 by Reimar Bauer (R.Bauer@fz-juelich.de) @license: GNU GPL, see COPYING for details. initial version: 1.5.0-1 svg was added by AndrewArmstrong 2006-05-04 TomSi: added mp3 support 2006-05-09 RB code refactored, fixed a taintfilename bug 2006-06-29 visio from OwenJones added but not tested, RB code reviewed, taintfile removed 2006-10-01 RB code refactored 2006-10-05 RB bug fixed closing " at height added 2006-10-08 RB type is needed on some platforms, some more keywords added """ import os, mimetypes from MoinMoin import wikiutil from MoinMoin.action import AttachFile class EmbedObject: def __init__(self, macro, args): self.macro = macro self.request = macro.request self.formatter = macro.formatter self.args = args self.width = "" self.height = "" self.play = "false" self.loop = "false" self.quality = "high" self.op = "true" self.repeat = "false" self.autostart = "false" self.align = "center" self.hidden = "false" self.menu = "true" if args: args = args.split(',') args = [arg.strip() for arg in args] else: args = [] kw_count = 0 argc = len(args) for arg in self.args.split(','): if arg.find('=') > -1: kw_count += 1 key, value = arg.split('=') setattr(self, key, wikiutil.escape(value.strip(), quote=1)) argc -= kw_count if not argc: msg = 'Not enough arguments to EmbedObject macro! Try [[EmbedObject(attachment [,width=width] [,height=heigt])]]' return "%s%s%s" % (formatter.sysmsg(1), formatter.text(msg), formatter.sysmsg(0)) else: self.target = args[0] def embed(self, mime_type, file): mtype = mime_type.split('/') if mtype[0] == 'video': return ''' ''' % { "width": self.width, "height": self.height, "file": file, "repeat": self.repeat, "autostart": self.autostart, "op": self.op, "type": mime_type, "menu": self.menu, } if mtype[0] in ['image', 'chemical', 'x-world']: return ''' ''' % { "width": self.width, "height": self.height, "file": file, "type": mime_type, } if mtype[0] == 'audio': if self.width == "": self.width = "60" if self.height == "": self.height = "20" return ''' ''' % { "width": self.width, "height": self.height, "file": file, "play": self.play, "repeat": self.repeat, "autostart": self.autostart, "op": self.op, "hidden": self.hidden, "type": mime_type, } if mtype[0] == 'application': return ''' ''' % { "width": self.width, "height": self.height, "file": file, "autostart": self.autostart, "play": self.play, "loop": self.loop, "type": mime_type, "menu": self.menu, } def render(self): _ = self.request.getText pagename, attname = AttachFile.absoluteName(self.target, self.formatter.page.page_name) attachment_fname = AttachFile.getFilename(self.request, pagename, attname) if not os.path.exists(attachment_fname): linktext = _('Upload new attachment "%(filename)s"') return wikiutil.link_tag(self.request, ('%s?action=AttachFile&rename=%s' % ( wikiutil.quoteWikinameURL(pagename), wikiutil.url_quote_plus(attname))), linktext % {'filename': attname}) url = AttachFile.getAttachUrl(pagename, attname, self.request) mime_type, enc = mimetypes.guess_type(attname) if mime_type in ["application/x-shockwave-flash", "application/x-dvi", "application/postscript", "application/pdf", "application/ogg", "application/vnd.visio", "image/x-ms-bmp", "image/svg+xml", "image/tiff", "image/x-photoshop", "audio/mpeg", "audio/midi", "audio/x-wav", "video/fli", "video/mpeg", "video/quicktime", "video/x-msvideo", "chemical/x-pdb", "x-world/x-vrml", ]: return self.embed(mime_type, url) else: msg = 'Not supported mimetype %(mimetype)s ' % {"mimetype": mime_type} return "%s%s%s" % (self.macro.formatter.sysmsg(1), self.macro.formatter.text(msg), self.macro.formatter.sysmsg(0)) def execute(macro, args): return EmbedObject(macro, args).render()