diff --git a/phpBB/phpbb/textformatter/s9e/renderer.php b/phpBB/phpbb/textformatter/s9e/renderer.php
index 7b8b382074..484b067d47 100644
--- a/phpBB/phpbb/textformatter/s9e/renderer.php
+++ b/phpBB/phpbb/textformatter/s9e/renderer.php
@@ -198,15 +198,28 @@ class renderer implements \phpbb\textformatter\renderer_interface
/**
* {@inheritdoc}
*/
- public function render($text)
+ public function render($xml)
{
+ $self = $this;
+
+ /**
+ * Modify a parsed text before it is rendered
+ *
+ * @event core.text_formatter_s9e_render_before
+ * @var \phpbb\textformatter\s9e\renderer self This renderer service
+ * @var string xml The parsed text, in its XML form
+ * @since 3.2.0-a1
+ */
+ $vars = array('self', 'xml');
+ extract($this->dispatcher->trigger_event('core.text_formatter_s9e_render_before', compact($vars)));
+
if (isset($this->censor) && $this->viewcensors)
{
// NOTE: censorHtml() is XML-safe
- $text = $this->censor->censorHtml($text, true);
+ $xml = $this->censor->censorHtml($xml, true);
}
- $html = $this->renderer->render($text);
+ $html = $this->renderer->render($xml);
/**
* @see bbcode::bbcode_second_pass_code()
@@ -239,6 +252,17 @@ class renderer implements \phpbb\textformatter\renderer_interface
$html
);
+ /**
+ * Modify a rendered text
+ *
+ * @event core.text_formatter_s9e_render_after
+ * @var string html The renderer text's HTML
+ * @var \phpbb\textformatter\s9e\renderer self This renderer service
+ * @since 3.2.0-a1
+ */
+ $vars = array('html', 'self');
+ extract($this->dispatcher->trigger_event('core.text_formatter_s9e_render_after', compact($vars)));
+
return $html;
}
diff --git a/tests/text_formatter/s9e/renderer_test.php b/tests/text_formatter/s9e/renderer_test.php
index ab89d42620..c69a93dbc1 100644
--- a/tests/text_formatter/s9e/renderer_test.php
+++ b/tests/text_formatter/s9e/renderer_test.php
@@ -389,4 +389,58 @@ class phpbb_textformatter_s9e_renderer_test extends phpbb_test_case
&& isset($vars['self'])
&& $vars['self'] instanceof \phpbb\textformatter\s9e\renderer;
}
+
+ /**
+ * @testdox render() triggers a core.text_formatter_s9e_render_before and core.text_formatter_s9e_render_after events
+ */
+ public function test_render_event()
+ {
+ $container = $this->get_test_case_helpers()->set_s9e_services();
+ $dispatcher = $this->getMock('phpbb\\event\\dispatcher_interface');
+ $dispatcher
+ ->expects($this->any())
+ ->method('trigger_event')
+ ->will($this->returnArgument(1));
+ $dispatcher
+ ->expects($this->at(1))
+ ->method('trigger_event')
+ ->with(
+ 'core.text_formatter_s9e_render_before',
+ $this->callback(array($this, 'render_before_event_callback'))
+ )
+ ->will($this->returnArgument(1));
+ $dispatcher
+ ->expects($this->at(2))
+ ->method('trigger_event')
+ ->with(
+ 'core.text_formatter_s9e_render_after',
+ $this->callback(array($this, 'render_after_event_callback'))
+ )
+ ->will($this->returnArgument(1));
+
+ $renderer = new \phpbb\textformatter\s9e\renderer(
+ $container->get('cache.driver'),
+ $container->getParameter('cache.dir'),
+ '_foo_renderer',
+ $container->get('text_formatter.s9e.factory'),
+ $dispatcher
+ );
+ $renderer->render('...');
+ }
+
+ public function render_before_event_callback($vars)
+ {
+ return isset($vars['self'])
+ && $vars['self'] instanceof \phpbb\textformatter\s9e\renderer
+ && isset($vars['xml'])
+ && $vars['xml'] === '...';
+ }
+
+ public function render_after_event_callback($vars)
+ {
+ return isset($vars['html'])
+ && $vars['html'] === '...'
+ && isset($vars['self'])
+ && $vars['self'] instanceof \phpbb\textformatter\s9e\renderer;
+ }
}