4chan Gallery

Adds board title, catalog, images, download, and style to the top bar.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name          4chan Gallery
// @version       2.1.30
// @description   Adds board title, catalog, images, download, and style to the top bar.
// @include       http://boards.4chan.org/*
// @include       https://boards.4chan.org/*
// @include       http*://boards.4channel.org/*
// @namespace     https://greasyfork.org/users/3159
// @grant         GM_getValue
// @grant         GM_setValue
// @run-at        document-end
// ==/UserScript==

var bname = document.getElementsByClassName("boardTitle")[0].innerHTML;
if (bname.indexOf("/ - ") > -1) {
    bname = bname.split("/ - ")[1];
}
var path = document.location.pathname.split("/");

function xc(q, r) {
    a = document.getElementsByClassName("boardList");
    a[0].insertAdjacentHTML(q, r);
    a[1].insertAdjacentHTML(q, r);
    b = document.getElementsByClassName("customBoardList");
    if (b[0]) {
        b[0].insertAdjacentHTML(q, r);
        b[1].insertAdjacentHTML(q, r);
    }
}
xc("afterbegin", '[<a href="//boards.4chan.org/' + path[1] + '">' + bname + "</a>] ");
xc("beforeend", ( path[2] == "catalog" || path[2] == "thread" ) ? "" : '[<a href="//boards.4chan.org/' + path[1] + '/catalog">Catalog</a>] ');

function xi(q) {
    var b = document.getElementById(q);
    return b;
}
var nr = '<span style="float:right">[<a class=low href=javascript:void(0)>Style</a>]&nbsp<span>';
xi("navtopright").insertAdjacentHTML("afterend", nr);
xi("navbotright").insertAdjacentHTML("afterend", nr);

var themes = ['Yotsuba New', 'Yotsuba B New', 'Futaba New', 'Burichan New', 'Tomorrow', 'Photon', 'myn1', 'myn2']; // with custom themes!
var style = document.createElement('style');

//extention buttons css
stylev = "#togglePostFormLink{font-size:1.3em;margin:.7em}#postForm{margin-top:1em;margin-bottom:1em}.ad-cnt{margin:1vh}.center{font-size:0;border:0 !important;height:100% !important}";
//Gallery css
stylev += ".frameImage{display:none !important}.frameX{display:block !important;max-height:calc(100% - 1.5em) !important;max-width:calc(100% - 60px) !important;position:fixed;margin:auto;top:0;bottom:1.5em;left:0;right:0;z-index:10000}";

document.getElementsByTagName('head')[0].appendChild(style);
nws=document.getElementsByClassName('nws').length;

function get() {
    a = nws ? GM_getValue("4cIbackupT") : GM_getValue("4cIbackupT2");
    if (a) return a;
    cur = 0;
    if (nws && document.cookie.match(/nws_style=((\w|\s)*)/)) cur = document.cookie.match(/nws_style=((\w|\s)*)/)[1];
    if (!nws && document.cookie.match(/(^|[^n])ws_style=((\w|\s)*)/)) cur = document.cookie.match(/(^|[^n])ws_style=((\w|\s)*)/)[2];
    if (cur === 0) cur = 'Yotsuba New';
    for (i = 0; i < themes.length; i++) {
        if (themes[i] == cur) {
            return i;
        }
    }
}

function set(a) {
    console.log(themes[a]);
    if (themes[a].split('myn')[1]){
        if (nws) GM_setValue("4cIbackupT", a);
        else GM_setValue("4cIbackupT2", a);
        //custom themes!
        if(themes[a] == "myn1"){
            a=0;
            style.innerHTML = stylev + "body{background:#f4f4f4;background:url('http://i.imgur.com/MrGskEp.png')}div.reply{background-color:#FDFDFD;border-color:#D6D6D6}";
        } else if (themes[a] == "myn2"){
            a=4;
            style.innerHTML = stylev + "body{transition: background 300ms ease-in 200ms;background:url('http://i.imgur.com/xv3RmOQ.png');color:#999}div.reply{background-color:#1b1b1b;border-color:#454546}.reply.highlight{border: 1px solid #5eaf55 !important}";
        }
        //end custom themes!
    } else {
        if (nws) GM_setValue("4cIbackupT", 0);
        else GM_setValue("4cIbackupT2", 0);
        style.innerHTML = stylev;
    }
    if (x){
        if (nws){
            document.cookie = "nws_style="+themes[a];
        } else {
            document.cookie = "ws_style="+themes[a];
        }
        if (path[2] == "catalog") {
            location.reload();
        } else {
            location.href = "javascript:setActiveStyleSheet('" + themes[a] + "')";
        }
    }
}

function cstyle() {
    if (get() > (themes.length - 2)) {
        set(0);
    }
    else {
        set(get() + 1);
    }
}

x=0;
set(get());
x=1;

var low = document.getElementsByClassName("low");
low[0].onclick = cstyle;
low[1].onclick = cstyle;

// Gallery
// in 4chan Settings (Images & Media) enable "Image expansion"
// Don't want the Images button? delete everything bellow!

window.addEventListener('load', function () {
    if (path[2] == "thread") {

        xc("beforeend", " [<a class=gl href=javascript:void(0)>Gallery</a>] ");
        s = document.getElementsByClassName("gl");
        for (i = 0; i < s.length; i++) {
            s[i].onclick = trigger;
        }

        function createdwn(a){
            dwn = document.createElement("a");
            dwn.innerText = "[⇩] ";
            dwn.style.opacity = "0";
            dwn.style.cursor = "pointer";
            dwn.onmouseover = function (b) {
                b.target.style.opacity = "1";
            };
            dwn.onmouseout = function (b) {
                b.target.style.opacity = "0";
            };
            dwn.onclick = function () {
                var link, allLinks = [], imgs = document.querySelectorAll(".fileThumb ");
                for (var i = 0; i < imgs.length; i++) {
                    if (imgs[i].getAttribute("href")) {
                        link = imgs[i].getAttribute("href").split("//")[1];
                        allLinks.push("curl -O <a download href='https://" + link + "'>https://" + link + "</a> && ");
                    }
                }
                document.body.innerHTML = 'N=1 && while [[ -d "4curl-$N" ]] ; do N=$(($N+1)) ; done && mkdir -p 4curl-$N && cd 4curl-$N && <br /><br />';
                for (i = 0; i < allLinks.length; i++) {
                    document.body.innerHTML += allLinks[i] + 'echo "' + (i+1) + '/' + allLinks.length + '" && <br />';
                }
                document.body.innerHTML += 'echo "done" <br /><br /> select all and paste into terminal, hit enter, then navigate to folder "4curl-#"';
            };
            a.appendChild(dwn);
        }

        d1=document.getElementsByClassName('boardList');
        if(d1.length){
            createdwn(d1[0]);
            createdwn(d1[1]);
        }
        d2=document.getElementsByClassName('customBoardList');
        if(d2.length){
            createdwn(d2[0]);
            createdwn(d2[1]);
        }
        bonus = [];
        tt = 1;
        titles = [];
        links = [];
        fi = 0;
        frameN = 0;
        cln = 0;
        ai = 0;
        z=0;

        function endalert() {
            ea = document.createElement("div");
            c = ea.style;
            ea.id = "theend";
            for (var d = "0123456789ABCDEF".split(""), a = "#", e = 0; 6 > e; e++) {
                a += d[Math.round(15 * Math.random())];
            }
            c.backgroundColor = a;
            c.cssText += "line-height:50px;width:200px;height:50px;position:fixed;margin:auto;left:0;right:0;top:0;bottom:0;font-size:42px;text-align:center;color:#fff;z-index:10001";
            ea.innerText = "The End";
            document.body.appendChild(ea);
            setTimeout(function () {
                z = document.getElementById("theend");
                z.parentNode.removeChild(z);
            }, 420);
        }

        function change(a) {
            i1 = document.getElementsByClassName('file');
            if (a) {
                for (fi; fi < i1.length; fi++) {
                    console.log(fi + ' ' + i1.length);
                    if (i1[fi].getElementsByClassName('expanded-thumb').length) {
                        cln = i1[fi].getElementsByClassName('expanded-thumb')[0];
                    } else if (i1[fi].getElementsByClassName('expandedWebm').length) {
                        cln = i1[fi].getElementsByClassName('expandedWebm')[0];
                    } else cln = null;
                    if (cln) {
                        console.log('adding');
                        cln.className = "frameImage";
                        cln.onclick = function () {
                            next(1);
                        };
                        cln.onerror = function (y) {
                            //console.log(y.target); //reload images?
                        };
                        document.body.appendChild(cln);
                        //add recent +?
                        links[ai] = i1[fi].parentElement.id;
                        if (i1[fi].parentElement.getElementsByClassName('backlink').length) {
                            bonus[ai] = i1[fi].parentElement.getElementsByClassName('backlink')[0].getElementsByClassName('quotelink');
                        } else bonus[ai] = "";

                        titles[ai] = i1[fi].children[0].children[0].getAttribute("title");
                        if (titles[ai]) {
                            titles[ai] = "[ " + i1[fi].children[0].innerText.split(", ")[1].split(")")[0] + " ][ " + titles[ai] + " ]";
                        } else {
                            t2 = i1[fi].children[0].innerText;
                            titles[ai] = "[ " + t2.split(", ")[1].split(")")[0] + " ][ " + t2.split("File: ")[1].split(" (")[0] + " ]";
                        }
                        ai++;
                    }
                }
            } else {
                frame = document.getElementsByClassName('frameImage');
                if (frame[frameN].tagName == "VIDEO") frame[frameN].pause(); //new new
                frame[frameN].className = "frameImage";
                bg.style.display = "none";
                larw.style.display = "none";
                rarw.style.display = "none";
                li.style.display = "none";
                ri.style.display = "none";
            }
        }

        function i4(a){
            r = document.createElement("a");
            r.style.setProperty ("color", "#bababa", "important"); //add colors?
            r.innerText = z ? " [ " + a.split("p")[1] + " ]" : " +";
            r.onmouseover = function () {
                bb = document.getElementById(a);
                if (document.getElementsByClassName('post reply').length){
                    pColor = window.getComputedStyle(document.getElementsByClassName('post reply')[0]).backgroundColor;
                } else pColor = window.getComputedStyle(document.body).backgroundColor;
                bb.style.backgroundColor = pColor;
                bb.style.cssText += "position:fixed;z-index:10001;left:50%;top:50%;transform:translate(-50%,-50%);margin:0";
            };
            r.onmouseout = function () {
                bb.style.cssText = "";
            };
            r.onclick = function () {
                bb.style.cssText = "";
                bb.scrollIntoView();
                trigger();
            };
            bi.appendChild(r);
            z=0;
        }

        function info(a) {
            bi.innerHTML = "";
            ii.innerText = titles[a];
            i2.innerText = "[ " + (a + 1) + "/" + frame.length + " ]";
            if (bonus[a].length){
                for (i=--bonus[a].length;i>-1;i--){
                    i4(bonus[a][i].href.split(/#(p.*)/)[1]);
                }
            }
            z=1;
            i4(links[a]);
        }
        function next(a) {
            if (!tt) {
                bg.style.display = "block";
                larw.style.display = "block";
                rarw.style.display = "block";
                li.style.display = "block";
                ri.style.display = "block";
                pics = document.getElementsByClassName('fileThumb');
                aa=fi;
                while (aa < pics.length) {
                    pics[aa].children[0].click();
                    aa++;
                }
                change(1);

                frame = document.getElementsByClassName('frameImage');
                console.log('next '+a+'frames'+frame.length+'N'+frameN);
                if (a == 2) {
                    frame[frameN].className += " frameX";
                    if (frame[frameN].tagName == "VIDEO") frame[frameN].play();
                } else if (a == 1) {
                    if (frameN < --frame.length) {
                        frame[frameN].className = "frameImage";
                        if (frame[frameN].tagName == "VIDEO") frame[frameN].pause();
                        frame[++frameN].className += " frameX";
                        if (frame[frameN].tagName == "VIDEO") frame[frameN].play();
                    } else {
                        endalert();
                    }
                } else {
                    if (frameN > 0) {
                        frame[frameN].className = "frameImage";
                        if (frame[frameN].tagName == "VIDEO") frame[frameN].pause();
                        frame[--frameN].className += " frameX";
                        if (frame[frameN].tagName == "VIDEO") frame[frameN].play();
                    }
                }
                info(frameN);
                //start webm, stop previous
            }
        }

        function trigger() {
            tt = tt ? 0 : 1;
            if (tt) {
                change(0);
            } else {
                next(2);
            }
        }

        bg = document.createElement("div");
        bg.style.cssText = "background: rgba(0, 0, 0, .85);position:fixed;top:0;left:0;z-index:9999;width:100%;height:100%;display:none";
        bg.onclick = trigger;
        document.body.appendChild(bg);

        //extra buttons
        larw = document.createElement("div");
        rarw = document.createElement("div");
        var arw = "cursor:pointer;position:fixed;z-index:10000;top:calc(50% - 15px);border-top: 15px solid transparent;border-bottom: 15px solid transparent;display:none;border-";
        larw.style.cssText = arw + "right: 20px solid #bababa;left:5px";
        rarw.style.cssText = arw + "left: 20px solid #bababa;right:5px";
        larw.onclick = function () {
            next(0);
        };
        rarw.onclick = function () {
            next(1);
        };
        document.body.appendChild(larw);
        document.body.appendChild(rarw);
        li = document.createElement("div");
        ri = document.createElement("div");
        bi = document.createElement("span");
        var iv = "position:fixed;bottom:0;z-index:10000;margin:0;display:none;text-decoration:none;";
        li.style.cssText = iv + "left:0";
        ri.style.cssText = iv + "right:0";
        ii = document.createElement("a");
        ii.onclick = function () {
            frame[frameN].className = "frameImage";
            frameN = 0;
            next(2);
        };
        i2 = document.createElement("a");
        i2.onclick = function () {
            frame[frameN].className = "frameImage";
            frameN = --frame.length;
            next(2);
        };
        document.body.appendChild(li);
        ii.style.setProperty ("color", "#bababa", "important");
        li.appendChild(ii);
        document.body.appendChild(ri);
        i2.style.setProperty ("color", "#bababa", "important");
        ri.appendChild(bi);
        ri.appendChild(i2);
        //end buttons

        document.addEventListener("keydown", function (e) {
            switch (e.which) {
                case 37:
                    next(0);
                    break;
                case 39:
                    next(1);
                    break;
            }
        });
    }
});