// ==UserScript== // @name kbin enhancement script // @description Few small changes to the kbin UI while they still develop some features. Based on https://greasyfork.org/en/scripts/468612-kbin-enhancement-script/code // @namespace social.kbin.Deref // @license MIT // @version 1.3 // @grant none // @run-at document-end // @match https://fedia.io/* // @match https://kbin.social/* // @downloadURL none // ==/UserScript== (function(){ function getSetting(setting) { let value = localStorage.getItem("setting-" + setting); if (value === null) value = "true"; return value === "true"; } function setSetting(setting, value) { localStorage.setItem("setting-" + setting, value); location.reload(); } function addDomain(link) { const parts = link.title.split("@"); if (parts[2] !== location.hostname) { const linkText = link.childNodes[link.childNodes.length-1]; const textNode = document.createTextNode("@" + parts[2]); const newP = document.createElement("p"); newP.appendChild(textNode); link.after(textNode); } } function addDomains() { if (location.pathname.startsWith('/m')) { document.querySelectorAll(".magazine-inline, .user-inline").forEach(link => { addDomain(link); }) } else { document.querySelectorAll(".magazine-inline").forEach(link => { addDomain(link); }) } } function getComments(comment, allComments) { const id = comment.id.split('-')[2]; allComments.push(comment); const subComments = comment.parentElement.querySelectorAll('blockquote[data-subject-parent-value="'+id+'"]'); subComments.forEach(blockquote => { getComments(blockquote, allComments); }); } function getCollapsos(comment, allCollapsos) { const id = comment.id.split('-')[2]; if (comment.classList.contains('kes-expand')) allCollapsos.push(comment); const subComments = comment.parentElement.querySelectorAll('blockquote[data-subject-parent-value="'+id+'"]'); subComments.forEach(blockquote => { getCollapsos(blockquote, allCollapsos); }); } function expandComment(blockquote) { const allComments = []; getComments(blockquote, allComments); allComments.forEach(comment => { comment.style.display="" }); // Just remove all these for now, don't want to figure out how to do this cleanly right now. const allCollapsos = []; getCollapsos(blockquote, allCollapsos); allCollapsos.forEach(comment => { comment.remove() }); } function collapseComment(blockquote) { const id = blockquote.id.split('-')[2]; let commentLevel = "1"; blockquote.classList.forEach(classItem => { if (classItem.includes("comment-level")) commentLevel = classItem.split("--")[1]; }); const allComments = []; getComments(blockquote, allComments); allComments.forEach(comment => { comment.style.display="none" }); const username = blockquote.querySelector("header a").innerText; const newBlockquote = document.createElement('blockquote'); newBlockquote.className = 'kes-expand section comment entry-comment comment-level--' + commentLevel; newBlockquote.dataset.subjectParentValue = id; newBlockquote.innerHTML = '
' + username + ' expand
'; newBlockquote.querySelector('a').addEventListener("click", () => {expandComment(blockquote)}); blockquote.parentNode.insertBefore(newBlockquote, blockquote); } function addCollapseLinks() { if (location.pathname.startsWith('/m')) { const comments = document.querySelectorAll("blockquote.comment"); comments.forEach(blockquote => { const menu = blockquote.querySelector("footer menu"); const newLi = document.createElement('li'); newLi.innerHTML = 'collapse'; menu.appendChild(newLi); }); document.querySelectorAll(".kes-collapse").forEach(link => {link.addEventListener("click", () => { const blockquote = link.closest("blockquote.comment"); collapseComment(blockquote); })}); } } function generateSettingDiv(settingDisplay, setting) { const settingValue = getSetting(setting); const newDiv = document.createElement('div'); newDiv.className = "row"; newDiv.innerHTML = `${settingDisplay}:
Yes | No
`; return newDiv; } function addHTMLSettings() { const settingsList = document.querySelector(".settings-list"); const header = document.createElement('strong'); header.textContent = "kbin enhancement script"; settingsList.appendChild(header); settingsList.appendChild(generateSettingDiv("Show domains", "show-domains")); settingsList.appendChild(generateSettingDiv("Show collapse comment", "show-collapse")); document.querySelectorAll(".kes-setting-yes").forEach(link => {link.addEventListener("click", () => {setSetting(link.dataset.setting, true)})}); document.querySelectorAll(".kes-setting-no").forEach(link => {link.addEventListener("click", () => {setSetting(link.dataset.setting, false)})}); } addHTMLSettings(); if (getSetting("show-domains")) addDomains(); if (getSetting("show-collapse")) addCollapseLinks(); })();