Cleaning up MKWS-58.
[mkws-moved-to-github.git] / src / mkws-handlebars.js
index 0d601b6..bd9af8d 100644 (file)
 // Handlebars helpers
-Handlebars.registerHelper('json', function(obj) {
-    return $.toJSON(obj);
+
+Handlebars.registerHelper('mkws-json', function(obj) {
+  return mkws.$.toJSON(obj);
 });
 
 
-Handlebars.registerHelper('paragraphs', function(obj) {
-    var acc = [];
-    for (var i = 0; i < obj.length; i++) {
-        // I don't know why, but we need the \n, otherwise Handlebars elides paragraphs
-        acc.push('<p>', obj[i], '</p>', "\n");
-    }
-    return acc.join('');
+// This is intended to handle paragraphs from Wikipedia, hence the
+// rather hacky code to remove numbered references.
+//
+Handlebars.registerHelper('mkws-paragraphs', function(obj, nPara, nSent) {
+  var acc = [];
+
+  // For some reason, Handlebars provides the value
+  // {"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 (obj && (nPara === undefined || nPara.hasOwnProperty('hash') || nPara == 0 || nPara > obj.length)) {
+    nPara = obj.length;
+  }
+  if (nSent === undefined || nSent.hasOwnProperty('hash') || nSent == 0) {
+    nSent = Infinity;
+  }
+
+  for (var i = 0; i < nPara; i++) {
+    // Remove numbered references such as "[1,3,4]" from text
+    var text = obj[i].replace(/\[[0-9,]+\]/g, '');
+    // Next line from http://stackoverflow.com/questions/18914629/split-string-into-sentences-in-javascript
+    var sentences = text.replace(/([.?!])\s*(?=[A-Z])/g, "$1|").split("|");
+    if (sentences.length > nSent)
+      sentences.length = nSent;
+
+    acc.push('<p>', sentences.join(' '), '</p>');
+    nSent -= sentences.length;
+    if (nSent == 0)
+      break;
+  }
+
+  return acc.join('');
 });
 
 
-Handlebars.registerHelper('translate', function(s) {
-    return mkws.M(s);
+Handlebars.registerHelper('mkws-translate', function(s) {
+  return mkws.M(s);
 });
 
 
-// We need {{attr '@name'}} because Handlebars can't parse {{@name}}
-Handlebars.registerHelper('attr', function(attrName) {
-    return this[attrName];
+// We need {{mkws-attr '@name'}} because Handlebars can't parse {{@name}}
+Handlebars.registerHelper('mkws-attr', function(attrName) {
+  return this[attrName];
 });
 
 
 /*
- * Use as follows: {{#if-any NAME1 having="NAME2"}}
+ * Use as follows: {{#mkws-if-any NAME1 having="NAME2"}}
  * Applicable when NAME1 is the name of an array
  * The guarded code runs only if at least one element of the NAME1
  * array has a subelement called NAME2.
  */
-Handlebars.registerHelper('if-any', function(items, options) {
-    var having = options.hash.having;
-    for (var i in items) {
-       var item = items[i]
-       if (!having || item[having]) {
-           return options.fn(this);
-       }
+Handlebars.registerHelper('mkws-if-any', function(items, options) {
+  var having = options.hash.having;
+  for (var i in items) {
+    var item = items[i]
+    if (!having || item[having]) {
+      return options.fn(this);
     }
-    return "";
+  }
+  return "";
 });
 
 
-Handlebars.registerHelper('first', function(items, options) {
-    var having = options.hash.having;
-    for (var i in items) {
-       var item = items[i]
-       if (!having || item[having]) {
-           return options.fn(item);
-       }
+Handlebars.registerHelper('mkws-first', function(items, options) {
+  var having = options.hash.having;
+  for (var i in items) {
+    var item = items[i]
+    if (!having || item[having]) {
+      return options.fn(item);
     }
-    return "";
+  }
+  return "";
 });
 
 
-Handlebars.registerHelper('commaList', function(items, options) {
-    var out = "";
+Handlebars.registerHelper('mkws-commaList', function(items, options) {
+  var out = "";
 
-    for (var i in items) {
-       if (i > 0) out += ", ";
-       out += options.fn(items[i])
-    }
+  for (var i in items) {
+    if (i > 0) out += ", ";
+    out += options.fn(items[i])
+  }
 
-    return out;
+  return out;
 });
 
 
-Handlebars.registerHelper('index1', function(obj) {
-    return obj.data.index + 1;
+Handlebars.registerHelper('mkws-index1', function(obj) {
+  return obj.data.index + 1;
+});
+
+Handlebars.registerHelper('mkws-repeat', function(count, options) {
+  var out = "";
+  for (var i = 0; i < count; i++) {
+    out += options.fn(this);
+  }
+  return out;
 });