autoescapeプロパティをオンにして (そのままにしておきたい)、ユーザーがカスタム マークアップを入力して、テキストを書式設定できるようにしたいと考えています。たとえば、[s][/s]
に変換され<strong></strong>
ます。これを行う正しい方法は、カスタムの Jinja2 フィルターを作成することだと思います。しかし、以下は機能しません。
@app.template_filter()
@evalcontextfilter
def mark2html(eval_ctx, value):
result = escape(value).replace('[s]','<strong>')
if eval_ctx.autoescape:
result = Markup(result)
return result
のようなテキストに適用すると
<div>{{ custom_markup_text|mark2html }}</div>
custom_markup_text[s]
に格納されている文字列内で が検出された場合は、タグに変換する必要があります。私の知る限り、Markup()関数は、この特定の文字列を信頼することを保証するため、HTML はそこでエスケープされません。フィルタが正常に適用され、に置き換えられましたが、まだエスケープされています。<strong>
[s]
<strong>
明らかに、このカスタム フィルターの後に自動エスケープが行われます。一方、Jinja2 ドキュメントのサンプル フィルターは完全に機能します。
@app.template_filter()
@evalcontextfilter
def nl2br(eval_ctx, value):
result = u'\n\n'.join(u'<p>%s</p>' % p.replace('\n', '<br>\n') \
for p in _paragraph_re.split(escape(value)))
if eval_ctx.autoescape:
result = Markup(result)
return result
私は何を間違っていますか?