超簡単なテンプレートエンジンを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}&nbsp;${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;
}

Java正規表現リテラルを、XMLリテラルよりも先に導入するべきだと思うですだな。