From a91e9b268f08e38e55dbd02ec7ebc168ad2313af Mon Sep 17 00:00:00 2001 From: Pushkar Gupta Date: Mon, 23 Mar 2026 13:24:53 +0530 Subject: [PATCH 1/2] fix: correctly handle multiple trailing newlines in headings and definitions --- src/Tokenizer.ts | 6 +++--- test/unit/Lexer.test.js | 42 +++++++++++++++++++++++++++++++++------- test/unit/marked.test.js | 1 + 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/Tokenizer.ts b/src/Tokenizer.ts index 6536fda297..b27945a2d5 100644 --- a/src/Tokenizer.ts +++ b/src/Tokenizer.ts @@ -126,7 +126,7 @@ export class _Tokenizer { return { type: 'heading', - raw: cap[0], + raw: rtrim(cap[0], '\n'), depth: cap[1].length, text, tokens: this.lexer.inline(text), @@ -501,7 +501,7 @@ export class _Tokenizer { return { type: 'def', tag, - raw: cap[0], + raw: rtrim(cap[0], '\n'), href, title, }; @@ -577,7 +577,7 @@ export class _Tokenizer { const text = cap[1].trim(); return { type: 'heading', - raw: cap[0], + raw: rtrim(cap[0], '\n'), depth: cap[2].charAt(0) === '=' ? 1 : 2, text, tokens: this.lexer.inline(text), diff --git a/test/unit/Lexer.test.js b/test/unit/Lexer.test.js index 7ad5eb1532..ea02583995 100644 --- a/test/unit/Lexer.test.js +++ b/test/unit/Lexer.test.js @@ -107,53 +107,81 @@ lheading 2 }, { type: 'heading', - raw: '# heading 1\n\n', + raw: '# heading 1', depth: 1, text: 'heading 1', tokens: [{ type: 'text', raw: 'heading 1', text: 'heading 1', escaped: false }], }, + { + type: 'space', + raw: '\n\n', + }, { type: 'heading', - raw: '## heading 2\n\n', + raw: '## heading 2', depth: 2, text: 'heading 2', tokens: [{ type: 'text', raw: 'heading 2', text: 'heading 2', escaped: false }], }, + { + type: 'space', + raw: '\n\n', + }, { type: 'heading', - raw: '### heading 3\n\n', + raw: '### heading 3', depth: 3, text: 'heading 3', tokens: [{ type: 'text', raw: 'heading 3', text: 'heading 3', escaped: false }], }, + { + type: 'space', + raw: '\n\n', + }, { type: 'heading', - raw: '#### heading 4\n\n', + raw: '#### heading 4', depth: 4, text: 'heading 4', tokens: [{ type: 'text', raw: 'heading 4', text: 'heading 4', escaped: false }], }, + { + type: 'space', + raw: '\n\n', + }, { type: 'heading', - raw: '##### heading 5\n\n', + raw: '##### heading 5', depth: 5, text: 'heading 5', tokens: [{ type: 'text', raw: 'heading 5', text: 'heading 5', escaped: false }], }, + { + type: 'space', + raw: '\n\n', + }, { type: 'heading', - raw: '###### heading 6\n\n', + raw: '###### heading 6', depth: 6, text: 'heading 6', tokens: [{ type: 'text', raw: 'heading 6', text: 'heading 6', escaped: false }], }, + { + type: 'space', + raw: '\n\n', + }, { type: 'heading', - raw: 'lheading 1\n==========\n\n', + raw: 'lheading 1\n==========', depth: 1, text: 'lheading 1', tokens: [{ type: 'text', raw: 'lheading 1', text: 'lheading 1', escaped: false }], }, + { + type: 'space', + raw: '\n\n', + }, { type: 'heading', raw: 'lheading 2\n----------\n', diff --git a/test/unit/marked.test.js b/test/unit/marked.test.js index c4a648223f..d13b0f30f9 100644 --- a/test/unit/marked.test.js +++ b/test/unit/marked.test.js @@ -1006,6 +1006,7 @@ br ['space', ''], ['heading', '# heading'], ['text', 'heading'], + ['space', ''], ['code', '```code```'], ['space', ''], ['table', '| a | b ||---|---|| 1 | 2 || 3 | 4 |'], From d685576e874f693edfaecf200de47f8538bc2289 Mon Sep 17 00:00:00 2001 From: Pushkar Gupta Date: Mon, 23 Mar 2026 13:35:01 +0530 Subject: [PATCH 2/2] fix: correctly handle multiple trailing newlines in GFM tables --- src/Tokenizer.ts | 2 +- test/unit/marked.test.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Tokenizer.ts b/src/Tokenizer.ts index b27945a2d5..cd85a3da9a 100644 --- a/src/Tokenizer.ts +++ b/src/Tokenizer.ts @@ -525,7 +525,7 @@ export class _Tokenizer { const item: Tokens.Table = { type: 'table', - raw: cap[0], + raw: rtrim(cap[0], '\n'), header: [], align: [], rows: [], diff --git a/test/unit/marked.test.js b/test/unit/marked.test.js index d13b0f30f9..ad928b7efe 100644 --- a/test/unit/marked.test.js +++ b/test/unit/marked.test.js @@ -1016,6 +1016,7 @@ br ['text', '2'], ['text', '3'], ['text', '4'], + ['space', ''], ['blockquote', '> blockquote'], ['paragraph', 'blockquote'], ['text', 'blockquote'],