Hides comments on a page via regular expression search fields
// ==UserScript== // @name Hacker News Comment Search Filter // @description Hides comments on a page via regular expression search fields // @version 1.0.0 // @author sdca // @namespace sdca.hncsf // @include https://news.ycombinator.com/item?id=* // @grant GM_addStyle // ==/UserScript== (function(){ // Delay comment count threshold var filter_delay_min_comments = 300; // Delay time in seconds var filter_delay_time = 0.5; if(document.querySelector('.comment-tree')) { var filter_count = 0; var filter_delay; if(filter_delay_min_comments >= (document.querySelectorAll('.athing').length - 1)) { filter_delay_time = 0; } GM_addStyle('#fc-wrapper{margin:0 20px;} .filter-comments{width:100%;} .fid{display:none;}'); document.querySelector('.comment-tree').insertAdjacentHTML('beforebegin', '<div id="fc-wrapper"><form id="fc-form"><input id="filter-comments-add" type="button" value="+"/></form></div>'); document.getElementById('filter-comments-add').addEventListener('click', filter_add, false); document.getElementById("fc-form").addEventListener("submit", function(event){ event.preventDefault(); }); filter_add(); } function filter_add() { filter_count++; document.getElementById('filter-comments-add').insertAdjacentHTML('beforebegin', '<input id="filter-comment-'+filter_count+'" class="filter-comments" placeholder="Search Comments..." />'); } function filter_comments() { var re = new RegExp(); var st = this.value; var ex = false; var fid = this.id.replace(/^filter-comment-/, ''); if(this.value.charAt(0) == '-') { ex = true; st = st.replace(/^-/, ''); if(this.value == '-') { ex = false; } } try { re = new RegExp(st, 'i'); } catch(err){} if(re !== 'undefined') { clearTimeout(filter_delay); filter_delay = setTimeout(function() { Array.prototype.forEach.call(document.querySelectorAll('.athing'), function(el, i){ if (!i) return; var comment = el.querySelector('.default').textContent; var filter_remove = false; if(ex === false) { if(re.test(comment)) { el.classList.remove('fid'+fid); filter_remove = true; } else { el.classList.add('fid','fid'+fid); } } else { if(!re.test(comment)) { el.classList.remove('fid'+fid); filter_remove = true; } else { el.classList.add('fid','fid'+fid); } } if(filter_remove === true && el.classList.contains('fid')) { var filter_remain = false; for (var filter = 0; filter < filter_count; filter++) { if(el.classList.contains('fid'+filter)) { filter_remain = true; } } if(!filter_remain) { el.classList.remove('fid'); } } }); }, filter_delay_time * 1000); } } document.addEventListener('input', function (event) { var el = event.target, index = -1; while (el && ((index = Array.prototype.indexOf.call(document.querySelectorAll('.filter-comments'), el)) === -1)) { el = el.parentElement; } if (index > -1) { filter_comments.call(el, event); } }); document.addEventListener('keydown', function (event) { var el = event.target, index = -1; while (el && ((index = Array.prototype.indexOf.call(document.querySelectorAll('.filter-comments'), el)) === -1)) { el = el.parentElement; } if (index > -1) { if(event.keyCode == 27) { el.value = ''; filter_comments.call(el, event); } } }); })();