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.
80 lines
2.7 KiB
80 lines
2.7 KiB
"""Utility functions to render Markdown text to HTML.""" |
|
|
|
import markdown |
|
import six |
|
from markdown.extensions import codehilite |
|
|
|
from .imports import PygmentsHtmlFormatter |
|
|
|
|
|
def force_unicode(value, encoding='utf-8', errors='strict'): |
|
"""Convert bytes or any other Python instance to string.""" |
|
if isinstance(value, six.text_type): |
|
return value |
|
return value.decode(encoding, errors) |
|
|
|
|
|
def pygmented_markdown(text, flatpages=None): |
|
"""Render Markdown text to HTML. |
|
|
|
Uses the `CodeHilite`_ extension only if `Pygments`_ is available. If |
|
`Pygments`_ is not available, "codehilite" is removed from list of |
|
extensions. |
|
|
|
If you need other extensions, set them up using the |
|
``FLATPAGES_MARKDOWN_EXTENSIONS`` setting, which should be a sequence |
|
of strings or Markdown Extension objects. |
|
Extensions specified with entrypoint strings should be configured using |
|
``FLATPAGES_EXTENSION_CONFIGS``. |
|
|
|
.. _CodeHilite: |
|
http://www.freewisdom.org/projects/python-markdown/CodeHilite |
|
.. _Pygments: http://pygments.org/ |
|
""" |
|
if flatpages: |
|
extensions = flatpages.config('markdown_extensions') |
|
extension_configs = flatpages.config('extension_configs') |
|
else: |
|
extensions = [] |
|
extension_configs = {} |
|
if PygmentsHtmlFormatter is None: |
|
original_extensions = extensions |
|
original_config = extension_configs |
|
extensions = [] |
|
extension_configs = {} |
|
|
|
for extension in original_extensions: |
|
if ( |
|
isinstance(extension, six.string_types) and |
|
'codehilite' in extension |
|
): |
|
continue |
|
elif isinstance( |
|
extension, |
|
codehilite.CodeHiliteExtension |
|
): |
|
continue |
|
extensions.append(extension) |
|
if isinstance(extension, six.string_types): |
|
if extension in original_config: |
|
extension_configs[extension] = original_config[extension] |
|
elif not extensions: |
|
extensions = ['codehilite'] |
|
return markdown.markdown(text, extensions=extensions, |
|
extension_configs=extension_configs) |
|
|
|
|
|
def pygments_style_defs(style='default'): |
|
""":return: the CSS definitions for the `CodeHilite`_ Markdown plugin. |
|
|
|
:param style: The Pygments `style`_ to use. |
|
|
|
Only available if `Pygments`_ is. |
|
|
|
.. _CodeHilite: |
|
http://www.freewisdom.org/projects/python-markdown/CodeHilite |
|
.. _Pygments: http://pygments.org/ |
|
.. _style: http://pygments.org/docs/styles/ |
|
""" |
|
formatter = PygmentsHtmlFormatter(style=style) |
|
return formatter.get_style_defs('.codehilite')
|
|
|