refactor(tazjin/homepage): long overdue entry list rework

The entry list is now much more condensed. It's maybe a little *too*
condensed, but already closer to what I'm looking for.

Note: A new "note" post type has snuck in and can now be used for
random musings or comments on previous entries. Notes do not show up
in the Atom feed.

Change-Id: I920c0c7650937474b8a5f30cba78416554d523ce
Reviewed-on: https://cl.tvl.fyi/c/depot/+/8806
Reviewed-by: tazjin <tazjin@tvl.su>
Autosubmit: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
Vincent Ambo 2023-06-16 02:18:18 +03:00 committed by clbot
parent 0b2f5510ed
commit d8d0b17823
6 changed files with 113 additions and 116 deletions

View file

@ -15,13 +15,18 @@ let
inherit (pkgs) writeFile runCommand;
# The different types of entries on the homepage.
entryClass = enum "entryClass" [ "blog" "project" "misc" ];
entryClass = enum "entryClass" [
"blog"
"project"
"note"
"misc"
];
# The definition of a single entry.
entry = struct "entry" {
class = entryClass;
title = string;
url = string;
title = option string;
url = option string;
date = int; # epoch
description = option string;
};
@ -33,28 +38,42 @@ let
title = post.title;
url = "/blog/${post.key}";
date = post.date;
description = post.description or "Blog post from ${formatDate post.date}";
});
formatDate = defun [ int string ] (date: readFile (runCommand "date" { } ''
date --date='@${toString date}' '+%Y-%m-%d' > $out
date --date='@${toString date}' '+%Y-%m-%d' | tr -d '\n' > $out
''));
formatEntryDate = defun [ entry string ] (entry: entryClass.match entry.class {
blog = "Blog post from ${formatDate entry.date}";
project = "Project from ${formatDate entry.date}";
misc = "Posted on ${formatDate entry.date}";
});
entryUrl = defun [ entry string ] (entry:
if entry.class == "note"
then "#${toString entry.date}"
else entry.url
);
hasDescription = defun [ entry bool ] (entry:
((entry ? description) && (entry.description != null))
);
entryTitle = defun [ entry string ] (entry:
let
optionalColon = lib.optionalString (hasDescription entry) ":";
titleText =
if (!(entry ? title) && (entry.class == "note"))
then "[${formatDate entry.date}]"
else lib.optionalString (entry ? title) ((escape entry.title) + optionalColon);
in
lib.optionalString (titleText != "")
''<span class="entry-title ${entry.class}">${titleText}</span>''
);
entryToDiv = defun [ entry string ] (entry: ''
<a href="${entry.url}" class="entry ${entry.class}">
<div>
<p class="entry-title">${escape entry.title}</p>
${
lib.optionalString ((entry ? description) && (entry.description != null))
"<p class=\"entry-description\">${escape entry.description}</p>"
}
<p class="entry-date">${formatEntryDate entry}</p>
</div>
<a href="${entryUrl entry}" id="${toString entry.date}" class="entry">
${entryTitle entry}
${
lib.optionalString (hasDescription entry)
"<span class=\"entry-description\">${escape entry.description}</span>"
}
</a>
'');