您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Ukrywa posty po nickach i tagach.
// ==UserScript== // @name Wykop-axe filtrowanie po nickach i tagach dla serwisu Wykop // @namespace http://tampermonkey.net/ // @version 0.1 // @description Ukrywa posty po nickach i tagach. // @author patsh // @match https://*.wykop.pl/* // @grant none // @license MIT /*jshint esversion: 6 */ // ==/UserScript== const REMOVED_ELEMENT_CLASSNAME = "removed"; (function () { "use strict"; const wk = { styles: ` .wykop-block-icon {height: 80px; width:80px; position: fixed; top: 0; right: 0; z-index: 999; opacity: 0.2; padding: 20px;} .wykop-block-icon:hover {background-color: #22; margin-right: 20px; opacity: 1;} .wykop-block-menu {z-index: 9918; background-color: black; border-radius: 4px; padding: 4px;height: 380px; width:380px; position: fixed; bottom: 20px; right: 0; display: none;} .wk-list {height: 280px; width:380px;} .removed {display: none;} .wk-list-label {color: white; font-size: large; padding: 10px;} i { font-size: 40px;} `, prepare: () => { const bu = document.createElement("div"); bu.className = "button big wykop-block-icon"; const toggleButton = document.createElement("a"); const wkIcon = document.createElement("i"); wkIcon.innerHTML = "🪓"; //ADD BUTTON bu.appendChild(toggleButton); toggleButton.appendChild(wkIcon); document.querySelector("body").appendChild(bu); bu.addEventListener("click", (e) => { e.preventDefault(); wk.toggleMenu(); }); // ADD STYLES const styleWrapper = document.createElement("style"); styleWrapper.innerHTML = wk.styles; document.querySelector("head").appendChild(styleWrapper); //ADD MENU const menu = document.createElement("div"); menu.className = "wykop-block-menu"; const wkListToBlock = document.createElement("textarea"); wkListToBlock.className = "wk-list"; wkListToBlock.setAttribute("id", "wk-list"); wkListToBlock.setAttribute("spellcheck", "false"); menu.appendChild(wkListToBlock); const wkListLabel = document.createElement("label"); wkListLabel.className = "wk-list-label"; wkListLabel.setAttribute("for", "wk-list"); wkListLabel.innerHTML = "Nick ze znakiem @, tagi ze znakiem #"; menu.appendChild(wkListLabel); document.querySelector("body").appendChild(menu); showAll(); wk.loadData(); wk.filter(); }, filter: () => { const wkListToBlock = document.querySelector(".wk-list"); let rawArray = wkListToBlock.value.split(" "); let tags = []; let nicks = []; for (let el of rawArray) { if (el.charAt(0) == "@") { nicks.push(el.substring(1, el.length).toLowerCase()); } if (el.charAt(0) == "#") { tags.push(el.substring(1, el.length).toLowerCase()); } } wk.filterByTags(tags); wk.filterByNicks(nicks); wk.filterByNicksOnMikroblog(nicks); getArticlesFromMikroblogAndFilterThem(tags); }, filterByNicks: (nicks) => { let articlesSelector = ".article.clearfix.dC"; let filterList = nicks; let elementsExtractor = getNickFrom; filterArticlesUsingListOf( articlesSelector, filterList, elementsExtractor ); }, filterByNicksOnMikroblog: (nicks) => { let articlesSelector = "li.entry.iC"; let filterList = nicks; let elementsExtractor = getNickOnMikroblog; filterArticlesUsingListOf( articlesSelector, filterList, elementsExtractor ); }, filterByTags: (tags) => { let articlesSelector = ".article.clearfix.dC"; let filterList = tags; let elementsExtractor = getTagsFrom; filterArticlesUsingListOf( articlesSelector, filterList, elementsExtractor ); }, data: { list: "", }, saveData: () => { const wkListToBlock = document.querySelector(".wk-list"); wk.data.list = wkListToBlock.value; localStorage.setItem("wk-blocker", JSON.stringify(wk.data)); }, loadData: () => { const storage = localStorage.getItem("wk-blocker"); const wkListToBlock = document.querySelector(".wk-list"); if (storage) { const storageData = JSON.parse(storage); wk.data.list = storageData.list; wkListToBlock.value = wk.data.list; } }, toggleMenu: () => { const x = document .querySelector("body") .getElementsByClassName("wykop-block-menu")[0]; if (x.style.display === "none") { wk.loadData(); x.style.display = "block"; } else { x.style.display = "none"; cleanFilters(); wk.filter(); wk.saveData(); } }, }; wk.prepare(); })(); function hide(article) { article.classList.add(REMOVED_ELEMENT_CLASSNAME); } function removeHashFromArray(arr) { arr = arr.flat(); arr = arr.map((a) => a.replace("#", "")); return arr; } function showAll() { let showMoreElements = document.querySelectorAll("a.show-more"); for (const element of showMoreElements) { element.click(); } } function getArticlesFromMikroblogAndFilterThem(tagsBlacklist) { const articleSelectorMikroblog = "li.entry.iC"; const tagsFromMikroRegex = /#\b\w*\b/g; let articles = document.querySelectorAll(articleSelectorMikroblog); for (let article of articles) { let arr = [...article.innerText.matchAll(tagsFromMikroRegex)]; let mikroArticleTags = removeHashFromArray(arr); if (isThereIntersection(tagsBlacklist, mikroArticleTags)) { hide(article); } } } function getTagsFrom(article) { let elementTags = [...article.querySelectorAll(".tag.affect")].map(function ( x ) { return x.href.substring(25, x.href.length - 1); }); elementTags = elementTags.slice(0, elementTags.length - 1); return elementTags; } function getNickFrom(article) { let regexForNick = "@.*a>"; let rawNick = ""; if (article.innerHTML.match(regexForNick) != null) { rawNick = [...article.innerHTML.matchAll(regexForNick)].flat()[0]; } let replaceRegex = /@?<.{1,3}>/g; let nick = rawNick.replace(replaceRegex, ""); nick = nick.toLowerCase(); return [nick]; } function getNickOnMikroblog(article) { let nick = article.querySelector(".author b").textContent; nick = nick.toLowerCase(); return [nick]; } function isThereIntersection(array1 = [], array2 = []) { const filteredArray = array1.filter((value) => array2.includes(value)); return filteredArray.length != 0; } function cleanFilters() { removeClassFromAllElements(REMOVED_ELEMENT_CLASSNAME); } function removeClassFromAllElements(className) { Array.from(document.querySelectorAll("." + className)).forEach((el) => el.classList.remove(className) ); } function filterArticlesUsingListOf( articlesSelector, filterList, elementsExtractor ) { const articlesOnPage = [...document.querySelectorAll(articlesSelector)]; for (let article of articlesOnPage) { let elementsFromArticle = elementsExtractor(article); if (isThereIntersection(filterList, elementsFromArticle)) { hide(article); } } }