diff --git a/mailpoet/assets/js/src/email-editor/engine/components/block-editor/block-editor.tsx b/mailpoet/assets/js/src/email-editor/engine/components/block-editor/block-editor.tsx index 7cb3550a30..43ba72f0b7 100644 --- a/mailpoet/assets/js/src/email-editor/engine/components/block-editor/block-editor.tsx +++ b/mailpoet/assets/js/src/email-editor/engine/components/block-editor/block-editor.tsx @@ -48,7 +48,6 @@ export function BlockEditor() { canUserEditMedia, hasFixedToolbar, focusMode, - styles, layout, } = useSelect( (select) => ({ @@ -63,7 +62,6 @@ export function BlockEditor() { canUserEditMedia: select(coreStore).canUser('create', 'media'), hasFixedToolbar: select(storeName).isFeatureActive('fixedToolbar'), focusMode: select(storeName).isFeatureActive('focusMode'), - styles: select(storeName).getStyles(), layout: select(storeName).getLayout(), }), [], @@ -81,8 +79,8 @@ export function BlockEditor() { { id: postId }, ); - // This will be set by the user in the future in email or global styles. - const layoutBackground = styles.layout.background; + // This is color of the wrapper and we need to decide if it is configurable or not. + const layoutBackground = '#cccccc'; let inlineStyles = useResizeCanvas(previewDeviceType); // Adjust the inline styles for desktop preview. We want to set email width and center it. @@ -90,7 +88,7 @@ export function BlockEditor() { inlineStyles = { ...inlineStyles, height: 'auto', - width: styles.layout.width, + width: layout.contentSize, display: 'flex', flexFlow: 'column', }; diff --git a/mailpoet/assets/js/src/email-editor/engine/store/types.ts b/mailpoet/assets/js/src/email-editor/engine/store/types.ts index a0149d2ede..efb00a2560 100644 --- a/mailpoet/assets/js/src/email-editor/engine/store/types.ts +++ b/mailpoet/assets/js/src/email-editor/engine/store/types.ts @@ -27,24 +27,32 @@ export type ExperimentalSettings = { export type EmailEditorSettings = EditorSettings & ExperimentalSettings; export type EmailStyles = { - layout: { - background: string; + spacing: { + blockGap: string; padding: { bottom: string; left: string; right: string; top: string; }; - width: string; }; - colors: { + color: { background: string; + text: string; }; - elements: { - h1: { - color: string; - fontFamily: string; - fontWeight: string; + blocks: { + "core/heading": { + elements: { + h1: { + color: { + text: string; + }; + typography: { + fontFamily: string; + fontWeight: string; + }; + }; + }; }; }; }; diff --git a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/ContentRenderer.php b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/ContentRenderer.php index 7c6dbd59a9..5889ee9325 100644 --- a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/ContentRenderer.php +++ b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/ContentRenderer.php @@ -40,8 +40,9 @@ class ContentRenderer { $parser = new \WP_Block_Parser(); $parsedBlocks = $parser->parse($post->post_content); // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps - $layoutStyles = $this->settingsController->getEmailStyles()['layout']; - $parsedBlocks = $this->processManager->preprocess($parsedBlocks, $layoutStyles); + $layout = $this->settingsController->getLayout(); + $themeStyles = $this->settingsController->getEmailStyles(); + $parsedBlocks = $this->processManager->preprocess($parsedBlocks, $layout, $themeStyles); $renderedBody = $this->renderBlocks($parsedBlocks); $styles = (string)file_get_contents(dirname(__FILE__) . '/' . self::CONTENT_STYLES_FILE); diff --git a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Layout/FlexLayoutRenderer.php b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Layout/FlexLayoutRenderer.php index b04b28a87e..6b0114f690 100644 --- a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Layout/FlexLayoutRenderer.php +++ b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Layout/FlexLayoutRenderer.php @@ -9,7 +9,11 @@ use MailPoet\EmailEditor\Engine\SettingsController; */ class FlexLayoutRenderer { public function renderInnerBlocksInLayout(array $parsedBlock, SettingsController $settingsController): string { - $innerBlocks = $this->computeWidthsForFlexLayout($parsedBlock, $settingsController); + $themeStyles = $settingsController->getEmailStyles(); + $flexGap = $themeStyles['spacing']['blockGap'] ?? '0px'; + $flexGapNumber = $settingsController->parseNumberFromStringWithPixels($flexGap); + + $innerBlocks = $this->computeWidthsForFlexLayout($parsedBlock, $settingsController, $flexGapNumber); // MS Outlook doesn't support style attribute in divs so we conditionally wrap the buttons in a table and repeat styles $outputHtml = ' @@ -21,7 +25,7 @@ class FlexLayoutRenderer { $styles['width'] = $block['email_attrs']['layout_width']; } if ($key > 0) { - $styles['padding-left'] = SettingsController::FLEX_GAP; + $styles['padding-left'] = $flexGap; } $outputHtml .= '' . render_block($block) . ''; } @@ -40,11 +44,10 @@ class FlexLayoutRenderer { return $outputHtml; } - private function computeWidthsForFlexLayout(array $parsedBlock, SettingsController $settingsController): array { + private function computeWidthsForFlexLayout(array $parsedBlock, SettingsController $settingsController, float $flexGap): array { $blocksCount = count($parsedBlock['innerBlocks']); $totalUsedWidth = 0; // Total width assuming items without set width would consume proportional width $parentWidth = $settingsController->parseNumberFromStringWithPixels($parsedBlock['email_attrs']['width'] ?? SettingsController::EMAIL_WIDTH); - $flexGap = $settingsController->parseNumberFromStringWithPixels(SettingsController::FLEX_GAP); $innerBlocks = $parsedBlock['innerBlocks'] ?? []; foreach ($innerBlocks as $key => $block) { diff --git a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/BlocksWidthPreprocessor.php b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/BlocksWidthPreprocessor.php index 0a596d23f5..158b686ef6 100644 --- a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/BlocksWidthPreprocessor.php +++ b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/BlocksWidthPreprocessor.php @@ -7,15 +7,15 @@ namespace MailPoet\EmailEditor\Engine\Renderer\ContentRenderer\Preprocessors; * The final width in pixels is stored in the email_attrs array because we would like to avoid changing the original attributes. */ class BlocksWidthPreprocessor implements Preprocessor { - public function preprocess(array $parsedBlocks, array $layoutStyles): array { + public function preprocess(array $parsedBlocks, array $layout, array $styles): array { foreach ($parsedBlocks as $key => $block) { // Layout width is recalculated for each block because full-width blocks don't exclude padding - $layoutWidth = $this->parseNumberFromStringWithPixels($layoutStyles['width']); + $layoutWidth = $this->parseNumberFromStringWithPixels($layout['contentSize']); $alignment = $block['attrs']['align'] ?? null; // Subtract padding from the block width if it's not full-width if ($alignment !== 'full') { - $layoutWidth -= $this->parseNumberFromStringWithPixels($layoutStyles['padding']['left'] ?? '0px'); - $layoutWidth -= $this->parseNumberFromStringWithPixels($layoutStyles['padding']['right'] ?? '0px'); + $layoutWidth -= $this->parseNumberFromStringWithPixels($styles['spacing']['padding']['left'] ?? '0px'); + $layoutWidth -= $this->parseNumberFromStringWithPixels($styles['spacing']['padding']['right'] ?? '0px'); } $widthInput = $block['attrs']['width'] ?? '100%'; @@ -36,13 +36,14 @@ class BlocksWidthPreprocessor implements Preprocessor { } // Copy layout styles and update width and padding - $modifiedLayoutStyles = $layoutStyles; - $modifiedLayoutStyles['width'] = "{$width}px"; - $modifiedLayoutStyles['padding']['left'] = $block['attrs']['style']['spacing']['padding']['left'] ?? '0px'; - $modifiedLayoutStyles['padding']['right'] = $block['attrs']['style']['spacing']['padding']['right'] ?? '0px'; + $modifiedLayout = $layout; + $modifiedLayout['contentSize'] = "{$width}px"; + $modifiedStyles = $styles; + $modifiedStyles['spacing']['padding']['left'] = $block['attrs']['style']['spacing']['padding']['left'] ?? '0px'; + $modifiedStyles['spacing']['padding']['right'] = $block['attrs']['style']['spacing']['padding']['right'] ?? '0px'; $block['email_attrs']['width'] = "{$width}px"; - $block['innerBlocks'] = $this->preprocess($block['innerBlocks'], $modifiedLayoutStyles); + $block['innerBlocks'] = $this->preprocess($block['innerBlocks'], $modifiedLayout, $modifiedStyles); $parsedBlocks[$key] = $block; } return $parsedBlocks; diff --git a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/CleanupPreprocessor.php b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/CleanupPreprocessor.php index c4de580e2b..444645c60a 100644 --- a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/CleanupPreprocessor.php +++ b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/CleanupPreprocessor.php @@ -3,7 +3,7 @@ namespace MailPoet\EmailEditor\Engine\Renderer\ContentRenderer\Preprocessors; class CleanupPreprocessor implements Preprocessor { - public function preprocess(array $parsedBlocks, array $layoutStyles): array { + public function preprocess(array $parsedBlocks, array $layout, array $styles): array { foreach ($parsedBlocks as $key => $block) { // https://core.trac.wordpress.org/ticket/45312 // \WP_Block_Parser::parse_blocks() sometimes add a block with name null that can cause unexpected spaces in rendered content diff --git a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/Preprocessor.php b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/Preprocessor.php index ddd1372099..eddb9107e4 100644 --- a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/Preprocessor.php +++ b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/Preprocessor.php @@ -3,5 +3,9 @@ namespace MailPoet\EmailEditor\Engine\Renderer\ContentRenderer\Preprocessors; interface Preprocessor { - public function preprocess(array $parsedBlocks, array $layoutStyles): array; + /** + * @param array{contentSize: string} $layout + * @param array{spacing: array{padding: array{bottom: string, left: string, right: string, top: string}, blockGap: string}} $styles + */ + public function preprocess(array $parsedBlocks, array $layout, array $styles): array; } diff --git a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/SpacingPreprocessor.php b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/SpacingPreprocessor.php index e67ddd8c27..4b7f37bc49 100644 --- a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/SpacingPreprocessor.php +++ b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/SpacingPreprocessor.php @@ -2,26 +2,26 @@ namespace MailPoet\EmailEditor\Engine\Renderer\ContentRenderer\Preprocessors; -use MailPoet\EmailEditor\Engine\SettingsController; - /** * This preprocessor is responsible for setting default spacing values for blocks. * In the early development phase, we are setting only margin-top for blocks that are not first or last in the columns block. */ class SpacingPreprocessor implements Preprocessor { - public function preprocess(array $parsedBlocks, array $layoutStyles): array { - $parsedBlocks = $this->addMarginTopToBlocks($parsedBlocks); + public function preprocess(array $parsedBlocks, array $layout, array $styles): array { + $parsedBlocks = $this->addMarginTopToBlocks($parsedBlocks, $styles); return $parsedBlocks; } - private function addMarginTopToBlocks(array $parsedBlocks): array { + private function addMarginTopToBlocks(array $parsedBlocks, array $styles): array { + $flexGap = $styles['spacing']['blockGap'] ?? '0px'; + foreach ($parsedBlocks as $key => $block) { // We don't want to add margin-top to the first block in the email or to the first block in the columns block if ($key !== 0) { - $block['email_attrs']['margin-top'] = SettingsController::FLEX_GAP; + $block['email_attrs']['margin-top'] = $flexGap; } - $block['innerBlocks'] = $this->addMarginTopToBlocks($block['innerBlocks'] ?? []); + $block['innerBlocks'] = $this->addMarginTopToBlocks($block['innerBlocks'] ?? [], $styles); $parsedBlocks[$key] = $block; } diff --git a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/TopLevelPreprocessor.php b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/TopLevelPreprocessor.php index 2a3cdf95b7..2e9deb6307 100644 --- a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/TopLevelPreprocessor.php +++ b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/TopLevelPreprocessor.php @@ -18,7 +18,7 @@ class TopLevelPreprocessor implements Preprocessor { * But for rendering purposes it is more convenient to have them wrapped in a single column. * This method walks through the first level of blocks and wraps non column blocks into a single column. */ - public function preprocess(array $parsedBlocks, array $layoutStyles): array { + public function preprocess(array $parsedBlocks, array $layout, array $styles): array { $wrappedParsedBlocks = []; $nonColumnsBlocksBuffer = []; foreach ($parsedBlocks as $block) { diff --git a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/TypographyPreprocessor.php b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/TypographyPreprocessor.php index 2f7192ef55..aa12d3d4b3 100644 --- a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/TypographyPreprocessor.php +++ b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/Preprocessors/TypographyPreprocessor.php @@ -24,7 +24,7 @@ class TypographyPreprocessor implements Preprocessor { $this->settingsController = $settingsController; } - public function preprocess(array $parsedBlocks, array $layoutStyles): array { + public function preprocess(array $parsedBlocks, array $layout, array $styles): array { foreach ($parsedBlocks as $key => $block) { $block = $this->preprocessParent($block); // Set defaults from theme - this needs to be done on top level blocks only diff --git a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/ProcessManager.php b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/ProcessManager.php index 0047e7a1e9..699af759a4 100644 --- a/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/ProcessManager.php +++ b/mailpoet/lib/EmailEditor/Engine/Renderer/ContentRenderer/ProcessManager.php @@ -39,12 +39,13 @@ class ProcessManager { /** * @param array $parsedBlocks - * @param array{width: string, background: string, padding: array{bottom: string, left: string, right: string, top: string}} $layoutStyles + * @param array{contentSize: string} $layout + * @param array{spacing: array{padding: array{bottom: string, left: string, right: string, top: string}, blockGap: string}} $styles * @return array */ - public function preprocess(array $parsedBlocks, array $layoutStyles): array { + public function preprocess(array $parsedBlocks, array $layout, array $styles): array { foreach ($this->preprocessors as $preprocessor) { - $parsedBlocks = $preprocessor->preprocess($parsedBlocks, $layoutStyles); + $parsedBlocks = $preprocessor->preprocess($parsedBlocks, $layout, $styles); } return $parsedBlocks; } diff --git a/mailpoet/lib/EmailEditor/Engine/Renderer/Renderer.php b/mailpoet/lib/EmailEditor/Engine/Renderer/Renderer.php index 6513d8dc49..eae9243db2 100644 --- a/mailpoet/lib/EmailEditor/Engine/Renderer/Renderer.php +++ b/mailpoet/lib/EmailEditor/Engine/Renderer/Renderer.php @@ -17,6 +17,9 @@ class Renderer { const TEMPLATE_FILE = 'template.html'; const TEMPLATE_STYLES_FILE = 'template.css'; + /** @var string This color is used as a wrapper of the rendered email */ + const LAYOUT_COLOR = '#cccccc'; + /** * @param \MailPoetVendor\CSS $cssInliner */ @@ -31,20 +34,23 @@ class Renderer { } public function render(\WP_Post $post, string $subject, string $preHeader, string $language, $metaRobots = ''): array { - $layoutStyles = $this->settingsController->getEmailStyles()['layout']; - $themeData = $this->settingsController->getTheme()->get_data(); - $contentBackground = $themeData['styles']['color']['background'] ?? $layoutStyles['background']; - $contentFontFamily = $themeData['styles']['typography']['fontFamily']; + $layout = $this->settingsController->getLayout(); + $themeStyles = $this->settingsController->getEmailStyles(); + $padding = $themeStyles['spacing']['padding']; + + $contentBackground = $themeStyles['color']['background']; + $contentFontFamily = $themeStyles['typography']['fontFamily']; $renderedBody = $this->contentRenderer->render($post); $styles = (string)file_get_contents(dirname(__FILE__) . '/' . self::TEMPLATE_STYLES_FILE); + $styles = apply_filters('mailpoet_email_renderer_styles', $styles, $post); $template = (string)file_get_contents(dirname(__FILE__) . '/' . self::TEMPLATE_FILE); // Replace style settings placeholders with values $template = str_replace( ['{{width}}', '{{layout_background}}', '{{content_background}}', '{{content_font_family}}', '{{padding_top}}', '{{padding_right}}', '{{padding_bottom}}', '{{padding_left}}'], - [$layoutStyles['width'], $layoutStyles['background'], $contentBackground, $contentFontFamily, $layoutStyles['padding']['top'], $layoutStyles['padding']['right'], $layoutStyles['padding']['bottom'], $layoutStyles['padding']['left']], + [$layout['contentSize'], self::LAYOUT_COLOR, $contentBackground, $contentFontFamily, $padding['top'], $padding['right'], $padding['bottom'], $padding['left']], $template ); diff --git a/mailpoet/lib/EmailEditor/Engine/SettingsController.php b/mailpoet/lib/EmailEditor/Engine/SettingsController.php index 6b4425d116..1fac1da4a0 100644 --- a/mailpoet/lib/EmailEditor/Engine/SettingsController.php +++ b/mailpoet/lib/EmailEditor/Engine/SettingsController.php @@ -26,18 +26,6 @@ class SettingsController { */ const EMAIL_WIDTH = '660px'; - /** - * Color of email layout background. - * @var string - */ - const EMAIL_LAYOUT_BACKGROUND = '#cccccc'; - - /** - * Gap between blocks in flex layouts - * @var string - */ - const FLEX_GAP = '16px'; - private ThemeController $themeController; /** @@ -59,7 +47,6 @@ class SettingsController { $contentVariables = 'body {'; $contentVariables .= 'padding-bottom: var(--wp--style--root--padding-bottom);'; $contentVariables .= 'padding-top: var(--wp--style--root--padding-top);'; - $contentVariables .= '--wp--style--block-gap:' . self::FLEX_GAP . ';'; $contentVariables .= '}'; $settings = array_merge($coreDefaultSettings, self::DEFAULT_SETTINGS); @@ -93,44 +80,29 @@ class SettingsController { /** * @return array{ - * layout: array{width: string,background: string,padding: array{bottom: string, left: string, right: string, top: string}}, - * colors: array{background: string}, - * typography: array[] + * spacing: array{ + * blockGap: string, + * padding: array{bottom: string, left: string, right: string, top: string} + * }, + * color: array{ + * background: array{layout: string, content: string} + * }, + * typography: array{ + * fontFamily: string + * } * } */ public function getEmailStyles(): array { - return [ - 'layout' => [ - 'background' => self::EMAIL_LAYOUT_BACKGROUND, - 'width' => self::EMAIL_WIDTH, - 'padding' => [ - 'bottom' => self::FLEX_GAP, - 'left' => self::FLEX_GAP, - 'right' => self::FLEX_GAP, - 'top' => self::FLEX_GAP, - ], - ], - 'colors' => [ - 'background' => '#ffffff', - ], - 'typography' => [ - ], - // Value are only for purpose of displaying in the preview component in style sidebar - 'elements' => [ - 'h1' => [ - 'color' => '#000000', - 'fontWeight' => 'bold', - 'fontFamily' => "Arial, 'Helvetica Neue', Helvetica, sans-serif", - ], - ], - ]; + $theme = $this->getTheme(); + return $theme->get_data()['styles']; } public function getLayoutWidthWithoutPadding(): string { - $layoutStyles = $this->getEmailStyles(); - $width = $this->parseNumberFromStringWithPixels($layoutStyles['layout']['width']); - $width -= $this->parseNumberFromStringWithPixels($layoutStyles['layout']['padding']['left']); - $width -= $this->parseNumberFromStringWithPixels($layoutStyles['layout']['padding']['right']); + $styles = $this->getEmailStyles(); + $layout = $this->getLayout(); + $width = $this->parseNumberFromStringWithPixels($layout['contentSize']); + $width -= $this->parseNumberFromStringWithPixels($styles['spacing']['padding']['left']); + $width -= $this->parseNumberFromStringWithPixels($styles['spacing']['padding']['right']); return "{$width}px"; } diff --git a/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Columns.php b/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Columns.php index 80ba6cc810..d618f9114f 100644 --- a/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Columns.php +++ b/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Columns.php @@ -61,8 +61,8 @@ class Columns implements BlockRenderer { $contentCSS = WP_Style_Engine::compile_css( $cellStyles, '' ); $layoutCSS = WP_Style_Engine::compile_css( [ 'margin-top' => $parsedBlock['email_attrs']['margin-top'] ?? '0px', - 'padding-left' => $block_attributes['align'] !== 'full' ? $settingsController->getEmailStyles()['layout']['padding']['left'] : '0px', - 'padding-right' => $block_attributes['align'] !== 'full' ? $settingsController->getEmailStyles()['layout']['padding']['right'] : '0px', + 'padding-left' => $block_attributes['align'] !== 'full' ? $settingsController->getEmailStyles()['spacing']['padding']['left'] : '0px', + 'padding-right' => $block_attributes['align'] !== 'full' ? $settingsController->getEmailStyles()['spacing']['padding']['right'] : '0px', ], '' ); $tableWidth = $block_attributes['align'] !== 'full' ? $block_attributes['width'] : '100%'; diff --git a/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/BlocksWidthPreprocessorTest.php b/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/BlocksWidthPreprocessorTest.php index e4c1670221..b2b41136f7 100644 --- a/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/BlocksWidthPreprocessorTest.php +++ b/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/BlocksWidthPreprocessorTest.php @@ -9,9 +9,17 @@ class BlocksWidthPreprocessorTest extends \MailPoetUnitTest { /** @var BlocksWidthPreprocessor */ private $preprocessor; + /** @var array{contentSize: string} */ + private array $layout; + + /** @var array{spacing: array{padding: array{bottom: string, left: string, right: string, top: string}, blockGap: string}} $styles */ + private array $styles; + public function _before() { parent::_before(); $this->preprocessor = new BlocksWidthPreprocessor(); + $this->layout = ['contentSize' => '660px']; + $this->styles = ['spacing' => ['padding' => ['left' => '10px', 'right' => '10px', 'top' => '10px', 'bottom' => '10px'], 'blockGap' => '10px']]; } public function testItCalculatesWidthWithoutPadding(): void { @@ -42,7 +50,9 @@ class BlocksWidthPreprocessorTest extends \MailPoetUnitTest { ], ], ]]; - $result = $this->preprocessor->preprocess($blocks, ['width' => '660px', 'padding' => ['left' => '0px', 'right' => '0px']]); + $styles = $this->styles; + $styles['spacing']['padding'] = ['left' => '0px', 'right' => '0px', 'top' => '0px', 'bottom' => '0px']; + $result = $this->preprocessor->preprocess($blocks, $this->layout, $styles); $result = $result[0]; verify($result['email_attrs']['width'])->equals('660px'); verify($result['innerBlocks'])->arrayCount(3); @@ -79,12 +89,12 @@ class BlocksWidthPreprocessorTest extends \MailPoetUnitTest { ], ], ]]; - $result = $this->preprocessor->preprocess($blocks, ['width' => '600px', 'padding' => ['left' => '20px', 'right' => '20px']]); + $result = $this->preprocessor->preprocess($blocks, $this->layout, $this->styles); $result = $result[0]; verify($result['innerBlocks'])->arrayCount(3); - verify($result['innerBlocks'][0]['email_attrs']['width'])->equals('185px'); // (600 - 20 - 20) * 0.33 + verify($result['innerBlocks'][0]['email_attrs']['width'])->equals('211px'); // (660 - 10 - 10) * 0.33 verify($result['innerBlocks'][1]['email_attrs']['width'])->equals('100px'); - verify($result['innerBlocks'][2]['email_attrs']['width'])->equals('112px'); // (600 - 20 - 20) * 0.2 + verify($result['innerBlocks'][2]['email_attrs']['width'])->equals('128px'); // (660 - 10 - 10) * 0.2 } public function testItCalculatesWidthOfBlockInColumn(): void { @@ -136,14 +146,14 @@ class BlocksWidthPreprocessorTest extends \MailPoetUnitTest { ], ], ]]; - $result = $this->preprocessor->preprocess($blocks, ['width' => '660px', 'padding' => ['left' => '15px', 'right' => '15px']]); + $result = $this->preprocessor->preprocess($blocks, $this->layout, $this->styles); $innerBlocks = $result[0]['innerBlocks']; verify($innerBlocks)->arrayCount(2); - verify($innerBlocks[0]['email_attrs']['width'])->equals('252px'); // (660 - 15 - 15) * 0.4 - verify($innerBlocks[0]['innerBlocks'][0]['email_attrs']['width'])->equals('232px'); // 252 - 10 - 10 - verify($innerBlocks[1]['email_attrs']['width'])->equals('378px'); // (660 - 15 - 15) * 0.6 - verify($innerBlocks[1]['innerBlocks'][0]['email_attrs']['width'])->equals('338px'); // 378 - 25 - 15 + verify($innerBlocks[0]['email_attrs']['width'])->equals('256px'); // (660 - 10 - 10) * 0.4 + verify($innerBlocks[0]['innerBlocks'][0]['email_attrs']['width'])->equals('236px'); // 256 - 10 - 10 + verify($innerBlocks[1]['email_attrs']['width'])->equals('384px'); // (660 - 10 - 10) * 0.6 + verify($innerBlocks[1]['innerBlocks'][0]['email_attrs']['width'])->equals('344px'); // 384 - 25 - 15 } public function testItAddsMissingColumnWidth(): void { @@ -186,15 +196,15 @@ class BlocksWidthPreprocessorTest extends \MailPoetUnitTest { ], ], ]]; - $result = $this->preprocessor->preprocess($blocks, ['width' => '660px', 'padding' => ['left' => '30px', 'right' => '30px']]); + $result = $this->preprocessor->preprocess($blocks, ['contentSize' => '620px'], $this->styles); $innerBlocks = $result[0]['innerBlocks']; verify($innerBlocks)->arrayCount(3); - verify($innerBlocks[0]['email_attrs']['width'])->equals('200px'); // (660 - 30 - 30) * 0.33 + verify($innerBlocks[0]['email_attrs']['width'])->equals('200px'); // (660 - 10 - 10) * 0.33 verify($innerBlocks[0]['innerBlocks'][0]['email_attrs']['width'])->equals('200px'); - verify($innerBlocks[1]['email_attrs']['width'])->equals('200px'); // (660 - 30 - 30) * 0.33 + verify($innerBlocks[1]['email_attrs']['width'])->equals('200px'); // (660 - 10 - 10) * 0.33 verify($innerBlocks[1]['innerBlocks'][0]['email_attrs']['width'])->equals('200px'); - verify($innerBlocks[2]['email_attrs']['width'])->equals('200px'); // (660 - 30 - 30) * 0.33 + verify($innerBlocks[2]['email_attrs']['width'])->equals('200px'); // (660 - 10 - 10) * 0.33 verify($innerBlocks[2]['innerBlocks'][0]['email_attrs']['width'])->equals('200px'); } @@ -233,11 +243,11 @@ class BlocksWidthPreprocessorTest extends \MailPoetUnitTest { ], ], ]]; - $result = $this->preprocessor->preprocess($blocks, ['width' => '660px', 'padding' => ['left' => '10px', 'right' => '10px']]); + $result = $this->preprocessor->preprocess($blocks, $this->layout, $this->styles); $innerBlocks = $result[0]['innerBlocks']; verify($innerBlocks)->arrayCount(3); - verify($innerBlocks[0]['email_attrs']['width'])->equals('200px'); // (640 - 25 - 15) * 0.3333 + verify($innerBlocks[0]['email_attrs']['width'])->equals('200px'); // (620 - 10 - 10) * 0.3333 verify($innerBlocks[1]['email_attrs']['width'])->equals('200px'); // already defined verify($innerBlocks[2]['email_attrs']['width'])->equals('200px'); // 600 -200 - 200 } @@ -257,11 +267,11 @@ class BlocksWidthPreprocessorTest extends \MailPoetUnitTest { 'innerBlocks' => [], ], ]; - $result = $this->preprocessor->preprocess($blocks, ['width' => '660px', 'padding' => ['left' => '15px', 'right' => '15px']]); + $result = $this->preprocessor->preprocess($blocks, $this->layout, $this->styles); verify($result)->arrayCount(2); verify($result[0]['email_attrs']['width'])->equals('660px'); // full width - verify($result[1]['email_attrs']['width'])->equals('630px'); // 660 - 15 - 15 + verify($result[1]['email_attrs']['width'])->equals('640px'); // 660 - 10 - 10 } public function testItCalculatesWidthForColumnWithoutDefinition(): void { @@ -324,7 +334,7 @@ class BlocksWidthPreprocessorTest extends \MailPoetUnitTest { ], ]]; - $result = $this->preprocessor->preprocess($blocks, ['width' => '660px', 'padding' => ['left' => '10px', 'right' => '10px']]); + $result = $this->preprocessor->preprocess($blocks, $this->layout, $this->styles); verify($result[0]['innerBlocks'])->arrayCount(3); verify($result[0]['innerBlocks'][0]['email_attrs']['width'])->equals('140px'); verify($result[0]['innerBlocks'][1]['email_attrs']['width'])->equals('220px'); @@ -357,7 +367,7 @@ class BlocksWidthPreprocessorTest extends \MailPoetUnitTest { ], ]]; - $result = $this->preprocessor->preprocess($blocks, ['width' => '660px', 'padding' => ['left' => '10px', 'right' => '10px']]); + $result = $this->preprocessor->preprocess($blocks, $this->layout, $this->styles); verify($result[0]['innerBlocks'])->arrayCount(2); verify($result[0]['innerBlocks'][0]['email_attrs']['width'])->equals('140px'); verify($result[0]['innerBlocks'][1]['email_attrs']['width'])->equals('500px'); @@ -440,14 +450,14 @@ class BlocksWidthPreprocessorTest extends \MailPoetUnitTest { ], ]]; - $result = $this->preprocessor->preprocess($blocks, ['width' => '660px', 'padding' => ['left' => '16px', 'right' => '16px']]); + $result = $this->preprocessor->preprocess($blocks, $this->layout, $this->styles); verify($result[0]['innerBlocks'])->arrayCount(3); verify($result[0]['innerBlocks'][0]['email_attrs']['width'])->equals('140px'); - verify($result[0]['innerBlocks'][1]['email_attrs']['width'])->equals('179px'); - verify($result[0]['innerBlocks'][2]['email_attrs']['width'])->equals('249px'); + verify($result[0]['innerBlocks'][1]['email_attrs']['width'])->equals('185px'); + verify($result[0]['innerBlocks'][2]['email_attrs']['width'])->equals('255px'); $imageBlock = $result[0]['innerBlocks'][1]['innerBlocks'][0]; - verify($imageBlock['email_attrs']['width'])->equals('179px'); + verify($imageBlock['email_attrs']['width'])->equals('185px'); $imageBlock = $result[0]['innerBlocks'][2]['innerBlocks'][0]; - verify($imageBlock['email_attrs']['width'])->equals('209px'); + verify($imageBlock['email_attrs']['width'])->equals('215px'); } } diff --git a/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/CleanupPreprocessorTest.php b/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/CleanupPreprocessorTest.php index f59c41b437..22ac224790 100644 --- a/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/CleanupPreprocessorTest.php +++ b/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/CleanupPreprocessorTest.php @@ -25,9 +25,17 @@ class CleanupPreprocessorTest extends \MailPoetUnitTest { /** @var CleanupPreprocessor */ private $preprocessor; + /** @var array{contentSize: string} */ + private array $layout; + + /** @var array{spacing: array{padding: array{bottom: string, left: string, right: string, top: string}, blockGap: string}} $styles */ + private array $styles; + public function _before() { parent::_before(); $this->preprocessor = new CleanupPreprocessor(); + $this->layout = ['contentSize' => '660px']; + $this->styles = ['spacing' => ['padding' => ['left' => '10px', 'right' => '10px', 'top' => '10px', 'bottom' => '10px'], 'blockGap' => '10px']]; } public function testItRemovesUnwantedBlocks(): void { @@ -36,7 +44,7 @@ class CleanupPreprocessorTest extends \MailPoetUnitTest { ['blockName' => null, 'attrs' => [], 'innerHTML' => "\r\n"], self::PARAGRAPH_BLOCK, ]; - $result = $this->preprocessor->preprocess($blocks, []); + $result = $this->preprocessor->preprocess($blocks, $this->layout, $this->styles); verify($result)->arrayCount(2); verify($result[0])->equals(self::COLUMNS_BLOCK); verify($result[1])->equals(self::PARAGRAPH_BLOCK); @@ -48,7 +56,7 @@ class CleanupPreprocessorTest extends \MailPoetUnitTest { self::PARAGRAPH_BLOCK, self::COLUMNS_BLOCK, ]; - $result = $this->preprocessor->preprocess($blocks, []); + $result = $this->preprocessor->preprocess($blocks, $this->layout, $this->styles); verify($result)->arrayCount(3); verify($result[0])->equals(self::COLUMNS_BLOCK); verify($result[1])->equals(self::PARAGRAPH_BLOCK); diff --git a/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/SpacingPreprocessorTest.php b/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/SpacingPreprocessorTest.php index 330f22e9f2..8b4a504366 100644 --- a/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/SpacingPreprocessorTest.php +++ b/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/SpacingPreprocessorTest.php @@ -3,16 +3,23 @@ namespace unit\EmailEditor\Engine\Renderer\Preprocessors; use MailPoet\EmailEditor\Engine\Renderer\ContentRenderer\Preprocessors\SpacingPreprocessor; -use MailPoet\EmailEditor\Engine\SettingsController; class SpacingPreprocessorTest extends \MailPoetUnitTest { /** @var SpacingPreprocessor */ private $preprocessor; + /** @var array{contentSize: string} */ + private array $layout; + + /** @var array{spacing: array{padding: array{bottom: string, left: string, right: string, top: string}, blockGap: string}} $styles */ + private array $styles; + public function _before() { parent::_before(); $this->preprocessor = new SpacingPreprocessor(); + $this->layout = ['contentSize' => '660px']; + $this->styles = ['spacing' => ['padding' => ['left' => '10px', 'right' => '10px', 'top' => '10px', 'bottom' => '10px'], 'blockGap' => '10px']]; } public function testItAddsDefaultVerticalSpacing(): void { @@ -68,8 +75,8 @@ class SpacingPreprocessorTest extends \MailPoetUnitTest { ], ]; - $expectedEmailAttrs = ['margin-top' => SettingsController::FLEX_GAP]; - $result = $this->preprocessor->preprocess($blocks, []); + $expectedEmailAttrs = ['margin-top' => '10px']; + $result = $this->preprocessor->preprocess($blocks, $this->layout, $this->styles); verify($result)->arrayCount(2); $firstColumns = $result[0]; $secondColumns = $result[1]; diff --git a/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/TopLevelPreprocessorTest.php b/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/TopLevelPreprocessorTest.php index 51f6582d85..ffb09581fa 100644 --- a/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/TopLevelPreprocessorTest.php +++ b/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/TopLevelPreprocessorTest.php @@ -31,14 +31,22 @@ class TopLevelPreprocessorTest extends \MailPoetUnitTest { /** @var TopLevelPreprocessor */ private $preprocessor; + /** @var array{contentSize: string} */ + private array $layout; + + /** @var array{spacing: array{padding: array{bottom: string, left: string, right: string, top: string}, blockGap: string}} $styles */ + private array $styles; + public function _before() { parent::_before(); $this->preprocessor = new TopLevelPreprocessor(); + $this->layout = ['contentSize' => '660px']; + $this->styles = ['spacing' => ['padding' => ['left' => '10px', 'right' => '10px', 'top' => '10px', 'bottom' => '10px'], 'blockGap' => '10px']]; } public function testItWrapsSingleTopLevelBlockIntoColumns() { $parsedDocument = [$this->paragraphBlock]; - $result = $this->preprocessor->preprocess($parsedDocument, []); + $result = $this->preprocessor->preprocess($parsedDocument, $this->layout, $this->styles); verify($result[0]['blockName'])->equals('core/columns'); verify($result[0]['innerBlocks'][0]['blockName'])->equals('core/column'); verify($result[0]['innerBlocks'][0]['innerBlocks'][0]['blockName'])->equals('core/paragraph'); @@ -47,14 +55,14 @@ class TopLevelPreprocessorTest extends \MailPoetUnitTest { public function testItDoesntWrapColumns() { $parsedDocumentWithMultipleColumns = [$this->columnsBlock, $this->columnsBlock]; - $result = $this->preprocessor->preprocess($parsedDocumentWithMultipleColumns, []); + $result = $this->preprocessor->preprocess($parsedDocumentWithMultipleColumns, $this->layout, $this->styles); verify($result)->equals($parsedDocumentWithMultipleColumns); } public function testItWrapsTopLevelBlocksSpreadBetweenColumns() { $parsedDocument = [$this->paragraphBlock, $this->columnsBlock, $this->paragraphBlock, $this->paragraphBlock]; // We expect to wrap top level paragraph blocks into columns so the result should three columns blocks - $result = $this->preprocessor->preprocess($parsedDocument, []); + $result = $this->preprocessor->preprocess($parsedDocument, $this->layout, $this->styles); verify($result)->arrayCount(3); // First columns contain columns with one paragraph block verify($result[0]['innerBlocks'][0]['blockName'])->equals('core/column'); @@ -76,7 +84,7 @@ class TopLevelPreprocessorTest extends \MailPoetUnitTest { $parsedDocument[5]['attrs']['align'] = 'full'; $parsedDocument[5]['innerBlocks'][0]['innerBlocks'][] = $this->paragraphBlock; // We expect to wrap top level paragraph blocks into columns so the result should three columns blocks - $result = $this->preprocessor->preprocess($parsedDocument, []); + $result = $this->preprocessor->preprocess($parsedDocument, $this->layout, $this->styles); verify($result)->arrayCount(5); // First block is a full width paragraph and must be wrapped in a single column verify($result[0]['blockName'])->equals('core/columns'); diff --git a/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/TypographyPreprocessorTest.php b/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/TypographyPreprocessorTest.php index 5f3dfffa1a..21d66107de 100644 --- a/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/TypographyPreprocessorTest.php +++ b/mailpoet/tests/unit/EmailEditor/Engine/Renderer/Preprocessors/TypographyPreprocessorTest.php @@ -10,6 +10,12 @@ class TypographyPreprocessorTest extends \MailPoetUnitTest { /** @var TypographyPreprocessor */ private $preprocessor; + /** @var array{contentSize: string} */ + private array $layout; + + /** @var array{spacing: array{padding: array{bottom: string, left: string, right: string, top: string}, blockGap: string}} $styles */ + private array $styles; + public function _before() { parent::_before(); $settingsMock = $this->createMock(SettingsController::class); @@ -47,6 +53,8 @@ class TypographyPreprocessorTest extends \MailPoetUnitTest { return str_replace('slug-', '', $slug); }); $this->preprocessor = new TypographyPreprocessor($settingsMock); + $this->layout = ['contentSize' => '660px']; + $this->styles = ['spacing' => ['padding' => ['left' => '10px', 'right' => '10px', 'top' => '10px', 'bottom' => '10px'], 'blockGap' => '10px']]; } public function testItCopiesColumnsTypography(): void { @@ -86,7 +94,7 @@ class TypographyPreprocessorTest extends \MailPoetUnitTest { 'font-size' => '12px', 'text-decoration' => 'underline', ]; - $result = $this->preprocessor->preprocess($blocks, []); + $result = $this->preprocessor->preprocess($blocks, $this->layout, $this->styles); $result = $result[0]; verify($result['innerBlocks'])->arrayCount(2); verify($result['email_attrs'])->equals($expectedEmailAttrs); @@ -123,7 +131,7 @@ class TypographyPreprocessorTest extends \MailPoetUnitTest { 'color' => '#000000', 'font-size' => '20px', ]; - $result = $this->preprocessor->preprocess($blocks, []); + $result = $this->preprocessor->preprocess($blocks, $this->layout, $this->styles); $result = $result[0]; verify($result['innerBlocks'])->arrayCount(2); verify($result['email_attrs'])->equals($expectedEmailAttrs); @@ -156,7 +164,7 @@ class TypographyPreprocessorTest extends \MailPoetUnitTest { ], ], ]]; - $result = $this->preprocessor->preprocess($blocks, []); + $result = $this->preprocessor->preprocess($blocks, $this->layout, $this->styles); $result = $result[0]; verify($result['innerBlocks'])->arrayCount(2); verify($result['email_attrs'])->equals(['width' => '640px', 'color' => '#000000', 'font-size' => '13px']); @@ -251,7 +259,7 @@ class TypographyPreprocessorTest extends \MailPoetUnitTest { 'color' => '#cc22aa', 'font-size' => '18px', ]; - $result = $this->preprocessor->preprocess($blocks, []); + $result = $this->preprocessor->preprocess($blocks, $this->layout, $this->styles); $child1 = $result[0]; $child2 = $result[1]; verify($child1['innerBlocks'])->arrayCount(2); diff --git a/mailpoet/tests/unit/EmailEditor/Engine/Renderer/ProcessManagerTest.php b/mailpoet/tests/unit/EmailEditor/Engine/Renderer/ProcessManagerTest.php index d8d0554875..6ad48b15b0 100644 --- a/mailpoet/tests/unit/EmailEditor/Engine/Renderer/ProcessManagerTest.php +++ b/mailpoet/tests/unit/EmailEditor/Engine/Renderer/ProcessManagerTest.php @@ -13,14 +13,18 @@ use MailPoet\EmailEditor\Engine\Renderer\ContentRenderer\ProcessManager; class ProcessManagerTest extends \MailPoetUnitTest { public function testItCallsPreprocessorsProperly(): void { - $layoutStyles = [ - 'width' => '600px', - 'background' => '#ffffff', - 'padding' => [ - 'bottom' => '0px', - 'left' => '0px', - 'right' => '0px', - 'top' => '0px', + $layout = [ + 'contentSize' => '600px', + ]; + $styles = [ + 'spacing' => [ + 'blockGap' => '0px', + 'padding' => [ + 'bottom' => '0px', + 'left' => '0px', + 'right' => '0px', + 'top' => '0px', + ], ], ]; $topLevel = $this->createMock(TopLevelPreprocessor::class); @@ -49,7 +53,7 @@ class ProcessManagerTest extends \MailPoetUnitTest { $processManager = new ProcessManager($cleanup, $topLevel, $blocksWidth, $typography, $spacing, $highlighting, $variables); $processManager->registerPreprocessor($secondPreprocessor); - verify($processManager->preprocess([], $layoutStyles))->equals([]); + verify($processManager->preprocess([], $layout, $styles))->equals([]); verify($processManager->postprocess(''))->equals(''); } } diff --git a/mailpoet/tests/unit/EmailEditor/Engine/SettingsControllerTest.php b/mailpoet/tests/unit/EmailEditor/Engine/SettingsControllerTest.php index 963ddc4dab..685177c39b 100644 --- a/mailpoet/tests/unit/EmailEditor/Engine/SettingsControllerTest.php +++ b/mailpoet/tests/unit/EmailEditor/Engine/SettingsControllerTest.php @@ -6,23 +6,24 @@ use MailPoet\EmailEditor\Engine\SettingsController; use MailPoet\EmailEditor\Engine\ThemeController; class SettingsControllerTest extends \MailPoetUnitTest { - public function testItGetsMainLayoutStyles(): void { - $settingsController = new SettingsController($this->makeEmpty(ThemeController::class)); - $styles = $settingsController->getEmailStyles(); - verify($styles)->arrayHasKey('layout'); - verify($styles)->arrayHasKey('colors'); - verify($styles)->arrayHasKey('typography'); - $layoutStyles = $styles['layout']; - verify($layoutStyles)->arrayHasKey('background'); - verify($layoutStyles)->arrayHasKey('padding'); - verify($layoutStyles)->arrayHasKey('width'); - } - public function testItGetsCorrectLayoutWidthWithoutPadding(): void { - $settingsController = new SettingsController($this->makeEmpty(ThemeController::class)); + $themeJsonMock = $this->createMock(\WP_Theme_JSON::class); + $themeJsonMock->method('get_data')->willReturn([ + 'styles' => [ + 'spacing' => [ + 'padding' => [ + 'left' => '10px', + 'right' => '10px', + ], + ], + ], + ]); + $themeController = $this->createMock(ThemeController::class); + $themeController->method('getTheme')->willReturn($themeJsonMock); + $settingsController = new SettingsController($themeController); $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; + $expectedWidth = (int)SettingsController::EMAIL_WIDTH - 10 * 2; verify($layoutWidth)->equals($expectedWidth . 'px'); }