Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[twig-extra-bundle] markdown_to_html: Passing configuration to League\CommonMark\CommonMarkConverter #3725

Open
Dasug opened this issue Jul 20, 2022 · 3 comments
Labels

Comments

@Dasug
Copy link

Dasug commented Jul 20, 2022

I'm using the twig extra bundle's markdown_to_html filter on Symfony 6.1 with League/CommonMark as the markdown parser library.

The library has a few configuration options that can be passed to the CommonMarkConverter constructor and cannot be adjusted after the CommonMarkConverter object has been constructed. See https://commonmark.thephpleague.com/2.3/configuration/

Currently however, the LeagueCommonMarkConverterFactory class seems to call the CommonMarkConverter without any parameters:

$converter = new CommonMarkConverter();

Is there therefore currently no simple way to pass configuration to the library or have I missed something obvious?

I have been able to bypass the factory class by manually declaring the CommonMarkConverter constructor arguments in the services.yaml file as such:

League\CommonMark\CommonMarkConverter:
    arguments:
        $config: {allow_unsafe_links: false}

twig.markdown.league_common_mark_converter:
    alias: League\CommonMark\CommonMarkConverter

However as this bypasses the Factory class I then lose the capability of including any CommonMark extensions.

@gitrequests
Copy link

Same problem. How to pass configuration to Converter or Environment? Extensions work with configuration from Environment too. We currently cannot set up CommonMark and Extensions at all.

@lmeyer
Copy link

lmeyer commented Dec 30, 2022

I've found a way to pass configuration to CommonMark Environment.
I'm not sure if it's completely ok, but seems to work for me (configuration, extensions, extensions configuration).

Basically you need to override LeagueCommonMarkConverterFactory.

Put the following in services.yml :

services:
    twig.markdown.league_common_mark_converter_factory:
        class: App\Twig\LeagueCommonMarkConverterFactory
        arguments:
            - !tagged_iterator twig.markdown.league_extension

Then grab vendor/twig/extra-bundle/LeagueCommonMarkConverterFactory.php, copy and paste it to src/Twig/LeagueCommonMarkConverterFactory.php.

You can now add your own configuration like this :

<?php

namespace App\Twig;

use League\CommonMark\CommonMarkConverter;
use League\CommonMark\Extension\ExtensionInterface;

/**
 * @internal
 */
final class LeagueCommonMarkConverterFactory
{
    private $extensions;

    /**
     * @param ExtensionInterface[] $extensions
     */
    public function __construct(iterable $extensions)
    {
        $this->extensions = $extensions;
    }

    public function __invoke(): CommonMarkConverter
    {
        $config = [
            'renderer' => [
                'allow_unsafe_links' => false,
            ],
            'table' => [
                'wrap' => [
                    'enabled' => true,
                    'tag' => 'div',
                    'attributes' => ['class' => 'table-responsive'],
                ],
            ],
        ];

        $converter = new CommonMarkConverter($config);

        foreach ($this->extensions as $extension) {
            $converter->getEnvironment()->addExtension($extension);
        }

        return $converter;
    }
}

@Dasug
Copy link
Author

Dasug commented Mar 3, 2023

Looks like in the meantime (actually quite some time ago), someone opened a pull request that tries to address the same issue: #3737
Just mentioning it here so that there's a link between this issue and the pull request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Development

No branches or pull requests

4 participants