*/ 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 = "{$emote->emote_string}"; $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', '

{param}

'], ['s', '{param}'], ['spoiler', '{param}'], ['box', '
' . 'Click to open
'], ['box', '
{option}
' . '
'], ['quote', '
Quote
{param}
'], ]; 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 of 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; } }