您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
convert colors to eye-friendly - webページの配色を目に優しく変更します (Flash対応)
当前为
- // ==UserScript==
- // @name adjustColor2
- // @namespace http://chiebukuro.yahoo.co.jp/my/gbjyn273
- // @author Syakku
- // @description convert colors to eye-friendly - webページの配色を目に優しく変更します (Flash対応)
- // @include *
- // @version 1.2
- // @run-at document-start
- // ==/UserScript==
- // ================≪ OPTION ≫================
- // ----------------< white" & "black" color >----------------
- var FILTER_COLOR_W = "rgb(234, 229, 227)";
- var FILTER_COLOR_B = "rgb(41, 34, 29)";
- var INNER_COLOR_W = "rgb(211, 203, 198)";
- var INNER_COLOR_B = "rgb(41, 34, 29)"; // gb is disabled
- // OPTION : apply to Flash object
- var FLASH = true;
- // OPTION : skip <a> tag (link anchor)
- // OPTION : <a> タグ、つまりリンク文字列を処理から除外します
- // ex: [] or ["google.co.jp", "youtube", "&link=important"] or [*]
- var _A_SKIP_URL = ["*"];
- // ================≪ 初期化 ≫================
- var _win = document.defaultView;
- var fCw = rgbSplit(FILTER_COLOR_W);
- var fCb = rgbSplit(FILTER_COLOR_B);
- var iCw = rgbSplit(INNER_COLOR_W);
- var iCb = rgbSplit(INNER_COLOR_B);
- // ----------------< インナーがフィルターを超えていたら修正 >----------------
- for (var i=0; i<3; i++){
- if (iCw[i] > fCw[i]){iCw[i] = fCw[i];}
- if (iCb[i] < fCb[i]){iCb[i] = fCb[i];}
- }
- // ----------------< フィルタ関連の初期化 >----------------
- var fColor = createFilter(fCw, fCb);
- var filterR = fColor[0], filterG = fColor[1], filterB = fColor[2], filterA = fColor[3], filterAa = 1-filterA;
- // 色変換で使うので先に計算
- var filterRA = filterR * filterA, filterGA = filterG * filterA, filterBA = filterB * filterA;
- var _pr = (iCw[0] - iCb[0]) / 255, _pg = (iCw[1] - iCb[1]) / 255, _pb = (iCw[2] - iCb[2]) / 255;
- var _pr2 = iCb[0], _pg2 = iCb[1], _pb2 = iCb[2];
- // ----------------< 色変換の結果保持配列 >----------------
- var list = [];
- var lFg = [];
- var lCount = 0;
- // ----------------< 背景画像処理 >----------------
- var bgFilter = createBgFilter();
- var bgfCount = bgFilter.substring(0, 30);
- var bgfcLength = bgfCount.length;
- function createBgFilter(){
- var tw=[], tb=[];
- tw[0] = Math.floor((iCw[0] - filterRA) / filterAa);
- tw[1] = Math.floor((iCw[1] - filterGA) / filterAa);
- tw[2] = Math.floor((iCw[2] - filterBA) / filterAa);
- tb[0] = Math.floor((iCb[0] - filterRA) / filterAa);
- var bfColor = createFilter(tw, tb);
- var _rgba = bfColor[4];
- return("linear-gradient(" + _rgba + ',' + _rgba + "),");
- }
- // ----------------< URLフィルタ >----------------
- var _skip = false;
- for (var i=0; i<_A_SKIP_URL.length; i++){
- if (location.href.indexOf(_A_SKIP_URL[i]) !== -1 || _A_SKIP_URL[i] === "*"){_skip = true;}
- }
- // ################################################ //
- // ################### メイン処理部 ################### //
- // ################################################ //
- // ================≪ 起動処理 ≫================
- loadFilter();
- _win.addEventListener("DOMContentLoaded", afterTouch, false);
- if (FLASH === true){_win.addEventListener("DOMContentLoaded", flashMode, false);}
- // ================≪ フィルタの適用 ≫================
- function loadFilter(_fast){
- var _filter = document.createElement("ac_filter");
- _filter.id = "adjustColor";
- _filter.style.backgroundColor = fColor[4];
- _filter.style.pointerEvents = "none";
- _filter.style.height = "100%";
- _filter.style.width = "100%";
- _filter.style.position = "fixed";
- _filter.style.zIndex = 9999;
- var _nodes = document.getElementsByTagName("html")[0].childNodes;
- for (var i=0; i<_nodes.length; i++){
- var _node = _nodes[i];
- if (_node.tagName === "BODY"){
- var _style = _node.style;
- _style.position = "absolute";
- // absolute にすると中央揃えでなくなってしまう
- _style.left = 0;
- _style.right = 0;
- _style.top = 0;
- _style.bottom = 0;
- // unset なのはブラウザ標準スタイルシートでマージンが存在するため
- _style.margin = "unset auto";
- break;
- } else if (_node.tagName === "FRAMESET"){
- document.getElementsByTagName("html")[0].insertBefore(_filter, _node);
- return;
- }
- }
- document.getElementsByTagName("html")[0].appendChild(_filter);
- }
- // ================≪ 追加処理 ≫================
- function afterTouch(){
- var elm = document.getElementsByTagName("*");
- var elm_length = elm.length;
- for (var i = 0; i < elm_length; i++) {
- var tElm = elm[i];
- // <A>タグ
- if (tElm.tagName === "A" && _skip === true) {continue;}
- var style = _win.getComputedStyle(tElm, null);
- var fgColor = style.getPropertyValue("color");
- // ----------------< 背景 >----------------
- fg:{
- // 処理する必要のないカラーは省く
- for (var n=0; n<lCount; n++){
- if (fgColor === list[n]){break fg;}
- }
- // 既存のカラーは省エネ
- for (var n=0; n<lCount; n++){
- if (fgColor === lFg[n]){
- tElm.style.color = list[n];
- break fg;
- }
- }
- var _tColorF = convColor(fgColor);
- lFg[lCount] = fgColor;
- list[lCount] = _tColorF;
- lCount++;
- tElm.style.color = list[n];
- }
- }
- }
- // ================ <背景色レンジ縮小 ≫================
- function convColor(_bg) {
- var _col = rgbSplit(_bg);
- var _colR = _col[0] * _pr + _pr2*1;
- var _colG = _col[1] * _pg + _pg2*1;
- var _colB = _col[2] * _pb + _pb2*1;
- _colR = Math.floor((_colR - filterRA) / filterAa);
- _colG = Math.floor((_colG - filterGA) / filterAa);
- _colB = Math.floor((_colB - filterBA) / filterAa);
- if (typeof _col[3] === "undefined") {
- return ("rgb(" + _colR + ", " + _colG + ", " + _colB + ")");
- }
- return ("rgb(" + _colR + ", " + _colG + ", " + _colB + ", " + _col[3] + ")"); // rgba
- }
- // ================≪ RGB値の分割 ≫================
- function rgbSplit(_col){
- if (_col.substring(0, 4) === "rgb("){_col = _col.slice(4, -1)}
- else {_col = _col.slice(5, -1)}
- var _ret = _col.split(", ");
- return (_ret);
- }
- // ================≪ 白・黒の範囲を与えてフィルタを作成 ≫================
- function createFilter(_w, _b){
- var br = _b[0], wr = _w[0], wg = _w[1], wb = _w[2];
- var tr = wr - br;
- var r = tr / (255 - tr) * br + br*1;
- var a = br/ r; // 中心値 r が気をつけないと 0 や 255 になって 0 除算になる
- if (isNaN(a) === true){a = (wr-255) / (r-255);}
- var g = r - (wr - wg) / a;
- var b = r - (wr - wb) / a;
- // r, g, b, a, rgba の値を配列で返す
- return ([r, g, b, a, "rgba(" + Math.floor(r) + ", " + Math.floor(g) + ", " + Math.floor(b) + ", " + a + ")"]);
- }
- // ================≪ フラッシュにもフィルタを適用 ≫================
- function flashMode(){
- for (var objs = document.getElementsByTagName("object"), i = 0, obj; obj = objs[i]; i++){
- if (obj.type === "application/x-shockwave-flash"){
- var skip = false;
- obj.style.display = "none";
- for (var params = obj.getElementsByTagName("param"), j = 0, param; param = params[j]; j++){
- if (param.getAttribute("name") == "wmode"){
- skip = true;
- param.setAttribute("value", "transparent");
- // バックグラウンドのフラッシュはこうすると適用される
- _win.setTimeout(function(o){
- o.parentNode.insertBefore(o,o.nextSibling);
- o.style.display = "block";
- }, 100, obj);
- break;
- }
- }
- if(skip != true) {
- // paramが存在しないとき用(動作未確認)
- var param = document.createElement("param");
- param.setAttribute("name", "wmode");
- param.setAttribute("value", "transparent");
- obj.appendChild(param);
- obj.parentNode.insertBefore(obj,obj.nextSibling);
- }
- // バックグラウンドのフラッシュはこうすると適用される
- _win.setTimeout(function(o){
- o.parentNode.insertBefore(o,o.nextSibling);
- o.style.display = "block";
- }, 100, obj);
- }
- }
- // ----------------< embedタグ >----------------
- for (var embs = document.getElementsByTagName("embed"), i = 0, emb; emb = embs[i]; i++){
- emb.style.display = "none";
- emb.setAttribute("wmode", "transparent");
- // バックグラウンドのフラッシュはこうすると適用される
- setTimeout(function(o){
- o.parentNode.insertBefore(o,o.nextSibling);
- o.style.display = "block";
- }, 100, emb);
- }
- }