From ec5b86b276343a3d57e7dfcf0bb3639693641b4c Mon Sep 17 00:00:00 2001 From: MathMan05 Date: Sat, 20 Jul 2024 19:05:23 -0500 Subject: [PATCH] make MarkDown into a class and fixed emojis --- .dist/channel.js | 5 +- .dist/embed.js | 20 +- .dist/markdown.js | 882 ++++++++++++++++++++++--------------------- .dist/message.js | 12 +- .dist/user.js | 8 +- webpage/channel.ts | 6 +- webpage/embed.ts | 20 +- webpage/localuser.ts | 2 +- webpage/markdown.ts | 819 +++++++++++++++++++++------------------- webpage/message.ts | 13 +- webpage/style.css | 8 + webpage/user.ts | 10 +- 12 files changed, 957 insertions(+), 848 deletions(-) diff --git a/.dist/channel.js b/.dist/channel.js index 16635a2..3efee21 100644 --- a/.dist/channel.js +++ b/.dist/channel.js @@ -3,7 +3,6 @@ import { Message } from "./message.js"; import { Voice } from "./audio.js"; import { Contextmenu } from "./contextmenu.js"; import { Fullscreen } from "./fullscreen.js"; -import { markdown } from "./markdown.js"; import { Permissions } from "./permissions.js"; import { Settings, RoleList } from "./settings.js"; import { InfiniteScroller } from "./infiniteScroller.js"; @@ -745,10 +744,10 @@ class Channel { if (!("Notification" in window)) { } else if (Notification.permission === "granted") { - let noticontent = markdown(message.content).textContent; + let noticontent = message.content.textContent; if (message.embeds[0]) { noticontent ||= message.embeds[0].json.title; - noticontent ||= markdown(message.embeds[0].json.description).textContent; + noticontent ||= message.content.textContent; } noticontent ||= "Blank Message"; let imgurl = null; diff --git a/.dist/embed.js b/.dist/embed.js index 6a755cd..e617bdb 100644 --- a/.dist/embed.js +++ b/.dist/embed.js @@ -1,5 +1,5 @@ import { Fullscreen } from "./fullscreen.js"; -import { markdown } from "./markdown.js"; +import { MarkDown } from "./markdown.js"; class Embed { type; owner; @@ -27,6 +27,18 @@ class Embed { return document.createElement("div"); //prevent errors by giving blank div } } + get message() { + return this.owner; + } + get channel() { + return this.message.channel; + } + get guild() { + return this.channel.guild; + } + get localuser() { + return this.guild.localuser; + } generateRich() { console.log(this.json); const div = document.createElement("div"); @@ -55,7 +67,7 @@ class Embed { embed.append(authorline); } const title = document.createElement("a"); - title.append(markdown(this.json.title)); + title.append(new MarkDown(this.json.title, this.localuser).makeHTML()); if (this.json.url) { title.href = this.json.url; } @@ -63,7 +75,7 @@ class Embed { embed.append(title); if (this.json.description) { const p = document.createElement("p"); - p.append(markdown(this.json.description)); + p.append(new MarkDown(this.json.description, this.channel).makeHTML()); embed.append(p); } embed.append(document.createElement("br")); @@ -74,7 +86,7 @@ class Embed { b.textContent = thing.name; div.append(b); const p = document.createElement("p"); - p.append(markdown(thing.value)); + p.append(new MarkDown(thing.value, this.channel).makeHTML()); p.classList.add("embedp"); div.append(p); if (thing.inline) { diff --git a/.dist/markdown.js b/.dist/markdown.js index 0e1febb..8111f5f 100644 --- a/.dist/markdown.js +++ b/.dist/markdown.js @@ -1,446 +1,476 @@ -export { markdown }; -function markdown(text, { keep = false, stdsize = false } = {}) { - let txt; - if ((typeof text) === (typeof "")) { - txt = text.split(""); - } - else { - txt = text; - } - if (txt === undefined) { - txt = []; - } - const span = document.createElement("span"); - let current = document.createElement("span"); - function appendcurrent() { - if (current.innerHTML !== "") { - span.append(current); - current = document.createElement("span"); +export { MarkDown }; +class MarkDown { + txt; + keep; + stdsize; + owner; + info; + constructor(text, owner, { keep = false, stdsize = false } = {}) { + if ((typeof text) === (typeof "")) { + this.txt = text.split(""); } + else { + this.txt = text; + } + if (this.txt === undefined) { + this.txt = []; + } + this.info = owner.info; + this.keep = keep; + this.owner = owner; + this.stdsize = stdsize; } - for (let i = 0; i < txt.length; i++) { - if (txt[i] === "\n" || i === 0) { - const first = i === 0; - if (first) { - i--; + get rawString() { + return this.txt.concat(""); + } + get textContent() { + return this.makeHTML().textContent; + } + makeHTML({ keep = this.keep, stdsize = this.stdsize } = {}) { + return this.markdown(this.txt, { keep: keep, stdsize: stdsize }); + } + markdown(text, { keep = false, stdsize = false } = {}) { + let txt; + if ((typeof text) === (typeof "")) { + txt = text.split(""); + } + else { + txt = text; + } + if (txt === undefined) { + txt = []; + } + const span = document.createElement("span"); + let current = document.createElement("span"); + function appendcurrent() { + if (current.innerHTML !== "") { + span.append(current); + current = document.createElement("span"); } - let element = null; - let keepys = ""; - if (txt[i + 1] === "#") { - console.log("test"); - if (txt[i + 2] === "#") { - if (txt[i + 3] === "#" && txt[i + 4] === " ") { - element = document.createElement("h3"); - keepys = "### "; - i += 5; + } + for (let i = 0; i < txt.length; i++) { + if (txt[i] === "\n" || i === 0) { + const first = i === 0; + if (first) { + i--; + } + let element = null; + let keepys = ""; + if (txt[i + 1] === "#") { + console.log("test"); + if (txt[i + 2] === "#") { + if (txt[i + 3] === "#" && txt[i + 4] === " ") { + element = document.createElement("h3"); + keepys = "### "; + i += 5; + } + else if (txt[i + 3] === " ") { + element = document.createElement("h2"); + element.classList.add("h2md"); + keepys = "## "; + i += 4; + } } - else if (txt[i + 3] === " ") { - element = document.createElement("h2"); - element.classList.add("h2md"); - keepys = "## "; - i += 4; + else if (txt[i + 2] === " ") { + element = document.createElement("h1"); + keepys = "# "; + i += 3; } } - else if (txt[i + 2] === " ") { - element = document.createElement("h1"); - keepys = "# "; + else if (txt[i + 1] === ">" && txt[i + 2] === " ") { + element = document.createElement("div"); + const line = document.createElement("div"); + line.classList.add("quoteline"); + element.append(line); + element.classList.add("quote"); + keepys = "> "; i += 3; } - } - else if (txt[i + 1] === ">" && txt[i + 2] === " ") { - element = document.createElement("div"); - const line = document.createElement("div"); - line.classList.add("quoteline"); - element.append(line); - element.classList.add("quote"); - keepys = "> "; - i += 3; - } - if (keepys) { - appendcurrent(); - if (!first && !stdsize) { - span.appendChild(document.createElement("br")); + if (keepys) { + appendcurrent(); + if (!first && !stdsize) { + span.appendChild(document.createElement("br")); + } + const build = []; + for (; txt[i] !== "\n" && txt[i] !== undefined; i++) { + build.push(txt[i]); + } + if (stdsize) { + element = document.createElement("span"); + } + if (keep) { + element.append(keepys); + } + element.appendChild(this.markdown(build, { keep: keep, stdsize: stdsize })); + span.append(element); + i--; + continue; } - const build = []; - for (; txt[i] !== "\n" && txt[i] !== undefined; i++) { - build.push(txt[i]); + if (first) { + i++; + } + } + if (txt[i] === "\n") { + if (!stdsize) { + appendcurrent(); + span.append(document.createElement("br")); + } + continue; + } + if (txt[i] === "`") { + let count = 1; + if (txt[i + 1] === "`") { + count++; + if (txt[i + 2] === "`") { + count++; + } + } + let build = ""; + if (keep) { + build += "`".repeat(count); + } + let find = 0; + let j = i + count; + let init = true; + for (; txt[j] !== undefined && (txt[j] !== "\n" || count === 3) && find !== count; j++) { + if (txt[j] === "`") { + find++; + } + else { + if (find !== 0) { + build += "`".repeat(find); + find = 0; + } + if (init && count === 3) { + if (txt[j] === " " || txt[j] === "\n") { + init = false; + } + if (keep) { + build += txt[j]; + } + continue; + } + build += txt[j]; + } } if (stdsize) { - element = document.createElement("span"); + console.log(build); + build = build.replaceAll("\n", ""); + console.log(build, JSON.stringify(build)); } - if (keep) { - element.append(keepys); - } - element.appendChild(markdown(build, { keep: keep, stdsize: stdsize })); - span.append(element); - i--; - continue; - } - if (first) { - i++; - } - } - if (txt[i] === "\n") { - if (!stdsize) { - appendcurrent(); - span.append(document.createElement("br")); - } - continue; - } - if (txt[i] === "`") { - let count = 1; - if (txt[i + 1] === "`") { - count++; - if (txt[i + 2] === "`") { - count++; - } - } - let build = ""; - if (keep) { - build += "`".repeat(count); - } - let find = 0; - let j = i + count; - let init = true; - for (; txt[j] !== undefined && (txt[j] !== "\n" || count === 3) && find !== count; j++) { - if (txt[j] === "`") { - find++; - } - else { - if (find !== 0) { - build += "`".repeat(find); - find = 0; - } - if (init && count === 3) { - if (txt[j] === " " || txt[j] === "\n") { - init = false; - } - if (keep) { - build += txt[j]; - } - continue; - } - build += txt[j]; - } - } - if (stdsize) { - console.log(build); - build = build.replaceAll("\n", ""); - console.log(build, JSON.stringify(build)); - } - if (find === count) { - appendcurrent(); - i = j; - if (keep) { - build += "`".repeat(find); - } - if (count !== 3 && !stdsize) { - const samp = document.createElement("samp"); - samp.textContent = build; - span.appendChild(samp); - } - else { - const pre = document.createElement("pre"); - if (build[build.length - 1] === "\n") { - build = build.substring(0, build.length - 1); - } - if (txt[i] === "\n") { - i++; - } - pre.textContent = build; - span.appendChild(pre); - } - i--; - continue; - } - } - if (txt[i] === "*") { - let count = 1; - if (txt[i + 1] === "*") { - count++; - if (txt[i + 2] === "*") { - count++; - } - } - let build = []; - let find = 0; - let j = i + count; - for (; txt[j] !== undefined && find !== count; j++) { - if (txt[j] === "*") { - find++; - } - else { - build.push(txt[j]); - if (find !== 0) { - build = build.concat(new Array(find).fill("*")); - find = 0; - } - } - } - if (find === count && (count != 1 || txt[i + 1] !== " ")) { - appendcurrent(); - i = j; - const stars = "*".repeat(count); - if (count === 1) { - const i = document.createElement("i"); - if (keep) { - i.append(stars); - } - i.appendChild(markdown(build, { keep: keep, stdsize: stdsize })); - if (keep) { - i.append(stars); - } - span.appendChild(i); - } - else if (count === 2) { - const b = document.createElement("b"); - if (keep) { - b.append(stars); - } - b.appendChild(markdown(build, { keep: keep, stdsize: stdsize })); - if (keep) { - b.append(stars); - } - span.appendChild(b); - } - else { - const b = document.createElement("b"); - const i = document.createElement("i"); - if (keep) { - b.append(stars); - } - b.appendChild(markdown(build, { keep: keep, stdsize: stdsize })); - if (keep) { - b.append(stars); - } - i.appendChild(b); - span.appendChild(i); - } - i--; - continue; - } - } - if (txt[i] === "_") { - let count = 1; - if (txt[i + 1] === "_") { - count++; - if (txt[i + 2] === "_") { - count++; - } - } - let build = []; - let find = 0; - let j = i + count; - for (; txt[j] !== undefined && find !== count; j++) { - if (txt[j] === "_") { - find++; - } - else { - build.push(txt[j]); - if (find !== 0) { - build = build.concat(new Array(find).fill("_")); - find = 0; - } - } - } - if (find === count && (count != 1 || (txt[j + 1] === " " || txt[j + 1] === "\n" || txt[j + 1] === undefined))) { - appendcurrent(); - i = j; - const underscores = "_".repeat(count); - if (count === 1) { - const i = document.createElement("i"); - if (keep) { - i.append(underscores); - } - i.appendChild(markdown(build, { keep: keep, stdsize: stdsize })); - if (keep) { - i.append(underscores); - } - span.appendChild(i); - } - else if (count === 2) { - const u = document.createElement("u"); - if (keep) { - u.append(underscores); - } - u.appendChild(markdown(build, { keep: keep, stdsize: stdsize })); - if (keep) { - u.append(underscores); - } - span.appendChild(u); - } - else { - const u = document.createElement("u"); - const i = document.createElement("i"); - if (keep) { - i.append(underscores); - } - i.appendChild(markdown(build, { keep: keep, stdsize: stdsize })); - if (keep) { - i.append(underscores); - } - u.appendChild(i); - span.appendChild(u); - } - i--; - continue; - } - } - if (txt[i] === "~" && txt[i + 1] === "~") { - let count = 2; - let build = []; - let find = 0; - let j = i + 2; - for (; txt[j] !== undefined && find !== count; j++) { - if (txt[j] === "~") { - find++; - } - else { - build.push(txt[j]); - if (find !== 0) { - build = build.concat(new Array(find).fill("~")); - find = 0; - } - } - } - if (find === count) { - appendcurrent(); - i = j; - const tildes = "~~"; - if (count === 2) { - const s = document.createElement("s"); - if (keep) { - s.append(tildes); - } - s.appendChild(markdown(build, { keep: keep, stdsize: stdsize })); - if (keep) { - s.append(tildes); - } - span.appendChild(s); - } - continue; - } - } - if (txt[i] === "|" && txt[i + 1] === "|") { - let count = 2; - let build = []; - let find = 0; - let j = i + 2; - for (; txt[j] !== undefined && find !== count; j++) { - if (txt[j] === "|") { - find++; - } - else { - build.push(txt[j]); - if (find !== 0) { - build = build.concat(new Array(find).fill("~")); - find = 0; - } - } - } - if (find === count) { - appendcurrent(); - i = j; - const pipes = "||"; - if (count === 2) { - const j = document.createElement("j"); - if (keep) { - j.append(pipes); - } - j.appendChild(markdown(build, { keep: keep, stdsize: stdsize })); - j.classList.add("spoiler"); - j.onclick = markdown.unspoil; - if (keep) { - j.append(pipes); - } - span.appendChild(j); - } - continue; - } - } - if (txt[i] === "<" && txt[i + 1] === "t" && txt[i + 2] === ":") { - let found = false; - const build = ["<", "t", ":"]; - let j = i + 3; - for (; txt[j] !== void 0; j++) { - build.push(txt[j]); - if (txt[j] === ">") { - found = true; - break; - } - } - if (found) { - appendcurrent(); - i = j; - const parts = build.join("").match(/^$/); - const dateInput = new Date(Number.parseInt(parts[1]) * 1000); - let time = ""; - if (Number.isNaN(dateInput.getTime())) - time = build.join(""); - else { - if (parts[3] === "d") - time = dateInput.toLocaleString(void 0, { day: "2-digit", month: "2-digit", year: "numeric" }); - else if (parts[3] === "D") - time = dateInput.toLocaleString(void 0, { day: "numeric", month: "long", year: "numeric" }); - else if (!parts[3] || parts[3] === "f") - time = dateInput.toLocaleString(void 0, { day: "numeric", month: "long", year: "numeric" }) + " " + - dateInput.toLocaleString(void 0, { hour: "2-digit", minute: "2-digit" }); - else if (parts[3] === "F") - time = dateInput.toLocaleString(void 0, { day: "numeric", month: "long", year: "numeric", weekday: "long" }) + " " + - dateInput.toLocaleString(void 0, { hour: "2-digit", minute: "2-digit" }); - else if (parts[3] === "t") - time = dateInput.toLocaleString(void 0, { hour: "2-digit", minute: "2-digit" }); - else if (parts[3] === "T") - time = dateInput.toLocaleString(void 0, { hour: "2-digit", minute: "2-digit", second: "2-digit" }); - else if (parts[3] === "R") - time = Math.round((Date.now() - (Number.parseInt(parts[1]) * 1000)) / 1000 / 60) + " minutes ago"; - } - const timeElem = document.createElement("span"); - timeElem.classList.add("markdown-timestamp"); - timeElem.textContent = time; - span.appendChild(timeElem); - continue; - } - } - if (txt[i] === "<" && (txt[i + 1] === ":" || (txt[i + 1] === "a" && txt[i + 2] === ":"))) { - let found = false; - const build = txt[i + 1] === "a" ? ["<", "a", ":"] : ["<", ":"]; - let j = i + build.length; - for (; txt[j] !== void 0; j++) { - build.push(txt[j]); - if (txt[j] === ">") { - found = true; - break; - } - } - if (found) { - const parts = build.join("").match(/^<(a)?:\w+:(\d{10,30})>$/); - if (parts && parts[2]) { + if (find === count) { appendcurrent(); i = j; - console.log(typeof txt, txt); - const isEmojiOnly = txt.join("").trim() === build.join("").trim(); - const emojiElem = document.createElement("img"); - emojiElem.classList.add("md-emoji"); - emojiElem.width = isEmojiOnly ? 48 : 22; - emojiElem.height = isEmojiOnly ? 48 : 22; - emojiElem.crossOrigin = "anonymous"; - //emojiElem.src=this.info.cdn.toString() + "/emojis/" + parts[2] + "." + (parts[1] ? "gif" : "png") + "?size=32"; - //must uncomment later - emojiElem.alt = ""; - emojiElem.loading = "lazy"; - span.appendChild(emojiElem); + if (keep) { + build += "`".repeat(find); + } + if (count !== 3 && !stdsize) { + const samp = document.createElement("samp"); + samp.textContent = build; + span.appendChild(samp); + } + else { + const pre = document.createElement("pre"); + if (build[build.length - 1] === "\n") { + build = build.substring(0, build.length - 1); + } + if (txt[i] === "\n") { + i++; + } + pre.textContent = build; + span.appendChild(pre); + } + i--; continue; } } + if (txt[i] === "*") { + let count = 1; + if (txt[i + 1] === "*") { + count++; + if (txt[i + 2] === "*") { + count++; + } + } + let build = []; + let find = 0; + let j = i + count; + for (; txt[j] !== undefined && find !== count; j++) { + if (txt[j] === "*") { + find++; + } + else { + build.push(txt[j]); + if (find !== 0) { + build = build.concat(new Array(find).fill("*")); + find = 0; + } + } + } + if (find === count && (count != 1 || txt[i + 1] !== " ")) { + appendcurrent(); + i = j; + const stars = "*".repeat(count); + if (count === 1) { + const i = document.createElement("i"); + if (keep) { + i.append(stars); + } + i.appendChild(this.markdown(build, { keep: keep, stdsize: stdsize })); + if (keep) { + i.append(stars); + } + span.appendChild(i); + } + else if (count === 2) { + const b = document.createElement("b"); + if (keep) { + b.append(stars); + } + b.appendChild(this.markdown(build, { keep: keep, stdsize: stdsize })); + if (keep) { + b.append(stars); + } + span.appendChild(b); + } + else { + const b = document.createElement("b"); + const i = document.createElement("i"); + if (keep) { + b.append(stars); + } + b.appendChild(this.markdown(build, { keep: keep, stdsize: stdsize })); + if (keep) { + b.append(stars); + } + i.appendChild(b); + span.appendChild(i); + } + i--; + continue; + } + } + if (txt[i] === "_") { + let count = 1; + if (txt[i + 1] === "_") { + count++; + if (txt[i + 2] === "_") { + count++; + } + } + let build = []; + let find = 0; + let j = i + count; + for (; txt[j] !== undefined && find !== count; j++) { + if (txt[j] === "_") { + find++; + } + else { + build.push(txt[j]); + if (find !== 0) { + build = build.concat(new Array(find).fill("_")); + find = 0; + } + } + } + if (find === count && (count != 1 || (txt[j + 1] === " " || txt[j + 1] === "\n" || txt[j + 1] === undefined))) { + appendcurrent(); + i = j; + const underscores = "_".repeat(count); + if (count === 1) { + const i = document.createElement("i"); + if (keep) { + i.append(underscores); + } + i.appendChild(this.markdown(build, { keep: keep, stdsize: stdsize })); + if (keep) { + i.append(underscores); + } + span.appendChild(i); + } + else if (count === 2) { + const u = document.createElement("u"); + if (keep) { + u.append(underscores); + } + u.appendChild(this.markdown(build, { keep: keep, stdsize: stdsize })); + if (keep) { + u.append(underscores); + } + span.appendChild(u); + } + else { + const u = document.createElement("u"); + const i = document.createElement("i"); + if (keep) { + i.append(underscores); + } + i.appendChild(this.markdown(build, { keep: keep, stdsize: stdsize })); + if (keep) { + i.append(underscores); + } + u.appendChild(i); + span.appendChild(u); + } + i--; + continue; + } + } + if (txt[i] === "~" && txt[i + 1] === "~") { + let count = 2; + let build = []; + let find = 0; + let j = i + 2; + for (; txt[j] !== undefined && find !== count; j++) { + if (txt[j] === "~") { + find++; + } + else { + build.push(txt[j]); + if (find !== 0) { + build = build.concat(new Array(find).fill("~")); + find = 0; + } + } + } + if (find === count) { + appendcurrent(); + i = j; + const tildes = "~~"; + if (count === 2) { + const s = document.createElement("s"); + if (keep) { + s.append(tildes); + } + s.appendChild(this.markdown(build, { keep: keep, stdsize: stdsize })); + if (keep) { + s.append(tildes); + } + span.appendChild(s); + } + continue; + } + } + if (txt[i] === "|" && txt[i + 1] === "|") { + let count = 2; + let build = []; + let find = 0; + let j = i + 2; + for (; txt[j] !== undefined && find !== count; j++) { + if (txt[j] === "|") { + find++; + } + else { + build.push(txt[j]); + if (find !== 0) { + build = build.concat(new Array(find).fill("~")); + find = 0; + } + } + } + if (find === count) { + appendcurrent(); + i = j; + const pipes = "||"; + if (count === 2) { + const j = document.createElement("j"); + if (keep) { + j.append(pipes); + } + j.appendChild(this.markdown(build, { keep: keep, stdsize: stdsize })); + j.classList.add("spoiler"); + j.onclick = MarkDown.unspoil; + if (keep) { + j.append(pipes); + } + span.appendChild(j); + } + continue; + } + } + if (txt[i] === "<" && txt[i + 1] === "t" && txt[i + 2] === ":") { + let found = false; + const build = ["<", "t", ":"]; + let j = i + 3; + for (; txt[j] !== void 0; j++) { + build.push(txt[j]); + if (txt[j] === ">") { + found = true; + break; + } + } + if (found) { + appendcurrent(); + i = j; + const parts = build.join("").match(/^$/); + const dateInput = new Date(Number.parseInt(parts[1]) * 1000); + let time = ""; + if (Number.isNaN(dateInput.getTime())) + time = build.join(""); + else { + if (parts[3] === "d") + time = dateInput.toLocaleString(void 0, { day: "2-digit", month: "2-digit", year: "numeric" }); + else if (parts[3] === "D") + time = dateInput.toLocaleString(void 0, { day: "numeric", month: "long", year: "numeric" }); + else if (!parts[3] || parts[3] === "f") + time = dateInput.toLocaleString(void 0, { day: "numeric", month: "long", year: "numeric" }) + " " + + dateInput.toLocaleString(void 0, { hour: "2-digit", minute: "2-digit" }); + else if (parts[3] === "F") + time = dateInput.toLocaleString(void 0, { day: "numeric", month: "long", year: "numeric", weekday: "long" }) + " " + + dateInput.toLocaleString(void 0, { hour: "2-digit", minute: "2-digit" }); + else if (parts[3] === "t") + time = dateInput.toLocaleString(void 0, { hour: "2-digit", minute: "2-digit" }); + else if (parts[3] === "T") + time = dateInput.toLocaleString(void 0, { hour: "2-digit", minute: "2-digit", second: "2-digit" }); + else if (parts[3] === "R") + time = Math.round((Date.now() - (Number.parseInt(parts[1]) * 1000)) / 1000 / 60) + " minutes ago"; + } + const timeElem = document.createElement("span"); + timeElem.classList.add("markdown-timestamp"); + timeElem.textContent = time; + span.appendChild(timeElem); + continue; + } + } + if (txt[i] === "<" && (txt[i + 1] === ":" || (txt[i + 1] === "a" && txt[i + 2] === ":"))) { + let found = false; + const build = txt[i + 1] === "a" ? ["<", "a", ":"] : ["<", ":"]; + let j = i + build.length; + for (; txt[j] !== void 0; j++) { + build.push(txt[j]); + if (txt[j] === ">") { + found = true; + break; + } + } + if (found) { + const buildjoin = build.join(""); + const parts = buildjoin.match(/^<(a)?:\w+:(\d{10,30})>$/); + if (parts && parts[2]) { + appendcurrent(); + i = j; + console.log(typeof txt, txt); + const isEmojiOnly = txt.join("").trim() === buildjoin.trim(); + console.log(isEmojiOnly, ":3"); + const emojiElem = document.createElement("img"); + emojiElem.classList.add("md-emoji"); + emojiElem.classList.add(isEmojiOnly ? "bigemoji" : "smallemoji"); + emojiElem.crossOrigin = "anonymous"; + emojiElem.src = this.info.cdn.toString() + "emojis/" + parts[2] + "." + (parts[1] ? "gif" : "png") + "?size=32"; + emojiElem.alt = buildjoin; + emojiElem.loading = "lazy"; + span.appendChild(emojiElem); + continue; + } + } + } + current.textContent += txt[i]; } - current.textContent += txt[i]; + appendcurrent(); + return span; + } + static unspoil(e) { + e.target.classList.remove("spoiler"); + e.target.classList.add("unspoiled"); } - appendcurrent(); - return span; } -markdown.unspoil = function (e) { - //console.log("undone") - e.target.classList.remove("spoiler"); - e.target.classList.add("unspoiled"); -}; diff --git a/.dist/message.js b/.dist/message.js index 799f605..6dcaafb 100644 --- a/.dist/message.js +++ b/.dist/message.js @@ -1,7 +1,7 @@ import { Contextmenu } from "./contextmenu.js"; import { User } from "./user.js"; import { Member } from "./member.js"; -import { markdown } from "./markdown.js"; +import { MarkDown } from "./markdown.js"; import { Embed } from "./embed.js"; import { File } from "./file.js"; class Message { @@ -33,7 +33,7 @@ class Message { } static setupcmenu() { Message.contextmenu.addbutton("Copy raw text", function () { - navigator.clipboard.writeText(this.content); + navigator.clipboard.writeText(this.content.rawString); }); Message.contextmenu.addbutton("Reply", function (div) { this.channel.setReplying(this); @@ -63,6 +63,10 @@ class Message { } continue; } + else if (thing === "content") { + this.content = new MarkDown(messagejson[thing], this.channel); + continue; + } this[thing] = messagejson[thing]; } for (const thing in this.embeds) { @@ -204,7 +208,7 @@ class Message { replyline.classList.add("replyflex"); this.channel.getmessage(this.message_reference.message_id).then(message => { const author = message.author; - reply.appendChild(markdown(message.content, { stdsize: true })); + reply.appendChild(message.content.makeHTML({ stdsize: true })); minipfp.src = author.getpfpsrc(); author.bind(minipfp); username.textContent = author.username; @@ -266,7 +270,7 @@ class Message { else { div.classList.remove("topMessage"); } - const messaged = markdown(this.content); + const messaged = this.content.makeHTML(); div["txt"] = messaged; const messagedwrap = document.createElement("div"); messagedwrap.classList.add("flexttb"); diff --git a/.dist/user.js b/.dist/user.js index 2323d78..401b8a9 100644 --- a/.dist/user.js +++ b/.dist/user.js @@ -1,6 +1,6 @@ //const usercache={}; import { Member } from "./member.js"; -import { markdown } from "./markdown.js"; +import { MarkDown } from "./markdown.js"; import { Contextmenu } from "./contextmenu.js"; class User { static userids = {}; @@ -48,6 +48,10 @@ class User { } if (dontclone) { for (const thing of Object.keys(userjson)) { + if (thing === "bio") { + this.bio = new MarkDown(userjson[thing], this.localuser); + continue; + } this[thing] = userjson[thing]; } this.hypotheticalpfp = false; @@ -146,7 +150,7 @@ class User { userbody.appendChild(pronounshtml); const rule = document.createElement("hr"); userbody.appendChild(rule); - const biohtml = markdown(this.bio); + const biohtml = this.bio.makeHTML(); userbody.appendChild(biohtml); } console.log(div); diff --git a/webpage/channel.ts b/webpage/channel.ts index ab9e615..1f1eca6 100644 --- a/webpage/channel.ts +++ b/webpage/channel.ts @@ -3,7 +3,7 @@ import { Message } from "./message.js"; import {Voice} from "./audio.js"; import {Contextmenu} from "./contextmenu.js"; import {Fullscreen} from "./fullscreen.js"; -import {markdown} from "./markdown.js"; +import {MarkDown} from "./markdown.js"; import {Guild} from "./guild.js"; import { Localuser } from "./localuser.js"; import { Permissions } from "./permissions.js"; @@ -744,10 +744,10 @@ class Channel{ if (!("Notification" in window)) { } else if (Notification.permission === "granted") { - let noticontent=markdown(message.content).textContent; + let noticontent=message.content.textContent; if(message.embeds[0]){ noticontent||=message.embeds[0].json.title; - noticontent||=markdown(message.embeds[0].json.description).textContent; + noticontent||=message.content.textContent; } noticontent||="Blank Message"; let imgurl=null; diff --git a/webpage/embed.ts b/webpage/embed.ts index a9c1494..ac5d60e 100644 --- a/webpage/embed.ts +++ b/webpage/embed.ts @@ -1,6 +1,6 @@ import {Fullscreen} from "./fullscreen.js"; import {Message} from "./message.js"; -import {markdown} from "./markdown.js"; +import {MarkDown} from "./markdown.js"; class Embed{ type:string; @@ -29,6 +29,18 @@ class Embed{ return document.createElement("div");//prevent errors by giving blank div } } + get message(){ + return this.owner; + } + get channel(){ + return this.message.channel; + } + get guild(){ + return this.channel.guild; + } + get localuser(){ + return this.guild.localuser; + } generateRich(){ console.log(this.json) const div=document.createElement("div"); @@ -59,7 +71,7 @@ class Embed{ embed.append(authorline); } const title=document.createElement("a"); - title.append(markdown(this.json.title)); + title.append(new MarkDown(this.json.title,this.localuser).makeHTML()); if(this.json.url){ title.href=this.json.url; } @@ -68,7 +80,7 @@ class Embed{ if(this.json.description){ const p=document.createElement("p"); - p.append(markdown(this.json.description)); + p.append(new MarkDown(this.json.description,this.channel).makeHTML()); embed.append(p); } @@ -80,7 +92,7 @@ class Embed{ b.textContent=thing.name; div.append(b); const p=document.createElement("p") - p.append(markdown(thing.value)); + p.append(new MarkDown(thing.value,this.channel).makeHTML()); p.classList.add("embedp"); div.append(p); diff --git a/webpage/localuser.ts b/webpage/localuser.ts index f3470cb..a363c8b 100644 --- a/webpage/localuser.ts +++ b/webpage/localuser.ts @@ -4,7 +4,7 @@ import {Direct} from "./direct.js"; import {Voice} from "./audio.js"; import {User} from "./user.js"; import {Member} from "./member.js"; -import {markdown} from "./markdown.js"; +import {MarkDown} from "./markdown.js"; import {Fullscreen} from "./fullscreen.js"; import {setTheme, Specialuser} from "./login.js"; diff --git a/webpage/markdown.ts b/webpage/markdown.ts index 128297d..3cf3a6e 100644 --- a/webpage/markdown.ts +++ b/webpage/markdown.ts @@ -1,413 +1,446 @@ -export {markdown}; -function markdown(text : string|string[],{keep=false,stdsize=false} = {}){ - let txt : string[]; - if((typeof text)===(typeof "")){ - txt=(text as string).split(""); - }else{ - txt=(text as string[]); - } - if(txt===undefined){ - txt=[]; - } - const span=document.createElement("span"); - let current=document.createElement("span"); - function appendcurrent(){ - if(current.innerHTML!==""){ - span.append(current); - current=document.createElement("span"); +import { Channel } from "./channel"; +import { Localuser } from "./localuser"; + +export {MarkDown}; +class MarkDown{ + txt : string[]; + keep:boolean; + stdsize:boolean; + owner:Localuser|Channel; + info:Localuser["info"]; + constructor(text : string|string[],owner:MarkDown["owner"],{keep=false,stdsize=false} = {}){ + if((typeof text)===(typeof "")){ + this.txt=(text as string).split(""); + }else{ + this.txt=(text as string[]); } - + if(this.txt===undefined){ + this.txt=[]; + } + this.info=owner.info; + this.keep=keep; + this.owner=owner; + this.stdsize=stdsize; } - for(let i=0;i"&&txt[i+2]===" "){ + element=document.createElement("div"); + const line=document.createElement("div"); + line.classList.add("quoteline"); + element.append(line); + element.classList.add("quote"); + keepys="> "; i+=3; } - }else if(txt[i+1]===">"&&txt[i+2]===" "){ - element=document.createElement("div"); - const line=document.createElement("div"); - line.classList.add("quoteline"); - element.append(line); - element.classList.add("quote"); - keepys="> "; - i+=3; - } - if(keepys){ - appendcurrent(); - if(!first&&!stdsize){ - span.appendChild(document.createElement("br")); + if(keepys){ + appendcurrent(); + if(!first&&!stdsize){ + span.appendChild(document.createElement("br")); + } + const build=[]; + for(;txt[i]!=="\n"&&txt[i]!==undefined;i++){ + build.push(txt[i]); + } + if(stdsize){ + element=document.createElement("span"); + } + if(keep){ + element.append(keepys); + } + element.appendChild(this.markdown(build,{keep:keep,stdsize:stdsize})); + span.append(element); + i--; + continue; } - const build=[]; - for(;txt[i]!=="\n"&&txt[i]!==undefined;i++){ - build.push(txt[i]); + if(first){ + i++; + } + } + if(txt[i]==="\n"){ + + if(!stdsize){ + appendcurrent(); + span.append(document.createElement("br")); + } + continue; + } + if(txt[i]==="`"){ + let count=1; + if(txt[i+1]==="`"){ + count++; + if(txt[i+2]==="`"){ + count++; + } + } + let build=""; + if(keep){ + build+="`".repeat(count); + } + let find=0; + let j=i+count; + let init=true; + for(;txt[j]!==undefined&&(txt[j]!=="\n"||count===3)&&find!==count;j++){ + if(txt[j]==="`"){ + find++; + }else{ + if(find!==0){ + build+="`".repeat(find); + find=0; + } + if(init&&count===3){ + if(txt[j]===" "||txt[j]==="\n"){ + init=false; + } + if(keep){ + build+=txt[j]; + } + continue; + } + build+=txt[j]; + } } if(stdsize){ - element=document.createElement("span"); + console.log(build); + build=build.replaceAll("\n",""); + console.log(build,JSON.stringify(build)); } - if(keep){ - element.append(keepys); - } - element.appendChild(markdown(build,{keep:keep,stdsize:stdsize})); - span.append(element); - i--; - continue; - } - if(first){ - i++; - } - } - if(txt[i]==="\n"){ - - if(!stdsize){ - appendcurrent(); - span.append(document.createElement("br")); - } - continue; - } - if(txt[i]==="`"){ - let count=1; - if(txt[i+1]==="`"){ - count++; - if(txt[i+2]==="`"){ - count++; - } - } - let build=""; - if(keep){ - build+="`".repeat(count); - } - let find=0; - let j=i+count; - let init=true; - for(;txt[j]!==undefined&&(txt[j]!=="\n"||count===3)&&find!==count;j++){ - if(txt[j]==="`"){ - find++; - }else{ - if(find!==0){ - build+="`".repeat(find); - find=0; - } - if(init&&count===3){ - if(txt[j]===" "||txt[j]==="\n"){ - init=false; - } - if(keep){ - build+=txt[j]; - } - continue; - } - build+=txt[j]; - } - } - if(stdsize){ - console.log(build); - build=build.replaceAll("\n",""); - console.log(build,JSON.stringify(build)); - } - if(find===count){ - appendcurrent(); - i=j; - if(keep){ - build+="`".repeat(find); - } - if(count!==3&&!stdsize){ - const samp=document.createElement("samp"); - samp.textContent=build; - span.appendChild(samp); - }else{ - const pre=document.createElement("pre"); - if(build[build.length-1]==="\n"){ - build=build.substring(0,build.length-1); - } - if(txt[i]==="\n"){ - i++ - } - pre.textContent=build; - span.appendChild(pre); - } - i--; - continue; - } - } - - if(txt[i]==="*"){ - let count=1; - if(txt[i+1]==="*"){ - count++; - if(txt[i+2]==="*"){ - count++; - } - } - let build=[]; - let find=0; - let j=i+count; - for(;txt[j]!==undefined&&find!==count;j++){ - - if(txt[j]==="*"){ - find++; - }else{ - build.push(txt[j]); - if(find!==0){ - build=build.concat(new Array(find).fill("*")); - find=0; - } - } - } - if(find===count&&(count!=1||txt[i+1]!==" ")){ - appendcurrent(); - i=j; - - const stars="*".repeat(count); - if(count===1){ - const i=document.createElement("i"); - if(keep){i.append(stars)} - i.appendChild(markdown(build,{keep:keep,stdsize:stdsize})); - if(keep){i.append(stars)} - span.appendChild(i); - }else if(count===2){ - const b=document.createElement("b"); - if(keep){b.append(stars)} - b.appendChild(markdown(build,{keep:keep,stdsize:stdsize})); - if(keep){b.append(stars)} - span.appendChild(b); - }else{ - const b=document.createElement("b"); - const i=document.createElement("i"); - if(keep){b.append(stars)} - b.appendChild(markdown(build,{keep:keep,stdsize:stdsize})); - if(keep){b.append(stars)} - i.appendChild(b); - span.appendChild(i); - } - i-- - continue; - } - } - - if(txt[i]==="_"){ - let count=1; - if(txt[i+1]==="_"){ - count++; - if(txt[i+2]==="_"){ - count++; - } - } - let build=[]; - let find=0; - let j=i+count; - for(;txt[j]!==undefined&&find!==count;j++){ - - if(txt[j]==="_"){ - find++; - }else{ - build.push(txt[j]); - if(find!==0){ - build=build.concat(new Array(find).fill("_")); - find=0; - } - } - } - if(find===count&&(count!=1||(txt[j+1]===" "||txt[j+1]==="\n"||txt[j+1]===undefined))){ - appendcurrent(); - i=j; - const underscores="_".repeat(count); - if(count===1){ - const i=document.createElement("i"); - if(keep){i.append(underscores)} - i.appendChild(markdown(build,{keep:keep,stdsize:stdsize})); - if(keep){i.append(underscores)} - span.appendChild(i); - }else if(count===2){ - const u=document.createElement("u"); - if(keep){u.append(underscores)} - u.appendChild(markdown(build,{keep:keep,stdsize:stdsize})); - if(keep){u.append(underscores)} - span.appendChild(u); - }else{ - const u=document.createElement("u"); - const i=document.createElement("i"); - if(keep){i.append(underscores)} - i.appendChild(markdown(build,{keep:keep,stdsize:stdsize})); - if(keep){i.append(underscores)} - u.appendChild(i) - span.appendChild(u); - } - i--; - continue; - } - } - - if(txt[i]==="~"&&txt[i+1]==="~"){ - let count=2; - let build=[]; - let find=0; - let j=i+2; - for(;txt[j]!==undefined&&find!==count;j++){ - if(txt[j]==="~"){ - find++; - }else{ - build.push(txt[j]); - if(find!==0){ - build=build.concat(new Array(find).fill("~")); - find=0; - } - } - } - if(find===count){ - appendcurrent(); - i=j; - const tildes="~~"; - if(count===2){ - const s=document.createElement("s"); - if(keep){s.append(tildes)} - s.appendChild(markdown(build,{keep:keep,stdsize:stdsize})); - if(keep){s.append(tildes)} - span.appendChild(s); - } - continue; - } - } - if(txt[i]==="|"&&txt[i+1]==="|"){ - let count=2; - let build=[]; - let find=0; - let j=i+2; - for(;txt[j]!==undefined&&find!==count;j++){ - if(txt[j]==="|"){ - find++; - }else{ - build.push(txt[j]); - if(find!==0){ - build=build.concat(new Array(find).fill("~")); - find=0; - } - } - } - if(find===count){ - appendcurrent(); - i=j; - const pipes="||"; - if(count===2){ - const j=document.createElement("j"); - if(keep){j.append(pipes)} - j.appendChild(markdown(build,{keep:keep,stdsize:stdsize})); - j.classList.add("spoiler"); - j.onclick=markdown.unspoil; - if(keep){j.append(pipes)} - span.appendChild(j); - } - continue; - } - } - - if (txt[i]==="<" && txt[i + 1]==="t" && txt[i + 2]===":") { - let found=false; - const build=["<","t",":"]; - let j = i+3; - for (; txt[j] !== void 0; j++) { - build.push(txt[j]); - - if (txt[j]===">") { - found=true; - break; - } - } - - if (found) { - appendcurrent(); - i=j; - - const parts=build.join("").match(/^$/); - const dateInput=new Date(Number.parseInt(parts[1]) * 1000); - let time=""; - if (Number.isNaN(dateInput.getTime())) time=build.join(""); - else { - if (parts[3]==="d") time=dateInput.toLocaleString(void 0, {day: "2-digit", month: "2-digit", year: "numeric"}); - else if (parts[3]==="D") time=dateInput.toLocaleString(void 0, {day: "numeric", month: "long", year: "numeric"}); - else if (!parts[3] || parts[3]==="f") time=dateInput.toLocaleString(void 0, {day: "numeric", month: "long", year: "numeric"}) + " " + - dateInput.toLocaleString(void 0, {hour: "2-digit", minute: "2-digit"}); - else if (parts[3]==="F") time=dateInput.toLocaleString(void 0, {day: "numeric", month: "long", year: "numeric", weekday: "long"}) + " " + - dateInput.toLocaleString(void 0, {hour: "2-digit", minute: "2-digit"}); - else if (parts[3]==="t") time=dateInput.toLocaleString(void 0, {hour: "2-digit", minute: "2-digit"}); - else if (parts[3]==="T") time=dateInput.toLocaleString(void 0, {hour: "2-digit", minute: "2-digit", second: "2-digit"}); - else if (parts[3]==="R") time=Math.round((Date.now() - (Number.parseInt(parts[1]) * 1000))/1000/60) + " minutes ago"; - } - - const timeElem=document.createElement("span"); - timeElem.classList.add("markdown-timestamp"); - timeElem.textContent=time; - span.appendChild(timeElem); - continue; - } - } - - if (txt[i] === "<" && (txt[i + 1] === ":" || (txt[i + 1] === "a" && txt[i + 2] === ":"))) { - let found=false; - const build = txt[i + 1] === "a" ? ["<","a",":"] : ["<",":"]; - let j = i+build.length; - for (; txt[j] !== void 0; j++) { - build.push(txt[j]); - - if (txt[j]===">") { - found=true; - break; - } - } - - if (found) { - const parts=build.join("").match(/^<(a)?:\w+:(\d{10,30})>$/); - if (parts && parts[2]) { + if(find===count){ appendcurrent(); i=j; - console.log(typeof txt,txt); - const isEmojiOnly = txt.join("").trim()===build.join("").trim(); - - const emojiElem=document.createElement("img"); - emojiElem.classList.add("md-emoji"); - emojiElem.width=isEmojiOnly ? 48 : 22; - emojiElem.height=isEmojiOnly ? 48 : 22; - emojiElem.crossOrigin="anonymous"; - //emojiElem.src=this.info.cdn.toString() + "/emojis/" + parts[2] + "." + (parts[1] ? "gif" : "png") + "?size=32"; - //must uncomment later - emojiElem.alt=""; - emojiElem.loading="lazy"; - span.appendChild(emojiElem); - + if(keep){ + build+="`".repeat(find); + } + if(count!==3&&!stdsize){ + const samp=document.createElement("samp"); + samp.textContent=build; + span.appendChild(samp); + }else{ + const pre=document.createElement("pre"); + if(build[build.length-1]==="\n"){ + build=build.substring(0,build.length-1); + } + if(txt[i]==="\n"){ + i++ + } + pre.textContent=build; + span.appendChild(pre); + } + i--; continue; } } + + if(txt[i]==="*"){ + let count=1; + if(txt[i+1]==="*"){ + count++; + if(txt[i+2]==="*"){ + count++; + } + } + let build=[]; + let find=0; + let j=i+count; + for(;txt[j]!==undefined&&find!==count;j++){ + + if(txt[j]==="*"){ + find++; + }else{ + build.push(txt[j]); + if(find!==0){ + build=build.concat(new Array(find).fill("*")); + find=0; + } + } + } + if(find===count&&(count!=1||txt[i+1]!==" ")){ + appendcurrent(); + i=j; + + const stars="*".repeat(count); + if(count===1){ + const i=document.createElement("i"); + if(keep){i.append(stars)} + i.appendChild(this.markdown(build,{keep:keep,stdsize:stdsize})); + if(keep){i.append(stars)} + span.appendChild(i); + }else if(count===2){ + const b=document.createElement("b"); + if(keep){b.append(stars)} + b.appendChild(this.markdown(build,{keep:keep,stdsize:stdsize})); + if(keep){b.append(stars)} + span.appendChild(b); + }else{ + const b=document.createElement("b"); + const i=document.createElement("i"); + if(keep){b.append(stars)} + b.appendChild(this.markdown(build,{keep:keep,stdsize:stdsize})); + if(keep){b.append(stars)} + i.appendChild(b); + span.appendChild(i); + } + i-- + continue; + } + } + + if(txt[i]==="_"){ + let count=1; + if(txt[i+1]==="_"){ + count++; + if(txt[i+2]==="_"){ + count++; + } + } + let build=[]; + let find=0; + let j=i+count; + for(;txt[j]!==undefined&&find!==count;j++){ + + if(txt[j]==="_"){ + find++; + }else{ + build.push(txt[j]); + if(find!==0){ + build=build.concat(new Array(find).fill("_")); + find=0; + } + } + } + if(find===count&&(count!=1||(txt[j+1]===" "||txt[j+1]==="\n"||txt[j+1]===undefined))){ + appendcurrent(); + i=j; + const underscores="_".repeat(count); + if(count===1){ + const i=document.createElement("i"); + if(keep){i.append(underscores)} + i.appendChild(this.markdown(build,{keep:keep,stdsize:stdsize})); + if(keep){i.append(underscores)} + span.appendChild(i); + }else if(count===2){ + const u=document.createElement("u"); + if(keep){u.append(underscores)} + u.appendChild(this.markdown(build,{keep:keep,stdsize:stdsize})); + if(keep){u.append(underscores)} + span.appendChild(u); + }else{ + const u=document.createElement("u"); + const i=document.createElement("i"); + if(keep){i.append(underscores)} + i.appendChild(this.markdown(build,{keep:keep,stdsize:stdsize})); + if(keep){i.append(underscores)} + u.appendChild(i) + span.appendChild(u); + } + i--; + continue; + } + } + + if(txt[i]==="~"&&txt[i+1]==="~"){ + let count=2; + let build=[]; + let find=0; + let j=i+2; + for(;txt[j]!==undefined&&find!==count;j++){ + if(txt[j]==="~"){ + find++; + }else{ + build.push(txt[j]); + if(find!==0){ + build=build.concat(new Array(find).fill("~")); + find=0; + } + } + } + if(find===count){ + appendcurrent(); + i=j; + const tildes="~~"; + if(count===2){ + const s=document.createElement("s"); + if(keep){s.append(tildes)} + s.appendChild(this.markdown(build,{keep:keep,stdsize:stdsize})); + if(keep){s.append(tildes)} + span.appendChild(s); + } + continue; + } + } + if(txt[i]==="|"&&txt[i+1]==="|"){ + let count=2; + let build=[]; + let find=0; + let j=i+2; + for(;txt[j]!==undefined&&find!==count;j++){ + if(txt[j]==="|"){ + find++; + }else{ + build.push(txt[j]); + if(find!==0){ + build=build.concat(new Array(find).fill("~")); + find=0; + } + } + } + if(find===count){ + appendcurrent(); + i=j; + const pipes="||"; + if(count===2){ + const j=document.createElement("j"); + if(keep){j.append(pipes)} + j.appendChild(this.markdown(build,{keep:keep,stdsize:stdsize})); + j.classList.add("spoiler"); + j.onclick=MarkDown.unspoil; + if(keep){j.append(pipes)} + span.appendChild(j); + } + continue; + } + } + + if (txt[i]==="<" && txt[i + 1]==="t" && txt[i + 2]===":") { + let found=false; + const build=["<","t",":"]; + let j = i+3; + for (; txt[j] !== void 0; j++) { + build.push(txt[j]); + + if (txt[j]===">") { + found=true; + break; + } + } + + if (found) { + appendcurrent(); + i=j; + + const parts=build.join("").match(/^$/); + const dateInput=new Date(Number.parseInt(parts[1]) * 1000); + let time=""; + if (Number.isNaN(dateInput.getTime())) time=build.join(""); + else { + if (parts[3]==="d") time=dateInput.toLocaleString(void 0, {day: "2-digit", month: "2-digit", year: "numeric"}); + else if (parts[3]==="D") time=dateInput.toLocaleString(void 0, {day: "numeric", month: "long", year: "numeric"}); + else if (!parts[3] || parts[3]==="f") time=dateInput.toLocaleString(void 0, {day: "numeric", month: "long", year: "numeric"}) + " " + + dateInput.toLocaleString(void 0, {hour: "2-digit", minute: "2-digit"}); + else if (parts[3]==="F") time=dateInput.toLocaleString(void 0, {day: "numeric", month: "long", year: "numeric", weekday: "long"}) + " " + + dateInput.toLocaleString(void 0, {hour: "2-digit", minute: "2-digit"}); + else if (parts[3]==="t") time=dateInput.toLocaleString(void 0, {hour: "2-digit", minute: "2-digit"}); + else if (parts[3]==="T") time=dateInput.toLocaleString(void 0, {hour: "2-digit", minute: "2-digit", second: "2-digit"}); + else if (parts[3]==="R") time=Math.round((Date.now() - (Number.parseInt(parts[1]) * 1000))/1000/60) + " minutes ago"; + } + + const timeElem=document.createElement("span"); + timeElem.classList.add("markdown-timestamp"); + timeElem.textContent=time; + span.appendChild(timeElem); + continue; + } + } + + if (txt[i] === "<" && (txt[i + 1] === ":" || (txt[i + 1] === "a" && txt[i + 2] === ":"))) { + let found=false; + const build = txt[i + 1] === "a" ? ["<","a",":"] : ["<",":"]; + let j = i+build.length; + for (; txt[j] !== void 0; j++) { + build.push(txt[j]); + + if (txt[j]===">") { + found=true; + break; + } + } + + if (found) { + const buildjoin=build.join(""); + const parts=buildjoin.match(/^<(a)?:\w+:(\d{10,30})>$/); + if (parts && parts[2]) { + appendcurrent(); + i=j; + console.log(typeof txt,txt); + const isEmojiOnly = txt.join("").trim()===buildjoin.trim(); + console.log(isEmojiOnly,":3"); + + const emojiElem=document.createElement("img"); + emojiElem.classList.add("md-emoji"); + emojiElem.classList.add(isEmojiOnly ? "bigemoji" : "smallemoji"); + emojiElem.crossOrigin="anonymous"; + emojiElem.src=this.info.cdn.toString() + "emojis/" + parts[2] + "." + (parts[1] ? "gif" : "png") + "?size=32"; + + emojiElem.alt=buildjoin; + emojiElem.loading="lazy"; + span.appendChild(emojiElem); + + continue; + } + } + } + + current.textContent+=txt[i]; } - - current.textContent+=txt[i]; + appendcurrent(); + return span; + } + static unspoil(e:any) : void{ + e.target.classList.remove("spoiler") + e.target.classList.add("unspoiled") } - appendcurrent(); - return span; -} -markdown.unspoil=function(e:any) : void{ - //console.log("undone") - e.target.classList.remove("spoiler") - e.target.classList.add("unspoiled") } diff --git a/webpage/message.ts b/webpage/message.ts index 91eb35b..a16ac7b 100644 --- a/webpage/message.ts +++ b/webpage/message.ts @@ -1,7 +1,7 @@ import {Contextmenu} from "./contextmenu.js"; import {User} from "./user.js"; import {Member} from "./member.js"; -import {markdown} from "./markdown.js"; +import {MarkDown} from "./markdown.js"; import {Embed} from "./embed.js"; import { Channel } from "./channel.js"; import {Localuser} from "./localuser.js"; @@ -21,7 +21,7 @@ class Message{ message_reference; type:number; timestamp:number; - content:string; + content:MarkDown; static del:Promise; static resolve:Function; div:HTMLDivElement; @@ -37,7 +37,7 @@ class Message{ } static setupcmenu(){ Message.contextmenu.addbutton("Copy raw text",function(){ - navigator.clipboard.writeText(this.content); + navigator.clipboard.writeText(this.content.rawString); }); Message.contextmenu.addbutton("Reply",function(this:Message,div:HTMLDivElement){ this.channel.setReplying(this); @@ -67,6 +67,9 @@ class Message{ this.attachments.push(new File(thing,this)); } continue; + }else if(thing==="content"){ + this.content=new MarkDown(messagejson[thing],this.channel); + continue; } this[thing]=messagejson[thing]; } @@ -210,7 +213,7 @@ class Message{ replyline.classList.add("replyflex") this.channel.getmessage(this.message_reference.message_id).then(message=>{ const author=message.author; - reply.appendChild(markdown(message.content,{stdsize:true})); + reply.appendChild(message.content.makeHTML({stdsize:true})); minipfp.src=author.getpfpsrc() author.bind(minipfp); username.textContent=author.username; @@ -271,7 +274,7 @@ class Message{ }else{ div.classList.remove("topMessage"); } - const messaged=markdown(this.content); + const messaged=this.content.makeHTML(); div["txt"]=messaged; const messagedwrap=document.createElement("div"); messagedwrap.classList.add("flexttb") diff --git a/webpage/style.css b/webpage/style.css index 6f5fc92..31d8555 100644 --- a/webpage/style.css +++ b/webpage/style.css @@ -1359,3 +1359,11 @@ span { .sizeupdown{ height:4in; } +.bigemoji{ + width:48px; + height:48px; +} +.smallemoji{ + width:22px; + height:22px; +} \ No newline at end of file diff --git a/webpage/user.ts b/webpage/user.ts index dadf121..d62433b 100644 --- a/webpage/user.ts +++ b/webpage/user.ts @@ -1,6 +1,6 @@ //const usercache={}; import {Member} from "./member.js"; -import {markdown} from "./markdown.js"; +import {MarkDown} from "./markdown.js"; import {Contextmenu} from "./contextmenu.js"; import {Localuser} from "./localuser.js"; import {Guild} from "./guild.js"; @@ -12,7 +12,7 @@ class User{ id:string; avatar:string; username:string; - bio:string; + bio:MarkDown; discriminator:string; pronouns:string; bot:boolean; @@ -49,6 +49,10 @@ class User{ if(!owner){console.error("missing localuser")} if(dontclone){ for(const thing of Object.keys(userjson)){ + if(thing==="bio"){ + this.bio=new MarkDown(userjson[thing],this.localuser); + continue; + } this[thing]=userjson[thing]; } this.hypotheticalpfp=false; @@ -152,7 +156,7 @@ class User{ const rule=document.createElement("hr"); userbody.appendChild(rule); - const biohtml=markdown(this.bio); + const biohtml=this.bio.makeHTML(); userbody.appendChild(biohtml); } console.log(div);