PHP Parsedown 获取所有标题

Tob*_*ann 1 php markdown parsedown

我使用Parsedown将 Markdown 转换为 HTML,如下所示:

$pd->text('# My First heading');
Run Code Online (Sandbox Code Playgroud)

如果想要自动使用第一个站点标题 (h1) 作为自定义菜单的条目。我已经查看了源代码,但无法找到获取所有标题的好方法。

也许有一些功能在elements起作用。有谁有想法获得全部或至少第一个标题。

KEI*_*NOS 5

@托比亚斯-雷德曼

找不到获取所有标题的好方法

我想你已经解决了这个问题。但由于我遇到了同样的问题并找到了答案,我想为那些面临同样问题的人分享一些信息。

长话短说

使用 Parsedown 获取 ToC(目录)。

<?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;
Run Code Online (Sandbox Code Playgroud)

TS;DR(详细信息)

首先,正如@emanuil-rusev所说,重写该blockHeader方法,您可以从markdown文本中获取所有标题。

更具体地说,当您调用text($text)方法时,它会解析给定的 Markdown 字符串。

解析时,blockHeader($Line)将使用数组参数每行调用该方法,如下所示。

$Line => [
    "body"   => "# SampleHead",
    "indent" => 0,
    "text"   => "# SampleHead",
]
Run Code Online (Sandbox Code Playgroud)

原始(父)类的blockHeader($Line)方法转换$Line为以下 array( $Block)。

$Block => [
    "element" => [
        "name"    => "h1",
        "text"    => "# SampleHead",
        "handler" => "line",
    ],
]
Run Code Online (Sandbox Code Playgroud)

因此,获取所有标题的最简单方法是将它们每次存储到一个数组中。

用于获取目录的完整脚本(扩展)

请参阅我的存储库: https ://github.com/KEINOS/parsedown-extension_table-of-contents