feat: add rss feed
This commit is contained in:
parent
df3d0a95f7
commit
cfb3baa79d
@ -1 +1,36 @@
|
|||||||
|
import convertDate from "$lib/convertDate";
|
||||||
|
|
||||||
export const prerender = true;
|
export const prerender = true;
|
||||||
|
|
||||||
|
export interface PostData {
|
||||||
|
path: string,
|
||||||
|
published: string,
|
||||||
|
metadata: Record<string, string>,
|
||||||
|
}
|
||||||
|
|
||||||
|
const allPostFiles: Record<string, any> = import.meta.glob('./*/+page.md', { eager: true });
|
||||||
|
const allPosts: PostData[] = Object.entries(allPostFiles).map(([path, post]) => {
|
||||||
|
const postPath = path.slice(2, -8);
|
||||||
|
return {
|
||||||
|
metadata: post.metadata,
|
||||||
|
path: postPath,
|
||||||
|
published: convertDate(post.metadata.date)
|
||||||
|
};
|
||||||
|
}).map((post) => {
|
||||||
|
if (!("excerpt" in post.metadata)) {
|
||||||
|
post.metadata.excerpt = ""
|
||||||
|
}
|
||||||
|
return post;
|
||||||
|
}).toSorted((post, opost) => {
|
||||||
|
const date = new Date(post.metadata.date);
|
||||||
|
const odate = new Date(opost.metadata.date);
|
||||||
|
return odate.getTime() - date.getTime()
|
||||||
|
});
|
||||||
|
export const _allPosts = allPosts;
|
||||||
|
|
||||||
|
export async function load({}) {
|
||||||
|
if (!allPosts.length) {
|
||||||
|
return { status: 404 };
|
||||||
|
}
|
||||||
|
return { posts: allPosts };
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Window from '../../components/window.svelte';
|
import Window from '../../components/window.svelte';
|
||||||
import type { PostData } from './+page.ts';
|
import type { PostData } from './+layout';
|
||||||
|
|
||||||
export let data;
|
export let data;
|
||||||
|
|
||||||
|
@ -1,34 +0,0 @@
|
|||||||
import convertDate from "$lib/convertDate";
|
|
||||||
|
|
||||||
export interface PostData {
|
|
||||||
path: string,
|
|
||||||
published: string,
|
|
||||||
metadata: Record<string, string>,
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function load({ params }) {
|
|
||||||
const allPostFiles: Record<string, any> = import.meta.glob('./*/+page.md', {eager: true});
|
|
||||||
let allPosts: PostData[] = Object.entries(allPostFiles).map(([path, post]) => {
|
|
||||||
const postPath = path.slice(2, -8);
|
|
||||||
return {
|
|
||||||
metadata: post.metadata,
|
|
||||||
path: postPath,
|
|
||||||
published: convertDate(post.metadata.date)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
allPosts = allPosts.map((post) => {
|
|
||||||
if (!("excerpt" in post.metadata)) {
|
|
||||||
post.metadata.excerpt = ""
|
|
||||||
}
|
|
||||||
return post;
|
|
||||||
});
|
|
||||||
allPosts = allPosts.toSorted((post, opost) => {
|
|
||||||
const date = new Date(post.metadata.date);
|
|
||||||
const odate = new Date(opost.metadata.date);
|
|
||||||
return odate.getTime() - date.getTime()
|
|
||||||
});
|
|
||||||
if (!allPosts.length) {
|
|
||||||
return { status: 404 };
|
|
||||||
}
|
|
||||||
return { posts: allPosts };
|
|
||||||
}
|
|
31
src/routes/entries/_rss/+server.ts
Normal file
31
src/routes/entries/_rss/+server.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import { PUBLIC_BASE_URL } from '$env/static/public';
|
||||||
|
import { _allPosts, type PostData } from '../+layout.ts';
|
||||||
|
|
||||||
|
const entriesUrl = `${PUBLIC_BASE_URL}/entries`;
|
||||||
|
|
||||||
|
export const GET = async ({ }) => {
|
||||||
|
return new Response(render(_allPosts), {
|
||||||
|
headers: {
|
||||||
|
'content-type': 'application/xml',
|
||||||
|
'cache-control': 'no-cache',
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
const render = (posts: PostData[]) => `<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
|
<channel>
|
||||||
|
<atom:link href="${entriesUrl}/_rss" rel="self" type="application/rss+xml" />
|
||||||
|
<title>gaze.systems</title>
|
||||||
|
<link>${PUBLIC_BASE_URL}</link>
|
||||||
|
<description>dusk's personal website</description>
|
||||||
|
${posts.map((post) => `<item>
|
||||||
|
<guid>${entriesUrl}/${post.path}</guid>
|
||||||
|
<title>${post.metadata.title}</title>
|
||||||
|
<link>${entriesUrl}/${post.path}</link>
|
||||||
|
<description>${post.metadata.excerpt}</description>
|
||||||
|
<pubDate>${new Date(post.metadata.date).toUTCString()}</pubDate>
|
||||||
|
</item>`).join('')}
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
|
`;
|
@ -9,7 +9,8 @@
|
|||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"moduleResolution": "bundler"
|
"moduleResolution": "bundler",
|
||||||
|
"allowImportingTsExtensions": true
|
||||||
}
|
}
|
||||||
// Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
|
// Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
|
||||||
// except $lib which is handled by https://kit.svelte.dev/docs/configuration#files
|
// except $lib which is handled by https://kit.svelte.dev/docs/configuration#files
|
||||||
|
Loading…
Reference in New Issue
Block a user