fix(telegram): render HTML with markdown-it and strip HTML from Discord bodies

This commit is contained in:
RhenCloud 2026-08-18 18:29:17 +08:00
parent ea049e28c9
commit 9899cd01bf
No known key found for this signature in database
GPG key ID: A574A617378C4E0B
7 changed files with 90 additions and 18 deletions

View file

@ -1,3 +1,4 @@
import MarkdownIt from "markdown-it";
import type { NeutralMessage } from "../../types";
import { splitMessageTitle } from "../../formatters/helpers";
@ -12,17 +13,15 @@ function esc(s: string): string {
.replace(/"/g, """);
}
const md = new MarkdownIt({ html: false, linkify: false, breaks: false, typographer: false });
md.disable(["image", "autolink"]);
md.renderer.rules.strong_open = (): string => "<b>";
md.renderer.rules.strong_close = (): string => "</b>";
md.renderer.rules.em_open = (): string => "<i>";
md.renderer.rules.em_close = (): string => "</i>";
function mdToHtml(s: string): string {
let out = esc(s);
out = out.replace(
/\[([^\]]+)\]\(([^)]+)\)/g,
(_m, label, url) => `<a href="${esc(url)}">${label}</a>`,
);
out = out.replace(/\*\*([^*]+)\*\*/g, "<b>$1</b>");
out = out.replace(/`([^`]+)`/g, "<code>$1</code>");
out = out.replace(/(^|[^*])\*([^*]+)\*/g, "$1<i>$2</i>");
out = out.replace(/~~([^~]+)~~/g, "<s>$1</s>");
return out;
return md.renderInline(s);
}
function formatTimestamp(ts?: string): string {

View file

@ -1,6 +1,6 @@
import type { NeutralMessage, NeutralAuthor } from "../types";
import { GITHUB_COLORS } from "./colors";
import { cap, emojiPrefix, MAX_FIELD_VALUE, type T, buildMessage } from "./helpers";
import { cap, emojiPrefix, htmlToText, MAX_FIELD_VALUE, type T, buildMessage } from "./helpers";
export function formatIssues(
payload: Record<string, unknown>,
@ -38,7 +38,7 @@ export function formatIssues(
descriptionParts.push(t("events.issues.action_issue", { emoji: em(stateEmoji), action: al }));
if (issue.body) {
const truncated = issue.body.slice(0, 300);
const truncated = htmlToText(issue.body).slice(0, 300);
descriptionParts.push(`\n${truncated}${issue.body.length > 300 ? "..." : ""}`);
}

View file

@ -4,6 +4,7 @@ import {
branchLink,
cap,
emojiPrefix,
htmlToText,
MAX_FIELD_VALUE,
type T,
buildMessage,
@ -58,7 +59,7 @@ export function formatPullRequest(
descriptionParts.push(t("events.pr.action_pr", { emoji: em(stateEmoji), action: al }));
if (pr.body) {
const truncated = pr.body.slice(0, 300);
const truncated = htmlToText(pr.body).slice(0, 300);
descriptionParts.push(`\n${truncated}${pr.body.length > 300 ? "..." : ""}`);
}