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')); + } }