【问题标题】:PHP Parsedown get all headingsPHP Parsedown 获取所有标题
【发布时间】:2014-11-15 12:50:03
【问题描述】:

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

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

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

也许elements 函数中有一些东西。有没有人有想法获得全部或至少第一个标题。

【问题讨论】:

    标签: php markdown parsedown


    【解决方案1】:

    @tobias-redmann

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

    我假设你已经解决了这个问题。但是由于我遇到了同样的问题并想出了答案,所以我想为那些遇到同样问题的人分享一些信息。

    TL;DR

    使用 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;
    

    TS;DR(详细信息)

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

    更具体地说,当您调用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】:

      Parsedown 的作者在这里。

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

      查看Parsedown wiki 了解更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        • 2015-02-14
        • 1970-01-01
        • 1970-01-01
        • 2014-11-10
        • 2014-12-25
        • 2022-10-07
        相关资源
        最近更新 更多