You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

138 lines
3.0 KiB

  1. // 定义模板引擎的语法
  2. defaults.openTag = '{{';
  3. defaults.closeTag = '}}';
  4. var filtered = function (js, filter) {
  5. var parts = filter.split(':');
  6. var name = parts.shift();
  7. var args = parts.join(':') || '';
  8. if (args) {
  9. args = ', ' + args;
  10. }
  11. return '$helpers.' + name + '(' + js + args + ')';
  12. }
  13. defaults.parser = function (code, options) {
  14. // var match = code.match(/([\w\$]*)(\b.*)/);
  15. // var key = match[1];
  16. // var args = match[2];
  17. // var split = args.split(' ');
  18. // split.shift();
  19. code = code.replace(/^\s/, '');
  20. var split = code.split(' ');
  21. var key = split.shift();
  22. var args = split.join(' ');
  23. switch (key) {
  24. case 'if':
  25. code = 'if(' + args + '){';
  26. break;
  27. case 'else':
  28. if (split.shift() === 'if') {
  29. split = ' if(' + split.join(' ') + ')';
  30. } else {
  31. split = '';
  32. }
  33. code = '}else' + split + '{';
  34. break;
  35. case '/if':
  36. code = '}';
  37. break;
  38. case 'each':
  39. var object = split[0] || '$data';
  40. var as = split[1] || 'as';
  41. var value = split[2] || '$value';
  42. var index = split[3] || '$index';
  43. var param = value + ',' + index;
  44. if (as !== 'as') {
  45. object = '[]';
  46. }
  47. code = '$each(' + object + ',function(' + param + '){';
  48. break;
  49. case '/each':
  50. code = '});';
  51. break;
  52. case 'echo':
  53. code = 'print(' + args + ');';
  54. break;
  55. case 'print':
  56. case 'include':
  57. code = key + '(' + split.join(',') + ');';
  58. break;
  59. default:
  60. // 过滤器(辅助方法)
  61. // {{value | filterA:'abcd' | filterB}}
  62. // >>> $helpers.filterB($helpers.filterA(value, 'abcd'))
  63. // TODO: {{ddd||aaa}} 不包含空格
  64. if (/^\s*\|\s*[\w\$]/.test(args)) {
  65. var escape = true;
  66. // {{#value | link}}
  67. if (code.indexOf('#') === 0) {
  68. code = code.substr(1);
  69. escape = false;
  70. }
  71. var i = 0;
  72. var array = code.split('|');
  73. var len = array.length;
  74. var val = array[i++];
  75. for (; i < len; i ++) {
  76. val = filtered(val, array[i]);
  77. }
  78. code = (escape ? '=' : '=#') + val;
  79. // 即将弃用 {{helperName value}}
  80. } else if (template.helpers[key]) {
  81. code = '=#' + key + '(' + split.join(',') + ');';
  82. // 内容直接输出 {{value}}
  83. } else {
  84. code = '=' + code;
  85. }
  86. break;
  87. }
  88. return code;
  89. };