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::BlogMeta;
use Render::Util;
use XML;
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
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 $xml = XML::Element.new(:name<entry>);
$xml.append:

View file

@ -13,7 +13,18 @@ unit class Config;
method generate-post(Int:D $id, Post:D $post, $db) {
my $meta = $db.meta;
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 =
body [
site-header $meta;
@ -45,7 +56,7 @@ method generate-index($db) {
generate-blurb $pair.key, $db
});
my $head = generate-head($db.meta);
my $head = head [generate-head($db.meta);];
my $body = body [
site-header $db.meta;
div :class<post-blurbs>, [
@ -70,7 +81,7 @@ method generate-archive($db) {
generate-blurb $pair.key, $db
});
my $head = generate-head($db.meta);
my $head = head [generate-head($db.meta);];
my $body = body [
site-header $db.meta;
div :class<post-blurbs>, [
@ -128,7 +139,7 @@ method generate-tag-blurb($db, $tag, $limit?) {
}
method generate-tags-page($db, @tags) {
my $head = generate-head($db.meta);
my $head = head [generate-head($db.meta);];
my $body = body [
site-header $db.meta;
div :class<tags>, [
@ -146,7 +157,7 @@ method generate-tags-page($db, @tags) {
}
method generate-tag-page($db, $tag) {
my $head = generate-head($db.meta);
my $head = head [generate-head($db.meta);];
my $body = body [
site-header $db.meta;
self.generate-tag-blurb($db, $tag, 4);

View file

@ -7,17 +7,18 @@ use Render::Util;
use DB::BlogMeta;
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 :name<viewport>, :content<width=device-width, initial-scale=1>;
meta :author :content<Nathan McCarty>;
do if $title ~~ Str:D {
title "$title {$meta.title}";
} else {
title $meta.title;
}
title $final-title;
# 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
link :rel<preconnect> :href<https://static.stranger.systems>;
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 {
my $meta = $db.meta;
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 =
body [
site-header $meta;
@ -127,7 +127,7 @@ sub series-list-page($db) is export {
series-blurb $id, $series, $db;
}
my $head = generate-head($db.meta);
my $head = head [generate-head($db.meta);];
my $body = body [
site-header $db.meta;
div :class<series-list>, [

View file

@ -2,6 +2,7 @@ use v6.e.PREVIEW;
unit module Render::Util;
use DB::Post;
use DB::BlogMeta;
use HTML::Functional;
@ -68,3 +69,14 @@ sub intersperse (\element, +list) is export {
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"
}
}