| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| export function normalizeContent(content: string): string { |
| if (!content || typeof content !== 'string') return ''; |
|
|
| const lines = content.split('\n'); |
| const normalized: string[] = []; |
| let inFencedCodeBlock = false; |
| let consecutiveBlankLines = 0; |
|
|
| |
| const isFencedCodeDelimiter = (line: string): boolean => { |
| const trimmed = line.trim(); |
| return /^```/.test(trimmed); |
| }; |
|
|
| |
| const isListItem = (line: string): boolean => { |
| const trimmed = line.trim(); |
| return /^[-*+]\s/.test(trimmed) || /^\d+\.\s/.test(trimmed); |
| }; |
|
|
| |
| const isBlockquote = (line: string): boolean => { |
| return /^\s*>/.test(line); |
| }; |
|
|
| |
| const looksLikeCode = (line: string): boolean => { |
| const trimmed = line.trim(); |
| |
| if (!trimmed || trimmed.length < 3) return false; |
|
|
| |
| const codePatterns = [ |
| /^(const|let|var|function|class|import|export|return|if|for|while)\s/, |
| /^[a-zA-Z_$][a-zA-Z0-9_$]*\s*[=:({]/, |
| /[{};()[\]]/, |
| /^\/\//, |
| /^#/, |
| ]; |
|
|
| return codePatterns.some(pattern => pattern.test(trimmed)); |
| }; |
|
|
| for (let i = 0; i < lines.length; i++) { |
| const line = lines[i]; |
|
|
| |
| if (isFencedCodeDelimiter(line)) { |
| inFencedCodeBlock = !inFencedCodeBlock; |
| normalized.push(line); |
| consecutiveBlankLines = 0; |
| continue; |
| } |
|
|
| |
| if (inFencedCodeBlock) { |
| normalized.push(line); |
| consecutiveBlankLines = 0; |
| continue; |
| } |
|
|
| |
| if (!line.trim()) { |
| consecutiveBlankLines++; |
| |
| if (consecutiveBlankLines <= 2) { |
| normalized.push(''); |
| } |
| continue; |
| } |
|
|
| consecutiveBlankLines = 0; |
|
|
| |
| if (isListItem(line)) { |
| normalized.push(line); |
| continue; |
| } |
|
|
| |
| if (isBlockquote(line)) { |
| normalized.push(line); |
| continue; |
| } |
|
|
| |
| const leadingSpaces = line.match(/^(\s*)/)?.[1].length || 0; |
|
|
| |
| if (leadingSpaces >= 4 && !looksLikeCode(line)) { |
| |
| normalized.push(line.trim()); |
| continue; |
| } |
|
|
| |
| if (leadingSpaces >= 2 && leadingSpaces < 4) { |
| normalized.push(line.trim()); |
| continue; |
| } |
|
|
| |
| normalized.push(line); |
| } |
|
|
| return normalized.join('\n').trim(); |
| } |
|
|