// ==UserScript== // @name:ko 글로벌 다크모드 // @name Global Darkmode // @name:ru Глобальный темный режим // @name:jp グローバルダークモード // @name:zh-TW 全局暗模式 // @name:zh-CN 全局暗模式 // @description:ko 밝은 색의 웹 사이트들만 어둡게 만듭니다. // @description Turn only bright websites to dark. // @description:ru Делайте темными только яркие сайты. // @description:jp 明るいウェブサイトだけを暗くします。 // @description:zh-TW 它只會將明亮的網站變為黑暗。 // @description:zh-CN 它只会将明亮的网站变为黑暗。 // @namespace https://ndaesik.tistory.com/ // @version 2022.05.24.10.48 // @author ndaesik // @icon data:image/svg+xml,🪐 // @match *://*/* // @grant GM.getValue // @grant GM.setValue // @grant GM_registerMenuCommand // @run-at document-start // @downloadURL none // ==/UserScript== let PRE = document.createElement(`style`) PRE.innerText = `* {background:#202124!important; border-color:#3c4043!important; color-scheme:dark!important; color:#bdc1c6!important}` PRE.classList.add(`PRE`) self == top && document.head?.appendChild(PRE) window.addEventListener(`load`, () => { (async () => { (await GM.getValue(`OnURL`) == undefined) ? GM.setValue(`OnURL`, ``) : false; (await GM.getValue(`OfURL`) == undefined) ? GM.setValue(`OfURL`, `youtube.com/live_chat?`) : false; let OnURL = await GM.getValue(`OnURL`) , OfURL = await GM.getValue(`OfURL`) , BLrun = OnURL == `` || OnURL.replaceAll(/\s/g,``).split(/[\r\n]+|,/g).filter(w => window.document.URL.indexOf(w) > -1).length == 0 , WLrun = OfURL != `` && OfURL.replaceAll(/\s/g,``).split(/[\r\n]+|,/g).filter(m => window.document.URL.indexOf(m) > -1).length != 0 , Lturn = () => { let e = document.querySelector(`#GDM_option`); (e.style.display == `none`) ? e.style.display = `block` : (e.style.display = `none`, GM.setValue(`OnURL`, document.querySelector(`#GDM_On_filter`).value), GM.setValue(`OfURL`, document.querySelector(`#GDM_Off_filter`).value)) } document.body.insertAdjacentHTML(`beforeend`, ` `) document.querySelector(`#GDM_save`).addEventListener(`click`, () => Lturn()) let bdyH0 = window.parent.document.body.offsetHeight == 0 , frame = self != top , elems = document.querySelectorAll(`body > :not(script)`) , apply = () => document.head.appendChild(drkMo) , togle = () => (document.querySelector(`.drkMo`) == null) ? apply() : document.querySelector(`.drkMo`).remove() , drkMo = document.createElement(`style`) , check = (m, m2=0) => { let n = (n) => {return parseInt(getComputedStyle(document.querySelectorAll(m)[m2]).getPropertyValue(`background-color`).match(/\d+/g)[n])}; return (n(0)*0.299+n(1)*0.587+n(2)*0.114) > 186 || n(3) == 0 } drkMo.innerText = ` html {color-scheme:dark!important;color:#000} html * {color-scheme:light!important;text-shadow:0 0 .1px} html body {background:none!important} html, html :is(i, img, image, embed, video, canvas, option, object, :fullscreen:not(iframe), iframe:not(:fullscreen)), html body>* [style*="url("]:not([style*="cursor:"]):not([type="text"]) {filter:invert(1)hue-rotate(180deg)!important} html body>* [style*="url("]:not([style*="cursor:"]) :not(#⁠), html:not(#⁠) :is(canvas, option, object) :is(i, img, image, embed, video), html:not(#⁠) video:fullscreen{filter:unset!important}` drkMo.classList.add(`drkMo`) document.querySelector(`.PRE`)?.remove() if(WLrun) {apply()} else if(BLrun) { if((!frame && !bdyH0 || frame) && check(`html`) && check(`body`)) apply() if(!frame && bdyH0) {for (let i = 0; i < elems.length; i++) {if (elems[i].scrollHeight > window.innerHeight && check(`body > :not(script)`,i)) apply()}} } GM_registerMenuCommand(`On/Off`, togle) GM_registerMenuCommand(`Filter`, Lturn) })()})