// ==UserScript== // @name Kbin Post Expander // @match https://kbin.social/* // @match https://fedia.io/* // @match https://karab.in/* // @grant GM_xmlhttpRequest // @grant GM.xmlHttpRequest // @run-at document-end // @description Expand posts in feeds // @version 1.1 // @namespace https://greasyfork.org/users/1096641 // @downloadURL none // ==/UserScript== function fetchFullContent(url, callback) { var GMxmlHttpRequest = GM_xmlhttpRequest || GM.xmlHttpRequest; //greasymonkey and tampermonkey uses different functions for this GMxmlHttpRequest({ method: "GET", url: url, onload: function (response) { let parser = new DOMParser(); let doc = parser.parseFromString(response.responseText, "text/html"); let fullContent = ""; let pTags = doc.querySelectorAll(".entry__body .content p"); for (let p of pTags) { fullContent += p.outerHTML; } callback(fullContent); }, }); } function expandDescription(event) { let descElement = event.currentTarget; let postElement = descElement.closest("article"); let commentLink = postElement.querySelector('[href$="#comments"]').href; // If full content is already displayed, revert to the original description if (descElement.dataset.fullContent === "true") { descElement.innerHTML = descElement.dataset.originalDesc; descElement.dataset.fullContent = "false"; } else { // Store the original description descElement.dataset.originalDesc = descElement.innerHTML; fetchFullContent(commentLink, function (fullContent) { descElement.innerHTML = fullContent; descElement.dataset.fullContent = "true"; }); } } function applyToNewPosts() { let descriptions = document.querySelectorAll( "article .content.short-desc:not(.expanded-description)" ); for (let desc of descriptions) { desc.classList.add("expanded-description"); desc.style.cursor = "pointer"; desc.addEventListener("click", expandDescription); } } window.addEventListener("DOMContentLoaded", (event) => { applyToNewPosts(); // Observe for new posts let observer = new MutationObserver(applyToNewPosts); observer.observe(document.body, { childList: true, subtree: true }); });