diff --git a/config/css-inliner.php b/config/css-inliner.php index b45f64c..d9471f3 100644 --- a/config/css-inliner.php +++ b/config/css-inliner.php @@ -15,4 +15,16 @@ 'css-files' => [], + /* + |-------------------------------------------------------------------------- + | Css Content + |-------------------------------------------------------------------------- + | + | Optionally, you may prefer to provide the CSS content as a String. + | This allows for compatibility with Vite by using Vite::content() + | If supplied, this string will be appended after your css-files. + | + */ + + 'css-content' => null, ]; diff --git a/src/CssInlinerPlugin.php b/src/CssInlinerPlugin.php index cb15dc4..b5247a7 100644 --- a/src/CssInlinerPlugin.php +++ b/src/CssInlinerPlugin.php @@ -8,20 +8,23 @@ use Symfony\Component\Mailer\Event\MessageEvent; use Symfony\Component\Mime\Part\AbstractPart; use Symfony\Component\Mime\Part\AbstractMultipartPart; -use Symfony\Component\Mime\Part\Multipart\AlternativePart; -use Symfony\Component\Mime\Part\Multipart\MixedPart; use Symfony\Component\Mime\Part\TextPart; use TijsVerkoyen\CssToInlineStyles\CssToInlineStyles; class CssInlinerPlugin { + private array $config; + private CssToInlineStyles $converter; private string $cssToAlwaysInclude; - public function __construct(array $filesToInline = [], ?CssToInlineStyles $converter = null) + public function __construct(array $config, ?CssToInlineStyles $converter = null) { - $this->cssToAlwaysInclude = $this->loadCssFromFiles($filesToInline); + + $this->config = $config; + + $this->buildCssContent(); $this->converter = $converter ?? new CssToInlineStyles; } @@ -48,6 +51,30 @@ public function handleSymfonyEvent(MessageEvent $event): void $this->handleSymfonyEmail($message); } + private function buildCssContent(): void + { + $this->addCssFromFiles(); + $this->addCssFromContent(); + } + + private function addCssFromFiles(): void + { + $filesToInline = $this->config['css-files'] ?? []; + + $this->cssToAlwaysInclude = $this->loadCssFromFiles($filesToInline); + } + + private function addCssFromContent(): void + { + $contentToInline = $this->config['css-content'] ?? null; + + if (! $contentToInline) { + return; + } + + $this->cssToAlwaysInclude .= $contentToInline; + } + private function processPart(AbstractPart $part): AbstractPart { if ($part instanceof TextPart && $part->getMediaType() === 'text' && $part->getMediaSubtype() === 'html') { diff --git a/src/LaravelMailCssInlinerServiceProvider.php b/src/LaravelMailCssInlinerServiceProvider.php index b2376bd..612507a 100644 --- a/src/LaravelMailCssInlinerServiceProvider.php +++ b/src/LaravelMailCssInlinerServiceProvider.php @@ -28,7 +28,7 @@ public function register(): void $this->mergeConfigFrom(__DIR__ . '/../config/css-inliner.php', 'css-files'); $this->app->singleton(CssInlinerPlugin::class, function ($app) { - return new CssInlinerPlugin($app['config']->get('css-inliner.css-files', [])); + return new CssInlinerPlugin($app['config']->get('css-inliner', [])); }); Event::listen(MessageSending::class, CssInlinerPlugin::class); diff --git a/tests/CssInlinerPluginTest.php b/tests/CssInlinerPluginTest.php index 32949d3..50ac0ef 100644 --- a/tests/CssInlinerPluginTest.php +++ b/tests/CssInlinerPluginTest.php @@ -85,6 +85,17 @@ public function test_it_should_convert_html_body_with_given_css(): void $this->assertBodyMatchesStub($message, 'converted-html-with-css'); } + public function test_it_should_convert_html_body_with_given_css_content(): void + { + $message = $this->fakeSendMessageUsingInlinePlugin( + (new Email)->html($this->stubs['original-html-with-css']), + [], + file_get_contents(__DIR__ . '/css/test.css') + ); + + $this->assertBodyMatchesStub($message, 'converted-html-with-css'); + } + public function test_it_should_convert_html_body_with_given_css_and_attachment(): void { $originalMessage = $this->createMessageToSend( @@ -305,13 +316,16 @@ private function getTextFromPart(AbstractPart $part, string $mediaSubType = 'htm return null; } - private function fakeSendMessageUsingInlinePlugin(Email $message, array $inlineCssFiles = []): Email + private function fakeSendMessageUsingInlinePlugin(Email $message, array $inlineCssFiles = [], string $inlineCssContent = null): Email { $processedMessage = null; $dispatcher = new EventDispatcher; - $dispatcher->addListener(MessageEvent::class, static function (MessageEvent $event) use ($inlineCssFiles, &$processedMessage) { - $handler = new CssInlinerPlugin($inlineCssFiles); + $dispatcher->addListener(MessageEvent::class, static function (MessageEvent $event) use ($inlineCssFiles, $inlineCssContent, &$processedMessage) { + $handler = new CssInlinerPlugin([ + 'css-files' => $inlineCssFiles, + 'css-content' => $inlineCssContent, + ]); $handler->handleSymfonyEvent($event);