public function Emogrifier::emogrify in HTML Mail 5
Same name and namespace in other branches
- 6 emogrifier/emogrifier.php \Emogrifier::emogrify()
File
- emogrifier/emogrifier.php, line 69
- CSS to Inline Converter Class
Class
- Emogrifier
Code
public function emogrify() {
$body = $this->html;
if (count($this->unprocessableHTMLTags)) {
$unprocessableHTMLTags = implode('|', $this->unprocessableHTMLTags);
$body = preg_replace("/<({$unprocessableHTMLTags})[^>]*>/i", '', $body);
}
$xmldoc = new DOMDocument();
$xmldoc->strictErrorChecking = false;
$xmldoc->formatOutput = true;
$xmldoc
->loadHTML($body);
$xmldoc
->normalizeDocument();
$xpath = new DOMXPath($xmldoc);
$re_commentCSS = '/\\/\\*.*\\*\\//sU';
$css = preg_replace($re_commentCSS, '', $this->css);
$re_CSS = '/^\\s*([^{]+){([^}]+)}/mis';
preg_match_all($re_CSS, $css, $matches);
foreach ($matches[1] as $key => $selectorString) {
if (!strlen(trim($matches[2][$key]))) {
continue;
}
$selectors = explode(',', $selectorString);
foreach ($selectors as $selector) {
if (strpos($selector, ':') !== false) {
continue;
}
$nodes = $xpath
->query($this
->translateCSStoXpath(trim($selector)));
foreach ($nodes as $node) {
if ($node
->hasAttribute('style')) {
$style = $node
->getAttribute('style');
$oldStyleArr = $this
->cssStyleDefinitionToArray($node
->getAttribute('style'));
$newStyleArr = $this
->cssStyleDefinitionToArray($matches[2][$key]);
$combinedArr = array_merge($oldStyleArr, $newStyleArr);
$style = '';
foreach ($combinedArr as $k => $v) {
$style .= $k . ':' . $v . ';';
}
}
else {
$style = trim($matches[2][$key]);
}
$node
->setAttribute('style', $style);
}
}
}
$nodes = $xpath
->query('//*[contains(translate(@style," ",""),"display:none;")]');
foreach ($nodes as $node) {
$node->parentNode
->removeChild($node);
}
return $xmldoc
->saveHTML();
}