// ==UserScript==
// @name 字体渲染(自用脚本)
// @name:zh-CN 字体渲染(自用脚本)
// @name:zh-TW 字體渲染(自用腳本)
// @name:ja フォントレンダリング(カスタマイズ)
// @name:en Font Rendering (Customized)
// @version 2022.12.17.1
// @author F9y4ng
// @description 无需安装MacType,优化浏览器字体显示,让每个页面的中文字体变得有质感,默认使用微软雅黑字体,亦可自定义设置多种中文字体,附加字体描边、字体重写、字体阴影、字体平滑、对特殊样式元素的过滤和许可等效果,脚本菜单中可使用设置界面进行参数设置,亦可对某域名下所有页面进行排除渲染,兼容常用的Greasemonkey脚本和浏览器扩展。
// @description:zh-CN 无需安装MacType,优化浏览器字体显示,让每个页面的中文字体变得有质感,默认使用微软雅黑字体,亦可自定义设置多种中文字体,附加字体描边、字体重写、字体阴影、字体平滑、对特殊样式元素的过滤和许可等效果,脚本菜单中可使用设置界面进行参数设置,亦可对某域名下所有页面进行排除渲染,兼容常用的Greasemonkey脚本和浏览器扩展。
// @description:zh-TW 無需安裝MacType,優化浏覽器字體顯示,讓每個頁面的中文字體變得有質感,默認使用微軟雅黑字體,亦可自定義設置多種中文字體,附加字體描邊、字體重寫、字體陰影、字體平滑、對特殊樣式元素的過濾和許可等效果,腳本菜單中可使用設置界面進行參數設置,亦可對某域名下所有頁面進行排除渲染,兼容常用的Greasemonkey腳本和瀏覽器扩展。
// @description:ja 各ページの中国語フォントをテクスチャにしたり、デフォルトでMicrosoft Yaheiフォントを使用したり、複数の中国語フォントをカスタマイズしたり、フォントストローク、フォント書き換え、フォントシャドウ、フォントスムージング、特別なスタイル要素のフィルタリングやライセンスなどの効果を追加したり、スクリプトメニューで設定インターフェイスを使用してパラメータ設定を行ったり、ドメイン名の下にあるすべてのページを除外してレンダリングしたり、一般的なGreasemonkeyスクリプトやブラウザプラグインと互換性があります。
// @description:en Let each page of the Chinese font becomes texture, the default uses Microsoft YaHei font, and you can customize the set of Chinese fonts, additional font strokes, font rewriting, font shadows, smooth, and special Filtering and licensing of style elements, etc., you can use the setting interface to perform parameter settings in the script menu, or you can exclude all pages under a domain name, compatible with common Greasemonkey scripts and browser plugins.
// @namespace https://openuserjs.org/scripts/f9y4ng/Font_Rendering_(Customized)
// @icon https://img.icons8.com/stickers/48/font-style-formatting.png
// @homepage https://f9y4ng.github.io/GreasyFork-Scripts/
// @homepageURL https://f9y4ng.github.io/GreasyFork-Scripts/
// @supportURL https://github.com/F9y4ng/GreasyFork-Scripts/issues
// @require https://greasyfork.org/scripts/437214-frcolorpicker/code/frColorPicker.js?version=1101891
// @match *://*/*
// @grant GM_getValue
// @grant GM.getValue
// @grant GM_setValue
// @grant GM.setValue
// @grant GM_listValues
// @grant GM.listValues
// @grant GM_deleteValue
// @grant GM.deleteValue
// @grant GM_openInTab
// @grant GM.openInTab
// @grant GM_registerMenuCommand
// @grant GM.registerMenuCommand
// @grant GM_unregisterMenuCommand
// @compatible edge 兼容TamperMonkey, ViolentMonkey
// @compatible Chrome 兼容TamperMonkey, ViolentMonkey
// @compatible Firefox 兼容Greasemonkey, TamperMonkey, ViolentMonkey
// @compatible Opera 兼容TamperMonkey, ViolentMonkey
// @compatible Safari 兼容Tampermonkey • Safari
// @license GPL-3.0-only
// @create 2020-11-24
// @copyright 2020-2022, F9y4ng
// @run-at document-start
// @downloadURL none
// ==/UserScript==
/* jshint esversion: 9 */
~(function (w, trustedTypesPolicy) {
"use strict";
/* customize */
const IS_OPEN_DEBUG = false; // set "true" to debug scripts, may cause script response slower.
/* Perfectly Compatible For Greasemonkey4.0+, Tampermonkey, Violentmonkey * F9y4ng * 20210609 */
const GMinfo = GM_info;
const GMversion = GMinfo.version || "0.00";
const GMscriptHandler = GMinfo.scriptHandler;
const isGM = GMscriptHandler.toLowerCase() === "greasemonkey";
const debug = IS_OPEN_DEBUG ? console.log.bind(console) : () => {};
const error = IS_OPEN_DEBUG ? console.error.bind(console) : () => {};
const count = IS_OPEN_DEBUG ? console.count.bind(console) : () => {};
/* GM selector */
const GMsetValue = isGM ? GM.setValue : GM_setValue;
const GMgetValue = isGM ? GM.getValue : GM_getValue;
const GMdeleteValue = isGM ? GM.deleteValue : GM_deleteValue;
const GMlistValues = isGM ? GM.listValues : GM_listValues;
const GMopenInTab = isGM ? GM.openInTab : GM_openInTab;
const GMregisterMenuCommand = isGM ? GM.registerMenuCommand : GM_registerMenuCommand;
const GMunregisterMenuCommand = isGM ? () => {} : GM_unregisterMenuCommand;
/* default Const Values & Functions */
const defCon = {
oZoom: [],
values: [],
errors: [],
clickTimer: 0,
domainCount: 0,
queryString: "html,head,head *,base,meta,style,link,script,".concat(
"noscript,body,iframe,img,br,hr,canvas,applet,source,svg,svg *,picture,",
"form,input,select,textarea,object,embed,audio,video,track,figure,progress,",
"fr-colorpicker,fr-colorpicker *,fr-configure,fr-configure *,fr-dialogbox,",
"fr-dialogbox *,gb-notice,gb-notice *"
),
curVersion: GMinfo.script.version || getMetaValue("version"),
options: isGM ? false : { active: true, insert: true, setParent: true },
elCompat: document.compatMode === "CSS1Compat" ? document.documentElement : document.body,
scriptName: getMetaValue(`name:${navigator.language || "zh-CN"}`) || GMinfo.script.name || "Font Rendering",
getScreenCTM: SVGGraphicsElement.prototype.getScreenCTM,
getClientRects: Element.prototype.getClientRects,
getBoundingClientRect: Element.prototype.getBoundingClientRect,
encrypt: n => {
try {
return w.btoa(encodeURIComponent(String(n)));
} catch (e) {
error("Encrypt.error:", e.message);
}
},
decrypt: n => {
try {
return decodeURIComponent(w.atob(String(n).replace(/[^A-Za-z0-9+/=]/g, "")));
} catch (e) {
error("Decrypt.error:", e.message);
}
},
randString: (n, v) => {
const a = "0123456789";
const b = "abcdefghijklmnopqrstuvwxyz";
const c = b.toUpperCase();
let r, m;
let s = "";
let z = true;
switch (v) {
case "mix":
m = Number(n - 1) || 8;
r = b + a + c;
z = false;
break;
case "char":
m = Number(n) || 8;
r = b + c;
break;
case "digit":
m = Number(n) || 8;
r = a;
break;
default:
m = Number(n) || 8;
r = c;
break;
}
for (; m > 0; --m) {
s += r[Math.floor(Math.random() * r.length)];
}
return z ? s : c[Math.floor(Math.random() * c.length)].concat(s);
},
sqliteDB: (e, t, p) => {
let g = 0;
let d = "";
let o = "";
for (let i = 0, l = p.length; i < l; i += 1) {
d += p.charCodeAt(i).toString();
}
const s = Math.floor(d.length / 5);
const m = parseInt(d.charAt(s) + d.charAt(s * 2) + d.charAt(s * 3) + d.charAt(s * 4) + d.charAt(s * 5));
const c = Math.ceil(p.length / 2);
const u = Math.pow(2, 31) - 1;
if (t) {
if (m < 2) {
return "";
}
let l = Math.round(Math.random() * 1e9) % 1e8;
d += l;
while (d.length > 10) {
d = (parseInt(d.substring(0, 10)) + parseInt(d.substring(10, d.length))).toString();
}
d = (m * d + c) % u;
for (let i = 0, l = e.length; i < l; i += 1) {
g = parseInt(e.charCodeAt(i) ^ Math.floor((d / u) * 255));
if (g < 16) {
o += "0" + g.toString(16);
} else {
o += g.toString(16);
}
d = (m * d + c) % u;
}
l = l.toString(16);
while (l.length < 8) {
l = "0" + l;
}
o += l;
return o;
} else {
const l = parseInt(e.substring(e.length - 8, e.length), 16);
e = e.substring(0, e.length - 8);
d += l;
while (d.length > 10) {
d = (parseInt(d.substring(0, 10)) + parseInt(d.substring(10, d.length))).toString();
}
d = (m * d + c) % u;
for (let i = 0, l = e.length; i < l; i += 2) {
g = parseInt(parseInt(e.substring(i, i + 2), 16) ^ Math.floor((d / u) * 255));
o += String.fromCharCode(g);
d = (m * d + c) % u;
}
return decodeURIComponent(o);
}
},
getHostName: () => {
try {
return top.location.hostname;
} catch (e) {
return location.hostname;
}
},
isWinTop: () => {
try {
return w.self === w.top;
} catch (e) {
return !parent.frames.length;
}
},
};
/* Define random aliases */
defCon.id = {
rndId: defCon.randString(12, "char"),
dialogbox: defCon.randString(11, "char"),
container: defCon.randString(10, "char"),
field: defCon.randString(9, "char"),
fontList: defCon.randString(8, "char"),
fontFace: defCon.randString(8, "char"),
fontSmooth: defCon.randString(8, "char"),
fontStroke: defCon.randString(8, "char"),
fontShadow: defCon.randString(8, "char"),
shadowColor: defCon.randString(8, "char"),
fontCSS: defCon.randString(8, "char"),
fontEx: defCon.randString(8, "char"),
submit: defCon.randString(8, "char"),
fface: defCon.randString(6, "char"),
smooth: defCon.randString(6, "char"),
fontSize: defCon.randString(8, "char"),
fontZoom: defCon.randString(6, "char"),
zoomSize: defCon.randString(7, "char"),
strokeSize: defCon.randString(6, "mix"),
stroke: defCon.randString(7, "char"),
fstroke: defCon.randString(8, "mix"),
fixStroke: defCon.randString(6, "mix"),
shadowSize: defCon.randString(6, "mix"),
shadow: defCon.randString(7, "char"),
color: defCon.randString(7, "char"),
cssfun: defCon.randString(7, "char"),
exclude: defCon.randString(7, "char"),
mono: defCon.randString(7, "char"),
selector: defCon.randString(9, "char"),
cleaner: defCon.randString(7, "char"),
fonttooltip: defCon.randString(7, "char"),
fontName: defCon.randString(6, "char"),
cSwitch: defCon.randString(5, "mix"),
eSwitch: defCon.randString(5, "mix"),
backup: defCon.randString(6, "char"),
files: defCon.randString(5, "mix"),
tfiles: defCon.randString(5, "mix"),
db: defCon.randString(9, "char"),
ct: defCon.randString(7, "char"),
isclosetip: defCon.randString(6, "mix"),
bk: defCon.randString(7, "char"),
isbackup: defCon.randString(6, "mix"),
pv: defCon.randString(7, "char"),
ispreview: defCon.randString(6, "mix"),
fs: defCon.randString(7, "char"),
isfontsize: defCon.randString(6, "mix"),
hk: defCon.randString(7, "char"),
ishotkey: defCon.randString(6, "mix"),
mps: defCon.randString(7, "char"),
maxps: defCon.randString(6, "char"),
feedback: defCon.randString(6, "char"),
flc: defCon.randString(6, "char"),
flcid: defCon.randString(5, "mix"),
};
defCon.class = {
rndClass: defCon.randString(10, "char"),
rndStyle: defCon.randString(10, "char"),
guide: defCon.randString(5, "mix"),
title: defCon.randString(7, "char"),
help: defCon.randString(5, "mix"),
rotation: defCon.randString(6, "char"),
emoji: defCon.randString(4, "mix"),
main: defCon.randString(7, "char"),
fontList: defCon.randString(7, "char"),
spanlabel: defCon.randString(5, "mix"),
label: defCon.randString(5, "mix"),
placeholder: defCon.randString(5, "mix"),
checkbox: defCon.randString(7, "char"),
flex: defCon.randString(9, "char"),
tooltip: defCon.randString(8, "char"),
tooltiptext: defCon.randString(9, "char"),
ps1: defCon.randString(4, "mix"),
ps2: defCon.randString(4, "mix"),
ps3: defCon.randString(4, "mix"),
ps4: defCon.randString(4, "mix"),
slider: defCon.randString(7, "char"),
frColorPicker: defCon.randString(9, "char"),
readonly: defCon.randString(7, "char"),
notreadonly: defCon.randString(7, "char"),
reset: defCon.randString(6, "mix"),
cancel: defCon.randString(6, "mix"),
submit: defCon.randString(6, "mix"),
selector: defCon.randString(9, "char"),
selectFontId: defCon.randString(8, "char"),
close: defCon.randString(6, "char"),
db: defCon.randString(10, "char"),
dbbc: defCon.randString(8, "char"),
dbb: defCon.randString(7, "char"),
dbm: defCon.randString(7, "char"),
dbt: defCon.randString(7, "char"),
dbbt: defCon.randString(6, "mix"),
dbbf: defCon.randString(6, "mix"),
dbbn: defCon.randString(6, "mix"),
switch: defCon.randString(5, "mix"),
anim: defCon.randString(5, "mix"),
range: defCon.randString(11, "char"),
rangeProgress: defCon.randString(8, "mix"),
};
const DEFAULT_ARRAY = [];
const CUR_WINDOW_TOP = defCon.isWinTop();
const CUR_HOST_NAME = defCon.getHostName();
const IS_FRAMES = CUR_WINDOW_TOP ? "" : "[FRAMES]";
const RANDOM_ID = defCon.randString(2).concat(defCon.randString(4, "digit"));
const HOST_URI = defCon.decrypt("aHR0cHMlM0ElMkYlMkZncmVhc3lmb3JrLm9yZyUyRnNjcmlwdHMlMkY0MTY2ODg=");
const FONTLIST_IMG = defCon.decrypt("aHR0cHMlM0ElMkYlMkZzMS5heDF4LmNvbSUyRjIwMjIlMkYwNCUyRjAyJTJGcW9SZldkLmdpZg==");
const LOADING_IMG = defCon.decrypt("aHR0cHMlM0ElMkYlMkZpbWcuemNvb2wuY24lMkZjb21tdW5pdHklMkYwMzhkZGU0NThmOWE4NzRhODAxMjE2MGY3NDE3ZjZlLmdpZg==");
/* New RAF for setTimeout & setInterval */
w.requestAnimationFrame ||
(function () {
"use strict";
w.requestAnimationFrame =
w.msRequestAnimationFrame ||
w.mozRequestAnimationFrame ||
w.webkitRequestAnimationFrame ||
(function () {
const fps = 60;
const delay = 1000 / fps;
const animationStartTime = Date.now();
let previousCallTime = animationStartTime;
return function requestAnimationFrame(callback) {
const requestTime = Date.now();
const timeout = Math.max(0, delay - (requestTime - previousCallTime));
const timeToCall = requestTime + timeout;
previousCallTime = timeToCall;
return setTimeout(function onAnimationFrame() {
callback(timeToCall - animationStartTime);
}, timeout);
};
})();
w.cancelAnimationFrame =
w.mozCancelAnimationFrame ||
w.webkitCancelAnimationFrame ||
w.cancelRequestAnimationFrame ||
w.msCancelRequestAnimationFrame ||
w.mozCancelRequestAnimationFrame ||
w.webkitCancelRequestAnimationFrame ||
function cancelAnimationFrame(id) {
clearTimeout(id);
};
})();
class RAF {
constructor() {
this._timerMap = {
timeout: {},
interval: {},
};
}
_ticking(_fn, type = "interval", interval = 100, lastTime = Date.now()) {
const timerSymbol = Symbol(type);
const step = () => {
this._setTimerMap(timerSymbol, type, step);
if (Date.now() - lastTime >= interval || interval < 17) {
_fn.call();
lastTime = type === "interval" ? Date.now() : lastTime;
type === "timeout" && this.clearTimeout(timerSymbol);
}
};
this._setTimerMap(timerSymbol, type, step);
return timerSymbol;
}
_setTimerMap(timerSymbol, type, step) {
this._timerMap[type][timerSymbol] = w.requestAnimationFrame(step);
}
setTimeout(fn, interval) {
return this._ticking(fn, "timeout", interval);
}
clearTimeout(timer) {
w.cancelAnimationFrame(this._timerMap.timeout[timer]);
delete this._timerMap.timeout[timer];
}
setInterval(fn, interval) {
return this._ticking(fn, "interval", interval);
}
clearInterval(timer) {
w.cancelAnimationFrame(this._timerMap.interval[timer]);
delete this._timerMap.interval[timer];
}
}
/* Sleep Promise Function */
const raf = new RAF();
const cachedSetTimeout = setTimeout;
const createSleepPromise = (timeout, { useCachedSetTimeout }) => {
return new Promise(resolve => {
useCachedSetTimeout ? cachedSetTimeout(resolve, timeout) : raf.setTimeout(resolve, timeout);
}).catch(e => {
error("CreateSleepPromise:", e.message);
});
};
const sleep = function (timeout, { useCachedSetTimeout } = {}) {
const sleepPromise = createSleepPromise(timeout, { useCachedSetTimeout });
const promiseFunction = value => {
return sleepPromise.then(() => {
return value;
});
};
promiseFunction.then = (...args) => {
return sleepPromise.then(...args);
};
promiseFunction.catch = Promise.resolve().catch;
return promiseFunction;
};
/* Abbreviated functions */
const oH = Object.prototype.hasOwnProperty;
const cP = (target, prop) => {
try {
return w.getComputedStyle(target, null).getPropertyValue(prop);
} catch (e) {
return target.style && target.style[prop];
}
};
const qA = (str, target = document) => {
try {
return Array.prototype.slice.call(target.querySelectorAll(str), 0);
} catch (e) {
return typeof str === "string" ? getElements(str, target) : [];
}
};
const qS = (str, target = document) => {
try {
return target.querySelector(str);
} catch (e) {
return typeof str === "string" ? getElements(str, target)[0] : null;
}
};
const cE = str => {
return document.createElement(str);
};
/* Content-Security-Policy: trustedTypes */
if (w.trustedTypes && w.trustedTypes.createPolicy) {
const wTcP = (wTrs = "fr#safeCreateHTML") => {
const wT = new Set([
{ host: "teams.live.com", policy: "goog#html" },
{ host: "github.dev", policy: "safeInnerHtml" },
]);
for (const wTs of wT.values()) {
if (location.hostname.startsWith(wTs.host)) {
wTrs = wTs.policy;
break;
}
}
return wTrs;
};
trustedTypesPolicy = w.trustedTypes.createPolicy(wTcP(), {
createHTML: string => {
return string;
},
});
}
/* Get browser core & system parameters */
const getNavigator = {
uaData: (() => {
try {
// eslint-disable-next-line no-undef
return Boolean(navigator.userAgentData && navigator.userAgentData instanceof NavigatorUAData);
} catch (e) {
error("getNavigator.uaData:", e.message);
return false;
}
})(),
init: function (v = this.uaData) {
return v ? navigator.userAgentData : navigator.userAgent.toLowerCase();
},
getBrowser: (brands, getBrand, info = "Other", version = "0") => {
try {
if (getBrand) {
brands.some(b => {
switch (b.brand) {
case "Microsoft Edge":
info = "Edge";
version = b.version;
break;
case "Google Chrome":
info = "Chrome";
version = b.version;
break;
case "Opera":
info = "Opera";
version = b.version;
break;
case "Brave":
info = "Brave";
version = b.version;
break;
case "Chromium":
if (info === "Other") {
info = "Chromium";
version = b.version;
}
break;
}
});
} else {
brands.some(b => {
if (b.brand === "Chromium") {
info = "Blink";
version = b.version;
}
});
}
} catch (e) {
error("Navigator.getBrowser:", e.message);
}
return { info, version };
},
core: function (u = JSON.stringify(this.init())) {
return {
Trident: u.includes("trident") || u.includes("compatible"),
Presto: u.includes("presto"),
WebKit: u.includes("applewebkit") || u.includes("Chromium"),
Gecko: u.includes("gecko") && !u.includes("khtml") && !u.includes("trident") && !u.includes("compatible"),
Blink: (u.includes("applewebkit") && (u.includes("chromium") || u.includes("chrome"))) || u.includes("Chromium"),
};
},
geckoVersion: function (u = this.init()) {
const m = u.match(/firefox\/(\d+)/i);
return m && m[1] ? m[1] : 0;
},
chromiumVersion: function (u = this.init()) {
if (this.uaData) {
return this.getBrowser(u.brands, null).version;
} else {
const m = u.match(/chrom[e|ium]\/(\d+)/i);
return m && m[1] ? m[1] : 0;
}
},
system: function (u = this.init(), system = "Unknown") {
if (this.uaData) {
system = u.platform ? u.platform.toString() : system;
} else {
if (/windows|win32|win64|wow32|wow64/g.test(u)) {
system = "Windows";
} else if (/macintosh|macintel|mac os x/g.test(u)) {
system = "macOS";
} else if (/linux|x11/g.test(u)) {
system = "Linux";
} else if (/android|adr/g.test(u)) {
system = "Android";
} else if (/ios|iphone|ipad|ipod|iwatch/g.test(u)) {
system = "iOS";
}
}
return system;
},
browser: function (u = this.init(), browserInfo = "Other") {
if (this.uaData) {
browserInfo = this.getBrowser(u.brands, "browser").info;
} else {
const browserArray = {
IE: u.includes("msie") || u.includes("trident") || u.includes("compatible"),
Chromium: u.includes("chromium"),
Chrome: u.includes("chrome") && !u.includes("edg") && !u.includes("chromium"),
Firefox: u.includes("firefox") && u.includes("gecko"),
Opera: u.includes("presto") || u.includes("opr") || u.includes("opera"),
Safari: u.includes("safari") && u.includes("version") && !u.includes("chrome"),
Edge: u.includes("edg"),
QQBrowser: /qqbrowser/g.test(u),
Wechat: /micromessenger/g.test(u),
UCBrowser: /ubrowser/g.test(u),
Sougou: /metasr|sogou/g.test(u),
Maxthon: /maxthon/g.test(u),
CentBrowser: /cent/g.test(u),
Vivaldi: /vivaldi/g.test(u),
};
for (let i in browserArray) {
if (oH.call(browserArray, i) && browserArray[i]) {
browserInfo = i;
}
}
}
return browserInfo;
},
getUA: async function (u = this.init()) {
try {
return this.uaData
? JSON.stringify(await u.getHighEntropyValues(["architecture", "bitness", "model", "platform", "platformVersion", "uaFullVersion"]))
: this.isCheatUA()
? "(CHEAT-UA) ".concat(u)
: u;
} catch (e) {
error("Navigator.getUA:", e.message);
return u;
}
},
isCheatUA: function () {
return (
(!this.uaData && !!navigator.userAgentData) || (!this.core().Gecko && !isNaN(parseFloat(w.mozInnerScreenX))) || (this.core().Gecko && isNaN(parseFloat(w.mozInnerScreenX)))
);
},
};
const IS_REAL_GECKO = (getNavigator.core().Gecko && !getNavigator.isCheatUA()) || !isNaN(parseFloat(w.mozInnerScreenX));
const IS_REAL_BLINK = (getNavigator.core().Blink && !getNavigator.isCheatUA()) || !!w.chrome;
const CAN_I_USE = (IS_REAL_GECKO && getNavigator.geckoVersion() >= 82) || (IS_REAL_BLINK && Number(getNavigator.chromiumVersion()) >= 88);
/* New DefinePropertise */
const definePropertiesForZoom = (ratio, { deleteProperty }) => {
const obj_Targets = new Set([
{
objs: [MouseEvent.prototype],
props: ["clientX", "clientY", "pageX", "pageY", "layerX", "layerY", "offsetX", "offsetY", "screenX", "screenY", "movementX", "movementY", "x", "y"],
},
{
objs: [w, unsafeWindow],
props: ["pageXOffset", "pageYOffset", "scrollX", "scrollY"],
},
{
objs: [Element.prototype],
props: ["scrollLeft", "scrollTop"],
},
]);
try {
for (const obj_Target of obj_Targets.values()) {
const t = ratio;
const d = deleteProperty;
obj_Target.objs.forEach(obj => {
obj_Target.props.forEach(prop => {
const object = Reflect.getOwnPropertyDescriptor(obj, prop);
if (object) {
d && Reflect.deleteProperty(obj, prop);
if (["scrollLeft", "scrollTop"].includes(prop)) {
Reflect.defineProperty(obj, prop, {
configurable: true,
enumerable: true,
get: function () {
return object.get.call(this) / t;
},
set: function (Value) {
switch (prop) {
case "scrollLeft":
this.scrollTo(Value * t, 0);
break;
case "scrollTop":
this.scrollTo(0, Value * t);
break;
}
},
}) && debug(`\u27A4 %O ${IS_FRAMES || "-"} %s %csucceeded`, obj, prop, "color:green");
} else {
Reflect.defineProperty(obj, prop, {
configurable: true,
enumerable: true,
get: function () {
return object.get.call(this) / t;
},
}) && debug(`\u27A4 %O ${IS_FRAMES || "-"} %s %csucceeded`, obj, prop, "color:green");
}
}
});
});
}
if (IS_REAL_BLINK) {
deleteProperty && Reflect.deleteProperty(SVGGraphicsElement.prototype, "getScreenCTM");
Reflect.defineProperty(SVGGraphicsElement.prototype, "getScreenCTM", {
configurable: true,
enumerable: true,
value: function () {
const value = defCon.getScreenCTM.call(this);
let newSVGMatrix = this.ownerSVGElement.createSVGMatrix();
let newValue = new Proxy(value, {
get: function (target, proper) {
return Reflect.get(target, proper) / defCon.tZoom;
},
});
newSVGMatrix.a = newValue.a;
newSVGMatrix.b = newValue.b;
newSVGMatrix.c = newValue.c;
newSVGMatrix.d = newValue.d;
newSVGMatrix.e = newValue.e;
newSVGMatrix.f = newValue.f;
return newSVGMatrix;
},
}) && debug(`\u27A4 %O ${IS_FRAMES || "-"} getScreenCTM() %csucceeded`, SVGGraphicsElement.prototype, "color:green");
}
} catch (e) {
error("defineProperty:", e.message);
}
if (IS_REAL_GECKO) {
try {
deleteProperty && Reflect.deleteProperty(Element.prototype, "getClientRects");
Reflect.defineProperty(Element.prototype, "getClientRects", {
configurable: true,
enumerable: true,
value: function () {
const list = defCon.getClientRects.call(this);
let newRectlist = new Set();
for (let i = 0, l = list.length; i < l; i++) {
let newRect = new Proxy(list[i], {
get: function (target, proper) {
return Reflect.get(target, proper) / defCon.tZoom;
},
});
newRectlist[i] = newRect;
}
return newRectlist;
},
}) && debug(`\u27A4 %O ${IS_FRAMES || "-"} getClientRects() [DOMRectList] %csucceeded`, Element.prototype, "color:green");
deleteProperty && Reflect.deleteProperty(Element.prototype, "getBoundingClientRect");
Reflect.defineProperty(Element.prototype, "getBoundingClientRect", {
configurable: true,
enumerable: true,
value: function () {
const value = defCon.getBoundingClientRect.call(this);
let newValue = new Proxy(value, {
get: function (target, proper) {
return Reflect.get(target, proper) / defCon.tZoom;
},
});
return newValue;
},
}) && debug(`\u27A4 %O ${IS_FRAMES || "-"} getBoundingClientRect() [DOMRect] %csucceeded`, Element.prototype, "color:green");
} catch (e) {
error("defineProperty.Firefox:", e.message);
}
}
};
const rePositionForZoom = (item, dname) => {
if (!item) {
return;
}
let sT = -defCon.elCompat.getBoundingClientRect().top;
item.style.top = `${sT}px`;
w.scrollTo(0, (sT * defCon.tZoom || 2) - 1);
if (item.childNodes.length > 0) {
defCon[dname] = () => {
sT = -defCon.elCompat.getBoundingClientRect().top;
item.style.top = `${sT}px`;
};
document.addEventListener("scroll", defCon[dname]);
}
};
/* Initialized important functions */
function getMetaValue(str) {
const queryReg = new RegExp(`//\\s+@${str}\\s+(\\S+)`);
const metaValue = GMinfo.scriptMetaStr.match(queryReg);
return metaValue ? metaValue[1] : "";
}
function setRAFInterval(callback, interval, { runNow }) {
if (runNow === true) {
const shouldFinish = callback();
if (shouldFinish) {
return;
}
}
const tickId = raf.setInterval(() => {
const shouldFinish = callback();
if (shouldFinish) {
raf.clearInterval(tickId);
return;
}
}, interval);
}
function deBounce(fn, delay, timer, immediate) {
return function () {
const _this = this;
const args = arguments;
if (!defCon[timer] && immediate) {
fn.apply(_this, args);
}
if (defCon[timer]) {
raf.clearTimeout(defCon[timer]);
}
defCon[timer] = raf.setTimeout(function () {
fn.apply(_this, args);
delete defCon[timer];
}, delay);
};
}
function getElements(str, target) {
const aStr = str.trim().startsWith(":not") ? [] : str.trim().split(",");
let aChild = [];
try {
aStr.forEach(items => {
const rStr = items.trim().split(/\s+|>|,/g);
let rChild = [];
let rParent = [target];
for (let i = 0, l = rStr.length; i < l; i++) {
rChild = getElementsByStr(rParent, rStr[i]) || [];
rParent = rChild;
}
aChild = aChild.concat(rChild);
});
} catch (e) {
error("QuerySelector.getElements:", e.message);
}
return [...aChild];
}
function getElementsByStr(aParent, str) {
const aChild = [];
const pushElemIntoNodelist = (a, b, c) => {
for (let j = 0, l = a.length; j < l; j++) {
const aValue = a[j].getAttribute(c[1]) || "";
const rStr = c[2].replace(/"|'|`/g, "");
if (
(str.search(/[^*^$~]=/) !== -1 && aValue === rStr) ||
(str.search(/\^=/) !== -1 && aValue.startsWith(rStr)) ||
(str.search(/\$=/) !== -1 && aValue.endsWith(rStr)) ||
(str.search(/\*=/) !== -1 && aValue.includes(rStr)) ||
(str.search(/~=/) !== -1 && aValue.match(new RegExp(`\\b${rStr}\\b`)))
) {
a[j] && b.push(a[j]);
}
}
};
try {
for (let i = 0, l = aParent ? aParent.length : 0; i < l; i++) {
switch (str.charAt(0)) {
case "#":
if (/^#[-\w]+\[[-\w]+[*^$~]?=["'`]?\w+["'`]?\]/g.test(str)) {
let aStr = str.split(/\[|[*^$~]?=|\]/g);
let aRes = document.getElementById(aStr[0].substring(1));
pushElemIntoNodelist([aRes], aChild, aStr);
} else {
let aRes = document.getElementById(str.substring(1));
aRes && aChild.push(aRes);
}
break;
case ".":
if (aParent[i]) {
if (/^\.[-\w]+\[[-\w]+[*^$~]?=["'`]?\w+["'`]?\]/g.test(str)) {
let aStr = str.split(/\[|[*^$~]?=|\]/g);
let aRes = aParent[i].getElementsByClassName(aStr[0].substring(1));
pushElemIntoNodelist(aRes, aChild, aStr);
} else {
let aRes = aParent[i].getElementsByClassName(str.substring(1));
for (let j = 0, l = aRes.length; j < l; j++) {
aRes[j] && aChild.push(aRes[j]);
}
}
}
break;
default:
if (aParent[i]) {
if (/^[-\w]+\.\w+/g.test(str)) {
let aStr = str.split(".");
let aRes = aParent[i].getElementsByTagName(aStr[0]);
let reg = new RegExp("\\b" + aStr[1] + "\\b", "g");
for (let j = 0, l = aRes.length; j < l; j++) {
if (aRes[j] && reg.test(aRes[j].className)) {
aChild.push(aRes[j]);
}
}
} else if (/^[-\w]*\[[-\w]+[*^$~]?=["'`]?\w+["'`]?\]/g.test(str)) {
let aStr = str.split(/\[|[*^$~]?=|\]/g);
let aRes = aParent[i].getElementsByTagName(aStr[0] || "*");
pushElemIntoNodelist(aRes, aChild, aStr);
} else {
let aRes = aParent[i].getElementsByTagName(str);
for (let j = 0, l = aRes.length; j < l; j++) {
aRes[j] && aChild.push(aRes[j]);
}
}
}
break;
}
}
} catch (e) {
error("QuerySelector.getElementsByStr:", e.message);
}
return aChild;
}
function getAsyncStyleNode(target) {
let el = qA(`style,link[rel*="stylesheet" i]:not([disabled])`, target).slice(-1)[0] || target.lastElementChild;
const styleSheets = (target.parentNode && target.parentNode.parentNode && target.parentNode.parentNode.styleSheets) || document.styleSheets;
for (let i = styleSheets.length - 1; i >= 0; i--) {
if (styleSheets[i].ownerNode && styleSheets[i].ownerNode.parentNode === target) {
el = styleSheets[i].ownerNode;
break;
}
}
return el;
}
function safeRemove(s, t) {
qA(s, t).forEach(item => {
try {
item.parentNode && item.parentNode.removeChild(item);
} catch (e) {
item.remove();
}
});
return !!qA(s, t).length;
}
function addStyle(cssString, className, addToTarget, T = "T", { isReload } = {}, initType = "text/css") {
setRAFInterval(
() => {
try {
if (!addToTarget || typeof addToTarget !== "object") {
return true;
}
if (className && typeof className === "string") {
switch (isReload) {
case true:
qS(`.${className}`, addToTarget) && debug(`\u27A4 style 温馨提示 脚本预载了常用的中文字体,下拉菜单中所罗列的字体是在代码字体表中您已安装过的字体,没有安装过则不会显示。 (注一)如果没有重新选择字体,则使用上一次保存的字体。首次使用默认为微软雅黑字体。 (注二)输入框可输入关键字进行搜索,支持中文和英文字体名。 (注三)字体是按您选择的先后顺序进行优先渲染的,所以多选不如只选一个您最想要的。 (注四)如果“字体重写”被关闭,那么本功能将自动禁用,网页字体将采用“网站默认”的字体设置。 (注五)双击\ud83d\udd14可以打开自定义字体的添加工具,以使用更多新字体。 您好\uff01这是${CANDIDATE_FIELD}${defCon.scriptName}的更新版本V${defCon.curVersion}, 以下为更新内容\uff1a
${FIRST_INSTALL_NOTICE_WARNING}${STRUCTURE_ERROR_NOTICE_WARNING}
建议您先看看 新版帮助文档 ,去看一下吗?
` ), titleText: "脚本更新 - 温馨提示", }); if (await frDialog.respond()) { GMopenInTab(url, defCon.options); } frDialog = null; sleep(5e2)(true) && curVersion === null && location.reload(true); }; if (curVersion !== defCon.curVersion && CUR_WINDOW_TOP) { addLoadEvents(() => { (!isCloseTip || defCon.structureError === true) && hintUpdateInfo(`${HOST_URI}#update`, curVersion); _config_data_.curVersion = defCon.curVersion; saveData("_configure_", _config_data_); debug("\u27A4 %cThe script has been upgraded to V%s", "font-style:italic;background-color:yellow;color:crimson", defCon.curVersion); return true; }); } /* Operation of CSS value */ const shadow_r = parseFloat(CONST_VALUES.fontShadow); const shadow_c = typeof CONST_VALUES.shadowColor === "undefined" ? INITIAL_VALUES.shadowColor : CONST_VALUES.shadowColor.toLowerCase() === "currentcolor" // Version compatible. ? "#FFFFFFFF" : CONST_VALUES.shadowColor; const overlayColor = (r, c) => { return c.substring(1) !== "FFFFFFFF" ? `text-shadow:0 0 ${(r * 1.15).toFixed(2)}px ${toColordepth(c, 1.35)},0 0 ${r}px ${c},0 0 ${(r * 0.75).toFixed(2)}px ${toColordepth(c, 0.4)};` : `text-shadow:0 0 ${r}px ${toColordepth(c, 0.95)},0 0 ${(r * 0.7).toFixed(2)}px currentcolor,0 0 ${(r * 0.85).toFixed(2)}px ${toColordepth(c, 0.2)};`; }; const shadow = !isNaN(shadow_r) && shadow_r > 0 && shadow_r <= 8 ? overlayColor(shadow_r, shadow_c) : ""; const stroke_r = parseFloat(CONST_VALUES.fontStroke); const stroke = !isNaN(stroke_r) && stroke_r > 0 && stroke_r <= 1.0 ? `-webkit-text-stroke:${stroke_r}px currentcolor;` : ""; const selection = stroke ? "::selection{color:#ffffff!important;background:#0084ff!important}::-moz-selection{color:currentcolor!important;background:#1ebee34a!important}" : ""; const smooth_i = CONST_VALUES.fontSmooth; const funcSmooth = String( `font-feature-settings:"liga" 0;font-variant:no-common-ligatures proportional-nums;font-optical-sizing:auto;font-kerning:auto;${ getNavigator.core().WebKit && !getNavigator.isCheatUA() ? "-webkit-font-smoothing:antialiased!important;" : IS_REAL_GECKO && IS_MACOS ? "-moz-osx-font-smoothing:grayscale!important;" : "" }` ); const smoothing = smooth_i ? funcSmooth : ""; let bodyzoom = ""; const fontsize_r = parseFloat(CONST_VALUES.fontSize); const funcFontsize = t => { return `:root body{${ IS_REAL_GECKO ? `transform:scale(${t});transform-origin:0 0;width:${100 / t}%;height:${100 / t}%;` : `zoom:${t}!important;max-width:-webkit-fill-available;` }}`; }; if (defCon.isFontsize && !isNaN(fontsize_r) && fontsize_r >= 0.8 && fontsize_r <= 1.5 && fontsize_r !== 1) { bodyzoom = funcFontsize(fontsize_r); typeof defCon.exSitesIndex === "undefined" && sleep(20)(fontsize_r).then(r => { defCon.oZoom.push(r); definePropertiesForZoom(r, { deleteProperty: false }); }); } else { defCon.oZoom.push(1); } const prefont = CONST_VALUES.fontSelect && CONST_VALUES.fontSelect.split(",")[0]; const refont = prefont ? prefont.replace(/"|'/g, "") : ""; const fontface_i = CONST_VALUES.fontFace; const funcFontface = async t => { let returnFontface = ""; const receiveFont = await matchByPostScriptName(t); [ convertToUnicode("宋体"), convertToUnicode("新宋体"), convertToUnicode("黑体"), convertToUnicode("仿宋"), convertToUnicode("微软雅黑"), convertToUnicode("微軟正黑體"), "SimSun", "NSimSun", "SimHei", "Heiti SC", "HanHei SC", "MingLiU", "MingLiU-ExtB", "PMingLiU", "PMingLiU-ExtB", "Roboto", "RobotoDraft", "Noto Sans", "Helvetica", "Helvetica Neue", "Lucida Grande", "Arial", "Verdana", "Ubuntu", "Segoe UI", "Open Sans", ].forEach(item => { if (item !== t) { returnFontface += `@font-face{font-family:"${item}";src:local("${receiveFont}")}`; } }); return returnFontface; }; const fontfamily = fontface_i ? `font-family:${CONST_VALUES.fontSelect};` : ""; const fontfaces = !fontface_i ? "" : refont ? await funcFontface(refont) : ""; const cssexlude = CONST_VALUES.fontEx; const funcCodefont = (t, s, r) => { if (t.search(/\bpre\b|\bcode\b/gi) !== -1) { const pre = t.search(/\bpre\b/gi) > -1 ? ["pre", "pre *"] : []; const code = t.search(/\bcode\b/gi) > -1 ? ["code", "code *"] : []; const elcode = ["samp", "kbd", "[class~='code']", "[class~='code'] *", "[class~='blob-code']", "[class~='blob-code'] *"]; const codeSelector = pre.concat(code, elcode).join(); const monospace = CONST_VALUES.monospacedFont || INITIAL_VALUES.monospacedFont; const mono = s ? r : INITIAL_VALUES.fontSelect.replace("'Microsoft YaHei',", ""); return String( (CAN_I_USE ? `:is(${codeSelector})` : `${codeSelector}`).concat( `{font-size:14px!important;line-height:150%!important;`, `-webkit-text-stroke:initial!important;text-shadow:0 0 ${(shadow_r * 0.8).toFixed(2)}px ${toColordepth(shadow_c, 1.65)}!important;`, `font-family:${monospace},ui-monospace,Consolas,'Lucida Console',${IS_REAL_GECKO ? "" : "monospace,"}`, `${IS_REAL_GECKO ? mono.replace("system-ui", "monospace,system-ui") : mono}!important;`, `font-feature-settings:"liga" 0,"tnum","zero"!important;-webkit-user-select:text!important;user-select:text!important}` ) ); } return ""; }; const zeroConfigure = !fontface_i && !smooth_i && !shadow && !stroke && fontsize_r === 1; const exclude_Selector = CAN_I_USE ? `:is(${cssexlude})` : `${cssexlude}`; const exclude = !cssexlude || (!shadow && !stroke) ? `` : exclude_Selector.concat(`{-webkit-text-stroke:initial!important;text-shadow:none!important}`); const codeFont = !cssexlude || zeroConfigure ? `` : funcCodefont(cssexlude, fontface_i, CONST_VALUES.fontSelect); const cssfun = CONST_VALUES.fontCSS; const textrender = smooth_i ? "text-rendering:optimizeLegibility!important;" : ""; const fixfontstroke = CONST_VALUES.fixStroke ? "[fr-fix-stroke]{-webkit-text-stroke:initial!important}" : ""; const fontStyle = String( typeof defCon.exSitesIndex === "undefined" && !zeroConfigure ? `${fontfaces}${bodyzoom}`.concat( CAN_I_USE ? `:is(${cssfun})` : `${cssfun}`, `{${fontfamily}${shadow}${stroke}${smoothing}${textrender}}`, `${selection}${exclude}${codeFont}${fixfontstroke}` ) : `` ); const fontStyle_db = String( `#${defCon.id.dialogbox}{width:100%;height:100vh;background:transparent;position:fixed;top:0;left:0;z-index:1999999995}#${defCon.id.dialogbox} .${defCon.class.db}{box-sizing:content-box;max-width:420px;color:#444;border:2px solid #efefef}.${defCon.class.db}{display:block;overflow:hidden;position:absolute;top:200px;right:15px;border-radius:6px;width:100%;background:#fff;box-shadow:0 0 10px 0 rgba(0,0,0,.3);transition:opacity .5s}.${defCon.class.db} *{line-height:1.5!important;font-family:"Microsoft YaHei UI",system-ui,-apple-system,BlinkMacSystemFont,sans-serif!important;-webkit-text-stroke:initial!important;text-shadow:0 0 1px #777!important}.${defCon.class.dbt}{background:#efefef;margin-top:0;padding:10px 12px;font-size:18px!important;font-weight:700;text-align:left;width:auto;font-family:Candara,"Times New Roman","Microsoft YaHei UI",system-ui,-apple-system,BlinkMacSystemFont!important}.${defCon.class.dbm}{color:#444;padding:10px;margin:5px;font-size:16px!important;font-weight:500;text-align:left}.${defCon.class.dbb}{display:inline-block;margin:2px 1%;border-radius:4px;padding:8px 12px;min-width:12%;font-weight:400;text-align:center;letter-spacing:0;cursor:pointer;text-decoration:none!important;box-sizing:content-box}.${defCon.class.dbb}:hover{color:#fff;opacity:.8;font-weight:900;text-decoration:none!important;box-sizing:content-box}.${defCon.class.db} .${defCon.class.dbt},.${defCon.class.dbb},.${defCon.class.dbb}:hover{text-shadow:none!important;-webkit-text-stroke:initial!important;-webkit-user-select:none;user-select:none}.${defCon.class.dbbf},.${defCon.class.dbbf}:hover{background:#d93223!important;color:#fff!important;border:1px solid #d93223!important;border-radius:6px;font-size:14px!important}.${defCon.class.dbbf}:hover{box-shadow:0 0 3px #d93223!important}.${defCon.class.dbbt},.${defCon.class.dbbt}:hover{background:#038c5a!important;color:#fff!important;border:1px solid #038c5a!important;border-radius:6px;font-size:14px!important}.${defCon.class.dbbt}:hover{box-shadow:0 0 3px #038c5a!important}.${defCon.class.dbbn},.${defCon.class.dbbn}:hover{background:#777!important;color:#fff!important;border:1px solid #777!important;border-radius:6px;font-size:14px!important}.${defCon.class.dbbn}:hover{box-shadow:0 0 3px #777!important}.${defCon.class.dbbc}{text-align:right;padding:2.5%;background:#efefef;color:#fff}` + `.${defCon.class.dbm} button:hover{cursor:pointer;background:#f6f6f6!important;box-shadow:0 0 3px #a7a7a7!important}.${defCon.class.dbm} p{line-height:1.5!important;margin:5px 0!important;text-indent:0!important;font-size:16px!important;font-weight:400;text-align:left;-webkit-user-select:none;user-select:none}.${defCon.class.dbm} ul{list-style:none;margin:0 0 0 10px!important;padding:2px;font:italic 14px/150% "Microsoft YaHei UI",system-ui,-apple-system,BlinkMacSystemFont,sans-serif!important;color:gray;scrollbar-width:thin}.${defCon.class.dbm} ul::-webkit-scrollbar{width:10px;height:1px}.${defCon.class.dbm} ul::-webkit-scrollbar-thumb{box-shadow:inset 0 0 5px #999;background:#cfcfcf;border-radius:10px}.${defCon.class.dbm} ul::-webkit-scrollbar-track{box-shadow:inset 0 0 5px #aaa;background:#efefef;border-radius:10px}.${defCon.class.dbm} ul::-webkit-scrollbar-track-piece{box-shadow:inset 0 0 5px #aaa;background:#efefef;border-radius:6px}.${defCon.class.dbm} ul li{display:list-item;list-style-type:none;-webkit-user-select:none;user-select:none;word-break:break-all}.${defCon.class.dbm} li:before{display:none}.${defCon.class.dbm} #${defCon.id.bk},.${defCon.class.dbm} #${defCon.id.pv},.${defCon.class.dbm} #${defCon.id.fs},.${defCon.class.dbm} #${defCon.id.hk},.${defCon.class.dbm} #${defCon.id.ct},.${defCon.class.dbm} #${defCon.id.mps},.${defCon.class.dbm} #${defCon.id.flc}{box-sizing:content-box;list-style:none;font-style:normal;display:flex;justify-content:space-between;align-items:flex-start;margin:0;padding:2px 4px!important;width:calc(96% - 10px);min-width:auto;height:max-content;min-height:40px;word-break:break-word}.${defCon.class.dbm} #${defCon.id.bk} .${RANDOM_ID}_VIP,.${defCon.class.dbm} #${defCon.id.pv} .${RANDOM_ID}_VIP,.${defCon.class.dbm} #${defCon.id.fs} .${RANDOM_ID}_VIP,.${defCon.class.dbm} #${defCon.id.hk} .${RANDOM_ID}_VIP,.${defCon.class.dbm} #${defCon.id.ct} .${RANDOM_ID}_VIP,.${defCon.class.dbm} #${defCon.id.mps} .${RANDOM_ID}_VIP,.${defCon.class.dbm} #${defCon.id.flc} .${RANDOM_ID}_VIP{margin:2px 0 0 0;color:darkgoldenrod!important;font:normal 16px/150% "Microsoft YaHei UI",system-ui,-apple-system,BlinkMacSystemFont,sans-serif!important}.${defCon.class.dbm} #${defCon.id.flc} button{background-color:#eee;color:#444!important;font-weight:normal;border:1px solid #999;font-size:14px!important;border-radius:4px}` + `.${defCon.class.dbm} a{color:#0969da;text-decoration:none!important;font-style:inherit}.${defCon.class.dbm} a:hover{color:crimson;text-decoration:underline}.${defCon.class.dbm} #${defCon.id.feedback}{padding:2px 10px;height:22px;width:max-content;min-width:auto}.${defCon.class.dbm} #${defCon.id.files}{display:none}.${defCon.class.dbm} #${defCon.id.feedback}:hover{color:crimson!important}.${defCon.class.dbm} #${defCon.id.feedback}:after{width:0;height:0;content:"";background:url('${LOADING_IMG}') no-repeat -400px -300px}.${defCon.class.dbm} #${RANDOM_ID}_custom_Fontlist:placeholder-shown{font:normal 400 14px/150% monospace,Consolas,'Microsoft YaHei UI',system-ui,-apple-system,BlinkMacSystemFont!important;color:#aaa!important}.${defCon.class.dbm} #${RANDOM_ID}_custom_Fontlist::-webkit-input-placeholder{font:normal 400 14px/150% monospace,Consolas,'Microsoft YaHei UI',system-ui,-apple-system,BlinkMacSystemFont!important;color:#aaa!important}.${defCon.class.dbm} #${RANDOM_ID}_custom_Fontlist::-moz-placeholder{font:normal 400 14px/150% monospace,Consolas,'Microsoft YaHei UI',system-ui,-apple-system,BlinkMacSystemFont!important;color:#555!important}.${defCon.class.dbm} #${RANDOM_ID}_update li{margin:0;padding:0;font:italic 400 14px/150% Consolas,'Microsoft YaHei UI',system-ui,-apple-system,BlinkMacSystemFont!important;color:gray}.${defCon.class.dbm} .${RANDOM_ID}_add:before{content:"+";display:inline;margin:0 4px 0 -10px}.${defCon.class.dbm} .${RANDOM_ID}_del:before{content:"-";display:inline;margin:0 4px 0 -10px}.${defCon.class.dbm} .${RANDOM_ID}_fix:before{content:"@";display:inline;margin:0 4px 0 -10px}.${defCon.class.dbm} .${RANDOM_ID}_info{color:#daa5207a!important}.${defCon.class.dbm} .${RANDOM_ID}_info:before{content:"#";display:inline;margin:0 4px 0 -10px}.${defCon.class.dbm} .${RANDOM_ID}_warn{color:#e900007a!important}.${defCon.class.dbm} .${RANDOM_ID}_warn:before{content:"!";display:inline;margin:0 4px 0 -10px}.${defCon.class.dbm} .${RANDOM_ID}_init{color:#65a16ad1!important}.${defCon.class.dbm} .${RANDOM_ID}_init:before{content:"$";display:inline;margin:0 4px 0 -10px}.${defCon.class.dbm} input:focus,.${defCon.class.dbm} textarea:focus{box-shadow:inset 0 1px 3px rgb(0 0 0 / 10%),0 0 4px rgb(110 111 112 / 60%)!important}` ); const fontStyle_container = String( `#${defCon.id.rndId}{width:100%;height:100vh;background:transparent;position:fixed;top:0;left:0;z-index:1999999991}body #${defCon.id.container}{position:absolute;top:10px;right:24px;border-radius:12px;background:#f0f6ff!important;box-sizing:content-box;opacity:0;transition:opacity .5s}#${defCon.id.container}{transform:scale3d(1,1,1);width:auto;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;min-height:10%;max-height:calc(100% - 20px);z-index:999999;padding:4px;text-align:left;color:#333;font-size:16px!important;font-weight:900;scrollbar-color:#369 rgba(0,0,0,.25);scrollbar-width:thin}#${defCon.id.container}::-webkit-scrollbar{width:10px;height:1px}#${defCon.id.container}::-webkit-scrollbar-thumb{box-shadow:inset 0 0 5px #67a5df;background:#487baf;border-radius:10px}#${defCon.id.container}::-webkit-scrollbar-track{box-shadow:inset 0 0 5px #67a5df;background:#efefef;border-radius:10px}#${defCon.id.container}::-webkit-scrollbar-track-piece{box-shadow:inset 0 0 5px #67a5df;background:#efefef;border-radius:10px}#${defCon.id.container} *{line-height:1.5!important;text-shadow:none!important;-webkit-text-stroke:initial!important;font-family:"Microsoft YaHei UI",system-ui,-apple-system,BlinkMacSystemFont,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji","Android Emoji",EmojiSymbols!important;font-size:16px;font-weight:700}` + `#${defCon.id.container} fieldset{border:2px groove #67a5df!important;border-radius:10px;padding:4px 6px;margin:2px;background:#f0f6ff!important;display:block;width:auto;height:auto;min-height:475px}#${defCon.id.container} legend{line-height:inherit;padding:0 8px;border:0!important;margin-bottom:0;font-size:16px!important;font-weight:700;font-family:"Microsoft YaHei UI",system-ui,-apple-system,BlinkMacSystemFont,sans-serif!important;background:#f0f6ff!important;box-sizing:content-box;width:auto!important;min-width:185px!important;display:block!important;position:initial!important;height:auto!important;visibility:unset!important}#${defCon.id.container} fieldset ul{padding:0;margin:0;background:#f0f6ff!important}#${defCon.id.container} ul li{display:inherit;list-style:none;margin:3px 0;box-sizing:content-box;border:none;float:none;background:#f0f6ff!important;cursor:default;min-width:-webkit-fill-available;min-width:-moz-available;-webkit-user-select:none;user-select:none}#${defCon.id.container} ul li:before{display:none}#${defCon.id.container} .${defCon.class.help}{width:24px;height:24px;fill:#67a5df;overflow:hidden;visibility:visible!important}#${defCon.id.container} .${defCon.class.help}:hover{cursor:help}#${RANDOM_ID}_scriptname{font-weight:900!important;-webkit-user-select:all;user-select:all;display:inline-block}#${defCon.id.container} .${defCon.class.title} .${defCon.class.guide}{display:inline-block;position:absolute;cursor:pointer}@keyframes rotation{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}.${defCon.class.title} .${defCon.class.rotation}{padding:0;margin:0;width:24px;height:24px;top:auto;right:auto;bottom:auto;left:auto;transform-origin:center 50% 0;-webkit-transform:rotate(360deg);animation:rotation 5s linear infinite}` + `#${defCon.id.container} input:not([type="range"],[type="checkbox"]):focus,#${defCon.id.container} textarea:focus{box-shadow:inset 0 1px 3px rgb(0 0 0 / 10%),0 0 6px rgb(82 168 236 / 60%)!important}#${defCon.id.fontList}{padding:2px 10px 0 10px;min-height:73px}#${defCon.id.fontFace},#${defCon.id.fontSmooth}{padding:2px 10px;height:40px;width:calc(100% - 18px);min-width:auto;display:flex!important;align-items:center;justify-content:space-between}#${defCon.id.fontSize}{padding:2px 10px;height:60px}#${defCon.id.fontStroke}{padding:2px 10px;height:60px}#${defCon.id.fontShadow}{padding:2px 10px;height:60px}#${defCon.id.shadowColor}{display:flex;align-items:center;justify-content:space-between;flex-wrap:nowrap;flex-direction:row;padding:2px 10px;min-height:45px;margin:4px;width:auto}#${defCon.id.fontCSS},#${defCon.id.fontEx}{padding:2px 10px;height:110px;min-height:110px}#${defCon.id.submit}{padding:2px 10px;height:40px}` + `#${defCon.id.fontList} .${defCon.class.selector} a{font-weight:400;text-decoration:none}#${defCon.id.fontList} .${defCon.class.label}{display:inline-block;margin:0 4px 14px 0;padding:0;height:24px;line-height:24px!important}#${defCon.id.fontList} .${defCon.class.label} span{box-sizing:border-box;color:#fff;font-size:16px!important;font-weight:400;height:max-content;width:max-content;min-width:12px;max-width:200px;padding:5px;background:#67a5df;text-overflow:ellipsis;overflow:hidden;display:inline-block;white-space:nowrap}#${defCon.id.fontList} .${defCon.class.close}{width:12px}#${defCon.id.fontList} .${defCon.class.close}:hover{color:tomato;background-color:#2d7dca;border-radius:2px}#${defCon.id.selector}{width:100%;max-width:100%}#${defCon.id.selector} label{display:block;cursor:initial;margin:0 0 4px 0;color:#333}#${defCon.id.selector} #${defCon.id.cleaner}{margin-left:5px;cursor:pointer}#${defCon.id.selector} #${defCon.id.cleaner}:hover{color:red}#${defCon.id.fontList} .${defCon.class.selector}{overflow-x:hidden;box-sizing:border-box;overscroll-behavior:contain;border:2px solid #67a5df!important;border-radius:6px;padding:6px 6px 0 6px;margin:0 0 6px 0;width:100%;min-width:100%;max-width:min-content;max-width:-moz-min-content;max-height:90px;min-height:45px;scrollbar-color:#369 rgba(0,0,0,.25);scrollbar-width:thin}#${defCon.id.fontList} .${defCon.class.selector}::-webkit-scrollbar{width:6px;height:1px}#${defCon.id.fontList} .${defCon.class.selector}::-webkit-scrollbar-thumb{box-shadow:inset 0 0 2px #67a5df;background:#487baf;border-radius:10px}#${defCon.id.fontList} .${defCon.class.selector}::-webkit-scrollbar-track{box-shadow:inset 0 0 2px #67a5df;background:#efefef;border-radius:10px}#${defCon.id.fontList} .${defCon.class.selector}::-webkit-scrollbar-track-piece{box-shadow:inset 0 0 2px #67a5df;background:#efefef;border-radius:10px}#${defCon.id.fontList} .${defCon.class.selectFontId} span.${defCon.class.spanlabel},#${defCon.id.selector} span.${defCon.class.spanlabel}{margin:0!important;width:auto;display:block!important;padding:0 0 4px 0;color:#333;border:0;text-align:left!important;background-color:transparent!important}` + `#${defCon.id.fontList} .${defCon.class.selectFontId}{width:auto}#${defCon.id.fontList} .${defCon.class.selectFontId} input{text-overflow:ellipsis;overflow:hidden;box-sizing:border-box;border:2px solid #67a5df!important;border-radius:6px;outline:none!important;padding:1px 23px 1px 2px;margin:0;width:100%;max-width:100%;min-width:100%;height:42px!important;font-family:"Microsoft YaHei UI",system-ui,-apple-system,BlinkMacSystemFont,sans-serif!important;font-size:16px!important;font-weight:700;text-indent:8px;background:#fafafa;outline-color:#67a5df}#${defCon.id.fontList} .${defCon.class.selectFontId} input[disabled]{pointer-events:none!important}.${defCon.class.placeholder}:placeholder-shown{color:#369!important;font:normal 700 16px/150% "Microsoft YaHei UI",system-ui,-apple-system,BlinkMacSystemFont,sans-serif!important;opacity:.95!important}.${defCon.class.placeholder}::-webkit-input-placeholder{color:#369!important;font:normal 700 16px/150% "Microsoft YaHei UI",system-ui,-apple-system,BlinkMacSystemFont,sans-serif!important;opacity:.65!important}.${defCon.class.placeholder}::-moz-placeholder{color:#369!important;font:normal 700 16px/150% "Microsoft YaHei UI",system-ui,-apple-system,BlinkMacSystemFont,sans-serif!important;opacity:.65!important}#${defCon.id.fontList} .${defCon.class.selectFontId} dl{overflow-x:hidden;overscroll-behavior:contain;position:absolute;z-index:1000;margin:4px 0 0 0;box-sizing:content-box;border:2px solid #67a5df!important;border-radius:6px;padding:4px 8px;width:auto;min-width:60%;max-width:calc(100% - 68px);max-height:298px;font-size:18px!important;white-space:nowrap;background-color:#fff;scrollbar-color:#487baf rgba(0,0,0,.25);scrollbar-width:thin}` + `#${defCon.id.fontList} .${defCon.class.selectFontId} dl::-webkit-scrollbar{width:10px;height:1px}#${defCon.id.fontList} .${defCon.class.selectFontId} dl::-webkit-scrollbar-thumb{box-shadow:inset 0 0 5px #67a5df;background:#487baf;border-radius:10px}#${defCon.id.fontList} .${defCon.class.selectFontId} dl::-webkit-scrollbar-track{box-shadow:inset 0 0 5px #67a5df;background:#efefef;border-radius:10px}#${defCon.id.fontList} .${defCon.class.selectFontId} dl::-webkit-scrollbar-track-piece{box-shadow:inset 0 0 5px #67a5df;background:#efefef;border-radius:10px}#${defCon.id.fontList} .${defCon.class.selectFontId} dl dd{display:block;box-sizing:content-box;text-overflow:ellipsis;overflow-x:hidden;margin:1px 8px;padding:5px 0;font-weight:400;font-size:21px!important;min-width:100%;max-width:100%;width:-moz-available;width:-webkit-fill-available}#${defCon.id.fontList} .${defCon.class.selectFontId} dl dd:hover{box-sizing:content-box;text-overflow:ellipsis;overflow-x:hidden;min-width:-moz-available;min-width:-webkit-fill-available;background-color:#67a5df;color:#fff}` + `.${defCon.class.checkbox}{display:none!important}.${defCon.class.checkbox}+label{cursor:pointer;padding:0;margin:0 2px 0 0;border-radius:7px;display:inline-block;position:relative;background:#f7836d;width:76px;height:32px;box-shadow:inset 0 0 20px rgba(0,0,0,.1),0 0 10px rgba(245,146,146,.4);white-space:nowrap;box-sizing:content-box}.${defCon.class.checkbox}+label::before{position:absolute;top:0;left:0;z-index:99;border-radius:7px;width:24px;height:32px;color:#fff;background:#fff;box-shadow:0 0 1px rgba(0,0,0,.6);content:" "}.${defCon.class.checkbox}+label::after{position:absolute;top:0;left:28px;border-radius:100px;padding:5px;font-size:16px;font-weight:700;font-style:normal;color:#fff;content:"OFF"}.${defCon.class.checkbox}:checked+label{cursor:pointer;margin:0 2px 0 0;background:#67a5df!important;box-shadow:inset 0 0 20px rgba(0,0,0,.1),0 0 10px rgba(146,196,245,.4)}.${defCon.class.checkbox}:checked+label::after{content:"ON";left:10px}.${defCon.class.checkbox}:checked+label::before{content:" ";position:absolute;z-index:99;left:52px}#${defCon.id.fface} label,#${defCon.id.fface}+label::after,#${defCon.id.fface}+label::before,#${defCon.id.smooth} label,#${defCon.id.smooth}+label::after,#${defCon.id.smooth}+label::before{-webkit-transition:all .3s ease-in;transition:all .3s ease-in}` + `#${defCon.id.fontShadow} div.${defCon.class.flex}:before,#${defCon.id.fontShadow} div.${defCon.class.flex}:after,#${defCon.id.fontStroke} div.${defCon.class.flex}:before,#${defCon.id.fontStroke} div.${defCon.class.flex}:after,#${defCon.id.fontSize} div.${defCon.class.flex}:before,#${defCon.id.fontSize} div.${defCon.class.flex}:after{display:none}#${defCon.id.fontShadow} #${defCon.id.shadowSize},#${defCon.id.fontStroke} #${defCon.id.strokeSize},#${defCon.id.fontSize} #${defCon.id.fontZoom}{color:#111!important;width:56px!important;text-indent:0;margin:0 10px 0 0!important;height:32px!important;font-size:17px!important;font-weight:400!important;font-family:Impact,Times,serif!important;border:#67a5df 2px solid!important;border-radius:4px;outline:none!important;text-align:center;box-sizing:content-box;padding:0;background:#fafafa!important}#${defCon.id.fontStroke} #${defCon.id.fstroke}>label{margin:0!important;padding:0 0 0 2px!important;font-size:12px!important;color:#666!important;float:none!important;display:inline!important;cursor:help!important}#${defCon.id.fixStroke}{-webkit-appearance:checkbox!important;vertical-align:text-bottom;display:inline-block;height:14px!important;width:14px!important;cursor:pointer;margin:0 2px 0 0!important}#${defCon.id.fixStroke}::after{position:relative;top:0;width:14px;height:14px;display:inline-block;padding:0;margin:0;text-align:center;vertical-align:top;content:'×';color:#fff;font-size:12px;font-weight:700;line-height:14px;background-color:#aaa;border-radius:3px}#${defCon.id.fixStroke}:checked::after{content:"✓";color:#fff;font-size:12px;font-weight:700;line-height:14px;background-color:#65a0db;border:0!important}.${defCon.class.flex}{display:flex;align-items:center;justify-content:space-between;flex-wrap:nowrap;flex-direction:row;width:auto;min-width:100%}.${defCon.class.slider} input{visibility:hidden}#${defCon.id.shadowColor} *{box-sizing:content-box}#${defCon.id.shadowColor} .${defCon.class.frColorPicker}{width:auto;margin:0;padding:0}#${defCon.id.shadowColor} .${defCon.class.frColorPicker} #${defCon.id.color}{width:160px!important;min-width:160px;height:35px!important;text-indent:0;font-size:18px!important;font-weight:400!important;background:#fdfdffb0;box-sizing:border-box;font-family:Impact,Times,serif!important;color:#333!important;border:#67a5df 2px solid!important;border-radius:4px;outline:none!important;padding: 0 8px 0 0;margin:0;text-align:center;cursor:pointer}` + `#${defCon.id.fontCSS} textarea,#${defCon.id.fontEx} textarea{cursor:auto;font:bold 14px/150% "Roboto Mono",Monaco,"Courier New",Consolas,monospace,'Microsoft YaHei UI',system-ui,-apple-system,BlinkMacSystemFont!important;min-width:calc(100% - 2px);max-width:calc(100% - 2px);width:calc(100% - 2px)!important;height:78px;min-height:78px;max-height:78px;resize:none;border:2px solid #67a5df!important;border-radius:6px;outline:none!important;box-sizing:border-box;padding:5px;margin:0;color:#0b5b9c!important;word-break:break-all;scrollbar-color:#487baf rgba(0,0,0,.25);scrollbar-width:thin;overscroll-behavior:contain}#${defCon.id.fontCSS} textarea::-webkit-scrollbar{width:6px;height:1px}#${defCon.id.fontCSS} textarea::-webkit-scrollbar-thumb{box-shadow:inset 0 0 2px #67a5df;background:#487baf;border-radius:10px}#${defCon.id.fontCSS} textarea::-webkit-scrollbar-track{box-shadow:inset 0 0 2px rgba(0,0,0,.2);background:#efefef;border-radius:10px}#${defCon.id.fontCSS} textarea::-webkit-scrollbar-track-piece{box-shadow:inset 0 0 2px #67a5df;background:#efefef;border-radius:10px}#${defCon.id.fontEx} textarea{background:#fafafa!important}#${defCon.id.fontEx} textarea::-webkit-scrollbar{width:6px;height:1px}#${defCon.id.fontEx} textarea::-webkit-scrollbar-thumb{box-shadow:inset 0 0 2px #67a5df;background:#487baf;border-radius:10px}#${defCon.id.fontEx} textarea::-webkit-scrollbar-track{box-shadow:inset 0 0 2px #67a5df;background:#efefef;border-radius:10px}#${defCon.id.fontEx} textarea::-webkit-scrollbar-track-piece{box-shadow:inset 0 0 2px #67a5df;background:#efefef;border-radius:10px}.${defCon.class.switch}{box-sizing:border-box;float:right;margin:-2px 4px 0 0;padding:0 6px;border:2px double #67a5df;color:#0a68c1;border-radius:4px}#${defCon.id.cSwitch}:hover,#${defCon.id.eSwitch}:hover{cursor:pointer;-webkit-user-select:none;user-select:none}.${defCon.class.readonly}{background:linear-gradient(45deg,#ffe9e9 0,#ffe9e9 25%,transparent 25%,transparent 50%,#ffe9e9 50%,#ffe9e9 75%,transparent 75%,transparent)!important;background-size:50px 50px!important;background-color:#fff7f7!important}.${defCon.class.notreadonly}{background:linear-gradient(45deg,#e9ffe9 0,#e9ffe9 25%,transparent 25%,transparent 50%,#e9ffe9 50%,#e9ffe9 75%,transparent 75%,transparent)!important;background-size:50px 50px;background-color:#f7fff7!important}` + `.${defCon.class.dbm} textarea{scrollbar-width:thin;overscroll-behavior:contain;cursor:auto}.${defCon.class.dbm} textarea::-webkit-scrollbar{width:8px;height:8px}.${defCon.class.dbm} textarea::-webkit-scrollbar-corner{box-shadow:inset 0 0 3px #aaa;background:#efefef;border-radius:2px}.${defCon.class.dbm} textarea::-webkit-scrollbar-thumb{box-shadow:inset 0 0 5px #999;background:#cfcfcf;border-radius:2px}.${defCon.class.dbm} textarea::-webkit-scrollbar-track{box-shadow:inset 0 0 5px #aaa;background:#efefef;border-radius:2px}.${defCon.class.dbm} textarea::-webkit-scrollbar-track-piece{box-shadow:inset 0 0 5px #aaa;background:#efefef;border-radius:2px}` + `#${defCon.id.submit} button{box-sizing:border-box;background-image:initial;background-color:#67a5df;color:#fff!important;margin:0;padding:5px 10px;cursor:pointer;border:2px solid #6ba7e0;border-radius:6px;width:auto;min-width:min-content;min-height:35px;height:35px;font:normal 600 14px/150% "Microsoft YaHei UI",system-ui,-apple-system,BlinkMacSystemFont,sans-serif!important}#${defCon.id.submit} button:hover{box-shadow:0 0 5px rgba(0,0,0,.4)!important}#${defCon.id.submit} .${defCon.class.cancel},#${defCon.id.submit} .${defCon.class.reset}{float:left;margin-right:10px}#${defCon.id.submit} .${defCon.class.submit}{float:right}#${defCon.id.submit} #${defCon.id.backup}{margin:0 10px 0 0;display:none}.${defCon.class.anim}{animation:jiggle 1.8s ease-in infinite;border:2px solid crimson!important;background:crimson!important}@keyframes jiggle{48%,62%{transform:scale(1,1)}50%{transform:scale(1.1,.9)}56%{transform:scale(.9,1.1) translate(0,-5px)}59%{transform:scale(1,1) translate(0,-3px)}}` ); const fontStyle_tooltip = String( `.${defCon.class.tooltip}{position:relative;cursor:help;-webkit-user-select:none;user-select:none}.${defCon.class.tooltip} span.${defCon.class.emoji}{font-weight:400!important}.${defCon.class.tooltip}:active .${defCon.class.tooltip}{display:block}.${defCon.class.tooltip} .${defCon.class.tooltip}{display:none;box-sizing:content-box;position:absolute;z-index:999999;border:2px solid #b8c4ce;border-radius:6px;padding:10px;width:234px;max-width:234px;font-weight:400;color:#fff;background-color:#54a2ec;opacity:.9;word-break:break-all}.${defCon.class.tooltip} .${defCon.class.tooltip} *{font-family:"Microsoft YaHei UI",system-ui,-apple-system,BlinkMacSystemFont,sans-serif!important;font-size:14px!important}.${defCon.class.tooltip} .${defCon.class.tooltip} em{font-style:normal!important}.${defCon.class.tooltip} .${defCon.class.tooltip} strong{color:darkorange;font-size:18px!important}.${defCon.class.tooltip} .${defCon.class.tooltip} p{color:#fff;display:block;margin:0 0 10px 0;line-height:150%;text-indent:0!important}.${defCon.class.ps1}{position:relative;top:-33px;height:0;width:24px;margin:0;padding:0;right:5px;float:right}.${defCon.class.ps2}{top:35px;right:-7px}.${defCon.class.ps3}{top:-197px;margin-left:-3px}.${defCon.class.ps4}{top:-322px;margin-left:-3px}` ); const fontStyle_Progress = String( `.${defCon.class.range}{--primary-color:#67a5df;--value-offset-y:var(--ticks-gap);--value-active-color:white;--value-background:transparent;--value-background-hover:var(--primary-color);--value-font:italic bold 14px/14px monospace,serif;--fill-color:var(--primary-color);--progress-background:rgb(223, 223, 223);--progress-radius:20px;--show-min-max:none;--track-height:calc(var(--thumb-size) / 2);--min-max-font:12px serif;--min-max-opacity:0.5;--min-max-x-offset:10%;--thumb-size:22px;--thumb-color:white;--thumb-shadow:0 0 3px rgba(0, 0, 0, 0.4),0 0 1px rgba(0, 0, 0, 0.5) inset,0 0 0 99px var(--thumb-color) inset;--thumb-shadow-active:0 0 0 calc(var(--thumb-size) / 4) inset var(--thumb-color),0 0 0 99px var(--primary-color) inset,0 0 3px rgba(0, 0, 0, 0.4);--thumb-shadow-hover:0 0 0 calc(var(--thumb-size) / 4) inset var(--thumb-color),0 0 0 99px darkorange inset,0 0 3px rgba(0, 0, 0, 0.4);--ticks-thickness:1px;--ticks-height:5px;--ticks-gap:var(--ticks-height, 0);--ticks-color:transparent;--step:1;--ticks-count:(var(--max) - var(--min))/var(--step);--maxTicksAllowed:1000;--too-many-ticks:Min(1, Max(var(--ticks-count) - var(--maxTicksAllowed), 0));--x-step:Max(var(--step), var(--too-many-ticks) * (var(--max) - var(--min)));--tickIntervalPerc_1:Calc((var(--max) - var(--min)) / var(--x-step));--tickIntervalPerc:calc((100% - var(--thumb-size)) / var(--tickIntervalPerc_1) * var(--tickEvery, 1));--value-a:Clamp(var(--min), var(--value, 0), var(--max));--value-b:var(--value, 0);--text-value-a:var(--text-value, "");--completed-a:calc((var(--value-a) - var(--min)) / (var(--max) - var(--min)) * 100);--completed-b:calc((var(--value-b) - var(--min)) / (var(--max) - var(--min)) * 100);--ca:Min(var(--completed-a), var(--completed-b));--cb:Max(var(--completed-a), var(--completed-b));--thumbs-too-close:Clamp(-1, 1000 * (Min(1, Max(var(--cb) - var(--ca) - 5, -1)) + 0.001), 1);--thumb-close-to-min:Min(1, Max(var(--ca) - 5, 0));--thumb-close-to-max:Min(1, Max(95 - var(--cb), 0))}` + `.${defCon.class.range}{width:auto;min-width:105%!important;margin:-3px 0 0 -7px;box-sizing:content-box;display:inline-block;height:Max(var(--track-height),var(--thumb-size));background:linear-gradient(to right,var(--ticks-color) var(--ticks-thickness),transparent 1px) repeat-x;background-size:var(--tickIntervalPerc) var(--ticks-height);background-position-x:calc(var(--thumb-size)/ 2 - var(--ticks-thickness)/ 2);background-position-y:var(--flip-y,bottom);padding-bottom:var(--flip-y,var(--ticks-gap));padding-top:calc(var(--flip-y) * var(--ticks-gap));position:relative;z-index:1}.${defCon.class.range}[data-ticks-position=top]{--flip-y:1}.${defCon.class.range}::after,.${defCon.class.range}::before{--offset:calc(var(--thumb-size) / 2);content:counter(x);display:var(--show-min-max,block);font:var(--min-max-font);position:absolute;bottom:var(--flip-y,-2.5ch);top:calc(-2.5ch * var(--flip-y));opacity:Clamp(0,var(--at-edge),var(--min-max-opacity));transform:translateX(calc(var(--min-max-x-offset) * var(--before,-1) * -1)) scale(var(--at-edge));pointer-events:none}.${defCon.class.range}::before{--before:1;--at-edge:var(--thumb-close-to-min);counter-reset:x var(--min);left:var(--offset)}.${defCon.class.range}::after{--at-edge:var(--thumb-close-to-max);counter-reset:x var(--max);right:var(--offset)}` + `.${defCon.class.rangeProgress}{--start-end:calc(var(--thumb-size) / 2);--clip-end:calc(100% - (var(--cb)) * 1%);--clip-start:calc(var(--ca) * 1%);--clip:inset(-20px var(--clip-end) -20px var(--clip-start));position:absolute;left:var(--start-end);right:var(--start-end);top:calc(var(--ticks-gap) * var(--flip-y,0) + var(--thumb-size)/ 2 - var(--track-height)/ 2);height:calc(var(--track-height));background:var(--progress-background,#eee);pointer-events:none;z-index:-1;border-radius:var(--progress-radius)}.${defCon.class.rangeProgress}::before{content:"";position:absolute;left:0;right:0;clip-path:var(--clip);top:0;bottom:0;background:var(--fill-color,#000);box-shadow:var(--progress-flll-shadow);z-index:1;border-radius:inherit}.${defCon.class.rangeProgress}::after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;box-shadow:var(--progress-shadow);pointer-events:none;border-radius:inherit}.${defCon.class.range}>input:only-of-type~.${defCon.class.rangeProgress}{--clip-start:0}` + `.${defCon.class.range}>input{-webkit-appearance:none;box-shadow:initial!important;width:100%;height:var(--thumb-size)!important;margin:0!important;padding:0!important;position:absolute!important;left:0;top:calc(50% - Max(var(--track-height),var(--thumb-size))/ 2 + calc(var(--ticks-gap)/ 2 * var(--flip-y,-1)))!important;border:0!important;cursor:grab;outline:0!important;background:0 0!important;--thumb-shadow:var(--thumb-shadow-active)}.${defCon.class.range}>input:not(:only-of-type){pointer-events:none}.${defCon.class.range}>input::-webkit-slider-thumb{appearance:none;border:none;height:var(--thumb-size);width:var(--thumb-size);transform:var(--thumb-transform);border-radius:var(--thumb-radius,50%);background:var(--thumb-color);box-shadow:var(--thumb-shadow);pointer-events:auto;transition:.1s}.${defCon.class.range}>input::-moz-range-thumb{appearance:none;border:none;height:var(--thumb-size);width:var(--thumb-size);transform:var(--thumb-transform);border-radius:var(--thumb-radius,50%);background:var(--thumb-color);box-shadow:var(--thumb-shadow);pointer-events:auto;transition:.1s}.${defCon.class.range}>input::-ms-thumb{appearance:none;border:none;height:var(--thumb-size);width:var(--thumb-size);transform:var(--thumb-transform);border-radius:var(--thumb-radius,50%);background:var(--thumb-color);box-shadow:var(--thumb-shadow);pointer-events:auto;transition:.1s}` + `.${defCon.class.range}>input:hover{--thumb-shadow:var(--thumb-shadow-active)}.${defCon.class.range}>input:hover+output{--value-background:var(--value-background-hover);--y-offset:-1px;color:var(--value-active-color);box-shadow:0 0 0 3px var(--value-background)}.${defCon.class.range}>input:active{--thumb-shadow:var(--thumb-shadow-hover);cursor:grabbing;z-index:2}.${defCon.class.range}>input:active+output{transition:0s;opacity:0.9;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-pack:center;-webkit-box-align:center;-moz-box-orient:horizontal;-moz-box-pack:center;-moz-box-align:center}.${defCon.class.range}>input:nth-of-type(1){--is-left-most:Clamp(0, (var(--value-a) - var(--value-b)) * 99999, 1)}.${defCon.class.range}>input:nth-of-type(1)+output{--value:var(--value-a);--x-offset:calc(var(--completed-a) * -1%)}.${defCon.class.range}>input:nth-of-type(1)+output:not(:only-of-type){--flip:calc(var(--thumbs-too-close) * -1)}.${defCon.class.range}>input:nth-of-type(1)+output::after{content:var(--prefix, "") var(--text-value-a) var(--suffix, "")}.${defCon.class.range}>input:nth-of-type(2){--is-left-most:Clamp(0, (var(--value-b) - var(--value-a)) * 99999, 1)}.${defCon.class.range}>input:nth-of-type(2)+output{--value:var(--value-b)}.${defCon.class.range}>input+output{--flip:-1;--x-offset:calc(var(--completed-b) * -1%);--pos:calc(((var(--value) - var(--min)) / (var(--max) - var(--min))) * 100%);pointer-events:none;width:auto;min-width:40px;height:24px;min-height:24px;text-align:center;position:absolute;z-index:5;background:var(--value-background);border-radius:4px;padding:0 6px;left:var(--pos);transform:translate(var(--x-offset),calc(150% * var(--flip) - (var(--y-offset,0) + var(--value-offset-y)) * var(--flip)));transition:all .12s ease-out,left 0s;opacity:0;box-sizing:content-box}.${defCon.class.range}>input+output::after{content:var(--prefix, "") var(--text-value-b) var(--suffix, "");font:var(--value-font)}` ); const fontCss = fontStyle_db + fontStyle_container + fontStyle_tooltip + fontStyle_Progress; const tFontSizeHTML = String( `阴影颜色可通过点击色块激活拾色器选择,也可自定义填写,格式支持: RGB, RGBA, HEX, HEXA. 纯白色的所有格式表示自身颜色 currentcolor.
注意\uff1a输入数值会自动转化为HEXA格式,但数值保持一致性。错误格式会被替换为刚刚正确显示的数值。
默认为排除大多数网站常用的特殊CSS样式后需要渲染的页面元素。填写格式\uff1a:not(.fa) 或 :not([class*="fa"]) 或 ,#idname .classname
该选项为重要参数,默认只读,双击解锁。请尽量不要修改,避免造成样式失效。若失效请重置。
该选项排除渲染字体描边、字体阴影效果,请将排除渲染的HTML标签用逗号分隔。具体规则请点击顶部旋转的帮助文件图标。
编辑该选项需要CSS知识,如需要排除复杂的样式或标签可通过这里进行添加,样式若混乱请重置。
双击\ud83d\udd14可打开自定义等宽字体的添加工具,设置您需要的等宽字体集合。
注意:如需使用自定义等宽字体,请勿清除该文本域中相关的关键代码:『 pre,pre *,code,code * 』
${CUR_HOST_NAME}
该域名下所有页面将被禁止字体渲染\uff01
确定后当前页面将自动刷新,请确认是否排除?
`, titleText: "禁止字体渲染", }); if (await frDialog.respond()) { _exSite = await GMgetValue("_Exclude_site_"); try { exSite = _exSite ? [...JSON.parse(defCon.decrypt(_exSite))] : defExSite; } catch (e) { error("exSite.JSON.parse:", e.message); exSite = defExSite; } exSite.push(CUR_HOST_NAME); saveData("_Exclude_site_", exSite); closeConfigurePage({ isReload: true }); } frDialog = null; }, vipConfigure: async () => { configure = await GMgetValue("_configure_"); try { _config_data_ = JSON.parse(defCon.decrypt(configure)); } catch (e) { error("_config_data_.JSON.parse:", e.message); _config_data_ = {}; } isBackupFunction = Boolean(_config_data_.isBackupFunction); isPreview = Boolean(_config_data_.isPreview); isFontsize = isGM ? false : Boolean(_config_data_.isFontsize); isHotkey = Boolean(typeof _config_data_.isHotkey !== "undefined" ? _config_data_.isHotkey : true); isCloseTip = Boolean(_config_data_.isCloseTip); maxPersonalSites = Number(_config_data_.maxPersonalSites) || 100; closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "保存数据", falseButtonText: "帮助文件", neutralButtonText: "取 消", messageText: String( `字体列表全局缓存已重建,当前页面即将刷新\uff01
`, titleText: "字体列表全局缓存已重建", }); cache.remove("_FontCheckList_"); if (await frDialog.respond()) { closeConfigurePage({ isReload: true }); } frDialog = null; }); qS(`#${defCon.id.feedback}`).addEventListener("click", () => { GMopenInTab(FEEDBACK_URI, defCon.options); }); qA(`#${defCon.id.isbackup}, #${defCon.id.ispreview}, #${defCon.id.isfontsize}, #${defCon.id.ishotkey}, #${defCon.id.isclosetip}, #${defCon.id.maxps}`).forEach(items => { items.addEventListener("change", () => { _bk = Boolean(qS(`#${defCon.id.isbackup}`).checked); _pv = Boolean(qS(`#${defCon.id.ispreview}`).checked); _fs = Boolean(qS(`#${defCon.id.isfontsize}`).checked); _hk = Boolean(qS(`#${defCon.id.ishotkey}`).checked); _ct = Boolean(qS(`#${defCon.id.isclosetip}`).checked); _mps = Number(qS(`#${defCon.id.maxps}`).value) || 100; }); }); if (await frDialog.respond()) { _config_data_.isBackupFunction = _bk; _config_data_.isPreview = _pv; _config_data_.isFontsize = isGM ? false : _fs; _config_data_.isHotkey = _hk; _config_data_.isCloseTip = _ct; _config_data_.maxPersonalSites = _mps; saveData("_configure_", _config_data_); closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "确 定", messageText: `
高级核心功能参数已成功保存,当前页面即将刷新\uff01
`, titleText: "高级核心功能设置保存", }); if (await frDialog.respond()) { closeConfigurePage({ isReload: true }); } frDialog = null; } else { GMopenInTab(`${HOST_URI}#warning`, defCon.options); } frDialog = null; }, includeSites: async () => { closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "确 定", neutralButtonText: "取 消", messageText: `${CUR_HOST_NAME}
该域名下所有页面将重新进行字体渲染\uff01
确定后当前页面将自动刷新,请确认是否恢复?
`, titleText: "恢复字体渲染", }); if (await frDialog.respond()) { _exSite = await GMgetValue("_Exclude_site_"); try { exSite = _exSite ? [...JSON.parse(defCon.decrypt(_exSite))] : defExSite; } catch (e) { error("exSite.JSON.parse:", e.message); exSite = defExSite; } defCon.exSitesIndex = updateExsitesIndex(exSite); exSite.splice(defCon.exSitesIndex, 1); saveData("_Exclude_site_", exSite); closeConfigurePage({ isReload: true }); } frDialog = null; }, }; if (CUR_WINDOW_TOP) { sleep(1e3, { useCachedSetTimeout: true })(2e3) .then(async r => { const fontReady = await isFontReady(r); debug("\u27A4 isFontReady:", Boolean(fontReady), parseInt(fontReady)); return fontReady; }) .then(font_Ready => { let font_Set, exclude_site, parameter_Set, feed_Back; loading ? GMunregisterMenuCommand(loading) : debug("\u27A4 %cNo Loading_Menu", "color:grey"); if (font_Ready) { if (typeof defCon.exSitesIndex === "undefined") { font_Set ? GMunregisterMenuCommand(font_Set) : debug("\u27A4 %cInstalling Font_Set_Menu", "color:gray"); font_Set = GMregisterMenuCommand(`\ufff2\ud83c\udf13 字体渲染设置${isHotkey ? "(" + String.fromCharCode(IS_MACOS ? 69 : 80) + ")" : ""}`, () => { addAction.setConfigure(); }); exclude_site ? GMunregisterMenuCommand(exclude_site) : debug("\u27A4 %cInstalling Exclude_site_Menu", "color:gray"); exclude_site = GMregisterMenuCommand(`\ufff3\u26d4 排除渲染 ${CUR_HOST_NAME} ${isHotkey ? "(" + String.fromCharCode(IS_MACOS ? 71 : 88) + ")" : ""}`, () => { addAction.excludeSites(); }); parameter_Set ? GMunregisterMenuCommand(parameter_Set) : debug("\u27A4 %cInstalling Parameter_Set_Menu", "color:gray"); parameter_Set = GMregisterMenuCommand(`\ufff7\ud83d\udc8e 高级核心功能设置${isHotkey ? "(" + String.fromCharCode(IS_MACOS ? 74 : 71) + ")" : ""}`, () => { addAction.vipConfigure(); }); } else { exclude_site ? GMunregisterMenuCommand(exclude_site) : debug("\u27A4 %cInstalling Exclude_site_Menu", "color:gray"); exclude_site = GMregisterMenuCommand(`\ufff2\ud83c\udf40 重新渲染 ${CUR_HOST_NAME} ${isHotkey ? "(" + String.fromCharCode(IS_MACOS ? 71 : 88) + ")" : ""}`, () => { addAction.includeSites(); }); feed_Back ? GMunregisterMenuCommand(feed_Back) : debug("\u27A4 %cInstalling Feed_Back_Menu", "color:gray"); feed_Back = GMregisterMenuCommand(`\ufff9\ud83e\udde1 向作者反馈问题或建议${isHotkey ? "(" + String.fromCharCode(IS_MACOS ? 85 : 84) + ")" : ""}`, () => { GMopenInTab(FEEDBACK_URI, defCon.options); }); } } else { loading = GMregisterMenuCommand(`\ufff0\ud83c\udf13 单击重新载入脚本菜单`, () => { location.reload(true); }); } }) .catch(e => { error("MenusInsert:", e.message); }); } /* hotkey setting */ if (isHotkey && CUR_WINDOW_TOP) { document.addEventListener("keydown", e => { const ekey = (IS_MACOS ? e.metaKey : e.altKey) && !e.ctrlKey && !e.shiftKey; if (e.keyCode === (IS_MACOS ? 69 : 80) && ekey) { e.preventDefault(); if (Date.now() - defCon.clickTimer > 1e3) { defCon.clickTimer = Date.now(); if (typeof defCon.exSitesIndex === "undefined") { addAction.setConfigure(); } else { addAction.includeSites(); } } } if (e.keyCode === (IS_MACOS ? 71 : 88) && ekey) { e.preventDefault(); if (Date.now() - defCon.clickTimer > 1e3) { defCon.clickTimer = Date.now(); if (typeof defCon.exSitesIndex === "undefined") { addAction.excludeSites(); } else { addAction.includeSites(); } } } if (e.keyCode === (IS_MACOS ? 74 : 71) && ekey) { e.preventDefault(); if (Date.now() - defCon.clickTimer > 1e3) { defCon.clickTimer = Date.now(); if (typeof defCon.exSitesIndex === "undefined") { addAction.vipConfigure(); } else { addAction.includeSites(); } } } if (e.keyCode === (IS_MACOS ? 85 : 84) && ekey) { e.preventDefault(); if (Date.now() - defCon.clickTimer > 10e3) { defCon.clickTimer = Date.now(); GMopenInTab(FEEDBACK_URI, defCon.options); } } }); } /* important Functions */ function insertHTML() { try { setRAFInterval( () => { if (!qS(`fr-configure`)) { let section = cE("fr-configure"); section.id = defCon.id.rndId; section.innerHTML = trustedTypesPolicy.createHTML(tHTML); document.body.appendChild(section); section = null; } return Boolean(qS(`fr-configure`)); }, 100, { runNow: true } ); } catch (e) { error("InsertHTML:", e.message); } } function insertCSS() { try { addStyle(tCSS, `${defCon.class.rndClass}`, document.head, "TC", { isReload: false }); } catch (e) { error("InsertCSS:", e.message); } } function insertStyle({ isReload } = {}) { try { addStyle(tStyle, `${defCon.class.rndStyle}`, document.head, "TS", { isReload }); } catch (e) { error("InsertStyle:", e.message); } } function shouldMoveStyle(element) { return ( (element instanceof HTMLStyleElement || (element instanceof HTMLLinkElement && element.rel && element.rel.toLowerCase().includes("stylesheet") && !element.disabled)) && element.media.toLowerCase() !== "print" && !element.classList.contains(defCon.class.rndStyle) && !element.classList.contains("darkreader") ); } function moveStyleTolastChild({ isMutationObserver }) { try { if (isMutationObserver) { if (qA("style[id^='TC']", document.head).length > 1) { if (!defCon.scriptCount) { console.error(`[Redundant Scripts]:\n发现冗余安装的『${defCon.scriptName}』,请访问 ${FEEDBACK_URI}/117 排查错误。`); !safeRemove("style[id^='TC']", document.head) && insertCSS(); sleep(5e2)((defCon.scriptCount = true)).then(r => { if (qA("style[id^='TC']", document.head).length > 1) { defCon.errors.push( `[Redundant Scripts]: 发现冗余安装的『${defCon.scriptName}』,请按 此清单#117 排查错误。刷新页面后如问题依旧,向作者反馈错误!` ); reportErrorToAuthor(defCon.errors, r); } }); } } else if (qA("style[id^='TS']", document.head).length > 0) { insertStyle({ isReload: true }); count(`\u27A4 [MOVESTYLE][c:${getAsyncStyleNode(document.head).className}]`); } } else { addLoadEvents(() => { sleep(2e3, { useCachedSetTimeout: true }) .then(() => { qS(`.${defCon.class.rndStyle}`) ? qS(`.${defCon.class.rndStyle}`).nextElementSibling && shouldMoveStyle(getAsyncStyleNode(document.head)) && insertStyle({ isReload: true }) : insertStyle({ isReload: false }); return getAsyncStyleNode(document.head).className || "以下文本域可按预定格式增加自定义字体。请用小贴士或按样例填写,输入有误将被自动过滤。与『内置字体表』重复的字体将被自动剔除。【功能小贴士\uff1a字体添加辅助工具】
(请勿添加过多自定义字体,避免造成页面加载缓慢)
`, titleText: "自定义字体表", }); custom_Fontlist = qS(`#${RANDOM_ID}_custom_Fontlist`).value.trim(); qS(`#${RANDOM_ID}_addTools`).addEventListener("click", () => { let chName, enName, psName, cusFontName; chName = prompt( "请输入「中文字体家族名称」\uff1a\n(例如\uff1a鸿蒙黑体,仅支持半角输入模式,包括中文、日文、韩文、英文,数字、小数点、减号、下划线、空格、@)", "鸿蒙黑体" ); if (chName === null) { return; } else if (/^@?[a-zA-Z0-9\u2E80-\uD7FF,\-_.(( !/))]+$/.test(chName.trim())) { enName = prompt( "请输入「英文字体家族名称」\uff1a\n(例如\uff1aHarmonyOS Sans SC,仅支持半角输入模式,包括英文、数字、小数点、减号、下划线、空格、@)", "HarmonyOS Sans SC" ); if (enName === null) { return; } else if (/^@?[a-zA-Z0-9,\-_.( !/)]+$/.test(enName.trim())) { psName = prompt( "请输入「PostScript名称」\uff1a\n(为使新增字体全局生效,请尽量填写PostScript名称。如您暂时无法提供PostScript名称,可留空)(查询请访问Fontke.com)", "" ); if (psName === null) { return; } else if (/^[a-zA-Z0-9\u2E80-\uD7FF,\-_.@!&=?|+~ ]+$/.test(psName.trim())) { cusFontName = `{"ch":"${chName.trim()}","en":"${enName.trim()}","ps":"${psName.trim()}"}`; } else { cusFontName = `{"ch":"${chName.trim()}","en":"${enName.trim()}"}`; } const aTrim = qS(`#${RANDOM_ID}_custom_Fontlist`).value.trim() ? "\n" : ""; qS(`#${RANDOM_ID}_custom_Fontlist`).value = qS(`#${RANDOM_ID}_custom_Fontlist`).value.trim().concat(aTrim, cusFontName, "\n"); custom_Fontlist = qS(`#${RANDOM_ID}_custom_Fontlist`).value.trim(); } else { alert("英文字体家族名称 格式输入错误\uff01"); } } else { alert("中文字体家族名称 格式输入错误\uff01"); } }); qS(`#${RANDOM_ID}_custom_Fontlist`).addEventListener("change", function () { this.value = convertFullToHalf(this.value) .replace(/'|`|·|“|”|‘|’/g, `"`) .replace(/,/g, `,`) .replace(/:/g, `:`); custom_Fontlist = this.value.trim(); }); if (await frDialog.respond()) { const fontListArray = custom_Fontlist.match( /{\s*"ch":\s*"@?[a-zA-Z0-9\u2E80-\uD7FF,\-_.(( !/))]+"\s*,\s*"en":\s*"@?[a-zA-Z0-9,\-_.( !/)]+"\s*(,\s*"ps":\s*"[a-zA-Z0-9\u2E80-\uD7FF,\-_.@!&=?|+~ ]+"\s*)?}/g ); if (!custom_Fontlist.length) { GMdeleteValue("_Custom_fontlist_"); closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "确 定", messageText: `自定义字体表已初始化成功\uff01
字体列表全局缓存已自动重建,当前页面即将刷新。
`, titleText: "自定义字体数据重置", }); cache.remove("_FontCheckList_"); if (await frDialog.respond()) { closeConfigurePage({ isReload: true }); } frDialog = null; } else if (Array.isArray(fontListArray) && fontListArray.length > 0) { fontListArray.forEach(item => { save_Fontlist.push(JSON.parse(item)); }); const unique_Save_Fontlist = getUniqueValues(save_Fontlist); saveData("_Custom_fontlist_", getDeduplicatedValues(unique_Save_Fontlist, fontCheck)); closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "确 定", messageText: `您所提交的自定义字体已保存成功\uff01
字体列表全局缓存已自动重建,当前页面即将刷新。
注:格式错误或重复的字体代码将被自动过滤。
`, titleText: "自定义字体数据保存", }); cache.remove("_FontCheckList_"); if (await frDialog.respond()) { closeConfigurePage({ isReload: true }); } frDialog = null; } else { closeAllFrDialogBox(`#${defCon.id.dialogbox}`); copyToClipboard(custom_Fontlist); frDialog = new FrDialogBox({ trueButtonText: "确 定", messageText: `您所提交的自定义字体数据格式有误,请重新输入。
注意:先前提交的信息已自动保存至剪切板中。
`, titleText: "字体表数据格式错误", }); if (await frDialog.respond()) { let clickEvent = new Event("dblclick", { bubbles: true, cancelable: false }); qS(`#${defCon.id.fonttooltip}`).dispatchEvent(clickEvent); clickEvent = null; } frDialog = null; } } else { GMopenInTab(`${HOST_URI}#custom`, defCon.options); } frDialog = null; }); } } catch (e) { defCon.errors.push(`[Fonts selection]: ${e}`); error("Fonts selection:", e.message); } /* selector placeholder style */ const ffaceT = qS(`#${defCon.id.fface}`); const inputFont = qS(`#${defCon.id.fontList} .${defCon.class.selectFontId} input`); await getCurrentFontName(CONST_VALUES.fontFace, defCon.refont, DEFAULT_FONT); if (ffaceT && inputFont) { ffaceT.addEventListener("change", async () => { await getCurrentFontName(CONST_VALUES.fontFace, defCon.refont, DEFAULT_FONT); if (ffaceT.checked && !CONST_VALUES.fontFace) { inputFont.setAttribute("placeholder", `正在恢复之前设置的字体…`); sleep(120).then((submitPreview = qS(`#${defCon.id.submit} .${defCon.class.submit}[v-Preview="true"]`)) => { submitPreview && submitPreview.click(); }); } }); } /* Fonts Face */ const submitButton = qS(`#${defCon.id.submit} .${defCon.class.submit}`); saveChangeStatus(ffaceT, CONST_VALUES.fontFace, submitButton, defCon.values); /* Font Smooth */ const smoothT = qS(`#${defCon.id.smooth}`); saveChangeStatus(smoothT, CONST_VALUES.fontSmooth, submitButton, defCon.values); /* FontSize Zoom */ let drawZoom; const zoom = qS(`#${defCon.id.fontZoom}`); if (defCon.isFontsize) { try { drawZoom = qS(`#${defCon.id.zoomSize}`); zoom.value = CONST_VALUES.fontSize === 1 ? "OFF" : CONST_VALUES.fontSize.toFixed(3); rangeSliderWidget(drawZoom, zoom, 3, true); checkInputValue(zoom, drawZoom, /^[0-1](\.[0-9]{1,3})?$/, 3, true); } catch (e) { defCon.errors.push(`[FontSize Zoom]: ${e}`); error("FontSize Zoom:", e.message); } finally { saveChangeStatus(zoom, CONST_VALUES.fontSize, submitButton, defCon.values, true); } } /* Fonts stroke */ let drawStrock; const stroke = qS(`#${defCon.id.strokeSize}`); try { drawStrock = qS(`#${defCon.id.stroke}`); stroke.value = CONST_VALUES.fontStroke === 0 ? "OFF" : CONST_VALUES.fontStroke.toFixed(3); rangeSliderWidget(drawStrock, stroke, 3); checkInputValue(stroke, drawStrock, /^[0-1](\.[0-9]{1,3})?$/, 3); } catch (e) { defCon.errors.push(`[Fonts stroke]: ${e}`); error("Fonts stroke:", e.message); } finally { saveChangeStatus(stroke, CONST_VALUES.fontStroke, submitButton, defCon.values); } let fixStrokeT; if (IS_REAL_BLINK) { fixStrokeT = qS(`#${defCon.id.fixStroke}`); try { qS(`#${defCon.id.fstroke}`).style.visibility = stroke.value === "OFF" ? "hidden" : "visible"; stroke.addEventListener("change", function () { qS(`#${defCon.id.fstroke}`).style.visibility = this.value === "OFF" ? "hidden" : "visible"; }); } catch (e) { error("fixStroke:", e.message); } finally { saveChangeStatus(fixStrokeT, CONST_VALUES.fixStroke, submitButton, defCon.values); } } /* Fonts shadow */ let drawShadow; const shadows = qS(`#${defCon.id.shadowSize}`); try { drawShadow = qS(`#${defCon.id.shadow}`); shadows.value = CONST_VALUES.fontShadow === 0 ? "OFF" : CONST_VALUES.fontShadow.toFixed(2); rangeSliderWidget(drawShadow, shadows, 2); checkInputValue(shadows, drawShadow, /^[0-8](\.[0-9]{1,2})?$/, 2); qS(`#${defCon.id.shadowColor}`).style.display = shadows.value === "OFF" ? "none" : "flex"; shadows.addEventListener("change", function () { qS(`#${defCon.id.shadowColor}`).style.display = this.value === "OFF" ? "none" : "flex"; }); } catch (e) { defCon.errors.push(`[Fonts shadow]: ${e}`); error("Fonts shadow:", e.message); } finally { saveChangeStatus(shadows, CONST_VALUES.fontShadow, submitButton, defCon.values); } /* Fonts shadow color selection */ let colorPicker = {}; const colorshow = qS(`#${defCon.id.color}`); const colorReg = /^#[0-9A-F]{8}$|^currentcolor$/i; try { colorPicker = new w.frColorPicker(`#${defCon.id.color}`, { value: CONST_VALUES.shadowColor, alpha: 1.0, format: "hexa", previewSize: 35, position: "top", zIndex: 1999999993, backgroundColor: "rgba(206,226,237,0.91)", controlBorderColor: "rgba(187,187,187,0.7)", pointerBorderColor: "rgba(255,255,255,0.6)", borderRadius: 4, padding: 9, width: 186, height: 210, sliderSize: 12, shadow: 0, onChange: function () { colorshow.value = this.toHEXAString() === "#FFFFFFFF" ? "currentcolor" : this.toHEXAString(); colorshow._value_ = colorshow.value; }, }); colorPicker.fromString(CONST_VALUES.shadowColor); const cp = colorPicker.toHEXAString(); const cl = getBrightness(cp.substring(1)) > 182 ? "#333" : "#eee"; colorshow.value = cp === "#FFFFFFFF" ? "currentcolor" : cp; debug( `%c\u27A4 frColorPicker: %c${cp}`, `display:inline-block;padding:5px 0`, `display:inline-block;border:1px solid #eee;border-radius:4px;padding:5px 10px;background-color:${cp};color:${cl}` ); } catch (e) { defCon.errors.push(`[Fonts shadowColor]: ${e}`); error("Fonts shadowColor:", e.message); } finally { saveChangeStatus(colorshow, CONST_VALUES.shadowColor, submitButton, defCon.values); } /* click to selectAll */ qA(`#${defCon.id.fontZoom},#${defCon.id.strokeSize},#${defCon.id.shadowSize},#${defCon.id.color}`).forEach(item => { item.addEventListener("click", function () { this.focus(); this.setSelectionRange(0, this.value.length); }); }); /* Double-click allows to edit */ const fontExT = qS(`#${defCon.id.exclude}`); const fontCssT = qS(`#${defCon.id.cssfun}`); if (fontCssT) { fontCssT.addEventListener("dblclick", () => { fontCssT.setAttribute("class", `${defCon.class.notreadonly}`); fontCssT.title = "\u8bf7\u8c28\u614e\u4fee\u6539\u8be5\u53c2\u6570\uff01"; fontCssT.readOnly = false; }); } saveChangeStatus(fontCssT, CONST_VALUES.fontCSS, submitButton, defCon.values); saveChangeStatus(fontExT, CONST_VALUES.fontEx, submitButton, defCon.values); // Expand & Collapse expandOrCollapse(qS(`#${defCon.id.cSwitch}`), fontCssT, qS(`#${defCon.id.fontCSS}`)); expandOrCollapse(qS(`#${defCon.id.eSwitch}`), fontExT, qS(`#${defCon.id.fontEx}`)); /* Customized monospaced fontlist */ qS(`#${defCon.id.mono}`).addEventListener("dblclick", async () => { try { const monospacedFont = CONST_VALUES.monospacedFont; closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "保存数据", neutralButtonText: "取 消", messageText: `以下文本域可设置您自定义的英文等宽字体集合(字体排序)请注意:程序已默认内置monospace字体,无需重复添加。
(若配置有误或设置初始化将默认采用程序定义的等宽字体)
`, titleText: "设置自定义等宽字体", }); let custom_monospacedFontlist = qS(`#${RANDOM_ID}_monospaced_font`).value.trim(); qS(`#${RANDOM_ID}_monospaced_font`).addEventListener("change", function () { this.value = convertFullToHalf(this.value) .replace(/"|`|·|“|”|‘|’/g, `'`) .replace(/,/g, `,`) .replace(/'monospace',?/gi, ``); custom_monospacedFontlist = this.value.trim(); }); if (await frDialog.respond()) { const monospaced_fontListArray = custom_monospacedFontlist.match(/'@?[a-zA-Z0-9\-_.( !/)]+'/g); if (!custom_monospacedFontlist.length) { GMdeleteValue("_monospaced_fontlist_"); closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "确 定", messageText: `自定义等宽字体表已初始化成功\uff01
已应用程序默认的等宽字体,当前页面即将刷新。
`, titleText: "自定义等宽字体数据重置", }); if (await frDialog.respond()) { closeConfigurePage({ isReload: true }); } frDialog = null; } else if (Array.isArray(monospaced_fontListArray) && monospaced_fontListArray.length > 0) { const monospaced_fontList = [...new Set(monospaced_fontListArray)].join(","); saveData("_monospaced_fontlist_", monospaced_fontList); closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "确 定", messageText: `您所提交的自定义等宽字体已保存成功\uff01
当前页面将在您确认后自动刷新。
注:格式错误或重复的字体名称将被自动过滤。
`, titleText: "自定义等宽字体数据保存", }); if (await frDialog.respond()) { closeConfigurePage({ isReload: true }); } frDialog = null; } else { closeAllFrDialogBox(`#${defCon.id.dialogbox}`); copyToClipboard(custom_monospacedFontlist); frDialog = new FrDialogBox({ trueButtonText: "确 定", messageText: `您所提交的自定义等宽字体数据有误,请重新输入。
注意:先前提交的信息已自动保存至剪切板中。
`, titleText: "自定义等宽字体数据错误", }); if (await frDialog.respond()) { let clickEvent = new Event("dblclick", { bubbles: true, cancelable: false }); qS(`#${defCon.id.mono}`).dispatchEvent(clickEvent); clickEvent = null; } frDialog = null; } } } catch (e) { error("Monospaced Set:", e.message); } }); /* Buttons control */ qS(`#${defCon.id.submit} .${defCon.class.reset}`).addEventListener("click", async () => { closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "重 置", falseButtonText: "恢 复", neutralButtonText: "取 消", messageText: `『重置/恢复』将当前设置初始化为 程序默认的初始数据 或 上次正确保存的数据。一般是在您错误配置参数且造成无法挽回的情况下才进行重置参数的操作。
重置\uff1a重置当前数据为程序初始值,手动保存生效。
恢复\uff1a替换为上次正确保存的数据,自动恢复预览。
取消\uff1a放弃重置操作。
`, titleText: "参数重置确认", }); if (await frDialog.respond()) { smoothT.checked !== INITIAL_VALUES.fontSmooth ? smoothT.click() : debug("\u27A4保存到全局数据\uff1a
将当前设置保存为全局设置,默认使用全局参数。
保存到当前网站数据\uff1a[全部数据列表]
为 ${CUR_HOST_NAME} 保存独立的设置数据。`, titleText: "保存设置数据", }); domains = await GMgetValue("_domains_fonts_set_"); try { domainValue = domains ? [...JSON.parse(defCon.decrypt(domains))] : DEFAULT_ARRAY; } catch (e) { error("domainValue.JSON.parse:", e.message); domainValue = DEFAULT_ARRAY; } const _awdl = qS(`#${RANDOM_ID}_a_w_d_l_`); if (_awdl) { if (domainValue.length > 0) { _awdl.style.cssText += "display:line-block"; } else { _awdl.style.cssText += "display:none"; } _awdl.addEventListener("click", async () => { closeAllFrDialogBox(`#${defCon.id.dialogbox}`); await manageDomainsList(); }); } domainValueIndex = updateDomainsIndex(domainValue); if (typeof domainValueIndex !== "undefined" && qS(`#${RANDOM_ID}_c_w_d_`)) { const fontDate = setDateFormat("yyyy-MM-dd HH:mm:ss", new Date(domainValue[domainValueIndex].fontDate)); qS(`#${RANDOM_ID}_c_w_d_`).innerHTML = trustedTypesPolicy.createHTML( String( `
上次保存\uff1a${fontDate}
` ) ); qS(`#${RANDOM_ID}_c_w_d_d_`).addEventListener("click", async () => { domainValue.splice(domainValueIndex, 1); saveData("_domains_fonts_set_", domainValue); closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "感谢使用", messageText: `当前网站的个性化数据已成功删除\uff01
当前页面将在您确认后自动刷新。
`, titleText: "个性化数据删除", }); if (await frDialog.respond()) { closeConfigurePage({ isReload: true }); } frDialog = null; }); } if (await frDialog.respond()) { saveData("_fonts_set_", { fontSelect: filterHtmlToText(fontselect), fontFace: Boolean(fontface), fontSize: Number(fzoom), fontStroke: Number(fstroke), fixStroke: Boolean(fixfstroke), fontShadow: Number(fshadow), shadowColor: filterHtmlToText(fscolor), fontSmooth: Boolean(smooth), fontCSS: filterHtmlToText(cssfun), fontEx: filterHtmlToText(fontex), }); defCon.successId = true; } else { const _savedata_ = { domain: CUR_HOST_NAME, fontDate: Date.now(), fontSelect: filterHtmlToText(fontselect), fontFace: Boolean(fontface), fontSize: Number(fzoom), fontStroke: Number(fstroke), fixStroke: Boolean(fixfstroke), fontShadow: Number(fshadow), shadowColor: filterHtmlToText(fscolor), fontSmooth: Boolean(smooth), fontCSS: filterHtmlToText(cssfun), fontEx: filterHtmlToText(fontex), }; domains = await GMgetValue("_domains_fonts_set_"); try { domainValue = domains ? [...JSON.parse(defCon.decrypt(domains))] : DEFAULT_ARRAY; } catch (e) { error("domainValue.JSON.parse:", e.message); domainValue = DEFAULT_ARRAY; } domainValueIndex = updateDomainsIndex(domainValue); if (typeof domainValueIndex !== "undefined") { domainValue.splice(domainValueIndex, 1, _savedata_); } else { domainValue.push(_savedata_); } if (domainValue.length <= maxPersonalSites || typeof domainValueIndex !== "undefined") { saveData("_domains_fonts_set_", domainValue); defCon.successId = true; } else { closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "依然保存", falseButtonText: "管理列表", neutralButtonText: "我放弃", messageText: `您已经保存超过${maxPersonalSites} 个网站的个性化数据了,过多的数据会使脚本运行速度过慢,进而会影响您浏览网页的响应速度,建议您及时删除一些平时访问较少的站点设置,然后再进行新网站设置的数据保存。
您确认要继续保存吗?
`, titleText: "数据过多的提示", }); if (await frDialog.respond()) { saveData("_domains_fonts_set_", domainValue); defCon.successId = true; } else { await manageDomainsList(); defCon.successId = false; } frDialog = null; } } frDialog = null; } catch (e) { defCon.errors.push(`[submitData]: ${e}`); reportErrorToAuthor(defCon.errors, true); error("SubmitData:", e.message); defCon.successId = false; } finally { if (defCon.successId) { closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "感谢使用", messageText: `您设置的字体渲染数据已成功保存\uff01
当前页面将在您确认后自动刷新。
`, titleText: "字体渲染数据保存", }); if (await frDialog.respond()) { closeConfigurePage({ isReload: true }); } frDialog = null; } } } }); loadBackupData(isBackupFunction, DEFAULT_ARRAY); qS(`#${defCon.id.submit} .${defCon.class.cancel}`).addEventListener("click", () => { closeConfigurePage({ isReload: false }); }); } } catch (e) { defCon.errors.push(`[operateConfigure]: ${e}`); error("OperateConfigure:", e.message); } } function closeConfigurePage({ isReload }) { if (qS(`#${defCon.id.container}`)) { qS(`#${defCon.id.container}`).style.opacity = 0; sleep(500)(qS("fr-configure")).then(r => { r && r.remove(); }); qS("fr-colorpicker") && qS("fr-colorpicker").remove(); if (isReload === false && defCon.preview) { defCon.oZoom.push(CONST_VALUES.fontSize); defCon.tZoom = CONST_VALUES.fontSize; loadPreview(defCon.isPreview); } } closeAllFrDialogBox("fr-dialogbox"); isReload === true && location.reload(); } async function getCurrentFontName(_isfontface_, refont, def) { const inputFont = qS(`#${defCon.id.fontList} .${defCon.class.selectFontId} input`); reFontFace = def; defCon.curFont = def; if (_isfontface_) { const fontCheckList = await getMergedFontCheckList(); for (let i = 0, l = fontCheckList.length; i < l; i++) { if (fontCheckList[i].en === refont || convertToUnicode(fontCheckList[i].ch) === refont) { defCon.curFont = refont.includes("\\") ? "" : " (" + fontCheckList[i].en + ")"; reFontFace = fontCheckList[i].ch + defCon.curFont; defCon.curFont = fontCheckList[i].ch; break; } } } if (inputFont) { inputFont.setAttribute("placeholder", `\u5f53\u524d\u5b57\u4f53\uff1a${defCon.curFont}`); inputFont.addEventListener("mouseover", () => { inputFont.setAttribute("placeholder", `\u8f93\u5165\u5173\u952e\u5b57\u53ef\u68c0\u7d22\u5b57\u4f53`); }); inputFont.addEventListener("mouseout", () => { inputFont.setAttribute("placeholder", `\u5f53\u524d\u5b57\u4f53\uff1a${defCon.curFont}`); }); } } function loadBackupData(convertejsondatatosqlite, def) { const backupT = qS(`#${defCon.id.backup}`); if (convertejsondatatosqlite && backupT) { backupT.style.display = "inline-block"; backupT.addEventListener("click", async () => { try { closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "备 份", falseButtonText: "还 原", neutralButtonText: "取 消", messageText: `备份到本地文件\uff1a
备份到本地,自动下载 backup.*.sqlitedb 文件。
从本地文件还原\uff1a
\ud83d\udd0e\u0020[点击这里载入*.sqlitedb备份文件]
`, titleText: "备份与还原数据", }); const tfs = qS(`#${defCon.id.tfiles}`); const fs = qS(`#${defCon.id.files}`); if (tfs && fs) { tfs.addEventListener("click", () => { fs.click(); }); fs.addEventListener("change", () => { tfs.innerHTML = trustedTypesPolicy.createHTML( fs.files[0] ? `${fs.files[0].name}备份数据已归档,备份文件导出下载中……
${_fileName_}
`, titleText: "数据备份", }); if (await frDialog.respond()) { debug(`\u27A4 Backup succeeded: ${_fileName_}`); } frDialog = null; } else { try { const thatFile = fs.files[0]; debug(`\u27A4 loadBackupData:`, thatFile.name, thatFile.size); let reader = new FileReader(); reader.readAsText(thatFile); reader.onload = async function () { try { const _file = defCon.decrypt(String(this.result)); const _rs = JSON.parse(defCon.sqliteDB(_file, null, ROOT_SECRET_KEY)); const _data_R = defCon.decrypt(_rs.db_R); const _data_0 = defCon.decrypt(_rs.db_0); const _data_1 = JSON.parse(defCon.decrypt(_rs.db_1)); const _data_2 = JSON.parse(defCon.decrypt(_rs.db_2)); const _data_3 = _rs.db_3 ? JSON.parse(defCon.decrypt(_rs.db_3)) : def; const _data_4 = _rs.db_4 ? JSON.parse(defCon.decrypt(_rs.db_4)) : def; const _data_5 = _rs.db_5 ? JSON.parse(defCon.decrypt(_rs.db_5)) : undefined; const _data_6 = _rs.db_6 ? JSON.parse(defCon.decrypt(_rs.db_6)) : undefined; if (!isNaN(Date.parse(_data_0)) && new Date(_data_0) <= new Date() && _data_R.includes(SCRIPT_AUTHOR)) { saveData("_fonts_set_", _data_1); saveData("_Exclude_site_", _data_2); saveData("_domains_fonts_set_", _data_3); saveData("_Custom_fontlist_", _data_4); _data_6 ? saveData("_monospaced_fontlist_", _data_6) : GMdeleteValue("_monospaced_fontlist_"); if (_data_5) { _data_5.curVersion = defCon.curVersion; _data_5.rebuild = undefined; saveData("_configure_", _data_5); } else { debug("\u27A4 no configure data"); } closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "确 定", messageText: `本地备份数据还原完毕\uff01
当前页面将在您确认后自动刷新。
`, titleText: "数据还原成功", }); if (await frDialog.respond()) { closeConfigurePage({ isReload: true }); } frDialog = null; } else { throw new Error("Invalid Data Error"); } } catch (e) { error("FileReader.onload:", e.message); closeAllFrDialogBox(`#${defCon.id.dialogbox}`); frDialog = new FrDialogBox({ trueButtonText: "确 定", messageText: `数据校验错误,请选择正确的本地备份文件\uff01
`, titleText: "数据文件错误", }); if (await frDialog.respond()) { qS(`#${defCon.id.backup}`).click(); } frDialog = null; } }; reader = null; } catch (e) { error("载入文件为空,请选择要还原的备份文件\uff01
`, titleText: "没有文件载入", }); if (await frDialog.respond()) { qS(`#${defCon.id.backup}`).click(); } frDialog = null; } } frDialog = null; } catch (e) { defCon.errors.push(`[loadBackupData]: ${e}`); reportErrorToAuthor(defCon.errors); error("LoadBackupData:", e.message); } }); } } function copyToClipboard(text) { const handler = event => { event.clipboardData.setData("text/plain", text); event.preventDefault(); document.removeEventListener("copy", handler, true); }; document.addEventListener("copy", handler, true); document.execCommand("copy"); } function expandOrCollapse(a, b, c) { if (a && b && c) { const at = a.attributes["data-switch"]; a.addEventListener("click", () => { if (at.value === "ON") { b.style = "display:none"; a.textContent = "\u2228"; c.style.cssText += `height:35px;min-height:35px`; at.value = "OFF"; } else { b.style = "display:block"; a.textContent = "\u2227"; c.style.cssText += `height:110px;min-height:110px`; at.value = "ON"; } }); } } function rangeSliderWidget(linstener, target, m, g = false) { if (linstener && target) { linstener.addEventListener("input", function () { setSliderProperty(this, this.value, m); target.value = Number(this.value) === (g ? 1 : 0) ? "OFF" : Number(this.value).toFixed(m); target._value_ = Number(this.value).toFixed(m); switch (linstener.id) { case defCon.id.shadow: qS(`#${defCon.id.shadowColor}`).style.setProperty("display", target.value === "OFF" ? "none" : "flex"); break; case defCon.id.stroke: IS_REAL_BLINK && qS(`#${defCon.id.fstroke}`).style.setProperty("visibility", target.value === "OFF" ? "hidden" : "visible"); break; } }); } } function saveChangeStatus(t, e, d, v, g = false) { try { if (t && d) { if (t.type !== "text") { const method = t.type === "textarea" ? "input" : "change"; t.addEventListener(method, () => { const value = t.type === "checkbox" ? t.checked : t.value; setEffectIntoSubmit(value, e, v, t, d); }); } else { Object.defineProperty(t, "_value_", { enumerable: true, configurable: true, get: function () { return this.value; }, set: newVal => { deBounce(setEffectIntoSubmit, 100, t.id, false)(newVal, e, v, t, d, g); }, }); } } } catch (exp) { defCon.errors.push(`[saveChangeStatus]: ${exp}`); error("SaveChangeStatus:", exp); } } function setEffectIntoSubmit(value, e, v, t, d, h = false) { try { const _thatoffvalue = h ? 1 : 0; const _value = typeof t.attributes.v !== "undefined" ? value === "OFF" ? _thatoffvalue : Number(value) : typeof value === "string" && value.toLowerCase() === "currentcolor" ? "#FFFFFFFF" : value; if (_value !== e) { !v.includes(t.id) && v.push(t.id); if (defCon.isPreview) { d.textContent = "\u9884\u89c8"; d.setAttribute("style", "background-color:coral!important;border-color:coral!important"); d.setAttribute("v-Preview", "true"); } } else { for (let i = v.length - 1; i >= 0; i--) { if (v[i] === t.id) { v.splice(i, 1); break; } } } defCon.values = v; if (defCon.values.length > 0) { debug("\u27A4 changed Element IDs:\n", defCon.values); if (!d.classList.contains(`${defCon.class.anim}`)) { d.classList.add(`${defCon.class.anim}`); } if (!defCon.values.includes(t.id) && defCon.isPreview) { d.textContent = "\u9884\u89c8"; d.setAttribute("style", "background-color:coral!important;border-color:coral!important"); d.setAttribute("v-Preview", "true"); } } else { if (d.classList.contains(`${defCon.class.anim}`)) { d.classList.remove(`${defCon.class.anim}`); } if (defCon.isPreview) { d.textContent = "\u4fdd\u5b58"; d.removeAttribute("style"); d.removeAttribute("v-Preview"); loadPreview(defCon.preview); defCon.tZoom = CONST_VALUES.fontSize; setAutoZoomFontSize(qS(`#${defCon.id.rndId}`), defCon.tZoom); } } } catch (exp) { error("SetEffectIntoSubmit:", exp); } } async function manageDomainsList() { let domains, domainValue, domainValueIndex; let _temp_ = []; let Contents = ""; try { domains = await GMgetValue("_domains_fonts_set_"); try { domainValue = domains ? [...JSON.parse(defCon.decrypt(domains))] : DEFAULT_ARRAY; } catch (e) { error("domainValue.JSON.parse:", e.message); domainValue = DEFAULT_ARRAY; } const _data_search_ = domainValue.length > 6 ? `` : ``; for (let i = 0, l = domainValue.length; i < l; i++) { Contents += String( `请谨慎操作,保存后生效,已删除的数据将不可恢复\uff01
${_data_search_}网站个性化设置数据已成功保存\uff01
${ defCon.equal ? "当前网站数据有变动,页面将在您确认后自动刷新。" : "提示:您可继续留在当前页面进行其他操作。" }
` ), titleText: "个性化数据保存", }); if (await frDialog.respond()) { closeConfigurePage({ isReload: !!defCon.equal }); } frDialog = null; } frDialog = null; } catch (e) { defCon.errors.push(`[manageDomainsList]: ${e}`); reportErrorToAuthor(defCon.errors); error("ManageDomainsList:", e.message); } } function reportErrorToAuthor(e, show = IS_OPEN_DEBUG) { if (show) { closeConfigurePage({ isReload: false }); sleep(Math.floor(Math.random() * 2e3))("").then(async errors => { try { if (!qS("fr-dialogbox[error]")) { const br = e.length > 1 ? "\u3000脚本在运行时发生了重大异常或错误,若在『刷新页面』后依然报错,请通过『反馈问题』及时告知作者,感谢您的反馈\uff01
以下信息会自动保存至您的剪切板