我有一些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文档发射。因此,您有两个选择:
- 使用
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
]);
}