[lexical-code][lexical-markdown][lexical-playground] Feature: Add code diff highlighting#7613
Merged
etrepum merged 2 commits intofacebook:mainfrom Jun 9, 2025
Merged
[lexical-code][lexical-markdown][lexical-playground] Feature: Add code diff highlighting#7613etrepum merged 2 commits intofacebook:mainfrom
etrepum merged 2 commits intofacebook:mainfrom
Conversation
|
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
etrepum
reviewed
Jun 8, 2025
Collaborator
etrepum
left a comment
There was a problem hiding this comment.
This seems straightforward and seemed to work well enough in the playground, it would be great to have at least one e2e test that shows that the diff support produces the expected markup both with and without a second language to tokenize (e.g. 'diff' and 'diff-javascript')
Contributor
Author
|
@etrepum I added e2e tests for language |
Merged
fantactuka
pushed a commit
that referenced
this pull request
Aug 11, 2025
…e diff highlighting (#7613)
23 tasks
GermanJablo
added a commit
to payloadcms/payload
that referenced
this pull request
Sep 3, 2025
Fixes #13386 Below I write a clarification to copy and paste into the release note, based on our latest upgrade of Lexical [in v3.29.0](https://github.com/payloadcms/payload/releases/tag/v3.29.0). ## Important This release upgrades the lexical dependency from 0.28.0 to 0.34.0. If you installed lexical manually, update it to 0.34.0. Installing lexical manually is not recommended, as it may break between updates, and our re-exported versions should be used. See the [yellow banner box](https://payloadcms.com/docs/rich-text/custom-features) for details. If you still encounter richtext-lexical errors, do the following, in this order: - Delete node_modules - Delete your lockfile (e.g. pnpm-lock.json) - Reinstall your dependencies (e.g. pnpm install) ### Lexical Breaking Changes The following Lexical releases describe breaking changes. We recommend reading them if you're using Lexical APIs directly (`@payloadcms/richtext-lexical/lexical/*`). - [v.0.33.0](https://github.com/facebook/lexical/releases/tag/v0.33.0) - [v.0.30.0](https://github.com/facebook/lexical/releases/tag/v0.30.0) - [v.0.29.0](https://github.com/facebook/lexical/releases/tag/v0.29.0) ___ TODO: - [x] facebook/lexical#7719 - [x] facebook/lexical#7362 - [x] facebook/lexical#7707 - [x] facebook/lexical#7388 - [x] facebook/lexical#7357 - [x] facebook/lexical#7352 - [x] facebook/lexical#7472 - [x] facebook/lexical#7556 - [x] facebook/lexical#7417 - [x] facebook/lexical#1036 - [x] facebook/lexical#7509 - [x] facebook/lexical#7693 - [x] facebook/lexical#7408 - [x] facebook/lexical#7450 - [x] facebook/lexical#7415 - [x] facebook/lexical#7368 - [x] facebook/lexical#7372 - [x] facebook/lexical#7572 - [x] facebook/lexical#7558 - [x] facebook/lexical#7613 - [x] facebook/lexical#7405 - [x] facebook/lexical#7420 - [x] facebook/lexical#7662 --- - To see the specific tasks where the Asana app for GitHub is being used, see below: - https://app.asana.com/0/0/1211202581885926
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.
Description
This PR adds code diff highlighting to the Code Blocks.
I needed to display code blocks in Lexical so I looked at what Prismjs is doing in https://prismjs.com/plugins/diff-highlight/ to see how it could be ported to Lexical.
Prismjs, in its v2 branch, has a diff-highlight plugin implementation that works at the token level (not at the html level like what 1.30 is doing). This fits well with Lexical and I could integrate this implementation into
packages/lexical-code/src/CodeHighlighterPrism.tsBasically it works by first tokenizing the code with a
diffgrammar that detects the inserted/deleted/unchanged blocks and then tokenizes each block with the language grammar to have both diff highlighting & language highlighting.The result is that with this PR you can see highlighted & editable diffs in Lexical
it uses the same API is diff-highlight, by adding "diff-" in front of the language name so to use it in Lexical, create a code block with language
diff-javascriptfor example (it can be specified in the markdown mode for example)modifications:
[lexical-markdown] is modified to allow languages with "-" inside their id. It seems ok & necessary in any case as Prismjs accepts language ids with "-", like "excel-formula" or "firestone-security-rules"
[lexical-playground] is modified to create new styles for the inserted/deleted/unchanged nodes. The proposed solution was hard to find as it is not easy to colorize the diff lines in the current html layout which is fully flattened. I created a discussion on Adding support for code diff in Code Blocks #7608 where I explain the css difficulty. The solution manages to highlight the full line with a little hint at the beginning of the line to highlight the fact that each line should begin with its diff status:
The only limitation is that the css do not colorize wrapped lines, i.e when the code line before linebreak is too long to fit in the code view. I think the trade-off is acceptable as we already have this problem with the gutter with line numbers that are not aligned with their "true" line when some lines have wrapping. The trade-off would mean that this is an acceptable solution until either
For now I did not add new UX to activate the diff mode. Either we can leave it is a power user mode (via markdown or a programmatic way) or maybe add a toggle in the playground. Tell me what you prefer.
diffprismjs grammardiff-xxxxto mean the code should be highlighted withdiffand thenxxxxpackages/lexical-code/src/CodeHighlighterPrism.tsas Prismsjs v2 is I think not going to get published in the short term.codeNodeTransformcode to implement the strategy : xxxx is tokenized as xxxx and diff-xxxx is tokenized as diff plus diff-highlight(xxxx).Test plan
At this stage, I mainly did manual tests in the playground. I could add tests if you see interesting axes to test, or we could rely on the existing code block tests.
I hope that this PR will raise some interest and that we can work to make it merged into the project ! thanks for your time looking at this and for your feedback.