// ==UserScript== // @name Yahoo News Filter // @description yahooニュースで任意の記事を非表示にする // @grant none // @author TNB // @match https://www.yahoo.co.jp // @match https://news.yahoo.co.jp/* // @match https://article.yahoo.co.jp/* // @version 1.0.1 // @run-at document-start // @namespace https://greasyfork.org/users/3989 // @downloadURL none // ==/UserScript== /******************** SETTING **************************/ const case_insensitive = true; const match_fullwidth = true; const filterWords = []; /********************************************************/ 'use strict'; (function() { const mod = case_insensitive? 'i': null; const p = new RegExp(filterWords.join('|'), mod); function convertHalfSize(str) { if (match_fullwidth) return str.replace(/[A-Za-z0-9]/g, s => String.fromCharCode(s.charCodeAt(0) - 65248)); return str; } function removeArticle(d) { const a = d.querySelectorAll('[id^="tabpanelTopics"] ul>li, #Stream article, [id^="uamods"] li, ul[class$="list"] li, .yjnSub_list_item, .subList_item'); for (const title of a) { if (p.test(convertHalfSize(title.textContent))) title.style.display = 'none'; } } function observer() { const b = document.querySelectorAll('.mainColumn, .subColumn, #Topics, #qurireco, #contentsWrap, #yjnSub'); if (!b) return; const mo = new MutationObserver(m => { for (const i of m) { removeArticle(i.target); } }); for (const i of b) { mo.observe(i, {childList: true, subtree: true, attributeFilter: ['id']}); } } window.addEventListener('DOMContentLoaded', () => { removeArticle(document); observer(); }); })();