@draftbox-co/gatsby-ghost-novela-theme
Version:
A Gatsby theme plugin for creating blogs from headless Ghost CMS.
131 lines (123 loc) • 3.82 kB
JavaScript
const cheerio = require(`cheerio`);
const tagsHelper = require(`@tryghost/helpers`).tags
const _ = require(`lodash`);
const generateItem = function generateItem(post) {
const itemUrl = post.canonical_url || post.url;
const html = post.html || " ";
const htmlContent = cheerio.load(html, {
decodeEntities: false,
xmlMode: true,
});
const item = {
title: post.title,
description: post.excerpt,
guid: post.id,
url: itemUrl,
date: post.published_at,
categories: _.map(
tagsHelper(post, { visibility: `public`, fn: (tag) => tag }),
`name`
),
author: post.primary_author ? post.primary_author.name : null,
custom_elements: [],
};
let imageUrl;
if (post.feature_image) {
imageUrl = post.feature_image;
// Add a media content tag
item.custom_elements.push({
"media:content": {
_attr: {
url: imageUrl,
medium: `image`,
},
},
});
// Also add the image to the content, because not all readers support media:content
htmlContent(`p`)
.first()
.before(`<img src="` + imageUrl + `" />`);
htmlContent(`img`).attr(`alt`, post.title);
}
item.custom_elements.push({
"content:encoded": {
_cdata: htmlContent.html(),
},
});
return item;
};
const generateRSSFeed = function generateRSSFeed(siteConfig) {
return {
serialize: ({ query: { allGhostPost } }) =>
allGhostPost.edges.map((edge) =>
Object.assign({}, generateItem(edge.node))
),
setup: ({ query: { allGhostSettings } }) => {
const siteTitle = allGhostSettings.edges[0].node.title || `No Title`;
const siteDescription =
allGhostSettings.edges[0].node.description || `No Description`;
const feed = {
title: siteTitle,
description: siteDescription,
// generator: `Ghost ` + data.safeVersion,
generator: `Ghost 2.9`,
feed_url: `${siteConfig.siteUrl}/rss.xml`,
site_url: `${siteConfig.siteUrl}/`,
image_url: `${siteConfig.siteUrl}/${siteConfig.siteIcon}`,
ttl: `60`,
custom_namespaces: {
content: `http://purl.org/rss/1.0/modules/content/`,
media: `http://search.yahoo.com/mrss/`,
},
};
return {
...feed,
};
},
query: `
{
allGhostPost(
sort: {order: DESC, fields: published_at}
filter: { slug: { ne: "data-schema" } }
) {
edges {
node {
# Main fields
id
title
slug
featured
feature_image
# Dates unformatted
created_at
published_at
updated_at
# SEO
excerpt
meta_title
meta_description
# Authors
authors {
name
}
primary_author {
name
}
tags {
name
visibility
}
# Content
html
# Additional fields
url
canonical_url
}
}
}
}
`,
output: `/rss.xml`,
};
};
module.exports = generateRSSFeed;