超簡単なテンプレートエンジンをJavaScriptで実装する。
話題としては、まぁ、何かどこにでも転がってる感じなのだろうけど、
余りに簡単に出来たので、自分用にメモ書き。
function emit(template,map) { return template.replace(/\$\{[^\$\{\}]*\}/g,function(key) { var v = map[key.substring(2,key.length-1)]; return v ? v : ''; }); }
使い方はこんな感じ。
${パラメータ名}がプレースフォルダになっていて、
そのパラメータ名で、二番目の引数のmapから値を取り出して置換する。
var tmplt = "<div>hoge ${hoge} ${fuga}</div>"; var newone = emit(tmplt,parseParams()); console.log(newone); function parseParams() { var result = {}; var href = location.href; var index = href.indexOf('?'); if(0 < index) { var params = href.substring(index + 1).split('&'); for(i=0;i<params.length;i++) { var p = params[i].split('='); if(p.length == 2) { result[p[0]] = p[1]; } } } return result; }
ちなみに、ほぼ同じ仕様の実装を過去にJavaでやった事があって、
そいつはこんなコードになっている。
public static String replace(String template, Map<String, String> context) { String result = ""; if (StringUtil.isEmpty(template) == false) { Pattern p = Pattern.compile("\\$\\{[^\\$\\{\\}]*\\}"); StringBuffer stb = new StringBuffer(template); Matcher m = p.matcher(stb); int index = 0; while (index < stb.length() && m.find(index)) { String s = m.group(); String v = toString(context.get(s.substring(2, s.length() - 1))); index = m.start() + v.length(); stb.replace(m.start(), m.end(), v); m = p.matcher(stb); } result = stb.toString(); } return result; }