From 75fbc9d4a68767a9f9147ee356e19289f34e1c45 Mon Sep 17 00:00:00 2001 From: Brent Roose Date: Mon, 25 Mar 2024 13:53:09 +0100 Subject: [PATCH] Terminal escaping --- README.md | 4 ++-- src/Escape.php | 5 +++++ src/Highlighter.php | 10 +++++---- src/TerminalTheme.php | 9 ++++++++ ...rminalTheme.php => LightTerminalTheme.php} | 4 ++-- test-terminal.php | 6 ++--- tests/Languages/Sql/SqlLanguageTest.php | 4 ++-- tests/Themes/LightTerminalThemeTest.php | 22 +++++++++++++++++++ tests/Themes/TerminalThemeTest.php | 4 ++-- tests/targets/test.md | 5 ++++- 10 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 src/TerminalTheme.php rename src/Themes/{TerminalTheme.php => LightTerminalTheme.php} (90%) create mode 100644 tests/Themes/LightTerminalThemeTest.php diff --git a/README.md b/README.md index b85e471..78bebcb 100644 --- a/README.md +++ b/README.md @@ -120,9 +120,9 @@ Note that `pre` tag styling isn't included in this package. ```php use Tempest\Highlight\Highlighter; -use Tempest\Highlight\Themes\TerminalTheme; +use Tempest\Highlight\Themes\LightTerminalTheme; -$highlighter = new Highlighter(new TerminalTheme()); +$highlighter = new Highlighter(new LightTerminalTheme()); echo $highlighter->parse($code, 'php'); ``` diff --git a/src/Escape.php b/src/Escape.php index 1ce0b6b..d6b8026 100644 --- a/src/Escape.php +++ b/src/Escape.php @@ -26,6 +26,11 @@ public static function injection(string $input): string return self::INJECTION_TOKEN . $input . self::INJECTION_TOKEN; } + public static function terminal(string $input): string + { + return str_replace(self::INJECTION_TOKEN, '', $input); + } + public static function html(string $input): string { return self::reverse( diff --git a/src/Highlighter.php b/src/Highlighter.php index 0545f8e..a44a621 100644 --- a/src/Highlighter.php +++ b/src/Highlighter.php @@ -17,7 +17,6 @@ use Tempest\Highlight\Languages\Xml\XmlLanguage; use Tempest\Highlight\Languages\Yaml\YamlLanguage; use Tempest\Highlight\Themes\CssTheme; -use Tempest\Highlight\Themes\TerminalTheme; use Tempest\Highlight\Tokens\GroupTokens; use Tempest\Highlight\Tokens\ParseTokens; use Tempest\Highlight\Tokens\RenderTokens; @@ -106,8 +105,11 @@ private function parseContent(string $content, Language $language): string $output = (new RenderTokens($this->theme))($content, $groupedTokens); - return $this->shouldEscape - ? Escape::html($output) - : $output; + // Determine proper escaping + return match(true) { + $this->theme instanceof TerminalTheme => Escape::terminal($output), + $this->shouldEscape => Escape::html($output), + default => $output, + }; } } diff --git a/src/TerminalTheme.php b/src/TerminalTheme.php new file mode 100644 index 0000000..fa176d0 --- /dev/null +++ b/src/TerminalTheme.php @@ -0,0 +1,9 @@ + 1 ? $argv[1] @@ -25,4 +25,4 @@ $code, ); -echo PHP_EOL, html_entity_decode($highlighter->parse($code, $language)), PHP_EOL, PHP_EOL; +echo PHP_EOL, $highlighter->parse($code, $language), PHP_EOL, PHP_EOL; diff --git a/tests/Languages/Sql/SqlLanguageTest.php b/tests/Languages/Sql/SqlLanguageTest.php index 59ee588..b25f24d 100644 --- a/tests/Languages/Sql/SqlLanguageTest.php +++ b/tests/Languages/Sql/SqlLanguageTest.php @@ -7,7 +7,7 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Tempest\Highlight\Highlighter; -use Tempest\Highlight\Themes\TerminalTheme; +use Tempest\Highlight\Themes\LightTerminalTheme; class SqlLanguageTest extends TestCase { @@ -66,7 +66,7 @@ public static function data(): array public function test_highlight_in_terminal() { - $highlighter = new Highlighter(new TerminalTheme()); + $highlighter = new Highlighter(new LightTerminalTheme()); $sql = <<parse('{~}): Foo {}~}', 'php'); + + $this->assertStringNotContainsString(Escape::INJECTION_TOKEN, $parsed); + } +} diff --git a/tests/Themes/TerminalThemeTest.php b/tests/Themes/TerminalThemeTest.php index 28fd22b..16e7d50 100644 --- a/tests/Themes/TerminalThemeTest.php +++ b/tests/Themes/TerminalThemeTest.php @@ -6,7 +6,7 @@ use PHPUnit\Framework\TestCase; use Tempest\Highlight\Highlighter; -use Tempest\Highlight\Themes\TerminalTheme; +use Tempest\Highlight\Themes\LightTerminalTheme; class TerminalThemeTest extends TestCase { @@ -16,7 +16,7 @@ public function test_terminal_theme() public function before TXT; - $highlighter = new Highlighter(new TerminalTheme()); + $highlighter = new Highlighter(new LightTerminalTheme()); $output = $highlighter->parse($content, 'php'); diff --git a/tests/targets/test.md b/tests/targets/test.md index a656ade..237341d 100644 --- a/tests/targets/test.md +++ b/tests/targets/test.md @@ -1,3 +1,6 @@ ```php -{~}): Foo {}~} +$sql = <<