summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Scheller <igor.scheller@igorshp.de>2018-12-21 23:11:44 +0100
committermsquare <msquare@notrademark.de>2018-12-22 12:01:23 +0100
commit393db492948a16f246790b88a38a1235cb167659 (patch)
tree2c9c837333c04dd06964ea1f0a13679b1b246c31
parentb3f059ad04fc0f54282aea98c5c2af8d7e46867a (diff)
Renderer: Added twig extension for markdown rendering
-rw-r--r--src/Renderer/Twig/Extensions/Markdown.php43
-rw-r--r--src/Renderer/TwigServiceProvider.php2
-rw-r--r--tests/Unit/Renderer/Twig/Extensions/MarkdownTest.php44
3 files changed, 89 insertions, 0 deletions
diff --git a/src/Renderer/Twig/Extensions/Markdown.php b/src/Renderer/Twig/Extensions/Markdown.php
new file mode 100644
index 00000000..293efe91
--- /dev/null
+++ b/src/Renderer/Twig/Extensions/Markdown.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Engelsystem\Renderer\Twig\Extensions;
+
+use Parsedown;
+use Twig_Extension as TwigExtension;
+use Twig_Filter as TwigFilter;
+
+class Markdown extends TwigExtension
+{
+ /** @var Parsedown */
+ protected $renderer;
+
+ /**
+ * @param Parsedown $renderer
+ */
+ public function __construct(Parsedown $renderer)
+ {
+ $this->renderer = $renderer;
+ }
+
+ /**
+ * @return array
+ */
+ public function getFilters(): array
+ {
+ $options = ['is_safe' => ['html']];
+
+ return [
+ new TwigFilter('markdown', [$this, 'render'], $options),
+ new TwigFilter('md', [$this, 'render'], $options),
+ ];
+ }
+
+ /**
+ * @param string $text
+ * @return string
+ */
+ public function render($text): string
+ {
+ return $this->renderer->text(htmlspecialchars($text));
+ }
+}
diff --git a/src/Renderer/TwigServiceProvider.php b/src/Renderer/TwigServiceProvider.php
index d7b6bd09..6cd885fd 100644
--- a/src/Renderer/TwigServiceProvider.php
+++ b/src/Renderer/TwigServiceProvider.php
@@ -10,6 +10,7 @@ use Engelsystem\Renderer\Twig\Extensions\Config;
use Engelsystem\Renderer\Twig\Extensions\Csrf;
use Engelsystem\Renderer\Twig\Extensions\Globals;
use Engelsystem\Renderer\Twig\Extensions\Legacy;
+use Engelsystem\Renderer\Twig\Extensions\Markdown;
use Engelsystem\Renderer\Twig\Extensions\Session;
use Engelsystem\Renderer\Twig\Extensions\Translation;
use Engelsystem\Renderer\Twig\Extensions\Url;
@@ -28,6 +29,7 @@ class TwigServiceProvider extends ServiceProvider
'globals' => Globals::class,
'session' => Session::class,
'legacy' => Legacy::class,
+ 'markdown' => Markdown::class,
'translation' => Translation::class,
'url' => Url::class,
];
diff --git a/tests/Unit/Renderer/Twig/Extensions/MarkdownTest.php b/tests/Unit/Renderer/Twig/Extensions/MarkdownTest.php
new file mode 100644
index 00000000..fd98c7cd
--- /dev/null
+++ b/tests/Unit/Renderer/Twig/Extensions/MarkdownTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Engelsystem\Test\Unit\Renderer\Twig\Extensions;
+
+use Engelsystem\Renderer\Twig\Extensions\Markdown;
+use Parsedown;
+use PHPUnit\Framework\MockObject\MockObject;
+
+class MarkdownTest extends ExtensionTest
+{
+ /**
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Markdown::getFilters
+ */
+ public function testGeFilters()
+ {
+ /** @var Parsedown|MockObject $renderer */
+ $renderer = $this->createMock(Parsedown::class);
+
+ $extension = new Markdown($renderer);
+ $filters = $extension->getFilters();
+
+ $this->assertExtensionExists('markdown', [$extension, 'render'], $filters);
+ $this->assertExtensionExists('md', [$extension, 'render'], $filters);
+ }
+
+ /**
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Markdown::__construct
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Markdown::render
+ */
+ public function testRender()
+ {
+ /** @var Parsedown|MockObject $renderer */
+ $renderer = $this->createMock(Parsedown::class);
+
+ $return = '<p>Lorem <em>&quot;Ipsum&quot;</em></p>';
+ $renderer->expects($this->once())
+ ->method('text')
+ ->with('Lorem *&quot;Ipsum&quot;*')
+ ->willReturn($return);
+
+ $extension = new Markdown($renderer);
+ $this->assertEquals($return, $extension->render('Lorem *"Ipsum"*'));
+ }
+}