function Template() { return { render: render }; function render(template, environment) { if(blog.wording[template] != undefined) { var template = blog.wording[template]; } template = template.replace(/{\?((?:[^?]|\?[^}])*)\?}/g, renderSub(environment)); var failed = [false]; var result = template.replace( /([^$]|^)\$(?:{(\w+)}|(\w+)\b)/g, substitute(environment, failed) ); return failed[0] ? null : result; } function renderSub(environment) { return function(_, sub) { return render(sub, environment) || ''; }; } function substitute(environment, failed) { return function(_, before, bracketed, raw) { var replaced = environment[bracketed || raw]; if(replaced != undefined) { return before + replaced; } else { failed[0] = true; } } } }