/test/dot.js

https://github.com/xaptronic/node_jsrender · JavaScript · 77 lines · 60 code · 6 blank · 11 comment · 8 complexity · 16d51c267aaeda86722ac0bf4a1a499f MD5 · raw file

  1. // doT.js
  2. // 2011, Laura Doktorova
  3. // https://github.com/olado/doT
  4. //
  5. // doT is a custom blend of templating functions from jQote2.js
  6. // (jQuery plugin) by aefxx (http://aefxx.com/jquery-plugins/jqote2/)
  7. // and underscore.js (http://documentcloud.github.com/underscore/)
  8. // plus extensions.
  9. //
  10. // Licensed under the MIT license.
  11. //
  12. (function() {
  13. var doT = { version : '0.1.5' };
  14. if (typeof module !== 'undefined' && module.exports) {
  15. module.exports = doT;
  16. } else {
  17. this.doT = doT;
  18. }
  19. doT.templateSettings = {
  20. evaluate: /\{\{([\s\S]+?)\}\}/g,
  21. interpolate: /\{\{=([\s\S]+?)\}\}/g,
  22. encode: /\{\{!([\s\S]+?)\}\}/g,
  23. use: /\{\{#([\s\S]+?)\}\}/g, //compile time evaluation
  24. define: /\{\{#\s*([\w$]+)\s*\:([\s\S]+?)#\}\}/g, //compile time defs
  25. varname: 'it',
  26. strip : true,
  27. append: true
  28. };
  29. function resolveDefs(define, use, str, defs) {
  30. return str.replace(define, function (match, code, value) {
  31. if (!(code in defs)) defs[code]=value;
  32. return '';
  33. })
  34. .replace(use, function(match, code) {
  35. var value; // todo: detect circular use and convert into compiled functions
  36. with(defs) {try { value = eval(code);} catch(e) { value='';} }
  37. return value ? resolveDefs(define, use, value.toString(), defs) : value;
  38. });
  39. }
  40. doT.template = function(tmpl, c, defs) {
  41. c = c || doT.templateSettings;
  42. var cstart = c.append ? "'+(" : "';out+=(", // optimal choice depends on platform/size of templates
  43. cend = c.append ? ")+'" : ");out+='";
  44. var str = (c.use || c.define) ? resolveDefs(c.define, c.use, tmpl, defs || {}) : tmpl;
  45. str = ("var out='" +
  46. ((c.strip) ? str.replace(/\s*<!\[CDATA\[\s*|\s*\]\]>\s*|[\r\n\t]|(\/\*[\s\S]*?\*\/)/g, ''): str)
  47. .replace(/\\/g, '\\\\')
  48. .replace(/'/g, "\\'")
  49. .replace(c.interpolate, function(match, code) {
  50. return cstart + code.replace(/\\'/g, "'").replace(/\\\\/g,"\\").replace(/[\r\t\n]/g, ' ') + cend;
  51. })
  52. .replace(c.encode, function(match, code) {
  53. return cstart + code.replace(/\\'/g, "'").replace(/\\\\/g, "\\").replace(/[\r\t\n]/g, ' ') + ").toString().replace(/&(?!\\w+;)/g, '&#38;').split('<').join('&#60;').split('>').join('&#62;').split('" + '"' + "').join('&#34;').split(" + '"' + "'" + '"' + ").join('&#39;').split('/').join('&#x2F;'" + cend;
  54. })
  55. .replace(c.evaluate, function(match, code) {
  56. return "';" + code.replace(/\\'/g, "'").replace(/\\\\/g,"\\").replace(/[\r\t\n]/g, ' ') + "out+='";
  57. })
  58. + "';return out;")
  59. .replace(/\n/g, '\\n')
  60. .replace(/\t/g, '\\t')
  61. .replace(/\r/g, '\\r')
  62. .split("out+='';").join('')
  63. .split("var out='';out+=").join('var out=');
  64. try {
  65. return new Function(c.varname, str);
  66. } catch (e) {
  67. if (typeof console !== 'undefined') console.log("Could not create a template function: " + str);
  68. throw e;
  69. }
  70. };
  71. }());