如何为 parsedown 给出的 table 元素添加 class 属性?

How to add class attribute for table element which parsedown gives?

我有一些降价文件,我想在我的博客上显示它们,该博客由 Laravel 开发。

所以我想出了这样的解决方案:

控制器

public function display() {
    $pd = new Parsedown();
    $text = Storage::disk('local')->get('x.md');
    $html = $pd->text($text);
    $title = "title";
    return view('x.y', [
        "html" => $html,
        "title" => $title
    ]);
}

Blade

<div class="container-fluid">
    <div class="row">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title text-center">{{ $title }}</h3>
            </div>
            <div class="panel-body">
                {!! $html !!}
            </div>
        </div>
    </div>
</div>

table 元素外效果很好:

Parsedown 像这样解析 table:

header 1 | header 2
-------- | --------
cell 1.1 | cell 1.2
cell 2.1 | cell 2.2

进入:

<table>
<thead>
<tr>
<th>header 1</th>
<th>header 2</th>
</tr>
</thead>
<tbody>
<tr>
<td>cell 1.1</td>
<td>cell 1.2</td>
</tr>
<tr>
<td>cell 2.1</td>
<td>cell 2.2</td>
</tr>
</tbody>
</table>

然后我得到了一个没有bootstrap样式的table,看起来很奇怪。我想要得到的是:

<table class="table">
  ...
</table>

那么,有人可以给我一些建议吗?

Parsedown 不支持向生成的元素添加 classParsedown 也不支持将生成的 HTML 作为 XML 文档发出。因此,您有两个选择:

  1. 使用preg_replace用正则表达式替换。
  2. 使用 SimpleXML(或类似的)解析 HTML 树并替换元素。

由于 HTML Parsedown 生成简单、格式良好且可预测,因此您 可能 可以摆脱 preg_replace。实现看起来像这样:

public function display() {
    $pd = new Parsedown();
    $text = Storage::disk('local')->get('x.md');
    $html = $pd->text($text);
    $html = preg_replace('/^\s*<table>\s*$/', '<table class="table">', $html);
    $title = "title";
    return view('x.y', [
        "html" => $html,
        "title" => $title
    ]);
}

看了Parsedown的源码,找到了解决办法。

blockTable()方法中:

改变这个:

        $Block = array(
            'alignments' => $alignments,
            'identified' => true,
            'element' => array(
                'name' => 'table',
                'handler' => 'elements'
            ),
        );

至:

        $Block = array(
            'alignments' => $alignments,
            'identified' => true,
            'element' => array(
                'name' => 'table',
                'handler' => 'elements',
                'attributes' => [       //+
                    "class" => "table"  //+
                ]                       //+
            ),
        );

并且它会输出 table 元素 class="table".

最后,我创建了一个扩展 Parsedown 的新 class,并用我自己的实现重写了 blockTable 方法。