您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
An automatic page refresher for Ponychan
// ==UserScript== // @name HAYLoader // @namespace Ponychan.net // @description An automatic page refresher for Ponychan // @include http://www.ponychan.net/chan/*/* // @version 1.00 // @grant metadata // ==/UserScript== var HAYmenuTitle = '<a id=\"haymenutitle\" class=\"adminbaritem\" >HAY ▼</a>'; document.getElementById('mainmenu').innerHTML = HAYmenuTitle + document.getElementById('mainmenu').innerHTML; document.getElementById('haymenutitle').addEventListener('click', HAYmenuClick, false); var HAYrefreshTime = parseInt(localStorage.HAYrefreshTime)>1?localStorage.HAYrefreshTime*1000:"15000"; var refreshTimer = setInterval(HAYcleanRefresh, HAYrefreshTime); var HAYtimezone; var HAYtwentyfourhour; try{ HAYtimezone = window.Ponychan.settings.get("time-zone"); HAYtwentyfourhour = window.Ponychan.settings.get("twelve-hour"); }catch(e){ HAYtimezone = localStorage.HAYtimezone?localStorage.HAYtimezone:"0"; HAYtwentyfourhour = localStorage.HAYtwentyfourhour?localStorage.HAYtwentyfourhour:"false"; } var HAYunread = 0; var HAYpageTitle = document.title; var HAYunfocused = false; HAYcreateQuickReply(); document.getElementById("HAYQRmover").addEventListener("mousedown",HAYDownQuickReply, false); document.getElementById("HAYQRmover").addEventListener("mouseup", HAYUpQuickReply, false); document.addEventListener("mousemove", HAYdragQuickReply, false); window.addEventListener("blur", function(){HAYunfocused=true;}); document.body.addEventListener("mouseout", function(){HAYunfocused=true;}); document.body.addEventListener("mouseover", function(){HAYunfocused=false; HAYunread = 0; document.title = HAYpageTitle;}); window.addEventListener("focus", function(){HAYunfocused=false; HAYunread = 0; document.title = HAYpageTitle;}); window.scrollTo(0, document.body.clientHeight); //make the page refresh cleanly function HAYcleanRefresh(){ var req = new XMLHttpRequest(); req.open("GET", location.href, true); req.onreadystatechange=function(){ if(req.readyState == 4 && (req.status == 200 || req.status == 302)){ var res = req.responseText; var tabls = document.getElementById("firstpageinside").getElementsByTagName("TABLE"); var lastKnownPost = tabls[tabls.length-1].children[0].children[0].children[1].id; var parser = new DOMParser(); var doc; doc = parser.parseFromString(res, "text/html"); //my original FF implementation if(doc == null) { //chromium workaround doc = document.implementation.createHTMLDocument(); doc.write(res); } var addedElements = new Array(); var tabls2 = doc.getElementById("firstpageinside").getElementsByTagName("TABLE"); var j = tabls2.length-1; var adopted = new Array(); while(j>0 && tabls2[j].children[0].children[0].children[1].id!=lastKnownPost){ adopted.push(document.importNode(tabls2[j], true)); j--; } while(adopted.length>0){ var currentNode = adopted.pop(); currentNode.getElementsByClassName("posttime")[0].innerHTML = correctTime(currentNode); HAYcollectReplies(currentNode); HAYgetPreviews(currentNode); HAYplayGIF(currentNode); HAYinsertLinks(currentNode); tabls[tabls.length-1].parentNode.insertBefore(currentNode,tabls[tabls.length-1].nextSibling); if(currentNode.getElementsByClassName("postername")[0].children[0]!=null){ if(currentNode.getElementsByClassName("postername")[0].children[0].innerHTML != document.getElementsByname("name")[0].value) HAYunread++; //console.log("link: " + currentNode.getElementByClassName("postername")[0].children[0].innerHTML + ", " + document.getElementsByName("name")[0].value); }else{ if(currentNode.getElementsByClassName("postername")[0].innerHTML != document.getElementsByName("name")[0].value) HAYunread++; //console.log("no link: " + currentNode.getElementsByClassName("postername")[0].innerHTML + ", " + document.getElementsByName("name")[0].value); } } if(HAYunread>0 && HAYunfocused == true){ document.title = HAYpageTitle + " (" + HAYunread + ")"; window.scrollTo(window.pageXOffset, document.body.scrollHeight); } document.getElementById("errorArea").innerHTML = ""; }else if(req.readyState == 4 && !(req.status == 200 || req.status == 302)){ document.getElementById("errorArea").innerHTML = "A recieving error has occurred: " + req.status; } } req.send(); } //make the page send cleanly function HAYcleanSend(){ var req = new XMLHttpRequest(); req.open("POST","http://www.ponychan.net/chan/board.php", true); req.onreadystatechange=function(){ if(req.readyState == 4 && (req.status == 200 || req.status == 302)){ document.getElementsByName("message")[0].value=""; document.getElementsByName("imagefile")[0].value=""; document.getElementById("quickmessage").value=""; HAYcleanRefresh(); }else if(req.readyState == 4 && !(req.status == 200 || req.status == 302)){ document.getElementById("errorArea").innerHTML = "A sending error has occurred: " + req.status; } document.getElementById("quicksubmit").disabled = false; document.getElementById("quicksubmit").innerHTML = "Reply"; } document.getElementById("quicksubmit").disabled = true; document.getElementById("quicksubmit").innerHTML = "Sending..."; req.send(new FormData(document.getElementById("postform"))); } //runs HAYcollectReplies in a timed fashion //watch it. If you screw up any function called by this function then they will all go wacky. var HAYlinkruns = 0; var HAYlinkcomplete = document.getElementById("firstpageinside").getElementsByTagName("TABLE").length-1; var HAYruninterval = setInterval(HAYtraverseLinks, 200); function HAYtraverseLinks(){ var tabls = document.getElementById("firstpageinside").getElementsByTagName("TABLE"); var fromPageBottom = document.body.scrollHeight - window.pageYOffset; for(var i = 0;HAYlinkruns<HAYlinkcomplete && i<50; i++,HAYlinkruns++){ HAYcollectReplies(tabls[HAYlinkcomplete - HAYlinkruns]); HAYplayGIF(tabls[HAYlinkcomplete - HAYlinkruns]); HAYinsertLinks(tabls[HAYlinkcomplete - HAYlinkruns]); } if(document.body.scrollHeight - fromPageBottom > 100) window.scrollTo(window.pageXOffset, document.body.scrollHeight - fromPageBottom); if(HAYlinkruns>=HAYlinkcomplete){ clearInterval(HAYruninterval); } } //moves the quick reply box var HAYxOffset = 0; var HAYyOffset = 0; var QRdrag = false; function HAYdragQuickReply(pos){ if(QRdrag == true){ var quickReply = document.getElementById("HAYquickReply"); if(HAYxOffset == 0){ HAYxOffset = pos.clientX - quickReply.style.left.substr(0, quickReply.style.left.length - 2); HAYyOffset = pos.clientY - quickReply.style.top.substr(0, quickReply.style.top.length - 2); //console.log("%i - %i = %i, %i - %i = %i", pos.clientX, quickReply.style.left, HAYxOffset, pos.clientY, quickReply.style.top, HAYyOffset); }else{ quickReply.style.left = new String(pos.clientX - HAYxOffset).concat("px"); quickReply.style.top = new String(pos.clientY - HAYyOffset).concat("px"); } window.getSelection().removeAllRanges(); } } function HAYDownQuickReply(){ QRdrag = true; } function HAYUpQuickReply(){ QRdrag = false; HAYxOffset = 0; HAYyOffset = 0; } //will poll and make sure reply forms are the same var matchReplies = "quickmessage"; //the reply box being used: message or quickmessage setInterval(HAYmatchReplies, 200); function HAYmatchReplies(){ if(matchReplies == "message"){ document.getElementById("quickmessage").value = document.forms.postform.message.value; document.getElementById("quickimagefile").value = document.forms.postform.imagefile.value.substring(document.forms.postform.imagefile.value.lastIndexOf("/")==-1?document.forms.postform.imagefile.value.lastIndexOf("\\"):document.forms.postform.imagefile.value.lastIndexOf("/")); }else if(matchReplies == "quickmessage"){ document.forms.postform.message.value = document.getElementById("quickmessage").value; document.getElementById("quickimagefile").value = document.forms.postform.imagefile.value.substring(document.forms.postform.imagefile.value.lastIndexOf("/")==-1?document.forms.postform.imagefile.value.lastIndexOf("\\"):document.forms.postform.imagefile.value.lastIndexOf("/")); } } //creates the quick reply box function HAYcreateQuickReply(){ var quickReply = document.createElement("DIV"); quickReply.id = "HAYquickReply"; quickReply.setAttribute("class","postblock"); quickReply.setAttribute("style","display:block;position:fixed;padding: 0px 2px 2px;"); quickReply.style.left = new String(window.innerWdith*0.6>window.innerWidth - 530?window.innerWidth*0.6:window.innerWidth - 530).concat("px"); quickReply.style.top = "50px"; quickReply.innerHTML="<div id=\"HAYQRmover\" style=\"font-family:Sans-Serif;text-align:center;cursor:default\" class=\"postername\">HAYcreatequickreply</div><div id=\"errorArea\" style=\"font-weight:bold;color:#992222;\"></div><textarea id=\"quickmessage\" style=\"font-family:Serif;height:150px;width:484px\"></textarea><br \><textarea style=\"height:18px;width:344px;\" multiline=\"false\" id=\"quickimagefile\" disabled></textarea><button type=\"button\" style=\"width:70px;height:26px;vertical-align:top;\" id=\"quickimagefilebutton\">Browse</button><button type=\"button\" style=\"height:26px;width:70px;position:fixed;vertical-align:top\" id=\"quicksubmit\">Reply</button>"; document.getElementById("firstpageinside").appendChild(quickReply); document.getElementById("quickmessage").addEventListener("focus", function(){matchReplies = "quickmessage"}, false); document.forms.postform.message.addEventListener("focus", function(){matchReplies = "message"}, false); document.getElementById("quickimagefile").addEventListener("click", function(){document.forms.postform.imagefile.click();matchReplies = "quickmessage"}, false); document.getElementById("quickimagefilebutton").addEventListener("click", function(){document.forms.postform.imagefile.click();matchReplies = "quickmessage"}, false); document.forms.postform.imagefile.addEventListener("focus", function(){matchReplies = "message"}, false); document.getElementById("quickmessage").addEventListener("blur", function(){matchReplies = "null"}, false); document.forms.postform.message.addEventListener("blur", function(){matchReplies = "null"}, false); document.forms.postform.imagefile.addEventListener("blur", function(){matchReplies = "null"}, false); document.getElementById("quicksubmit").addEventListener("click", HAYcleanSend, false); } //make the HAYmenu drop down var menuClosed = true; var HAYmenu = document.createElement('div'); HAYmenu.id = 'haymenu'; function HAYmenuClick(){ var menuRect = document.getElementById('haymenutitle').getBoundingClientRect(); var HAYmenuStyle = "position:fixed;top:" + menuRect.bottom + "px;left:" + menuRect.left + "px;display:block;padding:4px;"; HAYmenu.setAttribute("style", HAYmenuStyle); HAYmenu.setAttribute('class', 'darkbar'); var refreshTime = localStorage.HAYrefreshTime!=null?localStorage.HAYrefreshTime:"20"; if(menuClosed == true){ document.getElementById('verytopbar').insertBefore(HAYmenu,document.getElementById('homedropdown')); HAYmenu.innerHTML = "Refresh Time:<br><input type=\"text\" size=\"3\" value=\"" + refreshTime + "\" id=\"HAYrefreshTime\"></input>Seconds<br>" try{ HAYmenu.innerHTML = HAYmenu.innerHTML + "24-hour time: <input type=\"checkbox\" " + (HAYtwentyfourhour=="true"?"checked":"") + " id=\"HAYtwentyfourhour\" /><br>Timezone:<input type=\"text\" value=\"" + HAYtimezone + "\" size=3 id=\"HAYtimezone\" /><br>"; }catch(e){ HAYmenu.innerHTML = HAYmenu.innerHTML + "24-hour time: <input type=\"checkbox\" id=\"HAYtwentyfourhour\" /><br>Timezone:<input type=\"text\" value=\"0\" size=3 id=\"HAYtimezone\" /><br>"; } var apply = document.createElement("button"); apply.type = "button"; apply.innerHTML = "APPLY"; HAYmenu.appendChild(apply); apply.addEventListener("click", function(){ localStorage.HAYrefreshTime = parseInt(document.getElementById("HAYrefreshTime").value); localStorage.HAYtimezone = parseInt(document.getElementById("HAYtimezone").value); localStorage.HAYtwentyfourhour = document.getElementById("HAYtwentyfourhour").checked; window.location.reload(); }); document.getElementById('haymenutitle').innerHTML='HAY ▲'; menuClosed = false; }else{ HAYmenu.parentNode.removeChild(HAYmenu); document.getElementById('haymenutitle').innerHTML='HAY ▼'; menuClosed = true; } } //here is a function to correct the time on the posts function correctTime(elem){ var timezone; var twentyfourhour; try{ timezone = window.Ponychan.settings.get("time-zone") + 8; twentyfourhour = window.Ponychan.settings.get("twelve-hour"); }catch(e){ //fallback settings for dumb browsers timezone = HAYtimezone!=null && HAYtimezone!="NaN" && HAYtimezone < 12 && HAYtimezone >-12?parseInt(HAYtimezone) + 8:"8"; twentyfourhour = HAYtwentyfourhour!=null?HAYtwentyfourhour:"false"; } var postTime = elem.getElementsByClassName("posttime")[0].innerHTML.substring(5,26); var postDay = postTime.charAt(5)>='0' && postTime.charAt(5)<='9'?postTime.substring(4,6):postTime.substring(4,5); var postYear = postDay<10?postTime.substring(9,13):postTime.substring(10, 14); var postMonth = postTime.substring(0, 3); postMonth = postMonth=="Jan"?0:postMonth=="Feb"?1:postMonth=="Mar"?2:postMonth=="Apr"?3:postMonth=="May"?4:postMonth=="Jun"?5:postMonth=="Jul"?6:postMonth=="Aug"?7:postMonth=="Sep"?8:postMonth=="Oct"?9:postMonth=="Nov"?10:postMonth=="Dec"?11:postMonth; var postHour = postDay<10?postTime.substring(14,16):postTime.substring(15,17); var postMinute = postDay<10?postTime.substring(17,19):postTime.substring(18,20); var finalDate = new Date(new Date(postYear, postMonth, postDay, postHour, postMinute).getTime()+(3600000*timezone)); var dateString = finalDate.toString().substring(0,3) + ", " + finalDate.toString().substring(4,10) + ", " + finalDate.getFullYear() + " "; //console.log(postTime + ", " + (postTime.charAt(6)>='0' && postTime.charAt(6)<='9') + " " + postYear + " " + postMonth + " " + postHour + " " + postMinute + " " + finalDate.toString() + " " + timezone); if(twentyfourhour==false){ dateString = dateString + finalDate.toString().substring(16, 18) + ":" + finalDate.toString().substring(19,21); }else{ dateString = dateString + (finalDate.getHours()>12?finalDate.getHours()-12:finalDate.toString().substring(16,18)) + ":" + finalDate.toString().substring(19,21) + " <span style=\"font-size:0.75em\">" + (finalDate.getHours()>12?"PM":"AM") + "</span>"; } return dateString; } //this function will create links to any post that replies to this one. function HAYcollectReplies(elem){ var links = elem.getElementsByTagName("a"); var linklength = links.length; for(var i = 0; i<linklength; i++){ if(links[i].innerHTML.trim().substr(0,8) == ">>"){ if(links[i].innerHTML.trim().substr(8)<elem.children[0].children[0].children[1].id.trim().substr(5)){ try{ var illink = document.createElement("a"); illink.href = window.location.href.substr(0, (window.location.href.lastIndexOf("#")>0?window.location.href.lastIndexOf("#"):window.location.href.length)) + "#" + elem.getElementsByClassName("reflink")[0].children[1].innerHTML; illink.innerHTML = ">>" + elem.getElementsByClassName("reflink")[0].children[1].innerHTML; illink.setAttribute("style", "font-size:9pt;color:rgb(0,16,176);"); illink.addEventListener("mouseover", HAYaddRefLinkPreview); illink.addEventListener("mouseout", HAYdelRefLinkPreview); document.getElementById("reply" + links[i].innerHTML.trim().substr(8)).children[2].appendChild(illink); }catch(e){ } } } } } //replaces the post links that insert links to the quickmessage box. Makes them work myway. function HAYinsertLinks(elem){ var links = elem.getElementsByClassName("reflink")[0].getElementsByTagName("a"); var linkslength = links.length; if(linkslength > 0){ for(var i = 0; i<linkslength; i++){ if(links[i].innerHTML.trim().substr(0,8)!=">>"){ //console.log("fixing: " + links[i].innerHTML); var newlink = document.createElement("a"); newlink.innerHTML = links[i].innerHTML; newlink.href = links[i].href; newlink.addEventListener("click", function(e){ e.preventDefault(); var n = document.getElementById("quickmessage"); var text = n.value; var link = e.target.href.substring(e.target.href.lastIndexOf("#") + 1); if(link.substr(0,1) == "i") link = link.substr(1); text = text + ">>" + link + "\n"; n.value = text; n.setSelectionRange(n.value.length, n.value.length); n.focus(); }); links[i].parentNode.replaceChild(newlink, links[i]); } } } } //my function to add the previews when hovering postlinks. I've replaced the kubasa functions. function HAYgetPreviews(elem){ var links = elem.getElementsByTagName("a"); var i = 0; while(i<links.length){ if(links[i].innerHTML.trim().substring(0,8) == ">>"){ try{ links[i].addEventListener("mouseover", HAYaddRefLinkPreview); links[i].addEventListener("mouseout", HAYdelRefLinkPreview); }catch(e){ } } i++; } } //here is an addreflinkpreview, I didn't override because chrome get's a bit wacky so I'm rewriting myown. function HAYaddRefLinkPreview(e){ HAYunfocused = false; var tab = document.createElement("div"); tab.id = "HAYpreviewThingo"; tab.innerHTML = document.getElementById("reply" + e.target.innerHTML.trim().substring(8)).innerHTML; var pos = e.target.getBoundingClientRect(); tab.style.position = "fixed"; tab.style.top = (pos.bottom + 14) + "px"; tab.style.left = pos.right + "px"; tab.className="reflinkpreview"; tab.style.BoxShadow = "4px 4px 2px #888888"; tab.getElementsByClassName("postfooter")[0].parentNode.removeChild(tab.getElementsByClassName("postfooter")[0]); tab.getElementsByClassName("reflink")[0].parentNode.removeChild(tab.getElementsByClassName("reflink")[0]); document.body.appendChild(tab); } //here is the delreflinkprewiew, no override again. writing it myself. function HAYdelRefLinkPreview(e){ HAYunfocused = true; document.body.removeChild(document.getElementById("HAYpreviewThingo")); } //play the gifs using HAYtraverseLinks to go through them timingly function HAYplayGIF(elem){ pic = elem.getElementsByClassName("thumb")[0]; if(pic!=null){ if(pic.src.substr(pic.src.length - 3).toLowerCase() == "gif"){ var rgif = document.createElement("img"); rgif.style.height = "125px"; rgif.style.width = "125px"; rgif.src = pic.parentNode.parentNode.href; rgif.style.display = "none"; rgif.setAttribute("class", "thumb"); rgif.addEventListener("load", function(e){ var g = 0; var rgif = e.target; var fromPageBottom = document.body.scrollHeight - window.pageYOffset; if(rgif.height > rgif.width){ g = rgif.height/125; }else{ g = rgif.width/125; } if(g>0){ rgif.setAttribute("style","height:" + rgif.height/g + "px;width:" + rgif.width/g + "px:float:left"); } rgif.style.display="block"; if(document.body.scrollHeight - fromPageBottom > 100) window.scrollTo(window.pageXOffset, document.body.scrollHeight - fromPageBottom); }); pic.parentNode.replaceChild(rgif, pic); } } }