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

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

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

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

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

2 ответа

Решение

Автор Parsedown здесь.

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

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

@ 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

Другие вопросы по тегам