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/parser
composer.lock
Tests/fixtures/app/cache

View file

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

View file

@ -2,24 +2,17 @@
namespace Knp\Bundle\MarkdownBundle\Helper;
use Knp\Bundle\MarkdownBundle\Parser\ParserManager;
use Symfony\Component\Templating\Helper\HelperInterface;
use Knp\Bundle\MarkdownBundle\MarkdownParserInterface;
class MarkdownHelper implements HelperInterface
{
/**
* @var MarkdownParserInterface[]
*/
private $parsers = array();
private $parserManager;
private $charset = 'UTF-8';
/**
* @param MarkdownParserInterface $parser
* @param string $alias
*/
public function addParser(MarkdownParserInterface $parser, $alias)
public function __construct(ParserManager $parserManager)
{
$this->parsers[$alias] = $parser;
$this->parserManager = $parserManager;
}
/**
@ -34,17 +27,7 @@ class MarkdownHelper implements HelperInterface
*/
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);
return $this->parserManager->transform($markdownText, $parserName);
}
/**

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">
<tag name="markdown.parser" alias="flavored" />
</service>
<!-- parsers will be injected with a compiler pass -->
<service id="markdown.parser.parser_manager" class="Knp\Bundle\MarkdownBundle\Parser\ParserManager" />
</services>
</container>

View file

@ -5,7 +5,7 @@
<services>
<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" />
</service>
</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;
use Knp\Bundle\MarkdownBundle\Helper\MarkdownHelper;
use Knp\Bundle\MarkdownBundle\Parser\ParserManager;
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()
@ -22,7 +22,7 @@ class MarkdownTwigExtension extends \Twig_Extension
public function markdown($text, $parser = null)
{
return $this->helper->transform($text, $parser);
return $this->parserManager->transform($text, $parser);
}
public function getName()