parser.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import markdown
  2. from misago.markup.bbcode import inline, blocks
  3. from misago.markup.pipeline import pipeline
  4. __all__ = ['parse']
  5. def parse(text, author=None, allow_mentions=True, allow_links=True,
  6. allow_images=True, allow_blocks=True):
  7. """
  8. Message parser
  9. Utility for flavours to call
  10. Breaks text into paragraphs, supports code, spoiler and quote blocks,
  11. headers, lists, images, spoilers, text styles
  12. Returns dict object
  13. """
  14. md = md_factory(author=author, allow_mentions=allow_mentions,
  15. allow_links=allow_links, allow_images=allow_images,
  16. allow_blocks=allow_blocks)
  17. parsing_result = {
  18. 'original_text': text,
  19. 'parsed_text': '',
  20. 'markdown': md,
  21. 'mentions': [],
  22. 'images': [],
  23. 'outgoing_links': [],
  24. 'inside_links': []
  25. }
  26. # Parse text
  27. parsed_text = md.convert(text)
  28. # Clean and store parsed text
  29. parsing_result['parsed_text'] = parsed_text.strip()
  30. parsing_result = pipeline.process_result(parsing_result)
  31. return parsing_result
  32. def md_factory(author=None, allow_mentions=True, allow_links=True,
  33. allow_images=True, allow_blocks=True):
  34. """
  35. Create and configure markdown object
  36. """
  37. md = markdown.Markdown(safe_mode='escape',
  38. extensions=['nl2br'])
  39. # Remove references
  40. del md.preprocessors['reference']
  41. del md.inlinePatterns['reference']
  42. del md.inlinePatterns['image_reference']
  43. del md.inlinePatterns['short_reference']
  44. # Add [b], [i], [u]
  45. md.inlinePatterns.add('bb_b', inline.bold, '<strong')
  46. md.inlinePatterns.add('bb_i', inline.italics, '<emphasis')
  47. md.inlinePatterns.add('bb_u', inline.underline, '<emphasis2')
  48. if allow_mentions:
  49. # Register mentions
  50. pass
  51. if allow_links:
  52. # Add [url]
  53. pass
  54. else:
  55. # Remove links
  56. del md.inlinePatterns['link']
  57. del md.inlinePatterns['autolink']
  58. del md.inlinePatterns['automail']
  59. if allow_images:
  60. # Add [img]
  61. pass
  62. else:
  63. # Remove images
  64. del md.inlinePatterns['image_link']
  65. if allow_blocks:
  66. # Add [hr] [quote], [spoiler], [list] and [code] blocks
  67. md.parser.blockprocessors.add('bb_hr',
  68. blocks.BBCodeHRProcessor(md.parser),
  69. '>hr')
  70. else:
  71. # Remove blocks
  72. del md.parser.blockprocessors['hashheader']
  73. del md.parser.blockprocessors['setextheader']
  74. del md.parser.blockprocessors['code']
  75. del md.parser.blockprocessors['quote']
  76. del md.parser.blockprocessors['hr']
  77. del md.parser.blockprocessors['olist']
  78. del md.parser.blockprocessors['ulist']
  79. return pipeline.extend_markdown(md)