Skip to content

Commit

Permalink
feature #3737 Added configuration for commonmark use in twig-extra-bu…
Browse files Browse the repository at this point in the history
…ndle. (doekenorg)

This PR was merged into the 3.x branch.

Discussion
----------

Added configuration for commonmark use in twig-extra-bundle.

Following this tweet: https://twitter.com/ramsey/status/1561894460560138241, this PR adds the configuration options for `commonmark` to the `twig-extra-bundle`.

The configuration is added to the `LeagueCommonMarkConverterFactory` and in turn injected in the `CommonMarkConverter`. This way a user can provide the configuration for usage inside twig.

I'm not sure if adding the configuration inside the extension is the way to go.

Hope this helps out at least `@ramsey` :-)

Added `ignoreExtraKeys` to be somewhat future proof in case extra configuration is added later on, and also to be able to provide de configuration for extensions.

Commits
-------

6f20629 Added configuration for commonmark use in twig-extra-bundle.
  • Loading branch information
fabpot committed Feb 8, 2025
2 parents fab1a37 + 6f20629 commit 3cdf26f
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 3 deletions.
58 changes: 58 additions & 0 deletions extra/twig-extra-bundle/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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'] ?? []);
}
}
}
}
Expand Down
7 changes: 5 additions & 2 deletions extra/twig-extra-bundle/LeagueCommonMarkConverterFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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([]);
Expand Down

4 comments on commit 3cdf26f

@tacman
Copy link

@tacman tacman commented on 3cdf26f Feb 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

->enumNode('html_input')
                            ->info('How to handle HTML input.')
                            ->values(['strip','allow','escape'])
                            ->end()

I think this should have a defaultValue, otherwise

bin/console config:dump twig_extra > config/packages/twig_extra.yaml

generates a null default, which doesn't validate.

There's also an issue with the default values for unordered_list_markers, being an array of arrays, instead of just an array, and the array values need quotes since * is reserved in yaml:

 commonmark:
            enable_em:            true
            enable_strong:        true
            use_asterisk:         true
            use_underscore:       true
            unordered_list_markers:

                # Default:
                - 
                    - -
                    - *
                    - +

@fabpot
Copy link
Contributor Author

@fabpot fabpot commented on 3cdf26f Feb 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tacman Would you like to create a PR to "fix" these issues?

@tacman
Copy link

@tacman tacman commented on 3cdf26f Feb 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can try! Question: when I'm modifying a symfony bundle or component, I use the "link" command to symlink my project to the local Symfony repo. Is there a shortcut like that for linking this bundle (twig-extra-bundle), since that's not in the Symfony repo?

@fabpot
Copy link
Contributor Author

@fabpot fabpot commented on 3cdf26f Feb 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, there is nothing similar

Please sign in to comment.