summary refs log tree commit diff stats
path: root/src/index.js
diff options
context:
space:
mode:
authorAlan Pearce2017-06-23 23:06:43 +0200
committerAlan Pearce2017-06-23 23:06:43 +0200
commitf9fd0d795fb7bff10cb759f2300200d50b0fbab3 (patch)
tree8e3e68bce0742ea4e5d6538a8e437ec2512f9518 /src/index.js
parent4d6378483d46806d0006d6e5755e0eedd6372154 (diff)
downloadhomestead-f9fd0d795fb7bff10cb759f2300200d50b0fbab3.tar.lz
homestead-f9fd0d795fb7bff10cb759f2300200d50b0fbab3.tar.zst
homestead-f9fd0d795fb7bff10cb759f2300200d50b0fbab3.zip
feat: Streaming DOM templates via rheo
Diffstat (limited to 'src/index.js')
-rw-r--r--src/index.js82
1 files changed, 57 insertions, 25 deletions
diff --git a/src/index.js b/src/index.js
index fe0351d..93d61a4 100644
--- a/src/index.js
+++ b/src/index.js
@@ -3,6 +3,9 @@
 const Koa = require('koa')
 const app = new Koa()
 
+const fs = require('fs')
+const streamify = require('stream-array')
+
 const send = require('koa-send')
 
 const config = require('./modules/config.js')
@@ -12,51 +15,80 @@ const PORT = process.env.PORT || config.server.port
 const Router = require('koa-router')
 const router = new Router()
 
-const view = require('koa-nunjucks-next')
+const rheo = require('rheo')
 
 const Posts = require('./modules/posts.js')
 const posts = Posts.getFolder(config.posts.folder)
 
-app.use(
-  view(`${__dirname}/views`, {
-    extname: 'njk',
-    globals: {
-      site: config.site,
-      url: (...args) => router.url(...args)
-    }
-  })
-)
+const index = () => fs.createReadStream(`${__dirname}/templates/index.html`)
 
-const postsArray = Array.from(posts.entries())
-router.get('home', '/', async function (ctx) {
-  await ctx.render('index', {
-    posts: postsArray
-  })
+function setTitle (pageTitle) {
+  return rheo.template(s =>
+    s.inner('title', rheo((pageTitle ? ' · ' : '') + config.site.title))
+  )
+}
+
+function renderPostListItem (template, [, post]) {
+  return template
+    .attribute('a', 'href', () => router.url('post', post.basename))
+    .inner('a', () => rheo(post.data.get('title')))
+}
+
+function toArrayStream (iterator) {
+  return streamify(Array.from(iterator.entries()))
+}
+
+const postsStream = toArrayStream(posts)
+router.get('home', '/', async function (ctx, next) {
+  ctx.set('Content-Type', 'text/html')
+  ctx.body = index()
+    .pipe(rheo())
+    .inner('body', pages => pages.find('main.homepage'))
+    .inner('h1', rheo(config.site.title))
+    .inner('.posts', function (postsTemplate) {
+      return postsStream.pipe(postsTemplate.map(renderPostListItem))
+    })
+    .pipe(setTitle())
+    .render()
 })
 
-router.get('post', '/post/:filename', async function (ctx) {
+router.get('post', '/post/:filename', async function (ctx, next) {
   ctx.assert(posts.has(ctx.params.filename), 404, 'Post not found')
   const post = posts.get(ctx.params.filename)
   post.body = Posts.render(post)
-  await ctx.render('post', {
-    post: post
-  })
+
+  ctx.set('Content-Type', 'text/html')
+  ctx.body = index()
+    .pipe(rheo())
+    .inner('body', pages => pages.find('main.post'))
+    .inner('article h1', rheo(post.data.get('title')))
+    .inner('article main', rheo(post.body))
+    .pipe(setTitle())
+    .render()
 })
 
 const taxonomies = Posts.taxonomise(config.taxonomies, posts)
 for (let [term, items] of taxonomies) {
-  router.get(`taxon-${term}`, `/${term}/:value`, async function (ctx) {
+  router.get(`taxon-${term}`, `/${term}/:value`, async function (ctx, next) {
     const value = ctx.params.value
     ctx.assert(
       items.has(ctx.params.value),
       404,
       `Could not find ${term} ${value}`
     )
-    await ctx.render('term', {
-      term: term,
-      [term]: value,
-      posts: items.get(ctx.params.value)
-    })
+
+    ctx.set('Content-Type', 'text/html')
+    ctx.body = index()
+      .pipe(rheo())
+      .inner('body', pages => pages.find('main.taxon'))
+      .inner('h1', rheo(config.site.title))
+      .inner('.posts', function (postsTemplate) {
+        return toArrayStream(items.get(value)).pipe(
+          postsTemplate.map(renderPostListItem)
+        )
+      })
+      .pipe(setTitle())
+      .render()
   })
 }