factory.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import re
  2. import markdown
  3. from django.conf import settings
  4. from django.utils.importlib import import_module
  5. from django.utils.translation import ugettext_lazy as _
  6. from misago.utils import get_random_string
  7. def remove_unsupported(md):
  8. del md.preprocessors['reference']
  9. del md.inlinePatterns['reference']
  10. del md.inlinePatterns['image_reference']
  11. del md.inlinePatterns['short_reference']
  12. def signature_markdown(acl, text):
  13. md = markdown.Markdown(
  14. safe_mode='escape',
  15. output_format=settings.OUTPUT_FORMAT,
  16. extensions=['nl2br'])
  17. remove_unsupported(md)
  18. if not acl.usercp.allow_signature_links():
  19. del md.inlinePatterns['link']
  20. del md.inlinePatterns['autolink']
  21. if not acl.usercp.allow_signature_images():
  22. del md.inlinePatterns['image_link']
  23. del md.inlinePatterns['image_reference']
  24. del md.parser.blockprocessors['hashheader']
  25. del md.parser.blockprocessors['setextheader']
  26. del md.parser.blockprocessors['code']
  27. del md.parser.blockprocessors['quote']
  28. del md.parser.blockprocessors['hr']
  29. del md.parser.blockprocessors['olist']
  30. del md.parser.blockprocessors['ulist']
  31. del md.preprocessors['reference']
  32. del md.inlinePatterns['reference']
  33. del md.inlinePatterns['image_reference']
  34. del md.inlinePatterns['short_reference']
  35. return md.convert(text)
  36. def post_markdown(request, text):
  37. md = markdown.Markdown(
  38. safe_mode='escape',
  39. output_format=settings.OUTPUT_FORMAT,
  40. extensions=['nl2br', 'fenced_code'])
  41. remove_unsupported(md)
  42. md.mi_token = get_random_string(16)
  43. for extension in settings.MARKDOWN_EXTENSIONS:
  44. module = '.'.join(extension.split('.')[:-1])
  45. extension = extension.split('.')[-1]
  46. module = import_module(module)
  47. attr = getattr(module, extension)
  48. ext = attr()
  49. ext.extendMarkdown(md)
  50. text = md.convert(text)
  51. # Final cleanups
  52. text = text.replace('<p><h3><quotetitle>', '<h3><quotetitle>')
  53. text = text.replace('</quotetitle></h3></p>', '</quotetitle></h3>')
  54. text = text.replace('</quotetitle></h3><br>\n', '</quotetitle></h3>\n<p>')
  55. text = text.replace('\n<p></p>', '')
  56. def trans_quotetitle(match):
  57. return _("Posted by %(user)s") % {'user': match.group('content')}
  58. text = re.sub(r'<quotetitle>(?P<content>.+)</quotetitle>', trans_quotetitle, text)
  59. return text