您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Wrappers for dealing with variations in userscript managers.
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://updategreasyfork.deno.dev/scripts/478349/1275706/NH_userscript.js
// ==UserScript== // ==UserLibrary== // @name NH_userscript // @description Wrappers for dealing with variations in userscript managers. // @version 4 // @license GPL-3.0-or-later; https://www.gnu.org/licenses/gpl-3.0-standalone.html // @homepageURL https://github.com/nexushoratio/userscripts // @supportURL https://github.com/nexushoratio/userscripts/issues // @match https://www.example.com/* // ==/UserLibrary== // ==/UserScript== window.NexusHoratio ??= {}; window.NexusHoratio.userscript = (function userscript() { 'use strict'; /** @type {number} - Bumped per release. */ const version = 4; /** Library specific exception. */ class UserscriptError extends Error { /** @inheritdoc */ constructor(...rest) { super(...rest); this.name = this.constructor.name; } } /** * @typedef LicenseData * @property {string} name - License name. * @property {string} url - URL pointing to the license. */ /** * Per the *old* GM docs: * https://sourceforge.net/p/greasemonkey/wiki/Metadata_Block/#license * @returns {LicenseData} - Extracted from the userscript header. * @throws {Error} - If cannot be extracted. */ function licenseData() { let license = GM.info.script.license; if (!license) { const magic = '// @license '; // Try a legacy way const header = GM.info.scriptMetaStr; if (header) { const line = header.split('\n').find(l => l.startsWith(magic)); if (line) { license = line.slice(magic.length).trim(); } } } if (!license) { const msg = [ 'Unable to extract license information from the userscript.', // eslint-disable-next-line no-magic-numbers JSON.stringify(GM.info, null, 2), ].join('\n'); throw new UserscriptError(msg); } const [name, url] = license.split(';'); return { name: name.trim(), url: url.trim(), }; } /** @returns {string[]} - Raw text about the current environment. */ function environmentData() { const gm = GM.info; const msgs = [`${gm.script.name}: ${gm.script.version}`]; msgs.push('NexusHoratio libraries:'); for (const [lib, obj] of Object.entries(window.NexusHoratio)) { if (Object.hasOwn(obj, 'version')) { msgs.push(` ${lib}: ${obj.version}`); } else { msgs.push(` ${lib}: Unknown version`); } } msgs.push(`Userscript manager: ${gm.scriptHandler} ${gm.version}`); if (gm.injectInto) { msgs.push(` injected into "${gm.injectInto}"`); } // Violentmonkey if (gm.platform) { msgs.push(`Platform: ${gm.platform.browserName} ` + `${gm.platform.browserVersion} ${gm.platform.os} ` + `${gm.platform.arch}`); } // Tampermonkey if (gm.userAgentData) { let msg = 'Platform: '; for (const brand of gm.userAgentData.brands.values()) { msg += `${brand.brand} ${brand.version} `; } msg += `${gm.userAgentData?.platform} `; msg += `${gm.userAgentData?.architecture}-${gm.userAgentData?.bitness}`; msgs.push(msg); } return msgs; } /** * Fetches value from userscript storage if granted. * * Purposefully no errors if permissions are not granted * * @param {string} key - The name of the value to load. * @param {*} defaultValue - Value if not stored OR not enabled. * @returns {Promise<*>} - The value fetched or defaultValue. */ function getValue(key, defaultValue) { if (GM.getValue) { return GM.getValue(key, defaultValue); } return Promise.resolve(defaultValue); } /** * Sets a value in userscript storage if granted. * * Purposefully no errors if permissions are not granted * * @param {string} key - The name to use in the storage. * @param {*} value - The value to set. * @returns {Promise<*>} - Always resolves to null; mostly used to ensure * the write is complete. */ function setValue(key, value) { if (GM.setValue) { return GM.setValue(key, value); } return Promise.resolve(null); } return { version: version, UserscriptError: UserscriptError, licenseData: licenseData, environmentData: environmentData, getValue: getValue, setValue: setValue, }; }());