From 6e193976e40037f1b234541457c80fd6b05aa683 Mon Sep 17 00:00:00 2001 From: DorZuberi Date: Wed, 1 Apr 2026 22:10:19 +0300 Subject: [PATCH 1/2] Add Terminal language support with patterns and tests --- src/Highlighter.php | 2 + .../Patterns/TerminalCommandNamePattern.php | 28 +++++++++ .../Patterns/TerminalPromptPattern.php | 29 +++++++++ src/Languages/Terminal/TerminalLanguage.php | 60 +++++++++++++++++++ 4 files changed, 119 insertions(+) create mode 100644 src/Languages/Terminal/Patterns/TerminalCommandNamePattern.php create mode 100644 src/Languages/Terminal/Patterns/TerminalPromptPattern.php create mode 100644 src/Languages/Terminal/TerminalLanguage.php diff --git a/src/Highlighter.php b/src/Highlighter.php index e1c1744..973c72d 100644 --- a/src/Highlighter.php +++ b/src/Highlighter.php @@ -24,6 +24,7 @@ use Tempest\Highlight\Languages\Python\PythonLanguage; use Tempest\Highlight\Languages\Scss\ScssLanguage; use Tempest\Highlight\Languages\Sql\SqlLanguage; +use Tempest\Highlight\Languages\Terminal\TerminalLanguage; use Tempest\Highlight\Languages\Text\TextLanguage; use Tempest\Highlight\Languages\Twig\TwigLanguage; use Tempest\Highlight\Languages\Xml\XmlLanguage; @@ -69,6 +70,7 @@ public function __construct(private readonly Theme $theme = new CssTheme()) ->addLanguage(new PythonLanguage()) ->addLanguage(new ScssLanguage()) ->addLanguage(new SqlLanguage()) + ->addLanguage(new TerminalLanguage()) ->addLanguage(new XmlLanguage()) ->addLanguage(new YamlLanguage()) ->addLanguage(new DotEnvLanguage()) diff --git a/src/Languages/Terminal/Patterns/TerminalCommandNamePattern.php b/src/Languages/Terminal/Patterns/TerminalCommandNamePattern.php new file mode 100644 index 0000000..57bf234 --- /dev/null +++ b/src/Languages/Terminal/Patterns/TerminalCommandNamePattern.php @@ -0,0 +1,28 @@ +]\s+(?[\w.\/-][\w.\/-]*)(?=\s|$)/m'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::KEYWORD; + } +} diff --git a/src/Languages/Terminal/Patterns/TerminalPromptPattern.php b/src/Languages/Terminal/Patterns/TerminalPromptPattern.php new file mode 100644 index 0000000..9b08a1d --- /dev/null +++ b/src/Languages/Terminal/Patterns/TerminalPromptPattern.php @@ -0,0 +1,29 @@ + command', output: '>')] +final readonly class TerminalPromptPattern implements Pattern +{ + use IsPattern; + + public function getPattern(): string + { + return '/^(?[\$#%>])(?=\s)/m'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::COMMENT; + } +} diff --git a/src/Languages/Terminal/TerminalLanguage.php b/src/Languages/Terminal/TerminalLanguage.php new file mode 100644 index 0000000..ee0254f --- /dev/null +++ b/src/Languages/Terminal/TerminalLanguage.php @@ -0,0 +1,60 @@ + Date: Wed, 1 Apr 2026 22:10:31 +0300 Subject: [PATCH 2/2] Add Terminal language tests and fixtures --- tests/Bench/Fixtures/terminal.txt | 38 +++++++++++++ tests/Bench/HighlighterBench.php | 1 + .../Terminal/TerminalLanguageTest.php | 55 +++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 tests/Bench/Fixtures/terminal.txt create mode 100644 tests/Languages/Terminal/TerminalLanguageTest.php diff --git a/tests/Bench/Fixtures/terminal.txt b/tests/Bench/Fixtures/terminal.txt new file mode 100644 index 0000000..19fa890 --- /dev/null +++ b/tests/Bench/Fixtures/terminal.txt @@ -0,0 +1,38 @@ +$ npm install --save express +added 57 packages in 3s + +$ git status +On branch main +Your branch is up to date with 'origin/main'. + +nothing to commit, working tree clean + +$ docker ps -a +CONTAINER ID IMAGE STATUS +abc123 nginx:latest Up 2 hours +def456 redis:7 Exited (0) 3 days ago + +# apt update && apt install -y curl wget +Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease +Reading package lists... Done + +$ echo "Hello $USER, today is $(date)" +Hello john, today is Mon Apr 1 10:00:00 UTC 2026 + +$ cat /etc/hosts | grep -i 'localhost' +127.0.0.1 localhost + +% brew install --cask visual-studio-code +==> Downloading https://update.code.visualstudio.com +Already downloaded: /Users/john/Library/Caches/Homebrew + +> node -v +v20.11.0 + +$ ls -la /var/log/*.log +-rw-r--r-- 1 root root 45231 Apr 1 09:00 /var/log/syslog.log + +$ kubectl get pods -n production --output=wide +NAME READY STATUS RESTARTS AGE +api-7d4b8c6f9-x2k4m 1/1 Running 0 24h +web-5f6a7b8c9-m3n5p 1/1 Running 0 24h \ No newline at end of file diff --git a/tests/Bench/HighlighterBench.php b/tests/Bench/HighlighterBench.php index 2cbc9fe..a89fd60 100644 --- a/tests/Bench/HighlighterBench.php +++ b/tests/Bench/HighlighterBench.php @@ -34,6 +34,7 @@ final class HighlighterBench 'python' => 'python.txt', 'scss' => 'scss.txt', 'sql' => 'sql.txt', + 'terminal' => 'terminal.txt', 'twig' => 'twig.txt', 'xml' => 'xml.txt', 'yaml' => 'yaml.txt', diff --git a/tests/Languages/Terminal/TerminalLanguageTest.php b/tests/Languages/Terminal/TerminalLanguageTest.php new file mode 100644 index 0000000..0232f97 --- /dev/null +++ b/tests/Languages/Terminal/TerminalLanguageTest.php @@ -0,0 +1,55 @@ +assertSame( + $expected, + $highlighter->parse($content, 'terminal'), + ); + + $this->assertSame( + $expected, + $highlighter->parse($content, 'console'), + ); + + $this->assertSame( + $expected, + $highlighter->parse($content, 'term'), + ); + } + + public static function provide_highlight_cases(): iterable + { + return [ + [<<<'TXT' +$ npm install --save express +added 57 packages +$ echo "Hello $USER" +Hello john +# docker ps -a +CONTAINER ID IMAGE STATUS +TXT, + <<<'TXT' +$ npm install --save express +added 57 packages +$ echo "Hello $USER" +Hello john +# docker ps -a +CONTAINER ID IMAGE STATUS +TXT], + ]; + } +}