from pygments.lexers import LEXERS, get_lexer_by_name from pygments import highlight from pygments.formatters import HtmlFormatter from BeautifulSoup import BeautifulSoup from markdown import markdown # a tuple of known lexer names _lexer_names = reduce(lambda a,b: a + b[2], LEXERS.itervalues(), ()) # default formatter _formatter = HtmlFormatter(cssclass='source') def pygmented_markdown(raw): ''' Accepts raw markdown text for markup processing. Using BeatifuleSoup on the results of markdown processing, the following constructs will be replaced by with pygmented highlighting. E.g.::
...Where ``???`` is the name of a supported pygments lexer, e.g.: ``python``, ``css``, ``html``. Note: Semantically, it would make more sense to wrap the code in a ``
...
`` tag; however, my tests using markdown.py - as well as
markdown.pl from John Gruber - have shown that the inner HTML of the
```` tag is not immune to translation.
'''
soup = BeautifulSoup(markdown(raw))
for tag in soup.findAll('pre'):
lexer_name = tag.get('class')
if lexer_name and lexer_name in _lexer_names:
lexer = get_lexer_by_name(lexer_name, stripnl=True, encoding='UTF-8')
tag.replaceWith(highlight(tag.renderContents(), lexer, _formatter))
return unicode(soup)