Плагин подсветки синтаксиса для TextPattern
Не нужно проводить психологические исследования, чтобы понять: плохо отформатированный код никто читать не будет. Стандартных средств подсветки синтаксиса в textpattern не нашлось, поэтому я полез в Google за плагином.
Плагин нашёлся довольно быстро и называется он труднопроизносимым словом krl_geshiSyntaxHighlight. Это расширение использует опенсорсный движок подсветки синтаксиса GeSHi, что расшифровывается как Generic Syntax Highlighter, который прийдётся скачать отдельно.
Немного удручило то, что первый и последий релиз плагина был в далеком январе 2005 года, сразу появились смутные сомнения о совместимости плагина и свежего TextPattern, которые в некотором роде подтвердились. Итак...
Изначально плагин выглядел таким образом:- <?php
- function krl_geshiSyntaxHighlight($attributes, $node_value="") {
- $start_line_numbers_at = isset($attributes["startLineNumbersAt"]) ? $attributes["startLineNumbersAt"] : 1;
- if ($code_file == "") {
- } else {
- $code_directory = isset($attributes["directory"]) ? $attributes["directory"] : "highlighted_source/";
- // for some reason $_SERVER["DOCUMENT_ROOT"] on my Windows PC seems to be missing the trailing slash
- // so I normalise it once per page then use the normalised version.
- }
- }
- require_once('geshi.php');
- $geshi = new GeSHi($code_to_highlight, $language);
- //$geshi->enable_classes();
- $geshi->set_encoding("ISO-8859-1");
- $geshi->enable_line_numbers($linenumbers);
- $geshi->set_header_type(GESHI_HEADER_DIV);
- if ($linenumbers) {
- $geshi->start_line_numbers_at($start_line_numbers_at);
- }
- // layout code to put code in a scrolling div borrowed from:
- // http://www.flashant.org/index.php?p=225&more=1&c=1
- $return_str = '<div class="krl_highlighted_code">';
- $return_str .= '<div class="header">'.$language.':</div>';
- $return_str .= '<div class="codeblock" style="width: '.$width.'px; height: '.$height.'px;">';
- $return_str .= $geshi->parse_code();
- $return_str .= "</div></div>";
- return $return_str;
- }
- ?>
Вставлять код в статьи и страницы предлагается одним из следующих способов:
или
<krl_geshiSyntaxHighlight language=”language”><notextile>code to highlight</notextile></krl_geshiSyntaxHighlight>
Соответственно, первый способ - для вставки кода из внешнего файла, а второй для прямой вставки. Аттрибуты тега krl_geshiSyntaxHighlight:
- file – если нужно вывести содержимое внешнего файла, то нужно указать его имя [optional – если не указано, то выведется содержимое тега]
- directory – если внешний файл находится не рядом со скриптом, то нужно указать путь к его директории от корня веб-сервера [optional – по умолчанию "highlighted_source"]
- language – один из языков, которые поддерживаются GeSHi [optional – по умолчанию PHP]
- linenumbers – выводить или нет нумерацию строк [optional – по умолчанию true]
- startLineNumbersAt – если выводить нумерацию, то с какого числа начинать [optional – по умолчанию 1]
- width – длина в пикселях окошка с кодом [optional – значение по умолчанию задается в плагине]
- height – высота окошка с кодом [optional – значение по умолчанию задается в плагине]
Исправления, которые пришлось внести в плагин:
Во-первых, неприятно удивила необходимость указывать путь к GeSHi вручную (строка 25). Небольшой хак позволил избежать этого при условии, что мы как и положено копируем GeSHi в textpattern/include:
global $txpcfg;
//.......
require_once($txpcfg['txpath'].'\include\geshi.php');
//.......
}
Тем самым мы используем глобальную конфигурационную переменную TextPattern, которая содержит пут к директории движка, который мы указали при установке.
Во-вторых, тэги TextPattern. Скорее всего здесь оправдались мои подозрения и из-за версии движка, стало нужно писать в открывающемся и закрывающемся теге не krl_geshiSyntaxHighlight, а txp:krl_geshiSyntaxHighlight, т.е. так:
<txp:krl_geshiSyntaxHighlight language=”language”><notextile>code to highlight</notextile></tхp:krl_geshiSyntaxHighlight>
(Для любителей копипастить: в закрывающемся тэге txp:krl_geshiSyntaxHighlight буква x русская)
Третье и самое, на мой взгяд, главное. Оригинальный плагин режет все тэги HTML (да и не только) функцией strip_tags, что полностью лишает нас возможности постить HTML код. Это делается в строке 12. Здесь возможны два варианта: либо старая версия GeSHi (он-то ведь тоже обновлялся с того времени) не умела работать с HTML cущностями, либо автор плагина не предусмотрел необходимости выкладывать HTML код. Убрав strip_tags всё выводится нормально. Например:
Вывод:
Таким образом, получился плагин, который отлично подсвечивает синтаксис 86 языков (столько было в дистрибутиве GeSHi). Чут ниже можно взять модифицированный код. Стили, которые используются для красивого вывода дива с кодом можно найти на странице оригинального плагина.- function krl_geshiSyntaxHighlight($attributes, $node_value="") {
- global $txpcfg;
- $start_line_numbers_at = isset($attributes["startLineNumbersAt"]) ? $attributes["startLineNumbersAt"] : 1;
- if ($code_file == "") {
- $code_to_highlight = $node_value;
- //$code_to_highlight = htmlentities($node_value);
- } else {
- $code_directory = isset($attributes["directory"]) ? $attributes["directory"] : "highlighted_source/";
- // for some reason $_SERVER["DOCUMENT_ROOT"] on my Windows PC seems to be missing the trailing slash
- // so I normalise it once per page then use the normalised version.
- }
- }
- require_once($txpcfg['txpath'].'/include/geshi/geshi.php');
- $geshi = new GeSHi($code_to_highlight, $language);
- //$geshi->enable_classes();
- $geshi->set_encoding("ISO-8859-1");
- $geshi->enable_line_numbers($linenumbers);
- $geshi->set_tab_width(1);
- $geshi->set_header_type(GESHI_HEADER_DIV);
- if ($linenumbers) {
- $geshi->start_line_numbers_at($start_line_numbers_at);
- }
- // layout code to put code in a scrolling div borrowed from:
- // http://www.flashant.org/index.php?p=225&more=1&c=1
- $return_str = '<div class="krl_highlighted_code">';
- $return_str .= '<div class="header">'.$language.':</div>';
- $return_str .= '<div class="codeblock" style="width: '.$width.'px; height: '.$height.'px;">';
- $return_str .= $geshi->parse_code();
- $return_str .= "</div></div>";
- return $return_str;
- }








— Author: дмитрий · 2008-11-03 13:55 · #
плагин действительно полезный!
— Author: Devaka · 2009-05-26 20:49 · #
Спасибо за обзор недостатков плагина!
Сегодня поставил себе на блог, но проблема с пустыми строками. Когда добавляю пустую строку, то добавляются HTML теги (textile) и кавычки заменяются спецсимволами. Не знаю кто виноват, геши или карл :)
У вас какая версия txp?
— Author: Devaka · 2009-05-26 20:54 · #
и startLineNumbersAt почему-то не работает :( все время с единицы получается <OL>