Update: Whitespace is now properly handled for RSS (I forgot to handle that bit, 2-line fix now included in the code below)
<pre syntax="python" src="sample.py"></pre>
The result (and relevant bit of code) is this:
class SyntaxHighlightWikiPlugin(yaki.Engine.WikiPlugin): def __init__(self, registry, webapp): registry.register('markup',self, 'pre','syntax') self.ac = webapp.getContext() self.i18n = yaki.Locale.i18n[self.ac.locale] def run(self, serial, tag, tagname, pagename, soup, request, response): try: source = tag['src'] (schema,host,path,parameters,query,fragment) = urlparse.urlparse(source) if schema == 'cid': filename = self.ac.store.getAttachmentFilename(pagename,path) if os.path.exists(filename): buffer = codecs.open(filename,'r','utf-8').read().strip() else: tag.replaceWith(self.i18n['error_include_file']) return False else: tag.replaceWith(self.i18n['error_reference_format']) return False except KeyError: try: # Remove character entities (since we'll be running things through pygments) buffer = unicode(BeautifulStoneSoup(tag.contents,convertEntities=BeautifulStoneSoup.XHTML_ENTITIES)).strip() except: buffer = '' try: lexer = tag['syntax'] except KeyError: lexer = 'text' if request is False: # we're formatting for RSS lexer = 'text' lexer = get_lexer_by_name(lexer) formatter = HtmlFormatter(linenos=False, cssclass='syntax') result = highlight(buffer, lexer, formatter) tag.replaceWith(result.strip()) return False
This makes it a lot easier to manage code snippets – since they’re in separate files, I can just drop them into the same folder and then refer to them inside the actual post markup.
This will (eventually) make it to the Subversion repository – the code cleanup I’ve been doing (as well as removal of a couple of very nasty hacks) is nearer its end, so with some luck there’ll be a new snapshot of Yaki soon.
There’s only, oh… around three dozen things to fix first. Or so.
Oh, and incidentally, 过年好 to my Chinese readers – I’ve been remiss in celebrating the coming of the Year of the Rat, but there’s been far too much going on…