Voat Enhancement

A simple script to provide some basic enhancement for voat. Includes auto-pagination, info bar detachment, and extra embedding for comments.

目前為 2015-06-29 提交的版本,檢視 最新版本

// ==UserScript==
// @name        Voat Enhancement
// @namespace   septus.info
// @include		http://voat.co/*
// @include		http://*.voat.co/*
// @include		https://voat.co/*
// @include		https://*.voat.co/*
// @version     1.0.3
// @grant       none
// @description:en A simple script to provide some basic enhancement for voat. Includes auto-pagination, info bar detachment, and extra embedding for comments.
// @description A simple script to provide some basic enhancement for voat. Includes auto-pagination, info bar detachment, and extra embedding for comments.
// ==/UserScript==

var InitializeAutoPaginate = function(){
	var isFrontPage = false;
	var subvoat = "";
	var sorting = "";
	var urlHandled = false;

	var match = window.location.href.match(/^https?:\/\/[^\/]+(\/new)?\/?$/);
	if(!urlHandled && match != null){
		//console.log(match)
		isFrontPage= true;
		if(match[1]){
			sorting = match[1];
		}
		urlHandled = true;
	}
	
	match = window.location.href.match(/^https?:\/\/[^\/]+\/v\/([^\/]+)(\/new|\/top)?\/?$/);
	if(!urlHandled && match != null){
		subvoat = match[1];
		if(match[2]){
			sorting = match[2];
		}
		urlHandled = true;
	}
	
	if(!urlHandled){
		return;
	}
	
	var url = "";
	var currentPage = 0;
	var contentLoading = false;
	var morePages = true;
	var toolTipsterData = {
        content: "Loading user info...",
        contentAsHTML: "true",
        functionBefore: function(n, t) {
            t();
            n.data("ajax") !== "cached" && $.ajax({
                type: "GET",
                url: "/ajaxhelpers/userinfo/" + n.attr("data-username"),
                success: function(t) {
                    n.tooltipster("content", t).data("ajax", "cached")
                }
            })
        }
	};
	
	if(! ($("li.btn-whoaverse-paging > a[rel^='next']")[0])){
		morePages = false;
	}
	
	if(isFrontPage){
		url = "/"+sorting;
	}
	else{
		url = "/v/" + subvoat +"/" + sorting;
	}
	//console.log(url);
	$(document).on("scroll", function(event){
		var distanceToNewPage = $("div.pagination-container").offset().top - 
			(window.pageYOffset + $(window).height()) - 600;
		//console.log(distanceToNewPage);
		
		if(distanceToNewPage < 0 && !contentLoading && morePages){
			
			contentLoading = true;
			currentPage++;
			//console.log("Loading page " + currentPage);
			
			$.get( url, {page: currentPage} )
				.done(function( data ) {
					var loadedDocument = $(data);
					var loadedSubmissions = null;
					
					if(isFrontPage){
						loadedSubmissions = loadedDocument.find("div.sitetable > div.submission");
						var paginationContainer = $("div.pagination-container");
						for(var i = 0; i < loadedSubmissions.length; i++){
							paginationContainer.before(loadedSubmissions[i]);
							$(loadedSubmissions[i]).find(".userinfo").tooltipster(toolTipsterData);
						}
					}
					else{
						loadedSubmissions = loadedDocument.find("div.linklisting > div.submission");
						var linklisting = $("div.linklisting");
						for(var i = 0; i < loadedSubmissions.length; i++){
							linklisting.append(loadedSubmissions[i]);
							$(loadedSubmissions[i]).find(".userinfo").tooltipster(toolTipsterData);
						}
					}
					
					if(!loadedDocument.find("li.btn-whoaverse-paging > a[rel^='next']")[0]){
						morePages = false;
					}
					contentLoading = false;
				})
				.fail(function(error) {
					console.log( error );
				});
		}
	});
};

var SaveStyles = function(domObject, styleObject){
	for (var property in styleObject) {
		styleObject[property] = $(domObject).css(property);
	}
};

var InitializeDetachedInfoBar = function(){
	var infoBar = $("div#header-account > div:nth-child(1)");
	var infoBarTop = infoBar.offset().top;
	var infoBarRight = $(window).width() - (infoBar.offset().left + infoBar.width());
	var infoBarDetached = false;
	var detachedStyle = {"position": "fixed", "top": "0px", "right": "0px"};
	var originalStyle = {"position": "", "top": "", "right": ""};
	SaveStyles(infoBar, originalStyle);
	
	//console.log(originalStyle);
	var changingState = false;
	$(document).on("scroll", function(event){
		if(!changingState){
			if(!infoBarDetached && window.pageYOffset - infoBarTop > 0){
				changingState = true;
				var animateBeginStyle = jQuery.extend(true, {}, detachedStyle);
				animateBeginStyle["right"] = infoBarRight + "px";
				
				infoBar.css(animateBeginStyle);
				infoBar.animate(detachedStyle, 200, function(){
					infoBarDetached = true;
					changingState = false;
				});
				//console.log("Info bar detached");
			}
			else if(infoBarDetached && window.pageYOffset - infoBarTop <= 0){
				changingState = true;
				var animateEndStyle = jQuery.extend(true, {}, detachedStyle);
				animateEndStyle["right"] = infoBarRight + "px";
				//console.log(animateEndStyle);
				infoBar.animate(animateEndStyle, 200, function(){
					infoBar.css(originalStyle);
					infoBarDetached = false;
					changingState = false;
					//console.log("complete");
				});
			}
		}
		
	});
};

var InitializeLinkEmbedder = function(){
	var collapsedButtonStyle = {
		"background": "transparent url(\"/Graphics/Light-SpriteSheet.png\") repeat scroll 0px -44px"
	};
	var uncollapsedButtonStyle = {
		"background": "transparent url(\"/Graphics/Light-SpriteSheet.png\") repeat scroll 0px -60px"
	}
	
	var EmbedRules = [
		function(href){
			var result = {handled: false, embedHtml: ""};
			var match = null;
			
			match = href.match(/^https?:\/\/([^\.]*\.)?imgur\.com\/(gallery\/)?([a-zA-Z0-9]+)$/);
			if(match){
				result.handled = true;
				result.embedHtml = "<blockquote class=\"imgur-embed-pub\" lang=\"en\" data-id=\"a/"+ match[3] +"\"></blockquote><script async src=\"//s.imgur.com/min/embed.js\" charset=\"utf-8\"></script>";
			}
			
			return result;
		}
	]
	var links = $("div.commentarea div.usertext-body a");
	
	links.each(function(){
		for(var i = 0; i < EmbedRules.length; i++){
			var result = EmbedRules[i](this["href"]);
			if(result.handled == true){
				var embedDiv = $("<div class=\"embed-container\" style=\"display: block;\">" + result.embedHtml + "</div>");
				
				var button = $("<div></div>").css({
					"width": "16px",
					"height": "16px",
					"display": "inline-block"
				});
				button.css(collapsedButtonStyle);
				var buttonCollapsed = true;
				
				button.on("click", function(event){
					if(buttonCollapsed){
						buttonCollapsed = false;
						if(button.next().length == 0 || button.next()[0].tagName != 'DIV'){
							button.after(embedDiv);
						}
						else{
							button.next().css({"display": "block"});
						}
						button.css(uncollapsedButtonStyle);
						
					}
					else{
						buttonCollapsed = true;
						button.next().css({"display": "none"});
						button.css(collapsedButtonStyle);
					}
				});
				
				
				
				
				$(this).after(button);
				
				break;
			}
		}
	});
	
};

$(document).ready(function(){
	InitializeAutoPaginate();
	InitializeDetachedInfoBar();
	InitializeLinkEmbedder();
});