您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Shows the title of each advanced mention’s target entity in Summernote, next to the entity ID (or in a tooltip on hover).
- // ==UserScript==
- // @name [Deprecated] Advanced Mention Name Reminder
- // @namespace http://tampermonkey.net/
- // @license MIT
- // @version 1.1
- // @description Shows the title of each advanced mention’s target entity in Summernote, next to the entity ID (or in a tooltip on hover).
- // @author Salvatos
- // @match https://kanka.io/*
- // @icon https://www.google.com/s2/favicons?domain=kanka.io
- // @grant GM_xmlhttpRequest
- // @grant GM_addStyle
- // @connect kanka.io
- // ==/UserScript==
- // Get campaign ID from URL
- var campaignID = window.location.href.match(/campaign\/(\d+)/);
- campaignID = campaignID[1].split("/")[0];
- function addMentionName (thisEditor, entityId) {
- var apiURL = `https://kanka.io/en/campaign/${campaignID}/entities/${entityId}/json-export`;
- var xhr = new XMLHttpRequest();
- xhr.open("GET", apiURL, true);
- xhr.responseType = 'json';
- xhr.onload = function (e) {
- if (xhr.readyState === 4) {
- if (xhr.status === 200) {
- //console.log(xhr.response);
- // Set dfn title to entity name for all mentions to this ID
- thisEditor.find( "dfn[entity-id='" + entityId + "']" ).attr("title", xhr.response.data.name);
- } else {
- console.error(entityId + " returned an error: " + xhr.statusText);
- thisEditor.find( "dfn[entity-id='" + entityId + "']" ).attr("title", "Unknown");
- }
- }
- };
- xhr.onerror = function (e) {
- console.error(xhr.statusText);
- };
- xhr.send(null);
- }
- // Wait for Summernote to initialize
- $('.html-editor').on('summernote.init', function() {
- // optimization (use $this in subsequent selectors so it doesn’t search the whole DOM multiple times, but don’t create a new $(object) every time)
- let $thisEditor = $( this ).siblings(".note-editor").find(".note-editable");
- // Track IDs so we only process each once
- let entityIDs = [];
- // Wrap the entity part of mentions in <dfn>s and replace editor content
- $thisEditor.html( $thisEditor.html().replaceAll(/\[(\w+:)(\d+)(.*?)\]/g, "[<dfn entity-id='$2'>$1$2</dfn>$3]") );
- // Fetch the name of each dfn’s entity id
- $thisEditor.find( "dfn" ).each(function() {
- let entityId = $( this ).attr("entity-id");
- // If we haven’t seen this ID yet, add its title to all relevant mentions, and mark it done
- if ($.inArray(entityId, entityIDs) == -1) {
- addMentionName($thisEditor, entityId);
- entityIDs.push(entityId);
- }
- }, $thisEditor, entityIDs); // (pass $thisEditor along so the function doesn’t look for the editor in the DOM every time it’s called)
- });
- GM_addStyle ( `
- .note-editable dfn {
- font-style: normal;
- }
- .note-editable dfn::after {
- content: " ("attr(title)") ";
- vertical-align: super;
- font-size: 11px;
- }
- /* Uncomment this to show only a tooltip, and no superscript
- .note-editable dfn {
- text-decoration: underline dotted;
- }
- .note-editable dfn::after {
- content: "";
- }
- */
- ` );