Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2008, 19:57   #1
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию Подсветка "Pascal" на PHP

Всем привет.
Я уже, как-то "поднимал" подобный вопрос о подсветке синтаксиса, но этот решил выделить в отдельную тему.
Посмотрел немало скриптов для подсветки различных языков, но остался недоволен увиденным. Так как меня интересует только подсветка "Паскаля" [..code]...[../code], мне всегда хотелось написать для его подсветки !!!одну-единственную функцию, а не мощный скрипт, который будет тормозить систему.
Мой сайт работает на движке Slaed (хотя я переписал больше половины "для себя"), поэтому и функцию подстраивал под него, но должна работать везде....
Все вопросы в комментариях...
Вот сама функция (давайте доделаем, и будем все пользоваться...)
Функция ниже...
_SERGEYX_ вне форума Ответить с цитированием
Старый 12.10.2008, 19:58   #2
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

PHP код:
function encode_code($text) {
/*
Сразу примечание для "сетевиков", не знакомых с Паскалем (может и такие есть?):
-СТРОКИ - это все, что находится между одиночными кавычками.
-КОММЕНТАРИИ - это все, что находится между фигурными скобками {.......} или...
от двойного слеша до конца строки //.........\n.
*/

/*
ВОПРОСЫ:
1). "Сделать" массив $words, чтобы он работал вне зависимости от регистра символов ( Я пробовал
использовать разные пхп-шные функции, ни фига не получилось...
2). Удалить подсветку ключевых слов, если они оказались внутри строки или внутри комментарев.
3). Удалить подсветку строк, если они оказались внутри комментарев.
4). Удалить подсветку комментарев, если они оказались внутри строк.
*/

  
$words = array ('destructor''constructor''downto''goto''to''initialization',
'interface''interrupt''finalization''finally''ordinal''exports''export',
'for''or''begin''string''in''break''case''const''default''div',
'do''else''except''external''function''if''implementation''mod',
'not''of''overload''override''private''procedure''program''property',
'protected''public''published''raise''repeat''stdcall''then''try',
'type''unit''until''uses''var''while''nil''and ''dispose',
'array''end'); /* .. можно добавить ещё.. */

/* Это теги для подсветки, можно сделать любые..... */
$st ="<font class=\"codedelphi\">"//Ключевые слова
$st3 ="<font class=\"codedelphi3\">"//Комментарии
$st2 ="<font class=\"codedelphi2\">"//Числа
$st4 ="<font class=\"codedelphi4\">"//Строки
$stEnd ="</font>";

  
/*Нарисуем саму таблицу (стили "bgcolor" и т.п. из моего *.css, нужно подставить любые*/
  
$start_html "<div align=\"center\"><div style=\"width: 90%; overflow: auto\">"."
  <table width=\"100%\" cellspacing=\"1\" cellpadding=\"3\"
  border=\"0\" align=\"center\" class=\"bgcolor4\">"
."<tr class=\"bgcolor4\">
  <td class=\"code\">"
;
  
$end_html "</td></tr></table></div></div>";
   
/* Конец таблицы  */
  
$match_count preg_match_all("#\[code\](.*?)\[/code\]#si"$text$matches);
  for (
$i 0$i $match_count$i++) {
    
$before_replace $matches[1][$i];
    
$after_replace $matches[1][$i];
    
$after_replace trim($after_replace);
    
$zeilen_array explode("<br />"$after_replace);
    
$j 1;
    
$zeilen '';
    foreach (
$zeilen_array as $str) {
      
$zeilen .= "".$j."<br />";
      
$j++;
    }

/*(Подсветка) Ключевые слова циклично из массива (если они являются целым словом)*/
    
for ($s 0$words[$s] != ''$s++)
      
$after_replace preg_replace("|(\b$words[$s]\b)|""$st\\1$stEnd"$after_replace);
/*(Подсветка) Числа (чтобы не грузить сервер выделим только числа до 6 разрядов,
более бывает редко )*/
   
$after_replace preg_replace("|([ .=[])([0-9]{1,6})|""\\1$st2\\2$stEnd"$after_replace);
/*(Подсветка) Строки в одиночных кавычках  (Сначала символ одиночной кавычки (&_#_0_3_9;) (без знака подчеркивания, конечно)
заменяем на символ ('), потом поменяем обратно, ...по другому у меня
почему-то не заработало */
  
$after_replace str_replace("&_#_0_3_9;""'"$after_replace);
  
$after_replace preg_replace("#\'(.*?)'#si""'$st4\\1$stEnd'"$after_replace );
/*(Подсветка) Однострочный комментарий  (От двойного слеша (//) до
конца строки, т.е. (\n))*/
  
$after_replace preg_replace("#\//(.*?)\\n#si""$st3//\\1\n$stEnd"$after_replace );
/*(Подсветка) Многострочный комментарий  (Всё, что в фигурных скобках)*/
  
$after_replace preg_replace("#\{(.*?)\}#si""$st3{\\1}$stEnd"$after_replace );
/* !!!Все подветки выше, вроде, работают нормально */


/* А вот здесь нужно удалить "ненужную" подсветку... см. выше... */
//*
/* Я пробовал удалить хотя бы одну пару тегов (а их может быть несколько), типа
 $after_replace = preg_replace("#\{(.*?)$st(.*?)$stEnd(.*?)}\}#si", "\\1\\2\\3", $after_replace );
 но были "косяки"*/
//*
    
$after_replace str_replace("\n"""$after_replace);
    
$after_replace str_replace('&amp;''&'$after_replace);
    
$after_replace str_replace("  ""&nbsp; "$after_replace);
    
$after_replace str_replace("  "" &nbsp;"$after_replace);
    
$after_replace str_replace("\t""&nbsp; &nbsp;"$after_replace);
    
$after_replace preg_replace("/^ {1}/m""&nbsp;"$after_replace);
    
$str_to_match "[code]".$before_replace."[/code]";

/* Что такое  {ZEILEN} я и сам толком не понял, ну, да и черт с ним...*/
    
$replace str_replace("{ZEILEN}"$zeilen$start_html);
    
$replace .= $after_replace;
    
$replace .= $end_html;
    
$text str_replace($str_to_match$replace$text);
  }
  
$text str_replace("[code]"$start_html$text);
  
$text str_replace("[/code]"$end_html$text);
  return 
$text;

P.S. Все вышенаписанное проверял на больших кусках кода (целых больших unit-ах) - работает довольно шустро, несмотря на "грузное" preg_replace.

Последний раз редактировалось _SERGEYX_; 12.10.2008 в 22:17.
_SERGEYX_ вне форума Ответить с цитированием
Старый 12.10.2008, 23:34   #3
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

А если все-таки разбить код на части ?

В архиве пример. Я оставил всю отладочную информацию.
Разбор делается вызовом syntax_pas. Она вызывает syntax_all c
настройками для паскаля. Поменяв настройки можно сменить язык. Сюда бы еще
добавить массивы ключевых слов.

syntax_all делит текст кода на части и для кажой части вызывается своя функция:

set_syntax_comment() - для комментариев
set_syntax_str() - для строк
set_syntax_asm() - для кода asm
set_syntax_normal() - для остального кода

Функции не доделанные (для комментариев я сделал выделение наклонным шрифом).
В них нужно сделать выделение синтаксиса.
Вложения
Тип файла: rar test.rar (1.7 Кб, 17 просмотров)
alexBlack вне форума Ответить с цитированием
Старый 13.10.2008, 14:04   #4
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Спасибо. Попробую.
_SERGEYX_ вне форума Ответить с цитированием
Старый 18.10.2008, 20:29   #5
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

alexBlack, я, вроде, "домучил" модуль.
Образец подсветки можно посмотреть, например, здесь.

А здесь лежит сам модуль.
Там внутри readme-файл. В нем функция, которой я вызываю syntax_pas(). Подгонял для своего сайта, может что-то нужно переделать. И стили изменить на свои. И еще... Я так и не врубился как сделать ключевые слова без учета регистра. Не хочется писать в массив
'/(\bstring\b)/','/(\bString\b)/'. А так, вроде, все ОК.
Заменить пробел на &_n_b_s_p; не получилось, т.к. в тегах тоже произойдет замена <font class на font&_n_b_s_p;class, поэтому я поставил
<_pre>...<_/pre>, удалив <_br />.
Отпишись после просмотра...

Последний раз редактировалось _SERGEYX_; 18.10.2008 в 21:06.
_SERGEYX_ вне форума Ответить с цитированием
Старый 19.10.2008, 00:07   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

---------------------
alexBlack вне форума Ответить с цитированием
Старый 19.10.2008, 00:11   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от _SERGEYX_ Посмотреть сообщение
alexBlack, я, вроде, "домучил" модуль.
Образец подсветки можно посмотреть, например, здесь.
По-моему неплохо получилось

По коду.
Комментарии до конца строки - Вы совершенно верно заметили - у меня в коде была ошибка. Нужно так:
Код:
     else if ($cd == 7) {
        // Поиск конца строки
        $cd = 0;
        $p = getpos($code, "\r\n", 0);
        if ($p < 0) $p = strlen($code);
        $p += 2;
        $newcode .= set_syntax_comment(substr($code, 0, $p));
     }
Замена без учета регистра - символ i после регулярного выражения: '/(\bvar\b)/i'

Я не понял вот эту часть. Зачем обратная замена ?

Код:
   $after_replace = syntax_pas($after_replace);/* Подсветка */
   $after_replace = str_replace("&gt;", ">", $after_replace);
   $after_replace = str_replace("&lt;", "<", $after_replace);
   ...
может тогда убрать вызов $code = htmlspecialchars($code); из syntax_pas().

Вызов nl2br, похоже тоже нужно убрать:

Код:
   //$code =nl2br(strtr($newcode, array()));
   return $newcode; //$code;
alexBlack вне форума Ответить с цитированием
Старый 19.10.2008, 10:44   #8
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Код:
Я не понял вот эту часть. Зачем обратная замена ?
Точно, сейчас исправлю.
Код:
Замена без учета регистра - символ i после регулярного выражения: '/(\bvar\b)/i'
А этого я не знал. Век живи - век учись.

//**********************
Позже...
В прикрепленном файле все исправил, на случай, если кто скачать захочет...

Последний раз редактировалось _SERGEYX_; 20.10.2008 в 09:56.
_SERGEYX_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"Наложение" картинок и их подсветка .. crus HTML и CSS 3 04.07.2008 19:37
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
PHP как язык для обучения программированию "с нуля"? DooM1k Свободное общение 10 31.03.2008 17:58
Кто-нибудь, напишите пожалуйста формулу на "Pascal" для этой задачи... Andrei18 Помощь студентам 5 30.03.2007 15:45