add rss feeds (/rss, /poetry/rss, and /thoughts/rss)

This commit is contained in:
Silas 2024-06-13 15:26:29 -04:00
parent e54a60359c
commit dae681d2c2
Failed to generate hash of commit
5 changed files with 142 additions and 16 deletions

View File

@ -8,7 +8,6 @@ export interface Metadata {
export interface Section {
poetry: 'poetry';
thoughts: 'thoughts';
services: 'services';
all: 'all';
}

View File

@ -70,20 +70,18 @@
</li>
{/each}
</ul>
{#if total > 1}
<nav class="join justify-end py-10">
<button
class="join-item btn-primary btn btn-outline"
on:click={() => navigate(currentPage - 1)}
disabled={currentPage === 1}>Prev</button
>
<div class="join-item content-center px-10">{currentPage} of {totalPages}</div>
<button
class="join-item btn btn-primary btn-outline"
on:click={() => navigate(currentPage + 1)}
disabled={currentPage === totalPages}>Next</button
>
</nav>
{/if}
<nav class="join justify-end py-10">
<button
class="join-item btn-primary btn btn-outline"
on:click={() => navigate(currentPage - 1)}
disabled={currentPage === 1}>Prev</button
>
<div class="join-item content-center px-10">{currentPage} of {totalPages}</div>
<button
class="join-item btn btn-primary btn-outline"
on:click={() => navigate(currentPage + 1)}
disabled={currentPage === totalPages}>Next</button
>
</nav>
</div>
{/if}

View File

@ -0,0 +1,43 @@
import { fetchMarkdownPosts, type Post } from '$lib/utils';
const siteURL = 'https://silentsilas.com';
const siteTitle = 'silentsilas - Poetry';
const siteDescription = 'Read some bad poetry.';
export const prerender = true;
export const GET = async () => {
const { posts } = await fetchMarkdownPosts('poetry');
const body = render(posts);
const options = {
headers: {
'Cache-Control': 'max-age=0, s-maxage=3600',
'Content-Type': 'application/xml'
}
};
return new Response(body, options);
};
const render = (posts: Post[]) => `<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>${siteTitle}</title>
<description>${siteDescription}</description>
<link>${siteURL}</link>
<atom:link href="${siteURL}/rss.xml" rel="self" type="application/rss+xml"/>
${posts
.map(
(post) => `<item>
<guid isPermaLink="true">${siteURL}/${post.section}/${post.filename}</guid>
<title>${post.meta.title}</title>
<link>${siteURL}/${post.section}/${post.filename}</link>
<description>${post.meta.title}</description>
<pubDate>${new Date(post.meta.date).toUTCString()}</pubDate>
</item>`
)
.join('')}
</channel>
</rss>
`;

View File

@ -0,0 +1,43 @@
import { fetchMarkdownPosts, type Post } from '$lib/utils';
const siteURL = 'https://silentsilas.com';
const siteTitle = 'silentsilas - Thoughts &#38; Poems';
const siteDescription = 'Read some bad takes and poetry.';
export const prerender = true;
export const GET = async () => {
const { posts } = await fetchMarkdownPosts('all');
const body = render(posts);
const options = {
headers: {
'Cache-Control': 'max-age=0, s-maxage=3600',
'Content-Type': 'application/xml'
}
};
return new Response(body, options);
};
const render = (posts: Post[]) => `<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>${siteTitle}</title>
<description>${siteDescription}</description>
<link>${siteURL}</link>
<atom:link href="${siteURL}/rss.xml" rel="self" type="application/rss+xml"/>
${posts
.map(
(post) => `<item>
<guid isPermaLink="true">${siteURL}/${post.section}/${post.filename}</guid>
<title>${post.meta.title}</title>
<link>${siteURL}/${post.section}/${post.filename}</link>
<description>${post.meta.title}</description>
<pubDate>${new Date(post.meta.date).toUTCString()}</pubDate>
</item>`
)
.join('')}
</channel>
</rss>
`;

View File

@ -0,0 +1,43 @@
import { fetchMarkdownPosts, type Post } from '$lib/utils';
const siteURL = 'https://silentsilas.com';
const siteTitle = 'silentsilas - Thoughts';
const siteDescription = 'Read some bad takes.';
export const prerender = true;
export const GET = async () => {
const { posts } = await fetchMarkdownPosts('thoughts');
const body = render(posts);
const options = {
headers: {
'Cache-Control': 'max-age=0, s-maxage=3600',
'Content-Type': 'application/xml'
}
};
return new Response(body, options);
};
const render = (posts: Post[]) => `<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>${siteTitle}</title>
<description>${siteDescription}</description>
<link>${siteURL}</link>
<atom:link href="${siteURL}/rss.xml" rel="self" type="application/rss+xml"/>
${posts
.map(
(post) => `<item>
<guid isPermaLink="true">${siteURL}/${post.section}/${post.filename}</guid>
<title>${post.meta.title}</title>
<link>${siteURL}/${post.section}/${post.filename}</link>
<description>${post.meta.title}</description>
<pubDate>${new Date(post.meta.date).toUTCString()}</pubDate>
</item>`
)
.join('')}
</channel>
</rss>
`;