Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title></title>
- <script src="../js/common.js"></script>
- <link rel="stylesheet" href="style.css">
- <script id="example" type="text/html">
- <h3>{title}</h3>
- {:entries}
- <article>
- <h4>{title}</h4>
- <p>{content}</p>
- </article>
- {/entries}
- </script>
- </head>
- <body>
- <div id="container"></div>
- <script>
- Template = function(txt) {
- var lastIndex = 0;
- var data;
- if (txt != undefined) {
- this.parse(txt);
- txt = null;
- }
- function parsePartial(parts, stack) {
- var data = [], limit = parts.length, sign, name;
- while (lastIndex < limit) {
- data.push( [ 'markup', parts[lastIndex] ] );
- if (++lastIndex == limit) {
- break;
- }
- sign = parts[lastIndex++];
- name = parts[lastIndex++];
- if (sign == ':') {
- stack.push(name);
- data.push( [ 'block', name, parsePartial.apply(null, arguments) ] );
- }
- else if (sign == '/') {
- if ( stack.pop() != name ) {
- throw 'Unexcepted: {/' + name + '}';
- }
- return data;
- }
- else {
- data.push( [ 'varname', name ] );
- }
- }
- if (stack.length) {
- throw 'Unexcepted end; excepted: {/' + stack.join('}, {/') + '}' ;
- }
- return data;
- }
- this.parse = function(txt) {
- data = parsePartial( txt.split(/\{([:\/]?)([\w]+)\}/), [] );
- }
- this.load = function(id) {
- this.parse( document.getElementById(id).innerHTML );
- }
- function renderPartial(data, scope) {
- var out = '';
- for (var i = 0, l = data.length, partial, name, content, save, j, k; i < l; ++i) {
- name = data[i][1];
- switch ( data[i][0] ) {
- case 'markup':
- out += name;
- break;
- case 'varname':
- out += name in scope ? scope[name] : '';
- break;
- case 'block':
- content = scope[name];
- if (content) {
- // сохраняем текущую область видимости
- save = clone(scope);
- if ( content.constructor == Array ) {
- for (j = 0, k = content.length; j < k; ++j) {
- scope = extend( scope, content[j] );
- out += renderPartial( data[i][2], scope );
- }
- }
- else if ( content.constructor == Object ) {
- scope = extend(scope, content);
- out += renderPartial( data[i][2], scope );
- }
- else {
- out += content;
- }
- // восстанавливаем ее
- scope = save;
- }
- }
- }
- return out;
- }
- this.render = function(ctx) {
- // console.log(ctx);
- var scope = extend( {}, ctx );
- return renderPartial(data, scope);
- };
- };
- t = new Template;
- t.load('example');
- gid('container').innerHTML = t.render( {
- title: 'Все новости',
- entries: [
- {
- title: 'Тест',
- content: 'Это тестовое сообщение'
- },
- {
- title: 'Еще запись',
- content: 'Какой-то текст'
- }
- ]
- } );
- </script>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment