From 5f68100866623c86d2ab78138e3717a06aef8162 Mon Sep 17 00:00:00 2001 From: echibiki Date: Sun, 4 Mar 2018 20:31:17 -0500 Subject: [PATCH] docs and Ignoring-Enhancement edits in proggress --- 4chan-Ignoring-Enhancements.user.js | 1422 ++++++++++++++++++----------------- README.md | 7 +- Thread-Rebuilder.user.js | 2 +- Visible-Password.user.js | 11 +- 4 files changed, 747 insertions(+), 695 deletions(-) rewrite 4chan-Ignoring-Enhancements.user.js (67%) diff --git a/4chan-Ignoring-Enhancements.user.js b/4chan-Ignoring-Enhancements.user.js dissimilarity index 67% index 5d3c2a8..e930fa2 100644 --- a/4chan-Ignoring-Enhancements.user.js +++ b/4chan-Ignoring-Enhancements.user.js @@ -1,691 +1,731 @@ -// ==UserScript== -// @name 4chan-Ignoring-Enhancements -// @namespace http://tampermonkey.net/ -// @version 1.4 -// @description 4chan Pain Kill Extension -// @author ECHibiki-/qa/ -// @match http://boards.4chan.org/* -// @match https://boards.4chan.org/* -// @include https://boards.4chan.org/* -// @include http://boards.4chan.org/* -// @run-at document-body -// @updateURL https://github.com/ECHibiki/4chan-UserScripts/raw/master/4chan-Ignoring-Enhancements.user.js -// @downloadURL https://github.com/ECHibiki/4chan-UserScripts/raw/master/4chan-Ignoring-Enhancements.user.js -// ==/UserScript== - -var localStoreThreads; -var bowser; -var finished = false; -var windowDisplayed = false; -var defaultExpireTime = 172800000; -var expireTime; - -var windowDisplayed = false; -var numberOfFilters = 0; -var initialFilters = []; -var kill = []; -var finished = false; -var observer; -var secondObserverSet; - -//is storage possible -function storageAvailable(type) { - try { - var storage = window[type], - x = '__storage_test__'; - storage.setItem(x, x); - storage.removeItem(x); - return true; - } - catch(e) { - return e instanceof DOMException && ( - // everything except Firefox - e.code === 22 || - // Firefox - e.code === 1014 || - // test name field too, because code might not be present - // everything except Firefox - e.name === 'QuotaExceededError' || - // Firefox - e.name === 'NS_ERROR_DOM_QUOTA_REACHED') && - // acknowledge QuotaExceededError only if there's something already stored - storage.length !== 0; - } -} - -//What Browser -function detectBrowser() { - if((navigator.userAgent.indexOf("Opera") || navigator.userAgent.indexOf('OPR')) != -1 ) - { - console.log("Opera"); - return 0; - } - else if(navigator.userAgent.indexOf("Chrome") != -1 ) - { - console.log("Chrome"); - return 1; - } - else if(navigator.userAgent.indexOf("Safari") != -1) - { - console.log("Safari"); - return 2; - } - else if(navigator.userAgent.indexOf("Firefox") != -1 ) - { - console.log("FireFox"); - return 3; - } - else if((navigator.userAgent.indexOf("MSIE") != -1 ) || (!!document.documentMode == true )) //IF IE > 10 - { - console.log("IE"); - return 4; - } - else - { - console.log("Other"); - return -1; - } -} - -//hide image onclick listener -function hideImage(event){ - var hideIndex = this.src.indexOf(".HIDDEN"); - if((event.ctrlKey && event.shiftKey) && hideIndex == -1){ - event.preventDefault(); - event.stopPropagation(); - if (storageAvailable('localStorage')) { - if(this.id.charAt(0) == "p") this.id = "f" + this.id.substr(1); - localStorage.setItem(this.id, Date.now()); - } - else { - console.log("No Storage"); - } - this.src = this.src + ".HIDDEN" + "?" + Date.now(); - return false; - } - else if(event.ctrlKey && event.shiftKey){ - event.preventDefault(); - event.stopPropagation(); - if (storageAvailable('localStorage')) { - if(this.id.charAt(0) == "p") this.id = "f" + this.id.substr(1); - localStorage.removeItem(this.id); - } - else { - console.log("No Storage"); - } - this.src = this.src.substring(0, hideIndex); - return false; - } - return true; -} - -//functions to find properties by regex -function getPropertyByRegex(obj,propName) { - var re = new RegExp("^" + propName + "(\\[\\d*\\])?$"), - key; - var rtnArray = []; - for (key in obj) - if (re.test(key)) - rtnArray.push(key); - return rtnArray; -} - -//retrieve from memory the hidden iamges -var j = 0; -function retrieveStates(){ - var i = 0, - oJson = {}, - sKey; - while( i < window.localStorage.length) { - i++; - sKey = window.localStorage.key(i); - oJson[sKey] = window.localStorage.getItem(sKey); - } - localStoreThreads = getPropertyByRegex(oJson,"f[0-9]*IMG"); - localStoreThreads.forEach(function callback(elem){ - if(Date.now() - oJson[elem] > expireTime) - localStorage.removeItem(elem); - var node = document.getElementById(""+elem); - if(node !== null && node.src.indexOf(".HIDDEN") == -1){ - node.src = node.src + ".HIDDEN" + "?" + Date.now(); - j++; - } - else if((node = document.getElementById("p"+elem.substring(1))) !== null && node.src.indexOf(".HIDDEN") == -1){ - node.src = node.src + ".HIDDEN" + "?" + Date.now(); - j++; - } - else if((node = document.getElementById("thread-"+elem.substring(1))) !== null && node.src.indexOf(".HIDDEN") == -1){ - node.src = node.src + ".HIDDEN" + "?" + Date.now(); - j++; - } - else if((node = document.getElementById("thumb-"+elem.substring(1))) !== null && node.src.indexOf(".HIDDEN") == -1){ - node.src = node.src + ".HIDDEN" + "?" + Date.now(); - j++; - } - }); - console.log(j); -} - - - -function hideWindow(){ - var style = document.createElement('style'); - style.innerHTML = ".inputs{background-color:rgb(200,200,200);margin:5px 7px;width:100px;}"; - document.body.appendChild(style); - - var backgroundDiv = document.createElement("div"); - backgroundDiv.setAttribute("style", "border:solid 1px black;position:fixed;width:100%;height:100%;background-color:rgba(200,200,200,0.3);top:0;left:0;display:none; z-index:9"); - backgroundDiv.setAttribute("id", "hiBackground"); - document.body.appendChild(backgroundDiv); - backgroundDiv.addEventListener("click", hideToggle); - - var windowDiv = document.createElement("div"); - windowDiv.setAttribute("style", "border:solid 1px black;position:fixed;width:400px;background-color:rgb(200,200,200);left:40%;top:20%;margin-bottom:0; display:none; z-index:10"); - windowDiv.setAttribute("id", "hiWindow"); - - var closeDiv = document.createElement("div"); - closeDiv.setAttribute("style", "border:solid 1px black;position:absolute;width:25px;height:25px;background-color:rgba(255,100,90,0.9); right:3px;top:3px; z-index:10"); - closeDiv.addEventListener("click", hideToggle); - windowDiv.appendChild(closeDiv); - - var titleP = document.createElement("p"); - titleP.setAttribute("style", "margin-left:5px;margin-top:5px"); - var titleText = document.createTextNode("Filter Settings"); - titleP.appendChild(titleText); - windowDiv.appendChild(titleP); - - var containerDiv = document.createElement("div"); - containerDiv.setAttribute("style","background-color:white;margin:0 0;padding:5px;"); - windowDiv.appendChild(containerDiv); - - var expirationLabel = document.createElement("label"); - var expirationText = document.createTextNode("Expiration Time(hours): "); - expirationLabel.appendChild(expirationText); - containerDiv.appendChild(expirationLabel); - var expirationInput = document.createElement("input"); - expirationInput.setAttribute("id", "expirationTime"); - containerDiv.appendChild(expirationInput); - containerDiv.appendChild(expirationInput); - containerDiv.appendChild(document.createElement("br")); - var setButton = document.createElement("input"); - setButton.setAttribute("type", "button"); - setButton.setAttribute("id", "setTime"); - setButton.setAttribute("value", "Set Time"); - setButton.addEventListener("click", function(){ - // console.log("A"); - if (storageAvailable('localStorage')) { - var time = document.getElementById("expirationTime"); - var msTime = time.value * 3600000; - if (msTime == 0) msTime = defaultExpireTime; - expireTime = msTime; - //console.log("B" + expireTime); - localStorage.setItem("ExpirationTime", msTime); - hideToggle(); - } - }); - expirationInput.setAttribute("value", localStorage.getItem("ExpirationTime") / 3600000); - containerDiv.appendChild(setButton); - - document.body.appendChild(windowDiv); - -} - -function hideToggle(){ - if(windowDisplayed){ - document.getElementById("hiWindow").style.display = "none"; - document.getElementById("hiBackground").style.display = "none"; - windowDisplayed = false; - } - else{ - document.getElementById("hiWindow").style.display = "inline-block"; - document.getElementById("hiBackground").style.display = "inline-block"; - windowDisplayed = true; - } -} - -function hideButton(){ - var button = document.createElement("input"); - button.setAttribute("Value", "Hide Image Settings"); - button.setAttribute("type", "button"); - button.setAttribute("style", "position:absolute;top:45px"); - button.addEventListener("click", hideWindow); - if(document.body === null){ - setTimeout(hideButton, 30); - } - else{ - document.body.appendChild(button); - button.addEventListener("click", hideToggle); - } - expireTime = localStorage.getItem("ExpirationTime"); - //console.log("Z" + expireTime); -} - - -//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// -//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// -//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// -//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// -//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// -//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// -//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// -//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// - -function formatSettings(input){ - var rtn = input.split('"-"'); - var i = 0; - rtn.forEach(function(filter){ - rtn[i] = filter.replace("\"", ""); - i++; - }); - return rtn; -} - -function loadSettings(){ - var i = 0, - oJson = {}, - sKey; - while( i < window.localStorage.length) { - i++; - sKey = window.localStorage.key(i); - oJson[sKey] = window.localStorage.getItem(sKey); - } - numberOfFilters = oJson["q"]; - console.log(numberOfFilters); - filters = getPropertyByRegex(oJson,"filter[0-9]*"); - filters.forEach(function(filter){ - initialFilters.push(formatSettings(oJson[filter])); - }); -} - -function saveSettings(){ - kill = []; - if(storageAvailable('localStorage')){ - window.localStorage.setItem("q", numberOfFilters); - for (var i = 0 ; i < numberOfFilters; i++){ - var pattern = document.getElementById("Pattern"+i).value; - var replacement = document.getElementById("Replacement"+i).value; - var setting = "g"; - if(pattern === "" || replacement === "") continue; - if (pattern.charAt(0) == "/" && pattern.charAt(pattern.length - 1) == "/"){ - pattern = pattern + setting; - } - else if(pattern.charAt(0) !== "/" && pattern.substr(pattern.length - 2).match(/\/[a-zA-Z$]/) == null){ - pattern = "/" + pattern + "/" + setting; - } - document.getElementById("Pattern"+i).value = pattern; - var saveString = '"' + document.getElementById("Active"+i).checked + '"-"' + pattern + '"-"' + replacement + '"'; - window.localStorage.setItem("filter" + i, saveString); - } - } - alert("Replacements Saved"); -} - -function filterWindow(){ - var style = document.createElement('style'); - style.innerHTML = ".inputs{background-color:rgb(200,200,200);margin:5px 7px;width:100px;}"; - document.body.appendChild(style); - - var backgroundDiv = document.createElement("div"); - backgroundDiv.setAttribute("style", "border:solid 1px black;position:fixed;width:100%;height:100%;background-color:rgba(200,200,200,0.3);top:0;left:0;display:none; z-index:9"); - backgroundDiv.setAttribute("id", "FilterBackground"); - document.body.appendChild(backgroundDiv); - backgroundDiv.addEventListener("click", filterToggle); - - var windowDiv = document.createElement("div"); - windowDiv.setAttribute("style", "border:solid 1px black;position:fixed;width:400px;background-color:rgb(200,200,200);left:40%;top:20%;margin-bottom:0; display:none; z-index:10"); - windowDiv.setAttribute("id", "FilterWindow"); - - var closeDiv = document.createElement("div"); - closeDiv.setAttribute("style", "border:solid 1px black;position:absolute;width:25px;height:25px;background-color:rgba(255,100,90,0.9); right:3px;top:3px; z-index:10"); - closeDiv.addEventListener("click", filterToggle); - windowDiv.appendChild(closeDiv); - - var titleP = document.createElement("p"); - titleP.setAttribute("style", "margin-left:5px;margin-top:5px"); - var titleText = document.createTextNode("Filter Settings"); - titleP.appendChild(titleText); - windowDiv.appendChild(titleP); - - var containerDiv = document.createElement("div"); - containerDiv.setAttribute("style","background-color:white;margin:0 0;padding:5px;"); - windowDiv.appendChild(containerDiv); - - var filterTable = document.createElement("table"); - filterTable.setAttribute("style", "text-align:center;"); - filterTable.setAttribute("id", "FilterTable"); - containerDiv.appendChild(filterTable); - - var tableRow = document.createElement("tr"); - filterTable.appendChild(tableRow); - var tableHeadActive = document.createElement("th"); - var headTextActive = document.createTextNode("Active"); - tableHeadActive.appendChild(headTextActive); - filterTable.appendChild(tableHeadActive); - var tableHeadPattern = document.createElement("th"); - var headTextPattern = document.createTextNode("Pattern"); - tableHeadPattern.appendChild(headTextPattern); - filterTable.appendChild(tableHeadPattern); - var tableHeadReplacement = document.createElement("th"); - var headTextReplacement = document.createTextNode("Replacement"); - tableHeadReplacement.appendChild(headTextReplacement); - filterTable.appendChild(tableHeadReplacement); - - //loop to create rows - //console.log(numberOfFilters); - if (numberOfFilters === 0 || isNaN(numberOfFilters)) numberOfFilters = 6; - //console.log(numberOfFilters); - for (var i = 0; i < numberOfFilters ; i++){ - var tableRowContents = document.createElement("tr"); - tableRowContents.setAttribute("id", "FilterRow" + i); - - var tableDataActive = document.createElement("td"); - var tableCheckBoxActive = document.createElement("input"); - tableCheckBoxActive.setAttribute("type", "checkbox"); - tableCheckBoxActive.setAttribute("id", "Active" + i); - tableDataActive.appendChild(tableCheckBoxActive); - tableRowContents.appendChild(tableDataActive); - - var tableDataPattern = document.createElement("td"); - var tableInputPattern = document.createElement("input"); - tableInputPattern.setAttribute("class", "inputs"); - tableInputPattern.setAttribute("id", "Pattern" + i); - tableDataPattern.appendChild(tableInputPattern); - tableRowContents.appendChild(tableDataPattern); - - var tableDataReplacement = document.createElement("td"); - var tableInputReplacement = document.createElement("input"); - tableInputReplacement.setAttribute("class", "inputs"); - tableInputReplacement.setAttribute("id", "Replacement" + i); - tableDataReplacement.appendChild(tableInputReplacement); - tableRowContents.appendChild(tableDataReplacement); - - filterTable.appendChild(tableRowContents); - } - - var tableLastContents = document.createElement("tr"); - - var tableAddCollumn = document.createElement("td"); - var tableAddRowButton = document.createElement("input"); - var tableSubtractRowButton = document.createElement("input"); - tableSubtractRowButton.setAttribute("type", "button"); - tableSubtractRowButton.setAttribute("value", "-"); - tableSubtractRowButton.setAttribute("style", "padding: 7px 0; margin:5px 0;"); - tableAddCollumn.appendChild(tableSubtractRowButton); - tableSubtractRowButton.addEventListener("click", removeRow); - tableAddRowButton.setAttribute("type", "button"); - tableAddRowButton.setAttribute("value", "+"); - tableAddRowButton.setAttribute("style", "padding: 7px 0; margin:5px 0;"); - tableAddCollumn.appendChild(tableAddRowButton); - tableAddRowButton.addEventListener("click", addRow); - - tableLastContents.appendChild(tableAddCollumn); - - var tableSetCollumn = document.createElement("td"); - var tableConfirmButton = document.createElement("input"); - tableConfirmButton.setAttribute("type", "button"); - tableConfirmButton.setAttribute("id", "tableConfirmButton"); - tableConfirmButton.setAttribute("value", "Set Replacements"); - tableConfirmButton.setAttribute("style", "padding: 7px 0; margin:5px 0;"); - tableConfirmButton.addEventListener("click", saveSettings); - tableConfirmButton.addEventListener("click", modifyDOM); - tableConfirmButton.addEventListener("click", filterToggle); - tableSetCollumn.appendChild(tableConfirmButton); - tableLastContents.appendChild(tableSetCollumn); - - - var tableCloseCollumn = document.createElement("td"); - var tableCloseButton = document.createElement("input"); - tableCloseButton.setAttribute("type", "button"); - tableCloseButton.setAttribute("value", "Close Menu"); - tableCloseButton.setAttribute("style", "padding: 7px 0; margin:5px 0;"); - tableCloseButton.addEventListener("click", filterToggle); - tableCloseCollumn.appendChild(tableCloseButton); - tableLastContents.appendChild(tableCloseCollumn); - - filterTable.appendChild(tableLastContents); - - document.body.appendChild(windowDiv); - -} - -function filterToggle(){ - if(windowDisplayed){ - document.getElementById("FilterWindow").style.display = "none"; - document.getElementById("FilterBackground").style.display = "none"; - windowDisplayed = false; - } - else{ - document.getElementById("FilterWindow").style.display = "inline-block"; - document.getElementById("FilterBackground").style.display = "inline-block"; - windowDisplayed = true; - } -} - -function filterButton(){ - var button = document.createElement("input"); - button.setAttribute("Value", "Word Filter Settings"); - button.setAttribute("type", "button"); - button.setAttribute("style", "position:absolute;top:75px"); - button.addEventListener("click", filterWindow); - document.body.appendChild(button); - button.addEventListener("click", filterToggle); -} - -function addRow(){ - var table = document.getElementById("FilterTable"); - table.deleteRow(parseInt(numberOfFilters) + 1); - numberOfFilters++; - - var tableRowContents = document.createElement("tr"); - tableRowContents.setAttribute("id", "FilterRow" + (numberOfFilters - 1)); - - var tableDataActive = document.createElement("td"); - var tableCheckBoxActive = document.createElement("input"); - tableCheckBoxActive.setAttribute("type", "checkbox"); - tableCheckBoxActive.setAttribute("id", "Active" + (numberOfFilters - 1)); - tableDataActive.appendChild(tableCheckBoxActive); - tableRowContents.appendChild(tableDataActive); - - var tableDataPattern = document.createElement("td"); - var tableInputPattern = document.createElement("input"); - tableInputPattern.setAttribute("class", "inputs"); - tableInputPattern.setAttribute("id", "Pattern" + (numberOfFilters - 1)); - tableDataPattern.appendChild(tableInputPattern); - tableRowContents.appendChild(tableDataPattern); - - var tableDataReplacement = document.createElement("td"); - var tableInputReplacement = document.createElement("input"); - tableInputReplacement.setAttribute("class", "inputs"); - tableInputReplacement.setAttribute("id", "Replacement" + (numberOfFilters - 1)); - tableDataReplacement.appendChild(tableInputReplacement); - tableRowContents.appendChild(tableDataReplacement); - - table.appendChild(tableRowContents); - - var tableLastContents = document.createElement("tr"); - - var tableAddCollumn = document.createElement("td"); - var tableAddRowButton = document.createElement("input"); - var tableSubtractRowButton = document.createElement("input"); - tableSubtractRowButton.setAttribute("type", "button"); - tableSubtractRowButton.setAttribute("value", "-"); - tableSubtractRowButton.setAttribute("style", "padding: 7px 0; margin:5px 0;"); - tableAddCollumn.appendChild(tableSubtractRowButton); - tableSubtractRowButton.addEventListener("click", removeRow); - tableAddRowButton.setAttribute("type", "button"); - tableAddRowButton.setAttribute("value", "+"); - tableAddRowButton.setAttribute("style", "padding: 7px 0; margin:5px 0;"); - tableAddCollumn.appendChild(tableAddRowButton); - tableAddRowButton.addEventListener("click", addRow); - - tableLastContents.appendChild(tableAddCollumn); - - var tableSetCollumn = document.createElement("td"); - var tableConfirmButton = document.createElement("input"); - tableConfirmButton.setAttribute("type", "button"); - tableConfirmButton.setAttribute("id", "tableConfirmButton"); - tableConfirmButton.setAttribute("value", "Set Replacements"); - tableConfirmButton.setAttribute("style", "padding: 7px 0; margin:5px 0;"); - tableConfirmButton.addEventListener("click", saveSettings); - tableConfirmButton.addEventListener("click", modifyDOM); - tableConfirmButton.addEventListener("click", filterToggle); - tableSetCollumn.appendChild(tableConfirmButton); - tableLastContents.appendChild(tableSetCollumn); - - var tableCloseCollumn = document.createElement("td"); - var tableCloseButton = document.createElement("input"); - tableCloseButton.setAttribute("type", "button"); - tableCloseButton.setAttribute("value", "Close Menu"); - tableCloseButton.setAttribute("style", "padding: 7px 0; margin:5px 0;"); - tableCloseButton.addEventListener("click", filterToggle); - tableCloseCollumn.appendChild(tableCloseButton); - tableLastContents.appendChild(tableCloseCollumn); - - table.appendChild(tableLastContents); -} - -function removeRow(){ - var table = document.getElementById("FilterTable"); - if(numberOfFilters != 0){ - table.deleteRow(numberOfFilters); - numberOfFilters--; - } -} - -function setTable(){ - var i = 0; - initialFilters.forEach(function(filter){ - if(filter[2] === null || filter[1] === null || filter[0] === null || i == numberOfFilters) return; - if(filter[0] == "true"){ - document.getElementById("Active"+i).checked = true; - } - else if(filter[0] == "false"){ - document.getElementById("Active"+i).checked = false; - } - document.getElementById("Pattern"+i).value = filter[1]; - document.getElementById("Replacement"+i).value = filter[2]; - i++; - }); -} - - -//1111111111111111111111111111111111111111111111111111111111111111111111////11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111// -//1111111111111111111111111111111111111111111111111111111111111111111111////11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111// -//1111111111111111111111111111111111111111111111111111111111111111111111////11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111// -//1111111111111111111111111111111111111111111111111111111111111111111111////11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111// -//1111111111111111111111111111111111111111111111111111111111111111111111////11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111// -//1111111111111111111111111111111111111111111111111111111111111111111111////11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111// -//1111111111111111111111111111111111111111111111111111111111111111111111////11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111// -//1111111111111111111111111111111111111111111111111111111111111111111111////11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111// -//1111111111111111111111111111111111111111111111111111111111111111111111////11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111// -//1111111111111111111111111111111111111111111111111111111111111111111111////11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111// - - -function modifyDOM(){ - if(finished) { - var start = document.getElementById("delform"); - if (start === null) start = document.body; - else start = start.firstChild; - if(!secondObserverSet){ - //console.log(start); - observer.disconnect(); - observeDynamicMutation(start); - secondObserverSet = true; - } - } - else { - var start = document; - } - if(start === null) return; - var itterator = document.createTreeWalker(start, NodeFilter.SHOW_ELEMENTS, NodeFilter.SHOW_ELEMENTS); - var node = ""; - - //console.log("modify DOM"); - while((node = itterator.nextNode())){ - var cname = node.className; - var tag = node.tagName; - if(tag === "IMG" || tag === "img"){ - if(node.getAttribute("data-md5") !== null || node.className.indexOf("thumb") != -1){ - finished = true; - node.id = node.parentNode.parentNode.id + "IMG"; - node.addEventListener("click", hideImage, {passive:false, capture:false, once:false}); - } - } - else if(cname == "postMessage"){ - while((localNode = itterator.nextNode())){ - var className = localNode.className; - if(className == undefined || className == "quotelink"){ - for(var i = 0 ; i < numberOfFilters; i++){ - //console.log(localNode.className); - if(kill[i] == true) continue; - filter = document.getElementById("Pattern"+i); - replacement = document.getElementById("Replacement"+i); - active = document.getElementById("Active"+i); - if(active.checked){ - finished = true; - var lastChar = filter.value.length - 1; - var filterText = filter.value; - if(filterText === "") break; - var setting = filterText.substr(lastChar); - filterText = filterText.substr(1, lastChar-2); - filterText = "(^|[\\s!$%^&*()_+|~\\-=`{}\\[\\]:\";'<>?,\\.\\/])" + filterText + "([\\s!$%^&*()_+|~\\-=`{}\\[\\]:\";'<>?,\\.\\/]|$)"; - try{ - var regex = new RegExp(filterText, setting); - localNode.textContent = localNode.textContent.replace(regex, " " + replacement.value + " "); - } - catch(e){ - alert(i + "'s regex was invalid"); - kill[i] = true; - } - // console.log("Inner: " + (Date.now() - later)); - } - } - } - else break; - } - - } - } -} - -//detect page changes -function observeDynamicMutation(node){ - if(node === undefined) - node = document; - observer = new MutationObserver(function callBack(mutations){ - var later = Date.now(); - retrieveStates(); - modifyDOM(); - //console.log("PKX: " + (Date.now() - later)); - }); - var config = {subtree: true, childList:true}; - observer.observe(node, config); -} - -if (window.top != window.self) //-- Don't run on frames or iframes - return; - -//initial onload setup -function hideSetup(){ - modifyDOM(); - retrieveStates(); - hideButton(); -} - -function filterSetup(){ - loadSettings(); - filterButton(); - filterWindow(); - setTable(); -} - -function pkxSetup(){ - hideSetup(); - filterSetup(); - observeDynamicMutation(); -} - -browser = detectBrowser(); -pkxSetup(); -console.log("Script loaded: 4chanPKX"); - +// ==UserScript== +// @name 4chan-Ignoring-Enhancements +// @namespace http://tampermonkey.net/ +// @version 1.6 +// @description 4chan Pain Kill Extension +// @author ECHibiki-/qa/ +// @match http://boards.4chan.org/* +// @match https://boards.4chan.org/* +// @include https://boards.4chan.org/* +// @include http://boards.4chan.org/* +// @run-at document-body +// @updateURL https://github.com/ECHibiki/4chan-UserScripts/raw/master/4chan-Ignoring-Enhancements.user.js +// @downloadURL https://github.com/ECHibiki/4chan-UserScripts/raw/master/4chan-Ignoring-Enhancements.user.js +// ==/UserScript== + +/* +This userscript enables 4chan users to hide images in the catalog and threads. +Gives the ability to hide images with ctrl+shift+click. Stores in browser memory for new sessions. +Also includes the ability to do word replacements with a regex replacement system. +*/ + +var local_store_threads; +var browser; +var finished = false; +var window_displayed = false; +var default_expire_time = 172800000; +var expire_time; + +var number_of_filters = 0; +var initial_filters = []; +var kill = []; +var finished = false; +var observer; + +//The following is image hiding functions. +//The next are filter functions +//The last are setup functions + +/** +0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// +//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// +//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// +//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// +//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// +//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// +//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// +//0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000// +**/ + + +//is storage possible +function storageAvailable(type) { + try { + var storage = window[type], + x = '__storage_test__'; + storage.setItem(x, x); + storage.removeItem(x); + return true; + } + catch(e) { + //From https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API + return e instanceof DOMException && ( + // everything except Firefox + e.code === 22 || + // Firefox + e.code === 1014 || + // test name field too, because code might not be present + // everything except Firefox + e.name === 'QuotaExceededError' || + // Firefox + e.name === 'NS_ERROR_DOM_QUOTA_REACHED') && + // acknowledge QuotaExceededError only if there's something already stored + storage.length !== 0; + } +} + +//What Browser +function detectBrowser() { + if((navigator.userAgent.indexOf("Opera") || navigator.userAgent.indexOf('OPR')) != -1 ) + { + //console.log("Opera"); + return 0; + } + else if(navigator.userAgent.indexOf("Chrome") != -1 ) + { + //console.log("Chrome"); + return 1; + } + else if(navigator.userAgent.indexOf("Safari") != -1) + { + //console.log("Safari"); + return 2; + } + else if(navigator.userAgent.indexOf("Firefox") != -1 ) + { + //console.log("FireFox"); + return 3; + } + else if((navigator.userAgent.indexOf("MSIE") != -1 ) || (!!document.documentMode == true )) //IF IE > 10 + { + //console.log("IE"); + return 4; + } + else + { + //console.log("Other"); + return -1; + } +} + +//hide image onclick listener. +//Method 404's a given image. This 404'ing allows image dissabling to be toggled on and off. +//Post number associated with the image is stored in local storage. +function hideImage(event){ + var hide_index = this.src.indexOf(".HIDDEN"); + if((event.ctrlKey && event.shiftKey) && hide_index == -1){ + event.preventDefault(); + event.stopPropagation(); + if (storageAvailable('localStorage')) { + if(this.id.charAt(0) == "p") this.id = "f" + this.id.substr(1); + localStorage.setItem(this.id, Date.now()); + } + else { + //console.log("No Storage"); + } + //some browsers require a querry on the image URL to 404 it. + this.src = this.src + ".HIDDEN" + "?" + Date.now(); + return false; + } + else if(event.ctrlKey && event.shiftKey){ + event.preventDefault(); + event.stopPropagation(); + if (storageAvailable('localStorage')) { + if(this.id.charAt(0) == "p") this.id = "f" + this.id.substr(1); + localStorage.removeItem(this.id); + } + else { + //console.log("No Storage"); + } + this.src = this.src.substring(0, hide_index); + return false; + } + return true; +} + +//functions to find properties by regex +function getPropertyByRegex(obj,propName) { + var re = new RegExp("^" + propName + "(\\[\\d*\\])?$"), + key; + var rtnArray = []; + for (key in obj) + if (re.test(key)) + rtnArray.push(key); + return rtnArray; +} + +//retrieve from memory the hidden images +//Images are stored in memory as fIMG and recalled using the storage_key +//Function makes a check to see if the hiding time limit for the thread has expired or not. +var hidden_count = 0; +function retrieveStates(){ + var storage_position = 0, + oJson = {}, + storage_key; + while(storage_position < window.localStorage.length) { + storage_position++; + storage_key = window.localStorage.key(storage_position); + oJson[storage_key] = window.localStorage.getItem(storage_key); + } + local_store_threads = getPropertyByRegex(oJson,"f[0-9]*IMG"); + expire_time = localStorage.getItem("ExpirationTime"); + + local_store_threads.forEach(function callback(thread){ + //console.log(Date.now() - oJson[thread] + " > " + expire_time); + if(Date.now() - oJson[thread] > expire_time) + localStorage.removeItem(thread); + + //set hidden threads + var image_node; + image_node = document.getElementById(""+thread); + if(image_node !== null && image_node.src.indexOf(".HIDDEN") == -1){ + image_node.src = image_node.src + ".HIDDEN" + "?" + Date.now(); + hidden_count++; + } + + image_node = document.getElementById("p"+thread.substring(1)); + if(image_node !== null && image_node.src.indexOf(".HIDDEN") == -1){ + image_node.src = image_node.src + ".HIDDEN" + "?" + Date.now(); + hidden_count++; + } + + image_node = document.getElementById("thread-"+thread.substring(1)); + if(image_node !== null && image_node.src.indexOf(".HIDDEN") == -1){ + image_node.src = image_node.src + ".HIDDEN" + "?" + Date.now(); + hidden_count++; + } + image_node = document.getElementById("thumb-"+thread.substring(1)); + if(image_node !== null && image_node.src.indexOf(".HIDDEN") == -1){ + image_node.src = image_node.src + ".HIDDEN" + "?" + Date.now(); + hidden_count++; + } + + + + }); + // half the ammount because it hides both index and catalog + console.log("HIDDEN THREADS: " + hidden_count / 2); +} + + +//settings for time expiration on image hiding +function hideWindow(){ + var style = document.createElement('style'); + style.innerHTML = ".inputs{background-color:rgb(200,200,200);margin:5px 7px;width:100px;}"; + document.body.appendChild(style); + + var background_div = document.createElement("div"); + background_div.setAttribute("style", "border:solid 1px black;position:fixed;width:100%;height:100%;background-color:rgba(200,200,200,0.3);top:0;left:0;display:none; z-index:9"); + background_div.setAttribute("id", "hiBackground"); + document.body.appendChild(background_div); + background_div.addEventListener("click", hideToggle); + + var window_div = document.createElement("div"); + window_div.setAttribute("style", "border:solid 1px black;position:fixed;width:400px;background-color:rgb(200,200,200);left:40%;top:20%;margin-bottom:0; display:none; z-index:10"); + window_div.setAttribute("id", "hiWindow"); + + var close_div = document.createElement("div"); + close_div.setAttribute("style", "border:solid 1px black;position:absolute;width:25px;height:25px;background-color:rgba(255,100,90,0.9); right:3px;top:3px; z-index:10"); + close_div.addEventListener("click", hideToggle); + window_div.appendChild(close_div); + + var title_para = document.createElement("p"); + title_para.setAttribute("style", "margin-left:5px;margin-top:5px"); + var title_text = document.createTextNode("Filter Settings"); + title_para.appendChild(title_text); + window_div.appendChild(title_para); + + var container_div = document.createElement("div"); + container_div.setAttribute("style","background-color:white;margin:0 0;padding:5px;"); + window_div.appendChild(container_div); + + var expiration_label = document.createElement("label"); + var expiration_text = document.createTextNode("Expiration Time(hours): "); + expiration_label.appendChild(expiration_text); + container_div.appendChild(expiration_label); + var expiration_input = document.createElement("input"); + expiration_input.setAttribute("id", "expirationTime"); + container_div.appendChild(expiration_input); + container_div.appendChild(expiration_input); + container_div.appendChild(document.createElement("br")); + var set_button = document.createElement("input"); + set_button.setAttribute("type", "button"); + set_button.setAttribute("id", "setTime"); + set_button.setAttribute("value", "Set Time"); + set_button.addEventListener("click", function(){ + if (storageAvailable('localStorage')) { + var time = document.getElementById("expirationTime"); + var millisecond_time = time.value * 3600000; + if (millisecond_time == 0 || millisecond_time === null || millisecond_time === undefined) millisecond_time = default_expire_time; + expire_time = millisecond_time; + localStorage.setItem("ExpirationTime", millisecond_time); + hideToggle(); + } + }); + expiration_input.setAttribute("value", localStorage.getItem("ExpirationTime") / 3600000); + container_div.appendChild(set_button); + + document.body.appendChild(window_div); + +} + +function hideToggle(){ + if(window_displayed){ + document.getElementById("hiWindow").style.display = "none"; + document.getElementById("hiBackground").style.display = "none"; + window_displayed = false; + } + else{ + document.getElementById("hiWindow").style.display = "inline-block"; + document.getElementById("hiBackground").style.display = "inline-block"; + window_displayed = true; + } +} + +function hideButton(){ + var hide_button = document.createElement("input"); + hide_button.setAttribute("Value", "Hide Image Settings"); + hide_button.setAttribute("type", "button"); + hide_button.setAttribute("style", "position:absolute;top:45px"); + hide_button.addEventListener("click", hideWindow); + if(document.body === null){ + setTimeout(hideButton, 30); + } + else{ + document.body.appendChild(hide_button); + hide_button.addEventListener("click", hideToggle); + } + expire_time = localStorage.getItem("ExpirationTime"); +} + + +/**111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111// +//111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111// +//111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111// +//111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111// +//111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111// +//111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111// +//111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111// +//111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111// +*/ + +//store filter settings +function loadSettings(){ + var filter_setting = 0, + oJson = {}, + storage_key; + while( filter_setting < window.localStorage.length) { + filter_setting++; + storage_key = window.localStorage.key(filter_setting); + oJson[storage_key] = window.localStorage.getItem(storage_key); + } + number_of_filters = oJson["q"]; + //console.log(number_of_filters); + filters = getPropertyByRegex(oJson,"filter[0-9]*"); + filters.forEach(function(filter){ + initial_filters.push(formatSettings(oJson[filter])); + }); +} + +function saveSettings(){ + + kill = []; //Determins if a certain pattern should be used or not due to regex errors from the user + + if(storageAvailable('localStorage')){ + window.localStorage.setItem("q", number_of_filters); + for (var pattern_input = 0 ; pattern_input < number_of_filters; pattern_input++){ + var pattern_to_store = document.getElementById("Pattern"+pattern_input).value; + var replacement_to_store = document.getElementById("Replacement"+pattern_input).value; + var setting = "g"; + if(pattern_to_store === "" || replacement_to_store === "") continue; + if (pattern_to_store.charAt(0) == "/" && pattern_to_store.charAt(pattern_to_store.length - 1) == "/"){ + pattern_to_store = pattern_to_store + setting; + } + else if(pattern_to_store.charAt(0) !== "/" && pattern_to_store.substr(pattern_to_store.length - 2).match(/\/[a-zA-Z$]/) == null){ + pattern_to_store = "/" + pattern_to_store + "/" + setting; + } + document.getElementById("Pattern"+pattern_input).value = pattern_to_store; + var save_string = '"' + document.getElementById("Active"+pattern_input).checked + '"-"' + pattern_to_store + '"-"' + replacement_to_store + '"'; + window.localStorage.setItem("filter" + pattern_input, save_string); + } + } + alert("Replacements Saved"); +} + +//Splits the saved settings into components +function formatSettings(input){ + var rtn = input.split('"-"'); + var i = 0; + rtn.forEach(function(filter){ + rtn[i] = filter.replace("\"", ""); + i++; + }); + return rtn; +} + + +function filterWindow(){ + var style = document.createElement('style'); + style.innerHTML = ".inputs{background-color:rgb(200,200,200);margin:5px 7px;width:100px;}"; + document.body.appendChild(style); + + var background_div = document.createElement("div"); + background_div.setAttribute("style", "border:solid 1px black;position:fixed;width:100%;height:100%;background-color:rgba(200,200,200,0.3);top:0;left:0;display:none; z-index:9"); + background_div.setAttribute("id", "FilterBackground"); + document.body.appendChild(background_div); + background_div.addEventListener("click", filterToggle); + + var window_div = document.createElement("div"); + window_div.setAttribute("style", "border:solid 1px black;position:fixed;width:400px;background-color:rgb(200,200,200);left:40%;top:20%;margin-bottom:0; display:none; z-index:10"); + window_div.setAttribute("id", "FilterWindow"); + + var close_div = document.createElement("div"); + close_div.setAttribute("style", "border:solid 1px black;position:absolute;width:25px;height:25px;background-color:rgba(255,100,90,0.9); right:3px;top:3px; z-index:10"); + close_div.addEventListener("click", filterToggle); + window_div.appendChild(close_div); + + var title_para = document.createElement("p"); + title_para.setAttribute("style", "margin-left:5px;margin-top:5px"); + var title_text = document.createTextNode("Filter Settings"); + title_para.appendChild(title_text); + window_div.appendChild(title_para); + + var container_div = document.createElement("div"); + container_div.setAttribute("style","background-color:white;margin:0 0;padding:5px;"); + window_div.appendChild(container_div); + + var filter_table = document.createElement("table"); + filter_table.setAttribute("style", "text-align:center;"); + filter_table.setAttribute("id", "filter_table"); + container_div.appendChild(filter_table); + + var table_row = document.createElement("tr"); + filter_table.appendChild(table_row); + var table_head_active = document.createElement("th"); + var head_text_active = document.createTextNode("Active"); + table_head_active.appendChild(head_text_active); + filter_table.appendChild(table_head_active); + var table_head_pattern = document.createElement("th"); + var headTextPattern = document.createTextNode("Pattern"); + table_head_pattern.appendChild(headTextPattern); + filter_table.appendChild(table_head_pattern); + var table_head_replacement = document.createElement("th"); + var head_text_replacement = document.createTextNode("Replacement"); + table_head_replacement.appendChild(head_text_replacement); + filter_table.appendChild(table_head_replacement); + + + //Create the pattern table + //loop to create rows + if (number_of_filters === 0 || isNaN(number_of_filters)) number_of_filters = 6; + for (var i = 0; i < number_of_filters ; i++){ + var table_row_contents = document.createElement("tr"); + table_row_contents.setAttribute("id", "FilterRow" + i); + + var table_data_active = document.createElement("td"); + var table_checkbox_active = document.createElement("input"); + table_checkbox_active.setAttribute("type", "checkbox"); + table_checkbox_active.setAttribute("id", "Active" + i); + table_data_active.appendChild(table_checkbox_active); + table_row_contents.appendChild(table_data_active); + + var table_data_pattern = document.createElement("td"); + var table_input_pattern = document.createElement("input"); + table_input_pattern.setAttribute("class", "inputs"); + table_input_pattern.setAttribute("id", "Pattern" + i); + table_data_pattern.appendChild(table_input_pattern); + table_row_contents.appendChild(table_data_pattern); + + var table_data_replacement = document.createElement("td"); + var table_input_replacement = document.createElement("input"); + table_input_replacement.setAttribute("class", "inputs"); + table_input_replacement.setAttribute("id", "Replacement" + i); + table_data_replacement.appendChild(table_input_replacement); + table_row_contents.appendChild(table_data_replacement); + + filter_table.appendChild(table_row_contents); + } + + var table_last_contents = document.createElement("tr"); + + var table_add_collumn = document.createElement("td"); + var table_add_row_button = document.createElement("input"); + var table_subtract_row_button = document.createElement("input"); + table_subtract_row_button.setAttribute("type", "button"); + table_subtract_row_button.setAttribute("value", "-"); + table_subtract_row_button.setAttribute("style", "padding: 7px 0; margin:5px 0;"); + table_add_collumn.appendChild(table_subtract_row_button); + table_subtract_row_button.addEventListener("click", removeRow); + table_add_row_button.setAttribute("type", "button"); + table_add_row_button.setAttribute("value", "+"); + table_add_row_button.setAttribute("style", "padding: 7px 0; margin:5px 0;"); + table_add_collumn.appendChild(table_add_row_button); + table_add_row_button.addEventListener("click", addRow); + + table_last_contents.appendChild(table_add_collumn); + + var table_set_collumn = document.createElement("td"); + var table_confirm_button = document.createElement("input"); + table_confirm_button.setAttribute("type", "button"); + table_confirm_button.setAttribute("id", "table_confirm_button"); + table_confirm_button.setAttribute("value", "Set Replacements"); + table_confirm_button.setAttribute("style", "padding: 7px 0; margin:5px 0;"); + table_confirm_button.addEventListener("click", saveSettings); + table_confirm_button.addEventListener("click", modifyDOM); + table_confirm_button.addEventListener("click", filterToggle); + table_set_collumn.appendChild(table_confirm_button); + table_last_contents.appendChild(table_set_collumn); + + + var table_close_collumn = document.createElement("td"); + var table_close_button = document.createElement("input"); + table_close_button.setAttribute("type", "button"); + table_close_button.setAttribute("value", "Close Menu"); + table_close_button.setAttribute("style", "padding: 7px 0; margin:5px 0;"); + table_close_button.addEventListener("click", filterToggle); + table_close_collumn.appendChild(table_close_button); + table_last_contents.appendChild(table_close_collumn); + + filter_table.appendChild(table_last_contents); + + document.body.appendChild(window_div); + +} + +function filterToggle(){ + if(window_displayed){ + document.getElementById("FilterWindow").style.display = "none"; + document.getElementById("FilterBackground").style.display = "none"; + window_displayed = false; + } + else{ + document.getElementById("FilterWindow").style.display = "inline-block"; + document.getElementById("FilterBackground").style.display = "inline-block"; + window_displayed = true; + } +} + +function filterButton(){ + var filter_button = document.createElement("input"); + filter_button.setAttribute("Value", "Word Filter Settings"); + filter_button.setAttribute("type", "button"); + filter_button.setAttribute("style", "position:absolute;top:75px"); + filter_button.addEventListener("click", filterWindow); + document.body.appendChild(filter_button); + filter_button.addEventListener("click", filterToggle); +} + +function addRow(){ + var filter_table = document.getElementById("filter_table"); + filter_table.deleteRow(parseInt(number_of_filters) + 1); + number_of_filters++; + + var table_row_contents = document.createElement("tr"); + table_row_contents.setAttribute("id", "FilterRow" + (number_of_filters - 1)); + + var table_data_active = document.createElement("td"); + var table_checkbox_active = document.createElement("input"); + table_checkbox_active.setAttribute("type", "checkbox"); + table_checkbox_active.setAttribute("id", "Active" + (number_of_filters - 1)); + table_data_active.appendChild(table_checkbox_active); + table_row_contents.appendChild(table_data_active); + + var table_data_pattern = document.createElement("td"); + var table_input_pattern = document.createElement("input"); + table_input_pattern.setAttribute("class", "inputs"); + table_input_pattern.setAttribute("id", "Pattern" + (number_of_filters - 1)); + table_data_pattern.appendChild(table_input_pattern); + table_row_contents.appendChild(table_data_pattern); + + var table_data_replacement = document.createElement("td"); + var table_input_replacement = document.createElement("input"); + table_input_replacement.setAttribute("class", "inputs"); + table_input_replacement.setAttribute("id", "Replacement" + (number_of_filters - 1)); + table_data_replacement.appendChild(table_input_replacement); + table_row_contents.appendChild(table_data_replacement); + + filter_table.appendChild(table_row_contents); + + var table_last_contents = document.createElement("tr"); + + var table_add_collumn = document.createElement("td"); + var table_add_row_button = document.createElement("input"); + var table_subtract_row_button = document.createElement("input"); + table_subtract_row_button.setAttribute("type", "button"); + table_subtract_row_button.setAttribute("value", "-"); + table_subtract_row_button.setAttribute("style", "padding: 7px 0; margin:5px 0;"); + table_add_collumn.appendChild(table_subtract_row_button); + table_subtract_row_button.addEventListener("click", removeRow); + table_add_row_button.setAttribute("type", "button"); + table_add_row_button.setAttribute("value", "+"); + table_add_row_button.setAttribute("style", "padding: 7px 0; margin:5px 0;"); + table_add_collumn.appendChild(table_add_row_button); + table_add_row_button.addEventListener("click", addRow); + + table_last_contents.appendChild(table_add_collumn); + + var table_set_collumn = document.createElement("td"); + var table_confirm_button = document.createElement("input"); + table_confirm_button.setAttribute("type", "button"); + table_confirm_button.setAttribute("id", "table_confirm_button"); + table_confirm_button.setAttribute("value", "Set Replacements"); + table_confirm_button.setAttribute("style", "padding: 7px 0; margin:5px 0;"); + table_confirm_button.addEventListener("click", saveSettings); + table_confirm_button.addEventListener("click", modifyDOM); + table_confirm_button.addEventListener("click", filterToggle); + table_set_collumn.appendChild(table_confirm_button); + table_last_contents.appendChild(table_set_collumn); + + var table_close_collumn = document.createElement("td"); + var table_close_button = document.createElement("input"); + table_close_button.setAttribute("type", "button"); + table_close_button.setAttribute("value", "Close Menu"); + table_close_button.setAttribute("style", "padding: 7px 0; margin:5px 0;"); + table_close_button.addEventListener("click", filterToggle); + table_close_collumn.appendChild(table_close_button); + table_last_contents.appendChild(table_close_collumn); + + filter_table.appendChild(table_last_contents); +} + +function removeRow(){ + var filter_table = document.getElementById("filter_table"); + if(number_of_filters != 0){ + filter_table.deleteRow(number_of_filters); + number_of_filters--; + } +} + +function setTable(){ + var filter_count = 0; + initial_filters.forEach(function(filter){ + if(filter[2] === null || filter[1] === null || filter[0] === null || filter_count == number_of_filters) return; + if(filter[0] == "true"){ + document.getElementById("Active"+filter_count).checked = true; + } + else if(filter[0] == "false"){ + document.getElementById("Active"+filter_count).checked = false; + } + document.getElementById("Pattern"+filter_count).value = filter[1]; + document.getElementById("Replacement"+filter_count).value = filter[2]; + filter_count++; + }); +} + + +//222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111// +//222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111// +//222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111// +//222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111// +//222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111// +//222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111// +//222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111// +//222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111// +//222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111// +//222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111// + +//Functions to set the DOM listener and observers + +//detect page changes +function observeDynamicMutation(node){ + if(node === undefined) + node = document; + //on mutation event call functions + observer = new MutationObserver(function callBack(mutations){ + modifyDOM(); + }); + var config = {subtree: true, childList:true};//Subtree checks children of node, while subtree repeats actions on the child and sets observers on them + observer.observe(node, config); +} + +function modifyDOM(){ + var start = document.getElementById("delform"); + var itterator = document.createTreeWalker(start, NodeFilter.SHOW_ELEMENTS, NodeFilter.SHOW_ELEMENTS); + var node = ""; + + while((node = itterator.nextNode())){ + var cname = node.className; + var tag = node.tagName; + if(tag === "IMG" || tag === "img"){ + if(!/(f|p)\d+IMG/.test(node.id) && (node.getAttribute("data-md5") !== null || node.className.indexOf("thumb") != -1)){ + node.id = node.parentNode.parentNode.id + "IMG"; + node.addEventListener("click", hideImage, {passive:false, capture:false, once:false}); + } + } + else if(cname == "postMessage"){ + while((localNode = itterator.nextNode())){ + var className = localNode.className; + if(className == undefined || className == "quotelink"){ + for(var i = 0 ; i < number_of_filters; i++){ + if(kill[i] == true) continue; + filter = document.getElementById("Pattern"+i); + replacement = document.getElementById("Replacement"+i); + active = document.getElementById("Active"+i); + if(active.checked){ + var lastChar = filter.value.length - 1; + var filterText = filter.value; + if(filterText === "") break; + var setting = filterText.substr(lastChar); + filterText = filterText.substr(1, lastChar-2); + filterText = "(^|[\\s!$%^&*()_+|~\\-=`{}\\[\\]:\";'<>?,\\.\\/])" + filterText + "([\\s!$%^&*()_+|~\\-=`{}\\[\\]:\";'<>?,\\.\\/]|$)"; + try{ + var regex = new RegExp(filterText, setting); + localNode.textContent = localNode.textContent.replace(regex, " " + replacement.value + " "); + } + catch(e){ + alert(i + "'s regex was invalid"); + kill[i] = true; + } + } + } + } + else break; + } + } + } +} + + +if (window.top != window.self) //-- Don't run on frames or iframes + return; + +//initial onload setup +function hideSetup(){ + retrieveStates(); + hideButton(); +} + +function filterSetup(){ + loadSettings(); + filterButton(); + filterWindow(); + setTable(); +} + +function pkxSetup(){ + hideSetup(); + filterSetup(); + modifyDOM(); + observeDynamicMutation(); +} + +//4chanX exists +//currently has issues due to a bug in 4chanX's API +var page_setup = false; +document.addEventListener('4chanXInitFinished', function(e) { + setTimeout(function(){// bypass 4chanX bug + browser = detectBrowser(); + pkxSetup(); + console.log("Script loaded: 4chanPKX"); + page_setup = true; + }, 1000); +}, false); + +setTimeout(function(){ + if(!page_setup){ + browser = detectBrowser(); + pkxSetup(); + console.log("Script loaded: 4chanPKX"); + page_setup = true; + } +}, 3000); \ No newline at end of file diff --git a/README.md b/README.md index a82c81b..38348b2 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,9 @@ Rebuild a thread from 4chan's archive.
Simple system that could use some additions(posts links pointing to the same thread and not the archive thread) ## Visible Password -Shows your 4chan post/delete password +### Shows your 4chan post/delete password +* Displays your 4chan password in an inputbox. +* Top left is the post password, Bottom right is the delete password. +* Edit the input boxes to change them. + +__Note:__ some 4chan boards don't allow custom post passwords. May require cookie manipulation, but this has not yet been tested... diff --git a/Thread-Rebuilder.user.js b/Thread-Rebuilder.user.js index b476780..72e663a 100644 --- a/Thread-Rebuilder.user.js +++ b/Thread-Rebuilder.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name Thread Rebuilder // @namespace http://tampermonkey.net/ - // @version 0.3.2 + // @version 1.1 // @description try to take over the world! // @author You // @match https://boards.4chan.org/*/thread/* diff --git a/Visible-Password.user.js b/Visible-Password.user.js index 8b8d0b8..9c3db2a 100644 --- a/Visible-Password.user.js +++ b/Visible-Password.user.js @@ -12,11 +12,18 @@ // @downloadURL https://github.com/ECHibiki/4chan-UserScripts/raw/master/Visible-Password.user.js // ==/UserScript== +/* +Displays your 4chan password in an inputbox. +Top left is the post password, Bottom right is the delete password. +Edit the input boxes to change them. + +Note: some 4chan boards don't allow custom post passwords. May require cookie manipulation, but this has not yet been tested +*/ (function() { - 'use strict'; + document.getElementById("postPassword").setAttribute("type", ""); document.getElementById("postPassword").value = document.getElementById("postPassword").value; - // Your code here... + document.getElementById("delPassword").setAttribute("type", ""); document.getElementById("delPassword").value = document.getElementById("delPassword").value; })(); \ No newline at end of file -- 2.11.4.GIT