Skip to content

Commit 78fe7e4

Browse files
committed
Add TypeScript language support with patterns and integration into Highlighter
1 parent d499fe3 commit 78fe7e4

6 files changed

Lines changed: 144 additions & 0 deletions

File tree

src/Highlighter.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
use Tempest\Highlight\Languages\Terraform\TerraformLanguage;
3232
use Tempest\Highlight\Languages\Text\TextLanguage;
3333
use Tempest\Highlight\Languages\Twig\TwigLanguage;
34+
use Tempest\Highlight\Languages\TypeScript\TypeScriptLanguage;
3435
use Tempest\Highlight\Languages\Xml\XmlLanguage;
3536
use Tempest\Highlight\Languages\Yaml\YamlLanguage;
3637
use Tempest\Highlight\Themes\CssTheme;
@@ -79,6 +80,7 @@ public function __construct(private readonly Theme $theme = new CssTheme())
7980
->addLanguage(new SqlLanguage())
8081
->addLanguage(new TerminalLanguage())
8182
->addLanguage(new TerraformLanguage())
83+
->addLanguage(new TypeScriptLanguage())
8284
->addLanguage(new XmlLanguage())
8385
->addLanguage(new YamlLanguage())
8486
->addLanguage(new DotEnvLanguage())
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\TypeScript\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\Tokens\TokenTypeEnum;
10+
11+
final class TsBuiltInTypePattern implements Pattern
12+
{
13+
use IsPattern;
14+
15+
public function getPattern(): string
16+
{
17+
return '/\b(?<!\.)(?<match>string|number|boolean|any|unknown|never|bigint|symbol|object|undefined)\b/';
18+
}
19+
20+
public function getTokenType(): TokenTypeEnum
21+
{
22+
return TokenTypeEnum::TYPE;
23+
}
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\TypeScript\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\Tokens\TokenTypeEnum;
10+
11+
final class TsDecoratorPattern implements Pattern
12+
{
13+
use IsPattern;
14+
15+
public function getPattern(): string
16+
{
17+
return '/(?<match>@[A-Za-z_][\w]*)/';
18+
}
19+
20+
public function getTokenType(): TokenTypeEnum
21+
{
22+
return TokenTypeEnum::ATTRIBUTE;
23+
}
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\TypeScript\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\Tokens\TokenTypeEnum;
10+
11+
final class TsGenericPattern implements Pattern
12+
{
13+
use IsPattern;
14+
15+
public function getPattern(): string
16+
{
17+
return '/(?<=\w)(?<match><[A-Z][\w\s,\.\[\]]*>)/';
18+
}
19+
20+
public function getTokenType(): TokenTypeEnum
21+
{
22+
return TokenTypeEnum::GENERIC;
23+
}
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\TypeScript\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\Tokens\TokenTypeEnum;
10+
11+
final class TsTypeAnnotationPattern implements Pattern
12+
{
13+
use IsPattern;
14+
15+
public function getPattern(): string
16+
{
17+
return '/(?<=[\w\)\]])\s*:\s*(?<match>[A-Z][\w]*(?:\.[A-Z][\w]*)*(?:\[\])?)/';
18+
}
19+
20+
public function getTokenType(): TokenTypeEnum
21+
{
22+
return TokenTypeEnum::TYPE;
23+
}
24+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\TypeScript;
6+
7+
use Override;
8+
use Tempest\Highlight\Languages\JavaScript\JavaScriptLanguage;
9+
use Tempest\Highlight\Languages\JavaScript\Patterns\CombinedJsKeywordPattern;
10+
use Tempest\Highlight\Languages\TypeScript\Patterns\TsBuiltInTypePattern;
11+
use Tempest\Highlight\Languages\TypeScript\Patterns\TsDecoratorPattern;
12+
use Tempest\Highlight\Languages\TypeScript\Patterns\TsGenericPattern;
13+
use Tempest\Highlight\Languages\TypeScript\Patterns\TsTypeAnnotationPattern;
14+
15+
class TypeScriptLanguage extends JavaScriptLanguage
16+
{
17+
private const array TS_KEYWORDS = [
18+
'type', 'declare', 'readonly', 'namespace', 'keyof', 'infer',
19+
'satisfies', 'abstract', 'is', 'module', 'override', 'asserts',
20+
];
21+
22+
#[Override]
23+
public function getName(): string
24+
{
25+
return 'ts';
26+
}
27+
28+
#[Override]
29+
public function getAliases(): array
30+
{
31+
return ['typescript'];
32+
}
33+
34+
#[Override]
35+
public function getPatterns(): array
36+
{
37+
return [
38+
...parent::getPatterns(),
39+
new CombinedJsKeywordPattern(self::TS_KEYWORDS),
40+
new TsBuiltInTypePattern(),
41+
new TsTypeAnnotationPattern(),
42+
new TsDecoratorPattern(),
43+
new TsGenericPattern(),
44+
];
45+
}
46+
}

0 commit comments

Comments
 (0)