*/
class BBcode
{
/**
* The container for JBBCode.
*
* @var Parser
*/
private static $bbcode = null;
/**
* Initialiser.
*/
public static function init()
{
// Create new parser class
self::$bbcode = new Parser();
// Add the standard definitions
self::loadStandardCodes();
}
/**
* Parse the emoticons.
*
* @param string $text String to parse emoticons from.
*
* @return string Parsed text.
*/
public static function parseEmoticons($text)
{
// Get emoticons from the database
$emotes = DB::table('emoticons')
->get();
// Parse all emoticons
foreach ($emotes as $emote) {
$image = "";
$icon = preg_quote($emote->emote_string, '#');
$text = preg_replace("#$icon#", $image, $text);
}
// Return the parsed text
return $text;
}
/**
* Adds the standard BBcode.
*/
public static function loadStandardCodes()
{
// Add the standard definitions
self::$bbcode->addCodeDefinitionSet(new DefaultCodeDefinitionSet());
$simpleCodes = [
['header', '
'], ]; foreach ($simpleCodes as $code) { $builder = new CodeDefinitionBuilder($code[0], $code[1]); if (strstr($code[1], '{option}')) { $builder->setUseOption(true); } self::$bbcode->addCodeDefinition($builder->build()); } // Add special definitions (PHP files MUST have the same name as the definition class foreach (glob(ROOT . 'libraries/BBcodeDefinitions/*.php') as $ext) { // Clean the file path $ext = str_replace(ROOT . 'libraries/', '', $ext); $ext = str_replace('.php', '', $ext); $ext = str_replace('/', '\\', $ext); // Build the classname $className = __NAMESPACE__ . '\\' . $ext; // Add the BBcode definition self::$bbcode->addCodeDefinition(new $className); } } /** * Set the text to parse. * * @param string $text The text that should be parsed. */ public static function text($text) { // Check if $bbcode is still null if (!self::$bbcode) { self::init(); } self::$bbcode->parse($text); } /** * Convert the parsed text to HTML. * * @param string $text The text that should be parsed. * * @return string The parsed HTML. */ public static function toHTML($text = null) { // Check if text isn't null if ($text !== null) { self::text($text); } $parsed = nl2br(self::$bbcode->getAsHtml()); $parsed = self::fixCodeTags($parsed); $parsed = self::parseEmoticons($parsed); return $parsed; } /** * Convert the parsed text to BBCode. * * @param string $text The text that should be parsed. * * @return string The converted bbcode. */ public static function toEditor($text = null) { // Check if text isn't null if ($text !== null) { self::text($text); } return self::$bbcode->getAsBBCode(); } /** * Convert the parsed text to plain. * * @param string $text The text that should be parsed. * * @return string The converted plaintext. */ public static function toPlain($text = null) { // Check if text isn't null if ($text !== null) { self::text($text); } return self::$bbcode->getAsText(); } /** * Clean up the contents ofQuote{param}
tags.
*
* @param string $text Dirty
*
* @return string Clean
*/
public static function fixCodeTags($text)
{
$parts = explode('', $text);
$newStr = '';
if (count($parts) > 1) {
foreach ($parts as $p) {
$parts2 = explode('
', $p);
if (count($parts2) > 1) {
$code = str_replace('
', '', $parts2[0]);
$code = str_replace('
', '', $code);
$code = str_replace('
', '', $code);
$code = str_replace('<', '<', $code);
$newStr .= '' . $code . '
';
$newStr .= $parts2[1];
} else {
$newStr .= $p;
}
}
} else {
$newStr = $text;
}
return $newStr;
}
}