123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- import markdown
- from markdown.extensions.fenced_code import FencedCodeExtension
- from .bbcode.code import CodeBlockExtension
- from .bbcode.hr import BBCodeHRProcessor
- from .bbcode.inline import bold, image, italics, underline, url
- from .bbcode.quote import QuoteExtension
- from .bbcode.spoiler import SpoilerExtension
- from .htmlparser import parse_html_string, print_html_string
- from .links import clean_links, linkify_texts
- from .md.shortimgs import ShortImagesExtension
- from .md.strikethrough import StrikethroughExtension
- from .mentions import add_mentions
- from .pipeline import pipeline
- def parse(
- text,
- request,
- poster,
- allow_mentions=True,
- allow_links=True,
- allow_images=True,
- allow_blocks=True,
- force_shva=False,
- ):
- """
- Message parser
- Utility for flavours to call
- Breaks text into paragraphs, supports code, spoiler and quote blocks,
- headers, lists, images, spoilers, text styles
- Returns dict object
- """
- md = md_factory(
- allow_links=allow_links, allow_images=allow_images, allow_blocks=allow_blocks
- )
- parsing_result = {
- "original_text": text,
- "parsed_text": "",
- "markdown": md,
- "mentions": [],
- "images": [],
- "internal_links": [],
- "outgoing_links": [],
- }
- # Parse text
- parsed_text = md.convert(text)
- # Clean and store parsed text
- parsing_result["parsed_text"] = parsed_text.strip()
- # Run additional operations
- if allow_mentions or allow_links or allow_images:
- root_node = parse_html_string(parsing_result["parsed_text"])
- if allow_links:
- linkify_texts(root_node)
- if allow_mentions:
- add_mentions(parsing_result, root_node)
- if allow_links or allow_images:
- clean_links(request, parsing_result, root_node, force_shva)
- parsing_result["parsed_text"] = print_html_string(root_node)
- # Let plugins do their magic
- parsing_result = pipeline.process_result(parsing_result)
- return parsing_result
- def md_factory(allow_links=True, allow_images=True, allow_blocks=True):
- """creates and configures markdown object"""
- md = markdown.Markdown(extensions=["markdown.extensions.nl2br"])
- # Remove HTML allowances
- md.preprocessors.deregister("html_block")
- md.inlinePatterns.deregister("html")
- # Remove references
- md.parser.blockprocessors.deregister("reference")
- md.inlinePatterns.deregister("reference")
- md.inlinePatterns.deregister("image_reference")
- md.inlinePatterns.deregister("short_reference")
- # Add [b], [i], [u]
- md.inlinePatterns.register(bold, "bb_b", 55)
- md.inlinePatterns.register(italics, "bb_i", 55)
- md.inlinePatterns.register(underline, "bb_u", 55)
- # Add ~~deleted~~
- strikethrough_md = StrikethroughExtension()
- strikethrough_md.extendMarkdown(md)
- if allow_links:
- # Add [url]
- md.inlinePatterns.register(url(md), "bb_url", 155)
- else:
- # Remove links
- md.inlinePatterns.deregister("link")
- md.inlinePatterns.deregister("autolink")
- md.inlinePatterns.deregister("automail")
- if allow_images:
- # Add [img]
- md.inlinePatterns.register(image(md), "bb_img", 145)
- short_images_md = ShortImagesExtension()
- short_images_md.extendMarkdown(md)
- else:
- # Remove images
- md.inlinePatterns.deregister("image_link")
- if allow_blocks:
- # Add [hr] and [quote] blocks
- md.parser.blockprocessors.register(BBCodeHRProcessor(md.parser), "bb_hr", 45)
- fenced_code = FencedCodeExtension(lang_prefix="language-")
- fenced_code.extendMarkdown(md)
- code_bbcode = CodeBlockExtension()
- code_bbcode.extendMarkdown(md)
- quote_bbcode = QuoteExtension()
- quote_bbcode.extendMarkdown(md)
- spoiler_bbcode = SpoilerExtension()
- spoiler_bbcode.extendMarkdown(md)
- else:
- # Remove blocks
- md.parser.blockprocessors.deregister("hashheader")
- md.parser.blockprocessors.deregister("setextheader")
- md.parser.blockprocessors.deregister("code")
- md.parser.blockprocessors.deregister("quote")
- md.parser.blockprocessors.deregister("hr")
- md.parser.blockprocessors.deregister("olist")
- md.parser.blockprocessors.deregister("ulist")
- return pipeline.extend_markdown(md)
|