Skip to content

Commit ebbb802

Browse files
authored
Merge pull request #200 from DorZuberi/add-bbocde-language
2 parents 3242c2f + 8bc33a1 commit ebbb802

8 files changed

Lines changed: 230 additions & 0 deletions

File tree

src/Highlighter.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use ReflectionClass;
88
use Tempest\Highlight\Languages\Base\Injections\GutterInjection;
99
use Tempest\Highlight\Languages\Bash\BashLanguage;
10+
use Tempest\Highlight\Languages\BBCode\BBCodeLanguage;
1011
use Tempest\Highlight\Languages\Blade\BladeLanguage;
1112
use Tempest\Highlight\Languages\Css\CssLanguage;
1213
use Tempest\Highlight\Languages\Diff\DiffLanguage;
@@ -55,6 +56,7 @@ final class Highlighter
5556
public function __construct(private readonly Theme $theme = new CssTheme())
5657
{
5758
$this->addLanguage(new BashLanguage())
59+
->addLanguage(new BBCodeLanguage())
5860
->addLanguage(new BladeLanguage())
5961
->addLanguage(new CssLanguage())
6062
->addLanguage(new DiffLanguage())
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\BBCode;
6+
7+
use Override;
8+
use Tempest\Highlight\Languages\Base\BaseLanguage;
9+
use Tempest\Highlight\Languages\BBCode\Patterns\BBCodeAttributePattern;
10+
use Tempest\Highlight\Languages\BBCode\Patterns\BBCodeCloseTagPattern;
11+
use Tempest\Highlight\Languages\BBCode\Patterns\BBCodeTagPattern;
12+
13+
class BBCodeLanguage extends BaseLanguage
14+
{
15+
public function getName(): string
16+
{
17+
return 'bbcode';
18+
}
19+
20+
#[Override]
21+
public function getPatterns(): array
22+
{
23+
return [
24+
...parent::getPatterns(),
25+
new BBCodeAttributePattern(),
26+
new BBCodeTagPattern(),
27+
new BBCodeCloseTagPattern(),
28+
];
29+
}
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\BBCode\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: '[url=http://example.com]link[/url]', output: 'http://example.com')]
13+
#[PatternTest(input: '[color=#ff0000]red[/color]', output: '#ff0000')]
14+
#[PatternTest(input: '[size=14]text[/size]', output: '14')]
15+
#[PatternTest(input: '[quote=John]hello[/quote]', output: 'John')]
16+
#[PatternTest(input: '[b]no attribute[/b]', output: null)]
17+
final readonly class BBCodeAttributePattern implements Pattern
18+
{
19+
use IsPattern;
20+
21+
public function getPattern(): string
22+
{
23+
return '\[\w+=(?<match>[^\]]+)\]';
24+
}
25+
26+
public function getTokenType(): TokenTypeEnum
27+
{
28+
return TokenTypeEnum::ATTRIBUTE;
29+
}
30+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\BBCode\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: '[/b]', output: 'b')]
13+
#[PatternTest(input: '[/url]', output: 'url')]
14+
#[PatternTest(input: '[/code]', output: 'code')]
15+
#[PatternTest(input: '[/quote]', output: 'quote')]
16+
final readonly class BBCodeCloseTagPattern implements Pattern
17+
{
18+
use IsPattern;
19+
20+
public function getPattern(): string
21+
{
22+
return '\[\/(?<match>[a-zA-Z]+)\]';
23+
}
24+
25+
public function getTokenType(): TokenTypeEnum
26+
{
27+
return TokenTypeEnum::KEYWORD;
28+
}
29+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\BBCode\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: '[b]bold text[/b]', output: 'b')]
13+
#[PatternTest(input: '[url=http://example.com]link[/url]', output: 'url')]
14+
#[PatternTest(input: '[img]image.png[/img]', output: 'img')]
15+
#[PatternTest(input: '[*]list item', output: '*')]
16+
#[PatternTest(input: '[color=#ff0000]red[/color]', output: 'color')]
17+
#[PatternTest(input: '[list]', output: 'list')]
18+
final readonly class BBCodeTagPattern implements Pattern
19+
{
20+
use IsPattern;
21+
22+
public function getPattern(): string
23+
{
24+
return '\[(?<match>[a-zA-Z\*]+)[\]=]';
25+
}
26+
27+
public function getTokenType(): TokenTypeEnum
28+
{
29+
return TokenTypeEnum::KEYWORD;
30+
}
31+
}

tests/Bench/Fixtures/bbcode.txt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
[b]Bold text[/b]
2+
[i]Italic text[/i]
3+
[u]Underlined text[/u]
4+
[s]Strikethrough[/s]
5+
6+
[url=http://example.com]Click here[/url]
7+
[img]http://example.com/image.png[/img]
8+
9+
[color=#ff0000]Red text[/color]
10+
[size=18]Big text[/size]
11+
12+
[quote=John]
13+
This is a quoted message.
14+
[/quote]
15+
16+
[code]
17+
echo "Hello World";
18+
[/code]
19+
20+
[list]
21+
[*]First item
22+
[*]Second item
23+
[*]Third item
24+
[/list]
25+
26+
[table]
27+
[tr][th]Header[/th][th]Header 2[/th][/tr]
28+
[tr][td]Cell 1[/td][td]Cell 2[/td][/tr]
29+
[/table]

tests/Bench/HighlighterBench.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ final class HighlighterBench
1818

1919
public const array LANGUAGES = [
2020
'bash' => 'bash.txt',
21+
'bbcode' => 'bbcode.txt',
2122
'blade' => 'blade.txt',
2223
'css' => 'css.txt',
2324
'diff' => 'diff.txt',
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Tests\Languages\BBCode;
6+
7+
use PHPUnit\Framework\Attributes\DataProvider;
8+
use PHPUnit\Framework\TestCase;
9+
use Tempest\Highlight\Highlighter;
10+
11+
class BBCodeLanguageTest extends TestCase
12+
{
13+
#[DataProvider('provide_highlight_cases')]
14+
public function test_highlight(string $content, string $expected): void
15+
{
16+
$highlighter = new Highlighter();
17+
18+
$this->assertSame(
19+
$expected,
20+
$highlighter->parse($content, 'bbcode'),
21+
);
22+
}
23+
24+
public static function provide_highlight_cases(): iterable
25+
{
26+
return [
27+
[<<<'TXT'
28+
[b]Hello World[/b]
29+
[i]italic text[/i]
30+
[u]underlined[/u]
31+
[s]strikethrough[/s]
32+
TXT,
33+
<<<'TXT'
34+
[<span class="hl-keyword">b</span>]Hello World[/<span class="hl-keyword">b</span>]
35+
[<span class="hl-keyword">i</span>]italic text[/<span class="hl-keyword">i</span>]
36+
[<span class="hl-keyword">u</span>]underlined[/<span class="hl-keyword">u</span>]
37+
[<span class="hl-keyword">s</span>]strikethrough[/<span class="hl-keyword">s</span>]
38+
TXT],
39+
40+
[<<<'TXT'
41+
[url=http://example.com]Click here[/url]
42+
[color=#ff0000]Red text[/color]
43+
[size=18]Big text[/size]
44+
[quote=John]Hello there[/quote]
45+
TXT,
46+
<<<'TXT'
47+
[<span class="hl-keyword">url</span>=<span class="hl-attribute">http://example.com</span>]Click here[/<span class="hl-keyword">url</span>]
48+
[<span class="hl-keyword">color</span>=<span class="hl-attribute">#ff0000</span>]Red text[/<span class="hl-keyword">color</span>]
49+
[<span class="hl-keyword">size</span>=<span class="hl-attribute">18</span>]Big text[/<span class="hl-keyword">size</span>]
50+
[<span class="hl-keyword">quote</span>=<span class="hl-attribute">John</span>]Hello there[/<span class="hl-keyword">quote</span>]
51+
TXT],
52+
53+
[<<<'TXT'
54+
[list]
55+
[*]First item
56+
[*]Second item
57+
[*]Third item
58+
[/list]
59+
TXT,
60+
<<<'TXT'
61+
[<span class="hl-keyword">list</span>]
62+
[<span class="hl-keyword">*</span>]First item
63+
[<span class="hl-keyword">*</span>]Second item
64+
[<span class="hl-keyword">*</span>]Third item
65+
[/<span class="hl-keyword">list</span>]
66+
TXT],
67+
68+
[<<<'TXT'
69+
[img]http://example.com/image.png[/img]
70+
[code]echo "hello";[/code]
71+
TXT,
72+
<<<'TXT'
73+
[<span class="hl-keyword">img</span>]http://example.com/image.png[/<span class="hl-keyword">img</span>]
74+
[<span class="hl-keyword">code</span>]echo &quot;hello&quot;;[/<span class="hl-keyword">code</span>]
75+
TXT],
76+
];
77+
}
78+
}

0 commit comments

Comments
 (0)