cleanlinks.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import markdown
  2. from markdown.util import etree
  3. from misago.utils.urls import is_url, is_inner, clean_inner
  4. class CleanLinksExtension(markdown.Extension):
  5. def extendMarkdown(self, md):
  6. md.registerExtension(self)
  7. md.treeprocessors.add('mi_cleanlinks',
  8. CleanLinksTreeprocessor(md),
  9. '_end')
  10. class CleanLinksTreeprocessor(markdown.treeprocessors.Treeprocessor):
  11. def run(self, root):
  12. self.inurl = False
  13. return self.walk_tree(root)
  14. def walk_tree(self, node):
  15. if node.tag == 'a':
  16. self.inurl = True
  17. if is_inner(node.get('href')):
  18. node.set('href', clean_inner(node.get('href')))
  19. else:
  20. node.set('rel', 'nofollow')
  21. if node.tag == 'img':
  22. if is_inner(node.get('src')):
  23. node.set('src', '%s' % clean_inner(node.get('src')))
  24. try:
  25. if self.inurl and node.text and is_url(node.text) and is_inner(node.text):
  26. node.text = clean_inner(node.text)[1:]
  27. except TypeError:
  28. pass
  29. for i in node:
  30. self.walk_tree(i)
  31. self.inurl = False