From b2a4134bb76ed2c7fd3753294f8de7b8027796d5 Mon Sep 17 00:00:00 2001 From: DorZuberi Date: Wed, 1 Apr 2026 21:06:19 +0300 Subject: [PATCH 1/3] Add BBCode language support with patterns and tests --- src/Highlighter.php | 2 ++ src/Languages/BBCode/BBCodeLanguage.php | 30 ++++++++++++++++++ .../Patterns/BBCodeAttributePattern.php | 30 ++++++++++++++++++ .../BBCode/Patterns/BBCodeCloseTagPattern.php | 29 +++++++++++++++++ .../BBCode/Patterns/BBCodeTagPattern.php | 31 +++++++++++++++++++ 5 files changed, 122 insertions(+) create mode 100644 src/Languages/BBCode/BBCodeLanguage.php create mode 100644 src/Languages/BBCode/Patterns/BBCodeAttributePattern.php create mode 100644 src/Languages/BBCode/Patterns/BBCodeCloseTagPattern.php create mode 100644 src/Languages/BBCode/Patterns/BBCodeTagPattern.php diff --git a/src/Highlighter.php b/src/Highlighter.php index e1c1744..01ab93a 100644 --- a/src/Highlighter.php +++ b/src/Highlighter.php @@ -7,6 +7,7 @@ use ReflectionClass; use Tempest\Highlight\Languages\Base\Injections\GutterInjection; use Tempest\Highlight\Languages\Bash\BashLanguage; +use Tempest\Highlight\Languages\BBCode\BBCodeLanguage; use Tempest\Highlight\Languages\Blade\BladeLanguage; use Tempest\Highlight\Languages\Css\CssLanguage; use Tempest\Highlight\Languages\Diff\DiffLanguage; @@ -54,6 +55,7 @@ final class Highlighter public function __construct(private readonly Theme $theme = new CssTheme()) { $this->addLanguage(new BashLanguage()) + ->addLanguage(new BBCodeLanguage()) ->addLanguage(new BladeLanguage()) ->addLanguage(new CssLanguage()) ->addLanguage(new DiffLanguage()) diff --git a/src/Languages/BBCode/BBCodeLanguage.php b/src/Languages/BBCode/BBCodeLanguage.php new file mode 100644 index 0000000..711da01 --- /dev/null +++ b/src/Languages/BBCode/BBCodeLanguage.php @@ -0,0 +1,30 @@ +[^\]]+)\]'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::ATTRIBUTE; + } +} diff --git a/src/Languages/BBCode/Patterns/BBCodeCloseTagPattern.php b/src/Languages/BBCode/Patterns/BBCodeCloseTagPattern.php new file mode 100644 index 0000000..398b9ba --- /dev/null +++ b/src/Languages/BBCode/Patterns/BBCodeCloseTagPattern.php @@ -0,0 +1,29 @@ +[a-zA-Z]+)\]'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::KEYWORD; + } +} diff --git a/src/Languages/BBCode/Patterns/BBCodeTagPattern.php b/src/Languages/BBCode/Patterns/BBCodeTagPattern.php new file mode 100644 index 0000000..2dfbdfb --- /dev/null +++ b/src/Languages/BBCode/Patterns/BBCodeTagPattern.php @@ -0,0 +1,31 @@ +[a-zA-Z\*]+)[\]=]'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::KEYWORD; + } +} From 88b72fb6d611f2624672d70e474c87d1b6961679 Mon Sep 17 00:00:00 2001 From: DorZuberi Date: Wed, 1 Apr 2026 21:06:27 +0300 Subject: [PATCH 2/3] Add BBCode language tests and benchmarks --- tests/Bench/Fixtures/bbcode.txt | 29 +++++++ tests/Bench/HighlighterBench.php | 1 + tests/Languages/BBCode/BBCodeLanguageTest.php | 78 +++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 tests/Bench/Fixtures/bbcode.txt create mode 100644 tests/Languages/BBCode/BBCodeLanguageTest.php diff --git a/tests/Bench/Fixtures/bbcode.txt b/tests/Bench/Fixtures/bbcode.txt new file mode 100644 index 0000000..b063974 --- /dev/null +++ b/tests/Bench/Fixtures/bbcode.txt @@ -0,0 +1,29 @@ +[b]Bold text[/b] +[i]Italic text[/i] +[u]Underlined text[/u] +[s]Strikethrough[/s] + +[url=http://example.com]Click here[/url] +[img]http://example.com/image.png[/img] + +[color=#ff0000]Red text[/color] +[size=18]Big text[/size] + +[quote=John] +This is a quoted message. +[/quote] + +[code] +echo "Hello World"; +[/code] + +[list] +[*]First item +[*]Second item +[*]Third item +[/list] + +[table] +[tr][th]Header[/th][th]Header 2[/th][/tr] +[tr][td]Cell 1[/td][td]Cell 2[/td][/tr] +[/table] \ No newline at end of file diff --git a/tests/Bench/HighlighterBench.php b/tests/Bench/HighlighterBench.php index 2cbc9fe..63aaeef 100644 --- a/tests/Bench/HighlighterBench.php +++ b/tests/Bench/HighlighterBench.php @@ -18,6 +18,7 @@ final class HighlighterBench public const array LANGUAGES = [ 'bash' => 'bash.txt', + 'bbcode' => 'bbcode.txt', 'blade' => 'blade.txt', 'css' => 'css.txt', 'diff' => 'diff.txt', diff --git a/tests/Languages/BBCode/BBCodeLanguageTest.php b/tests/Languages/BBCode/BBCodeLanguageTest.php new file mode 100644 index 0000000..24da622 --- /dev/null +++ b/tests/Languages/BBCode/BBCodeLanguageTest.php @@ -0,0 +1,78 @@ +assertSame( + $expected, + $highlighter->parse($content, 'bbcode'), + ); + } + + public static function provide_highlight_cases(): iterable + { + return [ + [<<<'TXT' +[b]Hello World[/b] +[i]italic text[/i] +[u]underlined[/u] +[s]strikethrough[/s] +TXT, + <<<'TXT' +[b]Hello World[/b] +[i]italic text[/i] +[u]underlined[/u] +[s]strikethrough[/s] +TXT], + + [<<<'TXT' +[url=http://example.com]Click here[/url] +[color=#ff0000]Red text[/color] +[size=18]Big text[/size] +[quote=John]Hello there[/quote] +TXT, + <<<'TXT' +[url=http://example.com]Click here[/url] +[color=#ff0000]Red text[/color] +[size=18]Big text[/size] +[quote=John]Hello there[/quote] +TXT], + + [<<<'TXT' +[list] +[*]First item +[*]Second item +[*]Third item +[/list] +TXT, + <<<'TXT' +[list] +[*]First item +[*]Second item +[*]Third item +[/list] +TXT], + + [<<<'TXT' +[img]http://example.com/image.png[/img] +[code]echo "hello";[/code] +TXT, + <<<'TXT' +[img]http://example.com/image.png[/img] +[code]echo "hello";[/code] +TXT], + ]; + } +} \ No newline at end of file From 8bc33a121f95ac1f373501a8bcc920f2f6ab9feb Mon Sep 17 00:00:00 2001 From: DorZuberi Date: Wed, 1 Apr 2026 21:09:13 +0300 Subject: [PATCH 3/3] Fix missing newline at end of BBCodeLanguageTest file --- tests/Languages/BBCode/BBCodeLanguageTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Languages/BBCode/BBCodeLanguageTest.php b/tests/Languages/BBCode/BBCodeLanguageTest.php index 24da622..49d0db6 100644 --- a/tests/Languages/BBCode/BBCodeLanguageTest.php +++ b/tests/Languages/BBCode/BBCodeLanguageTest.php @@ -75,4 +75,4 @@ public static function provide_highlight_cases(): iterable TXT], ]; } -} \ No newline at end of file +}