Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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+(?<match>[\w.\/-][\w.\/-]*)(?=\s|$)/m';
return '/(?:^[\$#%>]\s+|&&\s+|\|\|\s+|;\s+)(?<match>[\w.\/-][\w.\/-]*)(?=\s|$)/m';
}

public function getTokenType(): TokenTypeEnum
Expand Down
29 changes: 29 additions & 0 deletions src/Languages/Terminal/Patterns/TerminalFilePathPattern.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Terminal\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\PatternTest;
use Tempest\Highlight\Tokens\TokenTypeEnum;

#[PatternTest(input: 'start app.js --log', output: 'app.js')]
#[PatternTest(input: '--log /var/log/my-app.log', output: '/var/log/my-app.log')]
#[PatternTest(input: 'add .husky/pre-commit foo', output: '.husky/pre-commit')]
#[PatternTest(input: 'install hashicorp/tap/terraform', output: 'hashicorp/tap/terraform')]
final readonly class TerminalFilePathPattern implements Pattern
{
use IsPattern;

public function getPattern(): string
{
return '/(?<match>\.?\/?[\w.-]+(?:\/[\w.\/-]+)+|[\w][\w-]*\.[a-zA-Z]{1,10}\b)/';
}

public function getTokenType(): TokenTypeEnum
{
return TokenTypeEnum::PROPERTY;
}
}
27 changes: 27 additions & 0 deletions src/Languages/Terminal/Patterns/TerminalScopedPackagePattern.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Terminal\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\PatternTest;
use Tempest\Highlight\Tokens\TokenTypeEnum;

#[PatternTest(input: 'npm init @eslint/config', output: '@eslint/config')]
#[PatternTest(input: 'npm install @babel/core', output: '@babel/core')]
final readonly class TerminalScopedPackagePattern implements Pattern
{
use IsPattern;

public function getPattern(): string
{
return '/(?<match>@[\w-]+\/[\w.-]+)/';
}

public function getTokenType(): TokenTypeEnum
{
return TokenTypeEnum::PROPERTY;
}
}
29 changes: 29 additions & 0 deletions src/Languages/Terminal/Patterns/TerminalUrlPattern.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Terminal\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\PatternTest;
use Tempest\Highlight\Tokens\TokenTypeEnum;

#[PatternTest(input: 'curl -OL https://example.com/file.phar', output: 'https://example.com/file.phar')]
#[PatternTest(input: 'wget http://archive.ubuntu.com/ubuntu', output: 'http://archive.ubuntu.com/ubuntu')]
#[PatternTest(input: 'curl ftp://files.example.com/data.csv', output: 'ftp://files.example.com/data.csv')]
#[PatternTest(input: 'git clone ssh://[email protected]/user/repo', output: 'ssh://[email protected]/user/repo')]
final readonly class TerminalUrlPattern implements Pattern
{
use IsPattern;

public function getPattern(): string
{
return '/(?<match>(?:https?|ftp|sftp|ssh|file):\/\/\S+)/';
}

public function getTokenType(): TokenTypeEnum
{
return TokenTypeEnum::VALUE;
}
}
10 changes: 10 additions & 0 deletions src/Languages/Terminal/TerminalLanguage.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -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(),

Expand Down
9 changes: 8 additions & 1 deletion tests/Bench/Fixtures/terminal.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
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
28 changes: 28 additions & 0 deletions tests/Languages/Terminal/TerminalLanguageTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,34 @@ public static function provide_highlight_cases(): iterable
Hello john
<span class="hl-comment">#</span> <span class="hl-keyword">docker</span> ps <span class="hl-generic">-a</span>
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'
<span class="hl-comment">$</span> <span class="hl-keyword">curl</span> <span class="hl-generic">-OL</span> <span class="hl-value">https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar</span>
<span class="hl-comment">$</span> <span class="hl-keyword">pm2</span> start <span class="hl-property">app.js</span> <span class="hl-generic">--log</span> <span class="hl-property">/var/log/my-app.log</span>
<span class="hl-comment">$</span> <span class="hl-keyword">npm</span> init <span class="hl-property">@eslint/config</span>
<span class="hl-comment">$</span> <span class="hl-keyword">npx</span> eslint <span class="hl-generic">--output-file</span> <span class="hl-property">errors.txt</span> <span class="hl-property">app/index.js</span>
<span class="hl-comment">$</span> <span class="hl-keyword">npx</span> husky add <span class="hl-property">.husky/pre-commit</span> <span class="hl-value">'echo &quot;Hello World!&quot;'</span>
<span class="hl-comment">$</span> <span class="hl-keyword">brew</span> install <span class="hl-property">hashicorp/tap/terraform</span>
TXT],

[<<<'TXT'
$ npx husky-init && npm install
$ echo "hello" || echo "fallback"
$ mkdir build; cd build
TXT,
<<<'TXT'
<span class="hl-comment">$</span> <span class="hl-keyword">npx</span> husky<span class="hl-generic">-init</span> <span class="hl-operator">&amp;&amp;</span> <span class="hl-keyword">npm</span> install
<span class="hl-comment">$</span> <span class="hl-keyword">echo</span> <span class="hl-value">&quot;hello&quot;</span> <span class="hl-operator">||</span> <span class="hl-keyword">echo</span> <span class="hl-value">&quot;fallback&quot;</span>
<span class="hl-comment">$</span> <span class="hl-keyword">mkdir</span> build<span class="hl-operator">;</span> <span class="hl-keyword">cd</span> build
TXT],
];
}
Expand Down
Loading