.pragma library // This exists only beacause I haven't been able to get linkColor to work with MarkdownText // May not be necessary if that's possible tbh. function markdownToHtml(text) { if (!text) return ""; // Store code blocks and inline code to protect them from further processing const codeBlocks = []; const inlineCode = []; let blockIndex = 0; let inlineIndex = 0; // First, extract and replace code blocks with placeholders let html = text.replace(/```([\s\S]*?)```/g, (match, code) => { // Trim leading and trailing blank lines only const trimmedCode = code.replace(/^\n+|\n+$/g, ''); // Escape HTML entities in code const escapedCode = trimmedCode.replace(/&/g, '&') .replace(//g, '>'); codeBlocks.push(`
${escapedCode}`);
return `\x00CODEBLOCK${blockIndex++}\x00`;
});
// Extract and replace inline code
html = html.replace(/`([^`]+)`/g, (match, code) => {
// Escape HTML entities in code
const escapedCode = code.replace(/&/g, '&')
.replace(//g, '>');
inlineCode.push(`${escapedCode}`);
return `\x00INLINECODE${inlineIndex++}\x00`;
});
// Now process everything else
// Escape HTML entities (but not in code blocks)
html = html.replace(/&/g, '&')
.replace(//g, '>');
// Headers
html = html.replace(/^### (.*?)$/gm, '');
html = html.replace(/\n/g, '
');
// Wrap in paragraph tags if not already wrapped
if (!html.startsWith('<')) {
html = '
' + html + '
'; } // Clean up the final HTML // Remove/g, '');
html = html.replace(/
\s*\s*<\/p>/g, ''); html = html.replace(/
\s*
\s*<\/p>/g, '');
// Remove excessive line breaks
html = html.replace(/(
){3,}/g, '
'); // Max 2 consecutive line breaks
html = html.replace(/(<\/p>)\s*(
)/g, '$1$2'); // Remove whitespace between paragraphs // Remove leading/trailing whitespace html = html.trim(); return html; }