diff --git a/src/lib/utils/url-link-converter.js b/src/lib/utils/url-link-converter.js index 2ac9ca7..461ce9a 100644 --- a/src/lib/utils/url-link-converter.js +++ b/src/lib/utils/url-link-converter.js @@ -42,7 +42,7 @@ export function convertUrlsToLinks(text) { // Extract code blocks and replace with placeholders while ((codeMatch = codeBlockRegex.exec(text)) !== null) { - const placeholder = `<[CODE_BLOCK_${codeIndex}]>`; + const placeholder = `__QRYPTCHAT_CODE_BLOCK_${codeIndex}__`; const codeContent = codeMatch[1]; codeBlocks.push(`
${escapeHtml(codeContent)}
`); textWithPlaceholders = textWithPlaceholders.replace(codeMatch[0], placeholder); @@ -87,7 +87,7 @@ export function convertUrlsToLinks(text) { // Restore code blocks from placeholders codeBlocks.forEach((codeBlock, index) => { - const placeholder = `<[CODE_BLOCK_${index}]>`; + const placeholder = `__QRYPTCHAT_CODE_BLOCK_${index}__`; result = result.replace(placeholder, codeBlock); }); diff --git a/src/lib/utils/url-link-converter.test.js b/src/lib/utils/url-link-converter.test.js index 158ef8b..914172d 100644 --- a/src/lib/utils/url-link-converter.test.js +++ b/src/lib/utils/url-link-converter.test.js @@ -9,4 +9,26 @@ describe('convertUrlsToLinks', () => { expect(html).toContain('href="https://example.com/search?a=1&b=2"'); expect(html).toContain('>https://example.com/search?a=1&b=2'); }); + + it('renders fenced code blocks instead of escaped placeholders', () => { + const html = convertUrlsToLinks('Before\n```const value = 1;\n```\nAfter'); + + expect(html).toContain('
const value = 1;\n
'); + expect(html).not.toContain('CODE_BLOCK'); + expect(html).not.toContain('<[CODE_BLOCK_0]>'); + }); + + it('does not linkify URLs inside fenced code blocks', () => { + const html = convertUrlsToLinks('```https://example.com/search?a=1&b=2```'); + + expect(html).toContain('
https://example.com/search?a=1&b=2
'); + expect(html).not.toContain(' { + const html = convertUrlsToLinks('``````'); + + expect(html).toContain('<script>alert("x")</script>'); + expect(html).not.toContain('