Created
July 2, 2018 05:43
-
-
Save qntmpkts/d6d8f98fa0870f5ad2f1c91c38388728 to your computer and use it in GitHub Desktop.
http://anonsw.github.io/8chjs before it vanished from the 'net
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* q.js v2018.3-6.1 | |
* http://anonsw.github.io/8chjs/ | |
*/ | |
// User Settings | |
var anonsw = { | |
qflair: '', // Examples: REAL, → | |
qcolor: '#ff0', | |
youcolor: '#cff', | |
scrollcolor: 'rgba(153, 153, 153, 0.6)', | |
scrollbackcolor: '#333', | |
scrolltime: 400, // ms | |
updateDelay: 200, // ms | |
sidenavWidth: 30, // px | |
floodEnabled: false, | |
floodThreshold: 15, // min # posts before beginning fade | |
floodVanish: 25, // max # posts before completed fade/hide | |
floodBehavior: 'fade', // hide, fade | |
fadenametripregex: /^(Anon(ymous)?-.*|.*-!CbboFOtcZs)$/i, | |
fadenametripfloodvalue: -1, // Effective post count for fading, or -1 for auto of floodThreshold+post count | |
strikeThroughNameFags: true, | |
rateHistoryLen: 50, // Data points on chart | |
rateAvgLen: 10 // Number of data points to average for instantaneous rate | |
// Suggestions from 589388.html#590283 | |
// ...shill detection features, such as | |
// easily knowing the proportion of posts from a user that don't link. | |
// I'd want to know any ID that was posting > 1/3 posts targetting noone. | |
// TODO: Behavior for post hover should be to show original post visual before all q.js mods | |
// TODO: Add flags to turn on/off features | |
// TODO: Custom-regex -> post color/fade (auto-filter by selecting text and choosing new menu item?) | |
// Examples: daily reminder, guys, check this out, shill, get out, filtered, tell us more, archive everything | |
// TODO: Manual shade | |
// TODO: remove Q trip codes from post content? | |
// TODO: remove Q from end of post content if not a Q post? | |
// TODO: recognize all of known Q trip codes? (make to sure to exclude known comps) | |
// TODO: Links to reset on current Q/(you) post | |
// TODO: Link to go to latest post (end key doesn't always work, but try capturing that as well?) | |
// TODO: Keyboard shortcuts for navigation | |
// TODO: Current/Total overall post navigation | |
// TODO: Remap end key to always go to end of page | |
// TODO: Check box for each post to mark as "read", "spam", ? | |
// TODO: Autocorrect all-caps posts (50% threshold)? | |
// TODO: Correct broken links but remove referral when clicked? | |
// TODO: Make flood post fading non-linear to give leniency to posters just passing flood threshold | |
// TODO: Penalize reposts in flood detection (if id's different, merge?) ? | |
// TODO: Scorecard of posters ordered by post count (post rate, reply count, ...)? | |
// TODO: Color/shade posts where there are no references and no question marks | |
// TODO: If Q or trip used in name field, strike them out or replace with Anonymous? | |
// TODO: embedded posts in Q posts don't have background-color and inherit Q color, fix? | |
}; | |
!function(t,$,n){var e,s,r,h,l=[],o=[],a=-1,c=[],d=-1,f=[],p=[],v=[];function g(t){$("html, body").animate({scrollTop:$(t).offset().top-$("div.boardlist").height()},anonsw.scrolltime)}function u(){return $(c).each(function(){$(this).css("background-color",anonsw.youcolor)}),$.Deferred().resolve()}function w(){return $('div.body:icontains("(You)")').each(function(){$(this).find(":not(small)").contents().filter(function(){return 3==this.nodeType}).each(function(){this.textContent=this.textContent.replace(/\(+ *You *\)+/gi,"you")})}),$.Deferred().resolve()}function y(){return $(o).each(function(t,n){$(n).css("background-color")!==anonsw.qcolor&&(""!==anonsw.qflair&&$(n).find("p.intro > label > span.trip").first().prepend(anonsw.qflair+" "),$(n).css("background-color",anonsw.qcolor))}),$.Deferred().resolve()}function m(){var t,n=-1;for(a>l.length&&(a=l.length),d>c.length&&(d=c.length),i=0;i<l.length;i++){var o=$(l).get(i);if(-1==n&&(n=$(o).css("font-size"),t=Math.floor(1.5*parseInt(n.replace("px","")))),$(o).offset().top+$(o).height()-2.25*t>$(window).scrollTop()){a=i;break}}for(i=0;i<c.length;i++){o=$(c).get(i);if(-1==n&&(n=$(o).css("font-size"),t=Math.floor(1.5*parseInt(n.replace("px","")))),$(o).offset().top+$(o).height()-2.25*t>$(window).scrollTop()){d=i;break}}$(".qcount").text("("+(a+1)+":"+l.length+")"),$(".youcount").text("("+(d+1)+":"+c.length+")")}function b(){var t=$("#sidenav");if(t.length){for($(t).css("height",$(window).height()-$("div.boardlist").height()),h=e.canvas.height/($(window).height()-$("div.boardlist").height()),e.clearRect(0,0,e.canvas.width,e.canvas.height),f=[],e.fillStyle=anonsw.qcolor,i=0;i<l.length;i++){var n=$(l).get(i);(o=$(n).height()/$(document).height()*e.canvas.height)<h&&(o=h),f[i]={x:s,y:$(n).offset().top/$(document).height()*e.canvas.height,width:e.canvas.width-2*s,height:o},e.fillRect(f[i].x,f[i].y,f[i].width,f[i].height)}for(p=[],e.fillStyle=anonsw.youcolor,i=0;i<c.length;i++){var o;n=$(c).get(i);(o=$(n).height()/$(document).height()*e.canvas.height)<h&&(o=h),p[i]={x:s,y:$(n).offset().top/$(document).height()*e.canvas.height,width:e.canvas.width-2*s,height:o},e.fillRect(p[i].x,p[i].y,p[i].width,p[i].height)}if(e.fillStyle=anonsw.scrollcolor,e.fillRect(r/2,$(window).scrollTop()/$(document).height()*e.canvas.height,r,$(window).height()/$(document).height()*e.canvas.height),750<$("#thread_stats_posts").text()){var a=8192/($(window).height()-$("div.boardlist").height());e.fillStyle="#f66",e.fillRect(0,e.canvas.height-a,e.canvas.width,a)}}}function x(){m(),b(),function(){var t=$("div.post").not(".post-hover"),n=t.length-(anonsw.rateHistoryLen+anonsw.rateAvgLen)+1;n<1&&(n=1),$($($(t).get(0)).find(".intro time").get(0)).attr("unixtime"),v=[],timehistory=[];for(var o=n;o<t.length;o++){var a=$($($(t).get(o)).find(".intro time").get(0)).attr("unixtime");if(timehistory[timehistory.length]=a,0<=timehistory.length-anonsw.rateAvgLen-1){var e=timehistory[timehistory.length-1],i=timehistory[timehistory.length-anonsw.rateAvgLen-1];v[v.length]=anonsw.rateAvgLen/((e-i)/60)}else v[v.length]=0}if($(".postRate").text(v[v.length-1].toFixed(1)),v.length>anonsw.rateAvgLen){var s=Math.max.apply(null,v),r=Math.min.apply(null,v);s-.5<r&&(r=s-.5,s+=.5),r<0&&(r=0);var h=timehistory[timehistory.length-1],l=timehistory[anonsw.rateAvgLen];$(".postRateChart").each(function(){var t=$(this).get(0).getContext("2d");t.clearRect(0,0,t.canvas.width,t.canvas.height),t.strokeStyle=$("div.boardlist a").css("color"),t.beginPath();var n=0,o=t.canvas.height-(v[anonsw.rateAvgLen]-r)/(s-r)*t.canvas.height;t.moveTo(n,o);for(var a=anonsw.rateAvgLen+1;a<v.length;a++)n=(timehistory[a]-l)/(h-l)*t.canvas.width,o=t.canvas.height-(v[a]-r)/(s-r)*t.canvas.height,t.lineTo(n,o);t.stroke(),t.closePath()})}}()}function _(){return c=$.map($('div.post:not(.post-hover) > p.intro > label span.name > span.own_post, div.post:not(.post-hover) > div.body > p.body-line > small:icontains("(You)")'),function(t){return $(t).closest("div.post")}),$.Deferred().resolve()}function T(){if(anonsw.floodEnabled){var e={},i=null,t=$("div.post:not(.post-hover)").not(".you");$(t).each(function(){var t,n=$(this).find("p > span.poster_id").first().text();if(null!=i){if(n in e||(e[n]={count:0,namefag:!1,floodcount:0}),e[n].count++,!e[n].namefag){var o=(t=$(this).find("p > label span.name").first()).contents().not(t.children()).text(),a=$(this).find("p > label > span.trip").first().text();e[n].namefag=!anonsw.fadenametripregex.test(o+"-"+a)}e[n].namefag?anonsw.fadenametripfloodvalue<0?e[n].floodcount=anonsw.floodThreshold+e[n].count:e[n].floodcount=anonsw.fadenametripfloodvalue:e[n].floodcount=e[n].count}null==i&&(i=n)}),$.each(e,function(t,n){if(t!==i){var o=$('span.poster_id:contains("'+t+'")');if(n.floodcount>anonsw.floodThreshold||n.namefag)if(anonsw.strikeThroughNameFags&&n.namefag&&$(o).each(function(){$(this).closest("div.post").find("p > label span.name").first().css("text-decoration","line-through")}),"fade"===anonsw.floodBehavior){var a=n.floodcount;a>anonsw.floodVanish&&(a=anonsw.floodVanish),(a=(anonsw.floodVanish-anonsw.floodThreshold-(a-anonsw.floodThreshold))/(anonsw.floodVanish-anonsw.floodThreshold))<.1&&(a=.1),$(o).each(function(){$(this).closest("div.post").css("opacity",a),$(this).closest("div.post").hover(function(){$(this).animate({opacity:1},anonsw.updateDelay)},function(){$(this).animate({opacity:a},anonsw.updateDelay)})})}else"hide"===anonsw.floodBehavior&&n.count>=anonsw.floodVanish&&$(o).each(function(){$(this).closest("div.post").hide()});else $(o).each(function(){$(this).closest("div.post").css("opacity",1)})}})}return $.Deferred().resolve()}function k(){(l=$.map($('div.post:not(.post-hover) > p.intro > label > span.trip:contains("!CbboFOtcZs")'),function(t){return $(t).closest("div.post")}),o=$.map($('div.post:not(.post-hover) > p.intro > label > span.trip:contains("!CbboFOtcZs")'),function(t){return $(t).closest("div.post")}),$.Deferred().resolve()).done(y).done(w).done(_).done(u).done(T).done(x)}!function($){var e,i=$.fn.on;$.fn.on=function(){var t=Array.apply(null,arguments),n=t[t.length-1];if(isNaN(n)||1===n&&t.pop())return i.apply(this,t);var o=t.pop(),a=t.pop();return t.push(function(){var t=this,n=arguments;clearTimeout(e),e=setTimeout(function(){a.apply(t,n)},o)}),i.apply(this,t)}}(this.jQuery||this.Zepto),$.expr[":"].icontains=jQuery.expr.createPseudo(function(n){return function(t){return 0<=jQuery(t).text().toUpperCase().indexOf(n.toUpperCase())}}),t.nextq=function(){0<l.length&&(a<l.length-1&&a++,g($(l).get(a)))},t.lastq=function(){0<l.length&&(a=l.length-1,g($(l).get(a)))},t.prevq=function(){0<l.length&&(0<a&&a--,g($(l).get(a)))},t.firstq=function(){0<l.length&&(a=0,g($(l).get(a)))},t.nextyou=function(){0<c.length&&(d<c.length-1&&d++,g($(c).get(d)))},t.lastyou=function(){0<c.length&&(d=c.length-1,g($(c).get(d)))},t.prevyou=function(){0<c.length&&(0<d&&d--,g($(c).get(d)))},t.firstyou=function(){0<c.length&&(d=0,g($(c).get(d)))},$(window).on("scroll",function(t){m(),b()},anonsw.updateDelay),$(window).on("resize",function(t){x()},anonsw.updateDelay),t.toggleFlood=function(){anonsw.floodEnabled?(anonsw.floodEnabled=!1,$(".toggleFloodState").text("On"),"fade"===anonsw.floodBehavior?$("span.poster_id").each(function(){$(this).closest("div.post").css("opacity",1),$(this).closest("div.post").off("mouseenter mouseleave")}):"hide"===anonsw.floodBehavior&&$(this).closest("div.post").show()):(anonsw.floodEnabled=!0,$(".toggleFloodState").text("Off"),k())},t.Q=function(){$("div.boardlist").append('<span>[ <a href="javascript:anonsw_main.firstq();"><i class="fa fa-step-backward"></i></a> <a href="javascript:anonsw_main.prevq();"><i class="fa fa-backward"></i></a> <span style="filter:brightness(70%);">Q</span> <span class="qcount">(?:?)</span> <a href="javascript:anonsw_main.nextq();"><i class="fa fa-forward"></i></a> <a href="javascript:anonsw_main.lastq();"><i class="fa fa-step-forward"></i></a> ]</span>'),$("div.boardlist").append('<span>[ <a href="javascript:anonsw_main.firstyou();"><i class="fa fa-step-backward"></i></a> <a href="javascript:anonsw_main.prevyou();"><i class="fa fa-backward"></i></a> <span style="filter:brightness(70%);">(You)</span> <span class="youcount">(?:?)</span> </span><a href="javascript:anonsw_main.nextyou();"><i class="fa fa-forward"></i></a> <a href="javascript:anonsw_main.lastyou();"><i class="fa fa-step-forward"></i></a> ]</span>'),$("div.boardlist").append('<span>[ <a href="javascript:anonsw_main.toggleFlood();">Turn Post Fading <span class="toggleFloodState">Off</span></a> ]</span>'),function(){var n=$("div.boardlist").height()-1;$("div.boardlist").append('<span>[ Post Rate: <span class="postRate">0</span> posts/min <canvas class="postRateChart"></canvas>]</span>'),$(".postRate").css("color",$("div.boardlist a").css("color"));var t=$(".postRateChart");$(t).each(function(){$(this).css("width","100px"),$(this).css("height",n),$(this).css("vertical-align","middle");var t=$(this).get(0).getContext("2d");t.canvas.height=20,t.canvas.width=100})}(),function(){$("body").append('<canvas id="sidenav"></canvas>');var t=$("#sidenav");$(t).css("position","fixed"),$(t).css("top",$("div.boardlist").height()),$(t).css("right",0),$(t).css("width",anonsw.sidenavWidth),$(t).css("height",$(window).height()-$("div.boardlist").height()),$(t).css("background-color",anonsw.scrollbackcolor),$("body").css("margin-right",anonsw.sidenavWidth),(e=$("#sidenav").get(0).getContext("2d")).canvas.height=2048,e.canvas.width=anonsw.sidenavWidth,s=1,r=e.canvas.width/2}(),k();var t=$("div.thread")[0];new MutationObserver(function(t){for(var n in t)if("childList"==t[n].type){k();break}}).observe(t,{childList:!0})}}(window.anonsw_main=window.anonsw_main||{},jQuery),$(document).ready(anonsw_main.Q); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment