|
/* |
|
* jQote2 - client-side Javascript templating engine |
|
* Copyright (C) 2010, aefxx |
|
* http://aefxx.com/ |
|
* |
|
* Licensed under the DWTFYWT PUBLIC LICENSE v2 |
|
* Copyright (C) 2004, Sam Hocevar |
|
* |
|
* Date: Sun, May 5th, 2010 |
|
* Version: 0.9.2 |
|
*/ |
|
(function($) { |
|
var ARR = '[object Array]', |
|
FUNC = '[object Function]', |
|
STR = '[object String]'; |
|
|
|
var n = 0, |
|
tag = '%', |
|
type_of = Object.prototype.toString; |
|
|
|
$.fn.extend({ |
|
jqote: function(data, t) { |
|
var data = type_of.call(data) === ARR ? data : [data], |
|
dom = ''; |
|
|
|
this.each(function(i) { |
|
var f = ( fn = $.jqotecache[this.jqote] ) ? fn : $.jqotec(this, t || tag); |
|
|
|
for ( var j=0; j < data.length; j++ ) |
|
dom += f.call(data[j], i, j, data, f); |
|
}); |
|
|
|
return dom; |
|
}, |
|
|
|
jqoteapp: function(elem, data, t) { |
|
var dom = $.jqote(elem, data, t); |
|
|
|
return this.each(function() { |
|
$(this).append(dom); |
|
}); |
|
}, |
|
|
|
jqotepre: function(elem, data, t) { |
|
var dom = $.jqote(elem, data, t); |
|
|
|
return this.each(function() { |
|
$(this).prepend(dom); |
|
}); |
|
}, |
|
|
|
jqotesub: function(elem, data, t) { |
|
var dom = $.jqote(elem, data, t); |
|
|
|
return this.each(function() { |
|
$(this).html(dom); |
|
}); |
|
} |
|
}); |
|
|
|
$.extend({ |
|
jqote: function(elem, data, t) { |
|
var dom = '', fn = [], t = t || tag, type = type_of.call(elem), |
|
data = type_of.call(data) === ARR ? data : [data]; |
|
|
|
if ( type === FUNC ) |
|
fn = [elem]; |
|
|
|
else if ( type === ARR ) |
|
fn = type_of.call(elem[0]) === FUNC ? |
|
elem : $.map(elem, function(e) { return $.jqotec(e, t); }); |
|
|
|
else if ( type === STR ) |
|
fn.push( elem.indexOf('<' + t) < 0 ? |
|
$.jqotec($(elem), t) : $.jqotec(elem, t)); |
|
|
|
else fn = $.map($(elem), function(e) { return $.jqotec(e, t); }); |
|
|
|
for ( var i=0,l=fn.length; i < l; i++ ) |
|
for ( var j=0; j < data.length; j++ ) |
|
dom += fn[i].call(data[j], i, j, data, fn[i]); |
|
|
|
return dom; |
|
}, |
|
|
|
jqotec: function(elem, t) { |
|
var fn, str = '', t = t || tag, |
|
type = type_of.call(elem), |
|
tmpl = ( type === STR && elem.indexOf('<' + t) >= 0 ) ? |
|
elem : ( elem = ( type === STR || elem instanceof jQuery ) ? |
|
$(elem)[0] : elem ).innerHTML; |
|
|
|
var arr = tmpl.replace(/\s*<!\[CDATA\[\s*|\s*\]\]>\s*|[\r\n\t]/g, '') |
|
.split('<'+t).join(t+'>\x1b') |
|
.split(t+'>'); |
|
|
|
for ( var i=0,l=arr.length; i < l; i++ ) |
|
str += arr[i].charAt(0) !== '\x1b' ? |
|
"out+='" + arr[i].replace(/([^\\])?(["'])/g, '$1\\$2') + "'" : (arr[i].charAt(1) === '=' ? |
|
'+' + arr[i].substr(2) + ';' : ';' + arr[i].substr(1)); |
|
|
|
fn = new Function('i, j, data, fn', 'var out="";' + str + '; return out;'); |
|
|
|
return type_of.call(elem) === STR ? |
|
fn : $.jqotecache[elem.jqote = elem.jqote || n++] = fn; |
|
}, |
|
|
|
jqotefn: function(elem) { |
|
return $.jqotecache[$(elem)[0].jqote] || false; |
|
}, |
|
|
|
jqotetag: function(str) { |
|
tag = str; |
|
}, |
|
|
|
jqotecache: [] |
|
}); |
|
})(jQuery); |
|
|