www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

jquery.jqote2.js (3463B)


      1 /*
      2  * jQote2 - client-side Javascript templating engine
      3  * Copyright (C) 2010, aefxx
      4  * http://aefxx.com/
      5  *
      6  * Licensed under the DWTFYWT PUBLIC LICENSE v2
      7  * Copyright (C) 2004, Sam Hocevar
      8  *
      9  * Date: Tue, March 25th, 2010
     10  * Version: 0.9.0
     11  */
     12 (function($) {
     13 	var ARR = '[object Array]',
     14 		FUNC = '[object Function]',
     15 		STR = '[object String]';
     16 
     17     var n = 0,
     18 		tag = '%',
     19 	    type_of = Object.prototype.toString;
     20 
     21     $.fn.extend({
     22 		jqote: function(data, t) {
     23 			var data = type_of.call(data) === ARR ? data : [data],
     24 				dom = '';
     25 
     26 			this.each(function(i) {
     27 				var f = ( fn = $.jqotecache[this.jqote] ) ? fn : $.jqotec(this, t || tag);
     28 
     29 				for ( var j=0; j < data.length; j++ )
     30 					dom += f.call(data[j], i, j, data, f);
     31 			});
     32 
     33 			return dom;
     34 		},
     35 
     36 		jqoteapp: function(elem, data, t) {
     37             var dom = $.jqote(elem, data, t);
     38 
     39 			return this.each(function() {
     40 				$(this).append(dom);
     41 			});
     42 		},
     43 
     44 		jqotepre: function(elem, data, t) {
     45             var dom = $.jqote(elem, data, t);
     46 
     47 			return this.each(function() {
     48 				$(this).prepend(dom);
     49 			});
     50 		},
     51 
     52 		jqotesub: function(elem, data, t) {
     53             var dom = $.jqote(elem, data, t);
     54 
     55 			return this.each(function() {
     56 				$(this).html(dom);
     57 			});
     58 		}
     59 	});
     60 
     61     $.extend({
     62         jqote: function(elem, data, t) {
     63             var dom = '', fn = [], t = t || tag, type = type_of.call(elem),
     64                 data = type_of.call(data) === ARR ? data : [data];
     65 
     66             if ( type === FUNC )
     67                     fn = [elem];
     68 
     69             else if ( type === ARR )
     70                 fn = type_of.call(elem[0]) === FUNC ?
     71                     elem : $.map(elem, function(e) { return $.jqotec(e, t); });
     72 
     73             else if ( type === STR )
     74                 fn.push( elem.indexOf('<' + t) < 0 ?
     75                     $.jqotec($(elem), t) : $.jqotec(elem, t));
     76 
     77             else fn = $.map($(elem), function(e) { return $.jqotec(e, t); });
     78 
     79             for ( var i=0; i < fn.length; i++ )
     80                 for ( var j=0; j < data.length; j++ )
     81                     dom += fn[i].call(data[j], i, j, data, fn[i]);
     82 
     83             return dom;
     84         },
     85 
     86         jqotec: function(elem, t) {
     87             var fn, str = '', t = t || tag,
     88                 type = type_of.call(elem),
     89                 tmpl = ( type === STR && elem.indexOf('<' + t) >= 0 ) ?
     90                             elem : ( elem = ( type === STR  || elem instanceof jQuery ) ?
     91                                 $(elem)[0] : elem ).innerHTML;
     92 
     93             var arr = tmpl.replace(/\s*<!\[CDATA\[\s*|\s*\]\]>\s*|[\r\n\t]/g, '')
     94                         .split('<'+t).join(t+'>\x1b')
     95                             .split(t+'>');
     96 
     97             for ( var i=0; i < arr.length; i++ )
     98                 str += arr[i].charAt(0) != '\x1b' ?
     99                     "out+='" + arr[i].replace(/([^\\])(["'])/g, '$1\\$2') + "'" : (arr[i].charAt(1) == '=' ?
    100                         '+' + arr[i].substr(2) + ';' : (arr[i].charAt(1) == ':' ?
    101                             '+this.' + arr[i].substr(2) + ';' : ';' + arr[i].substr(1)));
    102 
    103             fn = new Function('i, j, data, fn', 'var out="";' + str + '; return out;');
    104 
    105             return type_of.call(elem) === STR ?
    106                 fn : $.jqotecache[elem.jqote = elem.jqote || n++] = fn;
    107         },
    108 
    109         jqotefn: function(elem) {
    110             return $.jqotecache[$(elem)[0].jqote] || false;
    111         },
    112 
    113         jqotetag: function(str) {
    114             tag = str;
    115         },
    116 
    117         jqotecache: []
    118     });
    119 })(jQuery);