stuppid_bot

Untitled

May 12th, 2013
176
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="style.css">
  8.         <script id="example" type="text/html">
  9.  
  10. <h3>{title}</h3>
  11. {:entries}
  12. <article>
  13.     <h4>{title}</h4>
  14.     <p>{content}</p>
  15. </article>
  16. {/entries}
  17.            
  18.         </script>
  19.     </head>
  20.     <body>
  21.         <div id="container"></div>
  22.         <script>
  23.  
  24. Template = function(txt) {
  25.     var lastIndex = 0;  
  26.     var data;
  27.    
  28.     if (txt != undefined) {
  29.         this.parse(txt);
  30.         txt = null;
  31.     }
  32.    
  33.     function parsePartial(parts, stack) {
  34.         var data = [], limit = parts.length, sign, name;      
  35.  
  36.         while (lastIndex < limit) {
  37.             data.push( [ 'markup', parts[lastIndex] ] );
  38.  
  39.             if (++lastIndex == limit) {
  40.                 break;
  41.             }
  42.  
  43.             sign = parts[lastIndex++];
  44.             name = parts[lastIndex++];
  45.  
  46.             if (sign == ':') {
  47.                 stack.push(name);
  48.                 data.push( [ 'block', name, parsePartial.apply(null, arguments) ] );
  49.             }
  50.             else if (sign == '/') {    
  51.                 if ( stack.pop() != name ) {
  52.                     throw 'Unexcepted: {/' + name + '}';
  53.                 }  
  54.  
  55.                 return data;
  56.             }
  57.             else {
  58.                 data.push( [ 'varname', name ] );
  59.             }
  60.         }
  61.  
  62.         if (stack.length) {
  63.             throw 'Unexcepted end; excepted: {/' + stack.join('}, {/') + '}' ;
  64.         }
  65.  
  66.         return data;
  67.     }
  68.    
  69.     this.parse = function(txt) {
  70.         data = parsePartial( txt.split(/\{([:\/]?)([\w]+)\}/), [] );
  71.     }
  72.    
  73.     this.load = function(id) {
  74.         this.parse( document.getElementById(id).innerHTML );
  75.     }  
  76.    
  77.     function renderPartial(data, scope) {
  78.         var out = '';
  79.        
  80.         for (var i = 0, l = data.length, partial, name, content, save, j, k; i < l; ++i) {
  81.             name = data[i][1];
  82.            
  83.             switch ( data[i][0] ) {
  84.                 case 'markup':
  85.                     out += name;
  86.                     break;
  87.                
  88.                 case 'varname':
  89.                     out += name in scope ? scope[name] : '';
  90.                     break;  
  91.                    
  92.                 case 'block':
  93.                     content = scope[name];
  94.                    
  95.                     if (content) {
  96.                         // сохраняем текущую область видимости
  97.                         save = clone(scope);                      
  98.                                                
  99.                         if ( content.constructor == Array ) {
  100.                             for (j = 0, k = content.length; j < k; ++j) {
  101.                                 scope = extend( scope, content[j] );
  102.                                 out += renderPartial( data[i][2], scope );
  103.                             }
  104.                         }
  105.                         else if ( content.constructor == Object ) {
  106.                             scope = extend(scope, content);
  107.                             out += renderPartial( data[i][2], scope );
  108.                         }
  109.                         else {
  110.                             out += content;
  111.                         }
  112.                        
  113.                         // восстанавливаем ее
  114.                         scope = save;
  115.                     }                  
  116.             }
  117.                
  118.         }
  119.        
  120.         return out;
  121.     }
  122.    
  123.     this.render = function(ctx) {
  124.         // console.log(ctx);
  125.         var scope = extend( {}, ctx );
  126.         return renderPartial(data, scope);
  127.     };
  128. };
  129.  
  130. t = new Template;
  131. t.load('example');
  132.  
  133. gid('container').innerHTML = t.render( {
  134.     title: 'Все новости',
  135.    
  136.     entries: [
  137.         {
  138.             title: 'Тест',
  139.             content: 'Это тестовое сообщение'
  140.         },
  141.  
  142.         {
  143.             title: 'Еще запись',
  144.             content: 'Какой-то текст'
  145.         }
  146.     ]
  147. } );
  148.        
  149.         </script>
  150.     </body>
  151. </html>
Advertisement
Add Comment
Please, Sign In to add comment