Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Другие движки / фрейморки > Тестирование скрипта подцветки


Автор: Mal Hack 13.3.2005, 22:15
Просьба протестировать:
http://test.mal-hack.net/highlight/
Думаю что как все поймут. Пока сделал PHP, HTML и CSS, после общих доработок займусь Perl'ом и JavaScript.
Естественно принимаются предложения по поводу кода.
Класс в аттаче, а ниже инициализация:
Код
<?php

 if( $_SERVER['REQUEST_METHOD'] == "POST" && ! empty( $_POST['text'] ) )
  {
   include( "class.highlight-v1.0.php" );

   $HL = new highlight;

                function getmicrotime()
                 {
                  $mt = explode( " ", microtime() );
                  return ( (float)$mt[0] + (float)$mt[1] );
                 }

                $time_start = getmicrotime();

   $HL -> hl_string( ( $_POST['text'] ) , "" );

                $time_end = getmicrotime();
                $test = $time_end - $time_start;

                print "Script works " . round( $test , 4 ) . " seconds <a href='test.php'>Назад</a><br><hr><pre>".$HL -> TEXT."<hr>";
  }
 else
  {
   print <<<EOF
<center>
<b>Код должен быть заключен в [ code=XX ] [ /code ]. На данный момент работает: PHP, HTML, CSS</b><br><br>
<form method='post' action='test.php'>
<textarea name='text' cols='100' rows='30'>[ code=PHP][/code ]</textarea><br><br>
<input type='submit' value='Подцветить'>
</form>
</center>
EOF;
  }

?>

Автор: Opik 13.3.2005, 22:24
Код

[code=PHP]
function preg_match_all()
{
preg_match_all();
}

[/code]
есть небольшая разница smile

Автор: Mal Hack 13.3.2005, 22:31
Фишка в том, что preg_match_all у тебя объявляться не может smile
Т.е. ты сам не можешь объявить уже существующую функцию в языке. Поэтому после function болдом не выделяется %smile. Это мое ИМХО smile

Автор: Opik 13.3.2005, 23:26
Mal Hack
мы уже поговорили об этом по аське smile

Автор: S.A.P. 13.3.2005, 23:30
Код

$a = "\/*";
$b = "dfsdfsfsf";
$c = "*\/";

вот так попробуй.

Автор: Mal Hack 13.3.2005, 23:44
Цитата(Perchilla @ 13.3.2005, 23:30)
вот так попробуй.

Вроде поправил. Сенкс.

Автор: S.A.P. 13.3.2005, 23:50
Mal Hack теперь так
Код

$c = 5; /*"fdsgffdg"*/
/*ghtht*/


smile

Автор: IZ@TOP 14.3.2005, 10:10
Код

<?php
/* ------------------------------------------------------------------------------------------ //
// Sock server
// ------------------------------------------------------------------------------------------ */

class sockServer {
    
    var $Sock            = null;
    var $connClient        = null;
    
    var $badConnect        = false;
    
    function initSock() {

Все это до тела функции initSock выделяется как комментарий smile

Автор: Mal Hack 14.3.2005, 23:17
Так, существенно исправил подцветку PHP. Если глюков не будет, буду доисправлять остальное.
Протестите плз smile
http://test.mal-hack.net/highlight/
ЗЫ: Один глюк пока есть, но он странный какой-то smile даже сразу и не догадаетесь smile

Автор: S.A.P. 15.3.2005, 00:38
У меня что то ни с того ни с сего скрипт стал слэши к строкам добавлять, хотя минуту наз все было ОК.

И вроде вот эта строка баги выдавала, сейчас уже проверить не могу.
Код

$a="#aaa\"bbb";

Добавлено @ 00:40
Да, точно и вот это еще во внимание возьми
Код

$a="aaa\"bbb";

Добавлено @ 00:41
Там баг с другим эффектом smile .

Автор: Mal Hack 15.3.2005, 00:44
Это я отлаживал в режиме онлайн.


Цитата(Perchilla @ 15.3.2005, 00:38)
$a="aaa\"bbb";

Уже нормально. Подцвчивается, как литерал.

Автор: S.A.P. 15.3.2005, 00:53
Может слишком придираюсь, но вот
Код

$a=6;//<<<AAA
$b = 73;
$b = 73;
$b = 73;
$b = 73;
AAA;

Автор: Mal Hack 15.3.2005, 01:12
Цитата(Perchilla @ 15.3.2005, 00:53)
Может слишком придираюсь, но вот

Все правильно smile Так и надо smile Бей-те, бейте smile

Глюк с
Код

$a=6;//<<<AAA
$b = 73;
$b = 73;
$b = 73;
$b = 73;
AAA;

Поправил.

Автор: S.A.P. 15.3.2005, 08:59
smile

Теперь так.

Код

$a=6;//<><<<AAA
$b = 73;
$b = 73;
$b = 73;
$b = 73;
AAA;

Добавлено @ 09:00
ИМХО подход в алгоритме не правильный. Надо было все через один рег делать.

Автор: Mal Hack 15.3.2005, 17:42
Цитата(Perchilla @ 15.3.2005, 08:59)
Теперь так.

Исправил.

Цитата(Perchilla @ 15.3.2005, 08:59)
Надо было все через один рег делать.

Дык как ты через одинг рэг узнаешь что ты нашел, комментарий или литерал? Или литерал в комментарии или комментарий в литерале? smile


Автор: S.A.P. 15.3.2005, 17:59
Mal Hack в случае с одним регом, если литерал будет в комментарии, то ты найдешь комментарий, а не литерал, в том то вся и фишка smile .

Автор: Mal Hack 15.3.2005, 18:27
Perchilla
Хорошо. Вот такой случай:
Код
                 //-----------------------------------------
                 // Is this a guest? If so, get 'em to log in.
                 //-----------------------------------------

                 if ( ! $ibforums->member['id'] )


Автор: S.A.P. 15.3.2005, 18:36
А что здесь мудренного? кавычка поле слова GET? Она и не будет найдена. preg поймает комментраий от // до конца строки и заменит его.
Добавлено @ 18:46
Кстати, вот еще
Код

$a = aaa(1,2,3,4);

Автор: Mal Hack 15.3.2005, 18:49
Хорошо:
Код
$a = " askldjsld // sdkjfhsdkhf";

В общем... Как сделать с помощью одной регулярки я не могу понять (сообразить) технически.
ЗЫ: Аплодил новую версию. Вроде исправил все глюки, которые я сам видел раньше.
Добавлено @ 18:51
Цитата(Perchilla @ 15.3.2005, 18:36)
$a = aaa(1,2,3,4);

Исправил.

Автор: S.A.P. 15.3.2005, 19:04
Цитата(Mal @ 15.3.2005, 18:49)
Цитата (Perchilla @ 15.3.2005, 18:36)
$a = aaa(1,2,3,4);

Исправил.


ну аналогичная фигня
Код

if (aaa) bbb() 
else return

(return не горит, скорее всего else съедает пробел, а следующий оператор не может его найти).

Цитата(Mal @ 15.3.2005, 18:49)
В общем... Как сделать с помощью одной регулярки я не могу понять (сообразить) технически.
ну вот на твоем примере часть регулярного выражения
((&quot;.*?&quot;)|(\/\/.*?\n)) примерно так, проверять времени нет. Все это дело меняешь на функцию, в которой находишь, к какому из имеющихся шаблонов односиться найденная подстрока. То же самое я делал на JavaScript, сам алгоритм всего на 30 строчек был, не считая шаблонов, а шаблоны туда можно было подставлять любые, хоть для CSS, потому что там нету разделения на операторы, комментарии, литералы и т.д. Все шабломы группируются в цикле smile .

Автор: Mal Hack 15.3.2005, 19:25
Я понять не могу, по какому принципу он вынимать должен?

Автор: S.A.P. 15.3.2005, 19:36
вот шаблон ((&quot;.*?&quot;)|(\/\/.*?\n)) он свормировался у нас из 2-х шаблонов: строк и комментариев, находящихся в одном массиве. По нему винимается либо строка, заключенная в кавычки, либо комментарий до конца строки, что первее попадется. Если строка в комментарии, что программа ее даже не увидет, потому что заменит комментарий и пойдет себе дальше.

Все, часть строки вынули, передали ее в функцию, а там уже смотрим: у нас есть массив шаблонов и стилей, перебираем их, пока не найдем тот шаблон, что соответствует найденной подстроке и возвращаем ее со стилем, соответствуюшим шаблону.

Автор: Mal Hack 15.3.2005, 19:40
Хорошо... Но..
Код
$a = "khf\" //sdfsdf ";

При таком правиле будет как строка "khf\" и комментарий //sdfsdf ";

Автор: S.A.P. 15.3.2005, 19:44
Ну можно же такой шаблон туда залепить
Код

(&quot;.*?[^\\]&quot;)

Автор: Mal Hack 15.3.2005, 20:19
Так, хорошо, а как потом это дело внутри функции распознавать?
Как ты потом подцвкчивал переменные и зарезервированные слова?

Автор: S.A.P. 15.3.2005, 20:48
Цитата(Mal @ 15.3.2005, 20:19)
Так, хорошо, а как потом это дело внутри функции распознавать?
в цикле перебирал массив с шаблоном и проверял.

Автор: Guest 15.3.2005, 21:30
Зачем интересно изобретать что-то, когда уже есть специальная функция для подцветки..?

Mal Hack лишний раз подтвердилось, знания есть, а применить не можешь.

Автор: Guest 15.3.2005, 21:30
Не баг, но небольшой недочет. Русские буквы в именах функций использовать можно=) т.е. пока твой скрипт function Вася() не подсветит

Автор: Mal Hack 15.3.2005, 21:42
Цитата(Guest @ 15.3.2005, 21:30)
Зачем интересно изобретать что-то, когда уже есть специальная функция для подцветки..?

А меня она не устраивает

Цитата(Guest @ 15.3.2005, 21:30)
Mal Hack лишний раз подтвердилось, знания есть, а применить не можешь.

А че анонимно-то?

Цитата(Guest @ 15.3.2005, 21:30)
Не баг, но небольшой недочет. Русские буквы в именах функций использовать можно=) т.е. пока твой скрипт function Вася() не подсветит

Буду думать...

Автор: IZ@TOP 16.3.2005, 10:28
Цитата(Guest @ 15.3.2005, 22:30)
Mal Hack лишний раз подтвердилось, знания есть, а применить не можешь.

mx, Можешь похвастаться большим опытом разработки веб систем? От тебя тут всего пять мессаг (во всяком случае под этим IP), а толку в них ноль.

Автор: Mal Hack 17.3.2005, 21:45
http://test.mal-hack.net/highlight/test.php
Сделал через 1 рэг. Прошу протестиорвать.

Автор: sergejzr 17.3.2005, 21:52
Не работает у тебя CSS

Код

/* FIX IE6 Scrollbars bug - Leave this in! */

html { overflow-x: auto; } 



/* Body entry, change forum page background colour, default font, font size, etc. Leave text-align:center to center board content

   #ipwrapper will set text-align back to left for the forum. Any other tables / divs you use must use text-align:left to re-align

   the content properly. This is a work around to a known Internet Explorer bug */

BODY { font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 11px; color: #000; margin:0px;padding:0px;background-color:#FFF; text-align:center }

TABLE, TR, TD { font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 11px; color: #000; }



/* MAIN WRAPPER: Adjust forum width here. Leave margins alone to auto-center content */

#ipbwrapper { text-align:left; width:95%; margin-left:auto;margin-right:auto }



a:link, a:visited, a:active { text-decoration: underline; color: #000 }

a:hover { color: #465584; text-decoration:underline }



fieldset.search { padding:6px; line-height:150% }

label      { cursor:pointer; }

form       { display:inline; }

img        { vertical-align:middle; border:0px }

img.attach { border:2px outset #EEF2F7;padding:2px }



.googleroot  { padding:6px; line-height:130% }

.googlechild { padding:6px; margin-left:30px; line-height:130% }

.googlebottom, .googlebottom a:link, .googlebottom a:visited, .googlebottom a:active { font-size:11px; color: #3A4F6C; }

.googlish, .googlish a:link, .googlish a:visited, .googlish a:active { font-size:14px; font-weight:bold; color:#00D; }

.googlepagelinks { font-size:1.1em; letter-spacing:1px }

.googlesmall, .googlesmall a:link, .googlesmall a:active, .googlesmall a:visited { font-size:10px; color:#434951 }



li.helprow { padding:0px; margin:0px 0px 10px 0px }

ul#help    { padding:0px 0px 0px 15px }



option.cat { font-weight:bold; }

option.sub { font-weight:bold;color:#555 }

.caldate   { text-align:right;font-weight:bold;font-size:11px;color:#777;background-color:#DFE6EF;padding:4px;margin:0px }



.warngood { color:green }

.warnbad  { color:red }



#padandcenter { margin-left:auto;margin-right:auto;text-align:center;padding:14px 0px 14px 0px }



#profilename { font-size:28px; font-weight:bold; }

#calendarname { font-size:22px; font-weight:bold; }



#photowrap { padding:6px; }

#phototitle { font-size:24px; border-bottom:1px solid black }

#photoimg   { text-align:center; margin-top:15px } 



#ucpmenu    { line-height:150%;width:22%; border:1px solid #345487;background-color: #F5F9FD }

#ucpmenu p  { padding:2px 5px 6px 9px;margin:0px; }

#ucpcontent { background-color: #F5F9FD; border:1px solid #345487;line-height:150%; width:auto }

#ucpcontent p  { padding:10px;margin:0px; }



#ipsbanner { position:absolute;top:1px;right:5%; }

#logostrip { border:1px solid #345487;background-color: #3860BB;background-image:url(style_images/1/header_tile.gif);padding:0px;margin:0px; }

#submenu   { border:1px solid #BCD0ED;background-color: #DFE6EF;font-size:10px;margin:3px 0px 3px 0px;color:#3A4F6C;font-weight:bold;}

#submenu a:link, #submenu  a:visited, #submenu a:active { font-weight:bold;font-size:10px;text-decoration: none; color: #3A4F6C; }

#userlinks { border:1px solid #C2CFDF; background-color: #F0F5FA }



#navstrip  { font-weight:bold;padding:6px 0px 6px 0px; }



.activeuserstrip { background-color:#BCD0ED; padding:6px }



/* Form stuff (post / profile / etc) */

.pformstrip { background-color: #D1DCEB; color:#3A4F6C;font-weight:bold;padding:7px;margin-top:1px }

.pformleft  { background-color: #F5F9FD; padding:6px; margin-top:1px;width:25%; border-top:1px solid #C2CFDF; border-right:1px solid #C2CFDF; }

.pformleftw { background-color: #F5F9FD; padding:6px; margin-top:1px;width:40%; border-top:1px solid #C2CFDF; border-right:1px solid #C2CFDF; }

.pformright { background-color: #F5F9FD; padding:6px; margin-top:1px;border-top:1px solid #C2CFDF; }



/* Topic View elements */

.signature   { font-size: 10px; color: #339; line-height:150% }

.postdetails { font-size: 10px }

.postcolor   { font-size: 12px; line-height: 160% }



.normalname { font-size: 12px; font-weight: bold; color: #003 }

.normalname a:link, .normalname a:visited, .normalname a:active { font-size: 12px }

.unreg { font-size: 11px; font-weight: bold; color: #900 }



.post1 { background-color: #F5F9FD }

.post2 { background-color: #EEF2F7 }

.postlinksbar { background-color:#D1DCEB;padding:7px;margin-top:1px;font-size:10px; background-image: url(style_images/1/tile_sub.gif) }



/* Common elements */

.row1 { background-color: #F5F9FD }

.row2 { background-color: #DFE6EF }

.row3 { background-color: #EEF2F7 }

.row4 { background-color: #E4EAF2 }



.darkrow1 { background-color: #C2CFDF; color:#4C77B6; }

.darkrow2 { background-color: #BCD0ED; color:#3A4F6C; }

.darkrow3 { background-color: #D1DCEB; color:#3A4F6C; }



.hlight { background-color: #DFE6EF }

.dlight { background-color: #EEF2F7 }



.titlemedium { font-weight:bold; color:#3A4F6C; padding:7px; margin:0px; background-image: url(style_images/1/tile_sub.gif) }

.titlemedium  a:link, .titlemedium  a:visited, .titlemedium  a:active  { text-decoration: underline; color: #3A4F6C }



/* Main table top (dark blue gradient by default) */

.maintitle { vertical-align:middle;font-weight:bold; color:#FFF; padding:8px 0px 8px 5px; background-image: url(style_images/1/tile_back.gif) }

.maintitle a:link, .maintitle  a:visited, .maintitle  a:active { text-decoration: none; color: #FFF }

.maintitle a:hover { text-decoration: underline }



/* tableborders gives the white column / row lines effect */

.plainborder { border:1px solid #345487;background-color:#F5F9FD }

.tableborder { border:1px solid #345487;background-color:#FFF; padding:0; margin:0 }

.tablefill   { border:1px solid #345487;background-color:#F5F9FD;padding:6px;  }

.tablepad    { background-color:#F5F9FD;padding:6px }

.tablebasic  { width:100%; padding:0px 0px 0px 0px; margin:0px; border:0px }



.wrapmini    { float:left;line-height:1.5em;width:25% }

.pagelinks   { float:left;line-height:1.2em;width:35% }



.desc { font-size:10px; color:#434951 }

.edit { font-size: 9px }





.searchlite { font-weight:bold; color:#F00; background-color:#FF0 }



#QUOTE { font-family: Verdana, Arial; font-size: 11px; color: #465584; background-color: #FAFCFE; border: 1px solid #000; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px }

#code {
    padding: 10px 10px 10px 10px;
    border: 1px solid #555555;
    background-color: #f6f6f6;
    text-align: left;
    vertical-align: top;
    font-family: 'Courier New', Courier, mono;
    font-size: 12px;
    line-height: 16px;
}

.hltable {
    table-layout: fixed;
    width: 100%;
}

.hltable_full {
    width: 100%;
    overflow: auto;
}

.scrollpane_full {
    width: 100%;
    border: 0px;
    margin-left: auto;
    margin-right: auto;

}

.scrollpane {
    width: 100%;
    height: 300px;
    border: 1px solid #555555;
    overflow: auto;
    margin-left: auto;
    margin-right: auto;

}

.simplepane {
    width: 100%;
    overflow: auto;
    border: 1px solid #555555;
}

.simplepane_ie {
    width: 100%;
    border: 1px solid #555555;
    overflow-x: auto;
    overflow-y: hidden;
}

.simplepane {
    width: 100%;
    border: 1px solid #555555;
    overflow: auto;
}

.codetable {
    width: 100%;
}

.codetable_full {
    width: 100%;
    border: 1px solid #555555;
}

.code1 {
    padding: 2px 0px 2px 4px;
    width: 0%;
    border-style: solid;
    border-color: #555555;
    border-width: 0px 1px 0px 0px;
    background-color: #E6EDF7;
    text-align: right;
    vertical-align: top;
    font-family: 'Courier New', Courier, mono;
    font-size: 12px;
    line-height: 16px;
}

.code2 {
    padding: 2px 4px 2px 4px;
    width: 100%;
    border: 0px;
    background-color: #f6f6f6;
    text-align: left;
    vertical-align: top;
    font-family: 'Courier New', Courier, mono;
    font-size: 12px;
    line-height: 16px;
    white-space: nowrap;
}

.innertable {
    width: 100%;
}

.innertable td {
    padding: 0px;
    width: 100%;
    height: 16px;
    text-align: left;
    font-family: 'Courier New', Courier, mono;
    font-size: 12px;
    white-space: nowrap;
}

.innertable_left {
    width: 100%;
}

.innertable_left td {
    padding: 0px;
    width: 100%;
    height: 16px;
    text-align: right;
    font-family: 'Courier New', Courier, mono;
    font-size: 12px;
    white-space: nowrap;
}


.copyright { font-family: Verdana, Tahoma, Arial, Sans-Serif; font-size: 9px; line-height: 12px }



.codebuttons  { font-size: 10px; font-family: verdana, helvetica, sans-serif; vertical-align: middle }

.forminput, .textinput, .radiobutton, .checkbox  { font-size: 12px; font-family: verdana, helvetica, sans-serif; vertical-align: middle }



.thin { padding:6px 0px 6px 0px;line-height:140%;margin:2px 0px 2px 0px;border-top:1px solid #FFF;border-bottom:1px solid #FFF }



.purple { color:purple;font-weight:bold }

.red    { color:red;font-weight:bold }

.green  { color:green;font-weight:bold }

.blue   { color:blue;font-weight:bold }

.orange { color:#F90;font-weight:bold }

.HIDDEN_TABLE{width:90%;}
.HIDDEN_POST{color:white;background-color: #FAFCFE; color: #465584; border:1px dashed #000;}
.HIDDEN_HEAD{background-color: #FAA298; border:1px dashed #000;}
.moderator_text_table{color:white;width:90%;}
.moderator_text_message{background-color: #FAFCFE; color: #465584; border:1px solid #000;}
#MM  { white-space:normal; font-family: Courier, Courier New, Verdana, Arial;  font-size: 11px; color: #465584; background-color: #FAFCFE; border: 1px solid #000; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px }



Автор: Mal Hack 17.3.2005, 21:54
пока только ПХП

Автор: S.A.P. 17.3.2005, 22:06
Ишходники в студию, а то так еще неделю будем тестировать smile .

Вот пока
Код

$a = aaa(1,1,1,1);

Автор: Mal Hack 17.3.2005, 22:52
Балин. smile
Завтра исправлю, код покажу.

Автор: Mal Hack 18.3.2005, 18:44
Исправил. Плиз потестите (только PHP).
http://test.mal-hack.net/highlight/test.php
Исходник:
http://test.mal-hack.net/highlight/class.highlight-v1.0.rar

ЗЫ: Линки на мануал функций не лишнее?

Автор: S.A.P. 18.3.2005, 19:06
Код

$a = aaa(1,1,1,1);


С ходу smile .

Исходник попозже гляну.

Автор: Mal Hack 18.3.2005, 20:05
Блин.. Исправил smile
Исходник обновил.

Автор: IZ@TOP 19.3.2005, 11:29
Mal Hack, на счет линков на ман хорошо придумано.

Автор: Mal Hack 20.3.2005, 23:54
Сделал CSS и HTML.

Автор: R1+erGr1n 6.1.2006, 10:48
Попробуй ввести PHP код, который ты указал в 1 посте

Автор: Guest 6.1.2006, 11:02
Странно, программа не режет теги, а на http://test.mal-hack.net/highlight/test.php все нормально.

Обнови архив, если конечно можно.

Автор: Mal Hack 6.1.2006, 14:59
Хм... В версиях я уже точно запутался. Залил на хост файл с последней датой модификации.
В архив положил его же.

Не проверял.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)