Skip to content

Commit 5c4cfc9

Browse files
committed
Refactor release-archives page to use a custom liquid filter
The `sort_by_semver_key` filter takes a hash and sorts it by the key, emitting an array of key-value arrays. It can take either a dotty or underscorey semver key and sort them in descending order. They are sorted lexicographically by left padding each version component with zeros, so might need some work to handle SNAPSHOT if we ever want that involved. The filter can be configured to sort them ascending with `sort_by_semver_key: 'asc'`. Signed-off-by: Robert Young <[email protected]>
1 parent b847458 commit 5c4cfc9

File tree

2 files changed

+37
-34
lines changed

2 files changed

+37
-34
lines changed

_plugins/sort_hash_by.rb

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
module Jekyll
2+
module CustomSortFilters
3+
def sort_by_semver_key(hash, direction = 'desc')
4+
unless hash.is_a?(Hash)
5+
raise ArgumentError, "Filter 'sort_by_semver_key' requires a Hash, but received a #{hash.class.name}."
6+
end
7+
8+
sorted_array = hash.sort_by do |key, value|
9+
key_str = key.to_s
10+
11+
normalized_str = key_str.gsub('.', '_')
12+
13+
unless normalized_str.match?(/\A\d+_\d+_\d+\z/)
14+
raise ArgumentError, "Invalid semver key in 'sort_by_semver_key'. Expected '1.2.3' or '1_2_3', but found '#{key_str}'."
15+
end
16+
17+
normalized_str.split('_').map { |part| part.rjust(5, '0') }.join('.')
18+
end
19+
20+
# controlling this from the filter is convenient because 'sort_by_semver_key | reverse' doesn't work as expected
21+
if direction == 'desc'
22+
return sorted_array.reverse
23+
else
24+
return sorted_array
25+
end
26+
end
27+
end
28+
end
29+
30+
Liquid::Template.register_filter(Jekyll::CustomSortFilters)

release-archives/index.md

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,56 +2,29 @@
22
layout: default
33
title: Release Archives
44
---
5+
56
{%- comment -%}
6-
`site.data.release` an object and unordered.
7-
Liquid lacks any ability to sort it, or convert it to an array for sorting.
8-
This following monstrosity is to work around that.
9-
{%- endcomment -%}
10-
{%- assign versionsList="" -%}
11-
{%- for major in (0..999) -%}
12-
{%- assign probe1=major | append: "_1_0" -%}
13-
{%- if site.data.release[probe1] -%}
14-
{%- for minor in (1..999) -%}
15-
{%- assign probe2=major | append: "_" | append: minor | append: "_0" -%}
16-
{%- if site.data.release[probe2] -%}
17-
{%- for micro in (0..999) -%}
18-
{%- assign key=major | append: "_" | append: minor | append: "_" | append: micro -%}
19-
{%- if site.data.release[key] -%}
20-
{%- assign versionsList=versionsList | append: "," | append: key -%}
21-
{%- else -%}
22-
{%- break -%}
23-
{%- endif -%}
24-
{%- endfor -%}
25-
{%- else -%}
26-
{%- break -%}
27-
{%- endif -%}
28-
{%- endfor -%}
29-
{%- else -%}
30-
{%- break -%}
31-
{%- endif -%}
32-
{%- endfor -%}
33-
{%- assign versionsList=versionsList | remove_first: "," | split: "," | reverse -%}
34-
{%- comment -%}
35-
endmonstrosity
7+
`sort_by_semver_key` is a custom filter in _plugins.
368
{%- endcomment -%}
9+
{%- assign sorted_releases = site.data.release | sort_by_semver_key -%}
3710

3811
<div class="row align-items-start justify-content-center my-5">
3912
<div class="col-lg-3 mb-5" role="complementary" aria-labelledby="page-title">
4013
<div class="card shadow px-2 mx-2">
4114
<div class="card-body">
4215
<h1 id="page-title" class="fs-3">{{ page.title }}</h1>
4316
<ul>
44-
{%- for relKey in versionsList -%}
45-
{%- assign releaseVersion=relKey | replace: '_', '.' -%}
17+
{% for rel_entry in sorted_releases %}
18+
{%- assign releaseVersion=rel_entry[0] | replace: '_', '.' -%}
4619
<li><a href="#{{ releaseVersion }}">{{ releaseVersion }}</a></li>
4720
{%- endfor -%}
4821
</ul>
4922
</div>
5023
</div>
5124
</div>
5225
<div class="col-lg-6" role="main">
53-
{%- for relKey in versionsList -%}
54-
{%- assign releaseVersion=relKey | replace: '_', '.' -%}
26+
{% for rel_entry in sorted_releases %}
27+
{%- assign releaseVersion=rel_entry[0] | replace: '_', '.' -%}
5528
{%- assign release=site.data.release | map: relKey -%}
5629
<div class="card shadow mb-4">
5730
<div class="card-body mx-3 my-2">

0 commit comments

Comments
 (0)