Initial commit

This commit is contained in:
gustavooth
2026-07-23 22:56:30 -03:00
commit 22a1006598
1816 changed files with 410742 additions and 0 deletions
@@ -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;
}
}