MMOLODA オートページ

自動で次のページの内容を表示

// ==UserScript==
// @name         MMOLODA オートページ
// @name:en      Mmoloda Autopager
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  自動で次のページの内容を表示
// @description:en Automatically load subsequent pages and append their contents
// @author       You
// @match        http://mmoloda.com/*/*
// @match        http://*.mmoloda.com/*
// @include      http://mmoloda-*.com/*
// @grant        none
// ==/UserScript==

if(document.URL.indexOf('image')>-1){
    throw '';
}

var superfluous;
var sftoggle = false;
var contentoffset = 0; //calculate space above content; used for rescrolling after zoom
var posts = getcontainer(document);
while (posts) {
    contentoffset += posts.offsetTop;
    posts = posts.offsetParent;
}

// == buttons ==
var buttontoggle = makebutton('buttontoggle',togglesupflu,'Hide','10%','0%');
var buttonpause = makebutton('buttonpause',buttpause,'Pause','12.5%','0%');
var buttonreverse = makebutton('buttonreverse',buttreverse,'Reverse','15%','0%');

var buttonminus = makebutton("myButtonminus",buttminus," - ","5%","0px");
var buttonplus = makebutton("myButtonplus",buttplus," + ","5%","30px");
var buttonreset = makebutton("myButtonreset",buttreset," 1x","5%","90px");
var buttondouble = makebutton("myButtondouble",buttdouble," 2x","5%","120px");


function togglesupflu(){
    sftoggle = !sftoggle;
    superfluous = superfluous || (coc == 'contents' ? Array.from(document.getElementById(coc).querySelectorAll("#"+coc+">div")) : (Array.from(document.querySelectorAll('#main > div')).slice(1))); //element structure differs depending on domain
    for (let i = superfluous.length-1; i > 0; i--){
        superfluous[i].style.display = sftoggle ? 'none' : '';
    }
    buttontoggle.style.color = sftoggle ? 'red' : '';
}

function buttpause(){
    pause = !pause;
    buttonpause.style.color = pause ? 'red' : '';
}

function buttreverse(){
    direction *= -1;
    buttonreverse.style.color = (direction != 1) ? 'red' : '';
}

function buttminus(){
    magnifylist(0.8);
}
function buttplus(){
    magnifylist(1.25);
}
function buttreset(){
    var reset = 1 / (getcontainer(document).style.zoom || 1);
    magnifylist(reset);
}
function buttdouble(){
    var double = 2 / (getcontainer(document).style.zoom || 1);
    magnifylist(double);
}

function magnifylist(mag){
    var oldtop = window.pageYOffset || document.documentElement.scrollTop;
    var oldbody = document.body.scrollHeight;
    var oldscrollpct = (oldtop - contentoffset) / (oldbody - contentoffset);
    var magtarget = getcontainer(document);
    magtarget.style.zoom = (magtarget.style.zoom || 1) * mag;
    magtarget.style.maxWidth = (magtarget.style.zoom != 1) ? '90%' : ''; //custom mmo addition
    var newbody = document.body.scrollHeight;
    var newtop = (newbody - contentoffset) * oldscrollpct + contentoffset;
    var left = window.pageXOffset || document.documentElement.scrollLeft;
    window.scrollTo(left,newtop);
}

// == auto pager customization ==

var pagename = 'page'; //string used in url for page counter
var firstpage = 1; //earliest page possible: usually 1, but sometimes 0
var apclocation = document.getElementById('listOffIndex'); //where to append auto page content

var coc = document.getElementById("contents") ? 'contents' : 'content'; //contents or content (different class name depending on domain)

function getlast(){ //obtain last page possible
    var saiko = document.querySelector('[title="最古"]');
    var output = getparam(saiko.href,pagename) || firstpage;
    return output;
}

function getcontainer(parent){ //obtain zooming target, container for posts&pager
    var output = parent.querySelector('#main');
    return output;
}

function getposts(parent){ //get posts
    if(coc=='contents'){
        var output = parent.querySelector('#'+coc).querySelector('ul');
    } else {
        var output = parent.querySelector('#'+coc).querySelector('table');
    }
    return output;
}

function getindex(parent){ //get index (page markers)
    var output = parent.querySelector('#listOffIndex');
    return output;
}

// == auto pager ==

var start = (getparam(document.URL,pagename)*1) || firstpage;
var initialstart = start;
var last = getlast();
var direction = 1;
var actionqueue = [];
var pagequeue = [];
var pause = false;

var autopagecontent = document.createElement('section');
autopagecontent.id = 'autopagecontent';
insertAfter(autopagecontent, apclocation);
var sessionname = document.URL;
var prevsessiondata = (JSON.parse(sessionStorage.getItem(sessionname)))||false;
if(prevsessiondata){
    autopagecontent.innerHTML += prevsessiondata[0];
    start = prevsessiondata[1];
    prevsessiondata = ""
}
var currentloaded = start;

console.log({start},{initialstart},{last},{currentloaded},{direction},{pause});

window.onbeforeunload = function() {
    if (autopagecontent.innerHTML){
        var data = [autopagecontent.innerHTML, currentloaded];
        sessionStorage.setItem(sessionname,JSON.stringify(data));
    }
}

document.onreadystatechange = function () {
    if (getparam(document.URL,pagename)){togglesupflu();}else{buttpause();}; //custom for mmo
    if (document.readyState == "complete" && document.body.scrollHeight <= window.innerHeight) {
        setTimeout(whattodo,50);
    }
}

window.onscroll = function() {
    if ((window.innerHeight + window.pageYOffset) >= document.body.offsetHeight - 100) {
        setTimeout(whattodo,50);
    }
};

// == auto pager functions ==

function whattodo() {
    if (pause){
        return
    }
    playqueue();
    addtoqueue();
}

function addtoqueue(){
    start = start+direction;
    if( (start <= last) && (start >= firstpage) ){
        loadnewpage(start);
    } else {
        start = Math.min(last, Math.max(1,start));
    }
}

function loadnewpage(newstart) {
    if (newstart > last){return;}
    var nextpageurl = setparam(document.URL,pagename,newstart);
    console.log("nextpageurl: " +nextpageurl);
    var output = getHTML( nextpageurl, function( nextpagehtml ) {
        var htmldiv = document.createElement('div');
        htmldiv.innerHTML = nextpagehtml;
        var nextpageimages = getposts(htmldiv);
        var nextpageindex = getindex(htmldiv);
        nextpageimages.removeAttribute('id');
        nextpageindex.removeAttribute('id');
        nextpageimages.className = 'autoposts';
        nextpageindex.className = 'autoindex';
        var tempdiv = document.createElement("div");
        tempdiv.className = "autopage";
        tempdiv.appendChild(nextpageimages);
        tempdiv.appendChild(nextpageindex);
        actionqueue[(newstart-currentloaded)*direction-1] = tempdiv;
        pagequeue[(newstart-currentloaded)*direction-1] = newstart;
        console.log('page added to queue: ' + newstart);
        if((newstart-currentloaded)*direction-1 == 0)playqueue();
    },'html');
}

function playqueue(){
    var changedpage;
    while (actionqueue[0]){
        autopagecontent.appendChild(actionqueue.shift());
        currentloaded = pagequeue.shift();
        console.log("currentloaded: " + currentloaded);
        changedpage = true;
    }
}

// == general functions ==

function insertAfter(newNode, referenceNode) {
    referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}

function getHTML(link, callback) {
    var xhr = new XMLHttpRequest();
    xhr.open("GET", link, true);
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
            callback(xhr.responseText);
        }
    };
    xhr.send(null);
}

function getparam(url,param) {
    var tempArray = url.split("?");
    var additionalURL = tempArray[1];
    var paramvalue = "";
    if(additionalURL) {
        tempArray = additionalURL.split("&");
        for ( var i = 0; i < tempArray.length; i++ ){
            if(tempArray[i].indexOf(param) !== -1){
                paramvalue = tempArray[i].substr(param.length+1);
            }
        }
    }
    return paramvalue;
}

function setparam(url,param,newvalue) {
    var newAdditionalURL = "";
    var tempArray = url.split("?");
    var baseURL = tempArray[0];
    var additionalURL = tempArray[1];
    var temp = "";
    var present = false;
    if(additionalURL) {
        tempArray = additionalURL.split("&");
        for ( var i = 0; i < tempArray.length; i++ ){
            if(tempArray[i].indexOf(param) !== -1){
                tempArray[i] = param + "=" + newvalue;
                present = true;
            }
            newAdditionalURL += temp+tempArray[i];
            temp = "&";
        }
    }
    var finalURL = baseURL+"?"+newAdditionalURL;
    if (!present) {
        finalURL += temp + param + "=" +newvalue;
    }
    return finalURL;
}

function makebutton(buttonname,event,text,bottom,left){
    text = text || "";
    bottom = bottom || "0";
    left = left || "0";
    var tempbutton = document.createElement("input");
    tempbutton.type = "button";
    tempbutton.id = buttonname;
    tempbutton.value = text;
    tempbutton.style.position = "fixed";
    tempbutton.style.bottom = bottom;
    tempbutton.style.left = left;
    tempbutton.addEventListener("click",event);
    tempbutton.style.zIndex = 9999;
    document.body.appendChild(tempbutton);
    return tempbutton;
}