Как добавить атрибут класса для элемента таблицы, который дает 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>

Итак, кто-нибудь может дать мне несколько советов по этому поводу?

1

Решение

После того, как я прочитал исходный код 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 метод с моей собственной реализацией.

2

Другие решения

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
]);
}
1

По вопросам рекламы [email protected]