parser.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. }
  22. # Parse text
  23. parsed_text = md.convert(text)
  24. # Clean and store parsed text
  25. parsing_result['parsed_text'] = parsed_text.strip()
  26. parsing_result = pipeline.process_result(parsing_result)
  27. return parsing_result
  28. def md_factory(author=None, allow_mentions=True, allow_links=True,
  29. allow_images=True, allow_blocks=True):
  30. """
  31. Create and configure markdown object
  32. """
  33. md = markdown.Markdown(safe_mode='escape',
  34. extensions=['nl2br'])
  35. # Remove references
  36. del md.preprocessors['reference']
  37. del md.inlinePatterns['reference']
  38. del md.inlinePatterns['image_reference']
  39. del md.inlinePatterns['short_reference']
  40. # Add [b], [i], [u]
  41. md.inlinePatterns.add('bb_b', inline.bold, '<strong')
  42. md.inlinePatterns.add('bb_i', inline.italics, '<emphasis')
  43. md.inlinePatterns.add('bb_u', inline.underline, '<emphasis2')
  44. if allow_mentions:
  45. # Register mentions
  46. pass
  47. if allow_links:
  48. # Add [url]
  49. pass
  50. else:
  51. # Remove links
  52. del md.inlinePatterns['link']
  53. del md.inlinePatterns['autolink']
  54. del md.inlinePatterns['automail']
  55. if allow_images:
  56. # Add [img]
  57. pass
  58. else:
  59. # Remove images
  60. del md.inlinePatterns['image_link']
  61. if allow_blocks:
  62. # Add [hr] [quote], [spoiler], [list] and [code] blocks
  63. md.parser.blockprocessors.add('bb_hr',
  64. blocks.BBCodeHRProcessor(md.parser),
  65. '>hr')
  66. else:
  67. # Remove blocks
  68. del md.parser.blockprocessors['hashheader']
  69. del md.parser.blockprocessors['setextheader']
  70. del md.parser.blockprocessors['code']
  71. del md.parser.blockprocessors['quote']
  72. del md.parser.blockprocessors['hr']
  73. del md.parser.blockprocessors['olist']
  74. del md.parser.blockprocessors['ulist']
  75. return pipeline.extend_markdown(md)