Gelbooru Endless Scroll

Adds endless scroll function to Gelbooru

Versione datata 18/12/2016. Vedi la nuova versione l'ultima versione.

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @id             gelbooru-endless-scroll
// @name           Gelbooru Endless Scroll
// @version        1.3
// @namespace      intermission
// @author         intermission
// @license        WTFPL; http://www.wtfpl.net/about/
// @description    Adds endless scroll function to Gelbooru
// @include        http://gelbooru.com/index.php?*
// @include        https://gelbooru.com/index.php?*
// @run-at         document-end
// @grant          none
// ==/UserScript==

(function(){
	"use strict";
	var d = document, _on = false, test_var, url,
	v = ["span.thumb[id^='s']", "div.pagination"],
	vis = function(el) {
		var rect = el.getBoundingClientRect();
		return (
			rect.top + rect.height >= 0 &&
			( d.documentElement.clientHeight - rect.bottom ) + rect.height >= 0
		);
	}, target = d.querySelector(v[1]), total,
	page = function(doc) {
		var images, pageNo = d.createElement`span`, frag = d.createDocumentFragment(), container;
		images = [].slice.call(doc.querySelectorAll(v[0]));
		if (images.length == 0) {
			fetch`/intermission.php`.then(req);
			throw undefined;
		}
		pageNo.innerHTML = "Page " + url.index + "~<span>out of " + total + "</span>";
		pageNo.className = "thumb";
		pageNo.style = "display:flex;flex-direction:column;"
		frag.appendChild(pageNo);
		pageNo.firstElementChild.style = "margin:auto 0 30px";
		images.map(a => {
			let fn = e => {
				e.target.onload = null;
				a.style.overflow = "visible";
			};
			a.style.overflow = "hidden";
			a.querySelector("img").onload = fn;
			frag.appendChild(a);
		});
		container = d.querySelector(v[0]).parentNode;
		if (container.lastElementChild.matches`span`) container.appendChild(frag);
		else container.insertBefore(frag, container.querySelector`span.thumb:last-of-type + *`);
		if (list.length > 0) {
			events();
			process();
		} return;
	}, req = () => fetch(url.href).then(
		x => x.text().then(
			text => page((new DOMParser()).parseFromString(text, "text/html"))
		)
	).catch(err => {
		if (typeof err != "undefined") {
			console.error("Something unexpected happened\n", err);
			setTimeout(() => req(), 5000);
		}
	}), process = function() {
		if (vis(target)) {
			events();
			url = list.shift();
			return req();
		}
	}, events = function() {
		var name = (_on = !_on) ? "addEventListener" : "removeEventListener";
		window[name]("scroll", process, false);
		window[name]("resize", process, false);
		window[name]("visibilitychange", process, false);
	}, list = [];
	if (!target || !target.querySelector`a`) return;
	{
		let pagination = target.lastElementChild,
		n = d.querySelectorAll(v[0]).length,
		pid = window.location.href.match(/pid=([0-9]+)/),
		start_index = pid ? pid[1] / n + 1 : 1,
		end_index;
		if (!pagination.href) return;
		else {
			end_index = pagination.href.match(/pid=([0-9]+)/)[1] / n + 1;
			do {
				list.push({
					href: pagination.href.replace(/pid=[0-9]+/, "pid=" + start_index * n),
					index: ++start_index
				});
			} while(start_index != end_index);
			total = ++list.length;
		}
	}
	d.addEventListener("gelbooru-slide", () => {
		if (list.length > 0)
			events();
	}, false);
	events();
	process();
}())