forked from
quillmatiq.com/augment
Fork of Chiri for Astro for my blog
1import { getCollection, type CollectionEntry } from 'astro:content'
2import { themeConfig } from '@/config'
3import type { APIContext } from 'astro'
4
5export async function generateRSS(context: APIContext) {
6 const posts = await getCollection('posts')
7 const filteredPosts = posts.filter((post: CollectionEntry<'posts'>) => !post.id.startsWith('_'))
8 const sortedPosts = filteredPosts.sort(
9 (a: CollectionEntry<'posts'>, b: CollectionEntry<'posts'>) =>
10 b.data.pubDate.valueOf() - a.data.pubDate.valueOf()
11 )
12
13 const rss = `<?xml version="1.0" encoding="UTF-8" ?>
14<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
15 <channel>
16 <title>${themeConfig.site.title}</title>
17 <link>${context.site}</link>
18 <description>${themeConfig.site.description}</description>
19 <language>zh-CN</language>
20 <lastBuildDate>${new Date().toUTCString()}</lastBuildDate>
21 <atom:link href="${context.site}/rss.xml" rel="self" type="application/rss+xml" />
22 ${sortedPosts
23 .map(
24 (post: CollectionEntry<'posts'>) => `
25 <item>
26 <title><![CDATA[${post.data.title}]]></title>
27 <link>${context.site}/${post.id}/</link>
28 <guid>${context.site}/${post.id}/</guid>
29 <pubDate>${post.data.pubDate.toUTCString()}</pubDate>
30 <content:encoded><![CDATA[${post.body}]]></content:encoded>
31 </item>
32 `
33 )
34 .join('')}
35 </channel>
36</rss>`
37
38 return new Response(rss, {
39 headers: {
40 'Content-Type': 'application/xml; charset=utf-8'
41 }
42 })
43}
44
45export async function generateAtom(context: APIContext) {
46 const posts = await getCollection('posts')
47 const filteredPosts = posts.filter((post: CollectionEntry<'posts'>) => !post.id.startsWith('_'))
48 const sortedPosts = filteredPosts.sort(
49 (a: CollectionEntry<'posts'>, b: CollectionEntry<'posts'>) =>
50 b.data.pubDate.valueOf() - a.data.pubDate.valueOf()
51 )
52
53 const atom = `<?xml version="1.0" encoding="utf-8"?>
54<feed xmlns="http://www.w3.org/2005/Atom">
55 <title>${themeConfig.site.title}</title>
56 <subtitle>${themeConfig.site.description}</subtitle>
57 <link href="${context.site}/atom.xml" rel="self" type="application/atom+xml" />
58 <link href="${context.site}" />
59 <id>${context.site}</id>
60 <updated>${new Date().toISOString()}</updated>
61 ${sortedPosts
62 .map(
63 (post: CollectionEntry<'posts'>) => `
64 <entry>
65 <title>${post.data.title}</title>
66 <link href="${context.site}/${post.id}/" />
67 <id>${context.site}/${post.id}/</id>
68 <published>${post.data.pubDate.toISOString()}</published>
69 <content type="html"><![CDATA[${post.body}]]></content>
70 </entry>
71 `
72 )
73 .join('')}
74</feed>`
75
76 return new Response(atom, {
77 headers: {
78 'Content-Type': 'application/xml; charset=utf-8'
79 }
80 })
81}