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:
Rostislav Wolny
2024-02-22 13:03:24 +01:00
committed by Rostislav Wolný
parent aa658782fb
commit b724ef4ac2
8 changed files with 111 additions and 79 deletions

View File

@@ -338,6 +338,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\EmailEditor\Engine\EmailEditor::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\ThemeController::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\CleanupPreprocessor::class)->setPublic(true);

View File

@@ -3,22 +3,20 @@
namespace MailPoet\EmailEditor\Engine\Renderer;
use MailPoet\EmailEditor\Engine\SettingsController;
use MailPoet\EmailEditor\Engine\ThemeController;
use MailPoet\Util\pQuery\DomNode;
use MailPoetVendor\Html2Text\Html2Text;
class Renderer {
private \MailPoetVendor\CSS $cssInliner;
/** @var \MailPoetVendor\CSS */
private $cssInliner;
private BlocksRegistry $blocksRegistry;
/** @var BlocksRegistry */
private $blocksRegistry;
private ProcessManager $processManager;
/** @var ProcessManager */
private $processManager;
private SettingsController $settingsController;
/** @var SettingsController */
private $settingsController;
private ThemeController $themeController;
const TEMPLATE_FILE = 'template.html';
const TEMPLATE_STYLES_FILE = 'styles.css';
@@ -30,12 +28,14 @@ class Renderer {
\MailPoetVendor\CSS $cssInliner,
ProcessManager $preprocessManager,
BlocksRegistry $blocksRegistry,
SettingsController $settingsController
SettingsController $settingsController,
ThemeController $themeController
) {
$this->cssInliner = $cssInliner;
$this->processManager = $preprocessManager;
$this->blocksRegistry = $blocksRegistry;
$this->settingsController = $settingsController;
$this->themeController = $themeController;
}
public function render(\WP_Post $post, string $subject, string $preHeader, string $language, $metaRobots = ''): array {
@@ -50,7 +50,7 @@ class Renderer {
$renderedBody = $this->renderBlocks($parsedBlocks);
$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);
$template = (string)file_get_contents(dirname(__FILE__) . '/' . self::TEMPLATE_FILE);

View File

@@ -38,7 +38,18 @@ class SettingsController {
*/
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 {
$coreDefaultSettings = get_default_block_editor_settings();
@@ -143,59 +154,14 @@ class SettingsController {
}
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;
return $this->themeController->getTheme();
}
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;
return $this->themeController->translateSlugToFontSize($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;
return $this->themeController->translateSlugToColor($colorSlug);
}
}

View 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;
}
}

View File

@@ -2,7 +2,6 @@
namespace MailPoet\EmailEditor\Engine\Renderer;
use MailPoet\EmailEditor\Engine\SettingsController;
use MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks\Paragraph;
require_once __DIR__ . '/DummyBlockRenderer.php';
@@ -14,7 +13,7 @@ class BlocksRegistryTest extends \MailPoetTest {
public function _before() {
parent::_before();
$this->registry = new BlocksRegistry(new SettingsController());
$this->registry = $this->diContainer->get(BlocksRegistry::class);
}
public function testItReturnsNullForUnknownRenderer() {

View File

@@ -21,7 +21,7 @@ class FlexLayoutRendererTest extends \MailPoetTest {
public function _before(): void {
parent::_before();
$this->settingsController = new SettingsController();
$this->settingsController = $this->diContainer->get(SettingsController::class);
$this->registry = new BlocksRegistry($this->settingsController);
$this->renderer = new FlexLayoutRenderer();
$this->registry->addBlockRenderer('dummy/block', new DummyBlockRenderer());

View File

@@ -2,17 +2,16 @@
namespace MailPoet\EmailEditor\Engine;
class SettingsControllerTest extends \MailPoetTest {
/** @var SettingsController */
private $settingsController;
class ThemeControllerTest extends \MailPoetTest {
private ThemeController $themeController;
public function _before() {
parent::_before();
$this->settingsController = $this->diContainer->get(SettingsController::class);
$this->themeController = $this->diContainer->get(ThemeController::class);
}
public function testItGeneratesCssStylesForRenderer() {
$css = $this->settingsController->getStylesheetForRendering();
$css = $this->themeController->getStylesheetForRendering();
verify($css)->stringContainsString('.has-arial-font-family');
verify($css)->stringContainsString('.has-comic-sans-ms-font-family');
verify($css)->stringContainsString('.has-courier-new-font-family');
@@ -43,17 +42,17 @@ class SettingsControllerTest extends \MailPoetTest {
}
public function testItCanTranslateFontSizeSlug() {
verify($this->settingsController->translateSlugToFontSize('small'))->equals('13px');
verify($this->settingsController->translateSlugToFontSize('medium'))->equals('20px');
verify($this->settingsController->translateSlugToFontSize('large'))->equals('36px');
verify($this->settingsController->translateSlugToFontSize('x-large'))->equals('42px');
verify($this->settingsController->translateSlugToFontSize('unknown'))->equals('unknown');
verify($this->themeController->translateSlugToFontSize('small'))->equals('13px');
verify($this->themeController->translateSlugToFontSize('medium'))->equals('20px');
verify($this->themeController->translateSlugToFontSize('large'))->equals('36px');
verify($this->themeController->translateSlugToFontSize('x-large'))->equals('42px');
verify($this->themeController->translateSlugToFontSize('unknown'))->equals('unknown');
}
public function testItCanTranslateColorSlug() {
verify($this->settingsController->translateSlugToColor('black'))->equals('#000000');
verify($this->settingsController->translateSlugToColor('white'))->equals('#ffffff');
verify($this->settingsController->translateSlugToColor('cyan-bluish-gray'))->equals('#abb8c3');
verify($this->settingsController->translateSlugToColor('pale-pink'))->equals('#f78da7');
verify($this->themeController->translateSlugToColor('black'))->equals('#000000');
verify($this->themeController->translateSlugToColor('white'))->equals('#ffffff');
verify($this->themeController->translateSlugToColor('cyan-bluish-gray'))->equals('#abb8c3');
verify($this->themeController->translateSlugToColor('pale-pink'))->equals('#f78da7');
}
}

View File

@@ -3,10 +3,11 @@
namespace unit\EmailEditor\Engine\Renderer;
use MailPoet\EmailEditor\Engine\SettingsController;
use MailPoet\EmailEditor\Engine\ThemeController;
class SettingsControllerTest extends \MailPoetUnitTest {
public function testItGetsMainLayoutStyles(): void {
$settingsController = new SettingsController();
$settingsController = new SettingsController($this->makeEmpty(ThemeController::class));
$layoutStyles = $settingsController->getEmailLayoutStyles();
verify($layoutStyles)->arrayHasKey('width');
verify($layoutStyles)->arrayHasKey('background');
@@ -14,7 +15,7 @@ class SettingsControllerTest extends \MailPoetUnitTest {
}
public function testItGetsCorrectLayoutWidthWithoutPadding(): void {
$settingsController = new SettingsController();
$settingsController = new SettingsController($this->makeEmpty(ThemeController::class));
$layoutWidth = $settingsController->getLayoutWidthWithoutPadding();
// 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;
@@ -22,7 +23,7 @@ class SettingsControllerTest extends \MailPoetUnitTest {
}
public function testItConvertsStylesToString(): void {
$settingsController = new SettingsController();
$settingsController = new SettingsController($this->makeEmpty(ThemeController::class));
$styles = [
'width' => '600px',
'background' => '#ffffff',