factory.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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.strings import random_string
  7. from misago.markdown.extensions.cleanlinks import CleanLinksExtension
  8. from misago.markdown.parsers import RemoveHTMLParser
  9. def clear_markdown(text):
  10. parser = RemoveHTMLParser()
  11. parser.feed(text)
  12. return parser.clean_text
  13. def remove_unsupported(md):
  14. # References are evil, we dont support them
  15. del md.preprocessors['reference']
  16. del md.inlinePatterns['reference']
  17. del md.inlinePatterns['image_reference']
  18. del md.inlinePatterns['short_reference']
  19. def signature_markdown(acl, text):
  20. md = markdown.Markdown(
  21. safe_mode='escape',
  22. output_format=settings.OUTPUT_FORMAT,
  23. extensions=['nl2br'])
  24. remove_unsupported(md)
  25. cleanlinks = CleanLinksExtension()
  26. cleanlinks.extendMarkdown(md)
  27. if not acl.usercp.allow_signature_links():
  28. del md.inlinePatterns['link']
  29. del md.inlinePatterns['autolink']
  30. if not acl.usercp.allow_signature_images():
  31. del md.inlinePatterns['image_link']
  32. del md.parser.blockprocessors['hashheader']
  33. del md.parser.blockprocessors['setextheader']
  34. del md.parser.blockprocessors['code']
  35. del md.parser.blockprocessors['quote']
  36. del md.parser.blockprocessors['hr']
  37. del md.parser.blockprocessors['olist']
  38. del md.parser.blockprocessors['ulist']
  39. return md.convert(text)
  40. def post_markdown(request, text):
  41. md = markdown.Markdown(
  42. safe_mode='escape',
  43. output_format=settings.OUTPUT_FORMAT,
  44. extensions=['nl2br', 'fenced_code'])
  45. remove_unsupported(md)
  46. md.mi_token = random_string(16)
  47. for extension in settings.MARKDOWN_EXTENSIONS:
  48. module = '.'.join(extension.split('.')[:-1])
  49. extension = extension.split('.')[-1]
  50. module = import_module(module)
  51. attr = getattr(module, extension)
  52. ext = attr()
  53. ext.extendMarkdown(md)
  54. text = md.convert(text)
  55. md, text = tidy_markdown(md, text)
  56. return md, text
  57. def tidy_markdown(md, text):
  58. text = text.replace('<p><h3><quotetitle>', '<h3><quotetitle>')
  59. text = text.replace('</quotetitle></h3></p>', '</quotetitle></h3>')
  60. text = text.replace('</quotetitle></h3><br>\r\n', '</quotetitle></h3>\r\n<p>')
  61. text = text.replace('\r\n<p></p>', '')
  62. return md, text
  63. def finalize_markdown(text):
  64. def trans_quotetitle(match):
  65. return _("Posted by %(user)s") % {'user': match.group('content')}
  66. text = re.sub(r'<quotetitle>(?P<content>.+)</quotetitle>', trans_quotetitle, text)
  67. text = re.sub(r'<quotesingletitle>', _("Quote"), text)
  68. return text