繁体   English   中英

PHP Parsedown获得所有标题

[英]PHP Parsedown get all headings

我使用Parsedown将Markdown转换为HTML,例如:

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

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

elements功能中可能有些东西。 是否有人想获得全部或至少第一个标题。

@ tobias-redmann

无法找出获得所有标题的好方法

我认为您已经解决了这个问题。 但是,由于我遇到了同样的问题并提出了答案,因此我想为那些会遇到相同问题的人分享一些信息。

TL; DR

使用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方法,您可以从markdown文本中获取所有标题。

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

解析时, 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

这里是Parsedown的作者。

您应该能够通过创建覆盖blockHeader方法的扩展来实现此blockHeader 基本上,覆盖方法应修改父方法的结果。

请查看Parsedown Wiki,以获取更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM