##// END OF EJS Templates
Added github flavored markdown style rendering into markdown...
marcink -
r4009:7563624e default
parent child Browse files
Show More
@@ -40,7 +40,7 b' class MarkupRenderer(object):'
40 40 RST_PAT = re.compile(r're?st', re.IGNORECASE)
41 41 PLAIN_PAT = re.compile(r'readme', re.IGNORECASE)
42 42
43 def __detect_renderer(self, source, filename=None):
43 def _detect_renderer(self, source, filename=None):
44 44 """
45 45 runs detection of what renderer should be used for generating html
46 46 from a markup language
@@ -62,6 +62,49 b' class MarkupRenderer(object):'
62 62
63 63 return getattr(MarkupRenderer, detected_renderer)
64 64
65 @classmethod
66 def _flavored_markdown(cls, text):
67 """
68 Github style flavored markdown
69
70 :param text:
71 """
72 from hashlib import md5
73
74 # Extract pre blocks.
75 extractions = {}
76 def pre_extraction_callback(matchobj):
77 digest = md5(matchobj.group(0)).hexdigest()
78 extractions[digest] = matchobj.group(0)
79 return "{gfm-extraction-%s}" % digest
80 pattern = re.compile(r'<pre>.*?</pre>', re.MULTILINE | re.DOTALL)
81 text = re.sub(pattern, pre_extraction_callback, text)
82
83 # Prevent foo_bar_baz from ending up with an italic word in the middle.
84 def italic_callback(matchobj):
85 s = matchobj.group(0)
86 if list(s).count('_') >= 2:
87 return s.replace('_', '\_')
88 return s
89 text = re.sub(r'^(?! {4}|\t)\w+_\w+_\w[\w_]*', italic_callback, text)
90
91 # In very clear cases, let newlines become <br /> tags.
92 def newline_callback(matchobj):
93 if len(matchobj.group(1)) == 1:
94 return matchobj.group(0).rstrip() + ' \n'
95 else:
96 return matchobj.group(0)
97 pattern = re.compile(r'^[\w\<][^\n]*(\n+)', re.MULTILINE)
98 text = re.sub(pattern, newline_callback, text)
99
100 # Insert pre block extractions.
101 def pre_insert_callback(matchobj):
102 return '\n\n' + extractions[matchobj.group(1)]
103 text = re.sub(r'{gfm-extraction-([0-9a-f]{32})\}',
104 pre_insert_callback, text)
105
106 return text
107
65 108 def render(self, source, filename=None):
66 109 """
67 110 Renders a given filename using detected renderer
@@ -72,7 +115,7 b' class MarkupRenderer(object):'
72 115 :param source:
73 116 """
74 117
75 renderer = self.__detect_renderer(source, filename)
118 renderer = self._detect_renderer(source, filename)
76 119 readme_data = renderer(source)
77 120 return readme_data
78 121
@@ -94,10 +137,12 b' class MarkupRenderer(object):'
94 137 return '<br />' + source.replace("\n", '<br />')
95 138
96 139 @classmethod
97 def markdown(cls, source, safe=True):
140 def markdown(cls, source, safe=True, flavored=False):
98 141 source = safe_unicode(source)
99 142 try:
100 143 import markdown as __markdown
144 if flavored:
145 source = cls._flavored_markdown(source)
101 146 return __markdown.markdown(source, ['codehilite', 'extra'])
102 147 except ImportError:
103 148 log.warning('Install markdown to use this function')
General Comments 0
You need to be logged in to leave comments. Login now