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;
+ }
+}
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..49d0db6
--- /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],
+ ];
+ }
+}