я использую Parsedown для преобразования моего Markdown в HTML, как:
$pd->text('# My First heading');
При желании автоматически использовать первый заголовок сайта (h1) в качестве записи для пользовательского меню. Я уже изучил источник, но не смог найти хороший способ получить все заголовки.
Возможно, что-то есть в elements
функция. У кого-нибудь есть идея получить все или хотя бы первый заголовок.
Автор Parsedown Вот.
Вы должны быть в состоянии достичь этого путем создания расширения, которое переопределяет blockHeader
метод. По сути, переопределяющий метод должен изменить результат родительского метода.
Посмотрите на Parsedown wiki для получения дополнительной информации.
@ Tobias-Redmann
не мог найти хороший способ получить все заголовки
Я полагаю, вы уже решили эту проблему. Но поскольку у меня возникла та же проблема и я нашел ответ, я хотел бы поделиться информацией для тех, кто столкнется с той же проблемой.
Получение ToC (Оглавление) w / Parsedown.
<?php
include('Parsedown.php');
class Extension extends Parsedown
{
public $array_line = array();
// Override
protected function blockHeader($Line)
{
// Parse $Line to parent class
$Block = Parsedown::blockHeader($Line);
// Set headings
if(isset($Block['element']['name'])){
$Level = (integer) trim($Block['element']['name'],'h');
$this->array_line[] = [
'text' => $Block['element']['name'],
'level' => $Level,
];
}
return $Block;
}
}
$text = file_get_contents('YourMarkdownFile.md');
$Parsedown = new Extension();
$string_body = $Parsedown->text($text);
$array_ToC = $Parsedown->array_line;
print_r($array_ToC);
//echo $string_body;
Прежде всего, как сказал @ emanuil-rusev, переопределив blockHeader
Метод, вы можете получить все заголовки из текста уценки.
Более конкретно, когда вы звоните text($text)
метод, он анализирует данные строки уценки.
При разборе blockHeader($Line)
Метод будет вызываться в каждой строке с аргументом массива, например ниже.
$Line => [
"body" => "# SampleHead",
"indent" => 0,
"text" => "# SampleHead",
]
Исходный (родительский) класс ‘ blockHeader($Line)
метод конвертирует $Line
в следующий массив ($Block
).
$Block => [
"element" => [
"name" => "h1",
"text" => "# SampleHead",
"handler" => "line",
],
]
Таким образом, самый простой способ получить все заголовки — хранить их каждый раз в массиве.
Смотрите мой репо:
https://github.com/KEINOS/parsedown-extension_table-of-contents