mirror of https://github.com/zulip/zulip.git
app_filters: Render HTML to render Jinja2 syntax within Markdown macros.
If a Markdown macro contains Jinja2 template code, it isn't rendered because render_markdown_path calls template.render on the including .md file before the macro has been included. And then the including .md file is converted to HTML. Therefore, the template code within a Markdown macro (if any) never gets rendered and is returned as it is. Now, after the source .md file is converted to HTML, render_markdown_path renders the resulting HTML so that any template code within included macros (if any) is finally rendered.
This commit is contained in:
parent
df7eaa8868
commit
baff121115
|
@ -1,7 +1,7 @@
|
||||||
from typing import Dict, Optional, Any
|
from typing import Dict, Optional, Any
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.template import Library, loader
|
from django.template import Library, loader, engines
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
from django.utils.lru_cache import lru_cache
|
from django.utils.lru_cache import lru_cache
|
||||||
|
|
||||||
|
@ -82,7 +82,8 @@ def render_markdown_path(markdown_file_path, context=None):
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
|
||||||
template = loader.get_template(markdown_file_path)
|
jinja = engines['Jinja2']
|
||||||
markdown_string = template.render(context)
|
markdown_string = jinja.env.loader.get_source(jinja.env, markdown_file_path)[0]
|
||||||
html = md_engine.convert(markdown_string)
|
html = md_engine.convert(markdown_string)
|
||||||
return mark_safe(html)
|
html_template = jinja.from_string(html)
|
||||||
|
return mark_safe(html_template.render(context))
|
||||||
|
|
|
@ -46,6 +46,12 @@ class Jinja2(django_jinja2.Jinja2):
|
||||||
six.reraise(TemplateSyntaxError, TemplateSyntaxError(exc.args),
|
six.reraise(TemplateSyntaxError, TemplateSyntaxError(exc.args),
|
||||||
sys.exc_info()[2])
|
sys.exc_info()[2])
|
||||||
|
|
||||||
|
def from_string(self, template_code):
|
||||||
|
# type: (str) -> Template
|
||||||
|
return Template(self.env.from_string(template_code),
|
||||||
|
self.context_processors,
|
||||||
|
self.debug)
|
||||||
|
|
||||||
|
|
||||||
class Template(django_jinja2.Template):
|
class Template(django_jinja2.Template):
|
||||||
"""Context processors aware Template.
|
"""Context processors aware Template.
|
||||||
|
|
|
@ -298,6 +298,7 @@ if PRODUCTION:
|
||||||
|
|
||||||
TEMPLATES = [
|
TEMPLATES = [
|
||||||
{
|
{
|
||||||
|
'NAME': 'Jinja2',
|
||||||
'BACKEND': 'zproject.jinja2.backends.Jinja2',
|
'BACKEND': 'zproject.jinja2.backends.Jinja2',
|
||||||
'DIRS': [
|
'DIRS': [
|
||||||
os.path.join(DEPLOY_ROOT, 'templates'),
|
os.path.join(DEPLOY_ROOT, 'templates'),
|
||||||
|
|
Loading…
Reference in New Issue