Интернет, компьютеры, софт и прочий Hi-Tech | |||||||||||||||
Избранные докиМетки (все метки)hi tech, internet, it, интернет, информационные технологии, ит, по, программное обеспечение, сайт, софт
Подписаться через RSS2Email.ru
Дополнительнооптимизация, сайт, мониторы, движок, Битрикс, хостинг, сайты, мобильные, электроника, видеокарта |
Как научить GeSHi подсвечивать код HTML со вставками PHP, CSS и JavaScriptНедавно меня озадачили следующим образом (цитата из письма): ... Единственное пожелание - фак о том, как вставить код html-страницы с встроенным PHP-кодом. Попытаюсь сам разобраться. Да и далеко не критично это. Вопрос, хоть и не критичный, но мне самому интересный. Покопался в GeSHi и вот написал фак. Во-первых. Качаем GeSHi. Все, что написано ниже, проделывалось над 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])) { $geshi = new 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, ко всеобщему удовольствию, покончено. В-четвертых. Откройте скрипт 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('<style>', '<style', '</style>', '>'), 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('<script>', '<script', '</script>', '>'), 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> Думаю, вы уже догадались, каков должен быть результат этого теста.
Отписывайтесь, что я сделал не так, и как сделать лучше. Последнее редактирование: 2008-05-03 00:15:32 Метки материала: GeSHi, HTML, PHP, CSS, JavaScript, highlighting, подсветка кода, подсветки 8 комментариев
По просьбе людей с пхпклуба выкладываю geshi-1.0.7.21-patch.zip с минимальным набором файлов, необходимых для работы указанного в статье теста.
|
||||||||||||||
| 05.05.2008 13:22:20 | # |
| 05.05.2008 13:49:21 | # |
| 05.05.2008 16:57:42 | # |
Если уж говорить про размер — сгенерённый код GeSHi весит на порядок больше, чем комплект Highlight.js.
| 05.05.2008 17:37:56 | # |
| 16.02.2010 22:34:09 | # |
| 17.02.2010 11:25:53 | # |
© 2007-2012, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.