105 lines
2.5 KiB
Raku
105 lines
2.5 KiB
Raku
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';
|
|
' ';
|
|
$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';
|
|
' ';
|
|
mins-to-string $slow;
|
|
' ';
|
|
'/';
|
|
' ';
|
|
mins-to-string $average;
|
|
' ';
|
|
'/';
|
|
' ';
|
|
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';
|
|
' ';
|
|
"$count articles";
|
|
]
|
|
}
|
|
|
|
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};
|
|
my $head = generate-head($meta, $series.title, $series.desc);
|
|
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;
|
|
}
|