Greasy Fork

Greasy Fork is available in English.

Manhuagui helper

Improve Manhuagui

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Manhuagui helper
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  Improve Manhuagui
// @author       You
// @match        https://www.manhuagui.com/update/*
// @match        https://www.manhuagui.com/comic/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=manhuagui.com
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const appState = loadAppState();
    const appStateWatchers = [];
    var appStateIsDirty = false;
    var dirtyAppStateKeys = {};

    var scrollIsDirty = false;

    function loadAppState() {
        try {
            const value = localStorage.getItem('appState');
            return value ? JSON.parse(value) : {};
        } catch (e) {
            console.error(e);
            return {};
        }
    }

    function saveAppState() {
        if (!appStateIsDirty) return;

        localStorage.setItem('appState', JSON.stringify(appState));
        appStateIsDirty = false;
    }

    function getAppState(key) {
        return Array.isArray(key) ? key.map(k => getAppState(k)) : appState[key];
    }

    function setAppState(key, value) {
        if (value !== undefined) {
            appState[key] = value;
        } else {
            delete appState[key];
        }

        appStateIsDirty = true;
        requestAnimationFrame(() => saveAppState());

        dirtyAppStateKeys[key] = true;
        requestAnimationFrame(() => notifyAppStateWatchers());
    }

    function watchAppState(key, callback) {
        appStateWatchers.push({ key, callback });
        callback(getAppState(key));
    }

    function notifyAppStateWatchers() {
        if (!Object.entries(dirtyAppStateKeys).length) return;

        for (const watcher of appStateWatchers) {
            const isDirty = Array.isArray(watcher.key) ? watcher.key.some(k => dirtyAppStateKeys[k]) : dirtyAppStateKeys[watcher.key];
            if (!isDirty) continue;

            watcher.callback(getAppState(watcher.key));
        }

        dirtyAppStateKeys = {};
    }

    function notifyScroll() {
        if (!scrollIsDirty) return;

        window.dispatchEvent(new Event('scroll'));
        scrollIsDirty = false;
    }

    function scheduleNotifyScroll() {
        scrollIsDirty = true;
        requestAnimationFrame(() => notifyScroll());
    }

    function createStyle() {
        const style = document.createElement('style');
        style.textContent = `
            .mhgh-item-menu button {
                padding: 0px 2px;
            }

            .mhgh-global-menu {
                padding: 2px;
                background: #fff;
            }

            .mhgh-global-menu button {
                padding: 0px 2px;
            }
        `;
        document.head.appendChild(style);
    }

    function createShowButton(container, title) {
        const button = document.createElement('button');
        button.type = 'button';
        button.textContent = 'Show';
        button.onclick = () => setAppState(`item.${title}.state`, undefined);
        container.appendChild(button);

        watchAppState(`item.${title}.state`, state => {
            button.style.display = state == 'hidden' ? '' : 'none';
        });
    }

    function createHideButton(container, title) {
        const button = document.createElement('button');
        button.type = 'button';
        button.textContent = 'Hide';
        button.onclick = () => setAppState(`item.${title}.state`, 'hidden');
        container.appendChild(button);

        watchAppState(`item.${title}.state`, state => {
            button.style.display = state === undefined || state == 'like' ? '' : 'none';
        });
    }

    function createLikeButton(container, title) {
        const button = document.createElement('button');
        button.type = 'button';
        button.textContent = 'Like';
        button.onclick = () => setAppState(`item.${title}.state`, 'like');
        container.appendChild(button);

        watchAppState(`item.${title}.state`, state => {
            button.style.display = state != 'like' ? '' : 'none';
        });
    }

    function createItemMenu(container, title) {
        const div = document.createElement('div');
        div.className = 'mhgh-item-menu';
        div.style.position = 'absolute';
        div.style.top = 0;
        div.style.right = '26px';
        div.style.zIndex = 10;
        container.appendChild(div);

        createShowButton(div, title);
        createHideButton(div, title);
        createLikeButton(div, title);
    }

    function createItem(container) {
        const title = container.querySelector('a.cover').getAttribute('title');

        container.style.position = 'relative';

        createItemMenu(container, title);

        watchAppState([`item.${title}.state`, 'showAll'], ([state, showAll]) => {
            const hidden = state == 'hidden';
            const oldDisplay = container.style.display;
            container.style.display = showAll || !hidden ? '' : 'none';
            container.style.opacity = showAll && hidden ? .5 : '';

            if (container.style.display != oldDisplay) {
                scheduleNotifyScroll();
            }
        });
    }

    function createBookCoverItem(container) {
        const title = container.querySelector('img').getAttribute('alt');

        container.style.position = 'relative';

        createItemMenu(container, title);
    }

    function createShowAllButton(container) {
        const button = document.createElement('button');
        button.type = 'button';
        button.textContent = 'Show all';
        button.onclick = () => setAppState(`showAll`, '1');
        container.appendChild(button);

        watchAppState('showAll', showAll => {
            button.style.display = showAll ? 'none' : '';
        });
    }

    function createHideUnwantedButton(container) {
        const button = document.createElement('button');
        button.type = 'button';
        button.textContent = 'Hide unwanted';
        button.onclick = () => setAppState(`showAll`, undefined);
        container.appendChild(button);

        watchAppState('showAll', showAll => {
            button.style.display = showAll ? '' : 'none';
        });
    }

    function createGlobalMenu(container) {
        const div = document.createElement('div');
        div.className = 'mhgh-global-menu';
        div.style.position = 'fixed';
        div.style.bottom = 0;
        div.style.right = '10px';
        div.style.zIndex = 100;
        container.appendChild(div);

        createShowAllButton(div);
        createHideUnwantedButton(div);
    }

    createStyle();

    document.querySelectorAll('.latest-list li').forEach(e => createItem(e));
    document.querySelectorAll('.book-cover.fl').forEach(e => createBookCoverItem(e));
    createGlobalMenu(document.body);

    setInterval(function() {
        document.querySelectorAll('.sitemaji-close-btn').forEach(e => e.click());
    }, 1000);
})();