stuppid_bot

Untitled

May 27th, 2013
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title></title>
  6.     <script src="js/common.js"></script>
  7.     <link rel="stylesheet" href="styles/reset.css">
  8. </head>
  9. <body>
  10. <script id="comments" type="text/html">
  11. {* это комментарий *}
  12. {{empty comments}}
  13. <p>Комментариев нет.</p>
  14. {{/empty}}
  15. <ul class="comments">
  16. # each comment in comments
  17.     <li>      
  18.         <a href="${comment.author_link}">${comment.author_name}</a>
  19.         <time>${comment.date_time}</time>
  20.         <p>${comment.text}</p>
  21.     </li>
  22. # /each
  23. </ul>
  24. </script>
  25. <script>
  26.    
  27.    
  28.  
  29.  
  30. function foo(str, context) {
  31.     return str.replace(/\{(\w+(?:\.\w+)*)\}/g, function(match, name) {
  32.         var keys = name.split('.'), k, v = context;
  33.         while ( k = keys.shift() ) {
  34.             if (v[k] == undefined) {
  35.                 v = '';
  36.                 break;
  37.             }          
  38.             v = v[k];
  39.         }      
  40.         return v;
  41.     });
  42. }
  43.  
  44. blocks = {
  45.     // each value in array
  46.     each: {
  47.         re: /(\w+)\s+in\s+(\w+(?:\.\w+)*)/,
  48.         fn: function(context, statement, partial) {
  49.             //
  50.         }
  51.     },
  52.    
  53.     empty: {
  54.         re: /(\w+(?:\.\w+)*)/,
  55.         fn: function(context, statement, partial) {
  56.             //
  57.         }
  58.     }
  59. }
  60.  
  61. T_MARKUP = 0,
  62. T_VAR = 1,
  63. T_UNSAFE_VAR = 2,
  64. T_BEGIN_BLOCK = 3,
  65. T_END_BLOCK = 4,
  66. T_EXEC = 5,
  67. T_COMMENT = 6;
  68.  
  69. function tokenize(s) {
  70.     var i = 0, l = s.length, flag, c, p, p1, p2 = 0, tag, data, stack = [], out = [];
  71.    
  72.     while (i < l) {
  73.         flag = 0;
  74.         p = i++;
  75.         c = s[p];
  76.        
  77.         if ( (c == '$' || c == '%') && s[i] == '{' ) {
  78.             p1 = s.indexOf('}', ++i);
  79.            
  80.             if (p1 == -1) {
  81.                 throw 'unexcepted end; excepted }';
  82.             }
  83.            
  84.             tag = s.slice(i, p1).trim();
  85.            
  86.             if ( !/^\w+(\.\w+)*$/.test(tag) ) {
  87.                 throw 'bad variable name at offset ' + p;
  88.             }
  89.            
  90.             flag = 1;
  91.             data = [c == '$' ? T_VAR : T_UNSAFE_VAR, tag];
  92.             ++p1;
  93.         }
  94.         else if (c == '#') {
  95.             flag = 2;
  96.             p1 = s.indexOf('\n', i);          
  97.             tag = p1 == -1 ? s.substr(i) : s.slice(i, p1);
  98.             p1 = p1 == -1 ? l : ++p1;
  99.         }      
  100.         else if (c == '{') {
  101.             // комментарий
  102.             if (s[i] == '*') {
  103.                 p1 = s.indexOf('*}', ++i);
  104.  
  105.                 if (p1 > -1) {
  106.                     flag = 1;
  107.                     data = [T_COMMENT, s.slice(i, p1)];
  108.                     p1 += 2;
  109.                 }
  110.             }
  111.             else if (s[i] == '{') {              
  112.                 p1 = s.indexOf('}}', ++i);
  113.                
  114.                 if (p1 == -1) {
  115.                     throw 'unexcepted end; excepted }}';
  116.                 }              
  117.                
  118.                 flag = 2;
  119.                 tag = s.slice(i, p1);              
  120.                 p1 += 2;
  121.                
  122.                 if (s[p1] == '\r') {
  123.                     ++p1;
  124.                 }
  125.                
  126.                 if (s[p1] == '\n') {
  127.                     ++p1;
  128.                 }
  129.             }
  130.         }
  131.        
  132.         if (flag) {
  133.             if (flag == 2) {
  134.                 if ( /^\s*\//.test(tag) ) {
  135.                     if ( !/^\w+$/.test( tag = tag.split('/')[1].trim() ) ) {
  136.                         throw 'bad tag';
  137.                     }
  138.                    
  139.                     if (stack.pop() != tag) {
  140.                         throw 'unexcepted /' + tag + ' at offset ' + p;
  141.                     }
  142.                                      
  143.                     data = [T_END_BLOCK, tag];
  144.                 }
  145.                 else {
  146.                     data = tag.match(/^\s*(\w+)(?:\s+(.*?))?\s*$/);
  147.                    
  148.                     if (data == null) {
  149.                         throw 'bad tag';
  150.                     }
  151.                    
  152.                     tag = data[1];
  153.                    
  154.                     if ( !(tag in blocks) ) {
  155.                         throw 'unknown tag ' + tag + ' at offset ' + p;
  156.                     }
  157.  
  158.                     if ( ( data = data[2].match(blocks[tag].re) ) == null ) {
  159.                         throw 'syntax error in ' + tag + ' at offset ' + p;
  160.                     }
  161.  
  162.                     stack.push(tag);  
  163.                     data = [T_BEGIN_BLOCK, tag, data.slice(1)];                                    
  164.                 }
  165.             }
  166.            
  167.             if (p2 < p) {
  168.                 out.push([T_MARKUP, s.slice(p2, p)]);
  169.             }        
  170.  
  171.             out.push(data);
  172.             p2 = p1;
  173.             i = p2;
  174.         }
  175.     }
  176.    
  177.     if (stack.length) {
  178.         throw 'unexcepted end; excepted: /' + stack.shift();
  179.     }
  180.  
  181.     if (p2 < l) {
  182.         out.push([T_MARKUP, s.substr(p2)]);
  183.     }
  184.  
  185.     return out;
  186. }
  187.  
  188. function parse(s) {
  189.     var i = 0, l = s.length, c, f, p, p1, p2 = 0, tag, temp, stack = [];
  190.    
  191.     function _parse() {
  192.         var out = [];
  193.        
  194.         while (i < l) {
  195.             f = 0;
  196.             p = i++;
  197.             c = s[p];
  198.  
  199.             if ( (c == '$' || c == '%') && s[i] == '{') {
  200.                 p1 = s.indexOf('}', i++);
  201.  
  202.                 if (p1 == -1) {
  203.                     throw 'unexcepted end: excepted }';
  204.                 }
  205.  
  206.                 f = c == '$' ? 1 : 2;
  207.                 tag = s.slice(i, p1);              
  208.                 ++p1;
  209.             }
  210.             else if (c == '{' && s[i] == '{') {
  211.                 f = 3;
  212.                 p1 = s.indexOf('}}', i++);
  213.  
  214.                 if (p1 == -1) {
  215.                     throw 'unexcepted end: excepted }}';
  216.                 }
  217.  
  218.                 tag = s.slice(i, p1);
  219.                 p1 += 2;
  220.             }
  221.             else if (c == '#') {
  222.                 f = 3;
  223.                 p1 = s.indexOf('\n', i);
  224.                 tag = p1 == -1 ? s.substr(i) : s.slice(i, p1);
  225.                 p1 = p1 == -1 ? l : ++p1;
  226.             }
  227.  
  228.             if (f) {
  229.                 if (p2 < p) {
  230.                     out.push([0, s.slice(p2, p)]);
  231.                 }
  232.  
  233.                 p2 = p1;              
  234.                
  235.                 switch (f) {
  236.                     case 3:
  237.                         // console.log(stack);
  238.                        
  239.                         if ( /^\s*\//.test(tag) ) {
  240.                             tag = tag.split('/')[1].trim();
  241.                            
  242.                             if ( !/^\w+$/.test(tag) ) {
  243.                                 throw 'bad tag';
  244.                             }
  245.                            
  246.                             if (stack.pop() != tag) {
  247.                                 throw 'unexcepted: /' + tag;
  248.                             }
  249.                            
  250.                             return out;
  251.                         }
  252.                        
  253.                         /*
  254.                         if ( /^:\s*else\s*$/.test(tag) ) {
  255.                             continue;
  256.                         } */
  257.                        
  258.                         console.log(tag);
  259.                         temp = tag.match(/^\s*(\w+)(?:\s+(.*?))?\s*$/);
  260.                        
  261.                         if (temp == null) {
  262.                             throw 'bad tag';
  263.                         }
  264.                        
  265.                         tag = temp[1];
  266.                        
  267.                         if ( !(tag in blocks) ) {
  268.                             throw 'unknown tag: ' + tag;
  269.                         }
  270.                        
  271.                         if ( ( temp = temp[2].match(blocks[tag].re) ) == null ) {
  272.                             throw 'syntax error in ' + tag + ' tag';
  273.                         }
  274.                        
  275.                         stack.push(tag);  
  276.                        
  277.                        
  278.                         out.push([f, tag, temp.slice(1), _parse()]);                        
  279.                         break;
  280.                    
  281.                     default:
  282.                         tag = tag.trim();
  283.                        
  284.                         if ( !/^\w+(\.\w+)*$/.test(tag) ) {
  285.                             throw 'bad variable name';
  286.                         }
  287.                        
  288.                         out.push([f, tag]);
  289.                 }
  290.             }
  291.         }
  292.        
  293.         if (stack.length) {
  294.             throw 'unexcepted end: excepted /' + stack.shift();
  295.         }
  296.  
  297.         if (p2 < l) {
  298.             out.push([0, s.substr(p2)]);
  299.         }
  300.        
  301.         return out;
  302.     }
  303.    
  304.     return _parse();
  305. }
  306.  
  307. console.log( JSON.stringify( tokenize( val('comments') ) ) );
  308.  
  309. </script>
  310. </body></html>
Advertisement
Add Comment
Please, Sign In to add comment