1/* 2 UPDATED TO AUTHENTICATE FOR API 1.1 3 This jQuery Twitter Feed is a modification of 4 - http://www.webdevdoor.com/jquery/twitter-feed-authentication-search/ 5 - https://twitter.com/javascripts/blogger.js 6 7 // - updated on 2013/07/11: Added 'listHTML' and 'itemHTML' variables 8 // - updated on 2013/08/15: Added Support for variables in loadingHTML and listHTML 9*/ 10 11;(function($){ 12 13 // REPLACE VARIABLES 14 function replace_variables( text, vars ) { 15 var variable, regex; 16 for( variable in vars ) { 17 regex = new RegExp( '{'+ variable +'}', 'ig' ); 18 text = text.replace( regex, vars[variable] ); 19 console.log( variable+': '+vars[variable] ); 20 } 21 return text; 22 } 23 24 25 // GET RELATIVE TIME 26 function relative_time( time_value ) { 27 28 var values = time_value.split(" "); 29 time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3]; 30 var parsed_date = Date.parse( time_value ); 31 var relative_to = ( arguments.length > 1 ) ? arguments[1] : new Date(); 32 var delta = parseInt( (relative_to.getTime() - parsed_date) / 1000 ); 33 var shortdate = time_value.substr( 4, 2 ) + " " + time_value.substr( 0, 3 ); 34 delta = delta + ( relative_to.getTimezoneOffset() * 60 ); 35 36 if( delta < 60 ) { 37 return '1m'; 38 } else if( delta < 120 ) { 39 return '1m'; 40 } else if( delta < (60*60) ) { 41 return ( parseInt( delta / 60 ) ).toString() + 'm'; 42 } else if( delta < (120*60) ) { 43 return '1h'; 44 } else if( delta < (24*60*60) ) { 45 return ( parseInt( delta / 3600 ) ).toString() + 'h'; 46 } else if( delta < (48*60*60) ) { 47 //return '1 day'; 48 return shortdate; 49 } else { 50 return shortdate; 51 } 52 } 53 54 55 // ADD LINKS (Function modified from Stack Overflow) 56 function addlinks( data ) { 57 58 // Add link to all http:// links within tweets 59 data = data.replace(/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, function( url ) { 60 return '<a href="'+url+'">'+url+'</a>'; 61 }); 62 63 //Add link to @usernames used within tweets 64 data = data.replace(/\B@([_a-z0-9]+)/ig, function( reply ) { 65 return '<a href="http://twitter.com/'+reply.substring(1)+'">'+reply.charAt(0)+reply.substring(1)+'</a>'; 66 }); 67 68 // Return data 69 return data; 70 } 71 72 73 // JQUERY TWITTER FEED 74 $.fn.twitterFeed = function( options ) { 75 76 // Create Settings Object 77 var defaults = { 78 displaylimit : 3, 79 twitterprofile : '', 80 screenname : '', 81 showdirecttweets : false, 82 showretweets : true, 83 showtweetlinks : true, 84 headerHTML : '<h3><a href="{twitterprofile_link}">{screenname}</a></h3>', 85 loadingHTML : 'loading...', 86 listHTML: '<ul>{items}</ul>', 87 itemHTML: ['<li>', 88 '<div>', 89 '<a href="{twitterprofile_link}">', 90 '<img src="{profilepic}">', 91 '<strong>{screenname}</strong> @{twitterprofile}</a>', 92 '</div>', 93 '<div>', 94 '<a href="{tweet_link}">{relativetime}</a> ', 95 '{status}', 96 '</div>', 97 '</li>'].join('\n'), // since js doesn't allow multi-line strings, we use the join('\n') function to convert an array of strings into a single one 98 callback: function(){} // you can pass a function to be executed after the feed finishes loading 99 }; 100 var settings = $.extend( {}, defaults, options ); 101 var template_vars = { 102 screenname: settings.screenname, 103 twitterprofile: settings.twitterprofile, 104 twitterprofile_link: 'http://twitter.com/'+settings.twitterprofile 105 }; 106 107 // Override Settings 108 settings.headerHTML = replace_variables( settings.headerHTML, template_vars ); 109 settings.loadingHTML = replace_variables( settings.loadingHTML, template_vars ); 110 settings.listHTML = replace_variables( settings.listHTML, template_vars ); 111 settings.feedURL = 'https://twitter.vodo.bz/get-tweets.php?u='+settings.twitterprofile; 112 113 // Validate Required Data 114 if( !settings.twitterprofile ) { 115 $.error( '"twitterprofile" is required' ); 116 } 117 118 // Run Script 119 return this.each(function(){ 120 console.log( settings.itemHTML ); 121 var Container = $(this); 122 var outputHTML = settings.headerHTML; 123 var itemsHTML = ''; 124 var thisItem = ''; 125 var displayCounter = 1; 126 var i = 0; 127 128 // Output Preloading Text 129 Container.html( settings.headerHTML + settings.loadingHTML ); 130 131 $.getJSON( settings.feedURL, function( Feeds ) { 132 133 for( ; i<Feeds.length; i++ ) { 134 135 var Feed = Feeds[i];
136 var tweet_screen_name = Feed.user.name; 137 var tweet_username = Feed.user.screen_name; 138 var profile_image = Feed.user.profile_image_url_https; 139 var status = Feed.text; 140 var is_a_retweet = false; 141 var is_direct = false; 142 var tweet_id = Feed.id_str; 143 144 // If its a Retweet 145 if( typeof Feed.retweeted_status != 'undefined' ) { 146 profile_image = Feed.retweeted_status.user.profile_image_url_https; 147 tweet_screen_name = Feed.retweeted_status.user.name; 148 tweet_username = Feed.retweeted_status.user.screen_name; 149 tweet_id = Feed.retweeted_status.id_str; 150 is_a_retweet = true; 151 }; 152 153 // If its a Direct Message 154 if( status.substr(0,1) == "@" ) { 155 is_direct = true; 156 } 157 158 // Exit if tweet is not relevant 159 if( 160 ( is_a_retweet && !settings.showretweets ) || 161 ( is_direct && !settings.showdirecttweets ) || 162 status.length <= 1 || 163 displayCounter > settings.displaylimit 164 ) { 165 continue; 166 } 167 168 // Add Links to Text 169 if( settings.showtweetlinks ) { 170 status = addlinks( status ); 171 } 172 173 // Replace Variables 174 var tweet_template_vars = { 175 screenname: tweet_screen_name, 176 twitterprofile: tweet_username, 177 profilepic: profile_image, 178 tweetid: tweet_id, 179 relativetime: relative_time( Feed.created_at ), 180 status: status, 181 twitterprofile_link: 'http://twitter.com/'+tweet_username, 182 tweet_link: 'http://twitter.com/'+tweet_username+'/status/'+tweet_id 183 } 184 thisItem = replace_variables( settings.itemHTML, tweet_template_vars ); 185 186 // Update Data 187 itemsHTML += thisItem; 188 displayCounter++; 189 } 190 191 // Replace Variables 192 outputHTML += settings.listHTML.replace( /{items}/i, itemsHTML ); 193 Container.html( outputHTML ); 194 195 if( typeof settings.callback == 'function' ) { 196 settings.callback(); 197 } 198 }); 199 }); 200 } 201})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.