From 3b4b61f2bd64c335731f18a67360c5ee91d94b73 Mon Sep 17 00:00:00 2001 From: rissrice2105-agent Date: Fri, 17 Jul 2026 19:03:47 -0600 Subject: [PATCH] fix(messages): avoid code block placeholder collisions --- src/lib/utils/url-link-converter.js | 8 ++++++-- src/lib/utils/url-link-converter.test.js | 10 ++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/lib/utils/url-link-converter.js b/src/lib/utils/url-link-converter.js index 461ce9a8..b91c2b98 100644 --- a/src/lib/utils/url-link-converter.js +++ b/src/lib/utils/url-link-converter.js @@ -36,13 +36,17 @@ export function convertUrlsToLinks(text) { // First, handle code blocks (```...```) to protect them from other processing const codeBlockRegex = /```([\s\S]*?)```/g; const codeBlocks = []; + let placeholderPrefix = '__QRYPTCHAT_CODE_BLOCK_'; + while (text.includes(placeholderPrefix)) { + placeholderPrefix = `_${placeholderPrefix}`; + } let textWithPlaceholders = text; let codeMatch; let codeIndex = 0; // Extract code blocks and replace with placeholders while ((codeMatch = codeBlockRegex.exec(text)) !== null) { - const placeholder = `__QRYPTCHAT_CODE_BLOCK_${codeIndex}__`; + const placeholder = `${placeholderPrefix}${codeIndex}__`; const codeContent = codeMatch[1]; codeBlocks.push(`
${escapeHtml(codeContent)}
`); textWithPlaceholders = textWithPlaceholders.replace(codeMatch[0], placeholder); @@ -87,7 +91,7 @@ export function convertUrlsToLinks(text) { // Restore code blocks from placeholders codeBlocks.forEach((codeBlock, index) => { - const placeholder = `__QRYPTCHAT_CODE_BLOCK_${index}__`; + const placeholder = `${placeholderPrefix}${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 914172df..bc7c14f8 100644 --- a/src/lib/utils/url-link-converter.test.js +++ b/src/lib/utils/url-link-converter.test.js @@ -31,4 +31,14 @@ describe('convertUrlsToLinks', () => { expect(html).toContain('<script>alert("x")</script>'); expect(html).not.toContain('