diff --git a/src/Illuminate/Mail/resources/views/html/panel.blade.php b/src/Illuminate/Mail/resources/views/html/panel.blade.php index 812db7c08e77..2975a60a021e 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/Support/EncodedHtmlString.php b/src/Illuminate/Support/EncodedHtmlString.php index 18928e75b633..a25115740277 100644 --- a/src/Illuminate/Support/EncodedHtmlString.php +++ b/src/Illuminate/Support/EncodedHtmlString.php @@ -2,8 +2,19 @@ namespace Illuminate\Support; +use BackedEnum; +use Illuminate\Contracts\Support\DeferringDisplayableValue; +use Illuminate\Contracts\Support\Htmlable; + class EncodedHtmlString extends HtmlString { + /** + * The HTML string. + * + * @var \Illuminate\Contracts\Support\DeferringDisplayableValue|\Illuminate\Contracts\Support\Htmlable|\BackedEnum|string|int|float|null + */ + protected $html; + /** * The callback that should be used to encode the HTML strings. * @@ -14,7 +25,7 @@ class EncodedHtmlString extends HtmlString /** * Create a new encoded HTML string instance. * - * @param string $html + * @param \Illuminate\Contracts\Support\DeferringDisplayableValue|\Illuminate\Contracts\Support\Htmlable|\BackedEnum|string|int|float|null $html * @param bool $doubleEncode * @return void */ @@ -48,9 +59,23 @@ public static function convert($value, bool $withQuote = true, bool $doubleEncod #[\Override] public function toHtml() { + $value = $this->html; + + if ($value instanceof DeferringDisplayableValue) { + $value = $value->resolveDisplayableValue(); + } + + if ($value instanceof Htmlable) { + return $value->toHtml(); + } + + if ($value instanceof BackedEnum) { + $value = $value->value; + } + return (static::$encodeUsingFactory ?? function ($value, $doubleEncode) { return static::convert($value, doubleEncode: $doubleEncode); - })($this->html, $this->doubleEncode); + })($value, $this->doubleEncode); } /** diff --git a/tests/Integration/Mail/Fixtures/table-with-template.blade.php b/tests/Integration/Mail/Fixtures/table-with-template.blade.php new file mode 100644 index 000000000000..3a4ec4c6260e --- /dev/null +++ b/tests/Integration/Mail/Fixtures/table-with-template.blade.php @@ -0,0 +1,12 @@ + + + +*Hi* {{ $user->name }} + +| Laravel | Table | Example | +| ------------- | :-----------: | ------------: | +| Col 2 is | Centered | $10 | +| Col 3 is | Right-Aligned | $20 | + + + diff --git a/tests/Integration/Mail/MailableWithSecuredEncodingTest.php b/tests/Integration/Mail/MailableWithSecuredEncodingTest.php index a84fd487c20d..9feb03886335 100644 --- a/tests/Integration/Mail/MailableWithSecuredEncodingTest.php +++ b/tests/Integration/Mail/MailableWithSecuredEncodingTest.php @@ -116,6 +116,56 @@ public function build() $mailable->assertSeeInHtml($expected, false); } + #[WithMigration] + #[DataProvider('markdownEncodedTemplateDataProvider')] + public function testItCanAssertMarkdownEncodedStringUsingTemplateWithTable($given, $expected) + { + $user = UserFactory::new()->create([ + 'name' => $given, + ]); + + $mailable = new class($user) extends Mailable + { + public $theme = 'taylor'; + + public function __construct(public User $user) + { + // + } + + public function build() + { + return $this->markdown('table-with-template'); + } + }; + + $mailable->assertSeeInHtml($expected, false); + $mailable->assertSeeInHtml('

This is a subcopy

', false); + $mailable->assertSeeInHtml(<<<'TABLE' + + + + + + + + + + + + + + + + + + + + +
LaravelTableExample
Col 2 isCentered$10
Col 3 isRight-Aligned$20
+TABLE, false); + } + public static function markdownEncodedTemplateDataProvider() { yield ['[Laravel](https://laravel.com)', 'Hi [Laravel](https://laravel.com)']; diff --git a/tests/Integration/Mail/MailableWithoutSecuredEncodingTest.php b/tests/Integration/Mail/MailableWithoutSecuredEncodingTest.php index 52db775cefae..aea392c520ca 100644 --- a/tests/Integration/Mail/MailableWithoutSecuredEncodingTest.php +++ b/tests/Integration/Mail/MailableWithoutSecuredEncodingTest.php @@ -116,6 +116,56 @@ public function build() $mailable->assertSeeInHtml($expected, false); } + #[WithMigration] + #[DataProvider('markdownEncodedTemplateDataProvider')] + public function testItCanAssertMarkdownEncodedStringUsingTemplateWithTable($given, $expected) + { + $user = UserFactory::new()->create([ + 'name' => $given, + ]); + + $mailable = new class($user) extends Mailable + { + public $theme = 'taylor'; + + public function __construct(public User $user) + { + // + } + + public function build() + { + return $this->markdown('table-with-template'); + } + }; + + $mailable->assertSeeInHtml($expected, false); + $mailable->assertSeeInHtml('

This is a subcopy

', false); + $mailable->assertSeeInHtml(<<<'TABLE' + + + + + + + + + + + + + + + + + + + + +
LaravelTableExample
Col 2 isCentered$10
Col 3 isRight-Aligned$20
+TABLE, false); + } + public static function markdownEncodedTemplateDataProvider() { yield ['[Laravel](https://laravel.com)', '

Hi Laravel

']; diff --git a/tests/Integration/Mail/MarkdownParserTest.php b/tests/Integration/Mail/MarkdownParserTest.php index 7ff74ae21eb3..16910e79fd18 100644 --- a/tests/Integration/Mail/MarkdownParserTest.php +++ b/tests/Integration/Mail/MarkdownParserTest.php @@ -76,6 +76,11 @@ public static function markdownEncodedDataProvider() '

Visit <span>https://laravel.com/docs</span> to browse the documentation

', ]; + yield [ + new EncodedHtmlString(new HtmlString('Visit https://laravel.com/docs to browse the documentation')), + '

Visit https://laravel.com/docs to browse the documentation

', + ]; + yield [ '![Welcome to Laravel](https://laravel.com/assets/img/welcome/background.svg)
'.new EncodedHtmlString('Visit https://laravel.com/docs to browse the documentation'), '

Welcome to Laravel
Visit <span>https://laravel.com/docs</span> to browse the documentation

',