// ==UserScript== // @name No Apple News // @description Remove Apple related entries in news sites // @version 0.1.2 // @grant none // @author Lucie Cupcakes // @namespace https://lucdev.net // @license UNLICENSE - https://unlicense.org/ // @match *://news.ycombinator.com/ // @match *://news.ycombinator.com/news* // @match *://lobste.rs/ // @match *://lobste.rs/page/* // @downloadURL none // ==/UserScript== (() => { const filterWords = [ 'apple', 'mac', 'iphone', 'ipad', 'ipod', 'icloud', 'ios', 'siri', 'm1', 'macbook', 'airbook', 'macos', 'safari', ]; const filterWordsVar = [ ...filterWords.map((el) => `${el} `), ...filterWords.map((el) => ` ${el}`), ]; const domReady = (cb) => { if (document.readyState === 'complete') { return cb(); } window.addEventListener('DOMContentLoaded', cb); }; const strIncludesAny = (str, findArray) => { if (!findArray || !str || findArray.length == 0 || str == '') { return false; } for (const findEl of findArray) { if (str.includes(findEl)) { return true; } } return false; }; const removeHtmlElement = (el) => el.parentElement.removeChild(el); const filterArticlesByHostname = { 'news.ycombinator.com': () => { return Array.from(document.querySelectorAll('.title > a')) .map((el) => { // Check if matches blocklist if (!strIncludesAny(el.innerText.toLowerCase(), filterWordsVar)) { return null; } // Grab metadata const articleTr = el.parentElement.parentElement; const id = articleTr.id.repeat(1); const title = el.innerText.repeat(1); const link = el.href.repeat(1); // Remove entry (() => { [ document.querySelector(`.athing[id="${id}"]`), // articleTr document.querySelector(`.athing[id="${id}"] + tr`), //subtext document.querySelector(`.athing[id="${id}"] + tr + tr.spacer`), ] .filter((el) => el !== null) .forEach(removeHtmlElement); })(); // Return metadata return { title, link, id, }; }) .filter((el) => el !== null); }, 'lobste.rs': () => { return Array.from(document.querySelectorAll('.story .u-url')) .map((el) => { // Check if matches blocklist if (!strIncludesAny(el.innerText.toLowerCase(), filterWordsVar)) { return null; } // Grab metadata const title = el.innerText.repeat(1); const link = el.href.repeat(1); // Remove entry (() => { const articleDiv = el.parentElement.parentElement.parentElement.parentElement; removeHtmlElement(articleDiv); })(); // Return metadata return { title, link, }; }) .filter((el) => el !== null); }, }; domReady(() => { const articles = filterArticlesByHostname[location.hostname](); console.log(`Filtered ${articles.length} article(s).`, articles); }); })();