website/lib/Render/Post.rakumod

101 lines
2.1 KiB
Raku
Raw Normal View History

2025-02-07 02:54:20 -05:00
use v6.e.PREVIEW;
unit module Render::Post;
use Render::Util;
use DB::Post;
use HTML::Functional;
sub post-date(Post:D $post) is export {
my $datetime = $post.posted-at;
my $timestamp = sprintf(
"%s %02d:%02d%s",
$datetime.yyyy-mm-dd,
($datetime.hour % 12) || 12,
$datetime.minute,
$datetime.hour < 12 ?? 'am' !! 'pm'
);
div :class<post-time>, :title("Posted At $timestamp"), [
icon 'time';
'&nbsp;';
$timestamp
]
}
sub post-edit(Post:D $post) is export {
return [] unless $post.edited-at.elems;
my $datetime = $post.edited-at.max;
my $timestamp = sprintf(
"%s %02d:%02d%s",
$datetime.yyyy-mm-dd,
($datetime.hour % 12) || 12,
$datetime.minute,
$datetime.hour < 12 ?? 'am' !! 'pm'
);
div :class<post-edit>, :title("Last Edited At $timestamp"), [
icon 'edit';
'&nbsp;';
$timestamp
]
}
sub post-read-time(Post:D $post) is export {
my ($slow, $average, $fast) = $post.readtimes;
div :class<post-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 post-tag(Str:D $tag) is export {
span :class<post-tag>, [
a :href("/tags/$tag.html"), [
icon 'hash';
$tag;
]
]
}
sub post-tags(Post:D $post) is export {
my @tags = $post.tags.sort;
2025-02-07 02:54:20 -05:00
if @tags {
@tags.=map(*.&post-tag);
div :class<post-tags>, [
icon 'purchase-tag-alt';
'&nbsp;';
intersperse(', ', @tags);
]
} else {
[]
}
}
sub post-info(Post:D $post) is export {
div :class<post-info>, [
post-date $post;
post-edit $post;
post-read-time $post;
post-tags $post;
];
}
sub post-header(Post:D $post) is export {
header :class<post-header>, [
div :class<post-title>, [
h1 $post.title;
];
post-info $post;
]
}