// ==UserScript==
// @name eye-protection
// @name:zh-CN 护眼模式
// @noframes true
// @namespace https://github.com/jackdizhu
// @version 0.2.11
// @description:zh-CN 护眼模式,兼容所有网站,自动开启护眼模式,支持自定义颜色
// @description:en Eye protection mode, compatible with all websites, automatically open eye protection mode, support custom colors
// @author jackdizhu
// @match *
// @include *
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @grant GM_info
// @grant GM_registerMenuCommand
// @run-at document-idle
// @description 护眼模式,兼容所有网站,自动开启护眼模式,支持自定义颜色
// ==/UserScript==
// 好评记得收藏一下,哈 If you think this script is good, please bookmark it, thanks!
(function() {
'use strict';
function getLang (key) {
var $lang = navigator.language.toLowerCase().indexOf('zh') !== -1 ? 'zh' : 'en'
var langObj = {
'tips-zh': '护眼模式自定义颜色,如:rgb(204, 232, 207) 或者 #cddc39',
'tips-en': 'Custom color for eye-protection, such as rgb(204, 232, 207) or #cddc39',
'btn-save-zh': '保存',
'btn-save-en': 'save',
'btn-reset-zh': '重置',
'btn-reset-en': 'reset',
'btn-close-zh': '关闭',
'btn-close-en': 'close',
'btn-close-tips-zh': '如果无法关闭 请刷新界面',
'btn-close-tips-en': 'If you cannot close, please refresh the interface',
'btn-add-whitelist-zh': '添加白名单',
'btn-add-whitelist-en': 'add whitelist',
'btn-remove-whitelist-zh': '移出白名单',
'btn-remove-whitelist-en': 'remove whitelist',
'btn-menu-open-zh': '自定义颜色',
'btn-menu-open-en': 'custom color',
}
return langObj[key + '-' + $lang] || ''
}
var dataKey = {
color: 'eye-protection-color',
whitelist: 'eye-protection-whitelist'
}
var defColor = 'rgb(204, 232, 207)';
var curColor = defColor;
var $el = document.createElement('div');
var inWhitelist = false
$el.style = `
position: fixed;
pointer-events: none;
width: 100%;
height: 100%;
left: 0;
top: 0;
background: ${getDbColor()};
opacity: 0.2;
z-index: 999999999;
`;
// 从数据库取配置数据
function getDbColor () {
var color = GM_getValue(dataKey.color) || defColor;
return color;
}
function getWhitelist () {
var whitelist = GM_getValue(dataKey.whitelist) || '';
return whitelist;
}
function saveWhitelist (data) {
GM_setValue(dataKey.whitelist, data);
}
// 关闭菜单
function closeMenu() {
var oldEditBox = document.querySelector('#eye-protection-setMenu');
if (oldEditBox) {
oldEditBox.parentNode.removeChild(oldEditBox);
}
$el.style.background = curColor
}
// 保存选项
function saveSetting() {
curColor = document.querySelector('#eye-protection-setMenuTextArea').value;
curColor = curColor.replace(/(^\s)|(\s$)/, '');
GM_setValue(dataKey.color, curColor);
closeMenu();
}
// 重置
function reset() {
curColor = defColor
GM_setValue(dataKey.color, curColor);
closeMenu();
}
// 打开菜单
function openMenu() {
var oldEditBox = document.querySelector('#eye-protection-setMenu');
if (oldEditBox) {
oldEditBox.parentNode.removeChild(oldEditBox);
return;
}
var color = getDbColor();
var $dom = document.createElement('div');
$dom.id = 'eye-protection-setMenu';
$dom.style.cssText = `
position: fixed;
top: 100px;
left: 50px;
padding: 10px;
background: #fff;
border-radius: 4px;
`;
GM_addStyle(`
#eye-protection-setMenu {
font-family: Helvetica, 'Hiragino Sans GB', 'Microsoft Yahei', '微软雅黑', Arial, sans-serif;
font-size: 14px;
z-index: 999999999;
border: 1px solid #dedede;
}
#eye-protection-setMenu .button {
padding: 3px 6px;
line-height: 16px;
margin-right: 10px;
display: inline-block;
border: 1px solid #999;
border-radius: 3px;
display: inline-block;
cursor: pointer;
}
#eye-protection-setMenu p {
margin: 0;
}
#eye-protection-setMenu p + p {
margin-top: 10px;
}
#eye-protection-setMenu textarea {
border: 1px solid;
padding: 4px;
overflow: auto;
border-radius: 4px;
margin-bottom: 10px;
margin-top: 10px;
}
#eye-protection-setMenu .input-color span {
display: inline-block;
line-height: 28px;
vertical-align: bottom;
}
`);
var inColor = '#cddc39'
function getHtml (color) {
color = color || curColor
if (/^\#/.test(color)) {
inColor = color
}
return `
<p>${getLang('tips')}</P>
<textarea id="eye-protection-setMenuTextArea" wrap='off' cols='45' rows='5' value="${color}">${color}</textarea>
<p class="input-color">
<input type="color" id="eye-protection-color-input" value="${inColor}">
<span>${inColor}</span>
</p>
<p>
<span class="button" id='eye-protection-setMenuSave'>${getLang('btn-save')}</span>
<span class="button" id='eye-protection-setMenureset'>${getLang('btn-reset')}</span>
<span class="button" id='eye-protection-setMenuClose' title='${getLang('btn-close-tips')}'>${getLang('btn-close')}</span>
</p>
<p>
${inWhitelist ?
'<span class="button" id="eye-protection-removeWhitelist">' + getLang('btn-remove-whitelist') + '</span>' :
'<span class="button" id="eye-protection-addWhitelist">' + getLang('btn-add-whitelist') + '</span>'
}
</p>
<!--<p>
<input type="text" id="eye-protection-customInput"/>
<span class="button" id='eye-protection-customWhitelist'>自定义白名单</span>
</p>-->
`;
}
var innerH = getHtml()
function colorChange (e) {
inColor = e.target.value
$dom.innerHTML = getHtml(inColor);
}
$dom.innerHTML = innerH;
document.body.appendChild($dom);
function eventFn (event, fn, id) {
if (event.target.id === id) {
fn(event)
}
}
function addWhitelist (domain) {
var $whitelist = getWhitelist()
var str = ',' + domain
if ($whitelist.indexOf(str) === -1) {
inWhitelist = true
saveWhitelist($whitelist + str)
}
init()
closeMenu()
}
function removeWhitelist (domain) {
var $whitelist = getWhitelist()
var str = ',' + domain
if ($whitelist.indexOf(str) !== -1) {
inWhitelist = false
saveWhitelist($whitelist.replace(str, ''))
}
init()
closeMenu()
}
$dom.addEventListener('click', function (event) {
eventFn(event, saveSetting, 'eye-protection-setMenuSave')
}, false);
$dom.addEventListener('click', function (event) {
eventFn(event, reset, 'eye-protection-setMenureset')
}, false);
$dom.addEventListener('click', function (event) {
eventFn(event, closeMenu, 'eye-protection-setMenuClose')
}, false);
$dom.addEventListener('change', function (event) {
eventFn(event, colorChange, 'eye-protection-color-input')
}, false);
// 白名单
$dom.addEventListener('click', function (event) {
eventFn(event, function () {
addWhitelist(document.domain)
}, 'eye-protection-addWhitelist')
}, false);
$dom.addEventListener('click', function (event) {
eventFn(event, function () {
removeWhitelist(document.domain)
}, 'eye-protection-removeWhitelist')
}, false);
}
GM_registerMenuCommand(getLang('btn-menu-open'), openMenu); // 设置油猴插件的菜单
function init () {
var $whitelist = getWhitelist()
var domain = document.domain
var tld = '|.com|.xyz|.net|.top|.tech|.org|.gov|.edu|.ink|.int|.mil|.pub|.cn|.com.cn|.net.cn|.gov.cn|.org.cn|.red|.ink|.biz|.cc|.tv|.info|.name|.pro|.museum|.coop|.aero|.mobi|.travel'
var arr = domain.split('.')
var $tld = ''
var name = ''
for (let i = arr.length; i > 0; i--) {
let item = arr[i];
let _tld = $tld
if (_tld) {
_tld = item + '.' + _tld
} else {
_tld = '.' + item
}
if (tld.indexOf('|' + _tld) !== -1) {
$tld = _tld
} else {
name = arr[i - 1]
break
}
}
if ($whitelist.indexOf(',' + domain) !== -1 || $whitelist.indexOf(',*.' + name + $tld) !== -1) {
inWhitelist = true
$el.style.display = 'none'
return false
} else {
inWhitelist = false
$el.style.display = 'block'
}
document.body.appendChild($el)
}
init()
})();