Add another Handlebars helper, "compare".
authorMike Taylor <mike@indexdata.com>
Thu, 26 Mar 2015 17:02:25 +0000 (17:02 +0000)
committerMike Taylor <mike@indexdata.com>
Thu, 26 Mar 2015 17:02:25 +0000 (17:02 +0000)
This code is by Mike Griffin, taken from this blog comment:
http://doginthehat.com.au/2012/02/comparison-block-helper-for-handlebars-templates/#comment-44
Clearly something like it ought to be in Handlebars.

src/mkws-handlebars.js

index 7e5c0e0..606dc10 100644 (file)
@@ -116,3 +116,45 @@ Handlebars.registerHelper('mkws-if-either', function(cond1, cond2, options) {
     return options.inverse(this);
   }
 });
+
+// Ridiculous that this, too, is not part of regular Handlebars
+// This code is by Mike Griffin, taken from this blog comment:
+//      http://doginthehat.com.au/2012/02/comparison-block-helper-for-handlebars-templates/#comment-44
+
+Handlebars.registerHelper('compare', function (lvalue, operator, rvalue, options) {
+  var operators, result;
+
+  if (arguments.length < 3) {
+    throw new Error("Handlerbars Helper 'compare' needs 2 parameters");
+  }
+
+  if (options === undefined) {
+    options = rvalue;
+    rvalue = operator;
+    operator = "===";
+  }
+
+  operators = {
+    '==': function (l, r) { return l == r; },
+    '===': function (l, r) { return l === r; },
+    '!=': function (l, r) { return l != r; },
+    '!==': function (l, r) { return l !== r; },
+    '<': function (l, r) { return l < r; },
+    '>': function (l, r) { return l > r; },
+    '<=': function (l, r) { return l <= r; },
+    '>=': function (l, r) { return l >= r; },
+    'typeof': function (l, r) { return typeof l == r; }
+  };
+
+  if (!operators[operator]) {
+    throw new Error("Handlerbars Helper 'compare' doesn't know the operator " + operator);
+  }
+
+  result = operators[operator](lvalue, rvalue);
+
+  if (result) {
+    return options.fn(this);
+  } else {
+    return options.inverse(this);
+  }
+});