У меня есть несколько файлов уценки, и я хочу отобразить их в своем блоге, разработанном 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'
),
);
чтобы:
$Block = array(
'alignments' => $alignments,
'identified' => true,
'element' => array(
'name' => 'table',
'handler' => 'elements',
'attributes' => [ //+
"class" => "table" //+
] //+
),
);
И это будет выводить table
элемент с class="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
]);
}