from django import template register = template.Library() # Pygments: http://pygments.org -- a generic syntax highlighter. from pygments import highlight from pygments.formatters import HtmlFormatter from pygments.lexers import get_lexer_by_name, guess_lexer # Python Markdown (dropped in my project directory) from codebase.markdown import markdown # BeautifulSoup: http://www.crummy.com/software/BeautifulSoup/ from codebase.BeautifulSoup import BeautifulSoup @register.filter def render(content, safe="unsafe"): """Render this content for display.""" # First, pull out all the blocks, to keep them away # from Markdown (and preserve whitespace). soup = BeautifulSoup(str(content)) code_blocks = soup.findAll('code') for block in code_blocks: block.replaceWith('') # Run the post through markdown. if safe == "unsafe": safe_mode = False else: safe_mode = True markeddown = markdown(str(soup), safe_mode=safe_mode) # Replace the pulled code blocks with syntax-highlighted versions. soup = BeautifulSoup(markeddown) empty_code_blocks, index = soup.findAll('code', 'removed'), 0 formatter = HtmlFormatter(cssclass='source') for block in code_blocks: if block.has_key('class'): # python code language = block['class'] else: # plain text, whitespace-preserved language = 'text' try: lexer = get_lexer_by_name(language, stripnl=True, encoding='UTF-8') except ValueError, e: try: # Guess a lexer by the contents of the block. lexer = guess_lexer(block.renderContents()) except ValueError, e: # Just make it plain text. lexer = get_lexer_by_name('text', stripnl=True, encoding='UTF-8') empty_code_blocks[index].replaceWith( highlight(block.renderContents(), lexer, formatter)) index = index + 1 return str(soup)