Index SiteMap Portfolio

Назад

апр
26

Подсветка синтаксиса.

Очень красиво, когда код на каком-либо языке программирования оформлен в записях аналогично тому, как его видит разработчики. Данная штука, пожалуй, была уже у всех блггеров, кроме меня :)

Поэтому, я тоже прикрутил класс для подсветки синтаксиса в свой блог и сейчас покажу, как это сделал.

Если делать как многие, то нужно использовать самый классный класс :) для этих задач (я сравнивал несколько - этот лучший). Скачаем 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;
}

Красота...

Добавить в закладки на google.com Добавить в закладки на bobrdobr.ru Добавить в закладки на del.icio.us Добавить в закладки на technorati.com Добавить в закладки на linkstore.ru Добавить в закладки на news2.ru Добавить в закладки на rumarkz.ru Добавить в закладки на memori.ru Добавить в закладки на moemesto.ru

Ваше мнение

* Имя:
* E-mail:
*Этот адрес не публикуется. Для общих контаков оставляйте адрес в комментарии.
Сайт/Блог:
Примечание. Комментарии находятся в теге <noindex>, что значит: смысла срать здесь нет.

Комментарии

10.07.2008 НаташкаС
Супер, Жэнька!
Расцеш не па днях
Вельмі прыемна! :)
Ответ:Спасибо :)
 
Добавить в закладки на google.com Добавить в закладки на bobrdobr.ru Добавить в закладки на del.icio.us Добавить в закладки на technorati.com Добавить в закладки на linkstore.ru Добавить в закладки на rumarkz.ru Добавить в закладки на memori.ru Добавить в закладки на moemesto.ru

 Бесплатно

Читать мою ленту
Получать RSS-ленту на почту


Хостинг предоставлен компанией
TutHost.com