Initial commit
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
namespace FluentCrm\App\Services\Libs\Emogrifier;
|
||||
|
||||
|
||||
class Emogrifier
|
||||
{
|
||||
private $html = '';
|
||||
|
||||
private $disableInvisibleNode = false;
|
||||
|
||||
public function __construct($html)
|
||||
{
|
||||
$this->html = (string) $html;
|
||||
}
|
||||
|
||||
public function disableInvisibleNodeRemoval()
|
||||
{
|
||||
$this->disableInvisibleNode = true;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function emogrify()
|
||||
{
|
||||
if (!class_exists('\FluentEmogrifier\Vendor\TijsVerkoyen\CssToInlineStyles\CssToInlineStyles')) {
|
||||
require_once __DIR__ . '/scoped-vendor/autoload.php';
|
||||
}
|
||||
|
||||
return $this->handleTijsVerkoyen();
|
||||
}
|
||||
|
||||
private function handleTijsVerkoyen()
|
||||
{
|
||||
$css = '';
|
||||
$html = $this->html;
|
||||
|
||||
if (preg_match_all('/<style[^>]*>(.*?)<\/style>/si', $html, $matches)) {
|
||||
$css = implode("\n", $matches[1]);
|
||||
$html = preg_replace('/<style[^>]*>.*?<\/style>/si', '', $html);
|
||||
}
|
||||
|
||||
// Preserve @media queries — TijsVerkoyen strips them during CSS processing
|
||||
// but email clients like Apple Mail and Gmail support them for responsive layouts.
|
||||
// Regex handles both spaced (@media screen) and minified (@media(max-width:600px)) forms.
|
||||
$mediaBlocks = '';
|
||||
if (preg_match_all('/@media\s*[^{]*\{(?:[^{}]*\{[^{}]*\})*[^{}]*\}/s', $css, $mediaMatches)) {
|
||||
$mediaBlocks = implode("\n", $mediaMatches[0]);
|
||||
}
|
||||
|
||||
$inliner = new \FluentEmogrifier\Vendor\TijsVerkoyen\CssToInlineStyles\CssToInlineStyles();
|
||||
$result = $inliner->convert($html, $css);
|
||||
|
||||
// Re-inject @media blocks for responsive email support
|
||||
if ($mediaBlocks) {
|
||||
$styleTag = '<style type="text/css">' . $mediaBlocks . '</style>';
|
||||
|
||||
if (stripos($result, '</head>') !== false) {
|
||||
$result = str_ireplace('</head>', $styleTag . '</head>', $result);
|
||||
} elseif (stripos($result, '<body') !== false) {
|
||||
$result = preg_replace('/<body/i', $styleTag . '<body', $result, 1);
|
||||
} else {
|
||||
$result = $styleTag . $result;
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user