Skip to content

[lexical-markdown] Bug Fix: Code spans take precedence over inline formatting in shortcuts#8381

Merged
etrepum merged 3 commits intomainfrom
fix/markdown-code-span-precedence
Apr 22, 2026
Merged

[lexical-markdown] Bug Fix: Code spans take precedence over inline formatting in shortcuts#8381
etrepum merged 3 commits intomainfrom
fix/markdown-code-span-precedence

Conversation

@potatowagon
Copy link
Copy Markdown
Contributor

@potatowagon potatowagon commented Apr 22, 2026

Description

Per CommonMark spec, code spans (backticks) should take precedence over other inline formatting. Previously, typing __bold__ would trigger the bold transformer before the closing backtick could complete the code span. Now, text format transformers skip matches that fall inside an unclosed code span.

Test plan

Before

Screen.Recording.2026-04-22.at.2.06.38.PM.mov

After

Screen.Recording.2026-04-22.at.2.05.56.PM.mov

…ine formatting in markdown shortcuts

Per CommonMark spec, code spans (backticks) should take precedence over
other inline formatting. Previously, typing `__bold__` would trigger
the bold transformer before the closing backtick could complete the code
span. Now, text format transformers skip matches that fall inside an
unclosed code span.
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 22, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
lexical Ready Ready Preview, Comment Apr 22, 2026 6:36pm
lexical-playground Ready Ready Preview, Comment Apr 22, 2026 6:36pm

Request Review

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Apr 22, 2026
@potatowagon potatowagon marked this pull request as draft April 22, 2026 05:56
@potatowagon potatowagon marked this pull request as ready for review April 22, 2026 06:56
Copy link
Copy Markdown
Collaborator

@etrepum etrepum left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would be great to add some tests to this to confirm that it fixes the issue

@etrepum etrepum added the extended-tests Run extended e2e tests on a PR label Apr 22, 2026
Comment on lines +394 to +408
let sibling = node.getPreviousSibling();
while (sibling !== null) {
if ($isLineBreakNode(sibling)) {
break;
}
if ($isTextNode(sibling)) {
const siblingText = sibling.getTextContent();
for (let i = 0; i < siblingText.length; i++) {
if (siblingText[i] === '`') {
backtickCount++;
}
}
}
sibling = sibling.getPreviousSibling();
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we really need to look at adjacent TextNodes?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hello etrepum, yes, the opening tag search at line 261-283 walks previous TextNode siblings to find the open tag, so openNode may be a different node than anchorNode. Consider: a user types `code which creates a code-formatted TextNode, then continues typing bold. The backtick is in a previous sibling TextNode. Without checking siblings, $isInsideUnclosedCodeSpan would miss the opening backtick and incorrectly allow the bold transform.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah but that's a different TextNode and the bold formatting will go away if we treat it as markdown, I think it would work as expected if the shortcut only cared about the current node

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for the comment! yea agree it isnt needed, removed

@etrepum etrepum added this pull request to the merge queue Apr 22, 2026
Merged via the queue into main with commit f4c44e1 Apr 22, 2026
44 checks passed
vishisht31 pushed a commit that referenced this pull request Apr 23, 2026
levensta added a commit to levensta/lexical that referenced this pull request Apr 24, 2026
commit 5d1bc33
Author: Sathvik Veerapaneni <98241593+Sathvik-Chowdary-Veerapaneni@users.noreply.github.com>
Date:   Thu Apr 23 13:12:21 2026 -0400

    [lexical-list] Bug Fix: Merge nested list into parent <li> during HTML export (facebook#8313)

    Co-authored-by: Bob Ippolito <bob@redivi.com>

commit 2c37dc2
Author: Bob Ippolito <bob@redivi.com>
Date:   Thu Apr 23 07:14:14 2026 -0700

    [lexical-clipboard][lexical-rich-text][lexical-plain-text] Bug Fix: Drag-and-drop within the same block (facebook#8373)

    Co-authored-by: Claude <noreply@anthropic.com>

commit ca2aa31
Author: Bob Ippolito <bob@redivi.com>
Date:   Thu Apr 23 07:12:43 2026 -0700

    [lexical][lexical-utils][lexical-list] Bug Fix: Clean up and test $insertNodeToNearestRootAtCaret edge cases (facebook#8384)

commit 207648e
Author: Bob Ippolito <bob@redivi.com>
Date:   Thu Apr 23 07:11:52 2026 -0700

    [lexical-html][lexical-playground] Feature: Implement a well-defined ordering for DOMRenderExtension overrides and add $decorateDOM (facebook#8368)

commit 1ca42f1
Author: Agyei Holy <agyeiholy978@gmail.com>
Date:   Wed Apr 22 15:39:37 2026 -0500

    [lexical][lexical-code-core][lexical-list][lexical-table][lexical-yjs] Refactor: make runtime style updates CSP-safe (facebook#8372)

commit ca0ce82
Author: Bob Ippolito <bob@redivi.com>
Date:   Wed Apr 22 12:57:28 2026 -0700

    [lexical-list] Bug Fix: Ensure that ListItemNode always has a ListItem parent (facebook#8382)

commit f4c44e1
Author: Sherry <potatowagon@meta.com>
Date:   Thu Apr 23 00:28:54 2026 +0530

    [lexical-markdown] Bug Fix: Code spans take precedence over inline formatting in shortcuts (facebook#8381)

commit 4a43cb0
Author: Sergey Gorbachev <grbchv.s@gmail.com>
Date:   Wed Apr 22 18:31:21 2026 +0300

    [lexical-playground] Feature: HTML conversion button (facebook#8379)
levensta added a commit to levensta/lexical that referenced this pull request Apr 24, 2026
commit 5d1bc33
Author: Sathvik Veerapaneni <98241593+Sathvik-Chowdary-Veerapaneni@users.noreply.github.com>
Date:   Thu Apr 23 13:12:21 2026 -0400

    [lexical-list] Bug Fix: Merge nested list into parent <li> during HTML export (facebook#8313)

    Co-authored-by: Bob Ippolito <bob@redivi.com>

commit 2c37dc2
Author: Bob Ippolito <bob@redivi.com>
Date:   Thu Apr 23 07:14:14 2026 -0700

    [lexical-clipboard][lexical-rich-text][lexical-plain-text] Bug Fix: Drag-and-drop within the same block (facebook#8373)

    Co-authored-by: Claude <noreply@anthropic.com>

commit ca2aa31
Author: Bob Ippolito <bob@redivi.com>
Date:   Thu Apr 23 07:12:43 2026 -0700

    [lexical][lexical-utils][lexical-list] Bug Fix: Clean up and test $insertNodeToNearestRootAtCaret edge cases (facebook#8384)

commit 207648e
Author: Bob Ippolito <bob@redivi.com>
Date:   Thu Apr 23 07:11:52 2026 -0700

    [lexical-html][lexical-playground] Feature: Implement a well-defined ordering for DOMRenderExtension overrides and add $decorateDOM (facebook#8368)

commit 1ca42f1
Author: Agyei Holy <agyeiholy978@gmail.com>
Date:   Wed Apr 22 15:39:37 2026 -0500

    [lexical][lexical-code-core][lexical-list][lexical-table][lexical-yjs] Refactor: make runtime style updates CSP-safe (facebook#8372)

commit ca0ce82
Author: Bob Ippolito <bob@redivi.com>
Date:   Wed Apr 22 12:57:28 2026 -0700

    [lexical-list] Bug Fix: Ensure that ListItemNode always has a ListItem parent (facebook#8382)

commit f4c44e1
Author: Sherry <potatowagon@meta.com>
Date:   Thu Apr 23 00:28:54 2026 +0530

    [lexical-markdown] Bug Fix: Code spans take precedence over inline formatting in shortcuts (facebook#8381)

commit 4a43cb0
Author: Sergey Gorbachev <grbchv.s@gmail.com>
Date:   Wed Apr 22 18:31:21 2026 +0300

    [lexical-playground] Feature: HTML conversion button (facebook#8379)
@etrepum etrepum mentioned this pull request Apr 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. extended-tests Run extended e2e tests on a PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants