54 lines
1.7 KiB
JavaScript
54 lines
1.7 KiB
JavaScript
import { tag, text, serialize } from '$lib/xml.js';
|
|
import { postData } from '../_posts/all.js';
|
|
|
|
export const prerender = true;
|
|
|
|
|
|
export function GET() {
|
|
return new Response(renderFeed(), {
|
|
headers: {'Content-Type': 'application/atom+xml'}
|
|
});
|
|
}
|
|
|
|
|
|
function renderFeed() {
|
|
const feed = tag('feed', {xmlns: 'http://www.w3.org/2005/Atom'});
|
|
|
|
feed.addTag('id', {}, [text('https://blog.jfmonty2.com/')])
|
|
feed.addTag('title', {}, [text("Joe's Blog")]);
|
|
feed.addTag('link', {rel: 'alternate', href: 'https://blog.jfmonty2.com/'});
|
|
feed.addTag('link', {rel: 'self', href: 'https://blog.jfmonty2.com/feed/'});
|
|
|
|
const lastUpdate = iso(postData[0].updated || postData[0].date);
|
|
feed.addTag('updated', {}, [text(lastUpdate)]);
|
|
|
|
const author = feed.addTag('author');
|
|
author.addTag('name', {}, [text('Joseph Montanaro')]);
|
|
|
|
for (const post of postData) {
|
|
const url = `https://blog.jfmonty2.com/${post.slug}`
|
|
const entry = feed.addTag('entry');
|
|
entry.addTag('title', {}, [text(post.title)]);
|
|
entry.addTag('link', {rel: 'alternate', href: url});
|
|
entry.addTag('id', {}, [text(url)]);
|
|
|
|
const publishedDate = iso(post.date);
|
|
entry.addTag('published', {}, [text(publishedDate)])
|
|
const updatedDate = iso(post.updated || post.date);
|
|
entry.addTag('updated', {}, [text(updatedDate)]);
|
|
|
|
entry.addTag('content', {type: 'html'}, [text(renderDescription(post))]);
|
|
}
|
|
return serialize(feed);
|
|
}
|
|
|
|
|
|
function renderDescription(post) {
|
|
return `<p>${post.description} <a href="https://blog.jfmonty2.com/${post.slug}">Read more</a></p>`;
|
|
}
|
|
|
|
|
|
function iso(datetimeStr) {
|
|
return new Date(datetimeStr).toISOString();
|
|
}
|