Я использую Jinja с Flask (автоэкранирование включено) и пытаюсь применить этот фильтр
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>s вокруг каждой строки.
Если я наберу:
1
2
3
4
в textarea он сохраняется в БД как "u'1\r\n2\r\n\r\n3\r\n4'", а когда он помещается в Jinja с фильтром |nl2br, он выглядит как
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
Я ищу, чтобы это было
<p>1<br>2</p>
<p>3<br>4</p>
этот метод регулярного выражения кажется излишним для того, что мне нужно.
Пожалуйста, скажите мне, что есть более простой способ сделать это, так как я весь день рвал на себе волосы, пытаясь понять это...
nl2brфильтра официальной документации из jinja.pocoo. org/docs/api/#custom-filters вместо этого плохо работающего неофициального фрагмента. - person Mark Amery   schedule 17.04.2019