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/src/Languages/Terminal/Patterns/TerminalFilePathPattern.php b/src/Languages/Terminal/Patterns/TerminalFilePathPattern.php new file mode 100644 index 0000000..fbc3193 --- /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; + } +} diff --git a/src/Languages/Terminal/Patterns/TerminalScopedPackagePattern.php b/src/Languages/Terminal/Patterns/TerminalScopedPackagePattern.php new file mode 100644 index 0000000..1784282 --- /dev/null +++ b/src/Languages/Terminal/Patterns/TerminalScopedPackagePattern.php @@ -0,0 +1,27 @@ +@[\w-]+\/[\w.-]+)/'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::PROPERTY; + } +} diff --git a/src/Languages/Terminal/Patterns/TerminalUrlPattern.php b/src/Languages/Terminal/Patterns/TerminalUrlPattern.php new file mode 100644 index 0000000..9e32707 --- /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; + } +} 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(), 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..1a0dbb2 100644 --- a/tests/Languages/Terminal/TerminalLanguageTest.php +++ b/tests/Languages/Terminal/TerminalLanguageTest.php @@ -49,6 +49,34 @@ 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], + + [<<<'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], ]; }