forked from XIU2/UserScript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
DarkMode.user.js
506 lines (462 loc) · 30.8 KB
/
DarkMode.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
// ==UserScript==
// @name 护眼模式
// @name:zh-CN 护眼模式
// @name:zh-TW 護眼模式
// @name:en Dark Mode
// @version 1.5.3
// @author X.I.U
// @description 简单有效的全网通用护眼模式(夜间模式、暗黑模式、深色模式)
// @description:zh-CN 简单有效的全网通用护眼模式(夜间模式、暗黑模式、深色模式)
// @description:zh-TW 簡單有效的全網通用護眼模式(夜間模式、暗黑模式、深色模式)
// @description:en Simple and effective network-wide eye protection mode (night mode, dark mode, dark mode)
// @match *://*/*
// @icon data:image/png;base64,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
// @grant GM_registerMenuCommand
// @grant GM_unregisterMenuCommand
// @grant GM_openInTab
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_notification
// @sandbox JavaScript
// @noframes
// @license GPL-3.0 License
// @run-at document-start
// @namespace https://github.com/XIU2/UserScript
// @supportURL https://github.com/XIU2/UserScript
// @homepageURL https://github.com/XIU2/UserScript
// ==/UserScript==
(function() {
'use strict';
var menu_ALL = [
['menu_disable', '✅ 已启用 (点击对当前网站禁用)', '❌ 已禁用 (点击对当前网站启用)', []],
['menu_runDuringTheDay', '白天保持开启 (比晚上亮一点点)', '白天保持开启', true],
['menu_darkModeAuto', '护眼模式跟随浏览器', '护眼模式跟随浏览器', false],
['menu_autoRecognition', '智能排除自带暗黑模式的网页 (beta)', '智能排除自带暗黑模式的网页 (beta)', true],
['menu_forcedToEnable', '✅ 已强制当前网站启用护眼模式 (👆)', '❌ 未强制当前网站启用护眼模式 (👆)', []],
['menu_darkModeType', '点击切换模式', '点击切换模式', 2],
['menu_customMode', '自定义当前模式', '自定义当前模式', true], ['menu_customMode1',,,'60|50'], ['menu_customMode2',,,'60|40|50|50'], ['menu_customMode3',,,'90'], ['menu_customMode3_exclude',,,'img, .img, video, [style*="background"][style*="url"], svg'],
['menu_customTime', '自定义昼夜时间', '自定义昼夜时间', '6:00|18:00'],
['menu_autoSwitch', '晚上自动切换模式', '晚上自动切换模式', ''],
], menu_ID = [];
for (let i=0;i<menu_ALL.length;i++){ // 如果读取到的值为 null 就写入默认值
if (GM_getValue(menu_ALL[i][0]) == null){GM_setValue(menu_ALL[i][0], menu_ALL[i][3])};
}
registerMenuCommand();
// 自定义昼夜时间 过渡性调整(精确到分钟),过段时间移除
if (GM_getValue('menu_customTime', '').indexOf(':') === -1) GM_setValue('menu_customTime', GM_getValue('menu_customTime', '6|18').replace('|',':00|') + ':00')
if (menu_ID.length > 1) {addStyle();}
// 注册脚本菜单
function registerMenuCommand() {
if (menu_ID.length != []){
for (let i=0;i<menu_ID.length;i++){
GM_unregisterMenuCommand(menu_ID[i]);
}
}
for (let i=0;i<menu_ALL.length;i++){ // 循环注册脚本菜单
menu_ALL[i][3] = GM_getValue(menu_ALL[i][0]);
if (menu_ALL[i][0] === 'menu_disable')
{ // 启用/禁用护眼模式 (当前网站)
if (menu_disable('check')) { // 当前网站是否已存在禁用列表中
menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][2]}`, function(){menu_disable('del')});
return
} else {
if (GM_getValue('menu_darkModeAuto') && !window.matchMedia('(prefers-color-scheme: dark)').matches) {
menu_ID[i] = GM_registerMenuCommand(`❌ 当前浏览器为白天模式 (点击关闭 [护眼模式跟随浏览器])`, function(){GM_setValue('menu_darkModeAuto', false);location.reload();});
return
}
menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][1]}`, function(){menu_disable('add')});
}
}
else if (menu_ALL[i][0] === 'menu_darkModeType')
{ // 点击切换模式
if (menu_ALL[i][3] > 3) { // 避免在减少 raw 数组后,用户储存的数据大于数组而报错
menu_ALL[i][3] = 1;
GM_setValue(menu_ALL[i][0], menu_ALL[i][3]);
}
let menu_newMode = getAutoSwitch();
menu_ID[i] = GM_registerMenuCommand(`${menu_num(menu_newMode)} ${menu_ALL[i][1]}`, function(){menu_toggle(`${menu_ALL[i][3]}`,`${menu_ALL[i][0]}`)});
}
else if (menu_ALL[i][0] === 'menu_customMode')
{ // 自定义当前模式
GM_setValue(menu_ALL[i][0], menu_ALL[i][3]);
menu_ID[i] = GM_registerMenuCommand(`#️⃣ ${menu_ALL[i][1]}`, function(){menu_customMode()});
}
else if (menu_ALL[i][0] === 'menu_customTime')
{ // 自定义昼夜时间
GM_setValue(menu_ALL[i][0], menu_ALL[i][3]);
menu_ID[i] = GM_registerMenuCommand(`#️⃣ ${menu_ALL[i][1]}`, function(){menu_customTime()});
}
else if (menu_ALL[i][0] === 'menu_customMode1' || menu_ALL[i][0] === 'menu_customMode2' || menu_ALL[i][0] === 'menu_customMode3' || menu_ALL[i][0] === 'menu_customMode3_exclude')
{ // 当前模式值
GM_setValue(menu_ALL[i][0], menu_ALL[i][3]);
}
else if (menu_ALL[i][0] === 'menu_autoSwitch')
{ // 晚上自动切换模式
menu_ID[i] = GM_registerMenuCommand(`#️⃣ ${menu_ALL[i][1]}`, function(){menu_customAutoSwitch()});
}
else if (menu_ALL[i][0] === 'menu_forcedToEnable')
{ // 强制当前网站启用护眼模式
if (menu_value('menu_autoRecognition')) { // 自动排除自带暗黑模式的网页 (beta)
if (menu_forcedToEnable('check')) { // 当前网站是否已存在列表中
menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][1]}`, function(){menu_forcedToEnable('del')});
} else {
menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][2]}`, function(){menu_forcedToEnable('add')});
}
}
}
else
{
menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][3]?'✅':'❌'} ${menu_ALL[i][1]}`, function(){menu_switch(`${menu_ALL[i][3]}`,`${menu_ALL[i][0]}`,`${menu_ALL[i][2]}`)});
}
}
menu_ID[menu_ID.length] = GM_registerMenuCommand('💬 反馈 & 建议', function () {window.GM_openInTab('https://github.com/XIU2/UserScript#xiu2userscript', {active: true,insert: true,setParent: true});window.GM_openInTab('https://greasyfork.org/zh-CN/scripts/426377/feedback', {active: true,insert: true,setParent: true});});
}
// 菜单数字图标
function menu_num(num) {
return ['0️⃣','1️⃣','2️⃣','3️⃣','4️⃣','5️⃣','6️⃣','7️⃣','8️⃣','9️⃣','🔟'][num]
}
// 晚上自动切换模式
function menu_customAutoSwitch() {
let newAutoSwitch = prompt('白天、晚上使用不同模式,修改后立即生效~\n格式:白天模式|晚上模式\n例如:1|3(即白天模式 1 晚上模式 3)\n默认:留空(即关闭该功能)', GM_getValue('menu_autoSwitch'));
if (newAutoSwitch === '') {
GM_setValue('menu_autoSwitch', '');
} else if (newAutoSwitch != null) {
if (newAutoSwitch.split('|').length == 2) {
GM_setValue('menu_autoSwitch', newAutoSwitch);
} else {
alert(`填入内容格式错误...`);
}
}
registerMenuCommand(); // 重新注册脚本菜单
if (document.getElementById('XIU2DarkMode')) {
document.getElementById('XIU2DarkMode').remove(); // 即时修改样式
addStyle();
}
}
// 获取当前模式
function getAutoSwitch() {
let darkModeType = GM_getValue('menu_darkModeType'), hours = new Date().getHours(), time = GM_getValue('menu_customTime').split('|').map(Number);
if (GM_getValue('menu_autoSwitch') != '') { // 晚上自动切换模式
if (isDaytime()) { // 白天
darkModeType = GM_getValue('menu_autoSwitch').split('|')[0];
} else { // 晚上
darkModeType = GM_getValue('menu_autoSwitch').split('|')[1];
}
}
return parseInt(darkModeType)
}
// 自定义当前模式
function menu_customMode() {
let newMods, tip, defaults, name;
switch(getAutoSwitch()) {
case 1:
tip = '自定义 [模式 1],修改后立即生效 (部分网页可能需要刷新)~\n格式:亮度 (白天)|亮度 (晚上)\n默认:60|50(均为百分比 1~100,不需要 % 符号)';
defaults = '60|50';
name = 'menu_customMode1';
break;
case 2:
tip = '自定义 [模式 2],修改后立即生效 (部分网页可能需要刷新)~\n格式:亮度 (白天)|暖色 (白天)|亮度 (晚上)|暖色 (晚上)\n默认:60|40|50|50(均为百分比 1~100,不需要 % 符号)';
defaults = '60|40|50|50';
name = 'menu_customMode2';
break;
case 3:
tip = '自定义 [模式 3],修改后立即生效 (部分网页可能需要刷新)~\n格式:反色\n默认:90(均为百分比 50~100,不需要 % 符号)';
defaults = '90';
name = 'menu_customMode3';
break;
}
newMods = prompt(tip, GM_getValue(`${name}`));
if (newMods === '') {
GM_setValue(`${name}`, defaults);
registerMenuCommand(); // 重新注册脚本菜单
} else if (newMods != null) {
GM_setValue(`${name}`, newMods);
registerMenuCommand(); // 重新注册脚本菜单
}
if (getAutoSwitch() == 3) {
tip = '自定义 [模式 3] 排除目标,修改后立即生效 (部分网页可能需要刷新)~\n格式:CSS 选择器 (如果不会写可以找我)\n默认:img, .img, video, [style*="background"][style*="url"], svg\n (使用英文逗号间隔,末尾不要有逗号)';
defaults = 'img, .img, video, [style*="background"][style*="url"], svg';
name = 'menu_customMode3_exclude';
newMods = prompt(tip, GM_getValue(`${name}`));
if (newMods === '') {
GM_setValue(`${name}`, defaults);
registerMenuCommand(); // 重新注册脚本菜单
} else if (newMods != null) {
GM_setValue(`${name}`, newMods);
registerMenuCommand(); // 重新注册脚本菜单
}
}
if (document.getElementById('XIU2DarkMode')) {
document.getElementById('XIU2DarkMode').remove(); // 即时修改样式
addStyle();
}
}
// 自定义昼夜时间
function menu_customTime() {
let newMods = prompt('自定义脚本内和白天/晚上相关的时间,修改后刷新网页生效~\n格式:6:00|18:30 (即 6:00 ~ 18:30 之间是白天时间)\n也支持反向设置:14:00|12:00 (即 12:00 ~ 14:00 之间是夜晚时间)', GM_getValue('menu_customTime'));
if (newMods === '') {
GM_setValue('menu_customTime', '6:00|18:00');
registerMenuCommand(); // 重新注册脚本菜单
} else if (newMods != null) {
GM_setValue('menu_customTime', newMods);
registerMenuCommand(); // 重新注册脚本菜单
}
}
// 强制当前网站启用护眼模式
function menu_forcedToEnable(type) {
switch(type) {
case 'check':
if(check()) return true
return false
break;
case 'add':
add();
break;
case 'del':
del();
break;
}
function check() { // 存在返回真,不存在返回假
let websiteList = menu_value('menu_forcedToEnable'); // 读取网站列表
if (websiteList.indexOf(location.host) === -1) return false // 不存在返回假
return true
}
function add() {
if (check()) return
let websiteList = menu_value('menu_forcedToEnable'); // 读取网站列表
websiteList.push(location.host); // 追加网站域名
GM_setValue('menu_forcedToEnable', websiteList); // 写入配置
location.reload(); // 刷新网页
}
function del() {
if (!check()) return
let websiteList = menu_value('menu_forcedToEnable'), // 读取网站列表
index = websiteList.indexOf(location.host);
websiteList.splice(index, 1); // 删除网站域名
GM_setValue('menu_forcedToEnable', websiteList); // 写入配置
location.reload(); // 刷新网页
}
}
// 启用/禁用护眼模式 (当前网站)
function menu_disable(type) {
switch(type) {
case 'check':
if(check()) return true
return false
break;
case 'add':
add();
break;
case 'del':
del();
break;
}
function check() { // 存在返回真,不存在返回假
let websiteList = menu_value('menu_disable'); // 读取网站列表
if (websiteList.indexOf(location.host) === -1) return false // 不存在返回假
return true
}
function add() {
if (check()) return
let websiteList = menu_value('menu_disable'); // 读取网站列表
websiteList.push(location.host); // 追加网站域名
GM_setValue('menu_disable', websiteList); // 写入配置
location.reload(); // 刷新网页
}
function del() {
if (!check()) return
let websiteList = menu_value('menu_disable'), // 读取网站列表
index = websiteList.indexOf(location.host);
websiteList.splice(index, 1); // 删除网站域名
GM_setValue('menu_disable', websiteList); // 写入配置
location.reload(); // 刷新网页
}
}
// 切换暗黑模式
function menu_toggle(menu_status, Name) {
menu_status = parseInt(menu_status)
if (menu_status >= 3){
menu_status = 1;
} else {
menu_status += 1;
}
GM_setValue(`${Name}`, menu_status);
registerMenuCommand(); // 重新注册脚本菜单
if (document.getElementById('XIU2DarkMode')) {
document.getElementById('XIU2DarkMode').remove(); // 即时修改样式
addStyle();
}
//location.reload(); // 刷新网页
};
// 菜单开关
function menu_switch(menu_status, Name, Tips) {
if (menu_status == 'true'){
GM_setValue(`${Name}`, false);
GM_notification({text: `已关闭 [${Tips}] 功能\n(点击刷新网页后生效)`, timeout: 3500, onclick: function(){location.reload();}});
}else{
GM_setValue(`${Name}`, true);
GM_notification({text: `已开启 [${Tips}] 功能\n(点击刷新网页后生效)`, timeout: 3500, onclick: function(){location.reload();}});
}
if (Name === 'menu_autoRecognition') {
location.reload(); // 刷新网页
}
registerMenuCommand(); // 重新注册脚本菜单
};
// 返回菜单值
function menu_value(menuName) {
for (let menu of menu_ALL) {
if (menu[0] == menuName) {
return menu[3]
}
}
}
// 添加样式
function addStyle() {
let remove = false, style_Add = document.createElement('style'),
hours = new Date().getHours(),
style_10 = menu_value('menu_customMode1').split('|'),
style_20 = menu_value('menu_customMode2').split('|'),
style_30 = menu_value('menu_customMode3').split('|'),
style = ``,
style_00 = `html, body {background-color: #ffffff !important;}`,
style_11 = `html {filter: brightness(${style_10[0]}%) !important;}`,
style_11_firefox = `html {filter: brightness(${style_10[0]}%) !important; background-image: url();}`,
style_12 = `html {filter: brightness(${style_10[1]}%) !important;}`,
style_12_firefox = `html {filter: brightness(${style_10[1]}%) !important; background-image: url();}`,
style_21 = `html {filter: brightness(${style_20[0]}%) sepia(${style_20[1]}%) !important;}`,
style_21_firefox = `html {filter: brightness(${style_20[0]}%) sepia(${style_20[1]}%) !important; background-image: url();}`,
style_22 = `html {filter: brightness(${style_20[2]}%) sepia(${style_20[3]}%) !important;}`,
style_22_firefox = `html {filter: brightness(${style_20[2]}%) sepia(${style_20[3]}%) !important; background-image: url();}`,
style_31 = `html {filter: invert(${style_30[0]}%) !important; text-shadow: 0 0 0 !important;}
${menu_value('menu_customMode3_exclude')} {filter: invert(1) !important;}
img[alt="[公式]"] {filter: none !important;}`,
style_31_firefox = `html {filter: invert(${style_30[0]}%) !important; background-image: url(); text-shadow: 0 0 0 !important;}
${menu_value('menu_customMode3_exclude')} {filter: invert(1) !important;}
img[alt="[公式]"] {filter: none !important;}`;
// Firefox 浏览器需要特殊对待
if (navigator.userAgent.toLowerCase().indexOf('firefox') > -1) {
style_11 = style_11_firefox
style_12 = style_12_firefox
style_21 = style_21_firefox
style_22 = style_22_firefox
style_31 = style_31_firefox
}
// 白天
if (isDaytime()) {
if (menu_value('menu_runDuringTheDay')) {
style_12 = style_11
style_22 = style_21
} else {
style_12 = style_22 = ''
}
}
let darkModeType = getAutoSwitch();
switch(darkModeType) {
case 1:
style += style_12;
break;
case 2:
style += style_22;
break;
case 3:
style += style_31;
if (location.hostname.indexOf('search.bilibili.com') > -1) {
style += `ul.video-list img, ul.video-list .video-item .img .mask-video, ul.video-list .video-item .img .van-danmu, ul.video-list .video-item .img .van-framepreview {filter: none !important;}`
} else if (location.hostname.indexOf('.bilibili.com') > -1) {
style += `
.bpx-player-container[data-screen="full"] .bpx-player-video-wrap {filter: invert(1) !important;}
.bpx-player-container[data-screen="web"] {filter: invert(1) !important;}
.bpx-player-container[data-screen="web"] video {filter: none !important;}
* {font-weight: bold !important;}`
} else if (location.hostname.indexOf('.huya.com') > -1) {
style += `#player-wrap[style="height: 100%;"], .player-loading, .sidebar-show, #player-ctrl-wrap {filter: invert(1) !important;}`
}
break;
}
style_Add.id = 'XIU2DarkMode';
style_Add.type = 'text/css';
//console.log(document,document.lastElementChild,document.querySelector('html'))
if (document.lastElementChild) {
document.lastElementChild.appendChild(style_Add).textContent = style;
} else { // 发现个别网站速度太慢的话,就会出现脚本运行太早,连 html 标签都还没加载。。。
let timer1 = setInterval(function(){ // 每 5 毫秒检查一下 html 是否已存在
if (document.lastElementChild) {
clearInterval(timer1); // 取消定时器
document.lastElementChild.appendChild(style_Add).textContent = style;
}
});
}
let websiteList = [];
if (menu_value('menu_autoRecognition')) { // 智能排除自带暗黑模式的网页 (beta)
websiteList = menu_value('menu_forcedToEnable'); // 强制当前网站启用护眼模式
}
// 为了避免 body 还没加载导致无法检查是否设置背景颜色
let timer = setInterval(function(){ // 每 5 毫秒检查一下 body 是否已存在
if (document.body) {
clearInterval(timer); // 取消定时器(每 5 毫秒一次的)
setTimeout(function(){ // 为了避免太快 body 的 CSS 还没加载上,先延迟 150 毫秒(缺点就是可能会出现短暂一闪而过的暗黑滤镜)
console.log('[护眼模式] html:', window.getComputedStyle(document.lastElementChild).backgroundColor, 'body:', window.getComputedStyle(document.body).backgroundColor)
if (window.getComputedStyle(document.body).backgroundColor === 'rgba(0, 0, 0, 0)' && window.getComputedStyle(document.lastElementChild).backgroundColor === 'rgba(0, 0, 0, 0)' && !(document.querySelector('head>meta[name="color-scheme"],head>link[href^="resource:"]') && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
// 如果 body 没有 CSS 背景颜色(或是在资源页 且 浏览器为白天模式),那就需要添加一个背景颜色,否则影响滤镜效果
let style_Add2 = document.createElement('style');
style_Add2.id = 'XIU2DarkMode2';
document.lastElementChild.appendChild(style_Add2).textContent = style_00;
} else if ((document.querySelector('head>meta[name="color-scheme"],head>link[href^="resource:"]') && window.matchMedia('(prefers-color-scheme: dark)').matches) || (document.querySelector('html[class*=dark], html[data-dark-theme*=dark], html[data-theme*=dark], html[data-color-mode*=dark], body[class*=dark]')) || (window.getComputedStyle(document.body).backgroundColor === 'rgb(0, 0, 0)') || (getColorValue(document.body) > 0 && getColorValue(document.body) < 898989) || (getColorValue(document.lastElementChild) > 0 && getColorValue(document.lastElementChild) < 898989) || (window.getComputedStyle(document.body).backgroundColor === 'rgba(0, 0, 0, 0)' && window.getComputedStyle(document.lastElementChild).backgroundColor === 'rgb(0, 0, 0)')) {
// 如果是在资源页 且 浏览器为暗黑模式,或 html/body 元素包含 dark 标识,或底色为黑色 (等于0,0,0) 或深色 (小于 89,89,89),就停用本脚本滤镜
if (menu_value('menu_autoRecognition')) { // 排除自带暗黑模式的网页 (beta)
for (let i=0;i<websiteList.length;i++){ // 这些网站强制启用护眼模式滤镜
if (websiteList[i] === location.host) return
}
console.log('[护眼模式] 检测到当前网页自带暗黑模式,停用本脚本滤镜...')
document.getElementById('XIU2DarkMode').remove();
remove = true;
}
}
}, 150);
// 用来解决一些 CSS 加载缓慢的网站,可能会出现没有正确排除的问题,在没有找到更好的办法之前,先这样凑活着用
setTimeout(function(){
console.log('[护眼模式] html:', window.getComputedStyle(document.lastElementChild).backgroundColor, 'body:', window.getComputedStyle(document.body).backgroundColor)
if ((document.querySelector('head>meta[name="color-scheme"],head>link[href^="resource:"]') && window.matchMedia('(prefers-color-scheme: dark)').matches) || (document.querySelector('html[class*=dark], html[data-dark-theme*=dark], html[data-theme*=dark], html[data-color-mode*=dark], body[class*=dark]')) || (window.getComputedStyle(document.body).backgroundColor === 'rgb(0, 0, 0)') || (getColorValue(document.body) > 0 && getColorValue(document.body) < 898989) || (getColorValue(document.lastElementChild) > 0 && getColorValue(document.lastElementChild) < 898989) || (window.getComputedStyle(document.body).backgroundColor === 'rgba(0, 0, 0, 0)' && window.getComputedStyle(document.lastElementChild).backgroundColor === 'rgb(0, 0, 0)')) {
// 如果是在资源页 且 浏览器为暗黑模式,或 html/body 元素包含 dark 标识,或底色为黑色 (等于0,0,0) 或深色 (小于 89,89,89),就停用本脚本滤镜
if (menu_value('menu_autoRecognition')) { // 排除自带暗黑模式的网页 (beta)
for (let i=0;i<websiteList.length;i++){ // 这些网站强制启用护眼模式滤镜
if (websiteList[i] === location.host) return
}
if (remove) return
console.log('[护眼模式] 检测到当前网页自带暗黑模式,停用本脚本滤镜....')
if (document.getElementById('XIU2DarkMode')) document.getElementById('XIU2DarkMode').remove();
if (document.getElementById('XIU2DarkMode2')) document.getElementById('XIU2DarkMode2').remove();
}
}
}, 1500);
}
});
// 解决远景论坛会清理掉前面插入的 CSS 样式的问题
if (location.hostname === 'bbs.pcbeta.com') {
let timer1 = setInterval(function(){
if (!document.getElementById('XIU2DarkMode')) {
document.lastElementChild.appendChild(style_Add).textContent = style;
clearInterval(timer1);
}
});
}
}
// 获取背景颜色值
function getColorValue(e) {
let rgbValueArry = window.getComputedStyle(e).backgroundColor.replace(/rgba|rgb|\(|\)| /g, '').split (',')
return parseInt(rgbValueArry[0] + rgbValueArry[1] + rgbValueArry[2])
}
// 判断当前是白天还是晚上
function isDaytime() {
let nowTime = new Date('2022-03-07 ' + new Date().getHours() + ':' + new Date().getMinutes() + ':00').getTime()/1000, time = GM_getValue('menu_customTime').split('|');
time[0] = new Date('2022-03-07 ' + time[0] + ':00').getTime()/1000;
time[1] = new Date('2022-03-07 ' + time[1] + ':00').getTime()/1000;
if (time[0] < time[1]){
if (nowTime > time[0] && nowTime < time[1]) return true
return false
} else {
if (nowTime > time[0] || nowTime < time[1]) return true
return false
}
}
})();