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'
+
+
+
+| Laravel |
+Table |
+Example |
+
+
+
+
+| Col 2 is |
+Centered |
+$10 |
+
+
+| Col 3 is |
+Right-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'
+
+
+
+| Laravel |
+Table |
+Example |
+
+
+
+
+| Col 2 is |
+Centered |
+$10 |
+
+
+| Col 3 is |
+Right-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 [
'
'.new EncodedHtmlString('Visit https://laravel.com/docs to browse the documentation'),
'
Visit <span>https://laravel.com/docs</span> to browse the documentation
',