2012-06-03 39 views
4

擁有autoescape屬性(我想保持這種方式),我希望用戶能夠輸入一些自定義標記,以便有機會格式化文本。例如,[s][/s]將被翻譯爲<strong></strong>。我相信正確的做法是編寫自定義的Jinja2過濾器。但下面不工作:Jinja2過濾器將自定義標記轉換爲html

@app.template_filter() 
@evalcontextfilter 
def mark2html(eval_ctx, value): 
    result = escape(value).replace('[s]','<strong>') 
    if eval_ctx.autoescape: 
     result = Markup(result) 
    return result 

在申請時[s]在字符串中遇到的,存儲在custom_markup_text文本像

<div>{{ custom_markup_text|mark2html }}</div> 

,應該轉化爲<strong>標籤。 AFAIK,標記()函數確保我們信任這個特定的字符串,以便HTML不會在那裏轉義。該過濾器已成功應用,[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 

我在做什麼錯了?

回答

1

發現問題。它是雙重逃脫弦 - 相當愚蠢。 此代碼完美的作品:

@app.template_filter() 
@evalcontextfilter 
def mark2html(eval_ctx, value): 
    result = value.replace('[s]',u'<strong>') 
    result = result.replace('[/s]',u'</strong>') 
    if eval_ctx.autoescape: 
     result = Markup(result) 
    return result 

注意,不應該逃脫,autoescape屬性上。

+0

背後的[概念](http://jinja.pocoo.org/docs/dev/api/#custom-filters)。它基於的[snippet](http://flask.pocoo.org/snippets/28/)。如何[在模板內調用](http://stackoverflow.com/a/14595911/1599229)。 – bahmait