在 Laravel 7 和 graham-campbell/markdown 中添加 Table Markdown 扩展

Add Table Extension for Markdown in Laravel 7 and graham-campbell/markdown

我的应用程序基于 Laravel 7 并使用 graham-campbell/markdown v13.1 以及 webuni/commonmark-table-extension v2.1

我想用 class 扩展 markdown 环境,将 Bootstrap css classes table table-striped table-bordered 添加到呈现的 html 输出,以防 html.

中定义了 table

我看了很多示例,并提出了以下不起作用的解决方案,不幸的是。

我在文件中定义扩展名App\Classes\Markdown\AddTableClassesExtension.php

<?php

namespace App\Classes\Markdown;

use League\CommonMark\ConfigurableEnvironmentInterface;
use League\CommonMark\Extension\ExtensionInterface;
use League\CommonMark\Extension\Table\Table;

class AddTableClassesExtension implements ExtensionInterface
{
    public function register(ConfigurableEnvironmentInterface $environment): void
    {
        $environment
            ->addBlockRenderer(Table::class, new \App\Classes\Markdown\AddTableClassesRenderer())
        ;
    }
}

我在文件中定义的实际渲染器App\Classes\Markdown\AddTableClassesRenderer

<?php

namespace App\Classes\Markdown;

use League\CommonMark\Block\Element\AbstractBlock;
use League\CommonMark\Block\Renderer\BlockRendererInterface;
use League\CommonMark\ElementRendererInterface;
use League\CommonMark\Extension\Table\Table;
use League\CommonMark\HtmlElement;

class AddTableClassesRenderer implements BlockRendererInterface {

public function render(AbstractBlock $block, ElementRendererInterface $htmlRenderer, bool $inTightList     = false)
    {
        if (!$block instanceof Table) {
            throw new \InvalidArgumentException('Incompatible block type: ' . get_class($block));
        }

        $attrs = [];

        // Add on the class we need:
        $attrs['class'] = $htmlRenderer->escape('table table-striped table-bordered', true);

        return new HtmlElement('table', $attrs, '', true);
    }

}

最后我将我的扩展添加到配置文件 config\markdown.php

'extensions' => [
        App\Classes\Markdown\AddTableClassesExtension::class,
        League\CommonMark\Ext\Table\TableExtension::class,
    ],

此设置会创建 html table,但不会将 css class 添加到 table 属性。

当我调试它时,我什至没有在渲染器中找到我的代码 class。为了进行测试,我将以下方法与 League\CommonMark (https://commonmark.thephpleague.com/1.5/extensions/tables/) 文档中的 table 一起使用:

public function testMarkdownExtension()
{

    $string = "th | th(center) | th(right)
               ---|:----------:|----------:
               td | td         | td";

    echo Markdown::convertToHtml($string);
}

我需要做什么才能让这个简单的扩展正常工作?

非常感谢您的提前帮助。

在 GitHub 上的问题 Request: Ability to add classes to images. 的帮助下,我自己弄明白了。

我重新定义了渲染器class

namespace App\Classes\Markdown;

use League\CommonMark\Event\DocumentParsedEvent;
use League\CommonMark\Ext\Table\Table;

class AddTableClassesRenderer {

    /**
     * @param DocumentParsedEvent $e
     *
     * @return void
     */
    public function __invoke(DocumentParsedEvent $e)
    {
        $walker = $e->getDocument()->walker();

        while ($event = $walker->next()) {
            $node = $event->getNode();
            if ($node instanceof Table) {
                $node->data['attributes'] = array('class' => 'table table-striped table-bordered');
            }
        }
    }

}

我更改了扩展名 class

namespace App\Classes\Markdown;

use League\CommonMark\ConfigurableEnvironmentInterface;
use League\CommonMark\Event\DocumentParsedEvent;
use League\CommonMark\Extension\ExtensionInterface;

class AddTableClassesExtension implements ExtensionInterface
{
    public function register(ConfigurableEnvironmentInterface $environment): void
    {
            $environment
                ->addEventListener(DocumentParsedEvent::class, new AddTableClassesRenderer());
        ;
    }
}

现在,table 包含适当的 classes。

<table class="table table-striped table-bordered">
   ...