jquery.jqote2.js (3371B)
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].substr(1)); 101 102 fn = new Function('i, j, data, fn', 'var out="";' + str + '; return out;'); 103 104 return type_of.call(elem) === STR ? 105 fn : $.jqotecache[elem.jqote = elem.jqote || n++] = fn; 106 }, 107 108 jqotefn: function(elem) { 109 return $.jqotecache[$(elem)[0].jqote] || false; 110 }, 111 112 jqotetag: function(str) { 113 tag = str; 114 }, 115 116 jqotecache: [] 117 }); 118 })(jQuery);