Skip to content

Commit

Permalink
strip markdown from chat accessible view, maintain code block nav fun…
Browse files Browse the repository at this point in the history
…ctionality (microsoft#213096)
  • Loading branch information
meganrogge authored and mustard-mh committed May 22, 2024
1 parent 6536d1a commit eccf91b
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 5 deletions.
15 changes: 12 additions & 3 deletions src/vs/base/browser/markdownRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -492,15 +492,16 @@ export function renderStringAsPlaintext(string: IMarkdownString | string) {

/**
* Strips all markdown from `markdown`. For example `# Header` would be output as `Header`.
* provide @param withCodeBlocks to retain code blocks
*/
export function renderMarkdownAsPlaintext(markdown: IMarkdownString) {
export function renderMarkdownAsPlaintext(markdown: IMarkdownString, withCodeBlocks?: boolean) {
// values that are too long will freeze the UI
let value = markdown.value ?? '';
if (value.length > 100_000) {
value = `${value.substr(0, 100_000)}…`;
}

const html = marked.parse(value, { renderer: plainTextRenderer.value }).replace(/&(#\d+|[a-zA-Z]+);/g, m => unescapeInfo.get(m) ?? m);
const html = marked.parse(value, { renderer: withCodeBlocks ? plainTextWithCodeBlocksRenderer.value : plainTextRenderer.value }).replace(/&(#\d+|[a-zA-Z]+);/g, m => unescapeInfo.get(m) ?? m);

return sanitizeRenderedMarkdown({ isTrusted: false }, html).toString();
}
Expand All @@ -514,7 +515,7 @@ const unescapeInfo = new Map<string, string>([
['&gt;', '>'],
]);

const plainTextRenderer = new Lazy<marked.Renderer>(() => {
function createRenderer(): marked.Renderer {
const renderer = new marked.Renderer();

renderer.code = (code: string): string => {
Expand Down Expand Up @@ -578,6 +579,14 @@ const plainTextRenderer = new Lazy<marked.Renderer>(() => {
return text;
};
return renderer;
}
const plainTextRenderer = new Lazy<marked.Renderer>((withCodeBlocks?: boolean) => createRenderer());
const plainTextWithCodeBlocksRenderer = new Lazy<marked.Renderer>(() => {
const renderer = createRenderer();
renderer.code = (code: string): string => {
return '\n' + '```' + code + '```' + '\n';
};
return renderer;
});

function mergeRawTokenText(tokens: marked.Token[]): string {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { IMarkdownString } from 'vs/base/common/htmlContent';
import { renderMarkdownAsPlaintext } from 'vs/base/browser/markdownRenderer';
import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent';
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
import { AccessibleViewProviderId, AccessibleViewType } from 'vs/platform/accessibility/browser/accessibleView';
import { alertAccessibleViewFocusChange, IAccessibleViewImplentation } from 'vs/platform/accessibility/browser/accessibleViewRegistry';
Expand Down Expand Up @@ -71,7 +72,7 @@ export class ChatResponseAccessibleView implements IAccessibleViewImplentation {
return {
id: AccessibleViewProviderId.Chat,
verbositySettingKey: AccessibilityVerbositySettingId.Chat,
provideContent(): string { return responseContent!; },
provideContent(): string { return renderMarkdownAsPlaintext(new MarkdownString(responseContent), true); },
onClose() {
verifiedWidget.reveal(focusedItem);
if (chatInputFocused) {
Expand Down

0 comments on commit eccf91b

Please sign in to comment.