From 4bee36ed4a09b026d9c1a836e4568da85b67718e Mon Sep 17 00:00:00 2001 From: Yanlong Wang Date: Thu, 9 May 2024 11:06:20 +0800 Subject: [PATCH] fix: patch tidyMarkdown --- backend/functions/src/utils/markdown.ts | 58 ++++++++++++------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/backend/functions/src/utils/markdown.ts b/backend/functions/src/utils/markdown.ts index f8def89..02638ff 100644 --- a/backend/functions/src/utils/markdown.ts +++ b/backend/functions/src/utils/markdown.ts @@ -1,39 +1,37 @@ - export function tidyMarkdown(markdown: string): string { + const lines = markdown.split('\n'); + const processedLines = lines.map((line) => { + // Remove leading spaces from each line + line = line.trimStart(); - // Step 1: Handle complex broken links with text and optional images spread across multiple lines - let normalizedMarkdown = markdown.replace(/\[\s*([^\]\n]+?)\s*\]\s*\(\s*([^)]+)\s*\)/g, (match, text, url) => { - // Remove internal new lines and excessive spaces within the text - text = text.replace(/\s+/g, ' ').trim(); - url = url.replace(/\s+/g, '').trim(); - return `[${text}](${url})`; + // Handle complex broken links with text and optional images + line = line.replace(/\[\s*([^\]\n!]*?)\s*(?:!\[([^\]]*)\]\((.*?)\))?\s*\]\s*\(\s*([^)\n]+)\s*\)/g, (match, text, alt, imgUrl, linkUrl) => { + text = text.replace(/\s+/g, ' ').trim(); + alt = alt ? alt.replace(/\s+/g, ' ').trim() : ''; + imgUrl = imgUrl ? imgUrl.replace(/\s+/g, '').trim() : ''; + linkUrl = linkUrl.replace(/\s+/g, '').trim(); + if (imgUrl) { + return `[${text} ![${alt}](${imgUrl})](${linkUrl})`; + } else { + return `[${text}](${linkUrl})`; + } + }); + + // Normalize regular links that may be broken across lines + line = line.replace(/\[\s*([^\]\n]+)\]\s*\(\s*([^)\n]+)\s*\)/g, (match, text, url) => { + text = text.replace(/\s+/g, ' ').trim(); + url = url.replace(/\s+/g, '').trim(); + return `[${text}](${url})`; + }); + + return line; }); - normalizedMarkdown = normalizedMarkdown.replace(/\[\s*([^\]\n!]*?)\s*\n*(?:!\[([^\]]*)\]\((.*?)\))?\s*\n*\]\s*\(\s*([^)]+)\s*\)/g, (match, text, alt, imgUrl, linkUrl) => { - // Normalize by removing excessive spaces and new lines - text = text.replace(/\s+/g, ' ').trim(); - alt = alt ? alt.replace(/\s+/g, ' ').trim() : ''; - imgUrl = imgUrl ? imgUrl.replace(/\s+/g, '').trim() : ''; - linkUrl = linkUrl.replace(/\s+/g, '').trim(); - if (imgUrl) { - return `[${text} ![${alt}](${imgUrl})](${linkUrl})`; - } else { - return `[${text}](${linkUrl})`; - } - }); + // Join the processed lines back together + let normalizedMarkdown = processedLines.join('\n'); - // Step 2: Normalize regular links that may be broken across lines - normalizedMarkdown = normalizedMarkdown.replace(/\[\s*([^\]]+)\]\s*\(\s*([^)]+)\)/g, (match, text, url) => { - text = text.replace(/\s+/g, ' ').trim(); - url = url.replace(/\s+/g, '').trim(); - return `[${text}](${url})`; - }); - - // Step 3: Replace more than two consecutive empty lines with exactly two empty lines + // Replace more than two consecutive empty lines with exactly two empty lines normalizedMarkdown = normalizedMarkdown.replace(/\n{3,}/g, '\n\n'); - // Step 4: Remove leading spaces from each line - normalizedMarkdown = normalizedMarkdown.replace(/^[ \t]+/gm, ''); - return normalizedMarkdown.trim(); }