Custom Handlebars Helpers for Ghost

Plugins, or apps, are still in their infancy for the Ghost blogging platform, as such people have resorted to adding custom Handlebars helpers using a variety of hacks.

One of these is shown at https://apatchofcode.com/adding-custom-handlebars-for-ghost-equals-awesome/

Here is an alternative implementation that makes use of the fledgling Ghost Apps feature.

Installation

Create a new directory in contents/apps

eg:

mkdir contents/apps/myhelpers

Place package.json and index.js in the directory.

To enable the app you need to manually add it to the database as described at: https://github.com/TryGhost/Ghost/wiki/Apps-Getting-Started-for-Ghost-Devs

Restart ghost

Usage

Simply use the new helper in your template, eg:

{{#compare 'apples' '===' 'oranges'}}
    <p>Totally not the case.<p>
{{/compare}}
{{#compare 'apples' 'typeof' 'string'}}
    <p>I think we're onto something.<p>
{{/compare}}

package.json

{
  "name":"my-helpers",
  "version": "0.0.1",
  "dependencies": {
    "ghost-app": "0.0.2"
  },
  "ghost": {
      "permissions": {
          "helpers": ["compare"]
      }
  }
}

index.js

var App = require('ghost-app'),
    myHelpers;

myHelpers = App.extend({

    install: function() {},

    uninstall: function() {},

    activate: function() {
        this.app.helpers.register('compare', this.compareHelper)
    },

    deactivate: function() {},

    compareHelper: function (v1, operator, v2, options) {
        switch (operator) {
            case '==':
                return (v1 == v2)  ? options.fn(this) : options.inverse(this);
            case '===':
                return (v1 === v2) ? options.fn(this) : options.inverse(this);
            case '!=':
                return (v1 != v2)  ? options.fn(this) : options.inverse(this);
            case '!==':
                return (v1 !== v2) ? options.fn(this) : options.inverse(this);
            case '<':
                return (v1 < v2)   ? options.fn(this) : options.inverse(this);
            case '<=':
                return (v1 <= v2)  ? options.fn(this) : options.inverse(this);
            case '>':
                return (v1 > v2)   ? options.fn(this) : options.inverse(this);
            case '>=':
                return (v1 >= v2)  ? options.fn(this) : options.inverse(this);
            case '&&':
                return (v1 && v2)  ? options.fn(this) : options.inverse(this);
            case '||':
                return (v1 || v2)  ? options.fn(this) : options.inverse(this);
            case 'typeof':
                return (typeof v1 == v2)  ? options.fn(this) : options.inverse(this);
            default:
                return options.inverse(this);
        }
    }
});

module.exports = myHelpers;