public function Emogrifier::emogrify in HTML Mail 6        
                          
                  
                        Same name and namespace in other branches
- 5 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();
}