Next Generation CMS :: Форум поддержки

Заинтересовала наша система? Тогда этот форум для Вас!

rss

Вы не зашли.

Объявление

#1 2019-01-16 09:35:56

ikv777vlg
Пользователь
Откуда: Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   
Профиль

Что это: return "phphighlight('" . $match[0] . "')"; ?

Здравствуйте. С новым годом всех! smile
Решил посмотреть, как можно подключить TinyMCE 5 так, чтобы он ещё и работал. И меня сходу озадачило то, что CMS в новостях, оборачивает содержимое тегов <pre> в phphighlight('<code></code>'), и это так и отправляется в браузер. Версия движка последняя - 0.9.5.

http://ngcms.ru/forum/attachment.php?item=1294&amp;download=1

В файле engine/includes/classes/parse.class.php, строка 479.
Для чего нужна эта строка?

Что вообще сделать с блоком

Код:

        $content = preg_replace_callback(
            "/<code>(.*?)<\/code>/s",
            function ($match) {

                return "phphighlight('" . $match[0] . "')";
            },
            $content
        );

чтобы не создать угрозу безопасности? Я его пока закомментировал.

UPD. Точнее не оборачивает, а заменяет тег <code> внутри тега <pre>. Нужно разобраться, зачем он там вообще нужен. Но тем не менее, replace довольно загадочный.

Отредактированно ikv777vlg (2019-01-16 10:21:15)

Неактивен

 

#2 2019-01-19 06:27:14

rusiq
Пользователь
Зарегистрирован: 2014-07-16
Сообщений: 516
Рейтинг :   32 
Профиль  Вебсайт

Re: Что это: return "phphighlight('" . $match[0] . "')"; ?

Не понятно: зачем вы оборачиваете в <pre><code>, если есть bb [code].
Он автоматом добавит <pre>. А уже после этого js обработает ваш код, как видно на картинке такой используется.
Либо при создании/редактировании новости ставьте галочку Отключить автоформатирование

Код:

$content = preg_replace_callback(
    "/<code>(.*?)<\/code>/s",
    function ($match) {
        return phphighlight($match[1]);
    },
    $content
);

Отредактированно rusiq (2019-01-19 06:33:11)

Неактивен

 

#3 2019-01-19 12:25:10

ikv777vlg
Пользователь
Откуда: Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   
Профиль

Re: Что это: return "phphighlight('" . $match[0] . "')"; ?

Это нерабочий вариант. Потому-что мне нужно передать классы для визуализатора Prism.
Плюс, нужно включать поддержку bb-кодов в TinyMCE внутри Code sample plugin. Всё это не представляется возможным. Суть я понял, но в общем, ваш вариант - здесь не работает.
Задача заключается в том, чтобы блок с кодом 100% одинаково отображался и на сайте, и при редактировании новости в визуальном редакторе TinyMCE в админке.

CMS заменит bb-код, можно даже передачу класса в тег pre и code (для Prism нужен code внутри pre, либо с помощью плагинов для него, можно использовать <script type="text/plain"></script>, но это пока у меня не получилось сделать, да и смысла не вижу, как и не вижу смысла в том, чтобы использовать в тексте новости bb-код code, который преобразуется в <script ...>, который преобразуется призмом в <pre class="..."><code><code></pre>уже на JS) организовать, но как заставить Prism в админке, подсвечивать, например, такой код (пробел в bb-теге поставил, чтобы движок форума не ругался):

Код:

[code class="line-numbers  language-css"]body {... color:#666; ...}[/code ]

И как заставить TinyMCE в админке, не оборачивать вышеприведённый пример кода в bb-коде, в параграф <p>?

И вот зачем это всё? smile

Короче, визуализатору в админке надо так, и на сайте должно быть так:

Код:

<pre class="line-numbers  language-css"><code>body {
    background-color: #fff;
    margin: 0;
    padding: 0;
    height: auto !important;
    min-height: 100%;
    font: normal 11px/14px Tahoma, sans-serif;
    color: #666;
}
</code></pre>

Неактивен

 

#4 2019-01-19 13:30:15

irbees2008
Продвинутый чайник😁
Откуда: Шахтинск
Зарегистрирован: 2012-03-14
Сообщений: 2523
Рейтинг :   107 
Профиль  Вебсайт

Re: Что это: return "phphighlight('" . $match[0] . "')"; ?

попробуйhttps://ngcmshak.ru/nastroika-plaginov- … vkami.html там плагин с визуальными редакторами, тебе нужен ckeditor, у меня с ним проблем не было

Неактивен

 

#5 2019-01-19 14:05:04

rusiq
Пользователь
Зарегистрирован: 2014-07-16
Сообщений: 516
Рейтинг :   32 
Профиль  Вебсайт

Re: Что это: return "phphighlight('" . $match[0] . "')"; ?

Читайте внимательно, специально жирным выделю
Либо при создании/редактировании новости ставьте галочку Отключить автоформатирование

Неактивен

 

#6 2019-01-19 14:46:34

ikv777vlg
Пользователь
Откуда: Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   
Профиль

Re: Что это: return "phphighlight('" . $match[0] . "')"; ?

rusiq, отключение автоформатирования, даёт лишь возможность призму, правильно пронумеровать строки на странице новости. Кстати спасибо за этот совет, а то скриптом маркировалась только первая строка, и это всё из-за <br />. Отключил автоформатирование в настройках вообще. Но ответ на вопрос из первого топика, я так и не получил big_smile

irbees2008, конечно, этот ckeditor довольно крут. Я попробовал, посмотрел. Но я не буду искать лёгких путей, и попробую уж закончить начатое. Да и в принципах тончайшей настройки ckeditor, мне так сходу не разобраться. Новый TinyMCE довольно неплох, по сравнению с его третьей версией, которая добавляла к каждому параграфу стили

Код:

style="margin: 0px; padding: 0px; color: #000000; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18.46666717529297px; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"

Особенно забавно, выглядит line-height: 18.46666717529297px;, я просто валяюсь. Новая версия из коробки, таких приколов не имеет.
Не по теме, но как я буду добавлять изображения без платного Image Manager - пока неизвестно. Если вы знаете где достать аналог - подскажите, я просто ещё не дошёл до этого момента, застряв на Code Sample Plugin

И кстати,

irbees2008 написал:

попробуйhttps://ngcmshak.ru/nastroika-plaginov- … vkami.html там плагин с визуальными редакторами, тебе нужен ckeditor, у меня с ним проблем не было

Нет подсветки кода - нет проблем? wink

Отредактированно ikv777vlg (2019-01-19 15:50:35)

Неактивен

 

#7 2019-01-19 15:20:58

rusiq
Пользователь
Зарегистрирован: 2014-07-16
Сообщений: 516
Рейтинг :   32 
Профиль  Вебсайт

Re: Что это: return "phphighlight('" . $match[0] . "')"; ?

Стока суеты, когда уже всё написано было в этом топике http://ngcms.ru/forum/viewtopic.php?pid=44450#p44450

Неактивен

 

#8 2019-01-19 15:44:51

ikv777vlg
Пользователь
Откуда: Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   
Профиль

Re: Что это: return "phphighlight('" . $match[0] . "')"; ?

rusiq, написано что? Что изящнее отключить автоформатирование, чем закомментировать описанный выше код? Согласен.
Но это всё похоже на троллинг, от чего у меня должно уже было знатно подгореть. Но этого не случится, так как я из этого уже вырос.

И на всякий случай, таки повторю заголовок этой темы: "Что это: return "phphighlight('" . $match[0] . "')"; ?"

Кстати. А почему в том топике, в котором всё написано, вдруг $match[1] ?

Отредактированно ikv777vlg (2019-01-19 15:57:11)

Неактивен

 

#9 2019-01-19 16:39:17

irbees2008
Продвинутый чайник😁
Откуда: Шахтинск
Зарегистрирован: 2012-03-14
Сообщений: 2523
Рейтинг :   107 
Профиль  Вебсайт

Re: Что это: return "phphighlight('" . $match[0] . "')"; ?

есть, подключить плагин подсветки кода и все, хотя вот этот подключен sуntaxhighlighter, ну и сопутствующие скрипты и стили
https://ngcmshak.ru/interfeis-effekty-s … atyah.html

Неактивен

 

#10 2019-01-19 16:40:43

rusiq
Пользователь
Зарегистрирован: 2014-07-16
Сообщений: 516
Рейтинг :   32 
Профиль  Вебсайт

Re: Что это: return "phphighlight('" . $match[0] . "')"; ?

Ну так растите дальше и выше

1 return "phphighlight('" . $match[0] . "')"; - возвращает строку с найденной подстрокой, кавычки тут лишние, т.к. нам нужен возврат функции...
$match[0]

Код:

<code>body {
background-color: #fff;
margin: 0;
padding: 0;
height: auto !important;
min-height: 100%;
font: normal 11px/14px Tahoma, sans-serif;
color: #666;
}</code>

$match[1]

Код:

body {
background-color: #fff;
margin: 0;
padding: 0;
height: auto !important;
min-height: 100%;
font: normal 11px/14px Tahoma, sans-serif;
color: #666;
}

Отключаете автоформатирование, используете плагин для TinyMCE и ничего не случится с безопасностью. Т.к. плагин переводит содержимое pre code в html сущности.

Отредактированно rusiq (2019-01-19 16:53:34)

Неактивен

 

#11 2019-01-19 19:10:03

ikv777vlg
Пользователь
Откуда: Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   
Профиль

Re: Что это: return "phphighlight('" . $match[0] . "')"; ?

rusiq написал:

кавычки тут лишние, т.к. нам нужен возврат функции

Да ладно? yikes

Неактивен

 

#12 2019-01-20 00:50:56

rusiq
Пользователь
Зарегистрирован: 2014-07-16
Сообщений: 516
Рейтинг :   32 
Профиль  Вебсайт

Re: Что это: return "phphighlight('" . $match[0] . "')"; ?

Ну а то.

Неактивен

 

#13 2019-01-20 01:21:46

rusiq
Пользователь
Зарегистрирован: 2014-07-16
Сообщений: 516
Рейтинг :   32 
Профиль  Вебсайт

Re: Что это: return "phphighlight('" . $match[0] . "')"; ?

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

Код:

$content = preg_replace_callback(
    "/<code>(.*?)<\/code>/s",
    'phphighlight',
    $content
);

Но тогда функция phphighlight в файле engine\includes\inc\functions.inc.php выглядела бы не так

Код:

function phphighlight($content = '') {

    $f = array('<br>', '<br />', '<p>', '&lt;', '&gt;', '&amp;', '|', '&quot;', '$', '\', ''', '&nbsp;', '\"');
    $r = array("\n", "\n", "\n", '<', '>', '&', '\|', '"', '$', '', '\'', '', '"');
    $content = str_replace($f, $r, $content);
    $content = highlight_string($content, true);

    return $content;
}

Атак

Код:

function phphighlight(array $match) {
    $f = array('<br>', '<br />', '<p>', '&lt;', '&gt;', '&amp;', '|', '&quot;', '$', '\', ''', '&nbsp;', '\"');
    $r = array("\n", "\n", "\n", '<', '>', '&', '\|', '"', '$', '', '\'', '', '"');
    $content = str_replace($f, $r, $match[1]);
    $content = highlight_string($content, true);

    return $content;
}

А $match[1] используем, потому что функция highlight_string, выполняя `подсветку кода` оборачивает его в тег code. Но ведь нам не нужно вложеный тег code в уже существующем.

Неактивен

 

Board footer

Powered by FluxBB

[ Generated in 0.008 seconds, 23 queries executed ]