70 lines
2.1 KiB
PHP
70 lines
2.1 KiB
PHP
<?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;
|
|
}
|
|
|
|
}
|