From 70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69 Mon Sep 17 00:00:00 2001
From: AlexanderCurl
`);
- 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