Mercurial > p > roundup > code
diff roundup/cgi/templating.py @ 6099:55c56ceacb8e
escape HTML tags in markdown content
enabled fenced code blocks for markdown
allow mistune to be used as a markdown parser
test all installed markdown parsers and fallback code
| author | Christof Meerwald <cmeerw@cmeerw.org> |
|---|---|
| date | Mon, 24 Feb 2020 22:20:19 +0000 |
| parents | 72a281a55a17 |
| children | d4ce26b14cf5 |
line wrap: on
line diff
--- a/roundup/cgi/templating.py Thu Feb 20 21:38:32 2020 -0500 +++ b/roundup/cgi/templating.py Mon Feb 24 22:20:19 2020 +0000 @@ -54,17 +54,50 @@ except ImportError: ReStructuredText = None try: - from markdown2 import markdown -except ImportError: - try: - from markdown import markdown - except ImportError: - markdown = None -try: from itertools import zip_longest except ImportError: from itertools import izip_longest as zip_longest +def _import_markdown2(): + try: + import markdown2, re + class Markdown(markdown2.Markdown): + # don't restrict protocols in links + _safe_protocols = re.compile('', re.IGNORECASE) + + markdown = lambda s: Markdown(safe_mode='escape', extras={ 'fenced-code-blocks' : True }).convert(s) + except ImportError: + markdown = None + + return markdown + +def _import_markdown(): + try: + from markdown import markdown as markdown_impl + from markdown.extensions import Extension as MarkdownExtension + + # make sure any HTML tags get escaped + class EscapeHtml(MarkdownExtension): + def extendMarkdown(self, md): + md.preprocessors.deregister('html_block') + md.inlinePatterns.deregister('html') + + markdown = lambda s: markdown_impl(s, extensions=[EscapeHtml(), 'fenced_code']) + except ImportError: + markdown = None + + return markdown + +def _import_mistune(): + try: + from mistune import markdown + except ImportError: + markdown = None + + return markdown + +markdown = _import_markdown2() or _import_markdown() or _import_mistune() + # bring in the templating support from roundup.cgi import TranslationService, ZTUtils
