Raw Source
tastytea / Mastodon CW toggle

// ==UserScript==
// @name        Mastodon CW toggle
// @description Adds a button to toggle the visibility of all statuses with content warnings on status-pages and profile-pages.
// @version     2020.05.19.1
// @author      tastytea
// @copyright   2019-2020, 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/fediverse/mastodon_cw_toggle.user.js
// @grant       none
// @match       https://*/users/*/statuses/*
// @match       https://*/@*
// @run-at      document-end
// @inject-into content
// ==/UserScript==

// Toggle the visibility of each status with CW.
function toggle()
{
    for (let status of document.getElementsByClassName("e-content"))
    {
        if (status.parentElement.firstChild.firstChild.className !==
            "p-summary")        // Skip if status has no CW.
        {
            continue;
        }

        let style = status.getAttribute("style");
        // Newer versions of Mastodon put the style somewhere else, we overwrite
        // it.
        if (style === null)
        {
            style = "display: none;";
        }

        if (style.search("none") > -1)
        {
            style = style.replace("none", "block");
        }
        else
        {
            style = style.replace("block", "none");
        }
        status.setAttribute("style", style);
    }
}

// Add a “Toggle all CWs”-button.
function add_button()
{
    // If there is no element named “column-1”, use the footer.
    let root = document.getElementsByClassName("column-1")[0];
    if (root === undefined)
    {
        root = document.getElementsByClassName("footer")[0];
        if (root === undefined)
        {
            console.error("Error: no suitable parent-element found.");
            return;
        }
    }
    else if (root.offsetParent === null) // If element is hidden,
    {                       // we are probably on a device with a small display.
        root = document.getElementsByClassName("column-2")[0];
    }

    // Create a div, necessary to get the correct styling for the button.
    const div = document.createElement("div");
    div.setAttribute("id", "global-cw-toggle");
    div.setAttribute("class", "status__content");
    div.setAttribute("style", "margin-bottom: 0.5em;");

    // Create the button.
    const button = document.createElement("button");
    button.setAttribute("class", "status__content__spoiler-link");
    button.appendChild(document.createTextNode("Toggle all CWs"));

    div.appendChild(button);
    root.insertBefore(div, root.firstChild);

    button.onclick = toggle;
}

// If there is a “Show more”-button, add our button, if we didn't do so before.
if (document.getElementsByClassName("status__content__spoiler-link").length > 0
    && document.getElementById("global-cw-toggle") === null)
{
    add_button();
}