Уценка — PHP Parsedown получить все заголовки

я использую Parsedown для преобразования моего Markdown в HTML, как:

$pd->text('# My First heading');

При желании автоматически использовать первый заголовок сайта (h1) в качестве записи для пользовательского меню. Я уже изучил источник, но не смог найти хороший способ получить все заголовки.

Возможно, что-то есть в elements функция. У кого-нибудь есть идея получить все или хотя бы первый заголовок.

0

Решение

Автор Parsedown Вот.

Вы должны быть в состоянии достичь этого путем создания расширения, которое переопределяет blockHeader метод. По сути, переопределяющий метод должен изменить результат родительского метода.

Посмотрите на Parsedown wiki для получения дополнительной информации.

1

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

@ Tobias-Redmann

не мог найти хороший способ получить все заголовки

Я полагаю, вы уже решили эту проблему. Но поскольку у меня возникла та же проблема и я нашел ответ, я хотел бы поделиться информацией для тех, кто столкнется с той же проблемой.

TL; DR

Получение 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;

TS; DR (Подробности)

Прежде всего, как сказал @ 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

2

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