您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds board title, catalog, images, download, and style to the top bar.
// ==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>] <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; } }); } });