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

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

Показать HTML | Показать BBCode

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

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

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


27 комментариев

17.12.2007 12:12:23 #
Internet Explorer Гость Сергей
Как создать тег с переменной? В частности для парсирования phpBB 2, где тег имеет вид [b:8775hg8d7f4], где 8775hg8d7f4 в каждом посте разная, но берется из базы (известна). Создаю тег [b:$uid] - бесполезно.
17.12.2007 14:42:47 #
Mozilla Firefox dima
У phpBB есть свой парсер. xBB в uid-ах не нуждается.
 
Если вам необходимо обрабатывать посты, хранящиеся в базе phpBB, то предварительно приводите их к виду, в котором они были введены пользователями. В phpBB должна быть соответствующая функция, т.к. при редактировании постов он выдает ББКод без каких либо uid-ов.
28.01.2008 18:26:40 #
Opera Гость ВИТА
ДОБРОГО ДНЯ !ПРОШУ ИЗВИНИТЬ ЧТО СПРАШИВАЮ,НО ВОПРОС ИЗ РАЗРЯДА ЧАГО=F1..УВЫ ПЫТАЮСЬ ПОНЯТЬ КАК СОЗДАТЬ ТЕГИ ДЛЯ ЛУЧШЕГО СЧИТЫВАНИЯ ИНФОРМАЦИИ РАЗМЕЩЁНОЙ МНОЙ КАК ОБЪЯВЛЕНИЕ НА САЙТАХ ДОСОК ОБЪЯВЛЕНИЙ И ФОРУМАХ УЧЁТОМ ПОИСКА НА РАЗНЫХ ПОИСКОВЫХ МАШИНАХ,НО С ПРИВЯЗКОЙ К ОПРЕДЕЛЁНОМУ РЕГИОНУ.DAMA_S-@BK.RU ВСЕМ ЗАРАНЕЕ ПАСИБКИ.
29.01.2008 12:35:31 #
Mozilla Firefox dima
  1. xBB создан дла РАЗРАБОТЧИКОВ досок объявлений, форумов и т.д. ТОЛЬКО ИМ доступна возможность создания тегов. Создание тегов недоступно ПОЛЬЗОВАТЕЛЯМ досок объявлений и форумов.
     
  2. Установка xBB на доску объявлений или форум, создание тегов, требуют знания PHP.
     
  3. Если вы являетесь владельцем доски объявлений или форума, на котором установлен xBB, и нуждаетесь в новом теге, то вам следует обратиться за помощью к программисту PHP.
02.07.2008 23:39:12 #
Mozilla Firefox Гость SpideR-X
Появилась проблема... создаю тег... но... тег должен зависеть от переменной которая определяется в скрипте в который встраивается ваша ББ система тоесть...
 
PHP
<?php
$a=1; //переменная от которой зависит работа тега
$text="аклабыр[tag]тыдыщь[/tag]";
require_once './system/bbcode/bbcode.lib.php';
$bb = new bbcode($text);
echo $bb->get_html();
?>
файл описания тега:
PHP
<?php
class Xbb_Tags_Tag extends bbcode
{
 
    public $lbr = 2;
 
    public $rbr = 2;
 
    public $behaviour = 'div';
 
    function get_html($tree = null)
    {
//собственно выводимый результат зависит от этого if'a
        if(!empty($a)){
                        return parent::get_html();}
                else{
                        return '<div>'.parent::get_html().'</div>';}
    }
}
?>

так вот в любом случае выполняется
return '<div>'.parent::get_html().'</div>';
даже если переменная $a определена...
 
дело в том что с классами я не работал и потому незнаю как передать переменную в класс Not so
03.07.2008 01:55:14 #
Iceweasel dima
  1. Чтобы узнать, определена ли переменная, следует пользовать isset. Функция empty проверяет, определена ли И не пуста ли переменная.
     
  2. В вашем случае ошибка заключается в использовании $a вне ее области видимости. Если $a - глобальная переменная, то это следует указать в теле функции:
     
    PHP
    global $a;

    Если $a не является глобальной переменной, то можно решить проблему следующими способами:
    1. Объявить $a глобальной переменной:
       
      PHP
      $_GLOBALS['a'] = $a;

      Теперь можно работать с ней, как с глобальной. Не рекомендую этого делать, - это отвратительный стиль программирования.
       
    2. Объявить соответствующее статическое свойство вашего класса:
       
      PHP
      class Xbb_Tags_Tag extends bbcode
      {
          public $lbr = 2;
       
          public $rbr = 2;
       
          public $behaviour = 'div';
       
          // описание статического свойства
          static public $a = null;
       
          function get_html($tree = null)
          {
              // обратите внимание на обращение к статическому свойству
              if (! empty(self::$a)) {
                  return parent::get_html();}
              else {
                  return '<div>' . parent::get_html() . '</div>';
              }
          }
      }

      В своем скрипте будете делать так:
       
      PHP
      require_once './system/bbcode/Xbb/Tags/Tag.php';
      Xbb_Tags_Tag::$a = 1; //переменная от которой зависит работа тега

      Этот способ лучше, чем первый, но, все равно, не рекомендую этого делать, так как можно сделать правильней.
       
    3. Рекомендованный способ: почитайте на тему паттернов проектирования (например, про паттерн "Реестр"), выберите подходящий для вашей задачи и примените его. Проблемы, вроде описанной, должны исчезнуть.
28.08.2008 16:56:42 #
Opera Гость Denix
Рекомендованный способ: почитайте на тему паттернов проектирования (например, про паттерн "Реестр"), выберите подходящий для вашей задачи и примените его. Проблемы, вроде описанной, должны исчезнуть.
Можно поподробнее где прочитать можно и что такое паттерны? Я начинающий прогер Not so и я столкнулся с такой же проблемой Well Точнее я решил позаимствовать идею распологающуюся постом выше, но хочется сделать правильно ;)
29.08.2008 13:00:14 #
Iceweasel dima
http://ru.wikipedia.org/wik...D0%B8%D1%8F
07.11.2008 16:43:12 #
Internet Explorer Гость Сашуля
Добрый день. может и глупо, но мне надо бы узнать а как сделать тег, для того чтоб добавить смайлики на форум PHPBB3
подскажите
08.11.2008 21:17:18 #
Google Chrome Гость БМ
Сашуля, вам нужно создать соответствующую мнемонику или же использовать оригинальные средства форума для смайликов.

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

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

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


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