feat: implement HTML escaping in message formatting

This commit is contained in:
Kyle Fang
2025-07-30 18:34:05 +08:00
parent d42f708e6c
commit 28af4dec97

View File

@@ -8,21 +8,41 @@ export type RichMessage = {
notify?: boolean;
};
// https://www.30secondsofcode.org/js/s/escape-unescape-html/
const escapeHTML = (str: string) =>
str.replace(
/[&<>'"]/g,
(tag: string) =>
({
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
"'": '&#39;',
'"': '&quot;'
}[tag] || tag)
);
const html = (strings: TemplateStringsArray, ...values: string[]) => {
return strings.map((string, index) => {
return string + escapeHTML(values[index] ?? "");
}).join("");
};
export function formatRichMessage(message: RichMessage): string {
const metadata = Object.entries(message.metadata ?? {})
.map(([key, value]) => `#${key}: ${value}`)
.map(([key, value]) => html`#${key}: ${value}`)
.join("\n");
return `${message.emoji ? `${message.emoji}` : ""}${
return html`${message.emoji ? `${message.emoji}` : ""}${
message.channel
? `<ins>#${message.channel}</ins>
? html`<ins>#${message.channel}</ins>
`
: ""
}<b>${message.event}</b>${
(message.text ?? message.message)
? `
? html`
<code>${message.text ?? message.message}</code>`
<code>${message.text ?? message.message ?? ""}</code>`
: ""
}