diff --git a/project.js b/project.js index 7209369..ff42899 100644 --- a/project.js +++ b/project.js @@ -1,143 +1,145 @@ -// 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; +// 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; } \ No newline at end of file