Greasy Fork

kbin enhancement script

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

目前为 2023-06-15 提交的版本。查看 最新版本

// ==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/*
// ==/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 = '<header>' + username + ' <a href="javascript:;">expand</a></header>';
    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 = '<a href="javascript:;" class="kes-collapse">collapse</a>';
        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 = `<span>${settingDisplay}:</span>
      <div>
        <a class="kes-setting-yes link-muted ${settingValue ? 'active' : ''}" href="javascript:;" data-setting="${setting}">
          Yes
        </a>
        |
        <a class="kes-setting-no link-muted ${settingValue ? '' : 'active'}" href="javascript:;" data-setting="${setting}">
          No
        </a>
      </div>`;

    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();
})();