Разрыв строки в Chameleon

Я использовал структуру pyramid для создания большого веб-приложения.

Среди прочего, это приложение позволяет пользователю вводить текст в поле формы текстовой области. Затем этот текст сохраняется в базе данных и, конечно же, может быть снова прочитан и отображен позже.

Для отображения содержимого я использую движок шаблонов Chameleon.

Это работает нормально, за исключением того, что разрыв строки отображается неправильно (вообще не отображается). Вероятно, это связано с тем, что новые строки, введенные в текстовую область, не вызывают новую строку в HTML при отображении через Chameleon. Как это исправить?

Замена новых строк на <br>-теги не помогает, поскольку по умолчанию Chameleon экранирует все HTML-теги. Я знаю, что эту функцию можно отключить, но я не хочу этого делать, чтобы избежать межсайтового скриптинга.


person Meneldur    schedule 23.02.2013    source источник


Ответы (2)


Вам нужно разбить текст на отдельные строки, а затем визуализировать это с помощью цикла и тегов <br/>:

<span tal:omit-tag="" 
      tal:repeat="line text_with_newlines.splitlines()">
  ${line}<br />
</span>

При этом используется метод str.splitlines() для разделения текста на новые строки, а затем цикл добавляет тег разрыва <br /> после каждой строки текста.

Вы совершенно правы, не делая этого в представлении, а затем заставляя Chameleon принимать вставленные вами теги <br />, устанавливая флаг structure:. К счастью, в этом нет абсолютно никакой необходимости.

person Martijn Pieters    schedule 23.02.2013

Другая возможность состоит в том, чтобы сделать что-то вроде следующего:

import webhelpers.html.tags as t
s = t.literal(t.BR).join(s.split(t.NL))

Конечно, вы можете создать из него вспомогательную функцию.

person born    schedule 24.02.2013
comment
Проблема с этим подходом заключается в том, что вам придется отключить автоматическое экранирование HTML, которое делает Chameleon; вам придется сначала экранировать s вручную, затем превратить новые строки в теги разрыва, а затем интерполировать результат с помощью переключателя structure:. ОП по праву не хочет этого делать; всегда есть риск, когда вы делаете побег самостоятельно. - person Martijn Pieters; 24.02.2013
comment
нет, вам не нужно добавлять structure: при выводе объекта типа t.literal (см. sluggo.scrapping.cc/python/WebHelpers/modules/html/builder.html) - person born; 24.02.2013
comment
ОП просит что-то использовать в chameleon здесь. - person Martijn Pieters; 24.02.2013