##// END OF EJS Templates
Escaping HTML in posts.
neko259 -
r654:e2e8ade3 default
parent child Browse files
Show More
@@ -1,192 +1,192 b''
1 import markdown
1 import markdown
2 from markdown.inlinepatterns import Pattern, SubstituteTagPattern
2 from markdown.inlinepatterns import Pattern, SubstituteTagPattern
3 from markdown.util import etree
3 from markdown.util import etree
4 import boards
4 import boards
5
5
6 __author__ = 'neko259'
6 __author__ = 'neko259'
7
7
8
8
9 AUTOLINK_PATTERN = r'(https?://\S+)'
9 AUTOLINK_PATTERN = r'(https?://\S+)'
10 QUOTE_PATTERN = r'^(?<!>)(>[^>].*)$'
10 QUOTE_PATTERN = r'^(?<!>)(>[^>].*)$'
11 REFLINK_PATTERN = r'((>>)(\d+))'
11 REFLINK_PATTERN = r'((>>)(\d+))'
12 SPOILER_PATTERN = r'%%([^(%%)]+)%%'
12 SPOILER_PATTERN = r'%%([^(%%)]+)%%'
13 COMMENT_PATTERN = r'^(//(.+))'
13 COMMENT_PATTERN = r'^(//(.+))'
14 STRIKETHROUGH_PATTERN = r'~(.+)~'
14 STRIKETHROUGH_PATTERN = r'~(.+)~'
15
15
16
16
17 class TextFormatter():
17 class TextFormatter():
18 """
18 """
19 An interface for formatter that can be used in the text format panel
19 An interface for formatter that can be used in the text format panel
20 """
20 """
21
21
22 name = ''
22 name = ''
23
23
24 # Left and right tags for the button preview
24 # Left and right tags for the button preview
25 preview_left = ''
25 preview_left = ''
26 preview_right = ''
26 preview_right = ''
27
27
28 # Left and right characters for the textarea input
28 # Left and right characters for the textarea input
29 format_left = ''
29 format_left = ''
30 format_right = ''
30 format_right = ''
31
31
32
32
33 class AutolinkPattern(Pattern):
33 class AutolinkPattern(Pattern):
34 def handleMatch(self, m):
34 def handleMatch(self, m):
35 link_element = etree.Element('a')
35 link_element = etree.Element('a')
36 href = m.group(2)
36 href = m.group(2)
37 link_element.set('href', href)
37 link_element.set('href', href)
38 link_element.text = href
38 link_element.text = href
39
39
40 return link_element
40 return link_element
41
41
42
42
43 class QuotePattern(Pattern, TextFormatter):
43 class QuotePattern(Pattern, TextFormatter):
44 name = ''
44 name = ''
45 preview_left = '<span class="quote">&gt; '
45 preview_left = '<span class="quote">&gt; '
46 preview_right = '</span>'
46 preview_right = '</span>'
47
47
48 format_left = '&gt;'
48 format_left = '&gt;'
49
49
50 def handleMatch(self, m):
50 def handleMatch(self, m):
51 quote_element = etree.Element('span')
51 quote_element = etree.Element('span')
52 quote_element.set('class', 'quote')
52 quote_element.set('class', 'quote')
53 quote_element.text = m.group(2)
53 quote_element.text = m.group(2)
54
54
55 return quote_element
55 return quote_element
56
56
57
57
58 class ReflinkPattern(Pattern):
58 class ReflinkPattern(Pattern):
59 def handleMatch(self, m):
59 def handleMatch(self, m):
60 post_id = m.group(4)
60 post_id = m.group(4)
61
61
62 posts = boards.models.Post.objects.filter(id=post_id)
62 posts = boards.models.Post.objects.filter(id=post_id)
63 if posts.count() > 0:
63 if posts.count() > 0:
64 ref_element = etree.Element('a')
64 ref_element = etree.Element('a')
65
65
66 post = posts[0]
66 post = posts[0]
67
67
68 ref_element.set('href', post.get_url())
68 ref_element.set('href', post.get_url())
69 ref_element.text = m.group(2)
69 ref_element.text = m.group(2)
70
70
71 return ref_element
71 return ref_element
72
72
73
73
74 class SpoilerPattern(Pattern, TextFormatter):
74 class SpoilerPattern(Pattern, TextFormatter):
75 name = 's'
75 name = 's'
76 preview_left = '<span class="spoiler">'
76 preview_left = '<span class="spoiler">'
77 preview_right = '</span>'
77 preview_right = '</span>'
78
78
79 format_left = '%%'
79 format_left = '%%'
80 format_right = '%%'
80 format_right = '%%'
81
81
82 def handleMatch(self, m):
82 def handleMatch(self, m):
83 quote_element = etree.Element('span')
83 quote_element = etree.Element('span')
84 quote_element.set('class', 'spoiler')
84 quote_element.set('class', 'spoiler')
85 quote_element.text = m.group(2)
85 quote_element.text = m.group(2)
86
86
87 return quote_element
87 return quote_element
88
88
89
89
90 class CommentPattern(Pattern, TextFormatter):
90 class CommentPattern(Pattern, TextFormatter):
91 name = ''
91 name = ''
92 preview_left = '<span class="comment">// '
92 preview_left = '<span class="comment">// '
93 preview_right = '</span>'
93 preview_right = '</span>'
94
94
95 format_left = '//'
95 format_left = '//'
96
96
97 def handleMatch(self, m):
97 def handleMatch(self, m):
98 quote_element = etree.Element('span')
98 quote_element = etree.Element('span')
99 quote_element.set('class', 'comment')
99 quote_element.set('class', 'comment')
100 quote_element.text = '//' + m.group(3)
100 quote_element.text = '//' + m.group(3)
101
101
102 return quote_element
102 return quote_element
103
103
104
104
105 class StrikeThroughPattern(Pattern, TextFormatter):
105 class StrikeThroughPattern(Pattern, TextFormatter):
106 name = 's'
106 name = 's'
107 preview_left = '<span class="strikethrough">'
107 preview_left = '<span class="strikethrough">'
108 preview_right = '</span>'
108 preview_right = '</span>'
109
109
110 format_left = '~'
110 format_left = '~'
111 format_right = '~'
111 format_right = '~'
112
112
113 def handleMatch(self, m):
113 def handleMatch(self, m):
114 quote_element = etree.Element('span')
114 quote_element = etree.Element('span')
115 quote_element.set('class', 'strikethrough')
115 quote_element.set('class', 'strikethrough')
116 quote_element.text = m.group(2)
116 quote_element.text = m.group(2)
117
117
118 return quote_element
118 return quote_element
119
119
120
120
121 class ItalicPattern(TextFormatter):
121 class ItalicPattern(TextFormatter):
122 name = 'i'
122 name = 'i'
123 preview_left = '<i>'
123 preview_left = '<i>'
124 preview_right = '</i>'
124 preview_right = '</i>'
125
125
126 format_left = '_'
126 format_left = '_'
127 format_right = '_'
127 format_right = '_'
128
128
129
129
130 class BoldPattern(TextFormatter):
130 class BoldPattern(TextFormatter):
131 name = 'b'
131 name = 'b'
132 preview_left = '<b>'
132 preview_left = '<b>'
133 preview_right = '</b>'
133 preview_right = '</b>'
134
134
135 format_left = '__'
135 format_left = '__'
136 format_right = '__'
136 format_right = '__'
137
137
138
138
139 class CodePattern(TextFormatter):
139 class CodePattern(TextFormatter):
140 name = 'code'
140 name = 'code'
141 preview_left = '<code>'
141 preview_left = '<code>'
142 preview_right = '</code>'
142 preview_right = '</code>'
143
143
144 format_left = ' '
144 format_left = ' '
145
145
146
146
147 class NeboardMarkdown(markdown.Extension):
147 class NeboardMarkdown(markdown.Extension):
148 def extendMarkdown(self, md, md_globals):
148 def extendMarkdown(self, md, md_globals):
149 self._add_neboard_patterns(md)
149 self._add_neboard_patterns(md)
150 self._delete_patterns(md)
150 self._delete_patterns(md)
151
151
152 def _delete_patterns(self, md):
152 def _delete_patterns(self, md):
153 del md.parser.blockprocessors['quote']
153 del md.parser.blockprocessors['quote']
154
154
155 del md.inlinePatterns['image_link']
155 del md.inlinePatterns['image_link']
156 del md.inlinePatterns['image_reference']
156 del md.inlinePatterns['image_reference']
157
157
158 def _add_neboard_patterns(self, md):
158 def _add_neboard_patterns(self, md):
159 autolink = AutolinkPattern(AUTOLINK_PATTERN, md)
159 autolink = AutolinkPattern(AUTOLINK_PATTERN, md)
160 quote = QuotePattern(QUOTE_PATTERN, md)
160 quote = QuotePattern(QUOTE_PATTERN, md)
161 reflink = ReflinkPattern(REFLINK_PATTERN, md)
161 reflink = ReflinkPattern(REFLINK_PATTERN, md)
162 spoiler = SpoilerPattern(SPOILER_PATTERN, md)
162 spoiler = SpoilerPattern(SPOILER_PATTERN, md)
163 comment = CommentPattern(COMMENT_PATTERN, md)
163 comment = CommentPattern(COMMENT_PATTERN, md)
164 strikethrough = StrikeThroughPattern(STRIKETHROUGH_PATTERN, md)
164 strikethrough = StrikeThroughPattern(STRIKETHROUGH_PATTERN, md)
165
165
166 md.inlinePatterns[u'autolink_ext'] = autolink
166 md.inlinePatterns[u'autolink_ext'] = autolink
167 md.inlinePatterns[u'spoiler'] = spoiler
167 md.inlinePatterns[u'spoiler'] = spoiler
168 md.inlinePatterns[u'strikethrough'] = strikethrough
168 md.inlinePatterns[u'strikethrough'] = strikethrough
169 md.inlinePatterns[u'comment'] = comment
169 md.inlinePatterns[u'comment'] = comment
170 md.inlinePatterns[u'reflink'] = reflink
170 md.inlinePatterns[u'reflink'] = reflink
171 md.inlinePatterns[u'quote'] = quote
171 md.inlinePatterns[u'quote'] = quote
172
172
173
173
174 def make_extension(configs=None):
174 def make_extension(configs=None):
175 return NeboardMarkdown(configs=configs)
175 return NeboardMarkdown(configs=configs)
176
176
177 neboard_extension = make_extension()
177 neboard_extension = make_extension()
178
178
179
179
180 def markdown_extended(markup):
180 def markdown_extended(markup):
181 return markdown.markdown(markup, [neboard_extension, 'nl2br'],
181 return markdown.markdown(markup, [neboard_extension, 'nl2br'],
182 safe_mode=True)
182 safe_mode='escape')
183
183
184 formatters = [
184 formatters = [
185 QuotePattern,
185 QuotePattern,
186 SpoilerPattern,
186 SpoilerPattern,
187 ItalicPattern,
187 ItalicPattern,
188 BoldPattern,
188 BoldPattern,
189 CommentPattern,
189 CommentPattern,
190 StrikeThroughPattern,
190 StrikeThroughPattern,
191 CodePattern,
191 CodePattern,
192 ]
192 ]
General Comments 0
You need to be logged in to leave comments. Login now