Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Страницы 1
Приветствую!
Восстановил свою страничку (majestio.info) под последний движок. В старом, уже не помню как, реализовывал поддержку bb-кода [pre]. Тут получается кривовато Дело в том, что коды заменяются на нужные блоки со стилями, но содержимое "транслируется", а нужно пропускать содержимое как есть.
Может кто-то подобное решал?
Offline
@Majestio, тег pre это разновидность тега code? Чем они отличаются?
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Majestio, тег pre это разновидность тега code? Чем они отличаются?
И тот, и другой тег определяют блок текста с моноширинным шрифтом. Описалово следующее:
Тег <code> предназначен для отображения одной или нескольких строк текста, который представляет собой программный код. Сюда относятся имена переменных, ключевые слова, тексты функции и т.д. Браузеры обычно отображают содержимое контейнера <code> как моноширинный текст уменьшенного размера.
В отличие от тега <pre> дополнительные пробелы внутри контейнера <code> не учитываются, так же, как и переносы текста. Поэтому используйте тег <br> или <p> для создания переносов.
Ну не суть. Я же писал про кастомные bb-коды. А как их оформить, какими html-тегами - дело десятое. Главное - назначение. На своем сайте-блоге мне требуется чередовать участки кода и участки конфиг-файлов и подобного. При этом, я хочу настроить подсветку синтаксиса. Ужэ это сделано. Но на "костылях". Но увы, блок [pre][/pre] не пропускается и "фильтруется" движком форума, поэтому пока пустые строки в этом блоке запрещены (иначе плывет разметка). Цветовая раскраска синтаксиса реализуется посредством javascript либы.
Как уже все сделал - таки нашел твой (ничего если я на "ты"?) сайт. На сколько я помню, раньше у него был другой адрес. В общем, скачал твою сборку, развернул на виртуалке. После исследования кода парсера мне таки удалось реализовать правильно тег [pre]. Пример:
Но ... раскраска с помощью javascript мне не нравиться. Заявленное автоматическое распознавание языков - работает часто неправильно. Хочется реализовать раскраску на сервере, с помощью php. Беглое гугление дало наводку на эту либу (https : //github.com/scrivo/highlight.php).
Осталось опять лезть в код форума и пробовать реализовать тег [code=язык_программирования][/code], чтобы передавать "раскрашивателю" id нужного языка. А вот тут будет сложнее. Придется переписывать парсер значительно, тамошняя разбивка с указанием позиции символом \1 - слабовата для этой задачи.
Ну вот как-то так. Если есть желание - пропатченный код твоей сборки для [pre] могу скинуть, дай знать.
Offline
Если добавить в функцию do_bbcode() сразу после объявления глобальных переменных что-то такое:
$text = preg_replace_callback('%\[pre\](.*?)\[/pre\]%s', function($matches) {
return '<pre>' . str_replace(['[', ']'], ['[' , ']'], $matches[1]) . '</pre>';
}, $text);
то на выходе должен получаться html тег <pre> при bb-коде [pre]. BB-коды внутри него обрабатываться не будут.
Еще и зависимости в парсере нужно прописывать.
+ тег [ code ] кажется остается, так как обрабатывается раньше.
P.S. Парсер нужно менять, так как этот несимметричный между проверкой и выводом bb-кодов.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Если же bb-коды внутри него нужны, то можно поменять
str_replace(['[', ']'], ['[' , ']'], $matches[1])
на требования html
внутри контейнера <pre> допустимо применять любые теги кроме следующих: <big>, <img>, <object>, <small>, <sub> и <sup>.
str_replace(['[img', '[sub', ...], ['[img', '[sub', ...], $matches[1])
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Не не не. Это я уже сделал. Все работает с [pre]. Посмотри измененные файлы - http : // majestio.info/stuff/file.7z , если понравиться - может свою сборку пропатчишь. А я буду копаться, как "научить" тег code отдавать язык.
Offline
@Majestio, в продолжении темы добавления/изменения бб-кодов --> https://fluxbb.qb7.ru/forum/viewtopic.p … 150#p30150
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Visman, посмотрел новый парсер - супер! Не могу сказать про быстродействие, для меня это не критично. Главное что я увидел (что важное для меня), что при парсинге [ code=language] - блок нормально обрабатывается и language присутствует в $attrs['Def'].
Но, увы, проблема одна не ходит Пытаюсь подключить "раскрашиватель кода" от github.com/scrivo/highlight.php - так там даже демо не заводится, выдает ошибки. Если сможешь/не лениво, может быть глянешь?
Нашел вроде более лучший вариант "GeSHi - Generic Syntax Highlighter"
Редактировался Majestio (2017-11-16 18:13:49)
Offline
@Majestio, напишу про highlight.js, так как его сейчас для теста подключил:
1. файл highlight.pack.js в папку js скопировал;
2. папку styles из архива скопировал в папку style форума;
3. в файле main.tpl форума добавил подключение стиля:
строка
<link rel="stylesheet" href="/style/styles/default.css" />
после строки
<pun_head>
4. бб-код code стал такого вида:
[
'tag' => 'code',
'type' => 'block',
'recursive' => true,
'text only' => true,
'pre' => true,
'attrs' => [
'Def' => [
'format' => '%^\w+$%',
],
'no attr' => true,
],
'handler' => function($body, $attrs, $parser) {
$body = trim($body, "\n\r");
$class = substr_count($body, "\n") > 28 ? ' class="vscroll"' : '';
$parser->setJsLink('highlight', 'js/highlight.pack.js');
$parser->setJsCode('highlight', 'hljs.initHighlightingOnLoad();');
$lg = isset($attrs['Def']) ? " class=\"hljs {$attrs['Def']}\"" : ' class="nohighlight"';
return '</p><div class="codebox"><pre' . $class . '><code' . $lg . '>' . $body . '</code></pre></div><p>';
},
],
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Ну тоже можно конечно. У меня раньше и был такой "раскрашиватель" на javascript'е. Показалось, что на стороне сервера (на php) будет удобнее. Хотя уже сомневаюсь))) То на то.
Offline
Для меня "тюнинг" форума - задача вообще не приоритетная, но важная. Ты мне сэкономил немного времени и ... нервов))) "Переодену" свой сайт в твою сборку и займусь таки наконец работой. В общем, огромное тебе спасибо!!!
Offline
@Majestio, хорошо бы увидеть статистику по времени генерации страниц на оригинальном парсере и на моем, а то может там все плохо
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Visman, хорошо. Попробую завтра утром провести тест. Выберу большой кусок С++ кода. Закатаю твою сборку с оригинальным парсером. Размещу страничку с этим кодом. Сделаю 10 генераций и запишу времена. Потом то же самое сделаю, но с твоим парсером. Ну и отпишусь.
Редактировался Majestio (2017-11-16 18:48:55)
Offline
@Majestio, подключение GeSHi - Generic Syntax Highlighter:
1. через Composer нужно подключить пакет geshi/geshi к сборке
composer require geshi/geshi
2. изменить бб-код code:
[
'tag' => 'code',
'type' => 'block',
'recursive' => true,
'text only' => true,
'pre' => true,
'attrs' => [
'Def' => [
'format' => '%^\w+$%',
],
'no attr' => true,
],
'handler' => function($body, $attrs) {
$body = trim($body, "\n\r");
$class = substr_count($body, "\n") > 28 ? ' class="vscroll"' : '';
if (isset($attrs['Def'])) {
$geshi = new \GeSHi(htmlspecialchars_decode($body, ENT_QUOTES), $attrs['Def']);
$body = $geshi->parse_code();
}
return '</p><div class="codebox"><pre' . $class . '><code>' . $body . '</code></pre></div><p>';
},
],
P.S. Дополнительная нагрузка с GeSHi будет идти на сервер.
P.P.S. В обоих случаях нужно разобраться с бэкграундом у code.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Majestio, хорошо бы увидеть статистику по времени генерации страниц на оригинальном парсере и на моем, а то может там все плохо
Все супер!
Как и обещал - вот результаты теста. Использовал в качестве наполнителя произвольный C++ файл из своих наработок (объем 44кб, 878 строк). На хостинг не заливал - гонял под виртуалкой на OpenServer'е (Apache 2.4 x64 + PHP 7.1 x64).
На твоей сборке с парсером по умолчанию:
Сгенерировано за 0.050 сек, 11 запросов выполнено - Использовано памяти: 2.11 Мбайт (Пик: 2.17 Мбайт)
Сгенерировано за 0.044 сек, 11 запросов выполнено - Использовано памяти: 2.11 Мбайт (Пик: 2.17 Мбайт)
Сгенерировано за 0.047 сек, 11 запросов выполнено - Использовано памяти: 2.11 Мбайт (Пик: 2.17 Мбайт)
На твоей сборке с твоим парсером и подключенным "GeSHi - Generic Syntax Highlighter":
Сгенерировано за 0.257 сек, 11 запросов выполнено - Использовано памяти: 3.35 Мбайт (Пик: 3.6 Мбайт)
Сгенерировано за 0.252 сек, 11 запросов выполнено - Использовано памяти: 3.35 Мбайт (Пик: 3.6 Мбайт)
Сгенерировано за 0.256 сек, 11 запросов выполнено - Использовано памяти: 3.35 Мбайт (Пик: 3.6 Мбайт)
Конечно результат медленее в 5 раз, но за все нужно платить. И, тем не менее, результат все равно отличный - визуально мало отличимо! Буду заниматься стилями, ибо раскраска и шрифты получились вырвиглазнвми.
Еще раз сенкс!!!
PS. ИМХО, если бы подключил раскраску джаваскриптом - думаю было бы все значительно быстрее.
Редактировался Majestio (2017-11-17 09:12:36)
Offline
@Majestio, подключение GeSHi - Generic Syntax Highlighter:
Эхх ... вылез косяк. Не хочет корректно обрабатывать вот это:
[code=sql]
to_char(table."DateField"::date, 'YYYY')
[/code]
Последние одинарные кавычки отставляет как '
Редактировался Majestio (2017-11-20 20:51:55)
Offline
ADD: и похоже это баг в htmlspecialchars_decode
Offline
ADD2: Надо менять хэндлер обработки [ code] на это, тогда работает как надо:
'handler' => function($body, $attrs) {
$body = trim($body, "\n\r");
$class = substr_count($body, "\n") > 28 ? ' class="vscroll"' : '';
$body = htmlspecialchars_decode($body, ENT_QUOTES);
$body = str_replace("'", "'", $body);
if (isset($attrs['Def'])) {
$geshi = new \GeSHi($body, $attrs['Def']);
$body = $geshi->parse_code();
}
return '</p><div class="codebox"><pre' . $class . '><code>' . $body . '</code></pre></div><p>';
},
Ну или сократить, вложив вызовы.
Редактировался Majestio (2017-11-20 21:37:58)
Offline
@Majestio, забыл флаг указать
$geshi = new \GeSHi(htmlspecialchars_decode($body, ENT_QUOTES | ENT_XHTML), $attrs['Def']);
А так
'handler' => function($body, $attrs) { $body = trim($body, "\n\r"); $class = substr_count($body, "\n") > 28 ? ' class="vscroll"' : ''; $body = htmlspecialchars_decode($body, ENT_QUOTES); $body = str_replace("'", "'", $body); if (isset($attrs['Def'])) { $geshi = new \GeSHi($body, $attrs['Def']); $body = $geshi->parse_code(); } return '</p><div class="codebox"><pre' . $class . '><code>' . $body . '</code></pre></div><p>'; },
лучше не делать.
Вдруг $attrs['Def'] будет не определен и в браузер пойдет код без экранирования спецсимволов.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
тоже верно
Offline
В общем, вопрос можно сказать - решен. Допилил keyCaptcha, bb-код pre, гугл-аналитику. Теперь мой блог снова в строю Еще раз - благодарю!
Offline
Страницы 1