const fs = require("fs"); const path = require("path"); const matter = require("gray-matter"); const rfc822Date = require("rfc822-date"); const markdown = require("markdown").markdown; const files = fs .readdirSync(path.join(__dirname, "../content/posts")) // Filter subdirectories .filter( (p) => !fs.lstatSync(path.join(__dirname, "../content/posts", p)).isDirectory() ) .map((filename) => { return { filename, content: fs .readFileSync(path.join(__dirname, "../content/posts", filename)) .toString(), }; }); const keys = Array.from(files.keys()); const posts = files.map((file) => { // Create slug from filename const slug = file.filename .replace(/^.*[\\\/]/, "") .split(".") .slice(0, -1) .join("."); // Parse yaml metadata & markdownbody in document const document = matter(file.content); return { frontmatter: document.data, markdownBody: document.content, slug, }; }); const getRssXml = (blogPosts) => { const { rssItemsXml, latestPostDate } = blogPostsRssXml(blogPosts); return ` /dev.space https://blog.garrit.xyz /dev.space en ${rfc822Date( new Date(latestPostDate) )} ${rssItemsXml} `; }; const blogPostsRssXml = (blogPosts) => { let latestPostDate = ""; let rssItemsXml = ""; blogPosts .filter((post) => !post.slug.startsWith("_")) // Ternary operator is used to fix chromium sorting // See: https://stackoverflow.com/a/36507611 .sort((a, b) => (a.frontmatter.date < b.frontmatter.date ? 1 : -1)) .forEach((post) => { const postDate = Date.parse(post.frontmatter.date); if (!latestPostDate || postDate > Date.parse(latestPostDate)) { latestPostDate = post.frontmatter.date; } rssItemsXml += ` ${post.frontmatter.title} https://blog.garrit.xyz/posts/${post.slug} ${rfc822Date(new Date(postDate))} `; }); return { rssItemsXml, latestPostDate, }; }; const feedPath = path.join(__dirname, "../public/rss.xml"); fs.writeFileSync(feedPath, getRssXml(posts), { flag: "w" });