MarseyHieroglyphics/project.js

144 lines
5.8 KiB
JavaScript
Raw Permalink Normal View History

// 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;
2024-09-27 14:46:33 +00:00
}