您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
在 GreasyFork 脚本更新页面显示新旧版本差异
当前为
- // ==UserScript==
- // @name GreasyFork Script Diff Tool
- // @name:zh-CN GreasyFork 脚本更新对比工具
- // @namespace http://tampermonkey.net/
- // @version 1.0
- // @description A tool to compare script versions on GreasyFork's update page
- // @description:zh-CN 在 GreasyFork 脚本更新页面显示新旧版本差异
- // @author ommo
- // @match https://greasyfork.org/*/scripts/*/versions/new
- // @grant GM_xmlhttpRequest
- // @grant GM_addStyle
- // @require https://cdnjs.cloudflare.com/ajax/libs/jsdiff/5.2.0/diff.min.js
- // @require https://unpkg.com/diff2html/bundles/js/diff2html-ui.min.js
- // @license MIT
- // ==/UserScript==
- (function () {
- 'use strict';
- // 添加全局样式
- const link = document.createElement('link');
- link.rel = 'stylesheet';
- link.href = 'https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css';
- document.head.appendChild(link);
- GM_addStyle(`
- .diff-container {
- margin-top: 20px;
- max-height: 500px;
- overflow-y: auto;
- position: relative;
- }
- `);
- // 获取当前最新版代码
- function fetchLatestCode(scriptId, callback) {
- const url = `https://greasyfork.org/scripts/${scriptId}/code`;
- GM_xmlhttpRequest({
- method: 'GET',
- url: url,
- onload: function (response) {
- const parser = new DOMParser();
- const doc = parser.parseFromString(response.responseText, 'text/html');
- const codeContainer = doc.querySelector('.code-container');
- if (!codeContainer) {
- console.error('Code container not found');
- alert('Failed to fetch latest code. Page structure may have changed.');
- return;
- }
- const code = codeContainer.textContent.trim();
- callback(code);
- },
- onerror: function (error) {
- console.error('Failed to fetch latest code:', error);
- alert('Failed to fetch latest code. Check script ID or network connection.');
- }
- });
- }
- // 添加对比按钮
- function addCompareButton(scriptId) {
- const textarea = document.querySelector('textarea');
- const button = document.createElement('button');
- button.textContent = 'Diff';
- button.className = 'diff-button';
- button.style.marginTop = '10px';
- const diffContainer = document.createElement('div');
- diffContainer.className = 'diff-container';
- button.addEventListener('click', function (event) {
- event.preventDefault();
- button.disabled = true;
- button.textContent = 'Loading...';
- const newCode = textarea.value.trim();
- if (!newCode) {
- alert('Please enter new code.');
- button.disabled = false;
- button.textContent = 'Diff';
- return;
- }
- fetchLatestCode(scriptId, function (latestCode) {
- const fileName = `${document.querySelector('header > h2').textContent}.js`;
- const diffString = Diff.createPatch(fileName, latestCode, newCode);
- const targetElement = diffContainer;
- const configuration = { drawFileList: false, fileListToggle: false };
- const diff2htmlUi = new Diff2HtmlUI(targetElement, diffString, configuration);
- diff2htmlUi.draw();
- button.disabled = false;
- button.textContent = 'Diff';
- });
- });
- textarea.parentNode.append(button, diffContainer);
- }
- // 主逻辑
- function main() {
- const scriptId = window.location.pathname.match(/\/scripts\/(\d+)\/versions\/new/)[1];
- if (!scriptId) {
- console.error('Script ID not found');
- return;
- }
- addCompareButton(scriptId);
- }
- // 启动
- main();
- })();