59 lines
1.6 KiB
PHP
59 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace App\Actions;
|
|
|
|
use s9e\TextFormatter\Configurator;
|
|
use s9e\TextFormatter\Parser;
|
|
use s9e\TextFormatter\Renderer;
|
|
|
|
class BbcodeFormatter
|
|
{
|
|
private static ?Parser $parser = null;
|
|
private static ?Renderer $renderer = null;
|
|
|
|
public static function format(?string $text): string
|
|
{
|
|
if ($text === null || $text === '') {
|
|
return '';
|
|
}
|
|
|
|
if (!self::$parser || !self::$renderer) {
|
|
[$parser, $renderer] = self::build();
|
|
self::$parser = $parser;
|
|
self::$renderer = $renderer;
|
|
}
|
|
|
|
$xml = self::$parser->parse($text);
|
|
|
|
return self::$renderer->render($xml);
|
|
}
|
|
|
|
private static function build(): array
|
|
{
|
|
$configurator = new Configurator();
|
|
$bbcodes = $configurator->plugins->load('BBCodes');
|
|
$bbcodes->addFromRepository('B');
|
|
$bbcodes->addFromRepository('I');
|
|
$bbcodes->addFromRepository('U');
|
|
$bbcodes->addFromRepository('S');
|
|
$bbcodes->addFromRepository('URL');
|
|
$bbcodes->addFromRepository('IMG');
|
|
$bbcodes->addFromRepository('QUOTE');
|
|
$bbcodes->addFromRepository('CODE');
|
|
$bbcodes->addFromRepository('LIST');
|
|
$bbcodes->addFromRepository('*');
|
|
|
|
$configurator->tags->add('BR')->template = '<br/>';
|
|
|
|
$bundle = $configurator->finalize();
|
|
$parser = $bundle['parser'] ?? null;
|
|
$renderer = $bundle['renderer'] ?? null;
|
|
|
|
if (!$parser || !$renderer) {
|
|
throw new \RuntimeException('Unable to initialize BBCode formatter.');
|
|
}
|
|
|
|
return [$parser, $renderer];
|
|
}
|
|
}
|