Skip to content

Instantly share code, notes, and snippets.

@wichert
Created November 16, 2015 14:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wichert/ffb919358111090c9560 to your computer and use it in GitHub Desktop.
Save wichert/ffb919358111090c9560 to your computer and use it in GitHub Desktop.
Markdown rendering in Chameleon
# This module allows you to use markdown in Chameleon templates from pyramid.
#
# Markdown rendering is only down for text that is translatable, and has its
# message context set to ``markdown``. This is a complete abuse of the translation
# system, but currently provides the simplest way to get markdown running in
# Chameleon.
import CommonMark
from chameleon.utils import Markup
from translationstring import ChameleonTranslate
from pyramid_chameleon.localization import translator
from pyramid_chameleon.interfaces import IChameleonTranslate
def render_markdown(source):
parser = CommonMark.DocParser()
renderer = CommonMark.HTMLRenderer()
ast = parser.parse(source)
return Markup(renderer.render(ast))
def MarkdownTranslator(translator):
org_translate = ChameleonTranslate(translator)
def translate(msgid, domain=None, mapping=None, context=None,
target_language=None, default=None):
tr = org_translate(msgid, domain, mapping, context, target_language, default)
if context == 'markdown':
tr = render_markdown(tr)
return tr
return translate
def setup_markdown_translations(registry):
mdtranslate = MarkdownTranslator(translator)
registry.registerUtility(mdtranslate, IChameleonTranslate)
def includeme(config): # pragma: no cover
config.action(None,
callable=setup_markdown_translations, args=(config.registry,),
order=1200) # Order after pyramid_chameleon.localization
@malthe
Copy link

malthe commented Nov 26, 2015

Why not implement an expression type instead?

{{ markdown: some_dynamic_markdown_string }}
{{ markdown: string: ### Heading }}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment