DSCRDA/dscrda.user.js

93 lines
3.4 KiB
JavaScript

// ==UserScript==
// @name Deep Space Communications Relay Dictionary Adder
// @namespace https://hollymcfarland.com
// @version 2026-08-16
// @description Easily add words to dictionary
// @author You
// @match https://dscr.dixonary.co.uk/
// @grant none
// ==/UserScript==
(function() {
'use strict';
const handleSignalClick = (e) => {
const signal = e.target;
const isUndef = signal.classList.contains("undef");
const signalNum = Number(
isUndef
? /^@(-\d+)/.exec(signal.innerText)[1]
: / (-\d+)$/.exec(signal.title)[1]
);
const signalDef = (
isUndef
? ""
: signal.innerText
);
const dictObject = JSON.parse(localStorage.getItem("dict-raw"));
const newDef = prompt(`New definition for signal |${signalNum}:`, signalDef);
if (newDef === null) return;
const capitalDef = newDef.toUpperCase();
const descObect = {
"desc": "??? ADD NOTES HERE ???",
"formatMode": dictObject.beforeUserDefaultMode,
"formatModeAfter": dictObject.afterUserDefaultMode,
"breakOnDouble": false
}
if (isUndef) {
const index = dictObject.wordDict.keys.findIndex((n) => (n < signalNum)) - 1;
if (index !== -2) {
// Insert in sorted order
dictObject.wordDict.keys.splice(index, 0, signalNum);
dictObject.wordDict.values.splice(index, 0, capitalDef);
dictObject.descDict.keys.splice(index, 0, signalNum);
dictObject.descDict.values.splice(index, 0, descObect);
} else {
// Insert at end
dictObject.wordDict.keys.push(signalNum);
dictObject.wordDict.values.push(capitalDef);
dictObject.descDict.keys.push(signalNum);
dictObject.descDict.values.push(descObect);
}
} else {
const index = dictObject.wordDict.keys.indexOf(signalNum);
dictObject.wordDict.values[index] = capitalDef;
}
// I don't want to do this right so we're going to paste the new dictionary into the textarea and click "save"
document.querySelector(".dict-paste-contents").value = JSON.stringify(dictObject);
document.querySelector(".save-dictionary").click();
};
const messages = document.querySelector(".view");
const config = {
childList: true,
attributes: true,
charaterData: true,
subtree: true,
attributeOldValue: true,
characterDataOldValue: true,
};
const mutationCallback = function(mutationsList, observer) {
for (const mutation of mutationsList) {
for (const node of mutation.addedNodes) {
if (node.nodeType === 1 && node.classList.contains("signal") && !node.classList.contains("number")) {
node.addEventListener("click", handleSignalClick);
}
}
}
};
const observer = new MutationObserver(mutationCallback);
observer.observe(messages, config);
document.querySelector('.header span').addEventListener('click', (() => {
console.log(document.querySelector('.dict-paste-contents'))
}));
})();