Raw Source
tastytea / Goodreads expand

// ==UserScript==
// @name           Goodreads expand
// @description    Show the whole description / author information / book details on goodreads.com.
// @description:de Zeige die ganze beschreibung / author·inneninformation / buchdetails auf goodreads.com an.
// @version        2021.07.20.1
// @author         tastytea
// @copyright      2020, 2021, tastytea (https://tastytea.de/)
// @license        GPL-3.0-only
// @namespace      tastytea.de
// @homepageURL    https://schlomp.space/tastytea/userscripts
// @supportURL     https://schlomp.space/tastytea/userscripts/issues
// @downloadURL    https://schlomp.space/tastytea/userscripts/raw/branch/main/catalogues/goodreads_expand.user.js
// @grant          none
// @match          https://www.goodreads.com/*
// @run-at         document-end
// @inject-into    content
// ==/UserScript==

(function()
 {
     // Book description.
     const description = document.getElementById("description");
     // Author info on author page.
     let author = document.getElementsByClassName("aboutAuthorInfo")[0];
     if (author === undefined)
     {
         // Author info on book page.
         author = document.getElementsByClassName("bookAuthorProfile")[0];
     }

     for (const element of [description, author])
     {
         if (element == null)   // null or undefined.
         {
             continue;
         }

         const spans = element.getElementsByTagName("span");
         if (spans.length >= 2)
         {
             spans[1].setAttribute("style", "display: block;");
             spans[0].setAttribute("style", "display: none;");

             const links = element.getElementsByTagName("a");
             links[links.length - 1].text = "(less)";
         }
     }

     // Data below books.
     const bookdata = document.getElementById("bookDataBox");
     if (bookdata !== null)
     {
         bookdata.setAttribute("style", "display: block;");
         document.getElementById("bookDataBoxShow").setAttribute("style", "display: none;");
     }
 })();

// On-hover book descriptions are getting loaded dynamically, so we have to look
// for them periodically.
function userscript_expand_hover_description()
{
    const descriptions = document.getElementsByClassName("addBookTipDescription");
    for (const element of descriptions)
    {
        if (element == null)   // null or undefined.
        {
            continue;
        }

        const spans = element.getElementsByTagName("span");
        if (spans.length >= 2)
        {
            spans[1].setAttribute("style", "display: block;");
            spans[0].setAttribute("style", "display: none;");

            const links = element.getElementsByTagName("a");
            links[links.length - 1].text = "(less)";
        }
    }
}

setInterval(userscript_expand_hover_description, 1000);