This repository has been archived on 2024-06-26. You can view files and clone it, but cannot push or open issues or pull requests.
sakura/app/BBCode/Parser.php

99 lines
2.2 KiB
PHP

<?php
/**
* Holds the BBcode handler.
* @package Sakura
*/
namespace Sakura\BBCode;
use Sakura\DB;
use Sakura\User;
/**
* BBcode handler.
* @package Sakura
* @author Julian van de Groep <me@flash.moe>
*/
class Parser
{
/**
* Holds the bbcode parsers.
* @var array
*/
public static $parsers = [
// Advanced parsing
Tags\Code::class,
Tags\Box::class,
Tags\ListTag::class,
Tags\UserTag::class,
Tags\Markdown::class,
// Quotes
Tags\NamedQuote::class,
Tags\Quote::class,
// More advanced
Tags\Colour::class,
Tags\Align::class,
Tags\Size::class,
Tags\YouTube::class,
// Basic markup
Tags\Bold::class,
Tags\Italics::class,
Tags\Underline::class,
Tags\Strike::class,
Tags\Header::class,
Tags\Image::class,
Tags\Spoiler::class,
// Links
Tags\NamedLink::class,
Tags\Link::class,
// Newline must always be last
Tags\Newline::class,
];
/**
* Parse the emoticons.
* @param string $text
* @param User $poster
* @return string
*/
public static function parseEmoticons(string $text, User $poster = null): string
{
$emotes = DB::table('emoticons')
->get();
foreach ($emotes as $emote) {
if ($poster === null) {
// eventually check for hierarchies here
continue;
}
$image = "<img src='{$emote->emote_path}' alt='{$emote->emote_string}' class='emoticon'>";
$icon = preg_quote($emote->emote_string, '#');
$text = preg_replace("#{$icon}#", $image, $text);
}
return $text;
}
/**
* Convert the parsed text to HTML.
* @param string $text
* @param User $poster
* @return string
*/
public static function toHTML(string $text, User $poster): string
{
$text = self::parseEmoticons($text);
foreach (self::$parsers as $parser) {
$text = call_user_func_array([$parser, 'parse'], [$text, $poster]);
}
return $text;
}
}