如何为解析后的table元素添加class属性?

时间:2017-09-21 13:39:07

标签: php laravel parsedown

我有一些降价文件,我想在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>

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

2 个答案:

答案 0 :(得分:2)

在阅读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的新类,并使用我自己的实现覆盖了blockTable方法。

答案 1 :(得分:1)

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

  1. 使用preg_replace替换正则表达式。
  2. 使用SimpleXML(或类似)来解析HTML树并替换元素。
  3. 由于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
        ]);
    }