Skip to content
Snippets Groups Projects
Commit 1da2b65e authored by Piotr Potrebka's avatar Piotr Potrebka
Browse files

Merge branch 'refactor/templates' into 'devel'

Refactor/templates

See merge request !4
parents e73a91bc 4c9c4b8b
No related branches found
No related tags found
2 merge requests!5Devel,!4Refactor/templates
Pipeline #430154 failed
......@@ -106,7 +106,7 @@ class Email {
*
* @return self
*/
public function set_recipients( array $recipients = [] ): self {
public function set_recipients( array $recipients ): self {
$this->recipients = $recipients;
return $this;
......@@ -164,7 +164,7 @@ class Email {
/**
* @return string
*/
public function set_content_type( $type = 'html' ): self {
public function set_content_type( $type ): self {
switch ( $type ) {
case 'plain':
$content_type = 'text/plain';
......@@ -200,12 +200,21 @@ class Email {
return $this->content;
}
/**
* @param string $name
* @param string $value
*
* @return $this
*/
public function set_template_attributes( string $name, string $value ): self {
$this->template_attributes[ $name ] = $value;
return $this;
}
/**
* @return array
*/
public function get_template_attributes(): array {
return $this->template_attributes;
}
......
......@@ -11,7 +11,7 @@ class ColorConversion {
*
* @return bool True if a light color.
*/
public static function is_hex_light( $color ) {
public static function is_hex_light( $color ): bool {
$hex = str_replace( '#', '', $color );
$c_r = hexdec( substr( $hex, 0, 2 ) );
......@@ -31,11 +31,11 @@ class ColorConversion {
/**
* Convert RGB to HEX.
*
* @param mixed $color Color.
* @param string $color Color.
*
* @return array
*/
public static function rgb_from_hex( $color ) {
public static function rgb_from_hex( string $color ): array {
$color = str_replace( '#', '', $color );
// Convert shorthand colors to full format, e.g. "FFF" -> "FFFFFF".
$color = preg_replace( '~^(.)(.)(.)$~', '$1$1$2$2$3$3', $color );
......@@ -52,17 +52,17 @@ class ColorConversion {
/**
* Make HEX color darker.
*
* @param mixed $color Color.
* @param string $color Color.
* @param int $factor Darker factor.
* Defaults to 30.
*
* @return string
*/
public static function hex_darker( $color, $factor = 30 ) {
public static function hex_darker( string $color, int $factor = 30 ): string {
$base = self::rgb_from_hex( $color );
$color = '#';
foreach ( $base as $k => $v ) {
foreach ( $base as $v ) {
$amount = $v / 100;
$amount = self::round( $amount * $factor );
$new_decimal = $v - $amount;
......@@ -81,17 +81,17 @@ class ColorConversion {
/**
* Make HEX color lighter.
*
* @param mixed $color Color.
* @param string $color Color.
* @param int $factor Lighter factor.
* Defaults to 30.
*
* @return string
*/
public static function hex_lighter( $color, $factor = 30 ) {
public static function hex_lighter( string $color, int $factor = 30 ): string {
$base = self::rgb_from_hex( $color );
$color = '#';
foreach ( $base as $k => $v ) {
foreach ( $base as $v ) {
$amount = 255 - $v;
$amount = $amount / 100;
$amount = self::round( $amount * $factor );
......
<?php
namespace WPDesk\Library\WPEmail\Helpers;
use Pelago\Emogrifier\CssInliner;
use Pelago\Emogrifier\HtmlProcessor\CssToAttributeConverter;
use Pelago\Emogrifier\HtmlProcessor\HtmlPruner;
class StyleInliner {
public static function inline( string $content, string $styles = '' ): string {
if ( class_exists( 'DOMDocument' ) ) {
try {
$css_inliner = CssInliner::fromHtml( $content )->inlineCss( $styles );
$dom_document = $css_inliner->getDomDocument();
HtmlPruner::fromDomDocument( $dom_document )->removeElementsWithDisplayNone();
$content = CssToAttributeConverter::fromDomDocument( $dom_document )
->convertCssToVisualAttributes()
->render();
} catch ( \Exception $e ) {
error_log( $e->getMessage() );
}
} else {
$content = '<style>' . strip_tags( $styles ) . '</style>' . $content;
}
return $content;
}
/**
* @return array|string|string[]
*/
protected function replace_placeholders( string $string ): string {
if ( empty( $this->placeholders ) ) {
return $string;
}
return (string) str_replace( array_keys( $this->placeholders ), array_values( $this->placeholders ), $string );
}
}
......@@ -2,11 +2,20 @@
namespace WPDesk\Library\WPEmail;
use WPDesk\Library\WPEmail\Helpers\StyleInliner;
use Exception;
use Pelago\Emogrifier\CssInliner;
use Pelago\Emogrifier\HtmlProcessor\CssToAttributeConverter;
use Pelago\Emogrifier\HtmlProcessor\HtmlPruner;
use Psr\Log\LoggerInterface;
use WPDesk\View\Renderer\Renderer;
class Template {
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var Renderer
*/
......@@ -17,7 +26,8 @@ class Template {
*/
private $template_attributes;
public function __construct( Renderer $renderer, array $template_attributes ) {
public function __construct( LoggerInterface $logger, Renderer $renderer, array $template_attributes ) {
$this->logger = $logger;
$this->renderer = $renderer;
$this->template_attributes = wp_parse_args( $template_attributes, $this->get_default_template_attributes() );
}
......@@ -38,7 +48,7 @@ class Template {
public function css_inline( string $content ): string {
$styles = $this->renderer->render( 'html/email-styles', $this->template_attributes );
return StyleInliner::inline( $content, $styles );
return $this->convert_css( $content, $styles );
}
public function get_default_template_attributes(): array {
......@@ -53,4 +63,23 @@ class Template {
];
}
public function convert_css( string $content, string $styles = '' ): string {
if ( class_exists( 'DOMDocument' ) ) {
try {
$css_inliner = CssInliner::fromHtml( $content )->inlineCss( $styles );
$dom_document = $css_inliner->getDomDocument();
HtmlPruner::fromDomDocument( $dom_document )->removeElementsWithDisplayNone();
$content = CssToAttributeConverter::fromDomDocument( $dom_document )->convertCssToVisualAttributes()->render();
} catch ( Exception $e ) {
$this->logger->debug( $e->getMessage() );
return $content;
}
} else {
$content = '<style>' . strip_tags( $styles ) . '</style>' . $content;
}
return $content;
}
}
......@@ -3,6 +3,8 @@
namespace WPDesk\Library\WPEmail;
use Exception;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerInterface;
use WP_Error;
use WPDesk\Library\WPEmail\Abstracts\Email;
use WPDesk\Library\WPEmail\Abstracts\Mailer;
......@@ -14,12 +16,22 @@ use WPDesk\View\Resolver\DirResolver;
class WPMailer implements Mailer {
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var Renderer
*/
private $renderer;
public function __construct() {
public function __construct( LoggerInterface $logger ) {
$this->logger = $logger;
$this->init_renderer();
}
public function init_renderer() {
$resolver = new ChainResolver();
$resolver->appendResolver( new DirResolver( __DIR__ . '/templates' ) );
$renderer = new SimplePhpRenderer( $resolver );
......@@ -53,7 +65,7 @@ class WPMailer implements Mailer {
);
add_action( 'wp_mail_failed', [ $this, 'catch_error' ] );
$email_template = new Template( $this->renderer, $email->get_template_attributes() );
$email_template = new Template( $this->logger, $this->get_renderer(), $email->get_template_attributes() );
try {
$success = wp_mail(
......@@ -84,4 +96,5 @@ class WPMailer implements Mailer {
throw MailerException::with_wp_error( $error );
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment