史前阴间-深色版红盟

300 1
Gr3yPh4ntom 2025-1-19 09:14:08 | 显示全部楼层 |阅读模式

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Gr3yPh4ntom 2025-1-19 11:15:39 | 显示全部楼层
暴力猴violentmonkey脚本:
  1. // ==UserScript==
  2. // @name          深色模式
  3. // @namespace     https://greasyfork.org/zh-CN/users/1196880-ling2ling4
  4. // @version       1.3.1
  5. // @author        Ling2Ling4
  6. // @description   设置页面为深色模式, 可定时开关
  7. // @license       AGPL-3.0-or-later
  8. // @icon data:image/png;base64,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
  9. // @match         *://*/*
  10. // @run-at        document-start
  11. // @grant         GM_setValue
  12. // @grant         GM_getValue
  13. // @grant         GM_registerMenuCommand
  14. // @grant         GM_notification
  15. // @noframes
  16. // @compatible    chrome
  17. // @compatible    edge
  18. // @compatible    firefox
  19. // @downloadURL https://update.greasyfork.org/scripts/503000/%E6%B7%B1%E8%89%B2%E6%A8%A1%E5%BC%8F.user.js
  20. // @updateURL https://update.greasyfork.org/scripts/503000/%E6%B7%B1%E8%89%B2%E6%A8%A1%E5%BC%8F.meta.js
  21. // ==/UserScript==

  22. (() => {
  23.   "use strict";
  24.   function verify_time1(newVal, oldVal, base) {
  25.     const arr = newVal.trim().split(/:|:/);
  26.     if (2 === arr.length && 2 === arr[0].length && 2 === arr[1].length) {
  27.       const a = +arr[0],
  28.         b = +arr[1];
  29.       if (a >= 0 && a <= 24 && b >= 0 && b <= 59) return newVal;
  30.     }
  31.     return oldVal;
  32.   }
  33.   function getNumVerifyFn(min, max, rangeLimit = [1, 1]) {
  34.     return (newVal, oldVal, base) => {
  35.       if (!(newVal = +newVal) && 0 !== newVal) return oldVal;
  36.       if (!1 !== min && !1 !== max) {
  37.         if (rangeLimit[0] && newVal >= min) {
  38.           if (rangeLimit[1] && newVal <= max) return newVal;
  39.           if (!rangeLimit[1] && newVal < max) return newVal;
  40.         }
  41.         if (!rangeLimit[0] && newVal > min) {
  42.           if (rangeLimit[1] && newVal <= max) return newVal;
  43.           if (!rangeLimit[1] && newVal < max) return newVal;
  44.         }
  45.       } else {
  46.         if (!1 === min) {
  47.           if (rangeLimit[1] && newVal <= max) return newVal;
  48.           if (!rangeLimit[1] && newVal < max) return newVal;
  49.         }
  50.         if (!1 === max) {
  51.           if (rangeLimit[0] && newVal >= min) return newVal;
  52.           if (!rangeLimit[0] && newVal > min) return newVal;
  53.         }
  54.       }
  55.       return oldVal;
  56.     };
  57.   }
  58.   const keyBase = "ll_pageDarkMode_",
  59.     info = {
  60.       keyBase,
  61.       settingsArea: null,
  62.       isDarkMode: !1,
  63.       isCanRun: !0,
  64.       timer: null,
  65.       interval: 5e3,
  66.       cssDom: null,
  67.       btnHoverTxt: "点击切换深色模式",
  68.       otherSettings: {
  69.         oldDarkMode: {
  70.           value: !1,
  71.           base: !1,
  72.           key: keyBase + "oldDarkMode",
  73.           valType: "boolean",
  74.         },
  75.       },
  76.       settings: {
  77.         btnPosition: {
  78.           value: !1,
  79.           base: !1,
  80.           key: keyBase + "btnPosition",
  81.           groupTitle3: "按钮设置",
  82.           desc: "模式切换按钮的位置",
  83.           type: "基础设置",
  84.           valType: "boolean",
  85.           compType: "radio",
  86.           valueText: { true: "左下", false: "右下" },
  87.         },
  88.         isHiddenBtn: {
  89.           value: !1,
  90.           base: !1,
  91.           key: keyBase + "isHiddenBtn",
  92.           desc: "是否隐藏按钮, 隐藏后鼠标移入时会重新显示",
  93.           type: "基础设置",
  94.           valType: "boolean",
  95.           compType: "radio",
  96.           valueText: { true: "隐藏", false: "显示" },
  97.         },
  98.         btnSize: {
  99.           value: "30",
  100.           base: "30",
  101.           key: keyBase + "btnSize",
  102.           desc: "按钮的大小",
  103.           type: "基础设置",
  104.           valType: "number",
  105.           compType: "textarea",
  106.           verify: getNumVerifyFn(20, 60),
  107.         },
  108.         isAutoStartStop: {
  109.           value: !0,
  110.           base: !0,
  111.           key: keyBase + "isAutoStartStop",
  112.           groupTitle3: "定时开关",
  113.           desc: "是否开启定时开关功能",
  114.           type: "基础设置",
  115.           valType: "boolean",
  116.           compType: "radio",
  117.           valueText: { true: "开启", false: "关闭" },
  118.         },
  119.         startTime: {
  120.           value: "0",
  121.           base: "0",
  122.           key: keyBase + "startTime",
  123.           valType: "string",
  124.           type: "基础设置",
  125.           desc: "深色模式的自动开启时间, 0表示关闭, 按照24小时制书写, 格式为 xx:xx, 如: 20:00",
  126.           compType: "textarea",
  127.           verify: (newVal, oldVal, base) =>
  128.             0 == +newVal ? newVal : verify_time1(newVal, oldVal),
  129.         },
  130.         stopTime: {
  131.           value: "0",
  132.           base: "0",
  133.           key: keyBase + "stopTime",
  134.           valType: "string",
  135.           type: "基础设置",
  136.           desc: "深色模式的自动关闭时间, 0表示关闭, 按照24小时制书写",
  137.           compType: "textarea",
  138.           verify: (newVal, oldVal, base) =>
  139.             0 == +newVal ? newVal : verify_time1(newVal, oldVal),
  140.         },
  141.         startStopWay: {
  142.           value: !0,
  143.           base: !0,
  144.           key: keyBase + "startStopWay",
  145.           desc: "定时开关深色模式的方式",
  146.           type: "基础设置",
  147.           valType: "boolean",
  148.           compType: "radio",
  149.           valueText: {
  150.             true: "仅在设定时刻进行开关",
  151.             false: "根据设定时间段任意时刻都可开关",
  152.           },
  153.         },
  154.         isShowTips: {
  155.           value: !0,
  156.           base: !0,
  157.           key: keyBase + "isShowTips",
  158.           desc: "定时开关时是否进行弹窗提示",
  159.           type: "基础设置",
  160.           valType: "boolean",
  161.           compType: "radio",
  162.           valueText: { true: "弹窗提示", false: "关闭弹窗" },
  163.         },
  164.         onlyColor: {
  165.           value: !1,
  166.           base: !1,
  167.           key: keyBase + "onlyColor",
  168.           desc: "深色模式下是否仅调整颜色而不使页面变成深色 (此时'颜色反转'设置将失效)",
  169.           type: "颜色设置",
  170.           valType: "boolean",
  171.           compType: "radio",
  172.           valueText: { true: "自定义颜色", false: "深色+自定义颜色" },
  173.         },
  174.         invert: {
  175.           value: 1,
  176.           base: 1,
  177.           key: keyBase + "invert",
  178.           valType: "number",
  179.           type: "颜色设置",
  180.           title: "颜色反转",
  181.           desc: "颜色反转的程度, 深色效果主要与该设置相关. 默认1, 浏览器默认0, 取值范围0-1",
  182.           compType: "textarea",
  183.           verify: getNumVerifyFn(0, 1),
  184.         },
  185.         brightness: {
  186.           value: 0.9,
  187.           base: 0.9,
  188.           key: keyBase + "brightness",
  189.           valType: "number",
  190.           type: "颜色设置",
  191.           title: "亮度",
  192.           desc: "亮度的大小. 默认0.9, 浏览器默认1, 取值范围0-∞",
  193.           compType: "textarea",
  194.           verify: getNumVerifyFn(0, !1),
  195.         },
  196.         contrast: {
  197.           value: 1,
  198.           base: 1,
  199.           key: keyBase + "contrast",
  200.           valType: "number",
  201.           type: "颜色设置",
  202.           title: "对比度",
  203.           desc: "对比度的强弱. 默认1, 取值范围0-∞",
  204.           compType: "textarea",
  205.           verify: getNumVerifyFn(0, !1),
  206.         },
  207.         grayscale: {
  208.           value: 0,
  209.           base: 0,
  210.           key: keyBase + "grayscale",
  211.           valType: "number",
  212.           type: "颜色设置",
  213.           title: "灰度",
  214.           desc: "灰度的程度. 默认0, 取值范围0-1",
  215.           compType: "textarea",
  216.           verify: getNumVerifyFn(0, 1),
  217.         },
  218.         hueRotate: {
  219.           value: 0,
  220.           base: 0,
  221.           key: keyBase + "hueRotate",
  222.           valType: "number",
  223.           type: "颜色设置",
  224.           title: "色调",
  225.           desc: "色调的旋转变化. 默认0, 取值范围0-360",
  226.           compType: "textarea",
  227.           verify: getNumVerifyFn(0, 360),
  228.         },
  229.         saturate: {
  230.           value: 1,
  231.           base: 1,
  232.           key: keyBase + "saturate",
  233.           valType: "number",
  234.           type: "颜色设置",
  235.           title: "饱和度",
  236.           desc: "饱和度的高低. 默认1, 取值范围0-∞",
  237.           compType: "textarea",
  238.           verify: getNumVerifyFn(0, !1),
  239.         },
  240.         sepia: {
  241.           value: 0.2,
  242.           base: 0.2,
  243.           key: keyBase + "sepia",
  244.           valType: "number",
  245.           type: "颜色设置",
  246.           title: "深褐色",
  247.           desc: "深褐色的程度. 默认0.2, 浏览器默认0, 取值范围0-1",
  248.           compType: "textarea",
  249.           verify: getNumVerifyFn(0, 1),
  250.         },
  251.         autoDarkMode: {
  252.           value: !0,
  253.           base: !0,
  254.           key: keyBase + "autoDarkMode",
  255.           desc: "'刷新页面/打开新页面'后是否自动恢复页面的深色模式",
  256.           type: "其他设置",
  257.           valType: "boolean",
  258.           compType: "radio",
  259.           valueText: { true: "自动恢复", false: "手动开关" },
  260.           groupTitle3: "自动恢复",
  261.         },
  262.         autoDarkModeWay: {
  263.           value: !0,
  264.           base: !0,
  265.           key: keyBase + "autoDarkModeWay",
  266.           title: "自动恢复显示模式的方式",
  267.           desc: "左选项: 可使同一时间段内打开的每个页面都是相同显示模式\n右选项: 可使同一个页面打开后是上一次该页面的显示模式",
  268.           type: "其他设置",
  269.           valType: "boolean",
  270.           compType: "radio",
  271.           valueText: {
  272.             true: "恢复上一次使用的显示模式",
  273.             false: "恢复当前网页上一次的显示模式",
  274.           },
  275.         },
  276.         website: {
  277.           value:
  278.             "*www.baidu.com*\n*www.bilibili.com*\n*message.bilibili.com*\n*space.bilibili.com*\n*weibo.com*\n*www.zhihu.com*\n*www.douyin.com*",
  279.           base: "*www.baidu.com*\n*www.bilibili.com*\n*message.bilibili.com*\n*space.bilibili.com*\n*weibo.com*\n*www.zhihu.com*\n*www.douyin.com*",
  280.           key: keyBase + "website",
  281.           valType: "string",
  282.           type: "其他设置",
  283.           title: "应用的网站",
  284.           desc: "以下网站可启用深色模式, 支持*通配符, 多个网站请换行书写, 仅书写*表示所有网站都可启用\n【示例】*www.bilibili.com* 可匹配B站",
  285.           compType: "textarea",
  286.           compH: "110px",
  287.         },
  288.         onlyColorWebsite: {
  289.           value: "",
  290.           base: "",
  291.           key: keyBase + "onlyColorWebsite",
  292.           valType: "string",
  293.           type: "其他设置",
  294.           title: "不变为深色的网站",
  295.           desc: '以下网站即使启用深色模式后也不会变为深色, 而是采用"自定义颜色"模式, 支持*通配符, 多个网站请换行书写',
  296.           compType: "textarea",
  297.           compH: "110px",
  298.         },
  299.         noneInvertNodes: {
  300.           value:
  301.             '// B站\n.h .h-inner, .h-inner .avatar-container, bili-user-profile, .bili-im .avatar, .owner .to-top, #bilibili-player [role="comment"],\n// 百度\n#content_left h3.t, .cr-content [class*="opr-toplist"], .cr-content [class*="tag-common"]',
  302.           base: '// B站\n.h .h-inner, .h-inner .avatar-container, bili-user-profile, .bili-im .avatar, .owner .to-top, #bilibili-player [role="comment"],\n// 百度\n#content_left h3.t, .cr-content [class*="opr-toplist"], .cr-content [class*="tag-common"]',
  303.           key: keyBase + "noneInvertNodes",
  304.           valType: "string",
  305.           type: "其他设置",
  306.           title: "不反转的元素",
  307.           desc: "不进行颜色反转的元素, 每项用 , 分隔, 可书写css选择器. 以//开头表示行注释\n【可选】\nh1, h2, h3, h4, p, span, ul, li, i, svg, a, img, input, textarea, button, select, option, label, audio, video, ....",
  308.           compType: "textarea",
  309.           compH: "110px",
  310.           verify: (newVal) => {
  311.             "," ===
  312.               (newVal = newVal.trim().replaceAll(",", ","))[
  313.                 newVal.length - 1
  314.               ] && (newVal = newVal.slice(0, -1));
  315.             return newVal
  316.               .split("\n")
  317.               .map((item, i) => {
  318.                 const t = item;
  319.                 return (
  320.                   (item = item.trim()),
  321.                   0 === i
  322.                     ? "/" === item[0] && "/" === item[1]
  323.                       ? item
  324.                       : t
  325.                     : "/" === item[0] && "/" === item[1]
  326.                     ? ",\n" + item
  327.                     : "\n" + t
  328.                 );
  329.               })
  330.               .join("")
  331.               .replaceAll(", ,", ",")
  332.               .replaceAll(",,", ",");
  333.           },
  334.         },
  335.       },
  336.     };
  337.   function getCssHtml(isDark) {
  338.     const settings = info.settings,
  339.       r = parseInt(settings.btnSize.value / 5),
  340.       btnCss = `#${info.keyBase}btn{\nbackground:#ffffff;padding:${
  341.         r - 2
  342.       }px;border-radius:${r}px;position:fixed;${
  343.         settings.btnPosition.value ? "left" : "right"
  344.       }:-${
  345.         settings.btnSize.value / 2
  346.       }px;bottom:20px;z-index:1000;transition:ease 0.3s all,ease 0.5s 2s opacity;cursor:pointer;box-sizing:border-box;\n${
  347.         settings.isHiddenBtn.value ? "opacity:0" : ""
  348.       }}\n#${info.keyBase}btn.dark{background:#ababab}\n#${
  349.         info.keyBase
  350.       }btn:hover {${
  351.         settings.btnPosition.value ? "left:0" : "right:0"
  352.       };bottom:20px;\n${
  353.         settings.isHiddenBtn.value
  354.           ? "transition:ease 0.3s opacity;opacity:1"
  355.           : ""
  356.       }\n}\n      #${info.keyBase}btn svg{display:block;fill:#addeee}\n      #${
  357.         info.keyBase
  358.       }btn.dark svg{fill:#ffffff}`;
  359.     if (!isDark) return btnCss;
  360.     const onlyColorflag =
  361.         verifyWebsite(settings.onlyColorWebsite.value) ||
  362.         settings.onlyColor.value,
  363.       invertText = onlyColorflag ? "" : `invert(${settings.invert.value})`,
  364.       selectorArr = settings.noneInvertNodes.value
  365.         .split("\n")
  366.         .filter((item) => "/" !== (item = item.trim())[0] && "/" !== item[1]),
  367.       nonoFilter = onlyColorflag
  368.         ? ""
  369.         : 'img,video,input,iframe,canvas,object,svg image,\n[style*="background:url"],\n[style*="background: url"],\n[style*="background-image:url"],\n[style*="background-image: url"],\n[background]{filter:invert(1)}',
  370.       otherCss = onlyColorflag
  371.         ? ""
  372.         : `${selectorArr.join("")}{filter:invert(1)}`;
  373.     return `html {\nbackground-color:#fff;\nfilter:${invertText} brightness(${settings.brightness.value}) contrast(${settings.contrast.value}) grayscale(${settings.grayscale.value}) hue-rotate(${settings.hueRotate.value}deg) saturate(${settings.saturate.value}) sepia(${settings.sepia.value});\n}\n${nonoFilter}${otherCss}${btnCss}`;
  374.   }
  375.   function matchUrlWithWildcard(url, pattern) {
  376.     return new RegExp("^" + pattern.replace(/\*/g, ".*") + "$").test(url);
  377.   }
  378.   function setValue_setValue({
  379.     value,
  380.     base,
  381.     key,
  382.     verification = null,
  383.     getValue = null,
  384.     setValue = null,
  385.     getVal = null,
  386.     setVal = null,
  387.   } = {}) {
  388.     getValue && (getVal = getValue), setValue && (setVal = setValue);
  389.     let newVal = value,
  390.       oldVal = getVal ? getVal(key) : localStorage.getItem(key);
  391.     return (
  392.       void 0 !== base &&
  393.         null == oldVal &&
  394.         ((oldVal = base),
  395.         "string" != typeof base && (base = JSON.stringify(base)),
  396.         setVal ? setVal(key, base) : localStorage.setItem(key, base)),
  397.       null !== newVal &&
  398.         ("function" != typeof verification ||
  399.           ((newVal = verification(newVal, oldVal, base)), null !== newVal)) &&
  400.         newVal !== oldVal &&
  401.         ("string" != typeof newVal && (newVal = JSON.stringify(newVal)),
  402.         setVal ? setVal(key, newVal) : localStorage.setItem(key, newVal),
  403.         !0)
  404.     );
  405.   }
  406.   function getValue({
  407.     base,
  408.     key,
  409.     valType = "string",
  410.     isReSet = !0,
  411.     getValue = null,
  412.     setValue = null,
  413.     getVal = null,
  414.     setVal = null,
  415.   } = {}) {
  416.     getValue && (getVal = getValue), setValue && (setVal = setValue);
  417.     let val = getVal ? getVal(key) : localStorage.getItem(key);
  418.     return (
  419.       void 0 !== base &&
  420.         null == val &&
  421.         ((val = base),
  422.         isReSet &&
  423.           ("string" != typeof base && (base = JSON.stringify(base)),
  424.           setVal ? setVal(key, base) : localStorage.setItem(key, base))),
  425.       (valType = valType.toLowerCase()),
  426.       "string" == typeof val
  427.         ? "string" === valType
  428.           ? val
  429.           : "boolean" === valType || "number" === valType
  430.           ? JSON.parse(val)
  431.           : "object" === valType
  432.           ? val
  433.             ? JSON.parse(val)
  434.             : {}
  435.           : "array" === valType
  436.           ? val
  437.             ? JSON.parse(val)
  438.             : []
  439.           : val
  440.         : val
  441.     );
  442.   }
  443.   function getData(settings, getVal = null, setVal = null) {
  444.     (getVal = getVal || localStorage.getItem),
  445.       (setVal = setVal || localStorage.setItem);
  446.     for (const valName in settings) {
  447.       const setting = settings[valName];
  448.       setting.value = getValue({
  449.         base: setting.base,
  450.         key: setting.key,
  451.         valType: setting.valType,
  452.         getVal,
  453.         setVal,
  454.       });
  455.     }
  456.     return settings;
  457.   }
  458.   function setDarkMode(isDark = !0, modeTxt = "") {
  459.     if (
  460.       (((isDark) => {
  461.         let dom = info.cssDom,
  462.           isAdd = !1;
  463.         if (!dom) {
  464.           const id = info.keyBase + "css";
  465.           (dom = document.head.querySelector("#" + id)),
  466.             dom ||
  467.               ((dom = document.createElement("style")),
  468.               (dom.id = id),
  469.               (info.cssDom = dom),
  470.               (isAdd = !0));
  471.         }
  472.         dom.isDark !== isDark &&
  473.           ((dom.innerHTML = getCssHtml(isDark)),
  474.           (info.isDarkMode = isDark),
  475.           (dom.isDark = isDark),
  476.           isAdd && document.head.appendChild(dom));
  477.       })(isDark),
  478.       document.body)
  479.     )
  480.       document.body.appendChild(info.cssDom);
  481.     else {
  482.       const bodyObserver = new MutationObserver(() => {
  483.         document.body &&
  484.           (bodyObserver.disconnect(), document.body.appendChild(info.cssDom));
  485.       });
  486.       bodyObserver.observe(document, { childList: !0, subtree: !0 });
  487.     }
  488.     let logText, txt1;
  489.     txt1 = isDark ? "开启" : "关闭";
  490.     const settings = info.settings;
  491.     modeTxt ||
  492.       (settings.onlyColor.value &&
  493.         (modeTxt = `'${settings.onlyColor.valueText.true}'模式`),
  494.       verifyWebsite(settings.onlyColorWebsite.value) &&
  495.         (modeTxt = `'${settings.onlyColor.valueText.true}'模式`)),
  496.       (logText = `${txt1}${(modeTxt = modeTxt || "深色模式")}`),
  497.       console.log(logText),
  498.       setValue_setValue({
  499.         value: isDark,
  500.         base: info.otherSettings.oldDarkMode.base,
  501.         key: info.otherSettings.oldDarkMode.key,
  502.         getValue: GM_getValue,
  503.         setValue: GM_setValue,
  504.       }),
  505.       setValue_setValue({
  506.         value: isDark,
  507.         base: info.otherSettings.oldDarkMode.base,
  508.         key: info.otherSettings.oldDarkMode.key,
  509.       });
  510.   }
  511.   function setStartStopTimer() {
  512.     const settings = info.settings;
  513.     if (!settings.isAutoStartStop.value) return;
  514.     const startTime = settings.startTime.value,
  515.       stopTime = settings.stopTime.value;
  516.     if (0 == +startTime && 0 == +stopTime) return;
  517.     const autoStartStop = () => {
  518.       const f = (function isNeedDarkMode() {
  519.         const settings = info.settings,
  520.           startTime = settings.startTime.value,
  521.           stopTime = settings.stopTime.value;
  522.         if (0 == +startTime && 0 == +stopTime) return -1;
  523.         const t = new Date(),
  524.           curT = 60 * t.getHours() + t.getMinutes();
  525.         let startT, stopT;
  526.         if (0 != +startTime) {
  527.           const tArr1 = startTime.trim().replace(":", ":").split(":");
  528.           startT = 60 * +tArr1[0] + +tArr1[1];
  529.         }
  530.         if (0 != +stopTime) {
  531.           const tArr2 = stopTime.trim().replace(":", ":").split(":");
  532.           stopT = 60 * +tArr2[0] + +tArr2[1];
  533.         }
  534.         if (settings.startStopWay.value)
  535.           return curT === startT || (curT !== stopT && -1);
  536.         if (0 == +startTime) return !(curT >= stopT) && -1;
  537.         if (0 == +stopTime) return curT >= startT || -1;
  538.         const f = (function isTimeInRange(t, startTime, stopTime, rangeLimit) {
  539.           const curH = t.getHours(),
  540.             curMin = t.getMinutes(),
  541.             startText = startTime.trim().replace(":", ":"),
  542.             stopText = stopTime.trim().replace(":", ":"),
  543.             tArr1 = startText.split(":"),
  544.             tArr2 = stopText.split(":"),
  545.             h1 = +tArr1[0],
  546.             h2 = +tArr2[0],
  547.             startT = 60 * h1 + +tArr1[1],
  548.             stopT = 60 * h2 + +tArr2[1],
  549.             curT = 60 * curH + curMin;
  550.           if (startT < stopT)
  551.             if (rangeLimit[0]) {
  552.               if (rangeLimit[1]) {
  553.                 if (curT >= startT && curT <= stopT) return !0;
  554.               } else if (curT >= startT && curT < stopT) return !0;
  555.             } else if (rangeLimit[1]) {
  556.               if (curT > startT && curT <= stopT) return !0;
  557.             } else if (curT > startT && curT < stopT) return !0;
  558.           if (startT > stopT)
  559.             if (rangeLimit[0]) {
  560.               if (rangeLimit[1]) {
  561.                 if (
  562.                   (curT >= startT && curT < 1440) ||
  563.                   (curT <= stopT && curT >= 0)
  564.                 )
  565.                   return !0;
  566.               } else if (
  567.                 (curT >= startT && curT < 1440) ||
  568.                 (curT < stopT && curT >= 0)
  569.               )
  570.                 return !0;
  571.             } else if (rangeLimit[1]) {
  572.               if (
  573.                 (curT > startT && curT < 1440) ||
  574.                 (curT <= stopT && curT >= 0)
  575.               )
  576.                 return !0;
  577.             } else if (
  578.               (curT > startT && curT < 1440) ||
  579.               (curT < stopT && curT >= 0)
  580.             )
  581.               return !0;
  582.           return !1;
  583.         })(t, startTime, stopTime, [1, 0]);
  584.         return f;
  585.       })();
  586.       -1 !== f &&
  587.         (settings.isShowTips.value &&
  588.           GM_notification({
  589.             title: "深色模式",
  590.             text: `定时${f ? "开启" : "关闭"}深色模式`,
  591.             timeout: 3e3,
  592.           }),
  593.         setDarkMode(f));
  594.     };
  595.     autoStartStop(),
  596.       info.timer && clearInterval(info.timer),
  597.       (info.timer = setInterval(autoStartStop, info.interval));
  598.   }
  599.   function verifyWebsite(websiteText, url) {
  600.     if (!websiteText) return !1;
  601.     url = url || location.href;
  602.     return websiteText
  603.       .trim()
  604.       .split("\n")
  605.       .some((item) => matchUrlWithWildcard(url, item));
  606.   }
  607.   function updateShow() {
  608.     getData(info.settings, GM_getValue, GM_setValue),
  609.       info.cssDom
  610.         ? (info.cssDom.innerHTML = getCssHtml(info.isDarkMode))
  611.         : info.isDarkMode
  612.         ? (setDarkMode(!1), setDarkMode(!0))
  613.         : setDarkMode(!1),
  614.       createDarkModeBtn(),
  615.       setStartStopTimer();
  616.   }
  617.   function createDarkModeBtn() {
  618.     const settings = info.settings;
  619.     if (info.modeBtn) {
  620.       const btn = info.modeBtn;
  621.       return (
  622.         (btn.style.width = settings.btnSize.value + "px"),
  623.         (btn.style.height = settings.btnSize.value + "px"),
  624.         void (info.isDarkMode
  625.           ? btn.classList.add("dark")
  626.           : btn.classList.remove("dark"))
  627.       );
  628.     }
  629.     const html = `<div id="${info.keyBase}btn" style="width:${
  630.       settings.btnSize.value
  631.     }px;height:${settings.btnSize.value}px" title="${
  632.       info.btnHoverTxt
  633.     }" class="${
  634.       info.isDarkMode ? "dark" : ""
  635.     }">\n  <svg t="1723482089223" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6752"><path d="M505.565962 845.481164c-14.545274 0-26.317389 11.770068-26.317389 26.316366l0 61.937654c0 14.546298 11.771091 26.316366 26.317389 26.316366 14.520715 0 26.317389-11.770068 26.317389-26.316366l0-61.937654C531.883351 857.251232 520.086677 845.481164 505.565962 845.481164z" p-id="6753"></path><path d="M735.426117 803.899116c-7.248078-12.595876-23.362081-16.936741-35.929304-9.611915-12.591783 7.247054-16.909112 23.334451-9.611915 35.925211l30.969339 53.635571c4.856611 8.458649 13.697977 13.160741 22.795169 13.160741 4.471848 0 8.994861-1.1328 13.157671-3.523243 12.593829-7.270591 16.884552-23.38664 9.612938-35.953863L735.426117 803.899116z" p-id="6754"></path><path d="M931.462932 674.318876l-53.66013-30.994921c-12.567223-7.29515-28.680203-2.979868-35.927257 9.613962-7.272637 12.593829-2.981914 28.682249 9.611915 35.953863l53.661154 30.969339c4.111644 2.416026 8.634658 3.545756 13.107529 3.545756 9.097192 0 17.937534-4.726651 22.820752-13.156648C948.348508 697.653327 944.057785 681.56593 931.462932 674.318876z" p-id="6755"></path><path d="M306.006927 794.288225c-12.567223-7.353478-28.705785-2.983961-35.953863 9.611915l-30.968315 53.633524c-7.272637 12.567223-2.955308 28.682249 9.636474 35.953863 4.112668 2.390443 8.635681 3.523243 13.107529 3.523243 9.098215 0 17.939581-4.703115 22.821775-13.160741l30.993898-53.635571C322.89148 817.621653 318.59871 801.535279 306.006927 794.288225z" p-id="6756"></path><path d="M127.675356 643.323954l-53.609988 30.994921C61.472562 681.56593 57.155233 697.653327 64.42787 710.249203c4.857635 8.429996 13.696953 13.156648 22.795169 13.156648 4.471848 0 8.995885-1.12973 13.158694-3.545756l53.609988-30.969339c12.591783-7.270591 16.909112-23.360034 9.636474-35.953863C156.355559 640.344087 140.268162 636.028804 127.675356 643.323954z" p-id="6757"></path><path d="M932.954913 63.947428 90.024851 63.947428c-14.520715 0-26.315342 11.796674-26.315342 26.317389 0 14.546298 11.794627 26.316366 26.315342 26.316366L425.177074 116.581182l0.051165 107.373473c-96.322789 35.773761-162.089655 128.910998-162.089655 232.943376 0 136.955208 111.409392 248.364601 248.337995 248.364601 136.955208 0 248.363577-111.408369 248.363577-248.364601 0-49.085952-14.314007-96.578616-41.377386-137.288806-8.017604-12.07706-24.364921-15.366989-36.494169-7.349385-12.103666 8.070816-15.393595 24.388457-7.350408 36.494169 21.330818 32.04688 32.587186 69.440535 32.587186 108.144022 0 107.939361-87.789439 195.729823-195.7288 195.729823-107.913778 0-195.704241-87.790462-195.704241-195.729823 0-87.123266 58.492182-164.5548 142.247748-188.328249 10.743692-3.03308 18.401092-12.516058 19.069311-23.64349l0.61603-128.34511 455.248462 0c14.546298 0 26.316366-11.770068 26.316366-26.316366C959.271278 75.744101 947.50121 63.947428 932.954913 63.947428z" p-id="6758"></path></svg>\n</div>`;
  636.     document.body.insertAdjacentHTML("beforeend", html);
  637.     const btn = document.body.querySelector(`#${info.keyBase}btn`);
  638.     (info.modeBtn = btn),
  639.       btn.addEventListener("click", () => {
  640.         btn.classList.toggle("dark");
  641.         setDarkMode(btn.classList.contains("dark"));
  642.       });
  643.   }
  644.   const baseCfg = {
  645.       state: "",
  646.       isEditing: !1,
  647.       hasSelectedPage: !1,
  648.       param: {
  649.         id: "ll_edit_wrap",
  650.         box: document.body,
  651.         classBase: "ll_edit_",
  652.         w: "500px",
  653.         h: "",
  654.         contentH: "450px",
  655.         bg: "rgba(0, 0, 0, 0.15)",
  656.         color: "#333",
  657.         fontSize: "15px",
  658.         fontFamily:
  659.           "PingFang SC, HarmonyOS_Regular, Helvetica Neue, Microsoft YaHei, sans-serif",
  660.         zIndex: 11e3,
  661.         resetTt: "重置所有设置为默认值",
  662.         isShowMenu: !1,
  663.         isScrollStyle: !0,
  664.         isResetBtn: !0,
  665.         isOnlyResetCurPage: !1,
  666.         showPage: void 0,
  667.         isIntervalRun: !1,
  668.         interval: 1e3,
  669.         page: [],
  670.         callback: {
  671.           resetBefore: null,
  672.           reset: null,
  673.           confirmBefore: null,
  674.           finished: null,
  675.           interval: null,
  676.           cancelBefore: null,
  677.           cancelled: null,
  678.         },
  679.       },
  680.     },
  681.     cfg = {
  682.       version: "v1.2.2",
  683.       isEditing: baseCfg.isEditing,
  684.       hasSelectedPage: baseCfg.hasSelectedPage,
  685.       timer: null,
  686.       interval: 1e3,
  687.       param: {},
  688.       tempParam: {},
  689.       allData: {},
  690.       oldData: {},
  691.       lastData: {},
  692.       baseData: {},
  693.       controls: {},
  694.       doms: { page: [] },
  695.       editText: {},
  696.     };
  697.   const css = function getCss() {
  698.     const param = cfg.param,
  699.       cBase = (param.page, param.classBase),
  700.       baseStart = `#${param.id} .${cBase}`,
  701.       fSize = param.fontSize ? param.fontSize : "14px",
  702.       css = `#${
  703.         param.id
  704.       } {\n  position: fixed;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  z-index: ${
  705.         param.zIndex || 11e3
  706.       };\n  background: ${
  707.         param.bg || "rgba(0, 0, 0, 0.12)"
  708.       };\n  display: none;\n}\n${baseStart}box {\n  text-align: initial;\n  letter-spacing: 1px;\n  position: relative;\n  width: ${
  709.         param.w || "450px"
  710.       };\n  ${
  711.         param.h ? "max-height:" + param.h : ""
  712.       };\n  margin: auto;\n  color: ${
  713.         param.color || "#333"
  714.       };\n  background: #fff;\n  font-size: ${fSize};\n  line-height: normal;\n  font-family: ${
  715.         param.fontFamily ||
  716.         "PingFang SC, HarmonyOS_Regular, Helvetica Neue, Microsoft YaHei, sans-serif"
  717.       };\n  border: 3px solid #dfedfe;\n  border-radius: 10px;\n  box-sizing: border-box;\n  padding: 14px 8px 10px 15px;\n  overflow: hidden;\n  overflow-y: auto;\n}\n${baseStart}menu {\n  font-weight: bold;\n  font-size: ${
  718.         parseInt(fSize) + 1
  719.       }px;\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0 8px;\n}\n${baseStart}menu-item {\n  margin-bottom: 8px;\n  border: 1px solid #dfedfe;\n  color: #9ecaff;\n  background: #eef6ff;\n  border-radius: 6px;\n  padding: 6px 10px;\n  cursor: pointer;\n}\n${baseStart}menu-item:hover {\n  color: #65aaff;\n  background: #dfedfe;\n  border: 1px solid #dfedfe;\n}\n${baseStart}menu-item.active {\n  color: #65aaff;\n  background: #dfedfe;\n  border: 1px solid #dfedfe;\n}\n${baseStart}page-box {\n  max-height: ${
  720.         param.contentH || ""
  721.       };\n  padding-right: 7px;\n  margin-bottom: 8px;\n  overflow: hidden;\n  overflow-y: auto;\n}\n${baseStart}page {\n  display: none;\n}\n${baseStart}page.curPage {\n  display: block;\n}\n${baseStart}comp {\n  margin-bottom: 8px;\n}\n${baseStart}comp:last-child {\n  margin-bottom: 2px;\n}\n${baseStart}tt {\n  font-weight: bold;\n  font-size: ${
  722.         parseInt(fSize) + 6
  723.       }px;\n  margin-top: 4px;\n}\n${baseStart}tt2 {\n  font-weight: bold;\n  font-size: ${
  724.         parseInt(fSize) + 4
  725.       }px;\n  margin-top: 3px;\n  margin-bottom: 7px;\n}\n${baseStart}tt3 {\n  font-weight: bold;\n  font-size: ${
  726.         parseInt(fSize) + 2
  727.       }px;\n  margin-top: 2px;\n  margin-bottom: 6px;\n}\n${baseStart}desc {\n  line-height: 1.5;\n}\n${baseStart}comp-tt {\n  font-weight: bold;\n  font-size: ${
  728.         parseInt(fSize) + 1
  729.       }px;\n  line-height: 1.5;\n}\n${baseStart}comp-desc {\n  line-height: 1.5;\n}\n${baseStart}rd-arr {\n  line-height: 22px;\n}\n${baseStart}rd-arr label {\n  margin-right: 6px;\n  cursor: pointer;\n}\n${baseStart}rd-arr input {\n  vertical-align: -2px;\n  cursor: pointer;\n}\n${baseStart}rd-arr span {\n  color: #666;\n  margin-left: 2px;\n}\n#${
  730.         param.id
  731.       } textarea {\n  width: 100%;\n  max-width: 100%;\n  max-height: 300px;\n  border-radius: 6px;\n  line-height: normal;\n  padding: 5px 7px;\n  outline-color: #cee4ff;\n  border: 1px solid #aaa;\n  box-sizing: border-box;\n  font-size: ${
  732.         parseInt(fSize) - 2
  733.       }px;\n  font-family: PingFang SC, HarmonyOS_Regular, Helvetica Neue, Microsoft YaHei, sans-serif;\n  /* 保留空格 */\n  white-space: pre-wrap;\n  /* 允许词内换行 */\n  word-break: break-all;\n  letter-spacing: 1px;\n  overflow: hidden;\n  overflow-y: auto;\n}\n#${
  734.         param.id
  735.       } textarea::placeholder {\n  color: #bbb;\n}\n${baseStart}ta-desc {\n  margin-bottom: 3px;\n}\n${baseStart}btn-box {\n  display: flex;\n  justify-content: flex-end;\n}\n${baseStart}btn-box button {\n  font-size: 16px;\n  line-height: normal;\n  color: #65aaff;\n  background: #dfedfe;\n  outline: none;\n  border: none;\n  border-radius: 6px;\n  padding: 8px 16px;\n  box-sizing: border-box;\n  cursor: pointer;\n}\n${baseStart}btn-box .${cBase}reset-btn {\n  position: absolute;\n  left: 15px;\n  bottom: 10px;\n  color: #888;\n  background: #f4f4f4;\n  margin-right: 15px;\n}\n${baseStart}btn-box .${cBase}reset-btn:hover {\n  color: #666;\n  background: #eee;\n}\n${baseStart}btn-box .${cBase}cancel-btn {\n  color: #888;\n  background: #f4f4f4;\n  margin-right: 15px;\n}\n${baseStart}btn-box .${cBase}cancel-btn:hover {\n  color: #666;\n  background: #eee;\n}\n${baseStart}btn-box .${cBase}confirm-btn {\n  margin-right: 7px;\n}\n${baseStart}btn-box .${cBase}confirm-btn:hover {\n  background: #cee4ff;\n}\n`;
  736.     return param.isScrollStyle
  737.       ? css +
  738.           "\n.ll-scroll-style-1::-webkit-scrollbar,\n.ll-scroll-style-1 ::-webkit-scrollbar {\n  width: 8px;\n}\n.ll-scroll-style-1-size-2::-webkit-scrollbar,\n.ll-scroll-style-1 .ll-scroll-style-1-size-2::-webkit-scrollbar {\n  width: 10px;\n}\n.ll-scroll-style-1-size-3::-webkit-scrollbar,\n.ll-scroll-style-1 .ll-scroll-style-1-size-3::-webkit-scrollbar {\n  width: 12px;\n}\n.ll-scroll-style-1::-webkit-scrollbar-thumb,\n.ll-scroll-style-1 ::-webkit-scrollbar-thumb {\n  border-radius: 10px;\n  -webkit-box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.05);\n  opacity: 0.2;\n  background: #daedff;\n}\n.ll-scroll-style-1::-webkit-scrollbar-track,\n.ll-scroll-style-1 ::-webkit-scrollbar-track {\n  -webkit-box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.08);\n  border-radius: 0;\n  background: #fff;\n  border-radius: 5px;\n}"
  739.       : css;
  740.   };
  741.   const editArea_html = function getHTML() {
  742.       function getCompHTML({ info, active = "", id }) {
  743.         let type = info.type;
  744.         if (
  745.           ((type = {
  746.             menuTitle: "mtt",
  747.             title: "tt",
  748.             title2: "tt2",
  749.             title3: "tt3",
  750.             desc: "ds",
  751.             radio: "rd",
  752.             checkbox: "cb",
  753.             textarea: "ta",
  754.             mtt: "mtt",
  755.             tt: "tt",
  756.             tt2: "tt2",
  757.             tt3: "tt3",
  758.             ds: "ds",
  759.             rd: "rd",
  760.             cb: "cb",
  761.             ta: "ta",
  762.           }[type]),
  763.           (id = 0 === id ? "0" : id || ""),
  764.           0 === info.value && (info.value = "0"),
  765.           !type)
  766.         )
  767.           return console.log("不存在的组件类型"), !1;
  768.         let title = "",
  769.           desc = "",
  770.           ctrlTt = "";
  771.         switch (
  772.           (["tt", "tt2", "tt3", "ds", "mtt"].includes(type) ||
  773.             ((title = info.title
  774.               ? `<div class="${cBase}comp-tt ${cBase}${type}-tt" title="${
  775.                   info.tt || ""
  776.                 }">${info.title}</div>`
  777.               : ""),
  778.             (desc = info.desc
  779.               ? `<div class="${cBase}comp-desc ${cBase}${type}-desc">${info.desc}</div>`
  780.               : "")),
  781.           type)
  782.         ) {
  783.           case "mtt":
  784.             return (
  785.               (info.value = info.value || ""),
  786.               info.value
  787.                 ? `<div class="${cBase}menu-item ${active || ""}" title="${
  788.                     info.tt || ""
  789.                   }">${info.value}</div>`
  790.                 : ""
  791.             );
  792.           case "tt":
  793.           case "tt2":
  794.           case "tt3":
  795.             return (
  796.               (info.value = info.value || ""),
  797.               info.value
  798.                 ? `<div class="${cBase}${type} ${cBase}comp" title="${
  799.                     info.tt || ""
  800.                   }">${info.value}</div>`
  801.                 : ""
  802.             );
  803.           case "ds":
  804.             return (
  805.               (info.value = info.value || ""),
  806.               info.value
  807.                 ? `<div class="${cBase}desc ${cBase}comp" title="${
  808.                     info.descTt || ""
  809.                   }">${info.value}</div>`
  810.                 : ""
  811.             );
  812.           case "rd":
  813.             const name = info.name || info.id + new Date().getTime();
  814.             (ctrlTt = info.ctrlTt || ""),
  815.               ctrlTt && (ctrlTt = `title="${ctrlTt}"`);
  816.             let radio = `<div class="${cBase}rd ${cBase}rd-arr" ${ctrlTt}>`;
  817.             if (void 0 === info.value && info.radioList[0]) {
  818.               const obj = info.radioList[0];
  819.               info.value = void 0 === obj.value ? obj.text : obj.value;
  820.             }
  821.             return (
  822.               info.radioList.forEach((item, i) => {
  823.                 void 0 === item.value && (info.radioList[i].value = item.text),
  824.                   void 0 === item.text && (info.radioList[i].text = item.value);
  825.                 const value = item.value;
  826.                 let tt = item.tt || "";
  827.                 tt && (tt = `title="${tt}"`);
  828.                 let selected = "";
  829.                 info.value + "" == item.value + "" && (selected = "checked"),
  830.                   (radio += `<label ${tt}><input ${selected} type="radio" name="${name}" data-val="${value}" data-cpid="${id}"><span>${item.text}</span></label>`);
  831.               }),
  832.               (radio += "</div>"),
  833.               `<div class="${cBase}comp ${cBase}ctrl ${cBase}rd-box" data-type="${type}" data-cpid="${id}">${title}${desc}${radio}</div>`
  834.             );
  835.           case "cb":
  836.             const name2 = info.name || new Date().getTime();
  837.             if (
  838.               ((ctrlTt = info.ctrlTt || ""),
  839.               ctrlTt && (ctrlTt = `title="${ctrlTt}"`),
  840.               void 0 === info.value && info.radioList[0])
  841.             ) {
  842.               const obj = info.radioList[0];
  843.               info.value = void 0 === obj.value ? obj.text : obj.value;
  844.             }
  845.             let checkbox = `<div class="${cBase}cb ${cBase}rd-arr" ${ctrlTt}>`;
  846.             return (
  847.               info.radioList.forEach((item, i) => {
  848.                 void 0 === item.value && (info.radioList[i].value = item.text),
  849.                   void 0 === item.text && (info.radioList[i].text = item.value);
  850.                 const value = item.value;
  851.                 let tt = item.tt || "";
  852.                 tt && (tt = `title="${tt}"`);
  853.                 let selected = "";
  854.                 info.value.includes(value) && (selected = "checked"),
  855.                   (checkbox += `<label ${tt}><input ${selected} type="checkbox" name="${name2}" data-val="${value}" data-cpid="${id}"><span>${item.text}</span></label>`);
  856.               }),
  857.               (checkbox += "</div>"),
  858.               `<div class="${cBase}comp ${cBase}ctrl ${cBase}cb-box" data-type="${type}" data-cpid="${id}">${title}${desc}${checkbox}</div>`
  859.             );
  860.           case "ta":
  861.             const taH = `height:${info.height || "30px"};`,
  862.               style = `style="${
  863.                 info.width ? "width:" + info.width + ";" : ""
  864.               }${taH}${
  865.                 info.fontSize ? "font-size:" + info.fontSize + ";" : ""
  866.               }${
  867.                 info.fontFamily ? "font-family:" + info.fontFamily + ";" : ""
  868.               }"`,
  869.               textarea = `<textarea class="${cBase}ta" ${style} data-cpid="${id}" placeholder="${
  870.                 info.ph || ""
  871.               }" title="${info.ctrlTt || "拖动右下角可调节宽高"}"></textarea>`;
  872.             return `<div class="${cBase}comp ${cBase}ctrl ${cBase}ta-box" data-type="${type}"  data-cpid="${id}">${title}${desc}${textarea}</div>`;
  873.         }
  874.       }
  875.       const param = cfg.param,
  876.         page = param.page,
  877.         cBase = param.classBase,
  878.         isMenu = 1 !== page.length;
  879.       let menu = `<div class="${cBase}menu">`,
  880.         pageHTML = `<div class="${cBase}page-box ll-scroll-style-1 ll-scroll-style-1-size-2">`;
  881.       page.forEach((curPage, index) => {
  882.         let pgid = curPage.id || index;
  883.         (pgid += ""), (cfg.allData[pgid] = {}), (cfg.baseData[pgid] = {});
  884.         let pageFlag = "";
  885.         if (
  886.           (cfg.hasSelectedPage ||
  887.             ((void 0 === param.showPage || pgid === param.showPage + "") &&
  888.               ((pageFlag = "curPage"), (cfg.hasSelectedPage = !0))),
  889.           (pageHTML += `<div class="${cBase}page ${pageFlag}" data-pgid="${pgid}">`),
  890.           curPage.components)
  891.         ) {
  892.           let compIndex = 0;
  893.           if (isMenu || param.isShowMenu) {
  894.             let curMenu = curPage.components.find(
  895.               (item) => "menuTitle" === item.type
  896.             );
  897.             curMenu || (curMenu = { type: "menuTitle", value: pgid }),
  898.               (menu += getCompHTML({
  899.                 info: curMenu,
  900.                 active: pageFlag ? "active" : "",
  901.               }));
  902.           }
  903.           curPage.components.forEach((item) => {
  904.             const cpid = item.id || compIndex;
  905.             "menuTitle" !== item.type &&
  906.               (pageHTML += getCompHTML({ info: item, id: cpid })),
  907.               ["title", "title2", "title3", "desc", "menuTitle"].includes(
  908.                 item.type
  909.               ) ||
  910.                 ((item.base = void 0 === item.base ? item.value : item.base),
  911.                 (cfg.allData[pgid][cpid] = item.value),
  912.                 (cfg.baseData[pgid][cpid] = item.base),
  913.                 compIndex++);
  914.           });
  915.         }
  916.         pageHTML += "</div>";
  917.       }),
  918.         (pageHTML += "</div>"),
  919.         isMenu || param.isShowMenu ? (menu += "</div>") : (menu = "");
  920.       const resetBtn = param.isResetBtn
  921.           ? `<button class="${cBase}reset-btn" title="${
  922.               param.resetTt || "重置所有设置为默认值"
  923.             }">重置</button>`
  924.           : "",
  925.         btnBox = `<div class="${cBase}btn-box">\n${resetBtn}\n<button class="${cBase}cancel-btn">取 消</button>\n<button class="${cBase}confirm-btn">确 认</button>\n</div>`;
  926.       return `<div class="${cBase}box ll-scroll-style-1 ll-scroll-style-1-size-3" data-version="${cfg.version}">\n${menu}\n${pageHTML}\n${btnBox}\n</div>`;
  927.     },
  928.     baseParam = baseCfg.param,
  929.     controls = cfg.controls,
  930.     doms = cfg.doms;
  931.   function createEditEle({
  932.     id = baseParam.id,
  933.     box = baseParam.box,
  934.     classBase = baseParam.classBase,
  935.     w = baseParam.w,
  936.     h = baseParam.h,
  937.     contentH = baseParam.contentH,
  938.     bg = baseParam.bg,
  939.     color = baseParam.color,
  940.     fontSize = baseParam.fontSize,
  941.     fontFamily = baseParam.fontFamily,
  942.     zIndex = baseParam.zIndex,
  943.     resetTt = baseParam.resetTt,
  944.     isShowMenu = baseParam.isShowMenu,
  945.     isScrollStyle = baseParam.isScrollStyle,
  946.     isResetBtn = baseParam.isResetBtn,
  947.     isOnlyResetCurPage = baseParam.isOnlyResetCurPage,
  948.     showPage = baseParam.showPage,
  949.     isIntervalRun = baseParam.isIntervalRun,
  950.     interval = baseParam.interval,
  951.     page = [],
  952.     callback = baseParam.callback,
  953.   } = {}) {
  954.     (cfg.state = baseCfg.state),
  955.       (cfg.isEditing = baseCfg.isEditing),
  956.       (cfg.hasSelectedPage = baseCfg.hasSelectedPage),
  957.       (cfg.param = { ...baseParam });
  958.     const param = cfg.param;
  959.     (box = box || document.body),
  960.       (param.id = id),
  961.       (param.box = box),
  962.       (param.classBase = classBase),
  963.       (param.w = w),
  964.       (param.h = h),
  965.       (param.contentH = contentH),
  966.       (param.bg = bg),
  967.       (param.color = color),
  968.       (param.fontSize = fontSize),
  969.       (param.fontFamily = fontFamily),
  970.       (param.zIndex = zIndex),
  971.       (param.resetTt = resetTt),
  972.       (param.isShowMenu = isShowMenu),
  973.       (param.isScrollStyle = isScrollStyle),
  974.       (param.isResetBtn = isResetBtn),
  975.       (param.isOnlyResetCurPage = isOnlyResetCurPage),
  976.       (param.showPage = showPage),
  977.       (param.isIntervalRun = isIntervalRun),
  978.       (param.interval = interval),
  979.       (param.page = page),
  980.       (param.callback = callback),
  981.       (cfg.interval = interval),
  982.       (cfg.callback = callback);
  983.     const html = editArea_html();
  984.     return (
  985.       box.querySelector(`#${param.classBase}${param.id}-css`) ||
  986.         (function addCss(cssText, box = document.body, id = "") {
  987.           const style = document.createElement("style");
  988.           return (
  989.             id && (style.id = id),
  990.             box.appendChild(style),
  991.             (style.innerHTML = cssText),
  992.             style
  993.           );
  994.         })(css(), box, param.classBase + param.id + "-css"),
  995.       (doms.wrap = (function createEle({
  996.         className = "",
  997.         id = "",
  998.         title = "",
  999.         css,
  1000.         box = document.body,
  1001.         type = "div",
  1002.       } = {}) {
  1003.         const ele = document.createElement(type);
  1004.         return (
  1005.           id && (ele.id = id),
  1006.           className && (ele.className = className),
  1007.           title && (ele.title = title),
  1008.           css && (ele.style.cssText = css),
  1009.           box.appendChild(ele),
  1010.           ele
  1011.         );
  1012.       })({ className: id, id })),
  1013.       (doms.wrap.innerHTML = html),
  1014.       (function getDoms() {
  1015.         const param = cfg.param,
  1016.           cBase = param.classBase;
  1017.         (doms.box = doms.wrap.querySelector(`.${cBase}box`)),
  1018.           (doms.cancel = doms.box.querySelector(`.${cBase}cancel-btn`)),
  1019.           (doms.confirm = doms.box.querySelector(`.${cBase}confirm-btn`));
  1020.         const isMenu = 1 !== param.page.length;
  1021.         (isMenu || param.isShowMenu) &&
  1022.           ((doms.menu = doms.box.querySelector(`.${cBase}menu`)),
  1023.           (doms.menus = [].slice.call(
  1024.             doms.menu.querySelectorAll(`.${cBase}menu-item`)
  1025.           )));
  1026.         const pages = [].slice.call(doms.box.querySelectorAll(`.${cBase}page`));
  1027.         (doms.page = []),
  1028.           param.isResetBtn &&
  1029.             (doms.reset = doms.box.querySelector(`.${cBase}reset-btn`));
  1030.         pages.forEach((curPage, index) => {
  1031.           cfg.hasSelectedPage ||
  1032.             (curPage.classList.add("curPage"),
  1033.             (isMenu || param.isShowMenu) &&
  1034.               doms.menus[0].classList.add("active"),
  1035.             (cfg.hasSelectedPage = !0));
  1036.           const page = {},
  1037.             pgid = curPage.dataset.pgid;
  1038.           (page.pgid = curPage.pgid = pgid),
  1039.             (page.controls = [].slice.call(
  1040.               curPage.querySelectorAll(`.${cBase}ctrl`)
  1041.             )),
  1042.             (page.ele = curPage),
  1043.             doms.page.push(page),
  1044.             (isMenu || param.isShowMenu) &&
  1045.               (doms.menus[index].settingsPage = curPage);
  1046.           const ctrls = {};
  1047.           (controls[pgid] = ctrls),
  1048.             page.controls.forEach((item, i) => {
  1049.               const cpid = item.dataset.cpid,
  1050.                 cType = item.dataset.type;
  1051.               let dom;
  1052.               (item.cpid = cpid),
  1053.                 "rd" === cType || "cb" === cType
  1054.                   ? ((dom = [].slice.call(item.querySelectorAll("input"))),
  1055.                     (dom.compType = cType))
  1056.                   : "ta" === cType &&
  1057.                     ((dom = item.querySelector("textarea")),
  1058.                     (dom.compType = cType),
  1059.                     (dom.value = cfg.allData[pgid][cpid])),
  1060.                 (ctrls[cpid] = dom);
  1061.             });
  1062.         });
  1063.       })(),
  1064.       cfg.timer && clearInterval(cfg.timer),
  1065.       (function bindEvents() {
  1066.         const param = cfg.param;
  1067.         function menuHandle(e) {
  1068.           const dom = e.target,
  1069.             cBase = param.classBase;
  1070.           if (dom.classList.contains(`${cBase}menu-item`)) {
  1071.             const old = doms.menu.querySelector(".active");
  1072.             old.classList.remove("active"),
  1073.               old.settingsPage.classList.remove("curPage"),
  1074.               dom.classList.add("active"),
  1075.               dom.settingsPage.classList.add("curPage");
  1076.           }
  1077.         }
  1078.         function cancelEdit(e) {
  1079.           const cBase = param.classBase;
  1080.           if (
  1081.             (e.stopPropagation(),
  1082.             e.target.className !== `${cBase}wrap` &&
  1083.               e.target.className !== `${cBase}cancel-btn`)
  1084.           )
  1085.             return;
  1086.           const callback = cfg.callback;
  1087.           !1 !== runCallback(callback.cancelBefore) &&
  1088.             (showEditArea(!1),
  1089.             setCompValue(cfg.oldData),
  1090.             param.isIntervalRun &&
  1091.               (setCompValue(cfg.oldData), (cfg.allData = cfg.oldData)),
  1092.             runCallback(callback.cancelled));
  1093.         }
  1094.         function confirmEdit() {
  1095.           const callback = cfg.callback,
  1096.             data = getAllData();
  1097.           (cfg.allData = data),
  1098.             !1 !== runCallback(callback.confirmBefore, data) &&
  1099.               (showEditArea(!1),
  1100.               (cfg.state = "finished"),
  1101.               runCallback(callback.finished, data),
  1102.               (cfg.state = ""));
  1103.         }
  1104.         function resetEdit() {
  1105.           const callback = cfg.callback,
  1106.             data = getAllData();
  1107.           !1 !== runCallback(callback.resetBefore, data) &&
  1108.             (!(function resetEditData(isOnlyPage = !1) {
  1109.               const param = cfg.param;
  1110.               if (param.isResetBtn)
  1111.                 if (isOnlyPage) {
  1112.                   const data = getAllData(),
  1113.                     curMenu = doms.menu.querySelector(".active");
  1114.                   (data[curMenu.innerText] = cfg.baseData[curMenu.innerText]),
  1115.                     setCompValue(data);
  1116.                 } else setCompValue(cfg.baseData);
  1117.             })(param.isOnlyResetCurPage),
  1118.             runCallback(callback.reset, data));
  1119.         }
  1120.         doms.menu && doms.menu.addEventListener("click", menuHandle),
  1121.           doms.wrap.addEventListener("click", cancelEdit),
  1122.           doms.cancel.addEventListener("click", cancelEdit),
  1123.           doms.confirm.addEventListener("click", confirmEdit),
  1124.           doms.reset && doms.reset.addEventListener("click", resetEdit);
  1125.       })(),
  1126.       (cfg.state = "created"),
  1127.       cfg
  1128.     );
  1129.   }
  1130.   function getAllData() {
  1131.     function getCompItem(pgid, cpid) {
  1132.       if (!controls[pgid]) return;
  1133.       const ctrl = controls[pgid][cpid];
  1134.       if (ctrl) {
  1135.         if (!Array.isArray(ctrl)) return ctrl.value;
  1136.         if ("rd" === ctrl.compType) {
  1137.           const result = ctrl.find((item) => item.checked).dataset.val;
  1138.           return "false" !== result && ("true" === result || result);
  1139.         }
  1140.         if ("cb" === ctrl.compType) {
  1141.           return ctrl
  1142.             .filter((item) => item.checked)
  1143.             .map((item) => {
  1144.               const value = item.dataset.val;
  1145.               return "false" !== value && ("true" === value || value);
  1146.             });
  1147.         }
  1148.       }
  1149.     }
  1150.     const data = {};
  1151.     if (0 === arguments.length) {
  1152.       for (const key in controls) {
  1153.         const page = controls[key];
  1154.         data[key] = {};
  1155.         for (const key2 in page) data[key][key2] = getCompItem(key, key2);
  1156.       }
  1157.       return data;
  1158.     }
  1159.     if (1 === arguments.length) {
  1160.       const ctrls = arguments[0];
  1161.       for (const pgid in ctrls) {
  1162.         data[pgid] = {};
  1163.         controls[pgid].forEach((cpid) => {
  1164.           data[pgid][cpid] = getCompItem(pgid, cpid);
  1165.         });
  1166.       }
  1167.       return cfg.allData;
  1168.     }
  1169.     return getCompItem(arguments[0], arguments[1]);
  1170.   }
  1171.   function setCompValue() {
  1172.     function setCompItem(pgid, cpid, value) {
  1173.       if (!controls[pgid]) return;
  1174.       const ctrl = controls[pgid][cpid];
  1175.       if (ctrl)
  1176.         if (Array.isArray(ctrl)) {
  1177.           if ("rd" === ctrl.compType) {
  1178.             const selected = ctrl.find((item) => item.checked);
  1179.             selected && (selected.checked = !1);
  1180.             const select = ctrl.find((item) => item.dataset.val === value + "");
  1181.             select && (select.checked = !0);
  1182.           } else if ("cb" === ctrl.compType) {
  1183.             if (
  1184.               (ctrl
  1185.                 .filter((item) => item.checked)
  1186.                 .forEach((item) => {
  1187.                   item.checked = !1;
  1188.                 }),
  1189.               Array.isArray(value))
  1190.             )
  1191.               value.forEach((val) => {
  1192.                 const select = ctrl.find(
  1193.                   (item) => item.dataset.val === val + ""
  1194.                 );
  1195.                 select && (select.checked = !0);
  1196.               });
  1197.             else {
  1198.               const select = ctrl.find(
  1199.                 (item) => item.dataset.val === value + ""
  1200.               );
  1201.               select && (select.checked = !0);
  1202.             }
  1203.           }
  1204.         } else ctrl.value = value;
  1205.     }
  1206.     if (1 === arguments.length) {
  1207.       const data = arguments[0];
  1208.       for (const key in data) {
  1209.         const pageData = data[key];
  1210.         for (const key2 in pageData) {
  1211.           setCompItem(key, key2, pageData[key2]);
  1212.         }
  1213.       }
  1214.     } else {
  1215.       setCompItem(arguments[0], arguments[1], arguments[2]);
  1216.     }
  1217.   }
  1218.   function showEditArea(isShow = !0, callback = null) {
  1219.     if (
  1220.       (cfg.param.isIntervalRun &&
  1221.         (cfg.timer && clearInterval(cfg.timer),
  1222.         (cfg.timer = setInterval(() => {
  1223.           const data = getAllData(),
  1224.             oldType = cfg.state;
  1225.           (cfg.state = "interval"),
  1226.             runCallback(cfg.callback.interval, data),
  1227.             (cfg.state = oldType),
  1228.             (cfg.lastData = data);
  1229.         }, cfg.interval))),
  1230.       (cfg.state = "created"),
  1231.       isShow)
  1232.     ) {
  1233.       if (((cfg.oldData = getAllData()), "function" == typeof callback)) {
  1234.         if (!1 === callback(cfg.oldData, cfg.oldData, cfg.baseData)) return;
  1235.       }
  1236.       cfg.state = "show";
  1237.     }
  1238.     (cfg.isEditing = isShow),
  1239.       (doms.wrap.style.display = isShow ? "block" : "none"),
  1240.       isShow &&
  1241.         !doms.box.style.top &&
  1242.         (doms.box.style.top =
  1243.           window.innerHeight / 2 - doms.box.clientHeight / 2 + "px"),
  1244.       callback && (cfg.callback = callback);
  1245.   }
  1246.   function runCallback(callback, data) {
  1247.     let result;
  1248.     if (callback) {
  1249.       data || (data = getAllData());
  1250.       const func = callback;
  1251.       Array.isArray(func)
  1252.         ? func.curFn
  1253.           ? ((result = func[curFn](data, cfg.oldData, cfg.baseData)),
  1254.             (func.curFn = null))
  1255.           : func.forEach((fn) => {
  1256.               result = fn(data, cfg.oldData, cfg.baseData);
  1257.             })
  1258.         : "function" == typeof callback &&
  1259.           (result = func(data, cfg.oldData, cfg.baseData));
  1260.     }
  1261.     return result;
  1262.   }
  1263.   function toPageObj({ settings, param = {}, otherPageName = "无分类" } = {}) {
  1264.     param = { ...param };
  1265.     const pageArr = [],
  1266.       menuList = [];
  1267.     let isOtherType = !1;
  1268.     for (let key in settings) {
  1269.       const item = settings[key];
  1270.       item.type
  1271.         ? menuList.includes(item.type) || menuList.push(item.type)
  1272.         : isOtherType || (isOtherType = !0);
  1273.     }
  1274.     return (
  1275.       isOtherType && menuList.push(otherPageName),
  1276.       menuList.forEach((menuTt) => {
  1277.         const components = [],
  1278.           page = { id: menuTt, components },
  1279.           arr = [];
  1280.         for (let key in settings) {
  1281.           const item = settings[key];
  1282.           menuTt === otherPageName
  1283.             ? item.type || arr.push(item)
  1284.             : item.type === menuTt && arr.push(item);
  1285.         }
  1286.         arr.forEach((item) => {
  1287.           let desc = item.desc || item.txt || "";
  1288.           desc && (desc = desc.replaceAll("\n", "<br>").trim());
  1289.           let comp,
  1290.             base = item.base;
  1291.           if (
  1292.             (Array.isArray(base) && (base = base.join(", ")), item.groupTitle1)
  1293.           ) {
  1294.             const comp = {
  1295.               id: item.key + "-gTt1",
  1296.               type: "title",
  1297.               value: item.groupTitle1,
  1298.             };
  1299.             components.push(comp);
  1300.           }
  1301.           if (item.groupTitle2) {
  1302.             const comp = {
  1303.               id: item.key + "-gTt2",
  1304.               type: "title2",
  1305.               value: item.groupTitle2,
  1306.             };
  1307.             components.push(comp);
  1308.           }
  1309.           if (item.groupTitle3) {
  1310.             const comp = {
  1311.               id: item.key + "-gTt3",
  1312.               type: "title3",
  1313.               value: item.groupTitle3,
  1314.             };
  1315.             components.push(comp);
  1316.           }
  1317.           if (item.groupDesc) {
  1318.             const comp = {
  1319.               id: item.key + "-gDesc",
  1320.               type: "desc",
  1321.               value: item.groupDesc,
  1322.             };
  1323.             components.push(comp);
  1324.           }
  1325.           if (
  1326.             (["menuTitle", "title", "desc", "title2", "title3"].includes(
  1327.               item.compType
  1328.             )
  1329.               ? ((comp = { ...item }),
  1330.                 (comp.type = comp.compType),
  1331.                 (comp.desc = desc))
  1332.               : (comp = {
  1333.                   id: item.key,
  1334.                   type: item.compType,
  1335.                   tt: item.tt || "",
  1336.                   title: item.title || "",
  1337.                   desc,
  1338.                   descTt: item.descTt || "",
  1339.                   name: item.key,
  1340.                   value: item.value,
  1341.                   base: item.base,
  1342.                 }),
  1343.             "textarea" === comp.type)
  1344.           )
  1345.             (comp.ph = base),
  1346.               (comp.width = item.compW),
  1347.               (comp.height = item.compH),
  1348.               (comp.ctrlTt = "默认: " + base);
  1349.           else if ("radio" === comp.type || "checkbox" === comp.type) {
  1350.             let str = "默认: ";
  1351.             if ("checkbox" === comp.type) {
  1352.               let arr = item.base;
  1353.               Array.isArray(arr) || (arr = arr.split(/,|,/)),
  1354.                 arr.forEach((val, i) => {
  1355.                   0 !== i && (str += ", "), (val = val.trim());
  1356.                   let valTxt = item.valueText[val];
  1357.                   void 0 === valTxt && (valTxt = val), (str += valTxt);
  1358.                 });
  1359.             } else {
  1360.               let val = item.valueText[item.base];
  1361.               void 0 === val && (val = item.base), (str += val);
  1362.             }
  1363.             comp.ctrlTt = str;
  1364.           }
  1365.           if (item.valueText) {
  1366.             comp.radioList = [];
  1367.             for (let key in item.valueText) {
  1368.               const rd = { text: item.valueText[key], value: key };
  1369.               comp.radioList.push(rd);
  1370.             }
  1371.           }
  1372.           components.push(comp);
  1373.         }),
  1374.           pageArr.push(page);
  1375.       }),
  1376.       (param.page = pageArr),
  1377.       param
  1378.     );
  1379.   }
  1380.   function saveDatas({
  1381.     allData,
  1382.     settings,
  1383.     keyBase = "",
  1384.     verifyFn = {},
  1385.     getValue,
  1386.     setValue,
  1387.   }) {
  1388.     for (const pageName in allData) {
  1389.       const page = allData[pageName];
  1390.       for (const key in page) {
  1391.         const value = page[key],
  1392.           item = settings[key.replace(keyBase, "")];
  1393.         if (!item) return void console.log("设置的数据对应的对象获取失败");
  1394.         let verify;
  1395.         for (const name in verifyFn)
  1396.           if (settings[name].key === key) {
  1397.             verify = settings[name].verify || verifyFn[name];
  1398.             break;
  1399.           }
  1400.         setValue_setValue({
  1401.           value,
  1402.           base: item.base,
  1403.           key,
  1404.           verification: verify,
  1405.           getValue,
  1406.           setValue,
  1407.         });
  1408.       }
  1409.     }
  1410.   }
  1411.   function finishedSettings({
  1412.     allData,
  1413.     settings,
  1414.     keyBase = "",
  1415.     verifyFn = {},
  1416.     isForcedUpdate = !1,
  1417.     isRefreshPage = !1,
  1418.     callback = null,
  1419.     getValue,
  1420.     setValue,
  1421.   } = {}) {
  1422.     if (!isForcedUpdate) {
  1423.       if (
  1424.         !(function isValueChange(type = "auto") {
  1425.           const param = cfg.param,
  1426.             curData = getAllData(),
  1427.             curDataStr = JSON.stringify(curData);
  1428.           let oldDataStr;
  1429.           return (
  1430.             "auto" === type &&
  1431.               ("interval" === cfg.state &&
  1432.                 param.isIntervalRun &&
  1433.                 (type = "interval_current"),
  1434.               "finished" === cfg.state && (type = "auto")),
  1435.             (oldDataStr =
  1436.               "interval_current" === type
  1437.                 ? JSON.stringify(cfg.lastData)
  1438.                 : "base_current" === type
  1439.                 ? JSON.stringify(cfg.baseData)
  1440.                 : JSON.stringify(cfg.oldData)),
  1441.             "{}" !== oldDataStr && curDataStr !== oldDataStr
  1442.           );
  1443.         })()
  1444.       )
  1445.         return;
  1446.     }
  1447.     saveDatas({ allData, settings, keyBase, verifyFn, getValue, setValue }),
  1448.       callback && "function" == typeof callback && callback(allData),
  1449.       isRefreshPage && history.go(0);
  1450.   }
  1451.   function showSettings() {
  1452.     const settings = info.settings;
  1453.     info.settingsArea = (function createEdit({
  1454.       settings,
  1455.       param = {},
  1456.       oldEditCfg,
  1457.       updateDataFn,
  1458.       isNewEdit = !0,
  1459.       isSyncOtherPage = !0,
  1460.       otherPageName = "无分类",
  1461.     } = {}) {
  1462.       let oldSettings, curSettings;
  1463.       updateDataFn &&
  1464.         isSyncOtherPage &&
  1465.         ((oldSettings = JSON.stringify(settings)),
  1466.         (settings = updateDataFn() || settings),
  1467.         (curSettings = JSON.stringify(settings)));
  1468.       const editInfo = { settings, param, otherPageName };
  1469.       if (oldEditCfg) {
  1470.         if (isNewEdit)
  1471.           return (
  1472.             oldEditCfg.doms.wrap.remove(), createEditEle(toPageObj(editInfo))
  1473.           );
  1474.         isSyncOtherPage &&
  1475.           updateDataFn &&
  1476.           oldSettings !== curSettings &&
  1477.           (oldEditCfg.doms.wrap.remove(),
  1478.           (oldEditCfg = createEditEle(toPageObj(editInfo)))),
  1479.           isSyncOtherPage &&
  1480.             !updateDataFn &&
  1481.             (oldEditCfg.doms.wrap.remove(),
  1482.             (oldEditCfg = createEditEle(toPageObj(editInfo))));
  1483.       } else oldEditCfg = createEditEle(toPageObj(editInfo));
  1484.       return oldEditCfg;
  1485.     })({
  1486.       settings,
  1487.       param: {
  1488.         bg: "rgba(0, 0, 0, 0)",
  1489.         resetTt: "重置当前页的所有设置为默认值",
  1490.         isOnlyResetCurPage: !0,
  1491.         isIntervalRun: !0,
  1492.       },
  1493.       oldEditCfg: info.settingsArea,
  1494.       updateDataFn: () => getData(settings, GM_getValue, GM_setValue),
  1495.     });
  1496.     showEditArea(!0, {
  1497.       resetBefore: () => confirm("是否重置当前页的所有设置为默认值?"),
  1498.       confirmBefore: () => {},
  1499.       finished: (data, oldData) => {
  1500.         console.log(data),
  1501.           finishedSettings({
  1502.             allData: data,
  1503.             settings,
  1504.             keyBase: info.keyBase,
  1505.             verifyFn: settings,
  1506.             callback: updateShow,
  1507.             getValue: GM_getValue,
  1508.             setValue: GM_setValue,
  1509.           });
  1510.         const f1 = verifyWebsite(
  1511.             oldData[settings.website.type][
  1512.               settings.website.key.repeat(info.keyBase, "")
  1513.             ]
  1514.           ),
  1515.           f2 = verifyWebsite(settings.website.value);
  1516.         if (f1 && !f2)
  1517.           return (
  1518.             setDarkMode(!1),
  1519.             info.modeBtn && info.modeBtn.remove(),
  1520.             void (info.timer && clearInterval(info.timer))
  1521.           );
  1522.         !f1 && f2 && (setStartStopTimer(), createDarkModeBtn());
  1523.       },
  1524.       interval: (data, oldData) => {
  1525.         finishedSettings({
  1526.           allData: data,
  1527.           settings,
  1528.           keyBase: info.keyBase,
  1529.           verifyFn: settings,
  1530.           callback: updateShow,
  1531.           getValue: GM_getValue,
  1532.           setValue: GM_setValue,
  1533.         });
  1534.       },
  1535.       cancelled: (data, oldData) => {
  1536.         saveDatas({
  1537.           allData: oldData,
  1538.           settings,
  1539.           keyBase: info.keyBase,
  1540.           verifyFn: settings,
  1541.           getValue: GM_getValue,
  1542.           setValue: GM_setValue,
  1543.         }),
  1544.           getData(settings, GM_getValue, GM_setValue),
  1545.           updateShow();
  1546.       },
  1547.     });
  1548.   }
  1549.   const settings = info.settings;
  1550.   function page_darkMode_bindEvents() {
  1551.     const urlChangeHandle = () => {
  1552.       const id = info.keyBase + "css",
  1553.         dom = document.body.querySelector("#" + id);
  1554.       (dom && dom.isDark) || (info.isDarkMode = !1);
  1555.     };
  1556.     let _wr = function (type) {
  1557.       let orig = history[type];
  1558.       return function () {
  1559.         let rv = orig.apply(this, arguments),
  1560.           e = new Event(type);
  1561.         return (e.arguments = arguments), window.dispatchEvent(e), rv;
  1562.       };
  1563.     };
  1564.     (history.pushState = _wr("pushState")),
  1565.       (history.replaceState = _wr("replaceState")),
  1566.       window.addEventListener("popstate", urlChangeHandle),
  1567.       window.addEventListener("replaceState", urlChangeHandle),
  1568.       window.addEventListener("pushState", urlChangeHandle);
  1569.   }
  1570.   !(function main() {
  1571.     if (
  1572.       (getData(settings, GM_getValue, GM_setValue),
  1573.       (function getOtherData() {
  1574.         const settings = info.otherSettings,
  1575.           autoWay = info.settings.autoDarkModeWay.value;
  1576.         for (const valName in settings) {
  1577.           const setting = settings[valName];
  1578.           setting.value = getValue({
  1579.             base: setting.base,
  1580.             key: setting.key,
  1581.             valType: setting.valType,
  1582.             getVal: autoWay ? GM_getValue : null,
  1583.             setVal: autoWay ? GM_setValue : null,
  1584.           });
  1585.         }
  1586.       })(),
  1587.       (function registerMenu(f) {
  1588.         let urlTxt = "*" + location.host + "*";
  1589.         verifyWebsite(settings.website.value)
  1590.           ? GM_registerMenuCommand("当前网站: 已启用✔️", () => {
  1591.               const urlList = settings.website.value.trim().split("\n"),
  1592.                 i = urlList.indexOf("*");
  1593.               -1 !== i && urlList.splice(i, 1);
  1594.               let index = urlList.indexOf(urlTxt);
  1595.               -1 !== index
  1596.                 ? urlList.splice(index, 1)
  1597.                 : urlList
  1598.                     .filter((item) => matchUrlWithWildcard(location.href, item))
  1599.                     .map((item) => urlList.indexOf(item))
  1600.                     .forEach((item) => {
  1601.                       let i = urlList.indexOf(item);
  1602.                       urlList.splice(i, 1);
  1603.                     });
  1604.               const urlListTxt = urlList.join("\n");
  1605.               GM_setValue(settings.website.key, urlListTxt), history.go(0);
  1606.             })
  1607.           : GM_registerMenuCommand("当前网站: 已禁用❌", () => {
  1608.               const urlList = settings.website.value.trim().split("\n"),
  1609.                 i = urlList.indexOf("*");
  1610.               -1 !== i && urlList.splice(i, 1), urlList.push(urlTxt);
  1611.               const urlListTxt = Array.from(new Set(urlList)).join("\n");
  1612.               GM_setValue(settings.website.key, urlListTxt), history.go(0);
  1613.             }),
  1614.           GM_registerMenuCommand("设置", () => {
  1615.             showSettings();
  1616.           });
  1617.       })(),
  1618.       verifyWebsite(settings.website.value))
  1619.     )
  1620.       if (
  1621.         (settings.autoDarkMode.value
  1622.           ? info.otherSettings.oldDarkMode.value && setDarkMode(!0)
  1623.           : (setValue_setValue({
  1624.               value: !1,
  1625.               base: !1,
  1626.               key: info.keyBase + "oldDarkMode",
  1627.             }),
  1628.             setValue_setValue({
  1629.               value: !1,
  1630.               base: !1,
  1631.               key: info.keyBase + "oldDarkMode",
  1632.               getValue: GM_getValue,
  1633.               setValue: GM_setValue,
  1634.             })),
  1635.         setDarkMode(info.isDarkMode),
  1636.         document.body)
  1637.       )
  1638.         setStartStopTimer(), createDarkModeBtn(), page_darkMode_bindEvents();
  1639.       else {
  1640.         const bodyObserver = new MutationObserver(() => {
  1641.           document.body &&
  1642.             (bodyObserver.disconnect(),
  1643.             setStartStopTimer(),
  1644.             createDarkModeBtn(),
  1645.             page_darkMode_bindEvents());
  1646.         });
  1647.         bodyObserver.observe(document, { childList: !0, subtree: !0 });
  1648.       }
  1649.   })();
  1650. })();
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行