From ee5e289ca6982c4d605a63c0cf7d65bb94ff5b2b Mon Sep 17 00:00:00 2001 From: DorZuberi Date: Thu, 2 Apr 2026 20:48:07 +0300 Subject: [PATCH 1/4] Add new patterns for Terminal language: URLs, file paths, and scoped packages --- .../Patterns/TerminalFilePathPattern.php | 29 +++++++++++++++++++ .../Patterns/TerminalScopedPackagePattern.php | 27 +++++++++++++++++ .../Terminal/Patterns/TerminalUrlPattern.php | 29 +++++++++++++++++++ src/Languages/Terminal/TerminalLanguage.php | 10 +++++++ 4 files changed, 95 insertions(+) create mode 100644 src/Languages/Terminal/Patterns/TerminalFilePathPattern.php create mode 100644 src/Languages/Terminal/Patterns/TerminalScopedPackagePattern.php create mode 100644 src/Languages/Terminal/Patterns/TerminalUrlPattern.php diff --git a/src/Languages/Terminal/Patterns/TerminalFilePathPattern.php b/src/Languages/Terminal/Patterns/TerminalFilePathPattern.php new file mode 100644 index 0000000..7407605 --- /dev/null +++ b/src/Languages/Terminal/Patterns/TerminalFilePathPattern.php @@ -0,0 +1,29 @@ +\.?\/?[\w.-]+(?:\/[\w.\/-]+)+|[\w][\w-]*\.[a-zA-Z]{1,10}\b)/'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::PROPERTY; + } +} \ No newline at end of file diff --git a/src/Languages/Terminal/Patterns/TerminalScopedPackagePattern.php b/src/Languages/Terminal/Patterns/TerminalScopedPackagePattern.php new file mode 100644 index 0000000..fa6be69 --- /dev/null +++ b/src/Languages/Terminal/Patterns/TerminalScopedPackagePattern.php @@ -0,0 +1,27 @@ +@[\w-]+\/[\w.-]+)/'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::PROPERTY; + } +} \ No newline at end of file diff --git a/src/Languages/Terminal/Patterns/TerminalUrlPattern.php b/src/Languages/Terminal/Patterns/TerminalUrlPattern.php new file mode 100644 index 0000000..a779da5 --- /dev/null +++ b/src/Languages/Terminal/Patterns/TerminalUrlPattern.php @@ -0,0 +1,29 @@ +(?:https?|ftp|sftp|ssh|file):\/\/\S+)/'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::VALUE; + } +} \ No newline at end of file diff --git a/src/Languages/Terminal/TerminalLanguage.php b/src/Languages/Terminal/TerminalLanguage.php index ee0254f..4356542 100644 --- a/src/Languages/Terminal/TerminalLanguage.php +++ b/src/Languages/Terminal/TerminalLanguage.php @@ -13,7 +13,10 @@ use Tempest\Highlight\Languages\Php\Patterns\DoubleQuoteValuePattern; use Tempest\Highlight\Languages\Php\Patterns\SingleQuoteValuePattern; use Tempest\Highlight\Languages\Terminal\Patterns\TerminalCommandNamePattern; +use Tempest\Highlight\Languages\Terminal\Patterns\TerminalFilePathPattern; use Tempest\Highlight\Languages\Terminal\Patterns\TerminalPromptPattern; +use Tempest\Highlight\Languages\Terminal\Patterns\TerminalScopedPackagePattern; +use Tempest\Highlight\Languages\Terminal\Patterns\TerminalUrlPattern; class TerminalLanguage extends BaseLanguage { @@ -38,12 +41,19 @@ public function getPatterns(): array new TerminalPromptPattern(), // VALUES + new TerminalUrlPattern(), new SingleQuoteValuePattern(), new DoubleQuoteValuePattern(), // COMMAND NAME new TerminalCommandNamePattern(), + // SCOPED PACKAGES + new TerminalScopedPackagePattern(), + + // FILE PATHS + new TerminalFilePathPattern(), + // VARIABLES new BashVariablePattern(), From 4eecc155d514044450224afdc0a3934a254e30b4 Mon Sep 17 00:00:00 2001 From: DorZuberi Date: Thu, 2 Apr 2026 20:48:21 +0300 Subject: [PATCH 2/4] Add new Terminal language test cases and update fixtures --- tests/Bench/Fixtures/terminal.txt | 9 ++++++++- .../Languages/Terminal/TerminalLanguageTest.php | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/tests/Bench/Fixtures/terminal.txt b/tests/Bench/Fixtures/terminal.txt index 19fa890..5bb3c35 100644 --- a/tests/Bench/Fixtures/terminal.txt +++ b/tests/Bench/Fixtures/terminal.txt @@ -35,4 +35,11 @@ $ ls -la /var/log/*.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 +web-5f6a7b8c9-m3n5p 1/1 Running 0 24h + +$ curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar +$ pm2 start app.js --log /var/log/my-app.log +$ npm init @eslint/config +$ npx eslint --output-file errors.txt app/index.js +$ npx husky add .husky/pre-commit 'echo "Hello World!"' +$ brew install hashicorp/tap/terraform \ No newline at end of file diff --git a/tests/Languages/Terminal/TerminalLanguageTest.php b/tests/Languages/Terminal/TerminalLanguageTest.php index 0232f97..fe4bb55 100644 --- a/tests/Languages/Terminal/TerminalLanguageTest.php +++ b/tests/Languages/Terminal/TerminalLanguageTest.php @@ -49,6 +49,23 @@ public static function provide_highlight_cases(): iterable Hello john # docker ps -a CONTAINER ID IMAGE STATUS +TXT], + + [<<<'TXT' +$ curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar +$ pm2 start app.js --log /var/log/my-app.log +$ npm init @eslint/config +$ npx eslint --output-file errors.txt app/index.js +$ npx husky add .husky/pre-commit 'echo "Hello World!"' +$ brew install hashicorp/tap/terraform +TXT, + <<<'TXT' +$ curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar +$ pm2 start app.js --log /var/log/my-app.log +$ npm init @eslint/config +$ npx eslint --output-file errors.txt app/index.js +$ npx husky add .husky/pre-commit 'echo "Hello World!"' +$ brew install hashicorp/tap/terraform TXT], ]; } From ec26cebc07e93da56915c6e1d1ce7c40ed6d4bc3 Mon Sep 17 00:00:00 2001 From: DorZuberi Date: Thu, 2 Apr 2026 20:51:51 +0300 Subject: [PATCH 3/4] Fix missing newlines at end of Terminal language pattern files --- src/Languages/Terminal/Patterns/TerminalFilePathPattern.php | 2 +- .../Terminal/Patterns/TerminalScopedPackagePattern.php | 2 +- src/Languages/Terminal/Patterns/TerminalUrlPattern.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Languages/Terminal/Patterns/TerminalFilePathPattern.php b/src/Languages/Terminal/Patterns/TerminalFilePathPattern.php index 7407605..fbc3193 100644 --- a/src/Languages/Terminal/Patterns/TerminalFilePathPattern.php +++ b/src/Languages/Terminal/Patterns/TerminalFilePathPattern.php @@ -26,4 +26,4 @@ public function getTokenType(): TokenTypeEnum { return TokenTypeEnum::PROPERTY; } -} \ No newline at end of file +} diff --git a/src/Languages/Terminal/Patterns/TerminalScopedPackagePattern.php b/src/Languages/Terminal/Patterns/TerminalScopedPackagePattern.php index fa6be69..1784282 100644 --- a/src/Languages/Terminal/Patterns/TerminalScopedPackagePattern.php +++ b/src/Languages/Terminal/Patterns/TerminalScopedPackagePattern.php @@ -24,4 +24,4 @@ public function getTokenType(): TokenTypeEnum { return TokenTypeEnum::PROPERTY; } -} \ No newline at end of file +} diff --git a/src/Languages/Terminal/Patterns/TerminalUrlPattern.php b/src/Languages/Terminal/Patterns/TerminalUrlPattern.php index a779da5..9e32707 100644 --- a/src/Languages/Terminal/Patterns/TerminalUrlPattern.php +++ b/src/Languages/Terminal/Patterns/TerminalUrlPattern.php @@ -26,4 +26,4 @@ public function getTokenType(): TokenTypeEnum { return TokenTypeEnum::VALUE; } -} \ No newline at end of file +} From b5ba763bd729d5b8c84d5d8d0c14765269e4b2a6 Mon Sep 17 00:00:00 2001 From: DorZuberi Date: Thu, 2 Apr 2026 21:39:44 +0300 Subject: [PATCH 4/4] Enhance Terminal language patterns to support multiple commands and add related test cases --- .../Terminal/Patterns/TerminalCommandNamePattern.php | 3 ++- tests/Languages/Terminal/TerminalLanguageTest.php | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Languages/Terminal/Patterns/TerminalCommandNamePattern.php b/src/Languages/Terminal/Patterns/TerminalCommandNamePattern.php index 57bf234..b87b1a7 100644 --- a/src/Languages/Terminal/Patterns/TerminalCommandNamePattern.php +++ b/src/Languages/Terminal/Patterns/TerminalCommandNamePattern.php @@ -12,13 +12,14 @@ #[PatternTest(input: '$ npm install express', output: 'npm')] #[PatternTest(input: '# docker ps -a', output: 'docker')] #[PatternTest(input: '$ ./configure', output: './configure')] +#[PatternTest(input: '$ npx husky-init && npm install', output: ['npx', 'npm'])] final readonly class TerminalCommandNamePattern implements Pattern { use IsPattern; public function getPattern(): string { - return '/^[\$#%>]\s+(?[\w.\/-][\w.\/-]*)(?=\s|$)/m'; + return '/(?:^[\$#%>]\s+|&&\s+|\|\|\s+|;\s+)(?[\w.\/-][\w.\/-]*)(?=\s|$)/m'; } public function getTokenType(): TokenTypeEnum diff --git a/tests/Languages/Terminal/TerminalLanguageTest.php b/tests/Languages/Terminal/TerminalLanguageTest.php index fe4bb55..1a0dbb2 100644 --- a/tests/Languages/Terminal/TerminalLanguageTest.php +++ b/tests/Languages/Terminal/TerminalLanguageTest.php @@ -66,6 +66,17 @@ public static function provide_highlight_cases(): iterable $ npx eslint --output-file errors.txt app/index.js $ npx husky add .husky/pre-commit 'echo "Hello World!"' $ brew install hashicorp/tap/terraform +TXT], + + [<<<'TXT' +$ npx husky-init && npm install +$ echo "hello" || echo "fallback" +$ mkdir build; cd build +TXT, + <<<'TXT' +$ npx husky-init && npm install +$ echo "hello" || echo "fallback" +$ mkdir build; cd build TXT], ]; }