Browse Source

feat: rss

add-license-1
Garrit Franke 4 years ago
parent
commit
7ca698f1f9
  1. 2
      .gitignore
  2. 2
      components/Profile.js
  3. 82
      lib/rss.js
  4. 13
      package-lock.json
  5. 9
      package.json

2
.gitignore vendored

@ -32,3 +32,5 @@ yarn-error.log*
# vercel
.vercel
public/rss.xml

2
components/Profile.js

@ -11,6 +11,8 @@ export default function Profile(props) {
<Link href="https://github.com/garritfra">Github</Link>
<br />
<Link href="https://www.linkedin.com/in/garritfranke/">LinkedIn</Link>
<br />
<Link href="/rss.xml">Rss</Link>
<style jsx>
{`
img {

82
lib/rss.js

@ -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" });

13
package-lock.json generated

@ -4011,6 +4011,11 @@
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
},
"numpad": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/numpad/-/numpad-0.0.1.tgz",
"integrity": "sha1-x3/bZSO0HD5oEV5JSFCt0cKW2Uw="
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@ -4720,6 +4725,14 @@
"resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz",
"integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo="
},
"rfc822-date": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/rfc822-date/-/rfc822-date-0.0.3.tgz",
"integrity": "sha1-we1J66+ggwfNKiEQGPltlA6XhiI=",
"requires": {
"numpad": "~0.0.1"
}
},
"rimraf": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",

9
package.json

@ -3,9 +3,9 @@
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build && next export",
"start": "next start"
"start": "npm run build:rss && next dev",
"build": "npm run build:rss && next build && next export",
"build:rss": "node lib/rss.js"
},
"dependencies": {
"glob": "^7.1.6",
@ -14,6 +14,7 @@
"raw-loader": "^4.0.1",
"react": "16.13.1",
"react-dom": "16.13.1",
"react-markdown": "^4.3.1"
"react-markdown": "^4.3.1",
"rfc822-date": "0.0.3"
}
}

Loading…
Cancel
Save