// ==UserScript== // @name kbin collapsible comments // @match https://kbin.social/* // @match https://fedia.io/* // @match https://karab.in/* // @description Collapse and hide comments on kbin.social // @version 1.2.1 // @namespace https://greasyfork.org/users/1096641 // @downloadURL https://update.greasyfork.icu/scripts/468449/kbin%20collapsible%20comments.user.js // @updateURL https://update.greasyfork.icu/scripts/468449/kbin%20collapsible%20comments.meta.js // ==/UserScript== (function () { "use strict"; // This function will run for each comment block function processComment(commentBlock, level) { // Find the header, figure, footer, and content within this comment block var header = commentBlock.querySelector("header"); var figure = commentBlock.querySelector("figure"); var footer = commentBlock.querySelector("footer"); var content = commentBlock.querySelector(".content"); var menu = footer.querySelector("menu"); // Create the collapse/expand button var button = document.createElement("a"); button.innerHTML = ''; button.style.cursor = "pointer"; button.style.marginLeft = "1rem"; // Add the button to the header header.appendChild(button); // Set a click event for the collapse/expand button button.addEventListener("click", function () { if (content.style.display === "none") { content.style.display = ""; footer.style.display = ""; figure.style.display = ""; commentBlock.style.height = ""; button.innerHTML = ''; // Find all following comment blocks var followingComments = commentBlock.nextElementSibling; while ( followingComments && followingComments.className.match(/comment-level--(\d)/)[1] > level ) { followingComments.style.display = ""; collapseChildrenLink.innerHTML = "hide replies"; followingComments = followingComments.nextElementSibling; } } else { content.style.display = "none"; footer.style.display = "none"; figure.style.display = "none"; commentBlock.style.height = "40px"; commentBlock.style.paddingTop = "0.53rem"; button.innerHTML = ''; // Find all following comment blocks var followingComments = commentBlock.nextElementSibling; while ( followingComments && followingComments.className.match(/comment-level--(\d)/)[1] > level ) { followingComments.style.display = "none"; collapseChildrenLink.innerHTML = "show replies"; followingComments = followingComments.nextElementSibling; } } }); // Check if this comment has any children var nextComment = commentBlock.nextElementSibling; if ( nextComment && nextComment.classList.contains("comment-level--" + (level + 1)) ) { // Create the collapse children button var collapseChildrenButton = document.createElement("li"); var collapseChildrenLink = document.createElement("button"); collapseChildrenLink.class = "stretched-link"; collapseChildrenLink.innerHTML = "hide replies"; collapseChildrenLink.style.cursor = "pointer"; collapseChildrenButton.appendChild(collapseChildrenLink); // Add the button to the menu in the footer menu.appendChild(collapseChildrenButton); // Set a click event for the collapse children button collapseChildrenLink.addEventListener("click", function () { // Find all following comment blocks var followingComments = commentBlock.nextElementSibling; while ( followingComments && followingComments.className.match(/comment-level--(\d)/)[1] > level ) { if (followingComments.style.display === "none") { followingComments.style.display = ""; collapseChildrenLink.innerHTML = "hide replies"; } else { followingComments.style.display = "none"; collapseChildrenLink.innerHTML = "show replies"; } followingComments = followingComments.nextElementSibling; } }); } } // Find all comment blocks on the page var commentBlocks = document.querySelectorAll("blockquote.entry-comment"); // Process each comment block for (var i = 0; i < commentBlocks.length; i++) { var level = parseInt( commentBlocks[i].className.match(/comment-level--(\d)/)[1] ); processComment(commentBlocks[i], level); } })();