mdx_neboard.py
106 lines
| 2.9 KiB
| text/x-python
|
PythonLexer
/ boards / mdx_neboard.py
neko259
|
r98 | from django.core.urlresolvers import reverse | ||
neko259
|
r52 | import markdown | ||
from markdown.inlinepatterns import Pattern | ||||
from markdown.util import etree | ||||
neko259
|
r98 | import boards | ||
neko259
|
r52 | |||
neko259
|
r89 | __author__ = 'neko259' | ||
neko259
|
r52 | |||
neko259
|
r302 | AUTOLINK_PATTERN = r'(https?://\S+)' | ||
neko259
|
r303 | QUOTE_PATTERN = r'^(?<!>)(>[^>].+)$' | ||
neko259
|
r302 | REFLINK_PATTERN = r'((>>)(\d+))' | ||
SPOILER_PATTERN = r'%%(.+)%%' | ||||
COMMENT_PATTERN = r'^(//(.+))' | ||||
neko259
|
r52 | 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') | ||||
neko259
|
r90 | quote_element.text = m.group(2) | ||
neko259
|
r52 | |||
return quote_element | ||||
class ReflinkPattern(Pattern): | ||||
def handleMatch(self, m): | ||||
post_id = m.group(4) | ||||
Pavel Ryapolov
|
r310 | |||
neko259
|
r311 | posts = boards.models.Post.objects.filter(id=post_id) | ||
if posts.count() > 0: | ||||
Pavel Ryapolov
|
r310 | ref_element = etree.Element('a') | ||
neko259
|
r311 | post = posts[0] | ||
Pavel Ryapolov
|
r310 | if post.thread: | ||
neko259
|
r311 | link = reverse(boards.views.thread, kwargs={'post_id': post.thread.id}) \ | ||
+ '#' + post_id | ||||
Pavel Ryapolov
|
r310 | else: | ||
neko259
|
r311 | link = reverse(boards.views.thread, post_id=post_id) | ||
Pavel Ryapolov
|
r310 | |||
ref_element.set('href', link) | ||||
ref_element.text = m.group(2) | ||||
neko259
|
r52 | |||
return ref_element | ||||
neko259
|
r56 | 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 | ||||
neko259
|
r52 | class NeboardMarkdown(markdown.Extension): | ||
def extendMarkdown(self, md, md_globals): | ||||
neko259
|
r100 | 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): | ||||
neko259
|
r302 | 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) | ||||
neko259
|
r52 | |||
md.inlinePatterns[u'autolink_ext'] = autolink | ||||
neko259
|
r56 | md.inlinePatterns[u'spoiler'] = spoiler | ||
md.inlinePatterns[u'comment'] = comment | ||||
neko259
|
r90 | md.inlinePatterns[u'reflink'] = reflink | ||
md.inlinePatterns[u'quote'] = quote | ||||
neko259
|
r52 | |||
def makeExtension(configs=None): | ||||
return NeboardMarkdown(configs=configs) | ||||
neboard_extension = makeExtension() | ||||
def markdown_extended(markup): | ||||
neko259
|
r90 | return markdown.markdown(markup, [neboard_extension], safe_mode=True) | ||