# -*- coding: iso-8859-1 -*- """ MoinMoin - "text/html+css" Formatter for feeding the GUI editor @copyright: (c) Bastian Blank, Florian Festi, Thomas Waldmann @license: GNU GPL, see COPYING for details. """ from MoinMoin.formatter import text_html from MoinMoin.formatter.base import FormatterBase from MoinMoin import wikiutil, config from MoinMoin.Page import Page from MoinMoin.action import AttachFile class Formatter(text_html.Formatter): """ Send HTML data for the GUI editor """ # Block elements #################################################### def heading(self, on, depth, **kw): # remember depth of first heading, and adapt counting depth accordingly if not self._base_depth: self._base_depth = depth count_depth = max(depth - (self._base_depth - 1), 1) heading_depth = depth + 1 # closing tag, with empty line after, to make source more readable if not on: return self._close('h%d' % heading_depth) else: return self._open('h%d' % heading_depth, **kw) # Links ############################################################## def pagelink(self, on, pagename='', page=None, **kw): """ Link to a page. formatter.text_python will use an optimized call with a page!=None parameter. DO NOT USE THIS YOURSELF OR IT WILL BREAK. See wikiutil.link_tag() for possible keyword parameters. """ apply(FormatterBase.pagelink, (self, on, pagename, page), kw) if page is None: page = Page(self.request, pagename, formatter=self); return page.link_to(self.request, on=on, **kw) def interwikilink(self, on, interwiki='', pagename='', **kw): """ @keyword title: override using the interwiki wikiname as title """ if not on: return self.url(0) # return '' html_class = 'badinterwiki' # we use badinterwiki in any case to simplify reverse conversion href = wikiutil.quoteWikinameURL(pagename) or "/" # FCKeditor behaves strange on empty href title = kw.get('title', interwiki) return self.url(1, href, title=title, do_escape=1, css=html_class) # interwiki links with pages with umlauts def attachment_inlined(self, url, text, **kw): if url == text: return 'inline:%s' % url else: return '[inline:%s %s]' % (url, text) def attachment_link(self, url, text, **kw): _ = self.request.getText pagename = self.page.page_name target = AttachFile.getAttachUrl(pagename, url, self.request) return (self.url(1, target, title="attachment:%s" % wikiutil.quoteWikinameURL(url)) + self.text(text) + self.url(0)) def attachment_image(self, url, **kw): _ = self.request.getText pagename = self.page.page_name return self.image( title="attachment:%s" % wikiutil.quoteWikinameURL(url), src=AttachFile.getAttachUrl(pagename, url, self.request, addts=1)) def attachment_drawing(self, url, text, **kw): _ = self.request.getText pagename = self.page.page_name image = url + u'.png' fname = wikiutil.taintfilename(image) fpath = AttachFile.getFilename(self.request, pagename, fname) return self.image( title="drawing:%s" % wikiutil.quoteWikinameURL(url), src=AttachFile.getAttachUrl(pagename, image, self.request, addts=1)) def nowikiword(self, text): return '!' + self.text(text) # Dynamic stuff / Plugins ############################################ def macro(self, macro_obj, name, args): if args is not None: result = "[[%s(%s)]]" % (name, args) else: result = "[[%s]]" % name return '%s' % result def processor(self, processor_name, lines, is_parser=0): """ processor_name MUST be valid! """ result = [self.preformatted(1)] for line in lines: result.append(self.text(line)) result.append(self.linebreak(preformatted=1)) result.append(self.preformatted(0)) return "".join(result) # Other ############################################################## style2attribute = { 'width': 'width', 'height': 'height', 'background': 'bgcolor', 'background-color': 'bgcolor', #if this is used as table style="text-align: right", it doesn't work #if it is transformed to align="right": #'text-align': 'align', #'vertical-align': 'valign' } def _style_to_attributes(self, attrs): if not attrs.has_key('style'): return attrs unknown = [] for entry in attrs['style'].split(';'): try: key, value = entry.split(':') except ValueError: unknown.append(entry) continue key, value = key.strip(), value.strip() if self.style2attribute.has_key(key): attrs[self.style2attribute[key]] = value else: unknown.append("%s:%s" % (key, value)) if unknown: attrs['style'] = ';'.join(unknown) else: del attrs['style'] return attrs def _checkTableAttr(self, attrs, prefix): #self.request.log(repr(attrs)) attrs = text_html.Formatter._checkTableAttr(self, attrs, prefix) #self.request.log(repr(attrs)) attrs = self._style_to_attributes(attrs) #self.request.log(repr(attrs)) return attrs _allowed_table_attrs = { 'table': ['class', 'id', 'style', 'bgcolor', 'width', 'height', ], 'row': ['class', 'id', 'style', 'bgcolor', 'width', 'height', ], '': ['colspan', 'rowspan', 'class', 'id', 'style', 'bgcolor', 'width', 'height', ], } def table(self, on, attrs=None, **kw): """ Create table @param on: start table @param attrs: table attributes @rtype: string @return start or end tag of a table """ result = [] if on: # Open table if not attrs: attrs = {} else: #result.append(self.rawHTML("" % repr(attrs))) attrs = self._checkTableAttr(attrs, 'table') #result.append(self.rawHTML("" % repr(attrs))) result.append(self._open('table', newline=1, attr=attrs, allowed_attrs=self._allowed_table_attrs['table'], **kw)) else: # Close table then div result.append(self._close('table')) return ''.join(result) def comment(self, text, **kw): text = text.rstrip() # workaround for growing amount of blanks at EOL return self.preformatted(1, css_class='comment') + self.text(text) + self.preformatted(0) def strong(self, on, **kw): tag = 'b' if on: return self._open(tag, allowed_attrs=[], **kw) return self._close(tag) def emphasis(self, on, **kw): tag = 'i' if on: return self._open(tag, allowed_attrs=[], **kw) return self._close(tag) def underline(self, on, **kw): tag = 'u' if on: return self._open(tag, allowed_attrs=[], **kw) return self._close(tag) def line_anchordef(self, lineno): return '' # not needed for gui editor feeding def line_anchorlink(self, on, lineno=0): return '' # not needed for gui editor feeding