添加可选权重以覆盖Jekyll中项目的默认排序

时间:2018-07-18 00:38:08

标签: jekyll liquid

我在Jekyll网站上有论文集(work)。这些项目具有发布日期(pub_date),因此按类似的顺序按相反的时间顺序对它们进行排序没有问题

{% assign work_sorted = site.work | sort: 'pub_date' | reverse %}

但是,我希望能够可选地指定一个order整数以覆盖默认顺序,以便如果某项具有order变量,则将其排序首先。然后,所有不带order的项目都应跟随,并按反向的pub_date排序。

我尝试使用group_by,但最后不能将空白order留空。我还考虑过为order添加一个默认值(如果为空)(大约为999),但似乎不起作用。

2 个答案:

答案 0 :(得分:2)

如果您使用优先级(显示最高的数字)而不是顺序(显示最低的数字,则非常简单)。这意味着如果您有5个work,如下所示:

---
title: work-a
pub_date: 18-07-10
---

---
title: work-b
pub_date: 18-07-11
---

---
title: work-c
pub_date: 18-07-12
---

---
title: work-d
pub_date: 18-07-13
---

---
title: work-e
pub_date: 18-07-14
---

您当前的代码将按以下顺序输出项目:

work-e
work-d
work-c
work-b
work-a

假设您要先显示work-c,然后再显示work-a,而其余的则按相反的时间顺序显示。仅在prioritywork-c的最前面添加一个work-a属性:

---
title: work-a
pub_date: 18-07-10
priority: 2
---

---
title: work-b
pub_date: 18-07-11
---

---
title: work-c
pub_date: 18-07-12
priority: 1
---

---
title: work-d
pub_date: 18-07-13
---

---
title: work-e
pub_date: 18-07-14
---

以下代码将为您提供所需的结果:

{% assign sorted = site.work| sort: 'pub_date' | reverse %}

{% assign ordered = sorted | sort: 'priority' | reverse %}

{% for item in ordered %}
<p>{{ item.title }} - {{ item.pub_date }}</p>
{% endfor %}

我已经测试了上面的内容,但是如果您有任何问题,请告诉我。您仍然可以使用排序顺序(首先从小到大),但是您需要添加一堆条件并动态创建数组作为字符串,所以也许这样更好:)

答案 1 :(得分:2)

为集合添加默认值:

_config.yml

collections:
  work:
    output: true

defaults:
  - scope:
      type: work
    values:
      order: 999

现在,此过滤器链接可以解决问题:

{% assign work_sorted = site.work | sort: 'pub_date' | reverse | sort: 'order' %}