Greasy Fork

Chapter Changer + Smooth Scrolling

For Mangakakalot & Manganelo

目前为 2021-01-05 提交的版本。查看 最新版本

// ==UserScript==
// @name         Chapter Changer + Smooth Scrolling
// @description  For Mangakakalot & Manganelo
// @version      0.71
// @namespace    https://greasyfork.org/en/users/55535-sllypper
// @author       sllypper
// @match        https://mangakakalot.com/chapter/*
// @match        https://manganelo.com/chapter/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let scrollAmount = 64;
    let scrollPeriod = 32;
    let shiftSpeedMod = 2;

    const states = {
        NONE: 0,
        UP: 1,
        SHIFTUP: 2,
        DOWN: 3,
        SHIFTDOWN: 4
    }
    let scrollState = states.NONE;
    let currScrollAction = null;

    let buttons = document.getElementsByClassName('navi-change-chapter-btn');
    if (buttons.length === 0) {
        buttons = document.getElementsByClassName('btn-navigation-chap');
        if (buttons.length === 0) return;
    }

    buttons = buttons[0].childNodes;

    let prevButton = buttons[0];
    let nextButton = buttons[buttons.length-1];

    // if there's only one button
    if (buttons.length != 2) {
        // check if it's the next button
        // mangakakalot has "back" and "next" button classes are switched around
        if (buttons[0].classList.contains("back") || buttons[0].classList.contains("navi-change-chapter-btn-next")) {
            // then we're in chapter 1 and there's no prev button
            prevButton = null;
        } else {
            // else we're in the last chapter and there's no next button
            nextButton = null;
        }
    }

    document.addEventListener("keydown", event => {
        if (event.code === "KeyW" || event.code === "KeyK") {
            if (scrollState !== states.UP && !event.shiftKey) {
                clearScrollAction();
                scrollState = states.UP;
                scrollAction(-scrollAmount);
            } else if (scrollState !== states.SHIFTUP && event.shiftKey) {
                clearScrollAction();
                scrollState = states.SHIFTUP;
                scrollAction(-scrollAmount*shiftSpeedMod);
            }
        } else if (event.code === "KeyS" || event.code === "KeyJ") {
            if (scrollState !== states.DOWN && !event.shiftKey) {
                clearScrollAction();
                scrollState = states.DOWN;
                scrollAction(scrollAmount);
            } else if (scrollState !== states.SHIFTDOWN && event.shiftKey) {
                clearScrollAction();
                scrollState = states.SHIFTDOWN;
                scrollAction(scrollAmount*shiftSpeedMod);
            }
        } else if (event.code === "KeyC" && nextButton != null) {
            nextButton.click();
        } else if (event.code === "KeyZ" && prevButton != null) {
            prevButton.click();
        }
    });

    document.addEventListener("keyup", event => {
        if (event.code === "KeyW" || event.code === "KeyK") {
            clearScrollAction();
        } else if (event.code === "KeyS" || event.code === "KeyJ") {
            clearScrollAction();
        } else if (event.key === "Shift") {
            clearScrollAction();
        }
    });

    function scrollAction(amount) {
        currScrollAction = setInterval(() => {
            window.scrollBy(0, amount);
        }, scrollPeriod)
    }

    function clearScrollAction() {
        clearInterval(currScrollAction);
        currScrollAction = null;
        scrollState = states.NONE;
    }

})();