Twitterの余計なものを隠します(未完)
// ==UserScript== // @name すっきりtwitter // @namespace http://tampermonkey.net/ // @version 0.1 // @description Twitterの余計なものを隠します(未完) // @author y_kahou // @match https://twitter.com/* // @grant GM_setValue // @grant GM_getValue // @noframes // @require http://code.jquery.com/jquery-3.5.1.min.js // ==/UserScript== var $ = window.jQuery; // 先祖要素取得(idなしクラスも不定のtwitterは順番に遡るしかない) $.fn.ancestor = function(generation = 1) { if (generation < 1) { return this; } else if (generation == 1) { return this.parent(); } else { return this.parent().ancestor(generation - 1); } } function invertRgb(str_rgb) { var ary_rgb = str_rgb.match(/([0-9]+)/g); return 'rgb(' + ary_rgb.map(e => 255 - e).join(',') + ')'; } function __css__() {/* {* コメント *} .rt-hide { width: 30px; height: 30px; position: absolute; right: 0; } .rt-modal { position: absolute; width: 400px; border-radius: 10px; } */} function addStyle() { var css = (__css__).toString() .match(/[^]*\/\*([^]*)\*\/\}$/)[1] .replace(/\{\*/g, '/*') .replace(/\*\}/g, '*/'); // 非表示設定 var hc = GM_getValue('hide_selector'); if (Array.isArray(hc)) { hc.forEach((c) => { if (typeof c == 'string') css += `${c} { display: none; } ` }) } $('head').append(`<style id="mystyle" type="text/css">${css}</style>`) } function killObstruction(word) { const bar = ".r-1or9b2r"; var obstruct = $(`span:contains("${word}")`).filter(function() { return $(this).text() === word; }).ancestor(5); if (!obstruct[0]) return; var dom = obstruct.prev().prev(); var list = [dom[0]]; for (var i = 0; i < 20; i++) { dom = $(dom).next(); list.push(dom[0]); if (dom.find(bar)[0]) break; } if (list.length < 20) { list.forEach(dom => $(dom).hide()); } } function observer() { $('html').off('DOMSubtreeModified propertychange'); var rtText = $('span[data-testid="socialContext"]'); rtText.each(function() { if ($(this).hasClass("hide")) return true; $(this).addClass("hide"); var rtLine = $(this).ancestor(10); var menu = $('<div class="rt-hide"></div>'); $(menu).insertAfter(rtLine); $(menu).next().hide(); menu.ancestor(2).next('a').hide(); var tweet = menu.ancestor(5); tweet.hover( (e) => { // hover $('div[id="layers"]').append('<div class="rt-modal"></div>'); $('.rt-modal').append(tweet.clone()) $('.rt-modal').find('div[data-testid="tweet"]').show(); var pos_a = (window.outerHeight / 2) > e.clientY ? 'top' : 'bottom'; var pos_b = (window.outerHeight / 2) > e.clientY ? e.pageY+10 : -e.pageY+10; $('.rt-modal').css({ [pos_a]: `${pos_b}px`, 'left': `${e.pageX-200}px`, 'background': $('body').css('background-color'), 'box-shadow': '0 0 14px 0 ' + invertRgb($('body').css('background-color')) }); }, (e) => { // out $('.rt-modal').remove(); }); }); killObstruction("おすすめユーザー"); killObstruction("おすすめトピック"); // 一定間隔ごとしか動かないように setTimeout(function() { $('html').on('DOMSubtreeModified propertychange', observer); }, 1000); } (function() { 'use strict'; addStyle(); observer(); })();