diff --git a/rest_framework/compat.py b/rest_framework/compat.py
index e0f718ced..3b341a656 100644
--- a/rest_framework/compat.py
+++ b/rest_framework/compat.py
@@ -244,6 +244,7 @@ try:
md = markdown.Markdown(
extensions=extensions, extension_configs=extension_configs
)
+ md_filter_add_syntax_highlight(md)
return md.convert(text)
except ImportError:
apply_markdown = None
@@ -273,6 +274,38 @@ except ImportError:
def pygments_css(style):
return None
+if markdown is not None and pygments is not None:
+ # 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/
+
+ from markdown.preprocessors import Preprocessor
+ import re
+
+ 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
diff --git a/tests/test_description.py b/tests/test_description.py
index 4df14ac55..a97550ed8 100644
--- a/tests/test_description.py
+++ b/tests/test_description.py
@@ -24,11 +24,36 @@ another header
indented
-# hash style header #"""
+# hash style header #
+
+@@ json @@
+[{
+ "alpha": 1,
+ "beta: "this is a string"
+}]
+@@"""
# If markdown is installed we also test it's working
# (and that our wrapped forces '=' to h2 and '-' to h3)
+MARKED_DOWN_HILITE = """
+
[{
"alpha": 1,
\
+ "beta: "this\
+ is a \
+string"
}]
@@ json @@ +[{ + "alpha": 1, + "beta: "this is a string" +}] +@@
""" + # We support markdown < 2.1 and markdown >= 2.1 MARKED_DOWN_lt_21 = """code block
indented
-code block
indented
-