##// END OF EJS Templates
Starting a new branch. Added protocol description
Starting a new branch. Added protocol description

File last commit:

r755:8eb55ab8 default
r758:2a649214 decentral
Show More
mdx_neboard.py
178 lines | 3.9 KiB | text/x-python | PythonLexer
# coding=utf-8
import re
import bbcode
import boards
__author__ = 'neko259'
REFLINK_PATTERN = re.compile(r'\d+')
MULTI_NEWLINES_PATTERN = re.compile(r'(\r?\n){2,}')
ONE_NEWLINE = '\n'
class TextFormatter():
"""
An interface for formatter that can be used in the text format panel
"""
def __init__(self):
pass
name = ''
# Left and right tags for the button preview
preview_left = ''
preview_right = ''
# Left and right characters for the textarea input
format_left = ''
format_right = ''
class AutolinkPattern():
def handleMatch(self, m):
link_element = etree.Element('a')
href = m.group(2)
link_element.set('href', href)
link_element.text = href
return link_element
class QuotePattern(TextFormatter):
name = 'q'
preview_left = '<span class="multiquote">'
preview_right = '</span>'
format_left = '[quote]'
format_right = '[/quote]'
class SpoilerPattern(TextFormatter):
name = 'spoiler'
preview_left = '<span class="spoiler">'
preview_right = '</span>'
format_left = '[spoiler]'
format_right = '[/spoiler]'
def handleMatch(self, m):
quote_element = etree.Element('span')
quote_element.set('class', 'spoiler')
quote_element.text = m.group(2)
return quote_element
class CommentPattern(TextFormatter):
name = ''
preview_left = '<span class="comment">// '
preview_right = '</span>'
format_left = '[comment]'
format_right = '[/comment]'
# TODO Use <s> tag here
class StrikeThroughPattern(TextFormatter):
name = 's'
preview_left = '<span class="strikethrough">'
preview_right = '</span>'
format_left = '[s]'
format_right = '[/s]'
class ItalicPattern(TextFormatter):
name = 'i'
preview_left = '<i>'
preview_right = '</i>'
format_left = '[i]'
format_right = '[/i]'
class BoldPattern(TextFormatter):
name = 'b'
preview_left = '<b>'
preview_right = '</b>'
format_left = '[b]'
format_right = '[/b]'
class CodePattern(TextFormatter):
name = 'code'
preview_left = '<code>'
preview_right = '</code>'
format_left = '[code]'
format_right = '[/code]'
def render_reflink(tag_name, value, options, parent, context):
if not REFLINK_PATTERN.match(value):
return u'>>%s' % value
post_id = int(value)
posts = boards.models.Post.objects.filter(id=post_id)
if posts.exists():
post = posts[0]
return u'<a href=%s>&gt;&gt;%s</a>' % (post.get_url(), post_id)
else:
return u'>>%s' % value
def render_quote(tag_name, value, options, parent, context):
source = u''
if 'source' in options:
source = options['source']
result = u''
if source:
result = u'<div class="multiquote"><div class="quote-header">%s</div><div class="quote-text">%s</div></div>' % (source, value)
else:
result = u'<div class="multiquote"><div class="quote-text">%s</div></div>' % value
return result
def preparse_text(text):
"""
Performs manual parsing before the bbcode parser is used.
"""
return MULTI_NEWLINES_PATTERN.sub(ONE_NEWLINE, text)
def bbcode_extended(markup):
parser = bbcode.Parser()
parser.add_formatter('post', render_reflink, strip=True)
parser.add_formatter('quote', render_quote, strip=True)
parser.add_simple_formatter('comment',
u'<span class="comment">//%(value)s</span>')
parser.add_simple_formatter('spoiler',
u'<span class="spoiler">%(value)s</span>')
parser.add_simple_formatter('s',
u'<span class="strikethrough">%(value)s</span>')
parser.add_simple_formatter('code',
u'<pre><code>%(value)s</pre></code>')
text = preparse_text(markup)
return parser.format(text)
formatters = [
QuotePattern,
SpoilerPattern,
ItalicPattern,
BoldPattern,
CommentPattern,
StrikeThroughPattern,
CodePattern,
]