From 3462bcc46ecf74f576ea4397f16492c16bd75b10 Mon Sep 17 00:00:00 2001
From: Nippy
`);
+ 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}${escapedCode}`);
+ return `\x00INLINECODE${inlineIndex++}\x00`;
+ });
+
+ // Extract plain URLs before escaping so & in query strings is preserved
+ const urls = [];
+ let urlIndex = 0;
+ html = html.replace(/(^|[\s])((?:https?|file):\/\/[^\s]+)/gm, (match, prefix, url) => {
+ urls.push(url);
+ return prefix + `\x00URL${urlIndex++}\x00`;
+ });
+
+ // Escape HTML entities (but not in code blocks or URLs)
+ html = html.replace(/&/g, '&')
+ .replace(//g, '>');
+
+ // Headers
+ html = html.replace(/^### (.*?)$/gm, '$1
');
+ html = html.replace(/^## (.*?)$/gm, '$1
');
+ html = html.replace(/^# (.*?)$/gm, '$1
');
+
+ // Bold and italic (order matters!)
+ html = html.replace(/\*\*\*(.*?)\*\*\*/g, '$1');
+ html = html.replace(/\*\*(.*?)\*\*/g, '$1');
+ html = html.replace(/\*(.*?)\*/g, '$1');
+ html = html.replace(/___(.*?)___/g, '$1');
+ html = html.replace(/__(.*?)__/g, '$1');
+ html = html.replace(/_(.*?)_/g, '$1');
+
+ // Links
+ html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1');
+
+ // Lists
+ html = html.replace(/^\* (.*?)$/gm, '' + match + '
';
+ });
+
+ // Restore extracted URLs as anchor tags (preserves raw & in href)
+ html = html.replace(/\x00URL(\d+)\x00/g, (_, index) => {
+ const url = urls[parseInt(index)];
+ const display = url.replace(/&/g, '&').replace(//g, '>');
+ return `${display}`;
+ });
+
+ // Restore code blocks and inline code BEFORE line break processing
+ html = html.replace(/\x00CODEBLOCK(\d+)\x00/g, (match, index) => {
+ return codeBlocks[parseInt(index)];
+ });
+
+ html = html.replace(/\x00INLINECODE(\d+)\x00/g, (match, index) => {
+ return inlineCode[parseInt(index)];
+ });
+
+ // Line breaks (after code blocks are restored)
+ html = html.replace(/\n\n/g, '
');
+ 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; +} -- cgit v1.3