mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2025-12-08 06:25:37 -05:00
cleanup markdown better, don't process code block content
This commit is contained in:
@@ -3,9 +3,36 @@
|
|||||||
function markdownToHtml(text) {
|
function markdownToHtml(text) {
|
||||||
if (!text) return "";
|
if (!text) return "";
|
||||||
|
|
||||||
let html = text;
|
// Store code blocks and inline code to protect them from further processing
|
||||||
|
const codeBlocks = [];
|
||||||
|
const inlineCode = [];
|
||||||
|
let blockIndex = 0;
|
||||||
|
let inlineIndex = 0;
|
||||||
|
|
||||||
// Escape HTML entities first
|
// 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, '<')
|
||||||
|
.replace(/>/g, '>');
|
||||||
|
codeBlocks.push(`<pre><code>${escapedCode}</code></pre>`);
|
||||||
|
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, '<')
|
||||||
|
.replace(/>/g, '>');
|
||||||
|
inlineCode.push(`<code>${escapedCode}</code>`);
|
||||||
|
return `\x00INLINECODE${inlineIndex++}\x00`;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Now process everything else
|
||||||
|
// Escape HTML entities (but not in code blocks)
|
||||||
html = html.replace(/&/g, '&')
|
html = html.replace(/&/g, '&')
|
||||||
.replace(/</g, '<')
|
.replace(/</g, '<')
|
||||||
.replace(/>/g, '>');
|
.replace(/>/g, '>');
|
||||||
@@ -15,7 +42,7 @@ function markdownToHtml(text) {
|
|||||||
html = html.replace(/^## (.*?)$/gm, '<h2>$1</h2>');
|
html = html.replace(/^## (.*?)$/gm, '<h2>$1</h2>');
|
||||||
html = html.replace(/^# (.*?)$/gm, '<h1>$1</h1>');
|
html = html.replace(/^# (.*?)$/gm, '<h1>$1</h1>');
|
||||||
|
|
||||||
// Bold and italic
|
// Bold and italic (order matters!)
|
||||||
html = html.replace(/\*\*\*(.*?)\*\*\*/g, '<b><i>$1</i></b>');
|
html = html.replace(/\*\*\*(.*?)\*\*\*/g, '<b><i>$1</i></b>');
|
||||||
html = html.replace(/\*\*(.*?)\*\*/g, '<b>$1</b>');
|
html = html.replace(/\*\*(.*?)\*\*/g, '<b>$1</b>');
|
||||||
html = html.replace(/\*(.*?)\*/g, '<i>$1</i>');
|
html = html.replace(/\*(.*?)\*/g, '<i>$1</i>');
|
||||||
@@ -23,10 +50,6 @@ function markdownToHtml(text) {
|
|||||||
html = html.replace(/__(.*?)__/g, '<b>$1</b>');
|
html = html.replace(/__(.*?)__/g, '<b>$1</b>');
|
||||||
html = html.replace(/_(.*?)_/g, '<i>$1</i>');
|
html = html.replace(/_(.*?)_/g, '<i>$1</i>');
|
||||||
|
|
||||||
// Code blocks
|
|
||||||
html = html.replace(/```([\s\S]*?)```/g, '<pre><code>$1</code></pre>');
|
|
||||||
html = html.replace(/`(.*?)`/g, '<code>$1</code>');
|
|
||||||
|
|
||||||
// Links
|
// Links
|
||||||
html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
|
html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
|
||||||
|
|
||||||
@@ -43,8 +66,16 @@ function markdownToHtml(text) {
|
|||||||
// Detect plain URLs and wrap them in anchor tags (but not inside existing <a> or markdown links)
|
// Detect plain URLs and wrap them in anchor tags (but not inside existing <a> or markdown links)
|
||||||
html = html.replace(/(^|[^"'>])((https?|file):\/\/[^\s<]+)/g, '$1<a href="$2">$2</a>');
|
html = html.replace(/(^|[^"'>])((https?|file):\/\/[^\s<]+)/g, '$1<a href="$2">$2</a>');
|
||||||
|
|
||||||
|
// Restore code blocks and inline code BEFORE line break processing
|
||||||
|
html = html.replace(/\x00CODEBLOCK(\d+)\x00/g, (match, index) => {
|
||||||
|
return codeBlocks[parseInt(index)];
|
||||||
|
});
|
||||||
|
|
||||||
// Line breaks
|
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, '</p><p>');
|
html = html.replace(/\n\n/g, '</p><p>');
|
||||||
html = html.replace(/\n/g, '<br/>');
|
html = html.replace(/\n/g, '<br/>');
|
||||||
|
|
||||||
@@ -53,5 +84,22 @@ function markdownToHtml(text) {
|
|||||||
html = '<p>' + html + '</p>';
|
html = '<p>' + html + '</p>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clean up the final HTML
|
||||||
|
// Remove <br/> tags immediately before block elements
|
||||||
|
html = html.replace(/<br\/>\s*<pre>/g, '<pre>');
|
||||||
|
html = html.replace(/<br\/>\s*<ul>/g, '<ul>');
|
||||||
|
html = html.replace(/<br\/>\s*<h[1-6]>/g, '<h$1>');
|
||||||
|
|
||||||
|
// Remove empty paragraphs
|
||||||
|
html = html.replace(/<p>\s*<\/p>/g, '');
|
||||||
|
html = html.replace(/<p>\s*<br\/>\s*<\/p>/g, '');
|
||||||
|
|
||||||
|
// Remove excessive line breaks
|
||||||
|
html = html.replace(/(<br\/>){3,}/g, '<br/><br/>'); // Max 2 consecutive line breaks
|
||||||
|
html = html.replace(/(<\/p>)\s*(<p>)/g, '$1$2'); // Remove whitespace between paragraphs
|
||||||
|
|
||||||
|
// Remove leading/trailing whitespace
|
||||||
|
html = html.trim();
|
||||||
|
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user