NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Fix Twitter links
// @namespace https://github.com/lucio-martinez/fix-twitter-links/
// @description Fix Twitter timeline links bypassing the horrible shortener system
// @version 2
// @grant none
// @require https://raw.githubusercontent.com/jquery/jquery/2.1.1/dist/jquery.min.js
// @include https://twitter.com/*
// @include https://tweetdeck.twitter.com/*
// ==/UserScript==
var seconds = 2,
interval = seconds * 1000,
domain = window.location.hostname,
callback;
// Solve jQuery conflicts (http://wiki.greasespot.net/@grant)
this.$ = this.jQuery = jQuery.noConflict(true);
/**
* Set a new href value into a HTML <a> element.
*/
function setUrlToLink(aElement, targetUrl) {
$( aElement ).attr('href', targetUrl);
// Set a flag to avoid processing it again later
$( aElement ).attr('data-link-fixed', 1);
//console.log('URL parsed! :D', targetUrl);
}
/**
* Fix links for the twitter.com webite.
*/
function fixLinks() {
// Catch only text links, not pictures and other stuff
var links = $( '.twitter-timeline-link[data-link-fixed!=1]:not(.media, .u-hidden)' );
$( links ).each(function(){
setUrlToLink(this, this.dataset.expandedUrl);
});
}
/**
* Fix links for the tweetdeck.twitter.com website.
*/
function fixTweetDeckLinks() {
// Catch visible links from tweets, quoted tweets and tweets in detail
var selector = ('.tweet-text > .url-ext[data-link-fixed!=1]:not(.is-vishidden), '
+'.quoted-tweet .url-ext[data-link-fixed!=1], '
+'.tweet-detail .url-ext[data-link-fixed!=1]'),
links = $( selector );
$( links ).each(function(){
setUrlToLink(this, this.dataset.fullUrl);
});
}
// Check whether user is on TweetDeck or Twitter website
callback = (domain === 'tweetdeck.twitter.com') ? fixTweetDeckLinks : fixLinks;
// Run, run, run!
setInterval(callback, interval);