You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.2 KiB
83 lines
2.2 KiB
7 years ago
|
# -*- coding: utf-8 -*-
|
||
|
from __future__ import unicode_literals
|
||
|
# Erik Stein <code@classlibrary.net>, 2012-2016
|
||
|
|
||
|
import markdown as markdown_module
|
||
|
from django.utils.html import strip_tags
|
||
|
from django.utils.safestring import mark_safe
|
||
|
from shared.utils.text import html_entities_to_unicode
|
||
|
|
||
|
|
||
|
class PseudoParagraphProcessor(markdown_module.blockprocessors.ParagraphProcessor):
|
||
|
"""
|
||
|
Process paragraph blocks without producing HTML paragraphs.
|
||
|
"""
|
||
|
|
||
|
def run(self, parent, blocks):
|
||
|
block = blocks.pop(0)
|
||
|
if block.strip():
|
||
|
# Create element without enclosing tags
|
||
|
p = markdown_module.util.etree.SubElement(parent, None)
|
||
|
p.text = block.lstrip()
|
||
|
|
||
|
|
||
|
config = dict(
|
||
|
output_format='html5',
|
||
|
extensions=[
|
||
|
'markdown.extensions.extra', # Includes footnotes
|
||
|
'markdown.extensions.nl2br',
|
||
|
'markdown.extensions.sane_lists',
|
||
|
'markdown.extensions.admonition',
|
||
|
'markdown.extensions.smarty',
|
||
|
]
|
||
|
)
|
||
|
|
||
|
extensionConfigs = {
|
||
|
'smarty': {
|
||
|
'substitutions': {
|
||
|
'left-single-quote': '‚',
|
||
|
'right-single-quote': '‘',
|
||
|
'left-double-quote': '„',
|
||
|
'right-double-quote': '“'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
markdown_processor = markdown_module.Markdown(**config)
|
||
|
|
||
|
# Replace ParagraphProcessor
|
||
|
inline_markdown_processor = markdown_module.Markdown(**config)
|
||
|
inline_markdown_processor.parser.blockprocessors['paragraph'] = \
|
||
|
PseudoParagraphProcessor(inline_markdown_processor.parser)
|
||
|
|
||
|
|
||
|
def markdown_to_inline_html(text, **kwargs):
|
||
|
kwargs['inline'] = True
|
||
|
return markdown_to_html(text, **kwargs)
|
||
|
|
||
|
# TODO Decprecated API
|
||
|
inline_markdown = markdown_to_inline_html
|
||
|
|
||
|
|
||
|
def markdown_to_html(text, inline=False, **kwargs):
|
||
|
if inline:
|
||
|
processor = inline_markdown_processor
|
||
|
else:
|
||
|
processor = markdown_processor
|
||
|
processor.reset()
|
||
|
html = processor.convert(text, **kwargs)
|
||
|
return mark_safe(html)
|
||
|
|
||
|
# TODO Decprecated API
|
||
|
markdown = markdown_to_html
|
||
|
|
||
|
|
||
|
def markdown_to_text(text, **kwargs):
|
||
|
"""
|
||
|
Converts a string from markdown to HTML, then removes all
|
||
|
HTML markup (tags and entities).
|
||
|
"""
|
||
|
html = markdown_to_html(text, **kwargs)
|
||
|
return strip_tags(html_entities_to_unicode(html))
|