/* eslint-disable no-multi-spaces */ // ==UserScript== // @name Greasyfork 快捷编辑收藏 // @name:zh-CN Greasyfork 快捷编辑收藏 // @name:zh-TW Greasyfork 快捷編輯收藏 // @name:en Greasyfork script-set-edit button // @name:en-US Greasyfork script-set-edit button // @namespace Greasyfork-Favorite // @version 0.1.6 // @description 在GF脚本页添加快速打开收藏集编辑页面功能 // @description:zh-CN 在GF脚本页添加快速打开收藏集编辑页面功能 // @description:zh-TW 在GF腳本頁添加快速打開收藏集編輯頁面功能 // @description:en Add open script-set-edit-page button in GF script page // @description:en-US Add open script-set-edit-page button in GF script page // @author PY-DNG // @license GPL-3 // @match http*://greasyfork.org/* // @match http*://sleazyfork.org/* // @include http*://greasyfork.org/* // @include http*://sleazyfork.org/* // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAbBJREFUOE+Vk7GKGlEUhr8pAiKKDlqpCDpLUCzWBxCENBa+hBsL9wHsLWxXG4tNtcGH0MIiWopY7JSGEUWsbESwUDMw4Z7siLsZDbnlPff/7n/+e67G38sA6sAXIPVWXgA/gCdgfinRPuhfCoXCw3Q65XA4eLBl6zvw1S2eAZqmvTqOc5/NZhkMBqRSKWzbvgYxgbwquoAX4MGyLHK5HIlEgtFo9C+IOFEAo1gsWsvlUmyPx2MymYxAhsMh6XT6lpM7BXjWdf1xNpuRz+fl8GQywTAMGo0G1WpVnJxOJ692vinADPgcDAaZz+cCOR6PmKZJPB4XUb/fp1wuewF+KoBCf1JVBVE5dDodms3mWdDtdqlUKl6AX+8ALmS9XgtM0/5kvNlspKX9fv8RIgBp4bISCoXo9XqsVitKpRK6rrPb7STQ7XZ7eVRaeAYerz14OBxGOfL7/eIgmUwKzHEcJZEQ1eha1wBqPxqNihufzyeQWCzmtiPPqJYM0jWIyiISibBYLAgEAtTrdVqt1nmQXN0rcH/LicqmVqvRbrdN27bfjbKru+nk7ZD3Z7q4+b++82/YPKIrXsKZ3AAAAABJRU5ErkJggg== // @grant GM_xmlhttpRequest // @grant GM_setValue // @grant GM_getValue // @downloadURL none // ==/UserScript== (function __MAIN__() { 'use strict'; // function DoLog() {} // Arguments: level=LogLevel.Info, logContent, trace=false const [LogLevel, DoLog] = (function() { const LogLevel = { None: 0, Error: 1, Success: 2, Warning: 3, Info: 4, }; return [LogLevel, DoLog]; function DoLog() { // Get window const win = (typeof(unsafeWindow) === 'object' && unsafeWindow !== null) ? unsafeWindow : window; const LogLevelMap = {}; LogLevelMap[LogLevel.None] = { prefix: '', color: 'color:#ffffff' } LogLevelMap[LogLevel.Error] = { prefix: '[Error]', color: 'color:#ff0000' } LogLevelMap[LogLevel.Success] = { prefix: '[Success]', color: 'color:#00aa00' } LogLevelMap[LogLevel.Warning] = { prefix: '[Warning]', color: 'color:#ffa500' } LogLevelMap[LogLevel.Info] = { prefix: '[Info]', color: 'color:#888888' } LogLevelMap[LogLevel.Elements] = { prefix: '[Elements]', color: 'color:#000000' } // Current log level DoLog.logLevel = (win.isPY_DNG && win.userscriptDebugging) ? LogLevel.Info : LogLevel.Warning; // Info Warning Success Error // Log counter DoLog.logCount === undefined && (DoLog.logCount = 0); // Get args let [level, logContent, trace] = parseArgs([...arguments], [ [2], [1,2], [1,2,3] ], [LogLevel.Info, 'DoLog initialized.', false]); // Log when log level permits if (level <= DoLog.logLevel) { let msg = '%c' + LogLevelMap[level].prefix + (typeof GM_info === 'object' ? `[${GM_info.script.name}]` : '') + (LogLevelMap[level].prefix ? ' ' : ''); let subst = LogLevelMap[level].color; switch (typeof(logContent)) { case 'string': msg += '%s'; break; case 'number': msg += '%d'; break; default: msg += '%o'; break; } if (++DoLog.logCount > 512) { console.clear(); DoLog.logCount = 0; } console[trace ? 'trace' : 'log'](msg, subst, logContent); } } }) (); const CONST = { Text: { 'zh-CN': { FavEdit: '收藏集:', Add: '加入此集', Edit: '手动编辑', CopySID: '复制脚本ID', Working: ['正在添加...', '就快好了...'], Error: { Unknown: '未知错误' } }, 'zh-TW': { FavEdit: '收藏集:', Add: '加入此集', Edit: '手動編輯', CopySID: '複製腳本ID', Working: ['正在添加...', '就快好了...'], Error: { Unknown: '未知錯誤' } }, 'en': { FavEdit: 'Add to/Remove from favorite list: ', Add: 'Add', Edit: 'Edit Manually', CopySID: 'Copy-Script-ID', Working: ['Working...', 'Just a moment...'], Error: { Unknown: 'Unknown Error' } }, 'default': { FavEdit: 'Add to/Remove from favorite list: ', Add: 'Add', Edit: 'Edit Manually', CopySID: 'Copy-Script-ID', Working: ['Working...', 'Just a moment...'], Error: { Unknown: 'Unknown Error' } }, } } // Get i18n code let i18n = navigator.language; if (!Object.keys(CONST.Text).includes(i18n)) {i18n = 'default';} main() function main() { const HOST = getHost(); const API = getAPI(); // Common actions commons(); // API-based actions switch(API[1]) { case "scripts": API[2] && centerScript(API); break; default: DoLog('API is {}'.replace('{}', API)); } } function centerScript(API) { switch(API[3]) { case undefined: pageScript(); break; case 'code': pageCode(); break; case 'feedback': pageFeedback(); break; } } function commons() { // Your common actions here... } function pageScript() { addFavPanel(); } function pageCode() { addFavPanel(); } function pageFeedback() { addFavPanel(); } function addFavPanel() { if (!getUserpage()) {return false;} GUI(); function GUI() { // Get elements const script_after = $('#script-feedback-suggestion+*') || $('#new-script-discussion'); const script_parent = script_after.parentElement; // My elements const script_favorite = $CrE('div'); script_favorite.id = 'script-favorite'; script_favorite.style.margin = '0.75em 0'; script_favorite.innerHTML = CONST.Text[i18n].FavEdit; const favorite_groups = $CrE('select'); favorite_groups.id = 'favorite-groups'; const stored_sets = GM_getValue('script-sets', {sets: []}).sets; for (const set of stored_sets) { // Make