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, :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, :title, [ 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, :title("Series has $count articles"), [ icon 'add-to-queue'; ' '; "$count articles"; ] } sub series-info(Series:D $series, $db) is export { div :class, [ series-date $series, $db; series-read-time $series, $db; series-count $series, $db; ] } sub series-header(Series:D $series, $db) is export { header :class, [ div :class, [ h1 $series.title; ]; div :class, [ 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-header $series, $db; div :class, $series.post-ids.map(*.&generate-blurb($db)); ] ]; my $html = html :lang, [ $head; $body ]; show-html $html; } sub series-blurb(Int:D $id, Series:D $series, $db) { my $link = "/series/$id.html"; div :class, [ div :class, [ 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; } my $head = generate-head($db.meta); my $body = body [ site-header $db.meta; div :class, [ h1 "All Series" ], @series-blurbs; ]; my $html = html :lang, [ $head; $body; ]; show-html $html; }