##// END OF EJS Templates
Moved adding linked posts from view to post manager. Cleaned up tests, added some more tests
Moved adding linked posts from view to post manager. Cleaned up tests, added some more tests

File last commit:

r330:dd8357bc default
r381:f21d714a default
Show More
mdx_neboard.py
118 lines | 3.3 KiB | text/x-python | PythonLexer
from django.core.urlresolvers import reverse
import markdown
from markdown.inlinepatterns import Pattern
from markdown.util import etree
import boards
__author__ = 'neko259'
AUTOLINK_PATTERN = r'(https?://\S+)'
QUOTE_PATTERN = r'^(?<!>)(>[^>].+)$'
REFLINK_PATTERN = r'((>>)(\d+))'
SPOILER_PATTERN = r'%%(.+)%%'
COMMENT_PATTERN = r'^(//(.+))'
STRIKETHROUGH_PATTERN = r'~(.+)~'
class AutolinkPattern(Pattern):
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(Pattern):
def handleMatch(self, m):
quote_element = etree.Element('span')
quote_element.set('class', 'quote')
quote_element.text = m.group(2)
return quote_element
class ReflinkPattern(Pattern):
def handleMatch(self, m):
post_id = m.group(4)
posts = boards.models.Post.objects.filter(id=post_id)
if posts.count() > 0:
ref_element = etree.Element('a')
post = posts[0]
if post.thread:
link = reverse(boards.views.thread, kwargs={'post_id': post.thread.id}) \
+ '#' + post_id
else:
link = reverse(boards.views.thread, kwargs={'post_id': post_id})
ref_element.set('href', link)
ref_element.text = m.group(2)
return ref_element
class SpoilerPattern(Pattern):
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(Pattern):
def handleMatch(self, m):
quote_element = etree.Element('span')
quote_element.set('class', 'comment')
quote_element.text = '//' + m.group(3)
return quote_element
class StrikeThroughPattern(Pattern):
def handleMatch(self, m):
quote_element = etree.Element('span')
quote_element.set('class', 'strikethrough')
quote_element.text = m.group(2)
return quote_element
class NeboardMarkdown(markdown.Extension):
def extendMarkdown(self, md, md_globals):
self._add_neboard_patterns(md)
self._delete_patterns(md)
def _delete_patterns(self, md):
del md.parser.blockprocessors['quote']
del md.inlinePatterns['image_link']
del md.inlinePatterns['image_reference']
def _add_neboard_patterns(self, md):
autolink = AutolinkPattern(AUTOLINK_PATTERN, md)
quote = QuotePattern(QUOTE_PATTERN, md)
reflink = ReflinkPattern(REFLINK_PATTERN, md)
spoiler = SpoilerPattern(SPOILER_PATTERN, md)
comment = CommentPattern(COMMENT_PATTERN, md)
strikethrough = StrikeThroughPattern(STRIKETHROUGH_PATTERN, md)
md.inlinePatterns[u'autolink_ext'] = autolink
md.inlinePatterns[u'spoiler'] = spoiler
md.inlinePatterns[u'strikethrough'] = strikethrough
md.inlinePatterns[u'comment'] = comment
md.inlinePatterns[u'reflink'] = reflink
md.inlinePatterns[u'quote'] = quote
def makeExtension(configs=None):
return NeboardMarkdown(configs=configs)
neboard_extension = makeExtension()
def markdown_extended(markup):
return markdown.markdown(markup, [neboard_extension], safe_mode=True)