From ce0f3d3063f6c0ab8493f31c0a02be43f536ff50 Mon Sep 17 00:00:00 2001 From: Christen Dijoux <123602948+Akiyo974@users.noreply.github.com> Date: Mon, 26 Oct 2026 12:26:30 -0400 Subject: [PATCH] fix: don't wrap addition and deletion delimiters twice in embedded languages --- .../Base/Patterns/AdditionEndTokenPattern.php | 4 +++- .../Base/Patterns/AdditionStartTokenPattern.php | 4 +++- .../Base/Patterns/DeletionEndTokenPattern.php | 4 +++- .../Base/Patterns/DeletionStartTokenPattern.php | 4 +++- .../Base/Injections/AdditionInjectionTest.php | 13 +++++++++++++ .../Base/Injections/DeletionInjectionTest.php | 13 +++++++++++++ 6 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/Languages/Base/Patterns/AdditionEndTokenPattern.php b/src/Languages/Base/Patterns/AdditionEndTokenPattern.php index 5807a49a..c294c007 100644 --- a/src/Languages/Base/Patterns/AdditionEndTokenPattern.php +++ b/src/Languages/Base/Patterns/AdditionEndTokenPattern.php @@ -11,13 +11,15 @@ use Tempest\Highlight\Tokens\TokenType; #[PatternTest('{+ pull_request_target: +}', '+}')] +#[PatternTest('❷span class=❹ignore❹❸+}❷/span❸', null)] final readonly class AdditionEndTokenPattern implements Pattern { use IsPattern; public function getPattern(): string { - return '/(?\+})/'; + // A delimiter that is already ignored comes from code highlighted by a nested highlighter + return '/(?\+})/'; } public function getTokenType(): TokenType diff --git a/src/Languages/Base/Patterns/AdditionStartTokenPattern.php b/src/Languages/Base/Patterns/AdditionStartTokenPattern.php index 8355b1a7..f96d8ac3 100644 --- a/src/Languages/Base/Patterns/AdditionStartTokenPattern.php +++ b/src/Languages/Base/Patterns/AdditionStartTokenPattern.php @@ -11,13 +11,15 @@ use Tempest\Highlight\Tokens\TokenType; #[PatternTest('{+ pull_request_target: +}', '{+')] +#[PatternTest('❷span class=❹ignore❹❸{+❷/span❸', null)] final readonly class AdditionStartTokenPattern implements Pattern { use IsPattern; public function getPattern(): string { - return '/(?{\+)/'; + // A delimiter that is already ignored comes from code highlighted by a nested highlighter + return '/(?{\+)/'; } public function getTokenType(): TokenType diff --git a/src/Languages/Base/Patterns/DeletionEndTokenPattern.php b/src/Languages/Base/Patterns/DeletionEndTokenPattern.php index 857c61bf..f1d9b785 100644 --- a/src/Languages/Base/Patterns/DeletionEndTokenPattern.php +++ b/src/Languages/Base/Patterns/DeletionEndTokenPattern.php @@ -11,6 +11,7 @@ use Tempest\Highlight\Tokens\TokenType; #[PatternTest('{- pull_request_target: -}', '-}')] +#[PatternTest('❷span class=❹ignore❹❸-}❷/span❸', null)] #[PatternTest('{-- pull_request_target: --}', null)] #[PatternTest('{{- variable -}}', null)] final readonly class DeletionEndTokenPattern implements Pattern @@ -19,7 +20,8 @@ public function getPattern(): string { - return '/(?\-})(?!})/'; + // A delimiter that is already ignored comes from code highlighted by a nested highlighter + return '/(?\-})(?!})/'; } public function getTokenType(): TokenType diff --git a/src/Languages/Base/Patterns/DeletionStartTokenPattern.php b/src/Languages/Base/Patterns/DeletionStartTokenPattern.php index 8ed79d37..de194e9d 100644 --- a/src/Languages/Base/Patterns/DeletionStartTokenPattern.php +++ b/src/Languages/Base/Patterns/DeletionStartTokenPattern.php @@ -13,13 +13,15 @@ #[PatternTest('{- pull_request_target: -}', '{-')] #[PatternTest('{-- pull_request_target: --}', null)] #[PatternTest('{{- variable -}}', null)] +#[PatternTest('❷span class=❹ignore❹❸{-❷/span❸', null)] final readonly class DeletionStartTokenPattern implements Pattern { use IsPattern; public function getPattern(): string { - return '/(?{\-)(?!-)/'; + // A delimiter that is already ignored comes from code highlighted by a nested highlighter + return '/(?{\-)(?!-)/'; } public function getTokenType(): TokenType diff --git a/tests/Languages/Base/Injections/AdditionInjectionTest.php b/tests/Languages/Base/Injections/AdditionInjectionTest.php index 0f76a0cb..286d6d31 100644 --- a/tests/Languages/Base/Injections/AdditionInjectionTest.php +++ b/tests/Languages/Base/Injections/AdditionInjectionTest.php @@ -36,4 +36,17 @@ public function test_null_content_is_prevented(): void $this->assertTrue(true); } + + public function test_addition_ending_inside_an_embedded_language(): void + { + $content = "{+"; + + $expected = <<<'TXT' +<script> + a; +</script> +TXT; + + $this->assertSame($expected, (new Highlighter())->parse($content, 'html')); + } } diff --git a/tests/Languages/Base/Injections/DeletionInjectionTest.php b/tests/Languages/Base/Injections/DeletionInjectionTest.php index eb8fdc5a..7a07336f 100644 --- a/tests/Languages/Base/Injections/DeletionInjectionTest.php +++ b/tests/Languages/Base/Injections/DeletionInjectionTest.php @@ -52,4 +52,17 @@ public function test_deletion_not_triggered_by_tag_whitespace_control() $this->assertSame($content, $parsedInjection->content); } + + public function test_deletion_ending_inside_an_embedded_language(): void + { + $content = "{-"; + + $expected = <<<'TXT' +<script> + a; +</script> +TXT; + + $this->assertSame($expected, (new Highlighter())->parse($content, 'html')); + } }