Realized I forgot a couple of lines, this should hopefully ensure consistent behavior.
Just making sure that already formatted text will still be "postable" if something goes wrong. Most of this shit is irrelevant unless you are under the effect of the hieroglyph award.master
parent
b3331bf672
commit
b1558dc5e3
286
project.js
286
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;
|
||||
}
|
Loading…
Reference in New Issue