From 758dfc54965a668417c204e867b205aff37012e9 Mon Sep 17 00:00:00 2001 From: Mior Muhammad Zaki Date: Mon, 24 Mar 2025 00:52:12 +0800 Subject: [PATCH 1/8] wip Signed-off-by: Mior Muhammad Zaki --- src/Illuminate/Mail/resources/views/html/button.blade.php | 2 +- src/Illuminate/Mail/resources/views/html/footer.blade.php | 2 +- src/Illuminate/Mail/resources/views/html/header.blade.php | 2 +- src/Illuminate/Mail/resources/views/html/layout.blade.php | 8 ++++---- .../Mail/resources/views/html/message.blade.php | 4 ++-- src/Illuminate/Mail/resources/views/html/panel.blade.php | 2 +- .../Mail/resources/views/html/subcopy.blade.php | 2 +- src/Illuminate/Mail/resources/views/html/table.blade.php | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Illuminate/Mail/resources/views/html/button.blade.php b/src/Illuminate/Mail/resources/views/html/button.blade.php index 4a9bf7d00495..050e969d2130 100644 --- a/src/Illuminate/Mail/resources/views/html/button.blade.php +++ b/src/Illuminate/Mail/resources/views/html/button.blade.php @@ -12,7 +12,7 @@
-{{ $slot }} +{!! $slot !!}
diff --git a/src/Illuminate/Mail/resources/views/html/footer.blade.php b/src/Illuminate/Mail/resources/views/html/footer.blade.php index 3ff41f89cb90..ecf614df05ce 100644 --- a/src/Illuminate/Mail/resources/views/html/footer.blade.php +++ b/src/Illuminate/Mail/resources/views/html/footer.blade.php @@ -3,7 +3,7 @@ diff --git a/src/Illuminate/Mail/resources/views/html/header.blade.php b/src/Illuminate/Mail/resources/views/html/header.blade.php index 56197f8d23f3..c47a260c56b2 100644 --- a/src/Illuminate/Mail/resources/views/html/header.blade.php +++ b/src/Illuminate/Mail/resources/views/html/header.blade.php @@ -5,7 +5,7 @@ @if (trim($slot) === 'Laravel') @else -{{ $slot }} +{!! $slot !!} @endif diff --git a/src/Illuminate/Mail/resources/views/html/layout.blade.php b/src/Illuminate/Mail/resources/views/html/layout.blade.php index d31a01de8630..1f01bd7cda29 100644 --- a/src/Illuminate/Mail/resources/views/html/layout.blade.php +++ b/src/Illuminate/Mail/resources/views/html/layout.blade.php @@ -31,7 +31,7 @@ -{{ $header ?? '' }} +{!! $header ?? '' !!} @@ -40,16 +40,16 @@ -{{ $footer ?? '' }} +{!! $footer ?? '' !!} diff --git a/src/Illuminate/Mail/resources/views/html/message.blade.php b/src/Illuminate/Mail/resources/views/html/message.blade.php index 1a874fc26de5..a16bace0a691 100644 --- a/src/Illuminate/Mail/resources/views/html/message.blade.php +++ b/src/Illuminate/Mail/resources/views/html/message.blade.php @@ -7,13 +7,13 @@ {{-- Body --}} -{{ $slot }} +{!! $slot !!} {{-- Subcopy --}} @isset($subcopy) -{{ $subcopy }} +{!! $subcopy !!} @endisset diff --git a/src/Illuminate/Mail/resources/views/html/panel.blade.php b/src/Illuminate/Mail/resources/views/html/panel.blade.php index 2975a60a021e..812db7c08e77 100644 --- a/src/Illuminate/Mail/resources/views/html/panel.blade.php +++ b/src/Illuminate/Mail/resources/views/html/panel.blade.php @@ -4,7 +4,7 @@
-{{ Illuminate\Mail\Markdown::parse($slot) }} +{!! Illuminate\Mail\Markdown::parse($slot) !!}
diff --git a/src/Illuminate/Mail/resources/views/html/subcopy.blade.php b/src/Illuminate/Mail/resources/views/html/subcopy.blade.php index 790ce6c2498a..999350898dfd 100644 --- a/src/Illuminate/Mail/resources/views/html/subcopy.blade.php +++ b/src/Illuminate/Mail/resources/views/html/subcopy.blade.php @@ -1,7 +1,7 @@ diff --git a/src/Illuminate/Mail/resources/views/html/table.blade.php b/src/Illuminate/Mail/resources/views/html/table.blade.php index a5f3348b233a..6e582b9b12fe 100644 --- a/src/Illuminate/Mail/resources/views/html/table.blade.php +++ b/src/Illuminate/Mail/resources/views/html/table.blade.php @@ -1,3 +1,3 @@
-{{ Illuminate\Mail\Markdown::parse($slot) }} +{!! Illuminate\Mail\Markdown::parse($slot) !!}
From b273d790d01483a6929c7460d1915e51d3a3356c Mon Sep 17 00:00:00 2001 From: Mior Muhammad Zaki Date: Mon, 24 Mar 2025 09:57:26 +0800 Subject: [PATCH 2/8] wip Signed-off-by: Mior Muhammad Zaki --- src/Illuminate/Mail/resources/views/html/footer.blade.php | 2 +- src/Illuminate/Mail/resources/views/html/layout.blade.php | 2 +- src/Illuminate/Mail/resources/views/html/subcopy.blade.php | 2 +- src/Illuminate/Mail/resources/views/html/table.blade.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Illuminate/Mail/resources/views/html/footer.blade.php b/src/Illuminate/Mail/resources/views/html/footer.blade.php index ecf614df05ce..3ff41f89cb90 100644 --- a/src/Illuminate/Mail/resources/views/html/footer.blade.php +++ b/src/Illuminate/Mail/resources/views/html/footer.blade.php @@ -3,7 +3,7 @@ diff --git a/src/Illuminate/Mail/resources/views/html/layout.blade.php b/src/Illuminate/Mail/resources/views/html/layout.blade.php index 1f01bd7cda29..a5330f56071c 100644 --- a/src/Illuminate/Mail/resources/views/html/layout.blade.php +++ b/src/Illuminate/Mail/resources/views/html/layout.blade.php @@ -40,7 +40,7 @@ -{!! Illuminate\Mail\Markdown::parse($slot) !!} +{{ Illuminate\Mail\Markdown::parse($slot) }} {!! $subcopy ?? '' !!} diff --git a/src/Illuminate/Mail/resources/views/html/subcopy.blade.php b/src/Illuminate/Mail/resources/views/html/subcopy.blade.php index 999350898dfd..790ce6c2498a 100644 --- a/src/Illuminate/Mail/resources/views/html/subcopy.blade.php +++ b/src/Illuminate/Mail/resources/views/html/subcopy.blade.php @@ -1,7 +1,7 @@ diff --git a/src/Illuminate/Mail/resources/views/html/table.blade.php b/src/Illuminate/Mail/resources/views/html/table.blade.php index 6e582b9b12fe..a5f3348b233a 100644 --- a/src/Illuminate/Mail/resources/views/html/table.blade.php +++ b/src/Illuminate/Mail/resources/views/html/table.blade.php @@ -1,3 +1,3 @@
-{!! Illuminate\Mail\Markdown::parse($slot) !!} +{{ Illuminate\Mail\Markdown::parse($slot) }}
From a6e26ef6f4a968e3926af580a15cdb564a257587 Mon Sep 17 00:00:00 2001 From: Mior Muhammad Zaki Date: Mon, 24 Mar 2025 13:06:47 +0800 Subject: [PATCH 3/8] wip Signed-off-by: Mior Muhammad Zaki --- src/Illuminate/Mail/Markdown.php | 26 +++++++-- .../resources/views/html/footer.blade.php | 2 +- .../resources/views/html/layout.blade.php | 4 +- .../resources/views/html/message.blade.php | 2 +- .../resources/views/html/subcopy.blade.php | 2 +- .../Mail/resources/views/html/table.blade.php | 2 +- .../Fixtures/message-with-template.blade.php | 4 ++ tests/Integration/Mail/MailableTest.php | 57 +++++++++++++++++++ 8 files changed, 89 insertions(+), 10 deletions(-) create mode 100644 tests/Integration/Mail/Fixtures/message-with-template.blade.php diff --git a/src/Illuminate/Mail/Markdown.php b/src/Illuminate/Mail/Markdown.php index e8ec2defc4c4..592aa70b5210 100644 --- a/src/Illuminate/Mail/Markdown.php +++ b/src/Illuminate/Mail/Markdown.php @@ -69,9 +69,27 @@ public function render($view, array $data = [], $inliner = null) $contents = $bladeCompiler->usingEchoFormat( 'new \Illuminate\Support\EncodedHtmlString(%s)', function () use ($view, $data) { - return $this->view->replaceNamespace( - 'mail', $this->htmlComponentPaths() - )->make($view, $data)->render(); + EncodedHtmlString::encodeUsing(function ($value) { + $replacements = [ + '[' => '\[', + '<' => '<', + '>' => '>', + ]; + + $html = str_replace(array_keys($replacements), array_values($replacements), $value); + + return $html; + }); + + try { + $contents = $this->view->replaceNamespace( + 'mail', $this->htmlComponentPaths() + )->make($view, $data)->render(); + } finally { + EncodedHtmlString::flushState(); + } + + return $contents; } ); @@ -84,7 +102,7 @@ function () use ($view, $data) { } return new HtmlString(($inliner ?: new CssToInlineStyles)->convert( - $contents, $this->view->make($theme, $data)->render() + str_replace('\[', '[', $contents), $this->view->make($theme, $data)->render() )); } diff --git a/src/Illuminate/Mail/resources/views/html/footer.blade.php b/src/Illuminate/Mail/resources/views/html/footer.blade.php index 3ff41f89cb90..ecf614df05ce 100644 --- a/src/Illuminate/Mail/resources/views/html/footer.blade.php +++ b/src/Illuminate/Mail/resources/views/html/footer.blade.php @@ -3,7 +3,7 @@ diff --git a/src/Illuminate/Mail/resources/views/html/layout.blade.php b/src/Illuminate/Mail/resources/views/html/layout.blade.php index a5330f56071c..0fa6b82f72b2 100644 --- a/src/Illuminate/Mail/resources/views/html/layout.blade.php +++ b/src/Illuminate/Mail/resources/views/html/layout.blade.php @@ -23,7 +23,7 @@ } } -{{ $head ?? '' }} +{!! $head ?? '' !!} @@ -40,7 +40,7 @@ -{{ Illuminate\Mail\Markdown::parse($slot) }} +{!! Illuminate\Mail\Markdown::parse($slot) !!} {!! $subcopy ?? '' !!} diff --git a/src/Illuminate/Mail/resources/views/html/message.blade.php b/src/Illuminate/Mail/resources/views/html/message.blade.php index a16bace0a691..f1e815f32a41 100644 --- a/src/Illuminate/Mail/resources/views/html/message.blade.php +++ b/src/Illuminate/Mail/resources/views/html/message.blade.php @@ -13,7 +13,7 @@ @isset($subcopy) -{!! $subcopy !!} +{!! $subcopy !!}} @endisset diff --git a/src/Illuminate/Mail/resources/views/html/subcopy.blade.php b/src/Illuminate/Mail/resources/views/html/subcopy.blade.php index 790ce6c2498a..999350898dfd 100644 --- a/src/Illuminate/Mail/resources/views/html/subcopy.blade.php +++ b/src/Illuminate/Mail/resources/views/html/subcopy.blade.php @@ -1,7 +1,7 @@ diff --git a/src/Illuminate/Mail/resources/views/html/table.blade.php b/src/Illuminate/Mail/resources/views/html/table.blade.php index a5f3348b233a..6e582b9b12fe 100644 --- a/src/Illuminate/Mail/resources/views/html/table.blade.php +++ b/src/Illuminate/Mail/resources/views/html/table.blade.php @@ -1,3 +1,3 @@
-{{ Illuminate\Mail\Markdown::parse($slot) }} +{!! Illuminate\Mail\Markdown::parse($slot) !!}
diff --git a/tests/Integration/Mail/Fixtures/message-with-template.blade.php b/tests/Integration/Mail/Fixtures/message-with-template.blade.php new file mode 100644 index 000000000000..9c53cef7e1bb --- /dev/null +++ b/tests/Integration/Mail/Fixtures/message-with-template.blade.php @@ -0,0 +1,4 @@ +@component('mail::message') +*Hi* {{ $user->name }} + +@endcomponent diff --git a/tests/Integration/Mail/MailableTest.php b/tests/Integration/Mail/MailableTest.php index 339ebb2422d7..aab253e989a5 100644 --- a/tests/Integration/Mail/MailableTest.php +++ b/tests/Integration/Mail/MailableTest.php @@ -2,14 +2,20 @@ namespace Illuminate\Tests\Integration\Mail; +use Illuminate\Foundation\Auth\User; +use Illuminate\Foundation\Testing\LazilyRefreshDatabase; use Illuminate\Mail\Mailable; use Illuminate\Mail\Mailables\Content; use Illuminate\Mail\Mailables\Envelope; +use Orchestra\Testbench\Attributes\WithMigration; +use Orchestra\Testbench\Factories\UserFactory; use Orchestra\Testbench\TestCase; use PHPUnit\Framework\Attributes\DataProvider; class MailableTest extends TestCase { + use LazilyRefreshDatabase; + /** {@inheritdoc} */ #[\Override] protected function defineEnvironment($app) @@ -69,4 +75,55 @@ public static function markdownEncodedDataProvider() 'My message is: Visit <span>https://laravel.com/docs</span> to browse the documentation', ]; } + + #[WithMigration] + #[DataProvider('markdownEncodedTemplateDataProvider')] + public function testItCanAssertMarkdownEncodedStringUsingTemplate($given, $expected) + { + $user = UserFactory::new()->create([ + 'name' => $given, + ]); + + $mailable = new class($user) extends Mailable + { + public function __construct(public User $user) + { + // + } + + public function build() + { + return $this->markdown('message-with-template'); + } + }; + + $mailable->assertSeeInHtml($expected, false); + } + + public static function markdownEncodedTemplateDataProvider() + { + $hi = 'Hi'; + + yield ['[Laravel](https://laravel.com)', "{$hi} [Laravel](https://laravel.com)"]; + + yield [ + '![Welcome to Laravel](https://laravel.com/assets/img/welcome/background.svg)', + "{$hi} ![Welcome to Laravel](https://laravel.com/assets/img/welcome/background.svg)", + ]; + + yield [ + 'Visit https://laravel.com/docs to browse the documentation', + "{$hi} Visit https://laravel.com/docs to browse the documentation", + ]; + + yield [ + 'Visit to browse the documentation', + "{$hi} Visit <https://laravel.com/docs> to browse the documentation", + ]; + + yield [ + 'Visit https://laravel.com/docs to browse the documentation', + "{$hi} Visit <span>https://laravel.com/docs</span> to browse the documentation", + ]; + } } From e38266f1546249709afbfc30a56ccda9ea3b5455 Mon Sep 17 00:00:00 2001 From: Mior Muhammad Zaki Date: Mon, 24 Mar 2025 14:01:52 +0800 Subject: [PATCH 4/8] wip Signed-off-by: Mior Muhammad Zaki --- src/Illuminate/Mail/Markdown.php | 7 ++++++- src/Illuminate/Mail/resources/views/html/footer.blade.php | 2 +- src/Illuminate/Mail/resources/views/html/subcopy.blade.php | 2 +- src/Illuminate/Mail/resources/views/html/table.blade.php | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/Illuminate/Mail/Markdown.php b/src/Illuminate/Mail/Markdown.php index 592aa70b5210..aa8c533269e4 100644 --- a/src/Illuminate/Mail/Markdown.php +++ b/src/Illuminate/Mail/Markdown.php @@ -130,10 +130,15 @@ public function renderText($view, array $data = []) * Parse the given Markdown text into HTML. * * @param string $text + * @param bool $encoded * @return \Illuminate\Support\HtmlString */ - public static function parse($text) + public static function parse($text, bool $encoded = false) { + if ($encoded === false) { + return new HtmlString(static::converter()->convert($text)->getContent()); + } + EncodedHtmlString::encodeUsing(function ($value) { $replacements = [ '[' => '\[', diff --git a/src/Illuminate/Mail/resources/views/html/footer.blade.php b/src/Illuminate/Mail/resources/views/html/footer.blade.php index ecf614df05ce..3ff41f89cb90 100644 --- a/src/Illuminate/Mail/resources/views/html/footer.blade.php +++ b/src/Illuminate/Mail/resources/views/html/footer.blade.php @@ -3,7 +3,7 @@ diff --git a/src/Illuminate/Mail/resources/views/html/subcopy.blade.php b/src/Illuminate/Mail/resources/views/html/subcopy.blade.php index 999350898dfd..790ce6c2498a 100644 --- a/src/Illuminate/Mail/resources/views/html/subcopy.blade.php +++ b/src/Illuminate/Mail/resources/views/html/subcopy.blade.php @@ -1,7 +1,7 @@ diff --git a/src/Illuminate/Mail/resources/views/html/table.blade.php b/src/Illuminate/Mail/resources/views/html/table.blade.php index 6e582b9b12fe..a5f3348b233a 100644 --- a/src/Illuminate/Mail/resources/views/html/table.blade.php +++ b/src/Illuminate/Mail/resources/views/html/table.blade.php @@ -1,3 +1,3 @@
-{!! Illuminate\Mail\Markdown::parse($slot) !!} +{{ Illuminate\Mail\Markdown::parse($slot) }}
From cec5942c1cd78ae2e7309062d29a43ea472db5a6 Mon Sep 17 00:00:00 2001 From: Mior Muhammad Zaki Date: Mon, 24 Mar 2025 14:04:13 +0800 Subject: [PATCH 5/8] wip Signed-off-by: Mior Muhammad Zaki --- tests/Integration/Mail/MarkdownParserTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Integration/Mail/MarkdownParserTest.php b/tests/Integration/Mail/MarkdownParserTest.php index d21602c9ad00..bf6bd8890d68 100644 --- a/tests/Integration/Mail/MarkdownParserTest.php +++ b/tests/Integration/Mail/MarkdownParserTest.php @@ -24,7 +24,7 @@ public function testItCanParseMarkdownString($given, $expected) #[DataProvider('markdownEncodedDataProvider')] public function testItCanParseMarkdownEncodedString($given, $expected) { - tap(Markdown::parse($given), function ($html) use ($expected) { + tap(Markdown::parse($given, true), function ($html) use ($expected) { $this->assertInstanceOf(HtmlString::class, $html); $this->assertStringEqualsStringIgnoringLineEndings($expected.PHP_EOL, (string) $html); From fd0d9fac6eef065c3d0494728e665285d9427544 Mon Sep 17 00:00:00 2001 From: Mior Muhammad Zaki Date: Mon, 24 Mar 2025 14:14:00 +0800 Subject: [PATCH 6/8] wip Signed-off-by: Mior Muhammad Zaki --- tests/Integration/Mail/MailableTest.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/Integration/Mail/MailableTest.php b/tests/Integration/Mail/MailableTest.php index aab253e989a5..4ff0f539b6ad 100644 --- a/tests/Integration/Mail/MailableTest.php +++ b/tests/Integration/Mail/MailableTest.php @@ -86,6 +86,8 @@ public function testItCanAssertMarkdownEncodedStringUsingTemplate($given, $expec $mailable = new class($user) extends Mailable { + public $theme = 'taylor'; + public function __construct(public User $user) { // @@ -102,28 +104,26 @@ public function build() public static function markdownEncodedTemplateDataProvider() { - $hi = 'Hi'; - - yield ['[Laravel](https://laravel.com)', "{$hi} [Laravel](https://laravel.com)"]; + yield ['[Laravel](https://laravel.com)', 'Hi [Laravel](https://laravel.com)']; yield [ '![Welcome to Laravel](https://laravel.com/assets/img/welcome/background.svg)', - "{$hi} ![Welcome to Laravel](https://laravel.com/assets/img/welcome/background.svg)", + 'Hi ![Welcome to Laravel](https://laravel.com/assets/img/welcome/background.svg)', ]; yield [ 'Visit https://laravel.com/docs to browse the documentation', - "{$hi} Visit https://laravel.com/docs to browse the documentation", + 'Hi Visit https://laravel.com/docs to browse the documentation', ]; yield [ 'Visit to browse the documentation', - "{$hi} Visit <https://laravel.com/docs> to browse the documentation", + 'Hi Visit <https://laravel.com/docs> to browse the documentation', ]; yield [ 'Visit https://laravel.com/docs to browse the documentation', - "{$hi} Visit <span>https://laravel.com/docs</span> to browse the documentation", + 'Hi Visit <span>https://laravel.com/docs</span> to browse the documentation', ]; } } From aa53a492e204fbd85e81e3d10337dfe9666e11dd Mon Sep 17 00:00:00 2001 From: Mior Muhammad Zaki Date: Mon, 24 Mar 2025 14:22:06 +0800 Subject: [PATCH 7/8] wip Signed-off-by: Mior Muhammad Zaki --- tests/Integration/Mail/MarkdownParserTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Integration/Mail/MarkdownParserTest.php b/tests/Integration/Mail/MarkdownParserTest.php index bf6bd8890d68..6669fe038ba3 100644 --- a/tests/Integration/Mail/MarkdownParserTest.php +++ b/tests/Integration/Mail/MarkdownParserTest.php @@ -24,7 +24,7 @@ public function testItCanParseMarkdownString($given, $expected) #[DataProvider('markdownEncodedDataProvider')] public function testItCanParseMarkdownEncodedString($given, $expected) { - tap(Markdown::parse($given, true), function ($html) use ($expected) { + tap(Markdown::parse($given, encoded: true), function ($html) use ($expected) { $this->assertInstanceOf(HtmlString::class, $html); $this->assertStringEqualsStringIgnoringLineEndings($expected.PHP_EOL, (string) $html); From bcbdea03c6921a6255a6d29e9ca0f9e276c7ea0f Mon Sep 17 00:00:00 2001 From: Mior Muhammad Zaki Date: Mon, 24 Mar 2025 19:20:20 +0800 Subject: [PATCH 8/8] Update src/Illuminate/Mail/Markdown.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sebastian Hädrich <11225821+shaedrich@users.noreply.github.com> --- src/Illuminate/Mail/Markdown.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Illuminate/Mail/Markdown.php b/src/Illuminate/Mail/Markdown.php index aa8c533269e4..54c9c2ece372 100644 --- a/src/Illuminate/Mail/Markdown.php +++ b/src/Illuminate/Mail/Markdown.php @@ -76,9 +76,7 @@ function () use ($view, $data) { '>' => '>', ]; - $html = str_replace(array_keys($replacements), array_values($replacements), $value); - - return $html; + return str_replace(array_keys($replacements), array_values($replacements), $value); }); try {