Перейти к основному содержанию
Тема: Улучшаем mjohnson/decoda spoiler (Прочитано 2921 раз) предыдущая тема - следующая тема

Улучшаем mjohnson/decoda spoiler

Мне самому очень лень делать парсинг бб-кодов, поэтому я нашел интересную либу по парсингу бб-кодов:


Цель: сделать сабж как на рутрекере

Sorry my english  :wink:

Require: jquery.min.js

1. Create file \vendor\mjohnson\decoda\src\Decoda\Filter\SpoilerFilter.php
2. Add in file \vendor\mjohnson\decoda\src\Decoda\Filter\SpoilerFilter.php
Code

3. Create file \vendor\mjohnson\decoda\src\templates\spoiler.php
4. Add in file \vendor\mjohnson\decoda\src\templates\spoiler.php
Code

5. Your php function:
Code

6. spoiler.js
Code

7. img files here - Spoiler for smf / Themes / images / spoiler /
8. include file spoiler.js, image files in your project




If you use BlockFilter, please uncomment in \vendor\mjohnson\decoda\src\Decoda\Filter\BlockFilter.php:
Code

Re: Улучшаем mjohnson/decoda spoiler

Ответ #1
Найдена ошибка - заглавие спойлера обрезается, если есть символ пробела, поэтому пришлось-таки парсить спойлер без участия сабжа.

Про шаги с 1-4 забудьте, и вместо 5 использовать мою функцию:


<?php
function parse_spoiler($s)
{
    if (false === mb_stripos($s, '[spoiler'))
        return $s;

    $a = [
        '<div class="sp-wrap"><div class="sp-body" title="',
        '">',
        '</div></div>',
    ];

    $spoiler_title = 'Скрытый текст/картинка';
    // mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
    $s = preg_replace('~\[spoiler\]~i', $a[0] . $spoiler_title . $a[1], $s, -1, $count1);
    $s = preg_replace('~\[spoiler=(.*?)\]~si', $a[0] . '\\1' . $a[1], $s, -1, $count2);
    $nrepl = $count1 + $count2;
    if (!$nrepl)
        return $s;

    $s = preg_replace('~\[\/spoiler\]~i', $a[2], $s, $nrepl, $count_end);
    // auto close
    if ($count_end < $nrepl) {
        $s .= str_repeat($a[2], $nrepl - $count_end);
    }

    return $s;
}