From a51abde31d78e0a45f90da8281e296705f2bfb1a Mon Sep 17 00:00:00 2001 From: Tom Ashworth Date: Fri, 21 Jun 2013 13:57:28 +0100 Subject: [PATCH 1/3] Allow overwriting of default endpoints. --- twitterlib.js | 108 ++++++++++++++++++++++++++++---------------------- 1 file changed, 61 insertions(+), 47 deletions(-) diff --git a/twitterlib.js b/twitterlib.js index 4c79354..e37ad78 100644 --- a/twitterlib.js +++ b/twitterlib.js @@ -77,7 +77,7 @@ urls = URLS, // allows for resetting debugging undefined, caching = false; - + var ify = function() { return { entities: function (t) { @@ -105,10 +105,10 @@ } }; }(); - + var expandLinks = function (tweet) { if (tweet === undefined) return ''; - + var text = tweet.text, i = 0; if (tweet.entities) { @@ -118,7 +118,7 @@ if (tweet.entities.urls[i].expanded_url) text = text.replace(tweet.entities.urls[i].url, tweet.entities.urls[i].expanded_url); // /g ? } } - + // replace media with url to actual image (or thing?) if (tweet.entities.media && tweet.entities.media.length) { for (i = 0; i < tweet.entities.media.length; i++) { @@ -127,10 +127,10 @@ } } - + return text; }; - + var time = function () { var monthDict = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; return { @@ -138,7 +138,7 @@ var hour = date.getHours(), min = date.getMinutes() + "", ampm = 'AM'; - + if (hour == 0) { hour = 12; } else if (hour == 12) { @@ -147,11 +147,11 @@ hour -= 12; ampm = 'PM'; } - + if (min.length == 1) { min = '0' + min; } - + return hour + ':' + min + ' ' + ampm; }, date: function (date) { @@ -225,10 +225,10 @@ } return r; - } + } }; }(); - + var filter = (function () { return { match: function (tweet, search, includeHighlighted) { @@ -238,7 +238,7 @@ if (typeof search == "string") { search = this.format(search); } - + // loop ignore first if (search['not'] && search['not'].length) { for (i = 0; i < search['not'].length; i++) { @@ -319,14 +319,14 @@ neg = true; } m = m.replace(/["']+|["']+$/g, ''); - + if (neg) { - negative.push(m.substr(1).toLowerCase()); + negative.push(m.substr(1).toLowerCase()); } else { - blocks.push(m); + blocks.push(m); } }); - + for (i = 0; i < blocks.length; i++) { if (blocks[i] == 'OR' && blocks[i+1]) { ors.push(blocks[i-1].toLowerCase()); @@ -364,7 +364,7 @@ } }; })(); - + // based on twitter.com list of tweets, most common format for tweets function render(tweet) { var html = '
  • '; @@ -393,7 +393,7 @@ window[twitterlib + guid] = undefined; try{ delete window[ twitterlib + guid ]; } catch(e){} } - + function load(url, options, callback) { var script = document.createElement('script'), match = null; if (options == undefined) options = {}; @@ -419,7 +419,7 @@ while (i--) { tweets[i].user = { id: tweets[i].from_user_id, screen_name: tweets[i].from_user, profile_image_url: tweets[i].profile_image_url }; tweets[i].source = twitterlib.ify.entities(tweets[i].source); - + // fix created_at parts = tweets[i].created_at.split(' '); tweets[i].created_at = [parts[0],parts[2],parts[1],parts[4],parts[5], parts[3]].join(' ').replace(/,/, ''); @@ -441,35 +441,35 @@ } } } - + options.originalTweets = tweets; if (options.filter) { tweets = filter.matchTweets(tweets, options.filter); } - + if (options.limit && options.limit < tweets.length) { // chop tweets = tweets.splice(0, options.limit); } - + if (caching && options.page > 1) { try { sessionStorage.setItem('twitterlib.page' + options.page + '.tweets', JSON.stringify(tweets)); - sessionStorage.setItem('twitterlib.page' + options.page + '.originalTweets', JSON.stringify(options.originalTweets)); + sessionStorage.setItem('twitterlib.page' + options.page + '.originalTweets', JSON.stringify(options.originalTweets)); sessionStorage.setItem('twitterlib.page' + options.page, 'true'); } catch (e) { // possible QUOTA EXCEEDED } } - + options.cached = false; - + callback.call(twitterlib, tweets, options); // clean up clean(guid); }; })(guid, options); - + match = url.match(/callback=(.*)/); if (match != null && match.length > 1) { window[match[1]] = window['twitterlib' + guid]; @@ -485,7 +485,7 @@ } else if (caching) { clean(guid); options.cached = true; - + options.originalTweets = JSON.parse(sessionStorage.getItem('twitterlib.page' + options.page + '.originalTweets')); // reset the tweets - so we can cache but refilter var tweets = JSON.parse(sessionStorage.getItem('twitterlib.page' + options.page + '.tweets') || '[]'); @@ -499,10 +499,11 @@ } callback.call(twitterlib, tweets, options); - } + } } - + function getUrl(type, options) { + options = options || {}; return urls[type].replace(/(\b.*?)%(.*?)(\|.*?)?%/g, function (a, q, key, def) { // remove empty values that shouldn't be sent if (def && def.substr(1) == 'remove' && options[key] == undefined) { @@ -512,7 +513,7 @@ return q + (options[key] === undefined && def !== undefined ? def.substr(1) : val); }); } - + function normaliseArgs(options, callback) { if (typeof options == 'function') { callback = options; @@ -526,9 +527,18 @@ } return options; } - + + function extend(obj, source) { + if (source) { + for (var prop in source) { + obj[prop] = source[prop]; + } + } + return obj; + } + function setLast(method, arg, options) { - last = { + last = { method: method, arg: arg, options: options, @@ -537,16 +547,16 @@ }; options.method = method; - + if (caching) { var last_request = JSON.parse(sessionStorage.getItem('twitterlib.last_request') || '{}'); if (last.method != last_request.method || last.arg != last_request.arg) { clearCache(); sessionStorage.setItem('twitterlib.last_request', JSON.stringify(last)); - } + } } } - + function clearCache() { var i = sessionStorage.length; while (i--) { @@ -555,10 +565,12 @@ } } } - + function custom(name, url, defaults) { - if (url && urls[name] == undefined) urls[name] = url; - if (this[name] == undefined) { + // This condition is commented out to allow overwriting of existing methods + if (url /*&& urls[name] == undefined*/) urls[name] = url; + // This if is removed so that customs can overwrite existing methods + // if (this[name] == undefined) { this[name] = function (term, options, callback) { // handle "termless" custom methods if (typeof term == 'function') { @@ -572,20 +584,22 @@ options = normaliseArgs(options, callback); setLast(name, term, options); // slight hack to support my own shortcuts - options[name] = options.user = term; + options[name] = options.user = term; options.search = encodeURIComponent(term); + options = extend(defaults, options); if (options.callback) load(getUrl(name, options), options, options.callback); return this; }; - } + // } // makes my code nicer to read when setting up twitterlib object return this[name]; } - + twitterlib = { version: '1.0.9', //@version 1.0.9 / Sun Feb 19 23:05:25 2012 +0000 // search is an exception case custom: custom, + getUrl: getUrl, status: function (user, options, callback) { // alias function options = normaliseArgs(options, callback); options.limit = 1; @@ -615,7 +629,7 @@ } // else we won't do anything return this; }, - + // appending on pre-existing utilities time: time, ify: ify, @@ -641,14 +655,14 @@ }, cache: function (enabled) { caching = enabled == undefined ? true : enabled; - + // cache is only supported if you have native json encoding if (!window.JSON || !window.sessionStorage) { caching = false; } } }; - + twitterlib.custom('search'); twitterlib.custom('timeline'); twitterlib.custom('favs'); @@ -656,7 +670,7 @@ if (typeof exports !== 'undefined') { module.exports = twitterlib; - } - + } + global.twitterlib = twitterlib; -})(this); +})(this); \ No newline at end of file From bd1a7a41383b5d1af791051f8cf02b9a62b9b12c Mon Sep 17 00:00:00 2001 From: Tom Ashworth Date: Fri, 21 Jun 2013 14:02:46 +0100 Subject: [PATCH 2/3] Make and update version. --- package.json | 2 +- twitterlib.js | 4 ++-- twitterlib.min.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 23d0562..ca27078 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "twitterlib", "main": "twitterlib.js", - "version": "1.1.4", + "version": "1.1.5", "description": "Library for doing all things Twitter API related, with added sauce for filtering, paging and paging", "homepage": "https://github.com/remy/twitterlib/", "keywords": [ diff --git a/twitterlib.js b/twitterlib.js index e90ab09..fe333ce 100644 --- a/twitterlib.js +++ b/twitterlib.js @@ -1,5 +1,5 @@ // twitterlib.js (c) 2011 Remy Sharp -// @version 1.0.9 / Sun Feb 19 23:05:25 2012 +0000 +// @version 1.1.5 / Fri Jun 21 14:02:46 2013 +0100 // MIT license: http://rem.mit-license.org (function (global) { var twitterlib = {}; @@ -602,7 +602,7 @@ } twitterlib = { - version: '1.0.9', //@version 1.0.9 / Sun Feb 19 23:05:25 2012 +0000 + version: '1.1.5', //@version 1.1.5 / Fri Jun 21 14:02:46 2013 +0100 // search is an exception case custom: custom, getUrl: getUrl, diff --git a/twitterlib.min.js b/twitterlib.min.js index 631ee98..6f799ca 100644 --- a/twitterlib.min.js +++ b/twitterlib.min.js @@ -1,4 +1,4 @@ // twitterlib.js (c) 2011 Remy Sharp -// @version 1.0.9 / Sun Feb 19 23:05:25 2012 +0000 +// @version 1.1.5 / Fri Jun 21 14:02:46 2013 +0100 // MIT license: http://rem.mit-license.org -(function(a){function u(a){var c='
  • ';return c+='
    '+a.user.name+'
    ',c+='
    '+a.user.screen_name+" ",c+='',c+=b.ify.clean(b.expandLinks(a)),c+='
  • ",c}function v(a){var c=g.getElementById(b+a);c&&h.removeChild(g.getElementById(b+a)),delete j[b+a],f[b+a]=o;try{delete f[b+a]}catch(d){}}function w(a,c,d){var i=g.createElement("script"),k=null;c==o&&(c={}),e++,j["twitterlib"+e]=!0,f["twitterlib"+e]=function(a,c){return function(e){var f=0,g=[];if(e.results){e=e.results,f=e.length;while(f--)e[f].user={id:e[f].from_user_id,screen_name:e[f].from_user,profile_image_url:e[f].profile_image_url},e[f].source=b.ify.entities(e[f].source),g=e[f].created_at.split(" "),e[f].created_at=[g[0],g[2],g[1],g[4],g[5],g[3]].join(" ").replace(/,/,"")}else if(e.length&&e[0].sender){f=e.length;while(f--)e[f].user=e[f].sender,e[f].originalText=e[f].text,e[f].text="@"+e[f].recipient_screen_name+" "+e[f].text}else if(c.rts==1||c.rts=="t"||c.rts==1){f=e.length;while(f--)e[f].retweeted_status&&(e[f].retweeted_status.retweetedby=e[f].user,e[f]=e[f].retweeted_status)}c.originalTweets=e,c.filter&&(e=t.matchTweets(e,c.filter)),c.limit&&c.limit1)try{sessionStorage.setItem("twitterlib.page"+c.page+".tweets",JSON.stringify(e)),sessionStorage.setItem("twitterlib.page"+c.page+".originalTweets",JSON.stringify(c.originalTweets)),sessionStorage.setItem("twitterlib.page"+c.page,"true")}catch(h){}c.cached=!1,d.call(b,e,c),v(a)}}(e,c),k=a.match(/callback=(.*)/),k!=null&&k.length>1?f[k[1]]=f["twitterlib"+e]:a+="&callback=twitterlib"+e;if(!p||c.page<=1||p&&sessionStorage.getItem("twitterlib.page"+c.page)==null)i.src=a,i.id="twitterlib"+e,h.appendChild(i);else if(p){v(e),c.cached=!0,c.originalTweets=JSON.parse(sessionStorage.getItem("twitterlib.page"+c.page+".originalTweets"));var l=JSON.parse(sessionStorage.getItem("twitterlib.page"+c.page+".tweets")||"[]");c.filter&&(l=t.matchTweets(l,c.filter)),c.limit&&c.limit"},l=g.location.protocol.substr(0,4)==="http"?g.location.protocol:"http:",m={search:l+"//search.twitter.com/search.json?q=%search%&page=%page|1%&rpp=%limit|100%&since_id=%since|remove%&result_type=recent&include_entities=true",timeline:l+"//api.twitter.com/1/statuses/user_timeline.json?screen_name=%user%&count=%limit|200%&page=%page|1%&since_id=%since|remove%include_rts=%rts|false%&include_entities=true",list:l+"//api.twitter.com/1/%user%/lists/%list%/statuses.json?page=%page|1%&per_page=%limit|200%&since_id=%since|remove%&include_entities=true&include_rts=%rts|false%",favs:l+"//api.twitter.com/1/favorites/%user%.json?include_entities=true&skip_status=true&page=%page|1%&since_id=%since|remove%",retweets:l+"//api.twitter.com/1/statuses/retweeted_by_user.json?screen_name=%user%&include_entities=true&count=%limit|200%&since_id=%since|remove%&page=%page|1%"},n=m,o,p=!1,q=function(){return{entities:function(a){return a.replace(/(&[a-z0-9]+;)/g,function(a){return k[a]})},link:function(a){return a.replace(/[a-z]+:\/\/([a-z0-9-_]+\.[a-z0-9-_:~\+#%&\?\/.=]+[^:\.,\)\s*$])/ig,function(a,b){return''+(b.length>36?b.substr(0,35)+"…":b)+""})},at:function(a){return a.replace(/(^|[^\w]+)\@([a-zA-Z0-9_]{1,15}(\/[a-zA-Z0-9-_]+)*)/g,function(a,b,c){return b+'@'+c+""})},hash:function(a){return a.replace(/(^|[^&\w'"]+)\#([a-zA-Z0-9_^"^<]+)/g,function(a,b,c){return a.substr(-1)==='"'||a.substr(-1)=="<"?a:b+'#'+c+""})},clean:function(a){return this.hash(this.at(this.link(a)))}}}(),r=function(a){if(a===o)return"";var b=a.text,c=0;if(a.entities){if(a.entities.urls&&a.entities.urls.length)for(c=0;c12&&(b-=12,d="PM"),c.length==1&&(c="0"+c),b+":"+c+" "+d},date:function(b){var c=a[b.getMonth()],d=b.getDate()+"",e=~~d,f=b.getFullYear(),g=(new Date).getFullYear(),h="th";return e%10==1&&d.substr(0,1)!="1"?h="st":e%10==2&&d.substr(0,1)!="1"?h="nd":e%10==3&&d.substr(0,1)!="1"&&(h="rd"),d.substr(0,1)=="0"&&(d=d.substr(1)),c+" "+d+h+(g!=f?", "+f:"")},shortdate:function(b){var c=b.split(" "),d=Date.parse(c[1]+" "+c[2]+", "+c[5]+" "+c[3]),e=new Date(d),f=a[e.getMonth()],g=e.getDate()+"",h=e.getFullYear(),i=(new Date).getFullYear();return i===h?g+" "+f:g+" "+f+(h+"").substr(2,2)},datetime:function(a){var b=a.split(" "),c=new Date(Date.parse(b[1]+" "+b[2]+", "+b[5]+" "+b[3]));return this.time(c)+" "+this.date(c)},relative:function(a){var b=a.split(" "),c=Date.parse(b[1]+" "+b[2]+", "+b[5]+" "+b[3]),d=new Date(c),e=arguments.length>1?arguments[1]:new Date,f=~~((e.getTime()-c)/1e3),g="";return f+=e.getTimezoneOffset()*60,f<=1?g="1 second ago":f<60?g=f+" seconds ago":f<120?g="1 minute ago":f<2700?g=~~(f/60)+" minutes ago":f<10800?g="1 hour ago":f<86400?g=~~(f/3600)+" hours ago":g=this.shortdate(a),g}}}(),t=function(){return{match:function(a,b,c){var d=0,e="",f=a.text.toLowerCase(),g=(!b.and||!b.and.length)&&(!b.or||!b.or.length);typeof b=="string"&&(b=this.format(b));if(b.not&&b.not.length){for(d=0;d'+e.user.name+'',n+='
    '+e.user.screen_name+" ",n+='',n+=t.ify.clean(e.text),n+='
    ",n}function E(e){var n=o.getElementById(t+e);n&&u.removeChild(o.getElementById(t+e)),delete f[t+e],s[t+e]=d;try{delete s[t+e]}catch(r){}}function S(e,n,r){var a=o.createElement("script"),l=null;n==d&&(n={}),i++,f["twitterlib"+i]=!0,s["twitterlib"+i]=function(e,n){return function(i){var s=0,o=[];s=i.length;while(s--)i[s].originalText=i[s].text,i[s].text=g(i[s]);if(i.results){i=i.results,s=i.length;while(s--)i[s].user={id:i[s].from_user_id,screen_name:i[s].from_user,profile_image_url:i[s].profile_image_url},i[s].source=t.ify.entities(i[s].source),o=i[s].created_at.split(" "),i[s].created_at=[o[0],o[2],o[1],o[4],o[5],o[3]].join(" ").replace(/,/,"")}else if(i.length&&i[0].sender){s=i.length;while(s--)i[s].user=i[s].sender,i[s].originalText=i[s].text,i[s].text="@"+i[s].recipient_screen_name+" "+i[s].text}else if(n.rts==1||n.rts=="t"||n.rts==1){s=i.length;while(s--)i[s].retweeted_status&&(i[s].retweeted_status.retweetedby=i[s].user,i[s]=i[s].retweeted_status)}n.originalTweets=i,n.filter&&(i=b.matchTweets(i,n.filter)),n.limit&&n.limit1)try{sessionStorage.setItem("twitterlib.page"+n.page+".tweets",JSON.stringify(i)),sessionStorage.setItem("twitterlib.page"+n.page+".originalTweets",JSON.stringify(n.originalTweets)),sessionStorage.setItem("twitterlib.page"+n.page,"true")}catch(u){}n.cached=!1,r.call(t,i,n),E(e)}}(i,n),l=e.match(/callback=(.*)/),l!=null&&l.length>1?s[l[1]]=s["twitterlib"+i]:e+="&callback=twitterlib"+i;if(!v||n.page<=1||v&&sessionStorage.getItem("twitterlib.page"+n.page)==null)a.src=e,a.id="twitterlib"+i,u.appendChild(a);else if(v){E(i),n.cached=!0,n.originalTweets=JSON.parse(sessionStorage.getItem("twitterlib.page"+n.page+".originalTweets"));var c=JSON.parse(sessionStorage.getItem("twitterlib.page"+n.page+".tweets")||"[]");n.filter&&(c=b.matchTweets(c,n.filter)),n.limit&&n.limit"},c=o.location.protocol.substr(0,4)==="http"?o.location.protocol:"http:",h={search:c+"//search.twitter.com/search.json?q=%search%&page=%page|1%&rpp=%limit|100%&since_id=%since|remove%&result_type=recent&include_entities=true",timeline:c+"//api.twitter.com/1/statuses/user_timeline.json?screen_name=%user%&count=%limit|200%&page=%page|1%&since_id=%since|remove%include_rts=%rts|false%&include_entities=true",list:c+"//api.twitter.com/1/%user%/lists/%list%/statuses.json?page=%page|1%&per_page=%limit|200%&since_id=%since|remove%&include_entities=true&include_rts=%rts|false%",favs:c+"//api.twitter.com/1/favorites/%user%.json?include_entities=true&skip_status=true&page=%page|1%&since_id=%since|remove%",retweets:c+"//api.twitter.com/1/statuses/retweeted_by_user.json?screen_name=%user%&include_entities=true&count=%limit|200%&since_id=%since|remove%&page=%page|1%"},p=h,d,v=!1,m=function(){return{entities:function(e){return e.replace(/(&[a-z0-9]+;)/g,function(e){return l[e]})},link:function(e){return e.replace(/[a-z]+:\/\/([a-z0-9-_]+\.[a-z0-9-_:~\+#%&\?\/.=]+[^:\.,\)\s*$])/ig,function(e,t){return''+(t.length>36?t.substr(0,35)+"…":t)+""})},at:function(e){return e.replace(/(^|[^\w]+)\@([a-zA-Z0-9_]{1,15}(\/[a-zA-Z0-9-_]+)*)/g,function(e,t,n){return t+'@'+n+""})},hash:function(e){return e.replace(/(^|[^&\w'"]+)\#([a-zA-Z0-9_^"^<]+)/g,function(e,t,n){return e.substr(-1)==='"'||e.substr(-1)=="<"?e:t+'#'+n+""})},clean:function(e){return this.hash(this.at(this.link(e)))}}}(),g=function(e){if(e===d)return"";var t=e.text,n=0;if(e.entities){if(e.entities.urls&&e.entities.urls.length)for(n=0;n12&&(t-=12,r="PM"),n.length==1&&(n="0"+n),t+":"+n+" "+r},date:function(t){var n=e[t.getMonth()],r=t.getDate()+"",i=~~r,s=t.getFullYear(),o=(new Date).getFullYear(),u="th";return i%10==1&&r.substr(0,1)!="1"?u="st":i%10==2&&r.substr(0,1)!="1"?u="nd":i%10==3&&r.substr(0,1)!="1"&&(u="rd"),r.substr(0,1)=="0"&&(r=r.substr(1)),n+" "+r+u+(o!=s?", "+s:"")},shortdate:function(t){var n=t.split(" "),r=Date.parse(n[1]+" "+n[2]+", "+n[5]+" "+n[3]),i=new Date(r),s=e[i.getMonth()],o=i.getDate()+"",u=i.getFullYear(),a=(new Date).getFullYear();return a===u?o+" "+s:o+" "+s+(u+"").substr(2,2)},datetime:function(e){var t=e.split(" "),n=new Date(Date.parse(t[1]+" "+t[2]+", "+t[5]+" "+t[3]));return this.time(n)+" "+this.date(n)},relative:function(e){var t=e.split(" "),n=Date.parse(t[1]+" "+t[2]+", "+t[5]+" "+t[3]),r=new Date(n),i=arguments.length>1?arguments[1]:new Date,s=~~((i.getTime()-n)/1e3),o="";return s+=i.getTimezoneOffset()*60,s<=1?o="1 second ago":s<60?o=s+" seconds ago":s<120?o="1 minute ago":s<2700?o=~~(s/60)+" minutes ago":s<10800?o="1 hour ago":s<86400?o=~~(s/3600)+" hours ago":o=this.shortdate(e),o}}}(),b=function(){return{match:function(e,t,n){var r=0,i="",s=e.text.toLowerCase(),o=(!t.and||!t.and.length)&&(!t.or||!t.or.length);typeof t=="string"&&(t=this.format(t));if(t.not&&t.not.length){for(r=0;r Date: Fri, 21 Jun 2013 14:04:44 +0100 Subject: [PATCH 3/3] Remove commented out code and explainers. --- twitterlib.js | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/twitterlib.js b/twitterlib.js index fe333ce..f1f945f 100644 --- a/twitterlib.js +++ b/twitterlib.js @@ -573,30 +573,26 @@ // i.e. twitterlib.custom('dm', '/proxy.php?page=%page%&type=direct_messages'); // can now be called using twitterlib.dm('rem', function (t) { }); function custom(name, url, defaults) { - // This condition is commented out to allow overwriting of existing methods - if (url /*&& urls[name] == undefined*/) urls[name] = url; - // This if is removed so that customs can overwrite existing methods - // if (this[name] == undefined) { - this[name] = function (term, options, callback) { - // handle "termless" custom methods - if (typeof term == 'function') { - callback = term; - term = ''; - } else if (term.toString() == '[Object object]') { - callback = options; - options = term; - term = ''; - } - options = normaliseArgs(options, callback); - setLast(name, term, options); - // slight hack to support my own shortcuts - options[name] = options.user = term; - options.search = encodeURIComponent(term); - options = extend(defaults, options); - if (options.callback) load(getUrl(name, options), options, options.callback); - return this; - }; - // } + if (url) urls[name] = url; + this[name] = function (term, options, callback) { + // handle "termless" custom methods + if (typeof term == 'function') { + callback = term; + term = ''; + } else if (term.toString() == '[Object object]') { + callback = options; + options = term; + term = ''; + } + options = normaliseArgs(options, callback); + setLast(name, term, options); + // slight hack to support my own shortcuts + options[name] = options.user = term; + options.search = encodeURIComponent(term); + options = extend(defaults, options); + if (options.callback) load(getUrl(name, options), options, options.callback); + return this; + }; // makes my code nicer to read when setting up twitterlib object return this[name]; }