From cf759a6fe8b8b17dbcac706636daee300205d892 Mon Sep 17 00:00:00 2001 From: Matteo Nastasi Date: Thu, 28 Sep 2017 16:56:54 +0200 Subject: [PATCH] move syntax_highlight doc filter in compatibility module and define it conditionally --- rest_framework/compat.py | 27 +++++++++++++ rest_framework/templatetags/rest_framework.py | 38 +++---------------- 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index e0f718ced..115011fd3 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -273,6 +273,32 @@ except ImportError: def pygments_css(style): return None +if markdown is not None and pygments is not None: + class CodeBlockPreprocessor(Preprocessor): + pattern = re.compile( + r'^\s*@@ (.+?) @@\s*(.+?)^\s*@@', re.M|re.S) + + formatter = HtmlFormatter() + + def run(self, lines): + def repl(m): + try: + lexer = get_lexer_by_name(m.group(1)) + except (ValueError, NameError): + lexer = TextLexer() + code = m.group(2).replace('\t',' ') + code = pygments.highlight(code, lexer, self.formatter) + code = code.replace('\n\n', '\n \n').replace('\n', '
').replace('\\@','@') + return '\n\n%s\n\n' % code + ret = self.pattern.sub(repl, "\n".join(lines)) + return ret.split("\n") + + def md_filter_add_syntax_highlight(md): + md.preprocessors.add('highlight', CodeBlockPreprocessor(), "_begin") + return True +else: + def md_filter_add_syntax_highlight(md): + return False try: import pytz @@ -374,3 +400,4 @@ def include(module, namespace=None, app_name=None): return include(module, namespace, app_name) else: return include((module, app_name), namespace) + diff --git a/rest_framework/templatetags/rest_framework.py b/rest_framework/templatetags/rest_framework.py index 0f355ac0d..7002f0b9f 100644 --- a/rest_framework/templatetags/rest_framework.py +++ b/rest_framework/templatetags/rest_framework.py @@ -11,7 +11,8 @@ from django.utils.html import escape, format_html, smart_urlquote from django.utils.safestring import SafeData, mark_safe from rest_framework.compat import ( - NoReverseMatch, markdown, pygments_highlight, reverse, template_render + NoReverseMatch, markdown, pygments_highlight, reverse, template_render, + md_filter_add_syntax_highlight, ) from rest_framework.renderers import HTMLFormRenderer from rest_framework.utils.urls import replace_query_param @@ -66,44 +67,15 @@ def form_for_link(link): return mark_safe(coreschema.render_to_form(schema)) -from markdown.preprocessors import Preprocessor -from pygments.formatters import HtmlFormatter -from pygments.lexers import get_lexer_by_name, TextLexer -from pygments import highlight -import pygments -import re - -# starting from this blogpost and modified to support current markdown extensions API -# https://zerokspot.com/weblog/2008/06/18/syntax-highlighting-in-markdown-with-pygments/ -class CodeBlockPreprocessor(Preprocessor): - pattern = re.compile( - r'^\s*@@ (.+?) @@\s*(.+?)^\s*@@', re.M|re.S) - - formatter = HtmlFormatter() - - def run(self, lines): - def repl(m): - try: - lexer = get_lexer_by_name(m.group(1)) - except (ValueError, NameError): - lexer = TextLexer() - code = m.group(2).replace('\t',' ') - code = pygments.highlight(code, lexer, self.formatter) - code = code.replace('\n\n', '\n \n').replace('\n', '
').replace('\\@','@') - return '\n\n%s\n\n' % code - # import ipdb ; ipdb.set_trace() - ret = self.pattern.sub(repl, "\n".join(lines)) - return ret.split("\n") - - @register.simple_tag def render_markdown(markdown_text): if not markdown: return markdown_text md = markdown.Markdown() - md.preprocessors.add('highlight', CodeBlockPreprocessor(), "_begin") - a = md.convert(markdown_text) + # add pygments syntax highlight if pygments package is available + md_filter_add_syntax_highlight(md) + return mark_safe(md.convert(markdown_text))