Reorder Showtopic URL Parameters

将showtopic前的参数移动到后面,使showtopic位于首位

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Reorder Showtopic URL Parameters
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  将showtopic前的参数移动到后面,使showtopic位于首位
// @author       1415ddfer
// @license MIT
// @match        https://forums.e-hentai.org/index.php*
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    const url = new URL(location.href);
    const rawSearch = url.search;

    // 没有查询参数或没有showtopic,直接放行
    if (!rawSearch || !rawSearch.includes('showtopic=')) return;

    // 解析原始查询字符串,保持参数顺序
    const params = [];
    const searchParams = new URLSearchParams(rawSearch);
    for (const [key, value] of searchParams) {
        params.push({ key, value });
    }

    // 找到showtopic的索引
    const showtopicIndex = params.findIndex(p => p.key === 'showtopic');
    if (showtopicIndex === -1) return;

    // showtopic已经在最前面,放行
    if (showtopicIndex === 0) return;

    // 重组参数:showtopic放最前,其余按原顺序排列
    const showtopicParam = params[showtopicIndex];
    const otherParams = params.filter((_, i) => i !== showtopicIndex);
    const reorderedParams = [showtopicParam, ...otherParams];

    // 构建新的查询字符串
    const newSearch = reorderedParams.map(p => {
        if (p.value === '') return encodeURIComponent(p.key);
        return encodeURIComponent(p.key) + '=' + encodeURIComponent(p.value);
    }).join('&');

    const cleanUrl = url.origin + url.pathname + '?' + newSearch + url.hash;

    // 显示提示并跳转
    document.documentElement.innerHTML = `
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>正在整理链接参数...</title>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            color: #333;
        }
        .box {
            background: white;
            padding: 48px 40px;
            border-radius: 16px;
            box-shadow: 0 20px 60px rgba(0,0,0,0.15);
            text-align: center;
            max-width: 560px;
            width: 90%;
            animation: fadeIn 0.4s ease;
        }
        @keyframes fadeIn {
            from { opacity: 0; transform: translateY(20px); }
            to { opacity: 1; transform: translateY(0); }
        }
        .icon {
            width: 64px; height: 64px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            margin: 0 auto 24px;
            font-size: 28px;
        }
        h2 { font-size: 22px; margin-bottom: 12px; color: #1a1a2e; }
        .desc { color: #666; font-size: 15px; line-height: 1.7; margin-bottom: 24px; }
        .url-box {
            background: #f8f9fa;
            border: 1px solid #e9ecef;
            border-radius: 10px;
            padding: 16px;
            margin-bottom: 12px;
            text-align: left;
        }
        .url-label {
            font-size: 11px;
            text-transform: uppercase;
            letter-spacing: 1px;
            color: #999;
            margin-bottom: 6px;
            font-weight: 600;
        }
        .url {
            font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, monospace;
            font-size: 13px;
            word-break: break-all;
            line-height: 1.5;
        }
        .url-old { color: #dc3545; }
        .url-new { color: #28a745; }
        .arrow {
            text-align: center;
            color: #999;
            font-size: 20px;
            margin: 8px 0;
        }
        .spinner {
            width: 36px; height: 36px;
            border: 3px solid #e9ecef;
            border-top-color: #667eea;
            border-radius: 50%;
            animation: spin 0.8s linear infinite;
            margin: 24px auto 16px;
        }
        @keyframes spin { to { transform: rotate(360deg); } }
        .status {
            color: #667eea;
            font-size: 14px;
            font-weight: 500;
        }
        .manual {
            margin-top: 16px;
            font-size: 12px;
            color: #999;
        }
        .manual a {
            color: #667eea;
            text-decoration: none;
        }
        .manual a:hover { text-decoration: underline; }
    </style>
</head>
<body>
    <div class="box">
        <div class="icon">🔗</div>
        <h2>正在整理 URL 参数顺序</h2>
        <p class="desc">检测到 <code>showtopic</code> 前面有其他参数,正在自动将其移至首位...</p>
        <div class="url-box">
            <div class="url-label">原始链接</div>
            <div class="url url-old">${location.href}</div>
        </div>
        <div class="arrow">↓</div>
        <div class="url-box">
            <div class="url-label">整理后链接</div>
            <div class="url url-new">${cleanUrl}</div>
        </div>
        <div class="spinner"></div>
        <div class="status">正在跳转,请稍候...</div>
        <div class="manual">若未自动跳转,请 <a href="${cleanUrl}">点击此处</a></div>
    </div>
</body>
</html>
    `;

    // 1.5秒后跳转
    setTimeout(() => {
        location.replace(cleanUrl);
    }, 500);

})();