Наверное, каждый, кто публикует код в статьях, хочет, чтобы он выглядел по-человечески: с подсветкой синтаксиса и преобразованием специальных символов в соответствующие мнемоники. Допустим, угловые скобки нужно преобразовать в < и > (а они используются в HTML-тегах, операторах сравнения, операторах доступа к методам/свойствам и т.п.).
На своём сайте я использую front-end-библиотеку highlightjs . При загрузке страницы эта библиотека ищет на странице код между тегами и подсвечивает его (обёртывает ключевые слова и прочие конструкции языка в тег span с различными стилями).
<pre><code>Код здесь</code></pre>
Но, допустим, нужно поделиться куском HTML. Что же делать, ведь HTML-теги отобразятся на странице в соответствии с их свойствами, а не как текст. Здесь-то и пришлось написать простой плагин для MODX, который бы при формировании страницы обрабатывал текст между тегами pre и code.
Плагин
$templates = [4];
if (!in_array($modx->resource->get('template'), $templates)) {
return;
}
/**
* Возвращает массив кода меду тегами
* @param string $text Текст страницы
* @return array Массив строк
*/
if (!function_exists('getTextBetweenCodeTags')) {
function getTextBetweenCodeTags($text)
{
$pattern = "/<pre><code>(.*?)<\/code><\/pre>/s";
preg_match_all($pattern, $text, $matches);
return $matches;
}
}
$html = &$modx->resource->_output;
$codes = getTextBetweenCodeTags($html);
$codes = (isset($codes[1])) ? $codes[1] : array();
foreach ($codes as &$code)
{
// Модификация кода
$codeNew = $code;
$codeNew = htmlentities($codeNew);
$codeNew = str_replace("&#91;", '[', $codeNew);
$codeNew = str_replace("&#93;", ']', $codeNew);
//$codeNew = str_replace("\n", '<br>', $codeNew);
$codeNew = str_replace("\t", ' ', $codeNew);
$html = str_replace($code, $codeNew, $html);
}
$modx->resource->set('content', $html);
Данный плагин нужно привязать к событию OnWebPagePrerender.