// ==UserScript==
// @name Kbin Collapsible Comments
// @namespace http://tampermonkey.net/
// @version 0.8
// @description On the KBin website, support collapsing and expanding comments
// @author CodingAndCoffee
// @match https://kbin.social/m/*
// @match https://fedia.io/m/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=kbin.social
// @grant none
// @license MIT
// @downloadURL https://update.greasyfork.icu/scripts/468460/Kbin%20Collapsible%20Comments.user.js
// @updateURL https://update.greasyfork.icu/scripts/468460/Kbin%20Collapsible%20Comments.meta.js
// ==/UserScript==
(function() {
'use strict';
const COLLAPSE_PARENTS_BY_DEFAULT = false;
const isMobileUser = function () {
if (navigator.userAgent.match(/Android/i)
|| navigator.userAgent.match(/webOS/i)
|| navigator.userAgent.match(/iPhone/i)
|| navigator.userAgent.match(/iPad/i)
|| navigator.userAgent.match(/iPod/i)
|| navigator.userAgent.match(/BlackBerry/i)
|| navigator.userAgent.match(/Windows Phone/i)) {
return true;
} else {
return 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 upDown = (isVisible ? '' : '');
if (!isMobileUser()) {
var label = (isVisible ? ' hide ' : ' show ')
return (childrenCount > 0 ?
(label + ' [' + childrenCount + '] ' + upDown) :
(label + upDown)
);
} else {
return upDown;
}
};
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 = '43px';
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 button = document.querySelector('#comment-'+numericId+'-collapse-button');
console.debug(button);
button.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');
header.style.height = '40px';
header.style.textWrap = 'nowrap';
header.style.textOverflowX = 'ellipsis';
header.style.overflowX = 'hidden';
header.style.display = 'inline-flex';
var content = comment.querySelector('.content');
var footer = comment.querySelector('footer');
var timeAgo = comment.querySelector('.timeago');
timeAgo.style.overflow = 'hidden';
var elements = [header];
if (isMobileUser()) {
elements.push(content);
}
var toggleFn = function(ev) {
ev.stopPropagation();
window.toggleChildren(numericId);
return false;
};
elements.forEach(function (it) {
if (it) {
it.addEventListener('click', toggleFn);
it.style.cursor = 'pointer';
}
});
// Create the collapse/expand button
var button = document.createElement("a");
button.id = 'comment-'+numericId+'-collapse-button';
button.innerHTML = makeCollapseLabel(true, childrenCount);
button.style.cursor = "pointer";
button.style.marginLeft = "0.5rem";
header.appendChild(button);
});
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);
}
});
}
})();