// SPDX-License-Identifier: AGPL-3.0-or-later import {decode} from 'html-entities'; export function decodeHTMLEntities(html?: string | null): string { if (!html) return ''; return decode(html); } export function stripHtmlTags(html?: string | null): string { if (!html) return ''; return html.replace(/<[^>]*>/g, ''); } export function htmlToMarkdown(html?: string | null): string { if (!html) return ''; let md = html .replace(/
/gi, '\n\n')
.replace(/<\/p>/gi, '')
.replace(/
/gi, '\n')
.replace(/|
/gi, '\n')
.replace(/<\/ul>|<\/ol>/gi, '\n')
.replace(/
([\s\S]*?)<\/code><\/pre>/gi, (_, code) => `\`\`\`\n${code}\n\`\`\``)
.replace(/([\s\S]*?)<\/code>/gi, '`$1`')
.replace(/([\s\S]*?)<\/strong>/gi, '**$1**')
.replace(/([\s\S]*?)<\/b>/gi, '**$1**')
.replace(/([\s\S]*?)<\/em>/gi, '_$1_')
.replace(/([\s\S]*?)<\/i>/gi, '_$1_')
.replace(/]*?\s+)?href="([^"]*)"[^>]*>([\s\S]*?)<\/a>/gi, '[$2]($1)');
md = stripHtmlTags(md);
md = decodeHTMLEntities(md);
return md
.replace(/\n{3,}/g, '\n\n')
.replace(/\s+$/, '')
.trim();
}