/* * 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*\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);