Repository navigation
fix: keep lazy lines after a list in a nested blockquote - #4137
Merged
Merged
Conversation
When a list in a blockquote took lazy lines, the blockquote cut the old list raw off the end of its own raw. The list raw has no > markers, so for a list of more than one line the blockquote raw stopped matching the source, and an outer blockquote then lost track of the lines the inner one took. Add the source lines the list took instead.
|
@wahidrizka is attempting to deploy a commit to the MarkedJS Team on Vercel. A member of the Team first needs to authorize it. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
github-actions Bot
pushed a commit
that referenced
this pull request
Oct 26, 2026
## [18.1.2](v18.1.1...v18.1.2) (2026-10-26) ### Bug Fixes * allow a tab or end of input after a type 6 html block tag name ([#4128](#4128)) ([e09c40d](e09c40d)) * apply emphasis flanking and rules 9-10 to the whole delimiter run ([#4145](#4145)) ([5d8e234](5d8e234)) * **cli:** await config functions before parsing ([#4138](#4138)) ([3a11ad1](3a11ad1)) * **cli:** create no-clobber output files atomically ([#4135](#4135)) ([e7c4f64](e7c4f64)) * do not continue a block quote paragraph from a whitespace-only line ([#4134](#4134)) ([42f34a8](42f34a8)) * expand a tab after the block quote marker to the next tab stop ([#4110](#4110)) ([2d3899b](2d3899b)) * honor per-call async options when composing hooks ([#4139](#4139)) ([379be9d](379be9d)) * keep a line starting with # but no space in the list item ([#4127](#4127)) ([6b63189](6b63189)) * keep duplicate link definitions in the tokens ([#4132](#4132)) ([2784acc](2784acc)) * keep lazy lines after a list in a nested blockquote ([#4137](#4137)) ([38c7e55](38c7e55)) * keep lazy setext underlines in list items as text ([#4126](#4126)) ([398234c](398234c)) * render nested image alt formatting as plain text ([#4131](#4131)) ([15f59bb](15f59bb)) * stop an unclosed inline raw tag from unescaping later blocks ([#4130](#4130)) ([4562b6f](4562b6f)) ### Performance Improvements * ~16% faster parsing by skipping em/strong masking for runs without *, _ or ~ ([#4142](#4142)) ([f0fd3e0](f0fd3e0))
This was referenced Oct 30, 2026
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Marked version: 18.1.1 (cdbdc01)
Markdown flavor: CommonMark|GitHub Flavored Markdown
Description
When a list in a blockquote takes lazy continuation lines,
blockquote()cuts the old list raw off the end of its ownrawand appends the new list raw. The list raw has no>markers, so that only works for a one-line list. Otherwise the blockquote raw stops matching the source:A blockquote around this one uses that raw to find out which continuation lines the inner blockquote took, so lazy lines end up outside both blockquotes, and sometimes text is lost:
Expectation
as commonmark.js renders it.
Result
The second list loses
bandc.What was attempted
The list branch now counts the continuation lines the new list took and adds those lines from the source to
rawandtext, as the nested blockquote branch above it already does. The lines it did not take are passed on as they are, without the empty first line that splitting the rest ofnewTextused to add.Found by checking that the raw values of the top-level tokens join back to the source. On 60,000 distinct generated documents with blockquotes, lists and trailing whitespace (
gfm: false), raw mismatches drop from 5,345 to 1,206, and 73 render differently: 31 now match commonmark.js and did not before, 42 match it neither before nor after, and none stopped matching. In 27 of the 73, master's output is missing text that commonmark.js has, and the fix has all of it. One goes the other way: in> > - x\n> bar\n # foothe indented lazy line is now read as part of the list item and becomes a heading, where master moved it out of the blockquotes as a code block (commonmark.js keeps it as paragraph text). That comes from lazy lines being passed tolist()as item lines, which this does not change. One document gets a raw mismatch that master does not have: the fix reads its last line-as an empty list item, as commonmark.js does, and the list's raw ends in-\n, which master also gives for-on its own. All 652 CommonMark and 28 GFM spec examples render exactly as before.(Edited: my first numbers counted some generated documents twice and missed the raw mismatch above. These are from 60,000 distinct documents.)
The new
lazy line in a nested listlexer test andtest/specs/new/blockquote_nested_list_lazy_linesboth fail on master. Specs, unit, umd, cjs, types and lint pass locally, except the fivebinexec tests, which fail on master too because my checkout path has a space in it.Contributor
Committer
In most cases, this should be a different person than the contributor.