From 325861628218ada8939a90049999d3127a5717d6 Mon Sep 17 00:00:00 2001 From: "N0\\A" Date: Sat, 7 Mar 2026 18:32:13 +0100 Subject: [PATCH] Better sidebar sorting --- README.md | 2 ++ awk/generate_sidebar.awk | 48 ++++++++++++++++++++++++++++++++++++++++ kewt.sh | 7 ++++-- site.conf | 1 + site/index.md | 2 ++ 5 files changed, 58 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 949fed5..9bd9d72 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ style = "kewt" dir_indexes = true single_file_index = true flatten = false +order = "" footer = "made with kewt" logo = "" display_logo = false @@ -51,6 +52,7 @@ favicon = "" - `dir_indexes` generate directory index pages when missing `index.md` - `single_file_index` if a directory has one markdown file and no `index.md`, use that file as `index.html` - `flatten` flatten sidebar directory levels +- `order` comma separated file/directory name list to order the sidebar (alphabetical by default) - `footer` footer html/text shown at the bottom of pages - `logo` logo image path (used in header if enabled) - `display_logo` show logo in header diff --git a/awk/generate_sidebar.awk b/awk/generate_sidebar.awk index dffdf08..00296f1 100644 --- a/awk/generate_sidebar.awk +++ b/awk/generate_sidebar.awk @@ -12,6 +12,16 @@ BEGIN { d_dirs[dparts[1]] = dparts[3] } } + + n_order = split(order, oparts, ",") + for (i = 1; i <= n_order; i++) { + name = oparts[i] + sub(/^[[:space:]]*/, "", name) + sub(/[[:space:]]*$/, "", name) + if (name != "") { + custom_order[tolower(name)] = i + } + } } { @@ -29,8 +39,46 @@ BEGIN { has_index[dir] = 1 } } +function compare_paths(p1, p2, parts1, parts2, n1, n2, i, name1, name2, lname1, lname2, w1, w2) { + n1 = split(p1, parts1, "/") + n2 = split(p2, parts2, "/") + for (i = 1; i <= n1 && i <= n2; i++) { + name1 = parts1[i] + name2 = parts2[i] + if (i == n1) gsub(/\.md$/, "", name1) + if (i == n2) gsub(/\.md$/, "", name2) + lname1 = tolower(name1) + lname2 = tolower(name2) + + if (lname1 == "index" && i == n1 && lname2 != "index") return -1 + if (lname2 == "index" && i == n2 && lname1 != "index") return 1 + + w1 = (lname1 in custom_order ? custom_order[lname1] : 999999) + w2 = (lname2 in custom_order ? custom_order[lname2] : 999999) + + if (w1 < w2) return -1 + if (w1 > w2) return 1 + + if (lname1 < lname2) return -1 + if (lname1 > lname2) return 1 + } + if (n1 < n2) return -1 + if (n1 > n2) return 1 + return 0 +} END { + for (i = 0; i < count - 1; i++) { + for (j = 0; j < count - i - 1; j++) { + if (compare_paths(ordered_paths[j], ordered_paths[j+1]) > 0) { + tmp = ordered_paths[j] + ordered_paths[j] = ordered_paths[j+1] + ordered_paths[j+1] = tmp + } + } + } + + print "