如何使用jekyll处理md文件中的标头?

时间:2019-03-11 13:29:32

标签: jekyll

我正在使用Jekyll生成我的网站。 目前,我正在为不同的子页面构建导航栏。基本上我有不同的md文件,其中包含多个部分,每个部分都以标题开头,例如:

##header 1
content
##header 2
content
...

我尝试构建一个导航栏,该导航栏将您定向到您要单击的子页面上的段落。 (例如Wikipedia中的导航) 我当前使用的方式是为_includes文件夹中的每个子页面创建一个navigation.html。但是,我知道,当子页面数增加时,这可能会引起麻烦。

我想做的基本上是:

{% for "header" in "each .md-file" %}
    <a href="#">{{ "name of header" }} </a>
{% endfor %}

例如,我知道在我的_posts / post中我可以做

{% for post in site.posts %}

但是,我要使用的md文件位于我的根目录中,我不知道如何专门调用它们。

总结:我的目录中有多个.md文件,并希望将每个## header作为目录中的链接获取。

在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

如果文件位于根目录下,则它们不是posts,而是pages

您可以遍历以下名称空间:{% for page in site.pages %}

答案 1 :(得分:1)

正如@marcanuy所建议的,我会将您的文件放在_pages目录中。 请确保将include: ['_pages']添加到_config.yml的构建设置中

现在,您可以使用{% for page in site.pages %}浏览页面 这仍然留下了获取所有标头的挑战。 在jekyll中创建特定类型的TOC时,我发现this piece of code非常有用。您可以从那里使用元素。

所需的基本版本如下。您必须根据您的设置进行调整,但是它应该可以执行您想要的操作。您可以将其放在_includes中单独的html文档中,也可以直接将其放置在导航栏中。


{% for page in site.pages %}

<ul>
    {% assign headers = page.content | split: '<h' %}
        {% for header in headers %}
            {% assign _string = header | split: '</h' %}
            {% capture _hAttrToStrip %}{{ _string[0] | split: '>' | first }}>{% endcapture %}
            {% assign title = _string[0] | replace: _hAttrToStrip, '' %}

            {% assign _idstring = header | split: 'id="' %}
            {% assign _idstring = _idstring[1] | split: '"' %}
            {% assign html_id = _idstring[0] %}

            <li>
                <a href={{page.url}}#{{html_id}}>{{title}}</a>
            </li>
        {% endfor %}
</ul>
{% endfor %}

希望这会有所帮助!