Интернет, компьютеры, софт и прочий Hi-Tech

Подписаться через RSS2Email.ru

Как научить GeSHi подсвечивать код HTML со вставками PHP, CSS и JavaScript

Недавно меня озадачили следующим образом (цитата из письма):

... Единственное пожелание - фак о том, как вставить код html-страницы с встроенным PHP-кодом. Попытаюсь сам разобраться. Да и далеко не критично это.

Вопрос, хоть и не критичный, но мне самому интересный. Покопался в GeSHi и вот написал фак.

Во-первых. Качаем GeSHi с SourceForge.net. Все, что написано ниже, проделывалось над GeSHi 1.0.7.21.

Во-вторых. Откройте скрипт geshi/geshi.php.

Найдите в нем строку:

PHP
if (!$this->strict_mode || $this->language_data['HIGHLIGHT_STRICT_BLOCK'][$script_key]) {

Замените эту строку на следующее:

PHP
if (isset($script_key) &&
    isset($this->language_data['HIGHLIGHT_STRICT_BLOCK'][$script_key]) &&
    is_string($this->language_data['HIGHLIGHT_STRICT_BLOCK'][$script_key])) {
    $geshinew GeSHi($part, $this->language_data['HIGHLIGHT_STRICT_BLOCK'][$script_key]);
    $geshi->enable_strict_mode(true);
    $geshi->set_header_type(GESHI_HEADER_NONE);
    $result .= str_replace('<br />', '', $geshi->parse_code());
} elseif (!$this->strict_mode || $this->language_data['HIGHLIGHT_STRICT_BLOCK'][$script_key]) {

В-третьих. Скопируйте скрипт geshi/geshi/html4strict.php в geshi/geshi/php-html.php.

Откройте geshi/geshi/php-html.php. Найдите в нем строку:

PHP
'LANG_NAME' => 'HTML',

Замените ее на

PHP
'LANG_NAME' => 'PHP in HTML',

Найдите строки:

PHP
'SCRIPT' => array(
    0 => 'color: #00bbdd;',
    1 => 'color: #ddbb00;',
    2 => 'color: #009900;'
    ),

Замените их на

PHP
'SCRIPT' => array(
    0 => 'color: #00bbdd;',
    1 => 'color: #ddbb00;',
    2 => 'background-color:#ffe;',
    3 => 'background-color:#fef;',
    4 => 'background-color:#eff;',
    5 => 'color: #009900;'
    ),

Найдите строки:

PHP
'SCRIPT_DELIMITERS' => array(
    0 => array(
        '<!DOCTYPE' => '>'
        ),
    1 => array(
        '&' => ';'
        ),
    2 => array(
        '<' => '>'
        )
    ),
'HIGHLIGHT_STRICT_BLOCK' => array(
    0 => false,
    1 => false,
    2 => true
),

Замените их на следующие:

PHP
'SCRIPT_DELIMITERS' => array(
    0 => array(
        '<!DOCTYPE' => '>'
        ),
    1 => array(
        '&' => ';'
        ),
    2 => array(
        '<?php' => '?>',
        '<?'    => '?>',
        '<%'    => '%>',
        '<script language="php">' => '</script>'
        ),
    3 => array(
        '<style' => '</style>'
        ),
    4 => array(
        '<script' => '</script>'
        ),
    5 => array(
        '<' => '>'
        )
    ),
'HIGHLIGHT_STRICT_BLOCK' => array(
    0 => false,
    1 => false,
    2 => 'php',
    3 => 'css',
    4 => 'javascript',
    5 => true
    ),

Со скриптом php-html.php, ко всеобщему удовольствию, покончено. Можно покурить и покопаться хранилище скриптов на php в поисках подходящего кода для тестирования наших трудов.

В-четвертых. Откройте скрипт geshi/geshi/css.php. Найдите в нем строки:

PHP
        )
    ),
'SYMBOLS' => array(
    '(', ')', '{', '}', ':', ';'
    ),
'CASE_SENSITIVE' => array(
    GESHI_COMMENTS => false,
    1 => true,
    2 => true
    ),
'STYLES' => array(
    'KEYWORDS' => array(
        1 => 'color: #000000; font-weight: bold;',
        2 => 'color: #993333;'
        ),

Замените их на следующие:

PHP
        ),
        3 => array('&lt;style&gt;', '&lt;style', '&lt;/style&gt;', '&gt;'),
        4 => array('type'),
    ),
'SYMBOLS' => array(
    '(', ')', '{', '}', ':', ';', '='
    ),
'CASE_SENSITIVE' => array(
    GESHI_COMMENTS => false,
    1 => true,
    2 => true,
    3 => false,
    4 => false,
    ),
'STYLES' => array(
    'KEYWORDS' => array(
        1 => 'color: #000000; font-weight: bold;',
        2 => 'color: #993333;',
        3 => 'color: #000000; font-weight: bold;',
        4 => 'color: #000066;',
        ),

Заодно избавьтесь от лишнего депрекатеда. Найдите строчку:

PHP
if (isset($this) && is_a($this, 'GeSHi')) {

Замените ее на следующую:

PHP
if (isset($this) && 'geshi' == strtolower(get_class($this))) {

CSS готов. Остался еще JavaScript.

В-пятых. Откройте скрипт geshi/geshi/javascript.php. Найдите в нем строки:

PHP
    )
  ),
'SYMBOLS' => array(
  '(', ')', '[', ']', '{', '}', '!', '@', '%', '&', '*', '|', '/', '<', '>'
  ),
'CASE_SENSITIVE' => array(
  GESHI_COMMENTS => false,
  1 => false,
  2 => false,
  3 => false
  ),
'STYLES' => array(
  'KEYWORDS' => array(
    1 => 'color: #000066; font-weight: bold;',
    2 => 'color: #003366; font-weight: bold;',
    3 => 'color: #000066;'
    ),

Замените этот код на следующий:

PHP
    ),
  4 => array('&lt;script&gt;', '&lt;script', '&lt;/script&gt;', '&gt;'),
  5 => array('language', 'type'),
  ),
'SYMBOLS' => array(
  '(', ')', '[', ']', '{', '}', '!', '@', '%', '&', '*', '|', '/', '<', '>', '='
  ),
'CASE_SENSITIVE' => array(
  GESHI_COMMENTS => false,
  1 => false,
  2 => false,
  3 => false,
  4 => false,
  5 => false,
  ),
'STYLES' => array(
  'KEYWORDS' => array(
    1 => 'color: #000066; font-weight: bold;',
    2 => 'color: #003366; font-weight: bold;',
    3 => 'color: #000066;',
    4 => 'color: #000000; font-weight: bold;',
    5 => 'color: #000066;',
    ),

Строчки

PHP
'SCRIPT' => array(
  0 => '',
  1 => '',
  2 => '',
  3 => ''
  )
),

замените на

PHP
'SCRIPT' => array(
  0 => ''
  )
),

А строки

PHP
'SCRIPT_DELIMITERS' => array(
  0 => array(
    '<script type="text/javascript">' => '</script>'
    ),
  1 => array(
    '<script language="javascript">' => '</script>'
    )
  ),
'HIGHLIGHT_STRICT_BLOCK' => array(
  0 => true,
  1 => true
)

следующими:

PHP
'SCRIPT_DELIMITERS' => array(
  0 => array(
    '<script' => '</script>'
    )
  ),
'HIGHLIGHT_STRICT_BLOCK' => array(
  0 => true
)

Ну вот почти все. Осталось только убедиться, что все работает.

В шестых. Пишем тест:

Тестируем GeSHi:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Тестируем GeSHi</title>
<style type="text/css">
div.bb_code {
    border: 6px double #d0d0d0;
    padding: 5px;
}
</style>

<script type="text/javascript">
function test()
{
    if (prompt('Вам нравится xBB?', "")) {
        alert('Это JavaScript');
    }
}
</script>

</head>
<body>
<p>Тестируем GeSHi:</p>
<?php
require_once './geshi.php';
$text = file_get_contents(__FILE__);
$geshi =  new GeSHi($text, 'php-html');
echo '<div class="bb_code">' . $geshi->parse_code() . '</div>';
?>

</body>
</html>

Думаю, вы уже догадались, каков должен быть результат этого теста. Well

Отписывайтесь, что я сделал не так, и как сделать лучше.

03.05.2008

Биржа долевых инвестиций SIMEX.

Последнее редактирование: 2013-02-25 17:40:28

Метки материала: geshi, html, php, css, javascript, highlighting, подсветка кода, подсветки, internet, it, интернет, интернет сеть, информационные технологии, ит, по, программное обеспечение, софт


8 комментариев

17.02.2010 11:25:53 #
Mozilla Firefox dima
Я уже давно не занимался этим вопросом и сейчас не имею ни времени, ни интереса к нему возвращаться. Тем более, что проделывать все по новой с каждой новой версией GeSHi задача неблагодарная.
16.02.2010 22:34:09 #
Google Chrome Гость Andrey
В версии geshi 1.0.8.6 не удается изменить файл geshi/geshi.php - искомой строки нет, а  при попытках самостоятельно найти решение у меня все несколько раз наезжает друг на друга (все парсится отдельно и в кучу).
Помогите разобраться..?
05.05.2008 17:37:56 #
Mozilla Firefox dima
Этот патч: http://xbb.uz/files/downloa...atch.tar.gz
 
для $ patch -p0 -i geshi.patch
05.05.2008 16:57:42 #
Mozilla Firefox dima
Sam
Если уж говорить про размер — сгенерённый код GeSHi весит на порядок больше, чем комплект Highlight.js.

Gzip можно применять не только к JS, но и к собственно html. На этой странице - много кода, сгнерированного GeSHi. Тем не менее вся она вместе со всеми текстами, заголовками, менюшками, формами, комментами и левыми javascript'ами весит в gzipe 10.28kb. Причем код, сгенерированный GeSHi, занимет лишь малую часть кода страницы. То есть этот GeSHi'н код гораздо меньше чем 12kb сжатого Highlight.js.
 
Чтобы код, сгенерированный GeSHi превзошел по весу Highlight.js, это должен быть очень большой код, который вряд ли кому понадобится публиковать на веб-странице.
 
P.S. Прошу понять меня правильно. Я вовосе не собираюсь противопостовлять GeSHi и Highlight.js. Я могу привести случаи, когда использование Highlight.js предпочтительнее использования GeSHi. Равно как и наоборот.
 
Но утверждаю, что GeSHi - достойный инструмент для PHP-программиста. Он заслуживает совершенствования. Этому совершенствованию посвящена моя статья. Никакого отношения эта статья к Highlight.js не имеет. Зачем оффтоп?
05.05.2008 13:49:21 #
Opera Гость Sam
Во-первых не 60кб, а около 40кб в том случае, если использовать почти все подсветки, что нужно не всегда. А если это всё пропустить через gzip — получится около 12кб, что не так много, особенно, если организовать правильное кэширование.
 
Если уж говорить про размер — сгенерённый код GeSHi весит на порядок больше, чем комплект Highlight.js.
 
Отстутствие JS на клиенте — это ситуация очень и очень редкая.
 
Единственный плюс GeSHi — подсветка кода в RSS-лентах.
05.05.2008 13:22:20 #
Mozilla Firefox dima
Смотрел эту либу (Highlight.js). Она написана на JavaScript'е и выполняет свое дело на клиенте.
 
Имхо, если есть возможность пользовать GeSHi, то он предпочтительней перед Highlight.js. Так как не требует подгрузки на клиент до 60 Kb скриптов и работает независимо от того, есть ли на клиенте JavaScript или нет (а если есть, то какой).
04.05.2008 15:33:04 #
Opera Гость Sam
Советую глянуть:
http://softwaremaniacs.org/.../highlight/
03.05.2008 06:10:19 #
Mozilla Firefox dima
По просьбе людей с пхпклуба выкладываю geshi-1.0.7.21-patch.zip с минимальным набором файлов, необходимых для работы указанного в статье теста.

Оставьте, пожалуйста, свой комментарий к публикации

Представиться как     Антибот:
   

Просьба не постить мусор. Если вы хотите потестить xBB, воспользуйтесь кнопкой предварительного просмотра на панели инструментов xBBEditor-а.


© 2007-2017, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.