如果项目特定数据不可用,Jekyll 中的惯用方式继承默认数据

Idiomatic way in Jekyll to inherit default data if project specific data unavailable

我对 Jekyll 完全陌生。我做了这样的事情:

  {% assign top_nav = site.data.menus %}
  {% if site.data.orgs[site.orgData].menus %}
    {% assign top_nav = site.data.orgs[site.orgData].menus %}
  {% endif %}
  <ul>
    {% for menu in top_nav %}
    <li>
      <a href="{{ menu.url }}">{{ menu.title }}</a>
    </li>
    {% endfor %}
  </ul>

基本上,我将从默认文件夹中获取一组导航项。但是如果我注意到特定组织的菜单存在,那么我将覆盖默认文件夹提供的菜单。

我不喜欢这种方法的地方是我现在在我的 jekyll 模板中有数百个地方可以执行此 if 语句检查。如果这是任何其他脚本编程语言,我会定义一个像 function($org_name,$prop) {return $site.data.orgs[$org_name][$prop] ? $site.data.orgs[$org_name][$prop] : $site.data[$prop]; } 这样的函数。在 jekyll 中实现相同 objective 的惯用方法是什么?


我通过这样做尝试了 David Jacquel 的建议的变体

./org_var.html

{% assign prop = include.prop %}

{% assign orgVar = site.data[prop] %}
{% if site.data.orgs[site.orgData][prop] %}
  {% assign orgVar = site.data.orgs[site.orgData][prop] %}
{% endif %}

./_include/nav.html

{% include_relative ../org_var.html prop=menus %}
{% for menu in orgVar %}
... print menu items

./_layout/header.html

{% include_relative ../org_var prop='electronics.televisions' %}
{% for tv in orgVar%}
{{ tv.modelName }}
... print tv values
{% endfor %}

但是我在 ../org_var.html 中遇到语法错误 {% include_relative file.ext param='value' param2='value' %} 。文档说我不能使用 includeinclude_relative 的相对路径。如何使我的 org_var.html 成为可重复使用的全局函数? electronics.televisions 甚至会正确评估我的 site.data.org.[site.orgData][...path] 变量的正确路径吗?

您可以使用 Jekyll includes.

从任何您想使用 include 的地方:

{% include nav.html org_name=org_name prop=prop %}

将调用 _include/nav.html 可以是这样的:

{% assign org_name = include.org_name %}
{% assign prop = include.prop %}

{% if site.data.orgs[org_name][prop] %}
  {% assign top_nav = site.data.orgs[site.orgData].menus %}
{% else %}
  {% assign top_nav = site.data.orgs[site.orgData].menus %}
{% endif %}
<ul>
  {% for menu in top_nav %}
  ...

刚刚意识到有一个 default: 变量修饰符,例如 smarty templates

{% assign top_nav = site.data.orgs[site.orgData].menus | default: site.data.menus %}