Фильтр 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 есть опция «центра», но как насчет «правильного выравнивания»?
  • Jinja2 и Json
  • Отображение полей формы jinja2 на основе значения атрибута
  • Включить html-файл в шаблон Jinja2
  • Оказание JS с Jinja приводит к неверному числу, а не к строке
  • Как получить связанную модель с помощью пользовательского действия администратора в Django?
  • Круглый фильтр Jinja2 не округляется
  • Разрешен ли встроенный код в шаблонах Jinja?
  •  
    Interesting Posts for Van-Lav

    Python – как работают передаточные значения?

    Python Tools Visual Studio 2017 RC

    Вставка или обновление в таблице «django_admin_log» нарушает ограничение внешнего ключа при сохранении новой модели в admin

    Проект PyCharm Django не запускается с отладкой

    Openshift запускает cron с недопустимой версией python

    Шифрование и расшифровка RSA в Python

    очистить терминал в python

    Есть ли эквивалент javascript для инструкции python pass, которая ничего не делает?

    сохранение загруженных фотографий и документов – файловая система и база данных blob

    Как я могу обрабатывать раздел файла, как будто это сам файл?

    Перегрузка функции Python

    Множественный анализ корреспонденции с нет-двоичными категориальными переменными-пустыми в Python с использованием модулей mca и prince

    Эффективный расчет расстояния между N точками и ссылкой в ​​numpy / scipy

    AttributeError: объект «Namespace» не имеет атрибута

    проблема работает привет мир с веб-сервером торнадо (Python 2.5, Win 7)

    Python - лучший язык программирования в мире.