function template(strings, ...keys) {
return (function(...values) {
let dict = values[values.length - 1] || {};
let result = [strings[0]];
keys.forEach(function(key, i) {
let value = Number.isInteger(key) ? values[key] : dict[key];
result.push(value, strings[i + 1]);
});
return result.join('');
});
}
let t1Closure = template
${0}${1}${0}!
;
//let t1Closure = template(["","","","!"],0,1,0);
t1Closure('Y', 'A'); // "YAY!"
let t2Closure = template
${0} ${'foo'}!
;
//let t2Closure = template([""," ","!"],0,"foo");
t2Closure('Hello', {foo: 'World'}); // "Hello World!"
let t3Closure = template
I'm ${'name'}. I'm almost ${'age'} years old.
;
//let t3Closure = template(["I'm ", ". I'm almost ", " years old."], "name", "age");
t3Closure('foo', {name: 'MDN', age: 30}); //"I'm MDN. I'm almost 30 years old."
t3Closure({name: 'MDN', age: 30}); //"I'm MDN. I'm almost 30 years old."
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals