From b9e1ddcb2ea19a851568d163ac0de7a11235beee Mon Sep 17 00:00:00 2001 From: cobbspur Date: Sun, 16 Jun 2013 14:12:28 +0100 Subject: [PATCH] Adds handlerbars helper 'foreach' Function allows you to iterate through an array or object in handlebars Sets Key Values for @first/ @last entry and @odd/@even to true/false --- core/frontend/helpers/index.js | 72 ++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/core/frontend/helpers/index.js b/core/frontend/helpers/index.js index 8b2860b218..bc71ace200 100644 --- a/core/frontend/helpers/index.js +++ b/core/frontend/helpers/index.js @@ -5,6 +5,7 @@ moment = require('moment'), when = require('when'), navHelper = require('./ghostNav'), + hbs = require('express-hbs'), coreHelpers; coreHelpers = function (ghost) { @@ -44,6 +45,77 @@ return JSON.stringify(object); }); + ghost.registerThemeHelper('foreach', function (context, options) { + var fn = options.fn, + inverse = options.inverse, + i = 0, + j = 0, + key, + ret = "", + data; + + if (options.data) { + data = hbs.handlebars.createFrame(options.data); + } + + if (context && typeof context === 'object') { + if (context instanceof Array) { + for (j = context.length; i < j; i += 1) { + if (data) { + data.index = i; + data.first = data.last = data.even = data.odd = false; + if (i === 0) { + data.first = true; + } + if (i === j - 1) { + data.last = true; + } + // first post is index zero but still needs to be odd + if (i % 2 === 1) { + data.even = true; + } else { + data.odd = true; + } + } + ret = ret + fn(context[i], { data: data }); + } + } else { + for (key in context) { + if (context.hasOwnProperty(key)) { + j += 1; + } + } + for (key in context) { + if (context.hasOwnProperty(key)) { + if (data) { + data.key = key; + data.first = data.last = data.even = data.odd = false; + if (i === 0) { + data.first = true; + } + if (i === j - 1) { + data.last = true; + } + // first post is index zero but still needs to be odd + if (i % 2 === 1) { + data.even = true; + } else { + data.odd = true; + } + } + ret = ret + fn(context[key], {data: data}); + i += 1; + } + } + } + } + + if (i === 0) { + ret = inverse(this); + } + return ret; + }); + return when.all([ // Just one async helper for now, but could be more in the future navHelper.registerWithGhost(ghost)