如何为Parsedown提供的表元素添加类属性



我有一些Markdown文件,我想在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
    ]);
}

刀片

<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解析表:

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>

然后我得到了一张没有引导样式的桌子,看起来很奇怪。我要得到的是:

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

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

我读取Parsedown的源代码后,我找到了一个解决方案。

blockTable()方法中:

更改此内容:

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

to:

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

它将用class="table"输出table元素。

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

Parsedown不支持将 class添加到生成的元素中。Parsedown也不支持将生成的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
    ]);
}

相关内容

  • 没有找到相关文章

最新更新