144 lines
5.8 KiB
JavaScript
144 lines
5.8 KiB
JavaScript
// 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);
|
|
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;
|
|
} |