// ==UserScript== // @name Goodreads - Sort lists by rating or votes // @namespace goodreads // @description Sort lists // @include https://www.goodreads.com/list/show/* // @version 1.1 // @grant none // @downloadURL https://update.greasyfork.icu/scripts/11620/Goodreads%20-%20Sort%20lists%20by%20rating%20or%20votes.user.js // @updateURL https://update.greasyfork.icu/scripts/11620/Goodreads%20-%20Sort%20lists%20by%20rating%20or%20votes.meta.js // ==/UserScript== function isNumeric(num){ return !isNaN(num) } function parseNumber(str) { var out = ""; for(var i = 0; i < str.length; ++i) { if(isNumeric(str[i])) { out += str[i]; } } return parseInt(out); } var App = { order: "desc", loadPage: 2, sort: function(cmp) { var elems = jQuery(".tableList").find("tr").get(); elems.sort(cmp); if(App.order === "asc") { App.order = "desc"; } else { App.order = "asc"; elems.reverse(); } for(var i = 0; i < elems.length; ++i) { elems[i].parentNode.appendChild(elems[i]); } }, init: function() { $sortByRating = jQuery("").attr("id", "sortByRating") .attr("href", "#") .text("sort by rating") .addClass("tab"); $sortByVotes = jQuery("").attr("id", "sortByVotes") .attr("href", "#") .text("sort by votes") .addClass("tab"); jQuery(".bigTabs > div:nth-child(1)", ".leftContainer").append($sortByRating) .append($sortByVotes); jQuery("#sortByRating").on("click", function(){ App.sort(function(lhs, rhs){ var lhsRating = jQuery(lhs).find(".minirating").text().match(/[0-9]{1}\.[0-9]{2}/)[0]; var rhsRating = jQuery(rhs).find(".minirating").text().match(/[0-9]{1}\.[0-9]{2}/)[0]; return parseFloat(lhsRating) - parseFloat(rhsRating); }); }); jQuery("#sortByVotes").on("click", function(){ App.sort(function(lhs, rhs){ var lhsVotes = parseNumber(jQuery(lhs).find(".minirating").text().match(/\d{1,3}(?:[,]\d{3})* rating/)[0]); var rhsVotes = parseNumber(jQuery(rhs).find(".minirating").text().match(/\d{1,3}(?:[,]\d{3})* rating/)[0]); if(lhsVotes < rhsVotes) { return -1; } if(lhsVotes > rhsVotes) { return 1; } return 0; }); }); var hasPages = jQuery("#all_votes > .pagination").length > 0; if(hasPages) { $pagination = jQuery("#all_votes > .pagination > a"); var numPages = parseInt($pagination.get(-2).innerHTML); $loadPage = jQuery("").attr("id", "loadNextPage") .attr("href", "#") .text("load page #2") .addClass("tab"); jQuery(".bigTabs > div:nth-child(1)", ".leftContainer").append($loadPage); var nextPageUrl = "https://www.goodreads.com" + $pagination.last().attr("href"); jQuery("#loadNextPage").on("click", function(){ jQuery("#loadNextPage").text("loading page #" + App.loadPage); jQuery.get(nextPageUrl, function(data){ $html = jQuery(data); $html.find(".tableList tr").appendTo(jQuery(".tableList tbody")); nextPageUrl = "https://www.goodreads.com" + $html.find(".pagination a").last().attr("href"); App.loadPage++; if(App.loadPage > numPages) { // Remove load link if loaded last page jQuery("#loadNextPage").remove(); } else { jQuery("#loadNextPage").text("load page #" + App.loadPage); } }); }); } } }; jQuery(document).ready(App.init);