Skip to content

Commit 18cdf88

Browse files
committed
Add Dockerfile highlighting support
1 parent ea8bb97 commit 18cdf88

File tree

7 files changed

+196
-0
lines changed

7 files changed

+196
-0
lines changed

src/Highlighter.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Tempest\Highlight\Languages\Css\CssLanguage;
1212
use Tempest\Highlight\Languages\Diff\DiffLanguage;
1313
use Tempest\Highlight\Languages\DocComment\DocCommentLanguage;
14+
use Tempest\Highlight\Languages\Dockerfile\DockerfileLanguage;
1415
use Tempest\Highlight\Languages\Ellison\EllisonLanguage;
1516
use Tempest\Highlight\Languages\Gdscript\GdscriptLanguage;
1617
use Tempest\Highlight\Languages\Html\HtmlLanguage;
@@ -43,6 +44,7 @@ public function __construct(
4344
->addLanguage(new CssLanguage())
4445
->addLanguage(new DiffLanguage())
4546
->addLanguage(new DocCommentLanguage())
47+
->addLanguage(new DockerfileLanguage())
4648
->addLanguage(new EllisonLanguage())
4749
->addLanguage(new GdscriptLanguage())
4850
->addLanguage(new HtmlLanguage())
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Dockerfile;
6+
7+
use Tempest\Highlight\Languages\Base\BaseLanguage;
8+
use Tempest\Highlight\Languages\Dockerfile\Patterns\ImageAliasKeywordPattern;
9+
use Tempest\Highlight\Languages\Dockerfile\Patterns\ImageAliasNamePattern;
10+
use Tempest\Highlight\Languages\Dockerfile\Patterns\ImageNamePattern;
11+
use Tempest\Highlight\Languages\Dockerfile\Patterns\KeywordPattern;
12+
13+
class DockerfileLanguage extends BaseLanguage
14+
{
15+
public function getName(): string
16+
{
17+
return 'Dockerfile';
18+
}
19+
20+
public function getPatterns(): array
21+
{
22+
return [
23+
new KeywordPattern('ADD'),
24+
new KeywordPattern('ARG'),
25+
new KeywordPattern('CMD'),
26+
new KeywordPattern('COPY'),
27+
new KeywordPattern('ENTRYPOINT'),
28+
new KeywordPattern('ENV'),
29+
new KeywordPattern('EXPOSE'),
30+
new KeywordPattern('FROM'),
31+
new KeywordPattern('HEALTHCHECK'),
32+
new KeywordPattern('LABEL'),
33+
new KeywordPattern('MAINTAINER'),
34+
new KeywordPattern('ONBUILD'),
35+
new KeywordPattern('RUN'),
36+
new KeywordPattern('SHELL'),
37+
new KeywordPattern('STOPSIGNAL'),
38+
new KeywordPattern('USER'),
39+
new KeywordPattern('VOLUME'),
40+
new KeywordPattern('WORKDIR'),
41+
42+
new ImageNamePattern(),
43+
new ImageAliasKeywordPattern(),
44+
new ImageAliasNamePattern(),
45+
];
46+
}
47+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Dockerfile\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: 'FROM php', output: null)]
13+
#[PatternTest(input: 'FROM php:8.1', output: null)]
14+
#[PatternTest(input: 'FROM php:8.1 AS stage-one', output: 'AS')]
15+
final readonly class ImageAliasKeywordPattern implements Pattern
16+
{
17+
use IsPattern;
18+
19+
public function getPattern(): string
20+
{
21+
return "^FROM[\s][\S]+[\s](?<match>AS)[\s][\S]+";
22+
}
23+
24+
public function getTokenType(): TokenTypeEnum
25+
{
26+
return TokenTypeEnum::VALUE;
27+
}
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Dockerfile\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: 'FROM php', output: null)]
13+
#[PatternTest(input: 'FROM php:8.1', output: null)]
14+
#[PatternTest(input: 'FROM php:8.1 AS stage-one', output: 'stage-one')]
15+
final readonly class ImageAliasNamePattern implements Pattern
16+
{
17+
use IsPattern;
18+
19+
public function getPattern(): string
20+
{
21+
return "^FROM[\s][\S]+[\s]AS[\s](?<match>[\S]+)";
22+
}
23+
24+
public function getTokenType(): TokenTypeEnum
25+
{
26+
return TokenTypeEnum::VALUE;
27+
}
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Dockerfile\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: 'FROM php', output: 'php')]
13+
#[PatternTest(input: 'FROM php:8.1', output: 'php')]
14+
#[PatternTest(input: 'FROM php:8.1 AS stage-one', output: 'php')]
15+
final readonly class ImageNamePattern implements Pattern
16+
{
17+
use IsPattern;
18+
19+
public function getPattern(): string
20+
{
21+
return "^FROM (?<match>[\w]+)";
22+
}
23+
24+
public function getTokenType(): TokenTypeEnum
25+
{
26+
return TokenTypeEnum::VALUE;
27+
}
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Dockerfile\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\Tokens\TokenTypeEnum;
10+
11+
final readonly class KeywordPattern implements Pattern
12+
{
13+
use IsPattern;
14+
15+
public function __construct(private string $keyword)
16+
{
17+
}
18+
19+
public function getPattern(): string
20+
{
21+
return "^(?<match>{$this->keyword})[\s].*";
22+
}
23+
24+
public function getTokenType(): TokenTypeEnum
25+
{
26+
return TokenTypeEnum::KEYWORD;
27+
}
28+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Tests\Languages\Dockerfile\Patterns;
6+
7+
use PHPUnit\Framework\TestCase;
8+
use Tempest\Highlight\Languages\Dockerfile\Patterns\KeywordPattern;
9+
use Tempest\Highlight\Tests\TestsPatterns;
10+
11+
class KeywordPatternTest extends TestCase
12+
{
13+
use TestsPatterns;
14+
15+
public function test_pattern()
16+
{
17+
$this->assertMatches(
18+
pattern: new KeywordPattern('FROM'),
19+
content: 'FROM image:tag',
20+
expected: 'FROM',
21+
);
22+
23+
$this->assertMatches(
24+
pattern: new KeywordPattern('FROM'),
25+
content: 'FROM image:tag AS alias',
26+
expected: 'FROM',
27+
);
28+
29+
$this->assertMatches(
30+
pattern: new KeywordPattern('FROM'),
31+
content: 'RUN some command with FROM in it',
32+
expected: null,
33+
);
34+
}
35+
}

0 commit comments

Comments
 (0)