За последние 24 часа нас посетили 22929 программистов и 1230 роботов. Сейчас ищут 740 программистов ...

Форматизатор вывода

Тема в разделе "Решения, алгоритмы", создана пользователем S.t.A.M., 1 мар 2008.

  1. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Как бы окуратно я не кодил, мой движок при выводе превращает все в фрагментарную кашу...
    Когда начинаешь разбирать вывод - можно повеситься!
    Поэтому я решил написать функцию, которая форматирует вывод - точнее просто расставляет "сдвиги" строчек. Возможно это не лучшая реализация, но по другому я еще не умею )))
    Попутно снабдил ее несколькими фичами:
    - режим "сворачивать все в "кашу" - типа защита от краж, не сильная, но что бы разобрать код - придется подумать. Немного уменьшает общий вес страницы и экономит трафик.
    - можно включить подсчет парных тегов, т.е. скрипт тупо показывает равно ли кол-во открытых тегов - кол-ву закрытых

    Синтаксис примерно такой:
    out_format(str buffer,[int mode]);
    buffer - исходный HTML текст
    mode - режим:
    0 (по умолчанию) - сворачивает в кашу
    1 - красиво форматирует
    2 - красиво форматирует и выводит отчет

    Возвращает отформатированный текст.

    Буду рад, если кому пригодится! )))

    Если кто то ее модернизирует в плане производительности/ресурсоемкости - скажу спасибо! )))

    Замечания и критику пишите в ветку!

    PHP:
    1. function out_format($buffer,$fdebug=0) {
    2.     //
    3.     // Форматизатор вывода by S.t.A.M. ver. 1.01
    4.     //
    5.     switch ($fdebug) {
    6.         case 0:
    7.             $patern = "/(^\s*)|(\r)|(\n)/m";
    8.             $result = preg_replace($patern, '', $buffer);
    9.             break;
    10.  
    11.         case 1:
    12.         case 2:
    13.             $buffer = str_replace("<br>","<br>\r",$buffer);
    14.  
    15.             $patern = "/^\s*/m";
    16.             $buffer = preg_replace($patern, '', $buffer);
    17.  
    18.             $open_tags_array = Array("<html", "<head", "<title", "<body", "<p", "<a", "<div", "<table", "<tr", "<th", "<td", "<caption", "<frameset", "<ol", "<ul", "<menu", "<form", "<textarea", "<select", "<script");
    19.             $close_tags_array = Array("</html>", "</head>", "</title>", "</body>", "</p>", "</a>", "</div>", "</table>", "</tr>", "</th>", "</td>", "</caption>", "</frameset>", "</ol>", "</ul>", "</menu>", "</form>", "</textarea>", "</select>", "</script>");
    20.             $check = array_fill(0,count($open_tags_array),0);
    21.  
    22.             $buffer_arr_t = explode("\r",$buffer);
    23.  
    24.             $count=0;
    25.             $ident="    "; // отступ определяется кол-вом пробелов!
    26.             foreach ($buffer_arr_t as $val) {
    27.                 if (trim($val)!="") {
    28.                     $cur_count = $count;
    29.                        $x_open = 0;
    30.                     foreach ($open_tags_array as $ind => $pat) {
    31.                         $tmp = preg_match_all("/$pat( |>)/i",$val,$out);
    32.                         $x_open += $tmp;
    33.                         if ($fdebug==2) {
    34.                             if ($tmp>0) {$check[$ind] += $tmp;}
    35.                             }
    36.                         }
    37.  
    38.                     $x_close = 0;
    39.                     foreach ($close_tags_array as $ind => $pat) {
    40.                         $pat = str_replace("/","\/",$pat);
    41.                         $tmp = preg_match_all("/$pat/i",$val,$out);
    42.                         $x_close += $tmp;
    43.                         if ($fdebug==2) {
    44.                                if ($tmp>0) {$check[$ind] -= $tmp;}
    45.                             }
    46.                         }
    47.  
    48.                        $count += ($x_open-$x_close);
    49.                     $move = ($x_open-$x_close<0)?$count:$cur_count;
    50.                     $tmp_str = str_repeat($ident,$move).trim($val);
    51.                     $buffer_arr[] = $tmp_str;
    52.                     }
    53.                 }
    54.             $buffer = implode("\r",$buffer_arr);
    55.  
    56.             if ($fdebug == 2) {
    57.                 $buffer .= "\r\r\r<!-- \r ОТЧЕТ: \r";
    58.                 foreach ($open_tags_array as $ind => $val) {
    59.                     $hint = ($check[$ind]==0)?"":"   <<<------------------- ОШИБКА!!!";
    60.                     $buffer .= $val."> = ".$check[$ind].$hint."\r";
    61.                     }
    62.                 $buffer .= "\r* <0 кол-во лишних закрывающих тегов,\r* >0 кол-во лишних открывающих тегов.\r-->";
    63.                 }
    64.  
    65.             $result = $buffer;
    66.             break;
    67.     }
    68.     return $result;
    69. }
     
  2. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  3. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Sergey89, чет это совсем сложное... Может в будущем и не поленюсь установить... )))
     
  4. Digger

    Digger Активный пользователь

    С нами с:
    19 фев 2008
    Сообщения:
    6
    Симпатии:
    0
    Адрес:
    Москва
    Опасная штука для производительности. Лучше подключить опцией в редакторе шаблонов и просто форматировать текст страницы.
     
  5. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Digger
    Форматирование используется только во время отладки, так что можно потерпеть...
    А потом можно перевести в режим "в кашу" и тогда одна замена по регулярке не сильно загрузит систему.

    Горбунов Олег
    Прости, не понял, что ты хотел этим сказать...

    P.S. Чуть оптемизировал код. Up!
     
  6. Anonymous

    Anonymous Guest

    Хотел сказать - а за что боремся то?
     
  7. dAllonE

    dAllonE Guest

    Горбунов Олег +1. Когда открыл для себя Firebug перестал форматированием вывода заморачиваться. И баги косяки верстки стали быстрее находиться.
     
  8. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Ну, я, например, сижу на макстоне... там такой модной приблуды нет )))
    [:задумался:]
     
  9. Anonymous

    Anonymous Guest

    [​IMG]
    Разработчик выбирает инаструменты, а не они его. "Сижу" я тоже на Опере. А ФФ - это инструмент. Крайне удобный.
     
  10. dAllonE

    dAllonE Guest

    S.t.A.M., попробуй поставить FireFox и на него Firebug и почувствуешь мега комфорт)))
    Возможность посмотреть и включить/выключить любую из деклараций селектора, прикольная коносоль(особенно я ею проникся за то, что она AJAX(Post/Get запросы записывает и можно просмотреть что там от скрипта пришло и почему не срабатывает) ну и многое многое другое.

    P.S. У меня знакомый сидит на Маковском браузере, но все равно юзает Firebug через Firefox... Ибо удобно...
     
  11. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    dAllonE уже наслаждаюсь! )))
     
  12. sword dancer

    sword dancer Активный пользователь

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0