<?php
abstract class bbcode{
static function output($str)
{
return preg_replace_callback('#
\[([a-z_0-9]+)
(=((?:&quot;|")?)
([^\]\3]+)
\3
)?
\]
(?:
(.+?)
(\[/\1\])
)?
#xuis', array('bbcode','back'), $str);
}
private static function back($in)
{
/*
1 - тэг
4 - параметр
5 - содержание
*/
switch ($in[1]) {
case 'nobb':return (isset($in[5])?$in[5]:$in[0]);
case 'i':if (isset($in[5]))return '<span style="font-style:italic">'.self::output($in[5]).'</span>';
case 'b':if (isset($in[5]))return '<span style="font-weight:bold">'.self::output($in[5]).'</span>';
case 'u':if (isset($in[5]))return '<span style="text-decoration:underline">'.self::output($in[5]).'</span>';
case 'no':if (isset($in[5]))return '<span style="text-decoration:line-through">'.self::output($in[5]).'</span>';
case 'mark':if (isset($in[5]))return '<span class="mark">'.self::output($in[5]).'</span>';
case 'url':if (isset($in[5]) && isset($in[4]))return self::url($in);
case 'smile':if (isset($in[4]))return self::smiles($in);
case 'color':if (isset($in[5]) && isset($in[4]))return self::color($in);
case 'php':if (isset($in[5]))return self::code_php($in);
case 'small':if (isset($in[5]))return '<span style="font-size:xx-small">'.self::output($in[5]).'</span>';
case 'big':if (isset($in[5]))return '<span style="font-size:xx-large">'.self::output($in[5]).'</span>';
}
if (isset($in[5]) && preg_match('#quote(_([0-9]+))?#ui',$in[1]))
return self::quote($in);
return !empty($in[5])?self::output($in[5]):$in[0];
}
// цитата
private function quote($arr)
{
if (!empty($arr[4]) && preg_match('#^([0-9]+):([0-9]+):(.+)$#ui', $arr[4], $log) )
$title="<span class='quote'><a href='/profile.view.php?id=$log[2]'>".text::for_value($log[3])."</a> (".vremja($log[1]).")</span>:";
else
$title='';
return '<div class="quote">'.$title.self::output($arr[5]).'</div>';
}
// подсветка php кода
private function code_php($arr)
{
$arr[5] = "<?php\n".trim(preg_replace('#^\<\?(php)?|\?\>$#i', '', html_entity_decode($arr[5], ENT_QUOTES, 'UTF-8')))."\n?>";
return highlight_string($arr[5],true);
//return $arr[5];
}

// смайлы
private function smiles($arr)
{
return smiles::bbcode($arr);
//return $arr[0];
}
// ссылка
private function url($arr)
{
if (empty($arr[4]) || empty($arr[5]))return $arr[0];
global $dcms;
if (preg_match('#^http://'.preg_quote($_SERVER['HTTP_HOST']).'(/|$)#ui',$arr[4]) || !preg_match('#://#',$arr[4]))
return '<a href="'.preg_replace('#^http://'.preg_quote($_SERVER['HTTP_HOST']).'(/|$)#ui','/',$arr[4]).'">'.self::output($arr[5]).'</a>';
else
return '<a'.($dcms->browser_type=='web'?' target="_blank"':null).' href="http://'.$_SERVER['HTTP_HOST'].'/link.ext.php?url='.urlencode(html_entity_decode($arr[4])).'">'.self::output($arr[5]).'</a>';
}
// цвет текста
private function color($arr)
{
if (preg_match('/^#[0-9a-f]{6}$/ui', $arr[4]))
return '<span style="color:'.$arr[4].'">'.$arr[5].'</span>';
return $arr[0];
}
}


?>