'use strict' const fs = require('fs') const rheo = require('rheo') const markdown = require('./modules/markdown.js') const templateReader = template => () => fs.createReadStream(`${__dirname}/templates/${template}.html`) const templates = { layout: templateReader('layout'), home: templateReader('home'), post: templateReader('post'), taxon: templateReader('taxon') } function setTitle (siteTitle, pageTitle) { return rheo.template(function (s) { return s .inner('title', rheo((pageTitle ? ' · ' : '') + siteTitle)) .inner('body header h1', rheo(siteTitle)) }) } function renderPostListItem (ctx) { return function (template, [, post]) { return template .attribute('a', 'href', () => ctx.getURL('post', post.basename)) .inner('a', () => rheo(post.data.get('title'))) } } function showPage (name) { return function (els) { return rheo(templates[name]()) } } module.exports = { home (ctx, config, postsStream) { ctx.type = 'html' ctx.body = templates .layout() .pipe(rheo()) .outer('main', showPage('home')) .inner('.posts', function (postsTemplate) { return postsStream.pipe(postsTemplate.map(renderPostListItem(ctx))) }) .pipe(setTitle(config.site.title)) .render() }, post (ctx, config, post) { ctx.type = 'html' ctx.body = templates .layout() .pipe(rheo()) .inner('main', showPage('post')) .inner('article h1', rheo(post.data.get('title'))) .inner('article main', rheo(markdown(post.content))) .pipe(setTitle(config.site.title, post.data.get('title'))) .render() }, taxon (ctx, config, taxonItems) { ctx.type = 'html' ctx.body = templates .layout() .pipe(rheo()) .inner('main', showPage('taxon')) .inner('h1', rheo(config.site.title)) .inner('.posts', function (postsTemplate) { return taxonItems.pipe(postsTemplate.map(renderPostListItem(ctx))) }) .pipe(setTitle(config.site.title)) .render() } }