Skip to content

Commit 034f69a

Browse files
authored
Merge pull request #202 from DorZuberi/imporve-terminal-highlighting
2 parents ebbb802 + b5ba763 commit 034f69a

7 files changed

Lines changed: 133 additions & 2 deletions

File tree

src/Languages/Terminal/Patterns/TerminalCommandNamePattern.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@
1212
#[PatternTest(input: '$ npm install express', output: 'npm')]
1313
#[PatternTest(input: '# docker ps -a', output: 'docker')]
1414
#[PatternTest(input: '$ ./configure', output: './configure')]
15+
#[PatternTest(input: '$ npx husky-init && npm install', output: ['npx', 'npm'])]
1516
final readonly class TerminalCommandNamePattern implements Pattern
1617
{
1718
use IsPattern;
1819

1920
public function getPattern(): string
2021
{
21-
return '/^[\$#%>]\s+(?<match>[\w.\/-][\w.\/-]*)(?=\s|$)/m';
22+
return '/(?:^[\$#%>]\s+|&&\s+|\|\|\s+|;\s+)(?<match>[\w.\/-][\w.\/-]*)(?=\s|$)/m';
2223
}
2324

2425
public function getTokenType(): TokenTypeEnum
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Terminal\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: 'start app.js --log', output: 'app.js')]
13+
#[PatternTest(input: '--log /var/log/my-app.log', output: '/var/log/my-app.log')]
14+
#[PatternTest(input: 'add .husky/pre-commit foo', output: '.husky/pre-commit')]
15+
#[PatternTest(input: 'install hashicorp/tap/terraform', output: 'hashicorp/tap/terraform')]
16+
final readonly class TerminalFilePathPattern implements Pattern
17+
{
18+
use IsPattern;
19+
20+
public function getPattern(): string
21+
{
22+
return '/(?<match>\.?\/?[\w.-]+(?:\/[\w.\/-]+)+|[\w][\w-]*\.[a-zA-Z]{1,10}\b)/';
23+
}
24+
25+
public function getTokenType(): TokenTypeEnum
26+
{
27+
return TokenTypeEnum::PROPERTY;
28+
}
29+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Terminal\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: 'npm init @eslint/config', output: '@eslint/config')]
13+
#[PatternTest(input: 'npm install @babel/core', output: '@babel/core')]
14+
final readonly class TerminalScopedPackagePattern implements Pattern
15+
{
16+
use IsPattern;
17+
18+
public function getPattern(): string
19+
{
20+
return '/(?<match>@[\w-]+\/[\w.-]+)/';
21+
}
22+
23+
public function getTokenType(): TokenTypeEnum
24+
{
25+
return TokenTypeEnum::PROPERTY;
26+
}
27+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Terminal\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: 'curl -OL https://example.com/file.phar', output: 'https://example.com/file.phar')]
13+
#[PatternTest(input: 'wget http://archive.ubuntu.com/ubuntu', output: 'http://archive.ubuntu.com/ubuntu')]
14+
#[PatternTest(input: 'curl ftp://files.example.com/data.csv', output: 'ftp://files.example.com/data.csv')]
15+
#[PatternTest(input: 'git clone ssh://git@github.com/user/repo', output: 'ssh://git@github.com/user/repo')]
16+
final readonly class TerminalUrlPattern implements Pattern
17+
{
18+
use IsPattern;
19+
20+
public function getPattern(): string
21+
{
22+
return '/(?<match>(?:https?|ftp|sftp|ssh|file):\/\/\S+)/';
23+
}
24+
25+
public function getTokenType(): TokenTypeEnum
26+
{
27+
return TokenTypeEnum::VALUE;
28+
}
29+
}

src/Languages/Terminal/TerminalLanguage.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313
use Tempest\Highlight\Languages\Php\Patterns\DoubleQuoteValuePattern;
1414
use Tempest\Highlight\Languages\Php\Patterns\SingleQuoteValuePattern;
1515
use Tempest\Highlight\Languages\Terminal\Patterns\TerminalCommandNamePattern;
16+
use Tempest\Highlight\Languages\Terminal\Patterns\TerminalFilePathPattern;
1617
use Tempest\Highlight\Languages\Terminal\Patterns\TerminalPromptPattern;
18+
use Tempest\Highlight\Languages\Terminal\Patterns\TerminalScopedPackagePattern;
19+
use Tempest\Highlight\Languages\Terminal\Patterns\TerminalUrlPattern;
1720

1821
class TerminalLanguage extends BaseLanguage
1922
{
@@ -38,12 +41,19 @@ public function getPatterns(): array
3841
new TerminalPromptPattern(),
3942

4043
// VALUES
44+
new TerminalUrlPattern(),
4145
new SingleQuoteValuePattern(),
4246
new DoubleQuoteValuePattern(),
4347

4448
// COMMAND NAME
4549
new TerminalCommandNamePattern(),
4650

51+
// SCOPED PACKAGES
52+
new TerminalScopedPackagePattern(),
53+
54+
// FILE PATHS
55+
new TerminalFilePathPattern(),
56+
4757
// VARIABLES
4858
new BashVariablePattern(),
4959

tests/Bench/Fixtures/terminal.txt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,11 @@ $ ls -la /var/log/*.log
3535
$ kubectl get pods -n production --output=wide
3636
NAME READY STATUS RESTARTS AGE
3737
api-7d4b8c6f9-x2k4m 1/1 Running 0 24h
38-
web-5f6a7b8c9-m3n5p 1/1 Running 0 24h
38+
web-5f6a7b8c9-m3n5p 1/1 Running 0 24h
39+
40+
$ curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar
41+
$ pm2 start app.js --log /var/log/my-app.log
42+
$ npm init @eslint/config
43+
$ npx eslint --output-file errors.txt app/index.js
44+
$ npx husky add .husky/pre-commit 'echo "Hello World!"'
45+
$ brew install hashicorp/tap/terraform

tests/Languages/Terminal/TerminalLanguageTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,34 @@ public static function provide_highlight_cases(): iterable
4949
Hello john
5050
<span class="hl-comment">#</span> <span class="hl-keyword">docker</span> ps <span class="hl-generic">-a</span>
5151
CONTAINER ID IMAGE STATUS
52+
TXT],
53+
54+
[<<<'TXT'
55+
$ curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar
56+
$ pm2 start app.js --log /var/log/my-app.log
57+
$ npm init @eslint/config
58+
$ npx eslint --output-file errors.txt app/index.js
59+
$ npx husky add .husky/pre-commit 'echo "Hello World!"'
60+
$ brew install hashicorp/tap/terraform
61+
TXT,
62+
<<<'TXT'
63+
<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>
64+
<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>
65+
<span class="hl-comment">$</span> <span class="hl-keyword">npm</span> init <span class="hl-property">@eslint/config</span>
66+
<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>
67+
<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>
68+
<span class="hl-comment">$</span> <span class="hl-keyword">brew</span> install <span class="hl-property">hashicorp/tap/terraform</span>
69+
TXT],
70+
71+
[<<<'TXT'
72+
$ npx husky-init && npm install
73+
$ echo "hello" || echo "fallback"
74+
$ mkdir build; cd build
75+
TXT,
76+
<<<'TXT'
77+
<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
78+
<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>
79+
<span class="hl-comment">$</span> <span class="hl-keyword">mkdir</span> build<span class="hl-operator">;</span> <span class="hl-keyword">cd</span> build
5280
TXT],
5381
];
5482
}

0 commit comments

Comments
 (0)