您需要先安装一个扩展,例如 篡改猴、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();
- });