Open graph tag generation for posts

This commit is contained in:
Nathan McCarty 2025-02-12 03:38:55 -05:00
parent 585b2be5ab
commit 2862f45d77
5 changed files with 40 additions and 26 deletions

View file

@ -2,25 +2,15 @@ use v6.e.PREVIEW;
use DB::Post; use DB::Post;
use DB::BlogMeta; use DB::BlogMeta;
use Render::Util;
use XML; use XML;
unit module Atom; unit module Atom;
# get the link for a post
sub post-link(BlogMeta:D $meta, Int:D $id, Post:D $post --> Str:D) {
my @slugs = $post.all-slugs;
my $base = $meta.get-base-url;
if @slugs.elems {
"$base/posts/by-slug/{@slugs[*-1]}.html"
} else {
"$base/posts/by-id/$id.html"
}
}
#| Convert a single post to an atom item #| Convert a single post to an atom item
sub post-to-item(BlogMeta:D $meta, Int:D $id, Post:D $post --> XML::Element) { sub post-to-item(BlogMeta:D $meta, Int:D $id, Post:D $post --> XML::Element) {
my $link = post-link $meta, $id, $post; my $link = post-link-abs $meta, $id, $post;
my $desc = $post.description; my $desc = $post.description;
my $xml = XML::Element.new(:name<entry>); my $xml = XML::Element.new(:name<entry>);
$xml.append: $xml.append:

View file

@ -13,7 +13,18 @@ unit class Config;
method generate-post(Int:D $id, Post:D $post, $db) { method generate-post(Int:D $id, Post:D $post, $db) {
my $meta = $db.meta; my $meta = $db.meta;
my $content = $post.render-html; my $content = $post.render-html;
my $head = generate-head($meta, $post.title, $post.description); my $head =
head [
generate-head($meta, $post.title, $post.description);
meta :property<og:title>, :content($post.title);
meta :property<og:url>, :content(post-link-abs $db.meta, $id, $post);
meta :property<og:site_name>, :content($db.meta.title);
meta :property<og:type>, :content<article>;
meta :property<article:published_time>, :content($post.posted-at);
$post.tags.map(-> $tag {
meta :property<article:tag>, :content($tag)
});
];
my $body = my $body =
body [ body [
site-header $meta; site-header $meta;
@ -45,7 +56,7 @@ method generate-index($db) {
generate-blurb $pair.key, $db generate-blurb $pair.key, $db
}); });
my $head = generate-head($db.meta); my $head = head [generate-head($db.meta);];
my $body = body [ my $body = body [
site-header $db.meta; site-header $db.meta;
div :class<post-blurbs>, [ div :class<post-blurbs>, [
@ -70,7 +81,7 @@ method generate-archive($db) {
generate-blurb $pair.key, $db generate-blurb $pair.key, $db
}); });
my $head = generate-head($db.meta); my $head = head [generate-head($db.meta);];
my $body = body [ my $body = body [
site-header $db.meta; site-header $db.meta;
div :class<post-blurbs>, [ div :class<post-blurbs>, [
@ -128,7 +139,7 @@ method generate-tag-blurb($db, $tag, $limit?) {
} }
method generate-tags-page($db, @tags) { method generate-tags-page($db, @tags) {
my $head = generate-head($db.meta); my $head = head [generate-head($db.meta);];
my $body = body [ my $body = body [
site-header $db.meta; site-header $db.meta;
div :class<tags>, [ div :class<tags>, [
@ -146,7 +157,7 @@ method generate-tags-page($db, @tags) {
} }
method generate-tag-page($db, $tag) { method generate-tag-page($db, $tag) {
my $head = generate-head($db.meta); my $head = head [generate-head($db.meta);];
my $body = body [ my $body = body [
site-header $db.meta; site-header $db.meta;
self.generate-tag-blurb($db, $tag, 4); self.generate-tag-blurb($db, $tag, 4);

View file

@ -7,17 +7,18 @@ use Render::Util;
use DB::BlogMeta; use DB::BlogMeta;
sub generate-head(BlogMeta:D $meta, $title?, $description?) is export { sub generate-head(BlogMeta:D $meta, $title?, $description?) is export {
head [ my $final-title = do if $title ~~ Str:D {
"$title {$meta.title}"
} else {
$meta.title
};
[
meta :charset<utf-8>; meta :charset<utf-8>;
meta :name<viewport>, :content<width=device-width, initial-scale=1>; meta :name<viewport>, :content<width=device-width, initial-scale=1>;
meta :author :content<Nathan McCarty>; meta :author :content<Nathan McCarty>;
do if $title ~~ Str:D { title $final-title;
title "$title {$meta.title}";
} else {
title $meta.title;
}
# Add description, if one exists # Add description, if one exists
optl $description ~~ Str:D, -> {meta :description :content($description)}; optl $description ~~ Str:D, -> {meta :description :content(^ $description)};
# Preconnect to all our resource sources # Preconnect to all our resource sources
link :rel<preconnect> :href<https://static.stranger.systems>; link :rel<preconnect> :href<https://static.stranger.systems>;
link :rel<preconnect> :href<https://fonts.googleapis.com>; link :rel<preconnect> :href<https://fonts.googleapis.com>;

View file

@ -85,7 +85,7 @@ sub series-header(Series:D $series, $db) is export {
sub series-page(Int:D $series-id, $db) is export { sub series-page(Int:D $series-id, $db) is export {
my $meta = $db.meta; my $meta = $db.meta;
my $series = $db.series{$series-id}; my $series = $db.series{$series-id};
my $head = generate-head($meta, $series.title, $series.desc); my $head = head [generate-head($meta, $series.title, $series.desc);];
my $body = my $body =
body [ body [
site-header $meta; site-header $meta;
@ -127,7 +127,7 @@ sub series-list-page($db) is export {
series-blurb $id, $series, $db; series-blurb $id, $series, $db;
} }
my $head = generate-head($db.meta); my $head = head [generate-head($db.meta);];
my $body = body [ my $body = body [
site-header $db.meta; site-header $db.meta;
div :class<series-list>, [ div :class<series-list>, [

View file

@ -2,6 +2,7 @@ use v6.e.PREVIEW;
unit module Render::Util; unit module Render::Util;
use DB::Post; use DB::Post;
use DB::BlogMeta;
use HTML::Functional; use HTML::Functional;
@ -68,3 +69,14 @@ sub intersperse (\element, +list) is export {
take slip element, $_; take slip element, $_;
} }
} }
# get the link for a post
sub post-link-abs(BlogMeta:D $meta, Int:D $id, Post:D $post --> Str:D) is export {
my @slugs = $post.all-slugs;
my $base = $meta.get-base-url;
if @slugs.elems {
"$base/posts/by-slug/{@slugs[*-1]}.html"
} else {
"$base/posts/by-id/$id.html"
}
}