[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Подсветка кода на форуме
Страницы: 1, 2, 3, 4, 5, 6, 7
Joker
Я незнаю как FatCat я сколько гешу тестировал всё норм.
kirik
FatCat
а в каком виде сейчас хранятся сообщения (точнее код в этих сообщениях)?
FatCat
Цитата (kirik @ 10.07.2009 - 00:11)
в каком виде сейчас хранятся сообщения (точнее код в этих сообщениях)?

В том виде, в котором отдаются пользователю в браузер.
Вот набор регулярок для парсинга текста

Функция convert парсит входящую информацию, unconvert для вывода в окно редактирования сообщения.

_____________
Бесплатному сыру в дырки не заглядывают...
kirik
Понятно, спасибо.
kirik
Чтож, перерыв кучу материала по подсветкам кода, я все-таки решил остановиться на SHJS (да, та о которой я говорил в первом посте). Привлекла очень мощная система разбора кода, которая нада сказать идет от крутого подсвечивальщика GNU Source-highlight. Но так как SHJS у нас на JS, а мы решили раскрашивать код на стороне сервера, не найдя подобной библиотеки на php решил портировать код сам.

Итак, после 2х дней тяжелого кодинга "из-под пера" вышло это (попробовать свой код можно тут). Можно сказать что время я потратил не зря, раз все работает smile.gif Да, эта библиотечка более ресурсоемкая чем тот же geshi (честно, не проверял еще), но она того стоит. Сурсы выложу попозже под GPL3. Нужно оттестить окончательно и немного оптимизировать код.
Пока к основному функционалу дописал полную поддержку utf-8 и не полную поддержку хередоков.

Тестим, пишем, критикуем.
twin
Ты монстр smile.gif .
Цвета непривычные, может стоит вс таки ближе к стандартным highlight_string() цветам застилизовать? Особенно комментарии и дескрипторы php. Последние особенно, а то они теряются в нативе. Вот скрины, правда плохинькие. Исходники тут
Свернутый текст
PHP
<div id="header">Header. <a href="<?php echo WEB_ROOT;?>">Home</a> | 
                
<?php if (isset($_SESSION['user'])) :?> 
                    <a href="<?php echo WEB_ROOT;?>?page=logout">Sign out</a> 
                    <?php if (!empty($_SESSION['usermode'])) :?> 
                        | <a href="<?php echo WEB_ROOT;?>?page=clean-usermode">Exit user mode</a> 
                    <?php endif;?> 
                <?php else :?> 
                    <a href="<?php echo WEB_ROOT;?>?page=login">Sign in</a> 
                <?php endif;

и тут

У тебя кстати жрет обратные слэши.

А вообще круто. Ждем-с исходники smile.gif

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
FatCat
kirik
Восторг!


Цитата (kirik @ 11.07.2009 - 06:31)
библиотечка более ресурсоемкая

Если красить на вводе - это не очень критично.
Если на выводе я давлюсь жабой за каждую лишнюю милисекунду времени выполнения, то на вводе не упираюсь и за десятую.

_____________
Бесплатному сыру в дырки не заглядывают...
kirik
Цитата (twin @ 11.07.2009 - 01:16)
Цвета непривычные, может стоит вс таки ближе к стандартным highlight_string() цветам застилизовать?

Согласен! Я эту просто первую попавшуюся раскраску взял, чтоб не заморачиваться smile.gif

Цитата (FatCat @ 11.07.2009 - 03:49)
Если красить на вводе - это не очень критично.

Тоже так думаю. Еще может получится ее приблизить к geshi по времени выполнения, вообще здорово будет smile.gif
kirik
Возобновляю тему.
Доделал таки подсвечивальщик! smile.gif Выложил тут под GPL.
Долго бился над хитрым алгоритмом, чтобы код поддерживался максимально чистым, и это получилось! smile.gif
Чистый код на выходе, значит там нет лишних тэгов:
грязный код
Код
<span class="comment">/*</span>
  <span class="comment">test</span>
<span class="comment">*/</span>


чистый код
Код
<span class="comment">/*</span>
  test
*/</span>


Протестить вживую можно тут, в селект-боксе:
PHP_MIX - собственно ради чего затевалось дело: подсветка html,js,css,php в одном лице (моя гордость smile.gif )
PHP_MOD - подсветка обычного php кода
SQL_MOD - подсветка sql запросов
HTML_MOD - подсветка HTML
JS_MOD - подсветка JS
CSS_MOD - подсветка CSS


Если найдете какие-нибудь кривости, пишите сюды, будем править (я уже нашел 3 ошибки в парсинге, но уже пойду спать).

Ура, товарищи! Скоро будем обладать подсветкой! smile.gif

ЗЫ. если у кого время будет, потестируйте пожалуйста по скорости работы с похожими библиотечками.
twin
Цитата
Ну как? =)

biggrin.gif
Круто. Быстро и красиво. Сильно тестить времени небыло, что успел увидеть - класс. Есть чем гордиться.))
Попозже повнимательнее пороюсь.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
kirik
FatCat
Мы тут с Gabriel потестили раскраску, исправил некоторые баги. Наверное можно уже прикрутить. Один вопрос: сейчас, если я правильно понял, в БД хранится уже подсвеченный код. Тоесть чтобы перекрасить код, нужно убрать старую подсветку. Можешь показать как она убирается, когда мы например редактируем сообщение?

Еще.. сейчас у нас кнопки php, sql, html и code. Я так думаю что code можно будет заменить на кнопку html/php/js (ну чтобы понтянее было, а то "решетка", мне кажется не совсем очевидна), и еще неплохо было бы добавить кнопки js, css и htaccess.
Хм.. а вообще в таком случае проще сделать select-лист как для "Цвет", "Размер".. Тогда это все можно уместить smile.gif Кароче нужно еще подумать..
Gabriel
kirik
happy.gif угумс потестили маляся:) только уверен править еше прийдеться:)

_____________
one step, two steps HERE WE GO!!!
kirik
Цитата (Gabriel @ 30.10.2009 - 20:41)
только уверен править еше прийдеться smile.gif

желательно чтобы больше не пришлось smile.gif
FatCat
Цитата (kirik @ 31.10.2009 - 04:27)
Один вопрос: сейчас, если я правильно понял, в БД хранится уже подсвеченный код. Тоесть чтобы перекрасить код, нужно убрать старую подсветку. Можешь показать как она убирается, когда мы например редактируем сообщение?

Покажу на примере [ sql ]
PHP
$txt preg_replace"#\[sql\](.+?)\[/sql\]#ies"    "\$this->regex_sql_tag('\\1')"    $txt );

PHP
function regex_sql_tag($sql="") {
        
        if (
$sql == "") return;

        
// Too many embedded code/quote/html/sql tags can crash Opera and Moz
        
        
if (preg_match"/\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\]/i"$sql) ) {
            return 
$default;
        }
                
        
// Knock off any preceeding newlines (which have
        // since been converted into <br>)
        
        
$sql preg_replace"/^<br>/"""$sql );
        
$sql preg_replace"/^\s+/" ""$sql );
        
        
// Make certain regex work..
        
        
if (! preg_match"/\s+$/" $sql) )
        {
            
$sql $sql.' ';
        }
        
        
$sql preg_replace"#(=|\+|\-|&gt;|&lt;|~|==|\!=|LIKE|NOT LIKE|REGEXP)#i"            "<span style='color:orange'>\\1</span>"$sql );
        
$sql preg_replace"#(MAX|AVG|SUM|COUNT|MIN)\(#i"                                    "<span style='color:blue'>\\1</span>("    $sql );
        
$sql preg_replace"!(&quot;|'|')(.+?)(&quot;|'|')!i"              "<span style='color:red'>\\1\\2\\3</span>" $sql );
        
$sql preg_replace"#\s{1,}(AND|OR)\s{1,}#i"                                         " <span style='color:blue'>\\1</span> "    $sql );
        
$sql preg_replace"#(LEFT|JOIN|WHERE|MODIFY|CHANGE|AS|DISTINCT|IN|ASC|DESC|ORDER BY)\s{1,}#i" "<span style='color:green'>\\1</span> "   $sql );
        
$sql preg_replace"#LIMIT\s*(\d+)\s*,\s*(\d+)#i"                                    "<span style='color:green'>LIMIT</span> <span style='color:orange'>\\1, \\2</span>" $sql );
        
$sql preg_replace"#(FROM|INTO)\s{1,}(\S+?)\s{1,}#i"                                "<span style='color:green'>\\1</span> <span style='color:orange'>\\2</span> "$sql );
        
$sql preg_replace"#(SELECT|INSERT|UPDATE|DELETE|ALTER TABLE|DROP)#i"               "<span style='color:blue;font-weight:bold'>\\1</span>" $sql );
        
        
$html $this->wrap_style( array( 'STYLE' => 'SQL' ) );
        
        return 
"<!--sql-->{$html['START']}<!--sql1-->{$sql}<!--sql2-->{$html['END']}<!--sql3-->";
     }




PHP
$txt preg_replace"#<!--sql-->(.+?)<!--sql1-->(.+?)<!--sql2-->(.+?)<!--sql3-->#eis"    "\$this->unconvert_sql(\"\\2\")"$txt);

PHP
function unconvert_sql($sql="") {
        
$sql stripslashes($sql);
        
        while ( 
preg_match"#<span style='.+?'>(.+?)</span>#is"$sql ) )
        {
            
$sql preg_replace"#<span style='.+?'>(.+?)</span>#is""\\1"$sql );
        }
        
        
$sql preg_replace"#\s*$#"    ""$sql );
        
        return 
'[SQL]'.$sql.'[/SQL]';
        
    }


_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.