diff --git a/project.js b/project.js new file mode 100644 index 0000000..7209369 --- /dev/null +++ b/project.js @@ -0,0 +1,143 @@ +// 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] === ":") { + 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; +} \ No newline at end of file