From a4d0fbe1f5332309cdeb6c1394c6d478d4bab089 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sun, 7 Jun 2026 18:16:12 -0700 Subject: [PATCH] Fix double-escaped entities in renderAsPlaintext code spans The plaintext markdown renderer's codespan handler called escape() on text that marked had already HTML-escaped during tokenization. The trailing unescape pass in renderAsPlaintext only reverses one level, so entities inside code spans leaked through double-escaped (e.g. & -> &, < -> <). Removing the redundant escape() makes code spans match code-block behavior. (Written by Copilot) --- src/vs/base/browser/markdownRenderer.ts | 2 +- src/vs/base/test/browser/markdownRenderer.test.ts | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/markdownRenderer.ts b/src/vs/base/browser/markdownRenderer.ts index b4dd91602b864e..f6ff4f3821608c 100644 --- a/src/vs/base/browser/markdownRenderer.ts +++ b/src/vs/base/browser/markdownRenderer.ts @@ -756,7 +756,7 @@ function createPlainTextRenderer(): marked.Renderer { return text; }; renderer.codespan = ({ text }: marked.Tokens.Codespan): string => { - return escape(text); + return text; }; renderer.br = (_: marked.Tokens.Br): string => { return '\n'; diff --git a/src/vs/base/test/browser/markdownRenderer.test.ts b/src/vs/base/test/browser/markdownRenderer.test.ts index 6e539f096559cd..daac674de8c3a0 100644 --- a/src/vs/base/test/browser/markdownRenderer.test.ts +++ b/src/vs/base/test/browser/markdownRenderer.test.ts @@ -388,6 +388,11 @@ suite('MarkdownRenderer', () => { const result: string = renderAsPlaintext(markdown, { includeCodeBlocksFences: true }); assert.strictEqual(result, expected); }); + + test('does not double-escape entities inside code spans', () => { + assert.strictEqual(renderAsPlaintext({ value: 'Run `tests & build`' }), 'Run tests & build'); + assert.strictEqual(renderAsPlaintext({ value: 'Use `
` tag' }), 'Use tag'); + }); }); suite('supportHtml', () => {