New Twitter Minimaliser

By Si Dawson Last update Feb 15, 2012 — Installed 1,913 times.

There are 10 previous versions of this script.

// ==UserScript==
// @name           New Twitter Minimaliser
// @namespace   http://www.userscripts.org/users/sidawson
// @author         sidawson
// @description   New Twitter minus the visual noise. By @sidawson
// @include        http://twitter.com/*
// @include        https://twitter.com/*
// ==/UserScript==

// Adapted from "Old New Twitter" by yauhui

// This software is licensed under the Creative Commons
// Attribution-ShareAlike 3.0 Unported License.
// You are free to download, distribute, copy and/or modify
// this software under the same license.
// 
// The above copyright notice and this permission notice
// shall be included in all copies of the software.

document.getElementsByClassName = function(clsName){
    var retVal = new Array();
    var elements = document.getElementsByTagName("*");
    for(var i = 0;i < elements.length;i++){
        if(elements[i].className.indexOf(" ") >= 0){
            var classes = elements[i].className.split(" ");
            for(var j = 0;j < classes.length;j++){
                if(classes[j] == clsName)
                    retVal.push(elements[i]);
            }
        }
        else if(elements[i].className == clsName)
            retVal.push(elements[i]);
    }
    return retVal;
};

function addCss(cssCode) {
var styleElement = document.createElement("style");
  styleElement.type = "text/css";
  if (styleElement.styleSheet) {
    styleElement.styleSheet.cssText = cssCode;
  } else {
    styleElement.appendChild(document.createTextNode(cssCode));
  }
  document.getElementsByTagName("head")[0].appendChild(styleElement);
}
function replaceCssOld(){
  addCss(".wtf-inner, #recommended_users {display:none !important;}");
  addCss(".your-activity{width:100% !important;}");
  addCss(".dashboard{width:180px !important;min-width:180px !important;}");
  addCss(".main-content{width:650px !important;}");
  addCss(".dashboard div.component{width:210px !important;}");
  // good settings for normal windows (but bad for DM)
  addCss(".pane-toolbar{width:295px !important;}");
  addCss(".pane-components{width:315px !important;}");
  // this overrides the default setting, so DMs are a good width
  addCss(".messages-container div.pane-toolbar{width:490px !important;}");
  addCss(".messages-container div.pane-components{width:510px !important;}");
  
  addCss(".tweet-components{width:295px !important;}");
  addCss(".conversation{width:295px !important;}");
  addCss(".messages-pane{width:465px;padding-right:5px !important;}");
  addCss(".message{padding-right:0 !important;}");
  addCss(".message-content{margin-right:0 !important;}");
  addCss(".details-pane {min-width:340px !important;}");
  addCss(".details-pane .tweet{padding:10px 5px 10px 20px !important;}");
  addCss(".tweet-box textarea{max-width:600px !important;}");
  addCss(".twitter-anywhere-tweet-box-editor{width:592px !important;}");
  addCss(".send-message-box .twitter-anywhere-tweet-box-editor{width:450px !important;}");
  addCss(".twttr-dialog{width:auto !important;}");
  addCss(".messages-main-content{width:400px !important;}");
  addCss(".invite-friends-component{display:none !important;}");
  addCss(".invite-friends-component + hr {display:none !important;}");
  addCss(".trends-inner{display:none !important;}");
  addCss(".trends-inner + hr {display:none !important;}");
  addCss(".user-rec-inner{display:none !important;}");
  addCss(".user-rec-inner + hr {display:none !important;}");
  addCss(".definition{display:none !important;}");
  addCss(".definition + hr {display:none !important;}");
  addCss(".dashboard-activity-teaser-inner{display:none !important;}");
  addCss(".dashboard-activity-teaser-inner + hr {display:none !important;}");
  console.log('replace old');
};

function replaceCssNew() {
  console.log('replacing css, new version');
  addCss(".trends {display:none !important;}");
  
  // blanking the headers is considerably uglier, since they don't have a sensible unique identifier
  console.log('adding js-recommended-followers-header class');
  console.log('existing class len: ' + document.getElementsByClassName("js-recommended-followers").length);
  console.log('trends-inner (KNOWN!) class len: ' + document.getElementsByClassName("trends-inner").length);
  // just so it doesn't break if our find function returns nothing
  if (document.getElementsByClassName('js-recommended-followers').length != 0) {
    console.log('existing class className: ' + document.getElementsByClassName('js-recommended-followers')[0].className);
    console.log('existing class parentNode: ' + document.getElementsByClassName('js-recommended-followers')[0].parentNode);
    console.log('existing class parentNode.className: ' + document.getElementsByClassName('js-recommended-followers')[0].parentNode.className);
    document.getElementsByClassName('js-recommended-followers')[0].parentNode.className += ' js-recommended-followers-header';
    console.log('new class: ' + document.getElementsByClassName('js-recommended-followers flex-module-inner')[0].parentNode.className);
    addCss(".js-recommended-followers-header{display:none !important;}");
  }
  addCss(".js-recommended-followers{display:none !important;}");
 
  addCss(".component {visibility:hidden;}");
  addCss(".module {visibility:hidden;}");
  addCss(".mini-profile {display:block !important; visibility:visible !important;}");
  addCss(".connect-nav {display:block !important;visibility:visible !important;}");
  //addCss(".js-sidenav-link {visibility:hidden;}");
  addCss(".js-actionable-user {visibility:hidden;}");
  addCss(".profile-tweet-box {display:block !important;visibility:visible !important;}");
  addCss(".profile-nav {display:block !important; visibility:visible !important;}");
  addCss(".profile-card {display:block !important; visibility:visible !important;}");
  addCss(".site-footer {display:block !important; visibility:visible !important;}");
  if (document.getElementsByClassName('site-footer').length != 0) {
  	console.log("site footer found");
  }
  var len = document.getElementsByClassName('component').length;
  if (len != 0) {
  	console.log("found " + len  + " components");
  	var obj = document.getElementsByClassName('component')[len-1];
  	var typename = obj.getAttribute('data-component-term');
  	console.log(typename + ' type found');
  	console.log(obj);
  }
  js-recommended-followers
};

var isNew = false;
if (document.getElementsByClassName('wtf-inner').length == 1) {
  replaceCssOld();
} else {
  isNew = true;
  replaceCssNew();
};

//
// Retweet
//

!(function() {
// click
var rt_click = function(text) {
	return function (e) {
		if (document.getElementsByClassName('twitter-anywhere-tweet-box-editor').length == 1) {
			var status = document.getElementsByClassName('twitter-anywhere-tweet-box-editor')[0];
			status.value = text;
			status.focus();
			status.setSelectionRange(0, 0);
			scrollTo(0,0);
		} else {
			document.location.href = 'http://twitter.com/?status=' + encodeURIComponent(text);
		}
	};
};

// make retweet action
var make_retweet_action = function(entry) {
	if (entry.getElementsByClassName('old-style-retweet').length == 1) {
		return;
	}
	
	// screen name
	var screen_name;
	if (entry.getElementsByClassName('stream-item-content tweet stream-tweet').length == 1) {
		screen_name = entry.getElementsByClassName('stream-item-content tweet stream-tweet ')[0].getAttribute('data-screen-name');
	} else {
		return;
	}
	
	// tweet text
	var tt;
	if (entry.getElementsByClassName('tweet-text').length == 1) {
		tt = entry.getElementsByClassName('tweet-text')[0];
	} else {
		return;
	}
	
	// RT text
	var content = tt.innerHTML.replace(/<\/?[^>]+>/g, '').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&');	
	var rt_text = 'RT @' + screen_name + ' ' + content;
	
	// make action
	// img tag
	var img = document.createElement('img');
	img.setAttribute('style' , 'margin-left:3px;margin-right:2px;');
    img.setAttribute('src' , 
'data:image/png;base64,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');
	
	// b tag
	var b = document.createElement('b');
	b.appendChild(document.createTextNode('RT (old style)'));
	
	// span tag
	var span = document.createElement('span');
	span.appendChild(img);
	span.appendChild(b);
	
	// a tag
	var a = document.createElement('a');
	a.setAttribute('class' , 'old-style-retweet');
	a.setAttribute('href' , '#');
	a.addEventListener('click', rt_click(rt_text) , false);
	a.appendChild(span);
	a.addEventListener('mouseover' , function() {i.style.backgroundPosition = '-16px 0'; } , false);
	a.addEventListener('mouseout' , function() {i.style.backgroundPosition = '0 0'; } , false);
	
	// add action
	entry.getElementsByClassName('tweet-actions')[0].appendChild(a);
};


// make all retweet actions
var make_all  = function() {
	var si = document.getElementsByClassName('stream-item');
	var si_length = si.length;
	for (var i = 0; i < si_length ; i++) {
		make_retweet_action(si[i]);
	}
};


// DOM node inserted event
document.addEventListener('DOMNodeInserted', function(event) {
	var elmt = event.target;
	if (/stream-item/.test(elmt.getAttribute('class'))) {
		make_retweet_action(elmt);
	}
}, false);

// make all retweet actions
make_all();
})();