Skip to content

Commit fed312b

Browse files
committed
Add CSS content support - Fixes #319
1 parent 34e1a92 commit fed312b

File tree

4 files changed

+61
-8
lines changed

4 files changed

+61
-8
lines changed

config/css-inliner.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,16 @@
1515

1616
'css-files' => [],
1717

18+
/*
19+
|--------------------------------------------------------------------------
20+
| Css Content
21+
|--------------------------------------------------------------------------
22+
|
23+
| Optionally, you may prefer to provide the CSS content as a String.
24+
| This allows for compatibility with Vite by using Vite::content()
25+
| If supplied, this string will be appended after your css-files.
26+
|
27+
*/
28+
29+
'css-content' => null,
1830
];

src/CssInlinerPlugin.php

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,23 @@
88
use Symfony\Component\Mailer\Event\MessageEvent;
99
use Symfony\Component\Mime\Part\AbstractPart;
1010
use Symfony\Component\Mime\Part\AbstractMultipartPart;
11-
use Symfony\Component\Mime\Part\Multipart\AlternativePart;
12-
use Symfony\Component\Mime\Part\Multipart\MixedPart;
1311
use Symfony\Component\Mime\Part\TextPart;
1412
use TijsVerkoyen\CssToInlineStyles\CssToInlineStyles;
1513

1614
class CssInlinerPlugin
1715
{
16+
private array $config;
17+
1818
private CssToInlineStyles $converter;
1919

2020
private string $cssToAlwaysInclude;
2121

22-
public function __construct(array $filesToInline = [], ?CssToInlineStyles $converter = null)
22+
public function __construct(array $config, ?CssToInlineStyles $converter = null)
2323
{
24-
$this->cssToAlwaysInclude = $this->loadCssFromFiles($filesToInline);
24+
25+
$this->config = $config;
26+
27+
$this->buildCssContent();
2528

2629
$this->converter = $converter ?? new CssToInlineStyles;
2730
}
@@ -48,6 +51,30 @@ public function handleSymfonyEvent(MessageEvent $event): void
4851
$this->handleSymfonyEmail($message);
4952
}
5053

54+
private function buildCssContent(): void
55+
{
56+
$this->addCssFromFiles();
57+
$this->addCssFromContent();
58+
}
59+
60+
private function addCssFromFiles(): void
61+
{
62+
$filesToInline = $this->config['css-files'] ?? [];
63+
64+
$this->cssToAlwaysInclude = $this->loadCssFromFiles($filesToInline);
65+
}
66+
67+
private function addCssFromContent(): void
68+
{
69+
$contentToInline = $this->config['css-content'] ?? null;
70+
71+
if (! $contentToInline) {
72+
return;
73+
}
74+
75+
$this->cssToAlwaysInclude .= $contentToInline;
76+
}
77+
5178
private function processPart(AbstractPart $part): AbstractPart
5279
{
5380
if ($part instanceof TextPart && $part->getMediaType() === 'text' && $part->getMediaSubtype() === 'html') {

src/LaravelMailCssInlinerServiceProvider.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public function register(): void
2828
$this->mergeConfigFrom(__DIR__ . '/../config/css-inliner.php', 'css-files');
2929

3030
$this->app->singleton(CssInlinerPlugin::class, function ($app) {
31-
return new CssInlinerPlugin($app['config']->get('css-inliner.css-files', []));
31+
return new CssInlinerPlugin($app['config']->get('css-inliner', []));
3232
});
3333

3434
Event::listen(MessageSending::class, CssInlinerPlugin::class);

tests/CssInlinerPluginTest.php

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,17 @@ public function test_it_should_convert_html_body_with_given_css(): void
8585
$this->assertBodyMatchesStub($message, 'converted-html-with-css');
8686
}
8787

88+
public function test_it_should_convert_html_body_with_given_css_content(): void
89+
{
90+
$message = $this->fakeSendMessageUsingInlinePlugin(
91+
(new Email)->html($this->stubs['original-html-with-css']),
92+
[],
93+
file_get_contents(__DIR__ . '/css/test.css')
94+
);
95+
96+
$this->assertBodyMatchesStub($message, 'converted-html-with-css');
97+
}
98+
8899
public function test_it_should_convert_html_body_with_given_css_and_attachment(): void
89100
{
90101
$originalMessage = $this->createMessageToSend(
@@ -305,13 +316,16 @@ private function getTextFromPart(AbstractPart $part, string $mediaSubType = 'htm
305316
return null;
306317
}
307318

308-
private function fakeSendMessageUsingInlinePlugin(Email $message, array $inlineCssFiles = []): Email
319+
private function fakeSendMessageUsingInlinePlugin(Email $message, array $inlineCssFiles = [], string $inlineCssContent = null): Email
309320
{
310321
$processedMessage = null;
311322

312323
$dispatcher = new EventDispatcher;
313-
$dispatcher->addListener(MessageEvent::class, static function (MessageEvent $event) use ($inlineCssFiles, &$processedMessage) {
314-
$handler = new CssInlinerPlugin($inlineCssFiles);
324+
$dispatcher->addListener(MessageEvent::class, static function (MessageEvent $event) use ($inlineCssFiles, $inlineCssContent, &$processedMessage) {
325+
$handler = new CssInlinerPlugin([
326+
'css-files' => $inlineCssFiles,
327+
'css-content' => $inlineCssContent,
328+
]);
315329

316330
$handler->handleSymfonyEvent($event);
317331

0 commit comments

Comments
 (0)