/**
* Markdown & Branded HTML Formatting Utilities for PostFundManagement (PFM)
*/
export const PFM_BRAND_LOGO_SVG = ``;
export const PFM_LOGO_DATA_URI = `data:image/svg+xml;utf8,${encodeURIComponent(PFM_BRAND_LOGO_SVG)}`;
export interface MarkdownRenderOptions {
applyBranding?: boolean;
emailFormat?: boolean;
subject?: string;
tenantName?: string;
}
/**
* Checks if the content string is formatted HTML or Markdown.
*/
export function isHtmlContent(content: string): boolean {
if (!content) return false;
const trimmed = content.trim();
return (
trimmed.startsWith('')) ||
/<(strong|b|em|i|u|h[1-6]|ul|ol|li|table|blockquote|div|p|img|hr|br)\b/i.test(trimmed)
);
}
/**
* Extracts raw plain text from markdown or HTML for concise notification snippets.
*/
export function stripMarkdown(text: string): string {
if (!text) return '';
return text
.replace(/<[^>]*>/g, ' ') // Strip HTML tags
.replace(/!\[.*?\]\(.*?\)/g, '') // Strip images
.replace(/\[(.*?)\]\(.*?\)/g, '$1') // Extract link text
.replace(/#{1,6}\s+/g, '') // Strip headers
.replace(/(\*\*|__)(.*?)\1/g, '$2') // Strip bold
.replace(/(\*|_)(.*?)\1/g, '$2') // Strip italic
.replace(/~~(.*?)~~/g, '$1') // Strip strikethrough
.replace(/`{1,3}.*?`{1,3}/gs, '') // Strip code blocks
.replace(/^>\s+/gm, '') // Strip blockquotes
.replace(/^[-*+]\s+/gm, '') // Strip list markers
.replace(/^\d+\.\s+/gm, '') // Strip ordered list markers
.replace(/\|/g, ' ') // Replace table pipes
.replace(/\s+/g, ' ')
.trim();
}
/**
* Parses markdown text into semantic HTML.
*/
export function parseMarkdownToHtml(markdown: string): string {
if (!markdown) return '';
let html = markdown
// Sanitize script tags
.replace(/