def attachment_inlined(self, url, text, **kw): from MoinMoin.action import AttachFile import os _ = self.request.getText pagename, filename = AttachFile.absoluteName(url, self.page.page_name) fname = wikiutil.taintfilename(filename) fpath = AttachFile.getFilename(self.request, pagename, fname) ext = os.path.splitext(filename)[1] Parser = wikiutil.getParserForExtension(self.request.cfg, ext) if Parser is not None: try: content = file(fpath, 'r').read() # Try to decode text. It might return junk, but we don't # have enough information with attachments. content = wikiutil.decodeUnknownInput(content) if '.csv' in getattr(Parser, 'extensions', list()): colorizer = Parser(content, self.request, filename=filename, format_args=kw.get('format_args', '')) else: colorizer = Parser(content, self.request, filename=filename) colorizer.format(self) except IOError: pass return (self.attachment_link(1, url) + self.text(text) + self.attachment_link(0))
def attachment_inlined(self, url, text, **kw): from MoinMoin.action import AttachFile import os _ = self.request.getText pagename, filename = AttachFile.absoluteName(url, self.page.page_name) fname = wikiutil.taintfilename(filename) fpath = AttachFile.getFilename(self.request, pagename, fname) ext = os.path.splitext(filename)[1] Parser = wikiutil.getParserForExtension(self.request.cfg, ext) if Parser is not None: try: # rU: universal newline support so that even a \r is considered a valid line separator. # CSV exported by office (on Mac?) has \r line separators. content = file(fpath, 'rU').read() # Try to decode text. It might return junk, but we don't # have enough information with attachments. content = wikiutil.decodeUnknownInput(content) colorizer = Parser(content, self.request, filename=filename) colorizer.format(self) except IOError: pass return (self.attachment_link(1, url) + self.text(text) + self.attachment_link(0))
def attachment_inlined(self, url, text, **kw): from MoinMoin.action import AttachFile import os _ = self.request.getText pagename, filename = AttachFile.absoluteName(url, self.page.page_name) fname = wikiutil.taintfilename(filename) fpath = AttachFile.getFilename(self.request, pagename, fname) ext = os.path.splitext(filename)[1] Parser = wikiutil.getParserForExtension(self.request.cfg, ext) if Parser is not None: try: content = file(fpath, "r").read() # Try to decode text. It might return junk, but we don't # have enough information with attachments. content = wikiutil.decodeUnknownInput(content) if ".csv" in getattr(Parser, "extensions", list()): colorizer = Parser(content, self.request, filename=filename, format_args=kw.get("format_args", "")) else: colorizer = Parser(content, self.request, filename=filename) colorizer.format(self) except IOError: pass return self.attachment_link(1, url) + self.text(text) + self.attachment_link(0)
def attachment_inlined(self, url, text, **kw): from MoinMoin.action import AttachFile import os _ = self.request.getText pagename, filename = AttachFile.absoluteName(url, self.page.page_name) fname = wikiutil.taintfilename(filename) fpath = AttachFile.getFilename(self.request, pagename, fname) base, ext = os.path.splitext(filename) Parser = wikiutil.getParserForExtension(self.request.cfg, ext) if Parser is not None: try: content = file(fpath, 'r').read() # Try to decode text. It might return junk, but we don't # have enough information with attachments. content = wikiutil.decodeUnknownInput(content) colorizer = Parser(content, self.request) colorizer.format(self) except IOError: pass return self.attachment_link(url, text)
def send_viewfile(pagename, request): _ = request.getText fmt = request.html_formatter pagename, filename, fpath = _access_file(pagename, request) if not filename: return request.write('<h2>' + _("Attachment '%(filename)s'") % {'filename': filename} + '</h2>') # show a download link above the content label = _('Download') link = (fmt.url(1, getAttachUrl(pagename, filename, request, do='get'), css_class="download") + fmt.text(label) + fmt.url(0)) request.write('%s<br><br>' % link) if filename.endswith('.tdraw') or filename.endswith('.adraw'): request.write(fmt.attachment_drawing(filename, '')) return mt = wikiutil.MimeType(filename=filename) # destinguishs if browser need a plugin in place if mt.major == 'image' and mt.minor in config.browser_supported_images: url = getAttachUrl(pagename, filename, request) request.write('<img src="%s" alt="%s">' % ( wikiutil.escape(url, 1), wikiutil.escape(filename, 1))) return elif mt.major == 'text': ext = os.path.splitext(filename)[1] Parser = wikiutil.getParserForExtension(request.cfg, ext) if Parser is not None: try: content = file(fpath, 'r').read() content = wikiutil.decodeUnknownInput(content) colorizer = Parser(content, request, filename=filename) colorizer.format(request.formatter) return except IOError: pass request.write(request.formatter.preformatted(1)) # If we have text but no colorizing parser we try to decode file contents. content = open(fpath, 'r').read() content = wikiutil.decodeUnknownInput(content) content = wikiutil.escape(content) request.write(request.formatter.text(content)) request.write(request.formatter.preformatted(0)) return try: package = packages.ZipPackage(request, fpath) if package.isPackage(): request.write("<pre><b>%s</b>\n%s</pre>" % (_("Package script:"), wikiutil.escape(package.getScript()))) return if zipfile.is_zipfile(fpath) and mt.minor == 'zip': zf = zipfile.ZipFile(fpath, mode='r') request.write("<pre>%-46s %19s %12s\n" % (_("File Name"), _("Modified")+" "*5, _("Size"))) for zinfo in zf.filelist: date = "%d-%02d-%02d %02d:%02d:%02d" % zinfo.date_time request.write(wikiutil.escape("%-46s %s %12d\n" % (zinfo.filename, date, zinfo.file_size))) request.write("</pre>") return except (RuntimeError, zipfile.BadZipfile, zipfile.LargeZipFile): # We don't want to crash with a traceback here (an exception # here could be caused by an uploaded defective zip file - and # if we crash here, the user does not get a UI to remove the # defective zip file again). # RuntimeError is raised by zipfile stdlib module in case of # problems (like inconsistent slash and backslash usage in the # archive). # BadZipfile/LargeZipFile are raised when there are some # specific problems with the archive file. logging.exception("An exception within zip file attachment handling occurred:") return from MoinMoin import macro from MoinMoin.parser.text import Parser macro.request = request macro.formatter = request.html_formatter p = Parser("##\n", request) m = macro.Macro(p) # use EmbedObject to view valid mime types if mt is None: request.write('<p>' + _("Unknown file type, cannot display this attachment inline.") + '</p>') link = (fmt.url(1, getAttachUrl(pagename, filename, request)) + fmt.text(filename) + fmt.url(0)) request.write('For using an external program follow this link %s' % link) return request.write(m.execute('EmbedObject', u'target="%s", pagename="%s"' % (filename, pagename))) return
def attachment(self, url_and_text, **kw): """ This gets called on attachment URLs. """ import urllib _ = self._ if len(url_and_text) == 1: url = url_and_text[0] text = None else: url, text = url_and_text inline = url[0] == 'i' drawing = url[0] == 'd' url = url.split(":", 1)[1] url = urllib.unquote(url) text = text or url pagename = self.formatter.page.page_name parts = url.split('/') if len(parts) > 1: # get attachment from other page pagename = '/'.join(parts[:-1]) url = parts[-1] import urllib from MoinMoin.action import AttachFile fname = wikiutil.taintfilename(url) if drawing: drawing = fname fname = fname + ".png" url = url + ".png" # fallback for old gif drawings (1.1 -> 1.2) fpath = AttachFile.getFilename(self.request, pagename, fname) if not os.path.exists(fpath): gfname = fname[:-4] + ".gif" gurl = url[:-4] + ".gif" gfpath = AttachFile.getFilename(self.request, pagename, gfname) if os.path.exists(gfpath): fname, url, fpath = gfname, gurl, gfpath else: fpath = AttachFile.getFilename(self.request, pagename, fname) # check whether attachment exists, possibly point to upload form if not os.path.exists(fpath): if drawing: linktext = _('Create new drawing "%(filename)s"') else: linktext = _('Upload new attachment "%(filename)s"') return wikiutil.link_tag(self.request, self.formatter.text('%s?action=AttachFile&rename=%s%s' % ( wikiutil.quoteWikinameURL(pagename), urllib.quote_plus(fname.encode(config.charset)), drawing and ('&drawing=%s' % urllib.quote(drawing.encode(config.charset))) or '')), linktext % {'filename': self.formatter.text(fname)}) # check for image URL, and possibly return IMG tag # (images are always inlined, just like for other URLs) if not kw.get('pretty_url', 0) and wikiutil.isPicture(url): if drawing: # check for map file mappath = AttachFile.getFilename(self.request, pagename, drawing + '.map') edit_link = self.formatter.text('%s?action=AttachFile&rename=%s&drawing=%s' % (wikiutil.quoteWikinameURL(pagename), urllib.quote_plus(fname.encode(config.charset)), urllib.quote(drawing.encode(config.charset)))) if os.path.exists(mappath): # we have a image map. inline it and add a map ref # to the img tag try: map = open(mappath,'r').read() except IOError: pass except OSError: pass else: mapid = 'ImageMapOf'+drawing # replace MAPNAME map = map.replace('%MAPNAME%', mapid) # add alt and title tags to areas map = re.sub('href\s*=\s*"((?!%TWIKIDRAW%).+?)"',r'href="\1" alt="\1" title="\1"',map) # add in edit links plus alt and title attributes map = map.replace('%TWIKIDRAW%"', edit_link + '" alt="' + _('Edit drawing %(filename)s') % {'filename': self.formatter.text(fname)} + '" title="' + _('Edit drawing %(filename)s') % {'filename': self.formatter.text(fname)} + '"') # unxml, because 4.01 concrete will not validate /> map = map.replace('/>','>') return map + self.formatter.image(alt=drawing, src=AttachFile.getAttachUrl(pagename, url, self.request, addts=1), usemap='#'+mapid, html_class="drawing") else: return wikiutil.link_tag(self.request, edit_link, self.formatter.image(alt=url, src=AttachFile.getAttachUrl(pagename, url, self.request, addts=1), html_class="drawing"), attrs='title="%s"' % (_('Edit drawing %(filename)s') % {'filename': self.formatter.text(fname)})) else: return self.formatter.image(alt=url, src=AttachFile.getAttachUrl(pagename, url, self.request, addts=1)) # try to inline the attachment (parser know what they # can handle) base, ext = os.path.splitext(url) if inline: Parser = wikiutil.getParserForExtension(self.cfg, ext) if Parser is not None: content = file(fpath, 'r').read() # Try to decode text. It might return junk, but we don't # have enough information with attachments. content = wikiutil.decodeUnknownInput(content) colorizer = Parser(content, self.request) colorizer.format(self.formatter) url = AttachFile.getAttachUrl(pagename, url, self.request) if not kw.get('pretty_url', 0) and wikiutil.isPicture(url): return self.formatter.image(src=url) else: return (self.formatter.url(1, url) + self.formatter.text(text) + self.formatter.url(0))
def send_viewfile(pagename, request): _ = request.getText fmt = request.html_formatter pagename, filename, fpath = _access_file(pagename, request) if not filename: return request.write('<h2>' + _("Attachment '%(filename)s'") % {'filename': filename} + '</h2>') # show a download link above the content label = _('Download') link = (fmt.url(1, getAttachUrl(pagename, filename, request, do='get'), css_class="download") + fmt.text(label) + fmt.url(0)) request.write('%s<br><br>' % link) if filename.endswith('.tdraw') or filename.endswith('.adraw'): request.write(fmt.attachment_drawing(filename, '')) return mt = wikiutil.MimeType(filename=filename) # destinguishs if browser need a plugin in place if mt.major == 'image' and mt.minor in config.browser_supported_images: url = getAttachUrl(pagename, filename, request) request.write('<img src="%s" alt="%s">' % (wikiutil.escape(url, 1), wikiutil.escape(filename, 1))) return elif mt.major == 'text': ext = os.path.splitext(filename)[1] Parser = wikiutil.getParserForExtension(request.cfg, ext) if Parser is not None: try: content = file(fpath, 'r').read() content = wikiutil.decodeUnknownInput(content) colorizer = Parser(content, request, filename=filename) colorizer.format(request.formatter) return except IOError: pass request.write(request.formatter.preformatted(1)) # If we have text but no colorizing parser we try to decode file contents. content = open(fpath, 'r').read() content = wikiutil.decodeUnknownInput(content) content = wikiutil.escape(content) request.write(request.formatter.text(content)) request.write(request.formatter.preformatted(0)) return try: package = packages.ZipPackage(request, fpath) if package.isPackage(): request.write( "<pre><b>%s</b>\n%s</pre>" % (_("Package script:"), wikiutil.escape(package.getScript()))) return if zipfile.is_zipfile(fpath) and mt.minor == 'zip': zf = zipfile.ZipFile(fpath, mode='r') request.write("<pre>%-46s %19s %12s\n" % (_("File Name"), _("Modified") + " " * 5, _("Size"))) for zinfo in zf.filelist: date = "%d-%02d-%02d %02d:%02d:%02d" % zinfo.date_time request.write( wikiutil.escape("%-46s %s %12d\n" % (zinfo.filename, date, zinfo.file_size))) request.write("</pre>") return except RuntimeError: # We don't want to crash with a traceback here (an exception # here could be caused by an uploaded defective zip file - and # if we crash here, the user does not get a UI to remove the # defective zip file again). # RuntimeError is raised by zipfile stdlib module in case of # problems (like inconsistent slash and backslash usage in the # archive). logging.exception( "An exception within zip file attachment handling occurred:") return from MoinMoin import macro from MoinMoin.parser.text import Parser macro.request = request macro.formatter = request.html_formatter p = Parser("##\n", request) m = macro.Macro(p) # use EmbedObject to view valid mime types if mt is None: request.write( '<p>' + _("Unknown file type, cannot display this attachment inline.") + '</p>') link = (fmt.url(1, getAttachUrl(pagename, filename, request)) + fmt.text(filename) + fmt.url(0)) request.write('For using an external program follow this link %s' % link) return request.write( m.execute('EmbedObject', u'target="%s", pagename="%s"' % (filename, pagename))) return