diff --git a/extra/twig-extra-bundle/DependencyInjection/Configuration.php b/extra/twig-extra-bundle/DependencyInjection/Configuration.php index 24c5fd4d390..1718593b96b 100644 --- a/extra/twig-extra-bundle/DependencyInjection/Configuration.php +++ b/extra/twig-extra-bundle/DependencyInjection/Configuration.php @@ -11,6 +11,7 @@ namespace Twig\Extra\TwigExtraBundle\DependencyInjection; +use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; use Twig\Extra\TwigExtraBundle\Extensions; @@ -32,6 +33,63 @@ public function getConfigTreeBuilder(): TreeBuilder ; } + $this->addCommonMarkConfiguration($rootNode); + return $treeBuilder; } + + /** + * Full configuration from {@link https://commonmark.thephpleague.com/2.3/configuration}. + */ + private function addCommonMarkConfiguration(ArrayNodeDefinition $rootNode): void + { + $rootNode + ->children() + ->arrayNode('commonmark') + ->ignoreExtraKeys() + ->children() + ->arrayNode('renderer') + ->info('Array of options for rendering HTML.') + ->children() + ->scalarNode('block_separator')->end() + ->scalarNode('inner_separator')->end() + ->scalarNode('soft_break')->end() + ->end() + ->end() + ->enumNode('html_input') + ->info('How to handle HTML input.') + ->values(['strip','allow','escape']) + ->end() + ->booleanNode('allow_unsafe_links') + ->info('Remove risky link and image URLs by setting this to false.') + ->defaultTrue() + ->end() + ->integerNode('max_nesting_level') + ->info('The maximum nesting level for blocks.') + ->defaultValue(PHP_INT_MAX) + ->end() + ->arrayNode('slug_normalizer') + ->info('Array of options for configuring how URL-safe slugs are created.') + ->children() + ->variableNode('instance')->end() + ->integerNode('max_length')->defaultValue(255)->end() + ->variableNode('unique')->end() + ->end() + ->end() + ->arrayNode('commonmark') + ->info('Array of options for configuring the CommonMark core extension.') + ->children() + ->booleanNode('enable_em')->defaultTrue()->end() + ->booleanNode('enable_strong')->defaultTrue()->end() + ->booleanNode('use_asterisk')->defaultTrue()->end() + ->booleanNode('use_underscore')->defaultTrue()->end() + ->arrayNode('unordered_list_markers') + ->scalarPrototype()->end() + ->defaultValue([['-', '*', '+']])->end() + ->end() + ->end() + ->end() + ->end() + ->end(); + } } diff --git a/extra/twig-extra-bundle/DependencyInjection/TwigExtraExtension.php b/extra/twig-extra-bundle/DependencyInjection/TwigExtraExtension.php index 501927e21ae..8c399b891ce 100644 --- a/extra/twig-extra-bundle/DependencyInjection/TwigExtraExtension.php +++ b/extra/twig-extra-bundle/DependencyInjection/TwigExtraExtension.php @@ -40,6 +40,12 @@ public function load(array $configs, ContainerBuilder $container) if ('markdown' === $extension && class_exists(CommonMarkConverter::class)) { $loader->load('markdown_league.php'); + + if ($container->hasDefinition('twig.markdown.league_common_mark_converter_factory')) { + $container + ->getDefinition('twig.markdown.league_common_mark_converter_factory') + ->setArgument('$config', $config['commonmark'] ?? []); + } } } } diff --git a/extra/twig-extra-bundle/LeagueCommonMarkConverterFactory.php b/extra/twig-extra-bundle/LeagueCommonMarkConverterFactory.php index a2b90a25f58..834ac9983a2 100644 --- a/extra/twig-extra-bundle/LeagueCommonMarkConverterFactory.php +++ b/extra/twig-extra-bundle/LeagueCommonMarkConverterFactory.php @@ -21,17 +21,20 @@ final class LeagueCommonMarkConverterFactory { private $extensions; + private $config; + /** * @param ExtensionInterface[] $extensions */ - public function __construct(iterable $extensions) + public function __construct(iterable $extensions, array $config = []) { $this->extensions = $extensions; + $this->config = $config; } public function __invoke(): CommonMarkConverter { - $converter = new CommonMarkConverter(); + $converter = new CommonMarkConverter($this->config); foreach ($this->extensions as $extension) { $converter->getEnvironment()->addExtension($extension); diff --git a/extra/twig-extra-bundle/Tests/DependencyInjection/TwigExtraExtensionTest.php b/extra/twig-extra-bundle/Tests/DependencyInjection/TwigExtraExtensionTest.php index 355b794d2b1..b17c040a7e6 100644 --- a/extra/twig-extra-bundle/Tests/DependencyInjection/TwigExtraExtensionTest.php +++ b/extra/twig-extra-bundle/Tests/DependencyInjection/TwigExtraExtensionTest.php @@ -26,7 +26,29 @@ public function testDefaultConfiguration() 'kernel.debug' => false, ])); $container->registerExtension(new TwigExtraExtension()); - $container->loadFromExtension('twig_extra'); + $container->loadFromExtension('twig_extra', [ + 'commonmark' => [ + 'extra_key' => true, + 'renderer' => [ + 'block_separator' => "\n", + 'inner_separator' => "\n", + 'soft_break' => "\n", + ], + 'commonmark' => [ + 'enable_em' => true, + 'enable_strong' => true, + 'use_asterisk' => true, + 'use_underscore' => true, + 'unordered_list_markers' => ['-', '*', '+'], + ], + 'html_input' => 'escape', + 'allow_unsafe_links' => false, + 'max_nesting_level' => PHP_INT_MAX, + 'slug_normalizer' => [ + 'max_length' => 255, + ], + ], + ]); $container->getCompilerPassConfig()->setOptimizationPasses([]); $container->getCompilerPassConfig()->setRemovingPasses([]); $container->getCompilerPassConfig()->setAfterRemovingPasses([]);