website/lib/Render/Series.rakumod

145 lines
3.4 KiB
Raku
Raw Normal View History

2025-02-09 05:28:59 -05:00
use v6.e.PREVIEW;
unit module Render::Series;
use Render::Util;
use Render::Head;
use Render::Post;
use DB::Post;
use DB::Series;
use HTML::Functional;
sub series-date(Series:D $series, $db) is export {
my $datetime = $series.latest-post: $db;
if $datetime {
my $timestamp = sprintf(
"%s %02d:%02d%s",
$datetime.yyyy-mm-dd,
($datetime.hour % 12) || 12,
$datetime.minute,
$datetime.hour < 12 ?? 'am' !! 'pm'
);
div :class<series-time>, :title("Latest post made at $timestamp"), [
icon 'calendar';
'&nbsp;';
$datetime.Date.Str
]
} else {
[]
}
}
sub series-read-time(Series:D $series, $db) is export {
my @readtimes = $series.post-ids.map(-> $i {$db.posts{$i}.readtimes});
my ($slow, $average, $fast) = 0, 0, 0;
for @readtimes -> ($s, $a, $f) {
$slow += $s;
$average += $a;
$fast += $f;
}
div :class<series-read-time>, :title<Estimated read time at 140/180/220 WPM>, [
icon 'timer';
'&nbsp;';
mins-to-string $slow;
'&nbsp;';
'/';
'&nbsp;';
mins-to-string $average;
'&nbsp;';
'/';
'&nbsp;';
mins-to-string $fast;
]
}
sub series-count(Series:D $series, $db) is export {
my $count = $series.post-ids.elems;
div :class<series-article-count>, :title("Series has $count articles"), [
icon 'add-to-queue';
'&nbsp;';
2025-02-11 17:43:23 -05:00
do if $count == 1 { "$count article" } else { "$count articles" };
2025-02-09 05:28:59 -05:00
]
}
sub series-info(Series:D $series, $db) is export {
div :class<series-info>, [
series-date $series, $db;
series-read-time $series, $db;
series-count $series, $db;
]
}
sub series-header(Series:D $series, $db) is export {
header :class<series-header>, [
div :class<series-title>, [
h1 $series.title;
];
div :class<series-desc>, [
p $series.desc;
];
series-info $series, $db;
]
}
sub series-page(Int:D $series-id, $db) is export {
my $meta = $db.meta;
my $series = $db.series{$series-id};
2025-02-12 03:38:55 -05:00
my $head = head [generate-head($meta, $series.title, $series.desc);];
2025-02-09 05:28:59 -05:00
my $body =
body [
site-header $meta;
article :class<series>, [
series-header $series, $db;
div :class<series-blurbs>,
$series.post-ids.map(*.&generate-blurb($db));
]
];
my $html = html :lang<en>, [
$head;
$body
];
show-html $html;
}
2025-02-09 05:51:52 -05:00
sub series-blurb(Int:D $id, Series:D $series, $db) {
my $link = "/series/$id.html";
div :class<series-list-blurb>, [
div :class<series-list-blurb-title>, [
a :href($link), span [
h2 $series.title;
];
p $series.desc;
];
series-info $series, $db;
]
}
sub series-list-page($db) is export {
my @series = $db.series.sort(*.value.latest-post: $db);
my @series-blurbs = ();
for @series -> $pair {
my $id = $pair.key;
my $series = $pair.value;
@series-blurbs.push:
series-blurb $id, $series, $db;
}
2025-02-12 03:38:55 -05:00
my $head = head [generate-head($db.meta);];
2025-02-09 05:51:52 -05:00
my $body = body [
site-header $db.meta;
div :class<series-list>, [
h1 "All Series"
], @series-blurbs;
];
my $html = html :lang<en>, [
$head;
$body;
];
show-html $html;
}