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

feat: refactor

parent bf1b3c6f
No related branches found
No related tags found
2 merge requests!5Devel,!4Refactor/templates
Pipeline #406283 passed with warnings with stages
in 30 seconds
...@@ -164,7 +164,7 @@ class Email { ...@@ -164,7 +164,7 @@ class Email {
/** /**
* @return string * @return string
*/ */
public function set_content_type( $type = 'html' ): self { public function set_content_type( $type ): self {
switch ( $type ) { switch ( $type ) {
case 'plain': case 'plain':
$content_type = 'text/plain'; $content_type = 'text/plain';
...@@ -200,12 +200,21 @@ class Email { ...@@ -200,12 +200,21 @@ class Email {
return $this->content; return $this->content;
} }
/**
* @param string $name
* @param string $value
*
* @return $this
*/
public function set_template_attributes( string $name, string $value ): self { public function set_template_attributes( string $name, string $value ): self {
$this->template_attributes[ $name ] = $value; $this->template_attributes[ $name ] = $value;
return $this; return $this;
} }
/**
* @return array
*/
public function get_template_attributes(): array { public function get_template_attributes(): array {
return $this->template_attributes; return $this->template_attributes;
} }
......
<?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 @@ ...@@ -2,11 +2,20 @@
namespace WPDesk\Library\WPEmail; 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; use WPDesk\View\Renderer\Renderer;
class Template { class Template {
/**
* @var LoggerInterface
*/
private $logger;
/** /**
* @var Renderer * @var Renderer
*/ */
...@@ -17,7 +26,8 @@ class Template { ...@@ -17,7 +26,8 @@ class Template {
*/ */
private $template_attributes; 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->renderer = $renderer;
$this->template_attributes = wp_parse_args( $template_attributes, $this->get_default_template_attributes() ); $this->template_attributes = wp_parse_args( $template_attributes, $this->get_default_template_attributes() );
} }
...@@ -38,7 +48,7 @@ class Template { ...@@ -38,7 +48,7 @@ class Template {
public function css_inline( string $content ): string { public function css_inline( string $content ): string {
$styles = $this->renderer->render( 'html/email-styles', $this->template_attributes ); $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 { public function get_default_template_attributes(): array {
...@@ -53,4 +63,23 @@ class Template { ...@@ -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 @@ ...@@ -3,6 +3,8 @@
namespace WPDesk\Library\WPEmail; namespace WPDesk\Library\WPEmail;
use Exception; use Exception;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerInterface;
use WP_Error; use WP_Error;
use WPDesk\Library\WPEmail\Abstracts\Email; use WPDesk\Library\WPEmail\Abstracts\Email;
use WPDesk\Library\WPEmail\Abstracts\Mailer; use WPDesk\Library\WPEmail\Abstracts\Mailer;
...@@ -14,12 +16,22 @@ use WPDesk\View\Resolver\DirResolver; ...@@ -14,12 +16,22 @@ use WPDesk\View\Resolver\DirResolver;
class WPMailer implements Mailer { class WPMailer implements Mailer {
/**
* @var LoggerInterface
*/
private $logger;
/** /**
* @var Renderer * @var Renderer
*/ */
private $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 = new ChainResolver();
$resolver->appendResolver( new DirResolver( __DIR__ . '/templates' ) ); $resolver->appendResolver( new DirResolver( __DIR__ . '/templates' ) );
$renderer = new SimplePhpRenderer( $resolver ); $renderer = new SimplePhpRenderer( $resolver );
...@@ -53,7 +65,7 @@ class WPMailer implements Mailer { ...@@ -53,7 +65,7 @@ class WPMailer implements Mailer {
); );
add_action( 'wp_mail_failed', [ $this, 'catch_error' ] ); 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 { try {
$success = wp_mail( $success = wp_mail(
...@@ -84,4 +96,5 @@ class WPMailer implements Mailer { ...@@ -84,4 +96,5 @@ class WPMailer implements Mailer {
throw MailerException::with_wp_error( $error ); throw MailerException::with_wp_error( $error );
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment