Добрый день. Я занимаюсь web-разработкой и почти всем, что с этим связано.

Подсветка кода в статьях для MODX Revolution

Наверное, каждый, кто публикует код в статьях, хочет, чтобы он выглядел по-человечески: с подсветкой синтаксиса и преобразованием специальных символов в соответствующие мнемоники. Допустим, угловые скобки нужно преобразовать в < и > (а они используются в 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 = "/
(.*?)<\/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", '
', $codeNew); $codeNew = str_replace("\t", '    ', $codeNew); $html = str_replace($code, $codeNew, $html); } $modx->resource->set('content', $html);

Данный плагин нужно привязать к событию OnWebPagePrerender.

Комментарии