您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds a Tags column to entity lists (in table view) in Kanka
// ==UserScript== // @name Tag Column for Kanka Entity Lists // @namespace http://tampermonkey.net/ // @license MIT // @version 4 // @description Adds a Tags column to entity lists (in table view) in Kanka // @author Salvatos // @match https://app.kanka.io/* // @exclude https://app.kanka.io/*/bookmarks // @icon https://www.google.com/s2/favicons?domain=kanka.io // @connect kanka.io // ==/UserScript== /* You can set after which column Tags should go. * Note that not all entities have the same columns, so the safe choices are, from left to right: - ".col-checkbox" - ".dg-avatar" - ".dg-name" - ".dg-type" - ".dg-is_private" */ const insertAfter = ".dg-type"; // Try to run only in tabled entity lists if (document.querySelector(".table-entities")) { // In Tags list, clarify the headings try { document.querySelector(".dg-tags").textContent = "Subtags"; } catch { } // Add column heading document.querySelector(insertAfter).insertAdjacentHTML("afterend", `<th class="dg-tags dg-tagged hidden lg:table-cell">Tags</th>`); // Not every entity type displays the same columns, so we need to figure out the column number to populate the rows const colNum = document.querySelector(".dg-tagged").cellIndex; // Create a parser for our JSON/HTML const parser = new DOMParser(); // Cycle through rows document.querySelectorAll(".table-striped tbody tr").forEach((row , index)=>{ // Add a cell for Tags (.font-normal prevents bold in Nested view for items with descendants) row.querySelector('td:nth-child('+colNum+')').insertAdjacentHTML("afterend", `<td class="tooltip-tags font-normal truncated max-w-fit"></td>`); // Get the tooltip URL for the current row let tooltipURL = row.querySelector("a.name").dataset.url; // Fetch and parse the tooltip’s JSON var xhr = new XMLHttpRequest(); xhr.open("GET", tooltipURL, true); xhr.responseType = 'json'; xhr.onload = function (e) { if (xhr.readyState === 4) { if (xhr.status === 200) { let tooltipObject = parser.parseFromString(xhr.response[0], "text/html"); // Look for tags in tooltip and append if any try { let new_element = tooltipObject.querySelector(".tooltip-tags").cloneNode(true); row.querySelector("td.tooltip-tags").append(new_element); } catch { } } else { console.error(xhr.statusText); } } }; xhr.onerror = function (e) { console.error(xhr.statusText); }; xhr.send(null); }); }