website/lib/Config.rakumod

185 lines
4 KiB
Raku
Raw Normal View History

2025-02-03 21:36:07 -05:00
use v6.e.PREVIEW;
use HTML::Functional;
2025-02-07 02:26:17 -05:00
2025-02-07 02:33:40 -05:00
use Render::Util;
2025-02-07 02:54:20 -05:00
use Render::Head;
use Render::Post;
2025-02-03 21:36:07 -05:00
use DB::BlogMeta;
2025-02-04 16:51:37 -05:00
use DB::Post;
2025-02-03 21:36:07 -05:00
unit class Config;
2025-02-04 16:51:37 -05:00
# TODO: Support GFM admonitions
2025-02-09 02:43:22 -05:00
method generate-post(Int:D $id, Post:D $post, $db) {
my $meta = $db.meta;
2025-02-04 16:51:37 -05:00
my $content = $post.render-html;
2025-02-07 02:26:17 -05:00
my $head = generate-head($meta, $post.title, $post.description);
2025-02-03 21:51:09 -05:00
my $body =
body [
2025-02-07 02:44:35 -05:00
site-header $meta;
article :class<post>, [
2025-02-09 02:43:22 -05:00
post-header $id, $post, $db;
div :class<post-body>, [
$content;
]
2025-02-03 21:51:09 -05:00
]
];
2025-02-09 01:50:37 -05:00
# TODO: Setup Comments
2025-02-03 21:51:09 -05:00
# TODO: Setup footer
2025-02-03 21:36:07 -05:00
# my $footer;
my $html = html :lang<en>, [
$head,
$body
];
"<!doctype html>$html"
}
2025-02-04 23:43:42 -05:00
2025-02-05 03:26:39 -05:00
method generate-blurb(Int:D $id, $db) {
my $post = $db.posts{$id};
my $desc = $post.description;
2025-02-07 02:33:40 -05:00
my $link = post-link $id, $post;
2025-02-05 03:26:39 -05:00
div :class<post-blurb>, [
div :class<post-blurb-title>, [
a :href($link), span [
h2 $post.title;
];
];
2025-02-09 02:43:22 -05:00
post-info $id, $post, $db;
2025-02-05 03:26:39 -05:00
if $desc ~~ Str:D {
div :class<post-blurb-description>, [
p $post.description;
];
} else {
[]
}
]
}
method generate-index($db) {
my @most-recent =
$db.sorted-posts
.head(10)
.grep(!*.value.hidden)
.map(-> $pair {
self.generate-blurb: $pair.key, $db
});
2025-02-07 02:26:17 -05:00
my $head = generate-head($db.meta);
2025-02-05 03:26:39 -05:00
my $body = body [
2025-02-07 02:44:35 -05:00
site-header $db.meta;
2025-02-05 03:26:39 -05:00
div :class<post-blurbs>, [
h1 "Recent Posts"
], @most-recent;
];
my $html =
html :lang<en>, [
$head,
$body
];
"<!doctype html>$html"
}
2025-02-05 03:28:49 -05:00
method generate-archive($db) {
my @most-recent =
$db.sorted-posts
.grep(!*.value.hidden)
.map(-> $pair {
self.generate-blurb: $pair.key, $db
});
2025-02-07 02:26:17 -05:00
my $head = generate-head($db.meta);
2025-02-05 03:28:49 -05:00
my $body = body [
2025-02-07 02:44:35 -05:00
site-header $db.meta;
2025-02-05 03:28:49 -05:00
div :class<post-blurbs>, [
h1 "All Posts"
], @most-recent;
];
my $html =
html :lang<en>, [
$head,
$body
];
"<!doctype html>$html"
}
2025-02-07 01:43:52 -05:00
method generate-tag-blurb($db, $tag, $limit?) {
sub post-to-link($id, $post) {
my $desc = $post.description;
2025-02-07 02:33:40 -05:00
my $link = post-link $id, $post;
2025-02-07 01:43:52 -05:00
div :class<tag-blurb-post>, [
div :class<tag-blurb-post-title>, [
a :href($link), span [
h3 $post.title;
];
2025-02-09 02:43:22 -05:00
post-info $id, $post, $db;
2025-02-07 01:43:52 -05:00
if $desc ~~ Str:D {
div :class<tag-blurb-post-description>, [
p $post.description;
];
} else {
[]
}
];
]
}
my @posts = $db.sorted-posts.grep(-> $a { $tag (elem) $a.value.tags });
if $limit {
@posts.=head($limit);
}
if @posts {
div :class<tag-blurb>, [
span :class<tag-blurb-title>, [
a :href("/tags/$tag.html"), [
icon 'hash';
$tag;
];
];
div :class<tag-blurb-links>,
@posts.map(-> $a {post-to-link $a.key, $a.value});
]
} else {
[]
}
}
method generate-tags-page($db, @tags) {
2025-02-07 02:26:17 -05:00
my $head = generate-head($db.meta);
2025-02-07 01:43:52 -05:00
my $body = body [
2025-02-07 02:44:35 -05:00
site-header $db.meta;
2025-02-07 01:43:52 -05:00
div :class<tags>, [
h1 "Tags";
], @tags.map(-> $tag {self.generate-tag-blurb($db, $tag, 4)});
];
my $html =
html :lang<en>, [
$head,
$body
];
"<!doctype html>$html"
}
2025-02-07 01:58:44 -05:00
method generate-tag-page($db, $tag) {
2025-02-07 02:26:17 -05:00
my $head = generate-head($db.meta);
2025-02-07 01:58:44 -05:00
my $body = body [
2025-02-07 02:44:35 -05:00
site-header $db.meta;
2025-02-07 01:58:44 -05:00
self.generate-tag-blurb($db, $tag, 4);
];
my $html =
html :lang<en>, [
$head,
$body
];
"<!doctype html>$html"
}