如何为 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
不支持向生成的元素添加 class
。 Parsedown
也不支持将生成的 HTML 作为 XML 文档发出。因此,您有两个选择:
- 使用
preg_replace
用正则表达式替换。
- 使用
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
方法。
我有一些降价文件,我想在我的博客上显示它们,该博客由 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
不支持向生成的元素添加 class
。 Parsedown
也不支持将生成的 HTML 作为 XML 文档发出。因此,您有两个选择:
- 使用
preg_replace
用正则表达式替换。 - 使用
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
方法。