5ch image thumbnails&gallery

facilitate image browsing in 5ch threads

Du musst eine Erweiterung wie Tampermonkey, Greasemonkey oder Violentmonkey installieren, um dieses Skript zu installieren.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

Sie müssten eine Skript Manager Erweiterung installieren damit sie dieses Skript installieren können

(Ich habe schon ein Skript Manager, Lass mich es installieren!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         5ch image thumbnails&gallery
// @name:ja      5ch 画像サムネとガレリー追加
// @name:fr      5ch thumbnails&gallerie
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  facilitate image browsing in 5ch threads
// @description:ja  5chの画像閲覧支援
// @description:fr  faciliter la vue d'images sur 5ch
// @author       You
// @match        http://*.5ch.net/*
// @match        https://*.5ch.net/*
// @grant        none
// ==/UserScript==

var disablelog = true;
var oldconsolelog = console.log;
var emptyfunction = function() {};
console.log = !disablelog ? oldconsolelog : emptyfunction;

//create thumbnails

var it0 = performance.now();
var t0 = performance.now();
var links = [];
var posts = document.querySelectorAll('div.post');
for (let i = posts.length-1; i>-1;i--){
    var as = posts[i].querySelectorAll('a');
    for (let i = as.length-1; i>-1; i--){
        links.push(as[i]);
    }
}

console.log({links});

var t1 = performance.now();
console.log("generating link array took " + (t1 - t0) + " milliseconds.");

links.forEach(function(element, index) {
//    var address = element.textContent;
    var href = links[index].href; //skip 5ch jump page
    var find = "jump.5ch.net/?";
    var position = href.indexOf(find);
    if (position != -1){
        var newhref = href.substr(position + find.length);
        links[index].href = newhref;
        href=newhref;
    }
    var ext = href.substr(href.length-3);
    if(ext=="jpg" || ext=="png" || ext=="gif" || ext=="bmp"){
        element.className = 'thumblink';
        var newimg = document.createElement("img");
        newimg.src = href;
        newimg.className = 'bigthumb';
        newimg.width = 400;
        newimg.addEventListener("click",function(){resize(this);});
        element.insertAdjacentElement('afterend', newimg);
    }
});

function resize(img){
    console.log(img);
    var stylewidth = img.style.width;
    console.log("oldstylewidth: " + stylewidth);
    console.log('shiftkey: ' + event.shiftKey);
    if (!event.shiftKey) {
        switch(stylewidth){
            case "":
                largesize(img);
                break;
            case "100%":
                truesize(img);
                break;
            case "auto":
                smallsize(img);
                break;
        }
    } else {
        switch(stylewidth){
            case "":
                truesize(img);
                break;
            case "100%":
                smallsize(img);
                break;
            case "auto":
                largesize(img);
                break;
        }
    }
}

// misc features

var inittime0 = performance.now();

var postarray = [];
var thumbarray = [];
var bigthumbarray = [];

makebutton("myButtonhide",buttonhide,"H","5%","0px");
makebutton("myButtonwarp",buttonwarp,"W","10%","0px");
makebutton("myButtonup",buttonup,"↑","32.5%","0px");
makebutton("myButtondown",buttondown,"↓","30%","0px");
makebutton("myButtoncurrent",buttoncurrent,"c","25%","0px");
//makebutton("myButtoncheck",buttoncheck,"check","20%","0px");
makebutton("myButtonfirst",buttonfirst,"f","22.5%","0px");
makebutton("myButtonlast",buttonlast,"l","20%","0px");
makebutton("myButtonresizeall0",buttonresizeall0,"0","60%","0px");
makebutton("myButtonsizeall1",buttonresizeall1,"1","62.5%","0px");
makebutton("myButtonsizeall2",buttonresizeall2,"2","65%","0px");
makebutton("myButtonlightbox",buttonlightbox,"G","90%","0px");

//buttons for debug purposes
/*makebutton("myButtonrebuild",buttonrebuild,"R","95%","0px"); //re-initialize gallery contents
makebutton("myButtonlog",buttonlog,"log","97.5%","97.5%");*/ //toggle console log display

var hidden = false;
function buttonhide (){
    if(!hidden){
        collapse();
    } else {
        uncollapse();
    }
    hidden = !hidden;
    var button = document.getElementById("myButtonhide");
    button.style.color = hidden ? "red" : "";
}

var warp = false;
function buttonwarp (){
    warp = !warp;
    var button = document.getElementById("myButtonwarp");
    button.style.color = warp ? "red" : "";
}

function buttonup(){
    moveelement(-1);
}

function buttondown(){
    moveelement(1);
}

function buttoncurrent(){
    moveelement(0);
}

function buttoncheck(){
    var posts = document.querySelectorAll("img.thumb_i");
    var current = getcurrent(posts);
}

function buttonlast(){
    if(thumbarray.length == 0) {initarrays()};
    var current = getcurrent(bigthumbarray);
    console.log("go to last: last: " + (thumbarray.length-1) + " current: " + current +" move: " +(thumbarray.length-1-current));
    moveelement(thumbarray.length-1-current);
}

function buttonfirst(){
    if(thumbarray.length == 0) {initarrays()};
    var current = getcurrent(bigthumbarray);
    console.log("go to first: current: " + current +" move: " + -current);
    moveelement(-current);
}

function buttonresizeall0(){
    resizeall(0);
}

function buttonresizeall1(){
    resizeall(1);
}

function buttonresizeall2(){
    resizeall(2);
}

function buttonlightbox(){
    var hide = lightbox.style.display == 'none';
    initlightbox();
    lightbox.style.display = hide ? '' : 'none';
    dimlight.style.display = lightbox.style.display;
    document.getElementById('myButtonlightbox').style.color = hide ? 'red' : '';
    var activeelement = document.activeElement;
}

function buttonrebuild(){
    thumbarray = [];
    bigthumbarray = [];
    initarrays();
}

function buttonlog(){
    disablelog = !disablelog;
    console.log = !disablelog ? oldconsolelog : function(){};
    document.getElementById('myButtonlog').style.color = !disablelog ? 'blue' : 'black';
}

function togglelightboxview(){
    var hide = lightboxview.style.display == 'none';
    lightboxview.style.display = hide ? '' : 'none';
    dimdimlight.style.display = lightboxview.style.display;
    var LBVnext = document.getElementById('myButtonLBVnext');
    var LBVprev = document.getElementById('myButtonLBVprev');
    if(LBVnext)LBVnext.style.display = hide ? '' : 'none';
    if(LBVprev)LBVprev.style.display = hide ? '' : 'none';
}

function initarrays(){
    var t0 = performance.now();
    var thumbs = document.querySelectorAll('a.thumblink');
    var bigthumbs = document.querySelectorAll("img.bigthumb");
    thumbarray = Array.from(thumbs);
    bigthumbarray = Array.from(bigthumbs);
    removetreeview(thumbarray,bigthumbarray);
    var t1 = performance.now();
    console.log('initarrays took ' + (t1-t0) + ' miliseconds');
    console.log({thumbarray},{bigthumbarray});
}

function moveelement(change){
    var navoffset = document.getElementsByClassName("navbar-fixed-top search-header")[0].getBoundingClientRect().height;
    if(thumbarray.length == 0) {initarrays()};
    var current = getcurrent(bigthumbarray);
    var target = current+change;
    if (!warp){
        target = Math.min(Math.max(target, 0), thumbarray.length-1); //cap to 0 and last;
    } else{
        target %= (thumbarray.length);
        if(target<0)target=thumbarray.length-1;
    }
    thumbarray[target].scrollIntoView();
    console.log("change: "+change);
    console.log("target: "+target);
    console.log(thumbarray[target]);
    window.scrollBy(0, -navoffset);
}

function collapse(){
    if(postarray.length == 0) {
        var d = document;
        var posts = d.getElementsByClassName("post");
        postarray = Array.from(posts);
    }
    for (let i = postarray.length-1; i > -1; i--){
        var post = postarray[i];
        var message = post.getElementsByClassName("message")[0];
        var content = message.innerText;
        if (content.indexOf("ttp") == -1){
            console.log(post.id + "hide");
            post.style.display = "none";
            post.className = "posthidden";
        } else {
            console.log(post.id + "show");
        }

    }
}

function uncollapse(){
    var d = document;
    var posts = d.getElementsByClassName("posthidden");
    for (let i = posts.length-1; i > -1; i--){
        var post = posts[i];
        post.style.display = "";
        post.className = 'post';

    }

}

function getcurrent(coll){
    console.log('getcurrent of' ,{coll});
    var navoffset = document.getElementsByClassName("navbar-fixed-top search-header")[0].getBoundingClientRect().height;
    console.log("navoffset: " + navoffset);
    for (let i = 0, run = coll.length; i<run;i++){
        var rect = coll[i].getBoundingClientRect();
        console.log("rectbottom check of " +i +"th: " + rect.bottom);
        if (rect.bottom > (navoffset+1)){
            console.log("getcurrent result: " + i);
            return i;
        }
    }
    console.log("getcurrent result: " + (coll.length-1));
    return coll.length-1;
}

function collection2array(coll,array){
    for (let i = 0, run = coll.length; i < run; i++){
        array[i] = coll[i];
    }
}

function removetreeview(array,bigarray){
    bigarray = bigarray || [];
    var oriarraylength = array.length;
    var oribigarraylength = bigarray.length;
    for (let i = array.length-1; i > -1; i--){
        var istreeview = array[i].closest(".treeView");
        var isposthover = array[i].closest('.post_hover');
        if (istreeview || isposthover){
            array.splice(i,1);
        }
    }
    for (let i = bigarray.length-1; i > -1; i--){
        var istreeview = bigarray[i].closest(".treeView");
        var isposthover = bigarray[i].closest('.post_hover');
        if (istreeview || isposthover){
            bigarray.splice(i,1);
        }
    }
    var newarraylength = array.length
    var newbigarraylength = bigarray.length
    }

function resizeall(size){
    console.log({size});
    if(thumbarray.length == 0) {initarrays()};
    var current = getcurrent(bigthumbarray);
    var rescrolloffset = bigthumbarray[current].getBoundingClientRect().top;
    console.log({current},{rescrolloffset});
    var arrayoffunctions = [smallsize, largesize, truesize];
    bigthumbarray.forEach(function(element,index){
        arrayoffunctions[size](element);
    });
    bigthumbarray[current].scrollIntoView();

    window.scrollBy(0,-rescrolloffset);
}

function smallsize(element){
    if(!element)return;
    console.log('transform: smallsize');
    element.style.maxHeight = "";
    element.style.maxWidth = "";
    element.style.width = "";
    element.style.border="";
}
function largesize(element, maxheight, widthmod, border){
    if(!element)return;
    console.log('transform: largesize');
    maxheight = maxheight || 80;
    widthmod = (widthmod || 100)/100;
    widthmod = 1;
    border = border == undefined ? true : border;
    var ratio = element.height / element.width;
    element.style.maxHeight = maxheight +"vh";
    element.style.maxWidth = (maxheight / ratio * widthmod) +"vh";
    element.style.width = "100%";
    element.style.height = "auto";
    console.log({maxheight},{border});
    if (border)element.style.border='2px solid yellow';
}
function truesize(element){
    if(!element)return;
    console.log('transform: truesize');
    element.style.maxHeight = "";
    element.style.maxWidth = "";
    element.style.width = "auto";
    element.style.border='2px solid green';
}

// LIGHT BOX START

var lightbox = document.createElement("div");
lightbox.className = 'lightbox';
lightbox.style.position = 'fixed';
lightbox.style.zIndex = 9998;
lightbox.style.width = '100%';
lightbox.style.height = '100%';
lightbox.style.overflow = 'auto';
lightbox.style.top = 0;
lightbox.style.display = 'none';
lightbox.style.paddingTop = '2.5%';
lightbox.addEventListener('click',lightboxclick);

function lightboxclick(e){
    var cond1 = (event.target.tagName !='IMG');
    var cond2 = (dimdimlight.style.display == 'none');
    var ddl = dimdimlight.style.display;
    console.log({cond1},{cond2});
    if(cond1){
        if(cond2){
            buttonlightbox();
        } else {
            togglelightboxview();
        }
    }
}

var lightboxcontent = document.createElement('div');
lightboxcontent.className = 'lightboxcontent';
lightboxcontent.style.position = 'absolute';
lightboxcontent.style.zIndex = 10005;
lightboxcontent.style.margin = 'auto';
lightboxcontent.style.padding = '2.5%';
lightboxcontent.style.width = '100%';
lightboxcontent.style.maxWidth = '1300px';
lightbox.appendChild(lightboxcontent);

var dimlight = lightbox.cloneNode();
dimlight.className = 'dimlight';
dimlight.style.width = '100%';
dimlight.style.left = 0;
dimlight.style.zIndex = 9997;
dimlight.style.backgroundColor = 'rgba(0, 0, 0, 0.6)';
dimlight.style.pointerEvents = 'none';
var lightboxready = false;

var dimdimlight = dimlight.cloneNode();
dimdimlight.className = 'dimdimlight';
dimdimlight.style.zIndex = 10100;
dimdimlight.style.pointerEvents = '';

var lightboxview = lightboxcontent.cloneNode();
lightboxview.className = 'lightboxview';
lightboxview.padding = '';
lightboxview.style.zIndex = 11111;
lightboxview.style.position = 'fixed';
lightboxview.style.display = 'none';
lightboxview.style.maxWidth = '';
lightboxview.style.height = '100%';

var lightboxviewimg = document.createElement('img');
lightboxviewimg.style.zIndex = 33333;
lightboxviewimg.style.position = 'absolute';
lightboxviewimg.style.marginLeft ='auto';
lightboxviewimg.style.marginRight = 'auto';
lightboxviewimg.style.left = 0;
lightboxviewimg.style.right = 0;
lightboxviewimg.style.width = '1px';
lightboxviewimg.style.marginTop = '-2.5vw';

lightboxview.appendChild(lightboxviewimg);
lightbox.appendChild(lightboxview);

function initlightbox(){
    if(lightboxready)return;
    if(thumbarray.length == 0) {initarrays()};
    console.log({bigthumbarray});
    bigthumbarray.forEach(function(element,index){
        var newimg = document.createElement('img');
        newimg.src=element.src;
        newimg.height = 225;
        newimg.addEventListener('click',function(){scroll2me(thumbarray[index]);});
        newimg.addEventListener('mousedown',function(click){lbimgclick(click,index);});
        newimg.style.maxHeight = '80pv';
        newimg.style.maxWidth = '';

        lightboxcontent.appendChild(newimg);

    });
    document.body.appendChild(lightbox);
    lightbox.appendChild(dimlight);
    lightbox.appendChild(dimdimlight);
    makebutton("myButtonLBVnext",buttonLBVnext,"next","1%","52.5%");
    makebutton("myButtonLBVprev",buttonLBVprev,"prev","1%","47.5%");
    document.getElementById('myButtonLBVnext').style.display = 'none';
    document.getElementById('myButtonLBVprev').style.display = 'none';
    console.log({lightbox});
    lightboxready = true;
}

function buttonLBVnext(){
    moveLBV(+1);
}
function buttonLBVprev(){
    moveLBV(-1);
}

var currentLBV = 0;
function lbimgclick(click,index){
    console.log('middleclicked on lightbox img');
    switch (click.which){
        case 2:
            click.preventDefault();
            currentLBV = index;
            lightboxviewimg.src = bigthumbarray[currentLBV].src;
            largesize(lightboxviewimg,'92.5','95',false);
            togglelightboxview();
    }
}

function scroll2me(element){
    element.scrollIntoView();
    var navoffset = document.getElementsByClassName("navbar-fixed-top search-header")[0].getBoundingClientRect().height;
    window.scrollBy(0, -navoffset);
}

function moveLBV(change){
    currentLBV = maptorange(currentLBV+change,bigthumbarray.length-1,0,true);
    lightboxviewimg.src = bigthumbarray[currentLBV].src;
    smallsize(lightboxviewimg);
    largesize(lightboxviewimg,'92.5','95',false);
}


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);
}

function maptorange(value,max,min,wrap){
    value = value || 0;
    max = max || 0;
    min = min || 0;
    wrap = wrap || true;
    console.log("maptorange: ",{wrap},{value},{max},{min});
    if (!wrap) return Math.min(Math.max(value, min), max);
    value = value % (max+1);
    if (value < min) value += max - min + 1;
    return value;
}

var inittime1 = performance.now();
console.log((inittime1-inittime0) + ' miliseconds taken by script');