from django import template from django.conf import settings from docutils import nodes from docutils.parsers.rst import directives from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters import HtmlFormatter pygments_formatter = HtmlFormatter() def pygments_directive(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine): try: lexer = get_lexer_by_name(arguments[0]) except ValueError: # no lexer found - use the text one instead of an exception lexer = get_lexer_by_name('text') parsed = highlight(u'\n'.join(content), lexer, pygments_formatter) return [nodes.raw('', parsed, format='html')] pygments_directive.arguments = (1, 0, 1) pygments_directive.content = 1 directives.register_directive('code', pygments_directive) register = template.Library() @register.filter def rest ( value, headerlevel=2 ): try: from docutils.core import publish_parts except ImportError: if settings.DEBUG: raise template.TemplateSyntaxError, "Error in {% rest %} filter: The Python docutils library isn't installed." return value else: docutils_settings = getattr(settings, "REST_FILTER_SETTINGS", {'initial_header_level': int(headerlevel)}) parts = publish_parts(source=value, writer_name="html4css1", settings_overrides=docutils_settings) return parts["html_body"]