Created
November 14, 2009 18:09
-
-
Save laszlokorte/234669 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
final class ClansphereBbcode | |
{ | |
private static $cache = array(); | |
public static function load() | |
{ | |
$base_groups = array('base'); | |
$light_groups = array('base','light'); | |
Bbcode::register(new BbcodePattern('bold', "/\[b\](.*?)\[\/b\]/si","<strong>$1</strong>"), $light_groups); | |
Bbcode::register(new BbcodePattern('italic', "/\[i\](.*?)\[\/i\]/si","<em>$1</em>"), $light_groups); | |
Bbcode::register(new BbcodePattern('underlined', "/\[u\](.*?)\[\/u\]/si","<span class=\"underlined\">$1</span>"), $light_groups); | |
Bbcode::register(new BbcodePattern('striked', "/\[s\](.*?)\[\/s\]/si","<del>$1</del>"), $light_groups); | |
Bbcode::register(new BbcodePattern('image', "/\[img\](.*?)\[\/img\](.{0})/si","<img src=\"$1\" alt=\"\" />"), $light_groups); | |
Bbcode::register(new BbcodePattern('urlimage', "/\[url\=(.*?)\]\[img width\=(.*?) height\=(.*?)\](.*?)\[\/img\]\[\/url\]/si","ClansphereBbcode::url_image()"), $light_groups); | |
Bbcode::register(new BbcodePattern('sizedimage', "/\[img width\=([\d]*?) height\=([\d]*?)\](.*?)\[\/img\]/si","ClansphereBbcode::image()"), $light_groups); | |
Bbcode::register(new BbcodePattern('mail', "/\[mail\](.+)\[\/mail]/si","ClansphereBbcode::mail()"), $light_groups); | |
Bbcode::register(new BbcodePattern('automail', "/([^\s]{3,})@([^\s]*?)\.([^\s]{2,7})(?![^<]+>|[^&]*;)/si","ClansphereBbcode::mail()"), $light_groups); | |
Bbcode::register(new BbcodePattern('color', "/\[color\=(#[0-9a-fA-F]{3}|#[0-9a-fA-F]{6}|red|green|blue|yellow|black|white|grey|purple)\](.+)\[\/color\]/si","<span style=\"color: $1\">$2</span>"), $base_groups); | |
Bbcode::register(new BbcodePattern('size', "/\[size\=([1-3]?\d)\](.+)\[\/size\]/si","<span style=\"font-size: $1px\">$2</span>"), $base_groups); | |
Bbcode::register(new BbcodePattern('align', "/\[(?P<align>left|center|right|justify)\](.+)\[\/(?P=align)]/si","<p style=\"text-align: $1;\">$2</p>"), $base_groups); | |
Bbcode::register(new BbcodePattern('typedlist', "/\[list\=([a-z_-]+?)\](.+?)\[\/list\]/si","ClansphereBbcode::unordered_list()"), $base_groups); | |
Bbcode::register(new BbcodePattern('list', "/\[list\](.+?)\[\/list\]/si","ClansphereBbcode::unordered_list()"), $base_groups); | |
Bbcode::register(new BbcodePattern('namedurl', "/\[url\=(.+)\](.+)\[\/url]/si","ClansphereBbcode::url()"), $light_groups); | |
Bbcode::register(new BbcodePattern('url', "/\[url\](.+)\[\/url]/si","ClansphereBbcode::url()"), $light_groups); | |
Bbcode::register(new BbcodePattern('autourl', "/(www\.|http:\/\/|ftp:\/\/)([^\s,]+)\.([^\s]+)(?![^<]+>|[^&]*;)/si", 'ClansphereBbcode::url_auto()'), $light_groups); | |
Bbcode::register(new BbcodePattern('flag', "/\[flag\=([A-Za-z]{2})\]/si","ClansphereBbcode::flag()"), $base_groups); | |
Bbcode::register(new BbcodePattern('indention', "/\[indent\=([\d]+)\](.+)\[\/indent\]/siU","<div style=\"padding-left: $1em\">$2</div>", 0, TRUE, TRUE), $base_groups); | |
Bbcode::register(new BbcodePattern('thread', "/\[threadid\=([\d]+)\](.+)\[\/threadid\]/si","ClansphereBbcode::thread_link()"), $base_groups); | |
Bbcode::register(new BbcodePattern('headline', "/\[h\=([1-7])\](.+)\[\/h\]/si","<h$1>$2</h$1>"), $base_groups); | |
Bbcode::register(new BbcodePattern('ruler', "/\[hr\]/","<hr>"), $base_groups); | |
Bbcode::register(new BbcodePattern('quote', "/\[quote\](.*)\[\/quote\]/siU","<div style=\"padding: 5px;\">$1</div>", 0, TRUE, TRUE), $base_groups); | |
Bbcode::register(new BbcodePattern('clip', "/\[clip=(.+)\](.*)\[\/clip\]/siU","<div class=\"bbcode_clip\"><h4 class=\"clip_title\">$1</h4><div class=\"clip_body\">$2</div></div>", 0, TRUE, TRUE), $base_groups); | |
Bbcode::register(new BbcodePattern('code', "/\[code=(.+)\](.*)\[\/code\]/si","ClansphereBbcode::extract_code()",-4), $base_groups); | |
Bbcode::register(new BbcodePattern('code', "/\[code\](.*)\[\/code\]/si","ClansphereBbcode::extract_code()", -4), $base_groups); | |
Bbcode::register(new BbcodePattern('code', "/\[code=(\d+)\/\]/si","ClansphereBbcode::insert_cached()",4), $base_groups); | |
Bbcode::register(new BbcodePattern('filter', "/\[filter\](.*)\[\/filter\]/si","ClansphereBbcode::extract_filter()", -5), $light_groups); | |
Bbcode::register(new BbcodePattern('filter', "/\[filter=(\d+)\/\]/si","ClansphereBbcode::insert_cached()",5), $light_groups); | |
Bbcode::register(new BbcodePattern('html', "/\[html\](.*)\[\/html\]/si","ClansphereBbcode::extract_html()", -4)); | |
Bbcode::register(new BbcodePattern('html', "/\[html=(\d+)\/\]/si","ClansphereBbcode::insert_cached()",4)); | |
Bbcode::register(new BbcodePattern('phpcode', "/\[phpcode\](.*)\[\/phpcode\]/si","ClansphereBbcode::extract_phpcode()", -4)); | |
Bbcode::register(new BbcodePattern('phpcode', "/\[phpcode=(\d+)\/\]/si","ClansphereBbcode::insert_cached()", 4)); | |
Bbcode::register(new BbcodePattern('linebreaks', "/[\n]/i", "<br/>\n", 3), $light_groups); | |
} | |
public static function thread_link($matches) | |
{ | |
return "<a href=\"?mod=board&action=thread&id={$matches[1]}\">{$matches[2]}</a>"; | |
} | |
//TODO: Rework: url(), url_auto(), url_image(), image(), mail() | |
public static function url($matches) { | |
$java = substr($matches[1],0,10); | |
if($java != 'javascript') { | |
if(empty($matches[2])) { | |
$matches[2] = $matches[1]; | |
} | |
$matches[1] = strpos($matches[1],'www.') === 0 ? 'http://' . $matches[1] : $matches[1]; | |
return cs_html_link($matches[1],$matches[2],1); | |
} else { | |
return cs_bbcode_i(array(0,'Javascript Links are not allowed')); | |
} | |
} | |
public static function url_auto($matches) { | |
if (strpos($matches[0],'</a>') !== FALSE || strpos($matches[0],'[/threadid]') !== FALSE) | |
return $matches[0]; | |
$after = ''; | |
if (substr($matches[0],-1) == ',') { $matches[0] = substr($matches[0],0,-1); $after = ','; } | |
$url = substr($matches[0],0,4) == 'www.' ? 'http://' . $matches[0] : $matches[0]; | |
return '<a href="' . $url . '">' . $matches[0] . '</a>' . $after; | |
} | |
public static function url_image($matches) { | |
} | |
public static function image($matches) { | |
if ($matches[0]{4} == ']') { | |
return '<img src="' . $matches[1] . '" alt="" />'; | |
} else { | |
return '<a href="' . $matches[3] . '"<img src="' . $matches[1] . '" style="width: ' . $matches[1] . 'px; height: ' . $matches[1] . 'px" alt="" /></a>'; | |
} | |
} | |
public static function mail($matches) { | |
$mail = $matches[1]; | |
if (strpos($matches[0],'</a>') !== FALSE) | |
return $matches[0]; | |
if ($matches[0]{0} != '[') | |
$mail = $matches[0]; | |
return '<a href="mailto:' . $mail . '">' . $mail . '</a>'; | |
} | |
public static function flag($matches) | |
{ | |
$short = $matches[1]; | |
$country = $short . ': not included'; | |
return '<img src="symbols/countries/' . $short . '.png" alt="' . $country . '" />'; | |
} | |
public static function unordered_list($matches) | |
{ | |
$list_types = array('none', 'circle', 'square', 'disc', 'decimal', 'lower-roman', 'upper-roman', 'decimal-leading-zero', 'lower-greek', 'lower-latin', 'upper-latin', 'armenian', 'georgian'); | |
$type = (isset($matches[2]) && in_array($matches[1], $list_types)) ? $matches[1] : 'disc'; | |
if(preg_match_all("/\[\*\]([\w\d\s]+)/si",end($matches),$items)>0) | |
{ | |
$items = end($items); | |
$list = '<ul style="list-style: ' . $type . ';">'; | |
foreach($items AS $item) | |
{ | |
$list .= '<li>' . $item . '</li>'; | |
} | |
$content; | |
$list .= '</ul>'; | |
return $list; | |
} | |
return $matches[0]; | |
} | |
public static function extract_code($matches) | |
{ | |
$lang = isset($matches[2]) ? $matches[1] : 'text'; | |
$code = isset($matches[2]) ? $matches[2] : $matches[1]; | |
$code = preg_replace("/<br(.*?)>/si",'',$code); | |
$line_count = substr_count ( $code, "\n" ) + 1; | |
$line_numbers = ''; | |
for($i=1;$i<=$line_count;$i++) | |
{ | |
$line_numbers .= ($i.'<br/>'); | |
} | |
$code = '<table class="code"><tr><td class="lines"><pre>' . $line_numbers . '</pre></td><td class=\"code\"><pre><code class="' . $lang . '">' . $code . '</code></pre></td></tr></table>'; | |
$index = self::set_cache($code); | |
return '[code=' . $index .'/]'; | |
} | |
public static function extract_html($matches) | |
{ | |
$html = Secure::rebuild_html($matches[1]); | |
$index = self::set_cache($html); | |
return '[html=' . $index .'/]'; | |
} | |
public static function extract_filter($matches) | |
{ | |
$index = self::set_cache($matches[1]); | |
return '[filter=' . $index .'/]'; | |
} | |
public static function extract_phpcode($matches) | |
{ | |
$code = html_entity_decode($matches[1], ENT_QUOTES, 'UTF-8'); | |
ob_start(); | |
eval($code); | |
$eval = ob_get_contents(); | |
ob_end_clean(); | |
$index = self::set_cache($eval); | |
return '[phpcode=' . $index .'/]'; | |
} | |
private static function set_cache($content) { | |
array_push(self::$cache, $content); | |
end(self::$cache); | |
return key(self::$cache); | |
} | |
private static function get_cache($index) { | |
if(isset(self::$cache[$index])) | |
{ | |
$result = self::$cache[$index]; | |
unset(self::$cache[$index]); | |
reset(self::$cache); | |
return $result; | |
} | |
return FALSE; | |
} | |
public static function insert_cached($matches) | |
{ | |
$cached = self::get_cache($matches[1]); | |
if($cached !== FALSE) | |
{ | |
return $cached; | |
} | |
return $matches[0]; | |
} | |
} | |
ClansphereBbcode::load(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment