您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A simple script to provide some basic enhancement for voat. Includes auto-pagination, info bar detachment, and extra embedding for comments.
当前为
// ==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(); });