@@ -14,6 +14,7 @@ import { Event } from 'vs/base/common/event';
14
14
import { IMarkdownString , escapeDoubleQuotes , parseHrefAndDimensions , removeMarkdownEscapes } from 'vs/base/common/htmlContent' ;
15
15
import { markdownEscapeEscapedIcons } from 'vs/base/common/iconLabels' ;
16
16
import { defaultGenerator } from 'vs/base/common/idGenerator' ;
17
+ import { Lazy } from 'vs/base/common/lazy' ;
17
18
import { DisposableStore } from 'vs/base/common/lifecycle' ;
18
19
import { marked } from 'vs/base/common/marked/marked' ;
19
20
import { parse } from 'vs/base/common/marshalling' ;
@@ -399,6 +400,27 @@ export function renderStringAsPlaintext(string: IMarkdownString | string) {
399
400
* Strips all markdown from `markdown`. For example `# Header` would be output as `Header`.
400
401
*/
401
402
export function renderMarkdownAsPlaintext ( markdown : IMarkdownString ) {
403
+ // values that are too long will freeze the UI
404
+ let value = markdown . value ?? '' ;
405
+ if ( value . length > 100_000 ) {
406
+ value = `${ value . substr ( 0 , 100_000 ) } …` ;
407
+ }
408
+
409
+ const html = marked . parse ( value , { renderer : plainTextRenderer . getValue ( ) } ) . replace ( / & ( # \d + | [ a - z A - Z ] + ) ; / g, m => unescapeInfo . get ( m ) ?? m ) ;
410
+
411
+ return sanitizeRenderedMarkdown ( { isTrusted : false } , html ) . toString ( ) ;
412
+ }
413
+
414
+ const unescapeInfo = new Map < string , string > ( [
415
+ [ '"' , '"' ] ,
416
+ [ ' ' , ' ' ] ,
417
+ [ '&' , '&' ] ,
418
+ [ ''' , '\'' ] ,
419
+ [ '<' , '<' ] ,
420
+ [ '>' , '>' ] ,
421
+ ] ) ;
422
+
423
+ const plainTextRenderer = new Lazy < marked . Renderer > ( ( ) => {
402
424
const renderer = new marked . Renderer ( ) ;
403
425
404
426
renderer . code = ( code : string ) : string => {
@@ -461,22 +483,5 @@ export function renderMarkdownAsPlaintext(markdown: IMarkdownString) {
461
483
renderer . link = ( _href : string , _title : string , text : string ) : string => {
462
484
return text ;
463
485
} ;
464
- // values that are too long will freeze the UI
465
- let value = markdown . value ?? '' ;
466
- if ( value . length > 100_000 ) {
467
- value = `${ value . substr ( 0 , 100_000 ) } …` ;
468
- }
469
-
470
- const unescapeInfo = new Map < string , string > ( [
471
- [ '"' , '"' ] ,
472
- [ ' ' , ' ' ] ,
473
- [ '&' , '&' ] ,
474
- [ ''' , '\'' ] ,
475
- [ '<' , '<' ] ,
476
- [ '>' , '>' ] ,
477
- ] ) ;
478
-
479
- const html = marked . parse ( value , { renderer } ) . replace ( / & ( # \d + | [ a - z A - Z ] + ) ; / g, m => unescapeInfo . get ( m ) ?? m ) ;
480
-
481
- return sanitizeRenderedMarkdown ( { isTrusted : false } , html ) . toString ( ) ;
482
- }
486
+ return renderer ;
487
+ } ) ;
0 commit comments