Part of ACREP-32.
[mkws-moved-to-github.git] / src / mkws-handlebars.js
index 67b3b19..27975cd 100644 (file)
@@ -1,7 +1,7 @@
 // Handlebars helpers
 
 Handlebars.registerHelper('mkws-json', function(obj) {
-  return $.toJSON(obj);
+  return mkws.$.toJSON(obj);
 });
 
 
@@ -15,10 +15,10 @@ Handlebars.registerHelper('mkws-paragraphs', function(obj, nPara, nSent) {
   // {"hash":{},"data":{}} for parameters that are not provided. So we
   // have to be prepared for actual numbers, explicitly undefined
   // values and this dumb magic value.
-  if (nPara === undefined || nPara.hasOwnProperty('hash') || nPara == 0 || nPara > obj.length) {
+  if (obj && (nPara === undefined || nPara.hasOwnProperty('hash') || nPara == 0 || nPara > obj.length)) {
     nPara = obj.length;
   }
-  if (nSent === undefined || nSent.hasOwnProperty('hash') || nSent == 0 || nSent > obj.length) {
+  if (nSent === undefined || nSent.hasOwnProperty('hash') || nSent == 0) {
     nSent = Infinity;
   }
 
@@ -81,6 +81,31 @@ Handlebars.registerHelper('mkws-first', function(items, options) {
 });
 
 
+var _urlRegexp = /^(https?:)?\/\//;
+Handlebars.registerHelper('mkws-best-url', function(items) {
+  for (var i in items) {
+    var item = items[i]
+    if (item.match(_urlRegexp)) {
+      mkws.debug("'" + item + "' *is* a URL");
+      return item;
+    }
+    mkws.debug("'" + item + "' is not a URL");
+  }
+  return "";
+});
+Handlebars.registerHelper('mkws-other-urls', function(items) {
+  var res = [];
+  for (var i in items) {
+    var item = items[i]
+    if (item.match(_urlRegexp)) {
+      res.push(item);
+    }
+  }
+  return res;
+});
+
+
+
 Handlebars.registerHelper('mkws-commaList', function(items, options) {
   var out = "";
 
@@ -96,3 +121,70 @@ Handlebars.registerHelper('mkws-commaList', function(items, options) {
 Handlebars.registerHelper('mkws-index1', function(obj) {
   return obj.data.index + 1;
 });
+
+Handlebars.registerHelper('mkws-indexplus', function(delta, obj) {
+  return obj.data.index + delta;
+});
+
+Handlebars.registerHelper('mkws-repeat', function(count, options) {
+  var out = "";
+  for (var i = 0; i < count; i++) {
+    out += options.fn(this);
+  }
+  return out;
+});
+
+// Ridiculous that Handlebars has no way to do "or"
+Handlebars.registerHelper('mkws-if-either', function(cond1, cond2, options) {
+  if (typeof cond1 === 'function') { cond1 = cond1.call(this); }
+  if (typeof cond2 === 'function') { cond2 = cond2.call(this); }
+
+  if (cond1 || cond2) {
+    return options.fn(this);
+  } else {
+    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; },
+    'matches': function (l, r) { return l.match(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);
+  }
+});