quotes.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import re
  2. import markdown
  3. from markdown.util import etree
  4. # Global vars
  5. QUOTE_AUTHOR_RE = re.compile(r'^(?P<arrows>(>|\s)+)?@(?P<username>(\w|\d)+)$')
  6. class QuoteTitlesExtension(markdown.Extension):
  7. def extendMarkdown(self, md):
  8. md.registerExtension(self)
  9. md.preprocessors.add('mi_quote_title',
  10. QuoteTitlesPreprocessor(md),
  11. '>fenced_code_block')
  12. md.postprocessors.add('mi_quote_title',
  13. QuoteTitlesPostprocessor(md),
  14. '_end')
  15. class QuoteTitlesPreprocessor(markdown.preprocessors.Preprocessor):
  16. def __init__(self, md):
  17. markdown.preprocessors.Preprocessor.__init__(self, md)
  18. def run(self, lines):
  19. clean = []
  20. for l, line in enumerate(lines):
  21. try:
  22. if line.strip():
  23. at_match = QUOTE_AUTHOR_RE.match(line.strip())
  24. if at_match and lines[l + 1].strip()[0] == '>':
  25. username = '<%(token)s:quotetitle><%(token)s:username>%(name)s</%(token)s:username></%(token)s:quotetitle>' % {'token': self.markdown.mi_token, 'name': at_match.group('username')}
  26. if at_match.group('arrows'):
  27. clean.append('> %s%s' % (at_match.group('arrows'), username))
  28. else:
  29. clean.append('> %s' % username)
  30. try:
  31. self.markdown.mi_usernames.append(username)
  32. except AttributeError:
  33. self.markdown.mi_usernames = [username]
  34. else:
  35. clean.append(line)
  36. else:
  37. clean.append(line)
  38. except IndexError:
  39. clean.append(line)
  40. return clean
  41. class QuoteTitlesPostprocessor(markdown.postprocessors.Postprocessor):
  42. def run(self, text):
  43. text = text.replace('&lt;%s:quotetitle&gt;' % self.markdown.mi_token, '<h3><quotetitle>')
  44. text = text.replace('&lt;/%s:quotetitle&gt;' % self.markdown.mi_token, '</quotetitle></h3>')
  45. return text