diff --git a/entries/jinja2/entries/h-entry.html b/entries/jinja2/entries/h-entry.html index 0cf7a80..b9a05f6 100644 --- a/entries/jinja2/entries/h-entry.html +++ b/entries/jinja2/entries/h-entry.html @@ -10,7 +10,7 @@ {{i}}

{{ entry.name }}

{% endif %} {{i}}
- {{i}}{{ entry.content | indent(indent_width + 6) }} + {{i}}{{ entry.content | markdown }} {{i}}
{{i}} diff --git a/lemoncurry/jinja2.py b/lemoncurry/jinja2/__init__.py similarity index 88% rename from lemoncurry/jinja2.py rename to lemoncurry/jinja2/__init__.py index 57fcfdf..681f1d0 100644 --- a/lemoncurry/jinja2.py +++ b/lemoncurry/jinja2/__init__.py @@ -7,7 +7,8 @@ from compressor.contrib.jinja2ext import CompressorExtension from django_activeurl.ext.django_jinja import ActiveUrl from entries.kinds import all as entry_kinds -from .utils import friendly_url, load_package_json +from .markdown import markdown +from ..utils import friendly_url, load_package_json def environment(**options): @@ -19,6 +20,7 @@ def environment(**options): ) env.filters.update({ 'friendly_url': friendly_url, + 'markdown': markdown, 'naturaltime': naturaltime, }) env.globals.update({ diff --git a/lemoncurry/jinja2/bleach.py b/lemoncurry/jinja2/bleach.py new file mode 100644 index 0000000..de09c04 --- /dev/null +++ b/lemoncurry/jinja2/bleach.py @@ -0,0 +1,21 @@ +from bleach.sanitizer import Cleaner, ALLOWED_TAGS +from bleach.linkifier import LinkifyFilter +from jinja2 import evalcontextfilter, Markup + +TAGS = ['cite', 'code', 'p', 'pre', 'img', 'span'] +TAGS.extend(ALLOWED_TAGS) +ATTRIBUTES = { + 'a': ('href', 'title', 'class'), + 'img': ('alt', 'src', 'title'), + 'span': ('class',), +} + +cleaner = Cleaner(tags=TAGS, attributes=ATTRIBUTES, filters=(LinkifyFilter,)) + + +@evalcontextfilter +def bleach(ctx, html): + res = cleaner.clean(html) + if ctx.autoescape: + res = Markup(res) + return res diff --git a/lemoncurry/jinja2/markdown.py b/lemoncurry/jinja2/markdown.py new file mode 100644 index 0000000..951b3b8 --- /dev/null +++ b/lemoncurry/jinja2/markdown.py @@ -0,0 +1,16 @@ +from jinja2 import evalcontextfilter +from markdown import Markdown + +from .bleach import bleach + +md = Markdown(extensions=( + 'markdown.extensions.extra', + 'markdown.extensions.headerid', + 'markdown.extensions.sane_lists', + 'markdown.extensions.smarty', +)) + + +@evalcontextfilter +def markdown(ctx, source): + return bleach(ctx, md.reset().convert(source))