Skip to content

Commit 0def622

Browse files
committed
feat: rss
1 parent 60e6f89 commit 0def622

File tree

2 files changed

+90
-38
lines changed

2 files changed

+90
-38
lines changed

src/app/feed.xml/route.ts

Lines changed: 0 additions & 38 deletions
This file was deleted.

src/app/feed.xml/route.tsx

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import RSS from 'rss';
2+
import { compiler } from 'markdown-to-jsx';
3+
import { renderToString } from 'react-dom/server';
4+
5+
import { siteUrl } from '~/seo';
6+
import { buildPostData } from '@/core';
7+
8+
const { postDataList } = buildPostData();
9+
10+
export async function GET() {
11+
const feed = new RSS({
12+
title: 'zhw blog',
13+
description: '记录我的生活',
14+
site_url: siteUrl.toString(),
15+
feed_url: `${siteUrl}/feed.xml`,
16+
language: 'zh-CN',
17+
image_url: `${siteUrl}/api/og`,
18+
generator: 'Next 14',
19+
});
20+
21+
postDataList.forEach((post) => {
22+
const render = () => {
23+
try {
24+
return renderToString(
25+
<div>
26+
{compiler(post.text, {
27+
overrides: {
28+
LinkCard: NotSupportRender,
29+
Gallery: NotSupportRender,
30+
Tabs: NotSupportRender,
31+
Tab: NotSupportRender,
32+
33+
img: ({ src, alt, height, width }) => {
34+
return <img src={src} alt={alt} height={height} width={width} />;
35+
},
36+
},
37+
extendsRules: {
38+
codeBlock: {
39+
react(node, output, state) {
40+
return (
41+
<pre
42+
key={state.key}
43+
className={node.lang ? `language-${node.lang} lang-${node.lang}` : ''}
44+
>
45+
<code
46+
className={node.lang ? `language-${node.lang} lang-${node.lang}` : ''}
47+
>
48+
{node.content}
49+
</code>
50+
</pre>
51+
);
52+
},
53+
},
54+
},
55+
})}
56+
</div>,
57+
);
58+
} catch {
59+
return renderToString(
60+
<p>
61+
当前内容无法在 RSS 阅读器中正确渲染,请前往:
62+
<a href={`${siteUrl}/notes/${post.title}`}>{`${siteUrl}/notes/${post.title}`}</a>
63+
</p>,
64+
);
65+
}
66+
};
67+
68+
feed.item({
69+
title: post.title,
70+
guid: post.title,
71+
url: `${siteUrl}/notes/${post.title}`,
72+
description: render(),
73+
date: post.createdAt!,
74+
enclosure: {
75+
url: post.coverImage,
76+
type: 'image/jpeg',
77+
},
78+
});
79+
});
80+
81+
return new Response(feed.xml(), {
82+
headers: {
83+
'content-type': 'application/xml',
84+
},
85+
});
86+
}
87+
88+
const NotSupportRender = () => {
89+
throw new Error('Not support render in RSS');
90+
};

0 commit comments

Comments
 (0)