utils.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import bleach
  2. from markdown import Markdown
  3. from unidecode import unidecode
  4. from django.core.urlresolvers import reverse
  5. from django.template.defaultfilters import slugify as django_slugify
  6. def _is_request_path_under_misago(request):
  7. # We are assuming that forum_index link is root of all Misago links
  8. forum_index = reverse('misago:index')
  9. path_info = request.path_info
  10. if len(forum_index) > len(path_info):
  11. return False
  12. return path_info[:len(forum_index)] == forum_index
  13. def is_request_to_misago(request):
  14. try:
  15. return request._request_to_misago
  16. except AttributeError:
  17. request._request_to_misago = _is_request_path_under_misago(request)
  18. return request._request_to_misago
  19. def slugify(string):
  20. string = unicode(string)
  21. string = unidecode(string)
  22. return django_slugify(string.replace('_', ' '))
  23. MD_SUBSET_FORBID_SYNTAX = (
  24. # References are evil
  25. 'reference', 'reference', 'image_reference', 'short_reference',
  26. # Blocks are evil too
  27. 'hashheader', 'setextheader', 'code', 'quote', 'hr', 'olist', 'ulist',
  28. )
  29. def subset_markdown(text):
  30. if not text:
  31. return ''
  32. md = Markdown(safe_mode='escape', extensions=['nl2br'])
  33. for key in md.preprocessors.keys():
  34. if key in MD_SUBSET_FORBID_SYNTAX:
  35. del md.preprocessors[key]
  36. for key in md.inlinePatterns.keys():
  37. if key in MD_SUBSET_FORBID_SYNTAX:
  38. del md.inlinePatterns[key]
  39. for key in md.parser.blockprocessors.keys():
  40. if key in MD_SUBSET_FORBID_SYNTAX:
  41. del md.parser.blockprocessors[key]
  42. for key in md.treeprocessors.keys():
  43. if key in MD_SUBSET_FORBID_SYNTAX:
  44. del md.treeprocessors[key]
  45. for key in md.postprocessors.keys():
  46. if key in MD_SUBSET_FORBID_SYNTAX:
  47. del md.postprocessors[key]
  48. return bleach.linkify(md.convert(text))