Я использую расширение bbcode PECL для определения набора тегов, которые я разрешаю для форума. Я реализовал почти все теги, описанные на http://www.bbcode.org.
Пользователи форума ожидают, что когда они перейдут на новую строку в поле ввода, их сообщение также займет новую строку. Я пытаюсь этого добиться.
Путь nl2br()
nl2br()
отлично подходит для того, чтобы заставить браузер принимать новые строки, когда пользователь их вводит, поскольку он находит новые строки и вставляет там теги <br />
, чтобы браузер также принимал новую строку. Но это бросает вызов некоторым более сложным разметкам.
Например:
[ul]
[li]list item 1[/li]
[li]list item 2[/li]
[/ul]
приводит к
<ul><br />
<li>list item 1</li><br />
<li>list item 2</li><br />
<ul>
который разбрасывает пробелы повсюду. Таблицы имеют похожие проблемы по той же причине. Кроме того, любой тег, который фактически отображает пробелы (например, <pre><code>code goes here</code></pre>
), получает двойной интервал. Ики.
Метод CSS
В CSS есть white-space
правил, которые могут пригодиться в таких ситуациях. Если мы поместим все сообщения форума в элемент .bbcode
, а затем просто включим правило таблицы стилей
.bbcode {
white-space: pre-line;
}
тогда браузер сохранит символы новой строки, свернет другие пробелы и перенесет слова. Звучит довольно идеально. Однако элементы списка и т. Д. По-прежнему сталкиваются с этой проблемой двойного интервала, потому что браузер отображает новую строку после каждого </li>
.
Мы можем обойти некоторые из этого, определив:
.bbcode {
white-space: pre-line;
}
.bbcode * {
white-space: normal;
}
что облегчает проблему в списках и таблицах. Однако теперь новые строки появляются только в корневом элементе сообщения, поэтому ввод новой строки, например, таблица-ячейка не работает.
Как-мне-сделать-это? способ
На самом деле я бы хотел, чтобы комбинация двух эффектов:
- браузер берет новую строку, когда источник берет новую строку за пределами всех тегов
- браузер принимает новую строку, когда источник принимает новую строку не сразу после закрытия или открытия блочных или структурных тегов
В идеале, я думаю, что [li]some\ntext[/li]
должно давать две строки, [li]sometext[/li]\n
должно давать только одну строку, а [i]sometext[/i]\n
должно давать две строки.
Как это делается? Или, скорее, что люди обычно делают на форумах, использующих bbcode? Я, вероятно, мог бы написать функцию, в которой я определил бы все случаи, в которых должен быть вставлен <br />
, это сильно пахнет изобретением множества колес.