// ==UserScript== // @name Fix Garbled Titles in Lanraragi Upload // @name:zh-CN 修复LANraragi上传页文件名乱码 // @namespace http://tampermonkey.net/ // @version 0.2.1 // @description Fixes garbled titles on the Lanraragi upload page and appends the original source link. Utilizes the page's built-in jQuery to avoid conflicts. Please modify the @match section below to match your Lanraragi BaseURL. // @description:zh-CN 修复Lanraragi上传页面中的乱码标题,并追加原始链接。使用页面内置的jQuery以避免冲突。请先修改下面的@match段以匹配您的Lanraragi基础URL。 // @author Jade // @match https://lanraragi.example.com/upload // @grant none // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/531194/Fix%20Garbled%20Titles%20in%20Lanraragi%20Upload.user.js // @updateURL https://update.greasyfork.icu/scripts/531194/Fix%20Garbled%20Titles%20in%20Lanraragi%20Upload.meta.js // ==/UserScript== (function () { 'use strict'; // 等待页面 jQuery 加载完毕 function waitForjQuery(callback) { const check = () => { if (typeof window.jQuery !== 'undefined') { callback(window.jQuery); } else { setTimeout(check, 100); } }; check(); } waitForjQuery(function ($) { // 解码乱码 function decodeGarbled(str) { try { return decodeURIComponent(escape(str)); } catch { return str; } } function isPureURL(str) { return /^https?:\/\/\S+$/i.test(str.trim()); } function fixTitleAndAppendURL($link) { if (!$link.length || $link[0].dataset.fixed) return; const href = $link.attr("href"); if (!href || href === "#") return; const originalText = $link.text(); const fixedText = decodeGarbled(originalText); if (originalText === fixedText || isPureURL(fixedText)) return; $link.text(fixedText); const url = $link.attr("title"); if (url) { $link.after(`
[Source Link]`); } $link[0].dataset.fixed = "true"; } function processAllLinks(root = document) { $(root) .find('a[id$="-name"]') .each(function () { fixTitleAndAppendURL($(this)); }); } function observeAndFix() { const target = document.getElementById("files"); if (!target) return; const observer = new MutationObserver(mutations => { mutations.forEach(mutation => { mutation.addedNodes.forEach(node => { if (node.nodeType === 1) { processAllLinks(node); } }); if (mutation.type === "characterData" || mutation.type === "childList") { const parent = mutation.target.closest?.("a[id$='-name']"); if (parent) fixTitleAndAppendURL($(parent)); } }); }); observer.observe(target, { childList: true, subtree: true, characterData: true, }); processAllLinks(target); } $(document).ready(observeAndFix); }); })();