##// END OF EJS Templates
Don't use <p> tags in parsing because the tag cannot be closed inside a tag to...
neko259 -
r750:fa59c3d1 default
parent child Browse files
Show More
@@ -1,152 +1,152 b''
1 1 # coding=utf-8
2 2
3 3 import re
4 4 import bbcode
5 5
6 6 import boards
7 7
8 8
9 9 __author__ = 'neko259'
10 10
11 11
12 12 REFLINK_PATTERN = re.compile(r'\d+')
13 13
14 14
15 15 class TextFormatter():
16 16 """
17 17 An interface for formatter that can be used in the text format panel
18 18 """
19 19
20 20 def __init__(self):
21 21 pass
22 22
23 23 name = ''
24 24
25 25 # Left and right tags for the button preview
26 26 preview_left = ''
27 27 preview_right = ''
28 28
29 29 # Left and right characters for the textarea input
30 30 format_left = ''
31 31 format_right = ''
32 32
33 33
34 34 class AutolinkPattern():
35 35 def handleMatch(self, m):
36 36 link_element = etree.Element('a')
37 37 href = m.group(2)
38 38 link_element.set('href', href)
39 39 link_element.text = href
40 40
41 41 return link_element
42 42
43 43
44 44 class QuotePattern(TextFormatter):
45 45 name = 'q'
46 46 preview_left = '<span class="multiquote">'
47 47 preview_right = '</span>'
48 48
49 49 format_left = '[quote]'
50 50 format_right = '[/quote]'
51 51
52 52
53 53 class SpoilerPattern(TextFormatter):
54 54 name = 'spoiler'
55 55 preview_left = '<span class="spoiler">'
56 56 preview_right = '</span>'
57 57
58 58 format_left = '[spoiler]'
59 59 format_right = '[/spoiler]'
60 60
61 61 def handleMatch(self, m):
62 62 quote_element = etree.Element('span')
63 63 quote_element.set('class', 'spoiler')
64 64 quote_element.text = m.group(2)
65 65
66 66 return quote_element
67 67
68 68
69 69 class CommentPattern(TextFormatter):
70 70 name = ''
71 71 preview_left = '<span class="comment">// '
72 72 preview_right = '</span>'
73 73
74 74 format_left = '[comment]'
75 75 format_right = '[/comment]'
76 76
77 77
78 78 class StrikeThroughPattern(TextFormatter):
79 79 name = 's'
80 80 preview_left = '<span class="strikethrough">'
81 81 preview_right = '</span>'
82 82
83 83 format_left = '[s]'
84 84 format_right = '[/s]'
85 85
86 86
87 87 class ItalicPattern(TextFormatter):
88 88 name = 'i'
89 89 preview_left = '<i>'
90 90 preview_right = '</i>'
91 91
92 92 format_left = '[i]'
93 93 format_right = '[/i]'
94 94
95 95
96 96 class BoldPattern(TextFormatter):
97 97 name = 'b'
98 98 preview_left = '<b>'
99 99 preview_right = '</b>'
100 100
101 101 format_left = '[b]'
102 102 format_right = '[/b]'
103 103
104 104
105 105 class CodePattern(TextFormatter):
106 106 name = 'code'
107 107 preview_left = '<code>'
108 108 preview_right = '</code>'
109 109
110 110 format_left = '[code]'
111 111 format_right = '[/code]'
112 112
113 113
114 114 def render_reflink(tag_name, value, options, parent, context):
115 115 if not REFLINK_PATTERN.match(value):
116 116 return u'>>%s' % value
117 117
118 118 post_id = int(value)
119 119
120 120 posts = boards.models.Post.objects.filter(id=post_id)
121 121 if posts.exists():
122 122 post = posts[0]
123 123
124 124 return u'<a href=%s>&gt;&gt;%s</a>' % (post.get_url(), post_id)
125 125 else:
126 126 return u'>>%s' % value
127 127
128 128
129 129 def bbcode_extended(markup):
130 parser = bbcode.Parser(newline='</p><p>')
130 parser = bbcode.Parser()
131 131 parser.add_formatter('post', render_reflink, strip=True)
132 132 parser.add_simple_formatter('quote',
133 133 u'<span class="multiquote">%(value)s</span>')
134 134 parser.add_simple_formatter('comment',
135 135 u'<span class="comment">//%(value)s</span>')
136 136 parser.add_simple_formatter('spoiler',
137 137 u'<span class="spoiler">%(value)s</span>')
138 138 parser.add_simple_formatter('s',
139 139 u'<span class="strikethrough">%(value)s</span>')
140 140 parser.add_simple_formatter('code',
141 141 u'<pre><code>%(value)s</pre></code>')
142 return '<p>%s</p>' % parser.format(markup)
142 return parser.format(markup)
143 143
144 144 formatters = [
145 145 QuotePattern,
146 146 SpoilerPattern,
147 147 ItalicPattern,
148 148 BoldPattern,
149 149 CommentPattern,
150 150 StrikeThroughPattern,
151 151 CodePattern,
152 152 ]
@@ -1,440 +1,440 b''
1 1 html {
2 2 background: #555;
3 3 color: #ffffff;
4 4 }
5 5
6 6 body {
7 7 margin: 0;
8 8 }
9 9
10 10 #admin_panel {
11 11 background: #FF0000;
12 12 color: #00FF00
13 13 }
14 14
15 15 .input_field_error {
16 16 color: #FF0000;
17 17 }
18 18
19 19 .title {
20 20 font-weight: bold;
21 21 color: #ffcc00;
22 22 }
23 23
24 24 .link, a {
25 25 color: #afdcec;
26 26 }
27 27
28 28 .block {
29 29 display: inline-block;
30 30 vertical-align: top;
31 31 }
32 32
33 33 .tag {
34 34 color: #FFD37D;
35 35 }
36 36
37 37 .post_id {
38 38 color: #fff380;
39 39 }
40 40
41 41 .post, .dead_post, .archive_post, #posts-table {
42 42 background: #333;
43 43 padding: 10px;
44 44 clear: left;
45 45 word-wrap: break-word;
46 46 border-top: 1px solid #777;
47 47 border-bottom: 1px solid #777;
48 48 }
49 49
50 50 .post + .post {
51 51 border-top: none;
52 52 }
53 53
54 54 .dead_post + .dead_post {
55 55 border-top: none;
56 56 }
57 57
58 58 .archive_post + .archive_post {
59 59 border-top: none;
60 60 }
61 61
62 62 .metadata {
63 63 padding-top: 5px;
64 64 margin-top: 10px;
65 65 border-top: solid 1px #666;
66 66 color: #ddd;
67 67 }
68 68
69 69 .navigation_panel, .tag_info {
70 70 background: #444;
71 71 margin-bottom: 5px;
72 72 margin-top: 5px;
73 73 padding: 10px;
74 74 border-bottom: solid 1px #888;
75 75 border-top: solid 1px #888;
76 76 color: #eee;
77 77 }
78 78
79 79 .navigation_panel .link {
80 80 border-right: 1px solid #fff;
81 81 font-weight: bold;
82 82 margin-right: 1ex;
83 83 padding-right: 1ex;
84 84 }
85 85 .navigation_panel .link:last-child {
86 86 border-left: 1px solid #fff;
87 87 border-right: none;
88 88 float: right;
89 89 margin-left: 1ex;
90 90 margin-right: 0;
91 91 padding-left: 1ex;
92 92 padding-right: 0;
93 93 }
94 94
95 95 .navigation_panel::after, .post::after {
96 96 clear: both;
97 97 content: ".";
98 98 display: block;
99 99 height: 0;
100 100 line-height: 0;
101 101 visibility: hidden;
102 102 }
103 103
104 p {
104 p, br {
105 105 margin-top: .5em;
106 106 margin-bottom: .5em;
107 107 }
108 108
109 109 .post-form-w {
110 110 background: #333344;
111 111 border-top: solid 1px #888;
112 112 border-bottom: solid 1px #888;
113 113 color: #fff;
114 114 padding: 10px;
115 115 margin-bottom: 5px;
116 116 margin-top: 5px;
117 117 }
118 118
119 119 .form-row {
120 120 width: 100%;
121 121 }
122 122
123 123 .form-label {
124 124 padding: .25em 1ex .25em 0;
125 125 vertical-align: top;
126 126 }
127 127
128 128 .form-input {
129 129 padding: .25em 0;
130 130 }
131 131
132 132 .form-errors {
133 133 font-weight: bolder;
134 134 vertical-align: middle;
135 135 }
136 136
137 137 .post-form input:not([name="image"]), .post-form textarea {
138 138 background: #333;
139 139 color: #fff;
140 140 border: solid 1px;
141 141 padding: 0;
142 142 font: medium sans-serif;
143 143 width: 100%;
144 144 }
145 145
146 146 .form-submit {
147 147 display: table;
148 148 margin-bottom: 1ex;
149 149 margin-top: 1ex;
150 150 }
151 151
152 152 .form-title {
153 153 font-weight: bold;
154 154 font-size: 2ex;
155 155 margin-bottom: 0.5ex;
156 156 }
157 157
158 158 .post-form input[type="submit"], input[type="submit"] {
159 159 background: #222;
160 160 border: solid 2px #fff;
161 161 color: #fff;
162 162 padding: 0.5ex;
163 163 }
164 164
165 165 input[type="submit"]:hover {
166 166 background: #060;
167 167 }
168 168
169 169 blockquote {
170 170 border-left: solid 2px;
171 171 padding-left: 5px;
172 172 color: #B1FB17;
173 173 margin: 0;
174 174 }
175 175
176 176 .post > .image {
177 177 float: left;
178 178 margin: 0 1ex .5ex 0;
179 179 min-width: 1px;
180 180 text-align: center;
181 181 display: table-row;
182 182 }
183 183
184 184 .post > .metadata {
185 185 clear: left;
186 186 }
187 187
188 188 .get {
189 189 font-weight: bold;
190 190 color: #d55;
191 191 }
192 192
193 193 * {
194 194 text-decoration: none;
195 195 }
196 196
197 197 .dead_post {
198 198 background-color: #442222;
199 199 }
200 200
201 201 .archive_post {
202 202 background-color: #000;
203 203 }
204 204
205 205 .mark_btn {
206 206 border: 1px solid;
207 207 min-width: 2ex;
208 208 padding: 2px 2ex;
209 209 }
210 210
211 211 .mark_btn:hover {
212 212 background: #555;
213 213 }
214 214
215 215 .quote {
216 216 color: #92cf38;
217 217 font-style: italic;
218 218 }
219 219
220 220 .multiquote {
221 221 border-left: solid 4px #ccc;
222 222 padding: 3px;
223 223 display: inline-block;
224 224 background: #222;
225 225 border-right: solid 1px #ccc;
226 226 border-top: solid 1px #ccc;
227 227 border-bottom: solid 1px #ccc;
228 228 }
229 229
230 230 .spoiler {
231 231 background: white;
232 232 color: white;
233 233 }
234 234
235 235 .spoiler:hover {
236 236 color: black;
237 237 }
238 238
239 239 .comment {
240 240 color: #eb2;
241 241 }
242 242
243 243 a:hover {
244 244 text-decoration: underline;
245 245 }
246 246
247 247 .last-replies {
248 248 margin-left: 3ex;
249 249 margin-right: 3ex;
250 250 }
251 251
252 252 .thread {
253 253 margin-bottom: 3ex;
254 254 margin-top: 1ex;
255 255 }
256 256
257 257 .post:target {
258 258 border: solid 2px white;
259 259 }
260 260
261 261 pre{
262 262 white-space:pre-wrap
263 263 }
264 264
265 265 li {
266 266 list-style-position: inside;
267 267 }
268 268
269 269 .fancybox-skin {
270 270 position: relative;
271 271 background-color: #fff;
272 272 color: #ddd;
273 273 text-shadow: none;
274 274 }
275 275
276 276 .fancybox-image {
277 277 border: 1px solid black;
278 278 }
279 279
280 280 .image-mode-tab {
281 281 background: #444;
282 282 color: #eee;
283 283 margin-top: 5px;
284 284 padding: 5px;
285 285 border-top: 1px solid #888;
286 286 border-bottom: 1px solid #888;
287 287 }
288 288
289 289 .image-mode-tab > label {
290 290 margin: 0 1ex;
291 291 }
292 292
293 293 .image-mode-tab > label > input {
294 294 margin-right: .5ex;
295 295 }
296 296
297 297 #posts-table {
298 298 margin-top: 5px;
299 299 margin-bottom: 5px;
300 300 }
301 301
302 302 .tag_info > h2 {
303 303 margin: 0;
304 304 }
305 305
306 306 .post-info {
307 307 color: #ddd;
308 308 margin-bottom: 1ex;
309 309 }
310 310
311 311 .moderator_info {
312 312 color: #e99d41;
313 313 float: right;
314 314 font-weight: bold;
315 315 }
316 316
317 317 .refmap {
318 318 font-size: 0.9em;
319 319 color: #ccc;
320 320 margin-top: 1em;
321 321 }
322 322
323 323 .fav {
324 324 color: yellow;
325 325 }
326 326
327 327 .not_fav {
328 328 color: #ccc;
329 329 }
330 330
331 331 .role {
332 332 text-decoration: underline;
333 333 }
334 334
335 335 .form-email {
336 336 display: none;
337 337 }
338 338
339 339 .footer {
340 340 margin: 5px;
341 341 }
342 342
343 343 .bar-value {
344 344 background: rgba(50, 55, 164, 0.45);
345 345 font-size: 0.9em;
346 346 height: 1.5em;
347 347 }
348 348
349 349 .bar-bg {
350 350 position: relative;
351 351 border-top: solid 1px #888;
352 352 border-bottom: solid 1px #888;
353 353 margin-top: 5px;
354 354 overflow: hidden;
355 355 }
356 356
357 357 .bar-text {
358 358 padding: 2px;
359 359 position: absolute;
360 360 left: 0;
361 361 top: 0;
362 362 }
363 363
364 364 .page_link {
365 365 background: #444;
366 366 border-top: solid 1px #888;
367 367 border-bottom: solid 1px #888;
368 368 padding: 5px;
369 369 color: #eee;
370 370 font-size: 2ex;
371 371 }
372 372
373 373 .skipped_replies {
374 374 margin: 5px;
375 375 }
376 376
377 377 .current_page {
378 378 border: solid 1px #afdcec;
379 379 padding: 2px;
380 380 }
381 381
382 382 .current_mode {
383 383 font-weight: bold;
384 384 }
385 385
386 386 .gallery_image {
387 387 border: solid 1px;
388 388 padding: 0.5ex;
389 389 margin: 0.5ex;
390 390 text-align: center;
391 391 }
392 392
393 393 code {
394 394 border: dashed 1px #ccc;
395 395 background: #111;
396 396 padding: 2px;
397 397 font-size: 1.2em;
398 398 display: inline-block;
399 399 }
400 400
401 401 pre {
402 402 overflow: auto;
403 403 }
404 404
405 405 .img-full {
406 406 background: #222;
407 407 border: solid 1px white;
408 408 }
409 409
410 410 .tag_item {
411 411 display: inline-block;
412 412 border: 1px dashed #666;
413 413 margin: 0.2ex;
414 414 padding: 0.1ex;
415 415 }
416 416
417 417 #id_models li {
418 418 list-style: none;
419 419 }
420 420
421 421 #id_q {
422 422 margin-left: 1ex;
423 423 }
424 424
425 425 ul {
426 426 padding-left: 0px;
427 427 }
428 428
429 429 /* Reflink preview */
430 430 .post_preview {
431 431 border-left: 1px solid #777;
432 432 border-right: 1px solid #777;
433 433 }
434 434
435 435 /* Code highlighter */
436 436 .hljs {
437 437 color: #fff;
438 438 background: #000;
439 439 display: inline-block;
440 440 }
General Comments 0
You need to be logged in to leave comments. Login now