您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
轻小说文库++的脚本设置界面
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/450210/1085839/wk-settings.js
- /* eslint-disable no-multi-spaces */
- /* eslint-disable no-implicit-globals */
- /* eslint-disable userscripts/no-invalid-headers */
- /* eslint-disable userscripts/no-invalid-grant */
- // ==UserScript==
- // @name wk-settings
- // @displayname 设置界面
- // @namespace Wenku8++
- // @version 0.1.5
- // @description 轻小说文库++的脚本设置界面
- // @author PY-DNG
- // @license GPL-v3
- // @regurl https?://www\.wenku8\.net/.*
- // @require https://greasyfork.org/scripts/449412-basic-functions/code/Basic%20Functions.js?version=1085783
- // @require https://greasyfork.org/scripts/449583-configmanager/code/ConfigManager.js?version=1085836
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_deleteValue
- // @grant GM_listValues
- // @grant ML_listModules
- // @grant ML_disableModule
- // @grant ML_enableModule
- // @grant ML_uninstallModule
- // @grant ML_moduleLoaded
- // @protect
- // ==/UserScript==
- (function __MAIN__() {
- const ASSETS = require('assets');
- const alertify = require('alertify');
- const SPanel = require('SidePanel');
- const SettingPanel = require('SettingPanel');
- const mousetip = require('mousetip');
- const CONST = {
- Text: {
- Button: '设置',
- Title: '脚本设置',
- ModuleManage: '模块管理',
- OpenModuleDialog: '点此打开管理面板',
- ModuleSettings: '模块设置',
- Module: '模块',
- Operation: '操作',
- DisableModule: '禁用模块',
- EnableModule: '启用模块',
- UninstallModule: '卸载模块',
- AlertTitle: '模块设置界面',
- NoLoadNoSettings: '模块并未在此页面上运行,无法获取设置',
- NoSettings: '该模块当前并没有提供设置选项',
- },
- Config_Ruleset: {
- 'version-key': 'config-version',
- 'ignores': ["LOCAL-CDN"],
- 'defaultValues': {
- //'config-key': {},
- },
- 'updaters': {
- /*'config-key': [
- function() {
- // This function contains updater for config['config-key'] from v0 to v1
- },
- function() {
- // This function contains updater for config['config-key'] from v1 to v2
- }
- ]*/
- }
- }
- };
- SPanel.add({
- faicon: 'fa-solid fa-gear',
- tip: CONST.Text.Button,
- onclick: function() {
- const win = window.open('https://www.wenku8.net/userdetail.php');
- setPageUrl(win, 'https://www.wenku8.net/userdetail.php?tosettings=true');
- }
- });
- const UMManager = new UserModuleManager();
- isSettingPage(main);
- exports = {
- isSettingPage: isSettingPage,
- insertLines: insertLines,
- registerSettings: UMManager.registerModuleSettings
- };
- function main() {
- // Get elements
- const content = $('#content');
- // Insert settings
- const title = [
- [{html: CONST.Text.Title, colSpan: 3, class: 'foot', key: 'settitle'}],
- [{html: CONST.Text.ModuleManage, colSpan: 1}, {html: CONST.Text.OpenModuleDialog, colSpan: 2, onclick: UMManager.show}],
- //[{html: CONST.Text.XXXX, colSpan: 1, key: 'xxxxxxxx'}, {html: CONST.Text.XXXX, colSpan: 2, key: 'xxxxxxxx'}],
- ]
- const elements = insertLines(title);
- // scrollIntoView if need
- getUrlArgv('tosettings') === 'true' && elements.settitle.scrollIntoView();
- }
- // Module manager user interface
- function UserModuleManager() {
- const UMM = this;
- const moduleSettingFuncs = {};
- UMM.show = show;
- UMM.registerModuleSettings = registerModuleSettings;
- UMM.showModuleSettings = showModuleSettings;
- function show() {
- //box.set('message', 'No implemented yet!').show();
- const modules = ML_listModules();
- // Make panel
- const SetPanel = new SettingPanel.SettingPanel({
- header: CONST.Text.ModuleManage,
- tables: []
- });
- // Make table
- const table = new SetPanel.PanelTable({});
- // Make header
- table.appendRow({
- blocks: [{
- isHeader: true,
- colSpan: 1,
- width: '60%',
- innerText: CONST.Text.Module,
- },{
- isHeader: true,
- colSpan: 3,
- width: '40%',
- innerText: CONST.Text.Operation,
- }]
- });
- // Make module rows
- for (const module of modules) {
- const row = new SetPanel.PanelRow({
- blocks: [{
- colSpan: 1,
- rowSpan: 1,
- innerText: module.displayname
- },{
- colSpan: 1,
- rowSpan: 1,
- children: [makeBtn(CONST.Text.ModuleSettings, showModuleSettings.bind(null, module.identifier))]
- },{
- colSpan: 1,
- rowSpan: 1,
- children: [makeBtn(CONST.Text.DisableModule, ML_disableModule.bind(null, module.identifier))]
- },{
- colSpan: 1,
- rowSpan: 1,
- children: [makeBtn(CONST.Text.EnableModule, ML_enableModule.bind(null, module.identifier))]
- },{
- colSpan: 1,
- rowSpan: 1,
- children: [makeBtn(CONST.Text.UninstallModule, ML_uninstallModule.bind(null, module.identifier))]
- }]
- });
- table.appendRow(row);
- }
- SetPanel.appendTable(table);
- function makeBtn(text, onclick) {
- const span = $CrE('span');
- span.innerText = text;
- span.addEventListener('click', onclick);
- span.classList.add(ASSETS.ClassName.Button);
- return span;
- }
- }
- function registerModuleSettings(id, func) {
- moduleSettingFuncs[id] = func;
- }
- function showModuleSettings(id) {
- const func = moduleSettingFuncs[id];
- if (typeof func === 'function') {
- func();
- return true;
- } else {
- if (!ML_moduleLoaded(id)) {
- alertify.alert(CONST.Text.AlertTitle, CONST.Text.NoLoadNoSettings);
- } else {
- alertify.alert(CONST.Text.AlertTitle, CONST.Text.NoSettings);
- }
- return false;
- }
- }
- }
- function insertLines(lines, tbody) {
- !tbody && (tbody = $(content, 'table>tbody'));
- const elements = {};
- for (const line of lines) {
- const tr = $CrE('tr');
- for (const item of line) {
- const td = $CrE('td');
- item.html && (td.innerHTML = item.html);
- item.colSpan && (td.colSpan = item.colSpan);
- item.class && (td.className = item.class);
- item.id && (td.id = item.id);
- item.tiptitle && mousetip.settip(td, item.tiptitle);
- item.key && (elements[item.key] = td);
- if (item.onclick) {
- td.style.color = 'grey';
- td.style.textAlign = 'center';
- td.addEventListener('click', item.onclick);
- }
- td.style.padding = '3px';
- tr.appendChild(td);
- }
- tbody.appendChild(tr);
- }
- return elements;
- }
- function isSettingPage(callback) {
- const page = getAPI()[0] === 'userdetail.php';
- page && callback && callback();
- return page;
- }
- // Change location.href without reloading using history.pushState/replaceState
- function setPageUrl() {
- let win, url, push;
- switch (arguments.length) {
- case 1:
- win = window;
- url = arguments[0];
- push = false;
- break;
- case 2:
- win = arguments[0];
- url = arguments[1];
- push = false;
- break;
- case 3:
- win = arguments[0];
- url = arguments[1];
- push = arguments[2];
- }
- return win.history[push ? 'pushState' : 'replaceState']({modified: true, ...history.state}, '', url);
- }
- })();