Not a Lemmy script, but I thought it might still be useful for those of you who use Kbin.
The userscript has the following features:
- Downvotes are hidden;
- Heavily downvoted posts fade out;
- The title text of the date also shows in local time;
- Links to the parent, previous, and next comment in comments;
- Some of the sidebar items are removed; and
- Hovering over usernames is disabled.
I tried to make the sections cleanly delineated, so that unwanted features can be easily edited out.
// ==UserScript==
// @name Kbin script
// @namespace https://beehaw.org/u/brie
// @match https://kbin.social/*
// @grant none
// @version 1.1
// @author @[email protected]
// @description Changes some aspects of comment display
// @run-at document-start
// @license AGPL-3.0-only
// ==/UserScript==
// Custom style
document.head.appendChild(document.createElement('style')).textContent = `\
/* Some color tweaks */
.theme--dark {
--kbin-success-color: #38fa9f;
}
/* Hide sidebar sections */
.related-magazines,
.active-users,
.posts.section,
.entries.section {
display: none;
}
/* Hide downvotes */
.comment span[data-subject-target="downvoteCounter"] {
display: none;
}
`;
window.addEventListener("DOMContentLoaded", () => {
// Rewrite community links to magazine links
for (const link of document.querySelectorAll(`a[href^="/c/"]`)) link.setAttribute("href", `/m/${link.getAttribute("href").slice(3)}`);
const siblings = new Map();
for (const comment of document.querySelectorAll(`.comment`)) {
// Fade out heavily downvoted posts (inspired by Hacker-News).
const upvotes = comment.querySelector(`span[data-subject-target="favCounter"]`)?.textContent | 0;
const downvotes = comment.querySelector(`span[data-subject-target="downvoteCounter"]`)?.textContent | 0;
const boosts = comment.querySelector(`span[data-subject-target="upvoteCounter"]`)?.textContent | 0;
const score = (upvotes + 3) / (downvotes + 1);
if (score < 1) {
comment.style.setProperty("color", `color-mix(in srgb, var(--kbin-section-text-color) ${score*100}%, transparent)`);
comment.style.setProperty("background", `color-mix(in srgb, var(--kbin-section-bg) ${score*100}%, var(--kbin-bg))`);
}
// Show downvotes in the title text
comment.querySelector(`.vote__down > button`)?.setAttribute("title", `Reduce (${downvotes})`);
// Show local date
const timeago = comment.querySelector(`.timeago`);
if (timeago) {
const datetime = timeago.getAttribute("datetime");
if (datetime) timeago.setAttribute("title", `\
${new Date(datetime)}
${datetime}`);
}
// HN-style navigation
const header = comment.querySelector(`:scope > header`);
const parent = comment.getAttribute("data-subject-parent-value");
if (parent) {
const toParent = document.createElement("a");
toParent.href = `#entry-comment-${parent}`;
toParent.textContent = "parent"
header?.appendChild(toParent);
}
const sibling = siblings.get(parent);
siblings.set(parent, comment);
if (sibling) {
const prev = document.createElement("a");
prev.href = `#${sibling.getAttribute("id")}`;
prev.textContent = "prev";
if (parent) header?.appendChild(document.createTextNode(" "));
header?.appendChild(prev);
const next = document.createElement("a");
next.href = `#${comment.getAttribute("id")}`;
next.textContent = "next";
const siblingHeader = sibling.querySelector(`:scope > header`)
if (siblingHeader) {
siblingHeader.appendChild(document.createTextNode(" "));
siblingHeader.appendChild(next);
}
}
}
// Neuter the hover actions
for (const el of document.querySelectorAll(`[data-action="mouseover->kbin#mention"]`)) {
el.removeAttribute("data-action");
}
});