diff --git a/app/BbCode/KnockoutDefinitionSet.php b/app/BbCode/KnockoutDefinitionSet.php new file mode 100644 index 0000000..efb6f44 --- /dev/null +++ b/app/BbCode/KnockoutDefinitionSet.php @@ -0,0 +1,68 @@ +{param}'); + $this->definitions[] = $builder->build(); + + /* [i] italics tag */ + $builder = new CodeDefinitionBuilder('i', '{param}'); + $this->definitions[] = $builder->build(); + + /* [u] underline tag */ + $builder = new CodeDefinitionBuilder('u', '{param}'); + $this->definitions[] = $builder->build(); + + $urlValidator = new \JBBCode\validators\UrlValidator(); + + /* [url] link tag */ + $builder = new CodeDefinitionBuilder('url', '{param}'); + $builder->setParseContent(false)->setBodyValidator($urlValidator); + $this->definitions[] = $builder->build(); + + /* [url=http://example.com] link tag */ + $builder = new CodeDefinitionBuilder('url', '{param}'); + $builder->setUseOption(true)->setParseContent(true)->setOptionValidator($urlValidator); + $this->definitions[] = $builder->build(); + + /* [img] image tag */ + $builder = new CodeDefinitionBuilder('img', ''); + $builder->setUseOption(false)->setParseContent(false)->setBodyValidator($urlValidator); + $this->definitions[] = $builder->build(); + + /* [img=alt text] image tag */ + $builder = new CodeDefinitionBuilder('img', '{option}'); + $builder->setUseOption(true)->setParseContent(false)->setBodyValidator($urlValidator); + $this->definitions[] = $builder->build(); + + /* [color] color tag */ + $builder = new CodeDefinitionBuilder('color', '{param}'); + $builder->setUseOption(true)->setOptionValidator(new \JBBCode\validators\CssColorValidator()); + $this->definitions[] = $builder->build(); + } + + /** + * Returns an array of the default code definitions. + * + * @return CodeDefinition[] + */ + public function getCodeDefinitions() + { + return $this->definitions; + } +} diff --git a/app/BbCode/Tag/Unknown.php b/app/BbCode/Tag/Unknown.php index adb7e19..2bcc0fc 100644 --- a/app/BbCode/Tag/Unknown.php +++ b/app/BbCode/Tag/Unknown.php @@ -13,7 +13,7 @@ class Unknown implements TagInterface $formattedString = "[{$tokenTag->getType()}"; if ($tokenTag->getArgument()) { - $formattedString .= "={$tokenTag->getArgument()}"; + $formattedString .= " {$tokenTag->getArgument()}"; } $formattedString .= "]{$tokenTag->getText()}[/{$tokenTag->getType()}]"; diff --git a/app/Helper/BBCode.php b/app/Helper/BBCode.php index 3ee041c..b2f1f5d 100644 --- a/app/Helper/BBCode.php +++ b/app/Helper/BBCode.php @@ -2,117 +2,24 @@ namespace App\Helper; -// formatting -use App\BbCode\Tag\Unknown; -use App\BbCode\Tag\Text; -use App\BbCode\Tag\Bold; -use App\BbCode\Tag\Italic; -use App\BbCode\Tag\Underline; -use App\BbCode\Tag\Strikethrough; -use App\BbCode\Tag\Spoiler; -use App\BbCode\Tag\HeadingOne; -use App\BbCode\Tag\HeadingTwo; -use App\BbCode\Tag\Link; -use App\BbCode\Tag\Code; -// quotes -use App\BbCode\Tag\Quote; -use App\BbCode\Tag\Blockquote; -// embeds -use App\BbCode\Tag\Image; -use App\BbCode\Tag\Twitter; -use App\BbCode\Tag\Youtube; -use App\BbCode\Tag\Video; +use App\BbCode\KnockoutDefinitionSet; -use Knockout\BbCode\BbCode as Parser; -use Knockout\BbCode\Tokenizer\Tokenizer; +use JBBCode\Parser; class BBCode { - private $tokens; + private $parser; public function __construct($content) { - $this->tokens = (new Tokenizer())->tokenize($content); + $this->parser = new Parser(); + $this->parser->addCodeDefinitionSet(new KnockoutDefinitionSet()); + $this->parser->parse($content); } public function render() { - $parser = new Parser(); - - $unknown = new Unknown(); - $parser->addTag($unknown); - - $text = new Text(); - $parser->addTag($text); - - $bold = new Bold(); - $parser->addTag($bold); - - $italic = new Italic(); - $parser->addTag($italic); - - $underline = new Underline(); - $parser->addTag($underline); - - $strikethrough = new Strikethrough(); - $parser->addTag($strikethrough); - - $image = new Image(); - $parser->addTag($image); - - $link = new Link(); - $parser->addTag($link); - - $code = new Code(); - $parser->addTag($code); - - $quote = new Quote(); - $parser->addTag($quote); - - $blockquote = new Blockquote(); - $parser->addTag($blockquote); - - $twitter = new Twitter(); - $parser->addTag($twitter); - - $youtube = new Youtube(); - $parser->addTag($youtube); - - $video = new Video(); - $parser->addTag($video); - - $tags = [ - $unknown, - $text, - $bold, - $italic, - $underline, - $strikethrough, - $image, - $link, - $code, - $quote, - $blockquote, - $twitter, - $youtube, - $video - ]; - - $anyChild = [ - $bold, - $quote, - $blockquote, - $text, - $unknown - ]; - - foreach ($anyChild as $parent) { - foreach ($tags as $tag) { - $parser->addAllowedChildTag($parent, $tag); - } - } - - return $parser->format($this->tokens); + return $this->parser->getAsHtml(); } } diff --git a/composer.json b/composer.json index 166ac9d..4dc3579 100644 --- a/composer.json +++ b/composer.json @@ -12,9 +12,9 @@ ], "require": { "php": ">=7.4", + "jbbcode/jbbcode": "^1.4", "laravel/lumen-framework": "^8.0", - "nesbot/carbon": "^2.43", - "knockout/bbcode": "dev-master" + "nesbot/carbon": "^2.43" }, "require-dev": { "barryvdh/laravel-debugbar": "^3.5", diff --git a/composer.lock b/composer.lock index 847e1d6..a0144ac 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a350fd1e86adcc528a94e674954ba0fa", + "content-hash": "65ffb6735fb8aab2c27031564c2b60dd", "packages": [ { "name": "brick/math", @@ -1862,31 +1862,56 @@ "time": "2020-11-02T14:01:41+00:00" }, { - "name": "knockout/bbcode", - "version": "dev-master", + "name": "jbbcode/jbbcode", + "version": "v1.4.2", "source": { "type": "git", - "url": "https://git.mos6581.com/Knockout/BBCode.git", - "reference": "636800e8507616e38df94c60706cdaad577d523d" + "url": "https://github.com/jbowens/jBBCode.git", + "reference": "d9a132e7886a11cf997e3ec025a41bdf97899704" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jbowens/jBBCode/zipball/d9a132e7886a11cf997e3ec025a41bdf97899704", + "reference": "d9a132e7886a11cf997e3ec025a41bdf97899704", + "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "5.6.*" + "friendsofphp/php-cs-fixer": "^2.1", + "phpunit/phpunit": "4.5.*", + "satooshi/php-coveralls": "0.6.*" }, - "default-branch": true, "type": "library", "autoload": { "psr-0": { - "Knockout": "src/" + "JBBCode": "." } }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "php parser for bb code", - "time": "2021-01-03T22:57:20+00:00" + "authors": [ + { + "name": "Jackson Owens", + "email": "jackson_owens@alumni.brown.edu", + "homepage": "http://jbowens.org/", + "role": "Developer" + } + ], + "description": "A lightweight but extensible BBCode parser written in PHP 5.3.", + "homepage": "http://jbbcode.com/", + "keywords": [ + "BB", + "bbcode" + ], + "support": { + "issues": "https://github.com/jbowens/jBBCode/issues", + "source": "https://github.com/jbowens/jBBCode/tree/v1.4.2" + }, + "time": "2020-06-19T16:09:00+00:00" }, { "name": "laravel/lumen-framework", @@ -7625,9 +7650,7 @@ ], "aliases": [], "minimum-stability": "dev", - "stability-flags": { - "knockout/bbcode": 20 - }, + "stability-flags": [], "prefer-stable": true, "prefer-lowest": false, "platform": {