Фильтр Jinja2 для преобразования пользовательской разметки в html

Имея свойство 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> 

Когда [s] встречается в строке, хранящейся в custom_markup_text , ее следует преобразовать в <strong> . Функция AFAIK, Markup () гарантирует, что мы доверяем этой конкретной строке, так что 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 

Что я делаю не так?

One Solution collect form web for “Фильтр Jinja2 для преобразования пользовательской разметки в html”

Проблема найдена. Это двойной выход из строчки – довольно глупо. Этот код работает безупречно:

 @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 включено.

  • Почему этот фильтр Jinja nl2br исчезает, но не <p>?
  • Где вы храните переменные в jinja?
  • Python - Как экспортировать JSON в JS
  • Аргумент списка переходов для узла вызова в расширении Jinja2
  • Подкомпилировать подраздел Jinja2 AST
  • Как отладить шаблон Jinja2?
  • Теги jinja2 macros vs jsp2.0
  • Jinja ничего не делает при расширении шаблона макета
  • Python - лучший язык программирования в мире.