2012-09-20 6 views
0

Можно создать дубликат:
Why is this Jinja nl2br filter escaping <br>'s but not <p>'s?Есть ли лучший способ применить фильтр nl2br с Jinja/Flask?

Я использую дзиндзя с колбой (включено autoescape), и я пытаюсь применить this filter

import re 

from jinja2 import evalcontextfilter, Markup, escape 

_paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}') 

app = Flask(__name__) 

@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 

Проблема с этим заключается в том, что он никогда не применяет < br> 's и всегда применяет < p> вокруг каждой строки.

Если я типа:

1 
2 

3 
4 

в текстовое поле, оно сохраняется в БД, как "u'1 \ г \ п2 \ г \ п \ г \ n3 \ г \ n4" и когда положить в дзиндзя с | nl2br фильтром он выходит как

<p>1</p> 

<p>2</p> 

<p>3</p> 

<p>4</p> 

Я ищу, чтобы быть

<p>1<br>2</p> 
<p>3<br>4</p> 

этот метод регулярного выражения кажется излишним за то, что я после. Пожалуйста, скажите мне, что это более простой способ добиться этого, поскольку я весь день пытался вытащить свои волосы, пытаясь понять это ...

ответ

6

Упрощенный нет, но как насчет только немного сложнее? Попробуйте с этим регулярным выражением:

(?:\r\n|\r(?!\n)|\n){2,} 

Оригинальным регулярное выражение соответствует \r\n в качестве одного разделителя строк в первом, но это необходимо, чтобы соответствовать два из них, так что откатывается и соответствует как \r с последующим \n. Отрицательный lookahead, (?!\n), предотвращает его соответствие \r, если следующий символ \n.