如果项目特定数据不可用,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' %}
。文档说我不能使用 include
或 include_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 %}
我对 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' %}
。文档说我不能使用 include
或 include_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 %}