Очень красиво, когда код на каком-либо языке программирования оформлен в записях аналогично тому, как его видит разработчики. Данная штука, пожалуй, была уже у всех блггеров, кроме меня :)
Поэтому, я тоже прикрутил класс для подсветки синтаксиса в свой блог и сейчас покажу, как это сделал.
Если делать как многие, то нужно использовать самый классный класс :) для этих задач (я сравнивал несколько - этот лучший). Скачаем GeSHi - Generic Syntax Highlighter и забросим его в свой каталог классов.
Для себя я сделал специальную функцию, которая подсвечивает коды в тексте по принципу BB кодов. То есть подсвечиваются только блоки [code=синтаксис][/code]. Параметр "синтаксис" необязателен. Если его нет, то функция подсветит блок по дефолтному значению языка. Для меня это php. Получается, что блоки "[ code=php] ... немного php кода ... [/code] и "[ code] ... еще примеры php функций ... [/code]" будут обработаны одинаково по правилам php.
Итак, лицезрим работу класса для подсветки синтаксиса на примере этой функции :)
function geshi_highlight($sText, $sLang = 'php')
{
// В 0-ом весь блок (с тегами), 1-ом названия языков, во 2-ом сам код.
preg_match_all('#\[code=?[\'"]?([0-9a-z]*)[\'"]?\](.*?)\[/code\]#si', $sText, $a);
if (@$a[2][0])
{
$cd = dirname(__FILE__) . '/';
require_once($cd . 'geshi.php');
// Передается текст, язык, путь к файлам с правилами подсветки
$oGeshi =& new GeSHi('', $sLang, $cd . 'geshi/');
foreach ($a[2] as $n=>$sCode)
{
if (trim($a[1][$n]))
$sLang = trim($a[1][$n]);
$oGeshi->set_source(trim($sCode));
$oGeshi->set_language($sLang);
$sCode = '<div class="geshi_highlighted">';
$sCode .= $oGeshi->parse_code() . '</div>';
$sText = str_replace($a[0][$n], $sCode, $sText);
}
}
return $sText;
}
Функцию я запихнул в файл с именем helper_geshi.php и положил там же, где файл geshi.php. Пример использования в скриптах понятен. Верно? :) Можно заметить, что будут проблемы, если в тексте окажется два и более блока с одинаковым кодом, так как str_replace() заменяет все совпадения. Но только я себе не могу представить такой пример, когда бывали такие совпадения :)
Внес изменения в цветовую гамму файла для подсветки php синтаксиса. Стандартный какой-то весь красный. А в PHP Expert Editor-е как-то все более красиво всегда было. Мой вариант раскрасски здесь.
Еще мне понадобилось расписать стили блока, в который я вставил обработанный код. В файл стилей добавлено следующее описание.
.geshi_highlighted
{
border: 1px solid #555555;
padding: 0px 7px;
display: block;
overflow: auto;
font-size: 14px;
background: #f5f5f5;
/* И, всетаки, IE уебан */
// width: 570px;
}
Красота...