﻿Объект класса bbcode может быть инициализирован без параметров:
 
$bb = new bbcode;

Или с параметрами следующих типов:

   1. Строка с тегами BBCode:
       
      $text = 'Строка с тегами [b][i]BBCode[/i][/b].';
      $bb = new bbcode($text);

   2. Массив с синтаксическим разбором BBCode. Описание этого массива смотрите в описании свойства syntax. Инициализация аналогична:
       
      $text = 'Строка с тегами [b][i]BBCode[/i][/b].';
      $bb1 = new bbcode($text);
      $bb2 = new bbcode($bb1->syntax);
      if ($bb1->get_html() == $bb2->get_html()) {
          echo 'Один и тот же HTML';
      }

   3. Массив с деревом элементов BBCode. Описание этого массива смотрите в описании свойства tree. Инициализация аналогична:
       
      $text = 'Строка с тегами [b][i]BBCode[/i][/b].';
      $bb1 = new bbcode($text);
      $bb2 = new bbcode($bb1->tree);
      if ($bb1->get_html() == $bb2->get_html()) {
          echo 'Один и тот же HTML';
      }


Если конструктор класса получает массив, то считает его результатом синтаксического анализа какого-то ББКода и сохраняет в $this->syntax или в $this->tree в зависимости от структуры. Если получает непустую строку, то сохраняет ее в $this->text. По полученному аргументу вычисляет другие два свойства.

Свойства класса bbcode

    * tag - имя тега, которому сопоставлен данный экземпляр класса. Или пустая строка, если объект не сопоставлен конкретному тегу. Это свойство может понадобиться вам, если захотите добавить свой тег, или переопределить какой-то из сущуествующих. Более подробные пояснения смотрите ниже в главе "Как создать тег".
       
    * attrib - массив пар
      [имя атрибута] => значение атрибута

      для тега, которому сопоставлен экземпляр класса. Если объект не сопоставлен конкретному тегу, то этот массив пуст. Это свойство может понадобиться вам, если захотите добавить свой тег, или переопределить какой-то из сущуествующих. Более подробные пояснения смотрите ниже в главе "Как создать тег".
       
    * text - текст с обрабатываемым ББКодом. Этот текст ложится сюда при инициализации объекта, и меняется при каждом вызове конструктора класса или метода parse.
       
      Свойство text может оказаться полезным для оптимизации работы ваших скриптов. Из следующих примеров это станет более понятно:
       
      PHP
      /*
      Получаем текст BBCode, парсим его, и результат парсинга сохраняем в файле
      (это в примере. Лучше - в базе данных). Это позволит не парсить один и тот же
      текст дважды.
      */
      $text = isset($_POST['text']) ? $_POST['text'] : '';
      require_once 'ваш/путь/bbcode.lib.php';
      $bb = new bbcode($text);
      $fp = fopen('./bb_syntax', 'wb');
      fwrite($fp, serialize($bb->syntax));
      fclose($fp);

      Теперь, для восстановления исходного BBCode нам понадобится свойство text:
       
      PHP
      /*
      Берем из файла (для примера) результат парсинга BBCode, восстанавливаем
      исходный BBCode и выдаем его для редактирования
      */
      $syntax = unserialize(file_get_contents('./bb_syntax'));
      require_once 'ваш/путь/bbcode.lib.php';
      $bb = new bbcode($syntax);
      echo '<textarea cols="100" rows="30">';
      echo htmlspecialchars($bb->text);
      echo '</textarea>';

      В следующем примере берем из файла результат парсинга BBCode, генерируем HTML и выводим его на печать:
       
      PHP
      $syntax = unserialize(file_get_contents('./bb_syntax'));
      require_once 'ваш/путь/bbcode.lib.php';
      $bb = new bbcode($syntax);
      echo $bb->get_html();

    * syntax - массив, содержащий синтаксический разбор ББКода. Заполняется при вызове конструктора класса или при вызове метода parse.
       
      Структура массива "syntax"
      Array
      (
          ...
          [i] => Array  // [i] - целочисленный ключ начиная с 0
              (
                  [type] => тип элемента: 'text', 'open', 'close' или 'open/close'
                            'text'  - элемент соответствует тексту между тегами
                            'open'  - элемент соответствует открывающему тегу
                            'close' - элемент соответствует закрывающему тегу
                            'open/close' - элемент соответствует закрытому тегу
                                           (например такому: [img="..." /])
                  [str]  => строковое представление элемента: текст между тегами
                            или тег (например: '[font color=red size=+1]')
                  [name] => имя тега. Всегда в нижнем регистре. Например: 'color'.
                            Значение [name] отсутствует для элементов типа 'text'
                            и может быть пустой строкой для элементов типа
                            'close'. В последнем случае элемент будет
                            соответствовать тегу '[/]', который будет считаться
                            закрывающим для последнего незакрытого перед ним.
                  [attrib] => Array         // Это значение существует только для
                      (                     // элементов типов 'open' и
                          ...               // 'open/close'
                          ...
                          [имя атрибута] => значение атрибута. Например:
                          ...               [color] => red
                                            Имя атрибута всегда в нижнем регистре.
                                            Значение атрибута может быть пустой
                                            строкой. Имя тега тоже присутствует в
                                            списке атрибутов. Это для того, чтобы
                                            можно было работать, например, с
                                            такими тегами - [color="#555555"]
                      )
                  [layout] => Array                 // Это значение несуществует
                      (                             // для элементов типа 'text'.
                          [0] => Array              // Массив содержит пары
                              (                     // ( тип строки , строка )
                                  [0] => 0          // Типы могут быть следующие:
                                  [1] => [          // 0 - скобка ('[' или ']')
                              )                     // 1 - слэш '/'
                          ...                       // 2 - имя тега
                          [i] => Array              //     (например - 'font')
                              (                     // 3 - знак '='
                                  [0] => тип строки // 4 - строка из пробельных
                                  [1] => строка     //     символов
                              )                     // 5 - кавычка или апостроф,
                          ...                       //     ограничивающая значение
                                                    //     атрибута
                      )                             // 6 - имя атрибута
              )                                     // 7 - значение атрибута
          ...
      )

      Свойство syntax может помочь вам, во-первых, оптимизировать свои скрипты. Пример, как это сделать, смотрите выше. Во-вторых, это свойство будет вам полезно, если захотите реализовать какую-то нестандартную операцию над BBCode. Например, - вырезать все теги.
       
    * tree - массив, содержащий нормализованное дерево ББКода. Получается из syntax в результате его логического анализа:
         1. syntax преобразовывается в правильную скобочную структуру
         2. Затем преобразовываются в текст все элементы, которым запрещено находиться в данном месте. (Например, теги, вложенные в [nobb])
         3. Список элементов преобразуется в дерево.

      Структура массива "tree"
      Array
      (
          ...
          [i] => Array      i - целочисленный ключ начиная с 0
              (
                  [type] => тип элемента. Может иметь только два значения: 'item'
                            и 'text'. В первом случае элемент соответствует
                            какому-то тегу. Во втором случае элемент является
                            строкой текста без тегов.
       
                  [name] => имя тега в нижнем регистре. Например: 'h1'. [name]
                            определен только для элементов типа 'item' и
                            отсутствует для элементов типа 'text'.
       
                  [attrib] => Array         Список значений атрибутов. Определен
                      (                     только для элементов типа 'item' и
                          ...               отсутствует для элементов типа 'text'.
                          ...
                          [имя атрибута] => значение атрибута. Например:
                          ...               [align] => center
                          ...               Имя атрибута всегда в нижнем регистре.
                                            Значение атрибута может быть пустой
                                            строкой. Имя тега тоже присутствует в
                                            списке атрибутов. Это для того, чтобы
                                            можно было работать, например, с
                      )                     такими тегами - [align=right]
       
                  [val] => Array            Дерево подэлементов данного элемента.
                      (                     Существует только для элементов типа
                          ...               'item' и отсутствует для элементов
                          [i] => Array      типа 'text'. Структура полностью
                          ...               идентична структуре свойства
                          ...               $this->tree.
                      )
                  [str] => строка текста без тегов.
                           Напрмер: 'Хорошо живет на свете Виннипух'.
                           [str] существует только для элементов типа 'text' и не
                           существует для элементов типа 'item'.
              )
          ...
      )

      Свойство tree содержит более полный разбор BBCode, чем свойство syntax. Но если из syntax возможно однозначно восстановить исходный текст BBCode, то из tree это, скорее всего, окажется невозможно.
       
      Вам может понадобиться свойство tree, если вы будете создавать свои теги.
       
    * tags - это свойство - ассоциированный массив пар
       
      'имя_тега' => имя класса, реализующего соответствующий тег

      Все теги, разрешенные в ББКоде, должны быть представлены в этом массиве. Следующий пример показывает, как можно исключить из обработки какой-либо тег:
       
      PHP
      // Обрабатываем текст BBCode без тега [h1]
      $text = '[h1]BBCode[/h1] Пишем про [b]ББКод[/b]';
      require_once 'ваш/путь/bbcode.lib.php';
      $bb = new bbcode;
      unset($bb->tags['h1']);
      $bb->parse($text);
      echo $bb->get_html();

      Процедура добавления тега несколько более сложна. Поэтому будет описана отдельно.
       
    * mnemonics - массив мнемоник - смайлики и прочие условные обозначения, которые должны заменяться на что-то. Ключ - мнемоника, значение - на что заменяется. Например:
       
      ':-)' => '<img src="smile.gif" />'

    * autolinks - опция, включающая автоматические ссылки. По умолчанию установлена в true (автоматические ссылки включены). Для отключения ссылок должна быть установлена в false.
       
      Пример:
      $text = 'Статья про [b]BBCode[/b] - http://www.pc.uz/documents/text/732.html';
      require_once 'ваш/путь/bbcode.lib.php';
      $bb = new bbcode($text);
      // Отключаем автоматические ссылки:
      $bb->autolinks = false;
      echo $bb->get_html() . '<br />';
      // Включаем автоматические ссылки:
      $bb->autolinks = true;
      echo $bb->get_html();

    * is_close - свойство, устанавливающее значение по умолчанию для дочерних классов (тегов), для которых означает следующее:
          o true  - данный тег всегда закрыт (например, - [hr])
          o false - данный тег может не быть закрытым

      Это свойство может понадобится вам при конструировании собственных тегов.
       
    * lbr - свойство, устанавливающее значение по умолчанию для дочерних классов (тегов), - число переводов строк, которые должны игнорироваться перед тегом. Это свойство может понадобится вам при конструировании собственных тегов. Например, тег [h1] сам по себе создает разрыв перед собой, значит обработчик должен проигнорировать перед ним один разрыв, поставленный пользователем в исходном коде. Этот факт указан в описании специального класса:
       
      PHP
      public $lbr = 1;

      По умолчанию значение этого свойства установлено в 0.
       
    * rbr - свойство, устанавливающее значение по умолчанию для дочерних классов (тегов), - число переводов строк, которые должны игнорироваться после тега. Это свойство может понадобится вам при конструировании собственных тегов. Например, тег [h1] сам по себе создает разрыв после себя, равный примерно двум переводам строк, значит обработчик, должен проигнорировать после него два разрыва, поставленных пользователем в исходном коде. Этот факт указан в описании специального класса:
       
      PHP
      public $rbr = 2;

      По умолчанию значение этого свойства установлено в 0.
       
    * behaviour - строка, указывающая модель поведения тега (в плане вложенности), которому сопоставлен экземпляр данного класса. Это свойство может понадобиться вам при создании собственных тегов. Модели поведения предусмотрены следующие:
         1. 'a' - ссылки, якоря. Представлена тегами [a], [url], [anchor], [google]. Эти теги характеризуются тем, что могут иметь вложенными любые линейные теги, кроме ссылок.
             
         2. 'caption' - заголовки таблиц. Представлена единственным тегом [caption].
             
         3. 'code'    - линейные контейнеры кода. Представлена тегами [bbcode] и [nobb]. Эти теги характеризуются тем, что не могут содержать никаких дочерних.
             
         4. 'div' - блочные элементы. Представлена тегами [align], [center], [quote] и др. Эти теги характеризуются тем, что могут содержать что угодно, но их непосредственными потомками не могут быть теги имеющие модель поведения 'caption', 'li', 'td' или 'tr'.
             
         5. 'hr' - горизонталные линии. Представлена единственным тегом [hr].
             
         6. 'img' - картинки. Представлена единственным тегом [img].
             
         7. 'li' - элементы списков. Представлена единственным тегом [*].
             
         8. 'p' - блочные элементы типа абзацев и заголовков. Представлена тегами [h1], [h2], [h3], [h4], [h5], [h6], [p]. Эти теги характеризуются тем, что могут содержать только линейные элементы и картинки.
             
         9. 'pre' - блочные контейнеры кода. Представлена тегами [code], [pre] и тегами подсветок синтаксиса. Эти теги характеризуются тем, что не могут содержать никаких дочерних.
             
        10. 'span' - линейные элементы. Представлена тегами [b], [i], [u], [font] и т.п. Эти теги характеризуются тем, что не могут содержать блочные элементы и закрываются, как только начинается блочный элемент.
             
        11. 'table' - таблицы. Представлена единственным тегом [table].
             
        12. 'td' - ячейки таблиц. Представлена тегами [td] и [th].
             
        13. 'tr' - строки таблиц. Представлена единственным тегом [tr].
             
        14. 'ul' - списки. Представлена тегами [list], [ol], [ul].

      Значение по умолчанию - 'div'.
       
    * stat - массив статистических данных по обрабатываемому BBCode:
       
      Text
      'time_parse'  => Время парсинга BBCode в секундах
      'time_html'   => Время генерации HTML в секундах
      'count_tags'  => Число обработанных тегов BBCode
      'count_level' => Максимальное число уровней вложенности тегов BBCode.
                       = 0, если BBCode не содержит тегов.

    * preg_autolinks - массив регулярных выражений, используемых для автоматических ссылок. Вот значение по умолчанию:
       
      Массив замен для автоматических ссылок
      $this->preg_autolinks = array(
          'pattern' => array(
              "'[\w\+]+://[A-z0-9\.\?\+\-/_=&%#:;]+[\w/=]+'si",
              "'([^/])(www\.[A-z0-9\.\?\+\-/_=&%#:;]+[\w/=]+)'si",
              "'[\w]+[\w\-\.]+@[\w\-\.]+\.[\w]+'si",
          ),
          'replacement' => array(
              '<a href="$0" target="_blank">$0</a>',
              '$1<a href="http://$2" target="_blank">$2</a>',
              '<a href="mailto:$0">$0</a>',
          ),
          'highlight' => array(
              '<span class="bb_autolink">$0</span>',
              '$1<span class="bb_autolink">$2</span>',
              '<span class="bb_autolink">$0</span>',
          ),
      );

      Здесь
          o preg_autolinks['pattern'] - массив регулярных выражений, которым должны соответствовать искомые в тексте ссылки.
             
          o preg_autolinks['replacement'] - массив шаблонов, по которым должны заменяться искомые в тексте ссылки.
             
          o preg_autolinks['highlight'] - массив шаблонов, используемый вместо preg_autolinks['replacement'] в режиме подсветки синтаксиса.

      Все три массива должны подчиняться синтаксису, установленному для функции
       
      preg_replace(pattern, replacement)

      Свойство preg_autolinks может понадобиться вам, если захотите улучшить автоматические ссылки. Например, если вы хотите спрятать email-ы от спамботов, можете воспользоваться таким кодом:
       
      PHP
      $bb->preg_autolinks['pattern'][2] = "'([\w]+[\w\-\.]+)@([\w\-\.]+\.[\w]+)'si";
      $bb->preg_autolinks['replacement'][2] = '$1(немецкая овчарка)$2';

	  
Методы класса bbcode

    * string checkUrl(string url) - преобразует строку URL с целью защиты от javascript-инъекции. Возвращает преобразованную строку.
       
      Пример
      $url = 'javascript:alert(1)';
      $url = bbcode::checkUrl($url);
      echo $url;
      // Выведет: &#46;/javascript&#58;alert&#40;1&#41;

    * string get_html([array elems]) - генерирует и возвращает HTML-код. Необязательный аргумент elems обязан иметь ту же структруру, что и свойство tree (см. главу "Свойства класса bbcode"). Если аргумент не указан, то обрабатывается $this->tree.
       
      Пример использования
      $text = 'Строка с тегами [b][i]BBCode[/i][/b].';
      $bb = new bbcode($text);
      // Выводим HTML:
      echo $bb->get_html();

    * array get_syntax([array tree]) - конвертит дерево элементов BBCode в массив со структурой свойства syntax (см. главу "Свойства класса bbcode") и возвращает результат. Необязательный аргумент tree обязан иметь ту же структруру, что и свойство tree. Если аргумент не указан, то обрабатывается $this->tree.
       
    * array get_tree() - обрабатывает массив $this->syntax, перезаписывает свойство tree и возвращает дерево элементов.
       
    * string highlight() - возвращает подсвеченный BBCode.
       
      Пример использования
      $text = 'Строка с тегами [b][i]BBCode[/i][/b].';
      $bb = new bbcode($text);
      // Выводим подсвеченный BBCode:
      echo $bb->highlight();

    * string insert_smiles(string text) - обрабатывает строку text: мнемонизирует HTML-код, заменяет разрывы строк на <br />, вставляет смайлики (перечисленные в массиве mnemonics) и "автоматические ссылки" (если опция autolinks установлена в true). Возвращает преобразованную строку.
       
    * boolean isPermissiblyChild(string parent, string child) - возвращает true, если тег с именем parent может иметь непосредственным потомком тег с именем child. В противном случае - false. Если parent - пустая строка, то проверяется, разрешено ли child входить в корень дерева BBCode.
       
    * boolean must_close_tag(string current, string next) - логическая функция. Проверяет, должен ли тег с именем current закрыться перед началом тега с именем next. Возвращает true, если должен закрыться и false в противном случае.
       
    * array normalize_bracket(array syntax) - превращает массив со структурой как у свойства syntax в правильную скобочную структуру. У возвращаемого массива отсутствует элементы 'layout', но присутствуют элементы 'level', куда пишется уровень вложенности тега.
       
    * array parse([mixed code]) - парсер BBCode. Совершает синтаксический разбор BBCode, инициализирует свойства syntax и tree. Возвращает массив syntax. Необязательный аргумент code может быть строкой с текстом BBCode или массивом типа syntax или массивом типа tree (см. главу "Свойства класса bbcode"). Если code не указан, то синтаксическому разбору подвергается $this->text.
       
      Пример использования:
      $text = 'Строка с тегами [b][i]BBCode[/i][/b].';
      $bb = new bbcode;
      // Парсим $text:
      $bb->parse($text);
      // Выводим HTML:
      echo $bb->get_html();

    * string specialchars(string string) - конвертирует специальные символы в строке string в мнемоники BBCode и возвращает результат.
       
      Таблица трансляцииСпецсимвол	Мнемоника
      [	@l;
      ]	@r;
      "	@q;
      '	@a;
      @	@at;

    * string unspecialchars(string string) - конвертирует мнемоники BBCode в строке string в специальные символы и возвращает результат. Это - обратная функция для specialchars.
	
Как создать тег

Чтобы добавить еще один или несколько тегов, нужно, во-первых, написать дочерний класс к классу 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 можете придумать что угодно, не содержащее символа подчеркивания "_".