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;
}