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\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);
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
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;
|
||||
|
||||
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() {
|
||||
|
@@ -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());
|
||||
|
@@ -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');
|
||||
}
|
||||
}
|
@@ -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',
|
||||
|
Reference in New Issue
Block a user