Garrit Franke
4 years ago
5 changed files with 104 additions and 4 deletions
@ -0,0 +1,82 @@
|
||||
const fs = require("fs"); |
||||
const path = require("path"); |
||||
|
||||
const matter = require("gray-matter"); |
||||
const rfc822Date = require("rfc822-date"); |
||||
|
||||
const files = fs |
||||
.readdirSync(path.join(__dirname, "../content/posts")) |
||||
.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 `<?xml version="1.0" ?>
|
||||
<rss version="2.0"> |
||||
<channel> |
||||
<title>/dev.space</title> |
||||
<link>https://slashdev.space</link>
|
||||
<description>/dev.space</description> |
||||
<language>en</language> |
||||
<lastBuildDate>${rfc822Date( |
||||
new Date(latestPostDate) |
||||
)}</lastBuildDate> |
||||
${rssItemsXml} |
||||
</channel> |
||||
</rss>`; |
||||
}; |
||||
|
||||
const blogPostsRssXml = (blogPosts) => { |
||||
let latestPostDate = ""; |
||||
let rssItemsXml = ""; |
||||
blogPosts.forEach((post) => { |
||||
const postDate = Date.parse(post.frontmatter.date); |
||||
if (!latestPostDate || postDate > Date.parse(latestPostDate)) { |
||||
latestPostDate = post.frontmatter.date; |
||||
} |
||||
rssItemsXml += ` |
||||
<item> |
||||
<title>${post.frontmatter.title}</title> |
||||
<link> |
||||
https://slashdev.space/${post.slug}
|
||||
</link> |
||||
|
||||
<pubDate>${rfc822Date(new Date(postDate))}</pubDate> |
||||
<description> |
||||
<![CDATA[${post.frontmatter.title}]]> |
||||
</description> |
||||
</item>`; |
||||
}); |
||||
return { |
||||
rssItemsXml, |
||||
latestPostDate, |
||||
}; |
||||
}; |
||||
|
||||
const feedPath = path.join(__dirname, "../public/rss.xml"); |
||||
|
||||
fs.writeFileSync(feedPath, getRssXml(posts), { flag: "w" }); |
Loading…
Reference in new issue