Tumblr Overquote Trimmer

Hides excessive nested quotes that keep breaking your dashboard.

// ==UserScript==
// @name	Tumblr Overquote Trimmer
// @namespace	the.vindicar.scripts
// @description	Hides excessive nested quotes that keep breaking your dashboard.
// @version	1.1.0
// @include	http://www.tumblr.com/dashboard
// @include	http://www.tumblr.com/dashboard/*
// @include	http://www.tumblr.com/show/*
// @include	http://www.tumblr.com/blog/*
// @include	https://www.tumblr.com/dashboard
// @include	https://www.tumblr.com/dashboard/*
// @include	https://www.tumblr.com/show/*
// @include	https://www.tumblr.com/blog/*
// @grant	unsafeWindow
// ==/UserScript==

(function(){
if ((typeof unsafeWindow.Tumblr === 'undefined') || (typeof unsafeWindow.jQuery === 'undefined'))
	return;
function RunInPage(func) {
	var s = document.createElement("script"); 
	s.textContent = "(" + func + ")();"; 
	document.body.appendChild(s);
	setTimeout(function(){document.body.removeChild(s)}, 0);
}

RunInPage(function(){
	//how many levels of quotes should be shown by default
	var QUOTESALLOWED = 3;
	//placeholder for hidden quotes
	var PLACEHOLDER = 
		'<div class="quotes_placeholder"><blockquote>%QUOTES% more quote(s). '+
		'<i>Click here</i>'+
		' to show.</blockquote></div>';

	var $ = jQuery;

	$('#posts').on('click','.quotes_placeholder i',function(event){
		event.preventDefault();
		jQuery(this).closest('.quotes_placeholder').next().show().prev().remove();
		});

	function processPosts() {
		if (QUOTESALLOWED < 0) return;
		//we should only process unmarked posts.
		$('#posts').find('li .post:not(#new_post):not([data-quotes-trimmed])').each(function(){
			var $this = $(this);
			//mark the post as processed.
			$this.attr('data-quotes-trimmed','');
			//let's find quotes...
			var $quotes = $this.find("blockquote").filter(function(){
				//that are nested at specific depth
				return $(this).parentsUntil('.post','blockquote').length==QUOTESALLOWED;
				});
			$quotes.each(function(){
				var $this = $(this);
				//insert placeholder before each quote
				var $placeholder = $(PLACEHOLDER.replace('%QUOTES%',$this.find('blockquote').length+1));
				$this.before($placeholder);
				//and hide the quote itself
				$this.hide();
				});
			});
		}

	//process posts that are loaded already
	processPosts(); 
	//and ensure we are notified whenever new portion of posts is loaded
	AfterAutoPaginationQueue.push(processPosts);
	});
})();