Подсветка синтаксиса в статьях с использованием GeSHi. Статьи. wb0.ru - Все для веб-мастера, on-line сервисы

Подсветка синтаксиса в статьях с использованием GeSHi

GeSHi (Generic Syntax Highlighter) позволяет подсвечивать синтаксис кода, написанного любом из более 80 языков. GeSHi использует подключаемые файлы с описанием синтаксиса языков, что обеспечивает простоту добавления новых описаний. GeSHi написан на PHP. В настоящей статье мы рассмотрим использование GeSHi для автоматической подсветки синтаксиса в тексте статей или сообщений на сайте.

Cкачаем GeSHi 1.0.7.21 с SourceForge. Мы напишем функцию, обеспечивающую подсветку кода, расположенного внутри специального BBCode-тега [syntax]. Например, код внутри [syntax=php] [/syntax] будет подсвечен с использованием синтаксиса PHP. Кроме того, в названии языка можно использовать специальные символы: # - в подсвеченном коде строки будут пронумерованы, * - код будет подсвечен в режиме inline (span вместо div). Например, [syntax=*mysql]SHOW PROCESSLIST[/syntax] будет выглядеть как

SHOW PROCESSLIST

А

[syntax=#php]
<?php
function hellow() {
  echo "Hello, world!";
}
?>
[/syntax]

будет выглядеть так:

<?php
function hellow() {
  echo "Hello, world!";
}
?>

Среди подсвечиваемых по-умолчанию языков - bash, c, c++, css, delphi, diff, fortran, html, java, javascript, latex, matlab, mysql, oracle, perl, php, python, rails, ruby, smarty, sql, tcl, xml и другие. Языковые файлы находятся в каталоге geshi дистрибутива. Мы будем выполнять подсветку с использованием CSS, для этого потребуется требуется сгенерировать css, используя contib/cssgen.php, входящий в дистрибутив. cssgen.php попросит выбрать языки для включения в стилевой файл и цвета для подсветки различных элементов. Не забудьте включить ссылку на сгенерированный css-файл в заголовок страниц сайта.

Приведенный ниже код определяет функцию syntax_filter(), подсвечивающую код, внутри тегов [syntax]. Данную функцию следует включить в цепочку функций, обрабатыващих материалы сайта при формировании HTML-страницы. Обратите внимание, что в случае подсветки HTML, код внутри тегов [syntax] [/syntax] должен быть написан в чистом виде, GeSHi самостоятельно преобразует его в HTML-сущности.

  1. <?php
  2. require_once("geshi/geshi.php");
  3.  
  4. function syntax_filter($text) {
  5.   $search = '/\[syntax=(.*?)\]\r?\n?(.*?)\r?\n?\[\/syntax\]/is';
  6.   return preg_replace_callback($search, 'syntax_filter_callback', $text);
  7. }
  8.  
  9. function syntax_filter_callback($data) {
  10.   $linenumbers = false;
  11.   $urls = false;
  12.   $inline = false;
  13.   $indentsize = 4;
  14.  
  15.   if (isset($data[2])) {
  16.     $syntax = $data[1];
  17.     $code = $data[2];
  18.  
  19.     if(strstr($syntax, '*')) {
  20.       $inline = true;
  21.       $syntax=str_replace('*','',$syntax);
  22.     }
  23.  
  24.     if(strstr($syntax, '#')) {
  25.       $linenumbers = true;
  26.       $syntax=str_replace('#','',$syntax);
  27.     }
  28.  
  29.     if ($syntax=='html') {
  30.       $syntax = 'html4strict';
  31.     }
  32.  
  33.     if ($syntax=='js') {
  34.       $syntax = 'javascript';
  35.     }
  36.  
  37.     $geshi =& new GeSHi($code, $syntax);
  38.     $geshi->set_header_type(GESHI_HEADER_DIV);
  39.  
  40.     $geshi->enable_classes(true);
  41.     $geshi->set_overall_style('font-family: monospace;');
  42.     if($linenumbers) {
  43.       $geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS, 5);
  44.       $geshi->set_line_style('color:#222;', 'color:#888;');
  45.       $geshi->set_overall_style('font-size: 14px;font-family: monospace;', true);
  46.     }
  47.    
  48.     if (!$urls) {
  49.       for ($i = 0; $i < 5; $i++) {
  50.     $geshi->set_url_for_keyword_group($i, '');
  51.       }
  52.     }
  53.        
  54.     if ($indentsize) {
  55.       $geshi->set_tab_width($indentsize);
  56.     }
  57.    
  58.     $parsed = $geshi->parse_code();
  59.     if($inline) {
  60.       $parsed = preg_replace('/^<div/','<span', $parsed);
  61.       $parsed = preg_replace('/<\/div>$/','</span>', $parsed);
  62.     }
  63.   }
  64.   return $parsed;
  65. }
  66. ?>

Дата публикации: 15.08.2010
Григорий Рубцов,
webew.ru

   Ваш псевдоним:
Ваш комментарий:

Календарь событий


Новости Интернет


Поиск





Последний пересчет

тИЦ:07 Окт 15
PR:09 Дек 13

Наши партнеры

wservices.ru - регистрация доменов, Whois-сервисы Смайлы на все случаи жизни


 
Copyright © 2006-2024, wb0.ru