您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
7/29/2024, 8:57:58 PM
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyforks.org/scripts/502146/1419173/Dev%20stuff.js
// ==UserScript== // @name Dev stuff // @namespace Violentmonkey Scripts // @match https://*/* // @grant none // @version 0.1 // @author Shaun Mitchell <[email protected]> // @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;