1
0
Fork 0
twitrssme/js/twitrssme.js

162 lines
5.6 KiB
JavaScript
Executable File

/*
(c) Copyright 2014 Charlie Harvey
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// TODO: memoize here
function tweetsFor(user,jQueryElem,fn,asHTML,handler) {
var yql = "http://query.yahooapis.com/v1/public/yql?q=SELECT%20*%20FROM%20html%20WHERE%20url%3D%22https%3A%2F%2Ftwitter.com%2F"
+ user
+ "%22%20AND%20xpath%3D%22%2F%2Fdiv%5Bcontains(%40class%2C'js-stream-item')%5D%22&format=json"
$.ajax({ type: 'GET'
, url: yql
, dataType: 'jsonp'
, success: function(data, textStatus) {
if(null==data.query.results) {
alert("Couldn't retrieve anything for " + user);
return;
}
tweets = extractTweets(data.query.results,5);
if(asHTML)
jQueryElem.html(fn(user,tweets));
else
jQueryElem.text(fn(user,tweets));
}
, failure: function(status,err){ alert("Problems running query" + err); }
, complete: function() {
if(handler)
handler(jQueryElem)
}
});
}
function showFeed(jQueryElem) {
rss = encodeURIComponent(jQueryElem.text());
window.location.assign('data:text/xml,'+rss);
}
function makeHTML(user,tweets) {
html = "<h2>Twitter feed for "
+ user
+ "</h2>\n"
+ "<ul>";
for (i=0;i<tweets.length;i++) {
t=tweets[i];
html += "\n\t<li>\n\t\t<blockquote>"
+ t.tweetHTML
+ "</blockquote>\n\t\t<p>Posted: "
+ t.tweetDate
+ ' by <a href="'
+ t.authorTwitterURL
+ '">'
+ t.authorTwitterName
+ ' ('
+ t.authorFullName
+ ')</a> | <a href="'
+ t.tweetURL
+ '">Original Tweet</a>\n\t</li>\n'
}
return html + "</ul>"
}
function makeRSS (user,tweets) {
rss = '<?xml version="1.0" encoding="UTF-8"?>'
+ "\n"
+ '<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss" xmlns:twitter="http://api.twitter.com" version="2.0">'
+ "\n"
+ "<channel>\n\t<title>Twitter Search / "
+ user
+ "</title>\n\t<link>http://twitter.com/"
+ user
+ "</link>\n\t<description>Twitter feed for: "
+ user
+ ". Generated by TwitRSS.me/JS</description>\n\t<language>en-us</language>\n\t<ttl>40</ttl>\n\n";
for (i=0;i<tweets.length;i++) {
t=tweets[i];
rss += "<item>\n\t<title><![CDATA["
+ t.authorTwitterName
+ ' '
+ t.tweetHTML
+ "]]></title>\n\t<description><![CDATA["
+ t.tweetHTML
+ "]]></description>\n\t<pubDate>"
+ t.tweetDate
+ "</pubDate>\n\t<guid>"
+ t.tweetURL
+ "</guid>\n\t<link>"
+ t.tweetURL
+ "</link>\n\t<twitter:source />\n\t<twitter:place />\n</item>\n";
}
rss += "</channel>\n</rss>";
return rss;
}
function extractTweets (tweets, max) {
toReturn = [];
for(i=0;i<max;i++) {
if(tweets.div[i]) {
tweet=tweets.div[i].div;
header = tweet.div[0];
body = tweet.div[1];
if(header.div.a) { // we have a normal tweet
metadiv = header.div;
rt = 0;
}
else { // Its a RT
metadiv = header.div[1];
rt = 1;
}
authorFullName = metadiv.a.span.strong.content;
authorTwitterName = '@' + metadiv.a.span.span.content.replace(/\s+/,'');
authorTwitterURL = "https://twitter.com" + metadiv.a.href;
tweetURL = "https://twitter.com" + metadiv.span[1].a.href;
tweetDate = metadiv.span[1].a.title;
tweetHTML = body.p.content;
tweetAs = body.p.a;
tweetImg = "";
if(body.div[0] && body.div[0].class.indexOf("js-tweet-details-fixer")>-1) {
tweetImg = body.div[0].div.div.div.a.img;
}
if(tweetImg) {
tweetHTML = tweetHTML + '<br /><img src="'+tweetImg.src+'" />';
}
if(tweetAs) {
for(j=0;j<tweetAs.length;j++) {
link = '<a href="#">UNDEFINED LINK TYPE!</a> ';
if(tweetAs[j].class=="twitter-timeline-link") {
link = '<a href="'+tweetAs[j].title+'">'+tweetAs[j].title+'</a> ';
}
else if (tweetAs[j].class.indexOf('twitter-hashtag')>-1){
link = '<a href="https://twitter.com/'+tweetAs[j].href+'">#'+tweetAs[j].strong+'</a> ';
}
else if (tweetAs[j].class.indexOf('twitter-atreply')>-1){
link = '<a href="https://twitter.com'+tweetAs[j].href+'">@'+tweetAs[j].strong+'</a> ';
}
tweetHTML = tweetHTML.replace(/\n\s*/,link);
}
}
toReturn[i] = {
'authorFullName' : authorFullName
, 'authorTwitterName' : authorTwitterName
, 'authorTwitterURL' : authorTwitterURL
, 'tweetURL' : tweetURL
, 'tweetDate' : tweetDate
, 'tweetHTML' : tweetHTML
, 'tweetAs' : tweetAs
, 'tweetImg' : tweetImg
}
} // if
} //for
return toReturn;
}