在 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">
...
我的应用程序基于 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.
我看了很多示例,并提出了以下不起作用的解决方案,不幸的是。
我在文件中定义扩展名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">
...