##// END OF EJS Templates
Added test for reflinks. Added management command to get posts from other node...
Added test for reflinks. Added management command to get posts from other node (incomplete). Added ability to parse global reflinks in the text

File last commit:

r841:c295c39c decentral
r841:c295c39c decentral
Show More
mdx_neboard.py
201 lines | 4.8 KiB | text/x-python | PythonLexer
# coding=utf-8
import re
import bbcode
import boards
__author__ = 'neko259'
REFLINK_PATTERN = re.compile(r'^\d+$')
GLOBAL_REFLINK_PATTERN = re.compile(r'^(\w+)::([^:]+)::(\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):
post_id = None
matches = REFLINK_PATTERN.findall(value)
if matches:
post_id = int(matches[0][0])
else:
match = GLOBAL_REFLINK_PATTERN.match(value)
if match:
key_type = match.group(1)
key = match.group(2)
local_id = match.group(3)
try:
global_id = boards.models.GlobalId.objects.get(key_type=key_type,
key=key, local_id=local_id)
for post in boards.models.Post.objects.filter(global_id=global_id).only('id'):
post_id = post.id
except boards.models.GlobalId.DoesNotExist:
pass
if not post_id:
return value
posts = boards.models.Post.objects.filter(id=post_id)
if posts.exists():
post = posts[0]
return '<a href="%s">&gt;&gt;%s</a>' % (post.get_url(), post_id)
else:
return '>>%s' % value
def render_quote(tag_name, value, options, parent, context):
source = ''
if 'source' in options:
source = options['source']
result = ''
if source:
result = '<div class="multiquote"><div class="quote-header">%s</div><div class="quote-text">%s</div></div>' % (source, value)
else:
result = '<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):
# The newline hack is added because br's margin does not work in all
# browsers except firefox, when the div's does.
parser = bbcode.Parser(newline='<div class="br"></div>')
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>')
# TODO Use <s> here
parser.add_simple_formatter('s',
u'<span class="strikethrough">%(value)s</span>')
# TODO Why not use built-in tag?
parser.add_simple_formatter('code',
u'<pre><code>%(value)s</pre></code>', render_embedded=False)
text = preparse_text(markup)
return parser.format(text)
formatters = [
QuotePattern,
SpoilerPattern,
ItalicPattern,
BoldPattern,
CommentPattern,
StrikeThroughPattern,
CodePattern,
]