// ==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.04.17.23:27 // @author ndaesik // @icon data:image/svg+xml, // @include * // @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}` document.head.appendChild(PRE) PRE.classList.add("PRE") window.addEventListener("load", function(){ (async () => { (await GM.getValue("OnURL") == undefined) ? GM.setValue("OnURL", "") : null; (await GM.getValue("OfURL") == undefined) ? GM.setValue("OfURL", "") : null; 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) })()});