您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
7/29/2024, 8:57:58 PM
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/502146/1419173/Dev%20stuff.js
- // ==UserScript==
- // @name Dev stuff
- // @namespace Violentmonkey Scripts
- // @match https://*/*
- // @grant none
- // @version 0.1
- // @author Shaun Mitchell <shaun@shitchell.com>
- // @description 7/29/2024, 8:57:58 PM
- // @license WTFPL
- // ==/UserScript==
- function mapToStyle(styles) {
- return Object.entries(styles)
- .map(([key, value]) => `${key}: ${value};`)
- .join(' ');
- }
- class Debugger {
- static name = "debugger";
- static level = "debug";
- static levels = ["debug", "info", "warn", "error"];
- static styles = {
- debug: {
- "color": "grey",
- },
- info: {
- "color": "cyan"
- },
- warn: {
- "color": "yellow",
- "font-weight": "bold"
- },
- error: {
- "background-color": "red",
- "color": "black",
- "font-weight": "bold",
- "font-size": "1.1em"
- }
- }
- static setLevel(level) {
- this.level = level;
- }
- static isValidLevel(level) {
- let cur_index = -1;
- let lvl_index = -1;
- for (let i = 0; i < this.levels.length; i++) {
- let l = this.levels[i];
- if (l == this.level) {
- cur_index = i;
- }
- if (l == level) {
- lvl_index = i;
- }
- if (cur_index > -1 && lvl_index > -1) {
- break;
- }
- }
- return lvl_index >= cur_index;
- }
- static log(level, ...args) {
- if (this.isValidLevel(level)) {
- const timestamp = new Date().toISOString().replace("T", " ").replace(/\..*/, "")
- const style = mapToStyle(this.styles[level]);
- console[level](`%c[${this.name}.${level} | ${timestamp}]`, style, ...args);
- }
- }
- static debug(...args) { this.log("debug", ...args) }
- static info(...args) { this.log("info", ...args) }
- static warn(...args) { this.log("warn", ...args) }
- static error(...args) { this.log("error", ...args) }
- }
- function debug(...args) { Debugger.debug(...args) }
- function info(...args) { Debugger.info(...args) }
- function warn(...args) { Debugger.warn(...args) }
- function error(...args) { Debugger.error(...args) }
- // attribution:
- // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value
- function getCircularReplacer() {
- const ancestors = [];
- let i = 0;
- return function(key, value) {
- if (i % 100 === 99) {
- Debugger.debug("processing key", key);
- }
- if (typeof value !== "object" || value === null) {
- return value;
- }
- // `this` is the object that value is contained in,
- // i.e., its direct parent.
- while (ancestors.length > 0 && ancestors.at(-1) !== this) {
- ancestors.pop();
- }
- if (ancestors.includes(value)) {
- return "[Circular]";
- }
- ancestors.push(value);
- return value;
- };
- }
- function downloadObjectJSON(object, filename, indent) {
- const default_filename = "object-blob.js.json";
- const default_indent = 4;
- // Allow for intelligent argument parsing for, e.g.: `downloadObjectBlob(foo, indent=4)`
- args = [object, filename, indent];
- filename = undefined;
- indent = undefined;
- for (const arg of args) {
- switch (typeof arg) {
- case 'number':
- indent = arg;
- break;
- case 'string':
- filename = arg;
- break;
- case 'object':
- object = arg;
- break;
- case 'undefined':
- break;
- default:
- error(`error: unexpected type for ${arg}`);
- return null
- }
- }
- if (filename === undefined) { filename = default_filename }
- if (indent === undefined) { indent = default_indent }
- blob = new Blob([JSON.stringify(object, getCircularReplacer(), " ".repeat(indent))])
- debug(`blob=<Blob size=${blob.size}>, filename=${filename}, indent=${indent}`);
- var a = window.document.createElement('a');
- a.href = window.URL.createObjectURL(blob, {type: 'text/json'});
- a.download = filename;
- // Append anchor to body.
- document.body.appendChild(a);
- a.dispatchEvent(new MouseEvent('click'));
- // Remove anchor from body
- document.body.removeChild(a);
- }
- /* Export stuff */
- unsafeWindow.mapToStyle = mapToStyle;
- unsafeWindow.Debugger = Debugger;
- unsafeWindow.getCircularReplacer = getCircularReplacer;
- unsafeWindow.downloadObjectJSON = downloadObjectJSON;
- unsafeWindow.debug = debug;
- unsafeWindow.info = info;
- unsafeWindow.warn = warn;
- unsafeWindow.error = error;