Gelbooru Endless Scroll

Adds endless scroll function to Gelbooru

Od 10.12.2016.. Pogledajte najnovija verzija.

// ==UserScript==
// @id             gelbooru-endless-scroll
// @name           Gelbooru Endless Scroll
// @version        1.2
// @namespace      intermission
// @author         intermission
// @license        CC0; https://wiki.creativecommons.org/wiki/CC0
// @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 = location.hostname.indexOf`gelbooru.com` > -1 ?
		["span.thumb[id^='s']", "div.pagination"] : ["span.thumb", "div#paginator"],
	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(x => 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 => 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();
		}
	}, 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();
}())