jsonTemplates

Demonstrates a JSON-based string templating engine.

by Scott Means

HTML

<form name="json_template_test">
  <p>
    <label>Object</label>
    <textarea name="o">{
  "_id": "User_admin",
  "_rev": "6-3361423ee660182bc365fbe1439ea1a4",
  "Email": "admin@localhost",
  "FirstName": "Scott",
  "LastName": "Means",
  "ObjectType": "User"
}</textarea>
  </p>
<p><label>JSON template</label><textarea type="text" name="t">["$first", [[["Company"], ": "], [ ["FirstName"], " " ], ["LastName"] ], ["Company"], ["Email"], ["Username"], ["_id"] ]</textarea>
  </p>
  <p>
  <label>result</label><input disabled name="r"/>
  </p>
  <p>
    <button type="submit">
      run
    </button>
  </p>
</form>

CSS

textarea {
  min-height: 12em;
  min-width: 50em;
}

input {
  min-width: 50em;
}

JavaScript

function evalJsonTemplate(t, o) {
  if (t.constructor !== Array) {
  	return t;
  }
  
  if (t.length < 1) {
	  return undefined;
  }
  
  if (t.length == 1) {
  	return o[t[0]];
  }
  
  var op = '$all';
  
  if (t[0].indexOf('$') == 0) {
  	op = t[0];
    t = t.slice(1);
  }
  
  var ra = [];
  
  t.forEach(v => {
  	ra.push(evalJsonTemplate(v, o));
  });
  
  switch (op) {
  case '$first': {
  	return ra.reduce((a, c) => a || c);
  } break;
  
  case '$any': {
  	return ra.join('');
  }

  default:
  case '$all': {
  		var r = ra.reduce((a, c) => (a == undefined || c == undefined) ? undefined : a + c, '');
      return r == undefined ? '' : r;
    } break;  
  }
}


document.forms.json_template_test.onsubmit = e => {
  var f = e.target;
  var o = JSON.parse(f.o.value);
	var t = JSON.parse(f.t.value);
  
  f.r.value = evalJsonTemplate(t, o);
  
  return false;
}