Greasy Fork is available in English.
manga reader for copymanga, J/K for DOWN/UP, LEFT/RIGHT for previous/next chapter.
当前为
// ==UserScript==
// @name Copymanga Simple Read
// @namespace http://tampermonkey.net/
// @match https://www.copymanga.com/comic/*/chapter/*
// @grant none
// @version 1.10
// @author chemPolonium
// @description manga reader for copymanga, J/K for DOWN/UP, LEFT/RIGHT for previous/next chapter.
// @run-at document-end
// ==/UserScript==
/* jshint esversion: 6 */
(function() {
'use strict';
document.getElementsByClassName('header')[0].remove();
let comicContainerFluid = document.getElementsByClassName('container-fluid comicContent')[0];
comicContainerFluid.setAttribute('style', 'padding-right: 0px !important; padding-left: 0px !important;');
let comicContainer = comicContainerFluid.children[0];
comicContainer.setAttribute('style', 'max-width: 100% !important; margin-right: 0px !important; margin-left: 0px !important');
let comicList = comicContainer.children[0];
comicList.setAttribute('style', 'padding-top: 0px !important; margin-bottom: 0px !important; max-width: 100% !important; width: 100% !important; display:grid;grid-template-columns: repeat(2, 1fr);direction: rtl;');
let comicListChildren = comicList.children;
let currentPageInd = -1;
let currentImage;
function updateCurrentImage() {
currentImage = comicList.children[currentPageInd].children[0];
}
function moveToCurrentImage() {
window.scrollTo(0, currentImage.offsetTop);
}
function movePage(x) {
currentPageInd += x;
currentPageInd = currentPageInd < comicList.children.length ? currentPageInd : comicList.children.length - 1;
currentPageInd = currentPageInd >= 0 ? currentPageInd : 1;
updateCurrentImage();
}
let evt = new UIEvent('scroll');
function setSingleAlign(pageInd) {
if (pageInd % 2 == 0) {
comicListChildren[pageInd].setAttribute('style', 'text-align: left;');
} else {
comicListChildren[pageInd].setAttribute('style', 'text-align: right;');
}
}
function setAlign() {
for (let pageInd = 0; pageInd < comicListChildren.length; pageInd++) {
setSingleAlign(pageInd);
}
}
function onePageDown() {
// simulate the scroll for preload
// the script is like this: total client height / 3 < window scrollY then not load
// so first scroll Y to 0
window.scrollTo(0, 0);
for (let i = 0; i < 2; i++) {
window.dispatchEvent(evt);
// dispatch the scroll event for preload
movePage(1);
// the set will not work if important is not added
// currentImage.setAttribute('style', 'width:auto !important; height:auto !important;max-height: 100vh !important; max-width: 50vw !important;');
}
moveToCurrentImage();
}
function onePageUp() {
movePage(-2);
moveToCurrentImage();
}
let parityChanged = false;
function createTitlePage() {
let titlePage = document.createElement('li');
let titlePageDiv = document.createElement('div');
let titlePageTitle = document.createElement('p');
titlePageTitle.appendChild(document.createTextNode(document.title));
titlePageTitle.setAttribute('style', 'color: white; font-size: xx-large; max-width: 30vw; margin-top: 30%; margin-right: 20%; white-space: normal;');
titlePageDiv.appendChild(titlePageTitle);
titlePage.appendChild(titlePageDiv);
return titlePage;
}
let titlePage = createTitlePage();
function switchParity() {
if (parityChanged) {
comicList.children[0].remove();
} else {
// comicList.insertAdjacentHTML('afterbegin',titlePageHTML);
comicList.insertAdjacentElement('afterbegin', titlePage);
}
parityChanged = !parityChanged;
setAlign();
updateCurrentImage();
moveToCurrentImage();
}
let footer = document.getElementsByClassName('footer')[0];
let footerChildren = footer.children;
let prevChapterHref = footerChildren[1].children[0].href;
let nextChapterHref = footerChildren[3].children[0].href;
let chapterListHref = footerChildren[4].children[0].href;
document.addEventListener('keydown', (event) => {
switch (event.code) {
case 'ArrowRight':
window.location = nextChapterHref;
break;
case 'ArrowLeft':
window.location = prevChapterHref;
break;
case 'KeyK':
onePageUp();
break;
case 'KeyJ':
onePageDown();
break;
case 'KeyL':
window.location = chapterListHref;
break;
case 'Semicolon':
switchParity();
break;
default:
console.log('key: ' + event.key + ' code: ' + event.code);
}
});
footer.remove();
let firstLoad = true;
comicList.addEventListener('DOMNodeInserted', (event) => {
if (firstLoad && comicList.children.length > 2) {
firstLoad = false;
onePageDown();
switchParity();
}
setSingleAlign(comicList.children.length - 1);
event.target.children[0].setAttribute('style', 'width:auto !important; height:auto !important;max-height: 100vh !important; max-width: 100% !important;');
});
})();