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

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

Наверное, каждый, кто публикует код в статьях, хочет, чтобы он выглядел по-человечески: с подсветкой синтаксиса и преобразованием специальных символов в соответствующие мнемоники. Допустим, угловые скобки нужно преобразовать в < и > (а они используются в HTML-тегах, операторах сравнения, операторах доступа к методам/свойствам и т.п.).

На своём сайте я использую front-end-библиотеку https://highlightjs.org. При загрузке страницы эта библиотека ищет на странице код между тегами и подсвечивает его (обёртывает ключевые слова и прочие конструкции языка в тег span с различными стилями).

<pre> <code> Код здесь </code> </pre> 

Но, допустим, нужно поделиться куском HTML. Что же делать, ведь HTML-теги отобразятся на странице в соответствии с их свойствами, а не как текст. Здесь-то и пришлось написать простой плагин для MODX, который бы при формировании страницы обрабатывал текст между тегами pre и code.

Плагин

/**
 * Возвращает массив кода меду тегами
 * @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 = htmlentities($code);
    $codeNew = str_replace("&amp;#91;", '[', $codeNew);
    $codeNew = str_replace("&amp;#93;", ']', $codeNew);
    $codeNew = str_replace("\t", '&nbsp;&nbsp;&nbsp;&nbsp;', $codeNew);
    $html = str_replace($code, $codeNew, $html);
}


$modx->resource->set('content', $html);

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

Комментарии