Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2017-11-06 23:59:22

Majestio
Участник
Зарегистрирован: 2017-10-25
Сообщений: 13

Нужен код [pre]

Приветствую!

Восстановил свою страничку (majestio.info) под последний движок. В старом, уже не помню как, реализовывал поддержку bb-кода [pre]. Тут получается кривовато sad Дело в том, что коды заменяются на нужные блоки со стилями, но содержимое "транслируется", а нужно пропускать содержимое как есть.

Может кто-то подобное решал?

Offline

#2 2017-11-07 12:37:19

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Нужен код [pre]

@Majestio, тег pre это разновидность тега code? Чем они отличаются?

Offline

#3 2017-11-07 20:12:52

Majestio
Участник
Зарегистрирован: 2017-10-25
Сообщений: 13

Re: Нужен код [pre]

Visman пишет:

@Majestio, тег pre это разновидность тега code? Чем они отличаются?

И тот, и другой тег определяют блок текста с моноширинным шрифтом. Описалово следующее:

Тег <code> предназначен для отображения одной или нескольких строк текста, который представляет собой программный код. Сюда относятся имена переменных, ключевые слова, тексты функции и т.д. Браузеры обычно отображают содержимое контейнера <code> как моноширинный текст уменьшенного размера.

В отличие от тега <pre> дополнительные пробелы внутри контейнера <code> не учитываются, так же, как и переносы текста. Поэтому используйте тег <br> или <p> для создания переносов.

Ну не суть. Я же писал про кастомные bb-коды. А как их оформить, какими html-тегами - дело десятое. Главное - назначение. На своем сайте-блоге мне требуется чередовать участки кода и участки конфиг-файлов и подобного. При этом, я хочу настроить подсветку синтаксиса. Ужэ это сделано. Но на "костылях". Но увы, блок [pre][/pre] не пропускается и "фильтруется" движком форума, поэтому пока пустые строки в этом блоке запрещены (иначе плывет разметка). Цветовая раскраска синтаксиса реализуется посредством javascript либы.

Как уже все сделал - таки нашел твой (ничего если я на "ты"?) сайт. На сколько я помню, раньше у него был другой адрес. В общем, скачал твою сборку, развернул на виртуалке. После исследования кода парсера мне таки удалось реализовать правильно тег [pre]. Пример:

ad81842276be7664eaf8327d499e0727.png

Но ... раскраска с помощью javascript мне не нравиться. Заявленное автоматическое распознавание языков - работает часто неправильно. Хочется реализовать раскраску на сервере, с помощью php. Беглое гугление дало наводку на эту либу (https : //github.com/scrivo/highlight.php).

Осталось опять лезть в код форума и пробовать реализовать тег [code=язык_программирования][/code], чтобы передавать "раскрашивателю" id нужного языка. А вот тут будет сложнее. Придется переписывать парсер значительно, тамошняя разбивка с указанием позиции символом \1 - слабовата для этой задачи.

Ну вот как-то так. Если есть желание - пропатченный код твоей сборки для [pre] могу скинуть, дай знать.

Offline

#4 2017-11-08 09:18:47

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Нужен код [pre]

Если добавить в функцию do_bbcode() сразу после объявления глобальных переменных что-то такое:

	$text = preg_replace_callback('%\[pre\](.*?)\[/pre\]%s', function($matches) {
		return '<pre>' . str_replace(['[', ']'], ['&#91;' , '&#93;'], $matches[1]) . '</pre>';
	}, $text);

то на выходе должен получаться html тег <pre> при bb-коде [pre]. BB-коды внутри него обрабатываться не будут.

Еще и зависимости в парсере нужно прописывать.
+ тег [ code ] кажется остается, так как обрабатывается раньше.

P.S. Парсер нужно менять, так как этот несимметричный smile между проверкой и выводом bb-кодов.

Offline

#5 2017-11-08 09:24:50

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Нужен код [pre]

Если же bb-коды внутри него нужны, то можно поменять

str_replace(['[', ']'], ['&#91;' , '&#93;'], $matches[1])

на требования html

внутри контейнера <pre> допустимо применять любые теги кроме следующих: <big>, <img>, <object>, <small>, <sub> и <sup>.

str_replace(['[img', '[sub', ...], ['&#91;img', '&#91;sub', ...], $matches[1])

Offline

#6 2017-11-08 09:42:37

Majestio
Участник
Зарегистрирован: 2017-10-25
Сообщений: 13

Re: Нужен код [pre]

Не не не. Это я уже сделал. Все работает с [pre]. Посмотри измененные файлы - http : // majestio.info/stuff/file.7z , если понравиться - может свою сборку пропатчишь. А я буду копаться, как "научить" тег code отдавать язык.

Offline

#7 2017-11-15 12:58:23

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Нужен код [pre]

@Majestio, в продолжении темы добавления/изменения бб-кодов --> https://fluxbb.qb7.ru/forum/viewtopic.p … 150#p30150

Offline

#8 2017-11-16 16:51:08

Majestio
Участник
Зарегистрирован: 2017-10-25
Сообщений: 13

Re: Нужен код [pre]

@Visman, посмотрел новый парсер - супер! Не могу сказать про быстродействие, для меня это не критично. Главное что я увидел (что важное для меня), что при парсинге [ code=language] - блок нормально обрабатывается и language присутствует в $attrs['Def'].

Но, увы, проблема одна не ходит smile Пытаюсь подключить "раскрашиватель кода" от github.com/scrivo/highlight.php - так там даже демо не заводится, выдает ошибки. Если сможешь/не лениво, может быть глянешь?

Нашел вроде более лучший вариант "GeSHi - Generic Syntax Highlighter"

Редактировался Majestio (2017-11-16 18:13:49)

Offline

#9 2017-11-16 18:24:07

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Нужен код [pre]

@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>';
        },
    ],

Offline

#10 2017-11-16 18:26:46

Majestio
Участник
Зарегистрирован: 2017-10-25
Сообщений: 13

Re: Нужен код [pre]

Ну тоже можно конечно. У меня раньше и был такой "раскрашиватель" на javascript'е. Показалось, что на стороне сервера (на php) будет удобнее. Хотя уже сомневаюсь))) То на то.

Offline

#11 2017-11-16 18:31:34

Majestio
Участник
Зарегистрирован: 2017-10-25
Сообщений: 13

Re: Нужен код [pre]

Для меня "тюнинг" форума - задача вообще не приоритетная, но важная. Ты мне сэкономил немного времени и ... нервов))) "Переодену" свой сайт в твою сборку и  займусь таки наконец работой. В общем, огромное тебе спасибо!!!

Offline

#12 2017-11-16 18:35:48

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Нужен код [pre]

@Majestio, хорошо бы увидеть статистику по времени генерации страниц на оригинальном парсере и на моем, а то может там все плохо wink

Offline

#13 2017-11-16 18:47:55

Majestio
Участник
Зарегистрирован: 2017-10-25
Сообщений: 13

Re: Нужен код [pre]

@Visman, хорошо. Попробую завтра утром провести тест. Выберу большой кусок С++ кода. Закатаю твою сборку с оригинальным парсером. Размещу страничку с этим кодом. Сделаю 10 генераций и запишу времена. Потом то же самое сделаю, но с твоим парсером. Ну и отпишусь.

Редактировался Majestio (2017-11-16 18:48:55)

Offline

#14 2017-11-16 19:01:45

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Нужен код [pre]

@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.

Offline

#15 2017-11-17 09:06:33

Majestio
Участник
Зарегистрирован: 2017-10-25
Сообщений: 13

Re: Нужен код [pre]

Visman пишет:

@Majestio, хорошо бы увидеть статистику по времени генерации страниц на оригинальном парсере и на моем, а то может там все плохо wink

Все супер!

Как и обещал - вот результаты теста. Использовал в качестве наполнителя произвольный 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

#16 2017-11-20 20:50:48

Majestio
Участник
Зарегистрирован: 2017-10-25
Сообщений: 13

Re: Нужен код [pre]

Visman пишет:

@Majestio, подключение GeSHi - Generic Syntax Highlighter:

Эхх ... вылез косяк. Не хочет корректно обрабатывать вот это:
[code=sql]
to_char(table."DateField"::date, 'YYYY')
[/code]
Последние одинарные кавычки отставляет как &apos;

Редактировался Majestio (2017-11-20 20:51:55)

Offline

#17 2017-11-20 21:24:44

Majestio
Участник
Зарегистрирован: 2017-10-25
Сообщений: 13

Re: Нужен код [pre]

ADD: и похоже это баг в htmlspecialchars_decode

Offline

#18 2017-11-20 21:37:11

Majestio
Участник
Зарегистрирован: 2017-10-25
Сообщений: 13

Re: Нужен код [pre]

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("&apos;", "'", $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

#19 2017-11-21 05:11:53

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Нужен код [pre]

@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("&apos;", "'", $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'] будет не определен и в браузер пойдет код без экранирования спецсимволов.

Offline

#20 2017-11-21 08:14:08

Majestio
Участник
Зарегистрирован: 2017-10-25
Сообщений: 13

Re: Нужен код [pre]

тоже верно

Offline

#21 2017-11-21 08:21:12

Majestio
Участник
Зарегистрирован: 2017-10-25
Сообщений: 13

Re: Нужен код [pre]

В общем, вопрос можно сказать - решен. Допилил keyCaptcha, bb-код pre, гугл-аналитику. Теперь мой блог снова в строю smile Еще раз - благодарю!

Offline

Подвал доски

Под управлением FluxBB. Хостинг Hostens