Extract Theme related methods from SettingsController as ThemeController
I want to avoid the SettingsController becoming some kind of a god class so in this step, I extracted themejson-related stuff to an extra class. In the future, we should also move methods for manipulating CSS to a helper. [MAILPOET-5741]
This commit is contained in:
committed by
Rostislav Wolný
parent
aa658782fb
commit
b724ef4ac2
@@ -338,6 +338,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
|||||||
$container->autowire(\MailPoet\EmailEditor\Engine\EmailEditor::class)->setPublic(true);
|
$container->autowire(\MailPoet\EmailEditor\Engine\EmailEditor::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\EmailEditor\Engine\EmailApiController::class)->setPublic(true);
|
$container->autowire(\MailPoet\EmailEditor\Engine\EmailApiController::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\EmailEditor\Engine\SettingsController::class)->setPublic(true);
|
$container->autowire(\MailPoet\EmailEditor\Engine\SettingsController::class)->setPublic(true);
|
||||||
|
$container->autowire(\MailPoet\EmailEditor\Engine\ThemeController::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\Postprocessors\HighlightingPostprocessor::class)->setPublic(true);
|
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\Postprocessors\HighlightingPostprocessor::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\Preprocessors\BlocksWidthPreprocessor::class)->setPublic(true);
|
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\Preprocessors\BlocksWidthPreprocessor::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\Preprocessors\CleanupPreprocessor::class)->setPublic(true);
|
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\Preprocessors\CleanupPreprocessor::class)->setPublic(true);
|
||||||
|
@@ -3,22 +3,20 @@
|
|||||||
namespace MailPoet\EmailEditor\Engine\Renderer;
|
namespace MailPoet\EmailEditor\Engine\Renderer;
|
||||||
|
|
||||||
use MailPoet\EmailEditor\Engine\SettingsController;
|
use MailPoet\EmailEditor\Engine\SettingsController;
|
||||||
|
use MailPoet\EmailEditor\Engine\ThemeController;
|
||||||
use MailPoet\Util\pQuery\DomNode;
|
use MailPoet\Util\pQuery\DomNode;
|
||||||
use MailPoetVendor\Html2Text\Html2Text;
|
use MailPoetVendor\Html2Text\Html2Text;
|
||||||
|
|
||||||
class Renderer {
|
class Renderer {
|
||||||
|
private \MailPoetVendor\CSS $cssInliner;
|
||||||
|
|
||||||
/** @var \MailPoetVendor\CSS */
|
private BlocksRegistry $blocksRegistry;
|
||||||
private $cssInliner;
|
|
||||||
|
|
||||||
/** @var BlocksRegistry */
|
private ProcessManager $processManager;
|
||||||
private $blocksRegistry;
|
|
||||||
|
|
||||||
/** @var ProcessManager */
|
private SettingsController $settingsController;
|
||||||
private $processManager;
|
|
||||||
|
|
||||||
/** @var SettingsController */
|
private ThemeController $themeController;
|
||||||
private $settingsController;
|
|
||||||
|
|
||||||
const TEMPLATE_FILE = 'template.html';
|
const TEMPLATE_FILE = 'template.html';
|
||||||
const TEMPLATE_STYLES_FILE = 'styles.css';
|
const TEMPLATE_STYLES_FILE = 'styles.css';
|
||||||
@@ -30,12 +28,14 @@ class Renderer {
|
|||||||
\MailPoetVendor\CSS $cssInliner,
|
\MailPoetVendor\CSS $cssInliner,
|
||||||
ProcessManager $preprocessManager,
|
ProcessManager $preprocessManager,
|
||||||
BlocksRegistry $blocksRegistry,
|
BlocksRegistry $blocksRegistry,
|
||||||
SettingsController $settingsController
|
SettingsController $settingsController,
|
||||||
|
ThemeController $themeController
|
||||||
) {
|
) {
|
||||||
$this->cssInliner = $cssInliner;
|
$this->cssInliner = $cssInliner;
|
||||||
$this->processManager = $preprocessManager;
|
$this->processManager = $preprocessManager;
|
||||||
$this->blocksRegistry = $blocksRegistry;
|
$this->blocksRegistry = $blocksRegistry;
|
||||||
$this->settingsController = $settingsController;
|
$this->settingsController = $settingsController;
|
||||||
|
$this->themeController = $themeController;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function render(\WP_Post $post, string $subject, string $preHeader, string $language, $metaRobots = ''): array {
|
public function render(\WP_Post $post, string $subject, string $preHeader, string $language, $metaRobots = ''): array {
|
||||||
@@ -50,7 +50,7 @@ class Renderer {
|
|||||||
$renderedBody = $this->renderBlocks($parsedBlocks);
|
$renderedBody = $this->renderBlocks($parsedBlocks);
|
||||||
|
|
||||||
$styles = (string)file_get_contents(dirname(__FILE__) . '/' . self::TEMPLATE_STYLES_FILE);
|
$styles = (string)file_get_contents(dirname(__FILE__) . '/' . self::TEMPLATE_STYLES_FILE);
|
||||||
$styles .= $this->settingsController->getStylesheetForRendering();
|
$styles .= $this->themeController->getStylesheetForRendering();
|
||||||
$styles = apply_filters('mailpoet_email_renderer_styles', $styles, $post);
|
$styles = apply_filters('mailpoet_email_renderer_styles', $styles, $post);
|
||||||
|
|
||||||
$template = (string)file_get_contents(dirname(__FILE__) . '/' . self::TEMPLATE_FILE);
|
$template = (string)file_get_contents(dirname(__FILE__) . '/' . self::TEMPLATE_FILE);
|
||||||
|
@@ -38,7 +38,18 @@ class SettingsController {
|
|||||||
*/
|
*/
|
||||||
const FLEX_GAP = '16px';
|
const FLEX_GAP = '16px';
|
||||||
|
|
||||||
private $availableStylesheets = '';
|
private string $availableStylesheets = '';
|
||||||
|
|
||||||
|
private ThemeController $themeController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ThemeController $themeController
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
ThemeController $themeController
|
||||||
|
) {
|
||||||
|
$this->themeController = $themeController;
|
||||||
|
}
|
||||||
|
|
||||||
public function getSettings(): array {
|
public function getSettings(): array {
|
||||||
$coreDefaultSettings = get_default_block_editor_settings();
|
$coreDefaultSettings = get_default_block_editor_settings();
|
||||||
@@ -143,59 +154,14 @@ class SettingsController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function getTheme(): \WP_Theme_JSON {
|
public function getTheme(): \WP_Theme_JSON {
|
||||||
$coreThemeData = \WP_Theme_JSON_Resolver::get_core_data();
|
return $this->themeController->getTheme();
|
||||||
$themeJson = (string)file_get_contents(dirname(__FILE__) . '/theme.json');
|
|
||||||
$themeJson = json_decode($themeJson, true);
|
|
||||||
/** @var array $themeJson */
|
|
||||||
$coreThemeData->merge(new \WP_Theme_JSON($themeJson, 'default'));
|
|
||||||
return apply_filters('mailpoet_email_editor_theme_json', $coreThemeData);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getStylesheetForRendering(): string {
|
|
||||||
$emailThemeSettings = $this->getTheme()->get_settings();
|
|
||||||
|
|
||||||
$cssPresets = '';
|
|
||||||
// Font family classes
|
|
||||||
foreach ($emailThemeSettings['typography']['fontFamilies']['default'] as $fontFamily) {
|
|
||||||
$cssPresets .= ".has-{$fontFamily['slug']}-font-family { font-family: {$fontFamily['fontFamily']}; } \n";
|
|
||||||
}
|
|
||||||
// Font size classes
|
|
||||||
foreach ($emailThemeSettings['typography']['fontSizes']['default'] as $fontSize) {
|
|
||||||
$cssPresets .= ".has-{$fontSize['slug']}-font-size { font-size: {$fontSize['size']}; } \n";
|
|
||||||
}
|
|
||||||
// Color palette classes
|
|
||||||
foreach ($emailThemeSettings['color']['palette']['default'] as $color) {
|
|
||||||
$cssPresets .= ".has-{$color['slug']}-color { color: {$color['color']}; } \n";
|
|
||||||
$cssPresets .= ".has-{$color['slug']}-background-color { background-color: {$color['color']}; } \n";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Block specific styles
|
|
||||||
$cssBlocks = '';
|
|
||||||
$blocks = $this->getTheme()->get_styles_block_nodes();
|
|
||||||
foreach ($blocks as $blockMetadata) {
|
|
||||||
$cssBlocks .= $this->getTheme()->get_styles_for_block($blockMetadata);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $cssPresets . $cssBlocks;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function translateSlugToFontSize(string $fontSize): string {
|
public function translateSlugToFontSize(string $fontSize): string {
|
||||||
$settings = $this->getTheme()->get_settings();
|
return $this->themeController->translateSlugToFontSize($fontSize);
|
||||||
foreach ($settings['typography']['fontSizes']['default'] as $fontSizeDefinition) {
|
|
||||||
if ($fontSizeDefinition['slug'] === $fontSize) {
|
|
||||||
return $fontSizeDefinition['size'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $fontSize;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function translateSlugToColor(string $colorSlug): string {
|
public function translateSlugToColor(string $colorSlug): string {
|
||||||
$settings = $this->getTheme()->get_settings();
|
return $this->themeController->translateSlugToColor($colorSlug);
|
||||||
foreach ($settings['color']['palette']['default'] as $colorDefinition) {
|
|
||||||
if ($colorDefinition['slug'] === $colorSlug) {
|
|
||||||
return $colorDefinition['color'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $colorSlug;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
66
mailpoet/lib/EmailEditor/Engine/ThemeController.php
Normal file
66
mailpoet/lib/EmailEditor/Engine/ThemeController.php
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
<?php declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace MailPoet\EmailEditor\Engine;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* E-mail editor works with own theme.json which defines settings for the editor and styles for the e-mail.
|
||||||
|
* This class is responsible for accessing data defined by the theme.json.
|
||||||
|
*/
|
||||||
|
class ThemeController {
|
||||||
|
public function getTheme(): \WP_Theme_JSON {
|
||||||
|
$coreThemeData = \WP_Theme_JSON_Resolver::get_core_data();
|
||||||
|
$themeJson = (string)file_get_contents(dirname(__FILE__) . '/theme.json');
|
||||||
|
$themeJson = json_decode($themeJson, true);
|
||||||
|
/** @var array $themeJson */
|
||||||
|
$coreThemeData->merge(new \WP_Theme_JSON($themeJson, 'default'));
|
||||||
|
return apply_filters('mailpoet_email_editor_theme_json', $coreThemeData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getStylesheetForRendering(): string {
|
||||||
|
$emailThemeSettings = $this->getTheme()->get_settings();
|
||||||
|
|
||||||
|
$cssPresets = '';
|
||||||
|
// Font family classes
|
||||||
|
foreach ($emailThemeSettings['typography']['fontFamilies']['default'] as $fontFamily) {
|
||||||
|
$cssPresets .= ".has-{$fontFamily['slug']}-font-family { font-family: {$fontFamily['fontFamily']}; } \n";
|
||||||
|
}
|
||||||
|
// Font size classes
|
||||||
|
foreach ($emailThemeSettings['typography']['fontSizes']['default'] as $fontSize) {
|
||||||
|
$cssPresets .= ".has-{$fontSize['slug']}-font-size { font-size: {$fontSize['size']}; } \n";
|
||||||
|
}
|
||||||
|
// Color palette classes
|
||||||
|
foreach ($emailThemeSettings['color']['palette']['default'] as $color) {
|
||||||
|
$cssPresets .= ".has-{$color['slug']}-color { color: {$color['color']}; } \n";
|
||||||
|
$cssPresets .= ".has-{$color['slug']}-background-color { background-color: {$color['color']}; } \n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Block specific styles
|
||||||
|
$cssBlocks = '';
|
||||||
|
$blocks = $this->getTheme()->get_styles_block_nodes();
|
||||||
|
foreach ($blocks as $blockMetadata) {
|
||||||
|
$cssBlocks .= $this->getTheme()->get_styles_for_block($blockMetadata);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $cssPresets . $cssBlocks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function translateSlugToFontSize(string $fontSize): string {
|
||||||
|
$settings = $this->getTheme()->get_settings();
|
||||||
|
foreach ($settings['typography']['fontSizes']['default'] as $fontSizeDefinition) {
|
||||||
|
if ($fontSizeDefinition['slug'] === $fontSize) {
|
||||||
|
return $fontSizeDefinition['size'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $fontSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function translateSlugToColor(string $colorSlug): string {
|
||||||
|
$settings = $this->getTheme()->get_settings();
|
||||||
|
foreach ($settings['color']['palette']['default'] as $colorDefinition) {
|
||||||
|
if ($colorDefinition['slug'] === $colorSlug) {
|
||||||
|
return $colorDefinition['color'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $colorSlug;
|
||||||
|
}
|
||||||
|
}
|
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
namespace MailPoet\EmailEditor\Engine\Renderer;
|
namespace MailPoet\EmailEditor\Engine\Renderer;
|
||||||
|
|
||||||
use MailPoet\EmailEditor\Engine\SettingsController;
|
|
||||||
use MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks\Paragraph;
|
use MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks\Paragraph;
|
||||||
|
|
||||||
require_once __DIR__ . '/DummyBlockRenderer.php';
|
require_once __DIR__ . '/DummyBlockRenderer.php';
|
||||||
@@ -14,7 +13,7 @@ class BlocksRegistryTest extends \MailPoetTest {
|
|||||||
|
|
||||||
public function _before() {
|
public function _before() {
|
||||||
parent::_before();
|
parent::_before();
|
||||||
$this->registry = new BlocksRegistry(new SettingsController());
|
$this->registry = $this->diContainer->get(BlocksRegistry::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItReturnsNullForUnknownRenderer() {
|
public function testItReturnsNullForUnknownRenderer() {
|
||||||
|
@@ -21,7 +21,7 @@ class FlexLayoutRendererTest extends \MailPoetTest {
|
|||||||
|
|
||||||
public function _before(): void {
|
public function _before(): void {
|
||||||
parent::_before();
|
parent::_before();
|
||||||
$this->settingsController = new SettingsController();
|
$this->settingsController = $this->diContainer->get(SettingsController::class);
|
||||||
$this->registry = new BlocksRegistry($this->settingsController);
|
$this->registry = new BlocksRegistry($this->settingsController);
|
||||||
$this->renderer = new FlexLayoutRenderer();
|
$this->renderer = new FlexLayoutRenderer();
|
||||||
$this->registry->addBlockRenderer('dummy/block', new DummyBlockRenderer());
|
$this->registry->addBlockRenderer('dummy/block', new DummyBlockRenderer());
|
||||||
|
@@ -2,17 +2,16 @@
|
|||||||
|
|
||||||
namespace MailPoet\EmailEditor\Engine;
|
namespace MailPoet\EmailEditor\Engine;
|
||||||
|
|
||||||
class SettingsControllerTest extends \MailPoetTest {
|
class ThemeControllerTest extends \MailPoetTest {
|
||||||
/** @var SettingsController */
|
private ThemeController $themeController;
|
||||||
private $settingsController;
|
|
||||||
|
|
||||||
public function _before() {
|
public function _before() {
|
||||||
parent::_before();
|
parent::_before();
|
||||||
$this->settingsController = $this->diContainer->get(SettingsController::class);
|
$this->themeController = $this->diContainer->get(ThemeController::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItGeneratesCssStylesForRenderer() {
|
public function testItGeneratesCssStylesForRenderer() {
|
||||||
$css = $this->settingsController->getStylesheetForRendering();
|
$css = $this->themeController->getStylesheetForRendering();
|
||||||
verify($css)->stringContainsString('.has-arial-font-family');
|
verify($css)->stringContainsString('.has-arial-font-family');
|
||||||
verify($css)->stringContainsString('.has-comic-sans-ms-font-family');
|
verify($css)->stringContainsString('.has-comic-sans-ms-font-family');
|
||||||
verify($css)->stringContainsString('.has-courier-new-font-family');
|
verify($css)->stringContainsString('.has-courier-new-font-family');
|
||||||
@@ -43,17 +42,17 @@ class SettingsControllerTest extends \MailPoetTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function testItCanTranslateFontSizeSlug() {
|
public function testItCanTranslateFontSizeSlug() {
|
||||||
verify($this->settingsController->translateSlugToFontSize('small'))->equals('13px');
|
verify($this->themeController->translateSlugToFontSize('small'))->equals('13px');
|
||||||
verify($this->settingsController->translateSlugToFontSize('medium'))->equals('20px');
|
verify($this->themeController->translateSlugToFontSize('medium'))->equals('20px');
|
||||||
verify($this->settingsController->translateSlugToFontSize('large'))->equals('36px');
|
verify($this->themeController->translateSlugToFontSize('large'))->equals('36px');
|
||||||
verify($this->settingsController->translateSlugToFontSize('x-large'))->equals('42px');
|
verify($this->themeController->translateSlugToFontSize('x-large'))->equals('42px');
|
||||||
verify($this->settingsController->translateSlugToFontSize('unknown'))->equals('unknown');
|
verify($this->themeController->translateSlugToFontSize('unknown'))->equals('unknown');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItCanTranslateColorSlug() {
|
public function testItCanTranslateColorSlug() {
|
||||||
verify($this->settingsController->translateSlugToColor('black'))->equals('#000000');
|
verify($this->themeController->translateSlugToColor('black'))->equals('#000000');
|
||||||
verify($this->settingsController->translateSlugToColor('white'))->equals('#ffffff');
|
verify($this->themeController->translateSlugToColor('white'))->equals('#ffffff');
|
||||||
verify($this->settingsController->translateSlugToColor('cyan-bluish-gray'))->equals('#abb8c3');
|
verify($this->themeController->translateSlugToColor('cyan-bluish-gray'))->equals('#abb8c3');
|
||||||
verify($this->settingsController->translateSlugToColor('pale-pink'))->equals('#f78da7');
|
verify($this->themeController->translateSlugToColor('pale-pink'))->equals('#f78da7');
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -3,10 +3,11 @@
|
|||||||
namespace unit\EmailEditor\Engine\Renderer;
|
namespace unit\EmailEditor\Engine\Renderer;
|
||||||
|
|
||||||
use MailPoet\EmailEditor\Engine\SettingsController;
|
use MailPoet\EmailEditor\Engine\SettingsController;
|
||||||
|
use MailPoet\EmailEditor\Engine\ThemeController;
|
||||||
|
|
||||||
class SettingsControllerTest extends \MailPoetUnitTest {
|
class SettingsControllerTest extends \MailPoetUnitTest {
|
||||||
public function testItGetsMainLayoutStyles(): void {
|
public function testItGetsMainLayoutStyles(): void {
|
||||||
$settingsController = new SettingsController();
|
$settingsController = new SettingsController($this->makeEmpty(ThemeController::class));
|
||||||
$layoutStyles = $settingsController->getEmailLayoutStyles();
|
$layoutStyles = $settingsController->getEmailLayoutStyles();
|
||||||
verify($layoutStyles)->arrayHasKey('width');
|
verify($layoutStyles)->arrayHasKey('width');
|
||||||
verify($layoutStyles)->arrayHasKey('background');
|
verify($layoutStyles)->arrayHasKey('background');
|
||||||
@@ -14,7 +15,7 @@ class SettingsControllerTest extends \MailPoetUnitTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function testItGetsCorrectLayoutWidthWithoutPadding(): void {
|
public function testItGetsCorrectLayoutWidthWithoutPadding(): void {
|
||||||
$settingsController = new SettingsController();
|
$settingsController = new SettingsController($this->makeEmpty(ThemeController::class));
|
||||||
$layoutWidth = $settingsController->getLayoutWidthWithoutPadding();
|
$layoutWidth = $settingsController->getLayoutWidthWithoutPadding();
|
||||||
// default width is 660px and if we subtract padding from left and right we must get the correct value
|
// default width is 660px and if we subtract padding from left and right we must get the correct value
|
||||||
$expectedWidth = (int)SettingsController::EMAIL_WIDTH - (int)SettingsController::FLEX_GAP * 2;
|
$expectedWidth = (int)SettingsController::EMAIL_WIDTH - (int)SettingsController::FLEX_GAP * 2;
|
||||||
@@ -22,7 +23,7 @@ class SettingsControllerTest extends \MailPoetUnitTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function testItConvertsStylesToString(): void {
|
public function testItConvertsStylesToString(): void {
|
||||||
$settingsController = new SettingsController();
|
$settingsController = new SettingsController($this->makeEmpty(ThemeController::class));
|
||||||
$styles = [
|
$styles = [
|
||||||
'width' => '600px',
|
'width' => '600px',
|
||||||
'background' => '#ffffff',
|
'background' => '#ffffff',
|
||||||
|
Reference in New Issue
Block a user