Jekyll前端物质变量到动态导航?

时间:2017-05-19 14:46:43

标签: jekyll liquid

所以我对jekyll和一般的流动性都很陌生,我做了一些搜索,但找不到我问题的具体答案。

所以基本上,我正在制作一个jekyll网站,需要尽可能容易的贡献者,因为不只有一个网站贡献者。考虑到这一点,我想知道是否有可能在构建上进行动态导航,在页面的前端采用自定义变量,如果它与顶级导航项匹配(金额不会改变),将页面链接放在所述导航项的下拉列表中。

举个例子,假设我有顶级导航项目:Color and Animal。如果贡献者想要添加一个名为“Duck”的页面,他可以放入他的前面的事情

parent: Animal
permalink: duck

并且,在构建时,jekyll将遍历每个页面,当它发生在页面'duck'时,它会将链接放入Animal导航项中作为下拉菜单。

我知道还有其他方法可以进行多级导航,如Jekyll文档中所述,但是每次都需要有人更改配置文件,除非我完全误解它。我希望贡献者只需要担心他正在制作的页面,我认为前面的事情是一个很好的地方。

编辑:我将提供我已经尝试过的东西,虽然,我认为我的代码会让你发笑,因为它可能会偏离并且可能过于复杂。以下代码假设配置中的导航数组包含带有“text”和“url”变量的顶级项目。并非所有人都有链接,可能只作为下拉菜单。它还假设页面上的变量称为“父文本”,这是匹配将发生的位置。

{% for link in site.navigation %} <a href="{{link.url}}">{{link.text}}</a> 

{% for page in site.pages %}

{% if page.parent-text == true %}

<a href="{{page.permalink}}"> {{page.parent-text}} </a>

{% endif %}

{% endfor %}

{% endfor %}

我只是想让它输出。我稍后会处理样式和标记。

提前感谢大家!

1 个答案:

答案 0 :(得分:2)

我要说的第一件事就是小心使用page作为循环中的变量。 page对于Jekyll(docs)具有特殊含义,并将其设置为循环或作为变量将覆盖它通常的工作方式。

使用Front Matter

我对你的例子感到有点困惑,为什么你要检查page.parent-text == true。这只会检查相关文件是否与前面有关键parent-text,但未设置为false。您似乎想将其与导航链接的文本进行比较。这样的事情应该有效:

{% for link in site.navigation %}
  <a href="{{link.url}}">{{link.text}}</a>
  {% for my_page in site.pages %}
    {% if my_page.parent == link.text %}
      <a href="{{page.permalink}}"> {{page.title}} </a>
    {% endif %}
  {% endfor %}
{% endfor %}

使用数据文件

您也可以使用a data file。假设您有一个文件_data/nav-links.yml,如下所示:

- text: Animals
  url: '/animals/'
  dropdown:
    - text: Duck
      url: '/duck/'
    - text: Goose
      url: '/goose/'

然后,在你的导航中,你有:

{% for link in site.data.nav-links %}
  <a href="{{ link.url }}">{{ link.text }}</a>
  {% for sub_link in link.dropdown %}
    <a href="{{ sub_link.url }}">{{ sub_link.text }}</a>
  {% endfor %}
{% endfor %}

这会将相关信息隔离到自己的文件中,因此贡献者不必筛选此配置。如果您认为site.navigation中的链接名称有可能发生变化,那么这是首选;如果他们中的任何一个做了,那么所有相关页面前面的相应parentparent-text变量的所有也必须改变。