您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Extends Reddit and adds some useful Functions. (Requires frisch's UserScript Extender)
// ==UserScript== // @name Reddit Enhancer // @namespace http://null.frisch-live.de/ // @version 1.85 // @description Extends Reddit and adds some useful Functions. (Requires frisch's UserScript Extender) // @author frisch // @include http://*.reddit.com/* // @include https://*.reddit.com/* // @exclude https://*.reddit.com/message/* // @exclude http://*.reddit.com/message/* // @exclude https://*.reddit.com/search?* // @grant GM_getValue // @grant GM_setValue // @grant GM_openInTab // ==/UserScript== console.log("Initializing Reddit Enhancer..."); var settings = {}; var enumKeys = { 'NONE': -1, 'BACKSPACE': 8, 'TAB': 9, 'ENTER': 13, 'SHIFT': 16, 'CTRL': 17, 'ALT': 18, 'PAUSE/BREAK': 19, 'CAPS LOCK': 20, 'ESCAPE': 27, 'SPACE': 32, 'PAGE UP': 33, 'PAGE DOWN': 34, 'END': 35, 'HOME': 36, 'LEFT ARROW': 37, 'UP ARROW': 38, 'RIGHT ARROW': 39, 'DOWN ARROW': 40, 'INSERT': 45, 'DELETE': 46, '0': 48, '1': 49, '2': 50, '3': 51, '4': 52, '5': 53, '6': 54, '7': 55, '8': 56, '9': 57, 'A': 65, 'B': 66, 'C': 67, 'D': 68, 'E': 69, 'F': 70, 'G': 71, 'H': 72, 'I': 73, 'J': 74, 'K': 75, 'L': 76, 'M': 77, 'N': 78, 'O': 79, 'P': 80, 'Q': 81, 'R': 82, 'S': 83, 'T': 84, 'U': 85, 'V': 86, 'W': 87, 'X': 88, 'Y': 89, 'Z': 90, 'LEFT WINDOW KEY': 91, 'RIGHT WINDOW KEY': 92, 'SELECT KEY': 93, 'NUMPAD 0': 96, 'NUMPAD 1': 97, 'NUMPAD 2': 98, 'NUMPAD 3': 99, 'NUMPAD 4': 100, 'NUMPAD 5': 101, 'NUMPAD 6': 102, 'NUMPAD 7': 103, 'NUMPAD 8': 104, 'NUMPAD 9': 105, 'MULTIPLY': 106, 'ADD': 107, 'SUBTRACT': 109, 'DECIMAL POINT': 110, 'DIVIDE': 111, 'F1': 112, 'F2': 113, 'F3': 114, 'F4': 115, 'F5': 116, 'F6': 117, 'F7': 118, 'F8': 119, 'F9': 120, 'F10': 121, 'F11': 122, 'F12': 123, 'NUM LOCK': 144, 'SCROLL LOCK': 145, 'SEMI-COLON': 186, 'EQUAL SIGN': 187, 'COMMA': 188, 'DASH': 189, 'PERIOD': 190, 'FORWARD SLASH': 191, 'GRAVE ACCENT': 192, 'OPEN BRACKET': 219, 'BACK SLASH': 220, 'CLOSE BRAKET': 221, 'SINGLE QUOTE': 222, }; enumKeys.hasValue = function(val){ for(var k in this) if(this[k] === val) { return true; } return false; }; // User Script Enhancer Properties and Functions var jq = document.fExt.jq; var fExtCreateStyle = document.fExt.createStyle; var fExtAddSub = document.fExt.ctxMenu.addCtxSub; var fExtMessage = document.fExt.message; var fExtAddCtxItem = document.fExt.ctxMenu.addCtxItem; var fExtAddCtxSeparator = document.fExt.ctxMenu.addSeparator; var fExtClipboard = document.fExt.clipboard; var fExtGetSelection = document.fExt.getSelection; var fExtPopup = document.fExt.popup; var fExtSetLoading = document.fExt.setLoading; var typeCheck = Object.prototype.toString; var numberOfSitesLoaded = 1; var isHiding = false; var ctxItemUsrHdr, ctxItemUsrHdrPg, ctxItemUsrUnhdr, ctxItemSbHdr, ctxItemSbUnhdr, ctxItemKeywHdr, ctxItemKeywUnhdr, ctxUndo, ctxRedo, ctxItemCpyHtml, ctxItemSett; var upVoteLinks, downVoteLinks, rSubRedditLinks, rAuthorLinks, postList; var loc = location.href; var isSinglePost = location.href.indexOf("/comments/") > 0 || location.href.indexOf("/submit$") > 0; var isUserPage = location.href.indexOf("/user/") > 0 || location.href.indexOf("/u/") > 0; var isUserSubmittedPage = isUserPage && location.href.indexOf("/submitted") > 0; var isMyMulti = location.href.indexOf("/me/m/") > 0; var isFriendsPage = location.href.indexOf("/r/friends") > 0; var isSubmitPage = location.href.indexOf("/submit?") > 0; var isMySavedPage = location.href.indexOf(settings.accountName + "/saved") > 0; var hiderElements; var headerHeight = jq("#header").outerHeight(true); var hideLinks = []; var userHideLinks = []; var subHideLinks = []; var duplicateLinks = []; var keywordsHideLinks = []; var rTitleLinks; var rEnhSub = fExtAddSub("Reddit Enhancer", undefined); var pstItems = []; pstItems.onlyVisible = function(){ return this.filter(function(item){ return jq("#" + item).is(":visible"); }); }; pstItems.Next = function(steps){ return GetFromArray(pstItems.onlyVisible(), pstItems.selected, steps ? steps : 1); }; pstItems.Previous = function(steps){ return GetFromArray(pstItems.onlyVisible(), pstItems.selected, steps ? steps * -1 : -1); }; pstItems.First = function(){ var visiblePosts = pstItems.onlyVisible(); return visiblePosts.length > 0 ? visiblePosts[0] : undefined; }; pstItems.Last = function(){ var visiblePosts = pstItems.onlyVisible(); return visiblePosts.length > 0 ? visiblePosts[visiblePosts.length - 1] : undefined; }; function GetFromArray(array, item, steps) { if(array.length === 0) return undefined; else if(item && jq.inArray(item, array) < 0) return undefined; var ind = 0; if(item) ind = array.indexOf(item); if(ind < 0) ind = 0; var stepIndex = (steps < 0 ? steps * -1 : steps); var modifier = (steps < 0 ? -1 : 1); ind += steps; while(ind >= array.length) ind -= array.length; if(ind < 0) ind = array.length - 1; return array[ind] === item ? undefined : array[ind]; } var reloadCancelled = true; var resourcesLinks = []; var subColors = {}; var settingTranslation = [ { key: "accountName", translation: "Your Profilename", hint: "Required to determine some pages (e.g. your saved pages)" }, { key: "markNSFW", translation: "Mark NSFW posts", hint: "Highlights NSFW posts" }, { key: "replaceTopNew", translation: "Replace Top with New", hint: "Instead of landing on the Top-Page of a reddit, you'll be redirected to the New-Page instead" }, { key: "sortByVotes", translation: "Sort by Votes", hint: "Sorts the posts by votes" }, { key: "autoExpandSelectedPost", translation: "Autoexpand Posts", hint: "Causes selected Posts to automatically collapse/expand" }, { key: "removeDuplicates", translation: "Remove Duplicates", hint: "Removes duplicate posts by checking the link/source of a post" }, { key: "maximumNumberOfSitesToLoad", translation: "Autoload # of Pages", hint: "Let's you load more than one page at once. Currently buggy and will be worked on." }, { key: "animationItemTimeout", translation: "Animation Speed", hint: "" }, { key: "hideItemTimeout", translation: "Posthiding Timeout", hint: "" }, { key: "imagePreloadingTimeout", translation: "Preloading timeout", hint: "" }, { key: "hideUsers", translation: "Hide Users", hint: "If true, users in the 'Users to hide'-list will be hidden" }, { key: "hideUsersNSFWonly", translation: "Hide Users NSFW posts only", hint: "Only hide NSFW posts by the users" }, { key: "usersToHide", translation: "Users to hide", hint: "" }, { key: "hideSubs", translation: "Hide Subs", hint: "If true, subsreddits in the 'Subs to hide'-list will be hidden" }, { key: "subsToHide", translation: "Subs to hide", hint: "" }, { key: "hideKeywords", translation: "Hide Keywords", hint: "If true, posts containing any keyword fromt he 'Keywords to hide'-list will be hidden" }, { key: "keywordsToHide", translation: "Keywords to hide", hint: "" }, { key: "panelView", translation: "Panelview", hint: "Not yet implemented" }, { key: "shortcuts", translation: "Keyboard Shortcuts", hint: "" }, { key: "voteUp", translation: "Upvote selected Post", hint: "" }, { key: "previousPost", translation: "Select previous Post", hint: "" }, { key: "voteDown", translation: "Downvote selected Post", hint: "" }, { key: "toggleSelected", translation: "Expand/Collapse selected Post", hint: "" }, { key: "hideSelected", translation: "Hide selected Post", hint: "" }, { key: "nextPost", translation: "Select next Post", hint: "" }, { key: "hideAll", translation: "Hide all Posts", hint: "Also reloads the page after hiding all posts (can be cancelled)" }, { key: "undoLast", translation: "Undo last action", hint: "Activates the latest element in the undo list" }, { key: "redoLast", translation: "Redo last action", hint: "Activates the latest element in the redo list" }, { key: "previousImage", translation: "Display previous Image", hint: "Used for RES-Albums" }, { key: "nextImage", translation: "Display next Image", hint: "Used for RES-Albums" }, { key: "zoomIn", translation: "Zoom in", hint: "Used for Images" }, { key: "zoomOut", translation: "Zoom out", hint: "Used for Images" }, { key: "rotateLeft", translation: "Rotate left", hint: "Used for Images" }, { key: "rotateRight", translation: "Rotate right", hint: "Used for Images" } ]; // Images var imgBooks = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTMyQTVEQUUyQTIyMTFFMTlGMThGNDk3QjgyMTJCNjUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTMyQTVEQUYyQTIyMTFFMTlGMThGNDk3QjgyMTJCNjUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFMzJBNURBQzJBMjIxMUUxOUYxOEY0OTdCODIxMkI2NSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFMzJBNURBRDJBMjIxMUUxOUYxOEY0OTdCODIxMkI2NSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgQa4kwAAAGQSURBVHjazFaBjYMwDIQXAzACI4BYoN2AblA2oBO0neD5CWADukG7QAUbPCNkA95+HZKVJyGlIL0lK62d+OLLEfCHYfDYfN/3pixN0x0NFbl6Pp+J96KN9QPTBAIIafgkPxryEY8E3rsAfhiKZDR8W0AuyLeunQUTu2SadgjxbnPyEPkY+VjkOX4EtbdZIBS5j0XJrrTwonXRiLVX8pLiHMsQ8106qgDSkR9G7ie66NBlBPpCw/lW+HvQgcZCewJRmFyQn/UuUCQTwJ6FGaPqzjTZQ6EIMcUbwOJWxHV6CyjVLgZYMRH7QvFGioRAHhpVmZPqLFaDjvH3iekVVDWiS/fnSDcIQ9L1e4ZQYjsH8kpH0hoCUBBPaJiTC9UtBootuR5yVouoczQWRiKUuQkQn9seir1PURqsBKRfRd5WQO0q8nawWXmvKYb/B1RuUD//A0TyPCHxEA9cv3ADvC6hmvUY8Oe+gsQrYHAEueFmV05fQQuNb/XyXTHUDlSVb6uOiuR4lfcTG2CQzrb+R4ABALaxlqMMGvrUAAAAAElFTkSuQmCC"; var imgDuplicate = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDQxOEI0NzM3NDlBMTFFMTk1RDhCRjg3NzZFMkRGMjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDQxOEI0NzQ3NDlBMTFFMTk1RDhCRjg3NzZFMkRGMjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpENDE4QjQ3MTc0OUExMUUxOTVEOEJGODc3NkUyREYyMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpENDE4QjQ3Mjc0OUExMUUxOTVEOEJGODc3NkUyREYyMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ph2iTEwAAAGJSURBVHjatFbBcYMwEBSEAsiXV0ogwydPpwPTgd0BVMCkAruDuAOnA7sBZsgvT//40oFzx6wyZwfQacA7cyMBkvZuTzoRGEKWZWtqdmQvZhp7so+6rjvjiQAkR485Ddm7L1mESOwC7O2XeQAiIdcoyRLSsnRX7tDHYIJktrSRYqJKWnKowNiU7ETPN2ThFAMNjjXSCkcsLFmsIpJwbRL6fr57dUMWOiZ3MzdbT+YVkRJDjqUU1S5akoUUeBb5XVHDVpEVoXkQkLO9z/Z2grxPsbVXkC9nIs4xfTOL5AgkJyTeRvDvgC8hHZ+zHNWgpPZAFg/VujmRHMWB3kKmDdl5ESIhV08Asli8K2cT3ZEc0F5ETWQJm9EcoUpr8LcgIvmEdWMkluiCfqUk4y18wIIlCNlex0isdCWS2ifX7vuJO4o934jEG83VHqIq5yIyF3K0hbjkGufPiSL5V0vg+z8hb2fNgfXNYX9hYmxl1wh8vJqB/Mk1om3bnyRJvqn7NlRaFGpsWfJfAQYApiSqoZCrNjYAAAAASUVORK5CYII="; var imgDelCat = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAG5SURBVEiJ3ZaxbhRBDIY/r45yOtImokVKc+N5gm0okiIFxUVpUiHlEWgipeENkNIkDQI6CiK60zZ0Z6p7ACQKmvAGic4UzMBmdTmSvRUI/mZ31rP+x/5tayTG+MDdD6qqOnJ3ZQCIiC0Wi5ci8srMrgBG7n4gImfuPgQHAO6uLZ/nAFVVVUeDMXTQ9l0Nla5laPselRczkyFJVPWGFtWQzlfh/yMaLftY8lt06+b7NqzS+e9G1D3ZEBX5T2n0GXgLfDCzj63vx8CzslgnoivgRQjhsZk975BgZichhK2ylhjjjdP3QUpp4u57QBk5JiLvZrPZm7JnaeruClV9yI/pvNMxPXL3p6q6Dxya2bc+Gn0NIWw1TXPdIvkEbAIbec8l8CXbzoHdPhGdNk1znVKatEjqTDTNe+pMNAV2UkqT3n2UNSETbJrZXFXrvH+uqtvZhrvvraNREX4DmKpqbWZzgEwy5Vcq9c9NbxExgBjjk3v+a/l5CdQlXaq6nSOrsw3AZDweH4rI2T0Ijs3sJPfOa35fDFFE9qXHdetneavqe1aXdwQuzGxX1rlmrWjYggtyw65FVHCXEfQdGszctvjNerkAAAAASUVORK5CYII="; var imgAbort = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowNDZCQkYwMzM2Q0ExMUUyQjY5RUUwNzIwODVEMzBFMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowNDZCQkYwNDM2Q0ExMUUyQjY5RUUwNzIwODVEMzBFMyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA0NkJCRjAxMzZDQTExRTJCNjlFRTA3MjA4NUQzMEUzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA0NkJCRjAyMzZDQTExRTJCNjlFRTA3MjA4NUQzMEUzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Mya9PgAAAUlJREFUeNpi/P//PwM9ACPdLWJkZMSqwNjYWBJIxQKxOxAbALEQVOodEF8A4p1AvPjs2bPPsemHm4/LIqAFfECqGYgzgZiVgIN/A/F0IK4FWviJaIuAlmgBqc1ArERiCN0DYl+gZdcIWgS15CAQi5AZHW+A2B5mGVaLoMF1ngyfYPOZISgYYeYzoSlopoIlDFAzmrGmOhMTE1DqekhExBMLQAlE/syZM8/RfRRLRUsYoGbFwjjIFrnTIJ/CzWRBEjTAolABiD+SYPB7NL4BNouEsGj8CEw5H4i1BZhq0YWEsAUdTQGyRe9oYP47bEEHKiCd0MMcS3CQAi5g89FOGvhoJzaLFkMzGQMVM+xiDIug9cl0Klo0HbmOQk91tdACkVJwD2oW7hqWLtUELSs+rBkWqtAQiCcRmUB+Q9UaIlsysI2TYdOuAwgwAC/sonL067x5AAAAAElFTkSuQmCC"; var imgDelUser = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWhJREFUeNrEVottgzAQxVEGcDdwN4jEAA0bZAPMBFEmiDJB1AkKE2QEvAAqGzQjMELP1SOyELbPMlKfdLL4nN/5Pg9EEUBZlkdazmR2lWQTmSH7HIbBFAkQARJNy1fAtyGyNouISA60fDP8K+7Jdp77Z2agNfdEPqIT0/+USySZ/jKXaHP8O9HI9B9zibjDaHKJOqZ/t4UyPCLta2hYqy2a4QJtW4O932yidRG9e+kchLeG8CqyJ2rXufIUa28VCcQG0ZNp512F6x7Pg6I6R6k9aXsnu3ueL9HSyRqxQnBFGny4ITV9QomqPQgkasERyRbBpKAWILHRHRgOE6XhjXx+nJqMnu6Uzp5Pe6IHk8SVHLdJLmsfP5RhTq/aR+qxxCtCh+xOm06RT8jfiVIgaVOFZtAL8qAm7lIUGNApGjdroiWqUlQY/xMjuq9gzpERiz8fW68P5PcYE1RMvo4Na1TrOOBq3a8AAwDKrW/Ty1UcbgAAAABJRU5ErkJggg=="; var imgTree = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6REIzNzg4NjJDMjdBMTFFMTgyQTdCNUFCM0MyNUJCMTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6REIzNzg4NjNDMjdBMTFFMTgyQTdCNUFCM0MyNUJCMTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4REUwQTc2QkMyNzgxMUUxODJBN0I1QUIzQzI1QkIxNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4REUwQTc2Q0MyNzgxMUUxODJBN0I1QUIzQzI1QkIxNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqK2+9QAAAEGSURBVHjavJWNDYMgEIWFCewGHcHECRihG+gGdhLdQDdoN6ALkLpBR5AN2iM5EtI09fg5LyFEJH4+jnsnqgLRtu0GU/1ni5VVmaj33osCas4wvfb2iUyIU6JhNGygGIiLnByNCLGUzSJRzQxTh48KlZVVBJAhgPTGmAdBlRWUGoCPnRDiADOuX2F9ov6gpNQAQpoAssRAyEeHEB1A+tgjp+ZIo7LVHVnKBZIRFuMgCtRYTlB2UEEWi1Nzg5SHYbHygCAvLj/+pnUpMEmpaoTdv2BDDEgkWtAYWNBCcZcSpnqBcePsRx5mCTaW3WGfRzQ+f+1Xtsb3o6Vv7CCEvY/yut1a/AgwACqvUiICIj/gAAAAAElFTkSuQmCC"; // Variables - End // Initialization - Start GMLoad(); // Initialization - Styles - Start jq("body").css("margin-bottom", "0"); // Initialization - Styles - End // Initialization - Controls - Start if (isSinglePost) { jq("div.media-preview").attr("style",""); jq("#upvoter,#downvoter,#expander,#hideAll,#hideSelected,#toggleUserHidden,#toggleSubsHidden,#toggleKeywordsHidden,#toggleDuplicateHidden").addClass("disabled"); } // Initialization - Controls - Settings Dialog var settingsDialog = '<div style="display:none" id="rEnhSettings"><div class="tableContainer"><table cellspacing="0" cellpadding="0" border="0" width="700px"><colgroup><col width="200px" /><col width="auto" /></colgroup>'; settingsDialog += '<thead><tr><th class="label">Setting</th><th class="setting">Value</th></tr></thead>'; function BuildSettings(settingsObject) { for (var key in settingsObject) { var varType = typeof settingsObject[key]; if (varType === "object") { if (typeCheck.call(settingsObject[key]) === '[object Array]') AddSettingToDialog(key, "list"); else { settingsDialog += '<tr><td class="label" colspan="2"><b>' + key + '</b></td></tr>'; if (key === 'shortcuts') { for (var shortcut in settingsObject[key]) { AddSettingToDialog(shortcut, 'key'); } } else BuildSettings(settingsObject[key]); } } else AddSettingToDialog(key, varType); } } function getTranslationObject(key) { for (var i in settingTranslation) { if (settingTranslation[i].key === key) { return settingTranslation[i]; } } return { key: key, translation: key, hint: "" }; } function AddSettingToDialog(key, varType) { var transObject = getTranslationObject(key); settingsDialog += '<tr title="' + transObject.hint + '">'; if (varType === "list") { settingsDialog += '<td class="label" colspan="2">' + transObject.translation + '</td>'; settingsDialog += '</tr>'; settingsDialog += '<tr title="' + transObject.hint + '">'; settingsDialog += '<td class="setting" colspan="2"><textarea name="' + key + '" class="value" cols="80" rows="7" title="Separate entries by using comma"></textarea></td>'; } else { settingsDialog += '<td class="label">' + transObject.translation + '</td>'; if (varType === "key") { settingsDialog += '<td><select class="value" name="' + key + '">'; for (var knownKey in enumKeys) { settingsDialog += '<option value="' + enumKeys[knownKey] + '">' + knownKey + '</option>'; } settingsDialog += '</select><input type="Button" class="DetectShortcut" value="Assign" /></td>'; } else { var inputType; switch (varType) { case "boolean": inputType = "checkbox"; break; case "number": inputType = "number"; break; case "string": inputType = "text"; break; default: console.log("Cannot add setting " + key + " to settings dialog because unkown type " + varType); return; } settingsDialog += '<td class="setting">' + '<input type="' + inputType + '" class="value" name="' + key + '"></td>'; } } settingsDialog += '</tr>'; } jq(document).on("click", "input.DetectShortcut", function(e) { fExtMessage("Press the key to assign or press ESC to unassign."); jq(document).bind("keydown", { sender: this }, AssignShortcut); }); function AssignShortcut(e){ var sender = e.data.sender; var jqSender = jq(sender); e.preventDefault(); var kc = e.which; if(kc != enumKeys.ESCAPE) { if(!enumKeys.hasValue(kc)){ fExtMessage("Invalid Key! Choose a different key or press ESC to unassign."); return false; } else jqSender.parent().find("select").val(kc); } else jqSender.parent().find("select").val(enumKeys.NONE); fExtMessage(undefined); jq(document).unbind("keydown", AssignShortcut); return false; } BuildSettings(settings); settingsDialog += '</table></div>'; settingsDialog += '<div class="settingsButtons"><a href="#" id="renhSettingsClose">Close</a><a href="#" id="renhSettingsSave">Save</a></div>'; settingsDialog += '</div>'; jq("body").append(settingsDialog); // Initialization - Controls - End // Moving the navigation buttons var jqNavButtons = jq("div.nav-buttons"); if (jqNavButtons) { if (jqNavButtons.length === 1 && settings.maximumNumberOfSitesToLoad > 1) { GrabContent(jq("body").html()); } else MainInitialization(); } else MainInitialization(); function MainInitialization() { InitializeElements(); InitializeStyles(); InitializeEventHandlers(); var fnHandleShortcut; if (!isSinglePost) { fnHandleShortcut = handleShortcutForOverview; postList = jq("#siteTable").find("div.thing"); postList.each(function(){ jq(this).find("div.midcol").find("div.unvoted").each(function(index, item) { var jqItem = jq(item); var unvotedVal = jqItem.text(); var multiplier = unvotedVal.indexOf("k") >= 0 ? 1000 : 1; var pts = parseFloat(unvotedVal.replace("k","")); if(isNaN(pts)) pts = 0; else pts = pts * multiplier; if (pts > 100) jqItem.parent().css("background-color", "#99FF99"); else if (pts > 0) jqItem.parent().css("background-color", "#CCFFCC"); else if (pts < -10) jqItem.parent().css("background-color", "#FF9999"); else if (pts < 0) jqItem.parent().css("background-color", "#FFCCCC"); jqItem.parents("div.thing:first").data("VoteValue",pts); }); }); if (!isUserPage) { if(settings.sortByVotes){ // Marks Rating of Posts postList.sort(function(a, b) { var scoreA = parseInt(jq(a).data("VoteValue")); var scoreB = parseInt(jq(b).data("VoteValue")); if (scoreA > scoreB) return -1; else if (scoreA < scoreB) return 1; else return 0; }); postList.detach(); postList.appendTo(jq("#siteTable")); } } for(var i = 0; i < postList.length; i++){ var post = jq(postList[i]); if(!post.is(":visible")) continue; var hideBtn = post.find("form.hide-button"); var eventData = { thingID: post.attr("id") }; hideBtn.bind("click", eventData, handleHideClick); } } else { jq("div.thing:first").find("img, video").each(function() { jq(this).attr("style","width: auto !important"); }); jq("div.thing:first").find("iframe").each(function() { jq(this).attr("style","width: 100% !important"); }); var pstID = jq("div.thing:first").attr("id"); fnHandleShortcut = handleShortcutForSinglePage; postList = jq(".sitetable").find("div.thing").not("#" + pstID); postList.each(function(index, item) { pstItems.push(item.getAttribute("id")); }); } jq(document).bind("keydown", fnHandleShortcut); jq(document).on("focusin", "input, textarea, select", function(e) { jq(document).unbind("keydown", fnHandleShortcut); }); jq(document).on("focusout", "input, textarea, select", function(e) { jq(document).bind("keydown", fnHandleShortcut); }); // Removal of sponsor divs jq("[class^='sponsor'").remove(); upVoteLinks = jq(".up:not(.archived)"); downVoteLinks = jq(".down:not(.archived)"); rSubRedditLinks = jq("a.subreddit"); rAuthorLinks = jq("a.author"); rAuthorLinks.each(function(index, item) { var href = item.getAttribute("href"); if (href.indexOf("/submitted") === -1) item.setAttribute("href", href + "/submitted/"); }); // Holy crap that new outbound url remapping is annoying af... here let's fix this shit jq("a[data-href-url]").each(function() { var jqThis = jq(this); var currentDataHref = this.getAttribute("data-href-url"); this.setAttribute("data-outbound-url", currentDataHref); this.setAttribute("href", currentDataHref); }); if (settings.replaceTopNew) { jq("a.subreddit").each(function(index, item) { var hrefLink = item.getAttribute("href"); if (!hrefLink.match(".*/$")) { hrefLink = hrefLink + "/"; } hrefLink = hrefLink + "new"; item.setAttribute("href", hrefLink); }); } jq("span.nsfw-stamp").each(function(index, item) { var jqItem = jq(item).parent("li"); var parent = jqItem.parents("ul.flat-list.buttons"); if (settings.markNSFW) { jqItem.parents("div.entry:first").addClass("NsfwItem"); } jqItem.detach().appendTo(parent); jqItem.parents("div.thing:first").addClass("NsfwPost"); }); jq("span.spoiler-stamp").each(function(index, item) { var jqItem = jq(item).parent("li"); var parent = jqItem.parents("ul.flat-list.buttons"); jqItem.detach().appendTo(parent); jqItem.parents("div.thing:first").addClass("SpoilerPost"); }); // remove Gild and Share button jq("li.give-gold-button, li.share").remove(); jq("li a:contains('promoted')").parent().remove(); jq("li a:contains('gilded')").parent().remove(); jq("li a:contains('rising')").parent().remove(); jq("li a:contains('controversial')").parent().remove(); // highlight hide/unhide var hideSubsFromLocation = false; var hideUsersFromLocation = false; if (!isMyMulti && !isMySavedPage && !isSinglePost && !isFriendsPage) { hideSubsFromLocation = true; hideUsersFromLocation = true; } InitializeContextMenu(); if (!isSinglePost) { jq("a.comments.empty").each(function(index, item) { Mark(jq(item), "uncommented"); }); jq("span.domain").each(function(index, span) { var item = jq(span).find("a"); var jqItem = jq(item); var parentItem = jqItem.parents("div.entry"); var txt = jqItem.text(); if (txt.indexOf("youtu") >= 0) Mark(parentItem, "video"); else if (txt.indexOf("imgur") >= 0 || txt.indexOf("gfycat") >= 0) Mark(parentItem, "image"); }); postList.find("a.title").each(function() { var text = this.text; if (text.length > 180) { var spacerInd = text.substring(0, 175).lastIndexOf(" "); this.setAttribute("title", "..." + text.substring(spacerInd)); this.text = text.substring(0, spacerInd) + "... (more)"; } }); postList.each(function(index, item) { pstItems.push(item.getAttribute("id")); }); for(var i = 0; i < pstItems.length; i++){ var jqThing = jq("#" + pstItems[i]); var tagline = jqThing.find("p.tagline"); tagline.detach(); var subReddit = tagline.find("a.subreddit"); subReddit.detach(); var first = jqThing.find("div.entry p:first"); var jqDiv = jq("<span class='thingUserSubInfo'></span>"); jqDiv.insertBefore(first); var flatlistButtons = jqThing.find("ul.flat-list.buttons"); flatlistButtons.detach(); tagline.appendTo(jqDiv); subReddit.appendTo(jqDiv); flatlistButtons.appendTo(jqDiv); if (settings.removeDuplicates) { var resource = jqThing.find("a.thumbnail").get(0); if(resource) { if (resourcesLinks.indexOf(resource.href) >= 0) { if (!jqThing.hasClass("duplicateHidden")) jqThing.addClass("duplicateHidden"); AddToHideLinks(jqThing); duplicateLinks.push(jqThing); } else resourcesLinks.push(resource.href); } } } jq("div.thing.promotedlink").each(function() { AddToHideLinks(jq(this)); }); if (!isFriendsPage && !isUserSubmittedPage) { rAuthorLinks.each(function(index, item) { var jqItem = jq(item); var userName = jqItem.text().replace("/r/", "").replace("r/",""); var userIndex = jq.inArray(userName, settings.usersToHide); var itemThing = jqItem.parents("div.thing:first"); if (userIndex >= 0) { var hideThisPost = settings.hideUsers && !isUserPage && (settings.hideUsersNSFWonly && jqItem.parents("div.entry").hasClass("NsfwItem") || !settings.hideUsersNSFWonly); if (hideThisPost) AddToHideLinks(itemThing); userHideLinks.push(itemThing); itemThing.addClass("userHidden"); } }); } var hideThisPost = settings.hideKeywords && !isUserPage; for (var iKW = 0; iKW < settings.keywordsToHide.length; iKW++) { var kwItem = settings.keywordsToHide[iKW]; if (kwItem) { jq("a.title:contains(" + kwItem + ")").each(function(jndex, jtem) { var thing = jq(jtem).parents("div.thing:first"); if (hideThisPost) AddToHideLinks(thing); keywordsHideLinks.push(thing); if (!thing.hasClass("keywordsHidden")) thing.addClass("keywordsHidden"); }); } } if (loc.indexOf("/r/all") >= 0 || loc.indexOf("/r/popular") >= 0) { rSubRedditLinks.each(function(index, item) { var subName = item.text.replace("/r/", "").replace("r/",""); var subIndex = jq.inArray(subName, settings.subsToHide); if (subIndex >= 0) { var itemThing = jq(item).parents("div.thing:first"); if (hideSubsFromLocation) AddToHideLinks(itemThing); subHideLinks.push(itemThing); itemThing.addClass("subsHidden"); } }); } jq("#toggleSubsHidden").find("span").text(subHideLinks.length); jq("#toggleUserHidden").find("span").text(userHideLinks.length); jq("#toggleKeywordsHidden").find("span").text(keywordsHideLinks.length); jq("#toggleDuplicateHidden").find("span").text(duplicateLinks.length); if(hideLinks.length > 0) HideAndAction(hideLinks, 0, null, "enhance"); else InitializeHider(); var subs = jq("a.subreddit"); if (subs.length > 0) { subs.each(function(index, item) { var jqItem = jq(item); var subText = jqItem.text().replace("/r/", "").replace("r/",""); var subColor = subColors[subText]; if (!subColor) { subColor = getRandomColor(); subColors[subText] = subColor; } //jqItem.detach().prependTo(eleParent); jqItem.text(subText); jqItem.parents("div.thing:first").css("background-color", subColor); }); } else { jq("span.domain").each(function(index, span) { var item = jq(span).children("a"); if(item){ var subText = item.text().replace("/r/", "").replace("r/",""); var subColor = subColors[subText]; if (!subColor) { subColor = getRandomColor(); subColors[subText] = subColor; } item.parents("div.thing:first").css("background-color", subColor); } }); } jq(".last-clicked").removeClass("last-clicked"); jq(".promotedlink").remove(); jq("span.author:contains('[deleted]')").parents("div.thing").each(function(){ jq(this).find("a:contains('hide')").click(); }); if (userHideLinks.length === 0) { jq("#toggleUserHidden").attr("style", "background-color: #808080 !important; color: #CFCFCF; border: 1px solid black;"); } else { jq("#toggleUserHidden").click(function(e) { ToggleVisibility(e, this, ".userHidden"); return false; }); } if (subHideLinks.length === 0) { jq("#toggleSubsHidden").attr("style", "background-color: #808080 !important; color: #CFCFCF; border: 1px solid black;"); } else { jq("#toggleSubsHidden").click(function(e) { ToggleVisibility(e, this, ".subsHidden"); return false; }); } if (duplicateLinks.length === 0) { jq("#toggleDuplicateHidden").attr("style", "background-color: #808080 !important; color: #CFCFCF; border: 1px solid black;"); } else { jq("#toggleDuplicateHidden").click(function(e) { ToggleVisibility(e, this, ".duplicateHidden"); return false; }); } if (keywordsHideLinks.length === 0) { jq("#toggleKeywordsHidden").attr("style", "background-color: #808080 !important; color: #CFCFCF; border: 1px solid black;"); } else { jq("#toggleKeywordsHidden").click(function(e) { ToggleVisibility(e, this, ".keywordsHidden"); return false; }); } var navButton = jq("div.nav-buttons").find(".next-button").find("a:first"); if (navButton.length === 1) { navButton.prepend().appendTo("#postNavigation"); var navButtonPrev = jq("div.nav-buttons .prev-button a"); if (navButtonPrev) navButtonPrev.prepend().appendTo("#postNavigation"); } jq("div.nav-buttons").remove(); } fExtMessage(undefined); } // Initialization - End // Events - Start function HideAllClick(e) { if(e) e.preventDefault(); if(jq("#hideAll").text().indexOf("?") >= 0) return; isHiding = true; var siteTable = jq("#siteTable"); siteTable.css("display", "block"); postList.css("display", "block"); siteTable.css("height", siteTable.outerHeight(true) + "px"); siteTable.find("div.thing").each(function(index, thing) { var jqThing = jq(thing); var offs = jqThing.offset(); var top = parseInt(offs.top); var width = jqThing.width(); var height = jqThing.height(); setTimeout(function() { jqThing.css({ top: top, left: 0, width: width, height: height, position: "absolute" }); }, settings.animationItemTimeout); }); reloadCancelled = false; setTimeout(function() { if(pstItems.selected) pstItems.jqSelected.animate({ scrollTop: pstItems.jqSelected.offset().top }, 0); HideAndAction(hiderElements, 0, null, "reload"); }, settings.hideItemTimeout); jq(this).hide(); return false; } function HideSelectedClick(e) { if (pstItems.selected) { var selPst = pstItems.selected; jq("#nextPost").click(); Hide(jq("#" + selPst), false, false); } else MakeActivePost(undefined, pstItems.Next()); if(e) e.preventDefault(); return false; } // Kontext-Menü jq("#fExtContextMenu").on("fExtContextMenuOpening", function(event, actor) { var txt = actor.text(); var jqThing = getThingForCtxActor(actor); var usrTxt = 'Select a User'; var subTxt = 'Select a Subreddit'; var keywTxt = 'Select word(s)'; ctxItemUsrHdr.Toggle(false); ctxItemUsrHdrPg.Toggle(false); ctxItemUsrUnhdr.Toggle(false); ctxItemSbHdr.Toggle(false); ctxItemSbUnhdr.Toggle(false); if(jqThing.length === 1) { var usrTxtFnd = jqThing.find(".author:first").text(); var subTxtFnd = jqThing.find(".subreddit:first").text().replace("/r/",""); if(usrTxtFnd !== "") { usrTxt = usrTxtFnd; var usrIndex = jq.inArray(usrTxt, settings.usersToHide); ctxItemUsrHdr.Toggle(usrIndex < 0); ctxItemUsrHdrPg.Toggle(usrIndex < 0); ctxItemUsrUnhdr.Toggle(usrIndex >= 0); } if(subTxtFnd !== "") { subTxt = subTxtFnd; var subIndex = jq.inArray(subTxt, settings.subsToHide); ctxItemSbHdr.Toggle(subIndex < 0); ctxItemSbUnhdr.Toggle(subIndex >= 0); } } var selText = fExtGetSelection(); var keywIndex = jq.inArray(selText, settings.keywordsToHide); bCanHide = selText !== "" && keywIndex < 0; bCanUnhide = selText !== "" && keywIndex >= 0; ctxItemKeywHdr.Toggle(bCanHide); ctxItemKeywUnhdr.Toggle(bCanUnhide); ctxItemKeywHdr.ItemText("Hide Keywords - '" + (selText || keywTxt) + "'"); ctxItemKeywUnhdr.ItemText("Unhide Keywords - '" + (selText || keywTxt) + "'"); ctxItemUsrHdr.ItemText("Hide User - " + usrTxt); ctxItemUsrHdrPg.ItemText("Hide User and open Page - " + usrTxt); ctxItemUsrUnhdr.ItemText("Unhide User - " + usrTxt); ctxItemSbHdr.ItemText("Hide Sub - " + subTxt); ctxItemSbUnhdr.ItemText("Unhide Sub - " + subTxt); ctxRedo.Toggle(ctxRedo.find("li.ctxItem").length > 0); ctxUndo.Toggle(ctxUndo.find("li.ctxItem").length > 0); }); if (!isSinglePost && !isSubmitPage) { jq(document).on("click", "div.thing, div.thing *", function(e) { if(e.target.nodeName === "A" || e.target.nodeName === "LI") return true; var jqThing; if(e.target.nodeName === "DIV" && jq.inArray("thing", e.target.classList) >= 0) jqThing = jq(e.target); else if(jq(e.target).parents("div.thing:first").length === 1 && (e.target.nodeName === "SPAN" || (e.target.nodeName === "DIV" && jq.inArray("entry", e.target.classList) >= 0))) jqThing = jq(e.target).parents("div.thing:first"); if (jqThing && jqThing.is(":visible") && jqThing.attr("id") != pstItems.selected) { return MakeActivePost(pstItems.selected, jqThing.attr("id")); } else return true; }); } jq("#topPost").click(function() { MakeActivePost(pstItems.selected, pstItems.First()); return false; }); jq("#botPost").click(function() { MakeActivePost(pstItems.selected, pstItems.Last()); return false; }); jq("#prevPost").click(function() { MakeActivePost(pstItems.selected, pstItems.Previous()); return false; }); jq("#nextPost").click(function() { MakeActivePost(pstItems.selected, pstItems.Next()); return false; }); jq("#frPost").click(function() { var pst = pstItems.selected; var pstNew = pst; pstNew = pstItems.Previous(5); MakeActivePost(pst, pstNew); return false; }); jq("#ffPost").click(function() { var pst = pstItems.selected; var pstNew = pst; MakeActivePost(pstItems.selected, pstItems.Next(5)); return false; }); // Events - Settings function SetSettingsValues(settingsObject) { for (var key in settingsObject) { var varType = typeof settingsObject[key]; SetSettingValue(key, varType, settingsObject[key]); } } function SetSettingValue(key, varType, value) { var settingsElement = jq("#rEnhSettings").find("[name='" + key + "']"); switch (varType) { case "boolean": if (value) settingsElement.attr("checked", "true"); else settingsElement.removeAttr("checked"); break; case "number": settingsElement.val(value); break; case "string": settingsElement.val(value); break; case "object": if (typeCheck.call(value) === '[object Array]') settingsElement.val(value.toString()); else SetSettingsValues(value); break; default: console.log("Cannot get setting " + key + " to settings dialog because unkown type " + varType); break; } } function ShowSettings() { SetSettingsValues(settings); jq("#rEnhSettings").show(); return false; } function SaveSettingsDialog(e) { e.preventDefault(); jq("#rEnhSettings").find("input, textarea, select").each(function() { var val; var key = this.name; var tag = this.tagName; switch (tag) { case "INPUT": var type = this.type; switch (type) { case "checkbox": val = Boolean(this.checked); break; case "number": val = parseFloat(this.value); break; case "text": val = this.value; break; case "button": break; default: console.log("unhandled input type " + type + " for key " + key); break; } break; case "TEXTAREA": val = this.value.split(","); break; case "SELECT": val = parseInt(this.value); break; default: break; } if (val !== undefined) { if (key in settings) settings[key] = val; else if (key in settings.shortcuts) settings.shortcuts[key] = val; } }); GMSave(); fExtPopup("Settings saved!"); return false; } // Events - End // Functions - Start function handleShortcutForOverview(e) { switch (e.which) { case settings.shortcuts.voteUp: Vote(pstItems.selected, "up"); break; case settings.shortcuts.previousPost: jq("#prevPost").click(); break; case settings.shortcuts.voteDown: Vote(pstItems.selected, "down"); break; case settings.shortcuts.nextImage: var imgActorNext = jq(".pstSelected").find("div.res-gallery-individual-controls").find("div.res-gallery-next"); if(imgActorNext.length > 0) imgActorNext.get(0).click(); break; case settings.shortcuts.toggleSelected: if (pstItems.selected) pstItems.jqSelected.find(".expando-button").get(0).click(); break; case settings.shortcuts.previousImage: var imgActorPrev = jq(".pstSelected").find("div.res-gallery-individual-controls").find("div.res-gallery-previous"); if(imgActorPrev.length > 0) imgActorPrev.get(0).click(); break; case settings.shortcuts.hideSelected: HideSelectedClick(); break; case settings.shortcuts.nextPost: jq("#nextPost").click(); break; case settings.shortcuts.hideAll: if (reloadCancelled) HideAllClick(); break; case settings.shortcuts.zoomIn: if (pstItems.selected) pstItems.jqSelected.find("img, video, iframe").each(function() { document.fExt.zoomIn(this, 20); }); break; case settings.shortcuts.zoomOut: if (pstItems.selected) pstItems.jqSelected.find("img, video, iframe").each(function() { document.fExt.zoomOut(this, 20); }); break; case settings.shortcuts.rotateLeft: if (pstItems.selected) pstItems.jqSelected.find("img, video, iframe").each(function() { document.fExt.rotate(this, -90); }); break; case settings.shortcuts.rotateRight: if (pstItems.selected) pstItems.jqSelected.find("img, video, iframe").each(function() { document.fExt.rotate(this, 90); }); break; case settings.shortcuts.undoLast: if(ctxUndo.Items.length > 0) ctxUndo.Items[ctxUndo.Items.length - 1].Trigger(); break; case settings.shortcuts.redoLast: if(ctxRedo.Items.length > 0) ctxRedo.Items[ctxRedo.Items.length - 1].Trigger(); break; default: return true; } return false; } var jqPost = jq("div.thing:first"); var jqPostID = jqPost.attr("id"); function handleShortcutForSinglePage(e) { switch (e.which) { case settings.shortcuts.voteUp: Vote(jqPostID, "up"); break; case settings.shortcuts.previousPost: jq("#prevPost").click(); break; case settings.shortcuts.voteDown: Vote(jqPostID, "down"); break; case settings.shortcuts.nextImage: var imgActorNext = jqPost.find("div.res-gallery-individual-controls").find("div.res-gallery-next"); if(imgActorNext.length > 0) imgActorNext.get(0).click(); break; case settings.shortcuts.toggleSelected: pstItems.jqSelected.find("a.expand:first").click(); break; case settings.shortcuts.previousImage: var imgActorPrev = jqPost.find("div.res-gallery-individual-controls").find("div.res-gallery-previous"); if(imgActorPrev.length > 0) imgActorPrev.get(0).click(); break; case settings.shortcuts.nextPost: jq("#nextPost").click(); break; case settings.shortcuts.zoomIn: jqPost.find("img, video, iframe").each(function() { document.fExt.zoomIn(this, 20); }); break; case settings.shortcuts.zoomOut: jqPost.find("img, video, iframe").each(function() { document.fExt.zoomOut(this, 20); }); break; case settings.shortcuts.rotateLeft: jqPost.find("img, video, iframe").each(function() { document.fExt.rotate(this, -90); }); break; case settings.shortcuts.rotateRight: jqPost.find("img, video, iframe").each(function() { document.fExt.rotate(this, 90); }); break; default: return true; } return false; } function InitializeElements() { var rPostNavigation = jq('<div id="postNavigation"><a href="#" id="topPost">Top</a><a href="#" id="frPost"><<</a><a href="#" id="prevPost"><</a><a href="#" id="nextPost">></a><a href="#" id="ffPost">>></a><a href="#" id="botPost">Bottom</a></div>'); rPostNavigation.appendTo("body"); var rTabMenu = jq("ul.tabmenu"); jq('<li class="spacerLi"></li>').appendTo(rTabMenu); jq('<li><span class="">All Posts:</span></li>').appendTo(rTabMenu); jq('<li><a href="#" class="choice tabButton" title="Updvotes all displayed posts" id="upvoter">Upvote</a></li>').appendTo(rTabMenu); jq('<li><a href="#" class="choice tabButton" title="Downvotes all displayed posts" id="downvoter">Downvote</a></li>').appendTo(rTabMenu); jq('<li><a href="#" class="choice tabButton collapsed" title="Expands all posts" id="expander">Expand</a></li>').appendTo(rTabMenu); jq('<li class="spacerLi"></li>').appendTo(rTabMenu); jq('<li><span class="">Hide:</span></li>').appendTo(rTabMenu); jq('<li><a href="#" class="choice tabButton" style="background-color: rgb(255, 138, 138) !important;" title="Hides all displayed posts which prevents them from showing up again" id="hideAll">All (<span>?</span>)</a></li>').appendTo(rTabMenu); jq('<li><a href="#" class="choice tabButton" style="display: none; background-color: rgb(255, 138, 138) !important;" title="Hides all displayed posts which prevents them from showing up again" id="hideSelected">Selected</a></li>').appendTo(rTabMenu); jq('<li class="spacerLi"></li>').appendTo(rTabMenu); jq('<li><span class="">Toggle hidden:</span></li>').appendTo(rTabMenu); jq('<li><a href="#" class="choice tabButton" style="background-color: rgb(175, 255, 171) !important;" title="Toggles the hidden User posts" id="toggleUserHidden">Users (<span>?</span>)</a></li>').appendTo(rTabMenu); jq('<li><a href="#" class="choice tabButton" style="background-color: rgb(175, 255, 171) !important;" title="Toggles the hidden Sub posts" id="toggleSubsHidden">Subs (<span>?</span>)</a></li>').appendTo(rTabMenu); jq('<li><a href="#" class="choice tabButton" style="background-color: rgb(175, 255, 171) !important;" title="Toggles the hidden Keyword posts" id="toggleKeywordsHidden">Keywords (<span>?</span>)</a></li>').appendTo(rTabMenu); jq('<li><a href="#" class="choice tabButton" style="background-color: rgb(175, 255, 171) !important;" title="Toggles the duplicate posts" id="toggleDuplicateHidden">Duplicates (<span>?</span>)</a></li>').appendTo(rTabMenu); jq('<li class="spacerLi"></li>').appendTo(rTabMenu); if (loc.indexOf("show=all") < 0) { var parmChar = "?"; if(loc.indexOf("?") >= 0) parmChar = "&"; jq('<li><a href="' + loc.replace('#', '') + parmChar + 'show=all" title="Show all posts of this sub, including previously hidden posts" class="choice tabButton" style="background-color: rgb(187, 187, 255) !important;" id="showAll">Show All</a></li>').appendTo(rTabMenu); } } function InitializeStyles() { fExtCreateStyle("#header { z-index: 107; }"); fExtCreateStyle("#siteTable { padding: 0 64px; }"); fExtCreateStyle("body.with-listing-chooser>.content, body.with-listing-chooser .footer-parent { margin-left: 0 !important; }"); fExtCreateStyle("div.listing-chooser { left: 0 !important; }"); fExtCreateStyle("div.side { right: 0; }"); fExtCreateStyle("div.side, div.listing-chooser { z-index: 106 !important; position: fixed !important; height: 90%; top: " + headerHeight + "px !important; margin: 0px; border: 1px solid black; width: 5px !important; overflow-y: hidden !important; padding: 8px !important; }"); fExtCreateStyle("div.side:hover { width: 500px !important; overflow-y: auto !important; max-height: 100vh; }"); fExtCreateStyle("div.listing-chooser:hover { width: 500px !important; overflow-y: auto !important; max-height: 100vh; }"); fExtCreateStyle("span.domain { font-weight: bold; }"); fExtCreateStyle("div.content { padding-top: 80px !important; }"); fExtCreateStyle(".tabButton { color: #333333 !important; background-color: rgb(252, 255, 215) !important; border: 1px solid black; }"); fExtCreateStyle(".spacerLi { width: 50px; }"); fExtCreateStyle("#postNavigation { position: fixed !important; top: 27px; width: 500px; margin: 0 auto; display: block; z-index: 108; /*font-size: 12px; font-weight: bold; */ left: 0; right: 0; } "); fExtCreateStyle("#postNavigation a { background-color: #ffffff; border: 1px solid black; padding: 8px 14px; margin: 0 1px; }"); fExtCreateStyle("#postNavigation a:hover { background-color: #dfdfdf; }"); fExtCreateStyle(".pstSelected, .pstSelected * { z-index: 105; }"); fExtCreateStyle(".midcol { width: 32px !important; }"); fExtCreateStyle(".RES-keyNav-activeElement, .RES-keyNav-activeElement .md-container { background-color: transparent !important; }"); fExtCreateStyle("div.md { border: none !important; }"); if (isSinglePost) { fExtCreateStyle(".livePreview { width: 1600px !important; }"); fExtCreateStyle(".livePreview p, .livePreview ol { width: 1500px !important; }"); fExtCreateStyle("div.usertext-edit { max-width: 50%; };"); fExtCreateStyle("div.usertext-edit div.md { width: 100%; max-width: 100%; }"); fExtCreateStyle("div.usertext-edit div.md textarea { width: 100%; }"); fExtCreateStyle(".pstSelected p.tagline { background-color: #DDDDFF; }"); } else { fExtCreateStyle(".md { max-width: none !important; }"); fExtCreateStyle(".madeVisible *,div.expando * { z-index: 105; }"); fExtCreateStyle("a.madeVisible img, a.madeVisible video { max-height: 100vh !important; max-width: 95vw !important;}"); fExtCreateStyle("body { margin-bottom: 650px !important; }"); fExtCreateStyle("img.RESImage { border-bottom: #000 solid 3px !important; padding: 0 !important; }"); fExtCreateStyle("div.thing { min-height: 80px; padding: 5px 0; margin: 0 0 8px 0; border: 1px solid black; }"); fExtCreateStyle("div.thing.pstSelected div.entry>div:not(.expando-button) { background-color: #fff !important; padding: 10px 20px; border: 1px solid black; }"); fExtCreateStyle("div.thing div.entry img, div.thing div.entry video { display: none !important; }"); fExtCreateStyle("div.thing.pstSelected div.entry img, div.thing.pstSelected div.entry video { display: block !important; }"); if (settings.markNSFW) { fExtCreateStyle(".NsfwPost { background-color: rgb(255, 81, 81) !important; }"); fExtCreateStyle(".NsfwItem .madeVisible { display: none; }"); fExtCreateStyle(".pstSelected .NsfwItem .madeVisible { display: initial !important; }"); fExtCreateStyle(".pstSelected .NsfwItem .madeVisible div { width: auto !important; }"); fExtCreateStyle(".pstSelected .NsfwItem * { z-index: 104 !important; }"); } fExtCreateStyle(".entry .buttons li { line-height: inherit !important; width: 100px; }"); fExtCreateStyle(".thingUserSubInfo { padding: 4px 8px; height: 26px; display: block; }"); fExtCreateStyle(".thingUserSubInfo>* { float: left; clear: none; border: 1px solid black; margin: 0 2px; }"); fExtCreateStyle(".thingUserSubInfo * { font-size: 12px !important; }"); fExtCreateStyle(".thingUserSubInfo .nsfw-stamp { display: inline !important; }"); fExtCreateStyle(".thingUserSubInfo p.tagline { width: 450px; }"); fExtCreateStyle(".thingUserSubInfo a.subreddit { width: 160px; }"); fExtCreateStyle("ul.flat-list.buttons { float: left; clear: none; padding: 0; position: absolute; left: 870px; }"); fExtCreateStyle("ul.flat-list.buttons>li { cursor: pointer; }"); fExtCreateStyle("ul.flat-list.buttons>li, .thingUserSubInfo p.tagline, .thingUserSubInfo a.subreddit { padding: 6px !important; background-color: #eeeeee !important; text-align: center; }"); fExtCreateStyle("ul.flat-list.buttons>li:hover, .thingUserSubInfo p.tagline:hover, .thingUserSubInfo a.subreddit:hover { background-color: #cee3f8 !important; }"); //fExtCreateStyle("a.subreddit { float: left; background-color: white !important; color: #888; font-weight: bold; padding: 0 4px !important; }"); // fExtCreateStyle("p.tagline { float: left; position: relative; background-color: white; color: #888; font-weight: bold; padding: 0 1px; }"); fExtCreateStyle("p.title { color: #000000 !important; float: left; }"); fExtCreateStyle("p.title a { color: #000000 !important; }"); fExtCreateStyle("div.top-matter { height: 48px !important; }"); //fExtCreateStyle("ul.flat-list.buttons { padding-bottom: 40px; width: 800px; margin: 20px auto 0 auto; font-size: larger; text-align: center; left: 0; right: 0; clear: both; }"); //fExtCreateStyle("ul.flat-list.buttons li { padding: 4px; background-color: #fff; margin: 2px; border: 1px solid #999; }"); fExtCreateStyle(".usertext * { z-index: 1; }"); fExtCreateStyle("div.thing div.entry div.expando:not(.expando-uninitialized) { display: block !important; }"); fExtCreateStyle("div.thing div.entry div.expando span { display: none; }"); } fExtCreateStyle(".toggleHidden, div.thing.hidden { background: repeating-linear-gradient(45deg, transparent, transparent 35px, rgba(255,255,255,.5) 35px, rgba(255,255,255,.5) 70px); }"); if(settings.hideUsers) fExtCreateStyle(".userHidden .author { text-decoration: line-through; }"); if(settings.hideSubs) fExtCreateStyle(".subsHidden .subreddit { text-decoration: line-through; }"); fExtCreateStyle(".userHidden a.title, .subsHidden a.title, .duplicateHidden a.title { background-position: 0 !important; background-repeat: no-repeat !important; padding: 8px 8px 8px 26px; }"); fExtCreateStyle(".userHidden a.title { background-image: url('" + imgDelUser + "') !important; }"); fExtCreateStyle(".subsHidden a.title { background-image: url('" + imgDelCat + "') !important; }"); fExtCreateStyle(".duplicateHidden a.title { background-image: url('" + imgDuplicate + "') !important; }"); fExtCreateStyle("ul.tabmenu .disabled { background-color: #dfdfdf !important; }"); fExtCreateStyle("#rEnhSettings { position: fixed; height: 750px; top: 50px; border: 1px solid black; width: 750px; padding: 12px; z-index: 1000; background-color: #FEFEFE; right: 0; left: 0; margin: 0 auto; }"); fExtCreateStyle("#rEnhSettings table { }"); fExtCreateStyle("#rEnhSettings table td.label, #rEnhSettings table td.value { }"); fExtCreateStyle("#rEnhSettings table td.label { float: left; clear: right; font-size: larger; }"); fExtCreateStyle("#rEnhSettings table td.value { float: right; clear: left; }"); fExtCreateStyle("#rEnhSettings table thead { font-size: large; }"); fExtCreateStyle("#rEnhSettings div.tableContainer { overflow-y: scroll; height: 700px; }"); fExtCreateStyle("#rEnhSettings div.settingsButtons { height: 50px; }"); fExtCreateStyle("#rEnhSettings * { z-index: 1000; margin: 4px; }"); fExtCreateStyle("#rEnhSettings td.label { }"); fExtCreateStyle("#rEnhSettings a { padding: 4px; border: 1px solid grey; float: right; }"); } function InitializeHider() { if(!hiderElements) { hiderElements = []; for(var i = 0; i < postList.length; i++){ var post = jq(postList[i]); if(!post.is(":visible")) continue; hiderElements.push(post); } if (hiderElements.length === 0) jq("#hideAll").attr("style", "background-color: #808080 !important; color: #CFCFCF; border: 1px solid black;"); var len = jq("form.hide-button").length; if(len > 0) jq("#hideAll").text("All (" + len + ")"); else jq("#hideAll").text("None"); jq(".hide-button:contains(hidden)").click(function(e){ e.preventDefault(); jq(this).parents("div.thing:first").hide(); return false; }); } } function VoteAndNext(sender, voteLinks, ind) { var nextVoteItem = voteLinks[ind]; jq(nextVoteItem).click(); ind++; if (voteLinks.length > ind) { animateControl(sender); setTimeout(function() { VoteAndNext(sender, voteLinks, ind); }, settings.animationItemTimeout); } else { jq("#downvoter").text("Downvote"); jq("#upvoter").text("Upvote"); } } function ExpandAndNext(expandLinks, ind) { var jqExpander = jq("#expander"); var expandItem = expandLinks[ind]; jq(expandItem).click(); if (expandLinks.length > ind) { animateControl(jqExpander); setTimeout(function() { ExpandAndNext(expandLinks, ind + 1); }, settings.animationItemTimeout); } else { if(jqExpander.hasClass("collapsed")) { jqExpander.text("Collapse"); jqExpander.removeClass("collapsed"); jqExpander.addClass("expanded"); } else { jqExpander.text("Expand"); jqExpander.addClass("collapsed"); jqExpander.removeClass("expanded"); } } } function animateControl(sender) { var txt = jq(sender).text(); if (txt.length >= 3) txt = "."; else txt = txt + "."; jq(sender).text(txt); } function HideAndAction(hideLinks, index, previousLink, action) { var jqLink = jq(previousLink); var item = hideLinks[index]; if (jqLink.find("form.hide-button").length === 0) { if (hideLinks.length > index) { var perc = index * 100 / hideLinks.length; fExtSetLoading(perc); if (action !== "hideObject") fExtMessage(action + " (" + index + "/" + hideLinks.length + ") ..."); Hide(item, action === "reload" || (action == "enhance" && jq(item).find("a.author.friend").length > 0 && duplicateLinks.indexOf(item) < 0)); var actArgs = [hideLinks, index + 1, previousLink, action]; ActionWhenElementIsInvisible(item, HideAndAction, actArgs); } else { isHiding = false; fExtSetLoading(100); fExtMessage(undefined); switch (action) { case "reload": ReloadLooper(5); break; case "enhance": if (pstItems.onlyVisible().length === 0) ReloadLooper(5); else InitializeHider(); break; case "nextPost": if (pstItems.onlyVisible().length === 0) ReloadLooper(5); else jq("#nextPost").click(); break; default: break; } } } else setTimeout(function() { HideAndAction(hideLinks, index, previousLink, action); }, settings.hideItemTimeout); } function ReloadLooper(loops) { if (reloadCancelled) { fExtMessage(); return; } else { if (loops === 0) { fExtMessage("Reloading..."); setTimeout(function() { location.reload(); }, 1000); } else { var msg = "Reloading in " + loops + " seconds... (click here to cancel)"; fExtMessage(msg); document.title = msg; setTimeout(function() { ReloadLooper(loops - 1); }, 1000); } } } function Hide(item, displayAfter, handled) { var jqHideButton = item.find("form.hide-button"); if (!isHiding && pstItems.selected === item.attr("id")) { MakeActivePost(item.attr("id"), pstItems.Next()); } if(!handled) { jqHideButton.unbind("click", handleHideClick); jqHideButton.find("a:first").click(); var args = [item, displayAfter, true]; AddUndo(Unhide, args, Hide, args, item.find("p.title").text()); jqHideButton.bind("click", handleHideClick); } item.hide(settings.animationItemTimeout); if (displayAfter) { ActionWhenElementIsInvisible(item, item.show, undefined); } if(pstItems.onlyVisible().length === 0) { reloadCancelled = false; ReloadLooper(5); } return true; } function Unhide(item, displayAfter, handled) { jq(item).show(); if(!handled){ var args = [item, displayAfter, true]; AddUndo(Hide, args, Unhide, args, item.find("p.title").text()); } return true; } function Mark(item, itemType) { item.addClass("markedItem"); item.addClass(itemType); } function MakeActivePost(oldId, newId) { if (oldId === undefined || newId === undefined || oldId !== newId) { if (newId) { if (newId !== pstItems.selected) { pstItems.selected = newId; pstItems.jqSelected = jq("#" + newId); if (!pstItems.jqSelected.hasClass("pstSelected")) pstItems.jqSelected.addClass("pstSelected"); if (settings.autoExpandSelectedPost) { var jsExpander = pstItems.jqSelected.find(".expando-button.collapsed").get(0); if (jsExpander) jsExpander.click(); } } } else { pstItems.selected = undefined; pstItems.jqSelected = undefined; } if (oldId) { var jqOldPost = jq("#" + oldId); jqOldPost.removeClass("pstSelected"); if (settings.autoExpandSelectedPost) { var jsCollapser = jqOldPost.find(".expando-button.expanded").get(0); if (jsCollapser) jsCollapser.click(); } } } if(pstItems.jqSelected) scrollTo(pstItems.jqSelected); return false; } // Image Preloading - Start var preloadIndex = 0; var preloadComplete = 0; var preloadingImages = jq("a.title[href*='imgur'],a.title[href*='gfycat']").not(".thumbnail"); for(var i = 0; i < preloadingImages.length; i++){ var img = preloadingImages.get(i); if (img.href.indexOf("https://") < 0) { img.href = img.href.replace("http://", "https://"); } } function preloadSuccess(e){ console.log("Preloading image " + preloadIndex + " successful!"); preload(); } function preloadError(e){ console.log("Error preloading image " + preloadIndex); preload(); } var preloadingImage = document.createElement('IMG'); preloadingImage.style.display = "block"; preloadingImage.style.position = "absolute"; preloadingImage.style.top = 0; preloadingImage.style.left = 0; preloadingImage.src= "about:blank"; preloadingImage.width=1; preloadingImage.height=1; preloadingImage.onerror = preloadError; preloadingImage.onload = preloadSuccess; document.body.appendChild(preloadingImage); function preload() { if(preloadIndex >= preloadingImages.length) { preloadingImage.remove(); return; } var href = preloadingImages.get(preloadIndex).href; preloadIndex++; console.log("Preloading Image " + preloadIndex + " of " + preloadingImages.length + "(" + href + ")..."); preloadingImage.src = href; } setTimeout(function(){ preload(); }, 1000); // Image preloading - End function scrollTo(item) { var jqItem = jq(item); var offs = jqItem.offset(); var topPos = offs.top - headerHeight; jq(document.body).scrollTop(topPos); //jq(document.body).animate({ scrollTop: topPos }, settings.animationItemTimeout); } function AddToHideLinks(elm) { if (!elm.hasClass("toggleHidden")) elm.addClass("toggleHidden"); if (jq.inArray(elm, hideLinks) < 0) hideLinks.push(elm); } function Vote(id, direction) { if (id !== undefined) { var element; switch (direction) { case "up": element = jq("#" + id).find(".arrow.up, .arrow.upmod"); break; case "down": element = jq("#" + id).find(".arrow.down, .arrow.downmod"); break; default: break; } if (element.length > 0) { element.click(); } } } function AddUndo(fnUndo, argsUndo, fnRedo, argsRedo, suffix) { if (ctxUndo.Items.length === 10) { var removeThis = ctxUndo.Items[0]; ctxUndo.Items.splice(0, 1); removeThis.remove(); } if(!suffix) suffix = ""; else if(suffix.length > 25) suffix = suffix.substring(0, 25) + "..."; var ctxItem = fExtAddCtxItem(suffix && suffix.length > 0 ? fnRedo.name + " - " + suffix : fnRedo.name, ctxUndo); ctxItem.ClickCloses = false; ctxItem.fnUndo = fnUndo; ctxItem.argsUndo = argsUndo; ctxItem.fnRedo = fnRedo; ctxItem.argsRedo = argsRedo; ctxItem.Action = function(event, sender, actor) { sender.fnUndo.apply(this, sender.argsUndo); AddRedo(sender.fnUndo, sender.argsUndo, sender.fnRedo, sender.argsRedo, suffix); sender.Remove(); }; } function AddRedo(fnUndo, argsUndo, fnRedo, argsRedo, suffix) { if (ctxRedo.Items.length === 10) { ctxRedo.Items[0].remove(); ctxRedo.Items.splice(0, 1); } if(!suffix) suffix = ""; else if(suffix.length > 25) suffix = suffix.substring(0, 25) + "..."; var ctxItem = fExtAddCtxItem(suffix && suffix.length > 0 ? fnUndo.name + " - " + suffix : fnUndo.name, ctxRedo); ctxItem.ClickCloses = false; ctxItem.fnUndo = fnUndo; ctxItem.argsUndo = argsUndo; ctxItem.fnRedo = fnRedo; ctxItem.argsRedo = argsRedo; ctxItem.Action = function(event, sender, actor) { sender.fnRedo.apply(this, sender.argsRedo); AddUndo(sender.fnUndo, sender.argsUndo, sender.fnRedo, sender.argsRedo, suffix); sender.remove(); }; } function ToggleVisibility(event, sender, className) { event.preventDefault(); if (jq(sender).data("state") === "shown") { jq(sender).data("state","hidden"); jq(className).hide(); } else { jq(sender).data("state","shown"); jq(className).show(); } } function HideObject(containingArray, arrayName, text, selector) { if (jq.inArray(text, containingArray) < 0) { fExtPopup("Adding '" + text + "' from '" + arrayName + "' to hide."); containingArray.push(text); GMSave(); var links = []; var selectNext = false; jq(selector).parents("div.thing").each(function(index, item) { var jqItem = jq(item); selectNext = selectNext || item.id === pstItems.selected; if (jqItem.find("form.hide-button").length > 0) links.push(jqItem); }); HideAndAction(links, 0, null, "hideObject"); return true; } return false; } function UnhideObject(containingArray, arrayName, text, selector) { var arrayIndex = jq.inArray(text, containingArray); if (arrayIndex >= 0) { fExtPopup("Removing '" + text + "' from '" + arrayName + "'."); containingArray.splice(arrayIndex, 1); GMSave(); return true; } return false; } function GrabContent(htmlContent) { fExtMessage("Loading additional Pages (" + numberOfSitesLoaded + " of max " + settings.maximumNumberOfSitesToLoad + ")"); var navButtonNext = jq(htmlContent).find("div.nav-buttons").find(".next-button").find("a").get(0); if (numberOfSitesLoaded < settings.maximumNumberOfSitesToLoad && navButtonNext) { numberOfSitesLoaded += 1; var srcUrl = navButtonNext.href; //siteTable jq.ajax({ url: srcUrl, method: "get", success: function(data) { jq(data).find("div#siteTable").find("div.thing").each(function() { jq(this).detach().appendTo("div#siteTable"); }); GrabContent(data); }, error: function(data) { console.log(data); } }); } else { if (navButtonNext) jq(navButtonNext).detach().appendTo("#postNavigation"); fExtMessage(numberOfSitesLoaded + " Pages loaded, starting initialization..."); MainInitialization(); } } function InitializeContextMenu() { ctxItemUsrHdr = fExtAddCtxItem("Hide User", rEnhSub); ctxItemUsrHdr.Action = function(event, sender, actor) { var jqThing = getThingForCtxActor(actor); var user = jqThing.find(".author:first").text(); var selector = "a.author:contains(" + user + ")"; var args = [settings.usersToHide, "Users", user, selector]; if (HideObject.apply(sender, args)) AddUndo(UnhideObject, args, HideObject, args, user); }; ctxItemUsrHdrPg = fExtAddCtxItem("Hide User and open Userpage", rEnhSub); ctxItemUsrHdrPg.Action = function(event, sender, actor) { ctxItemUsrHdr.Action(event, sender, actor); var jqThing = getThingForCtxActor(actor); var user = jqThing.find(".author:first").text(); GM_openInTab("https://www.reddit.com/u/" + user + "/submitted/", true); }; ctxItemUsrUnhdr = fExtAddCtxItem("Unhide User", rEnhSub); ctxItemUsrUnhdr.Action = function(event, sender, actor) { var jqThing = getThingForCtxActor(actor); var user = jqThing.find(".author:first").text(); var selector = "a.author:contains(" + user + ")"; var args = [settings.usersToHide, "Users", user, selector]; if (UnhideObject.apply(sender, args)) { jq("a.author:contains(" + user + ")").parents("div.thing").each(function(index, item) { jq(item).show(); }); AddUndo(HideObject, args, UnhideObject, args, user); } }; fExtAddCtxSeparator(rEnhSub); ctxItemSbHdr = fExtAddCtxItem("Hide Sub", rEnhSub); ctxItemSbHdr.Action = function(event, sender, actor) { var jqThing = getThingForCtxActor(actor); var sub = jqThing.find(".subreddit:first").text().replace("/r/", "").replace("r/",""); var selector = "a.subreddit:contains(" + sub + ")"; var args = [settings.subsToHide, "Subs", sub, selector]; if (HideObject.apply(sender, args)) AddUndo(UnhideObject, args, HideObject, args, sub); }; ctxItemSbUnhdr = fExtAddCtxItem("Unhide Sub", rEnhSub); ctxItemSbUnhdr.Action = function(event, sender, actor) { var jqThing = getThingForCtxActor(actor); var sub = jqThing.find(".subreddit:first").text().replace("/r/", "").replace("r/",""); var selector = "a.subreddit:contains(" + sub + ")"; var args = [settings.subsToHide, "Subs", sub, selector]; if (UnhideObject.apply(sender, args)) { jq(selector).parents("div.thing").each(function(index, item) { jq(item).show(); }); AddUndo(HideObject, args, UnhideObject, args, sub); } }; fExtAddCtxSeparator(rEnhSub); ctxItemKeywHdr = fExtAddCtxItem("Hide Keywords", rEnhSub); ctxItemKeywHdr.Action = function(event, sender, actor) { var keyword = fExtGetSelection().trim(); var selector = "a.title:contains(" + keyword + ")"; var args = [settings.keywordsToHide, "Keywords", keyword, selector]; if (HideObject.apply(sender, args)) AddUndo(UnhideObject, args, HideObject, args, keyword); }; ctxItemKeywUnhdr = fExtAddCtxItem("Unhide Keywords", rEnhSub); ctxItemKeywUnhdr.Action = function(event, sender, actor) { var keyword = fExtGetSelection(); var selector = "a.title:contains(" + keyword + ")"; var args = [settings.keywordsToHide, "Keywords", keyword, selector]; if (UnhideObject.apply(sender, args)) { jq(selector).parents("div.thing").each(function(index, item) { jq(item).show(); }); AddUndo(HideObject, args, UnhideObject, args, keyword); } }; fExtAddCtxSeparator(rEnhSub); // Undo/Redo ctxUndo = fExtAddSub("Undo", rEnhSub); ctxRedo = fExtAddSub("Redo", rEnhSub); fExtAddCtxSeparator(rEnhSub); ctxItemCpyHtml = fExtAddCtxItem("Copy HTML", rEnhSub); ctxItemCpyHtml.Action = function(event, sender, actor) { fExtClipboard("Copy", jq('div.content').html()); }; fExtAddCtxSeparator(rEnhSub); ctxItemSett = fExtAddCtxItem("REnhancer Settings", rEnhSub); ctxItemSett.Action = function() { ShowSettings(); }; } function InitializeEventHandlers() { jq("#fExtMessage").click(function() { reloadCancelled = true; }); jq("#hideAll").click(HideAllClick); jq("#hideSelected").click(HideSelectedClick); jq("#expander").click(function(e) { e.preventDefault(); if(jq("#expander").hasClass("expanded")) ExpandAndNext(jq("div.expando-button.expanded:visible"), 0); else ExpandAndNext(jq("div.expando-button.collapsed:visible"), 0); return false; }); jq("#renhSettingsSave").click(SaveSettingsDialog); jq("#upvoter").click(function(e) { e.preventDefault(); VoteAndNext(jq(this), upVoteLinks, 0); return false; }); jq("#downvoter").click(function(e) { e.preventDefault(); VoteAndNext(jq(this), downVoteLinks, 0); return false; }); jq("#renhSettingsClose").click(function(e) { jq("#rEnhSettings").hide(); return false; }); jq("ul.flat-list.buttons>li:not(.report-button)").click(function(e){ if(e.target.tagName !== "A" && e.target.tagName !== "FORM") { var targetItem = jq(e.target).find("a").first().get(0); if(targetItem) targetItem.click(e); else return true; } else return true; }); } function handleHideClick(e){ var jqThing; if (e.data) jqThing = jq("#" + e.data.thingID); else jqThing = jq(this).parents("div.thing:first"); var args = [jqThing, false, true]; AddUndo(Unhide, args, Hide, args, jqThing.find("p.title").text()); Hide(jqThing, undefined, true); } function ActionWhenElementIsInvisible(element, action, args, step) { if (element.hasClass("hidden") || element.find("a[text=hidden]").length === 1 || step === 3) action.apply(element, args); else { if(isNaN(step)) step = 0; step++; setTimeout(function() { ActionWhenElementIsInvisible(element, action, args, step); }, settings.hideItemTimeout); } } // Functions - Load and Save function GMLoadValue(valueName) { var ret = GM_getValue(valueName); if (ret !== undefined) return ret.toString().split(","); return []; } function GMSave() { GM_setValue("settings", JSON.stringify(settings)); } function GMLoad() { settings = { // Defaults accountName: "enter your account name here, e.g. throwaway001", markNSFW: true, replaceTopNew: false, sortByVotes: false, autoExpandSelectedPost: true, removeDuplicates: true, maximumNumberOfSitesToLoad: 1, animationItemTimeout: 500, imagePreloadingTimeout: 250, hideItemTimeout: 750, hideUsers: true, hideUsersNSFWonly: true, usersToHide: undefined, hideSubs: true, subsToHide: undefined, hideKeywords: true, keywordsToHide: undefined, shortcuts: { nextPost: 98, previousPost: 104, toggleSelected: 101, hideSelected: 99, hideAll: 97, voteUp: 105, voteDown: 103, nextImage: 102, previousImage: 100, zoomIn: 107, zoomOut: 109, rotateLeft: 111, rotateRight: 106, undoLast: -1, redoLast: -1, }, panelView: false, }; var lSettings = GM_getValue("settings"); if (lSettings !== undefined) { settingsFromLoad(settings, JSON.parse(lSettings.toString())); } if (!settings.usersToHide) settings.usersToHide = GMLoadValue("usersToHide"); if (!settings.subsToHide) settings.subsToHide = GMLoadValue("subsToHide"); if (!settings.keywordsToHide) settings.keywordsToHide = GMLoadValue("keywordsToHide"); } function settingsFromLoad(setSettings, getSettings){ for (var k in getSettings) { var varType = typeof getSettings[k]; var varTypeB = typeof setSettings[k]; switch (varType) { case "boolean": setSettings[k] = Boolean(getSettings[k]); break; case "number": setSettings[k] = parseInt(getSettings[k]); break; case "object": if(Array.isArray(getSettings[k])) setSettings[k] = getSettings[k]; else settingsFromLoad(setSettings[k], getSettings[k]); break; case "string": default: setSettings[k] = getSettings[k]; break; } } } // Functions - Misc function getThingForCtxActor(actor){ return jq(actor).hasClass("thing") ? jq(actor) : jq(actor).parents("div.thing:first"); } function grabExtension(src) { var start, end; start = src.lastIndexOf(".") + 1; if (src.lastIndexOf("?") >= 0) end = src.lastIndexOf("?"); else end = src.length; return src.substring(start, end); } function colorObject(r, g, b, a){ var rv = { red: 0, blue: 0, green: 0, alpha: 100 }; if(r) rv.red = parseInt(r); if(g) rv.green = parseInt(g); if(b) rv.blue = parseInt(b); if(a) rv.alpha = parseInt(a); rv.getRgba = function(){ return "rgba(" + this.red + "," + this.green + "," + this.blue + ", " + (this.alpha / 100) + ")"; }; rv.getHex = function(){ var strR = this.red.toString(16); var strG = this.blue.toString(16); var strB = this.green.toString(16); if(strR.length === 1) strR = "0" + strR; if(strG.length === 1) strG = "0" + strG; if(strB.length === 1) strB = "0" + strB; return "#" + strR + strG + strB; }; return rv; } function getRandomColor() { var color = '#'; // Neu rgb-style var min = 155, max = 255; var cO = colorObject(Math.random() * (max - min) + min, Math.random() * (max - min) + min, Math.random() * (max - min) + min); if(cO.red > cO.green && cO.red > cO.blue) color = getRandomColor(); else color = cO.getHex(); return color; } // Functions - End
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址