您需要先安装一个扩展,例如 篡改猴、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.5 // @grant GM_getValue // @grant GM_setValue // @require https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js // @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 PostProcessSubmissions = function(submissions){ /* 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"); } }); } }; for(var i = 0; i < submissions.length; i++){ $(submissions[i]).find(".userinfo").tooltipster(toolTipsterData); } */ }; function Plugin_UserTag(framework){ var _this = this; var defaults = { tags: { pathogenxd: "VES Creator" } } if(GM_getValue('Plugin_UserTag') === null){ GM_setValue('Plugin_UserTag', JSON.stringify(defaults)); } this.settings = JSON.parse(GM_getValue('Plugin_UserTag')); //console.log(this.settings); $(document).on("comments-loaded", function(event){ for(var i = 0; i < event.comments.length; i++){ var username = $($(event.comments[i]).find("p.tagline a.author")[0]).text().toLowerCase(); //console.log(username); if(_this.settings.tags[username] !== undefined) { var userattrsElement = $(event.comments[i]).find("p.tagline span.userattrs")[0]; $(userattrsElement).after(" <span style='color: blue;'>" + _this.settings.tags[username] + "</span>"); } var buttons = $(event.comments[i]).find("ul.buttons")[0]; var button = $('<li><a>tag user</a></li>').on('click', function(event){ var usernameToTag = $(event.currentTarget).attr('data-username'); var newTag = prompt('Custom tag for '+usernameToTag); if(newTag !== null){ _this.settings.tags[usernameToTag] = newTag; GM_setValue('Plugin_UserTag', JSON.stringify(_this.settings)); } }); button.attr('data-username', username); //console.log(button); $(buttons).append(button); } }); } function Plugin_AutoPaginate(framework){ this.framework = framework; this.currentPage = framework.page.currentPage; this.contentLoading = false; this.morePages = true; this.postIdLoaded = {}; var _this = this; if(this.framework.page.type === "subverse"){ this.HandleSubverse(); } } Plugin_AutoPaginate.prototype.HandleSubverse = function(){ var _this = this; if(! ($("li.btn-whoaverse-paging > a[rel^='next']")[0])){ this.morePages = false; } //console.log(this.morePages); var url = ""; if(this.framework.page.subverse === ""){ url = "/"+this.framework.page.sorting; } else{ url = "/v/" + this.framework.page.subverse +"/" + this.framework.page.sorting; } //console.log(url); $(document).on("submissions-loaded", function(event){ // Hide duplicate posts as they appear for(var i = 0; i < event.submissions.length; i++){ var postId = $(event.submissions[i]).attr('data-fullname'); if(!_this.postIdLoaded[postId]){ _this.postIdLoaded[postId] = true; } else{ $(event.submissions[i]).css({display: "none"}); //console.log("post id " + postId + " hidden"); } } }); $(document).on("scroll", function(event){ var distanceToNewPage = $("div.pagination-container").offset().top - (window.pageYOffset + $(window).height()) - 600; //console.log(distanceToNewPage + " " + _this.contentLoading + " " + _this.morePages); if(distanceToNewPage < 0 && !_this.contentLoading && _this.morePages){ _this.contentLoading = true; _this.currentPage++; //console.log("Loading page " + _this.currentPage); $.get( url, {page: _this.currentPage} ) .done(function( data ) { var loadedDocument = $(data); var loadedSubmissions = null; if(_this.framework.page.subverse === ""){ loadedSubmissions = loadedDocument.find("div.sitetable > div.submission"); var paginationContainer = $("div.pagination-container"); for(var i = 0; i < loadedSubmissions.length; i++){ paginationContainer.before(loadedSubmissions[i]); } } else{ loadedSubmissions = loadedDocument.find("div.linklisting > div.submission"); var linklisting = $("div.linklisting"); for(var i = 0; i < loadedSubmissions.length; i++){ linklisting.append(loadedSubmissions[i]); } } if(!loadedDocument.find("li.btn-whoaverse-paging > a[rel^='next']")[0]){ _this.morePages = false; } _this.contentLoading = false; PostProcessSubmissions(loadedSubmissions); $.event.trigger({ type: "submissions-loaded", submissions: loadedSubmissions }); }) .fail(function(error) { //console.log( error ); }); } }); }; var SaveStyles = function(domObject, styleObject){ for (var property in styleObject) { styleObject[property] = $(domObject).css(property); } }; function Plugin_DetachedInfoBar(framework){ 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"); }); } } }); } function Plugin_LinkEmbedder(framework){ 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 = [ //Imgur Album 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; }, //Daily motion function(href){ var result = {handled: false, embedHtml: ""}; var match = null; match = href.match(/^https?:\/\/www\.dailymotion\.com\/video\/([a-zA-Z0-9]+)_.*$/); if(match){ result.handled = true; result.embedHtml = "<iframe frameborder=\"0\" width=\"480\" height=\"270\" src=\"//www.dailymotion.com/embed/video/" + match[1] + "\" allowfullscreen></iframe>"; } return result; } ]; $(document).on("submissions-loaded", function(event){ //console.log("We need to process loaded submissions to attach embedded content"); for(var i = 0; i < event.submissions.length; i++){ } }); $(document).on("comments-loaded", function(event){ for(var i = 0; i < event.comments.length; i++){ var links = $($(event.comments[i]).find("div.entry")[0]).find("div.md 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; } } }); } }); } function Framework(){ function SubversePage(){ this.type = "subverse"; this.subverse = null; this.currentPage = 0; this.sorting = null; } SubversePage.prototype.TriggerInitialEvents = function(){ loadedSubmission = null; if(this.subverse === ""){ loadedSubmissions = $("div.sitetable > div.submission"); } else{ loadedSubmissions = $("div.linklisting > div.submission"); } $.event.trigger({ type: "submissions-loaded", submissions: loadedSubmissions }); }; function SubmissionPage(){ this.type = "submission"; this.subverse = null; this.id = null; this.loadedParentComments = null; } SubmissionPage.prototype.TriggerInitialEvents = function(){ var _this = this; $.event.trigger({ type: "comments-loaded", comments: $("div.commentarea div.child") }); this.loadedParentComments = $("div.commentarea > div.sitetable > div.child").length; //console.log(this.loadedParentComments); window.setInterval(function(){ var temp = $("div.commentarea > div.sitetable > div.child"); if(temp.length > _this.loadedParentComments){ //("More comments loaded..." + _this.loadedParentComments + " " + temp.length); var event = { type: "comments-loaded", comments: [] }; for(var i = _this.loadedParentComments; i < temp.length; i++){ event.comments.push(temp[i]); var temp2 = $(temp[i]).find("div.child"); for(var j = 0; j < temp2.length; j++){ event.comments.push(temp2[j]); } } $.event.trigger(event); //console.log(event); _this.loadedParentComments = temp.length; } }, 16); }; function PermalinkPage(){ this.type = "permalink"; this.subverse = null; this.submissionId = null; this.id = null; } function UserSubmissionsPage(){ this.type = "user-submissions"; this.username = null; this.currentPage = 0; } function UserCommentsPage(){ this.type = "user-comments"; this.username = null; this.currentPage = 0; } function OtherPage(){ this.type = "other"; } //Find out what our page type is plus any useful information this.page = null; var urlHandled = false; var match = window.location.href.match(/^https?:\/\/(www\.)?voat\.co(\/(new))?\/?$/); if(!urlHandled && match !== null){ this.page = new SubversePage(); this.page.subverse = ""; if(match[3]){ this.page.sorting = match[3]; } else{ this.page.sorting = ""; } urlHandled = true; } match = window.location.href.match(/^https?:\/\/(www\.)?voat\.co\/v\/([a-zA-Z0-9_]+)(\/(new|top))?$/); if(!urlHandled && match !== null){ this.page = new SubversePage(); this.page.subverse = match[2]; if(match[4]){ this.page.sorting = match[4]; } else{ this.page.sorting = ""; } urlHandled = true; } match = window.location.href.match(/^https?:\/\/(www\.)?voat\.co\/v\/([a-zA-Z0-9_]+)\/comments\/([0-9]+)$/); if(!urlHandled && match !== null){ this.page = new SubmissionPage(); this.page.subverse = match[2]; this.page.id = match[3]; urlHandled = true; } match = window.location.href.match(/^https?:\/\/(www\.)?voat\.co\/v\/([a-zA-Z0-9_]+)\/comments\/([0-9]+)\/([0-9]+)$/); if(!urlHandled && match !== null){ this.page = new PermalinkPage(); this.page.subverse = match[2]; this.page.submissionId = match[3]; this.page.id = match[4]; urlHandled = true; } match = window.location.href.match(/^https?:\/\/(www\.)?voat\.co\/user\/([a-zA-Z0-9_]+)\/submissions$/); if(!urlHandled && match !== null){ this.page = new UserSubmissionsPage(); this.page.username = match[2]; urlHandled = true; } match = window.location.href.match(/^https?:\/\/(www\.)?voat\.co\/user\/([a-zA-Z0-9_]+)\/comments$/); if(!urlHandled && match !== null){ this.page = new UserCommentsPage(); this.page.username = match[2]; urlHandled = true; } if(!urlHandled){ this.page = new OtherPage(); } console.log(this.page); new Plugin_AutoPaginate(this); new Plugin_DetachedInfoBar(this); new Plugin_LinkEmbedder(this); new Plugin_UserTag(this); if(this.page.TriggerInitialEvents){ this.page.TriggerInitialEvents(); } // $.event.trigger({ // type: "submissions-loaded", // submissions: [] // }); } Framework.EventTypes = ["submissions-loaded", "comments-loaded"]; $(document).ready(function(){ //console.log("test"); var framework = new Framework(); //InitializeAutoPaginate(); //InitializeDetachedInfoBar(); //InitializeLinkEmbedder(); });