您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
tweaks for holdgrip
// ==UserScript== // @name HoldGrip Tweaks // @namespace http://tampermonkey.net/ // @version 0.1.1 // @description tweaks for holdgrip // @author Californ1a // @match https://holdgrip.seekr.pw/* // @icon https://www.google.com/s2/favicons?sz=64&domain=seekr.pw // @grant none // ==/UserScript== (function() { const css = ` .custom-header { cursor: pointer; } .custom-header.custom-down::after { content: '▾'; } .custom-header.custom-up::after { content: '▴'; } .custom-header:hover { color: #eee; } .custom-header:active { color: #fff; } `.split("\n").filter((e) => e !== "").join("\n"); if (typeof GM_addStyle != "undefined") { GM_addStyle(css); } else if (typeof PRO_addStyle != "undefined") { PRO_addStyle(css); } else if (typeof addStyle != "undefined") { addStyle(css); } else { var node = document.createElement("style"); node.type = "text/css"; node.appendChild(document.createTextNode(css)); var heads = document.getElementsByTagName("head"); if (heads.length > 0) { heads[0].appendChild(node); } else { // no head yet, stick it whereever document.documentElement.appendChild(node); } } })(); function compareRows(rows1, rows2) { if (rows1.length !== rows2.length) return false; for (let i = 0; i < rows1.length; i++) { if (!rows1[i].isEqualNode(rows2[i])) return false; } return true; } function parseDuration(durationString) { // Split the string into parts using ':' as the separator const parts = durationString.split(':'); // Initialize variables for hours, minutes, seconds, and hundredths of a second let hours = 0; let minutes = 0; let seconds = 0; let hundredths = 0; if (parts.length === 1) { // If there's only one part, it represents seconds and hundredths const secondsAndHundredths = parts[0].split('.'); if (secondsAndHundredths.length === 2) { seconds = parseInt(secondsAndHundredths[0], 10); hundredths = parseInt(secondsAndHundredths[1], 10) || 0; } else { throw new Error('Invalid duration format'); } } else if (parts.length === 2) { // If there are two parts, they represent minutes and seconds minutes = parseInt(parts[0], 10); const secondsAndHundredths = parts[1].split('.'); if (secondsAndHundredths.length === 2) { seconds = parseInt(secondsAndHundredths[0], 10); hundredths = parseInt(secondsAndHundredths[1], 10) || 0; } else { throw new Error('Invalid duration format'); } } else if (parts.length === 3) { // If there are three parts, they represent hours, minutes, and seconds hours = parseInt(parts[0], 10); minutes = parseInt(parts[1], 10); const secondsAndHundredths = parts[2].split('.'); if (secondsAndHundredths.length === 2) { seconds = parseInt(secondsAndHundredths[0], 10); hundredths = parseInt(secondsAndHundredths[1], 10) || 0; } else { throw new Error('Invalid duration format'); } } else { throw new Error('Invalid duration format'); } // Calculate the total duration in milliseconds const totalMilliseconds = (hours * 60 * 60 * 1000) + (minutes * 60 * 1000) + (seconds * 1000) + hundredths * 10; return totalMilliseconds; } function sortRows(headers, rows, i) { for (const header of headers) { header.classList.remove("custom-down", "custom-up"); } let customClass = "custom-down"; const rowsCopy = [...rows]; rows.sort((a, b) => { const aCompare = a.children[i].innerText; const bCompare = b.children[i].innerText; if (i === 0) { return (aCompare < bCompare) ? -1 : (aCompare > bCompare) ? 1 : 0; } if (i === 3) { return parseDuration(aCompare) - parseDuration(bCompare); } return parseInt(aCompare.replace(",", ""), 10) - parseInt(bCompare.replace(",", ""), 10); }); if (compareRows(rows, rowsCopy)) { rows = rows.reverse(); customClass = "custom-up"; } headers[i].classList.add(customClass); const tbody = rows[0].parentElement; for (const row of rows) { row.remove(); tbody.appendChild(row); } } (function() { const h = document.location.href; const pageType = (h.match(/\/player\/\d+\//)) ? "player" : (h.match(/\/tracks\/(sprint|challenge|stunt)\/\d+$/)) ? "track" : null; if (!pageType) return; if (pageType === "player") { const statsTable = document.querySelector(".stats:not(.small)"); const headerRow = statsTable.children[0].children[0]; const statsTableRows = Array.from(statsTable.children[0].children).slice(1); for (let i = 0; i < headerRow.children.length; i++) { headerRow.children[i].addEventListener("click", () => sortRows(headerRow.children, statsTableRows, i)); headerRow.children[i].classList.add("custom-header"); if (headerRow.children[i].innerText === "Track weight") { headerRow.children[i].classList.add("custom-up"); } } } })();