mentions.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import re
  2. import markdown
  3. from markdown.util import etree
  4. from django.core.urlresolvers import reverse
  5. from misago.models import User
  6. from misago.utils.strings import slugify
  7. # Global vars
  8. MENTION_RE = re.compile(r'([^\w]?)@(?P<username>(\w)+)', re.UNICODE)
  9. class MentionsExtension(markdown.Extension):
  10. def extendMarkdown(self, md):
  11. md.mentions = {}
  12. md.registerExtension(self)
  13. md.preprocessors.add('mi_mentions',
  14. MentionsPreprocessor(md),
  15. '>mi_quote_title')
  16. md.postprocessors.add('mi_mentions',
  17. MentionsPostprocessor(md),
  18. '>mi_quote_title')
  19. class MentionsPreprocessor(markdown.preprocessors.Preprocessor):
  20. def __init__(self, md):
  21. markdown.preprocessors.Preprocessor.__init__(self, md)
  22. self.md = md
  23. def run(self, lines):
  24. def mention(match):
  25. slug = slugify(match.group(0)[1:])
  26. if slug in self.md.mentions:
  27. user = self.md.mentions[slug]
  28. return '%s[@%s](%s)' % (match.group(1), user.username, reverse('user', kwargs={
  29. 'user': user.pk,
  30. 'username': user.username_slug,
  31. }))
  32. elif len(self.md.mentions) < 32:
  33. try:
  34. user = User.objects.get(username_slug=slug)
  35. self.md.mentions[slug] = user
  36. return '%s[@%s](%s)' % (match.group(1), user.username, reverse('user', kwargs={
  37. 'user': user.pk,
  38. 'username': user.username_slug,
  39. }))
  40. except User.DoesNotExist:
  41. pass
  42. return match.group(0)
  43. clean = []
  44. for l, line in enumerate(lines):
  45. if line.strip():
  46. line = MENTION_RE.sub(mention, line)
  47. clean.append(line)
  48. return clean
  49. class MentionsPostprocessor(markdown.postprocessors.Postprocessor):
  50. def run(self, text):
  51. return text