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;
|
2025-02-04 22:24:37 -05:00
|
|
|
article :class<post>, [
|
2025-02-09 02:43:22 -05:00
|
|
|
post-header $id, $post, $db;
|
2025-02-04 22:24:37 -05:00
|
|
|
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
|
|
|
|
];
|
|
|
|
|
2025-02-09 03:10:21 -05:00
|
|
|
show-html $html
|
2025-02-03 21:36:07 -05:00
|
|
|
}
|
2025-02-04 23:43:42 -05:00
|
|
|
|
2025-02-05 03:26:39 -05:00
|
|
|
method generate-index($db) {
|
|
|
|
my @most-recent =
|
|
|
|
$db.sorted-posts
|
|
|
|
.head(10)
|
|
|
|
.grep(!*.value.hidden)
|
|
|
|
.map(-> $pair {
|
2025-02-09 05:28:59 -05:00
|
|
|
generate-blurb $pair.key, $db
|
2025-02-05 03:26:39 -05:00
|
|
|
});
|
|
|
|
|
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
|
|
|
|
];
|
|
|
|
|
2025-02-09 03:10:21 -05:00
|
|
|
show-html $html
|
2025-02-05 03:26:39 -05:00
|
|
|
}
|
|
|
|
|
2025-02-05 03:28:49 -05:00
|
|
|
method generate-archive($db) {
|
|
|
|
my @most-recent =
|
|
|
|
$db.sorted-posts
|
|
|
|
.grep(!*.value.hidden)
|
|
|
|
.map(-> $pair {
|
2025-02-09 05:28:59 -05:00
|
|
|
generate-blurb $pair.key, $db
|
2025-02-05 03:28:49 -05:00
|
|
|
});
|
|
|
|
|
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
|
|
|
|
];
|
|
|
|
|
2025-02-09 03:10:21 -05:00
|
|
|
show-html $html
|
2025-02-05 03:28:49 -05:00
|
|
|
}
|
|
|
|
|
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
|
|
|
|
];
|
|
|
|
|
2025-02-09 03:10:21 -05:00
|
|
|
show-html $html
|
2025-02-07 01:43:52 -05:00
|
|
|
}
|
|
|
|
|
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
|
|
|
|
];
|
|
|
|
|
2025-02-09 03:10:21 -05:00
|
|
|
show-html $html
|
2025-02-07 01:58:44 -05:00
|
|
|
}
|