Парсер BBCode на PHP

tashkentchi

Новичок
Упс... Это моя неакуратность. Замени все вызовы getmicrotime() в bbcode.lib.php на $this -> getmicrotime() в строках 118, 997 и 1049. Метод я добавил, а вот вызовы не все поправил.
 

ZigFreeD

Новичок
Да ладно бывает! А вообще скрипт супер :)

-~{}~ 27.03.07 15:16:

А никто не знает где можно взять готовый скрипт, для отображения кнопочек с bb-кодом? и соответственно JavaScripts к нему же... для вноса в textarea самих bb-кодов.
Я не смог сам найти такой :(
 

tashkentchi

Новичок
Возьми из какого-нить свободного форумного движка. Например из phpBB.
 

boombick

boombick.org
Дома займусь добавлением к библиотеке вывода кнопочек для добавления bb-кодов и генератора js для всего этого счастья. Ибо библиотека и вправду отличная, а с такой штукой будет очень удобно ее использовать
 

ZigFreeD

Новичок
tashkentchi
Спасибо за ссылку!

boombick
Да! Это было бы вообще супер :) особенно если вы совместите усилия и сделаете это в одном пакете :)
Под фразой "совместите усилия" я подразумеваю то, чтоб этот скрипт был в перую очередь оптимизирован для этого парсера :) А уж для других это их проблемы будет :)
 

tashkentchi

Новичок
Автор оригинала: ZigFreeD
boombick
Да! Это было бы вообще супер :) особенно если вы совместите усилия и сделаете это в одном пакете :)
Под фразой "совместите усилия" я подразумеваю то, чтоб этот скрипт был в перую очередь оптимизирован для этого парсера :) А уж для других это их проблемы будет :)
+1

-~{}~ 29.03.07 02:25:

xBB версии 0.27

Отличается от 0.26 следующим:

1. Исправлен баг с функцией getmicrotime().

2. Улучшены автоматические ссылки. Теперь обрабатываются любые протоколы.

3. Добавлена настройка preg_autolinks, позволяющая, "на лету" изменять автоматические ссылки.

4. Исправлена документация.

Скачать zip-архив со скриптом, тестами и набором смайликов можно здесь: http://www.pc.uz/files/illustrations/bbcode/xbb027-light.zip
 

boombick

boombick.org
Я думаю, что на следующей неделе опубликую расширенный xBB с генератором JavaScript-кода и набора кнопок для удобного добавления к проектам :)
 

ZigFreeD

Новичок
Автор оригинала: tashkentchi
2. Улучшены автоматические ссылки. Теперь обрабатываются любые протоколы.

3. Добавлена настройка preg_autolinks, позволяющая, "на лету" изменять автоматические ссылки.
Приколько :) Супер!

Автор оригинала: boombick
Я думаю, что на следующей неделе опубликую расширенный xBB с генератором JavaScript-кода и набора кнопок для удобного добавления к проектам
Жду не дождусь :) Скорей бы уже :)

-~{}~ 29.03.07 22:41:

tashkentchi
Извини за тупой вопрос... Но у тебя в документации я не нашел как использовать preg_autolinks :( Или это полностью автоматическая функция?

-~{}~ 29.03.07 23:42:

Тут посмотрел смайлов...
и решил от себя добавить еще и вот такой наборчик... он конечно меньше чем тот который лежит в стандратном пакете, но его можно увеличить...

Пакет смайлов phpBB - 35 смайлов
В этом пакете лежит pak файл как и в основном пакете. Так что обрабатывать очень легко :)

Так же если кому надо, вот моя личная коллекция смайлов... очень долго отбирал по всему сайту www.kolobok.us
Моя коллекция - 138 смайлов
К сожалению в ней нету pak файла... так что вам придется придумать самим их обработку :)
 

tashkentchi

Новичок
ZigFreeD, спасибо за смайлы. Использовать preg_autolinks можно, например, так:

PHP:
$bb -> preg_autolinks['pattern'][2] = "'([\w]+[\w\-\.]+)@([\w\-\.]+\.[\w]+)'si";
$bb -> preg_autolinks['replacement'][2] = '$1(at)$2';
Таким способом можно скрыть емылы от спамботов. Использование preg_autolinks предполагает знание регулярок.

-~{}~ 30.03.07 04:51:

Hello D.Lans,

Thursday, March 29, 2007, 11:55:11 PM, you wrote:

DL> Добрый день.

DL> Я использую вашу библиотеку для работы с BB кодами.
DL> Мне она нравится, даже очень.
DL> Но, есть некоторые затруднения.

DL> Во-первых, я бы хотел иметь в наличии например три отдельных ссылки (тег [ url])
DL> с разными стилями, а получается сделать только одну со стилем a.bb.

DL> Во-вторых, ваша библиотека обрабатывает целую textarea, в
DL> которой я пишу текст и которая сохраняется в текстовый файл.
DL> Но вместе с BB кодами мне необходимо использовать HTML код, а также
DL> сценарии JavaScript. Но это невозможно, они все не транслируются.

DL> Подскажите, как можно решить эти проблемы.

1. Не знаю, какую версию вы используете. Вчера я выложил для
скачивания версию 0.27. Советую обновиться, так как в ней исправлены несколько багов.

2. Насчет тега [ url]. Вы можете добавить атрибут "class" и тогда
получите возможность использовать сколько угодно стилей. Но не советую
исправлять файл bbcode.lib.php, так как в этом случае при обновлении
версий ваш труд может пропасть. А добавить этот атрибут в стандартную
поставку библиотеки я не могу из соображений безопасности. Давать
произвольному пользователю (например, - посетителю гостевой) указывать
какие угодно классы было бы не правильно. Но в конкретных случаях (как
в вашем) это может быть уместно. Поэтому

а) скопируйте класс "bb_a" из файла bbcode.lib.php куда-нибудь, где он
будет "виден" скрипту;

б) назовите этот скопированный класс как нибудь по своему (например, "my_url");

в) внесите в него изменения, реализующие атрибут "class";

г) используйте этот новый класс вместо класса "bb_a" для обработки
тега [ url]. Вот так:

PHP:
$bb -> tags['url'] = 'my_url';
Перед началом работы прочтите раздел документации "Как создать тег" и
разберитесь в приведенных там примерах.

3. Насчет кода HTML и JavaScript. Они "не транслируются" из
соображений безопасности. Во избежание разрушения HTML-кода страницы и
JavaScript-инъекций. Поэтому, при использовании моих дальнейших
рекомендаций советую обратить пристальное внимание на то, чтобы этой
возможностью не могли воспользоваться кому не положено.

Предлагаю вам реализовать тег [ html], в котором будут разрешены
произвольный код HTML и JavaScript. Пример создания тега смотрите в
разделе документации "Как создать тег".

Создаваемому классу, реализующему тег [ html], напишите такие свойства:

PHP:
/* Никакие открывающие теги BBCode не должны приводить к автоматическому
   закрытию этого тега */
var $ends = array();
/* Перечисляем теги, которые должны быть автоматически закрыты при
   открытии этого тега */
var $stop = array(
    'a','abbr','acronym','anchor','b','color','email','font','google','h1',
    'h2','h3','i','img','s','size','strike','sub','sup','tt','u','url'
);
/* Никакие теги BBCode не могут быть вложены в данный тег */
var $children = array();
/* Перечисляем теги BBCode, непосредственно в которые разрешено вкладывать данный тег */
var $parent = array(
    '*','address','align','center','justify','left','quote','right','td','th'
);
/* Разрешить использовать тег в корне дерева элементов BBCode. */
var $top_level = true;
Метод get_html() вашего класса должен заменять в тексте html-мнемоники
на соответствующие им символы:

PHP:
function get_html() {
    /* Отключить автоматические ссылки */
    $this -> autolinks = false;
    /* Не обрабатывать смайлики */
    $this -> mnemonics = array();
    /* Заменяем мнемоники */
    $text = parent::get_html($this -> tree);
    $text = str_replace('&lt;', '<', $text);
    $text = str_replace('&gt;', '>', $text);
    $text = str_replace('&quot;', '"', $text);
    $text = str_replace('&amp;amp;', '&', $text);
    /* Возвращаем HTML-код */
    return $text;
}
Успехов!

--
Best regards,
Dima
 

D.Lans

Новичок
tashkentchi
еще раз, спасибо за помощь.
С первым вопросом я разобрался, на всякий случай выкладываю решение сюда.
В самый конец файла bbcode.lib.php добавляем:

PHP:
// Класс для тегов [a], [anchor] и [url] (+стили)
class url_style extends bbcode {
    var $ends = array(
        '*','align','center','h1','h2','h3','hr','justify','left','list','php',
        'quote','right','table','td','th','tr'
    );
    var $children = array(
        'abbr','acronym','b','bbcode','code','color','font','i','img','nobb',
        's','size','strike','sub','sup','tt','u'
    );
    function get_html() {
        $this -> autolinks = false;
        $text = '';
        foreach ($this -> tree as $val) {
            if ('text' == $val['type']) { $text .= $val['str']; }
        }
        $href = '';
        if (isset($this -> attrib['url'])) {
            $href = $this -> attrib['url'];
        }
        if (! $href && isset($this -> attrib['a'])) {
            $href = $this -> attrib['a'];
        }
        if (! $href && isset($this -> attrib['href'])) {
            $href = $this -> attrib['href'];
        }
        if (! $href && ! isset($this -> attrib['anchor'])) { $href = $text; }
        $protocols = array(
            'ftp://', 'file://', 'http://', 'https://', 'mailto:', 'svn://',
            '#',      '/',       '?',       './',       '../'
        );
        $is_http = false;
        foreach ($protocols as $val) {
            if ($val == substr($href, 0, strlen($val))) {
                $is_http = true;
                break;
            }
        }

        if ($href && ! $is_http) { $href = 'http://'.$href; }
            if (isset($this -> attrib['class']))
            {
                $target = $this -> attrib['class'];
                $attr = ' class='.$target;
            }
            else
            $attr = 'class="bb"';

        if ($href) {
        	$attr .= ' href="'.htmlspecialchars($href).'"';
        }
        if (isset($this -> attrib['title'])) {
            $title = $this -> attrib['title'];
            $attr .= ' title="'.htmlspecialchars($title).'"';
        }
        $id = '';
        if (isset($this -> attrib['id'])) {
            $id = $this -> attrib['id'];
        }
        if (! $id && isset($this -> attrib['name'])) {
            $id = $this -> attrib['name'];
        }
        if (! $id && isset($this -> attrib['anchor'])) {
            $id = $this -> attrib['anchor'];
            if (! $id) { $id = $text; }
        }
        if ($id) {
        	if ($id{0} < 'A' || $id{0} > 'z') { $id = 'bb'.$id; }
        	$attr .= ' id="'.htmlspecialchars($id).'"';
        }
        if (isset($this -> attrib['target'])) {
            $target = $this -> attrib['target'];
            $attr .= ' target="'.htmlspecialchars($target).'"';
        }

        return '<a '.$attr.'>'.parent::get_html($this -> tree).'</a>';
    }
}
И пример использования:
PHP:
$text = '
[url]Тут класс BB[/url]
[a]И тут класс BB[/a]

[url class=two]А тут класс two[/url]
[a class=two]И тут класс two[/a]

';

# BB-парсер
require_once 'bbcode/bbcode.lib.php';
$bb = new bbcode($text);
$bb -> tags['url'] = 'url_style';
$bb -> tags['a'] = 'url_style';
$text = $bb->get_html();

echo $text;
Однако подобную фичу лучше не давать в свободный доступ (в гостевой), лично я использую ее в админке.

-~{}~ 30.03.07 14:06:

Решил и вторую задачу:

В класс, в массив, добавить элемент
'html' => 'html_yes'

PHP:
var $tags = array(
        '*'       => 'bb_li',
        'a'       => 'bb_a',
        'abbr'    => 'bb_abbr',
        'acronym' => 'bb_acronym',
        'address' => 'bb_address',
        'align'   => 'bb_align',
        'anchor'  => 'bb_a',
        'b'       => 'bb_strong',
        'bbcode'  => 'bb_bbcode',
        'caption' => 'bb_caption',
        'center'  => 'bb_align',
        'code'    => 'bb_code',
        'color'   => 'bb_color',
        'email'   => 'bb_email',
        'font'    => 'bb_font',
        'google'  => 'bb_google',
        'h1'      => 'bb_h1',
        'h2'      => 'bb_h2',
        'h3'      => 'bb_h3',
        'html'    => 'html_yes',
        'hr'      => 'bb_hr',
        'i'       => 'bb_i',
        'img'     => 'bb_img',
        'justify' => 'bb_align',
        'left'    => 'bb_align',
        'list'    => 'bb_list',
        'nobb'    => 'bb_nobb',
        'php'     => 'bb_php',
        'quote'   => 'bb_quote',
        'right'   => 'bb_align',
        's'       => 'bb_del',
        'size'    => 'bb_size',
        'strike'  => 'bb_del',
        'sub'     => 'bb_sub',
        'sup'     => 'bb_sup',
        'table'   => 'bb_table',
        'td'      => 'bb_td',
        'th'      => 'bb_th',
        'tr'      => 'bb_tr',
        'tt'      => 'bb_tt',
        'u'       => 'bb_u',
        'url'     => 'bb_a'        
    );
===============

В конец библиотеки добавить класс:

PHP:
// Класс для тега [html], в котором BB теги не транслируются
// зато работает HTML и JavaScript
class html_yes extends bbcode {

    /* Никакие открывающие теги BBCode не должны приводить к автоматическому
    закрытию этого тега */
    var $ends = array();

    /* Никакие теги BBCode не могут быть вложены в данный тег */
    var $children = array();

    /* Перечисляем теги, которые должны быть автоматически закрыты при
       открытии этого тега */
    var $stop = array(
        'a','abbr','acronym','anchor','b','color','email','font','google','h1',
        'h2','h3','i','img','s','size','strike','sub','sup','tt','u','url'
    );

    /* Перечисляем теги BBCode, непосредственно в которые разрешено вкладывать данный тег */
    var $parent = array(
        '*','address','align','center','justify','left','quote','right','td','th'
    );

    /* Разрешить использовать тег в корне дерева элементов BBCode. */
    var $top_level = true;

   function get_html() {
    /* Отключить автоматические ссылки */
    $this -> autolinks = false;
    /* Не обрабатывать смайлики */
    $this -> mnemonics = array();
    /* Заменяем мнемоники */
    $text = parent::get_html($this -> tree);
    $text = str_replace('&lt;', '<', $text);
    $text = str_replace('&gt;', '>', $text);
    $text = str_replace('&quot;', '"', $text);
    $text = str_replace('&amp;', '&', $text);
    /* Возвращаем HTML-код */
    return $text;
   }
}
Ну и использование:
PHP:
$text = "
[html]
<script>alert('YES!');</script>
[/html]
";

# BB-парсер
require_once 'bbcode/bbcode.lib.php';
$bb = new bbcode($text);
# Тег HTML
$bb -> tags['html'] = 'html_yes';
$text = $bb->get_html();

echo $text;
 

boombick

boombick.org
Отличная вещь получается... Может имеет смысл на sf.net зарегистрироваться? :)
 

ZigFreeD

Новичок
tashkentchi
Слушай, а ты не хочешь включить в основной модуль функции предложенные D.Lans? Я имею ввиду те которые он написал на форуме выше..
просто это действительно может пригодиться... для админки... а чтобы небыло пробелмы с безопасностью сделать еще какой то параметр, типа admin=True; а если параметр не передан, то чтобы функции не работали... Просто такие функции на самом деле могут пригодиться... возможность добавлять любые свои class и писать в чистом html коде...
 

tashkentchi

Новичок
Автор оригинала: ZigFreeD
tashkentchi
Слушай, а ты не хочешь включить в основной модуль функции предложенные D.Lans? Я имею ввиду те которые он написал на форуме выше..
просто это действительно может пригодиться... для админки... а чтобы небыло пробелмы с безопасностью сделать еще какой то параметр, типа admin=True; а если параметр не передан, то чтобы функции не работали... Просто такие функции на самом деле могут пригодиться... возможность добавлять любые свои class и писать в чистом html коде...
Думаю, что такие специфические классы следует помещать в отдельный файл, подключаемый с помощью "require", если нужно. И включать соответствующие им теги на лету, в зависимости от прав текущего посетителя.

Не считаю правильным навязывать разработчикам свой вариант разграничения доступа. Это разграничение может быть реализовано довольно сложно, в различных проектах по разному, с различной степенью детализации. Поэтому, наша с вами попытка предложить разработчикам свое виденье этого разграничения может быть воспринято как излишний наворот, или даже как попытка заменить чью то продвинутую систему своей примитивной схемой.

Но это не означает, что xBB нельзя развивать в этом направлении. Можно! Но делать это следует более гибко. Имеет смысл написать класс, который будет работать с BBCode в соответствии с рекомендуемой (?) системой разграничения доступа. Объект класса bbcode должен стать одним из свойств этого нового класса для реализации функционала собственно обработки BBCode. Разработчикам будет предложено пользоваться этим новым классом а не напрямую классом bbcode.

Тогда будут "и волки сыты, и овцы целы". Приверженцы рекомендуемой системы разграничения доступа получат в свое распоряжение уже готовый функционал. Приверженцы особой системы разграничения доступа смогут работать с библиотекой bbcode без лишних наворотов.

Всевозможные идеи по развитию xBB меня посещают довольно часто. К сожалению, у меня нет физической возможности реализовать сколько нибудь значительную их часть. Поэтому вам следует реализовывать их самостоятельно. Разумеется, я согласен помочь вам советами.
 

ZigFreeD

Новичок
К сожалению, у меня нет физической возможности реализовать сколько нибудь значительную их часть. Поэтому вам следует реализовывать их самостоятельно. Разумеется, я согласен помочь вам советами.
+1
Молодца :) 5 баллов! Здорово выкрутился :)
Респект :)

А вообще можно будет подумать над твоим предложением... может попробую заняться, как разберусь с 3 проектами :( И если новые не появятся :)
 

tashkentchi

Новичок
Теги подсветок синтаксисов для xBB. Интеграция с GeSHi

Класс xbb_geshi реализовывает теги 76-и подсветок синтаксисов различных языков программирования, разметок, конфигурационных файлов и т.п. для библиотеки xBB версий 0.24-0.27. Подсветка реализована с помощью свободно распространяемой библиотеки GeSHi.

Подсветка осуществляется с помощью специальных тегов BBCode. Имя тега - название подсвечиваемого языка. Кроме того, подсветка может осуществляться с помощью тега [ code] в форме [ code=Название_языка]. Все теги поддерживают следующие необязательные атрибуты:

1. num - указывает на необходимость показа номеров строк. Если этому атрибуту присвоено целое неотрицательное значение, то нумерация строк начнется с этого значения.

2. tab - задает ширину табуляции (положительное целое число).

3. extra - перечисленные через запятую номера строк, которые неоходимо особо выделить. Этот атрибут ничего не делает, если опущен атрибут num.

4. title - строка. Переопределяет заголовок кода.

5. footer - строка. Подпись под кодом.

Скачать архив с xbb_geshi, вместе с документацией, тестом, библиотеками xBB и GeSHi, и с языковыми файлами можно здесь: http://prolib.ru/prog/web/bbcode/xbb027-geshi107.zip
 

ZigFreeD

Новичок
Я тут разместил описание твоего скрипта на сайте kpnemo.ru... вот тут! Только не знаю сможешь ли посмотреть.. т.к. это закрытый портал... так вот один из парней написал коммент следующего содержания...
При загрузке индексной страницы, не работает изначально под пхп5.
Код:
Fatal error: Declaration of bb_a::get_html() must be compatible with that of bbcode::get_html() in D:\server\web\www\htdocs\temporary\temp\bbcode\bbcode.lib.php on line 1129


Не совместимы определения функций с родительским классом. Правится просто заменой
function get_html()
на
function get_html($elems = false)
(если нет подводных камней в самих функция :))
Код:
Strict Standards: Assigning the return value of new by reference is deprecated in D:\server\web\www\htdocs\temporary\temp\bbcode\bbcode.lib.php on line 1033


В 5м php =& new не используется, хотя в 4м это было верно.
 

tashkentchi

Новичок
ZigFreeD, большое спасибо, исправлю в ближайшее время. Вместе с еще парой глюков, касающихся совместимости.

П.С. Зарегал домен http://www.xbb.uz
Выложил туда доки и файлы. Там можно в работе посмотреть и расширение для подсветок синтаксисов.
 
Сверху