74 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|   | import { LatestPostCountInHomePage } from "@/consts/consts"; | ||
|  | import { Config } from "@/data/config"; | ||
|  | import { Feed } from "feed"; | ||
|  | import fs from "fs"; | ||
|  | import { MDXRemote } from "next-mdx-remote"; | ||
|  | import { serialize } from "next-mdx-remote/serialize"; | ||
|  | import { renderToString } from "react-dom/server"; | ||
|  | import rehypeAutolinkHeadings from "rehype-autolink-headings"; | ||
|  | import rehypeMathJax from "rehype-mathjax/svg"; | ||
|  | import rehypePresetMinify from "rehype-preset-minify"; | ||
|  | import rehypeSlug from "rehype-slug"; | ||
|  | import externalLinks from "remark-external-links"; | ||
|  | import remarkGfm from "remark-gfm"; | ||
|  | import remarkMath from "remark-math"; | ||
|  | import remarkPrism from "remark-prism"; | ||
|  | import { getPostFileContent, sortedPosts } from "./post-process"; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Generate the RSS Feed File in `./public` so it could be visited by https://domain/rss.xml
 | ||
|  |  */ | ||
|  | export const generateRSSFeed = async () => { | ||
|  |   const feed = new Feed({ | ||
|  |     title: Config.SiteTitle, | ||
|  |     description: Config.Sentence, | ||
|  |     id: Config.SiteDomain, | ||
|  |     link: `https://${Config.SiteDomain}/`, | ||
|  |     image: Config.PageCovers.websiteCoverURL, | ||
|  |     favicon: `https://${Config.SiteDomain}/favcion.ico`, | ||
|  |     copyright: `COPYRIGHT © ${Config.YearStart}-${new Date().getFullYear()} ${Config.AuthorName} ALL RIGHTS RESERVED`, | ||
|  |     generator: "Node.js Feed", | ||
|  |     author: { | ||
|  |       name: Config.AuthorName, | ||
|  |       email: Config.SocialLinks.email, | ||
|  |       link: `https://${Config.SiteDomain}/`, | ||
|  |     }, | ||
|  |   }); | ||
|  | 
 | ||
|  |   for (let i = 0; i < LatestPostCountInHomePage; i++) { | ||
|  |     const post = sortedPosts.allPostList[i]; | ||
|  |     const postContent = `${getPostFileContent( | ||
|  |       post.id, | ||
|  |     )}\n---\n**NOTE:** Different RSS reader may have deficient even no support for svg formulations rendering. If it happens, please read the origin page to have better experience.`;
 | ||
|  |     const dateNumber = post.frontMatter.time.split("-").map((num) => parseInt(num)); | ||
|  |     const mdxSource = await serialize(postContent ?? "", { | ||
|  |       parseFrontmatter: true, | ||
|  |       mdxOptions: { | ||
|  |         remarkPlugins: [remarkPrism, externalLinks, remarkMath, remarkGfm], | ||
|  |         rehypePlugins: [rehypeMathJax, rehypeAutolinkHeadings, rehypeSlug, rehypePresetMinify as any], | ||
|  |         format: "md", | ||
|  |       }, | ||
|  |     }); | ||
|  |     const htmlContent = renderToString(<MDXRemote {...mdxSource} />); | ||
|  | 
 | ||
|  |     feed.addItem({ | ||
|  |       title: post.frontMatter.title, | ||
|  |       id: post.id, | ||
|  |       link: `https://${Config.SiteDomain}/blog/${post.id}`, | ||
|  |       description: post.frontMatter.summary ?? undefined, | ||
|  |       content: htmlContent, | ||
|  |       author: [ | ||
|  |         { | ||
|  |           name: Config.AuthorName, | ||
|  |           email: Config.SocialLinks.email, | ||
|  |           link: `https://${Config.SiteDomain}/`, | ||
|  |         }, | ||
|  |       ], | ||
|  |       category: post.frontMatter.tags?.map((tagname) => ({ name: tagname })), | ||
|  |       date: new Date(dateNumber[0], dateNumber[1], dateNumber[2]), | ||
|  |       image: post.frontMatter.coverURL ?? undefined, | ||
|  |     }); | ||
|  |   } | ||
|  |   fs.writeFile("./public/rss.xml", feed.rss2(), "utf-8", (err) => {}); | ||
|  | }; |