Remove BlocksRenderer and fix tests

[MAILPOET-5591]
This commit is contained in:
Jan Lysý
2023-10-27 08:57:03 +02:00
committed by Jan Lysý
parent 2b0d1ea5c1
commit 2ce6fd8688
7 changed files with 31 additions and 156 deletions

View File

@ -341,7 +341,6 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\Preprocessors\TopLevelPreprocessor::class)->setPublic(true); $container->autowire(\MailPoet\EmailEditor\Engine\Renderer\Preprocessors\TopLevelPreprocessor::class)->setPublic(true);
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\Preprocessors\TypographyPreprocessor::class)->setPublic(true); $container->autowire(\MailPoet\EmailEditor\Engine\Renderer\Preprocessors\TypographyPreprocessor::class)->setPublic(true);
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\Renderer::class)->setPublic(true); $container->autowire(\MailPoet\EmailEditor\Engine\Renderer\Renderer::class)->setPublic(true);
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\BlocksRenderer::class)->setPublic(true);
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\BlocksRegistry::class)->setPublic(true); $container->autowire(\MailPoet\EmailEditor\Engine\Renderer\BlocksRegistry::class)->setPublic(true);
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\PreprocessManager::class)->setPublic(true); $container->autowire(\MailPoet\EmailEditor\Engine\Renderer\PreprocessManager::class)->setPublic(true);
$container->autowire(\MailPoet\EmailEditor\Integrations\Core\Initializer::class)->setPublic(true); $container->autowire(\MailPoet\EmailEditor\Integrations\Core\Initializer::class)->setPublic(true);

View File

@ -1,35 +0,0 @@
<?php declare(strict_types = 1);
namespace MailPoet\EmailEditor\Engine\Renderer;
class BlocksRenderer {
/** @var BlocksRegistry */
private $blockRenderersRegistry;
/** @var bool */
private $blocksInitialized = false;
public function __construct(
BlocksRegistry $blockRenderersRegistry
) {
$this->blockRenderersRegistry = $blockRenderersRegistry;
}
public function render(array $parsedBlocks): string {
if (!$this->blocksInitialized) {
$this->blocksInitialized = true;
do_action('mailpoet_blocks_renderer_initialized', $this->blockRenderersRegistry);
}
$content = '';
foreach ($parsedBlocks as $parsedBlock) {
$content .= render_block($parsedBlock);
}
do_action('mailpoet_blocks_renderer_uninitialized', $this->blockRenderersRegistry);
$this->blocksInitialized = false;
return $content;
}
}

View File

@ -11,8 +11,8 @@ class Renderer {
/** @var \MailPoetVendor\CSS */ /** @var \MailPoetVendor\CSS */
private $cssInliner; private $cssInliner;
/** @var BlocksRenderer */ /** @var BlocksRegistry */
private $blocksRenderer; private $blocksRegistry;
/** @var PreprocessManager */ /** @var PreprocessManager */
private $preprocessManager; private $preprocessManager;
@ -29,12 +29,12 @@ class Renderer {
public function __construct( public function __construct(
\MailPoetVendor\CSS $cssInliner, \MailPoetVendor\CSS $cssInliner,
PreprocessManager $preprocessManager, PreprocessManager $preprocessManager,
BlocksRenderer $blocksRenderer, BlocksRegistry $blocksRegistry,
SettingsController $settingsController SettingsController $settingsController
) { ) {
$this->cssInliner = $cssInliner; $this->cssInliner = $cssInliner;
$this->preprocessManager = $preprocessManager; $this->preprocessManager = $preprocessManager;
$this->blocksRenderer = $blocksRenderer; $this->blocksRegistry = $blocksRegistry;
$this->settingsController = $settingsController; $this->settingsController = $settingsController;
} }
@ -44,7 +44,7 @@ class Renderer {
$layoutStyles = $this->settingsController->getEmailLayoutStyles(); $layoutStyles = $this->settingsController->getEmailLayoutStyles();
$parsedBlocks = $this->preprocessManager->preprocess($parsedBlocks, $layoutStyles); $parsedBlocks = $this->preprocessManager->preprocess($parsedBlocks, $layoutStyles);
$renderedBody = $this->blocksRenderer->render($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 = apply_filters('mailpoet_email_renderer_styles', $styles, $post); $styles = apply_filters('mailpoet_email_renderer_styles', $styles, $post);
@ -87,6 +87,19 @@ class Renderer {
]; ];
} }
public function renderBlocks(array $parsedBlocks): string {
do_action('mailpoet_blocks_renderer_initialized', $this->blocksRegistry);
$content = '';
foreach ($parsedBlocks as $parsedBlock) {
$content .= render_block($parsedBlock);
}
do_action('mailpoet_blocks_renderer_uninitialized', $this->blocksRegistry);
return $content;
}
private function injectContentIntoTemplate($template, array $content) { private function injectContentIntoTemplate($template, array $content) {
return preg_replace_callback('/{{\w+}}/', function($matches) use (&$content) { return preg_replace_callback('/{{\w+}}/', function($matches) use (&$content) {
return array_shift($content); return array_shift($content);

View File

@ -1,79 +0,0 @@
<?php declare(strict_types = 1);
namespace MailPoet\EmailEditor\Engine\Renderer;
use MailPoet\EmailEditor\Engine\SettingsController;
require_once __DIR__ . '/DummyBlockRenderer.php';
class BlocksRendererTest extends \MailPoetTest {
public function _before() {
parent::_before();
add_action('mailpoet_blocks_renderer_initialized', [$this, 'registerDummyBlock']);
}
public function testItRendersContentForRegisteredBlocks() {
$renderer = $this->getBlocksRenderer();
$content = $renderer->render([
[
'blockName' => 'dummy/block',
'innerHTML' => 'Hello',
],
[
'blockName' => 'dummy/block',
'innerHTML' => 'Buddy!',
],
]);
verify($content)->equals('HelloBuddy!');
}
public function testItSkipsUnknownBlocks() {
$renderer = $this->getBlocksRenderer();
$content = $renderer->render([
[
'blockName' => 'dummy/block',
'innerHTML' => 'Hello',
],
[
'blockName' => 'unknown/block',
'innerHTML' => 'Buddy!',
],
]);
verify($content)->equals('Hello');
}
public function testItCanProcessNestedBlocks() {
$renderer = $this->getBlocksRenderer();
$content = $renderer->render([
[
'blockName' => 'dummy/block',
'innerBlocks' => [[
'blockName' => 'dummy/block',
'innerHTML' => 'Hello',
],
[
'blockName' => 'dummy/block',
'innerHTML' => 'Buddy!',
],
],
],
]);
verify($content)->equals('[HelloBuddy!]');
}
public function _after() {
parent::_after();
remove_action('mailpoet_blocks_renderer_initialized', [$this, 'postRegisterCallback']);
}
public function registerDummyBlock(BlocksRegistry $registry) {
$registry->addBlockRenderer('dummy/block', new DummyBlockRenderer());
}
private function getBlocksRenderer() {
return new BlocksRenderer(
new BlocksRegistry(),
new SettingsController()
);
}
}

View File

@ -2,14 +2,12 @@
namespace MailPoet\EmailEditor\Engine\Renderer; namespace MailPoet\EmailEditor\Engine\Renderer;
use MailPoet\EmailEditor\Engine\SettingsController;
class DummyBlockRenderer implements BlockRenderer { class DummyBlockRenderer implements BlockRenderer {
public function render($parsedBlock, BlocksRenderer $blocksRenderer, SettingsController $settingsController): string { public function render(string $blockContent, array $parsedBlock): string {
if (!isset($parsedBlock['innerBlocks']) || empty($parsedBlock['innerBlocks'])) { if (!isset($parsedBlock['innerBlocks']) || empty($parsedBlock['innerBlocks'])) {
return $parsedBlock['innerHTML']; return $parsedBlock['innerHTML'];
} }
// Wrapper is rendered in parent Columns block because it needs to operate with columns count etc. // Wrapper is rendered in parent Columns block because it needs to operate with columns count etc.
return '[' . $blocksRenderer->render($parsedBlock['innerBlocks']) . ']'; return '[' . $this->render('', $parsedBlock['innerBlocks']) . ']';
} }
} }

View File

@ -72,23 +72,23 @@ class RendererTest extends \MailPoetTest {
} }
$this->assertInstanceOf(\DOMElement::class, $body); $this->assertInstanceOf(\DOMElement::class, $body);
$style = $body->getAttribute('style'); $style = $body->getAttribute('style');
verify($style)->stringContainsString('font-family:Arial,\'Helvetica Neue\',Helvetica,sans-serif;'); verify($style)->stringContainsString('margin:0;padding:0;');
} }
public function testItAppliesLayoutStyles() { public function testItAppliesLayoutStyles() {
$settingsControllerMock = $this->createMock(SettingsController::class); $settingsControllerMock = $this->createMock(SettingsController::class);
$settingsControllerMock->method('getEmailLayoutStyles')->willReturn([ $settingsControllerMock->method('getEmailLayoutStyles')->willReturn([
'width' => 123, 'width' => '123px',
'background' => '#123456', 'background' => '#123456',
'padding' => [ 'padding' => [
'left' => 1, 'left' => '1px',
'right' => 2, 'right' => '2px',
'top' => 3, 'top' => '3px',
'bottom' => 4, 'bottom' => '4px',
], ],
]); ]);
$renderer = $this->getServiceWithOverrides(Renderer::class, [ $renderer = $this->getServiceWithOverrides(Renderer::class, [
'stylesController' => $settingsControllerMock, 'settingsController' => $settingsControllerMock,
]); ]);
$rendered = $renderer->render($this->emailPost, 'Subject', '', 'en'); $rendered = $renderer->render($this->emailPost, 'Subject', '', 'en');
$doc = new \DOMDocument(); $doc = new \DOMDocument();

View File

@ -3,13 +3,8 @@
namespace MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks; namespace MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks;
use MailPoet\EmailEditor\Engine\EmailEditor; use MailPoet\EmailEditor\Engine\EmailEditor;
use MailPoet\EmailEditor\Engine\Renderer\BlocksRenderer;
use MailPoet\EmailEditor\Engine\SettingsController;
class ColumnsTest extends \MailPoetTest { class ColumnsTest extends \MailPoetTest {
/** @var BlocksRenderer */
private $blocksRenderer;
/** @var Columns */ /** @var Columns */
private $columnsRenderer; private $columnsRenderer;
@ -17,6 +12,9 @@ class ColumnsTest extends \MailPoetTest {
private $parsedColumns = [ private $parsedColumns = [
'blockName' => 'core/columns', 'blockName' => 'core/columns',
'attrs' => [], 'attrs' => [],
'email_attrs' => [
'width' => '784px',
],
'innerBlocks' => [ 'innerBlocks' => [
0 => [ 0 => [
'blockName' => 'core/column', 'blockName' => 'core/column',
@ -44,31 +42,12 @@ class ColumnsTest extends \MailPoetTest {
public function _before() { public function _before() {
$this->diContainer->get(EmailEditor::class)->initialize(); $this->diContainer->get(EmailEditor::class)->initialize();
$this->blocksRenderer = $this->diContainer->get(BlocksRenderer::class);
$this->columnsRenderer = new Columns(); $this->columnsRenderer = new Columns();
} }
public function testItRendersInnerColumn() { public function testItRendersInnerColumn() {
$settingsController = $this->diContainer->get(SettingsController::class); $rendered = $this->columnsRenderer->render('', $this->parsedColumns);
$rendered = $this->columnsRenderer->render($this->parsedColumns, $this->blocksRenderer, $settingsController);
verify($rendered)->stringContainsString('Column 1'); verify($rendered)->stringContainsString('Column 1');
}
public function testItRendersWidthForOneColumn() {
$settingsController = $this->createMock(SettingsController::class);
$settingsController->method('getEmailLayoutStyles')
->willReturn(['width' => 800]);
$rendered = $this->columnsRenderer->render($this->parsedColumns, $this->blocksRenderer, $settingsController);
verify($rendered)->stringContainsString('width:784px;'); verify($rendered)->stringContainsString('width:784px;');
} }
public function testItRendersWidthForTwoColumns() {
$settingsController = $this->createMock(SettingsController::class);
$settingsController->method('getEmailLayoutStyles')
->willReturn(['width' => 800]);
$parsedColumns = $this->parsedColumns;
$parsedColumns['innerBlocks'][] = $parsedColumns['innerBlocks'][0]; // Insert another column
$rendered = $this->columnsRenderer->render($parsedColumns, $this->blocksRenderer, $settingsController);
verify($rendered)->stringContainsString('width:392px;');
}
} }