template.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. var escape = require('./escape');
  2. var defaults = require('./defaults');
  3. var escapeJsStr = require('./escapeJsStr');
  4. var regMatcher = /<%-([\s\S]+?)%>|<%=([\s\S]+?)%>|<%([\s\S]+?)%>|$/g;
  5. exports = function(str, util) {
  6. if (!util) {
  7. util =
  8. typeof _ === 'object'
  9. ? _
  10. : {
  11. escape: escape
  12. };
  13. } else {
  14. defaults(util, {
  15. escape: escape
  16. });
  17. }
  18. var index = 0;
  19. var src = "__p+='";
  20. str.replace(regMatcher, function(
  21. match,
  22. escape,
  23. interpolate,
  24. evaluate,
  25. offset
  26. ) {
  27. src += escapeJsStr(str.slice(index, offset));
  28. index = offset + match.length;
  29. if (escape) {
  30. src += "'+\n((__t=(".concat(
  31. escape,
  32. "))==null?'':util.escape(__t))+\n'"
  33. );
  34. } else if (interpolate) {
  35. src += "'+\n((__t=(".concat(interpolate, "))==null?'':__t)+\n'");
  36. } else if (evaluate) {
  37. src += "';\n".concat(evaluate, "\n__p+='");
  38. }
  39. return match;
  40. });
  41. src += "';\n";
  42. src = 'with(obj||{}){\n'.concat(src, '}\n');
  43. src = "var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n".concat(
  44. src,
  45. 'return __p;\n'
  46. );
  47. var render = new Function('obj', 'util', src);
  48. return function(data) {
  49. return render.call(null, data, util);
  50. };
  51. };
  52. module.exports = exports;