diff --git a/CHANGELOG.md b/CHANGELOG.md index 963197d54b41886aab3393497ffd17a0ae8787d1..43c9080c06ee1fd60408decf3aa6f88fcf0595fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,3 @@ -## [1.0.0] - 2023-03-06 +## [1.0.0] - 2024-10-23 ### Added - init diff --git a/composer.json b/composer.json index 672f320aa37e59bdd196d713529ff9fb25ce8e1a..ab66cd5d55f5be9723412e06c5d8cee477d3f70b 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,7 @@ "config": { "sort-packages": true, "platform": { - "php": "7.3" + "php": "7.4" }, "allow-plugins": { "dealerdirect/phpcodesniffer-composer-installer": true, @@ -29,7 +29,7 @@ } }, "require": { - "php": ">=7.3", + "php": ">=7.4", "psr/log": "^1.1.0", "wpdesk/wp-persistence": "^3.0", "wpdesk/wp-view": "^2.0", @@ -41,7 +41,7 @@ "require-dev": { "10up/wp_mock": "*", "mockery/mockery": "*", - "phpunit/phpunit": "<7" + "phpunit/phpunit": "^9" }, "autoload": { "psr-4": { diff --git a/src/Abstracts/Email.php b/src/Abstracts/Email.php index d21f2bb7ec8f7d3bc2af47af6a784e82d8444959..a9403d79978855fb21383f871662d5efb0b2c363 100644 --- a/src/Abstracts/Email.php +++ b/src/Abstracts/Email.php @@ -9,42 +9,42 @@ class Email { /** * @var array */ - private $recipients = []; + private array $recipients = []; /** * @var string */ - private $subject = ''; + private string $subject = ''; /** * @var array */ - private $attachments = []; + private array $attachments = []; /** * @var string */ - private $content = ''; + private string $content = ''; /** * @var array */ - private $headers = [ 'Content-Type' => 'text/html' ]; + private array $headers = [ 'Content-Type' => 'text/html' ]; /** * @var string */ - private $from_email; + private string $from_email; /** * @var string */ - private $from_name; + private string $from_name; /** * @var array */ - private $template_attributes; + private array $template_attributes; /** * @param string $from_email @@ -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; @@ -162,9 +162,11 @@ class Email { } /** - * @return string + * @param $type + * + * @return Email */ - 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 +202,20 @@ class Email { return $this->content; } - public function set_template_attributes( string $name, string $value ): self { - $this->template_attributes[ $name ] = $value; + /** + * @param array $template_attributes + * + * @return $this + */ + public function set_template_attributes( array $template_attributes ): self { + $this->template_attributes= $template_attributes; return $this; } + /** + * @return array + */ public function get_template_attributes(): array { return $this->template_attributes; } diff --git a/src/Exceptions/MailerException.php b/src/Exceptions/MailerException.php index 6c005cd4975cdb253742004f5b71ce244db0c1b5..b406220f61ce7d1498e3b745ae350a606107165f 100644 --- a/src/Exceptions/MailerException.php +++ b/src/Exceptions/MailerException.php @@ -4,9 +4,12 @@ declare( strict_types=1 ); namespace WPDesk\Library\WPEmail\Exceptions; -class MailerException extends \RuntimeException { +use RuntimeException; +use WP_Error; - public static function with_wp_error( \WP_Error $error ): self { +class MailerException extends RuntimeException { + + public static function with_wp_error( WP_Error $error ): self { $errors = $error->get_error_messages( 'wp_mail_failed' ); $message = implode( "\n", $errors ); diff --git a/src/Helpers/ColorConversion.php b/src/Helpers/ColorConversion.php index e8242ee402eaa058e124241c4dbda8d4a13337d5..2be755f039299e8c3313f796c41046268502b1ff 100644 --- a/src/Helpers/ColorConversion.php +++ b/src/Helpers/ColorConversion.php @@ -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 int $factor Lighter factor. + * @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 ); diff --git a/src/Helpers/StyleInliner.php b/src/Helpers/StyleInliner.php deleted file mode 100644 index 9068deeddfad4b16d4da360d196d05c1035b2ae7..0000000000000000000000000000000000000000 --- a/src/Helpers/StyleInliner.php +++ /dev/null @@ -1,41 +0,0 @@ -<?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 ); - } - -} diff --git a/src/Template.php b/src/Template.php index c0c66bac330d0f71b66e69ed4a8d03f94b97eab2..d6e127257ad74de48b89d3007ea6381e087b4d42 100644 --- a/src/Template.php +++ b/src/Template.php @@ -2,22 +2,32 @@ 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 LoggerInterface $logger; + /** * @var Renderer */ - private $renderer; + private Renderer $renderer; /** * @var array */ - private $template_attributes; + private array $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; + } + } diff --git a/src/WPMailer.php b/src/WPMailer.php index 9097fc757c20f9c4be16808d4d7d382b49a21ae1..9247ddcfabfc7efa87e541fc8dc2da857d7a0efc 100644 --- a/src/WPMailer.php +++ b/src/WPMailer.php @@ -3,6 +3,7 @@ namespace WPDesk\Library\WPEmail; use Exception; +use Psr\Log\LoggerInterface; use WP_Error; use WPDesk\Library\WPEmail\Abstracts\Email; use WPDesk\Library\WPEmail\Abstracts\Mailer; @@ -14,14 +15,24 @@ use WPDesk\View\Resolver\DirResolver; class WPMailer implements Mailer { + /** + * @var LoggerInterface + */ + private LoggerInterface $logger; + /** * @var Renderer */ - private $renderer; + private Renderer $renderer; + + public function __construct( LoggerInterface $logger ) { + $this->logger = $logger; + $this->init_renderer(); + } - public function __construct() { + public function init_renderer() { $resolver = new ChainResolver(); - $resolver->appendResolver( new DirResolver( __DIR__ . '/templates' ) ); + $resolver->appendResolver( new DirResolver( dirname( __DIR__ ) . '/templates' ) ); $renderer = new SimplePhpRenderer( $resolver ); $this->set_renderer( $renderer ); } @@ -34,7 +45,11 @@ class WPMailer implements Mailer { return $this->renderer; } - /** @return void */ + /** + * @param Email $email + * + * @return void + */ public function send( Email $email ): void { $mailer_from = $email->get_from(); add_filter( @@ -53,7 +68,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 +99,5 @@ class WPMailer implements Mailer { throw MailerException::with_wp_error( $error ); } + }