Skip to content

Commit 26d177f

Browse files
authored
Fix flickering when starting to render list (microsoft#252463)
Lone - creates a header
1 parent ee691da commit 26d177f

File tree

2 files changed

+36
-13
lines changed

2 files changed

+36
-13
lines changed

src/vs/base/browser/markdownRenderer.ts

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,12 @@ function completeListItemPattern(list: marked.Tokens.List): marked.Tokens.List |
822822
return newList;
823823
}
824824

825+
function completeHeading(token: marked.Tokens.Heading): marked.TokensList | void {
826+
if (token.raw.match(/-\s*$/)) {
827+
return marked.lexer(token.raw + '  ');
828+
}
829+
}
830+
825831
const maxIncompleteTokensFixRounds = 3;
826832
export function fillInIncompleteTokens(tokens: marked.TokensList): marked.TokensList {
827833
for (let i = 0; i < maxIncompleteTokensFixRounds; i++) {
@@ -846,22 +852,23 @@ function fillInIncompleteTokensOnce(tokens: marked.TokensList): marked.TokensLis
846852
newTokens = completeTable(tokens.slice(i));
847853
break;
848854
}
855+
}
849856

850-
if (i === tokens.length - 1 && token.type === 'list') {
851-
const newListToken = completeListItemPattern(token as marked.Tokens.List);
852-
if (newListToken) {
853-
newTokens = [newListToken];
854-
break;
855-
}
857+
const lastToken = tokens.at(-1);
858+
if (!newTokens && lastToken?.type === 'list') {
859+
const newListToken = completeListItemPattern(lastToken as marked.Tokens.List);
860+
if (newListToken) {
861+
newTokens = [newListToken];
862+
i = tokens.length - 1;
856863
}
864+
}
857865

858-
if (i === tokens.length - 1 && token.type === 'paragraph') {
859-
// Only operates on a single token, because any newline that follows this should break these patterns
860-
const newToken = completeSingleLinePattern(token as marked.Tokens.Paragraph);
861-
if (newToken) {
862-
newTokens = [newToken];
863-
break;
864-
}
866+
if (!newTokens && lastToken?.type === 'paragraph') {
867+
// Only operates on a single token, because any newline that follows this should break these patterns
868+
const newToken = completeSingleLinePattern(lastToken as marked.Tokens.Paragraph);
869+
if (newToken) {
870+
newTokens = [newToken];
871+
i = tokens.length - 1;
865872
}
866873
}
867874

@@ -874,6 +881,13 @@ function fillInIncompleteTokensOnce(tokens: marked.TokensList): marked.TokensLis
874881
return newTokensList as marked.TokensList;
875882
}
876883

884+
if (lastToken?.type === 'heading') {
885+
const completeTokens = completeHeading(lastToken as marked.Tokens.Heading);
886+
if (completeTokens) {
887+
return completeTokens;
888+
}
889+
}
890+
877891
return null;
878892
}
879893

src/vs/base/test/browser/markdownRenderer.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -713,6 +713,15 @@ suite('MarkdownRenderer', () => {
713713
const completeTokens = marked.marked.lexer(incomplete + '&nbsp;');
714714
assert.deepStrictEqual(newTokens, completeTokens);
715715
});
716+
717+
test('text with start of list', () => {
718+
const incomplete = `hello\n- `;
719+
const tokens = marked.marked.lexer(incomplete);
720+
const newTokens = fillInIncompleteTokens(tokens);
721+
722+
const completeTokens = marked.marked.lexer(incomplete + ' &nbsp;');
723+
assert.deepStrictEqual(newTokens, completeTokens);
724+
});
716725
});
717726

718727
suite('codespan', () => {

0 commit comments

Comments
 (0)