// ==UserScript== // @name Kbin Collapsible Comments // @namespace http://tampermonkey.net/ // @version 0.6 // @description On the KBin website, support collapsing and expanding comments // @author CodingAndCoffee // @match https://kbin.social/m/* // @icon https://www.google.com/s2/favicons?sz=64&domain=kbin.social // @grant none // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; const COLLAPSE_PARENTS_BY_DEFAULT = false; const getNumericId = function (comment) { return comment.id.split("-").reverse()[0]; }; const getComment = function (numericId) { return document.querySelector('#comments blockquote#entry-comment-' + numericId); }; const getChildrenOf = function (numericId) { return document.querySelectorAll('#comments blockquote[data-subject-parent-value="' + numericId + '"]'); } const getDescendentsOf = function (numericId) { var parent = getComment(numericId); var children = getChildrenOf(numericId); var descendents = []; children.forEach(function (child) { descendents.push(child); var childDescendents = getDescendentsOf(getNumericId(child)); childDescendents.forEach (function (cd) { descendents.push(cd); }); }); return descendents; }; const makeCollapseLabel = function (isVisible, childrenCount) { var label = (isVisible ? '- collapse' : '+ show'); return (childrenCount > 0 ? '[' + label + ' ' + childrenCount + ']' : '[' + label + ']' ); }; window.toggleChildren = function (numericId) { var parent = getComment(numericId); // get visibility status var childrenVisible = (parent.dataset['childrenVisible'] === 'true'); var toggledStatus = !childrenVisible; // update dataset parent.setAttribute('data-children-visible', toggledStatus); if (!COLLAPSE_PARENTS_BY_DEFAULT) { var figure = parent.querySelector('figure'); var footer = parent.querySelector('footer'); var content = parent.querySelector('.content'); var more = parent.querySelector('.more'); if (toggledStatus) { content.style.display = ''; footer.style.display = ''; figure.style.display = ''; parent.style.height = ''; if (more) { more.style.display = ''; } } else { content.style.display = 'none'; footer.style.display = 'none'; figure.style.display = 'none'; parent.style.height = '40px'; parent.style.paddingTop = '0.53rem'; if (more) { more.style.display = 'none'; } } } // toggle visibility of the descendents var descendents = getDescendentsOf(numericId); descendents.forEach(function(c) { c.style.display = (toggledStatus ? 'grid' : 'none'); }); // update the link text var childrenCount = parent.dataset['childrenCount']; var link = document.querySelector('#comment-'+numericId+'-collapse-link'); if (link) { link.innerHTML = makeCollapseLabel(toggledStatus, childrenCount); } }; const comments = document.querySelectorAll('#comments blockquote.comment'); comments.forEach(function (comment) { var numericId = getNumericId(comment); var children = getChildrenOf(numericId); var childrenCount = children.length; // add some metadata comment.setAttribute('data-children-visible', true); comment.setAttribute('data-children-count', childrenCount); var header = comment.querySelector('header'); var span = document.createElement('span'); var spanSpacer = document.createTextNode(' | '); span.append(spanSpacer); header.appendChild(span); var a = document.createElement('a'); a.id = 'comment-'+numericId+'-collapse-link'; var link = document.createTextNode(makeCollapseLabel(true, childrenCount)); a.appendChild(link); a.href = 'javascript:window.toggleChildren('+numericId+')'; span.appendChild(a); }); if (COLLAPSE_PARENTS_BY_DEFAULT) { comments.forEach(function (comment) { var numericId = getNumericId(comment); var isTopLevel = (typeof comment.dataset['subject-parent-value'] !== 'string'); if (isTopLevel) { window.toggleChildren(numericId); } }); } })();