[BugFix] Кросс-парсинг тегов [list]

Обсуждение дизайна и функциональности сайта и форума.
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

[BugFix] Кросс-парсинг тегов [list]

Сообщение Хакер » 14.05.2007 (Пн) 13:20

Допустим мы собрались сделать сложный список. Например такой:

Код: Выделить всё
[list]
[*] Это
[*] сложный
[*] список
[*] Перечисление:
[list=1][*]Первое
[*]Второе
[*]Третье[/list]
[*]Пункты уехали влево
[*]Пункты уехали влево...
[*]Пункты уехали влево.......
[/list]


На практике это будет (до установки баг-фикса) выглядеть вот так:
Изображение
________________________________________________________

Решение проблемы:

(в принципе я мог бы отправить это как ЛС гайдару, но так как проблема не в конкретном форуме, а вообще в phpBB, то думаю это будет интересно и другим (владельцам форумов) )

  1. Идём в папку /includes
  2. Открываем файл bbcode.php
  3. Прокручиваемся в конец - добавляем следующий код (2 функции):
    Код: Выделить всё
    function bbcode_parse_list($posting, $uid)
    {
        global $list_type_stack;
        global $list_uid;

        $list_type_stack = array();
        $list_uid = $uid;

        $posting = preg_replace_callback('/\[(\*|\/list|list(|=([a1])))\]/i', "bbcode_list_parser_callback", $posting);
        while(NULL!==($type_frame=array_pop(&$list_type_stack)))
        {
            $repl_mask = "[list{$type_frame[1]}:$uid]";
            $posting = substr_replace($posting, "[list{$type_frame[1]}]", strrpos($posting,$repl_mask), strlen($repl_mask));
        }
        return $posting;
    }

    function bbcode_list_parser_callback($match_arr)
    {
        global $list_type_stack;
        global $list_uid;
        if($match_arr[1]=='*' && count($list_type_stack)>0)
        {
            return "[*:$list_uid]";
        }
        if(strtolower($match_arr[1])=='/list')
        {
            $last_type = array_pop(&$list_type_stack);
            if($last_type==NULL)
            {
                // Лишний закрывающий тег, оставляем как есть
                return $match_arr[0];
            }
            else
            {
                return "[/list:{$last_type[0]}:$list_uid]";
            }
        }
        else
        {
            array_push(&$list_type_stack, array($match_arr[2]=='' ? 'u' : 'o', $match_arr[2]));
            return "[{$match_arr[1]}:$list_uid]";
        }
    }

  4. Прокручиваемся выше - ищем следующий код:
    Код: Выделить всё
    // [list] and [list=x] for (un)ordered lists.
    //    $open_tag[0]="[list]";

       // unordered..
    //   $text = bbencode_first_pass_pda($text, $uid, $open_tag, "[/list]", "[/list:u]", false, 'replace_listitems');
        echo $text;
       $open_tag[0] = "[list=1]";
       $open_tag[1] = "[list=a]";

       // ordered.
       $text = bbencode_first_pass_pda($text, $uid, $open_tag, "[/list]", "[/list:o]",  false, 'replace_listitems');

  5. Удаляем его, или комментируем.
  6. Вместо удалённого (или после закомментированног) когда вставляем следующее:
    Код: Выделить всё
        $text = bbcode_parse_list($text, $uid);
  7. Радуемся...


ЗЫ. Спасибо GSerg'у за найденый баг.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 14.05.2007 (Пн) 14:20

Проверяем:


  • Это
  • сложный
  • список
  • Перечисление:
    1. Первое
    2. Второе
    3. Третье
  • Пункты уехали влево
  • Пункты уехали влево...
  • Пункты уехали влево.......

Ничего не разъехалось ! :)
____________

Детект неоткрытых тегов
[/list] [/list]

Детект незакрытых тегов


[list] fsdsf


_______

Резюмирую: баг исправлен, незакрытые и неоткрытые теги при обработке новым (моим) обработчиком проблем не вызывают.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в VBStreets.ru

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 43

    TopList  
cron