# Lezer/markdown GFM task not parsing paragraphs

**URL:** <https://discuss.codemirror.net/t/lezer-markdown-gfm-task-not-parsing-paragraphs/9915>\
**Category:** Lezer\
**Created:** [October 18, 2026, 2:42pm UTC](https://discuss.codemirror.net/t/lezer-markdown-gfm-task-not-parsing-paragraphs/9915 "2026-10-18T14:42:47Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![superle3](https://discuss.codemirror.net/user_avatar/discuss.codemirror.net/superle3/32/5454_2.png) [@superle3](https://discuss.codemirror.net/u/superle3)\
**Post date:** [October 18, 2026, 2:42pm UTC](https://discuss.codemirror.net/t/lezer-markdown-gfm-task-not-parsing-paragraphs/9915/1 "2026-10-18T14:42:47Z")

</div>

from the spec [GitHub Flavored Markdown Spec](https://github.github.com/gfm/#task-list-items-extension-) I didn’t see any adjustment to a task item such that they should be parsed differently than normal list items besides the initial task marker.

but @lezer/markdown does parse it differently,

see [playground link](https://codemirror.net/try/#c=aW1wb3J0IHsgYmFzaWNTZXR1cCwgRWRpdG9yVmlldyB9IGZyb20gImNvZGVtaXJyb3IiOwppbXBvcnQgeyBtYXJrZG93biwgbWFya2Rvd25MYW5ndWFnZSB9IGZyb20gIkBjb2RlbWlycm9yL2xhbmctbWFya2Rvd24iOwppbXBvcnQgeyBsYW5ndWFnZXMgfSBmcm9tICJAY29kZW1pcnJvci9sYW5ndWFnZS1kYXRhIjsKaW1wb3J0IHsgc3ludGF4VHJlZSB9IGZyb20gIkBjb2RlbWlycm9yL2xhbmd1YWdlIjsKCi8vIFRoZSBNYXJrZG93biBwYXJzZXIgd2lsbCBkeW5hbWljYWxseSBsb2FkIHBhcnNlcnMKLy8gZm9yIGNvZGUgYmxvY2tzLCB1c2luZyBAY29kZW1pcnJvci9sYW5ndWFnZS1kYXRhIHRvCi8vIGxvb2sgdXAgdGhlIGFwcHJvcHJpYXRlIGR5bmFtaWMgaW1wb3J0LgoKY29uc3QgZG9jID0gU3RyaW5nLnJhd2AKLSB0ZXh0CiAgIH5+fmpzCiAgIGNvbnNvbGUubG9nKCJoZWxsbyIpCiAgIH5+fgo8IS0tIGJyZWFrIHVwIHRoZSBsaXN0IC0tPgoKLSBbWF0gdGV4dAogICB+fn5qcwogICBjb25zb2xlLmxvZygiaGVsbG8iKQogICB+fn4KYDsKCmxldCB2aWV3ID0gbmV3IEVkaXRvclZpZXcoewogICAgZG9jOiBkb2MsCiAgICBleHRlbnNpb25zOiBbYmFzaWNTZXR1cCwgbWFya2Rvd24oeyBjb2RlTGFuZ3VhZ2VzOiBsYW5ndWFnZXMsIGJhc2U6IG1hcmtkb3duTGFuZ3VhZ2UgfSldLAogICAgcGFyZW50OiBkb2N1bWVudC5ib2R5LAp9KTsKY29uc29sZS5sb2coc3ludGF4VHJlZSh2aWV3LnN0YXRlKS50b1N0cmluZygpKTsK) where for the markdown

```md
- text
   ~~~js
   console.log("hello")
   ~~~
<!-- -->

- [X] text
   ~~~js
   console.log("hello")
   ~~~

```

`text` in the first list a paragraph is but `text` in the second list only part of the task is and not its own node.

see `Document(BulletList(ListItem(ListMark,Paragraph,FencedCode(CodeMark,CodeInfo,CodeText,CodeMark))),CommentBlock,BulletList(ListItem(ListMark,Task(TaskMarker),FencedCode(CodeMark,CodeInfo,CodeText,CodeMark))))` as the `tree.toString()` output.

is there any reason to this? as this makes using the parser a bit more awkward.

---

<div class="post-metadata">

**Author:** ![whitescreendev](https://discuss.codemirror.net/user_avatar/discuss.codemirror.net/whitescreendev/32/5568_2.png) [@whitescreendev](https://discuss.codemirror.net/u/whitescreendev)\
**Post date:** [October 19, 2026, 8:30am UTC](https://discuss.codemirror.net/t/lezer-markdown-gfm-task-not-parsing-paragraphs/9915/2 "2026-10-19T08:30:21Z")

</div>

Interesting difference. I wonder if it’s related to how Lezer represents task markers in its syntax tree rather than anything specific to the GFM spec. Though I agree it’s a little surprising that adding a checkbox changes the paragraph structure.

---

<div class="post-metadata">

**Author:** ![marijn](https://discuss.codemirror.net/user_avatar/discuss.codemirror.net/marijn/32/136_2.png) [@marijn](https://discuss.codemirror.net/u/marijn)\
**Post date:** [October 19, 2026, 3:27pm UTC](https://discuss.codemirror.net/t/lezer-markdown-gfm-task-not-parsing-paragraphs/9915/3 "2026-10-19T15:27:54Z")

</div>

The idea is that `Task` takes the role of `Paragraph` here, as the block-wrapping node.
