initial commit
This commit is contained in:
commit
00e6045482
|
|
@ -0,0 +1,3 @@
|
|||
1. Install Tampermonkey or something in your browser
|
||||
2. Open [dscrtc.user.js](https://git.hollymcfarland.com/monorail/DSCRTC/src/branch/main/dscrtc.user.js#bypass=true) and read until you're comfortable that I'm not stealing your credit card data or whatever
|
||||
3. Click "Raw" near the top to bring up the install screen
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
// ==UserScript==
|
||||
// @name Deep Space Communications Relay Tab Completion
|
||||
// @namespace https://hollymcfarland.com
|
||||
// @version 2026-08-16
|
||||
// @description Tab complete known definitions
|
||||
// @author You
|
||||
// @match https://dscr.dixonary.co.uk/
|
||||
// @grant none
|
||||
// ==/UserScript==
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
document.addEventListener("keydown", (event) => {
|
||||
// Only listen to tab
|
||||
if (event.key !== "Tab") return;
|
||||
|
||||
// Only listen when message box focused
|
||||
const inputEl = document.querySelector("#message-input");
|
||||
if (document.activeElement !== inputEl) return;
|
||||
|
||||
// Don't tab out of input box
|
||||
event.preventDefault();
|
||||
|
||||
const input = inputEl.value;
|
||||
const cursorPos = inputEl.selectionStart;
|
||||
|
||||
// I don't even want to _think_ about how to handle tab completion if you have a range selected
|
||||
if (cursorPos !== inputEl.selectionEnd) return;
|
||||
|
||||
// Character behind cursor should be non-whitespace
|
||||
// Character after cursor should at least not be a letter
|
||||
// Hopefully this accounts for _most_ reasonable signal definitions
|
||||
if (!(/\S/.test(input[cursorPos-1]) && (input.length === cursorPos || /[^A-Z]/.test(input[cursorPos])))) return;
|
||||
|
||||
// Everything from most recent word boundary to the cursor position should be a reasonable estimate of "current signal"
|
||||
const currentSignal = /[\w-_]+?$/.exec(input.slice(0, cursorPos).toUpperCase())[0];
|
||||
|
||||
const signals = JSON.parse(localStorage.getItem("dict")).map((s) => (s.value));
|
||||
|
||||
const matches = signals.filter((s) => (s.startsWith(currentSignal)));
|
||||
|
||||
// Give up if current signal isn't a prefix of any signal
|
||||
if (!matches.length) return;
|
||||
|
||||
// Longest common prefix algorithm
|
||||
// After loop, i contains number of additional characters (after currentSignal.length) that are shared by all matches
|
||||
matches.sort();
|
||||
console.log(matches);
|
||||
let i = 0;
|
||||
for (; i<matches[0].length; i++) {
|
||||
const idx = i + currentSignal.length;
|
||||
const [first, last] = [matches[0][idx], matches[matches.length-1][idx]];
|
||||
if (first === undefined || last === undefined || first !== last) break;
|
||||
}
|
||||
|
||||
const addedCharacters = matches[0].slice(currentSignal.length, currentSignal.length+i);
|
||||
|
||||
// Put new computed value back into text box and reposition cursor to match
|
||||
inputEl.value = input.slice(0, cursorPos) + addedCharacters + input.slice(cursorPos);
|
||||
inputEl.selectionStart = cursorPos + i;
|
||||
inputEl.selectionEnd = cursorPos + i;
|
||||
});
|
||||
})();
|
||||
Loading…
Reference in New Issue