|
|
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'^(//(.+))'
|
|
|
|
|
|
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 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)
|
|
|
|
|
|
md.inlinePatterns[u'autolink_ext'] = autolink
|
|
|
md.inlinePatterns[u'spoiler'] = spoiler
|
|
|
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)
|
|
|
|