// ==UserScript==
// @name SmoothScroll & Navigation Enhancer
// @namespace http://tampermonkey.net/
// @version 1.5
// @description You can quickly access the previous and next episodes, perform smooth scrolling up or down, and even enable or disable full-screen mode. This script is designed to enhance the reading experience of web content such as manga and comics in a more convenient and efficient way.
// @match https://westmanga.fun/*
// @match https://komikcast.cz/*
// @match https://aquamanga.org/read/*
// @match https://www.webtoons.com/*
// @match https://kiryuu.org/*
// @match https://kiryuu.co/*
// @match https://mangatale.co/*
// @match https://mangaku.mom/*
// @match https://manhwatop.com/*
// @match https://komiku.id/*
// @match https://komiknesia.xyz/*
// @grant none
// @license MIT
// ==/UserScript==
// @match https://mangadex.org/chapter/*
(function() {
'use strict';
var scrollInterval = null;
var isScrolling = false
var isFullscreen = false;
var activeElement;
var smoothScrollSpeed = 10.5; // Kecepatan pengguliran yang mulus
var smoothScrollDelay = 10; // Penundaan di antara setiap langkah pengguliran yang mulus
const HOSTS = {
'westmanga.fun': {
next: '.ch-next-btn',
prev: '.ch-prev-btn'
},
'komikcast.cz': {
next: '.nextprev a[rel="next"]',
prev: '.nextprev a[rel="prev"]'
},
'www.webtoons.com': {
next: 'a[title="Episode selanjutnya"]',
prev: 'a[title="Episode sebelumnya"]'
},
'aquamanga.org': {
next: 'a.btn.next_page',
prev: 'a.btn.prev_page'
},
'kiryuu.org': {
next: 'a.ch-next-btn',
prev: 'a.ch-prev-btn'
},
'mangatale.co': {
next: 'a.ch-next-btn',
prev: 'a.ch-prev-btn'
},
'mangaku.mom': {
prev: 'button.glho.glkp_1:-soup-contains("PREV")',
next: 'button.glho.glkn_1:-soup-contains("NEXT")'
},
'manhwatop.com': {
prev: '.prev_page',
next: '.next_page'
},
'komiku.id': {
prev: 'div.nxpr > a.rl:first-of-type',
next: 'div.nxpr > a.rl:last-of-type'
},
'komiknesia.xyz': {
prev: 'a.ch-prev-btn',
next: 'a.ch-next-btn'
},
'mangadex.org': {
prev: '',
next: ''
}
};
let btnNext, btnPrev;
let host = window.location.host;
if (HOSTS[host]) {
btnNext = HOSTS[host].next;
btnPrev = HOSTS[host].prev;
}
const zoomLevel = () => {
return document.body.style.zoom || 1;
}
function adjustSmoothScroll() {
let zLevel = zoomLevel();
smoothScrollSpeed = smoothScrollSpeed * zLevel;
smoothScrollDelay = smoothScrollDelay / zLevel;
}
function smoothScrollStep(direction) {
var scrollDistance = direction === 'up' ? -smoothScrollSpeed : smoothScrollSpeed;
window.scrollBy(0, scrollDistance);
}
function startSmoothScrolling(direction) {
if (!isScrolling) {
isScrolling = true;
smoothScrollStep(direction);
scrollInterval = setInterval(function() {
smoothScrollStep(direction);
}, smoothScrollDelay);
}
}
function stopSmoothScrolling() {
if (isScrolling) {
isScrolling = false;
clearInterval(scrollInterval);
}
}
// Deteksi saat zoom berubah
document.addEventListener('zoomchange', adjustSmoothScroll);
// Sesuaikan juga saat scroll dihentikan
document.addEventListener('keyup', event => {
if (isScrolling) {
stopSmoothScrolling();
adjustSmoothScroll();
}
});
adjustSmoothScroll();
document.addEventListener('keydown', function(event) {
if ((event.key === 'a' || event.key === 'A' || event.key === 'ArrowLeft') && !event.ctrlKey && !event.altKey && event.key !== 'Tab') {
let prevButton = document.querySelector(btnPrev);
if (prevButton) {
// Periksa elemen yang sedang dalam fokus
activeElement = document.activeElement;
if (!(activeElement && (activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA'))) {
// Pengguna tidak sedang mengetik
prevButton.click();
}
}
} else if ((event.key === 'd' || event.key === 'D' || event.key === 'ArrowRight') && !event.ctrlKey && !event.altKey && event.key !== 'Tab') {
let nextButton = document.querySelector(btnNext);
if (nextButton) {
// Periksa elemen yang sedang dalam fokus
activeElement = document.activeElement;
if (!(activeElement && (activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA'))) {
// Pengguna tidak sedang mengetik
nextButton.click();
}
}
} else if ((event.key === 's' || event.key === 'S') && !event.ctrlKey && !event.altKey && event.key !== 'Tab') {
// Periksa elemen yang sedang dalam fokus
activeElement = document.activeElement;
if (!(activeElement && (activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA'))) {
// Pengguna tidak sedang mengetik
startSmoothScrolling('down');
}
} else if ((event.key === 'w' || event.key === 'W') && !event.ctrlKey && !event.altKey && event.key !== 'Tab') {
// Periksa elemen yang sedang dalam fokus
activeElement = document.activeElement;
if (!(activeElement && (activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA'))) {
// Pengguna tidak sedang mengetik
startSmoothScrolling('up');
}
} else if ((event.key === 'f' || event.key === 'F') && !event.ctrlKey && !event.altKey && event.key !== 'Tab') {
// Periksa elemen yang sedang dalam fokus
activeElement = document.activeElement;
if (!(activeElement && (activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA'))) {
// Pengguna tidak sedang mengetik, masuk ke mode fullscreen
event.preventDefault();
toggleFullscreen(); // Fungsi Anda untuk masuk/keluar dari mode fullscreen
}
} else if ((event.key === 'q' || event.key === 'Q') && !event.ctrlKey && !event.altKey && event.key !== 'Tab') {
var allChapterButton;
if (window.location.host === 'westmanga.fun') {
allChapterButton = document.querySelector('.allc a');
} else if (window.location.host === 'www.webtoons.com') {
allChapterButton = document.querySelector('a[class="subj NPI=a:end,g:in_id"]');
} else if (window.location.host === 'komiknesia.xyz') {
allChapterButton = document.querySelector('.allc a');
} else if (window.location.host === 'kiryuu.org') {
allChapterButton = document.evaluate("//div[contains(text(), 'Semua chapter ada di')]/a", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
} else if (window.location.host === 'komikcast.cz') {
allChapterButton = document.querySelector('div.allc a');
} else if (window.location.host === 'mangatale.co') {
allChapterButton = document.evaluate("//div[contains(text(), 'All chapters are in ')]/a", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
} else if (window.location.host === 'aquamanga.org') {
// Ambil URL saat ini
var currentUrl = window.location.href;
// Gunakan ekspresi reguler untuk menghapus segmen URL setelah judul komik
var newUrl = currentUrl.replace(/\/read\/([^/]+)\/.*/, '/read/$1/');
// Periksa elemen yang sedang dalam fokus
activeElement = document.activeElement;
if (!(activeElement && (activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA'))) {
// Pengguna tidak sedang mengetik memindahkan pengguna ke URL yang telah diubah
window.location.href = newUrl;
}
}
if (allChapterButton) {
// Periksa elemen yang sedang dalam fokus
activeElement = document.activeElement;
if (!(activeElement && (activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA'))) {
// Pengguna tidak sedang mengetik
allChapterButton.click();
}
}
}
});
function toggleFullscreen() {
if (!isFullscreen) {
enterFullscreen();
} else {
exitFullscreen();
}
isFullscreen = !isFullscreen;
}
function enterFullscreen() {
const elem = document.documentElement;
if (elem.requestFullscreen) {
elem.requestFullscreen();
} else if (elem.mozRequestFullScreen) {
elem.mozRequestFullScreen();
} else if (elem.webkitRequestFullscreen) {
elem.webkitRequestFullscreen();
} else if (elem.msRequestFullscreen) {
elem.msRequestFullscreen();
}
}
function exitFullscreen() {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
}
}
document.addEventListener('keyup', function(event) {
if ((event.key === 's' || event.key === 'S' || event.key === 'w' || event.key === 'W') && !event.ctrlKey && !event.altKey && event.key !== 'Tab') {
stopSmoothScrolling();
window.scrollTo(window.pageXOffset, window.pageYOffset); // Menghentikan scroll secara instan
}
});
})();