2016-05-17 67 views
6

我想使用Jekyll创建一个包含多个章节的手册,每个章节包含几个章节,并将每个章节存储在一个单独的Markdown文件中。我想index.md看起来是这样的:我可以在Jekyll中创建嵌套集合吗?

<ol> 
{% for chapter in site.chapters %} 
    <li> 
    <a href="{{chapter.url}}">{{chapter.title}}</a> 
    <ol> 
    {% for section in chapter.sections %} 
     <li><a href="{{section.url}}">{{section.title}}</a></li> 
    {% endfor %} 
    </ol> 
    </li> 
{% endfor %} 
<ol> 

如果每一章都是在_chapters一个降价文件,我的右行添加​​到_config.yml,我可以在章节重复,从YAML拉出标题字段头,等等。有没有一种方法来嵌套这个?我已经尝试使用各种名字在_chapters下创建子目录,但是(a)Jekyll没有把它们当作子集合,并且(b)没有明显的地方存储章节级别的信息(如章节的总标题) 。 (注意:我认为我可以通过明确枚举在YAML块中的章节和章节来完成此操作,或者通过在_data中创建单独的YAML文件,但我不希望保留该操作列举与实际章节同步:我希望Jekyll自动获取更改。)

回答

8

因此,我知道如何做到这一点的最佳方式是颠倒你的想法。

你不写章节,你写部分并组织他们到章节

假设你有一个这样的设置:

  • _sections
    • section01.md
    • section02.md
    • section03.md
    • section04.md

但是你要它输出这样的:

  • _site
      • chapter1.html(包含随后section03.mdsection01.md
      • chapter2.html(包含随后section02.mdsection04.md

如果是这样的话,你可以这样做使用集合。将chapter属性设置为section01.md,section03.md01的前置符号,并将chapter属性设置为section02.mdsection04.md至的前置符号。

问题是为章节生成页面。你需要为每一章制作一个页面,但是如果你使用布局,这并不坏。

这是我使用的布局(在_layouts/chapter.html):

--- 
layout: default 
--- 

<h1>Chapter {{ page.chapter }}</h1> 

{% for section in site.sections %} 
{% if section.chapter == page.chapter %} 
{{ section.output }} 
{% endif %} 
{% endfor %} 
_chapters

然后,我有chapter01.md,它看起来像这样:

--- 
chapter: 01 
layout: chapter 
--- 

只是复制到chapter02.md并设置chapter财产到02,现在你有第2章。

使这项工作所需要的唯一的另一件事是更新您的配置:

collections: 
     sections: 
       output: false 
     chapters: 
       output: true 

当您运行jekyll build,你现在必须_site/chapters/chapter01.html_site/chapters/chapter02.html。随着新章节的创建,它们将被添加到任何章节的主题中。

这真是令人困惑,所以我在http://paddyforan.github.io/jekyll-nested-collections-example/上设置了一个样本,源代码为https://github.com/paddyforan/jekyll-nested-collections-example

+0

谢谢帕迪 - 这有点可怕,但它会起作用。 –

+0

我的荣幸!对不起,花了这么长时间。使用jekyll插件可以使边界更好(自动创建章节文件),但这不适用于Github页面。 – Paddy

+0

我可能很愚蠢,但我无法在源代码中找到字符串“这是链接到第01节”。我错过了什么? – mau