@ -1,43 +1,5 @@
// JSON-P Twitter fetcher for Octopress
// (c) Brandon Mathis // MIT Lisence
function getTwitterFeed ( user , count , replies ) {
var feed = new jXHR ( ) ;
feed . onerror = function ( msg , url ) {
$ ( '#tweets li.loading' ) . addClass ( 'error' ) . text ( "Twitter's busted" ) ;
}
feed . onreadystatechange = function ( data ) {
if ( feed . readyState === 4 ) {
var tweets = new Array ( ) ;
var i = 0 ;
for ( i in data ) {
if ( tweets . length < count ) {
if ( replies || data [ i ] . in _reply _to _user _id == null ) {
tweets . push ( data [ i ] ) ;
}
}
}
showTwitterFeed ( tweets , user ) ;
}
} ;
feed . open ( "GET" , "http://twitter.com/statuses/user_timeline/" + user + ".json?trim_user=true&count=" + ( parseInt ( count ) + 60 ) + "&callback=?" ) ;
feed . send ( ) ;
}
function showTwitterFeed ( tweets , twitter _user ) {
var timeline = document . getElementById ( 'tweets' ) ;
timeline . innerHTML = '' ;
for ( t in tweets ) {
timeline . innerHTML += '<li>' + '<p>' + '<a href="http://twitter.com/' + twitter _user + '/status/' + tweets [ t ] . id _str + '">' + prettyDate ( tweets [ t ] . created _at ) + '</a>' + linkifyTweet ( tweets [ t ] . text . replace ( /\n/g , '<br>' ) ) + '</p>' + '</li>' ;
}
}
function linkifyTweet ( text ) {
return text . replace ( /(https?:\/\/)([\w\-:;?&=+.%#\/]+)/gi , '<a href="$1$2">$2</a>' )
. replace ( /(^|\W)@(\w+)/g , '$1<a href="http://twitter.com/$2">@$2</a>' )
. replace ( /(^|\W)#(\w+)/g , '$1<a href="http://search.twitter.com/search?q=%23$2">#$2</a>' ) ;
}
// jXHR.js (JSON-P XHR) | v0.1 (c) Kyle Simpson | MIT License | http://mulletxhr.com/
// uncompressed version available in source/javascripts/libs/jXHR.js
@ -45,38 +7,71 @@ function linkifyTweet(text){
/* Sky Slavin, Ludopoli. MIT license. * based on JavaScript Pretty Date * Copyright (c) 2008 John Resig (jquery.com) * Licensed under the MIT license. */
function prettyDate ( time ) {
if ( navigator . appName == 'Microsoft Internet Explorer' ) {
if ( navigator . appName == = 'Microsoft Internet Explorer' ) {
return "<span>∞</span>" ; // because IE date parsing isn't fun.
} ;
}
var say = { } ;
say . just _now = " now" ,
say . minute _ago = "1m" ,
say . minutes _ago = "m" ,
say . hour _ago = "1h" ,
say . hours _ago = "h" ,
say . yesterday = "1d" ,
say . days _ago = "d" ,
say . weeks _ago = "w"
var say = {
just _now : " now" ,
minute _ago : "1m" ,
minutes _ago : "m" ,
hour _ago : "1h" ,
hours _ago : "h" ,
yesterday : "1d" ,
days _ago : "d" ,
weeks _ago : "w"
} ;
var current _date = new Date ( ) ;
current _date _time = current _date . getTime ( ) ;
current _date _full = current _date _time + ( 1 * 60000 ) ;
var date = new Date ( time ) ;
var diff = ( ( current _date _full - date . getTime ( ) ) / 1000 ) ;
var day _diff = Math . floor ( diff / 86400 ) ;
var current _date = new Date ( ) ,
current _date _time = current _date . getTime ( ) ,
current _date _full = current _date _time + ( 1 * 60000 ) ,
date = new Date ( time ) ,
diff = ( ( current _date _full - date . getTime ( ) ) / 1000 ) ,
day _diff = Math . floor ( diff / 86400 ) ;
if ( isNaN ( day _diff ) || day _diff < 0 ) return "<span>∞</span>" ;
if ( isNaN ( day _diff ) || day _diff < 0 ) { return "<span>∞</span>" ; }
return day _diff == 0 && (
return day _diff == = 0 && (
diff < 60 && say . just _now ||
diff < 120 && say . minute _ago ||
diff < 3600 && Math . floor ( diff / 60 ) + say . minutes _ago ||
diff < 7200 && say . hour _ago ||
diff < 86400 && Math . floor ( diff / 3600 ) + say . hours _ago ) ||
day _diff == 1 && say . yesterday ||
day _diff == = 1 && say . yesterday ||
day _diff < 7 && day _diff + say . days _ago ||
day _diff > 7 && Math . ceil ( day _diff / 7 ) + say . weeks _ago ;
}
function linkifyTweet ( text , url ) {
for ( var u in url ) {
var shortUrl = new RegExp ( url [ u ] . url , 'g' ) ;
text = text . replace ( shortUrl , '<a href="' + url [ u ] . expanded _url + '">' + url [ u ] . expanded _url . replace ( /https?:\/\// , '' ) + '</a>' ) ;
}
return text . replace ( /(^|\W)@(\w+)/g , '$1<a href="http://twitter.com/$2">@$2</a>' )
. replace ( /(^|\W)#(\w+)/g , '$1<a href="http://search.twitter.com/search?q=%23$2">#$2</a>' ) ;
}
function showTwitterFeed ( tweets , twitter _user ) {
var timeline = document . getElementById ( 'tweets' ) ,
content = '' ;
for ( var t in tweets ) {
content += '<li>' + '<p>' + '<a href="http://twitter.com/' + twitter _user + '/status/' + tweets [ t ] . id _str + '">' + prettyDate ( tweets [ t ] . created _at ) + '</a>' + linkifyTweet ( tweets [ t ] . text . replace ( /\n/g , '<br>' ) , tweets [ t ] . entities . urls ) + '</p>' + '</li>' ;
}
timeline . innerHTML = content ;
}
function getTwitterFeed ( user , count , replies ) {
var feed = new jXHR ( ) ;
feed . onerror = function ( msg , url ) {
$ ( '#tweets li.loading' ) . addClass ( 'error' ) . text ( "Twitter's busted" ) ;
} ;
feed . onreadystatechange = function ( data ) {
if ( feed . readyState === 4 ) { showTwitterFeed ( data , user ) ; }
} ;
// Documentation: https://dev.twitter.com/docs/api/1/get/statuses/user_timeline
feed . open ( "GET" , "http://api.twitter.com/1/statuses/user_timeline/" + user + ".json?trim_user=true&count=" + ( parseInt ( count , 10 ) ) + "&include_entities=1&exclude_replies=" + ( replies ? "0" : "1" ) + "&callback=?" ) ;
feed . send ( ) ;
}