// Picks the first default chatbox, just to have something here by default // I ASSUME, this is done automatically when the page loads, but IDK how JS is actually implemented by browsers // You can't force me to read the documentation, I REFUSE! I just WON'T, OK?? Haha. let textBox = document.querySelector('[id*="reply-form-body-"]'); let vari = ""; let originalFunction = null; let fucName = null; let funcFull = ""; let Marseys = []; //The comments are terrible, I know. Too bad! const specialCases = { "å": ":aa:", "Å": ":aa:", "æ": ":ae:", "Æ": ":ae:", "ø": ":oo:", "Ø": ":oo:", " ": ":space:", "?": ":questionmark:", "!": ":exclamationpoint:", ".": ":period:", ",": ":comma:", "-": ":dash:", "'": ":apostrophe:", '"': ":quotation:", "/": ":slash:", "\\": ":!slash:", "+": ":plus:", "*": ":asterisk:", "<": ":angle:", ">": ":!angle:", "=": ":equals:", "_": ":underscore:", "^": ":land:", ":": ":colon:", "(": ":paren:", ")": ":!paren:", "{": ":brace:", "}": ":!brace:", "@": ":at:", "&": ":ampersand:", "|": ":vert:", "%": ":percent:", "#": ":pound:", "¤": "\n" // Use "¤" as a placeholder for newlines. Who uses ¤ for anything anyway? }; //This pile of shit was made by @Count_Sprpr, I hate JS like I hate the antichrist //Things to MAYBE improve: //3. Fix bugs that I haven't experienced or thought of //Removes the function in the button element so that clicking the button won't immediately post the comment //This triggers on hover document.addEventListener("mouseover", function (event) { if (event.target.id.includes("save-reply-to-p") || event.target.id.includes("save-reply-to-c") || event.target.id.includes("save-reply-to-u")) { const dataOnClickValue = event.target.getAttribute('data-onclick'); if (dataOnClickValue === null) { return; } fucName = dataOnClickValue.match(/(\w+)\(/); vari = dataOnClickValue.match(/\(([^)]*)\)/); // Match arguments inside the parentheses funcFull = fucName[1] + vari[0]; event.target.removeAttribute('data-onclick'); } }); //Adds the function back when we stop hovering over, this should hopefully prevent weird behavior. document.addEventListener("mouseout", function (event) { if (event.target.id.includes("save-reply-to-p") || event.target.id.includes("save-reply-to-c") || event.target.id.includes("save-reply-to-u")) { event.target.setAttribute('data-onclick', funcFull); } }); document.addEventListener("click", function (event) { // Will automatically set the textbox when you hit the "reply" button to spawn it if (event.target.id.includes("toggle-reply-")) { let id = "reply-form-body-" + event.target.id.toString().substr(13); id = '[id*="' + id + '"]'; textBox = document.querySelector(id); } // This should handle posts if (event.target.id.toString() === "submit-btn") { document.querySelector('[id*="post-title"]').value = formattText(document.querySelector('[id*="post-title"]').value); document.querySelector('[id*="post-text"]').value = formattText(document.querySelector('[id*="post-text"]').value); } //If you reply to someone, click the textbox you write in, and it will be set here if (event.target.tagName === "TEXTAREA") { textBox = event.target; } if (event.target.id.includes("save-reply-to-p") || event.target.id.includes("save-reply-to-c") || event.target.id.includes("save-reply-to-u")) { event.preventDefault(); let unformattedText = textBox.value; //If the text has already been formatted, indicated by the unformatted text starting with ":", don't do it again. This is flawed, I know. if (unformattedText[0] === ":") { event.target.setAttribute('data-onclick', funcFull); event.target.click(); return; } // Do I need to initialize this to a string? Probably not, but it makes it easier to work with in VScode // I HATE dynamic typing, I HATE dynamic typing, I HATE dynamic typing let formattedText = ""; formattedText = formattText(unformattedText); //Replace text textBox.value = formattedText; //Add the onclick function back to the button. event.target.setAttribute('data-onclick', funcFull); //Click the button. event.target.click(); } }); // Helper function to format the text function formattText(unformattedText) { //To fix newlines I replace them with ¤, this is bad-ish, I know unformattedText = unformattedText.replace(/\n/g, "¤"); unformattedText = replaceSubstrings(unformattedText); let formattedText = ""; for (let i = 0; i < unformattedText.length; i++) { // Checks ASCII codes, normal text is the most common symbols, so having this here first should hopefully improve performance // Apparently you can't test test char with String[i] in JS. Hurray. if ((unformattedText.charCodeAt(i) >= 48 && unformattedText.charCodeAt(i) < 58) || (unformattedText.charCodeAt(i) >= 65 && unformattedText.charCodeAt(i) < 91) || (unformattedText.charCodeAt(i) >= 97 && unformattedText.charCodeAt(i) < 123)) { // Normal cases, why can't they all be like this?? formattedText += ":" + unformattedText[i] + ":"; } else if (unformattedText[i] === "€") { formattedText += Marseys.shift(); } else if (specialCases[unformattedText[i]] !== undefined) { formattedText += specialCases[unformattedText[i]]; } else { formattedText += unformattedText[i]; } } return formattedText; } function replaceSubstrings(unformattedText) { // Regular expression to find substrings that start and end with ":" and "["+"]". Thanks chatGPT let regex = /(:[^:]*:|\[[^\]]*\])/g; let match; // Find all matches and add to the array while ((match = regex.exec(unformattedText)) !== null) { Marseys.push(match[0].trim()); // Add full match including the colons } // Replace all substrings with "€" let modifiedString = unformattedText.replace(regex, "€"); return modifiedString; }