annotate kallithea/lib/markup_renderer.py @ 4208:ad38f9f93b3b kallithea-2.2.5-rebrand

Correct licensing information in individual files. The top-level license file is now LICENSE.md. Also, in various places where there should have been joint copyright holders listed, a single copyright holder was listed. It does not appear easy to add a link to a large list of copyright holders in these places, so it simply refers to the fact that various authors hold copyright. In future, if an easy method is discovered to link to a list from those places, we should do so. Finally, text is added to LICENSE.md to point to where the full list of copyright holders is, and that Kallithea as a whole is GPLv3'd.
author Bradley M. Kuhn <bkuhn@sfconservancy.org>
date Wed, 21 May 2014 16:59:37 -0400
parents d1addaf7a91e
children 1948ede028ef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
2 # This program is free software: you can redistribute it and/or modify
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
3 # it under the terms of the GNU General Public License as published by
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
4 # the Free Software Foundation, either version 3 of the License, or
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
5 # (at your option) any later version.
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
6 #
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
7 # This program is distributed in the hope that it will be useful,
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
10 # GNU General Public License for more details.
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
11 #
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
12 # You should have received a copy of the GNU General Public License
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
4116
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
14 """
4186
7e5f8c12a3fc First step in two-part process to rename directories to kallithea.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4116
diff changeset
15 kallithea.lib.markup_renderer
4116
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
16 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
17
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
18 Renderer for markup languages with ability to parse using rst or markdown
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
19
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
20 :created_on: Oct 27, 2011
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
21 :author: marcink
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
22 :copyright: (c) 2013 RhodeCode GmbH.
4208
ad38f9f93b3b Correct licensing information in individual files.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4187
diff changeset
23 :license: GPLv3, see LICENSE.md for more details.
4116
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
24 """
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
25
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
26
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
27 import re
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
28 import logging
2747
cdce3d7282b2 catch errors on renderers, and display plain if critical rendering error is present
Marcin Kuzminski <marcin@python-works.com>
parents: 2201
diff changeset
29 import traceback
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
30
4186
7e5f8c12a3fc First step in two-part process to rename directories to kallithea.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4116
diff changeset
31 from kallithea.lib.utils2 import safe_unicode, MENTIONS_REGEX
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
32
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
33 log = logging.getLogger(__name__)
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
34
1996
0592987973eb activate codehilite extension on markdown renderer, inspired by bitbucket blog ;)
Marcin Kuzminski <marcin@python-works.com>
parents: 1824
diff changeset
35
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
36 class MarkupRenderer(object):
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
37 RESTRUCTUREDTEXT_DISALLOWED_DIRECTIVES = ['include', 'meta', 'raw']
1818
cf51bbfb120e auto white-space removal
Marcin Kuzminski <marcin@python-works.com>
parents: 1769
diff changeset
38
1996
0592987973eb activate codehilite extension on markdown renderer, inspired by bitbucket blog ;)
Marcin Kuzminski <marcin@python-works.com>
parents: 1824
diff changeset
39 MARKDOWN_PAT = re.compile(r'md|mkdn?|mdown|markdown', re.IGNORECASE)
0592987973eb activate codehilite extension on markdown renderer, inspired by bitbucket blog ;)
Marcin Kuzminski <marcin@python-works.com>
parents: 1824
diff changeset
40 RST_PAT = re.compile(r're?st', re.IGNORECASE)
0592987973eb activate codehilite extension on markdown renderer, inspired by bitbucket blog ;)
Marcin Kuzminski <marcin@python-works.com>
parents: 1824
diff changeset
41 PLAIN_PAT = re.compile(r'readme', re.IGNORECASE)
1818
cf51bbfb120e auto white-space removal
Marcin Kuzminski <marcin@python-works.com>
parents: 1769
diff changeset
42
4009
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
43 def _detect_renderer(self, source, filename=None):
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
44 """
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
45 runs detection of what renderer should be used for generating html
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
46 from a markup language
1818
cf51bbfb120e auto white-space removal
Marcin Kuzminski <marcin@python-works.com>
parents: 1769
diff changeset
47
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
48 filename can be also explicitly a renderer name
1818
cf51bbfb120e auto white-space removal
Marcin Kuzminski <marcin@python-works.com>
parents: 1769
diff changeset
49
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
50 :param source:
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
51 :param filename:
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
52 """
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
53
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
54 if MarkupRenderer.MARKDOWN_PAT.findall(filename):
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
55 detected_renderer = 'markdown'
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
56 elif MarkupRenderer.RST_PAT.findall(filename):
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
57 detected_renderer = 'rst'
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
58 elif MarkupRenderer.PLAIN_PAT.findall(filename):
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
59 detected_renderer = 'rst'
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
60 else:
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
61 detected_renderer = 'plain'
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
62
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
63 return getattr(MarkupRenderer, detected_renderer)
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
64
4009
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
65 @classmethod
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
66 def _flavored_markdown(cls, text):
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
67 """
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
68 Github style flavored markdown
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
69
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
70 :param text:
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
71 """
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
72 from hashlib import md5
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
73
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
74 # Extract pre blocks.
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
75 extractions = {}
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
76 def pre_extraction_callback(matchobj):
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
77 digest = md5(matchobj.group(0)).hexdigest()
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
78 extractions[digest] = matchobj.group(0)
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
79 return "{gfm-extraction-%s}" % digest
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
80 pattern = re.compile(r'<pre>.*?</pre>', re.MULTILINE | re.DOTALL)
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
81 text = re.sub(pattern, pre_extraction_callback, text)
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
82
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
83 # Prevent foo_bar_baz from ending up with an italic word in the middle.
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
84 def italic_callback(matchobj):
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
85 s = matchobj.group(0)
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
86 if list(s).count('_') >= 2:
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
87 return s.replace('_', '\_')
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
88 return s
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
89 text = re.sub(r'^(?! {4}|\t)\w+_\w+_\w[\w_]*', italic_callback, text)
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
90
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
91 # In very clear cases, let newlines become <br /> tags.
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
92 def newline_callback(matchobj):
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
93 if len(matchobj.group(1)) == 1:
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
94 return matchobj.group(0).rstrip() + ' \n'
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
95 else:
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
96 return matchobj.group(0)
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
97 pattern = re.compile(r'^[\w\<][^\n]*(\n+)', re.MULTILINE)
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
98 text = re.sub(pattern, newline_callback, text)
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
99
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
100 # Insert pre block extractions.
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
101 def pre_insert_callback(matchobj):
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
102 return '\n\n' + extractions[matchobj.group(1)]
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
103 text = re.sub(r'{gfm-extraction-([0-9a-f]{32})\}',
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
104 pre_insert_callback, text)
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
105
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
106 return text
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
107
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
108 def render(self, source, filename=None):
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
109 """
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
110 Renders a given filename using detected renderer
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
111 it detects renderers based on file extension or mimetype.
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
112 At last it will just do a simple html replacing new lines with <br/>
1818
cf51bbfb120e auto white-space removal
Marcin Kuzminski <marcin@python-works.com>
parents: 1769
diff changeset
113
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
114 :param file_name:
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
115 :param source:
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
116 """
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
117
4009
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
118 renderer = self._detect_renderer(source, filename)
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
119 readme_data = renderer(source)
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
120 return readme_data
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
121
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
122 @classmethod
4116
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
123 def plain(cls, source, universal_newline=True):
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
124 source = safe_unicode(source)
4116
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
125 if universal_newline:
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
126 newline = '\n'
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
127 source = newline.join(source.splitlines())
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
128 def urlify_text(text):
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
129 url_pat = re.compile(r'(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]'
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
130 '|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)')
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
131
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
132 def url_func(match_obj):
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
133 url_full = match_obj.groups()[0]
1996
0592987973eb activate codehilite extension on markdown renderer, inspired by bitbucket blog ;)
Marcin Kuzminski <marcin@python-works.com>
parents: 1824
diff changeset
134 return '<a href="%(url)s">%(url)s</a>' % ({'url': url_full})
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
135
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
136 return url_pat.sub(url_func, text)
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
137
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
138 source = urlify_text(source)
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
139 return '<br />' + source.replace("\n", '<br />')
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
140
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
141 @classmethod
4009
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
142 def markdown(cls, source, safe=True, flavored=False):
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
143 source = safe_unicode(source)
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
144 try:
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
145 import markdown as __markdown
4009
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
146 if flavored:
7563624e712c Added github flavored markdown style rendering into markdown
Marcin Kuzminski <marcin@python-works.com>
parents: 3164
diff changeset
147 source = cls._flavored_markdown(source)
3164
01cb7df198ae Enable all Markdown Extra in Python markdown library.
xpol <xpolife@gmail.com>
parents: 3019
diff changeset
148 return __markdown.markdown(source, ['codehilite', 'extra'])
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
149 except ImportError:
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
150 log.warning('Install markdown to use this function')
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
151 return cls.plain(source)
2747
cdce3d7282b2 catch errors on renderers, and display plain if critical rendering error is present
Marcin Kuzminski <marcin@python-works.com>
parents: 2201
diff changeset
152 except Exception:
cdce3d7282b2 catch errors on renderers, and display plain if critical rendering error is present
Marcin Kuzminski <marcin@python-works.com>
parents: 2201
diff changeset
153 log.error(traceback.format_exc())
cdce3d7282b2 catch errors on renderers, and display plain if critical rendering error is present
Marcin Kuzminski <marcin@python-works.com>
parents: 2201
diff changeset
154 if safe:
4116
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
155 log.debug('Fallbacking to render in plain mode')
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
156 return cls.plain(source)
2747
cdce3d7282b2 catch errors on renderers, and display plain if critical rendering error is present
Marcin Kuzminski <marcin@python-works.com>
parents: 2201
diff changeset
157 else:
cdce3d7282b2 catch errors on renderers, and display plain if critical rendering error is present
Marcin Kuzminski <marcin@python-works.com>
parents: 2201
diff changeset
158 raise
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
159
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
160 @classmethod
2747
cdce3d7282b2 catch errors on renderers, and display plain if critical rendering error is present
Marcin Kuzminski <marcin@python-works.com>
parents: 2201
diff changeset
161 def rst(cls, source, safe=True):
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
162 source = safe_unicode(source)
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
163 try:
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
164 from docutils.core import publish_parts
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
165 from docutils.parsers.rst import directives
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
166 docutils_settings = dict([(alias, None) for alias in
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
167 cls.RESTRUCTUREDTEXT_DISALLOWED_DIRECTIVES])
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
168
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
169 docutils_settings.update({'input_encoding': 'unicode',
1996
0592987973eb activate codehilite extension on markdown renderer, inspired by bitbucket blog ;)
Marcin Kuzminski <marcin@python-works.com>
parents: 1824
diff changeset
170 'report_level': 4})
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
171
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
172 for k, v in docutils_settings.iteritems():
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
173 directives.register_directive(k, v)
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
174
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
175 parts = publish_parts(source=source,
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
176 writer_name="html4css1",
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
177 settings_overrides=docutils_settings)
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
178
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
179 return parts['html_title'] + parts["fragment"]
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
180 except ImportError:
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
181 log.warning('Install docutils to use this function')
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
182 return cls.plain(source)
2747
cdce3d7282b2 catch errors on renderers, and display plain if critical rendering error is present
Marcin Kuzminski <marcin@python-works.com>
parents: 2201
diff changeset
183 except Exception:
cdce3d7282b2 catch errors on renderers, and display plain if critical rendering error is present
Marcin Kuzminski <marcin@python-works.com>
parents: 2201
diff changeset
184 log.error(traceback.format_exc())
cdce3d7282b2 catch errors on renderers, and display plain if critical rendering error is present
Marcin Kuzminski <marcin@python-works.com>
parents: 2201
diff changeset
185 if safe:
4116
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
186 log.debug('Fallbacking to render in plain mode')
ffd45b185016 Imported some of the GPLv3'd changes from RhodeCode v2.2.5.
Bradley M. Kuhn <bkuhn@sfconservancy.org>
parents: 4009
diff changeset
187 return cls.plain(source)
2747
cdce3d7282b2 catch errors on renderers, and display plain if critical rendering error is present
Marcin Kuzminski <marcin@python-works.com>
parents: 2201
diff changeset
188 else:
cdce3d7282b2 catch errors on renderers, and display plain if critical rendering error is present
Marcin Kuzminski <marcin@python-works.com>
parents: 2201
diff changeset
189 raise
1604
bb3c2111bf92 initial version of markup renderer
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
190
1769
025f3333c769 @mention highlighting
Marcin Kuzminski <marcin@python-works.com>
parents: 1604
diff changeset
191 @classmethod
025f3333c769 @mention highlighting
Marcin Kuzminski <marcin@python-works.com>
parents: 1604
diff changeset
192 def rst_with_mentions(cls, source):
2201
ea5ff843b200 #426 fixed mention extracting regex
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
193 mention_pat = re.compile(MENTIONS_REGEX)
1818
cf51bbfb120e auto white-space removal
Marcin Kuzminski <marcin@python-works.com>
parents: 1769
diff changeset
194
1769
025f3333c769 @mention highlighting
Marcin Kuzminski <marcin@python-works.com>
parents: 1604
diff changeset
195 def wrapp(match_obj):
025f3333c769 @mention highlighting
Marcin Kuzminski <marcin@python-works.com>
parents: 1604
diff changeset
196 uname = match_obj.groups()[0]
2201
ea5ff843b200 #426 fixed mention extracting regex
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
197 return ' **@%(uname)s** ' % {'uname': uname}
1769
025f3333c769 @mention highlighting
Marcin Kuzminski <marcin@python-works.com>
parents: 1604
diff changeset
198 mention_hl = mention_pat.sub(wrapp, source).strip()
025f3333c769 @mention highlighting
Marcin Kuzminski <marcin@python-works.com>
parents: 1604
diff changeset
199 return cls.rst(mention_hl)