// ==UserScript== // @name Goodreads, show only the standalones in lists // @version 0.2 // @description Add a checkbox to Goodreads list pages that allows you to hide books that belong to series // @author anothershm // @match *://*.goodreads.com/review/list/* // @grant GM_setValue // @grant GM_getValue // @license MIT // @namespace https://greasyfork.org/users/1206936 // @downloadURL https://update.greasyfork.icu/scripts/478563/Goodreads%2C%20show%20only%20the%20standalones%20in%20lists.user.js // @updateURL https://update.greasyfork.icu/scripts/478563/Goodreads%2C%20show%20only%20the%20standalones%20in%20lists.meta.js // ==/UserScript== (function() { 'use strict'; const createCheckbox = () => { var newDiv = document.createElement('div'); newDiv.innerHTML = ' '; newDiv.style.display = 'inline'; newDiv.style.paddingLeft = '10px'; return newDiv; }; function showStandalone(show) { var allBooks = Array.from(document.querySelectorAll('.bookalike')); if (!show) { allBooks.forEach((el) => { el.hidden = false; }); } else { var booksFromSeries = allBooks.filter((el) => { const pattern = /\(.*#(\d+)\)/; // Regular expression to match text with "#number" pattern return el.querySelector('.title').innerHTML.match(pattern) }); if (booksFromSeries.length !== allBooks.length) { booksFromSeries.forEach((el) => { el.hidden = true; }); } } } const init = () => { const newDiv = createCheckbox(); document.querySelector('#controls').appendChild(newDiv); var cb = newDiv.firstChild; cb.checked = GM_getValue('gr_showStandalone', false); showStandalone(cb.checked); cb.addEventListener('change', (evt) => { showStandalone(cb.checked); GM_setValue('gr_showStandalone', cb.checked); }); }; init(); })();