website/lib/Atom.rakumod

64 lines
2.1 KiB
Raku
Raw Normal View History

2025-02-05 04:37:28 -05:00
use v6.e.PREVIEW;
use DB::Post;
use DB::BlogMeta;
2025-02-12 03:38:55 -05:00
use Render::Util;
2025-02-05 04:37:28 -05:00
use XML;
unit module Atom;
#| Convert a single post to an atom item
sub post-to-item(BlogMeta:D $meta, Int:D $id, Post:D $post --> XML::Element) {
2025-02-12 03:38:55 -05:00
my $link = post-link-abs $meta, $id, $post;
2025-02-05 04:37:28 -05:00
my $desc = $post.description;
my $xml = XML::Element.new(:name<entry>);
$xml.append:
XML::Element.new(:name<id>, :nodes([$link]));
$xml.append:
XML::Element.new(:name<title>, :nodes([$post.title]));
$xml.append:
XML::Element.new(:name<updated>, :nodes([$post.updated]));
$xml.append:
XML::Element.new(:name<published>, :nodes([$post.posted-at]));
my $author = XML::Element.new(:name<author>);
$author.append:
XML::Element.new(:name<email>, :nodes(["thatonelutenist@stranger.systems"]));
$author.append:
XML::Element.new(:name<name>, :nodes(["Nathan McCarty"]));
$xml.append: $author;
$xml.append:
XML::Element.new(:name<link>, :attribs({:href($link), :rel<alternate>}));
2025-02-09 01:25:33 -05:00
# TODO: Actually embed the content
2025-02-09 00:52:53 -05:00
$xml.append:
XML::Element.new(:name<content>, :attribs({:src($link), :type<html>}));
2025-02-05 04:37:28 -05:00
$xml.append:
XML::Element.new(:name<summary>, :nodes([$desc])) if $desc;
2025-02-06 23:45:26 -05:00
if $post.tags {
for $post.tags -> $tag {
$xml.append:
XML::Element.new(:name<category>, :attribs({:term($tag)}));
}
}
2025-02-05 04:37:28 -05:00
$xml
}
#| Produce an atom feed from the database
sub posts-to-atom($db --> XML::Element) is export {
my $updated = $db.posts.values.map(*.updated).max;
my $xml =
XML::Element.new(
:name<feed>,
:attribs({:xmlns('http://www.w3.org/2005/Atom')}));
$xml.append: XML::Element.new(:name<id>, :nodes([$db.meta.get-base-url]));
$xml.append: XML::Element.new(:name<title>, :nodes([$db.meta.title]));
$xml.append: XML::Element.new(:name<updated>, :nodes([$updated]));
for $db.sorted-posts -> $pair {
unless $pair.value.hidden {
$xml.append: post-to-item $db.meta, $pair.key, $pair.value;
}
}
$xml
}