(function($) {

$.fn.evaluate = function(data) {
  var source = this.html();
  source = unescape(source);
  source = source.replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">");
  source = source.replace(/\n|\r/g, "").replace(/<!?-*%|%-*>/g, "\n");
  var tokens = source.split("\n");
  var parsed = ["var output = [];"];
  $.each(tokens, function(index, token) {
    if (index % 2)
      parsed.push(token.charAt(0) == "=" ? "output.push(" + token.substring(1) + ");" : token);
    else
      parsed.push('output.push("' + token.replace(/"/g, '\\"') + '");');
  });
  parsed.push('return output.join("");');
  this.html(new Function("data", parsed.join(""))(data || {}));
  return this;
}

})(jQuery);