I've been working on a jQuery plugin for pulling tweets since the v1 endpoints were all closed off and you need oAuth now. This is just the jQuery part but if you want to see the php behind it I'll be happy to post. But basically, I'd love suggestions, as this is one of the first real plugins i've made, i'm really looking for critique on patterns and efficiency. Is there anything I'm doing that can be shorten'd significantly? Is there a feature you think would be cool for me to include?And just FYI, there is an oAuth/twitter library that authenticates everything first and pulls, and the php file my ajax call references holds the logic for all that and creating / serving the json, but it's not that exciting.I'm going to post the plugin with the documentation comments I have in there, to see if it all makes sense to people who have never seen it. All opinions and comments welcome, I want to write better code!/*************************************Invisible TweetsAuthor :    Shan RobertsonWebsite:    http://invisibled.comVersion:    1.0Updated:    August 7th, 2013Description:This plugin allows you to simply display Twitter timelines & lists on your website.It caches the twitter content in a json file & changing the cache name willallow you to have as many instances of Invisible Tweets as you want.Dependancies:  - jQuery  - invisibletweets.php (included)  - OAuth.php (included)  - twitteroauth.php (included)  - invisibletweets/cache folder (must be writable) Options:  user         : [string]   - The desired Twitter username.  slug         : [string]   - The slug to your Twitter list.  cache        : [string]   - The cache name, if dealing with multiple feeds.  path_to_core : [string]   - Path to the invisibletweets folder.  expire       : [string]   - Cache expire time, uses default PHP time syntax eg. 15 minutes, 10 seconds.Warning: If expire time is shorter than 15 minutes, you may hit the rate limit.    type         : [string]   - Choose what feed to display. Displaying a 'list' requires the 'slug' option to be set to your list's slug.    Options: 'timeline' or 'list'  template     : [string]   - Comma delimited string of what elements to show and in what order.    Options: 'name, avatar, date, time, text, btn_tweet, btn_retweet, btn_favorite'  limit        : [integer]  - Number of tweets to return.  retweets     : [boolean]  - Show retweets.Options: true/false  clear        : [boolean]  - Clears the cache.    Options: true/falseTO DO  - wordpress plugin version*************************************/;(function ( $, window, document, undefined ) {/*************************************Plugin Functions    *************************************/ /*************************************/Plugin.prototype.init = function () {    var params = [  '?user='     + this.options.user,                    '&limit='    + this.options.limit,                    '&type='     + this.options.type,                    '&slug='     + this.options.slug,                    '&cache='    + this.options.cache,                    '&expire='   + this.options.expire,                    '&clear='    + this.options.clear,                    '&retweets=' + this.options.retweets    ].join('\n');    $.ajax({        url: this.options.path_to_core + 'invisibletweets.php' + params,        context: this,        dataType: 'json',        success: function(data){            // If the errors object is returned, show the error and exit the script            if(data.errors){                $(this.element).html(Fatal Error:  + data.errors[0].message);                return false;            }            // Variables            var scope    = this;            var parent   = this.element;            var tpl      = ;            var tplArray = scope.options.template.replace(/[\s,]+/g, ',').split(',');            // Creates an empty template with all present data, in order.            $.each(tplArray, function(i, elm){                if(elm == 'name'){                    tpl = tpl + '<div class=it_name><a href= target=_blank></a></div>';                } else if(elm == 'avatar'){                    tpl = tpl + '<div class=it_avatar><a href= target=_blank><img src= /></a></div>';                } else if(elm == 'date'){                    tpl = tpl + '<div class=it_date></div>';                } else if(elm == 'time'){                    tpl = tpl + '<div class=it_time></div>';                } else if(elm == 'text'){                    tpl = tpl + '<div class=it_text><p></p></div>';                } else if(elm == 'btn_tweet'){                    tpl = tpl + '<a href=http://twitter.com/intent/tweet?in_reply_to= target=_blank class=it_btn_tweet>Tweet</a>';                } else if(elm == 'btn_retweet'){                    tpl = tpl + '<a href=http://twitter.com/intent/retweet?tweet_id= target=_blank class=it_btn_retweet>Retweet</a>';                } else if(elm == 'btn_favorite'){                    tpl = tpl + '<a href=http://twitter.com/intent/favorite?tweet_id= target=_blank class=it_btn_favorite>Favorite</a>';                }                               });            //Populates the template with data            $.each(data, function(i, item){                // Variables                var text        = scope.findLinks(item.text);                var date        = scope.dateTime(item.created_at, 'date');                var time        = scope.dateTime(item.created_at, 'time');                var profile_url = 'http://twitter.com/' + item.user.screen_name;                var thisTweet   = .it_tweet:eq(+i+) ;                // Creates a searchable object of the template                $(parent).append('<div class=it_tweet>' + tpl + '</div>');                //If in array, show, else don't show, for each item.                if(tplArray.indexOf('name') != -1){                    $(thisTweet + .it_name a).attr(href, profile_url).html(item.user.name);                }                if(tplArray.indexOf('avatar') != -1){                    $(thisTweet + .it_avatar).find('a').attr(href, profile_url).find('img').attr(src, item.user.profile_image_url);                }                if(tplArray.indexOf('date') != -1){                    $(thisTweet + .it_date).html(date);                }                if(tplArray.indexOf('time') != -1){                    $(thisTweet + .it_time).html(time);                }                if(tplArray.indexOf('text') != -1){                    $(thisTweet + .it_text p).html(text);                }                if(tplArray.indexOf('btn_tweet') != -1){                    $(thisTweet + .it_btn_tweet).attr(href, 'http://twitter.com/intent/tweet?in_reply_to=' + item.id);                }                if(tplArray.indexOf('btn_retweet') != -1){                    $(thisTweet + .it_btn_retweet).attr(href, 'http://twitter.com/intent/retweet?tweet_id=' + item.id);                }                if(tplArray.indexOf('btn_favorite') != -1){                    $(thisTweet + .it_btn_favorite).attr(href, 'http://twitter.com/intent/favorite?tweet_id=' + item.id);                }            }); //each        } //success    }); //ajax}; //init/*************************************/Plugin.prototype.findLinks = function(tweet){    var text = tweet;    text = text.replace(/http:\/\/\S+/g,  '<a href=$& target=_blank>$&</a>');    text = text.replace(/\s(@)(\w+)/g,    ' @<a href=http://twitter.com/$2 target=_blank>$2</a>');    text = text.replace(/\s(#)(\w+)/g,    ' #<a href=http://twitter.com/search?q=%23$2 target=_blank>$2</a>');    return text;}; //findLinks/*************************************/Plugin.prototype.dateTime = function(created_at, select){    var dateTime = created_at;    var strtime = dateTime.replace(/(\+\S+) (.*)/, '$2 $1')    var date = new Date(Date.parse(strtime)).toLocaleDateString();    var time = new Date(Date.parse(strtime)).toLocaleTimeString();    if(select == 'date'){        return date;    } else if(select == 'time'){        return time;    }}; //dateTime/*************************************Plugin Setup    *************************************/ var pluginName = 'invisibleTweets',// Options for the plugindefaults = {    user        : 'RobGronkowski',                                                          // Twitter username    limit       : 10,                                                                       // Number of tweets    type        : 'timeline',                                                               // Feed select, can be timeline/list    slug        : '',                                                                       // For lists    cache       : 'default',                                                                // The cache name if dealing with multiple feeds    expire      : '15 minutes',                                                             // The time it takes the cache to expire    clear       : false,                                                                    // Clears the cache.    retweets    : true,                                                                     // Show retweets    path_to_core: 'js/vendor/invisibletweets/',                                             // Path to the invisibletweets folder.    template    : 'name, avatar, date, time, text, btn_tweet, btn_retweet, btn_favorite'    // Elements to show and in what order};// The actual plugin constructorfunction Plugin( element, options ) {    this.element = element;    this.options = $.extend( {}, defaults, options);    this._defaults = defaults;    this._name = pluginName;    this.init();}// A really lightweight plugin wrapper around the constructor, preventing against multiple instantiations$.fn[pluginName] = function ( options ) {    return this.each(function () {        if (!$.data(this, 'plugin_' + pluginName)) {            $.data(this, 'plugin_' + pluginName,             new Plugin( this, options ));        }    });}})( jQuery, window, document );
Plugin for pulling Tweets
javascript;jquery;plugin;twitter