Интернет, компьютеры, софт и прочий Hi-Tech

Подписаться через RSS2Email.ru

API

Как создать тег

Чтобы добавить еще один или несколько тегов, нужно, во-первых, написать дочерний класс к классу bbcode, реализующий специфику этих тегов, и, во-вторых, добавить имена ваших тегов и соответствющего им класса в массив tags.

В примерах ниже будет продемонстрировано практически все, что может вам понадобиться при описании нового тега(ов). В этих примерах предполагается PHP5. Чтобы они работали в PHP4, нужно все объявления public и private заменить на var.

Класс для тега [hr]

class Xbb_Tags_Hr extends bbcode
{
    // Флаг, является ли тег всегда закрытым. В данном случае "да".
    public $is_close = true;
    // Число разрывов строк, которые должны быть проигнорированы после тега
    public $rbr = 1;
    // Указываем "модель поведения" таегов. 'hr' означает, что тег может
    // содержаться только в элементах блочного типа и не может содержать каких
    // либо дочерних элементов
    public $behaviour = 'hr';
    // Конструктор класса ничего не делает
    function Xbb_Tags_Hr()
    {
    }
    // Описываем конвертацию в HTML.
    // Строчка '$tree = null' нужна для нормальной работы в режиме E_STRICT.
    function get_html($tree = null)
    {
        return '<hr class="bb" />';
    }
}
 

Класс для тега [p] и тегов [h1], [h2], [h3], [h4], [h5], [h6]

class Xbb_Tags_P extends bbcode
{
    // Число разрывов строк, которые должны быть проигнорированы перед тегами
    public $lbr = 2;
    // После тега игнорировать 2 переноса строки
    public $rbr = 2;
    // Указываем "модель поведения" таегов. 'p' - означает, что обрабатываемые
    // теги создают блочные элементы, которые могут содержать только линейные
    // элементы и картинки.
    public $behaviour = 'p';
    // Конструктор класса
    function Xbb_Tags_P()
    {
    }
    // Описываем конвертацию в HTML.
    function get_html($tree = null)
    {
        // $this->tag - имя текущего тега. Всегда доступно.
        $str = "\n<" . $this->tag . ' class="bb"';
        // $this->attrib - массив значений атрибутов. Всегда доступен.
        // Имеет структуру: 'имя_атрибута' => значение атрибута
        $align = isset($this->attrib['align']) ? $this->attrib['align'] : '';
        if ($align) {
            $str .= ' align="' . htmlspecialchars($align) . '"';
        }
        // parent::get_html() - Возвращает HTML, сгенерированный из
        //                      содержимого тега.
        return $str . '>' . parent::get_html() . '</' . $this->tag . ">\n";
    }
}

Класс для тега [bbcode]

class Xbb_Tags_Bbcode extends bbcode
{
    // Модель поведения 'code' означает, что тег является линейним и не может
    // содержать в себе дочерних
    public $behaviour = 'code';
    // Специфичное для данного класса свойство
    private $_bb;
    // В конструкторе инициализируем свойство $this->_bb
    function Xbb_Tags_Bbcode()
    {
        $this->_bb = new bbcode();
    }
    // Выдаем HTML
    function get_html($tree = null)
    {
        // Находим текстовое содержимое тега
        $str = '';
        foreach ($this->tree as $item) {
            if ('item' == $item['type']) {
                continue;
            }
            $str .= $item['str'];
        }
        // Обрабатываем текст
        // $this->tags - Массив имен поддерживаемых тегов
        $this->_bb->tags = $this->tags;
        // $this->mnemonics - Массив мнемоник (смайликов)
        $this->_bb->mnemonics = $this->mnemonics;
        // $this->autolinks - флаг, включающий/отключающий автоматические ссылки
        $this->_bb->autolinks = $this->autolinks;
        $this->_bb->parse($str);
        return '<code class="bb_code">' . $this->_bb->highlight() . '</code>';
    }
}

Написав класс и позаботившись, чтобы он был "в зоне видимости" вашего скрипта, можно пользоваться описанным тегом(ами):
 
PHP
$text = 'Код:
[bbcode][h1]Красота - [i]великая[/i] сила![/h1][/bbcode]
[hr]
Результат:
[h1]Красота - [i]великая[/i] сила![/h1]'
;
 
$bb = new bbcode;
$bb->tags['bbcode'] = 'Xbb_Tags_Bbcode';
$bb->tags['h1']     = 'Xbb_Tags_P'     ;
$bb->tags['h2']     = 'Xbb_Tags_P'     ;
$bb->tags['h3']     = 'Xbb_Tags_P'     ;
$bb->tags['h4']     = 'Xbb_Tags_P'     ;
$bb->tags['h5']     = 'Xbb_Tags_P'     ;
$bb->tags['h6']     = 'Xbb_Tags_P'     ;
$bb->tags['hr']     = 'Xbb_Tags_Hr'    ;
$bb->tags['p']      = 'Xbb_Tags_P'     ;
// Тестируем:
$bb->parse($text);
echo $bb->get_html();

Еще несколько замечаний:
  • Свойство is_close указывать необязательно. Оно по умолчанию установлено в false.
     
  • Свойство lbr указывать необязательно. Оно по умолчанию установлено в 0.
     
  • Свойство rbr указывать необязательно. Оно по умолчанию установлено в 0.
     
  • Свойство behaviour указывать необязательно. Оно по умолчанию установлено в div.
     
  • Опция $this->autolinks определяется глобальными настройками. Без особой необходимости ее менять не надо.
     
  • Массив $this->mnemonics определяется глобальными настройками. Без особой необходимости его менять не надо.
     
  • Если новый тег включить в список поддерживаемых тегов после того, как был распарсен текст с BBCode, то этот тег не будет обрабатываться.
     
  • Вы можете не только добавлять собственные теги, но и переопределять умолчальные. Если вы хотите переопределить какой то из существующих тегов, то должны написать свой альтернативный класс для этого тега и заменить на него умолчальный:
     
    PHP
    $bb = new bbcode;
    // Назначаем тегу [size] свой альтернативный класс MySize:
    $bb->tags['size'] = 'MySize';

  • Если вы хотите, чтобы ваш тег был всегда доступен без необходимости "включать" его "на лету", откройте файл config/tags.php и вставьте свою строчку в список тегов, поддерживаемых по умолчанию.
     
  • Если вы не хотите заботится о том, чтобы ваш класс был "виден", когда понадобится, назовите его Xbb_Tags_MyClass, запишите в файл MyClass.php и поместите этот файл в директорию Xbb/Tags/. Тогда парсер сам найдет этот класс, когда он ему понадобится. Вместо MyClass можете придумать что угодно, не содержащее символа подчеркивания "_".
Биржа долевых инвестиций SIMEX.

Последнее редактирование: 2007-08-23 17:23:12

Метки материала: BBCode, xBB, HTML, тег, PHP, API, класс


32 комментария

Последние десять комментариев:

23.11.2012 23:18:32 #
Safari Гость ЛGraffiti
Поцы подорити плиз тегу
16.03.2012 19:43:52 #
Mozilla Firefox dima
Самое простое решение:
 
Пользователь набирает текст BBCode. Этот текст, скорее всего, сохраняется в базу, и есть скрипт (не имеющий отношение к парсеру), который это делает. Пусть этот скрипт обычной регуляркой с колбаком перед сохранением находит и заменяет все подстроки вида "[nick](id|login)[/nick]".
16.03.2012 18:20:41 #
Mozilla Firefox Гость AndryG
Вот до этой мысли (по замене тега) и дошел вечером Well
 
Как я вижу, надо опосля parse() пробежаться рекурсивно по дереву, найти этот тег и перебить его параметры?
 
Или есть более элегантное решение?
15.03.2012 19:35:14 #
Mozilla Firefox dima
Все равно вам придется где-то сохранять данные юзера такими, какими они были на момент написания поста.
 
Если бы задачу решал я, то при сохранении поста преобразовывал бы его текст так, чтобы
 
Text
[nick](id|login)[/nick]

превращался в
 
Text
[nick sex="(man|woman)"]login[/nick]

Это решает проблему. Как сделать такое преобразование, уже другой вопрос.
15.03.2012 18:13:28 #
Mozilla Firefox Гость AndryG
Задача: (упрощенно Well )
имеем таблицу в БД users(id, login, sex, nickname)
хотим тег [nick](id|login)[/nick], который выдаст нам
HTML
<span title="nickname"><img src="/sex.png">login</span>
Проблема:
при каждом преборазовании приходится вычитывать данные из БД, а это надо сделать однаждны и афиксировать данные о юзере на текущий момент.
 
Вопрос: как?
 
Как мысль была вклинится в парсер, и взамен этого тега поставить существующие... но сдается мне, что это не верно.
02.02.2012 08:10:49 #
Mozilla Firefox dima
Вот здесь написано: Как создать тег спойлер.
01.02.2012 23:15:07 #
Google Chrome Гость SPAHI4
Подскажите, как сделать спойлер?
05.11.2009 12:14:33 #
Mozilla Firefox dima
Всегда пожалуйста Well
05.11.2009 11:45:25 #
Opera Гость Алексей
dima СПАСИБО! Applause
05.11.2009 10:52:47 #
Mozilla Firefox dima
Вот возьмите за образец: http://xbb.uz/youtube.html

Оставьте, пожалуйста, свой комментарий к публикации

Представиться как     Антибот:
   

Просьба не постить мусор. Если вы хотите потестить xBB, воспользуйтесь кнопкой предварительного просмотра на панели инструментов xBBEditor-а.


© 2007-2017, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.