From 731d7aa19c0925a31fc544cab46e5497499610d1 Mon Sep 17 00:00:00 2001 From: Nathan McCarty Date: Fri, 7 Feb 2025 02:54:20 -0500 Subject: [PATCH] Factor out post generation components --- lib/Config.rakumod | 118 ++-------------------------------------- lib/Render/Post.rakumod | 100 ++++++++++++++++++++++++++++++++++ lib/Render/Util.rakumod | 17 ++++++ 3 files changed, 122 insertions(+), 113 deletions(-) create mode 100644 lib/Render/Post.rakumod diff --git a/lib/Config.rakumod b/lib/Config.rakumod index a7982e6..68c8172 100644 --- a/lib/Config.rakumod +++ b/lib/Config.rakumod @@ -2,122 +2,14 @@ use v6.e.PREVIEW; use HTML::Functional; -use Render::Head; use Render::Util; +use Render::Head; +use Render::Post; use DB::BlogMeta; use DB::Post; unit class Config; -method post-date(Post:D $post) { - 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, :title("Posted At $timestamp"), [ - icon 'time'; - ' '; - $timestamp - ] -} - -method post-edit(Post:D $post) { - 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, :title("Laste Edited At $timestamp"), [ - icon 'edit'; - ' '; - $timestamp - ] -} - -sub mins-to-string($mins) { - if $mins < 60 { - $mins.Str ~ "m" - } else { - my $h = $mins div 60; - my $m = $mins mod 60; - $h.Str ~ "h" ~ $m.Str ~ "m" - } -} - -method post-read-time(Post:D $post) { - my ($slow, $average, $fast) = $post.readtimes; - div :class, :title, [ - icon 'timer'; - ' '; - mins-to-string $slow; - ' '; - '/'; - ' '; - mins-to-string $average; - ' '; - '/'; - ' '; - mins-to-string $fast; - ] -} - -method post-tag(Str:D $tag) { - span :class, [ - a :href("/tags/$tag.html"), [ - icon 'hash'; - $tag; - ] - ] -} - -method post-tags(Post:D $post){ - sub intersperse (\element, +list) { - gather for list { - FIRST .take, next; - take slip element, $_; - } - } - my @tags = $post.tags; - if @tags { - @tags.=map(-> $tag {self.post-tag($tag)}); - div :class, [ - icon 'purchase-tag-alt'; - ' '; - intersperse(', ', @tags); - ] - } else { - [] - } -} - -method post-info(Post:D $post) { - div :class, [ - self.post-date: $post; - self.post-edit: $post; - self.post-read-time: $post; - self.post-tags: $post; - ]; -} - -method post-header(Post:D $post) { - header :class, [ - div :class, [ - h1 $post.title; - ]; - self.post-info: $post; - ] -} - # TODO: Support GFM admonitions method generate-post(Post:D $post, BlogMeta:D $meta) { my $content = $post.render-html; @@ -126,7 +18,7 @@ method generate-post(Post:D $post, BlogMeta:D $meta) { body [ site-header $meta; article :class, [ - self.post-header: $post; + post-header $post; div :class, [ $content; ] @@ -153,7 +45,7 @@ method generate-blurb(Int:D $id, $db) { h2 $post.title; ]; ]; - self.post-info: $post; + post-info $post; if $desc ~~ Str:D { div :class, [ p $post.description; @@ -224,7 +116,7 @@ method generate-tag-blurb($db, $tag, $limit?) { a :href($link), span [ h3 $post.title; ]; - self.post-info: $post; + post-info $post; if $desc ~~ Str:D { div :class, [ p $post.description; diff --git a/lib/Render/Post.rakumod b/lib/Render/Post.rakumod new file mode 100644 index 0000000..37fbd0b --- /dev/null +++ b/lib/Render/Post.rakumod @@ -0,0 +1,100 @@ +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, :title("Posted At $timestamp"), [ + icon 'time'; + ' '; + $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, :title("Last Edited At $timestamp"), [ + icon 'edit'; + ' '; + $timestamp + ] +} + +sub post-read-time(Post:D $post) is export { + my ($slow, $average, $fast) = $post.readtimes; + div :class, :title, [ + icon 'timer'; + ' '; + mins-to-string $slow; + ' '; + '/'; + ' '; + mins-to-string $average; + ' '; + '/'; + ' '; + mins-to-string $fast; + ] +} + +sub post-tag(Str:D $tag) is export { + span :class, [ + a :href("/tags/$tag.html"), [ + icon 'hash'; + $tag; + ] + ] +} + +sub post-tags(Post:D $post) is export { + my @tags = $post.tags; + if @tags { + @tags.=map(*.&post-tag); + div :class, [ + icon 'purchase-tag-alt'; + ' '; + intersperse(', ', @tags); + ] + } else { + [] + } +} + +sub post-info(Post:D $post) is export { + div :class, [ + post-date $post; + post-edit $post; + post-read-time $post; + post-tags $post; + ]; +} + +sub post-header(Post:D $post) is export { + header :class, [ + div :class, [ + h1 $post.title; + ]; + post-info $post; + ] +} diff --git a/lib/Render/Util.rakumod b/lib/Render/Util.rakumod index 244b561..05630a7 100644 --- a/lib/Render/Util.rakumod +++ b/lib/Render/Util.rakumod @@ -35,3 +35,20 @@ sub post-link(Int:D $id, Post:D $post --> Str:D) is export { sub icon($icon) is export { i(:class("bx bx-$icon")) } + +sub mins-to-string($mins) is export { + if $mins < 60 { + $mins.Str ~ "m" + } else { + my $h = $mins div 60; + my $m = $mins mod 60; + $h.Str ~ "h" ~ $m.Str ~ "m" + } +} + +sub intersperse (\element, +list) is export { + gather for list { + FIRST .take, next; + take slip element, $_; + } +}