factory.py 3.6 KB

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