gatsby-source-medium-feed
Version:
Gatsby plugin to get posts written in medium
68 lines (62 loc) • 1.69 kB
JavaScript
;
const rssParser = require('rss-parser');
function getJsonFeed(userName) {
const parser = new rssParser({
customFields: {
item: [['content:encoded', 'content']]
}
});
return parser.parseURL(`https://medium.com/feed/${userName}`).then(feed => {
const parsedFeeds = feed.items.map(item => {
const thumbnail = item.content.match(/(?<=(<img[^>]+src="))([^"\s]+)(?!"[^>]*\/z)/g)[0];
const title = item.title,
date = item.isoDate,
author = item.creator,
link = item.link,
content = item.content;
const slug = item.title.replace(/[^a-zA-Z0-9\s]+/g, '').toLowerCase().split(' ').join('-');
return {
title,
date,
author,
link,
content,
thumbnail,
slug
};
});
return parsedFeeds;
});
}
function sourceNodes({
actions,
createNodeId,
createContentDigest,
reporter
}, {
userName,
name
}) {
const createNode = actions.createNode;
if (!userName || !name) {
const missingOption = !userName && !name ? 'userName and name' : !userName ? 'userName' : 'name';
reporter.panic(`${missingOption} has to defined in plugin configuration.`);
}
return getJsonFeed(userName).then(feed => {
feed.forEach(item => {
const id = createNodeId(item.link);
createNode(Object.assign({}, item, {
id,
parent: null,
children: [],
internal: {
contentDigest: createContentDigest(feed),
type: name,
mediaType: 'application/json',
content: JSON.stringify(item)
}
}));
});
});
}
exports.sourceNodes = sourceNodes;