Removing MarkdownTwigExtension dependency to MarkdownHelper

This allows the Twig extension to be used without the templating component.
This also introduces a new integration test as a sanity check that all the
configuration / compiler pass was setup correctly.
This commit is contained in:
Ryan Weaver 2015-12-15 16:08:41 -05:00
parent 27d6c8c866
commit c5f5046c8e
9 changed files with 121 additions and 30 deletions

1
.gitignore vendored
View file

@ -2,3 +2,4 @@ phpunit.xml
vendor/* vendor/*
!vendor/parser !vendor/parser
composer.lock composer.lock
Tests/fixtures/app/cache

View file

@ -10,7 +10,7 @@ class ParsersCompilerPass implements CompilerPassInterface
{ {
public function process(ContainerBuilder $container) public function process(ContainerBuilder $container)
{ {
if (!$container->hasDefinition('templating.helper.markdown')) { if (!$container->hasDefinition('markdown.parser.parser_manager')) {
return; return;
} }
@ -24,7 +24,7 @@ class ParsersCompilerPass implements CompilerPassInterface
$defaultAlias = isset($defaultAlias['alias']) ? $defaultAlias['alias'] : null; $defaultAlias = isset($defaultAlias['alias']) ? $defaultAlias['alias'] : null;
} }
$definition = $container->getDefinition('templating.helper.markdown'); $definition = $container->getDefinition('markdown.parser.parser_manager');
if (empty($defaultAlias)) { if (empty($defaultAlias)) {
$definition->addMethodCall('addParser', array(new Reference('markdown.parser'), 'default')); $definition->addMethodCall('addParser', array(new Reference('markdown.parser'), 'default'));
} }

View file

@ -2,24 +2,17 @@
namespace Knp\Bundle\MarkdownBundle\Helper; namespace Knp\Bundle\MarkdownBundle\Helper;
use Knp\Bundle\MarkdownBundle\Parser\ParserManager;
use Symfony\Component\Templating\Helper\HelperInterface; use Symfony\Component\Templating\Helper\HelperInterface;
use Knp\Bundle\MarkdownBundle\MarkdownParserInterface;
class MarkdownHelper implements HelperInterface class MarkdownHelper implements HelperInterface
{ {
/** private $parserManager;
* @var MarkdownParserInterface[]
*/
private $parsers = array();
private $charset = 'UTF-8'; private $charset = 'UTF-8';
/** public function __construct(ParserManager $parserManager)
* @param MarkdownParserInterface $parser
* @param string $alias
*/
public function addParser(MarkdownParserInterface $parser, $alias)
{ {
$this->parsers[$alias] = $parser; $this->parserManager = $parserManager;
} }
/** /**
@ -34,17 +27,7 @@ class MarkdownHelper implements HelperInterface
*/ */
public function transform($markdownText, $parserName = null) public function transform($markdownText, $parserName = null)
{ {
if (null === $parserName) { return $this->parserManager->transform($markdownText, $parserName);
$parserName = 'default';
}
if (!isset($this->parsers[$parserName])) {
throw new \RuntimeException(sprintf('Unknown parser selected ("%s"), available are: %s', $parserName, implode(', ', array_keys($this->parsers))));
}
$parser = $this->parsers[$parserName];
return $parser->transformMarkdown($markdownText);
} }
/** /**

47
Parser/ParserManager.php Normal file
View file

@ -0,0 +1,47 @@
<?php
namespace Knp\Bundle\MarkdownBundle\Parser;
use Knp\Bundle\MarkdownBundle\MarkdownParserInterface;
class ParserManager
{
/**
* @var MarkdownParserInterface[]
*/
private $parsers = array();
/**
* @param MarkdownParserInterface $parser
* @param string $alias
*/
public function addParser(MarkdownParserInterface $parser, $alias)
{
$this->parsers[$alias] = $parser;
}
/**
* Transforms markdown syntax to HTML
*
* @param string $markdownText The markdown syntax text
* @param null|string $parserName
*
* @return string The HTML code
*
* @throws \RuntimeException
*/
public function transform($markdownText, $parserName = null)
{
if (null === $parserName) {
$parserName = 'default';
}
if (!isset($this->parsers[$parserName])) {
throw new \RuntimeException(sprintf('Unknown parser selected ("%s"), available are: %s', $parserName, implode(', ', array_keys($this->parsers))));
}
$parser = $this->parsers[$parserName];
return $parser->transformMarkdown($markdownText);
}
}

View file

@ -19,5 +19,8 @@
<service id="markdown.parser.flavored" class="Knp\Bundle\MarkdownBundle\Parser\Preset\Flavored" public="false"> <service id="markdown.parser.flavored" class="Knp\Bundle\MarkdownBundle\Parser\Preset\Flavored" public="false">
<tag name="markdown.parser" alias="flavored" /> <tag name="markdown.parser" alias="flavored" />
</service> </service>
<!-- parsers will be injected with a compiler pass -->
<service id="markdown.parser.parser_manager" class="Knp\Bundle\MarkdownBundle\Parser\ParserManager" />
</services> </services>
</container> </container>

View file

@ -5,7 +5,7 @@
<services> <services>
<service id="twig.extension.exercise.twig" class="Knp\Bundle\MarkdownBundle\Twig\Extension\MarkdownTwigExtension" public="false"> <service id="twig.extension.exercise.twig" class="Knp\Bundle\MarkdownBundle\Twig\Extension\MarkdownTwigExtension" public="false">
<argument type="service" id="templating.helper.markdown" /> <argument type="service" id="markdown.parser.parser_manager" />
<tag name="twig.extension" /> <tag name="twig.extension" />
</service> </service>
</services> </services>

View file

@ -0,0 +1,27 @@
<?php
namespace Knp\Bundle\MarkdownBundle\Tests\Parser;
use Knp\Bundle\MarkdownBundle\Tests\fixtures\app\TestKernel;
use Knp\Bundle\MarkdownBundle\Parser\ParserManager;
class ParserManagerTest extends \PHPUnit_Framework_TestCase
{
public function testIntegration()
{
require_once __DIR__.'/../fixtures/app/TestKernel.php';
$kernel = new TestKernel('dev', true);
$kernel->boot();
$container = $kernel->getContainer();
/** @var ParserManager $parserManager */
$parserManager = $container->get('markdown.parser.parser_manager');
$actual = $parserManager->transform('*hi*');
$this->assertEquals("<p><em>hi</em></p>\n", $actual, 'There is a default parser');
$actual = $parserManager->transform('*hi*', 'light');
$this->assertEquals("<p><em>hi</em></p>\n", $actual, 'Specific parsers are registered');
}
}

30
Tests/fixtures/app/TestKernel.php vendored Normal file
View file

@ -0,0 +1,30 @@
<?php
namespace Knp\Bundle\MarkdownBundle\Tests\fixtures\app;
use Knp\Bundle\MarkdownBundle\KnpMarkdownBundle;
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\BundleInterface;
use Symfony\Component\HttpKernel\Kernel;
class TestKernel extends Kernel
{
public function registerBundles()
{
return array(
new FrameworkBundle(),
new KnpMarkdownBundle(),
);
}
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(function(ContainerBuilder $c) {
$c->loadFromExtension('framework', array(
'secret' => 'MarkdownTesting'
));
});
}
}

View file

@ -2,15 +2,15 @@
namespace Knp\Bundle\MarkdownBundle\Twig\Extension; namespace Knp\Bundle\MarkdownBundle\Twig\Extension;
use Knp\Bundle\MarkdownBundle\Helper\MarkdownHelper; use Knp\Bundle\MarkdownBundle\Parser\ParserManager;
class MarkdownTwigExtension extends \Twig_Extension class MarkdownTwigExtension extends \Twig_Extension
{ {
protected $helper; protected $parserManager;
public function __construct(MarkdownHelper $helper) public function __construct(ParserManager $parserManager)
{ {
$this->helper = $helper; $this->parserManager = $parserManager;
} }
public function getFilters() public function getFilters()
@ -22,7 +22,7 @@ class MarkdownTwigExtension extends \Twig_Extension
public function markdown($text, $parser = null) public function markdown($text, $parser = null)
{ {
return $this->helper->transform($text, $parser); return $this->parserManager->transform($text, $parser);
} }
public function getName() public function getName()