您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add a button to sort all articles by their popularity score in descending order.
// ==UserScript== // @name Inoreader Article Sort By Popularity Button // @version 20241028 // @description Add a button to sort all articles by their popularity score in descending order. // @author jamesdeluk // @match https://www.inoreader.com/* // @grant none // @namespace https://greasyfork.org/users/242246 // ==/UserScript== (function() { 'use strict'; function parseScore(scoreText) { var score = 0; if (scoreText.includes('k')) { score = parseFloat(scoreText.replace('k', '')) * 1000; } else if (scoreText.includes('M')) { score = parseFloat(scoreText.replace('M', '')) * 1000000; } else { score = parseFloat(scoreText); } return score; } function sortArticlesByScore() { // Select the container that holds all article headers var articlesContainer = document.querySelector('#reader_pane'); // Adjust the selector if necessary if (!articlesContainer) return; // Select all article headers var articleHeaders = Array.from(articlesContainer.querySelectorAll('.ar')); // Sort the article headers by their popularity score in descending order articleHeaders.sort((a, b) => { var scoreA = parseScore(a.querySelector('.popularity_score_span')?.innerText || '0'); var scoreB = parseScore(b.querySelector('.popularity_score_span')?.innerText || '0'); return scoreB - scoreA; }); // Remove all article headers from the container articleHeaders.forEach(header => articlesContainer.removeChild(header)); // Append the sorted article headers back to the container articleHeaders.forEach(header => articlesContainer.appendChild(header)); // Ensure #no_more_div is the last element ensureNoMoreDivLast(); } function addSortButton() { const sortButton = document.createElement('button'); sortButton.id = 'sb_rp_sort'; sortButton.textContent = 'Sort'; sortButton.className = 'btn btn-sm btn-outline-text'; sortButton.title = 'Sort'; // // Add click event to the sort button sortButton.addEventListener('click', sortArticlesByScore); return sortButton; } function ensureSortButton() { const toolbar = document.querySelector('.nav.nav-toolbar.mx-0.justify-content-end'); if (toolbar && !document.getElementById('sb_rp_sort')) { const sortButton = addSortButton(); const listItem = document.createElement('li'); listItem.className = 'nav-item ml-2'; listItem.appendChild(sortButton); toolbar.insertBefore(listItem, toolbar.children[1]); } } function ensureNoMoreDivLast() { var readerPane = document.getElementById('reader_pane'); var noMoreDiv = document.getElementById('no_more_div'); if (readerPane && noMoreDiv && noMoreDiv.nextSibling) { readerPane.appendChild(noMoreDiv); } } function init() { ensureSortButton(); ensureNoMoreDivLast(); // Use MutationObserver to ensure the button persists and #no_more_div stays last var observer = new MutationObserver(() => { ensureSortButton(); ensureNoMoreDivLast(); }); observer.observe(document.body, { childList: true, subtree: true }); } // Run the function to add the sort button and ensure #no_more_div is last on page load window.addEventListener('load', init); })();