From 3a2195568f77c9194015558d44828cc6035568df Mon Sep 17 00:00:00 2001 From: Adrien Furnari Date: Thu, 12 Feb 2026 16:30:20 +0100 Subject: [PATCH 1/3] feat(dockerfile): highlight values, comments and full code coverage for the language --- .../Dockerfile/DockerfileLanguage.php | 6 ++++ .../Dockerfile/Patterns/CommentPattern.php | 27 +++++++++++++++ .../Patterns/DoubleQuoteValuePattern.php | 26 ++++++++++++++ .../Patterns/SingleQuoteValuePattern.php | 25 ++++++++++++++ .../Dockerfile/DockerfileLanguageTest.php | 34 +++++++++++++++++++ tests/targets/dockerfile.md | 18 ++++++++++ 6 files changed, 136 insertions(+) create mode 100644 src/Languages/Dockerfile/Patterns/CommentPattern.php create mode 100644 src/Languages/Dockerfile/Patterns/DoubleQuoteValuePattern.php create mode 100644 src/Languages/Dockerfile/Patterns/SingleQuoteValuePattern.php create mode 100644 tests/Languages/Dockerfile/DockerfileLanguageTest.php create mode 100644 tests/targets/dockerfile.md diff --git a/src/Languages/Dockerfile/DockerfileLanguage.php b/src/Languages/Dockerfile/DockerfileLanguage.php index a81ae4d..2ecb249 100644 --- a/src/Languages/Dockerfile/DockerfileLanguage.php +++ b/src/Languages/Dockerfile/DockerfileLanguage.php @@ -6,11 +6,14 @@ use Override; use Tempest\Highlight\Languages\Base\BaseLanguage; +use Tempest\Highlight\Languages\Dockerfile\Patterns\CommentPattern; +use Tempest\Highlight\Languages\Dockerfile\Patterns\DoubleQuoteValuePattern; use Tempest\Highlight\Languages\Dockerfile\Patterns\ImageAliasKeywordPattern; use Tempest\Highlight\Languages\Dockerfile\Patterns\ImageAliasNamePattern; use Tempest\Highlight\Languages\Dockerfile\Patterns\ImageNamePattern; use Tempest\Highlight\Languages\Dockerfile\Patterns\ImageTagPattern; use Tempest\Highlight\Languages\Dockerfile\Patterns\KeywordPattern; +use Tempest\Highlight\Languages\Dockerfile\Patterns\SingleQuoteValuePattern; class DockerfileLanguage extends BaseLanguage { @@ -54,6 +57,9 @@ public function getPatterns(): array new ImageAliasKeywordPattern(), new ImageAliasNamePattern(), new ImageTagPattern(), + new SingleQuoteValuePattern(), + new DoubleQuoteValuePattern(), + new CommentPattern(), ]; } } diff --git a/src/Languages/Dockerfile/Patterns/CommentPattern.php b/src/Languages/Dockerfile/Patterns/CommentPattern.php new file mode 100644 index 0000000..1822c43 --- /dev/null +++ b/src/Languages/Dockerfile/Patterns/CommentPattern.php @@ -0,0 +1,27 @@ +\#.*)/'; + } + + public function getTokenType(): TokenType + { + return TokenTypeEnum::COMMENT; + } +} diff --git a/src/Languages/Dockerfile/Patterns/DoubleQuoteValuePattern.php b/src/Languages/Dockerfile/Patterns/DoubleQuoteValuePattern.php new file mode 100644 index 0000000..ebeec04 --- /dev/null +++ b/src/Languages/Dockerfile/Patterns/DoubleQuoteValuePattern.php @@ -0,0 +1,26 @@ +"(\\\"|.)*?")'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::VALUE; + } + +} \ No newline at end of file diff --git a/src/Languages/Dockerfile/Patterns/SingleQuoteValuePattern.php b/src/Languages/Dockerfile/Patterns/SingleQuoteValuePattern.php new file mode 100644 index 0000000..d76c445 --- /dev/null +++ b/src/Languages/Dockerfile/Patterns/SingleQuoteValuePattern.php @@ -0,0 +1,25 @@ +'(\\\'|.)*?')"; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::VALUE; + } + +} \ No newline at end of file diff --git a/tests/Languages/Dockerfile/DockerfileLanguageTest.php b/tests/Languages/Dockerfile/DockerfileLanguageTest.php new file mode 100644 index 0000000..830359b --- /dev/null +++ b/tests/Languages/Dockerfile/DockerfileLanguageTest.php @@ -0,0 +1,34 @@ +assertSame( + $expected, + $highlighter->parse($content, 'dockerfile'), + ); + } + + public static function provide_highlight_cases(): iterable + { + return [ + ['FROM python:3.13', 'FROM python:3.13'], + ['FROM php AS stage-one', 'FROM php AS stage-one'], + ['WORKDIR /usr/local/app', 'WORKDIR /usr/local/app'], + ['CMD ["node", "./src/index.js"]', 'CMD ["node", "./src/index.js"]'], + ['# This is a comment', '# This is a comment'], + ]; + } +} diff --git a/tests/targets/dockerfile.md b/tests/targets/dockerfile.md new file mode 100644 index 0000000..7ee5abc --- /dev/null +++ b/tests/targets/dockerfile.md @@ -0,0 +1,18 @@ +```dockerfile +FROM python:3.13 +WORKDIR /usr/local/app + +# Install the application dependencies +COPY requirements.txt ./ +RUN pip install --no-cache-dir -r requirements.txt + +# Copy in the source code +COPY src ./src +EXPOSE 8080 + +# Setup an app user so the container doesn't run as the root user +RUN useradd app +USER app + +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"] +``` \ No newline at end of file From 96d69f5569e42cc028db824b4097cce058bd1fc4 Mon Sep 17 00:00:00 2001 From: Adrien Furnari Date: Thu, 12 Feb 2026 16:31:02 +0100 Subject: [PATCH 2/3] fix: ran qa --- .../Dockerfile/Patterns/DoubleQuoteValuePattern.php | 5 +++-- .../Dockerfile/Patterns/SingleQuoteValuePattern.php | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Languages/Dockerfile/Patterns/DoubleQuoteValuePattern.php b/src/Languages/Dockerfile/Patterns/DoubleQuoteValuePattern.php index ebeec04..8dbebe0 100644 --- a/src/Languages/Dockerfile/Patterns/DoubleQuoteValuePattern.php +++ b/src/Languages/Dockerfile/Patterns/DoubleQuoteValuePattern.php @@ -1,5 +1,7 @@ Date: Thu, 12 Feb 2026 17:00:58 +0100 Subject: [PATCH 3/3] fix(dockerfile): added missing test for 100% coverage --- tests/Languages/Dockerfile/DockerfileLanguageTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Languages/Dockerfile/DockerfileLanguageTest.php b/tests/Languages/Dockerfile/DockerfileLanguageTest.php index 830359b..409672a 100644 --- a/tests/Languages/Dockerfile/DockerfileLanguageTest.php +++ b/tests/Languages/Dockerfile/DockerfileLanguageTest.php @@ -28,6 +28,7 @@ public static function provide_highlight_cases(): iterable ['FROM php AS stage-one', 'FROM php AS stage-one'], ['WORKDIR /usr/local/app', 'WORKDIR /usr/local/app'], ['CMD ["node", "./src/index.js"]', 'CMD ["node", "./src/index.js"]'], + ["CMD ['php', 'index.php']", 'CMD [\'php\', \'index.php\']'], ['# This is a comment', '# This is a comment'], ]; }