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

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

Вы не зашли.

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

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

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

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

attachment.php?item=1294&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 11:21:15)

Не в сети

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

rusiq
гуру
Зарегистрирован: 2014-07-16
Сообщений: 639
Рейтинг :   38 

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

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

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

Изменено rusiq (2019-01-19 07:33:11)

Не в сети

#3 2019-01-19 13: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 14:30:15

irbees2008
Продвинутый чайник ;)
Откуда Шахтинск
Зарегистрирован: 2012-03-14
Сообщений: 2,873
Рейтинг :   121 
Сайт

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

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

Не в сети

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

rusiq
гуру
Зарегистрирован: 2014-07-16
Сообщений: 639
Рейтинг :   38 

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

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

Не в сети

#6 2019-01-19 15: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 16:50:35)

Не в сети

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

rusiq
гуру
Зарегистрирован: 2014-07-16
Сообщений: 639
Рейтинг :   38 

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

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

Не в сети

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

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

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

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

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

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

Изменено ikv777vlg (2019-01-19 16:57:11)

Не в сети

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

irbees2008
Продвинутый чайник ;)
Откуда Шахтинск
Зарегистрирован: 2012-03-14
Сообщений: 2,873
Рейтинг :   121 
Сайт

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

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

Не в сети

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

rusiq
гуру
Зарегистрирован: 2014-07-16
Сообщений: 639
Рейтинг :   38 

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 17:53:34)

Не в сети

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

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

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

rusiq пишет:

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

Да ладно? yikes

Не в сети

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

rusiq
гуру
Зарегистрирован: 2014-07-16
Сообщений: 639
Рейтинг :   38 

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

Ну а то.

Не в сети

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

rusiq
гуру
Зарегистрирован: 2014-07-16
Сообщений: 639
Рейтинг :   38 

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>', '<', '>', '&', '|', '"', '$', '\', ''', ' ', '\"');
	$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>', '<', '>', '&', '|', '"', '$', '\', ''', ' ', '\"');
	$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 в уже существующем.

Не в сети

Подвал раздела

Работает на FluxBB