Auto Spoiler

Автоматически скрывает изображения под спойлером

// ==UserScript==
// @name         Auto Spoiler
// @icon         https://www.google.com/s2/favicons?domain=shikimori.me
// @namespace    https://shikimori.one
// @version      1.0
// @description  Автоматически скрывает изображения под спойлером
// @match        *://shikimori.org/*
// @match        *://shikimori.one/*
// @match        *://shikimori.me/*
// @grant        none
// @license      MIT
// ==/UserScript==

function ready(fn) {
    document.addEventListener("DOMContentLoaded", fn);
    document.addEventListener("page:load", fn);
    document.addEventListener("turbolinks:load", fn);
    if (document.readyState === "complete") fn();
}

function spoiler(images) {
    const spoilerDiv = document.createElement('div');
    spoilerDiv.className = 'b-spoiler_block';
    spoilerDiv.dataset.dynamic = 'spoiler_block';

    const spoilerText = document.createElement('span');
    spoilerText.tabIndex = 0;
    spoilerText.textContent = 'Image';
    spoilerText.addEventListener('click', () => spoilerDiv.classList.toggle('is-opened'));

    const imagesContainer = document.createElement('div');
    images.forEach(img => imagesContainer.appendChild(img));

    spoilerDiv.append(spoilerText, imagesContainer);
    return spoilerDiv;
}

function group(comment) {
    const body = comment.querySelector('.body');
    let images = [];
    Array.from(body.childNodes).forEach(node => {
        if (node.nodeType === Node.ELEMENT_NODE && node.classList.contains('b-image')) {
            images.push(node);
        } else if (images.length > 0) {
            body.insertBefore(spoiler(images), node);
            images = [];
        }
    });
    if (images.length > 0) body.appendChild(spoiler(images));
}

function init() {
    const commentsContainer = document.querySelector('#comments');
    const commentsLoader = document.querySelector('.comments-loader');

    function autoSpoiler() {
        document.querySelectorAll('.b-comment').forEach(group);
    }

    autoSpoiler();

    if (commentsContainer) {
        new MutationObserver(mutations => {
            mutations.forEach(mutation => {
                mutation.addedNodes.forEach(node => {
                    if (node.nodeType === Node.ELEMENT_NODE && node.classList.contains('b-comments', 'is-headline')) {
                        group(node);
                    }
                });
            });
        }).observe(commentsContainer, { childList: true, subtree: true });
    }

    if (commentsLoader) {
        commentsLoader.addEventListener('click', () => setTimeout(autoSpoiler, 400));
    }
}

ready(init);