Skip to content

Instantly share code, notes, and snippets.

@v3nom
Last active April 3, 2017 18:32
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save v3nom/890bd59a996dbdfebd56991e34e6f129 to your computer and use it in GitHub Desktop.
Save v3nom/890bd59a996dbdfebd56991e34e6f129 to your computer and use it in GitHub Desktop.
var RSS = require('rss20');
// Read global settings
uSite.global = uSite.loadOptions('website.json');
// Collect and extract meta data from posts
var posts = uSite.loadContent('content/post/*', (entry) => {
var file = entry.loadString();
var fileParts = file.split('+++', 2);
entry.meta = entry.parseOptions(fileParts[0]);
entry.slug = entry.meta.slug || entry.generateSlug(entry.meta.title);
var content = fileParts[1];
var contentParts = content.split('<!-- excerpt -->')
entry.content = entry.parseMarkdown(content);
entry.excerpt = entry.parseMarkdown(contentParts[0]);
entry.relativeUrl = 'post/' + entry.slug;
}).sort((a, b) => { return b.meta.date - a.meta.date; });
// Emit html page per post
posts.emit('template/single.njk', 'www/post/{slug}');
// Paginate posts. 10 posts per page
var postGroup = posts.group((post, index) => {
return Math.floor(index / 10);
});
// Create html page for each page of posts
postGroup.emit('template/list.njk', 'www/posts/{groupKey}');
var firstPage = postGroup.filter((groupKey) => {
return groupKey == 0;
});
// First 10 posts is landing page
firstPage.emit('template/list.njk', 'www/index.html');
uSite.copy('template/res', 'www');
// Generate RSS feed
firstPage.emit((groupContext) => {
var feed = new RSS.Feed();
feed.title = groupContext.global.title;
feed.description = groupContext.global.description;
feed.link = groupContext.global.url || '';
feed.pubDate = (new Date()).toGMTString();
groupContext.entries.forEach((entry) => {
var item = new RSS.Item();
item.title = entry.meta.title;
item.description = entry.excerpt;
item.link = feed.link + entry.relativeUrl;
item.pubDate = (new Date(entry.meta.date)).toGMTString();
feed.addItem(item);
});
return feed.getXML();
}, 'www/rss.xml');
// Generate sitemap
posts.group(() => 0).emit((groupContext) => {
var sitemapContent = '';
if (groupContext.global.url) {
sitemapContent += groupContext.global.url + '\n';
}
Object.keys(postGroup.allGroups).forEach((k) => {
sitemapContent += (groupContext.global.url || '') + 'posts/' + k + '\n';
});
groupContext.entries.forEach((entry) => {
sitemapContent += (groupContext.global.url || '') + entry.relativeUrl + '\n';
});
return sitemapContent;
}, 'www/sitemap.txt');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment