Custom Handlebars Helpers for Ghost

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;