-
Notifications
You must be signed in to change notification settings - Fork 17
fix(richtext)!: HTML and Markdown parsing for links and edge cases #369
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR refactors HTML and Markdown parsing to use Tiptap's built-in generateJSON command, fixing edge cases with links and nested tags that weren't handled correctly by the previous custom parser.
- Replaced custom HTML parsing logic with Tiptap's
generateJSONfor more robust HTML-to-richtext conversion - Simplified Markdown parser to convert Markdown to HTML first, then use the HTML parser
- Changed the API from custom
resolversto TiptaptipTapExtensionsfor customization
Reviewed Changes
Copilot reviewed 5 out of 6 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| packages/richtext/src/markdown-parser.ts | Simplified to render Markdown as HTML then delegate to HTML parser |
| packages/richtext/src/markdown-parser.test.ts | Updated tests to use Tiptap extensions and reflect new output format |
| packages/richtext/src/html-parser.ts | Complete rewrite using Tiptap's generateJSON with custom extensions |
| packages/richtext/src/html-parser.test.ts | Updated tests for new Tiptap-based implementation |
| packages/richtext/package.json | Added Tiptap dependencies, removed node-html-parser |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
5cdcca2 to
6d45762
Compare
@storyblok/astro
storyblok
@storyblok/eslint-config
@storyblok/js
storyblok-js-client
@storyblok/management-api-client
@storyblok/nuxt
@storyblok/react
@storyblok/region-helper
@storyblok/richtext
@storyblok/svelte
@storyblok/vue
commit: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This PR is being reviewed by Cursor Bugbot
Details
Your team is on the Bugbot Free tier. On this plan, Bugbot will review limited PRs each billing cycle for each member of your team.
To receive Bugbot reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.
Parsing did not work correctly for certain combinations of `<a>` and nested tags inside or around it. To ensure parsing is aligned with the Tiptap editor format, we now use the Tiptap editor's `generateJSON` command, which gives us HTML-to-richtext conversion out of the box. BREAKING CHANGE: Instead of our own resolver format, we now allow users to override the Tiptap extensions used for parsing. Fixes WDX-141
6d45762 to
f128bb6
Compare
|
Hey @maoberlehner, with this new implementation, it won’t work as expected. As I suspected, we need to follow the specific naming pattern we use internally — for example, The good news is that we can configure the Tiptap extensions to align with our internal structure. I did a quick test, and after making the following changes to the list items, it worked correctly: const defaultExtensions = {
bulletList: BulletList.configure({
itemTypeName: 'list_item',
}).extend({
name: 'bullet_list',
}),
listItem: ListItem.configure({
bulletListTypeName: 'bullet_list',
orderedListTypeName: 'ordered_list',
}).extend({
name: 'list_item',
}),
orderedList: OrderedList.configure({
itemTypeName: 'list_item',
}).extend({
name: 'ordered_list',
}),
// ...
}This only covers these specific list-related types — we’ll need to check and match the rest of the node types as well. I haven’t tested all the possible ones yet. |
|
@dipankarmaikap thank you for spotting this issue and your recommendations on how to work around it! I'd love to follow the Tiptap editor defaults because this would enable us to simplify our renderers, too. That's why I reached out to the product team, asking if they could add support for both cases in Storyblok (https://storyblok.slack.com/archives/G01AWKD1FGC/p1762846202774159). If this is possible, I'd add support for both cases in our renderer too and keep this code as is. If it's not possible, I'll go with your approach. |
Parsing did not work correctly for certain combinations of
<a>and nested tags inside or around it.To ensure parsing is aligned with the Tiptap editor format, we now use the Tiptap editor's
generateJSONcommand, which gives us HTML-to-richtext conversion out of the box.BREAKING CHANGE: Instead of our own resolver format, we now allow users to override the Tiptap extensions used for parsing.
Fixes WDX-141
Note
Replaces custom HTML/Markdown parsing in
packages/richtextwith Tiptap-based parsing (via@tiptap/html+ extensions), updates tests, and refreshes frameworks/deps across the repo.@tiptap/htmland a full set of Tiptap extensions.node-html-parser,markdown-it-github), add Tiptap packages.19.2.0, Vue to3.5.22, Next-related deps, and Nuxt/Vite stacks in examples/playgrounds.happy-domto Vitest where used and perform miscellaneous lockfile upgrades.Written by Cursor Bugbot for commit f128bb6. This will update automatically on new commits. Configure here.