如何使用Jekyll的Liquid获取文件夹的向上完整家族树?
在Jekyll Liquid中获取文件夹的完整家族树
要实现获取目标文件夹的所有父级及祖先层级,我们可以通过Liquid的循环和层级迭代来完成,具体步骤如下:
1. 基础准备
假设你的Folders collection中,每个文件夹文档都有:
name字段:存储文件夹的名称(与children数组中的元素对应)children字段:字符串数组,包含子文件夹的名称
目标文件夹名称我们用变量target_folder_name来定义,比如示例中的"Domestic Cats"。
2. 实现代码
{% assign target_folder_name = "Domestic Cats" %} {% assign ancestors = "" | split: "" %} {% assign current_level_parents = site.folders | where_exp: "folder", "folder.children contains target_folder_name" %} <!-- 先收集直接父级 --> {% for parent in current_level_parents %} {% assign ancestors = ancestors | push: parent %} {% endfor %} <!-- 迭代收集所有祖先层级 --> {% assign current_level = current_level_parents %} {% while current_level.size > 0 %} {% assign next_level = "" | split: "" %} {% for folder in current_level %} <!-- 找到当前文件夹的父级 --> {% assign grand_parents = site.folders | where_exp: "f", "f.children contains folder.name" %} {% for gp in grand_parents %} <!-- 去重,避免重复添加同一祖先 --> {% unless ancestors contains gp %} {% assign ancestors = ancestors | push: gp %} {% assign next_level = next_level | push: gp %} {% endunless %} {% endfor %} {% endfor %} {% assign current_level = next_level %} {% endwhile %} <!-- 输出结果 --> {% if ancestors.size > 0 %} <h4>目标文件夹 "{{ target_folder_name }}" 的家族树:</h4> <ul> {% for ancestor in ancestors %} <li>{{ ancestor.name }}</li> {% endfor %} </ul> {% else %} <p>未找到 "{{ target_folder_name }}" 的任何父级文件夹。</p> {% endif %}
3. 代码说明
- 初始化变量:
ancestors用于存储所有找到的祖先文件夹,current_level_parents先筛选出目标文件夹的直接父级。 - 直接父级收集:将所有直接父级加入
ancestors数组。 - 迭代查找祖先:通过
while循环逐层向上查找,每次处理当前层级的文件夹,找到它们的父级,去重后加入ancestors,并更新下一层级的处理列表,直到没有更多父级为止。 - 结果输出:遍历
ancestors数组,展示所有父级及祖先文件夹的名称。
注意事项
- 如果你的文件夹名称使用的是文档的
slug而非name字段,只需将代码中的folder.name替换为folder.slug即可。 - 确保
site.folders能正确获取到你的collection数据(Jekyll中collection的访问方式为site.[collection_name],如果你的collection配置中output: true,则可以正常访问)。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

